Files
AgentCompany/AgentCompany-New/src/main/services/provider-oauth-service.ts
T
ZacharyZhang-NY 49a9f16221 Replace token-paste with native device-code/PKCE provider sign-in
Implement the official OAuth login flows natively (ported from pi-ai's
reference): GitHub Copilot device-code, GPT account (ChatGPT Codex) and
Google Antigravity authorization-code + PKCE via a loopback callback server.
Obtained credentials are stored as JSON through the existing secret vault.
Onboarding and Settings now run the real sign-in instead of pasting an
access token.
2026-05-29 20:08:55 -04:00

41 lines
1.4 KiB
TypeScript

import { getOAuthFlow } from "./oauth/oauth-flows";
export interface ProviderOAuthHooks {
onAuth: (info: { url: string; instructions?: string }) => void;
onProgress?: (message: string) => void;
}
/**
* Drives a provider's native OAuth login and returns the obtained credentials
* as a JSON string, ready to be stored through the existing secret vault. The
* service is decoupled from Electron: opening the browser and emitting UI
* events are supplied by the caller via {@link ProviderOAuthHooks}.
*/
export class ProviderOAuthService {
private readonly controllers = new Map<string, AbortController>();
async run(input: { providerKey: string; enterpriseDomain?: string | null }, hooks: ProviderOAuthHooks): Promise<string> {
const flow = getOAuthFlow(input.providerKey);
if (this.controllers.has(input.providerKey)) {
throw new Error("A sign-in for this provider is already in progress.");
}
const controller = new AbortController();
this.controllers.set(input.providerKey, controller);
try {
const credentials = await flow.login({
onAuth: hooks.onAuth,
onProgress: hooks.onProgress,
signal: controller.signal,
enterpriseDomain: input.enterpriseDomain ?? null,
});
return JSON.stringify(credentials);
} finally {
this.controllers.delete(input.providerKey);
}
}
cancel(providerKey: string): void {
this.controllers.get(providerKey)?.abort();
}
}