Files
deepseek-harness/packages/support/subagent-mock
Tianyi Cui dafb81be7b subagent: implement structured output for in-process backends
The seam vocabulary (SubagentStartRequest.outputSchema, SubagentResult
.structured) existed but no in-process backend honored it — spawn/fork
advertised outputSchema: false. This lands the missing half:

- dsh-tools gains a structured-output JSON Schema subset (json-schema.ts):
  StructuredOutputSchema, assertSupportedOutputSchema (rejects loud outside
  the enforced subset, every violation listed), validateStructuredValue
  (path-qualified issues, total). outputSchema's seam type becomes this raw
  JSON-Schema subset instead of the author-facing SchemaSpec DSL — the schema
  travels verbatim to the model as a forced tool's parameters.
- dsh-subagent-inprocess gains the shared structured runtime: one global
  structured_output capture tool (placeholder parameters) + a prepend:true
  agent/request listener doing FINAL-REQUEST enforcement (strip for plain
  agents, per-run schema for structured children — survives downstream
  request-replacing listeners) + an agent/turn-continuation veto that stops
  a child's turn once captured (no wasted extra model step). Lifetime is
  refcounted by backends (plugin lifetime) AND live runs (start→settle).
- startInProcessRun drives the capture: subset asserted before the child
  exists, instruction appended to the child's system prompt, clean-finish
  nudge loop (structuredNudgeRetries, backend Config, default 1), captured
  value on result.structured; a clean finish without a capture settles
  'error' (never a silent success with a missing field).
- spawn + fork flip outputSchema: true and inject 'tools'.
2026-07-05 11:35:39 +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.