diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index c0fc9d7b7f..a5c615444f 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -1135,6 +1135,8 @@ describe('gemini.tsx main function exit codes', () => { vi.mocked(loadSandboxConfig).mockResolvedValue({} as any); vi.mocked(loadCliConfig).mockResolvedValue({ refreshAuth: vi.fn().mockRejectedValue(new Error('Auth failed')), + getRemoteAdminSettings: vi.fn().mockReturnValue(undefined), + isInteractive: vi.fn().mockReturnValue(true), } as unknown as Config); vi.mocked(loadSettings).mockReturnValue( createMockSettings({ diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index 1ff3a3e7ee..aad7956142 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -373,6 +373,7 @@ export async function main() { // Refresh auth to fetch remote admin settings from CCPA and before entering // the sandbox because the sandbox will interfere with the Oauth2 web // redirect. + let initialAuthFailed = false; if (!settings.merged.security.auth.useExternal) { try { if ( @@ -400,8 +401,7 @@ export async function main() { } } catch (err) { debugLogger.error('Error authenticating:', err); - await runExitCleanup(); - process.exit(ExitCodes.FATAL_AUTHENTICATION_ERROR); + initialAuthFailed = true; } } @@ -427,6 +427,10 @@ export async function main() { // another way to decouple refreshAuth from requiring a config. if (sandboxConfig) { + if (initialAuthFailed) { + await runExitCleanup(); + process.exit(ExitCodes.FATAL_AUTHENTICATION_ERROR); + } let stdinData = ''; if (!process.stdin.isTTY) { stdinData = await readStdin();