Skip to content
dsh-market Browse plugins GitHub 中文

Mombrane/dsh-subagent-monitor

Live subagent run monitor for the Web UI: a sidebar footer trigger plus a fixed top-right card panel showing each subagent of the current session in real time (running/elapsed, terminal outcomes, tree indent), with one-click jump into the child conversation and a return button, refresh-surviving and mobile-hidden by default.

Stars ★ 16 Category UI Enhancements Listed 2026-08-15 npm @leetoners/dsh-ui-subagent-monitor

Install

Inside DeepSeek Harness, with dsh-market

dsh plugin --profile web add dshmarket

Or from the command line

dsh plugin --profile web add @leetoners/dsh-ui-subagent-monitor

Installing runs third-party code with your own permissions — it can read your files, use your credentials and reach the network. Review the source first, and pin a commit (github:owner/repo#sha) when you can.

README

中文 | English


✨ What is it

Adds a Subagents entry at the bottom of the DSH Web sidebar and a card-style panel pinned to the top-right corner of the screen, showing the live run status of every subagent spawned from the current session.

┌─ ⤢ Running subagents ────────────── [Collapse ▴] [✕] ┐
│ ┌───────────────────────────────────────────────┐ │
│ │ 🔵 Count TS files in ui dir        [Open chat] │ │
│ │    one-shot · 1a2b3c4d    running · 00:42     │ │
│ └───────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 🟢 Demo subagent: count file types [Open chat] │ │
│ │    spawn · 2b3c4d5e       done · 03:12        │ │
│ └───────────────────────────────────────────────┘ │
│  running 1 · done 1 · failed 0     [Clear done]  │
│ ═══════════════════════════════════════════════ │ ← drag to resize
└───────────────────────────────────────────────────┘

The four-arrow grip left of the title moves the panel, the bottom grip resizes it; both are remembered, double-click resets.

Subagent monitor panel (running + done statuses)

🎯 Features

Feature Description
🟢 Live status running (🔵 blue pixel-chase animation, same as the DSH sidebar state dot + stopwatch), done (green dot + halo), failed, interrupted, token limit, rejected
🃏 Card list one rounded card per subagent; Open chat on the right, status and elapsed time on the second line
🌲 Tree indent grandchild subagents are indented to the right
🔙 One-click back inside a subagent session, the panel shows a ← Main session button
🖐 Movable drag the four-arrow grip left of the title to move the panel; position is remembered (shared across sessions), double-click resets
📏 Resizable drag the bottom grip to resize the panel height; height is remembered per session, double-click resets
🔄 Refresh-proof persistent composition row: the panel auto-recovers after page refresh / service restart
📱 Mobile-friendly hidden by default at ≤768px viewport; the sidebar entry still opens it manually

📦 Installation

Option A · npm (recommended, one line)

dsh plugin --profile <your-profile> add @leetoners/dsh-ui-subagent-monitor

✅ Published as v0.2.0 (built and signed by GitHub Actions; SLSA provenance verifiable).

Option B · Install from GitHub

dsh plugin --profile <your-profile> add github:Mombrane/dsh-subagent-monitor
# On first install, if prompted to allow build scripts, confirm in the profile's pnpm-workspace.yaml

Restart dsh web to take effect. This repository is both a DSH client plugin (dsh.client) and a composition bundle (dsh.bundle + cordis.patch.yml), shipped with a prebuilt lib/.

Option C · Inline into the DSH source tree (for secondary development)

# 1. Copy this repo's src/ to <dsh>/packages/client/ui-subagent-monitor/
# 2. Add the dependency to <dsh>/packages/bundle/web-app/package.json
"@leetoners/dsh-ui-subagent-monitor": "workspace:*"
# 3. <dsh>/packages/bundle/web-app/cordis.patch.yml (after the ui-subagent row)
- id: ui-subagent-monitor
  name: '@leetoners/dsh-ui-subagent-monitor'
# 4. Build + restart
pnpm install && pnpm --filter @leetoners/dsh-ui-subagent-monitor bundle
# restart dsh web

Also add this package path to references in /tsconfig.client.json, and point this package's tsdown.config.ts at the monorepo preset (import { clientBundle } from '../tsdown.client.ts').

🏷️ Status legend

Status Meaning
🔵 Running in progress, blue pixel-chase animation (same as the DSH sidebar tab ongoing state) + live stopwatch
🟢 Done the panel witnessed a successful finish; shows elapsed time (green dot + halo)
⚪ Ended backfilled history row: created before a service restart, outcome not observed (success/failure unknown)
🔴 Failed ended in error (red dot + halo)
🟠 Interrupted / token limit / rejected aborted / hit the token cap / request rejected (amber dot + halo)

❓ FAQ

Does the panel disappear on page refresh? No. It is a persistent composition row; the panel auto-recovers on every page load.

What is the difference between “Done” and “Ended”? 🟢 is an outcome the panel observed live; ⚪ is history from before a service restart, outcome not observed.

How much history does the panel keep? At most 200 rows per root session; the oldest ended rows are evicted beyond that.

Are the panel position and height remembered? Yes, with two different policies: the position is shared across sessions (one spot for all of them), while the height is remembered per session (localStorage key carries the session id, so switching sessions never leaks the size); they survive page reload / browser restart. Double-click a grip to reset.

Is it safe? The polling route /api/subagent-monitor/snapshot binds to the loopback address with no auth; recommended for local / intranet use only.

🌐 Ecosystem

Channel Status
GitHub topics dsh-plugin, deepseek-harness (auto-synced by Oh-My-DSH every 4 hours)
Oh-My-DSH catalog PR #8 pending maintainer merge
awesome-dsh-plugin ✅ Listed (commit c7ad36e9, PR #675 merged)

📋 Changelog

See CHANGELOG.md for the full history. Current version 0.2.0 (aligned with package.json).

📖 Architecture

Design decisions (why persistent, why a custom polling route, event attribution model) and data-flow details: ARCHITECTURE.md.

📄 License

MIT © Mombrane

Content from the project README on GitHub ↗