dsh-decision-map:把会话执行轨迹画成一眼能看懂的决策地图

前言

用 DSH 跑智能体任务时,一个会话往往包含多轮推理、几十次工具调用,事件日志逐条排下来很长。内置的「轨迹」视图是账本式的,能查,但想快速回答「这一轮做了什么、哪一步最慢、token 花在哪」并不直观。DSH 的理念是一切皆插件,会话视图本身也留了接缝。下面介绍的 dsh-decision-map,就是利用这个接缝做的一层可视化。

这是什么

dsh-decision-map(决策地图)是 Scitiger-AI 维护的 DeepSeek Harness bundle 插件,当前版本 0.1.0,MIT 许可证。一句话定位:把当前会话的执行轨迹渲染成一眼能看懂的时间线卡片与统计卡。

它是一个「双面」插件:

1、node 半边注册一个 decisionMap 会话投影,把事件日志折叠成时间线和统计;

2、browser 半边在会话视图里注册一个「决策地图」标签页,读取投影并渲染。

包结构也很直接:

dsh-decision-map/
├── package.json          # 双面包身份声明dsh.bundle.patch + dsh.client
├── cordis.patch.yml      # bundle patchinsert 一行 { id: decision-map, name: dsh-decision-map }
├── lib/
   ├── index.js          # node half注册 decisionMap 会话投影
   └── client.js         # browser half注册 conversation.view 标签页
└── README.md

核心功能

卡片式时间线

安装后,会话视图(conversation.view slot,order 20)会多出一个「决策地图」标签页。时间线上每个动作是一张卡片,分三类:

  • 💭 思考(琥珀色):该步产生了 reasoning
  • 🔧 工具(蓝色):一次工具调用
  • ✍️ 写文件(绿色):工具名恰为 write / edit 的调用

轮次之间用「第 N 轮 · N 个动作 · 跨度 X」分隔。每张卡片标注类型、工具名、耗时、第N轮·第S步,下方缩进显示详情——思考显示推理片段,工具显示参数。

点击任一卡片,右侧展开一个详情面板,显示该动作的类型、耗时、时间与完整详情,选中卡片有高亮描边。与内置「轨迹」的区别在于:决策地图把每一步做成带图标的卡片、按时间顺序铺开,每一步做了什么、花了多久一眼能看清。

统计卡

时间线旁边是一排统计卡:总 Token(含输入/输出拆分)、工具调用次数、轮次数、最耗时的步骤。

数据从哪来

node 半边注册 decisionMap 会话投影,折叠这些事件:turn/startstep/startassistant/chunkassistant/messagetool/calltool/resultstep/end,结果是一个 timeline + stats 结构。口径如下:

  • token 取 usageinputTokens + cacheReadTokens + cacheWriteTokens + outputTokens,只计入 adapter 上报了 usageassistant/message,未上报则为 0;
  • 工具耗时按 callId 配对 tool/call → tool/result
  • 思考耗时是 TTFT 近似:该步首次 reasoning 到首个非 reasoning token 的时长,无输出 token 的步思考节点耗时为空。

browser 半边注册 conversation.view 标签页,通过 useProjection("decisionMap") 读取投影。数据链路是:会话事件日志 → 投影折叠 → 经 api-proxy 的 tail page 与 session/projection push 帧送达浏览器 → 标签页渲染。

纯前端实现,零依赖

渲染全部在前端完成:内联样式 + div,不引用任何外部库、CDN、字体或图片。配色使用 shell 自带的 --dsw-static-* 静态色与 --dsw-alias-* 主题别名,明暗主题自动适配。

整个包零运行时依赖、无构建、无 TypeScript,装下来开箱即用。两半都不创建进程级或页面级副作用,可被 Cordis 的 stop/update/unload 干净回收。

安装与启用

先取包,再用 dsh plugin 把它装进某个 profile。三种方式:

# 方式 A:在本包目录内(package.json 所在目录)用 `.`:
cd /path/to/dsh-decision-map
dsh plugin --profile web add .

# 方式 B:在本包目录的父级目录,用相对路径:
dsh plugin --profile web add ./dsh-decision-map

# 方式 C:发布到 npm 后按包名安装:
dsh plugin --profile web add dsh-decision-map

两个注意点:

1、dsh plugin add 会把相对路径锚定到你执行命令时所在的目录。别在包目录内写成 add ./decision-map——那会指向一个不存在的子目录。

2、本包声明了 dsh.bundle.patchdsh plugin add 会自动把它并入该 profile 的 dsh.profile.bundles 层栈,随后 profile 组合器应用包内自带的 cordis.patch.yml

- insert:
    - id: decision-map
      name: dsh-decision-map

也就是说,不需要手工编辑 profile 的 cordis.patch.yml

经过上面的步骤,重启(或触发配置热重载)后,进入任意会话,标题栏的视图标签里会出现「决策地图」。

已知取舍

  • 投影值随 tail page 全量携带:timeline 是完整动作列表,会话很长时投影值会变大。每个节点的 detail 已截断至 120 字符,对常规会话可忽略。
  • 「写文件」是启发式分类:只把工具名恰为 write / edit 的调用标为绿色;bash 这类既能读也能写的工具归入「工具」,不臆测是否落盘。
  • 思考耗时是 TTFT 近似,不是精确的推理墙钟时间;无输出 token 的步,思考节点耗时为空。
  • token 是 provider 上报值,与核心的 token 记账口径一致,adapter 未上报 usage 则计为 0。

适用场景与注意

适合需要复盘智能体执行过程的开发者:确认多轮里的动作顺序、看每一步的耗时、检查 token 消耗分布。它只做展示,不改动会话数据。

提醒一点:插件以当前 dsh 进程权限运行,安装前建议先读源码、确认许可证。本包的核心就是 lib/index.jslib/client.js 两个文件,无构建、零运行时依赖,阅读成本不高,许可证为 MIT。

结尾

dsh-decision-map 做的事情很克制:在会话视图加一个标签页,把事件日志折成时间线和统计卡,让执行轨迹从「能查」变成「能看」。装完即用,卸载干净,符合 DSH 一切皆插件的思路。

  • 插件目录页:https://www.skillhub.cn/plugins/Scitiger-AI/dsh-decision-map (社区维护的独立目录站点,与 DeepSeek / 幻方无官方从属关系)
  • 源码仓库:https://github.com/Scitiger-AI/dsh-decision-map
羽毛球分组比赛记分
小程序二维码

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

小夜