feat(coding-agent): add Google Cloud Code Assist OAuth flow

- Add OAuth handler with PKCE flow and local callback server
- Automatic project discovery via loadCodeAssist/onboardUser endpoints
- Store credentials with projectId for API calls
- Encode token+projectId as JSON for provider to decode
- Register as 'google-cloud-code-assist' OAuth provider
This commit is contained in:
Mario Zechner
2025-12-20 10:27:07 +01:00
parent 36e17933d5
commit b6fe07b618
6 changed files with 389 additions and 10 deletions

View File

@@ -1,5 +1,6 @@
import { loginAnthropic, refreshAnthropicToken } from "./anthropic.js";
import { loginGitHubCopilot, refreshGitHubCopilotToken } from "./github-copilot.js";
import { loginGoogleCloud, refreshGoogleCloudToken } from "./google-cloud.js";
import {
listOAuthProviders as listOAuthProvidersFromStorage,
loadOAuthCredentials,
@@ -11,7 +12,7 @@ import {
// Re-export for convenience
export { listOAuthProvidersFromStorage as listOAuthProviders };
export type SupportedOAuthProvider = "anthropic" | "github-copilot";
export type SupportedOAuthProvider = "anthropic" | "github-copilot" | "google-cloud-code-assist";
export interface OAuthProviderInfo {
id: SupportedOAuthProvider;
@@ -45,6 +46,11 @@ export function getOAuthProviders(): OAuthProviderInfo[] {
name: "GitHub Copilot",
available: true,
},
{
id: "google-cloud-code-assist",
name: "Google Cloud Code Assist (Gemini CLI)",
available: true,
},
];
}
@@ -73,6 +79,10 @@ export async function login(
saveOAuthCredentials("github-copilot", creds);
break;
}
case "google-cloud-code-assist": {
await loginGoogleCloud(onAuth, onProgress);
break;
}
default:
throw new Error(`Unknown OAuth provider: ${provider}`);
}
@@ -103,6 +113,9 @@ export async function refreshToken(provider: SupportedOAuthProvider): Promise<st
case "github-copilot":
newCredentials = await refreshGitHubCopilotToken(credentials.refresh, credentials.enterpriseUrl);
break;
case "google-cloud-code-assist":
newCredentials = await refreshGoogleCloudToken(credentials.refresh, credentials.projectId);
break;
default:
throw new Error(`Unknown OAuth provider: ${provider}`);
}