前言¶
在 Agent Chat 中,一次会话很容易从某轮对话分叉出多个子会话,这些子会话又可能继续分叉、回退或继承历史。在默认的列表视图里,谁从谁分叉、当前会话在整张图里的位置,都得自己回忆。这会增加定位上下文的成本,也容易遗漏分支或重复阅读共享历史。
插件简介¶
这个插件为 DSH 会话提供一个可视化画布:把用户轮次画成节点,会话退成颜色与标签贯穿的线条,分叉点与继承关系一目了然。它默认只显示当前会话所在的树,且自上而下生长,可以通过工具栏切换到“全部会话”和“横向”布局。插件由 xiguazhiPrince 维护,属于客户端插件。
核心功能¶
- 当前会话的树:打开即定位,只铺开当前会话所在的那棵轮次树——父链、与它并列的兄弟分支、以及它们的后代;一键切回全图。
- 竖向生长:默认自上而下,同一会话的下一轮在上一轮下方,父节点居中于自己的所有子节点;fork 头在两侧展开,自己的下一轮夹在中间;会话颜色贯穿自己的轮次;一键切回横向。
- 轮次节点:每个用户轮次是一个节点;当前会话及祖先路径的 steering 输入也会作为后续节点出现;轮次号、提示预览、分叉数;共享的继承前缀只画一次;0 条自有输入的会话显示为会话头 chip;长直链折叠成
+N 条输入。 - 画布手感:滚轮平移、Shift + 滚轮横向平移、Ctrl / ⌘ + 滚轮缩放、拖空白平移(不会选中文字),外加适应窗口 / 定位当前 / 100%。
- 一屏概览:另有一个“会话概览”标签页:轮次、步骤、模型耗时、工具耗时、输出 token、运行状态。
- 三个入口:对话标签页、会话头部开关、右侧栏常驻标签页——哪里顺手用哪里。
安装与启用¶
GitHub 直装:
# 装进 web profile —— 就是 `dsh web` 启动的那个
dsh plugin --profile web add github:xiguazhiPrince/dsh-session-map
# 换你自己的 profile 名即可,例如 tui
dsh plugin --profile <你的 profile> add github:xiguazhiPrince/dsh-session-map
profile 名要已经存在于 $DSH_HOME/profiles 下(dsh --help 里 --profile 那一段就是它);想新建一个就先用模板派生:dsh myweb --from-default-profile web 会照 web 模板建出 myweb 并启动它。安装走的是 profile 自己的 pnpm,装完这个包会同时写进它的 dependencies 与 dsh.profile.bundles。
安装后验证:
dsh --profile web --dump-config # profile 名换成你装的那个
在输出中确认有 # == dsh-session-map 层:
# == dsh-session-map
- id: session-map
name: dsh-session-map
然后重启该 profile 的进程并刷新页面。四处应该出现:
| 位置 | 应该看到 |
|---|---|
| 会话标签栏 | 「概览」与「会话图谱」两个标签页 |
| 会话头部工具区 | 「会话图谱」开关;右侧栏正显示图谱时再点一次会关闭它 |
| 右侧栏标签 | dsh-session-map.map(标题「会话图谱」)和 dsh-session-map.overview(标题「会话概览」) |
| 图谱页本身 | 轮次树画布;默认只画当前会话的那棵树、且自上而下,工具栏的「当前会话树 / 全部会话」与「竖向 / 横向」两组开关可切回全图与原方向,旁边显示会话数、轮次数、树数与当前缩放百分比 |
典型用法¶
三个入口¶
| 座位 | 内容 |
|---|---|
conversation.view |
「概览」标签页(order 20)、「会话图谱」标签页(order 30)—— 默认关闭 |
conversation.session.header.utilities |
会话头部的「会话图谱」开关(order 40) |
sidebar.right.pane.tab |
常驻标签页 dsh-session-map.overview 与 dsh-session-map.map |
工具栏¶
| 控件 | 作用 |
|---|---|
| 「当前会话树 / 全部会话」 | 画布范围:当前会话所在的那棵树,或者列表里的全部会话 |
| 「竖向 / 横向」 | 树的生长方向:自上而下,或者自左向右 |
| 「折叠长直链」 | 直链超过 8 条输入时折叠中间段(保留头 2 + 尾 1),显示 +N 条输入;点击画布上的胶囊展开,取消勾选则全部展开(默认开) |
| 「隐藏子代理会话」 | 过滤 origin: subagent 的会话(默认开) |
| − / + / 100% / 适应窗口 / 定位当前 | 缩放与取景 |
| 键盘图标 | 快捷键表 |
画布交互¶
- 滚轮上下平移,Shift + 滚轮左右平移,Ctrl / ⌘ + 滚轮缩放;
- 拖动空白平移(不会选中文字),点空白收起菜单;
- 点击轮次节点弹出操作菜单:跳转到该会话 / 在画布中居中(暂时只能定位到会话,不能定位到具体轮次);
- 点击会话标签或会话头 chip 弹出会话操作菜单;
- 点击折叠直链上的
+N 条输入展开该段;工具栏的「折叠长直链」控制是否自动折叠。
默认只画当前会话的会话树¶
图谱打开时只铺开当前会话所在的那棵树:从树根(parentId 链上仍被列表列出的最远祖先)到它的所有后代,含与当前会话并列的兄弟分支。工具栏上的「当前会话树 / 全部会话」两段开关切换这个范围。
默认竖向生长¶
树自上而下长:同一会话的下一轮在上一轮下方,父节点居中于自己的所有子节点;fork 出来的会话头在两侧展开,父会话自己的下一轮夹在中间;没有 fork 的父子轮次保持一条直链。fork 边从被继承的最后一轮出发,而不是从父会话的链尾出发。横向模式是自左向右,轮次往右排。
轮次、会话与空会话¶
- 节点 = 一条用户输入:轮次 prompt 来自
projectionValues.turnOutline;当前会话及其祖先路径的已加载事件窗口会把同一轮里的 steering 消息追加成后续节点。没有加载历史的会话仍只有每轮首条 prompt。 - 会话 = 颜色 + 标签:颜色按会话 id 稳定哈希取 8 色之一;标签只挂在该会话第一条自有轮次上,显示该会话的显示标题;当前会话的整条自有链强高亮,继承路径弱高亮。
- 共享前缀只画一次:子会话的日志以父会话的事件开头,构建时按
turn+ prompt/response 与父 outline 求最长公共前缀;匹配到的轮次复用祖先的节点,fork 后的第一条自有轮次挂在该前缀的最后一轮下。 - 0 条自有输入的会话:没有轮次可以放标签,就在 fork 轮上挂一个会话头 chip(
尚无输入)。chip 本身也是树节点,所以「空会话再 fork 出空会话」会形成 chip 链,不会丢层级。 - 长直链折叠:一段没有分叉的纯直链超过 8 条输入时,默认保留头 2 + 尾 1,中间折成
+N 条输入;点击展开。折叠只发生在纯直链上,分叉输入、会话头、末条输入永远可见。 - 投影缺失:该会话只画会话头 chip(
投影未加载),工具栏说明有几个会话没有轮次数据。
对话标签栏的两个标签页默认关闭¶
「概览」和「会话图谱」这两个 conversation.view 入口由浏览器本地偏好控制,默认不注册。头部开关和右侧栏的两个标签页不受影响,图谱仍然可以从右侧栏正常使用。
在页面控制台里改,刷新后生效(不需要重新构建或重启):
localStorage.setItem('dsh.session-map.conversationViews', 'true') // 打开
localStorage.setItem('dsh.session-map.conversationViews', 'false') // 显式关闭
localStorage.removeItem('dsh.session-map.conversationViews') // 回到出厂默认
适用场景与注意¶
适合需要频繁查看 Agent 交互上下文、多分支会话梳理的开发者与调试人员。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(MIT)。
短结尾¶
通过可视化画布,分叉与继承关系变得清晰,便于定位上下文与调试。插件由 xiguazhiPrince 维护,可在目录页与 GitHub 上找到更多信息。
参考资料¶
- https://github.com/xiguazhiPrince/dsh-session-map
- https://www.skillhub.cn/plugins/xiguazhiPrince/dsh-session-map