import { createProxyServer } from "./proxy-server.js"; const PROXY_COMMAND_NAME = "genai-proxy"; const PROXY_FLAG_NAME = "gemini-cli-proxy"; const DEFAULT_PROXY_PORT = 3000; export function installGenaiProxyExtension(api, dependencies) { let proxyServer = null; const buildProxyServer = dependencies?.createProxyServer ?? createProxyServer; const ensureProxyServer = (context, port) => { if (proxyServer && proxyServer.getPort() === port) { return proxyServer; } if (proxyServer) { throw new Error(`Proxy already running on port ${proxyServer.getPort()}`); } proxyServer = buildProxyServer({ port, modelRegistry: context.modelRegistry, onLog: (message) => notifyProxyStatus(context, message, "info"), }); return proxyServer; }; api.registerFlag(PROXY_FLAG_NAME, { description: "Start the Gemini CLI proxy server", type: "string", allowNoValue: true, onStartup: async (value, context) => { const server = ensureProxyServer(context, resolveProxyPort(value)); await server.start(); }, }); api.registerCommand(PROXY_COMMAND_NAME, { description: "Manage the Gemini CLI proxy server", handler: async (args, context) => { await handleProxyCommand(args ?? "", context, ensureProxyServer, () => proxyServer, () => { proxyServer = null; }); }, }); } export function resolveProxyPort(flagValue) { if (flagValue === true || flagValue === false || flagValue === undefined) { return DEFAULT_PROXY_PORT; } const port = Number.parseInt(flagValue, 10); if (!Number.isFinite(port) || port <= 0 || port > 65535) { throw new Error(`Invalid proxy port: ${flagValue}`); } return port; } async function handleProxyCommand(rawArgs, context, ensureProxyServer, getProxyServer, clearProxyServer) { const [subcommand = "status", portArg] = rawArgs .trim() .split(/\s+/) .filter((value) => value.length > 0); if (subcommand === "start") { const existingServer = getProxyServer(); if (existingServer?.isRunning()) { notifyProxyStatus(context, `Proxy already running on port ${existingServer.getPort()}`, "info"); return; } const server = ensureProxyServer(context, resolveProxyPort(portArg === undefined ? true : portArg)); await server.start(); return; } if (subcommand === "stop") { const server = getProxyServer(); if (!server?.isRunning()) { notifyProxyStatus(context, "Proxy is not running", "warning"); return; } await server.stop(); clearProxyServer(); notifyProxyStatus(context, "Proxy stopped", "success"); return; } if (subcommand === "status") { const server = getProxyServer(); if (server?.isRunning()) { notifyProxyStatus(context, `Proxy running on port ${server.getPort()}`, "info"); return; } notifyProxyStatus(context, "Proxy is not running", "info"); return; } notifyProxyStatus(context, "Usage: /genai-proxy start [port] | stop | status", "warning"); } function notifyProxyStatus(context, message, type) { if ("ui" in context) { context.ui.notify(message, type); return; } process.stderr.write(`[genai-proxy] ${message}\n`); }