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 insert list — a bare - name: <package> row is skipped by applyEntryPatches.

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