diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index 9619035b0d..3fabfe02de 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -1065,6 +1065,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({ merged: { diff --git a/packages/cli/src/gemini.tsx b/packages/cli/src/gemini.tsx index 741632af85..262c8a6bf9 100644 --- a/packages/cli/src/gemini.tsx +++ b/packages/cli/src/gemini.tsx @@ -363,6 +363,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?.selectedType && !settings.merged.security?.auth?.useExternal @@ -390,8 +391,7 @@ export async function main() { } } catch (err) { debugLogger.error('Error authenticating:', err); - await runExitCleanup(); - process.exit(ExitCodes.FATAL_AUTHENTICATION_ERROR); + initialAuthFailed = true; } } @@ -414,6 +414,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();