From bd20428d6508848a689945653aa74205c255263f Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Sun, 19 Apr 2026 17:41:30 -0400 Subject: [PATCH] refactor: simplify subagent failure context helpers --- src/agents/subagent-announce-output.ts | 22 ++++++---------------- src/agents/tools/sessions-spawn-tool.ts | 20 ++++++++++++-------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/agents/subagent-announce-output.ts b/src/agents/subagent-announce-output.ts index 785dc4ed0ff..9f55f491719 100644 --- a/src/agents/subagent-announce-output.ts +++ b/src/agents/subagent-announce-output.ts @@ -73,17 +73,7 @@ export function withSubagentOutcomeTiming( startedAt?: number; endedAt?: number; }, -): SubagentRunOutcome; -export function withSubagentOutcomeTiming( - outcome: SubagentRunOutcome | undefined, - timing: { - startedAt?: number; - endedAt?: number; - }, -): SubagentRunOutcome | undefined { - if (!outcome) { - return undefined; - } +): SubagentRunOutcome { const startedAt = readFiniteNumber(timing.startedAt) ?? readFiniteNumber(outcome.startedAt); const endedAt = readFiniteNumber(timing.endedAt) ?? readFiniteNumber(outcome.endedAt); const nextTiming: Pick = {}; @@ -343,15 +333,15 @@ export function applySubagentWaitOutcome(params: { next.endedAt = params.wait.endedAt; } const waitError = typeof params.wait?.error === "string" ? params.wait.error : undefined; + let outcome = next.outcome; if (params.wait?.status === "timeout") { - next.outcome = withSubagentOutcomeTiming({ status: "timeout" }, next); + outcome = { status: "timeout" }; } else if (params.wait?.status === "error") { - next.outcome = withSubagentOutcomeTiming({ status: "error", error: waitError }, next); + outcome = { status: "error", error: waitError }; } else if (params.wait?.status === "ok") { - next.outcome = withSubagentOutcomeTiming({ status: "ok" }, next); - } else { - next.outcome = withSubagentOutcomeTiming(next.outcome, next); + outcome = { status: "ok" }; } + next.outcome = outcome ? withSubagentOutcomeTiming(outcome, next) : undefined; return next; } diff --git a/src/agents/tools/sessions-spawn-tool.ts b/src/agents/tools/sessions-spawn-tool.ts index 0389391b2cc..35b13c8710a 100644 --- a/src/agents/tools/sessions-spawn-tool.ts +++ b/src/agents/tools/sessions-spawn-tool.ts @@ -53,6 +53,16 @@ function summarizeError(err: unknown): string { return "error"; } +function addRoleToFailureResult( + result: T, + role: string | undefined, +): T | (T & { role: string }) { + if (!role || (result.status !== "error" && result.status !== "forbidden")) { + return result; + } + return { ...result, role }; +} + function resolveTrackedSpawnMode(params: { requestedMode?: "run" | "session"; threadRequested: boolean; @@ -313,10 +323,7 @@ export function createSessionsSpawnTool( }); } } - const isAcpFailure = result.status === "error" || result.status === "forbidden"; - return jsonResult( - isAcpFailure && requestedAgentId ? { ...result, role: requestedAgentId } : result, - ); + return jsonResult(addRoleToFailureResult(result, requestedAgentId)); } const result = await spawnSubagentDirect( @@ -354,10 +361,7 @@ export function createSessionsSpawnTool( }, ); - const isSubagentFailure = result.status === "error" || result.status === "forbidden"; - return jsonResult( - isSubagentFailure && requestedAgentId ? { ...result, role: requestedAgentId } : result, - ); + return jsonResult(addRoleToFailureResult(result, requestedAgentId)); }, }; }