From ee96c3e0efee92815eaf07b08eacab2a6fc23209 Mon Sep 17 00:00:00 2001 From: guang384 Date: Thu, 12 Mar 2026 18:57:40 +0800 Subject: [PATCH] fix(agents): improve subagent output extraction for edge cases Fixes #43755 When subagent results are not delivered to parent session, the issue may be that the message format doesn't match the extraction logic. This fix adds more fallback handling: - Try user role as fallback (results might be in user messages) - Check for raw 'result' field at message root - Check for 'output' field at message root - Handle more edge cases in extractSubagentOutputText() --- src/agents/subagent-announce.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/agents/subagent-announce.ts b/src/agents/subagent-announce.ts index 62b2cc6f0d3..c5d77ea850b 100644 --- a/src/agents/subagent-announce.ts +++ b/src/agents/subagent-announce.ts @@ -248,6 +248,8 @@ function extractSubagentOutputText(message: unknown): string { } const role = (message as { role?: unknown }).role; const content = (message as { content?: unknown }).content; + + // Try assistant role first if (role === "assistant") { const assistantText = extractAssistantText(message); if (assistantText) { @@ -261,10 +263,14 @@ function extractSubagentOutputText(message: unknown): string { } return ""; } + + // Try toolResult or tool role if (role === "toolResult" || role === "tool") { return extractToolResultText((message as ToolResultMessage).content); } - if (role == null) { + + // Try user role as fallback - subagent results might be in user messages + if (role === "user") { if (typeof content === "string") { return sanitizeTextContent(content); } @@ -272,6 +278,30 @@ function extractSubagentOutputText(message: unknown): string { return extractInlineTextContent(content); } } + + // Handle null/undefined role - check all possible content fields + if (role == null) { + // Try all possible content fields + if (typeof content === "string") { + return sanitizeTextContent(content); + } + if (Array.isArray(content)) { + return extractInlineTextContent(content); + } + + // Check for raw result field at message root + const rawResult = (message as { result?: unknown }).result; + if (typeof rawResult === "string") { + return sanitizeTextContent(rawResult); + } + + // Check for output field at message root + const output = (message as { output?: unknown }).output; + if (typeof output === "string") { + return sanitizeTextContent(output); + } + } + return ""; }