Ownership-checked tools and HTTP routes to list, release and permanently delete subagent sessions, with automatic web UI refresh after deletion.
Install
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/heiheiha798/dsh-plugin-subagent-delete/releases/download/v0.2.0/dsh-plugin-subagent-delete-0.2.0.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:heiheiha798/dsh-plugin-subagent-delete
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
DeepSeek Harness (DSH) plugin that adds the missing subagent lifecycle interface:
delete_subagent— permanently delete a subagent session and take it out of the web UI listrelease_subagent— stop / release a subagent without deleting its transcriptlist_subagents— list the calling session's descendant subagents (including finished one-shot subagents)
Compatible with DSH 0.1.0-rc.8.
Why
DSH's built-in subagent control surface only provides send_message, interrupt_agent
and list_agents. There is no delete/release endpoint, so finished one-shot and stale
continuable subagents keep accumulating in the web UI list. This plugin fills that gap
with an ownership-checked, model-callable tool plus optional HTTP routes.
Install
dsh plugin --profile web add github:heiheiha798/dsh-plugin-subagent-delete
# or pin to the published release
dsh plugin --profile web add github:heiheiha798/dsh-plugin-subagent-delete#v0.2.0
# or from a local checkout
dsh plugin --profile web add /path/to/dsh-plugin-subagent-delete
Restart the profile, then start a new session. The session gains three tools.
Tools
list_subagents
list_subagents({}) // all descendants
list_subagents({ activity: "running" }) // running only
list_subagents({ mode: "one-shot" }) // one-shot only
Returns the caller's descendant subagent tree: id, label, mode
(one-shot | continuable), activity (running | inactive), depth,
parentId and hasChildren.
delete_subagent
delete_subagent({ subagent_id: "0fcfbdd6-5d21-46a4-bd95-2ca6edac1261" })
delete_subagent({ subagent_id: "<id>", recursive: true })
Permanently removes the subagent:
- verifies the target is a descendant of the calling agent's session
(descendant discovery uses the official
ctx.subagents.listDescendants); - stops the live agent / drains a resident continuable Activation;
- flushes and detaches the live session from
ctx.sessions; - removes the on-disk session log directory (both uuid spellings);
- removes the
session_projcacherow; - removes the id from workspace accounting and the archive set.
Without recursive: true a target that still has descendants is refused with
has-descendants. Deletion is child-first and permanent.
release_subagent
release_subagent({ subagent_id: "<id>" })
release_subagent({ subagent_id: "<id>", recursive: true })
Stops the current turn and releases a resident continuable Activation via
ctx.subagents.drainContinuableChildren, but keeps the durable transcript.
The subagent remains resumable with send_message.
Web UI auto-refresh
DSH has an official refresh path for subagent creation (session/created →
host/session-added) but no symmetric contract for deletion: for a durable
subagent, host/session-removed is treated by the client as a status change
(running: false) only, so the sidebar list and subagent catalog are not
refreshed.
This plugin works around that gap without patching DSH: after every permanent
delete the host publishes a short-lived marker session through the official
prepare → enter → announce → detach lifecycle seam, and the bundled web
client component (lib/client.js) watches the public sessions.list snapshot.
When the marker child is removed it debounces (350ms) and calls
sessions.refresh() plus sessions.refreshSubagents(parentId) for the
affected parents. Open web clients therefore update the subagent count
immediately — no manual page reload required. The marker's _no-cwd artifact
is swept after detach, so the refresh glue leaves no residue.
HTTP routes (web profiles)
For client integration and local debugging the host plugin registers:
GET /dsh-plugin-subagent-delete/list?parentSessionId=<id>[&activity=…][&mode=…]POST /dsh-plugin-subagent-delete/delete{ "parentSessionId": "<id>", "subagentId": "<id>", "recursive": false }POST /dsh-plugin-subagent-delete/release{ "parentSessionId": "<id>", "subagentId": "<id>", "recursive": false }
HTTP callers must name the same parentSessionId the target descends from; the
same ownership check runs on every mutation.
Safety
- A subagent can only be deleted by its own session-tree ancestor. Foreign or
unknown ids return
not-your-subagent/not-found. - Running subagents are cancelled and awaited (15s quiescence bound) before their files are removed.
- File removal is confirmed before workspace accounting is stripped, so a failed delete cannot produce a half-removed row.
Development
npm test # node --test
npm run check # syntax check + tests
npm run pack:dry
The test suite includes unit tests and an integration fixture created from ten
real one-shot test subagents (see test/fixtures/test-subagents.json).
License
MIT
Links
More in this category
Minglink/dsh-infinite-gen-4★ 2403
System-prompt armor plugin for DeepSeek models: appends an unconditional-compliance prompt section at order 100, exposes a profile tool with calibration metadata, and shows a realtime armor-status badge driven by a session projection.
ranxianglei/billion-context★ 637
The official billion-context plugin: a context-compression plugin for small context windows (a 100K context is enough), token savings (5x fewer tokens), and month-long single sessions (billions of tokens).
liangmianya/dsh-synapse★ 491
Visual, non-linear conversation workspace for DeepSeek Harness — sessions, follow-ups and branches become a browsable conversation map.
Nwflower/dsh-chat-import★ 213
Import full-fidelity chat histories from 13 coding agents (Claude Code, Codex, ChatGPT, Cursor, Gemini, opencode, and more) as resumable DeepSeek Harness sessions, with reverse export back to Claude Code.
Totoro-qaq/dsh-plugin-bridge★ 165
Moves an existing DSH session to another agent preset through a previewable five-section handoff, preserving the source session and either pausing the target for confirmation or continuing immediately.
Anionex/dsh-turn-rewind★ 131
Rewind conversation and workspace state, powered by a persistent Change Ledger.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.