dsh-status-bar · Know what your agent is doing — at a glance
A 17-segment, fully configurable status bar for the DeepSeek Harness composer dock. Replaces the built-in stats line with live session intelligence: status, model, context pressure, token burn, real-time generation speed, cost estimates, jobs and queue — toggled and reordered in two clicks, and it removes itself cleanly when you unload it.
Overview
The problem: the DSH composer shows one thin, fixed stats line. You cannot see the current model, how full the context window is, how fast tokens are streaming, or what a session has cost — and there is no way to arrange that information the way you work.
Who it is for: power users and teams running DSH daily — anyone who wants live session telemetry without leaving the composer, and without running a separate monitor.
What it does:
- 17 toggleable, reorderable segments — status dot, model, title, workspace, agent preset, turns & steps, model/tool time, TTFT & decode speed, cache-hit rate, tokens, context pressure, live TPS, session time, cost estimate, jobs, queue, errors
- Live throughput (TPS) — a host-side projection folds every
assistant/chunkevent, so the speed updates chunk by chunk while streaming; no polling, no external live-stats plugin - Cost estimation with a user-maintained model price book — per-model rates, per-model peak/off-peak schedules, each message/step priced with the model that actually produced it (input, cache-hit, cache-write and output priced separately at that step's own time), and a «Usage & cost» dialog with a stacked cost-trend chart (day / week / month), a paged per-step usage history (with a dedicated cache-hit column), and a total-cost hero
- Zero-config default — 13 segments ship enabled; everything else is a checkbox away
- Clean takeover — the plugin's bar shadows the built-in
statscell at lower priority: while loaded it renders, when unloaded the built-in line returns untouched - Bilingual UI — client locale strings ship for English and Chinese, following the DSH locale system
Screenshots
The status bar replaces the built-in stats line with live session telemetry (status · model · turns · context · cache · TPS · session time · jobs · queue · errors), managed from a dedicated settings page — including a per-model price book with peak/off-peak pricing:

| Toggle & reorder on the go (segment list) | Usage & cost dialog (trend chart · stat cards · history) |
|---|---|
![]() |
![]() |
Compatibility
| Item | Value |
|---|---|
| DSH versions | 0.1.0-rc.5 (mainline master) — earlier RCs may work but are not verified |
| Last verified | 2026-08-16 |
| Runtime | Node ≥ 22 (host) + modern browser (client); no external services |
| Peer relation | Coexists with @linxin666/dsh-live-stats — both serve the liveTokenUsage key; the session-projection registry keeps the first registrant (one unit, no duplicate rows) |
Install / Uninstall
Install
# From a local checkout (profile assembly; `web` is a hardcoded alias for `--profile web`)
dsh plugin --profile web add ../dsh-status-bar
# Or from the GitHub repository
dsh plugin --profile web add github:Starlight-bananice/dsh-status-bar
# Or a pinned release tarball — immutable and versioned (attached to every
# GitHub release; handy when git access to the repo is awkward)
dsh plugin --profile web add https://github.com/Starlight-bananice/dsh-status-bar/releases/download/v0.1.6/starlight-bananice-dsh-status-bar-0.1.6.tgz
Note: pnpm fetches GitHub-hosted packages from
codeload.github.comand does not read your git proxy config. If the install hangs or fails with a network error (e.g.error (23)), export an HTTP(S) proxy:export HTTPS_PROXY=http://127.0.0.1:7890 HTTP_PROXY=http://127.0.0.1:7890and re-run.
Since v0.1.5: the built
lib/artifacts are committed to the repository — a git install is ready to run immediately, no build step required. Add the plugin, restart DSH Web, done. (Installs of ≤ v0.1.4 shipped nolib/, so they needed the manual build described under Development.)
# Or runtime injection without a restart (developer workflow)
# dev_inject_plugin / dsh-super-injector → point at this repository
Then start/restart DSH Web. No configuration is required — the bar appears with its defaults.
Upgrade
# pnpm pins a ref-less `github:` dependency to the commit resolved at install
# time, so `dsh plugin update github:...` reports "Already up to date" and
# keeps the old build. Upgrade with a re-add:
dsh plugin --profile web remove @Starlight-bananice/dsh-status-bar
dsh plugin --profile web add github:Starlight-bananice/dsh-status-bar
# or pin an explicit ref (tag / branch / commit)
dsh plugin --profile web add github:Starlight-bananice/dsh-status-bar#v0.1.5
Disable
- Hide the bar only — the client master switch (Settings → Plugins → Status Bar, or the gear menu) turns the bar off instantly; the host projections and usage ledger keep running.
- Stop the plugin entirely — remove it from the profile's
bundleslist (equivalent to uninstall below); re-adding restores it.
Uninstall
dsh plugin --profile web remove @Starlight-bananice/dsh-status-bar
Removal restores the built-in stats line automatically (shadow cell released). Data left behind: browser localStorage (dsh.statusBar.v1) and the host usage file (see Permissions & data) are not deleted — remove them manually if you want a clean slate.
Quick start
Install (above), restart DSH Web.
Start a session — the bar shows status · model · turns · durations · speeds · cache hit · tokens · context · TPS · session time · jobs · queue · errors by default.
Open Settings → Plugins → Status Bar to toggle/reorder segments, enable wrapping, or reset.
Want cost estimates? Add the models you use to the model price book:
# In Settings → Plugins → Status Bar → Model price book: # model "deepseek-chat" → input 2 / cache read 0.5 / cache write 2 / output 8 (CNY per 1M tokens) # optional: enable peak/off-peak with DeepSeek's official windows 09:00–12:00, 14:00–18:00The bar then shows e.g.
≈¥0.0123for the current session; the figure is the sum of each model's usage × that model's own price (so switching models mid-session prices each part with its own rate). Click the chart button next to the gear to open the usage & cost dialog (stat cards, rate card, a paged usage history — 20 rows per page, up to 10 pages — with input / cache-hit / output / cost columns, and a per-model cost-trend chart with ‹ › period navigation).
Configuration
All configuration is client-side, stored in browser localStorage under dsh.statusBar.v1, edited via the settings page or the in-composer gear menu.
| Option | Default | Meaning |
|---|---|---|
enabled |
true |
Master switch; false hides the bar entirely |
wrap |
true |
Allow the bar to wrap onto multiple lines within the input card's width instead of eliding (the bar never runs past the input box's edges in either mode) |
segments |
13 on / 4 off (see below) | Ordered list of enabled segments |
cost.currency |
CNY |
Currency for cost display (CNY / USD) |
cost.models |
{} |
User-maintained model price book (model id → prices + schedule) |
Default segment state: on — status, model, counts, durations, speeds, cache hit, tokens, context, TPS, session time, jobs, queue, errors; off — title, workspace, agent, cost.
Model price book entry (values added when a model is configured): input 2, cache read 0.5, cache write 2, output 8 (per 1M tokens, in the configured currency); peak/off-peak disabled by default; when enabled, defaults to DeepSeek's official windows 09:00–12:00, 14:00–18:00, timezone local.
Environment variables: DSH_HOME (host-side) — base directory for the plugin's local data (default ~/.dsh). No other env vars, no secrets, no tokens.
Segment reference (all 17, toggleable & reorderable):
| Segment | Shows | Source |
|---|---|---|
| Status | ● running / idle / error dot | snapshot running / partial / lastAgentError |
| Model | model of the latest response | sessionModel projection (host fold of assistant/message events) |
| Title | session title (truncated) | SessionSummary |
| Workspace | workspace dir name | SessionSummary |
| Agent preset | preset name | SessionSummary |
| Turns & steps | N turns · M steps | sessionStats projection (window-fold fallback) |
| Model & tool time | LLM · tool-call wall time | sessionStats |
| TTFT & decode | avg first token · tok/s | sessionStats |
| Cache hit | prompt cache-hit share (2 decimals, capped at 99.99%) | tokenUsage |
| Tokens | billed input/output totals | tokenUsage |
| Context | context-window occupancy % | contextPressure |
| Throughput TPS | live generation rate (default on) | liveTokenUsage projection — folded from assistant/chunk in real time; block-aware estimation (~4 chars/token + block/role framing, re-priced at block-end, EWMA against burst flushes), exact once the provider reports usage; 0 while the session is not generating |
| Session time | wall clock, ticks while running | turnTimings |
| Cost estimate | ≈¥0.0123 (off by default) | sessionUsage projection — each model's usage × its own effective price (flat or peak/off-peak at now), summed across models |
| Jobs | running background jobs | jobsBySession |
| Queue | queued messages | snapshot queue |
| Errors | failed/retried/over-limit count (>0 only) | node fold |
Permissions & data
| Category | What the plugin touches |
|---|---|
| Files | Host writes the usage ledger to <DSH_HOME>/dsh-status-bar/usage.jsonl (~/.dsh/dsh-status-bar/usage.jsonl by default; one record per assistant message: timestamp, model, input/cacheRead/cacheWrite/output tokens). In-memory history is a rolling 120-day window. |
| Network | No outbound requests, ever. The only endpoint is the plugin's own local webserver route /status-bar/api/usage (same origin as DSH Web, 127.0.0.1), serving the chart buckets. |
| Credentials | None. The plugin never reads, stores, or transmits API keys, tokens, or cookies. |
| User data | Client: localStorage["dsh.statusBar.v1"] (bar config + price book — no conversation content). Host: the usage ledger described above (token counts only, no prompts, no messages, no file contents). |
Troubleshooting
| Symptom | Cause & fix |
|---|---|
| Bar does not appear | Master switch off → enable it in Settings → Plugins → Status Bar, or via the gear menu. localStorage cleared? Config resets to defaults. |
| TPS segment is 0 / blank | No stream has started yet, or the stream is between retries. The measurement window restarts on each llm/retry; the carried rate never goes blank after the first stream. |
| TPS conflicts with another plugin | If @linxin666/dsh-live-stats is loaded, the registry keeps whichever registered first for the shared liveTokenUsage key — one unit, no duplicate rows. |
| Cost estimate missing | None of the session's models is in the price book (or they are all zero-priced) → add them in Settings → Plugins → Status Bar → Model price book. Costs are estimated at the book's rates (per model, flat or peak/off-peak), not provider billing. |
| Usage chart is empty | No assistant messages with provider-reported usage in the period yet, or DSH_HOME points elsewhere than expected (check usage.jsonl location above). |
| UI looks broken after an upgrade | Hard-refresh the browser (stale client bundle) and verify the plugin version in Settings. |
| Can't tell which version is installed | From the profile directory (macOS/Linux): node -p "require(process.env.HOME + '/.dsh/profiles/web/node_modules/@Starlight-bananice/dsh-status-bar/package.json').version". Behind v0.1.5? Re-apply the Upgrade steps — a ref-less github: install keeps the commit resolved at install time. |
Logs: the plugin writes no log files of its own — host-side diagnostics appear in the DSH web process output (profile logs); client-side issues surface in the browser devtools console.
Rollback: the settings page has a one-click Reset (restores all defaults). For the plugin itself, uninstall → re-add the previous version with dsh plugin --profile web add <pkg>@<version>; the built-in stats line is always restored automatically on removal.
Development
pnpm install # devDependencies only (typescript / tsdown / @types); npm peers are provided by the DSH runtime closure and intentionally not declared
npm run build:client # tsdown → lib/client.js (ModuleLoader bundle)
npm run build # junction links + host tsc + client typecheck (needs DSH_CHECKOUT pointing at a dsh source checkout)
Build artifacts under lib/ are committed (since v0.1.5), so plain git installs work without any build step; the commands above exist to refresh the artifacts before a release. npm run build / typecheck:client need DSH_CHECKOUT (or the common-path probe) — client typechecking resolves against the checkout's lib/types through junction links. Host-side sources are plain TypeScript (Cordis plugin), client sources are React + the DSH client UI slots.
Keeping lib/ in sync: run pnpm install --frozen-lockfile (reproducible rebuilds use the exact toolchain pinned in pnpm-lock.yaml), then npm run verify before pushing (scripts/verify.sh rebuilds host + client and fails when the committed lib/ drifted from src/). The repository also ships a pre-push hook that runs it automatically whenever a push touches src/ or the build config — enable it once with:
git config core.hooksPath .githooks
The lib-sync GitHub Actions workflow enforces the same invariant in CI: a fast artifact-integrity check on every push/PR, plus a full rebuild-vs-lib/ drift check on PRs that touch src/ and on manual dispatch.
Contributing: fork the repository, branch off main, and open a PR — small, focused changes with a clear description are preferred. Report bugs via Issues with the DSH version, browser, and a minimal repro.
License & security
- License: MIT (© 2026 Starlight-bananice).
- Security: this plugin holds no credentials and makes no network calls; the attack surface is the DSH host process itself. To report a security issue privately, use GitHub's Security Advisories on this repository (https://github.com/Starlight-bananice/dsh-status-bar/security/advisories/new) — do not open a public issue for vulnerabilities.


No comments yet. Be the first to write one.