From 972311d42eee8853a9c07fb4f8947372771f4606 Mon Sep 17 00:00:00 2001 From: ethan Date: Tue, 9 Dec 2025 12:51:42 +1100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20fix:=20infer=20tool=20failure=20?= =?UTF-8?q?from=20error=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When determining tool call status, check for both explicit failure (success: false) and implicit failure (error field present). This ensures failed tool calls show 'failed' status even when the backend doesn't explicitly set success: false. --- .../utils/messages/StreamingMessageAggregator.ts | 12 ++++++++---- src/node/services/streamManager.ts | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/browser/utils/messages/StreamingMessageAggregator.ts b/src/browser/utils/messages/StreamingMessageAggregator.ts index 4e0c8f9ec1..68768fb55f 100644 --- a/src/browser/utils/messages/StreamingMessageAggregator.ts +++ b/src/browser/utils/messages/StreamingMessageAggregator.ts @@ -54,12 +54,16 @@ function hasSuccessResult(result: unknown): boolean { } /** - * Check if a tool result indicates failure (for tools that return { success: boolean }) + * Check if a tool result indicates failure. + * Handles both explicit failure ({ success: false }) and implicit failure ({ error: "..." }) */ function hasFailureResult(result: unknown): boolean { - return ( - typeof result === "object" && result !== null && "success" in result && result.success === false - ); + if (typeof result !== "object" || result === null) return false; + // Explicit failure + if ("success" in result && result.success === false) return true; + // Implicit failure - error field present + if ("error" in result && result.error) return true; + return false; } export class StreamingMessageAggregator { diff --git a/src/node/services/streamManager.ts b/src/node/services/streamManager.ts index fb22c84b1c..815d8d0210 100644 --- a/src/node/services/streamManager.ts +++ b/src/node/services/streamManager.ts @@ -938,6 +938,7 @@ export class StreamManager extends EventEmitter { // Format error output const errorOutput = { + success: false, error: typeof toolErrorPart.error === "string" ? toolErrorPart.error