The legacy application - its src, tests, landing site, promo assets, docs, release tooling, CI workflows, and root configs - leaves the tree; it stays reachable in history. Everything under AgentCompany-New moves up unchanged: same package name, so the production userData/database path is untouched, and e2e/build scripts already resolved paths relative to the project. The developer cred.txt stays gitignored at its new location. Full verify:ci passes from the new root.
41 lines
1.4 KiB
TypeScript
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();
|
|
}
|
|
}
|