前言¶
在 DSH 里跟 coding agent 长聊,常见局面是:同一条会话里试了多种方案,只有一条能跑通,其余讨论都堆在滚动条里;想从「最后一个好状态」继续探索,却只能整段历史一起往前拖;比较两种架构或两个模型时,线性窗口也更容易变成来回删改的同一条时间线。
GitChat(npm 包名 dsh-gitchat)是维护者 shuirongshen 发布的 客户端 DSH 插件:在会话界面把每一轮对话画成树,从任意已结束轮次 fork 出真实子会话并继承事件前缀,对死胡同 归档 并可恢复,整棵树可导出 JSON。插件当前为 early preview(0.1.0,MIT)。
社区目录见 SkillHub:shuirongshen/dsh-git-fork-chat(与 DeepSeek / 幻方无官方从属关系,仅为社区收录)。
这是什么¶
一句话:GitChat 把「对话上下文」做成一等对象——树而不是线,分支对应 DSH 真实的 sessions.fork,不是手工拼 messages 数组。
技术形态上是 原生双端插件(不是 Webview):
- 宿主半读会话日志,提供
/gitchat/*路由; - 浏览器半把 React 组件挂进现有
conversation.view插槽,用 React Flow 12 + Dagre 布局,复用 DSH 主题、locale、会话与模型层。
核心功能¶
下面列出 README 中已写明、可在界面里直接验证的能力。
树状浏览
- 每轮一个节点,fork 边着色,支持平移、缩放、小地图与 Dagre 自动布局。
- 点击节点可在检查器里看用户消息、助手回复、模型、时间戳、工具调用次数与分叉点;悬停按钮有主题感知的 tooltip(含「为何此刻不能 fork」的说明)。
分叉与继承
- 在已结束的轮次上执行「从此处分叉」,内部调用
sessions.fork({ sessionId, atSeq: turn.endSeq });子会话继承精确事件前缀,作为普通 DSH 会话继续用 agent / 工具 / 模型。 - 运行中的轮次 deliberately 不可从图中 fork。
归档、跳转、导出
- 「归档分支」通过
workspaceRegistry.archiveSession归档该分支及 fork 后代(非删除,失败会回滚已归档项),可恢复。 - 「打开会话」跳转到拥有该节点的会话。
- 导出整树 JSON,或写入
~/.dsh/plugin-data/dsh-gitchat/exports/。
其它
- 存在运行中轮次时每 7 秒刷新树,空闲不轮询;中英文 locale;窄屏时检查器变为覆盖层。
/gitchat仅接受回环地址;插件不注册工具、不改 system prompt,以读日志与 fork / 归档为主。
环境要求¶
安装前对照官方 README 核对版本:
| 依赖 | 要求 |
|---|---|
| DeepSeek Harness | >= 0.2.1-rc.3(在 0.2.1-rc.5 的插件/会话 API 上开发) |
| Node.js | ^22.19.0 \|\| >=24.0.0(开发构建用;插件运行时不依赖 npm 包) |
| pnpm | 11+(仅开发构建需要) |
| Profile | 例如 desktop 或 web |
安装与启用¶
GitChat 是 profile link 插件,需要本机上有插件仓库的绝对路径(README 以 clone 后目录为例;取得源码目录的方式由你自行选择,下文只写 DSH 侧步骤)。
1. 链接包¶
先把插件链入 profile(将 <absolute-path-to-this-repo> 换成实际路径,含空格时加引号):
dsh plugin --profile desktop add link:<absolute-path-to-this-repo>
若 dsh 不在 PATH,可用应用自带 CLI(Windows 示例见仓库 README.zh.md)。
2. 写入 profile bundles¶
编辑 ~/.dsh/profiles/desktop/package.json(Windows:%USERPROFILE%\.dsh\profiles\desktop\package.json),在 dsh.profile.bundles 末尾加入 "dsh-gitchat":
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-gitchat"
]
}
}
}
dsh plugin add 只把包装进 node_modules;必须进入 bundles,cordis.patch.yml 才会应用,ui-gitchat 才会插入 profile 树。
3. 重启并验证¶
关闭并重新打开 DeepSeek Harness。打开至少有一轮对话的会话,在 Chat / Trajectory 旁点 GitChat。
可选验证:
dsh --profile desktop --dump-config | grep -i "ui-gitchat\|dsh-gitchat"
卸载¶
- 从
dsh.profile.bundles移除"dsh-gitchat"。 - 执行
dsh plugin --profile desktop remove dsh-gitchat。 - 重启 DSH。
典型用法¶
下面按 README「30 秒上手」整理为可复现流程。
- 在有历史的会话里切换到 GitChat 视图。
- 点击要保留上下文的那一轮节点,阅读检查器中的 fork 点与元数据。
- 对该 已结束 轮次选择「从此处分叉」,在新开的子会话里继续提问或换模型 / prompt(父上下文一致,比较才受控)。
- 对失败实验分支使用「归档」;需要时用「显示已归档」并恢复。
- 需要交接或备份时「导出 JSON」或「保存到磁盘」。
README 还给出了几类意图示例:保住 known-good 时间线再探索、同一需求下多架构并行 fork、在长任务最佳上下文点 fork 下一阶段、导出树做演示或比较模型变化等。
若只想看 UI、不连真实 DSH,仓库内已带构建产物时可本地起独立预览(详见 README.zh.md 的 node scripts/preview-server.mjs 与 http://127.0.0.1:5177/)。
适用场景与注意¶
适合谁
- 经常在单会话里做多种方案试探、又希望主线保持干净的 DSH / 智能体开发者。
- 需要可视化谱系、导出结构化树而非复制长 transcript 的团队协作或教学演示。
使用前应明确
- 插件在 当前 DSH 进程权限 下运行;安装前建议阅读源码与 MIT 许可证,确认
/gitchat回环策略与归档行为符合你的安全预期。 - 归档不是删除:DSH 无公开删会话 API,日志仍在磁盘;JSON 导出是读模型快照(单条消息最多 20,000 字符等限制见 README「已知限制」)。
- 大会话有 80 会话 / 800 turn 上限,超出会标记
truncated;DSH session/slot API 仍在演进,大版本升级后可能需要插件同步更新。 - 状态为 early preview,路线图仍含分支并排对比、跨分支搜索等未完项。
结尾¶
GitChat 的核心价值是把 DSH 里本来就有的 sessions.fork 和归档能力,用一棵树和原生视图暴露出来:分叉带确定性的上下文继承,失败路径可归档而不污染主线,整棵树可导出。若你在长调试会话里反复「如果当时走另一条路会怎样」,比在单线 transcript 里翻页更贴近实际工作方式。