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.
117 lines
3.7 KiB
Markdown
117 lines
3.7 KiB
Markdown
<!-- Generated by scripts/gen-module-graph.ts — do not edit by hand.
|
|
Run `pnpm run gen-module-graph` to regenerate. -->
|
|
|
|
# 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.
|
|
|
|
```mermaid
|
|
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` |
|