dsh-tree
DeepSeek Harness 对话树:把一个对话的所有分支画成一棵可点击的树 适合需要直观查看对话分支、快速跳转节点或从特定节点继续提问的用户。
Other repositories with this package name
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:JRJRJPRO/dsh-treeREADME
Read the full README ↗dsh-tree
把一个对话的所有分支画成一棵树,贴在 DeepSeek Harness 聊天区右缘。
点节点跳到那一轮,点 + 从那儿接着问。
不依赖任何其它插件。运行时只多一个 schemastery(dsh 自己也用它,用来声明设置项)。
◌
1
2
3' 3
4' 4
装
dsh plugin --profile web add github:JRJRJPRO/dsh-tree
重启 dsh web。卸载 dsh plugin --profile web remove dsh-tree。
临时关掉不用卸载——往 cordis.patch.yml 加两行,约 1 秒生效,刷新浏览器即可:
- id: dsh-tree
disabled: true
从源码跑:先 npm install(要一个 schemastery),再把
- insert: - id: dsh-tree, name: 'file:///绝对路径/index.js' 写进 cordis.patch.yml,
别和上面的装法同时用(同一个 id 插两次,dsh 起不来)。
改 index.js 要重启,改 client.js 刷新浏览器即可。
用
| 单击节点 | 跳到那一轮 |
| 悬停 | 右侧出详情卡 |
| 双击名字 | 改名 |
| + | 从这之后接着问;在树根空节点上则是在同一棵树里新开一条对话 |
| ⇥ | 把这条支线拆成独立的一棵树(头顶有岔路的节点才有) |
| ⇤ | 把拆出去的支线接回原来那棵树(出现在剪缝上) |
| ⊕ | 树根空节点上:把本目录下别的对话整棵合并进来,再点一次 ⊖ 拆回去 |
边框蓝 = 这个节点在你当前的对话里;填充蓝 = 你正看着这一轮。橙色倒三角 = 这一轮做过压缩。
撤回过的轮次(dsh-claude 的 rewind)不会再假装还在对话里:答完之后才撤回的, 留成一条岔出去的废弃支线,后面新发的那轮接回撤回之前那个节点;答到一半被中止 再撤回的,那个节点直接不画。撤回的节点详情卡上挂着「撤回」牌子,也不给 + 按钮 (claude 那边的锚点已经跟着删了,从那儿开分支只会是条失忆分支)。
撤回记录存在 dsh-claude 自己的文件里,而读那个文件会打断正在跑的那一轮 (Windows 上开着读句柄,对面的原子写就会失败)。所以这条会话只要有轮次在跑, 插件就一个字节都不读,画的是上一次读到的状态;导轨上沿会出现一个 ⏳, 鼠标停上去有说明,那一轮跑完自动更正。细节见 DESIGN.md §3。
同一棵树 = 树根相同,或你主动在空节点上按 + 开出来的对话。没登记过的对话各自成树,互不显示。
分组关系存在 $DSH_HOME/plugins/dsh-tree/shape.json。
省略
只画离你正在看的那一轮若干步以内的节点。距离是树上的无向步数:父节点 1 步,父节点的另一个孩子 2 步。
边界不硬切:最外两圈越画越小、越画越淡,到边界正好消失(鱼眼),没有 ⋯ 之类的记号。淡出圈吃的是半径自己的最外层 —— 设置里写「12 步」就是最远画到 12 步,不会偷偷多画。鼠标滑上去会把淡出撤掉,照样能点。
默认 12 步。设置 → 插件 → 插件配置 → 对话树 里可调,5 到 30,再往上一档是不省略。
同一张卡里还能调节点大小(50%–250%):点、连线、列间距、命中区一起等比例缩放。
配色
普通节点 / 当前路径 / 压缩节点 / 空节点,一个角色一行,左边挑颜色右边挑形状。
形状有圆形 / 圆角方 / 方形 / 菱形 / 倒三角,选择器上直接画出形状本身,还跟着这一行选的 颜色走。四个角色的形状各自独立。空节点的虚线边是「还没说话」的记号,不跟着配置走。
预设后面还有两格自定义:
- 传图片 —— png / jpg / webp / svg 都行,尺寸不限。浏览器会先把它等比缩进
96×96(空出来的地方透明补齐,不会拉变形)再存到
$DSH_HOME/plugins/dsh-tree/icons/, 换浏览器也还在。只留最近 32 张。 - 填字符 —— 填一个字,emoji 也行,节点就画成它。
传上去的图会先过一遍 canvas 转成 PNG。SVG 里可以写脚本,原样存下来再当图片引不安全。
改了主色,路径垫色、外发光、连线都跟着变。
它还顺手修了两个原生 fork 的缺陷
- 会多抄一条还没跑的待办 —— 在节点 N 开岔路,新分支会先把 N+1 那个问题重跑一遍。所有 provider 都中招。
- 外部引擎的记忆不跟随 —— 只影响
dsh-claude这类把对话托管给外部引擎的桥接。不依赖它,装了才处理。
两个都在 agent/created 上接管,原生分支按钮同样生效。
测
npm test # 七套一起跑
node test.mjs # 真实会话日志跑整条渲染管线,--print 打印 ASCII 树
node test-highlight.mjs # 高亮、hover intent、连线遮挡
node test-elide.mjs # 省略的距离、行号压实、缩放
node test-icon.mjs # 自定义节点图片:只收 PNG、内容哈希、清理不误伤
node test-rewind.mjs # 撤回:哪些轮该消失、哪些该成废弃支线
node test-merge.mjs # 合并 / 接回去
node test-branch.mjs # 把真实分支倒带到"刚出生",重放接管逻辑
test-branch.mjs 要读真实会话日志,不在默认位置时设 DSH_HOME_REAL 指过去,否则它自己跳过。
设计与踩坑记录:DESIGN.md。原生能力清单:NATIVE-BASELINE.md。
还没做
节点名字存在 localStorage · 左侧列表仍是平的 · 超长对话会溢出。
MIT