singularity-forge/src/resources/extensions/genai-proxy/proxy-command.js
2026-05-04 23:27:20 +02:00

93 lines
3.4 KiB
JavaScript

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`);
}