The File Activity card derived its ops client-side from the served tool nodes joined with the conversation WINDOW: a call whose arguments had aged out of the loaded tail named no target and vanished from the card silently, so the "up to latest" scope actually covered only the chat window. The join was also the only meta/subCalls carrier, and the per-call op assembly was written twice (top-level and Code-Mode nested paths). The derivation moves to the host fold, which sees every lifecycle event with its full payload: `tool/call` arms name + raw arguments (the pending-call map's entries grow `argsRaw`), `tool/result` books the ops off the armed arguments plus the result's presentation meta (grep's by-file match groups, glob's path list, read's exact window), and `tool/code-dispatch` buffers nested Code-Mode ops under their run_code root until the parent result flushes them with `parent` + the program description. The log is bounded (`maxFileOps`, default 400) with a `fileOpsFloor` coverage stamp, rides the detail payload (and the inline value on channel-less hosts), and is plain JSON end to end. stateVersion bumps to 14; cached rows refold from the log to rebuild the op log. The per-call parsing is ONE shared module (shared/fileOps.ts — opsOfCall plus the kind/path/delta/read-window/search-attribution primitives), consumed by the host fold and by the client's inline-generation fallback (the legacy window derivation stays for old hosts, now through the same parser, closing the duplicated assembly). The client aggregates + filters (`activityOfOps` joins the archive's `gone` stamps at render time; nested ops scope by their parent result's seq, matching the legacy node-level rule); the card, its chips, rows, deltas, and locate bridge render unchanged. Verified: 1142 tests with per-file 100% coverage (new parser matrix, fold-ops, aggregation, end-to-end through the real registry + detail endpoint); the compat vocabulary probe gains tool/code-dispatch (present at the 0.1.2-rc.1 tag). Live on the real deployment: the big session's card grew from 4 window-bound files to 37 files / 135 ops spanning every turn, and folding the real Code-Mode logs books nested ops with parent + program stamps (e.g. 136 nested reads across one session, errors flagged). Known upstream boundary (unchanged): `tool/code-dispatch` persists no result meta, so nested reads keep the limit-estimate footprint and nested searches the call-target form until the harness carries meta there.
dsh-context
The best DeepSeek Harness plugin for Agent's context insights and management.
dsh-context provides full context lifecycle management features.
- Context tab — an UI context dashboard for DeepSeek Harness's context stats, composition, trend, events, and messages.
/contextcommand — the slash command shows the context model for current context composition and recent context evolution.
Install / Update
To Install from any DeepSeek Harness installation:
dsh plugin --profile web add dsh-context
Or to update the dsh-context plugin:
dsh plugin --profile web update dsh-context@latest
Then start the web UI with dsh web. No build step, no restart.
Use it
Three surfaces, one story — what your agent is carrying, how it got there, and what it did with it:
| Where | What you get |
|---|---|
| Context tab | The full dashboard: stats, composition, per-request trend, events, file activity, and the agent network — in every session. |
/context command |
A centered modal with the same composition and context browser, without leaving the chat. |
| Settings → Plugin configuration | Per-user defaults: trend granularity & mode, File Activity sort. |
📊 The Context tab
Open any session and click the Context / 上下文 tab:
| Card | The question it answers |
|---|---|
| Context Stats | Turns, steps, live tool calls & images, context-event tallies — plus a list-price cost estimate (hover the ? for per-1M rates). |
| Token Stats | Where the billed tokens went: cache read/write, uncached input, output — around the cache-hit ring. |
| Timing Stats | How active time split across model calls, tool runs, and overhead. |
| Current Context | What's in the window right now. |
| Context Trend | Every request's size — and its story. |
| Context Browser | What any request was actually assembled from. |
| Context Events | When and why the window changed. |
| File Activity | What the agent did to your files. |
| Agent Network | The whole agent family, live. |
The headline occupancy and composition read the same official token-meter projections as the chat composer's context ring (contextPressure / contextBreakdown), so the figures always match what the ring tells you.
🧱 Current Context — who ate the budget
A six-color stacked bar against the model's full window (hatching = free headroom): system prompt, tool schemas, user messages, injected context, assistant replies, tool results — each with its ≈token figure and share. When a conversation starts degrading, this is where you see which part is responsible.
📈 Context Trend — every request, sized and explained
One stacked bar per model request — finer than per-message — so you watch the window grow turn by turn:
- ✨ Step brief — three plain-language rows under the chart: User recalls the message that opened the turn, In lists what newly entered (usually the previous tool results), Response shows the reply and/or tools called. Click a row to open that exact message in the Context browser.
- ✂ marks the events — compactions and prunes are pinned to the bar where they happened, so the drops explain themselves.
- Read it your way — Step / Turn granularity, Total (cumulative makeup) or Delta (each request's signed change), and sideways scrolling through the whole session. In Delta mode, growth piles up above the baseline and a compaction dives below it:
- Hover & pin — scrub for an instant tooltip; click to pin the full breakdown, with provider-reported Actual Prompt / Output / Cache next to the estimates.
- Live linkage — hovering a bar previews that step's assembled context in the Context browser beside the chart; leaving the chart returns to your own pick.
🧭 Context Browser — open the box of any request
Pick Live (next request) or any retained step, and browse what that request was assembled from: six collapsible categories expand into one row per element with its token price, and every element expands again into its actual content — the system prompt, each tool's JSON schema, message text, reasoning, tool arguments, and tool outputs.
- Who provides each tool — every tool-schema row carries a best-effort source chip:
tool-*first-party packages,dsh-*capability packages,mcp:<server>proxies, or the exact plugin watched live fromtools.register(). Sort by size / name, and filter every category by its own searchable fields:
- Tool results open into the full call — the tool name and arguments with its OK/error status, the result body with line count and a Raw / Markdown toggle:
- Image payloads render as cards — thumbnails with name, dimensions, stored size, and the official DeepSeek image-token estimate (the dsh multimodal pipeline, e.g.
read_imageresults and image attachments):
- Diff against the previous turn — signed delta badges per category (
+Nitems,±Nktokens) tell you what a turn added or reclaimed at one glance. Steps older than a compaction are reconstructed from the removed-message archive — and the card says so when a step's makeup is only approximate.
⚡ Context Events — when and why the window changed
Every injection, compaction, prune, model switch, and plan-mode toggle — labeled with its producer (instruction file, plugin id, skill name), its net token delta (compactions show what they reclaimed), turn/step, and time. The Inject / Compact / Prune / Switch / Mode chips filter the log by kind.
📁 File Activity — what the agent did to your files
One row per touched file — read, written, or searched — aggregated up to whichever step you pick on the trend chart:
- Per-purpose counts with header chips doubling as filters (Read / Written / Searched / Images) and a path search box.
- Line deltas — every
edit/writecontributes its estimated+added / −removedfootprint, per file and summed. - Every mode counts — native tools, the Minimal preset's
str_replace_editor, and the nested calls inside PTCrun_codeprograms are all folded into per-tool rows. - Searches land on real files — matched files get their own ops rows with hit counts.
- Click a row to expand its full operation log — every op jumps straight to the exact tool result in the Context browser.
🕸 Agent Network — the family portrait
The current agent, its parents, and every subagent — one node per agent, colored edges for the lineage, multi-level delegation on one map. Each ring is that session's composition scaled to its window occupancy; hover for tokens, requests, billing, and active time; click to jump into that session's own Context tab. Running agents breathe with a green pulse.
⌨️ /context command
Type /context (or pick it from the / menu) and press Enter:
A centered dialog opens with the Current Composition card and the Context browser — the same composition bar, per-step picker, and vs previous turn diff badges as the tab:
⚙️ Settings
In Settings → Plugins → Plugin configuration, the Context card holds this plugin's per-user preferences — default trend granularity (Step/Turn), default trend mode (Total/Delta), and the File Activity default sort. In-chart and in-card toggles stay per-view and never overwrite the stored preference.
Good to know
- Estimates vs actuals — category figures use dsh's own fixed-density heuristic (the same one as its built-in token meter); the pinned trend details and Token/Timing rings show provider-reported actuals next to them.
- Compatibility — works on
@deepseek-ai/dsh0.1.2-rc1+. The per-release matrix and how it is verified: docs/compatibility.md. - I18n — UI in English and 简体中文.
Like it?
If dsh-context helped you understand what your agent is carrying around, a ⭐ on GitHub is much appreciated — and issues/PRs are welcome!













