From e5903dfc3bf28f37a8070fc835a3578d10f619c3 Mon Sep 17 00:00:00 2001 From: buuzzy Date: Fri, 17 Apr 2026 09:20:32 +0800 Subject: [PATCH] fix: detect and propagate tool result errors Tool results always had isError: false, even when the output clearly indicated an error. Added looksLikeError() heuristic and respect for the SDK's is_error flag. --- src-api/src/extensions/agent/codeany/index.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src-api/src/extensions/agent/codeany/index.ts b/src-api/src/extensions/agent/codeany/index.ts index 99b0231..2629030 100644 --- a/src-api/src/extensions/agent/codeany/index.ts +++ b/src-api/src/extensions/agent/codeany/index.ts @@ -193,6 +193,17 @@ export class CodeAnyAgent extends BaseAgent { }); } + private looksLikeError(output: string): boolean { + if (!output || output.length < 10) return false; + const lower = output.toLowerCase(); + const errorPatterns = [ + 'error:', 'exception:', 'traceback', 'econnrefused', + 'etimedout', 'enotfound', 'status_code', 'failed to', + 'permission denied', '401', '403', '500', '502', '503', + ]; + return errorPatterns.some(p => lower.includes(p)) && output.length < 500; + } + private isUsingCustomApi(): boolean { return !!(this.config.baseUrl && this.config.apiKey); } @@ -345,11 +356,13 @@ export class CodeAnyAgent extends BaseAgent { } if (msg.type === 'tool_result' && msg.result) { + const output = msg.result.output ?? ''; + const isError = !!(msg.result as any).is_error || this.looksLikeError(output); yield { type: 'tool_result', toolUseId: msg.result.tool_use_id ?? '', - output: msg.result.output ?? '', - isError: false, + output, + isError, }; }