From fa9aee2bf0b766f34821071aca2decebf0812fb2 Mon Sep 17 00:00:00 2001 From: owenofbrien <86964623+owenofbrien@users.noreply.github.com> Date: Mon, 23 Feb 2026 11:35:13 -0600 Subject: [PATCH] Fix for silent failures in non-interactive mode (#19905) --- packages/a2a-server/src/agent/task.ts | 10 ++++++---- packages/cli/index.ts | 17 ++++++++++++++++- packages/core/src/core/turn.test.ts | 5 ++++- packages/core/src/core/turn.ts | 2 +- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/packages/a2a-server/src/agent/task.ts b/packages/a2a-server/src/agent/task.ts index b74381714d..bc8cd121a9 100644 --- a/packages/a2a-server/src/agent/task.ts +++ b/packages/a2a-server/src/agent/task.ts @@ -13,6 +13,7 @@ import { getAllMCPServerStatuses, MCPServerStatus, isNodeError, + getErrorMessage, parseAndFormatApiError, safeLiteralReplace, DEFAULT_GUI_EDITOR, @@ -727,16 +728,17 @@ export class Task { // Block scope for lexical declaration // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const errorEvent = event as ServerGeminiErrorEvent; // Type assertion - const errorMessage = - errorEvent.value?.error.message ?? 'Unknown error from LLM stream'; + const errorMessage = errorEvent.value?.error + ? getErrorMessage(errorEvent.value.error) + : 'Unknown error from LLM stream'; logger.error( '[Task] Received error event from LLM stream:', errorMessage, ); let errMessage = `Unknown error from LLM stream: ${JSON.stringify(event)}`; - if (errorEvent.value) { - errMessage = parseAndFormatApiError(errorEvent.value); + if (errorEvent.value?.error) { + errMessage = parseAndFormatApiError(errorEvent.value.error); } this.cancelPendingTools(`LLM stream error: ${errorMessage}`); this.setTaskStateAndPublishUpdate( diff --git a/packages/cli/index.ts b/packages/cli/index.ts index 29a83b2337..d94a2dd191 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -36,7 +36,21 @@ process.on('uncaughtException', (error) => { }); main().catch(async (error) => { - await runExitCleanup(); + // Set a timeout to force exit if cleanup hangs + const cleanupTimeout = setTimeout(() => { + writeToStderr('Cleanup timed out, forcing exit...\n'); + process.exit(1); + }, 5000); + + try { + await runExitCleanup(); + } catch (cleanupError) { + writeToStderr( + `Error during final cleanup: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`, + ); + } finally { + clearTimeout(cleanupTimeout); + } if (error instanceof FatalError) { let errorMessage = error.message; @@ -46,6 +60,7 @@ main().catch(async (error) => { writeToStderr(errorMessage + '\n'); process.exit(error.exitCode); } + writeToStderr('An unexpected critical error occurred:'); if (error instanceof Error) { writeToStderr(error.stack + '\n'); diff --git a/packages/core/src/core/turn.test.ts b/packages/core/src/core/turn.test.ts index 94a713c3b7..6634f6f4c8 100644 --- a/packages/core/src/core/turn.test.ts +++ b/packages/core/src/core/turn.test.ts @@ -261,7 +261,10 @@ describe('Turn', () => { const errorEvent = events[0] as ServerGeminiErrorEvent; expect(errorEvent.type).toBe(GeminiEventType.Error); expect(errorEvent.value).toEqual({ - error: { message: 'API Error', status: undefined }, + error: { + message: 'API Error', + status: undefined, + }, }); expect(turn.getDebugResponses().length).toBe(0); expect(reportError).toHaveBeenCalledWith( diff --git a/packages/core/src/core/turn.ts b/packages/core/src/core/turn.ts index b868da8e4f..23b55afe29 100644 --- a/packages/core/src/core/turn.ts +++ b/packages/core/src/core/turn.ts @@ -116,7 +116,7 @@ export interface StructuredError { } export interface GeminiErrorEventValue { - error: StructuredError; + error: unknown; } export interface GeminiFinishedEventValue {