dsh-session-fork-tree:把 DSH 侧栏分叉会话排成父子树

前言

在 DeepSeek Harness(DSH)里对会话做「分叉」,会新建一条独立会话,但侧栏默认按最近活动排序,分叉行往往和父会话分开,看起来像两条无关记录。会话一多,很难一眼看出哪条分支从哪条父会话长出来。下面介绍社区插件 dsh-session-fork-tree(维护者 ayuanxx-max),它不改核心包,只在侧栏把 parentSessionId 关系画成缩进树,并配合折叠与悬停高亮,方便做分支实验。分类为工作流;仓库 GitHub 与 SkillHub 目录页 可查阅详情。SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。

这是什么

DSH 会话分叉树排列功能(DSH Session Fork Tree Arrangement)是一条 Cordis bundle:fork 出来的会话挂在父会话下面,带圆角连接线、绿色 + 展开器,以及悬停时的祖先链高亮。README 写明兼容 DSH Desktop / Web;当前平台支持以仓库说明为准——Windows 11(DSH Desktop)标注为稳定运行,Ubuntu 测试中,macOS 计划中。

核心功能

经 README 核实,插件主要做五件事:

  1. 归属与顺序:子会话紧跟父会话显示;可选配置把顺序写回 workspace.sessionIds 持久化,否则仅在渲染层按父链排序。
  2. 缩进与连接线:子行缩进 16px;从父标题左缘起画 ╰(竖线到行高一半后转横线,圆角 8px,窗口变化时重算)。
  3. 折叠:有分叉的会话,名称右侧出现绿色 +,默认全部收起;点击展开(展开时 + 带绿色边框),再点收起,支持逐层递归。
  4. 悬停高亮:鼠标划过子行时,整条祖先链变亮。
  5. 自动命名:若分叉标题仍为系统默认形式(如 父名 (1)),会改为 父名 · 分叉N(N 为同父分叉创建顺序);用户手动改过的标题不会被覆盖。

实现上分为 Host 与 Client:Host 从 sessionController.list() 读取 SessionSummary.parentSessionId 生成谱系,并提供 GET /fork-tree/lineage.json、GET /fork-tree/style.css(客户端约每 15 秒重取样式,改样式无需重启)等;Client 注册官方槽位 sidebar.session.row.leading 与 sidebar.workspaces.session.row.action,用 MutationObserver 在新建分叉后约 0.2–0.5 秒内归位。数据仅使用官方 API,不改 app.asar。

与同维护者的 dsh-session-accordion(会话折叠成单行)可组合使用;仓库内另有 会话管理指南 说明折叠与分叉树搭配用法。

安装与启用

插件以当前 DSH 进程权限运行,安装前建议浏览仓库源码与 MIT 许可证。npm 安装为 README 推荐方式(示例版本 @0.9.0,与 README 安装节一致):

桌面版(profile=desktop):

dsh plugin --profile desktop add dsh-session-fork-tree@0.9.0

或免全局安装:

npx -y @deepseek-ai/dsh plugin --profile desktop add dsh-session-fork-tree@0.9.0

Web UI(profile=web):

dsh plugin --profile web add dsh-session-fork-tree@0.9.0

安装后需完全退出 DSH 再启动才会加载。卸载示例:

dsh plugin --profile desktop remove dsh-session-fork-tree

并按 README 从 profile 的 dsh.profile.bundles 中移除 dsh-session-fork-tree 后重启。

Linux / macOS 若 npm 包不可用,README 给出本地 link 方式:克隆仓库后执行 dsh plugin --profile desktop add "link:$REPO",再在 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 中加入 "dsh-session-fork-tree",然后完全退出并重启。顺序须为先 dsh plugin add,再改 bundles,最后重启;只做其一可能导致未加载或启动失败。

若重启后 DSH 无法打开,可在 profile 的 cordis.patch.yml 末尾追加禁用条目后重启恢复:

- id: fork-tree
  disabled: true

典型用法

经过安装并重启,打开侧栏即可使用,无需额外命令:

  1. 对某会话执行分叉后,新会话会自动缩进到父会话下方。
  2. 父会话若存在子分叉,名称右侧出现绿色 +(默认收起);点击展开子树,再点收起。
  3. 子会话若继续分叉,会出现下一层 +,逐层展开。
  4. 悬停在子行上,父行与中间祖先同时高亮。
  5. 刷新页面或重启 DSH 后,折叠状态回到「全部收起」(折叠状态仅存内存,README 已知限制)。

可选配置写在 profile 的 cordis.patch.yml,覆盖 bundle 的 config(升级不丢):

- id: fork-tree
  name: 'dsh-session-fork-tree'
  config:
    renames:
      - sessionId: session-…
        title: '父会话 · 分叉1'
    reorder:
      - sessionId: session-…
        afterSessionId: session-…

reorder 用于把「子紧跟父」写入 sessionIds;不配置时客户端仍会在渲染层排序。

诊断可在页面 Console 执行 __ftReport() 查看当前行、缩进、连接线坐标与折叠状态;Host 自报文件位于 %TEMP%\fork-tree-report.json(Linux 上对应系统临时目录)。

适用场景与注意

适合经常在 DSH 里用分叉做方案对比、提示词迭代或多路径实验、且侧栏会话较多的开发者。不适合期待「折叠状态跨重启记忆」或「与任意未来侧栏 DOM 永久兼容」的场景——插件依赖侧栏内部结构与 parentSessionId,上游改版可能静默失效;行顺序在极少数情况下可能与宿主重排争抢一次,由 MutationObserver 再纠正;仅作用于当前已挂载的可见会话行。

前置:DSH 桌面版或 dsh web,可用 profile(默认 desktop),Node.js >= 18(见 package.json engines)。故障排查时查看 ~/.dsh/logs 最新日志中的 boot / activate 报错;若自行改过包名,须保证 client.js 里 window.__ModuleLoader__.load 的 id 与 package.json 的 name 一致。

结尾

dsh-session-fork-tree 把 DSH 侧栏里互不相干的分叉行,收成可折叠、可高亮的父子树,改动集中在官方槽位与 API,便于在不动核心的前提下理清分支关系。

羽毛球分组比赛记分
小程序二维码

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

小夜