diff --git a/desktop/src/agents/local-agent-readiness.cjs b/desktop/src/agents/local-agent-readiness.cjs index 3f03158..a4f00d8 100644 --- a/desktop/src/agents/local-agent-readiness.cjs +++ b/desktop/src/agents/local-agent-readiness.cjs @@ -110,6 +110,16 @@ function qwenOAuthCredentialsPresent(filename) { } catch { return false } } +function geminiOAuthCredentialsPresent(filename) { + try { + const contents = readCredentialFile(filename) + if (!contents) return false + const credentials = JSON.parse(contents) + return Boolean(credentials && typeof credentials === 'object' && !Array.isArray(credentials) + && (credentialLiteral(credentials.access_token) || credentialLiteral(credentials.refresh_token))) + } catch { return false } +} + function openCodeReviewSelectedCredential(home, env, credentialSource, presetProviders) { let config try { @@ -808,7 +818,7 @@ function nativeCredentialState(kind, options = {}) { const selection = geminiNativeAuth({ home, env, workdir: options.workdir, platform: options.platform }) if (selection.uncertain) return { state: 'unknown', source: 'unverified' } if (selection.authType === 'oauth-personal') { - return jsonContainsCredential(path.join(selection.root, 'oauth_creds.json')) + return geminiOAuthCredentialsPresent(path.join(selection.root, 'oauth_creds.json')) ? { state: 'ready', source: 'native-credential' } : { state: 'unknown', source: 'unverified' } } diff --git a/desktop/test/agents/cli/gemini-native-config.test.cjs b/desktop/test/agents/cli/gemini-native-config.test.cjs index 9ef2b92..4f711df 100644 --- a/desktop/test/agents/cli/gemini-native-config.test.cjs +++ b/desktop/test/agents/cli/gemini-native-config.test.cjs @@ -38,7 +38,7 @@ test('Gemini readiness checks credentials for its selected auth mode', t => { const noSelection = { GEMINI_CLI_SYSTEM_SETTINGS_PATH: path.join(home, 'system.json'), GOOGLE_API_KEY: 'unrelated' } assert.deepEqual(nativeCredentialState('gemini', { home, env: noSelection }), { state: 'unknown', source: 'unverified' }) const env = { GEMINI_CLI_SYSTEM_SETTINGS_PATH: path.join(home, 'system.json'), GEMINI_CLI_AUTH_OVERRIDE: 'oauth-personal', GEMINI_API_KEY: 'unrelated' } - fs.unlinkSync(path.join(root, 'oauth_creds.json')) + fs.writeFileSync(path.join(root, 'oauth_creds.json'), JSON.stringify({ api_key: 'unrelated' })) assert.deepEqual(nativeCredentialState('gemini', { home, env }), { state: 'unknown', source: 'unverified' }) fs.writeFileSync(path.join(root, 'oauth_creds.json'), JSON.stringify({ refresh_token: 'oauth-token' })) assert.deepEqual(nativeCredentialState('gemini', { home, env }), { state: 'ready', source: 'native-credential' })