dsh-session-git
       
English | 中文
dsh-session-git 是 DeepSeek Harness 的插件:把会话当成对话谱系,从已完成轮次新建分支、打开子会话,并在顶栏画出家族树。源会话保持原样。本插件不回退工作区文件,也不合并日志。
兼容 DeepSeek Harness 0.1.0-rc.5 的 fork 语义(锁在 src/policy/host-boundary.ts)。本机 CLI 0.1.0-rc.6 上冒烟通过。升级上游后请跑 pnpm test;若 host-boundary 变红,停止发版。
问题
官方 API 已经支持 fork({ sessionId, atSeq })。Web UI 只在当前 transcript 尾部和侧栏「最后一轮」暴露这个切点。无法从更早的完成轮分支,官方侧栏也故意保持扁平。
| 做法 | 结果 |
|---|---|
| 官方 Branch | 只切最后一轮完成轮;不画家族树 |
| dsh-turn-rewind / dsh-rewind | 文件回退;部分路径会归档源会话 |
| 本插件 | 历史完成轮分叉 + 插件内家族树;不碰文件 |
需要磁盘时间机器时请装 rewind 类插件,不要让本包「撤销那次编辑」。
解决方案
本插件在官方 fork RPC 之上补产品 UI:
- 在顶栏选一个已完成轮次,按该轮精确的
turn/endseq 分叉; - 更早的轮次在
turnTail链空闲时提供「从此处新建分支」; - 只读父会话芯片与家族树 popover;
- 不归档、不 cancel、不自动 prompt 源会话。
flowchart LR
A[已完成第 N 轮] --> B[executeFork]
B --> C["session.fork atSeq = turn/end"]
C --> D[尽力递增子会话标题]
D --> E[打开子会话]
E --> F[用侧栏 parentId 画家族树]功能
- 顶栏 从轮次分支:列出当前窗口里已完成轮的
turn/endseq。触发按钮本身不分叉。 - 更早完成轮的历史 turnTail 按钮。最后一轮留给官方 Branch。本插件以
priority: 50注册,有产物文件时不盖掉官方行。 - 同一 popover 里的家族树:归档或不在列表的父节点显示为占位;
origin: subagent不当作 Git 分支。 - 父会话芯片可打开父会话。
- 同一源会话上重叠的第二次 fork 会被拒绝(
error.in-flight)。 - 失败必有
messageKey。产品文案不用「回滚 / 撤销」。
环境要求
- Node.js
^22.19.0 || >=24 - DeepSeek Harness 的 web profile。浏览器半边依赖 conversation 插槽,不适用于 headless。
安装
推荐装 GitHub Release 里预构建好的 tarball。包内已有 lib/。dsh plugin add 会转给 pnpm,用户不用 clone、不用 allowBuilds、也不走 npm 仓库。
dsh plugin --profile web add https://github.com/JUANWANG-BUAA/dsh-session-git/releases/latest/download/dsh-session-git.tgz
dsh --profile web --dump-config | grep session-git应出现 # == dsh-session-git 层。启动 Web 时不要带着调试用的 DSH_HOME:
env -u DSH_HOME dsh --profile web钉住某个已发布版本:
dsh plugin --profile web add https://github.com/JUANWANG-BUAA/dsh-session-git/releases/download/v0.1.0/dsh-session-git-0.1.0.tgz从本仓库开发目录
pnpm install
pnpm run build
dsh plugin --profile web add "$(pwd)"Git(安装期构建)
钉住所验证过的 commit。pnpm ≥ 10 默认拒跑构建脚本,把包名放进该 profile 的 pnpm-workspace.yaml(通常是 $DSH_HOME/profiles/web/pnpm-workspace.yaml):
dsh plugin --profile web add github:JUANWANG-BUAA/dsh-session-git#<commit-sha>allowBuilds:
dsh-session-git: trueallowBuilds 等于允许安装期在你的机器上执行这个包的脚本,只允许你信任的来源。日常请用上面的 Release tarball。
本地 tarball
pnpm pack
dsh plugin --profile web add ./dsh-session-git-0.1.0.tgztarball 已含 lib/client.js。没有 tsdown.config.ts 时 prepare 会跳过重建。
使用
1. 打开至少有一轮已完成的会话。 2. 用顶栏 从轮次分支 选切点;或在没有产物文件行的更早轮次用 从此处新建分支。 3. 子会话历史停在所选轮结束(含该轮后、下一轮 turn/start 之前的独立事件,例如改标题)。源会话保持原样。 4. 子会话上的 父会话 与家族树可回到源会话。
源会话
第 1 轮 ── 顶栏可选 / 历史轮 turnTail
第 2 轮 ── 顶栏可选 / 历史轮 turnTail
第 3 轮(末轮)── 只用官方 Branch卸载
dsh plugin --profile web remove dsh-session-git
dsh --profile web --dump-config | grep session-git面板和按钮消失。fork 出来的子会话仍是普通会话,parentSession 还在日志里。官方「在新对话中分支」不变。
配置
- id: session-git
name: dsh-session-git
config:
turnTail: true # false:关掉历史轮按钮,顶栏选择器仍在
prefillComposer: false # 接受后忽略;子会话从不预填完整选项、默认值与校验在包内 Config schema(src/index.ts)。
当前 Web boot 创建客户端条目时不转发 host yaml,浏览器半边默认仍开启 turnTail;单测覆盖关闭路径。
局限
- 家族树用侧栏
SessionSummary(parentId/ 标题 /running/blank/updatedAt)。seedLength不在摘要里,v0.1 不显示「从 seq N 切开」。 - 归档或不在当前工作区的父节点显示为占位。
- 树只活在本插件 popover 里,不改官方扁平侧栏。
- 该轮若有产物文件,官方 deliverables 占用
turnTail链,请用顶栏选择器切那一轮。 - 子会话标题按官方
(1)/(n)递增。从同一源 fork 两次可能撞名。树上看不出切点。 session.fork复制的是当前工作区,不是那一轮当时的文件。本插件不回退文件。- 空白英雄页没有会话顶栏,因此也没有本插件选择器。
- 分支事件 diff 与家族树导出放到 0.2.0。
开发
git clone git@github.com:JUANWANG-BUAA/dsh-session-git.git
cd dsh-session-git
pnpm install
pnpm run check:cicheck:ci 会跑 lint、用 types/ci.d.ts 做类型检查、单测与客户端测试、以及构建。可选的 pnpm run bootstrap 会克隆或构建隔壁的 DeepSeek Harness,以便 pnpm run check 使用真实的客户端 .d.ts。
pnpm test = policy 单测(node:test)+ jsdom 组件测(vitest)。0.1 没有 diff 纯函数。
Git 安装会跑 prepare。打包后的 tarball 不含 tsdown.config.ts,安装时跳过重建。打 GitHub Release 的步骤见 [CONTRIBUTING.md](./CONTRIBUTING.md);本包不上 npm。
贡献 · 安全 · 许可证
- [CONTRIBUTING.md](./CONTRIBUTING.md)
- [SECURITY.md](./SECURITY.md)
- [MIT](./LICENSE) © 2026 JUANWANG-BUAA