发布于 2026年11月2日最后编辑于 2026年11月8日
DeepSeek Harness 会话分支树插件
给 dsh 的 Web 界面加一棵会话血缘树,并能改写某一轮的提问重跑出新分支
#Cordis#TypeScript#React#DeepSeek Harness#npm
项目简介
这是给 DeepSeek Harness(一个全插件的 AI Agent 运行框架)写的一个 Web 界面插件。它做两件官方没有直接提供的事:把工作区里所有会话的血缘关系画成一棵可折叠的树,以及在任意一轮对话上改写当初的提问并重跑,生成一条新分支。
起因很朴素:同一个问题问两遍,第二遍改了措辞,结果两条会话在列表里是并列的,看不出谁从谁来。而想回头改一句再问,官方只支持”从这一轮再分一个叉”,不支持”改掉这句再问”。
插件已经发布到 npm,可以通过 dsh plugin add @jfzcroozmic/dsh-conversation-tree-view 装进任意 profile。
主要工作
1. 摸清框架的插件模型
- 确认一个 dsh 客户端插件是两个半边:宿主半边注册服务与路由,浏览器半边往 UI 槽位注册组件,两边各自
apply - 补齐三个注册面:聚合 tsconfig 的引用、profile patch 里的一行、bundle 的依赖声明——缺任何一个都会在完全不同的时间点失败
- 用真实 Loader 跑通了一次端到端组合,而不是只写单元测试
2. 分支树视图
- 从会话列表读取血缘(
parentId),按工作区过滤、剔除空白会话与子代理会话 - 默认展开”当前会话的祖先链”,手动展开/折叠会被记住
- 当前会话高亮,点击任意一行切换过去
- 给树加上限(200 行),截断时优先保留当前会话的祖先链,而不是简单截头
- 加载中 / 无法确定工作区 / 真的没有分支,三种空状态分开说,避免加载时讲错话
3. 改写提问并重跑
这是最难的一块,也踩得最深:
- 一开始想”复制历史到那一轮,把提问改掉”——但那样复制出来的会话会声称自己继承了一段其实改过的历史,语义上是错的
- 中途试过给核心加一个”从已记录的提问起一轮”的能力,也确实跑通了
- 后来把插件合到新版本框架时发现:Agent 的执行入口已经改成完全由收件箱驱动——“历史里有提问”根本不会触发一次请求,那条路被堵死了
- 最终的解法反而最简单:把切点前移到上一轮末尾,再用公开的
followup把改后文本当作新的一轮送进去。改后提问于是就是一轮普通对话:历史里只记一次,不用改任何历史标记,也完全不用改框架核心
4. 砍掉重复的功能
- 原本还做了一个”回溯到此”按钮,逐行对照后发现官方的分支动作做的就是同一件事(同一个
fork调用、同一个openSession) - 于是把自己那份删了,连带清掉注册、文案和测试。重复实现只会得到更差的交互
- 唯一比官方强的一点(失败时给用户提示)记下来,打算作为上游 PR 提回去,而不是自己再塞一个按钮
5. 打包与发布
- 做成一个带
dsh.bundle声明的独立 bundle,用 tarball 形式安装(用户不需要授权安装脚本) - 发布到 npm 时接连踩坑:想要的包名三天前被另一个同类插件占了;换名后又发现包名会被写死进浏览器产物(模块注册 id 必须和 Loader 行里的名字一致,否则装得上但界面永远不加载)
- 写了一个打包脚本负责”复制产物 + 改掉产物里的包身份”,并断言改写处数与残留为零
- 最后一个坑在 npm 侧:经典 token 不能发布,先要 2FA,2FA 又要求验证器;最后用账号自己的 scope 加自动化 token 走通
- 发布后做了完整核对:线上 shasum、integrity、文件数、解包体积逐项与本地一致,再从 registry 真装一次确认可用
技术栈
- 插件框架: Cordis(服务注入 + 槽位注册 + 生命周期即效果)
- 语言: TypeScript(严格模式,两个编译面分开)
- 界面: React + CSS Modules,文案走类型化的双语词典
- 构建: tsdown(动态插件打包)、pnpm workspaces
- 测试: Vitest(真 Loader 组合测试 + 单测,源码覆盖率 100%)
- 发布: npm
收获
最大的收获不是学会了写界面,而是理解了**“会话”到底是什么**:一条只能往后追加的不可变事件日志,模型看到的只是从这份日志现算出来的投影。所谓”分支”其实只是复制一段前缀;所谓”改写历史”根本不是改历史,而是换一个切点开始一段新的历史。
另一个收获是学会在动手之前先确认接缝:官方的分支按钮、宿主与浏览器之间的 RPC、槽位的注入面——每一样都要先读到源码确认它真的支持,再决定怎么做。这个项目里被删掉的代码(那个重复按钮、中间那版核心改动)和留下的代码一样重要。
最后是打包发布这一课:本地跑通、测试全绿、配置文件正确,都不等于”别人能装上用起来”。真正让人放心的,是发出去之后从公网重新装一遍。