Fix subagent in-process result scoping (Codex review round 1)

Two merge-blocking bugs in the shared in-process run driver, both rooted in
`readResult` scanning the whole child session and deriving the stop reason only
from `turn/end`:

- A pre-turn `cancel()` cleared the queued prompt before any `turn/end` was
  logged, so the run settled `error` instead of `aborted`, violating the
  `SubagentRun.cancel()` contract. The driver now tracks that a cancel was
  requested and maps the no-turn case to `aborted`.
- A fork child whose own turn produced no `assistant/message` returned the
  SEEDED parent's last message as a `completed` success. `readResult` now scopes
  to the child's OWN events (after the seed prefix), so a message-less child
  yields empty output.

Both fixes carry a regression test proven to go red on the pre-fix driver.

Also: correct the `SubagentRun.id` / event-payload docs (it is the child AGENT
id, not a session id — the backend mints distinct tokens); refresh the stale
`coding-agent` welcome string (subagent is now a tool); and replace the stale
`TODO(sub-agents)` "deferred" prose in the Agent interface, core.md, and
architecture.md with an accurate pointer to the realized seam.
This commit is contained in:
Tianyi Cui
2026-06-22 06:47:20 +08:00
parent 7aabd2a3df
commit b82c310db3
11 changed files with 104 additions and 43 deletions

View File

@@ -70,7 +70,7 @@ declare module 'cordis' {
export interface SubagentRunInfo {
/** The provider that started the run. */
provider: string
/** The child agent/session id. */
/** The child agent's id. */
id: AgentId
}
@@ -78,7 +78,7 @@ export interface SubagentRunInfo {
export interface SubagentRunEndInfo {
/** The provider that ran it. */
provider: string
/** The child agent/session id. */
/** The child agent's id. */
id: AgentId
/** The terminal stop reason. */
stopReason: SubagentResult['stopReason']

View File

@@ -122,7 +122,7 @@ export interface SubagentResult {
* presence of the method IS the capability — narrow before calling.
*/
export interface SubagentRun {
/** The child agent's id (also its session id token, for correlation). */
/** The child agent's id (use `ctx.agents.get(id)` to reach the live child). */
readonly id: AgentId
/**
* Resolves with the child's terminal {@link SubagentResult} when the run