dsh-agent-pill
DSH web plugin: ZCode-style agent activity capsule + right summary drawer (goal / subagents / agent status / background jobs) with control verbs, Ctrl+Alt+P toggle, draggable, auto light/dark theme
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 18, 2026
- Updated
- Aug 18, 2026
Introduction
dsh-agent-pill
DSH (DeepSeek Harness) web plugin: a ZCode-style agent activity pill (top-right status capsule) plus a right-side summary drawer, toggled with Ctrl+Alt+P. Dark compact styling.
- host half: aggregates the current conversation's Goal / Subagents / Agent status / background jobs and exposes a fenced JSON API (
/pill/api) with full control verbs. - client half: top-right floating status capsule + right drawer (goal card, subagent list, agent status, job list with output/kill).
Install
dsh plugin --profile web add dsh-agent-pill
# restart the profile (the web composition disables host-side HMR)
Features
| Section | Data source | Control verbs |
|---|---|---|
| Goal | goal/change session-event projection replay + live append feed (last-wins fold) | goal.pause / goal.resume / goal.complete / goal.clear (CAS {id, revision}, requires a live agent) |
| Subagents | ctx.subagents.listDescendants (durable tree, live-preferred) | subagent.interrupt (human-parent authority; cancels a continuable child's current turn) |
| Agent | ctx.agents.get(id)?.status + agent/status events (idle / running) | read-only |
| Jobs | ctx.jobs.list(caller) + onJobsChanged invalidation | jobs.kill (registry stock API); jobs.output (event replay, never consumes the model's cursor) |
API routes
All routes pass the browser-trust fence (loopback Host or trustedHosts; cross-site requests refused) and answer {ok, value} / {ok:false, error:{code,message}}.
POST /pill/api/state—{sessionId}→ aggregated snapshot (goal / agent / subagents / jobs / services)POST /pill/api/goal.pause|resume|complete|clear—{sessionId, id, revision}POST /pill/api/subagent.interrupt—{sessionId, childId}POST /pill/api/jobs.output—{sessionId, id}POST /pill/api/jobs.kill—{sessionId, id, reason?}
Build from source
pnpm install
pnpm build # tsc host → tsc client → tsdown (lib/index.js + lib/client.js)
- host half: plain ESM (
lib/index.js); runtime@deepseek-ai/*peers resolve from the deployment's module fallback. - client half:
window.__ModuleLoader__.load({id:'dsh-agent-pill', factory})protocol artifact (lib/client.js); platform modules external, everything else inlined.
Mount manually (without npm)
Create a junction from your profile's plugins/ directory to this package, then append to the profile's cordis.patch.yml:
- insert:
- id: agent-pill
name: 'dsh-agent-pill' # or a relative path like './plugins/dsh-agent-pill'
A patch entry must be an id-targeted override or an
insertlist — a bare- name: <package>row is skipped byapplyEntryPatches.
Restart the DSH profile after any
cordis.patch.yml/ bundles change (the web composition disables host-side HMR); client bundle changes only need a hard browser refresh.
License
MIT