前言¶
在 DeepSeek Harness(DSH)桌面客户端里,右侧边栏会打开文件、终端、交付物、Guide 等标签页。浏览器里中键点标签即可关闭,是多数开发者已经养成的习惯;DSH 自带标签条只支持左键选中、右键菜单,以及标签上的 × 关闭。中键按下时,dockkit 的 chip 处理逻辑会把它当成左键选中,无法直接关掉标签。若你经常在边栏里开很多页,每次挪到 × 上点一下,会比中键慢一截。下面介绍的插件 dsh-middle-click-tab-close 由社区维护者 icrefin 发布,分类为客户端插件,在不动官方 UI 源码的前提下,让右侧边栏(含浮动窗标题区)支持与中键关闭浏览器标签相同的手势,并走与 × 相同的 ctx.sidebarRight.close(tabId) 关闭路径。
这是什么¶
dsh-middle-click-tab-close 是一个仅作用于 DSH Web 客户端前端的 Cordis 插件:在文档上注册一个捕获阶段的 pointerdown 监听,当检测到鼠标中键(button === 1)且按压发生在 [data-sidebar-right-session] 内时,解析被点的 [data-dockkit-tab],再调用官方侧栏控制器关闭对应标签。Host 侧入口存在但无业务逻辑,只为 Loader 携带 browser 半包;无配置项、无设置卡片、无额外路由或样式。
维护与源码:
- 目录页:https://www.skillhub.cn/plugins/icrefin/dsh-middle-click-tab-close
- 仓库:https://github.com/icrefin/dsh-middle-click-tab-close
- 许可证:MIT(以仓库 LICENSE 为准)
为什么是插件而不是设置项¶
右侧标签条是随客户端发布的 UI。dsh-client-ui-dockkit 绘制每个 chip 为 role="tab",其 onPointerDown 仅跳过右键(button !== 2),中键仍会触发选中。dsh-client-ui-sidebar-right 持有列布局、标签注册表以及文档化的 ctx.sidebarRight.close(tabId)。没有用户级开关能单独打开「中键关闭」,也没有扩展 chip 行为的插槽。要在不 fork、不 patch 官方 strip 的前提下增加手势,只能在页面里观察 chip DOM,并调用 UI 已在使用的关闭 API。这是插件形态的原因,而非可选偏好。
核心功能¶
手势范围¶
左键仍选中标签;右键仍打开菜单;中键关闭标签——对停靠在右侧边栏的标签条上的 chip,以及对浮动窗标题条(data-dockkit-float-title)同样生效。README 用示意说明:在「Report × | Guide | Terminal ×」这类标签文字区域中键,效果与点该标签的 × 一致。
关闭路径与保护规则¶
处理流程(资料原文步骤摘要):
- 确认
button === 1且事件在[data-sidebar-right-session]内。 - 从按压元素向上找最近的
[data-dockkit-tab],得到 layout tab id。 - 若 chip 未绘制
[data-dockkit-tab-close],则不处理——例如唯一停靠的 Guide 无关闭控件,插件拒绝中键,避免无效拦截。 - 调用
ctx.sidebarRight.close(tabId):资源清理、registerCloseHandler、最后一标签折叠列、布局 undo 历史等行为与点 × 相同。 preventDefault()抑制 Chromium 中键自动滚动;stopPropagation()避免 dockkit 把中键当成选中。- 监听注册在
ctx.effect中,禁用或卸载插件时监听一并移除。
浮动窗没有 tab chip:中键落在标题区时,插件会触发 kit 自带的关闭按钮路径,等效于点关闭按钮。
明确不做的事¶
- 不支持其他按键、手势或快捷键关标签。
- 不操作后台 Session,只作用于当前前景列可见的 chip。
- 依赖 dockkit 的 DOM 标记(
data-dockkit-tab、data-dockkit-tab-close、data-sidebar-right-session);若未来 DSH 改名,手势会静默失效,不会误关。 - 中键仍先被浏览器接收,关闭发生在
pointerdown,而非auxclick;无法变成与原生 chip 完全同层的内置行为。
技术实现上,在 document 上捕获监听是为了抢在 React 18 根容器委托的 onPointerDown 之前执行;仓库含 test/react-delegation.spec.tsx 验证中键不到达 chip 处理函数、左键仍正常。
环境与依赖¶
根据仓库 package.json:
- Node:
>=22.17.0 - DSH:
>=0.2.1-rc.5 <0.2.2-0 - 当前包版本:
0.1.1(Release 徽章指向 v0.1.1) - 客户端注入:
@deepseek-ai/dsh-client-ui-sidebar-right
安装与启用¶
官方 README 给出的方式是从本仓库构建并打包,再在桌面客户端里安装 .tgz,不是凭插件名拼接 CLI 的 dsh plugin add github:... 命令。步骤如下。
- 在克隆或解压后的仓库根目录安装依赖并校验构建:
pnpm install
pnpm check # typecheck · build · vitest
pnpm pack # -> dist/dsh-middle-click-tab-close-0.1.0.tgz
说明:pnpm pack 输出文件名在 README 示例中为 dsh-middle-click-tab-close-0.1.0.tgz;安装时使用 dist/ 下实际生成的 tgz 文件名即可。package.json 中 version 为 0.1.1,打包产物版本以本地 pnpm pack 结果为准。
- 在 DeepSeek Harness 桌面应用中打开 Settings → Plugins,安装上述
dist/*.tgz,然后重启应用。资料写明:运行中的 profile 在启动时才算模块解析图,新 bundle 需下次启动才能正确 import entry。Web 客户端在重启后还需刷新页面。
插件无配置界面;安装并重启后即生效。
典型用法¶
- 启动已安装插件的 DSH 桌面客户端并完成一次应用重启与 Web 页刷新。
- 在右侧边栏打开若干可关闭标签(如 Report、Terminal 等带 × 的页)。
- 在标签文字区域按下鼠标中键:标签应关闭,且与该标签注册的 close handler 行为一致。
- 对唯一 Guide 标签中键:应无关闭效果(与无 × 的官方行为一致)。
- 若有浮动侧栏窗,在中键点击标题栏区域:窗体应通过 kit 关闭按钮同路径关闭。
开发调试时,可用仓库脚本在隔离 profile 中加载 bundle(不修改本机正式 profile):
scripts/dev-profile.sh boot 19498 # isolated DSH home under .dev-home/
scripts/dev-profile.sh url 19498 # prints the served bundle URL
scripts/dev-profile.sh remove
手势在真实桌面 GUI 上的验证 README 标明需人工确认;自动化测试覆盖 jsdom 行为与 React 委托顺序,不含 live middle click。
适用场景与注意¶
适合谁: 长期在 DSH 右侧边栏切换文件、终端、交付物等标签,且习惯浏览器式中键关标签的客户端用户。插件星标在资料中为 0,属早期社区工具,使用前可自行浏览源码与 CI 状态。
权限与安全: 插件随当前 DSH 进程与用户 profile 加载,在浏览器上下文中监听指针事件并调用官方 sidebarRight.close。安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认接受其 DOM 解析与事件拦截方式。
生态说明: DSH 采用「一切皆插件」的扩展思路;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系,本文安装步骤以仓库 README 为准。
结尾¶
dsh-middle-click-tab-close 用很小的 browser 半包补上了右侧边栏标签的中键关闭,并刻意对齐官方 sidebarRight.close 而非模拟点击 ×,以便 close handler 与布局历史与内置 UI 一致。若你需要这一手势,可按 README 打包安装并在重启后试用。
- 插件目录:https://www.skillhub.cn/plugins/icrefin/dsh-middle-click-tab-close
- 源码与说明:https://github.com/icrefin/dsh-middle-click-tab-close