HR2AY/DSH-Plan-Graph
DeepSeek Harness 轨迹的另一版本(DIY)
项目介绍Project Overview
DSH Plan Graph 是一款 DeepSeek Harness 外置插件,在会话视图中新增"Plan Graph"标签页,以客户端方式渲染会话工具调用与消息的交互式流程图:支持平移/缩放画布、按状态着色的节点卡片、节点详情、隐藏工具调用与按轮次分组等开关、"跟到最新",以及"合并到对话"接入真实右侧栏。底层依赖会话快照的 chatNodeVisibility 与 conversationDefaultView 服务,未提供时回退到图内定位。注意:聊天页仅在消费了 chatNodeVisibility 的 ui-conversation 下才会真正隐藏工具调用。
DSH Plan Graph is an out-of-tree DeepSeek Harness plugin that adds a Plan Graph tab to the session view, rendering an interactive client-side flow of tool calls and messages from the conversation snapshot. It provides a pan/zoom canvas, status-colored node cards, details panel, hide-tool-calls and group-by-turn toggles, follow-latest, and Merge into the real right sidebar; favorites, a node context menu, and locate-in-conversation map nodes to chat rows via the data-chat-flow-key anchor. Use it to audit complex multi-tool sessions visually. Caveat: against an unpatched dsh the chat page ignores hide-tool-calls, and locate-in-conversation falls back to in-graph locate if the anchor contract changes.
请帮我了解并安装插件:【DSH-Plan-Graph】【https://github.com/HR2AY/DSH-Plan-Graph】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile web add github:HR2AY/DSH-Plan-Graph
把 HR2AY/DSH-Plan-Graph 加入你的 DSH 配置(web profile)即可启用。
READMEREADME

dsh-plan-graph
An out-of-tree DeepSeek Harness plugin bundle: an interactive flow graph of a session's tool calls and messages, rendered client-side from the conversation snapshot. The plugin adds a "Plan Graph" tab to the session view ring (pan/zoom canvas, status-colored node cards, node details, hide-tool-calls and group-by-turn toggles, follow latest, and "Merge into conversation" into the real right sidebar).
pkg-3 adds three features on top of the graph:
- Favorites — a panel centered at the bottom of the view, opened from the toolbar button (colored kind tiles + summary + time). Per-session, persisted as JSON in
localStorageunderdsh.plan-graph.fav.<sessionId>, deduped by node id, capped at 100. Add via the node context menu or by dragging a node onto the toolbar favorites button. Click an entry to center the graph on that node with a flash highlight; if the node has left the current window (partial finished, node paged out), the click falls back to the matching chat row by seq/callId. Removal goes through the node context menu. - Node context menu — right-click a node for: add/remove favorite, locate in conversation (tool-call nodes only), copy node info, view details. Closes on outside click, Escape, or canvas interaction. Favorites are managed here (and by dragging a node onto the toolbar favorites button) — there is no ★ button on the details panel.
- Locate in conversation — maps any node to its chat row: tool calls by
callId, assistant output bydata.finalNode.seq, and user input / steering / context bydata.seq(the same event seq the graph node id embeds), then waits for thedata-chat-flow-keyanchor viaMutationObserver, scrolls it into view and flashes it; a 10s timeout silently falls back to in-graph locate. Prefers an upstreamchatLocateoptional service when a deployment provides one.
The browser half is the plan-graph dynamic-plugin code (pkg-3), wrapped in the web module loader's handoff format — plain JavaScript, no build-time dependencies. The prepare script (which pnpm runs after a git install) regenerates client.js from client.body.js.
Changes since 0.1.0 (pkg-20): pkg-21 — user/steering nodes display「输入」(input) and context nodes「已完成」(completed) instead of idle; pkg-22 — dragging the canvas no longer selects text (user-select: none + preventDefault on mousedown); pkg-3 — favorites (persisted, drag-to-add), node context menu, and locate-in-chat; pkg-4 — the graph flash highlight clears itself via the CSS animation's animationend (the dynamic client half withholds browser timer globals, so setTimeout is not used); pkg-5 — favorites UI is the dropdown-panel form (colored kind tiles + summary + locate pin + details ★ button); pkg-6 — the panel renders centered at the bottom of the view and the per-entry × remove button is dropped; pkg-7 — the context menu reorders so 定位至对话区 (locate-in-chat) sits below the favorites toggle; pkg-8 — the chatNodeVisibility service gains subscribe(fn) (its consumer calls it during Chat render; without it the conversation page went blank when switching back to Chat); pkg-9 — 定位到图内 removed from the context menu, the details ★ button removed (favorites via context menu only), and favorites entries store the node seq with a chat-row fallback when the node leaves the window; pkg-10 — the locate-pin icon is dropped from favorites rows; pkg-11 — 定位至对话区 works for every node kind (tool by callId; assistant by finalNode.seq; user/steering/context by data.seq).
Install
From a directory that contains this package (or any npm registry / tarball / git host):
dsh plugin --profile demo add ./plan-graph-bundle
dsh --profile demo
From GitHub (sources, not built artifacts — the
preparescript builds on install):dsh plugin --profile demo add github:<you>/plan-graph-bundle#<sha>. pnpm refuses to run thepreparescript until it is allowlisted — copy the exact package key pnpm printed into the profile'spnpm-workspace.yaml:allowBuilds: dsh-plan-graph: trueand re-run the
add. That allowance is permission to execute this package's code on your machine at install time — pin a commit (#<sha>) and only install sources you trust.From a tarball (no build permission needed):
pnpm packin this directory, thendsh plugin --profile demo add ./dsh-plan-graph-0.3.0.tgz.From npm (once published):
dsh plugin --profile demo add dsh-plan-graph.
Verify the layer without booting: dsh --profile demo --dump-config shows a # == dsh-plan-graph layer.
What it needs
- The browser half registers into
conversation.view/detailsthrough the standard client plugin services (slots,locale,layout), all provided by the dsh web surface. - "Hide tool calls" provides the optional
chatNodeVisibilityservice. The shipped ui-conversation does not consume it yet, so against an unpatched dsh the toggle hides nothing on the chat page (the graph itself honors it); deployments with a ui-conversation that consumes the service get the live chat filtering. - Fresh sessions keep Chat as the default view; the Plan Graph tab is one click away. A deployment that wants the graph front and center provides the upstream
conversationDefaultViewservice itself ({ id: 'plan-graph' }). - "Locate in conversation" reads the shared conversation snapshot and targets the chat row's
data-chat-flow-keyanchor. The anchor is a view-layer contract of the shipped chat view; if a future dsh renames it, the feature silently falls back to in-graph locate rather than erroring.
Regenerating the client bundle
npm run prepare (or node scripts/build-client.mjs) rewrites client.js from client.body.js. Edit the body, never the generated file.
nexu-io/open-design
ruvnet/ruflo
amruthpillai/reactive-resume
esengine/DeepSeek-Reasonix
volcengine/OpenViking
Molunerfinn/PicGo
titanwings/distilly
titanwings/colleague-skill