DSH 会话图谱插件:在画布上可视化 Agent 交互分叉与继承关系

前言

在 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye