GitChat:在 DeepSeek Harness 里把 AI 对话当成可分叉、可归档的树

前言

在 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"

卸载

  1. 从 dsh.profile.bundles 移除 "dsh-gitchat"。
  2. 执行 dsh plugin --profile desktop remove dsh-gitchat。
  3. 重启 DSH。

典型用法

下面按 README「30 秒上手」整理为可复现流程。

  1. 在有历史的会话里切换到 GitChat 视图。
  2. 点击要保留上下文的那一轮节点,阅读检查器中的 fork 点与元数据。
  3. 对该 已结束 轮次选择「从此处分叉」,在新开的子会话里继续提问或换模型 / prompt(父上下文一致,比较才受控)。
  4. 对失败实验分支使用「归档」;需要时用「显示已归档」并恢复。
  5. 需要交接或备份时「导出 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 里翻页更贴近实际工作方式。

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

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

小夜