The second PR of the subagent seam: the two in-process backends that run a
child agent on the same cordis context, reusing the agent factory's quiescent
AgentHandle teardown. Both register on ctx.subagents (PR1's named-provider
registry) and share one run driver.
- dsh-subagent-spawn: a FRESH child via ctx.agents.create — own session, the
parent's model by default (overridable), zero inherited conversation. Also
exports the shared in-process run driver (startInProcessRun): mint ids, stamp
cwd/parentSession-lineage/depth, drive the one-shot (send → whenIdle), read
the last assistant/message + turn/end reason, dispose to quiescence.
- dsh-subagent-fork: a child SEEDED with the parent's balanced completed-turn
prefix (the log up to and including its last turn/end), so the child inherits
context. The in-flight unbalanced turn is excluded — a raw seed would fail the
invariants replay. Proven: a regression test goes red if the boundary seeds
the open turn.
- Seam extension: CreateAgentOptions.seed, threaded through AgentLoop.createAgent
→ ctx.sessions.prepare({ seed }) (the primitive resume already used). This is
the fork-lineage path the TODO(sub-agents) markers anticipated.
- Depth: a merge-extensible AgentOptions.subagentDepth (0 top-level, parent+1 for
a child); the depthLimit capability refuses a spawn past request.maxDepth.
Tests: real-loop unit tests for both backends (mock MODEL only, real loop +
invariants), a multi-subagent test (one parent drives a fork AND a spawn child
then keeps working), and a with-key e2e (a real parent delegates via the
`subagent` tool to a real child that writes a file on disk — world-verified).
100% per-file coverage. The coding-agent demo wires the spawn backend + tool.
Snapshot coverage of nested agents is deferred to a stacked follow-up
(TODO(subagent-snapshots)): dsh-llm-replay is a single global positional cursor
that cannot route calls to a parent vs. a child on one context. Recorded in the
RFC's deferrals and a new AGENTS.md rule: designing a subsystem must design its
test infrastructure END TO END up front, verifying the snapshot/e2e harness can
express the new shape — a gap this plan hit.
3.7 KiB
3.7 KiB
Module dependency graph
Inter-package dependencies among the @deepseek-ai/dsh-* harness packages, derived from each package's peerDependencies (the canonical runtime-dependency signal). An edge a --> b means package a depends on package b. Names have the @deepseek-ai/dsh- prefix stripped.
graph TD
bash --> brand
llm --> brand
bash-local --> bash
llm-deepseek --> llm
llm-pi-ai --> llm
session --> brand
session --> llm
system-prompt --> llm
agent --> brand
agent --> llm
agent --> session
llm-replay --> llm
llm-replay --> session
session-persistence --> session
invariants --> agent
invariants --> llm
invariants --> session
session-persistence-jsonl --> session
session-persistence-jsonl --> session-persistence
session-persistence-sqlite --> session
session-persistence-sqlite --> session-persistence
tools --> agent
tools --> llm
tools --> system-prompt
ui-stdio --> agent
ui-stdio --> llm
ui-stdio --> session
acp --> agent
acp --> llm
acp --> session
acp --> session-persistence
acp --> tools
agent-loop --> agent
agent-loop --> llm
agent-loop --> session
agent-loop --> session-persistence
agent-loop --> system-prompt
agent-loop --> tools
subagent --> agent
subagent --> llm
subagent --> tools
tool-bash --> agent
tool-bash --> bash
tool-bash --> llm
tool-bash --> tools
agent-core --> agent
agent-core --> agent-loop
agent-core --> invariants
agent-core --> llm
agent-core --> session
agent-core --> system-prompt
agent-core --> tool-bash
agent-core --> tools
subagent-mock --> agent
subagent-mock --> llm
subagent-mock --> subagent
subagent-spawn --> agent
subagent-spawn --> llm
subagent-spawn --> session
subagent-spawn --> subagent
tool-subagent --> agent
tool-subagent --> llm
tool-subagent --> subagent
tool-subagent --> tools
acp-agent --> acp
acp-agent --> agent-core
acp-agent --> session-persistence-jsonl
stdio-agent --> agent
stdio-agent --> agent-core
stdio-agent --> session
stdio-agent --> session-persistence-jsonl
stdio-agent --> ui-stdio
subagent-fork --> agent
subagent-fork --> session
subagent-fork --> subagent
subagent-fork --> subagent-spawn
| Package | Depends on |
|---|---|
brand |
— |
bash |
brand |
llm |
brand |
bash-local |
bash |
llm-deepseek |
llm |
llm-pi-ai |
llm |
session |
brand, llm |
system-prompt |
llm |
agent |
brand, llm, session |
llm-replay |
llm, session |
session-persistence |
session |
invariants |
agent, llm, session |
session-persistence-jsonl |
session, session-persistence |
session-persistence-sqlite |
session, session-persistence |
tools |
agent, llm, system-prompt |
ui-stdio |
agent, llm, session |
acp |
agent, llm, session, session-persistence, tools |
agent-loop |
agent, llm, session, session-persistence, system-prompt, tools |
subagent |
agent, llm, tools |
tool-bash |
agent, bash, llm, tools |
agent-core |
agent, agent-loop, invariants, llm, session, system-prompt, tool-bash, tools |
subagent-mock |
agent, llm, subagent |
subagent-spawn |
agent, llm, session, subagent |
tool-subagent |
agent, llm, subagent, tools |
acp-agent |
acp, agent-core, session-persistence-jsonl |
stdio-agent |
agent, agent-core, session, session-persistence-jsonl, ui-stdio |
subagent-fork |
agent, session, subagent, subagent-spawn |