dsh-mission-control
已验证@dennisrongo/dsh-mission-control · v0.5.2 · MIT · Web 界面
Mission Control dashboard for DeepSeek Harness (dsh) — live session fleet, swarm tree, token burn, and permission inbox as a shell.overlay plugin
安装
dsh plugin add @dennisrongo/dsh-mission-control 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
标签
作者
说明文档
dsh-mission-control
npm: @dennisrongo/dsh-mission-control ·
source: dennisrongo/dsh-plugins
Mission Control — a fleet dashboard plugin for DeepSeek Harness (dsh).
One glass panel over your entire agent fleet: live sessions, subagent swarm tree,
token burn, and a permission inbox — registered into dsh's additive
shell.overlay slot, so it floats over the stock web UI without touching it.
What it shows
Docked as a right rail that the shell's layout reflows around:
- Fleet — every session (root + subagents) with running / waiting / done states, grouped by workspace
- Swarm tree — coordinator → worker lineages, nested
- Stats strip — session count, running, subagents, waiting-on-you
- Token burn — estimated spend broken down by model
- Permission inbox — sessions blocked on
approval/question/plan-review
Built on public faces only: ctx.sessions.list and ctx.workspaces.list
(ObservableSnapshot → React), sessionStats projections (turns / steps / llmMs
/ decodeTokens), and PendingInteraction off the session summaries. No tools,
no presets. One minimal host service persists the panel's timer state to a JSON
cell under the harness home — browser storage is origin-scoped and DSH Desktop
serves the UI from an ephemeral port per launch, so without it a restart reset
the pomodoro. Without the host half the panel degrades to localStorage.
Stage
Stage is a full-screen takeover, not a fourth panel mode — it layers over whichever tab you were on and returns you to it on exit, via Esc or ×.
It renders a live grid of tiles: one per session that is running, waiting
on you, or was touched inside the activity window (a 30m / 2h toggle),
most active first so the busiest tiles sit far left. A tile carries the
session's live conversation and lets you answer a pending permission in
place — the operator is already looking at the tile, so sending them back to
the inbox to approve it would be the wrong move. Clicking through jumps to the
session.
Stage covers the whole viewport, so unlike the docked panel it also spans DSH
Desktop's 36px window-drag strip. That region resolves before hit-testing and
outranks the overlay's z-index, so the bar clears the band with top padding and
every control opts out with data-dsh-no-drag — otherwise the exit button
lands under the caption controls and simply doesn't click.
Control metrics are CSS custom properties (--mc-ctl-h, --mc-ctl-font,
--mc-msg-size). The 400px rail wants compact controls; Stage is a full-screen
surface and overrides the same tokens with comfortable ones, so the two scales
derive from one place instead of drifting apart.
Settings
A drawer in the panel header, persisted to localStorage under
dsh-mission-control:settings (origin-local; only the pomodoro is mirrored
to the host cell). Parsing is defensive — any bad shape falls back to
defaults, and a storage failure (private mode, quota) degrades to an
in-memory value rather than throwing into the shell.
| Setting | Does |
|---|---|
| Sessions per workspace | How many sessions each Fleet group lists; the rest stay one click away. 0 = all. |
| Fleet sort | Orders sessions inside a group. Sessions needing attention always stay on top regardless. |
| Show break timer | Toggles the pomodoro footer. |
| Work / break / long break | Pomodoro phase lengths, in minutes. |
The pomodoro timer runs in the footer and fires a desktop notification on
each phase change. Its state survives restarts: it is mirrored to the host's
state cell (<DSH_HOME>/storages/dsh-mission-control.json) with a timestamped
envelope, and the newer copy wins on load — so a running timer picked up after a
Desktop restart simply re-derives its remainder from the wall clock. The drawer is a two-column grid — one column for every label,
one for every control — so labels and controls line up across all rows; per-row
space-between cannot do that, because it aligns each control to its own label.
Install (dev)
pnpm install
pnpm run build # emits lib/index.js + lib/client.js + lib/typert.host.js
pnpm test # offline smoke test
The package declares dsh.bundle, so one command installs and mounts both
halves — do not also add an insert: row to the profile's
cordis.patch.yml; a second row with the same id is fatal
(duplicate loader entry id: dsh-mission-control):
dsh plugin --profile web add @dennisrongo/dsh-mission-control
# or, from a clone:
dsh plugin --profile web add "file:C:/absolute/path/to/dsh-plugins/plugins/dsh-mission-control"
Restart the profile. The overlay rides in the shell.overlay seat; the host
cell is at <DSH_HOME>/storages/dsh-mission-control.json.
Status
Verified against dsh 0.1.1-rc.2 seams: window.__ModuleLoader__.load
closure-factory convention, ctx.slots.register additive list entry,
useSyncExternalStore binding over ctx.sessions.list, and the
./typert host-face export that publishes dshMissionControl/load and
save.
dsh is a fast-moving 0.1.x dev preview — re-verify seams on upgrade.
About the author
Plugins and walkthroughs on YouTube @codingmenace — I build AI coding tools in public, including DeepSeek Harness itself. More at dennisrongo.com.