dsh-ctm
Manifest validDeepSeek Harness 上下文管理插件:上下文可视化、token 用量、编辑、回退与快照恢复
dsh-ctm — Context Transparency Manager
English | 中文
Turns the model's context into a visible, editable, effectiveness-scored first-class object, published as a self-contained bundle plugin for DeepSeek Harness.

Features
- Full visibility: a turn → segment flow view colored by role / tokens / cache status / effectiveness, with markdown rendering and paging.
- Token accounting (provider-measured): the KPI strip uses MECE buckets — uncached input / cache hit / output (cache write appears separately only when > 0) — plus a derived cache hit rate (hit ÷ bucket sum; hidden when the denominator is 0) and the model. All figures are whole-session cumulative, read preferentially from the
tokenUsagesession projection, falling back to a full-log event fold when the projection is unavailable (the summary'susageSourcemarks which path was taken). Turn headers show the sum of that turn's step requests; step headers show that single request's measured usage (tooltips state the exact semantics); the latest request's prompt size and context-window occupancy (when thecontextPressureprojection is readable) sit in the KPI tooltip. Segment-level token counts remain local heuristic estimates and are explicitly labeled as estimates. - Live refresh: event-driven (reactive
useSessionsubscription) — new messages, tool results and turn boundaries update immediately; no polling. - System prompt: Session V3 compatible. CTM treats the newest
system/messageon the current surface as the editable effective system prompt and displays it under the stable segment-0 identity; migrated historical sessions use the same path. - Editable: replace, delete, rollback, snapshot restore, undo, effectiveness override (manual), and copy segment content (to re-send a rolled-back message, copy the original into the host input box — the host chat UI does not expose its input box to plugins). The initial system prompt is replaceable; all other system-injected content (runtime context etc.), tool results, and CTM placeholder markers are read-only in the UI.
- Effectiveness engine: automatic
effective/redundant/stale/injectedverdicts with manual override. The 2-gram similarity sets are LRU-cached (500-entry cap), never rebuilt from scratch per request. - Apply for real (off by default): when enabled, replace / delete / rollback no longer intercept requests — they are written into the session log as surface
replaceevents atagent/pre-step(same timing, same mechanism as official compaction), honoring DSH's model-visible ⟺ logged invariant: replay / fork / token accounting always match what the model actually saw. Edits are badged "pending" until logged. Deletes and rollbacks are carried by placeholderuser/messagenodes (grouped under "User input" in the UI, read-only protected — not classified as system injections); assistant revisions are carried as user messages by role demotion; tool-call/result pairs are never split (deletion always shadows a minimal balanced range: deleting a tool result absorbs the assistant message carrying its tool-call, so the model never sees a dangling call). Undo = a queued (not yet logged) edit is simply dequeued; an already-logged edit is reversed by a counter-replace with the original content (only the most recent operation is undoable); undoing a rollback or a multi-node delete uses a restore group: the placeholder node is replaced by the first shadowed item and the rest append to the tail in original order, all demoted to user messages (an append-only log cannot re-add assistant/tool roles), and a restore group is itself undoable (undoing it re-shadows the run). Logging failures are recorded and surfaced at the top of the view. Mutations carryingexpectedVersionare checked optimistically — a version mismatch rejects the request with zero side effects. - System prompt editing: a replacement of segment 0 is stored as an override and swapped into the section list by the
system-prompt/assemblewaterfall at the next prompt assembly; the agent loop logs the validsystem/messagereplacement. - i18n: Chinese / English UI.
- Zero coupling: host↔client runs over plain HTTP
POST /ctm— no Typert@Remote/dsh-api-remotes; zero runtime dependencies (the tool-pair balance check is re-implemented locally instead of depending on@deepseek-ai/dsh-compaction).
Architecture
src/
├── contract.ts # shared contract: TS types + Zod runtime validation (single source of truth)
├── host.ts # host half: POST /ctm route + the agent/pre-step & system-prompt/assemble waterfalls
├── usage.ts # MECE bucket conversion / summation / full-log fold for usage (pure logic, unit-tested)
├── surface-edits.ts # edit logging layer: replace-event construction, tool-pair balancing, edit-queue application (pure logic, unit-tested)
├── bigrams.ts # 2-gram sets + LRU cache for the effectiveness engine (pure logic, unit-tested)
└── client/ # browser half: conversation.view tab + fetch('/ctm')
contract.ts: the host validates requests with it, the client validates responses with it. Types are inferred from Zod schemas, and runtime validation provides cross-version tolerance — the key to a community plugin shipping on its own cadence. New fields are always.optional()(e.g. segmentpending,usage; stateapplyError); the single exception was the summary usage rework (oldinputTokens/cachedTokens/...→ MECEtotal/lastRequest/usageSource) — host and client ship in one package, so that one breaking change was made directly.host.ts: registersPOST /ctmviawebServer; injectssessionQuery/sessions/tokenMeter. Reads Session V3 surface events fromreadSurface, marks the newestsystem/messageas the stable system-prompt segment 0, reads full logs throughsnapshotEvents(), and resolves individual events througheventAt(). Usage has two channels: assistant segments carry the provider-measured usage of a single request from theassistant/messageevent; session-level totals prefersessionProjections.snapshot()(an optional service captured through anctx.injectchild context — cordis throws on any read of a service not declared ininject, optional chaining does not help) for thetokenUsage/contextPressureprojections — the projection folds the complete log, immune to compaction/shadowing — falling back to summing the full log event by event (correct but O(log) per read), with the summary'susageSourcemarking the channel actually used. With apply for real on, edits enter a per-session queue and are appended group by group in theagent/pre-stepwaterfall (the turn is open and the request not yet built, so edits take effect in that very request; edits to an idle session queue up and land on the next step). The system-prompt override swaps the whole section list in thesystem-prompt/assemblewaterfall. Memory is bounded: session store LRU capped at 50, 20 snapshots per session, 50 trash entries per session.client/: registers a "Context" tab inconversation.view; every operation round-trips throughfetch('/ctm')with responses validated byctmResponseSchema; refresh is triggered reactively viauseSession. A "pending" badge distinguishes queued-but-unlogged edits from applied ones.
Wire protocol
POST /ctm; the body is an op-discriminated union (JSON), and every request carries a sessionId:
| op | extra fields |
|----|--------------|
| getState | — |
| replace | segmentId, content (UI allows replacing only the initial system prompt and non-system-injected segments; queued for logging when apply for real is on) |
| delete | segmentId |
| rollback | turnIndex |
| restore | snapshotId |
| reset | — |
| undo | — |
| override | segmentId, value (string | null) |
| setRealtime | enabled |
Response: { ok: true, state: CtmState } | { ok: false, error: string }.
Every op may additionally carry an optional expectedVersion (the version of the last state the client applied): the host compares it before any side effect and rejects mismatches with a stale_version error notice (optimistic concurrency against multi-client / stale-page races).
Known limitation: undoing a rollback or a delete involving tool pairs restores the removed content as user messages (the first item replaces the placeholder node, the rest append to the tail) — an append-only log cannot re-add assistant/tool roles. This is the same role-demotion scheme as assistant edits.
The bundled client does not currently send expectedVersion; the host check is available to callers that supply it, not a guarantee for every UI edit. The transcript view belongs to the host and may still show shadowed messages. Compatibility with a newer DeepSeek Harness revision should be checked against the host APIs used by this plugin.
Install / uninstall
# Install from GitHub (pinning a tag is safer; on first install pnpm will ask you
# to add the package to allowBuilds in the profile's pnpm-workspace.yaml — git
# installs pull source only, and the package's prepare script builds it at install time)
dsh plugin --profile <name> add github:ac0033/dsh-ctm#v1.0.0
dsh plugin --profile <name> remove dsh-ctm
add automatically writes the package into the profile's dependencies + dsh.profile.bundles (because it declares dsh.bundle) — no manual cordis.patch.yml edits; remove cleans up the dependency, the bundle layer and node_modules together.
Local development
pnpm install
pnpm build # produces dsh/index.js (host) + dsh/client.js (client)
Publishing
- Run
pnpm buildbefore publishing (e.g. a"prepublishOnly": "pnpm build"script); community users then receive the prebuiltdsh/index.js+dsh/client.jswith zero build steps. - Zero runtime dependencies:
zodis inlined into both bundles;reactresolves from the shell's module table. - When moving to your own scope, update both
nameinpackage.jsonand thename:row incordis.patch.yml.
License
MIT © YuanLumen
Similar plugins
by tea-whale
DeepSeek Harness (DSH) 写作工具插件:长文工作流、风格控制与 8 套常用写作模板,进度落盘、跨轮次续写。零运行时依赖。
★ 0
MIT
JavaScript
Sep 9, 2026
dsh plugin --profile web add dsh-writing-studioby 2768651338
DeepSeek Harness 的图形化插件管理插件:在 设置 → 插件 里新增「插件管家」标签页,用中文名和说明展示每个插件是做什么的,并提供一键启停开关与内置备注编辑——启停写入全局层补丁并实时热生效,备注保存到本地覆盖文件长期生效。
★ 7
MIT
JavaScript
Aug 17, 2026
dsh plugin --profile web add @2768651338/dsh-plugin-managerby deepseek-dsh
DeepSeek Harness Web UI 增强插件:余额用量概览、项目文件浏览、Git 变更与历史、内置终端、Harness 更新检查
★ 4
↓ 9/wk
JavaScript
Aug 20, 2026
dsh plugin --profile web add dsh-workspaceby inmny
DeepSeek Harness 插件:处理DSH沟槽的权限管理(full acess下传入同级或者降级的请求会报错,导致ai大战权限管理)
★ 17
MIT
JavaScript
Aug 21, 2026
dsh plugin --profile web add dsh-plugin-sandbox-escalation-fixby roushanyyzz
让 AI 在对话中每修改一个文件,你就立刻看到它改了什么。 DSH(DeepSeek Harness)插件:拦截 write / edit 工具调用,在对话流的工具卡片位置直接渲染 git 风格文件差异——支持上下对比与左右对比,逐行高亮
★ 0
MIT
TypeScript
Aug 20, 2026
dsh plugin --profile web add dsh-diff-visby Minglink
DeepSeek Harness 内置可视化插件市场 — 极速秒开、官方 dsh:// 联动、深度本地管理与原子化彻底卸载
★ 11
MIT
TypeScript
Sep 4, 2026
dsh plugin --profile web add dsh-stream-market