dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 右侧可视化侧边栏插件 · visual sidebar plugin for deepseek-ai/deepseek-harness (standalone npm package; source also in ATchangan/deepseek-harness fork)
A visual sidebar for the right details column of the DeepSeek Harness Web UI. It replaces the native tool-details panel with a resident, theme-aware, multi-tab sidebar: Overview / Compare / Insights / Context / Collection — each built on data that nothing else in the harness already surfaces.
中文文档见 README.zh-CN.md。
Association: this repository is the standalone installable package. ATchangan/dsh-visual-sidebar-fork is a fork of deepseek-ai/deepseek-harness whose tree hosts only this plugin (the same content at the repository root) — the fork keeps the upstream relationship visible while remaining a plain plugin package, not a full harness copy.
| Tab | Content | Data source |
|---|---|---|
| 总览 Overview | cross-session live board (running / awaiting input / stalled / background jobs / subagents) + current-session context health (used %, projected, window) | useSessions list (running, pendingInteraction, updatedAt, jobsBySession, subagentsByParent) + useProjection('contextPressure' / 'contextBreakdown') |
| 对比 Compare | per-session overview table (title, updated, tokens, turns) with a click-to-focus detail pane and a mini token trend for the current session | session list projectionValues (tokenUsage, sessionStats) + current chat window |
| 洞察 Insights | hand-drawn SVG charts: token curve (output / cache-read), turn durations, tool frequency, context pressure gauge, 7×24 activity heatmap, tool bottlenecks (calls / total / P50 / P95 / failures) with one-click save-to-collection | current-session chat snapshot (usage rows, turn timings, tool timings) + projections |
| 上下文 Context | context composition stacked bar (system / tools / messages), pressure gauge, and session fork lineage tree (ancestors + descendants, subagent-aware); click a node to open that session | contextBreakdown / contextPressure projections + session list parentId lineage |
| 收藏 Collection | cross-session library of saved items (tool result / message output / file / command): filter chips, search, copy, insert into composer, scroll to the chat node, delete | localStorage-backed collection store (root scope, shared across sessions) |
details single slot at priority: -1 (official renderer stays at priority: 0; lowest renders). It does not re-declare conversation.details.tool — the native tool-details panel and its seat are deliberately left to the framework's official entry (the trajectory view owns full tool/request inspection).localStorage, key rsp.sidebar.<sessionId>); switching back to a session restores its panel state, and the framework's closeDetails() on session switch is re-opened from the panel's own mount effect when the session remembered open.--dsw-* / --ds-* tokens (light/dark follow the DSH theme automatically); dictionaries ship zh + en; registration respects prefers-reduced-motion.rightpanel.toolbar (header tools) and rightpanel.extras (bottom extras) — for third-party plugins.react, @deepseek-ai/dsh-client-runtime/client, @deepseek-ai/dsh-client-ui-primitives) are resolved at runtime.@deepseek-ai/* packages 0.1.x (built against 0.1.1-rc.2; peer range >=0.1.0-rc.5 <0.2.0), Node ^22.19.0 || >=24.0.0.lib/index.js) plus the lazy-CJS client bundle (lib/client.js registered through window.__ModuleLoader__.load), discovered via dsh.client.platform = "web" and exports["./client"].DSH Desktop (market verification path)
The package carries a verifiable DSH bundle field:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": { "inject": [...], "platform": "web" }
}
With the Desktop community market or the built-in terminal:
# inside a DSH Desktop terminal, for the active profile:
dsh plugin add --save-exact @atchangan/dsh-visual-sidebar@0.1.0
The bundle patch inserts the loader row:
- insert:
- id: ui-visual-sidebar
name: '@atchangan/dsh-visual-sidebar'
Manual profile install
npm pack (or clone the repo) and install the tarball into the profile:
pnpm add --save-exact ./path/to/package.tgz in the profile directory (e.g. $DSH_HOME/profiles/desktop).cordis.patch.yml, or let dsh plugin add handle both.dsh web host) and refresh the page.pnpm install # installs the dev toolchain (esbuild, typescript)
pnpm typecheck # strict TS check against the published 0.1.1-rc.2 type packages
pnpm build # emits lib/client.js (+map) and lib/index.js (+map)
pnpm verify # vm-based loader smoke test (single __ModuleLoader__ registration, apply/inject exports)
The client bundle replicates the in-repo clientBundle preset contract: CJS closure registered via window.__ModuleLoader__.load, externals resolved through the injected require (module table), everything else inlined; .css is inlined as text and injected at materialization under style[data-plugin-css].
details slot: single / session scope, declared by ui-layout's frame; shadowing at a lower priority is the documented mechanism ("lowest renders").useSession, useProjection, useSessions, useWorkspaces, useInput, inputActions (the last two via ui-conversation's standard provide channel).[data-chat-anchor-key] on node rows inside the [data-conversation-scroll] scrollport (used by the click-to-scroll interaction).tokenUsage, sessionStats, contextPressure, contextBreakdown (host-provided whole values; read defensively).defineStore persist (per-session suffix) + a root snapshot store for the collection.conversation.details.tool and cannot read the internal chatStore selection; full tool/request inspection is the trajectory view's job. Clicking a tool row in chat only opens the panel column — it does not locate the tool.updatedAt activity for 2+ minutes is flagged "长时间无更新", not a definitive deadlock.ui-deliverables and deliberately not duplicated.@atchangan must be an npm scope registered to the publisher before npm publish; keep the id in cordis.patch.yml and the __ModuleLoader__ registration consistent with package.json#name (the build derives both from it).MIT — see LICENSE.