refactor: simplify subagent failure context helpers

This commit is contained in:
Gustavo Madeira Santana
2026-04-19 17:41:30 -04:00
parent 98e00b1613
commit bd20428d65
2 changed files with 18 additions and 24 deletions

View File

@@ -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<SubagentRunOutcome, "startedAt" | "endedAt" | "elapsedMs"> = {};
@@ -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;
}

View File

@@ -53,6 +53,16 @@ function summarizeError(err: unknown): string {
return "error";
}
function addRoleToFailureResult<T extends { status: string }>(
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));
},
};
}