dsh-session-tabs:为 DeepSeek Harness 窗口提供浏览器式 Session 标签页

前言

在 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 运行时硬性要求)。

典型用法

  1. 安装并刷新 DSH Web 页面,窗口顶部(或标题栏内)出现 Session 标签条。
  2. 在侧栏打开或新建 Session,对应标签自动出现在条上;点击标签在该窗口内切换对话。
  3. 临时不需要某标签时点 × 或中键关闭标签,需要时再从侧栏点开同一 Session。
  4. 多 Session 并行对比时,拖拽标签调整顺序;或将标签拖出条外 / 右键 Open in a new window,在第二个 DSH 窗口中单独查看。
  5. 刷新浏览器后,同一窗口的标签顺序应恢复;多个窗口各自维护不同的标签集合。

实现要点(便于排查)

文件 作用
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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye