Review direction (tianyicui, PR #660): in a stacked PR, change all other process-running places to use the new service. - lsp-local: LspConnection spawns through ctx.subprocess (piped protocol streams + a no-spill collected stderr tail); its private process-tree helpers (POSIX group signalling, Windows taskkill, liveness polling) are deleted in favor of the seam's handle verbs, and its buildChildEnv now rides scrubbedParentEnv (LSP children also stop inheriting stale DSH_*). The plugin injects 'subprocess'; compositions/tests mount dsh-subprocess-local. - subagent-acp: the ACP child spawns through the seam (piped ndjson streams, inherited stderr); spawn failure surfaces through done-rejection into the same startup race; disposal is handle.dispose with the plugin's configured graces. dsh-subagent-subprocess is DELETED — its dispose ladder and scrub are the seam's, and the isolated-config-dir helper had no consumer. - mcp-client, pty-local, sdk-helper: adopt scrubbedParentEnv as the one scrub definition (their spawns stay put by ownership: the MCP SDK and node-pty own those calls; the SDK wizard runs outside any composition). - Coverage: per-file 100% over every touched src file, with each v8 ignore carrying a platform or contract reason; new suites cover stdio dispositions, the dispose ladder tiers, injected-win32 tree semantics, waitForExit, settled-kill/terminate no-ops, and spawn-failure disposal. - Docs: consumer-migration Agent Note (en; zh follows in this PR), seam note updated in place, subprocess.md rewritten for the reshaped vocabulary (type-equiv re-registered), READMEs and SERVICE_ROLES updated, taskkill added to knip ignoreBinaries.
subagent/ — subagent capability family
The subagent seam: an agent delegating work to a child agent. Like the bash and llm families this is a capability seam (see capability seams) — but with one defining difference: multiple provider implementations coexist in one context, registered by name, rather than the single-implementation bash shape. The registry mirrors the LLM adapter registry.
| Package | Role | ctx key |
|---|---|---|
subagent/ |
Abstract subagent seam: named-provider registry + vocabulary | ctx.subagents |
subagent-inprocess/ |
Shared in-process run driver (no provider; one cleanup effect per run) | — |
subagent-spawn/ |
In-process backend: a fresh child agent | (registers on ctx.subagents) |
subagent-fork/ |
In-process backend: a child seeded with the parent's completed-turn prefix | (registers on ctx.subagents) |
subagent-acp/ |
Out-of-process backend: a child agent in a spawned subprocess, driven over ACP | (registers on ctx.subagents) |
tool-subagent/ |
Model-facing subagent delegation tool over ctx.subagents |
(registers on ctx.tools) |
The interface lives at subagent/subagent/. The in-process subagent-spawn / subagent-fork backends share the subagent-inprocess driver (a library with no provider of its own — both depend on it, neither on the other), and the out-of-process subagent-acp backend spawns its child through the subprocess/ seam (the shared credential scrub, tree-scoped teardown, and dispose ladder). Tests replace only the child boundary with package-local fixtures.
The proposal and design rationale: .agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md.