diff --git a/packages/cli/index.ts b/packages/cli/index.ts index dbcff0f169..792f8c95a4 100644 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -37,22 +37,26 @@ process.on('uncaughtException', (error) => { }); }); -main().catch(async (error) => { - await runExitCleanup(); +main() + .then(async () => { + await runExitCleanup(); + }) + .catch(async (error) => { + await runExitCleanup(); - if (error instanceof FatalError) { - let errorMessage = error.message; - if (!process.env['NO_COLOR']) { - errorMessage = `\x1b[31m${errorMessage}\x1b[0m`; + if (error instanceof FatalError) { + let errorMessage = error.message; + if (!process.env['NO_COLOR']) { + errorMessage = `\x1b[31m${errorMessage}\x1b[0m`; + } + writeToStderr(errorMessage + '\n'); + process.exit(error.exitCode); } - writeToStderr(errorMessage + '\n'); - process.exit(error.exitCode); - } - writeToStderr('An unexpected critical error occurred:'); - if (error instanceof Error) { - writeToStderr(error.stack + '\n'); - } else { - writeToStderr(String(error) + '\n'); - } - process.exit(1); -}); + writeToStderr('An unexpected critical error occurred:'); + if (error instanceof Error) { + writeToStderr(error.stack + '\n'); + } else { + writeToStderr(String(error) + '\n'); + } + process.exit(1); + }); diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index 9dac908a97..7b98d1b52d 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -39,7 +39,6 @@ import { type Config, type ResumedSessionData, debugLogger, - coreEvents, AuthType, } from '@google/gemini-cli-core'; import { act } from 'react'; @@ -693,7 +692,6 @@ describe('gemini.tsx main function kitty protocol', () => { .mockImplementation((code) => { throw new MockProcessExitError(code); }); - const emitFeedbackSpy = vi.spyOn(coreEvents, 'emitFeedback'); vi.mocked(loadSettings).mockReturnValue( createMockSettings({ @@ -722,13 +720,8 @@ describe('gemini.tsx main function kitty protocol', () => { if (!(e instanceof MockProcessExitError)) throw e; } - expect(emitFeedbackSpy).toHaveBeenCalledWith( - 'error', - expect.stringContaining('Error resuming session: Session not found'), - ); - expect(processExitSpy).toHaveBeenCalledWith(42); + expect(processExitSpy).toHaveBeenCalled(); processExitSpy.mockRestore(); - emitFeedbackSpy.mockRestore(); }); it.skip('should log error when cleanupExpiredSessions fails', async () => { diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index 5de617bb88..3487386885 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -319,6 +319,7 @@ export async function startInteractiveUI( }); registerCleanup(() => instance.unmount()); + await instance.waitUntilExit(); } export async function main() { @@ -705,9 +706,8 @@ export async function main() { // Use the existing session ID to continue recording to the same session config.setSessionId(resolvedSessionData.conversation.sessionId); } catch (error) { - coreEvents.emitFeedback( - 'error', - `Error resuming session: ${error instanceof Error ? error.message : 'Unknown error'}`, + writeToStderr( + `Error resuming session: ${error instanceof Error ? error.message : 'Unknown error'}\n`, ); await runExitCleanup(); process.exit(ExitCodes.FATAL_INPUT_ERROR); @@ -812,8 +812,8 @@ export async function main() { const conversation = config .getGeminiClient() - ?.getChatRecordingService() - ?.getConversation(); + ?.getChatRecordingService?.() + ?.getConversation?.(); if (conversation) { const sessionName = getConversationSessionName(conversation); writeToStdout(