前言¶
在 DeepSeek Harness(DSH)里同时开着多个 Session 时,常见做法是在侧栏里点选切换,或依赖窗口记忆。侧栏列表能覆盖「有哪些 Session」,但当同一窗口里频繁在几个对话之间来回切,缺少类似浏览器标签栏的「当前窗口打开了哪些、顺序如何、一键关页但不删 Session」的体验。下面介绍社区客户端插件 dsh-session-tabs(维护者 thezavtrak-a11y):在单个 DSH Web 窗口顶部增加标签条,用浏览器标签的交互模型管理本窗口「触及过」的 Session,且不 patch 上游,通过官方插槽与客户端服务接入。
这是什么¶
dsh-session-tabs 是 DeepSeek Harness 的 客户端(Web UI)插件。本窗口接触过的每个 Session 对应标签条上的一个标签:点击切换、关闭、拖拽排序,或将标签拖出条外拆成独立窗口。关闭标签 不会删除 Session——与关闭浏览器标签不会删除网页相同,Session 仍在侧栏,可再次打开。
插件在 package 中声明 dsh.client 与 dsh.bundle.patch,注册到官方 slot、locale 与 Session 相关面,卸载时移除一行 loader 配置即可;不修改上游代码,便于随 DSH 升级保留。
核心功能¶
标签与切换¶
- 本窗口展示过的 Session 各占一个标签,顺序保留你排列的结果。
- 点击标签切换;若全局面板已打开,点击会先回到对话视图。
- 标签条左侧
+通过客户端自带的导航服务新建 Session,复用或创建策略仍由客户端负责。
关闭¶
- 标签上的
×、鼠标中键,或右键菜单(Close tab/Close other tabs/Close all tabs)。 - 仅关闭标签,Session 实体保留在侧栏。
排序与拆窗¶
- 左右拖拽标签重排,顺序写入 本窗口 的标签列表。
- 将标签拖出标签条并释放:指针在条外时会有提示,Session 在新窗口打开;右键
Open in a new window效果相同,无需拖拽。 - 桌面壳提供
window.dshShell.openSessionWindow时使用该 API;否则回退为带几何参数的window.open。新窗口通过 URL 参数?dshTab=<sessionId>交接 Session,启动后由官方openSession读取并history.replaceState去掉参数。
恢复与清理¶
- 页面刷新后,该窗口 的标签列表可恢复。
- 侧栏中已删除的 Session 对应标签会消失。
- 已关闭窗口的标签列表在存储中 14 天后 清理,避免堆积。
状态与无障碍¶
- 脉冲圆点:该 Session 正在运行;绿色圆点:已完成且此后未再打开。
- 标签过多时,在标签条上滚轮可横向滚动。
- 标签条为
tablist,标签为tab:Enter/Space打开,Delete/Backspace关闭。
标题栏与点击穿透¶
- 若 Shell 将窗口标题栏交给页面(caption-row mode),标签条移入标题行并与窗口顶对齐;Windows 原生按钮与 Snap Layouts 仍可用,颜色随主题变化。
- 无标题栏交接时,标签条为页面内普通条带。
- 标签条从应用左侧控件与原生窗口菜单之后开始;条带本身对点击透明(仅控件接收事件),避免挡住侧栏折叠等下层按钮。
安装与启用¶
与常见 DSH 插件相同,package 含浏览器端与 patch loader 行:
# from a checkout, or from a published copy
dsh plugin --profile <profile> add <checkout>
# after that, reload the page once (a NEW row is picked up when the page's module table is built)
将 <profile> 换成你的 profile 名,<checkout> 换成插件目录或已发布副本路径。安装后需刷新页面一次,新 loader 行在页面构建模块表时才会生效。
README 还给出在 profile 下 手动挂载 的要点(开发时常用):在 $DSH_HOME/profiles/<profile>/ 下建立 junction、在 package.json 增加 "dsh-session-tabs": "file:<path>",并在 cordis.patch.yml 的 insert 中加入 id: session-tabs、name: dsh-session-tabs。patch 层支持客户端 HMR;回滚时删除 insert 行并刷新页面即可,依赖与 junction 可保留。
当前 package 版本为 1.0.0,许可证 MIT,要求 Node >= 22(与仓库脚本检查相关,非 DSH 运行时硬性要求)。
典型用法¶
- 安装并刷新 DSH Web 页面,窗口顶部(或标题栏内)出现 Session 标签条。
- 在侧栏打开或新建 Session,对应标签自动出现在条上;点击标签在该窗口内切换对话。
- 临时不需要某标签时点
×或中键关闭标签,需要时再从侧栏点开同一 Session。 - 多 Session 并行对比时,拖拽标签调整顺序;或将标签拖出条外 / 右键 Open in a new window,在第二个 DSH 窗口中单独查看。
- 刷新浏览器后,同一窗口的标签顺序应恢复;多个窗口各自维护不同的标签集合。
实现要点(便于排查)¶
| 文件 | 作用 |
|---|---|
index.js |
Host 侧空 apply(),供 loader 挂载与 dsh.client 扫描 |
lib/client.js |
标签条、每窗口存储、手势、标题栏、拆窗逻辑 |
cordis.patch.yml |
bundle 安装时写入的 loader 行 |
标签条占用 Shell 的 shell.overlay 席位;Session 身份与选中态来自 Session Controller 与 workspace 导航服务。每窗口状态:sessionStorage 存窗口 id,localStorage 键 dsh.session-tabs.v1:<window> 存标签列表;经 ?dshTab= 打开的窗口会生成新窗口 id,避免 Chromium 克隆 sessionStorage 导致标签重复。
本地可运行 README 中的检查(语法、node tools/smoke.mjs 等)验证本机副本。
适用场景与注意¶
适合:在同一 DSH 窗口里频繁切换多个 Session、希望行为接近 Chrome 标签栏的开发者;需要把某个 Session 拆到独立窗口又不删 Session 的场景。
注意:
- 插件以 当前 DSH 进程与 Web 客户端权限 运行,安装前请阅读 GitHub 源码 与 MIT 许可证,自行评估是否纳入 profile。
- 社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本文描述以仓库 README 与 package 声明为准。
- 拆窗依赖桌面 Shell 的
openSessionWindow或浏览器window.open策略;非桌面环境行为以实际回退为准。
结尾¶
dsh-session-tabs 把「本窗口打开了哪些 Session」从侧栏列表里抽成一层浏览器式标签:切换、关闭、排序、拆窗,且关闭标签不删 Session;通过官方客户端插槽接入,便于升级与卸载。如需安装说明与细节,见目录页与仓库 README。
- 目录页:https://www.skillhub.cn/plugins/thezavtrak-a11y/dsh-session-tabs
- GitHub:https://github.com/thezavtrak-a11y/dsh-session-tabs