Files
deepseek-harness/packages/support/subagent-mock
Tianyi Cui 25eccdaedc Fix review findings: lifecycle containment, configurable tool name, coverage, type catalog
Address four findings from the first Codex review round:

- Contain subagent/start|end listener throws (emitContainedStart/End): a
  thrown lifecycle listener could escape SubagentService.start() before the
  caller received the live run to dispose it (a leaked child), and a thrown
  subagent/end listener could surface as an unhandled rejection on the detached
  result-settle hook. Both emits now log-and-contain, mirroring the agent
  registry's agent/created|disposed containment.
- Make the model-facing tool name configurable (Config.toolName, default
  subagent). The docs say to load dsh-tool-subagent once per provider to expose
  multiple transports, but the hardcoded name made the second load throw a
  duplicate-tool-name error; a distinct toolName per load is now required and
  documented.
- Reach the per-file 100% coverage gate: tests for the subagent/end error
  branch, lifecycle-listener containment, every stopReasonError arm + the
  merge-extensible default, the multi-provider toolName path, agentOptions
  forwarding, and the direct-apply schema-bypass fallbacks.
- Document the seam vocabulary in docs/core-data-structures/subagent.md with
  verbatim type-equiv blocks + manifest entries, and link it from core.md (a
  brand-new core/seam type the doc-sync gate cannot detect on its own).
2026-06-21 23:15:43 +08:00
..

@deepseek-ai/dsh-subagent-mock

A scripted SubagentProvider for testing the subagent seam without a model or a real child agent — the subagent analog of dsh-llm-replay.

It lets a test drive ctx.subagents and the model-facing dsh-tool-subagent through the real cordis Loader / export path, exercising provider registration, start-time capability validation, the run lifecycle (result / cancel / dispose), and the structured-output branch — all deterministically and keylessly.

Usage

Load it as a plugin (functional shape: name/inject/Config/apply, no default). Config (all optional):

Key Default Meaning
name mock Registry name to register the provider under.
reply mock subagent reply The scripted child's final answer text.
stopReason completed The stop reason result settles with.
capabilities all true Which start-time capabilities (outputSchema/depthLimit/toolFilter) the provider advertises.
structured { reply } Structured value surfaced when a request carries an outputSchema and the capability is on.

A cancel() issued before result settles flips the stop reason to aborted, so the cancellation path is observable.