92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
import { emptyPluginConfigSchema } from "clawdbot/plugin-sdk";
|
|
|
|
import { loginGeminiCliOAuth } from "./oauth.js";
|
|
|
|
const PROVIDER_ID = "google-gemini-cli";
|
|
const PROVIDER_LABEL = "Gemini CLI OAuth";
|
|
const DEFAULT_MODEL = "google-gemini-cli/gemini-3-pro-preview";
|
|
const ENV_VARS = [
|
|
"CLAWDBOT_GEMINI_OAUTH_CLIENT_ID",
|
|
"CLAWDBOT_GEMINI_OAUTH_CLIENT_SECRET",
|
|
"GEMINI_CLI_OAUTH_CLIENT_ID",
|
|
"GEMINI_CLI_OAUTH_CLIENT_SECRET",
|
|
];
|
|
|
|
const geminiCliPlugin = {
|
|
id: "google-gemini-cli-auth",
|
|
name: "Google Gemini CLI Auth",
|
|
description: "OAuth flow for Gemini CLI (Google Code Assist)",
|
|
configSchema: emptyPluginConfigSchema(),
|
|
register(api) {
|
|
api.registerProvider({
|
|
id: PROVIDER_ID,
|
|
label: PROVIDER_LABEL,
|
|
docsPath: "/providers/models",
|
|
aliases: ["gemini-cli"],
|
|
envVars: ENV_VARS,
|
|
auth: [
|
|
{
|
|
id: "oauth",
|
|
label: "Google OAuth",
|
|
hint: "PKCE + localhost callback",
|
|
kind: "oauth",
|
|
run: async (ctx) => {
|
|
const spin = ctx.prompter.progress("Starting Gemini CLI OAuth…");
|
|
try {
|
|
const result = await loginGeminiCliOAuth({
|
|
isRemote: ctx.isRemote,
|
|
openUrl: ctx.openUrl,
|
|
log: (msg) => ctx.runtime.log(msg),
|
|
note: ctx.prompter.note,
|
|
prompt: async (message) => String(await ctx.prompter.text({ message })),
|
|
progress: spin,
|
|
});
|
|
|
|
spin.stop("Gemini CLI OAuth complete");
|
|
const profileId = `google-gemini-cli:${result.email ?? "default"}`;
|
|
return {
|
|
profiles: [
|
|
{
|
|
profileId,
|
|
credential: {
|
|
type: "oauth",
|
|
provider: PROVIDER_ID,
|
|
access: result.access,
|
|
refresh: result.refresh,
|
|
expires: result.expires,
|
|
email: result.email,
|
|
projectId: result.projectId,
|
|
},
|
|
},
|
|
],
|
|
configPatch: {
|
|
agents: {
|
|
defaults: {
|
|
models: {
|
|
[DEFAULT_MODEL]: {},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
defaultModel: DEFAULT_MODEL,
|
|
notes: [
|
|
"If requests fail, set GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID.",
|
|
],
|
|
};
|
|
} catch (err) {
|
|
spin.stop("Gemini CLI OAuth failed");
|
|
await ctx.prompter.note(
|
|
"Trouble with OAuth? Ensure your Google account has Gemini CLI access.",
|
|
"OAuth help",
|
|
);
|
|
throw err;
|
|
}
|
|
},
|
|
},
|
|
],
|
|
});
|
|
},
|
|
};
|
|
|
|
export default geminiCliPlugin;
|