@srouter/cli 0.1.3-rc.1 → 0.1.3-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2307,6 +2307,56 @@ function backupDb(source, label) {
2307
2307
  p.log.step(`Backed up to ${pc.dim(backupPath)}`);
2308
2308
  return backupPath;
2309
2309
  }
2310
+ function getDownloadDirs() {
2311
+ const home = os5.homedir();
2312
+ const dirs = [
2313
+ path6.join(home, "Downloads"),
2314
+ path6.join(home, "download"),
2315
+ path6.join(home, "downloads"),
2316
+ path6.join(home, "Desktop")
2317
+ ];
2318
+ if (process.platform === "win32") {
2319
+ if (process.env.USERPROFILE) {
2320
+ dirs.push(path6.join(process.env.USERPROFILE, "Downloads"));
2321
+ dirs.push(path6.join(process.env.USERPROFILE, "Desktop"));
2322
+ }
2323
+ }
2324
+ return Array.from(new Set(dirs.filter((d) => fs6.existsSync(d))));
2325
+ }
2326
+ function scanFor9RouterFiles() {
2327
+ const results = [];
2328
+ const seen = /* @__PURE__ */ new Set();
2329
+ const addFile = (filePath, label) => {
2330
+ const resolved = path6.resolve(filePath);
2331
+ if (!seen.has(resolved) && fs6.existsSync(resolved)) {
2332
+ try {
2333
+ const stat = fs6.statSync(resolved);
2334
+ if (stat.isFile()) {
2335
+ seen.add(resolved);
2336
+ results.push({ path: resolved, label, mtime: stat.mtimeMs });
2337
+ }
2338
+ } catch {
2339
+ }
2340
+ }
2341
+ };
2342
+ for (const loc of NineRouterDbLocations) {
2343
+ addFile(loc, "Installed Database");
2344
+ }
2345
+ for (const downloadDir of getDownloadDirs()) {
2346
+ try {
2347
+ const files = fs6.readdirSync(downloadDir);
2348
+ for (const file of files) {
2349
+ const lower = file.toLowerCase();
2350
+ const fullPath = path6.join(downloadDir, file);
2351
+ if (lower.includes("9router") || lower.includes("srouter-backup") || lower.endsWith(".db") || lower.endsWith(".json") && lower.includes("backup")) {
2352
+ addFile(fullPath, path6.basename(downloadDir));
2353
+ }
2354
+ }
2355
+ } catch {
2356
+ }
2357
+ }
2358
+ return results.sort((a, b) => b.mtime - a.mtime);
2359
+ }
2310
2360
  function findDatabase(candidates, label) {
2311
2361
  for (const candidate of candidates) {
2312
2362
  const fullPath = path6.resolve(candidate);
@@ -2351,11 +2401,56 @@ async function migrateDb(options) {
2351
2401
  }
2352
2402
  async function migrateNineRouter(options) {
2353
2403
  p.intro("9Router \u2192 SRouter Database Migration");
2354
- const source = options.source && fs6.existsSync(options.source) ? path6.resolve(options.source) : findDatabase(NineRouterDbLocations, "9Router");
2404
+ let source = options.source && fs6.existsSync(options.source) ? path6.resolve(options.source) : null;
2405
+ if (!source) {
2406
+ const foundFiles = scanFor9RouterFiles();
2407
+ if (foundFiles.length === 1) {
2408
+ source = foundFiles[0].path;
2409
+ p.log.info(`Found 9Router file: ${pc.bold(source)} (${fileKb(source)}) [${foundFiles[0].label}]`);
2410
+ } else if (foundFiles.length > 1) {
2411
+ if (options.yes) {
2412
+ source = foundFiles[0].path;
2413
+ p.log.info(`Auto-selected latest 9Router file: ${pc.bold(source)} (${fileKb(source)})`);
2414
+ } else {
2415
+ const choice = await p.select({
2416
+ message: "Multiple 9Router database/backup files found. Select one to migrate:",
2417
+ options: [
2418
+ ...foundFiles.map((f) => ({
2419
+ value: f.path,
2420
+ label: `${path6.basename(f.path)} (${fileKb(f.path)})`,
2421
+ hint: `${f.label} \u2022 ${f.path}`
2422
+ })),
2423
+ { value: "custom", label: "Enter custom path manually..." }
2424
+ ]
2425
+ });
2426
+ if (p.isCancel(choice)) {
2427
+ p.outro("Migration cancelled.");
2428
+ return;
2429
+ }
2430
+ if (choice === "custom") {
2431
+ const customPath = await p.text({
2432
+ message: "Enter path to 9Router .db or .json backup file:",
2433
+ validate: (val) => {
2434
+ if (!val || !fs6.existsSync(path6.resolve(val))) {
2435
+ return "File does not exist. Please check the path.";
2436
+ }
2437
+ }
2438
+ });
2439
+ if (p.isCancel(customPath) || !customPath) {
2440
+ p.outro("Migration cancelled.");
2441
+ return;
2442
+ }
2443
+ source = path6.resolve(customPath);
2444
+ } else {
2445
+ source = choice;
2446
+ }
2447
+ }
2448
+ }
2449
+ }
2355
2450
  if (!source) {
2356
- p.log.error("No 9Router database found.");
2451
+ p.log.error("No 9Router database or backup file found.");
2357
2452
  p.outro(
2358
- "Pass the location explicitly: srouter migrate 9router --source /path/to/9router.db"
2453
+ "Pass the location explicitly: srouter migrate 9router --source /path/to/9router-backup.json"
2359
2454
  );
2360
2455
  process.exitCode = 1;
2361
2456
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../packages/constants/dist/providers/kiro.js","../../../packages/constants/dist/providers/neosantara.js","../../../packages/constants/dist/providers/gorouter.js","../../../packages/constants/dist/providers/bluesminds.js","../../../packages/constants/dist/providers/seekai.js","../../../packages/constants/dist/providers/tabitoken.js","../../../packages/constants/dist/providers/tokenrouter.js","../../../packages/constants/dist/providers/commandcode.js","../../../packages/constants/dist/providers/openai.js","../../../packages/constants/dist/providers/anthropic.js","../../../packages/constants/dist/providers/antigravity.js","../../../packages/constants/dist/providers/codebuddy.js","../../../packages/constants/dist/providers/qoder.js","../../../packages/constants/dist/providers/opencode.js","../../../packages/constants/dist/providers/catalog.js","../../../packages/constants/dist/seed.js","../../../packages/constants/dist/version.js","../src/commands/setup.ts","../src/lib/configStore.ts","../src/adapters/claude.ts","../src/adapters/base.ts","../src/lib/platform.ts","../src/adapters/opencode.ts","../src/lib/srouterClient.ts","../src/adapters/index.ts","../src/lib/ui.ts","../src/commands/link.ts","../src/commands/unlink.ts","../src/commands/sync.ts","../src/commands/status.ts","../src/commands/env.ts","../src/commands/run.ts","../src/commands/migrate.ts","../../../packages/db/dist/db.js","../../../packages/db/dist/row-utils.js","../../../packages/db/dist/adminAuth.js","../../../packages/db/dist/quota.js"],"sourcesContent":["import { Command } from \"commander\";\nimport { CLI_VERSION } from \"@srouter/constants\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { linkCommand } from \"./commands/link.js\";\nimport { unlinkCommand } from \"./commands/unlink.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { envCommand } from \"./commands/env.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { migrateCommand } from \"./commands/migrate.js\";\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"srouter\")\n .description(\n \"CLI tool to connect, configure, and proxy AI coding tools with SRouter Gateway\"\n )\n .version(CLI_VERSION);\n\n program\n .command(\"setup\")\n .alias(\"config\")\n .description(\n \"Interactive wizard to connect AI coding tools (Claude Code, OpenCode) to SRouter\"\n )\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Default model ID to configure\")\n .option(\n \"--opus-model <model>\",\n \"Default Opus tier model for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Default Sonnet tier model for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Default Haiku tier model for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .action(async (opts) => {\n await setupCommand(opts);\n });\n\n program\n .command(\"link <tool>\")\n .description(\"Configure a specific tool to use SRouter proxy (claude, opencode)\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Model ID\")\n .option(\n \"--opus-model <model>\",\n \"Opus tier model ID for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Sonnet tier model ID for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Haiku tier model ID for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .option(\"--dry-run\", \"Preview configuration changes without writing files\")\n .action(async (tool, opts) => {\n await linkCommand(tool, opts);\n });\n\n program\n .command(\"unlink <tool>\")\n .description(\"Restore original configuration for a tool from backup\")\n .action(async (tool) => {\n await unlinkCommand(tool);\n });\n\n program\n .command(\"sync [tool]\")\n .description(\n \"Fetch latest models from SRouter Gateway and refresh tool configs (OpenCode, etc.)\"\n )\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .action(async (tool, opts) => {\n await syncCommand(tool, opts);\n });\n\n program\n .command(\"status\")\n .alias(\"doctor\")\n .description(\"Inspect SRouter gateway connectivity, active models, and tool link status\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .action(async (opts) => {\n await statusCommand(opts);\n });\n\n program\n .command(\"env [tool]\")\n .description(\"Print shell export commands for SRouter proxy environment variables\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Model ID\")\n .option(\n \"--opus-model <model>\",\n \"Opus tier model ID for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Sonnet tier model ID for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Haiku tier model ID for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .option(\"--fish\", \"Generate fish shell export syntax (shorthand for --shell fish)\")\n .option(\"--shell <shell>\", \"Target shell syntax (bash, zsh, fish, powershell, cmd)\")\n .action(async (tool, opts) => {\n await envCommand(tool, opts);\n });\n\n program\n .command(\"run <tool> [args...]\")\n .description(\"Run a tool CLI directly with SRouter proxy environment variables injected\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Model ID\")\n .option(\n \"--opus-model <model>\",\n \"Opus tier model ID for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Sonnet tier model ID for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Haiku tier model ID for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .allowUnknownOption()\n .action(async (tool, args, opts) => {\n await runCommand(tool, args, opts);\n });\n\n program\n .command(\"migrate <target>\")\n .description(\"Migrate databases (targets: db = legacy location, 9router = 9Router import)\")\n .option(\"--source <path>\", \"Explicit path to the source SQLite database\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-a, --action <action>\", \"Migration conflict resolution (copy, merge, backup_and_replace)\")\n .action(async (target, opts) => {\n await migrateCommand(target, opts);\n });\n\n return program;\n}\n\nif (\n process.argv[1]?.endsWith(\"srouter.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"index.js\")\n) {\n const program = createCli();\n program.parse(process.argv);\n}\n","export const KIRO_PROVIDER = {\n id: \"kiro\",\n name: \"Kiro\",\n category: \"api_key\",\n protocol: \"custom\",\n web_url: \"https://aws.amazon.com/q/\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"Kiro credential missing\"\n};\n","export const NEOSANTARA_BASE_URL = \"https://api.neosantara.xyz/v1\";\nexport const NEOSANTARA_PROVIDER = {\n id: \"neosantara\",\n name: \"Neosantara\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: NEOSANTARA_BASE_URL,\n web_url: \"https://neosantara.xyz\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"Neosantara API key missing\"\n};\n","export const GOROUTER_BASE_URL = \"https://gorouter.app/v1\";\nexport const GOROUTER_PROVIDER = {\n id: \"gorouter\",\n name: \"GoRouter\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: GOROUTER_BASE_URL,\n web_url: \"https://gorouter.app/sign-up?aff=cJJn\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"GoRouter API key missing\"\n};\n","export const BLUESMINDS_BASE_URL = \"https://api.bluesminds.com/v1\";\nexport const BLUESMINDS_PROVIDER = {\n id: \"bluesminds\",\n name: \"BluesMinds\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: BLUESMINDS_BASE_URL,\n web_url: \"https://api.bluesminds.com/sign-up?aff=nCAw\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"BluesMinds API key missing\"\n};\n","export const SEEKAI_BASE_URL = \"https://seekai.cc/v1\";\nexport const SEEKAI_PROVIDER = {\n id: \"seekai\",\n name: \"SeekAI\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: SEEKAI_BASE_URL,\n web_url: \"https://seekai.cc/sign-up?aff=UU0C\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"SeekAI API key missing\"\n};\n","export const TABITOKEN_BASE_URL = \"https://tabitoken.com/v1\";\nexport const TABITOKEN_PROVIDER = {\n id: \"tabitoken\",\n name: \"TabiToken\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: TABITOKEN_BASE_URL,\n web_url: \"https://tabitoken.com/sign-up?aff=h5iN\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"TabiToken API key missing\"\n};\n","export const TOKENROUTER_BASE_URL = \"https://api.tokenrouter.com/v1\";\nexport const TOKENROUTER_PROVIDER = {\n id: \"tokenrouter\",\n name: \"TokenRouter\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: TOKENROUTER_BASE_URL,\n web_url: \"https://tokenrouter.com\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"TokenRouter API key missing\"\n};\n","export const COMMANDCODE_BASE_URL = \"https://api.commandcode.ai/alpha/generate\";\nexport const COMMANDCODE_MODELS_URL = \"https://api.commandcode.ai/provider/v1/models\";\nexport const COMMANDCODE_PROVIDER = {\n id: \"commandcode\",\n name: \"Command Code\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: COMMANDCODE_BASE_URL,\n web_url: \"https://commandcode.ai\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"Command Code API key missing\"\n};\n","export const OPENAI_BASE_URL = \"https://api.openai.com/v1\";\nexport const CODEX_BASE_URL = \"https://chatgpt.com/backend-api/codex/responses\";\nexport const CODEX_MODELS_URL = \"https://chatgpt.com/backend-api/codex/models\";\nexport const CODEX_OAUTH_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nexport const CODEX_OAUTH_AUTHORIZE_URL = \"https://auth.openai.com/oauth/authorize\";\nexport const CODEX_OAUTH_TOKEN_URL = \"https://auth.openai.com/oauth/token\";\nexport const CODEX_OAUTH_SCOPE = \"openid profile email offline_access api.connectors.read api.connectors.invoke\";\nexport const CODEX_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/callback\";\nexport const CODEX_OAUTH_ORIGINATOR = \"codex_cli_rs\";\nexport const OPENAI_CODEX_PROVIDER = {\n id: \"openai_codex\",\n name: \"OpenAI Codex / ChatGPT\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"openai\",\n web_url: \"https://chatgpt.com\",\n requires_api_key: false,\n requires_oauth: true,\n status_message: \"OAuth token missing\"\n};\n","export const ANTHROPIC_BASE_URL = \"https://api.anthropic.com/v1\";\nexport const CLAUDE_OAUTH_CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\nexport const CLAUDE_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/claude/callback\";\nexport const CLAUDE_OAUTH_SCOPE = \"org:create_api_key user:profile user:inference\";\nexport const CLAUDE_OAUTH_AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nexport const CLAUDE_OAUTH_TOKEN_URL = \"https://api.anthropic.com/v1/oauth/token\";\nexport const ANTHROPIC_PROVIDER = {\n id: \"anthropic\",\n name: \"Anthropic Claude\",\n category: \"oauth\",\n protocol: \"anthropic\",\n alias: \"claude\",\n web_url: \"https://claude.ai\",\n requires_api_key: false,\n requires_oauth: true,\n status_message: \"OAuth token missing\"\n};\n","export const ANTIGRAVITY_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta/openai\";\nexport const ANTIGRAVITY_IDE_BASE_URL = \"https://daily-cloudcode-pa.googleapis.com\";\nexport const ANTIGRAVITY_OAUTH_CLIENT_ID = \"1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com\";\nexport const ANTIGRAVITY_OAUTH_CLIENT_SECRET = \"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\";\nexport const ANTIGRAVITY_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/antigravity/callback\";\nexport const ANTIGRAVITY_OAUTH_SCOPE = \"openid profile email https://www.googleapis.com/auth/cloud-platform\";\nexport const ANTIGRAVITY_OAUTH_AUTHORIZE_URL = \"https://accounts.google.com/o/oauth2/v2/auth\";\nexport const ANTIGRAVITY_OAUTH_TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nexport const ANTIGRAVITY_OAUTH_PROMPT = \"consent\";\nexport const ANTIGRAVITY_MODELS = [\n { id: \"gemini-3.7-flash-high\", name: \"Gemini 3.7 Flash (High)\" },\n { id: \"gemini-3.7-flash-medium\", name: \"Gemini 3.7 Flash (Medium)\" },\n { id: \"gemini-3.7-flash-low\", name: \"Gemini 3.7 Flash (Low)\" },\n { id: \"gemini-3.6-flash-high\", name: \"Gemini 3.6 Flash (High)\" },\n { id: \"gemini-3.6-flash-medium\", name: \"Gemini 3.6 Flash (Medium)\" },\n { id: \"gemini-3.6-flash-low\", name: \"Gemini 3.6 Flash (Low)\" },\n { id: \"gemini-3.5-flash-high\", name: \"Gemini 3.5 Flash (High)\" },\n { id: \"gemini-3.5-flash-medium\", name: \"Gemini 3.5 Flash (Medium)\" },\n { id: \"gemini-3.5-flash-low\", name: \"Gemini 3.5 Flash (Low)\" },\n { id: \"gemini-3.1-pro-high\", name: \"Gemini 3.1 Pro (High)\" },\n { id: \"gemini-3.1-pro-low\", name: \"Gemini 3.1 Pro (Low)\" },\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet 4.6 (Thinking)\" },\n { id: \"claude-opus-4-6-thinking\", name: \"Claude Opus 4.6 (Thinking)\" },\n { id: \"gpt-oss-120b-medium\", name: \"GPT-OSS 120B (Medium)\" }\n];\nexport const ANTIGRAVITY_MODEL_IDS = ANTIGRAVITY_MODELS.map((m) => m.id);\nexport const ANTIGRAVITY_PROVIDER = {\n id: \"antigravity\",\n name: \"Google Antigravity\",\n category: \"oauth\",\n protocol: \"openai\",\n base_url: ANTIGRAVITY_IDE_BASE_URL,\n web_url: \"https://ai.google.dev\",\n requires_api_key: false,\n requires_oauth: true,\n status_message: \"Antigravity OAuth token missing\"\n};\n","export const CODEBUDDY_BASE_URL = \"https://www.codebuddy.ai/v2/chat/completions\";\nexport const CODEBUDDY_AUTH_BASE = \"https://www.codebuddy.ai\";\nexport const CODEBUDDY_AUTH_STATE_URL = \"https://www.codebuddy.ai/v2/plugin/auth/state\";\nexport const CODEBUDDY_AUTH_TOKEN_URL = \"https://www.codebuddy.ai/v2/plugin/auth/token\";\nexport const CODEBUDDY_AUTH_REFRESH_URL = \"https://www.codebuddy.ai/v2/plugin/auth/token/refresh\";\nexport const CODEBUDDY_CN_BASE_URL = \"https://copilot.tencent.com/v2/chat/completions\";\nexport const CODEBUDDY_CN_AUTH_BASE = \"https://copilot.tencent.com\";\nexport const CODEBUDDY_CN_AUTH_STATE_URL = \"https://copilot.tencent.com/v2/plugin/auth/state\";\nexport const CODEBUDDY_CN_AUTH_TOKEN_URL = \"https://copilot.tencent.com/v2/plugin/auth/token\";\nexport const CODEBUDDY_CN_AUTH_REFRESH_URL = \"https://copilot.tencent.com/v2/plugin/auth/token/refresh\";\nexport const CODEBUDDY_CN_ORIGIN = \"https://www.codebuddy.cn\";\nexport const CODEBUDDY_CN_DOMAIN = \"www.codebuddy.cn\";\nexport const CODEBUDDY_CN_USER_AGENT = \"CLI/2.96.0 CodeBuddy/2.96.0\";\nexport const CODEBUDDY_AUTH_USER_AGENT = \"IDE/2.63.2 CodeBuddy/2.63.2\";\nexport const CODEBUDDY_AUTH_PLATFORM = \"ide\";\nexport const CODEBUDDY_MODELS = [\n { id: \"default-model\", name: \"Default (CodeBuddy)\" },\n { id: \"default-model-lite\", name: \"Default-Lite\" },\n { id: \"gpt-5.5\", name: \"GPT-5.5\" },\n { id: \"gpt-5.4\", name: \"GPT-5.4\" },\n { id: \"gpt-5.3-codex\", name: \"GPT-5.3-Codex\" },\n { id: \"gpt-5.1-codex\", name: \"GPT-5.1-Codex\" },\n { id: \"gpt-5.1-codex-mini\", name: \"GPT-5.1-Codex-Mini\" },\n { id: \"gemini-3.1-pro\", name: \"Gemini 3.1 Pro\" },\n { id: \"gemini-3.5-flash\", name: \"Gemini 3.5 Flash\" },\n { id: \"gemini-3.0-flash\", name: \"Gemini 3.0 Flash\" },\n { id: \"gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"gemini-3.1-flash-lite\", name: \"Gemini 3.1 Flash Lite\" },\n { id: \"deepseek-v3\", name: \"DeepSeek-V3\" },\n { id: \"deepseek-v3-2-volc\", name: \"DeepSeek-V3.2\" },\n { id: \"deepseek-v4-pro\", name: \"DeepSeek-V4-Pro\" },\n { id: \"deepseek-v4-flash\", name: \"DeepSeek-V4-Flash\" },\n { id: \"glm-5.3\", name: \"GLM-5.3\" },\n { id: \"glm-5.2\", name: \"GLM-5.2\" },\n { id: \"glm-5.1\", name: \"GLM-5.1\" },\n { id: \"glm-5.0\", name: \"GLM-5.0\" },\n { id: \"glm-5.0-turbo\", name: \"GLM-5.0-Turbo\" },\n { id: \"glm-5v-turbo\", name: \"GLM-5v-Turbo\" },\n { id: \"glm-4.7\", name: \"GLM-4.7\" },\n { id: \"minimax-m3\", name: \"MiniMax-M3\" },\n { id: \"minimax-m2.7\", name: \"MiniMax-M2.7\" },\n { id: \"kimi-k3\", name: \"Kimi-K3\" },\n { id: \"kimi-k2.7\", name: \"Kimi-K2.7-Code\" },\n { id: \"kimi-k2.6\", name: \"Kimi-K2.6\" },\n { id: \"kimi-k2.5\", name: \"Kimi-K2.5\" },\n { id: \"hy3-preview\", name: \"Hy3 Preview\" }\n];\nexport const CODEBUDDY_MODEL_IDS = CODEBUDDY_MODELS.map((m) => m.id);\nexport const CODEBUDDY_PROVIDER = {\n id: \"codebuddy\",\n name: \"CodeBuddy\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"codebuddy\",\n base_url: CODEBUDDY_BASE_URL,\n web_url: \"https://www.codebuddy.ai\",\n requires_api_key: false,\n requires_oauth: true,\n supports_custom_url: true,\n status_message: \"CodeBuddy OAuth token missing\"\n};\nexport const CODEBUDDY_CN_PROVIDER = {\n id: \"codebuddy-cn\",\n name: \"CodeBuddy CN\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"codebuddy-cn\",\n base_url: CODEBUDDY_CN_BASE_URL,\n web_url: \"https://www.codebuddy.cn\",\n requires_api_key: false,\n requires_oauth: true,\n supports_custom_url: true,\n status_message: \"CodeBuddy CN OAuth token missing\"\n};\n","export const QODER_MODELS = [\n { id: \"qwen3.8-max-preview\", name: \"Qwen 3.8 Max Preview\", level: \"qmodel_preview\" },\n { id: \"qwen3.7-max\", name: \"Qwen 3.7 Max\", level: \"qmodel_latest\" },\n { id: \"qwen3.7-plus\", name: \"Qwen 3.7 Plus\", level: \"qmodel\" },\n { id: \"kimi-k3\", name: \"Kimi K3\", level: \"kmodel_latest\" },\n { id: \"kimi-k2.7-code\", name: \"Kimi K2.7 Code\", level: \"kmodel\" },\n { id: \"glm-5.2\", name: \"GLM 5.2\", level: \"gm51model\" },\n { id: \"deepseek-v4-pro\", name: \"DeepSeek V4 Pro\", level: \"dmodel\" },\n { id: \"deepseek-v4-flash\", name: \"DeepSeek V4 Flash\", level: \"dfmodel\" },\n { id: \"minimax-m3\", name: \"MiniMax M3\", level: \"mmodel\" },\n { id: \"ultimate\", name: \"Qoder Ultimate\" },\n { id: \"qmodel_38max\", name: \"Qwen 3.8 Max\" },\n { id: \"qmodel_preview\", name: \"Qwen Preview\" },\n { id: \"qmodel_latest\", name: \"Qwen Latest\" },\n { id: \"qmodel\", name: \"Qwen Standard\" },\n { id: \"auto\", name: \"Qoder Auto\" },\n { id: \"performance\", name: \"Qoder Performance\" },\n { id: \"efficient\", name: \"Qoder Efficient\" },\n { id: \"lite\", name: \"Qoder Lite\" },\n { id: \"kmodel_latest\", name: \"Kimi K3 (Raw)\" },\n { id: \"kmodel\", name: \"Kimi K2.7 (Raw)\" },\n { id: \"gmodel\", name: \"GLM (Raw)\" },\n { id: \"gm51model\", name: \"GLM 5.2 (Raw)\" },\n { id: \"dmodel\", name: \"DeepSeek Pro (Raw)\" },\n { id: \"dfmodel\", name: \"DeepSeek Flash (Raw)\" },\n { id: \"mmodel\", name: \"MiniMax (Raw)\" }\n];\nexport const QODER_MODEL_ALIASES = {\n \"qwen3.8-max-preview\": \"qmodel_preview\",\n \"qwen-3.8-max-preview\": \"qmodel_preview\",\n \"qwen3.8-max\": \"qmodel_38max\",\n \"qwen-3.8-max\": \"qmodel_38max\",\n \"qwen3.7-max\": \"qmodel_latest\",\n \"qwen-3.7-max\": \"qmodel_latest\",\n \"qwen3.7-plus\": \"qmodel\",\n \"qwen-3.7-plus\": \"qmodel\",\n \"kimi-k3\": \"kmodel_latest\",\n \"kimi-k2.7-code\": \"kmodel\",\n \"glm-5.2\": \"gm51model\",\n \"deepseek-v4-pro\": \"dmodel\",\n \"deepseek-v4-flash\": \"dfmodel\",\n \"minimax-m3\": \"mmodel\",\n ultimate: \"ultimate\",\n auto: \"auto\",\n performance: \"performance\",\n efficient: \"efficient\",\n lite: \"lite\"\n};\nexport const QODER_MODEL_IDS = QODER_MODELS.map((m) => m.id);\nexport const QODER_OPENAPI_BASE = \"https://openapi.qoder.sh\";\nexport const QODER_CENTER_BASE = \"https://center.qoder.sh\";\nexport const QODER_CHAT_BASE = \"https://api3.qoder.sh\";\nexport const QODER_CHAT_BASE_ALT = \"https://api2.qoder.sh\";\nexport const QODER_LOGIN_URL = \"https://qoder.com/device/selectAccounts\";\nexport const QODER_DEVICE_TOKEN_URL = `${QODER_OPENAPI_BASE}/api/v1/deviceToken/poll`;\nexport const QODER_USERINFO_URL = `${QODER_OPENAPI_BASE}/api/v1/userinfo`;\nexport const QODER_QUOTA_USAGE_URL = `${QODER_OPENAPI_BASE}/api/v2/quota/usage`;\nexport const QODER_REFRESH_TOKEN_URL = `${QODER_CENTER_BASE}/algo/api/v3/user/refresh_token`;\nexport const QODER_JOB_TOKEN_EXCHANGE_URL = `${QODER_OPENAPI_BASE}/api/v1/jobToken/exchange`;\nexport const QODER_CHAT_SIG_PATH = \"/api/v2/service/pro/sse/agent_chat_generation\";\nexport const QODER_CHAT_URL = `${QODER_CHAT_BASE}/algo${QODER_CHAT_SIG_PATH}?FetchKeys=llm_model_result&AgentId=agent_common`;\nexport const QODER_CHAT_URL_ENCODED = `${QODER_CHAT_URL}&Encode=1`;\nexport const QODER_MODEL_LIST_URL = `${QODER_CHAT_BASE}/algo/api/v2/model/list`;\nexport const QODER_IDE_VERSION = \"1.0.0\";\nexport const QODER_CLIENT_TYPE = \"5\";\nexport const QODER_DATA_POLICY = \"disagree\";\nexport const QODER_LOGIN_VERSION = \"v2\";\nexport const QODER_MACHINE_OS = \"x86_64_windows\";\nexport const QODER_MACHINE_TYPE = \"5\";\nexport const QODER_RSA_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA8iMH5c02LilrsERw9t6Pv5Nc\n4k6Pz1EaDicBMpdpxKduSZu5OANqUq8er4GM95omAGIOPOh+Nx0spthYA2BqGz+l\n6HRkPJ7S236FZz73In/KVuLnwI8JJ2CbuJap8kvheCCZpmAWpb/cPx/3Vr/J6I17\nXcW+ML9FoCI6AOvOzwIDAQAB\n-----END PUBLIC KEY-----`;\nexport const QODER_PROVIDER = {\n id: \"qoder\",\n name: \"Qoder\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"qd\",\n base_url: QODER_CHAT_URL_ENCODED,\n web_url: \"https://qoder.com\",\n requires_api_key: false,\n requires_oauth: true,\n supports_custom_url: true,\n status_message: \"Qoder token or session missing\"\n};\n","export const OPENCODE_ZEN_BASE_URL = \"https://opencode.ai/zen/v1\";\nexport const OPENCODE_ZEN_MODELS = [\n { id: \"x-preview-f-free\", name: \"Ox Alpha Free (Unlimited)\" },\n { id: \"big-pickle\", name: \"Big Pickle (Free)\" },\n { id: \"laguna-s-2.1-free\", name: \"Poolside Laguna S 2.1 (Free)\" },\n { id: \"nemotron-3.5-lightning-free\", name: \"Nemotron 3.5 Lightning (Free)\" },\n { id: \"nemotron-3-ultra-free\", name: \"Nemotron 3 Ultra (Free)\" },\n { id: \"mimo-v2.5-free\", name: \"Xiaomi MiMo V2.5 (Free)\" }\n];\nexport const OPENCODE_ZEN_MODEL_IDS = OPENCODE_ZEN_MODELS.map((m) => m.id);\nexport const OPENCODE_ZEN_PROVIDER = {\n id: \"opencode_zen\",\n name: \"OpenCode Zen\",\n category: \"free_tier\",\n protocol: \"openai\",\n alias: \"zen\",\n base_url: OPENCODE_ZEN_BASE_URL,\n web_url: \"https://opencode.ai/zen\",\n requires_api_key: false,\n requires_oauth: false,\n supports_custom_url: true,\n status_message: \"Free Tier Ready (Unlimited)\"\n};\n","import { ANTHROPIC_PROVIDER } from \"./anthropic.js\";\nimport { ANTIGRAVITY_PROVIDER } from \"./antigravity.js\";\nimport { BLUESMINDS_PROVIDER } from \"./bluesminds.js\";\nimport { CODEBUDDY_CN_PROVIDER, CODEBUDDY_PROVIDER } from \"./codebuddy.js\";\nimport { COMMANDCODE_PROVIDER } from \"./commandcode.js\";\nimport { GOROUTER_PROVIDER } from \"./gorouter.js\";\nimport { KIRO_PROVIDER } from \"./kiro.js\";\nimport { NEOSANTARA_PROVIDER } from \"./neosantara.js\";\nimport { OPENAI_CODEX_PROVIDER } from \"./openai.js\";\nimport { OPENCODE_ZEN_PROVIDER } from \"./opencode.js\";\nimport { QODER_PROVIDER } from \"./qoder.js\";\nimport { SEEKAI_PROVIDER } from \"./seekai.js\";\nimport { TABITOKEN_PROVIDER } from \"./tabitoken.js\";\nimport { TOKENROUTER_PROVIDER } from \"./tokenrouter.js\";\nexport const KNOWN_PROVIDERS = [\n KIRO_PROVIDER,\n NEOSANTARA_PROVIDER,\n GOROUTER_PROVIDER,\n BLUESMINDS_PROVIDER,\n SEEKAI_PROVIDER,\n TABITOKEN_PROVIDER,\n TOKENROUTER_PROVIDER,\n OPENAI_CODEX_PROVIDER,\n ANTHROPIC_PROVIDER,\n ANTIGRAVITY_PROVIDER,\n COMMANDCODE_PROVIDER,\n QODER_PROVIDER,\n CODEBUDDY_PROVIDER,\n CODEBUDDY_CN_PROVIDER,\n OPENCODE_ZEN_PROVIDER\n];\nexport const KNOWN_PROVIDER_MAP = Object.freeze(Object.fromEntries(KNOWN_PROVIDERS.map((Provider) => [Provider.id, Provider])));\nconst KNOWN_PROVIDER_IDS_DESC = Object.freeze(Object.keys(KNOWN_PROVIDER_MAP).sort((A, B) => B.length - A.length));\nconst LEGACY_ALIAS_MAP = Object.freeze({\n claude: \"claude\",\n cbai: \"codebuddy\"\n});\nexport function providerById(Id) {\n return KNOWN_PROVIDER_MAP[Id];\n}\nexport function isKnownProvider(Id) {\n return Id in KNOWN_PROVIDER_MAP;\n}\nexport function providerBaseId(Id) {\n return (KNOWN_PROVIDER_IDS_DESC.find((Candidate) => Id === Candidate || Id.startsWith(`${Candidate}_`) || Id.startsWith(`${Candidate}-`)) ??\n Id.split(\"_\")[0]?.split(\"-\")[0] ??\n Id);\n}\nexport function isProviderBaseId(Id, BaseId) {\n return Id === BaseId || Id.startsWith(`${BaseId}_`) || Id.startsWith(`${BaseId}-`);\n}\nexport function providerAlias(BaseId) {\n return KNOWN_PROVIDER_MAP[BaseId]?.alias ?? BaseId;\n}\nexport function providerTypeForAlias(Alias) {\n if (Alias in LEGACY_ALIAS_MAP)\n return LEGACY_ALIAS_MAP[Alias];\n return KNOWN_PROVIDERS.find((P) => P.alias === Alias || P.id === Alias)?.id ?? null;\n}\nexport function getProviderWebsiteUrl(ProviderId, DefaultBaseUrl) {\n const BaseId = providerBaseId(ProviderId);\n const Metadata = KNOWN_PROVIDER_MAP[ProviderId] ?? KNOWN_PROVIDER_MAP[BaseId];\n if (Metadata?.web_url)\n return Metadata.web_url;\n if (!DefaultBaseUrl)\n return undefined;\n try {\n return new URL(DefaultBaseUrl).origin;\n }\n catch {\n return undefined;\n }\n}\n","import { KNOWN_PROVIDERS } from \"./providers.js\";\nexport const DEFAULT_PROVIDERS = Object.freeze(KNOWN_PROVIDERS.map(({ alias: _alias, ...seed }) => seed));\nexport const DEFAULT_PROVIDER_MAP = Object.freeze(Object.fromEntries(DEFAULT_PROVIDERS.map((seed) => [seed.id, seed])));\nexport const SEED_MARKER = \"__seed__\";\nexport function isSeedProvider(row) {\n return row.providerSpecificData?.[SEED_MARKER] === \"true\";\n}\n","export const GLOBAL_VERSION = \"0.1.3\";\nexport const APP_VERSION = GLOBAL_VERSION;\nexport const API_VERSION = GLOBAL_VERSION;\nexport const CLI_VERSION = GLOBAL_VERSION;\n// Backward-compat aliases\nexport const SROUTER_VERSION = GLOBAL_VERSION;\nexport const SROUTER_VERSION_TAG = `v${GLOBAL_VERSION}`;\n","import {\n intro,\n outro,\n spinner,\n text,\n select,\n multiselect,\n isCancel,\n cancel,\n note\n} from \"@clack/prompts\";\nimport { getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { getSystemInfo } from \"../lib/platform.js\";\nimport { checkServerHealth, fetchAvailableModels } from \"../lib/srouterClient.js\";\nimport { pc, showHeader } from \"../lib/ui.js\";\n\nexport interface SetupWizardOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n}\n\nexport async function setupCommand(options: SetupWizardOptions = {}): Promise<void> {\n showHeader();\n const sysInfo = getSystemInfo();\n intro(\n `${pc.bold(pc.magenta(\"SRouter AI Coding Setup Wizard\"))} ${pc.gray(`(${sysInfo.displayName})`)}`\n );\n\n const savedConfig = await defaultStore.loadConfig();\n let baseUrl =\n options.url ||\n process.env.SROUTER_BASE_URL ||\n savedConfig.defaultBaseUrl ||\n \"http://localhost:3000/v1\";\n let apiKey = options.key || process.env.SROUTER_API_KEY || savedConfig.defaultApiKey;\n let selectedModel = options.model;\n let opusModel = options.opusModel;\n let sonnetModel = options.sonnetModel;\n let haikuModel = options.haikuModel;\n\n // Step 1: Detect SRouter Server\n const s = spinner();\n s.start(`Checking SRouter gateway connectivity at ${pc.cyan(baseUrl)}...`);\n\n let health = await checkServerHealth(baseUrl, apiKey);\n let availableModels: string[] = [];\n\n if (health.healthy) {\n s.stop(\n pc.green(\n `SRouter is ONLINE (${health.latencyMs}ms, ${health.modelsCount} models found)`\n )\n );\n availableModels = await fetchAvailableModels(baseUrl, apiKey);\n } else {\n s.stop(pc.yellow(`Could not reach SRouter at ${baseUrl} (${health.error || \"offline\"})`));\n\n const urlInput = await text({\n message: \"Enter SRouter Gateway Base URL:\",\n initialValue: baseUrl,\n validate(value) {\n const val = typeof value === \"string\" ? value.trim() : \"\";\n if (!val) return \"Base URL cannot be empty\";\n if (!val.startsWith(\"http://\") && !val.startsWith(\"https://\")) {\n return \"URL must start with http:// or https://\";\n }\n }\n });\n\n if (isCancel(urlInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n const urlStr = typeof urlInput === \"string\" ? urlInput.trim() : baseUrl;\n if (urlStr) {\n baseUrl = urlStr;\n }\n\n s.start(`Connecting to ${pc.cyan(baseUrl)}...`);\n health = await checkServerHealth(baseUrl, apiKey);\n if (health.healthy) {\n s.stop(pc.green(`Connected to SRouter (${health.modelsCount} models found)`));\n availableModels = await fetchAvailableModels(baseUrl, apiKey);\n } else {\n s.stop(pc.yellow(`Proceeding with offline / unverified endpoint: ${baseUrl}`));\n }\n }\n\n // Step 2: Prompt for API Key if not set\n if (!apiKey) {\n const keyInput = await text({\n message:\n \"Enter SRouter API Key (press Enter to skip if running in local auth-free mode):\",\n placeholder: \"sk-...\"\n });\n\n if (isCancel(keyInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n const keyStr = typeof keyInput === \"string\" ? keyInput.trim() : \"\";\n if (keyStr) {\n apiKey = keyStr;\n if (availableModels.length === 0) {\n availableModels = await fetchAvailableModels(baseUrl, apiKey);\n }\n }\n }\n\n // Step 3: Tool Selection Checklist (Multi-select)\n const adapters = getAllAdapters();\n const adapterStatuses = await Promise.all(adapters.map((a) => a.getStatus()));\n\n const toolOptions = adapters.map((adapter, idx) => {\n const st = adapterStatuses[idx];\n let label = adapter.name;\n let hint = \"\";\n\n if (st.linked) {\n label = `${adapter.name} [✔ CONFIGURED]`;\n const modelPart = st.currentModel ? `, Model: ${st.currentModel}` : \"\";\n hint = `Active on ${st.currentBaseUrl}${modelPart} (Select to update settings)`;\n } else if (st.installed) {\n label = `${adapter.name} [○ NOT CONFIGURED]`;\n hint = `${adapter.description} (Installed on system)`;\n } else {\n label = `${adapter.name} [✖ NOT INSTALLED]`;\n hint = `${adapter.description} (Executable not found in PATH)`;\n }\n\n return {\n value: adapter.id,\n label,\n hint\n };\n });\n\n const selectedTools = await multiselect({\n message:\n \"Select AI coding tools to connect to SRouter (Use Space to select, Enter to confirm):\",\n options: toolOptions,\n required: false\n });\n\n if (isCancel(selectedTools)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n const toolsToConfigure = Array.isArray(selectedTools) ? (selectedTools as string[]) : [];\n\n if (toolsToConfigure.length === 0) {\n await defaultStore.saveConfig({\n defaultBaseUrl: baseUrl,\n defaultApiKey: apiKey,\n lastSetupAt: Date.now()\n });\n\n note(\n `Base URL: ${pc.cyan(baseUrl)}\\n${apiKey ? `API Key: ${pc.gray(\"••••••••\" + apiKey.slice(-4))}\\n` : \"\"}\\n${pc.yellow(\"No tools selected for configuration.\")}`,\n \"Configuration Summary\"\n );\n outro(\n pc.bold(\n pc.green(\n \"✔ Gateway settings saved. You can run 'srouter setup' or 'srouter link <tool>' at any time.\"\n )\n )\n );\n return;\n }\n\n // Step 4: Model Selection\n if (!selectedModel) {\n const currentDefault = savedConfig.defaultModel || \"claude-3-7-sonnet\";\n\n if (availableModels.length > 0) {\n const defaultHint = `(${currentDefault}) - all ${availableModels.length} models are automatically registered in OpenCode`;\n const modelChoice = await select({\n message: \"Select default model for tools:\",\n options: [\n {\n value: \"__skip__\",\n label: `Use default / Skip ${pc.gray(defaultHint)}`\n },\n {\n value: \"__popular__\",\n label: \"Choose from popular models (Claude 3.7, GPT-4o, Gemini 2.5, DeepSeek R1)...\"\n },\n {\n value: \"__custom__\",\n label: \"Enter model ID manually...\"\n },\n {\n value: \"__browse__\",\n label: `Browse full model list (${availableModels.length} models)...`\n }\n ]\n });\n\n if (isCancel(modelChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n if (modelChoice === \"__skip__\") {\n selectedModel = currentDefault;\n } else if (modelChoice === \"__popular__\") {\n const popularChoice = await select({\n message: \"Choose a popular model:\",\n options: [\n { value: \"claude-3-7-sonnet\", label: \"Claude 3.7 Sonnet (Recommended)\" },\n { value: \"claude-3-5-sonnet\", label: \"Claude 3.5 Sonnet\" },\n { value: \"gpt-4o\", label: \"GPT-4o (OpenAI)\" },\n { value: \"gemini-2.5-pro\", label: \"Gemini 2.5 Pro (Google)\" },\n { value: \"gemini-2.5-flash\", label: \"Gemini 2.5 Flash (Fast)\" },\n { value: \"deepseek-r1\", label: \"DeepSeek R1 (Reasoning)\" },\n { value: \"combo/flagship\", label: \"Combo: Flagship Cascade\" },\n { value: \"__custom__\", label: \"Other / Custom ID...\" }\n ]\n });\n if (isCancel(popularChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n if (popularChoice === \"__custom__\") {\n const customModelInput = await text({\n message: \"Enter custom model ID:\",\n placeholder: currentDefault\n });\n if (isCancel(customModelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const customModelStr =\n typeof customModelInput === \"string\" ? customModelInput.trim() : \"\";\n selectedModel = customModelStr || currentDefault;\n } else {\n selectedModel = popularChoice as string;\n }\n } else if (modelChoice === \"__custom__\") {\n const customModelInput = await text({\n message: \"Enter custom model ID:\",\n placeholder: currentDefault\n });\n if (isCancel(customModelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const customModelStr =\n typeof customModelInput === \"string\" ? customModelInput.trim() : \"\";\n selectedModel = customModelStr || currentDefault;\n } else if (modelChoice === \"__browse__\") {\n const modelOptions = availableModels.map((m) => ({\n value: m,\n label: m\n }));\n const browseChoice = await select({\n message: `Select from ${availableModels.length} available models:`,\n options: [\n ...modelOptions,\n { value: \"__custom__\", label: \"Custom model name...\" }\n ]\n });\n if (isCancel(browseChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n if (browseChoice === \"__custom__\") {\n const customModelInput = await text({\n message: \"Enter custom model ID:\",\n placeholder: currentDefault\n });\n if (isCancel(customModelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const customModelStr =\n typeof customModelInput === \"string\" ? customModelInput.trim() : \"\";\n selectedModel = customModelStr || currentDefault;\n } else {\n selectedModel = browseChoice as string;\n }\n }\n } else {\n const modelInput = await text({\n message: \"Enter default model ID for tools (optional, press Enter for default):\",\n placeholder: \"claude-3-7-sonnet\"\n });\n if (isCancel(modelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const modelStr = typeof modelInput === \"string\" ? modelInput.trim() : \"\";\n selectedModel = modelStr || undefined;\n }\n }\n\n // Step 4.1: Claude Code Specific Models (Opus, Sonnet, Haiku)\n if (\n toolsToConfigure.includes(\"claude\") &&\n !options.opusModel &&\n !options.sonnetModel &&\n !options.haikuModel\n ) {\n const configTiersChoice = await select({\n message: \"Configure Claude Code specific model tiers (Opus, Sonnet, Haiku)?\",\n options: [\n {\n value: \"auto\",\n label: \"Use general default model / skip\",\n hint: selectedModel || \"Default Claude models\"\n },\n {\n value: \"custom\",\n label: \"Customize per tier (Opus, Sonnet, Haiku)\"\n }\n ]\n });\n\n if (isCancel(configTiersChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n if (configTiersChoice === \"custom\") {\n const pickTierModel = async (\n tierName: string,\n envVar: string,\n defaultVal?: string\n ): Promise<string | undefined> => {\n if (availableModels.length > 0) {\n const choice = await select({\n message: `Select model for ${tierName} (${envVar}):`,\n options: [\n { value: \"__skip__\", label: \"Skip (Use default)\" },\n ...availableModels.map((m) => ({ value: m, label: m })),\n { value: \"__custom__\", label: \"Custom model name...\" }\n ]\n });\n if (isCancel(choice)) return undefined;\n if (choice === \"__skip__\") return undefined;\n if (choice === \"__custom__\") {\n const customInput = await text({\n message: `Enter custom model ID for ${tierName}:`,\n placeholder: defaultVal || \"claude-3-7-sonnet\"\n });\n if (isCancel(customInput)) return undefined;\n const val = typeof customInput === \"string\" ? customInput.trim() : \"\";\n return val || undefined;\n }\n return choice as string;\n }\n\n const customInput = await text({\n message: `Enter model ID for ${tierName} (${envVar}, optional):`,\n placeholder: defaultVal || \"claude-3-7-sonnet\"\n });\n if (isCancel(customInput)) return undefined;\n const val = typeof customInput === \"string\" ? customInput.trim() : \"\";\n return val || undefined;\n };\n\n const pickedSonnet = await pickTierModel(\n \"Sonnet\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n selectedModel || \"claude-3-7-sonnet\"\n );\n if (pickedSonnet !== undefined) {\n sonnetModel = pickedSonnet;\n }\n\n const pickedOpus = await pickTierModel(\n \"Opus\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"claude-3-opus-20240229\"\n );\n if (pickedOpus !== undefined) {\n opusModel = pickedOpus;\n }\n\n const pickedHaiku = await pickTierModel(\n \"Haiku\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"claude-3-5-haiku-20241022\"\n );\n if (pickedHaiku !== undefined) {\n haikuModel = pickedHaiku;\n }\n }\n }\n\n // Step 5: Execute Linking\n s.start(\"Applying SRouter configurations...\");\n const linkResults: { name: string; path: string; backup?: string }[] = [];\n\n for (const toolId of toolsToConfigure) {\n const adapter = adapters.find((a) => a.id === toolId);\n if (!adapter) continue;\n\n const result = await adapter.link({\n baseUrl,\n apiKey,\n model: selectedModel,\n opusModel: toolId === \"claude\" ? opusModel : undefined,\n sonnetModel: toolId === \"claude\" ? sonnetModel : undefined,\n haikuModel: toolId === \"claude\" ? haikuModel : undefined,\n availableModels\n });\n\n linkResults.push({\n name: adapter.name,\n path: result.modifiedPath,\n backup: result.backupPath\n });\n }\n\n await defaultStore.saveConfig({\n defaultBaseUrl: baseUrl,\n defaultApiKey: apiKey,\n defaultModel: selectedModel,\n defaultOpusModel: opusModel,\n defaultSonnetModel: sonnetModel,\n defaultHaikuModel: haikuModel,\n lastSetupAt: Date.now()\n });\n\n s.stop(pc.green(\"All configurations applied successfully!\"));\n\n // Step 6: Summary Notes\n const summaryLines = [\n `OS / System: ${pc.cyan(sysInfo.displayName)}`,\n `Base URL: ${pc.cyan(baseUrl)}`,\n ...(apiKey ? [`API Key: ${pc.gray(\"••••••••\" + apiKey.slice(-4))}`] : []),\n ...(selectedModel ? [`Model: ${pc.cyan(selectedModel)}`] : []),\n ...(opusModel ? [`Opus: ${pc.cyan(opusModel)}`] : []),\n ...(sonnetModel ? [`Sonnet: ${pc.cyan(sonnetModel)}`] : []),\n ...(haikuModel ? [`Haiku: ${pc.cyan(haikuModel)}`] : []),\n \"\",\n pc.bold(\"Configured Tools:\")\n ];\n\n for (const r of linkResults) {\n summaryLines.push(` ✔ ${pc.bold(r.name)} -> ${pc.gray(r.path)}`);\n if (r.backup) {\n summaryLines.push(` ${pc.gray(\"Backup:\")} ${pc.gray(r.backup)}`);\n }\n }\n\n note(summaryLines.join(\"\\n\"), \"Configuration Summary\");\n\n outro(\n pc.bold(pc.green(\"✔ SRouter is connected! You can now use your AI coding tools directly.\"))\n );\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { BackupEntry, CliConfig } from \"../types/index.js\";\n\nexport const DEFAULT_CLI_CONFIG: CliConfig = {\n defaultBaseUrl: \"http://localhost:3000/v1\",\n backups: []\n};\n\nexport class ConfigStore {\n private baseDir: string;\n private configPath: string;\n private backupsDir: string;\n\n constructor(customBaseDir?: string) {\n this.baseDir = customBaseDir || path.join(os.homedir(), \".srouter\");\n this.configPath = path.join(this.baseDir, \"cli.json\");\n this.backupsDir = path.join(this.baseDir, \"backups\");\n }\n\n private async ensureDirs(): Promise<void> {\n await fs.mkdir(this.baseDir, { recursive: true });\n await fs.mkdir(this.backupsDir, { recursive: true });\n }\n\n async loadConfig(): Promise<CliConfig> {\n try {\n const raw = await fs.readFile(this.configPath, \"utf-8\");\n const data = JSON.parse(raw);\n return {\n ...DEFAULT_CLI_CONFIG,\n ...data,\n backups: Array.isArray(data?.backups) ? data.backups : []\n };\n } catch {\n return { ...DEFAULT_CLI_CONFIG };\n }\n }\n\n async saveConfig(partial: Partial<CliConfig>): Promise<CliConfig> {\n await this.ensureDirs();\n const current = await this.loadConfig();\n const updated: CliConfig = {\n ...current,\n ...partial,\n backups: partial.backups ?? current.backups\n };\n await fs.writeFile(this.configPath, JSON.stringify(updated, null, 4), \"utf-8\");\n return updated;\n }\n\n async createBackup(toolId: string, originalPath: string): Promise<string | undefined> {\n try {\n await fs.access(originalPath);\n } catch {\n return undefined;\n }\n\n await this.ensureDirs();\n const timestamp = Date.now();\n const ext = path.extname(originalPath) || \".json\";\n const backupFileName = `${toolId}-${timestamp}${ext}`;\n const backupPath = path.join(this.backupsDir, backupFileName);\n\n await fs.copyFile(originalPath, backupPath);\n\n const config = await this.loadConfig();\n const entry: BackupEntry = {\n toolId,\n originalPath,\n backupPath,\n timestamp\n };\n\n await this.saveConfig({\n backups: [...config.backups, entry]\n });\n\n return backupPath;\n }\n\n async getLatestBackup(toolId: string): Promise<BackupEntry | undefined> {\n const config = await this.loadConfig();\n const entries = config.backups.filter((b) => b.toolId === toolId);\n if (entries.length === 0) return undefined;\n return entries.sort((a, b) => b.timestamp - a.timestamp)[0];\n }\n\n async restoreLatestBackup(toolId: string): Promise<boolean> {\n const latest = await this.getLatestBackup(toolId);\n if (!latest) {\n return false;\n }\n\n try {\n await fs.mkdir(path.dirname(latest.originalPath), { recursive: true });\n await fs.copyFile(latest.backupPath, latest.originalPath);\n\n const config = await this.loadConfig();\n const updatedBackups = config.backups.filter((b) => b.backupPath !== latest.backupPath);\n await this.saveConfig({ backups: updatedBackups });\n\n await fs.rm(latest.backupPath, { force: true });\n return true;\n } catch {\n return false;\n }\n }\n}\n\nexport const defaultStore = new ConfigStore();\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { AbstractToolAdapter } from \"./base.js\";\nimport type { LinkResult, ToolConfigContext, ToolStatus } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\nimport { getClaudeConfigPath, isExecutableInPath } from \"../lib/platform.js\";\n\nfunction parseJsonSafe(content: string): Record<string, any> {\n try {\n const clean = content\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/,\\s*([\\]}])/g, \"$1\");\n return JSON.parse(clean);\n } catch {\n try {\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n}\n\nexport class ClaudeAdapter extends AbstractToolAdapter {\n readonly id = \"claude\";\n readonly name = \"Claude Code\";\n readonly description = \"Anthropic's official CLI tool for agentic coding\";\n\n private customConfigPath?: string;\n\n constructor(store: ConfigStore = defaultStore, customConfigPath?: string) {\n super(store);\n this.customConfigPath = customConfigPath;\n }\n\n getConfigPath(): string {\n if (this.customConfigPath) {\n return this.customConfigPath;\n }\n return getClaudeConfigPath();\n }\n\n async isInstalled(): Promise<boolean> {\n return isExecutableInPath(\"claude\");\n }\n\n async getStatus(): Promise<ToolStatus> {\n const configPath = this.getConfigPath();\n const installed = await this.isInstalled();\n\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const parsed = parseJsonSafe(raw);\n const baseUrl =\n parsed.env?.ANTHROPIC_BASE_URL ||\n parsed.ANTHROPIC_BASE_URL ||\n parsed.baseUrl ||\n undefined;\n const model =\n parsed.env?.ANTHROPIC_DEFAULT_MODEL ||\n parsed.env?.ANTHROPIC_MODEL ||\n parsed.model ||\n parsed.ANTHROPIC_MODEL ||\n undefined;\n const opusModel =\n parsed.env?.ANTHROPIC_DEFAULT_OPUS_MODEL ||\n parsed.ANTHROPIC_DEFAULT_OPUS_MODEL ||\n parsed.env?.ANTHROPIC_OPUS_MODEL ||\n parsed.ANTHROPIC_OPUS_MODEL ||\n undefined;\n const sonnetModel =\n parsed.env?.ANTHROPIC_DEFAULT_SONNET_MODEL ||\n parsed.ANTHROPIC_DEFAULT_SONNET_MODEL ||\n parsed.env?.ANTHROPIC_SONNET_MODEL ||\n parsed.ANTHROPIC_SONNET_MODEL ||\n undefined;\n const haikuModel =\n parsed.env?.ANTHROPIC_DEFAULT_HAIKU_MODEL ||\n parsed.ANTHROPIC_DEFAULT_HAIKU_MODEL ||\n parsed.env?.ANTHROPIC_HAIKU_MODEL ||\n parsed.ANTHROPIC_HAIKU_MODEL ||\n undefined;\n const linked = Boolean(\n baseUrl &&\n (baseUrl.includes(\"localhost\") ||\n baseUrl.includes(\"127.0.0.1\") ||\n baseUrl.includes(\"srouter\"))\n );\n\n return {\n id: this.id,\n name: this.name,\n installed,\n linked,\n configPath,\n currentBaseUrl: baseUrl,\n currentModel: model,\n currentOpusModel: opusModel,\n currentSonnetModel: sonnetModel,\n currentHaikuModel: haikuModel\n };\n } catch {\n return {\n id: this.id,\n name: this.name,\n installed,\n linked: false,\n configPath\n };\n }\n }\n\n async link(context: ToolConfigContext): Promise<LinkResult> {\n const configPath = this.getConfigPath();\n const backupPath = context.dryRun\n ? undefined\n : await this.store.createBackup(this.id, configPath);\n\n let data: Record<string, any> = {};\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n data = parseJsonSafe(raw);\n } catch {\n data = {};\n }\n\n const defaultModel = context.model || \"claude-3-7-sonnet\";\n const apiKey = context.apiKey || \"sk-local-srouter\";\n // Anthropic SDK automatically appends /v1/messages, so base url should be origin (e.g. http://localhost:3000)\n const anthropicBaseUrl = context.baseUrl.replace(/\\/v1\\/?$/, \"\");\n\n // Claude Code v2 settings.json uses \"env\" object\n data.env = data.env || {};\n data.env.ANTHROPIC_BASE_URL = anthropicBaseUrl;\n data.env.ANTHROPIC_API_KEY = apiKey;\n data.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n data.env.ANTHROPIC_DEFAULT_MODEL = defaultModel;\n data.env.ANTHROPIC_MODEL = defaultModel;\n data.env.ANTHROPIC_DEFAULT_OPUS_MODEL = context.opusModel || defaultModel;\n data.env.ANTHROPIC_DEFAULT_SONNET_MODEL = context.sonnetModel || defaultModel;\n data.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = context.haikuModel || defaultModel;\n\n // Clean out legacy SCODEX or old vendor keys if present\n if (data.env.ANTHROPIC_DEFAULT_FABLE_MODEL) {\n delete data.env.ANTHROPIC_DEFAULT_FABLE_MODEL;\n }\n\n // Top-level fallbacks for older Claude Code versions\n data.ANTHROPIC_BASE_URL = anthropicBaseUrl;\n data.ANTHROPIC_API_KEY = apiKey;\n data.model = defaultModel;\n data.ANTHROPIC_DEFAULT_OPUS_MODEL = context.opusModel || defaultModel;\n data.ANTHROPIC_DEFAULT_SONNET_MODEL = context.sonnetModel || defaultModel;\n data.ANTHROPIC_DEFAULT_HAIKU_MODEL = context.haikuModel || defaultModel;\n\n if (!context.dryRun) {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(data, null, 2), \"utf-8\");\n\n // Also keep ~/.claude.json in sync if it exists or configPath is settings.json\n const homeClaudeJson = path.join(os.homedir(), \".claude.json\");\n if (configPath !== homeClaudeJson) {\n try {\n let rootData: Record<string, any> = {};\n try {\n rootData = parseJsonSafe(await fs.readFile(homeClaudeJson, \"utf-8\"));\n } catch {\n rootData = {};\n }\n rootData.ANTHROPIC_BASE_URL = context.baseUrl;\n rootData.ANTHROPIC_API_KEY = apiKey;\n rootData.model = defaultModel;\n rootData.ANTHROPIC_DEFAULT_OPUS_MODEL = context.opusModel || defaultModel;\n rootData.ANTHROPIC_DEFAULT_SONNET_MODEL = context.sonnetModel || defaultModel;\n rootData.ANTHROPIC_DEFAULT_HAIKU_MODEL = context.haikuModel || defaultModel;\n await fs.writeFile(homeClaudeJson, JSON.stringify(rootData, null, 2), \"utf-8\");\n } catch {\n // Ignore secondary file sync error\n }\n }\n }\n\n return {\n backupPath,\n modifiedPath: configPath\n };\n }\n\n async unlink(): Promise<boolean> {\n const restored = await this.store.restoreLatestBackup(this.id);\n if (restored) {\n return true;\n }\n\n const configPath = this.getConfigPath();\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const data = parseJsonSafe(raw);\n delete data.ANTHROPIC_BASE_URL;\n delete data.ANTHROPIC_API_KEY;\n delete data.ANTHROPIC_DEFAULT_OPUS_MODEL;\n delete data.ANTHROPIC_DEFAULT_SONNET_MODEL;\n delete data.ANTHROPIC_DEFAULT_HAIKU_MODEL;\n delete data.model;\n if (data.env && typeof data.env === \"object\") {\n delete data.env.ANTHROPIC_BASE_URL;\n delete data.env.ANTHROPIC_API_KEY;\n delete data.env.ANTHROPIC_AUTH_TOKEN;\n delete data.env.ANTHROPIC_DEFAULT_MODEL;\n delete data.env.ANTHROPIC_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_OPUS_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_SONNET_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_FABLE_MODEL;\n }\n await fs.writeFile(configPath, JSON.stringify(data, null, 2), \"utf-8\");\n return true;\n } catch {\n return false;\n }\n }\n\n getEnv(context: ToolConfigContext): Record<string, string> {\n const defaultModel = context.model || \"claude-3-7-sonnet\";\n const apiKey = context.apiKey || \"sk-local-srouter\";\n const anthropicBaseUrl = context.baseUrl.replace(/\\/v1\\/?$/, \"\");\n\n const env: Record<string, string> = {\n ANTHROPIC_BASE_URL: anthropicBaseUrl,\n ANTHROPIC_API_KEY: apiKey,\n ANTHROPIC_AUTH_TOKEN: apiKey,\n ANTHROPIC_DEFAULT_MODEL: defaultModel,\n ANTHROPIC_MODEL: defaultModel,\n ANTHROPIC_DEFAULT_OPUS_MODEL: context.opusModel || defaultModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: context.sonnetModel || defaultModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: context.haikuModel || defaultModel\n };\n return env;\n }\n}\n","import type { BaseToolAdapter, LinkResult, ToolConfigContext, ToolStatus } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\n\nexport abstract class AbstractToolAdapter implements BaseToolAdapter {\n abstract readonly id: string;\n abstract readonly name: string;\n abstract readonly description: string;\n\n protected store: ConfigStore;\n\n constructor(store: ConfigStore = defaultStore) {\n this.store = store;\n }\n\n abstract getConfigPath(): string;\n abstract isInstalled(): Promise<boolean>;\n abstract getStatus(): Promise<ToolStatus>;\n abstract link(context: ToolConfigContext): Promise<LinkResult>;\n abstract unlink(): Promise<boolean>;\n abstract getEnv(context: ToolConfigContext): Record<string, string>;\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\nexport type PlatformType = \"windows\" | \"macos\" | \"linux\" | \"unknown\";\nexport type ShellType = \"bash\" | \"zsh\" | \"fish\" | \"powershell\" | \"cmd\";\n\nexport interface SystemInfo {\n platform: PlatformType;\n osType: string;\n osRelease: string;\n arch: string;\n displayName: string;\n homeDir: string;\n detectedShell: ShellType;\n}\n\nexport function getPlatform(): PlatformType {\n const p = process.platform;\n if (p === \"win32\") return \"windows\";\n if (p === \"darwin\") return \"macos\";\n if (p === \"linux\") return \"linux\";\n return \"unknown\";\n}\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\nexport function isMacOS(): boolean {\n return process.platform === \"darwin\";\n}\n\nexport function isLinux(): boolean {\n return process.platform === \"linux\";\n}\n\nexport function getOsDisplayName(): string {\n const p = getPlatform();\n const arch = os.arch();\n const rel = os.release();\n\n switch (p) {\n case \"macos\":\n return `macOS (${arch === \"arm64\" ? \"Apple Silicon\" : arch}) [Darwin ${rel}]`;\n case \"windows\":\n return `Windows (${arch}) [NT ${rel}]`;\n case \"linux\":\n return `Linux (${arch}) [${rel}]`;\n default:\n return `${process.platform} (${arch})`;\n }\n}\n\nexport function detectShell(): ShellType {\n const shellEnv = process.env.SHELL?.toLowerCase() || \"\";\n if (shellEnv.includes(\"fish\")) return \"fish\";\n if (shellEnv.includes(\"zsh\")) return \"zsh\";\n if (shellEnv.includes(\"bash\")) return \"bash\";\n\n if (isWindows()) {\n if (process.env.PSModulePath || process.env.POWERSHELL_DISTRIBUTION_CHANNEL) {\n return \"powershell\";\n }\n return \"cmd\";\n }\n\n return \"bash\";\n}\n\nexport function getSystemInfo(): SystemInfo {\n return {\n platform: getPlatform(),\n osType: os.type(),\n osRelease: os.release(),\n arch: os.arch(),\n displayName: getOsDisplayName(),\n homeDir: os.homedir(),\n detectedShell: detectShell()\n };\n}\n\nexport async function isExecutableInPath(command: string): Promise<boolean> {\n const lookupCmd = isWindows() ? `where.exe ${command}` : `which ${command}`;\n try {\n await execAsync(lookupCmd);\n return true;\n } catch {\n if (isWindows()) {\n try {\n await execAsync(`where ${command}`);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n }\n}\n\nexport function getClaudeConfigPath(): string {\n const home = os.homedir();\n const candidatePaths: string[] = [];\n\n // Optional environment variable override\n if (process.env.CLAUDE_CONFIG_DIR) {\n candidatePaths.push(path.join(process.env.CLAUDE_CONFIG_DIR, \"settings.json\"));\n candidatePaths.push(path.join(process.env.CLAUDE_CONFIG_DIR, \"config.json\"));\n }\n\n // Claude Code v2 settings.json\n candidatePaths.push(path.join(home, \".claude\", \"settings.json\"));\n candidatePaths.push(path.join(home, \".config\", \"claude\", \"settings.json\"));\n\n // Standard ~/.claude.json across all platforms\n candidatePaths.push(path.join(home, \".claude.json\"));\n\n // Platform-specific secondary paths\n if (isWindows()) {\n const appData = process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\");\n candidatePaths.push(path.join(appData, \"Claude\", \"settings.json\"));\n candidatePaths.push(path.join(appData, \"Claude\", \"config.json\"));\n } else {\n candidatePaths.push(path.join(home, \".claude\", \"config.json\"));\n candidatePaths.push(path.join(home, \".config\", \"claude\", \"config.json\"));\n }\n\n for (const p of candidatePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n\n if (fs.existsSync(path.join(home, \".claude\"))) {\n return path.join(home, \".claude\", \"settings.json\");\n }\n\n // Default standard config file\n return path.join(home, \".claude\", \"settings.json\");\n}\n\nexport function getOpenCodeConfigPath(): string {\n const home = os.homedir();\n const candidatePaths: string[] = [];\n\n // Local directory config\n candidatePaths.push(path.join(process.cwd(), \"opencode.jsonc\"));\n candidatePaths.push(path.join(process.cwd(), \"opencode.json\"));\n\n if (isWindows()) {\n const appData = process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\");\n candidatePaths.push(path.join(appData, \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(appData, \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(appData, \"opencode\", \"config.json\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"config.json\"));\n } else if (isMacOS()) {\n candidatePaths.push(\n path.join(home, \"Library\", \"Application Support\", \"opencode\", \"opencode.jsonc\")\n );\n candidatePaths.push(\n path.join(home, \"Library\", \"Application Support\", \"opencode\", \"opencode.json\")\n );\n candidatePaths.push(\n path.join(home, \"Library\", \"Application Support\", \"opencode\", \"config.json\")\n );\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"config.json\"));\n } else {\n const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, \".config\");\n candidatePaths.push(path.join(xdgConfig, \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(xdgConfig, \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(xdgConfig, \"opencode\", \"config.json\"));\n }\n\n candidatePaths.push(path.join(home, \".opencode.jsonc\"));\n candidatePaths.push(path.join(home, \".opencode.json\"));\n\n for (const p of candidatePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n\n if (isWindows()) {\n const appData = process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\");\n return path.join(appData, \"opencode\", \"opencode.jsonc\");\n }\n\n const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, \".config\");\n return path.join(xdgConfig, \"opencode\", \"opencode.jsonc\");\n}\n\nexport function formatShellExport(key: string, value: string, shell: ShellType): string {\n switch (shell) {\n case \"powershell\":\n return `$env:${key} = \"${value}\"`;\n case \"cmd\":\n return `set ${key}=${value}`;\n case \"fish\":\n return `set -gx ${key} \"${value}\";`;\n case \"bash\":\n case \"zsh\":\n default:\n return `export ${key}=\"${value}\"`;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { AbstractToolAdapter } from \"./base.js\";\nimport type { LinkResult, ToolConfigContext, ToolStatus } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\nimport { getOpenCodeConfigPath, isExecutableInPath } from \"../lib/platform.js\";\nimport { fetchAvailableModels } from \"../lib/srouterClient.js\";\n\nexport const DEFAULT_SROUTER_MODELS: Array<{ id: string; name: string }> = [\n { id: \"anthropic/claude-3-7-sonnet\", name: \"Claude 3.7 Sonnet (Anthropic)\" },\n { id: \"claude-3-7-sonnet\", name: \"Claude 3.7 Sonnet\" },\n { id: \"anthropic/claude-3-5-sonnet\", name: \"Claude 3.5 Sonnet (Anthropic)\" },\n { id: \"claude-3-5-sonnet\", name: \"Claude 3.5 Sonnet\" },\n { id: \"anthropic/claude-3-5-haiku\", name: \"Claude 3.5 Haiku (Anthropic)\" },\n { id: \"openai_codex/gpt-4o\", name: \"GPT-4o (OpenAI Codex)\" },\n { id: \"gpt-4o\", name: \"GPT-4o\" },\n { id: \"openai_codex/gpt-4.5-preview\", name: \"GPT-4.5 Preview (OpenAI Codex)\" },\n { id: \"openai_codex/o3-mini\", name: \"o3-mini (OpenAI Codex)\" },\n { id: \"openai_codex/o1\", name: \"o1 (OpenAI Codex)\" },\n { id: \"antigravity/gemini-2.5-pro\", name: \"Gemini 2.5 Pro (Antigravity)\" },\n { id: \"gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"antigravity/gemini-2.5-flash\", name: \"Gemini 2.5 Flash (Antigravity)\" },\n { id: \"gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"kiro/claude-3-7-sonnet\", name: \"Claude 3.7 Sonnet (Kiro)\" },\n { id: \"qoder/qwen-2.5-coder-32b\", name: \"Qwen 2.5 Coder 32B (Qoder)\" },\n { id: \"deepseek/deepseek-r1\", name: \"DeepSeek R1\" },\n { id: \"deepseek/deepseek-v3\", name: \"DeepSeek V3\" },\n { id: \"combo/flagship\", name: \"Combo: Flagship Cascade\" },\n { id: \"combo/fast\", name: \"Combo: Fast Fallback\" }\n];\n\nexport function formatModelDisplayName(modelId: string): string {\n const knownNames: Record<string, string> = {\n \"claude-3-7-sonnet\": \"Claude 3.7 Sonnet\",\n \"claude-3-5-sonnet\": \"Claude 3.5 Sonnet\",\n \"claude-3-5-haiku\": \"Claude 3.5 Haiku\",\n \"claude-3-opus\": \"Claude 3 Opus\",\n \"gpt-4o\": \"GPT-4o\",\n \"gpt-4o-mini\": \"GPT-4o Mini\",\n \"gpt-4.5-preview\": \"GPT-4.5 Preview\",\n \"o3-mini\": \"o3-mini\",\n o1: \"o1\",\n \"o1-preview\": \"o1 Preview\",\n \"gemini-2.5-pro\": \"Gemini 2.5 Pro\",\n \"gemini-2.5-flash\": \"Gemini 2.5 Flash\",\n \"gemini-2.0-flash\": \"Gemini 2.0 Flash\",\n \"deepseek-r1\": \"DeepSeek R1\",\n \"deepseek-v3\": \"DeepSeek V3\",\n \"deepseek-coder\": \"DeepSeek Coder\",\n \"qwen-2.5-coder-32b\": \"Qwen 2.5 Coder 32B\",\n \"qwen-2.5-72b-instruct\": \"Qwen 2.5 72B\",\n \"qwen3-max\": \"Qwen 3 Max\",\n flagship: \"Flagship Cascade\",\n fast: \"Fast Fallback\"\n };\n\n if (knownNames[modelId]) {\n return knownNames[modelId];\n }\n\n if (modelId.includes(\"/\")) {\n const [provider, ...rest] = modelId.split(\"/\");\n const baseModel = rest.join(\"/\");\n const baseName = knownNames[baseModel] || humanizeName(baseModel);\n const providerName = formatProviderLabel(provider);\n return `${baseName} (${providerName})`;\n }\n\n return humanizeName(modelId);\n}\n\nfunction formatProviderLabel(provider: string): string {\n const providerMap: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai_codex: \"OpenAI Codex\",\n openai: \"OpenAI\",\n antigravity: \"Antigravity\",\n kiro: \"Kiro\",\n qoder: \"Qoder\",\n codebuddy: \"CodeBuddy\",\n deepseek: \"DeepSeek\",\n gorouter: \"GoRouter\",\n bluesminds: \"BluesMinds\",\n seekai: \"SeekAI\",\n tabitoken: \"TabiToken\",\n tokenrouter: \"TokenRouter\",\n commandcode: \"CommandCode\",\n combo: \"Combo\"\n };\n return providerMap[provider] || provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\nfunction humanizeName(str: string): string {\n return str.replace(/[-_]/g, \" \").replace(/\\b[a-z]/g, (c) => c.toUpperCase());\n}\n\nfunction parseJsonc(content: string): Record<string, any> {\n try {\n const clean = content\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/,\\s*([\\]}])/g, \"$1\");\n return JSON.parse(clean);\n } catch {\n try {\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n}\n\nexport class OpenCodeAdapter extends AbstractToolAdapter {\n readonly id = \"opencode\";\n readonly name = \"OpenCode\";\n readonly description = \"Open-source AI coding assistant and agent\";\n\n private customConfigPath?: string;\n\n constructor(store: ConfigStore = defaultStore, customConfigPath?: string) {\n super(store);\n this.customConfigPath = customConfigPath;\n }\n\n getConfigPath(): string {\n if (this.customConfigPath) {\n return this.customConfigPath;\n }\n return getOpenCodeConfigPath();\n }\n\n async isInstalled(): Promise<boolean> {\n const opencode = await isExecutableInPath(\"opencode\");\n if (opencode) return true;\n return isExecutableInPath(\"interpreter\");\n }\n\n async getStatus(): Promise<ToolStatus> {\n const configPath = this.getConfigPath();\n const installed = await this.isInstalled();\n\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const parsed = parseJsonc(raw);\n const baseUrl =\n parsed.provider?.srouter?.options?.baseURL ||\n parsed.openai_base_url ||\n parsed.api_base ||\n parsed.baseUrl ||\n parsed.providers?.srouter?.baseUrl ||\n undefined;\n const model = parsed.model || parsed.default_model || undefined;\n const linked = Boolean(\n baseUrl &&\n (baseUrl.includes(\"localhost\") ||\n baseUrl.includes(\"127.0.0.1\") ||\n baseUrl.includes(\"srouter\"))\n );\n\n return {\n id: this.id,\n name: this.name,\n installed,\n linked,\n configPath,\n currentBaseUrl: baseUrl,\n currentModel: model\n };\n } catch {\n return {\n id: this.id,\n name: this.name,\n installed,\n linked: false,\n configPath\n };\n }\n }\n\n async link(context: ToolConfigContext): Promise<LinkResult> {\n const configPath = this.getConfigPath();\n const backupPath = context.dryRun\n ? undefined\n : await this.store.createBackup(this.id, configPath);\n\n let data: Record<string, any> = {};\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n data = parseJsonc(raw);\n } catch {\n data = {};\n }\n\n // Schema declaration\n data[\"$schema\"] = \"https://opencode.ai/config.json\";\n\n // Clean any conflicting legacy fields\n delete data.providers;\n delete data.openai_base_url;\n delete data.api_base;\n delete data.api_key;\n delete data.openai_api_key;\n\n // OpenCode provider configuration\n data.provider = data.provider || {};\n const existingSrouter = data.provider.srouter || {};\n const existingModels = existingSrouter.models || {};\n\n const modelsMap: Record<string, { id?: string; name: string }> = {};\n\n // 1. Seed with default catalog\n for (const m of DEFAULT_SROUTER_MODELS) {\n modelsMap[m.id] = {\n id: m.id,\n name: m.name\n };\n }\n\n // 2. Retain existing models from user config\n for (const [key, val] of Object.entries(existingModels)) {\n if (val && typeof val === \"object\") {\n modelsMap[key] = val as { id?: string; name: string };\n }\n }\n\n // 3. Fetch live models from SRouter Gateway\n try {\n const liveModels =\n context.availableModels && context.availableModels.length > 0\n ? context.availableModels\n : await fetchAvailableModels(context.baseUrl, context.apiKey);\n\n for (const rawId of liveModels) {\n if (!rawId) continue;\n const cleanId = rawId.startsWith(\"srouter/\")\n ? rawId.replace(/^srouter\\//, \"\")\n : rawId;\n modelsMap[cleanId] = {\n id: cleanId,\n name: formatModelDisplayName(cleanId)\n };\n }\n } catch {\n // Silently fall back to default catalog\n }\n\n // 4. Ensure current user-selected model is present\n const rawModel = context.model || \"claude-3-7-sonnet\";\n const cleanModelId = rawModel.startsWith(\"srouter/\")\n ? rawModel.replace(/^srouter\\//, \"\")\n : rawModel;\n\n modelsMap[cleanModelId] = {\n id: cleanModelId,\n name: modelsMap[cleanModelId]?.name || formatModelDisplayName(cleanModelId)\n };\n\n data.provider.srouter = {\n name: \"SRouter\",\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: context.baseUrl,\n apiKey: context.apiKey || \"sk-local-srouter\"\n },\n models: modelsMap\n };\n\n // OpenCode format for active model: \"provider/model\"\n data.model = `srouter/${cleanModelId}`;\n\n if (!context.dryRun) {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(data, null, 4), \"utf-8\");\n }\n\n return {\n backupPath,\n modifiedPath: configPath\n };\n }\n\n async unlink(): Promise<boolean> {\n const restored = await this.store.restoreLatestBackup(this.id);\n if (restored) {\n return true;\n }\n\n const configPath = this.getConfigPath();\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const data = parseJsonc(raw);\n if (data.provider?.srouter) {\n delete data.provider.srouter;\n }\n if (data.model?.startsWith(\"srouter/\")) {\n delete data.model;\n }\n delete data.openai_base_url;\n delete data.api_base;\n delete data.openai_api_key;\n delete data.api_key;\n delete data.providers;\n await fs.writeFile(configPath, JSON.stringify(data, null, 4), \"utf-8\");\n return true;\n } catch {\n return false;\n }\n }\n\n getEnv(context: ToolConfigContext): Record<string, string> {\n const env: Record<string, string> = {\n OPENAI_BASE_URL: context.baseUrl,\n ANTHROPIC_BASE_URL: context.baseUrl\n };\n if (context.apiKey) {\n env.OPENAI_API_KEY = context.apiKey;\n env.ANTHROPIC_API_KEY = context.apiKey;\n }\n if (context.model) {\n const cleanModelId = context.model.startsWith(\"srouter/\")\n ? context.model.replace(/^srouter\\//, \"\")\n : context.model;\n env.OPENCODE_MODEL = `srouter/${cleanModelId}`;\n }\n return env;\n }\n}\n","export interface ServerHealthResult {\n healthy: boolean;\n modelsCount: number;\n error?: string;\n latencyMs?: number;\n}\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getModelsEndpoint(baseUrl: string): string {\n const cleanUrl = normalizeBaseUrl(baseUrl);\n return cleanUrl.endsWith(\"/v1\") ? `${cleanUrl}/models` : `${cleanUrl}/v1/models`;\n}\n\ninterface ModelItem {\n id?: string;\n}\n\ninterface ModelsApiResponse {\n data?: Array<ModelItem | string>;\n}\n\nexport async function checkServerHealth(\n baseUrl: string,\n apiKey?: string,\n timeoutMs: number = 3000\n): Promise<ServerHealthResult> {\n const endpoint = getModelsEndpoint(baseUrl);\n const start = Date.now();\n\n try {\n const headers: Record<string, string> = {\n Accept: \"application/json\"\n };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n const res = await fetch(endpoint, {\n method: \"GET\",\n headers,\n signal: controller.signal\n });\n clearTimeout(timer);\n\n if (!res.ok) {\n return {\n healthy: false,\n modelsCount: 0,\n error: `HTTP ${res.status}: ${res.statusText}`,\n latencyMs: Date.now() - start\n };\n }\n\n const data = (await res.json()) as ModelsApiResponse;\n const models = Array.isArray(data?.data) ? data.data : [];\n\n return {\n healthy: true,\n modelsCount: models.length,\n latencyMs: Date.now() - start\n };\n } catch (err: unknown) {\n const errorName = err instanceof Error ? err.name : \"\";\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n healthy: false,\n modelsCount: 0,\n error: errorName === \"AbortError\" ? \"Connection timeout\" : errorMessage,\n latencyMs: Date.now() - start\n };\n }\n}\n\nexport async function fetchAvailableModels(baseUrl: string, apiKey?: string): Promise<string[]> {\n const endpoint = getModelsEndpoint(baseUrl);\n\n try {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const res = await fetch(endpoint, { headers });\n if (!res.ok) return [];\n const data = (await res.json()) as ModelsApiResponse;\n if (!Array.isArray(data?.data)) return [];\n return data.data\n .map((m) => (typeof m === \"string\" ? m : m?.id))\n .filter((id): id is string => typeof id === \"string\" && id.length > 0);\n } catch {\n return [];\n }\n}\n","import type { BaseToolAdapter } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { OpenCodeAdapter } from \"./opencode.js\";\n\nexport { ClaudeAdapter } from \"./claude.js\";\nexport { OpenCodeAdapter } from \"./opencode.js\";\nexport { AbstractToolAdapter } from \"./base.js\";\n\nexport function createAdapters(store: ConfigStore = defaultStore): BaseToolAdapter[] {\n return [new ClaudeAdapter(store), new OpenCodeAdapter(store)];\n}\n\nlet cachedAdapters: BaseToolAdapter[] | null = null;\n\nexport function getAllAdapters(): BaseToolAdapter[] {\n if (!cachedAdapters) {\n cachedAdapters = createAdapters();\n }\n return cachedAdapters;\n}\n\nexport function getAdapter(id: string): BaseToolAdapter | undefined {\n const normalized = id.toLowerCase().trim();\n return getAllAdapters().find(\n (a) => a.id.toLowerCase() === normalized || a.name.toLowerCase().includes(normalized)\n );\n}\n","import pc from \"picocolors\";\nimport { intro, outro, spinner, note } from \"@clack/prompts\";\n\nexport const banner = `\n ____ ____ __ \n / __/ / __ \\\\___ __ __ / /____ ____ \n _\\\\ \\\\ / /_/ / _ \\\\/ // / / __/ -_)/ __/ \n/___/ \\\\____/\\\\___/\\\\_,_/ \\\\__/\\\\__//_/ \n ${pc.bold(pc.cyan(\"AI Gateway & LLM Proxy Router CLI\"))}\n`;\n\nexport function showHeader(): void {\n console.log(pc.magenta(banner));\n}\n\nexport function formatSuccess(msg: string): string {\n return `${pc.green(\"✔\")} ${msg}`;\n}\n\nexport function formatError(msg: string): string {\n return `${pc.red(\"✖\")} ${msg}`;\n}\n\nexport function formatWarning(msg: string): string {\n return `${pc.yellow(\"⚠\")} ${msg}`;\n}\n\nexport function formatInfo(msg: string): string {\n return `${pc.cyan(\"ℹ\")} ${msg}`;\n}\n\nexport { pc, intro, outro, spinner, note };\n","import { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { formatError, formatSuccess, pc } from \"../lib/ui.js\";\n\nexport interface LinkCommandOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n dryRun?: boolean;\n}\n\nexport async function linkCommand(toolId: string, options: LinkCommandOptions): Promise<void> {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available tools: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n const model = options.model || savedConfig.defaultModel;\n const opusModel = options.opusModel || savedConfig.defaultOpusModel;\n const sonnetModel = options.sonnetModel || savedConfig.defaultSonnetModel;\n const haikuModel = options.haikuModel || savedConfig.defaultHaikuModel;\n\n try {\n const result = await adapter.link({\n baseUrl,\n apiKey,\n model,\n opusModel,\n sonnetModel,\n haikuModel,\n dryRun: options.dryRun\n });\n\n console.log(\n formatSuccess(\n `Successfully configured ${pc.bold(pc.cyan(adapter.name))} with SRouter proxy!`\n )\n );\n console.log(` ${pc.gray(\"Target Config:\")} ${pc.white(result.modifiedPath)}`);\n console.log(` ${pc.gray(\"Proxy URL:\")} ${pc.white(baseUrl)}`);\n if (model) {\n console.log(` ${pc.gray(\"Model:\")} ${pc.white(model)}`);\n }\n if (opusModel) {\n console.log(` ${pc.gray(\"Opus Model:\")} ${pc.white(opusModel)}`);\n }\n if (sonnetModel) {\n console.log(` ${pc.gray(\"Sonnet Model:\")} ${pc.white(sonnetModel)}`);\n }\n if (haikuModel) {\n console.log(` ${pc.gray(\"Haiku Model:\")} ${pc.white(haikuModel)}`);\n }\n if (result.backupPath) {\n console.log(` ${pc.gray(\"Backup Saved:\")} ${pc.white(result.backupPath)}`);\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to link ${adapter.name}: ${msg}`));\n process.exitCode = 1;\n }\n}\n","import { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { formatError, formatInfo, formatSuccess, pc } from \"../lib/ui.js\";\n\nexport async function unlinkCommand(toolId: string): Promise<void> {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available tools: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n const restored = await adapter.unlink();\n if (restored) {\n console.log(\n formatSuccess(\n `Restored original configuration for ${pc.bold(pc.cyan(adapter.name))}!`\n )\n );\n } else {\n console.log(\n formatInfo(\n `No active SRouter configuration or backup found for ${pc.bold(adapter.name)}.`\n )\n );\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to unlink ${adapter.name}: ${msg}`));\n process.exitCode = 1;\n }\n}\n","import { getAllAdapters, getAdapter } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { checkServerHealth, fetchAvailableModels } from \"../lib/srouterClient.js\";\nimport { formatError, formatSuccess, formatWarning, pc } from \"../lib/ui.js\";\n\nexport interface SyncCommandOptions {\n url?: string;\n key?: string;\n}\n\nexport async function syncCommand(\n toolId?: string,\n options: SyncCommandOptions = {}\n): Promise<void> {\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n\n const health = await checkServerHealth(baseUrl, apiKey);\n if (!health.healthy) {\n console.error(\n formatError(\n `Cannot sync: SRouter Gateway is unreachable at ${pc.bold(baseUrl)} (${health.error || \"offline\"}).`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n const availableModels = await fetchAvailableModels(baseUrl, apiKey);\n if (availableModels.length === 0) {\n console.warn(\n formatWarning(`SRouter Gateway responded at ${baseUrl}, but returned 0 models.`)\n );\n }\n\n const adaptersToSync = toolId\n ? [getAdapter(toolId)].filter((a): a is NonNullable<typeof a> => Boolean(a))\n : getAllAdapters();\n\n if (toolId && adaptersToSync.length === 0) {\n console.error(formatError(`Tool '${pc.bold(toolId)}' not supported.`));\n process.exitCode = 1;\n return;\n }\n\n for (const adapter of adaptersToSync) {\n if (!adapter) continue;\n const status = await adapter.getStatus();\n if (!status.linked && !toolId) {\n // Skip unlinked tools if running global sync\n continue;\n }\n\n try {\n const result = await adapter.link({\n baseUrl,\n apiKey,\n model: savedConfig.defaultModel || status.currentModel,\n opusModel: savedConfig.defaultOpusModel,\n sonnetModel: savedConfig.defaultSonnetModel,\n haikuModel: savedConfig.defaultHaikuModel,\n availableModels\n });\n\n console.log(\n formatSuccess(\n `Synced ${pc.bold(pc.cyan(availableModels.length.toString()))} models to ${pc.bold(adapter.name)} (${pc.gray(result.modifiedPath)})`\n )\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to sync ${adapter.name}: ${msg}`));\n }\n }\n}\n","import { getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { getSystemInfo } from \"../lib/platform.js\";\nimport { checkServerHealth, fetchAvailableModels } from \"../lib/srouterClient.js\";\nimport {\n formatError,\n formatInfo,\n formatSuccess,\n formatWarning,\n pc,\n showHeader\n} from \"../lib/ui.js\";\n\nexport interface StatusCommandOptions {\n url?: string;\n key?: string;\n}\n\nexport async function statusCommand(options: StatusCommandOptions): Promise<void> {\n showHeader();\n\n const sysInfo = getSystemInfo();\n console.log(pc.bold(pc.underline(\"System Environment:\")));\n console.log(` ${pc.gray(\"OS:\")} ${pc.white(sysInfo.displayName)}`);\n console.log(` ${pc.gray(\"Platform:\")} ${pc.white(sysInfo.platform)} (${sysInfo.arch})`);\n console.log(` ${pc.gray(\"Shell:\")} ${pc.white(sysInfo.detectedShell)}`);\n console.log(` ${pc.gray(\"Home Dir:\")} ${pc.white(sysInfo.homeDir)}`);\n console.log(\"\");\n\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n\n console.log(pc.bold(pc.underline(\"Gateway Status:\")));\n console.log(` ${pc.gray(\"Target URL:\")} ${pc.white(baseUrl)}`);\n\n const health = await checkServerHealth(baseUrl, apiKey);\n if (health.healthy) {\n console.log(\n ` ${pc.gray(\"Health:\")} ${pc.green(\"ONLINE\")} ${pc.gray(`(${health.latencyMs}ms)`)}`\n );\n const models = await fetchAvailableModels(baseUrl, apiKey);\n console.log(` ${pc.gray(\"Models:\")} ${pc.cyan(`${models.length} available`)}`);\n if (models.length > 0) {\n const preview = models.slice(0, 5).join(\", \");\n const extra = models.length > 5 ? ` +${models.length - 5} more` : \"\";\n console.log(` ${pc.gray(`[${preview}${extra}]`)}`);\n }\n } else {\n console.log(` ${pc.gray(\"Health:\")} ${pc.red(\"OFFLINE / UNREACHABLE\")}`);\n if (health.error) {\n console.log(` ${pc.gray(\"Reason:\")} ${pc.yellow(health.error)}`);\n }\n }\n\n console.log(\"\");\n console.log(pc.bold(pc.underline(\"Supported AI Coding Tools:\")));\n\n const adapters = getAllAdapters();\n for (const adapter of adapters) {\n const status = await adapter.getStatus();\n const icon = status.linked\n ? pc.green(\"● CONFIGURED (LINKED)\")\n : pc.gray(\"○ NOT CONFIGURED (UNLINKED)\");\n const installBadge = status.installed\n ? pc.green(\"[Installed]\")\n : pc.yellow(\"[Not in PATH]\");\n\n console.log(`\\n ${pc.bold(pc.cyan(adapter.name))} ${icon} ${installBadge}`);\n console.log(` ${pc.gray(\"ID:\")} ${adapter.id}`);\n console.log(` ${pc.gray(\"Config Path:\")} ${status.configPath || \"N/A\"}`);\n if (status.linked) {\n console.log(` ${pc.gray(\"Active URL:\")} ${pc.green(status.currentBaseUrl || \"N/A\")}`);\n if (status.currentModel) {\n console.log(` ${pc.gray(\"Model:\")} ${pc.green(status.currentModel)}`);\n }\n if (status.currentOpusModel) {\n console.log(` ${pc.gray(\"Opus Model:\")} ${pc.green(status.currentOpusModel)}`);\n }\n if (status.currentSonnetModel) {\n console.log(` ${pc.gray(\"Sonnet Model:\")}${pc.green(status.currentSonnetModel)}`);\n }\n if (status.currentHaikuModel) {\n console.log(` ${pc.gray(\"Haiku Model:\")} ${pc.green(status.currentHaikuModel)}`);\n }\n } else {\n console.log(\n ` ${pc.gray(\"Status:\")} ${pc.yellow(\"Not connected to SRouter proxy\")}`\n );\n }\n }\n\n console.log(\"\");\n}\n","import { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { detectShell, formatShellExport, type ShellType } from \"../lib/platform.js\";\nimport { formatError, pc } from \"../lib/ui.js\";\n\nexport interface EnvCommandOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n fish?: boolean;\n shell?: string;\n}\n\nexport async function envCommand(toolId?: string, options: EnvCommandOptions = {}): Promise<void> {\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n const model = options.model || savedConfig.defaultModel;\n const opusModel = options.opusModel || savedConfig.defaultOpusModel;\n const sonnetModel = options.sonnetModel || savedConfig.defaultSonnetModel;\n const haikuModel = options.haikuModel || savedConfig.defaultHaikuModel;\n\n const context = {\n baseUrl,\n apiKey,\n model,\n opusModel,\n sonnetModel,\n haikuModel\n };\n\n let envVars: Record<string, string> = {};\n\n if (toolId) {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n envVars = adapter.getEnv(context);\n } else {\n envVars = {\n ANTHROPIC_BASE_URL: baseUrl,\n OPENAI_BASE_URL: baseUrl\n };\n if (apiKey) {\n envVars.ANTHROPIC_API_KEY = apiKey;\n envVars.OPENAI_API_KEY = apiKey;\n }\n if (model) {\n envVars.ANTHROPIC_MODEL = model;\n envVars.OPENCODE_MODEL = model;\n }\n if (opusModel) {\n envVars.ANTHROPIC_DEFAULT_OPUS_MODEL = opusModel;\n }\n if (sonnetModel) {\n envVars.ANTHROPIC_DEFAULT_SONNET_MODEL = sonnetModel;\n }\n if (haikuModel) {\n envVars.ANTHROPIC_DEFAULT_HAIKU_MODEL = haikuModel;\n }\n }\n\n let targetShell: ShellType = detectShell();\n if (options.fish) {\n targetShell = \"fish\";\n } else if (options.shell) {\n const s = options.shell.toLowerCase();\n if (\n s === \"fish\" ||\n s === \"powershell\" ||\n s === \"pwsh\" ||\n s === \"cmd\" ||\n s === \"zsh\" ||\n s === \"bash\"\n ) {\n targetShell = (s === \"pwsh\" ? \"powershell\" : s) as ShellType;\n }\n }\n\n for (const [key, value] of Object.entries(envVars)) {\n console.log(formatShellExport(key, value, targetShell));\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { formatError, pc } from \"../lib/ui.js\";\n\nexport interface RunCommandOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n}\n\nexport async function runCommand(\n toolId: string,\n toolArgs: string[],\n options: RunCommandOptions = {}\n): Promise<void> {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n const model = options.model || savedConfig.defaultModel;\n const opusModel = options.opusModel || savedConfig.defaultOpusModel;\n const sonnetModel = options.sonnetModel || savedConfig.defaultSonnetModel;\n const haikuModel = options.haikuModel || savedConfig.defaultHaikuModel;\n\n const envToInject = adapter.getEnv({\n baseUrl,\n apiKey,\n model,\n opusModel,\n sonnetModel,\n haikuModel\n });\n\n const binaryName = toolId === \"claude\" ? \"claude\" : \"opencode\";\n\n const child = spawn(binaryName, toolArgs, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n ...envToInject\n }\n });\n\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"ENOENT\") {\n console.error(\n formatError(\n `Executable '${pc.bold(binaryName)}' not found in your PATH. Please install ${adapter.name} first.`\n )\n );\n } else {\n console.error(formatError(`Failed to run ${binaryName}: ${err.message}`));\n }\n process.exitCode = 1;\n });\n\n child.on(\"exit\", (code) => {\n if (code !== null && code !== 0) {\n process.exitCode = code;\n }\n });\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { DEFAULT_DB_PATH, initDatabase, LEGACY_DB_LOCATIONS, SROUTER_DIR } from \"@srouter/db\";\nimport { formatError, formatInfo, formatSuccess, formatWarning, pc } from \"../lib/ui.js\";\n\ntype SqliteValue = string | number | bigint | Uint8Array | null;\n\ninterface NineRouterJsonBackup {\n settings?: Record<string, unknown>;\n providerConnections?: Array<{\n id: string;\n provider: string;\n name: string;\n authType?: string;\n apiKey?: string;\n accessToken?: string;\n access_token?: string;\n refreshToken?: string;\n refresh_token?: string;\n expiresAt?: string;\n tokenExpiresAt?: number;\n lastRefreshAt?: string;\n lastRefreshedAt?: number;\n providerSpecificData?: Record<string, unknown>;\n isActive?: boolean;\n createdAt?: string;\n updatedAt?: string;\n [key: string]: unknown;\n }>;\n providerNodes?: Array<{\n id: string;\n name: string;\n prefix?: string;\n apiType?: string;\n baseUrl?: string;\n type?: string;\n [key: string]: unknown;\n }>;\n apiKeys?: Array<{\n id?: string;\n key: string;\n name?: string;\n isActive?: boolean;\n createdAt?: string;\n [key: string]: unknown;\n }>;\n customModels?: Array<{\n providerAlias?: string;\n id: string;\n type?: string;\n name?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n}\n\nfunction parseDateToTimestamp(val: unknown): number {\n if (typeof val === \"number\" && Number.isFinite(val)) return val;\n if (typeof val === \"string\") {\n const parsed = Date.parse(val);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return Date.now();\n}\n\nfunction map9RouterProtocol(apiType?: string, type?: string): string {\n if (apiType === \"anthropic\" || type === \"anthropic\" || type?.includes(\"anthropic\")) {\n return \"anthropic\";\n }\n return \"openai\";\n}\n\nfunction importNineRouterJson(\n data: NineRouterJsonBackup,\n targetDb: DatabaseSync,\n action: \"copy\" | \"merge\" | \"backup_and_replace\"\n): { inserted: number; skipped: number; tablesCount: number } {\n const nodesMap = new Map<string, NonNullable<NineRouterJsonBackup[\"providerNodes\"]>[number]>();\n if (Array.isArray(data.providerNodes)) {\n for (const node of data.providerNodes) {\n nodesMap.set(node.id, node);\n }\n }\n\n if (action !== \"copy\") {\n try {\n targetDb.prepare('DELETE FROM \"providers\"').run();\n targetDb.prepare('DELETE FROM \"api_keys\"').run();\n targetDb.prepare('DELETE FROM \"custom_models\"').run();\n } catch {\n // Ignored if table doesn't exist\n }\n }\n\n let inserted = 0;\n let skipped = 0;\n let tablesCount = 0;\n\n // 1. Migrate Providers\n if (Array.isArray(data.providerConnections) && data.providerConnections.length > 0) {\n tablesCount++;\n const insertProvider = targetDb.prepare(`\n INSERT OR REPLACE INTO providers (\n id, provider_id, name, category, protocol, base_url, api_key, access_token,\n refresh_token, account_id, organization_id, token_expires_at, last_refreshed_at,\n custom_headers, provider_specific_data, enabled, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const conn of data.providerConnections) {\n try {\n const node = nodesMap.get(conn.provider);\n const providerId = node ? node.name.toLowerCase() : conn.provider;\n const protocol = node ? map9RouterProtocol(node.apiType, node.type) : \"openai\";\n const baseUrl = node?.baseUrl ?? (conn.providerSpecificData?.baseUrl as string) ?? null;\n const apiKey = conn.apiKey ?? null;\n const accessToken = conn.accessToken ?? conn.access_token ?? null;\n const refreshToken = conn.refreshToken ?? conn.refresh_token ?? null;\n\n const tokenExpiresAt = conn.tokenExpiresAt ?? (conn.expiresAt ? parseDateToTimestamp(conn.expiresAt) : null);\n const lastRefreshedAt = conn.lastRefreshedAt ?? (conn.lastRefreshAt ? parseDateToTimestamp(conn.lastRefreshAt) : null);\n\n const accountId = (conn.providerSpecificData?.chatgptAccountId as string) ?? (conn.providerSpecificData?.accountId as string) ?? null;\n const orgId = (conn.providerSpecificData?.organizationId as string) ?? null;\n const enabled = conn.isActive === false ? 0 : 1;\n const createdAt = parseDateToTimestamp(conn.createdAt);\n\n insertProvider.run(\n conn.id,\n providerId,\n conn.name || providerId,\n \"general\",\n protocol,\n baseUrl,\n apiKey,\n accessToken,\n refreshToken,\n accountId,\n orgId,\n tokenExpiresAt,\n lastRefreshedAt,\n null,\n conn.providerSpecificData ? JSON.stringify(conn.providerSpecificData) : null,\n enabled,\n createdAt\n );\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n // 2. Migrate API Keys\n if (Array.isArray(data.apiKeys) && data.apiKeys.length > 0) {\n tablesCount++;\n const insertKey = targetDb.prepare(`\n INSERT OR REPLACE INTO api_keys (\n id, key, name, enabled, rate_limit, quota_limit, usage_tokens, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const keyItem of data.apiKeys) {\n try {\n insertKey.run(\n keyItem.id || `key_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n keyItem.key,\n keyItem.name || \"Default Key\",\n keyItem.isActive === false ? 0 : 1,\n 0,\n 0,\n 0,\n parseDateToTimestamp(keyItem.createdAt)\n );\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n // 3. Migrate Custom Models\n if (Array.isArray(data.customModels) && data.customModels.length > 0) {\n tablesCount++;\n const insertCustomModel = targetDb.prepare(`\n INSERT OR IGNORE INTO custom_models (\n provider_id, model_id, created_at\n ) VALUES (?, ?, ?)\n `);\n\n for (const model of data.customModels) {\n try {\n insertCustomModel.run(\n model.providerAlias || \"default\",\n model.id || model.name || \"unknown\",\n Date.now()\n );\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n return { inserted, skipped, tablesCount };\n}\n\nexport interface MigrateCommandOptions {\n source?: string;\n yes?: boolean;\n action?: \"copy\" | \"merge\" | \"backup_and_replace\";\n}\n\nconst TargetDbPath = DEFAULT_DB_PATH;\nconst BackupDir = path.join(SROUTER_DIR, \"backups\");\n\nconst NineRouterDbLocations = [\n path.join(os.homedir(), \".9router\", \"srouter.db\"),\n path.join(os.homedir(), \".9router\", \"9router.db\"),\n path.join(os.homedir(), \"9router\", \"srouter.db\"),\n path.join(os.homedir(), \"9router\", \"data.db\"),\n path.join(os.homedir(), \"9router\", \"db\", \"srouter.db\"),\n path.join(os.homedir(), \".config\", \"9router\", \"srouter.db\"),\n path.join(os.homedir(), \".config\", \"9router\", \"9router.db\"),\n \"/root/9router/srouter.db\",\n \"/root/project/9router/db/srouter.db\",\n ...LEGACY_DB_LOCATIONS\n];\n\nfunction fileKb(filePath: string): string {\n return `${(fs.statSync(filePath).size / 1024).toFixed(2)} KB`;\n}\n\nfunction ensureDirs(): void {\n fs.mkdirSync(SROUTER_DIR, { recursive: true, mode: 0o700 });\n fs.mkdirSync(BackupDir, { recursive: true, mode: 0o755 });\n}\n\nfunction backupDb(source: string, label: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(BackupDir, `${label}-backup-${timestamp}.db`);\n fs.copyFileSync(source, backupPath);\n p.log.step(`Backed up to ${pc.dim(backupPath)}`);\n return backupPath;\n}\n\nfunction findDatabase(candidates: string[], label: string): string | null {\n for (const candidate of candidates) {\n const fullPath = path.resolve(candidate);\n if (fs.existsSync(fullPath)) {\n p.log.info(`Found ${label} database: ${pc.bold(fullPath)} (${fileKb(fullPath)})`);\n return fullPath;\n }\n }\n return null;\n}\n\nasync function migrateDb(options: MigrateCommandOptions): Promise<void> {\n p.intro(\"SRouter Database Migration\");\n\n if (fs.existsSync(TargetDbPath)) {\n p.log.warn(`Database already exists at ${TargetDbPath} (${fileKb(TargetDbPath)})`);\n p.outro(\"No migration needed — already using the new location.\");\n return;\n }\n\n const source =\n options.source && fs.existsSync(options.source)\n ? path.resolve(options.source)\n : findDatabase(LEGACY_DB_LOCATIONS, \"legacy\");\n\n if (!source) {\n p.log.error(\"No existing database found.\");\n p.outro(\n `Start SRouter and a fresh database will be created at ${TargetDbPath}, ` +\n \"or pass --source /path/to/srouter.db.\"\n );\n return;\n }\n\n ensureDirs();\n const proceed =\n options.yes || (await p.confirm({ message: `Migrate database from ${source}?` })) === true;\n\n if (!proceed) {\n p.outro(\"Migration cancelled.\");\n return;\n }\n\n try {\n backupDb(source, \"srouter\");\n fs.copyFileSync(source, TargetDbPath);\n fs.chmodSync(TargetDbPath, 0o600);\n p.log.success(`Database moved to ${TargetDbPath}`);\n p.outro(\"Restart SRouter to use the migrated database.\");\n } catch (error) {\n p.log.error(formatError(`Migration failed: ${(error as Error).message}`));\n process.exitCode = 1;\n }\n}\n\nasync function migrateNineRouter(options: MigrateCommandOptions): Promise<void> {\n p.intro(\"9Router → SRouter Database Migration\");\n\n const source =\n options.source && fs.existsSync(options.source)\n ? path.resolve(options.source)\n : findDatabase(NineRouterDbLocations, \"9Router\");\n\n if (!source) {\n p.log.error(\"No 9Router database found.\");\n p.outro(\n \"Pass the location explicitly: srouter migrate 9router --source /path/to/9router.db\"\n );\n process.exitCode = 1;\n return;\n }\n\n const existingTarget = fs.existsSync(TargetDbPath);\n let action: \"copy\" | \"merge\" | \"backup_and_replace\" = options.action ?? \"copy\";\n\n if (existingTarget && !options.action) {\n if (options.yes) {\n action = \"merge\";\n } else {\n p.log.warn(`Existing SRouter database found at ${TargetDbPath} (${fileKb(TargetDbPath)})`);\n const choice = await p.select({\n message: \"How should the existing SRouter database be handled?\",\n options: [\n { value: \"backup_and_replace\", label: \"Backup current, replace with 9Router data\" },\n { value: \"merge\", label: \"Overwrite tables with 9Router data\" },\n { value: \"abort\", label: \"Cancel migration\" }\n ]\n });\n if (choice === \"abort\" || p.isCancel(choice)) {\n p.outro(\"Migration cancelled. Your 9Router installation remains intact.\");\n return;\n }\n if (choice === \"merge\" || choice === \"backup_and_replace\") {\n action = choice;\n }\n }\n }\n\n const proceed =\n options.yes || (await p.confirm({ message: \"Proceed with migration?\" })) === true;\n if (!proceed) {\n p.outro(\"Migration cancelled. No changes made.\");\n return;\n }\n\n ensureDirs();\n const sourceBackup = backupDb(source, \"9router\");\n\n let targetBackup: string | null = null;\n if (action === \"backup_and_replace\") {\n targetBackup = backupDb(TargetDbPath, \"srouter\");\n }\n\n const s = p.spinner();\n try {\n s.start(\"Preparing target database\");\n initDatabase();\n\n const targetDb = new DatabaseSync(TargetDbPath);\n targetDb.exec(\"PRAGMA foreign_keys = OFF;\");\n\n let inserted = 0;\n let skipped = 0;\n let tablesCount = 0;\n\n const isJson = source.endsWith(\".json\");\n if (isJson) {\n s.message(\"Reading 9Router JSON backup\");\n const raw = fs.readFileSync(source, \"utf-8\");\n const parsed = JSON.parse(raw) as NineRouterJsonBackup;\n const res = importNineRouterJson(parsed, targetDb, action);\n inserted = res.inserted;\n skipped = res.skipped;\n tablesCount = res.tablesCount;\n } else {\n const sourceDb = new DatabaseSync(source);\n s.message(\"Reading source SQLite tables\");\n\n const sourceTables = (\n sourceDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name\")\n .all() as Array<{ name: string }>\n )\n .map((t) => t.name)\n .filter((name) => !name.startsWith(\"sqlite_\"));\n\n const targetTables = new Set(\n (\n targetDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table'\")\n .all() as Array<{ name: string }>\n ).map((t) => t.name)\n );\n\n for (const table of sourceTables) {\n if (!targetTables.has(table)) {\n p.log.warn(`Skipping table ${table} (not recognized by SRouter)`);\n continue;\n }\n\n const rows = sourceDb.prepare(`SELECT * FROM \"${table}\"`).all() as Record<\n string,\n SqliteValue\n >[];\n if (rows.length === 0) continue;\n\n if (action !== \"copy\") {\n try {\n targetDb.prepare(`DELETE FROM \"${table}\"`).run();\n } catch {\n p.log.warn(`Could not clear table ${table}, rows will be appended`);\n }\n }\n\n const sourceColumns = new Set(\n (\n sourceDb.prepare(`PRAGMA table_info(\"${table}\")`).all() as Array<{\n name: string;\n }>\n ).map((col) => col.name)\n );\n\n const targetColumns = (\n targetDb.prepare(`PRAGMA table_info(\"${table}\")`).all() as Array<{\n name: string;\n }>\n )\n .map((col) => col.name)\n .filter((col) => sourceColumns.has(col));\n\n if (targetColumns.length === 0) continue;\n\n const placeholders = targetColumns.map(() => \"?\").join(\", \");\n const insert = targetDb.prepare(\n `INSERT OR REPLACE INTO \"${table}\" (${targetColumns.map((c) => `\"${c}\"`).join(\", \")}) VALUES (${placeholders})`\n );\n\n for (const row of rows) {\n try {\n insert.run(...targetColumns.map((col) => row[col] ?? null));\n inserted++;\n } catch {\n skipped++;\n }\n }\n tablesCount++;\n }\n\n sourceDb.close();\n }\n\n targetDb.exec(\"PRAGMA foreign_keys = ON;\");\n targetDb.close();\n s.stop(\"Migration complete\");\n\n p.log.message(\n [\n `Tables/Categories migrated: ${tablesCount}`,\n `Rows/Items inserted: ${inserted}`,\n `Rows/Items skipped: ${skipped}`,\n `Source: ${source}`,\n `Target: ${TargetDbPath}`\n ].join(\"\\n\")\n );\n\n if (targetBackup) {\n p.log.info(`Old SRouter database backed up to ${targetBackup}`);\n }\n p.log.success(formatSuccess(`9Router backup saved to ${sourceBackup}`));\n p.outro(\"Your 9Router providers are now available in SRouter.\");\n } catch (error) {\n s.stop(formatError(\"Migration failed\"));\n p.log.error((error as Error).message);\n p.log.info(formatInfo(`Restore from backup if needed: cp ${sourceBackup} ${source}`));\n process.exitCode = 1;\n }\n}\n\nexport async function migrateCommand(\n target: string,\n options: MigrateCommandOptions\n): Promise<void> {\n switch (target) {\n case \"db\":\n return migrateDb(options);\n case \"9router\":\n return migrateNineRouter(options);\n default:\n p.log.error(formatError(`Unknown migration target: ${target}`));\n p.log.info(\n formatWarning(\"Available targets: db (legacy location), 9router (9Router import)\")\n );\n process.exitCode = 1;\n }\n}\n","import { DatabaseSync } from \"node:sqlite\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\n/** Directory holding the SRouter database (and backups) in the user's home directory. */\nexport const SROUTER_DIR = path.join(os.homedir(), \".srouter\");\n/** Default database location: ~/.srouter/srouter.db */\nexport const DEFAULT_DB_PATH = path.join(SROUTER_DIR, \"srouter.db\");\n/** Legacy database locations checked for backward compatibility (relative to cwd). */\nexport const LEGACY_DB_LOCATIONS = [\n path.resolve(process.cwd(), \"apps/api/srouter.db\"),\n path.resolve(process.cwd(), \"srouter.db\")\n];\nfunction getDatabasePath() {\n // Allow explicit override via DATABASE_PATH environment variable\n if (process.env.DATABASE_PATH)\n return process.env.DATABASE_PATH;\n // Fallback for legacy installations (keep existing for backward compatibility)\n for (const legacyPath of LEGACY_DB_LOCATIONS) {\n if (fs.existsSync(legacyPath))\n return legacyPath;\n }\n // Return new default path and create directory if needed\n return DEFAULT_DB_PATH;\n}\nconst dbPath = getDatabasePath();\n// Ensure parent folder exists if path contains subdirectories\nconst dbDir = path.dirname(dbPath);\nif (!fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n}\nexport const db = new DatabaseSync(dbPath);\n// Wait up to 5s instead of failing immediately when another connection\n// (e.g. a parallel test process or the CLI) holds the write lock.\ndb.exec(\"PRAGMA busy_timeout = 5000;\");\n// Enable WAL mode for high performance concurrency.\n// Retry briefly — concurrent processes initializing on the same DB file\n// (CI runs app test suites in parallel) can transiently hold the lock.\nfunction execWithRetry(sql, attempts = 5) {\n for (let i = 0; i < attempts; i++) {\n try {\n db.exec(sql);\n return;\n }\n catch (error) {\n const code = error.code;\n if (code === \"SQLITE_BUSY\" && i < attempts - 1) {\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 200 * (i + 1));\n continue;\n }\n throw error;\n }\n }\n}\nexecWithRetry(\"PRAGMA journal_mode = WAL;\");\nexecWithRetry(\"PRAGMA foreign_keys = ON;\");\n/**\n * Adds columns to a table if they do not already exist.\n * Declarative replacement for repeated try/catch ALTER TABLE blocks.\n */\nfunction ensureColumns(table, columns) {\n const existing = new Set(db.prepare(`PRAGMA table_info(\"${table}\")`).all().map((col) => col.name));\n for (const col of columns) {\n if (existing.has(col.name))\n continue;\n try {\n db.exec(`ALTER TABLE ${table} ADD COLUMN ${col.definition};`);\n existing.add(col.name);\n }\n catch (error) {\n const message = error.message || \"\";\n if (!message.includes(\"duplicate column name\")) {\n throw error;\n }\n }\n }\n}\n/**\n * Initialize database schema tables if they do not exist\n */\nexport function initDatabase() {\n // 1. Table for Providers configuration\n db.exec(`\n CREATE TABLE IF NOT EXISTS providers (\n id TEXT PRIMARY KEY,\n provider_id TEXT NOT NULL,\n name TEXT NOT NULL,\n category TEXT NOT NULL,\n protocol TEXT NOT NULL,\n base_url TEXT,\n api_key TEXT,\n access_token TEXT,\n refresh_token TEXT,\n custom_headers TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL\n );\n `);\n ensureColumns(\"providers\", [\n { name: \"refresh_token\", definition: \"refresh_token TEXT\" },\n // Multi-account OAuth binding (e.g. Codex ChatGPT-Account-ID)\n { name: \"account_id\", definition: \"account_id TEXT\" },\n // Provider-specific metadata (for example Kiro auth method/region/profile ARN)\n { name: \"provider_specific_data\", definition: \"provider_specific_data TEXT\" },\n // Token expiry tracking\n { name: \"token_expires_at\", definition: \"token_expires_at INTEGER\" },\n { name: \"last_refreshed_at\", definition: \"last_refreshed_at INTEGER\" },\n // Claude OAuth organization binding\n { name: \"organization_id\", definition: \"organization_id TEXT\" }\n ]);\n // 2. Table for Client API Keys / Endpoint Keys\n db.exec(`\n CREATE TABLE IF NOT EXISTS api_keys (\n id TEXT PRIMARY KEY,\n key TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n enabled INTEGER NOT NULL DEFAULT 1,\n rate_limit INTEGER DEFAULT 0,\n quota_limit INTEGER DEFAULT 0,\n usage_tokens INTEGER DEFAULT 0,\n created_at INTEGER NOT NULL\n );\n `);\n // 3. Table for Request Logs & Token Analytics\n db.exec(`\n CREATE TABLE IF NOT EXISTS request_logs (\n id TEXT PRIMARY KEY,\n api_key_id TEXT,\n provider_id TEXT NOT NULL,\n model TEXT NOT NULL,\n prompt_tokens INTEGER NOT NULL DEFAULT 0,\n completion_tokens INTEGER NOT NULL DEFAULT 0,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n status_code INTEGER NOT NULL,\n latency_ms INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n );\n `);\n // 4. Table for OAuth PKCE sessions (survive server restarts)\n db.exec(`\n CREATE TABLE IF NOT EXISTS oauth_sessions (\n state TEXT PRIMARY KEY,\n code_verifier TEXT NOT NULL,\n client_id TEXT NOT NULL,\n redirect_uri TEXT NOT NULL,\n created_at INTEGER NOT NULL\n );\n `);\n // Ensure analytics columns and fallback audit columns exist if table was created previously\n ensureColumns(\"request_logs\", [\n { name: \"cached_tokens\", definition: \"cached_tokens INTEGER NOT NULL DEFAULT 0\" },\n {\n name: \"cache_creation_tokens\",\n definition: \"cache_creation_tokens INTEGER NOT NULL DEFAULT 0\"\n },\n { name: \"reasoning_tokens\", definition: \"reasoning_tokens INTEGER NOT NULL DEFAULT 0\" },\n { name: \"estimated_cost\", definition: \"estimated_cost REAL NOT NULL DEFAULT 0\" },\n { name: \"fallback_occurred\", definition: \"fallback_occurred INTEGER NOT NULL DEFAULT 0\" },\n { name: \"fallback_path\", definition: \"fallback_path TEXT\" },\n { name: \"fallback_reason\", definition: \"fallback_reason TEXT\" },\n { name: \"resolved_model\", definition: \"resolved_model TEXT\" }\n ]);\n // 5. Table for Fallback Rules\n db.exec(`\n CREATE TABLE IF NOT EXISTS fallback_rules (\n id TEXT PRIMARY KEY,\n source_model TEXT NOT NULL,\n target_model TEXT NOT NULL,\n priority INTEGER NOT NULL DEFAULT 1,\n enabled INTEGER NOT NULL DEFAULT 1,\n trigger_on_status TEXT,\n max_retries INTEGER DEFAULT 1,\n created_at INTEGER NOT NULL\n );\n `);\n // 6. Table for Global System Settings\n db.exec(`\n CREATE TABLE IF NOT EXISTS system_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n `);\n // 7. Table for user-added custom models per provider driver\n db.exec(`\n CREATE TABLE IF NOT EXISTS custom_models (\n provider_id TEXT NOT NULL,\n model_id TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n PRIMARY KEY (provider_id, model_id)\n );\n `);\n}\n// Auto-run schema initialization\ninitDatabase();\n","import { randomUUID } from \"node:crypto\";\n/**\n * Generates a prefixed, collision-resistant identifier for DB rows.\n * Uses crypto.randomUUID instead of Math.random for unpredictability.\n */\nexport function generateId(prefix) {\n return `${prefix}_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n}\n/**\n * Safe scalar coercions for sqlite row values.\n */\nexport function str(value, fallback = \"\") {\n return value === null || value === undefined ? fallback : String(value);\n}\nexport function optStr(value) {\n return value === null || value === undefined ? undefined : String(value);\n}\nexport function num(value, fallback = 0) {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n","import { db } from \"./db.js\";\nimport { num, str } from \"./row-utils.js\";\nexport class AdminAuthStore {\n database;\n constructor(database = db) {\n this.database = database;\n this.database.exec(`\n CREATE TABLE IF NOT EXISTS admin_account (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n password_hash TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS admin_sessions (\n token_hash TEXT PRIMARY KEY,\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL\n );\n `);\n }\n hasAdminAccount() {\n const Row = this.database\n .prepare(\"SELECT 1 AS present FROM admin_account WHERE id = 1\")\n .get();\n return Boolean(Row);\n }\n createAdminAccount(passwordHash, now = Date.now()) {\n const Result = this.database\n .prepare(`INSERT OR IGNORE INTO admin_account (id, password_hash, created_at, updated_at)\n VALUES (1, ?, ?, ?)`)\n .run(passwordHash, now, now);\n return num(Result.changes) > 0;\n }\n getPasswordHash() {\n const Row = this.database\n .prepare(\"SELECT password_hash FROM admin_account WHERE id = 1\")\n .get();\n return Row?.password_hash ? str(Row.password_hash) : null;\n }\n updatePasswordHash(passwordHash, now = Date.now()) {\n const Result = this.database\n .prepare(`UPDATE admin_account\n SET password_hash = ?, updated_at = ?\n WHERE id = 1`)\n .run(passwordHash, now);\n return num(Result.changes) > 0;\n }\n createSession(tokenHash, createdAt, expiresAt) {\n this.database\n .prepare(`INSERT INTO admin_sessions (token_hash, created_at, expires_at)\n VALUES (?, ?, ?)`)\n .run(tokenHash, createdAt, expiresAt);\n }\n getSession(tokenHash, now = Date.now()) {\n this.database.prepare(\"DELETE FROM admin_sessions WHERE expires_at <= ?\").run(now);\n const Row = this.database\n .prepare(`SELECT token_hash, created_at, expires_at\n FROM admin_sessions\n WHERE token_hash = ? AND expires_at > ?`)\n .get(tokenHash, now);\n if (!Row)\n return null;\n return {\n tokenHash: str(Row.token_hash),\n createdAt: num(Row.created_at),\n expiresAt: num(Row.expires_at)\n };\n }\n deleteSession(tokenHash) {\n const Result = this.database\n .prepare(\"DELETE FROM admin_sessions WHERE token_hash = ?\")\n .run(tokenHash);\n return num(Result.changes) > 0;\n }\n}\nexport const adminAuthStore = new AdminAuthStore();\n","import { CODEBUDDY_CN_DOMAIN, CODEBUDDY_CN_USER_AGENT, isProviderBaseId } from \"@srouter/constants\";\nimport { getProviderModelUsageDB } from \"./logs.js\";\nimport { getAllProvidersDB } from \"./providers.js\";\nimport { num, str } from \"./row-utils.js\";\nfunction formatResetIn(resetTimeStr) {\n if (!resetTimeStr)\n return \"24h 0m\";\n const ResetTime = new Date(resetTimeStr).getTime();\n const Now = Date.now();\n const DiffMs = ResetTime - Now;\n if (DiffMs <= 0)\n return \"0m\";\n const Days = Math.floor(DiffMs / (1000 * 60 * 60 * 24));\n const Hours = Math.floor(DiffMs / (1000 * 60 * 60));\n if (Days > 0) {\n return `${Days}d ${Hours - Days * 24}h`;\n }\n const Minutes = Math.floor((DiffMs % (1000 * 60 * 60)) / (1000 * 60));\n if (Hours > 0) {\n return `${Hours}h ${Minutes}m`;\n }\n return `${Minutes}m`;\n}\nexport async function fetchAntigravityLiveQuota(providerId, accountName, accessToken, enabled = true) {\n if (!accessToken || !(accessToken.startsWith(\"ya29.\") || accessToken.length > 20)) {\n throw new Error(\"Antigravity quota requires a valid access token\");\n }\n const Res = await fetch(\"https://cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/1.0 (VSCode)\",\n \"x-goog-api-client\": \"gl-node/18.0.0 gd/1.0.0\"\n },\n body: JSON.stringify({})\n });\n if (!Res.ok) {\n throw new Error(`Antigravity quota fetch failed: HTTP ${Res.status}`);\n }\n const Data = (await Res.json());\n if (!Data.models || Object.keys(Data.models).length === 0) {\n throw new Error(\"Antigravity quota fetch returned no models\");\n }\n const Quotas = Object.entries(Data.models).map(([modelId, item]) => {\n const RemainingFraction = item.quotaInfo?.remainingFraction ?? 1.0;\n const PercentageValue = Math.round(RemainingFraction * 100);\n const Limit = 1000;\n const Used = Math.round((1 - RemainingFraction) * Limit);\n const ResetIn = formatResetIn(item.quotaInfo?.resetTime);\n let Status = \"ok\";\n if (PercentageValue <= 5)\n Status = \"exhausted\";\n else if (PercentageValue <= 20)\n Status = \"warning\";\n return {\n name: item.displayName || modelId,\n used: Used,\n limit: Limit,\n percentage: `${PercentageValue}%`,\n percentageValue: PercentageValue,\n resetIn: ResetIn,\n resetTime: item.quotaInfo?.resetTime,\n status: Status\n };\n });\n return {\n id: providerId,\n provider: \"Antigravity\",\n account: accountName,\n enabled,\n quotaType: \"live_provider_quota\",\n totalQuotas: Quotas.length,\n quotas: Quotas\n };\n}\nconst CN_REFILL_GAP_MS = 2 * 24 * 60 * 60 * 1000;\nexport async function fetchCodeBuddyCNLiveQuota(providerId, accountName, accessToken, enabled = true) {\n if (!accessToken) {\n throw new Error(\"CodeBuddy CN quota requires an access token\");\n }\n const Res = await fetch(\"https://copilot.tencent.com/v2/billing/meter/get-user-resource\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": CODEBUDDY_CN_USER_AGENT,\n \"X-Product\": \"SaaS\",\n \"X-IDE-Type\": \"CLI\",\n \"X-IDE-Name\": \"CLI\",\n \"X-Domain\": CODEBUDDY_CN_DOMAIN,\n \"x-requested-with\": \"XMLHttpRequest\",\n \"x-codebuddy-request\": \"1\"\n },\n body: \"{}\"\n });\n if (!Res.ok) {\n throw new Error(`CodeBuddy CN quota fetch failed: HTTP ${Res.status}`);\n }\n const Json = (await Res.json());\n if (Json.code !== 0) {\n throw new Error(`CodeBuddy CN quota error: ${Json.msg || \"unknown\"}`);\n }\n const Accounts = Json.data?.Response?.Data?.Accounts ?? [];\n if (Accounts.length === 0) {\n throw new Error(\"CodeBuddy CN quota fetch returned no credit packages\");\n }\n const cycleEndMs = (acc) => {\n const T = acc.CycleEndTime ? new Date(acc.CycleEndTime).getTime() : NaN;\n return Number.isFinite(T) ? T : Number.POSITIVE_INFINITY;\n };\n const isRefill = (acc) => {\n const Ce = cycleEndMs(acc);\n const De = num(acc.DeductionEndTime);\n return Number.isFinite(Ce) && Number.isFinite(De) && De - Ce > CN_REFILL_GAP_MS;\n };\n const byExpiry = (a, b) => cycleEndMs(a) - cycleEndMs(b);\n const Refills = Accounts.filter(isRefill).sort(byExpiry);\n const Bonuses = Accounts.filter((a) => !isRefill(a)).sort(byExpiry);\n const toItem = (name, used, total, resetTime) => {\n const RemainingFraction = total > 0 ? (total - used) / total : 1;\n return {\n name,\n used: Math.round(used * 100) / 100,\n limit: Math.round(total * 100) / 100,\n percentage: total > 0 ? `${Math.round((used / total) * 100)}%` : \"0%\",\n percentageValue: total > 0 ? Math.round((used / total) * 100) : 0,\n resetIn: formatResetIn(resetTime),\n resetTime,\n status: RemainingFraction <= 0.05\n ? \"exhausted\"\n : RemainingFraction <= 0.2\n ? \"warning\"\n : \"ok\"\n };\n };\n const parseNum = (precise, plain) => {\n return num(precise ?? plain);\n };\n const Quotas = [];\n const SeenCadence = {};\n for (const acc of Refills) {\n const CycleStartMs = acc.CycleStartTime ? new Date(acc.CycleStartTime).getTime() : NaN;\n const CycleDays = (cycleEndMs(acc) - CycleStartMs) / 86400000;\n const Base = Number.isFinite(CycleDays) && CycleDays <= 1.5\n ? \"Daily\"\n : Number.isFinite(CycleDays) && CycleDays <= 10\n ? \"Weekly\"\n : \"Monthly\";\n SeenCadence[Base] = (SeenCadence[Base] ?? 0) + 1;\n const Name = SeenCadence[Base] > 1 ? `${Base} ${SeenCadence[Base]}` : Base;\n Quotas.push(toItem(Name, parseNum(acc.CycleCapacityUsedPrecise, acc.CycleCapacityUsed), parseNum(acc.CycleCapacitySizePrecise, acc.CycleCapacitySize), acc.CycleEndTime));\n }\n Bonuses.forEach((acc, i) => {\n Quotas.push(toItem(`Bonus Pack ${i + 1}`, parseNum(acc.CapacityUsedPrecise, acc.CapacityUsed), parseNum(acc.CapacitySizePrecise, acc.CapacitySize), acc.CycleEndTime));\n });\n const BasePkg = Refills[0] ?? Accounts[0] ?? {};\n const Plan = BasePkg.PackageName || BasePkg.SubProductName;\n return {\n id: providerId,\n provider: Plan ? `CodeBuddy CN (${Plan})` : \"CodeBuddy CN\",\n account: accountName,\n enabled,\n quotaType: \"live_provider_quota\",\n totalQuotas: Quotas.length,\n quotas: Quotas\n };\n}\nexport async function getProviderQuotaAccount(p) {\n const IsAntigravity = isProviderBaseId(p.providerId, \"antigravity\") || isProviderBaseId(p.id, \"antigravity\");\n const IsOpenAICodex = isProviderBaseId(p.providerId, \"openai_codex\") || isProviderBaseId(p.id, \"openai_codex\");\n const IsOpenAI = isProviderBaseId(p.providerId, \"openai\") || isProviderBaseId(p.id, \"openai\");\n const IsAnthropic = isProviderBaseId(p.providerId, \"anthropic\") || isProviderBaseId(p.id, \"anthropic\");\n const IsCodeBuddyCN = isProviderBaseId(p.providerId, \"codebuddy-cn\") || isProviderBaseId(p.id, \"codebuddy-cn\");\n const IsCodeBuddy = !IsCodeBuddyCN &&\n (isProviderBaseId(p.providerId, \"codebuddy\") || isProviderBaseId(p.id, \"codebuddy\"));\n const Token = p.accessToken || p.apiKey || \"\";\n if (IsCodeBuddy) {\n throw new Error(\"CodeBuddy (international) does not expose a live quota endpoint\");\n }\n if (IsCodeBuddyCN) {\n return await fetchCodeBuddyCNLiveQuota(p.id, p.name || \"CodeBuddy CN Account\", Token, p.enabled);\n }\n if (IsAntigravity) {\n return await fetchAntigravityLiveQuota(p.id, p.name || \"seaavey@gmail.com\", Token, p.enabled);\n }\n const UsageRows = getProviderModelUsageDB(p.id);\n const UsageMetrics = UsageRows.map((row) => ({\n model: row.model,\n totalRequests: row.totalRequests,\n totalTokens: row.totalTokens,\n promptTokens: row.promptTokens,\n completionTokens: row.completionTokens,\n lastUsedAt: row.lastUsedAt ? new Date(row.lastUsedAt).toISOString() : null\n }));\n let ProviderName = p.name || p.providerId || p.id;\n if (IsOpenAICodex)\n ProviderName = \"OpenAI Codex\";\n else if (IsOpenAI)\n ProviderName = \"OpenAI\";\n else if (IsAnthropic)\n ProviderName = \"Anthropic\";\n return {\n id: p.id,\n provider: ProviderName,\n account: p.name || `${ProviderName} Account`,\n enabled: p.enabled,\n quotaType: \"usage_logged\",\n usageMetrics: UsageMetrics\n };\n}\nexport async function getQuotaSummaryDB() {\n const DbProviders = getAllProvidersDB();\n const ProviderAccounts = [];\n for (const p of DbProviders) {\n try {\n const Account = await getProviderQuotaAccount(p);\n ProviderAccounts.push(Account);\n }\n catch {\n // Skip providers whose quota cannot be fetched\n }\n }\n return {\n object: \"quota\",\n totalAccounts: ProviderAccounts.length,\n providers: ProviderAccounts\n };\n}\n"],"mappings":"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","names":["intro","outro","spinner","note","fs","path","os","os","path","fs","p","p","os","path","fs","xdgConfig","fs","path","os","fs","path","str","fs","path","intro","spinner","note","outro","customInput","val","fs","os","path","DatabaseSync","path","fs","os","path","os","fs","DatabaseSync"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../packages/constants/dist/providers/kiro.js","../../../packages/constants/dist/providers/neosantara.js","../../../packages/constants/dist/providers/gorouter.js","../../../packages/constants/dist/providers/bluesminds.js","../../../packages/constants/dist/providers/seekai.js","../../../packages/constants/dist/providers/tabitoken.js","../../../packages/constants/dist/providers/tokenrouter.js","../../../packages/constants/dist/providers/commandcode.js","../../../packages/constants/dist/providers/openai.js","../../../packages/constants/dist/providers/anthropic.js","../../../packages/constants/dist/providers/antigravity.js","../../../packages/constants/dist/providers/codebuddy.js","../../../packages/constants/dist/providers/qoder.js","../../../packages/constants/dist/providers/opencode.js","../../../packages/constants/dist/providers/catalog.js","../../../packages/constants/dist/seed.js","../../../packages/constants/dist/version.js","../src/commands/setup.ts","../src/lib/configStore.ts","../src/adapters/claude.ts","../src/adapters/base.ts","../src/lib/platform.ts","../src/adapters/opencode.ts","../src/lib/srouterClient.ts","../src/adapters/index.ts","../src/lib/ui.ts","../src/commands/link.ts","../src/commands/unlink.ts","../src/commands/sync.ts","../src/commands/status.ts","../src/commands/env.ts","../src/commands/run.ts","../src/commands/migrate.ts","../../../packages/db/dist/db.js","../../../packages/db/dist/row-utils.js","../../../packages/db/dist/adminAuth.js","../../../packages/db/dist/quota.js"],"sourcesContent":["import { Command } from \"commander\";\nimport { CLI_VERSION } from \"@srouter/constants\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { linkCommand } from \"./commands/link.js\";\nimport { unlinkCommand } from \"./commands/unlink.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { envCommand } from \"./commands/env.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { migrateCommand } from \"./commands/migrate.js\";\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name(\"srouter\")\n .description(\n \"CLI tool to connect, configure, and proxy AI coding tools with SRouter Gateway\"\n )\n .version(CLI_VERSION);\n\n program\n .command(\"setup\")\n .alias(\"config\")\n .description(\n \"Interactive wizard to connect AI coding tools (Claude Code, OpenCode) to SRouter\"\n )\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Default model ID to configure\")\n .option(\n \"--opus-model <model>\",\n \"Default Opus tier model for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Default Sonnet tier model for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Default Haiku tier model for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .action(async (opts) => {\n await setupCommand(opts);\n });\n\n program\n .command(\"link <tool>\")\n .description(\"Configure a specific tool to use SRouter proxy (claude, opencode)\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Model ID\")\n .option(\n \"--opus-model <model>\",\n \"Opus tier model ID for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Sonnet tier model ID for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Haiku tier model ID for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .option(\"--dry-run\", \"Preview configuration changes without writing files\")\n .action(async (tool, opts) => {\n await linkCommand(tool, opts);\n });\n\n program\n .command(\"unlink <tool>\")\n .description(\"Restore original configuration for a tool from backup\")\n .action(async (tool) => {\n await unlinkCommand(tool);\n });\n\n program\n .command(\"sync [tool]\")\n .description(\n \"Fetch latest models from SRouter Gateway and refresh tool configs (OpenCode, etc.)\"\n )\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .action(async (tool, opts) => {\n await syncCommand(tool, opts);\n });\n\n program\n .command(\"status\")\n .alias(\"doctor\")\n .description(\"Inspect SRouter gateway connectivity, active models, and tool link status\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .action(async (opts) => {\n await statusCommand(opts);\n });\n\n program\n .command(\"env [tool]\")\n .description(\"Print shell export commands for SRouter proxy environment variables\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Model ID\")\n .option(\n \"--opus-model <model>\",\n \"Opus tier model ID for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Sonnet tier model ID for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Haiku tier model ID for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .option(\"--fish\", \"Generate fish shell export syntax (shorthand for --shell fish)\")\n .option(\"--shell <shell>\", \"Target shell syntax (bash, zsh, fish, powershell, cmd)\")\n .action(async (tool, opts) => {\n await envCommand(tool, opts);\n });\n\n program\n .command(\"run <tool> [args...]\")\n .description(\"Run a tool CLI directly with SRouter proxy environment variables injected\")\n .option(\"-u, --url <url>\", \"SRouter Gateway Base URL (e.g. http://localhost:3000/v1)\")\n .option(\"-k, --key <key>\", \"SRouter API Key\")\n .option(\"-m, --model <model>\", \"Model ID\")\n .option(\n \"--opus-model <model>\",\n \"Opus tier model ID for Claude Code (ANTHROPIC_DEFAULT_OPUS_MODEL)\"\n )\n .option(\n \"--sonnet-model <model>\",\n \"Sonnet tier model ID for Claude Code (ANTHROPIC_DEFAULT_SONNET_MODEL)\"\n )\n .option(\n \"--haiku-model <model>\",\n \"Haiku tier model ID for Claude Code (ANTHROPIC_DEFAULT_HAIKU_MODEL)\"\n )\n .allowUnknownOption()\n .action(async (tool, args, opts) => {\n await runCommand(tool, args, opts);\n });\n\n program\n .command(\"migrate <target>\")\n .description(\"Migrate databases (targets: db = legacy location, 9router = 9Router import)\")\n .option(\"--source <path>\", \"Explicit path to the source SQLite database\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-a, --action <action>\", \"Migration conflict resolution (copy, merge, backup_and_replace)\")\n .action(async (target, opts) => {\n await migrateCommand(target, opts);\n });\n\n return program;\n}\n\nif (\n process.argv[1]?.endsWith(\"srouter.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"index.js\")\n) {\n const program = createCli();\n program.parse(process.argv);\n}\n","export const KIRO_PROVIDER = {\n id: \"kiro\",\n name: \"Kiro\",\n category: \"api_key\",\n protocol: \"custom\",\n web_url: \"https://aws.amazon.com/q/\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"Kiro credential missing\"\n};\n","export const NEOSANTARA_BASE_URL = \"https://api.neosantara.xyz/v1\";\nexport const NEOSANTARA_PROVIDER = {\n id: \"neosantara\",\n name: \"Neosantara\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: NEOSANTARA_BASE_URL,\n web_url: \"https://neosantara.xyz\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"Neosantara API key missing\"\n};\n","export const GOROUTER_BASE_URL = \"https://gorouter.app/v1\";\nexport const GOROUTER_PROVIDER = {\n id: \"gorouter\",\n name: \"GoRouter\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: GOROUTER_BASE_URL,\n web_url: \"https://gorouter.app/sign-up?aff=cJJn\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"GoRouter API key missing\"\n};\n","export const BLUESMINDS_BASE_URL = \"https://api.bluesminds.com/v1\";\nexport const BLUESMINDS_PROVIDER = {\n id: \"bluesminds\",\n name: \"BluesMinds\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: BLUESMINDS_BASE_URL,\n web_url: \"https://api.bluesminds.com/sign-up?aff=nCAw\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"BluesMinds API key missing\"\n};\n","export const SEEKAI_BASE_URL = \"https://seekai.cc/v1\";\nexport const SEEKAI_PROVIDER = {\n id: \"seekai\",\n name: \"SeekAI\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: SEEKAI_BASE_URL,\n web_url: \"https://seekai.cc/sign-up?aff=UU0C\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"SeekAI API key missing\"\n};\n","export const TABITOKEN_BASE_URL = \"https://tabitoken.com/v1\";\nexport const TABITOKEN_PROVIDER = {\n id: \"tabitoken\",\n name: \"TabiToken\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: TABITOKEN_BASE_URL,\n web_url: \"https://tabitoken.com/sign-up?aff=h5iN\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"TabiToken API key missing\"\n};\n","export const TOKENROUTER_BASE_URL = \"https://api.tokenrouter.com/v1\";\nexport const TOKENROUTER_PROVIDER = {\n id: \"tokenrouter\",\n name: \"TokenRouter\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: TOKENROUTER_BASE_URL,\n web_url: \"https://tokenrouter.com\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"TokenRouter API key missing\"\n};\n","export const COMMANDCODE_BASE_URL = \"https://api.commandcode.ai/alpha/generate\";\nexport const COMMANDCODE_MODELS_URL = \"https://api.commandcode.ai/provider/v1/models\";\nexport const COMMANDCODE_PROVIDER = {\n id: \"commandcode\",\n name: \"Command Code\",\n category: \"api_key\",\n protocol: \"openai\",\n base_url: COMMANDCODE_BASE_URL,\n web_url: \"https://commandcode.ai\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"Command Code API key missing\"\n};\n","export const OPENAI_BASE_URL = \"https://api.openai.com/v1\";\nexport const CODEX_BASE_URL = \"https://chatgpt.com/backend-api/codex/responses\";\nexport const CODEX_MODELS_URL = \"https://chatgpt.com/backend-api/codex/models\";\nexport const CODEX_OAUTH_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nexport const CODEX_OAUTH_AUTHORIZE_URL = \"https://auth.openai.com/oauth/authorize\";\nexport const CODEX_OAUTH_TOKEN_URL = \"https://auth.openai.com/oauth/token\";\nexport const CODEX_OAUTH_SCOPE = \"openid profile email offline_access api.connectors.read api.connectors.invoke\";\nexport const CODEX_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/callback\";\nexport const CODEX_OAUTH_ORIGINATOR = \"codex_cli_rs\";\nexport const OPENAI_CODEX_PROVIDER = {\n id: \"openai_codex\",\n name: \"OpenAI Codex / ChatGPT\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"openai\",\n web_url: \"https://chatgpt.com\",\n requires_api_key: false,\n requires_oauth: true,\n status_message: \"OAuth token missing\"\n};\n","export const ANTHROPIC_BASE_URL = \"https://api.anthropic.com/v1\";\nexport const CLAUDE_OAUTH_CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\nexport const CLAUDE_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/claude/callback\";\nexport const CLAUDE_OAUTH_SCOPE = \"org:create_api_key user:profile user:inference\";\nexport const CLAUDE_OAUTH_AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nexport const CLAUDE_OAUTH_TOKEN_URL = \"https://api.anthropic.com/v1/oauth/token\";\nexport const ANTHROPIC_PROVIDER = {\n id: \"anthropic\",\n name: \"Anthropic Claude\",\n category: \"oauth\",\n protocol: \"anthropic\",\n alias: \"claude\",\n web_url: \"https://claude.ai\",\n requires_api_key: false,\n requires_oauth: true,\n status_message: \"OAuth token missing\"\n};\n","export const ANTIGRAVITY_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta/openai\";\nexport const ANTIGRAVITY_IDE_BASE_URL = \"https://daily-cloudcode-pa.googleapis.com\";\nexport const ANTIGRAVITY_OAUTH_CLIENT_ID = \"1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com\";\nexport const ANTIGRAVITY_OAUTH_CLIENT_SECRET = \"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\";\nexport const ANTIGRAVITY_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/antigravity/callback\";\nexport const ANTIGRAVITY_OAUTH_SCOPE = \"openid profile email https://www.googleapis.com/auth/cloud-platform\";\nexport const ANTIGRAVITY_OAUTH_AUTHORIZE_URL = \"https://accounts.google.com/o/oauth2/v2/auth\";\nexport const ANTIGRAVITY_OAUTH_TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nexport const ANTIGRAVITY_OAUTH_PROMPT = \"consent\";\nexport const ANTIGRAVITY_MODELS = [\n { id: \"gemini-3.7-flash-high\", name: \"Gemini 3.7 Flash (High)\" },\n { id: \"gemini-3.7-flash-medium\", name: \"Gemini 3.7 Flash (Medium)\" },\n { id: \"gemini-3.7-flash-low\", name: \"Gemini 3.7 Flash (Low)\" },\n { id: \"gemini-3.6-flash-high\", name: \"Gemini 3.6 Flash (High)\" },\n { id: \"gemini-3.6-flash-medium\", name: \"Gemini 3.6 Flash (Medium)\" },\n { id: \"gemini-3.6-flash-low\", name: \"Gemini 3.6 Flash (Low)\" },\n { id: \"gemini-3.5-flash-high\", name: \"Gemini 3.5 Flash (High)\" },\n { id: \"gemini-3.5-flash-medium\", name: \"Gemini 3.5 Flash (Medium)\" },\n { id: \"gemini-3.5-flash-low\", name: \"Gemini 3.5 Flash (Low)\" },\n { id: \"gemini-3.1-pro-high\", name: \"Gemini 3.1 Pro (High)\" },\n { id: \"gemini-3.1-pro-low\", name: \"Gemini 3.1 Pro (Low)\" },\n { id: \"claude-sonnet-4-6\", name: \"Claude Sonnet 4.6 (Thinking)\" },\n { id: \"claude-opus-4-6-thinking\", name: \"Claude Opus 4.6 (Thinking)\" },\n { id: \"gpt-oss-120b-medium\", name: \"GPT-OSS 120B (Medium)\" }\n];\nexport const ANTIGRAVITY_MODEL_IDS = ANTIGRAVITY_MODELS.map((m) => m.id);\nexport const ANTIGRAVITY_PROVIDER = {\n id: \"antigravity\",\n name: \"Google Antigravity\",\n category: \"oauth\",\n protocol: \"openai\",\n base_url: ANTIGRAVITY_IDE_BASE_URL,\n web_url: \"https://ai.google.dev\",\n requires_api_key: false,\n requires_oauth: true,\n status_message: \"Antigravity OAuth token missing\"\n};\n","export const CODEBUDDY_BASE_URL = \"https://www.codebuddy.ai/v2/chat/completions\";\nexport const CODEBUDDY_AUTH_BASE = \"https://www.codebuddy.ai\";\nexport const CODEBUDDY_AUTH_STATE_URL = \"https://www.codebuddy.ai/v2/plugin/auth/state\";\nexport const CODEBUDDY_AUTH_TOKEN_URL = \"https://www.codebuddy.ai/v2/plugin/auth/token\";\nexport const CODEBUDDY_AUTH_REFRESH_URL = \"https://www.codebuddy.ai/v2/plugin/auth/token/refresh\";\nexport const CODEBUDDY_CN_BASE_URL = \"https://copilot.tencent.com/v2/chat/completions\";\nexport const CODEBUDDY_CN_AUTH_BASE = \"https://copilot.tencent.com\";\nexport const CODEBUDDY_CN_AUTH_STATE_URL = \"https://copilot.tencent.com/v2/plugin/auth/state\";\nexport const CODEBUDDY_CN_AUTH_TOKEN_URL = \"https://copilot.tencent.com/v2/plugin/auth/token\";\nexport const CODEBUDDY_CN_AUTH_REFRESH_URL = \"https://copilot.tencent.com/v2/plugin/auth/token/refresh\";\nexport const CODEBUDDY_CN_ORIGIN = \"https://www.codebuddy.cn\";\nexport const CODEBUDDY_CN_DOMAIN = \"www.codebuddy.cn\";\nexport const CODEBUDDY_CN_USER_AGENT = \"CLI/2.96.0 CodeBuddy/2.96.0\";\nexport const CODEBUDDY_AUTH_USER_AGENT = \"IDE/2.63.2 CodeBuddy/2.63.2\";\nexport const CODEBUDDY_AUTH_PLATFORM = \"ide\";\nexport const CODEBUDDY_MODELS = [\n { id: \"default-model\", name: \"Default (CodeBuddy)\" },\n { id: \"default-model-lite\", name: \"Default-Lite\" },\n { id: \"gpt-5.5\", name: \"GPT-5.5\" },\n { id: \"gpt-5.4\", name: \"GPT-5.4\" },\n { id: \"gpt-5.3-codex\", name: \"GPT-5.3-Codex\" },\n { id: \"gpt-5.1-codex\", name: \"GPT-5.1-Codex\" },\n { id: \"gpt-5.1-codex-mini\", name: \"GPT-5.1-Codex-Mini\" },\n { id: \"gemini-3.1-pro\", name: \"Gemini 3.1 Pro\" },\n { id: \"gemini-3.5-flash\", name: \"Gemini 3.5 Flash\" },\n { id: \"gemini-3.0-flash\", name: \"Gemini 3.0 Flash\" },\n { id: \"gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"gemini-3.1-flash-lite\", name: \"Gemini 3.1 Flash Lite\" },\n { id: \"deepseek-v3\", name: \"DeepSeek-V3\" },\n { id: \"deepseek-v3-2-volc\", name: \"DeepSeek-V3.2\" },\n { id: \"deepseek-v4-pro\", name: \"DeepSeek-V4-Pro\" },\n { id: \"deepseek-v4-flash\", name: \"DeepSeek-V4-Flash\" },\n { id: \"glm-5.3\", name: \"GLM-5.3\" },\n { id: \"glm-5.2\", name: \"GLM-5.2\" },\n { id: \"glm-5.1\", name: \"GLM-5.1\" },\n { id: \"glm-5.0\", name: \"GLM-5.0\" },\n { id: \"glm-5.0-turbo\", name: \"GLM-5.0-Turbo\" },\n { id: \"glm-5v-turbo\", name: \"GLM-5v-Turbo\" },\n { id: \"glm-4.7\", name: \"GLM-4.7\" },\n { id: \"minimax-m3\", name: \"MiniMax-M3\" },\n { id: \"minimax-m2.7\", name: \"MiniMax-M2.7\" },\n { id: \"kimi-k3\", name: \"Kimi-K3\" },\n { id: \"kimi-k2.7\", name: \"Kimi-K2.7-Code\" },\n { id: \"kimi-k2.6\", name: \"Kimi-K2.6\" },\n { id: \"kimi-k2.5\", name: \"Kimi-K2.5\" },\n { id: \"hy3-preview\", name: \"Hy3 Preview\" }\n];\nexport const CODEBUDDY_MODEL_IDS = CODEBUDDY_MODELS.map((m) => m.id);\nexport const CODEBUDDY_PROVIDER = {\n id: \"codebuddy\",\n name: \"CodeBuddy\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"codebuddy\",\n base_url: CODEBUDDY_BASE_URL,\n web_url: \"https://www.codebuddy.ai\",\n requires_api_key: false,\n requires_oauth: true,\n supports_custom_url: true,\n status_message: \"CodeBuddy OAuth token missing\"\n};\nexport const CODEBUDDY_CN_PROVIDER = {\n id: \"codebuddy-cn\",\n name: \"CodeBuddy CN\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"codebuddy-cn\",\n base_url: CODEBUDDY_CN_BASE_URL,\n web_url: \"https://www.codebuddy.cn\",\n requires_api_key: false,\n requires_oauth: true,\n supports_custom_url: true,\n status_message: \"CodeBuddy CN OAuth token missing\"\n};\n","export const QODER_MODELS = [\n { id: \"qwen3.8-max-preview\", name: \"Qwen 3.8 Max Preview\", level: \"qmodel_preview\" },\n { id: \"qwen3.7-max\", name: \"Qwen 3.7 Max\", level: \"qmodel_latest\" },\n { id: \"qwen3.7-plus\", name: \"Qwen 3.7 Plus\", level: \"qmodel\" },\n { id: \"kimi-k3\", name: \"Kimi K3\", level: \"kmodel_latest\" },\n { id: \"kimi-k2.7-code\", name: \"Kimi K2.7 Code\", level: \"kmodel\" },\n { id: \"glm-5.2\", name: \"GLM 5.2\", level: \"gm51model\" },\n { id: \"deepseek-v4-pro\", name: \"DeepSeek V4 Pro\", level: \"dmodel\" },\n { id: \"deepseek-v4-flash\", name: \"DeepSeek V4 Flash\", level: \"dfmodel\" },\n { id: \"minimax-m3\", name: \"MiniMax M3\", level: \"mmodel\" },\n { id: \"ultimate\", name: \"Qoder Ultimate\" },\n { id: \"qmodel_38max\", name: \"Qwen 3.8 Max\" },\n { id: \"qmodel_preview\", name: \"Qwen Preview\" },\n { id: \"qmodel_latest\", name: \"Qwen Latest\" },\n { id: \"qmodel\", name: \"Qwen Standard\" },\n { id: \"auto\", name: \"Qoder Auto\" },\n { id: \"performance\", name: \"Qoder Performance\" },\n { id: \"efficient\", name: \"Qoder Efficient\" },\n { id: \"lite\", name: \"Qoder Lite\" },\n { id: \"kmodel_latest\", name: \"Kimi K3 (Raw)\" },\n { id: \"kmodel\", name: \"Kimi K2.7 (Raw)\" },\n { id: \"gmodel\", name: \"GLM (Raw)\" },\n { id: \"gm51model\", name: \"GLM 5.2 (Raw)\" },\n { id: \"dmodel\", name: \"DeepSeek Pro (Raw)\" },\n { id: \"dfmodel\", name: \"DeepSeek Flash (Raw)\" },\n { id: \"mmodel\", name: \"MiniMax (Raw)\" }\n];\nexport const QODER_MODEL_ALIASES = {\n \"qwen3.8-max-preview\": \"qmodel_preview\",\n \"qwen-3.8-max-preview\": \"qmodel_preview\",\n \"qwen3.8-max\": \"qmodel_38max\",\n \"qwen-3.8-max\": \"qmodel_38max\",\n \"qwen3.7-max\": \"qmodel_latest\",\n \"qwen-3.7-max\": \"qmodel_latest\",\n \"qwen3.7-plus\": \"qmodel\",\n \"qwen-3.7-plus\": \"qmodel\",\n \"kimi-k3\": \"kmodel_latest\",\n \"kimi-k2.7-code\": \"kmodel\",\n \"glm-5.2\": \"gm51model\",\n \"deepseek-v4-pro\": \"dmodel\",\n \"deepseek-v4-flash\": \"dfmodel\",\n \"minimax-m3\": \"mmodel\",\n ultimate: \"ultimate\",\n auto: \"auto\",\n performance: \"performance\",\n efficient: \"efficient\",\n lite: \"lite\"\n};\nexport const QODER_MODEL_IDS = QODER_MODELS.map((m) => m.id);\nexport const QODER_OPENAPI_BASE = \"https://openapi.qoder.sh\";\nexport const QODER_CENTER_BASE = \"https://center.qoder.sh\";\nexport const QODER_CHAT_BASE = \"https://api3.qoder.sh\";\nexport const QODER_CHAT_BASE_ALT = \"https://api2.qoder.sh\";\nexport const QODER_LOGIN_URL = \"https://qoder.com/device/selectAccounts\";\nexport const QODER_DEVICE_TOKEN_URL = `${QODER_OPENAPI_BASE}/api/v1/deviceToken/poll`;\nexport const QODER_USERINFO_URL = `${QODER_OPENAPI_BASE}/api/v1/userinfo`;\nexport const QODER_QUOTA_USAGE_URL = `${QODER_OPENAPI_BASE}/api/v2/quota/usage`;\nexport const QODER_REFRESH_TOKEN_URL = `${QODER_CENTER_BASE}/algo/api/v3/user/refresh_token`;\nexport const QODER_JOB_TOKEN_EXCHANGE_URL = `${QODER_OPENAPI_BASE}/api/v1/jobToken/exchange`;\nexport const QODER_CHAT_SIG_PATH = \"/api/v2/service/pro/sse/agent_chat_generation\";\nexport const QODER_CHAT_URL = `${QODER_CHAT_BASE}/algo${QODER_CHAT_SIG_PATH}?FetchKeys=llm_model_result&AgentId=agent_common`;\nexport const QODER_CHAT_URL_ENCODED = `${QODER_CHAT_URL}&Encode=1`;\nexport const QODER_MODEL_LIST_URL = `${QODER_CHAT_BASE}/algo/api/v2/model/list`;\nexport const QODER_IDE_VERSION = \"1.0.0\";\nexport const QODER_CLIENT_TYPE = \"5\";\nexport const QODER_DATA_POLICY = \"disagree\";\nexport const QODER_LOGIN_VERSION = \"v2\";\nexport const QODER_MACHINE_OS = \"x86_64_windows\";\nexport const QODER_MACHINE_TYPE = \"5\";\nexport const QODER_RSA_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA8iMH5c02LilrsERw9t6Pv5Nc\n4k6Pz1EaDicBMpdpxKduSZu5OANqUq8er4GM95omAGIOPOh+Nx0spthYA2BqGz+l\n6HRkPJ7S236FZz73In/KVuLnwI8JJ2CbuJap8kvheCCZpmAWpb/cPx/3Vr/J6I17\nXcW+ML9FoCI6AOvOzwIDAQAB\n-----END PUBLIC KEY-----`;\nexport const QODER_PROVIDER = {\n id: \"qoder\",\n name: \"Qoder\",\n category: \"oauth\",\n protocol: \"openai\",\n alias: \"qd\",\n base_url: QODER_CHAT_URL_ENCODED,\n web_url: \"https://qoder.com\",\n requires_api_key: false,\n requires_oauth: true,\n supports_custom_url: true,\n status_message: \"Qoder token or session missing\"\n};\n","export const OPENCODE_ZEN_BASE_URL = \"https://opencode.ai/zen/v1\";\nexport const OPENCODE_ZEN_MODELS = [\n { id: \"x-preview-f-free\", name: \"Ox Alpha Free (Unlimited)\" },\n { id: \"big-pickle\", name: \"Big Pickle (Free)\" },\n { id: \"laguna-s-2.1-free\", name: \"Poolside Laguna S 2.1 (Free)\" },\n { id: \"nemotron-3.5-lightning-free\", name: \"Nemotron 3.5 Lightning (Free)\" },\n { id: \"nemotron-3-ultra-free\", name: \"Nemotron 3 Ultra (Free)\" },\n { id: \"mimo-v2.5-free\", name: \"Xiaomi MiMo V2.5 (Free)\" }\n];\nexport const OPENCODE_ZEN_MODEL_IDS = OPENCODE_ZEN_MODELS.map((m) => m.id);\nexport const OPENCODE_ZEN_PROVIDER = {\n id: \"opencode_zen\",\n name: \"OpenCode Zen\",\n category: \"free_tier\",\n protocol: \"openai\",\n alias: \"zen\",\n base_url: OPENCODE_ZEN_BASE_URL,\n web_url: \"https://opencode.ai/zen\",\n requires_api_key: false,\n requires_oauth: false,\n supports_custom_url: true,\n status_message: \"Free Tier Ready (Unlimited)\"\n};\n","import { ANTHROPIC_PROVIDER } from \"./anthropic.js\";\nimport { ANTIGRAVITY_PROVIDER } from \"./antigravity.js\";\nimport { BLUESMINDS_PROVIDER } from \"./bluesminds.js\";\nimport { CODEBUDDY_CN_PROVIDER, CODEBUDDY_PROVIDER } from \"./codebuddy.js\";\nimport { COMMANDCODE_PROVIDER } from \"./commandcode.js\";\nimport { GOROUTER_PROVIDER } from \"./gorouter.js\";\nimport { KIRO_PROVIDER } from \"./kiro.js\";\nimport { NEOSANTARA_PROVIDER } from \"./neosantara.js\";\nimport { OPENAI_CODEX_PROVIDER } from \"./openai.js\";\nimport { OPENCODE_ZEN_PROVIDER } from \"./opencode.js\";\nimport { QODER_PROVIDER } from \"./qoder.js\";\nimport { SEEKAI_PROVIDER } from \"./seekai.js\";\nimport { TABITOKEN_PROVIDER } from \"./tabitoken.js\";\nimport { TOKENROUTER_PROVIDER } from \"./tokenrouter.js\";\nexport const KNOWN_PROVIDERS = [\n KIRO_PROVIDER,\n NEOSANTARA_PROVIDER,\n GOROUTER_PROVIDER,\n BLUESMINDS_PROVIDER,\n SEEKAI_PROVIDER,\n TABITOKEN_PROVIDER,\n TOKENROUTER_PROVIDER,\n OPENAI_CODEX_PROVIDER,\n ANTHROPIC_PROVIDER,\n ANTIGRAVITY_PROVIDER,\n COMMANDCODE_PROVIDER,\n QODER_PROVIDER,\n CODEBUDDY_PROVIDER,\n CODEBUDDY_CN_PROVIDER,\n OPENCODE_ZEN_PROVIDER\n];\nexport const KNOWN_PROVIDER_MAP = Object.freeze(Object.fromEntries(KNOWN_PROVIDERS.map((Provider) => [Provider.id, Provider])));\nconst KNOWN_PROVIDER_IDS_DESC = Object.freeze(Object.keys(KNOWN_PROVIDER_MAP).sort((A, B) => B.length - A.length));\nconst LEGACY_ALIAS_MAP = Object.freeze({\n claude: \"claude\",\n cbai: \"codebuddy\"\n});\nexport function providerById(Id) {\n return KNOWN_PROVIDER_MAP[Id];\n}\nexport function isKnownProvider(Id) {\n return Id in KNOWN_PROVIDER_MAP;\n}\nexport function providerBaseId(Id) {\n return (KNOWN_PROVIDER_IDS_DESC.find((Candidate) => Id === Candidate || Id.startsWith(`${Candidate}_`) || Id.startsWith(`${Candidate}-`)) ??\n Id.split(\"_\")[0]?.split(\"-\")[0] ??\n Id);\n}\nexport function isProviderBaseId(Id, BaseId) {\n return Id === BaseId || Id.startsWith(`${BaseId}_`) || Id.startsWith(`${BaseId}-`);\n}\nexport function providerAlias(BaseId) {\n return KNOWN_PROVIDER_MAP[BaseId]?.alias ?? BaseId;\n}\nexport function providerTypeForAlias(Alias) {\n if (Alias in LEGACY_ALIAS_MAP)\n return LEGACY_ALIAS_MAP[Alias];\n return KNOWN_PROVIDERS.find((P) => P.alias === Alias || P.id === Alias)?.id ?? null;\n}\nexport function getProviderWebsiteUrl(ProviderId, DefaultBaseUrl) {\n const BaseId = providerBaseId(ProviderId);\n const Metadata = KNOWN_PROVIDER_MAP[ProviderId] ?? KNOWN_PROVIDER_MAP[BaseId];\n if (Metadata?.web_url)\n return Metadata.web_url;\n if (!DefaultBaseUrl)\n return undefined;\n try {\n return new URL(DefaultBaseUrl).origin;\n }\n catch {\n return undefined;\n }\n}\n","import { KNOWN_PROVIDERS } from \"./providers.js\";\nexport const DEFAULT_PROVIDERS = Object.freeze(KNOWN_PROVIDERS.map(({ alias: _alias, ...seed }) => seed));\nexport const DEFAULT_PROVIDER_MAP = Object.freeze(Object.fromEntries(DEFAULT_PROVIDERS.map((seed) => [seed.id, seed])));\nexport const SEED_MARKER = \"__seed__\";\nexport function isSeedProvider(row) {\n return row.providerSpecificData?.[SEED_MARKER] === \"true\";\n}\n","export const GLOBAL_VERSION = \"0.1.3\";\nexport const APP_VERSION = GLOBAL_VERSION;\nexport const API_VERSION = GLOBAL_VERSION;\nexport const CLI_VERSION = GLOBAL_VERSION;\n// Backward-compat aliases\nexport const SROUTER_VERSION = GLOBAL_VERSION;\nexport const SROUTER_VERSION_TAG = `v${GLOBAL_VERSION}`;\n","import {\n intro,\n outro,\n spinner,\n text,\n select,\n multiselect,\n isCancel,\n cancel,\n note\n} from \"@clack/prompts\";\nimport { getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { getSystemInfo } from \"../lib/platform.js\";\nimport { checkServerHealth, fetchAvailableModels } from \"../lib/srouterClient.js\";\nimport { pc, showHeader } from \"../lib/ui.js\";\n\nexport interface SetupWizardOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n}\n\nexport async function setupCommand(options: SetupWizardOptions = {}): Promise<void> {\n showHeader();\n const sysInfo = getSystemInfo();\n intro(\n `${pc.bold(pc.magenta(\"SRouter AI Coding Setup Wizard\"))} ${pc.gray(`(${sysInfo.displayName})`)}`\n );\n\n const savedConfig = await defaultStore.loadConfig();\n let baseUrl =\n options.url ||\n process.env.SROUTER_BASE_URL ||\n savedConfig.defaultBaseUrl ||\n \"http://localhost:3000/v1\";\n let apiKey = options.key || process.env.SROUTER_API_KEY || savedConfig.defaultApiKey;\n let selectedModel = options.model;\n let opusModel = options.opusModel;\n let sonnetModel = options.sonnetModel;\n let haikuModel = options.haikuModel;\n\n // Step 1: Detect SRouter Server\n const s = spinner();\n s.start(`Checking SRouter gateway connectivity at ${pc.cyan(baseUrl)}...`);\n\n let health = await checkServerHealth(baseUrl, apiKey);\n let availableModels: string[] = [];\n\n if (health.healthy) {\n s.stop(\n pc.green(\n `SRouter is ONLINE (${health.latencyMs}ms, ${health.modelsCount} models found)`\n )\n );\n availableModels = await fetchAvailableModels(baseUrl, apiKey);\n } else {\n s.stop(pc.yellow(`Could not reach SRouter at ${baseUrl} (${health.error || \"offline\"})`));\n\n const urlInput = await text({\n message: \"Enter SRouter Gateway Base URL:\",\n initialValue: baseUrl,\n validate(value) {\n const val = typeof value === \"string\" ? value.trim() : \"\";\n if (!val) return \"Base URL cannot be empty\";\n if (!val.startsWith(\"http://\") && !val.startsWith(\"https://\")) {\n return \"URL must start with http:// or https://\";\n }\n }\n });\n\n if (isCancel(urlInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n const urlStr = typeof urlInput === \"string\" ? urlInput.trim() : baseUrl;\n if (urlStr) {\n baseUrl = urlStr;\n }\n\n s.start(`Connecting to ${pc.cyan(baseUrl)}...`);\n health = await checkServerHealth(baseUrl, apiKey);\n if (health.healthy) {\n s.stop(pc.green(`Connected to SRouter (${health.modelsCount} models found)`));\n availableModels = await fetchAvailableModels(baseUrl, apiKey);\n } else {\n s.stop(pc.yellow(`Proceeding with offline / unverified endpoint: ${baseUrl}`));\n }\n }\n\n // Step 2: Prompt for API Key if not set\n if (!apiKey) {\n const keyInput = await text({\n message:\n \"Enter SRouter API Key (press Enter to skip if running in local auth-free mode):\",\n placeholder: \"sk-...\"\n });\n\n if (isCancel(keyInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n const keyStr = typeof keyInput === \"string\" ? keyInput.trim() : \"\";\n if (keyStr) {\n apiKey = keyStr;\n if (availableModels.length === 0) {\n availableModels = await fetchAvailableModels(baseUrl, apiKey);\n }\n }\n }\n\n // Step 3: Tool Selection Checklist (Multi-select)\n const adapters = getAllAdapters();\n const adapterStatuses = await Promise.all(adapters.map((a) => a.getStatus()));\n\n const toolOptions = adapters.map((adapter, idx) => {\n const st = adapterStatuses[idx];\n let label = adapter.name;\n let hint = \"\";\n\n if (st.linked) {\n label = `${adapter.name} [✔ CONFIGURED]`;\n const modelPart = st.currentModel ? `, Model: ${st.currentModel}` : \"\";\n hint = `Active on ${st.currentBaseUrl}${modelPart} (Select to update settings)`;\n } else if (st.installed) {\n label = `${adapter.name} [○ NOT CONFIGURED]`;\n hint = `${adapter.description} (Installed on system)`;\n } else {\n label = `${adapter.name} [✖ NOT INSTALLED]`;\n hint = `${adapter.description} (Executable not found in PATH)`;\n }\n\n return {\n value: adapter.id,\n label,\n hint\n };\n });\n\n const selectedTools = await multiselect({\n message:\n \"Select AI coding tools to connect to SRouter (Use Space to select, Enter to confirm):\",\n options: toolOptions,\n required: false\n });\n\n if (isCancel(selectedTools)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n const toolsToConfigure = Array.isArray(selectedTools) ? (selectedTools as string[]) : [];\n\n if (toolsToConfigure.length === 0) {\n await defaultStore.saveConfig({\n defaultBaseUrl: baseUrl,\n defaultApiKey: apiKey,\n lastSetupAt: Date.now()\n });\n\n note(\n `Base URL: ${pc.cyan(baseUrl)}\\n${apiKey ? `API Key: ${pc.gray(\"••••••••\" + apiKey.slice(-4))}\\n` : \"\"}\\n${pc.yellow(\"No tools selected for configuration.\")}`,\n \"Configuration Summary\"\n );\n outro(\n pc.bold(\n pc.green(\n \"✔ Gateway settings saved. You can run 'srouter setup' or 'srouter link <tool>' at any time.\"\n )\n )\n );\n return;\n }\n\n // Step 4: Model Selection\n if (!selectedModel) {\n const currentDefault = savedConfig.defaultModel || \"claude-3-7-sonnet\";\n\n if (availableModels.length > 0) {\n const defaultHint = `(${currentDefault}) - all ${availableModels.length} models are automatically registered in OpenCode`;\n const modelChoice = await select({\n message: \"Select default model for tools:\",\n options: [\n {\n value: \"__skip__\",\n label: `Use default / Skip ${pc.gray(defaultHint)}`\n },\n {\n value: \"__popular__\",\n label: \"Choose from popular models (Claude 3.7, GPT-4o, Gemini 2.5, DeepSeek R1)...\"\n },\n {\n value: \"__custom__\",\n label: \"Enter model ID manually...\"\n },\n {\n value: \"__browse__\",\n label: `Browse full model list (${availableModels.length} models)...`\n }\n ]\n });\n\n if (isCancel(modelChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n if (modelChoice === \"__skip__\") {\n selectedModel = currentDefault;\n } else if (modelChoice === \"__popular__\") {\n const popularChoice = await select({\n message: \"Choose a popular model:\",\n options: [\n { value: \"claude-3-7-sonnet\", label: \"Claude 3.7 Sonnet (Recommended)\" },\n { value: \"claude-3-5-sonnet\", label: \"Claude 3.5 Sonnet\" },\n { value: \"gpt-4o\", label: \"GPT-4o (OpenAI)\" },\n { value: \"gemini-2.5-pro\", label: \"Gemini 2.5 Pro (Google)\" },\n { value: \"gemini-2.5-flash\", label: \"Gemini 2.5 Flash (Fast)\" },\n { value: \"deepseek-r1\", label: \"DeepSeek R1 (Reasoning)\" },\n { value: \"combo/flagship\", label: \"Combo: Flagship Cascade\" },\n { value: \"__custom__\", label: \"Other / Custom ID...\" }\n ]\n });\n if (isCancel(popularChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n if (popularChoice === \"__custom__\") {\n const customModelInput = await text({\n message: \"Enter custom model ID:\",\n placeholder: currentDefault\n });\n if (isCancel(customModelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const customModelStr =\n typeof customModelInput === \"string\" ? customModelInput.trim() : \"\";\n selectedModel = customModelStr || currentDefault;\n } else {\n selectedModel = popularChoice as string;\n }\n } else if (modelChoice === \"__custom__\") {\n const customModelInput = await text({\n message: \"Enter custom model ID:\",\n placeholder: currentDefault\n });\n if (isCancel(customModelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const customModelStr =\n typeof customModelInput === \"string\" ? customModelInput.trim() : \"\";\n selectedModel = customModelStr || currentDefault;\n } else if (modelChoice === \"__browse__\") {\n const modelOptions = availableModels.map((m) => ({\n value: m,\n label: m\n }));\n const browseChoice = await select({\n message: `Select from ${availableModels.length} available models:`,\n options: [\n ...modelOptions,\n { value: \"__custom__\", label: \"Custom model name...\" }\n ]\n });\n if (isCancel(browseChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n if (browseChoice === \"__custom__\") {\n const customModelInput = await text({\n message: \"Enter custom model ID:\",\n placeholder: currentDefault\n });\n if (isCancel(customModelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const customModelStr =\n typeof customModelInput === \"string\" ? customModelInput.trim() : \"\";\n selectedModel = customModelStr || currentDefault;\n } else {\n selectedModel = browseChoice as string;\n }\n }\n } else {\n const modelInput = await text({\n message: \"Enter default model ID for tools (optional, press Enter for default):\",\n placeholder: \"claude-3-7-sonnet\"\n });\n if (isCancel(modelInput)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n const modelStr = typeof modelInput === \"string\" ? modelInput.trim() : \"\";\n selectedModel = modelStr || undefined;\n }\n }\n\n // Step 4.1: Claude Code Specific Models (Opus, Sonnet, Haiku)\n if (\n toolsToConfigure.includes(\"claude\") &&\n !options.opusModel &&\n !options.sonnetModel &&\n !options.haikuModel\n ) {\n const configTiersChoice = await select({\n message: \"Configure Claude Code specific model tiers (Opus, Sonnet, Haiku)?\",\n options: [\n {\n value: \"auto\",\n label: \"Use general default model / skip\",\n hint: selectedModel || \"Default Claude models\"\n },\n {\n value: \"custom\",\n label: \"Customize per tier (Opus, Sonnet, Haiku)\"\n }\n ]\n });\n\n if (isCancel(configTiersChoice)) {\n cancel(\"Setup cancelled.\");\n process.exitCode = 0;\n return;\n }\n\n if (configTiersChoice === \"custom\") {\n const pickTierModel = async (\n tierName: string,\n envVar: string,\n defaultVal?: string\n ): Promise<string | undefined> => {\n if (availableModels.length > 0) {\n const choice = await select({\n message: `Select model for ${tierName} (${envVar}):`,\n options: [\n { value: \"__skip__\", label: \"Skip (Use default)\" },\n ...availableModels.map((m) => ({ value: m, label: m })),\n { value: \"__custom__\", label: \"Custom model name...\" }\n ]\n });\n if (isCancel(choice)) return undefined;\n if (choice === \"__skip__\") return undefined;\n if (choice === \"__custom__\") {\n const customInput = await text({\n message: `Enter custom model ID for ${tierName}:`,\n placeholder: defaultVal || \"claude-3-7-sonnet\"\n });\n if (isCancel(customInput)) return undefined;\n const val = typeof customInput === \"string\" ? customInput.trim() : \"\";\n return val || undefined;\n }\n return choice as string;\n }\n\n const customInput = await text({\n message: `Enter model ID for ${tierName} (${envVar}, optional):`,\n placeholder: defaultVal || \"claude-3-7-sonnet\"\n });\n if (isCancel(customInput)) return undefined;\n const val = typeof customInput === \"string\" ? customInput.trim() : \"\";\n return val || undefined;\n };\n\n const pickedSonnet = await pickTierModel(\n \"Sonnet\",\n \"ANTHROPIC_DEFAULT_SONNET_MODEL\",\n selectedModel || \"claude-3-7-sonnet\"\n );\n if (pickedSonnet !== undefined) {\n sonnetModel = pickedSonnet;\n }\n\n const pickedOpus = await pickTierModel(\n \"Opus\",\n \"ANTHROPIC_DEFAULT_OPUS_MODEL\",\n \"claude-3-opus-20240229\"\n );\n if (pickedOpus !== undefined) {\n opusModel = pickedOpus;\n }\n\n const pickedHaiku = await pickTierModel(\n \"Haiku\",\n \"ANTHROPIC_DEFAULT_HAIKU_MODEL\",\n \"claude-3-5-haiku-20241022\"\n );\n if (pickedHaiku !== undefined) {\n haikuModel = pickedHaiku;\n }\n }\n }\n\n // Step 5: Execute Linking\n s.start(\"Applying SRouter configurations...\");\n const linkResults: { name: string; path: string; backup?: string }[] = [];\n\n for (const toolId of toolsToConfigure) {\n const adapter = adapters.find((a) => a.id === toolId);\n if (!adapter) continue;\n\n const result = await adapter.link({\n baseUrl,\n apiKey,\n model: selectedModel,\n opusModel: toolId === \"claude\" ? opusModel : undefined,\n sonnetModel: toolId === \"claude\" ? sonnetModel : undefined,\n haikuModel: toolId === \"claude\" ? haikuModel : undefined,\n availableModels\n });\n\n linkResults.push({\n name: adapter.name,\n path: result.modifiedPath,\n backup: result.backupPath\n });\n }\n\n await defaultStore.saveConfig({\n defaultBaseUrl: baseUrl,\n defaultApiKey: apiKey,\n defaultModel: selectedModel,\n defaultOpusModel: opusModel,\n defaultSonnetModel: sonnetModel,\n defaultHaikuModel: haikuModel,\n lastSetupAt: Date.now()\n });\n\n s.stop(pc.green(\"All configurations applied successfully!\"));\n\n // Step 6: Summary Notes\n const summaryLines = [\n `OS / System: ${pc.cyan(sysInfo.displayName)}`,\n `Base URL: ${pc.cyan(baseUrl)}`,\n ...(apiKey ? [`API Key: ${pc.gray(\"••••••••\" + apiKey.slice(-4))}`] : []),\n ...(selectedModel ? [`Model: ${pc.cyan(selectedModel)}`] : []),\n ...(opusModel ? [`Opus: ${pc.cyan(opusModel)}`] : []),\n ...(sonnetModel ? [`Sonnet: ${pc.cyan(sonnetModel)}`] : []),\n ...(haikuModel ? [`Haiku: ${pc.cyan(haikuModel)}`] : []),\n \"\",\n pc.bold(\"Configured Tools:\")\n ];\n\n for (const r of linkResults) {\n summaryLines.push(` ✔ ${pc.bold(r.name)} -> ${pc.gray(r.path)}`);\n if (r.backup) {\n summaryLines.push(` ${pc.gray(\"Backup:\")} ${pc.gray(r.backup)}`);\n }\n }\n\n note(summaryLines.join(\"\\n\"), \"Configuration Summary\");\n\n outro(\n pc.bold(pc.green(\"✔ SRouter is connected! You can now use your AI coding tools directly.\"))\n );\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { BackupEntry, CliConfig } from \"../types/index.js\";\n\nexport const DEFAULT_CLI_CONFIG: CliConfig = {\n defaultBaseUrl: \"http://localhost:3000/v1\",\n backups: []\n};\n\nexport class ConfigStore {\n private baseDir: string;\n private configPath: string;\n private backupsDir: string;\n\n constructor(customBaseDir?: string) {\n this.baseDir = customBaseDir || path.join(os.homedir(), \".srouter\");\n this.configPath = path.join(this.baseDir, \"cli.json\");\n this.backupsDir = path.join(this.baseDir, \"backups\");\n }\n\n private async ensureDirs(): Promise<void> {\n await fs.mkdir(this.baseDir, { recursive: true });\n await fs.mkdir(this.backupsDir, { recursive: true });\n }\n\n async loadConfig(): Promise<CliConfig> {\n try {\n const raw = await fs.readFile(this.configPath, \"utf-8\");\n const data = JSON.parse(raw);\n return {\n ...DEFAULT_CLI_CONFIG,\n ...data,\n backups: Array.isArray(data?.backups) ? data.backups : []\n };\n } catch {\n return { ...DEFAULT_CLI_CONFIG };\n }\n }\n\n async saveConfig(partial: Partial<CliConfig>): Promise<CliConfig> {\n await this.ensureDirs();\n const current = await this.loadConfig();\n const updated: CliConfig = {\n ...current,\n ...partial,\n backups: partial.backups ?? current.backups\n };\n await fs.writeFile(this.configPath, JSON.stringify(updated, null, 4), \"utf-8\");\n return updated;\n }\n\n async createBackup(toolId: string, originalPath: string): Promise<string | undefined> {\n try {\n await fs.access(originalPath);\n } catch {\n return undefined;\n }\n\n await this.ensureDirs();\n const timestamp = Date.now();\n const ext = path.extname(originalPath) || \".json\";\n const backupFileName = `${toolId}-${timestamp}${ext}`;\n const backupPath = path.join(this.backupsDir, backupFileName);\n\n await fs.copyFile(originalPath, backupPath);\n\n const config = await this.loadConfig();\n const entry: BackupEntry = {\n toolId,\n originalPath,\n backupPath,\n timestamp\n };\n\n await this.saveConfig({\n backups: [...config.backups, entry]\n });\n\n return backupPath;\n }\n\n async getLatestBackup(toolId: string): Promise<BackupEntry | undefined> {\n const config = await this.loadConfig();\n const entries = config.backups.filter((b) => b.toolId === toolId);\n if (entries.length === 0) return undefined;\n return entries.sort((a, b) => b.timestamp - a.timestamp)[0];\n }\n\n async restoreLatestBackup(toolId: string): Promise<boolean> {\n const latest = await this.getLatestBackup(toolId);\n if (!latest) {\n return false;\n }\n\n try {\n await fs.mkdir(path.dirname(latest.originalPath), { recursive: true });\n await fs.copyFile(latest.backupPath, latest.originalPath);\n\n const config = await this.loadConfig();\n const updatedBackups = config.backups.filter((b) => b.backupPath !== latest.backupPath);\n await this.saveConfig({ backups: updatedBackups });\n\n await fs.rm(latest.backupPath, { force: true });\n return true;\n } catch {\n return false;\n }\n }\n}\n\nexport const defaultStore = new ConfigStore();\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { AbstractToolAdapter } from \"./base.js\";\nimport type { LinkResult, ToolConfigContext, ToolStatus } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\nimport { getClaudeConfigPath, isExecutableInPath } from \"../lib/platform.js\";\n\nfunction parseJsonSafe(content: string): Record<string, any> {\n try {\n const clean = content\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/,\\s*([\\]}])/g, \"$1\");\n return JSON.parse(clean);\n } catch {\n try {\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n}\n\nexport class ClaudeAdapter extends AbstractToolAdapter {\n readonly id = \"claude\";\n readonly name = \"Claude Code\";\n readonly description = \"Anthropic's official CLI tool for agentic coding\";\n\n private customConfigPath?: string;\n\n constructor(store: ConfigStore = defaultStore, customConfigPath?: string) {\n super(store);\n this.customConfigPath = customConfigPath;\n }\n\n getConfigPath(): string {\n if (this.customConfigPath) {\n return this.customConfigPath;\n }\n return getClaudeConfigPath();\n }\n\n async isInstalled(): Promise<boolean> {\n return isExecutableInPath(\"claude\");\n }\n\n async getStatus(): Promise<ToolStatus> {\n const configPath = this.getConfigPath();\n const installed = await this.isInstalled();\n\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const parsed = parseJsonSafe(raw);\n const baseUrl =\n parsed.env?.ANTHROPIC_BASE_URL ||\n parsed.ANTHROPIC_BASE_URL ||\n parsed.baseUrl ||\n undefined;\n const model =\n parsed.env?.ANTHROPIC_DEFAULT_MODEL ||\n parsed.env?.ANTHROPIC_MODEL ||\n parsed.model ||\n parsed.ANTHROPIC_MODEL ||\n undefined;\n const opusModel =\n parsed.env?.ANTHROPIC_DEFAULT_OPUS_MODEL ||\n parsed.ANTHROPIC_DEFAULT_OPUS_MODEL ||\n parsed.env?.ANTHROPIC_OPUS_MODEL ||\n parsed.ANTHROPIC_OPUS_MODEL ||\n undefined;\n const sonnetModel =\n parsed.env?.ANTHROPIC_DEFAULT_SONNET_MODEL ||\n parsed.ANTHROPIC_DEFAULT_SONNET_MODEL ||\n parsed.env?.ANTHROPIC_SONNET_MODEL ||\n parsed.ANTHROPIC_SONNET_MODEL ||\n undefined;\n const haikuModel =\n parsed.env?.ANTHROPIC_DEFAULT_HAIKU_MODEL ||\n parsed.ANTHROPIC_DEFAULT_HAIKU_MODEL ||\n parsed.env?.ANTHROPIC_HAIKU_MODEL ||\n parsed.ANTHROPIC_HAIKU_MODEL ||\n undefined;\n const linked = Boolean(\n baseUrl &&\n (baseUrl.includes(\"localhost\") ||\n baseUrl.includes(\"127.0.0.1\") ||\n baseUrl.includes(\"srouter\"))\n );\n\n return {\n id: this.id,\n name: this.name,\n installed,\n linked,\n configPath,\n currentBaseUrl: baseUrl,\n currentModel: model,\n currentOpusModel: opusModel,\n currentSonnetModel: sonnetModel,\n currentHaikuModel: haikuModel\n };\n } catch {\n return {\n id: this.id,\n name: this.name,\n installed,\n linked: false,\n configPath\n };\n }\n }\n\n async link(context: ToolConfigContext): Promise<LinkResult> {\n const configPath = this.getConfigPath();\n const backupPath = context.dryRun\n ? undefined\n : await this.store.createBackup(this.id, configPath);\n\n let data: Record<string, any> = {};\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n data = parseJsonSafe(raw);\n } catch {\n data = {};\n }\n\n const defaultModel = context.model || \"claude-3-7-sonnet\";\n const apiKey = context.apiKey || \"sk-local-srouter\";\n // Anthropic SDK automatically appends /v1/messages, so base url should be origin (e.g. http://localhost:3000)\n const anthropicBaseUrl = context.baseUrl.replace(/\\/v1\\/?$/, \"\");\n\n // Claude Code v2 settings.json uses \"env\" object\n data.env = data.env || {};\n data.env.ANTHROPIC_BASE_URL = anthropicBaseUrl;\n data.env.ANTHROPIC_API_KEY = apiKey;\n data.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n data.env.ANTHROPIC_DEFAULT_MODEL = defaultModel;\n data.env.ANTHROPIC_MODEL = defaultModel;\n data.env.ANTHROPIC_DEFAULT_OPUS_MODEL = context.opusModel || defaultModel;\n data.env.ANTHROPIC_DEFAULT_SONNET_MODEL = context.sonnetModel || defaultModel;\n data.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = context.haikuModel || defaultModel;\n\n // Clean out legacy SCODEX or old vendor keys if present\n if (data.env.ANTHROPIC_DEFAULT_FABLE_MODEL) {\n delete data.env.ANTHROPIC_DEFAULT_FABLE_MODEL;\n }\n\n // Top-level fallbacks for older Claude Code versions\n data.ANTHROPIC_BASE_URL = anthropicBaseUrl;\n data.ANTHROPIC_API_KEY = apiKey;\n data.model = defaultModel;\n data.ANTHROPIC_DEFAULT_OPUS_MODEL = context.opusModel || defaultModel;\n data.ANTHROPIC_DEFAULT_SONNET_MODEL = context.sonnetModel || defaultModel;\n data.ANTHROPIC_DEFAULT_HAIKU_MODEL = context.haikuModel || defaultModel;\n\n if (!context.dryRun) {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(data, null, 2), \"utf-8\");\n\n // Also keep ~/.claude.json in sync if it exists or configPath is settings.json\n const homeClaudeJson = path.join(os.homedir(), \".claude.json\");\n if (configPath !== homeClaudeJson) {\n try {\n let rootData: Record<string, any> = {};\n try {\n rootData = parseJsonSafe(await fs.readFile(homeClaudeJson, \"utf-8\"));\n } catch {\n rootData = {};\n }\n rootData.ANTHROPIC_BASE_URL = context.baseUrl;\n rootData.ANTHROPIC_API_KEY = apiKey;\n rootData.model = defaultModel;\n rootData.ANTHROPIC_DEFAULT_OPUS_MODEL = context.opusModel || defaultModel;\n rootData.ANTHROPIC_DEFAULT_SONNET_MODEL = context.sonnetModel || defaultModel;\n rootData.ANTHROPIC_DEFAULT_HAIKU_MODEL = context.haikuModel || defaultModel;\n await fs.writeFile(homeClaudeJson, JSON.stringify(rootData, null, 2), \"utf-8\");\n } catch {\n // Ignore secondary file sync error\n }\n }\n }\n\n return {\n backupPath,\n modifiedPath: configPath\n };\n }\n\n async unlink(): Promise<boolean> {\n const restored = await this.store.restoreLatestBackup(this.id);\n if (restored) {\n return true;\n }\n\n const configPath = this.getConfigPath();\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const data = parseJsonSafe(raw);\n delete data.ANTHROPIC_BASE_URL;\n delete data.ANTHROPIC_API_KEY;\n delete data.ANTHROPIC_DEFAULT_OPUS_MODEL;\n delete data.ANTHROPIC_DEFAULT_SONNET_MODEL;\n delete data.ANTHROPIC_DEFAULT_HAIKU_MODEL;\n delete data.model;\n if (data.env && typeof data.env === \"object\") {\n delete data.env.ANTHROPIC_BASE_URL;\n delete data.env.ANTHROPIC_API_KEY;\n delete data.env.ANTHROPIC_AUTH_TOKEN;\n delete data.env.ANTHROPIC_DEFAULT_MODEL;\n delete data.env.ANTHROPIC_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_OPUS_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_SONNET_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;\n delete data.env.ANTHROPIC_DEFAULT_FABLE_MODEL;\n }\n await fs.writeFile(configPath, JSON.stringify(data, null, 2), \"utf-8\");\n return true;\n } catch {\n return false;\n }\n }\n\n getEnv(context: ToolConfigContext): Record<string, string> {\n const defaultModel = context.model || \"claude-3-7-sonnet\";\n const apiKey = context.apiKey || \"sk-local-srouter\";\n const anthropicBaseUrl = context.baseUrl.replace(/\\/v1\\/?$/, \"\");\n\n const env: Record<string, string> = {\n ANTHROPIC_BASE_URL: anthropicBaseUrl,\n ANTHROPIC_API_KEY: apiKey,\n ANTHROPIC_AUTH_TOKEN: apiKey,\n ANTHROPIC_DEFAULT_MODEL: defaultModel,\n ANTHROPIC_MODEL: defaultModel,\n ANTHROPIC_DEFAULT_OPUS_MODEL: context.opusModel || defaultModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: context.sonnetModel || defaultModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: context.haikuModel || defaultModel\n };\n return env;\n }\n}\n","import type { BaseToolAdapter, LinkResult, ToolConfigContext, ToolStatus } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\n\nexport abstract class AbstractToolAdapter implements BaseToolAdapter {\n abstract readonly id: string;\n abstract readonly name: string;\n abstract readonly description: string;\n\n protected store: ConfigStore;\n\n constructor(store: ConfigStore = defaultStore) {\n this.store = store;\n }\n\n abstract getConfigPath(): string;\n abstract isInstalled(): Promise<boolean>;\n abstract getStatus(): Promise<ToolStatus>;\n abstract link(context: ToolConfigContext): Promise<LinkResult>;\n abstract unlink(): Promise<boolean>;\n abstract getEnv(context: ToolConfigContext): Record<string, string>;\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\nexport type PlatformType = \"windows\" | \"macos\" | \"linux\" | \"unknown\";\nexport type ShellType = \"bash\" | \"zsh\" | \"fish\" | \"powershell\" | \"cmd\";\n\nexport interface SystemInfo {\n platform: PlatformType;\n osType: string;\n osRelease: string;\n arch: string;\n displayName: string;\n homeDir: string;\n detectedShell: ShellType;\n}\n\nexport function getPlatform(): PlatformType {\n const p = process.platform;\n if (p === \"win32\") return \"windows\";\n if (p === \"darwin\") return \"macos\";\n if (p === \"linux\") return \"linux\";\n return \"unknown\";\n}\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\nexport function isMacOS(): boolean {\n return process.platform === \"darwin\";\n}\n\nexport function isLinux(): boolean {\n return process.platform === \"linux\";\n}\n\nexport function getOsDisplayName(): string {\n const p = getPlatform();\n const arch = os.arch();\n const rel = os.release();\n\n switch (p) {\n case \"macos\":\n return `macOS (${arch === \"arm64\" ? \"Apple Silicon\" : arch}) [Darwin ${rel}]`;\n case \"windows\":\n return `Windows (${arch}) [NT ${rel}]`;\n case \"linux\":\n return `Linux (${arch}) [${rel}]`;\n default:\n return `${process.platform} (${arch})`;\n }\n}\n\nexport function detectShell(): ShellType {\n const shellEnv = process.env.SHELL?.toLowerCase() || \"\";\n if (shellEnv.includes(\"fish\")) return \"fish\";\n if (shellEnv.includes(\"zsh\")) return \"zsh\";\n if (shellEnv.includes(\"bash\")) return \"bash\";\n\n if (isWindows()) {\n if (process.env.PSModulePath || process.env.POWERSHELL_DISTRIBUTION_CHANNEL) {\n return \"powershell\";\n }\n return \"cmd\";\n }\n\n return \"bash\";\n}\n\nexport function getSystemInfo(): SystemInfo {\n return {\n platform: getPlatform(),\n osType: os.type(),\n osRelease: os.release(),\n arch: os.arch(),\n displayName: getOsDisplayName(),\n homeDir: os.homedir(),\n detectedShell: detectShell()\n };\n}\n\nexport async function isExecutableInPath(command: string): Promise<boolean> {\n const lookupCmd = isWindows() ? `where.exe ${command}` : `which ${command}`;\n try {\n await execAsync(lookupCmd);\n return true;\n } catch {\n if (isWindows()) {\n try {\n await execAsync(`where ${command}`);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n }\n}\n\nexport function getClaudeConfigPath(): string {\n const home = os.homedir();\n const candidatePaths: string[] = [];\n\n // Optional environment variable override\n if (process.env.CLAUDE_CONFIG_DIR) {\n candidatePaths.push(path.join(process.env.CLAUDE_CONFIG_DIR, \"settings.json\"));\n candidatePaths.push(path.join(process.env.CLAUDE_CONFIG_DIR, \"config.json\"));\n }\n\n // Claude Code v2 settings.json\n candidatePaths.push(path.join(home, \".claude\", \"settings.json\"));\n candidatePaths.push(path.join(home, \".config\", \"claude\", \"settings.json\"));\n\n // Standard ~/.claude.json across all platforms\n candidatePaths.push(path.join(home, \".claude.json\"));\n\n // Platform-specific secondary paths\n if (isWindows()) {\n const appData = process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\");\n candidatePaths.push(path.join(appData, \"Claude\", \"settings.json\"));\n candidatePaths.push(path.join(appData, \"Claude\", \"config.json\"));\n } else {\n candidatePaths.push(path.join(home, \".claude\", \"config.json\"));\n candidatePaths.push(path.join(home, \".config\", \"claude\", \"config.json\"));\n }\n\n for (const p of candidatePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n\n if (fs.existsSync(path.join(home, \".claude\"))) {\n return path.join(home, \".claude\", \"settings.json\");\n }\n\n // Default standard config file\n return path.join(home, \".claude\", \"settings.json\");\n}\n\nexport function getOpenCodeConfigPath(): string {\n const home = os.homedir();\n const candidatePaths: string[] = [];\n\n // Local directory config\n candidatePaths.push(path.join(process.cwd(), \"opencode.jsonc\"));\n candidatePaths.push(path.join(process.cwd(), \"opencode.json\"));\n\n if (isWindows()) {\n const appData = process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\");\n candidatePaths.push(path.join(appData, \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(appData, \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(appData, \"opencode\", \"config.json\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"config.json\"));\n } else if (isMacOS()) {\n candidatePaths.push(\n path.join(home, \"Library\", \"Application Support\", \"opencode\", \"opencode.jsonc\")\n );\n candidatePaths.push(\n path.join(home, \"Library\", \"Application Support\", \"opencode\", \"opencode.json\")\n );\n candidatePaths.push(\n path.join(home, \"Library\", \"Application Support\", \"opencode\", \"config.json\")\n );\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(home, \".config\", \"opencode\", \"config.json\"));\n } else {\n const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, \".config\");\n candidatePaths.push(path.join(xdgConfig, \"opencode\", \"opencode.jsonc\"));\n candidatePaths.push(path.join(xdgConfig, \"opencode\", \"opencode.json\"));\n candidatePaths.push(path.join(xdgConfig, \"opencode\", \"config.json\"));\n }\n\n candidatePaths.push(path.join(home, \".opencode.jsonc\"));\n candidatePaths.push(path.join(home, \".opencode.json\"));\n\n for (const p of candidatePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n\n if (isWindows()) {\n const appData = process.env.APPDATA || path.join(home, \"AppData\", \"Roaming\");\n return path.join(appData, \"opencode\", \"opencode.jsonc\");\n }\n\n const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, \".config\");\n return path.join(xdgConfig, \"opencode\", \"opencode.jsonc\");\n}\n\nexport function formatShellExport(key: string, value: string, shell: ShellType): string {\n switch (shell) {\n case \"powershell\":\n return `$env:${key} = \"${value}\"`;\n case \"cmd\":\n return `set ${key}=${value}`;\n case \"fish\":\n return `set -gx ${key} \"${value}\";`;\n case \"bash\":\n case \"zsh\":\n default:\n return `export ${key}=\"${value}\"`;\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { AbstractToolAdapter } from \"./base.js\";\nimport type { LinkResult, ToolConfigContext, ToolStatus } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\nimport { getOpenCodeConfigPath, isExecutableInPath } from \"../lib/platform.js\";\nimport { fetchAvailableModels } from \"../lib/srouterClient.js\";\n\nexport const DEFAULT_SROUTER_MODELS: Array<{ id: string; name: string }> = [\n { id: \"anthropic/claude-3-7-sonnet\", name: \"Claude 3.7 Sonnet (Anthropic)\" },\n { id: \"claude-3-7-sonnet\", name: \"Claude 3.7 Sonnet\" },\n { id: \"anthropic/claude-3-5-sonnet\", name: \"Claude 3.5 Sonnet (Anthropic)\" },\n { id: \"claude-3-5-sonnet\", name: \"Claude 3.5 Sonnet\" },\n { id: \"anthropic/claude-3-5-haiku\", name: \"Claude 3.5 Haiku (Anthropic)\" },\n { id: \"openai_codex/gpt-4o\", name: \"GPT-4o (OpenAI Codex)\" },\n { id: \"gpt-4o\", name: \"GPT-4o\" },\n { id: \"openai_codex/gpt-4.5-preview\", name: \"GPT-4.5 Preview (OpenAI Codex)\" },\n { id: \"openai_codex/o3-mini\", name: \"o3-mini (OpenAI Codex)\" },\n { id: \"openai_codex/o1\", name: \"o1 (OpenAI Codex)\" },\n { id: \"antigravity/gemini-2.5-pro\", name: \"Gemini 2.5 Pro (Antigravity)\" },\n { id: \"gemini-2.5-pro\", name: \"Gemini 2.5 Pro\" },\n { id: \"antigravity/gemini-2.5-flash\", name: \"Gemini 2.5 Flash (Antigravity)\" },\n { id: \"gemini-2.5-flash\", name: \"Gemini 2.5 Flash\" },\n { id: \"kiro/claude-3-7-sonnet\", name: \"Claude 3.7 Sonnet (Kiro)\" },\n { id: \"qoder/qwen-2.5-coder-32b\", name: \"Qwen 2.5 Coder 32B (Qoder)\" },\n { id: \"deepseek/deepseek-r1\", name: \"DeepSeek R1\" },\n { id: \"deepseek/deepseek-v3\", name: \"DeepSeek V3\" },\n { id: \"combo/flagship\", name: \"Combo: Flagship Cascade\" },\n { id: \"combo/fast\", name: \"Combo: Fast Fallback\" }\n];\n\nexport function formatModelDisplayName(modelId: string): string {\n const knownNames: Record<string, string> = {\n \"claude-3-7-sonnet\": \"Claude 3.7 Sonnet\",\n \"claude-3-5-sonnet\": \"Claude 3.5 Sonnet\",\n \"claude-3-5-haiku\": \"Claude 3.5 Haiku\",\n \"claude-3-opus\": \"Claude 3 Opus\",\n \"gpt-4o\": \"GPT-4o\",\n \"gpt-4o-mini\": \"GPT-4o Mini\",\n \"gpt-4.5-preview\": \"GPT-4.5 Preview\",\n \"o3-mini\": \"o3-mini\",\n o1: \"o1\",\n \"o1-preview\": \"o1 Preview\",\n \"gemini-2.5-pro\": \"Gemini 2.5 Pro\",\n \"gemini-2.5-flash\": \"Gemini 2.5 Flash\",\n \"gemini-2.0-flash\": \"Gemini 2.0 Flash\",\n \"deepseek-r1\": \"DeepSeek R1\",\n \"deepseek-v3\": \"DeepSeek V3\",\n \"deepseek-coder\": \"DeepSeek Coder\",\n \"qwen-2.5-coder-32b\": \"Qwen 2.5 Coder 32B\",\n \"qwen-2.5-72b-instruct\": \"Qwen 2.5 72B\",\n \"qwen3-max\": \"Qwen 3 Max\",\n flagship: \"Flagship Cascade\",\n fast: \"Fast Fallback\"\n };\n\n if (knownNames[modelId]) {\n return knownNames[modelId];\n }\n\n if (modelId.includes(\"/\")) {\n const [provider, ...rest] = modelId.split(\"/\");\n const baseModel = rest.join(\"/\");\n const baseName = knownNames[baseModel] || humanizeName(baseModel);\n const providerName = formatProviderLabel(provider);\n return `${baseName} (${providerName})`;\n }\n\n return humanizeName(modelId);\n}\n\nfunction formatProviderLabel(provider: string): string {\n const providerMap: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai_codex: \"OpenAI Codex\",\n openai: \"OpenAI\",\n antigravity: \"Antigravity\",\n kiro: \"Kiro\",\n qoder: \"Qoder\",\n codebuddy: \"CodeBuddy\",\n deepseek: \"DeepSeek\",\n gorouter: \"GoRouter\",\n bluesminds: \"BluesMinds\",\n seekai: \"SeekAI\",\n tabitoken: \"TabiToken\",\n tokenrouter: \"TokenRouter\",\n commandcode: \"CommandCode\",\n combo: \"Combo\"\n };\n return providerMap[provider] || provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\nfunction humanizeName(str: string): string {\n return str.replace(/[-_]/g, \" \").replace(/\\b[a-z]/g, (c) => c.toUpperCase());\n}\n\nfunction parseJsonc(content: string): Record<string, any> {\n try {\n const clean = content\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/,\\s*([\\]}])/g, \"$1\");\n return JSON.parse(clean);\n } catch {\n try {\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n}\n\nexport class OpenCodeAdapter extends AbstractToolAdapter {\n readonly id = \"opencode\";\n readonly name = \"OpenCode\";\n readonly description = \"Open-source AI coding assistant and agent\";\n\n private customConfigPath?: string;\n\n constructor(store: ConfigStore = defaultStore, customConfigPath?: string) {\n super(store);\n this.customConfigPath = customConfigPath;\n }\n\n getConfigPath(): string {\n if (this.customConfigPath) {\n return this.customConfigPath;\n }\n return getOpenCodeConfigPath();\n }\n\n async isInstalled(): Promise<boolean> {\n const opencode = await isExecutableInPath(\"opencode\");\n if (opencode) return true;\n return isExecutableInPath(\"interpreter\");\n }\n\n async getStatus(): Promise<ToolStatus> {\n const configPath = this.getConfigPath();\n const installed = await this.isInstalled();\n\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const parsed = parseJsonc(raw);\n const baseUrl =\n parsed.provider?.srouter?.options?.baseURL ||\n parsed.openai_base_url ||\n parsed.api_base ||\n parsed.baseUrl ||\n parsed.providers?.srouter?.baseUrl ||\n undefined;\n const model = parsed.model || parsed.default_model || undefined;\n const linked = Boolean(\n baseUrl &&\n (baseUrl.includes(\"localhost\") ||\n baseUrl.includes(\"127.0.0.1\") ||\n baseUrl.includes(\"srouter\"))\n );\n\n return {\n id: this.id,\n name: this.name,\n installed,\n linked,\n configPath,\n currentBaseUrl: baseUrl,\n currentModel: model\n };\n } catch {\n return {\n id: this.id,\n name: this.name,\n installed,\n linked: false,\n configPath\n };\n }\n }\n\n async link(context: ToolConfigContext): Promise<LinkResult> {\n const configPath = this.getConfigPath();\n const backupPath = context.dryRun\n ? undefined\n : await this.store.createBackup(this.id, configPath);\n\n let data: Record<string, any> = {};\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n data = parseJsonc(raw);\n } catch {\n data = {};\n }\n\n // Schema declaration\n data[\"$schema\"] = \"https://opencode.ai/config.json\";\n\n // Clean any conflicting legacy fields\n delete data.providers;\n delete data.openai_base_url;\n delete data.api_base;\n delete data.api_key;\n delete data.openai_api_key;\n\n // OpenCode provider configuration\n data.provider = data.provider || {};\n const existingSrouter = data.provider.srouter || {};\n const existingModels = existingSrouter.models || {};\n\n const modelsMap: Record<string, { id?: string; name: string }> = {};\n\n // 1. Seed with default catalog\n for (const m of DEFAULT_SROUTER_MODELS) {\n modelsMap[m.id] = {\n id: m.id,\n name: m.name\n };\n }\n\n // 2. Retain existing models from user config\n for (const [key, val] of Object.entries(existingModels)) {\n if (val && typeof val === \"object\") {\n modelsMap[key] = val as { id?: string; name: string };\n }\n }\n\n // 3. Fetch live models from SRouter Gateway\n try {\n const liveModels =\n context.availableModels && context.availableModels.length > 0\n ? context.availableModels\n : await fetchAvailableModels(context.baseUrl, context.apiKey);\n\n for (const rawId of liveModels) {\n if (!rawId) continue;\n const cleanId = rawId.startsWith(\"srouter/\")\n ? rawId.replace(/^srouter\\//, \"\")\n : rawId;\n modelsMap[cleanId] = {\n id: cleanId,\n name: formatModelDisplayName(cleanId)\n };\n }\n } catch {\n // Silently fall back to default catalog\n }\n\n // 4. Ensure current user-selected model is present\n const rawModel = context.model || \"claude-3-7-sonnet\";\n const cleanModelId = rawModel.startsWith(\"srouter/\")\n ? rawModel.replace(/^srouter\\//, \"\")\n : rawModel;\n\n modelsMap[cleanModelId] = {\n id: cleanModelId,\n name: modelsMap[cleanModelId]?.name || formatModelDisplayName(cleanModelId)\n };\n\n data.provider.srouter = {\n name: \"SRouter\",\n npm: \"@ai-sdk/openai-compatible\",\n options: {\n baseURL: context.baseUrl,\n apiKey: context.apiKey || \"sk-local-srouter\"\n },\n models: modelsMap\n };\n\n // OpenCode format for active model: \"provider/model\"\n data.model = `srouter/${cleanModelId}`;\n\n if (!context.dryRun) {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(data, null, 4), \"utf-8\");\n }\n\n return {\n backupPath,\n modifiedPath: configPath\n };\n }\n\n async unlink(): Promise<boolean> {\n const restored = await this.store.restoreLatestBackup(this.id);\n if (restored) {\n return true;\n }\n\n const configPath = this.getConfigPath();\n try {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const data = parseJsonc(raw);\n if (data.provider?.srouter) {\n delete data.provider.srouter;\n }\n if (data.model?.startsWith(\"srouter/\")) {\n delete data.model;\n }\n delete data.openai_base_url;\n delete data.api_base;\n delete data.openai_api_key;\n delete data.api_key;\n delete data.providers;\n await fs.writeFile(configPath, JSON.stringify(data, null, 4), \"utf-8\");\n return true;\n } catch {\n return false;\n }\n }\n\n getEnv(context: ToolConfigContext): Record<string, string> {\n const env: Record<string, string> = {\n OPENAI_BASE_URL: context.baseUrl,\n ANTHROPIC_BASE_URL: context.baseUrl\n };\n if (context.apiKey) {\n env.OPENAI_API_KEY = context.apiKey;\n env.ANTHROPIC_API_KEY = context.apiKey;\n }\n if (context.model) {\n const cleanModelId = context.model.startsWith(\"srouter/\")\n ? context.model.replace(/^srouter\\//, \"\")\n : context.model;\n env.OPENCODE_MODEL = `srouter/${cleanModelId}`;\n }\n return env;\n }\n}\n","export interface ServerHealthResult {\n healthy: boolean;\n modelsCount: number;\n error?: string;\n latencyMs?: number;\n}\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getModelsEndpoint(baseUrl: string): string {\n const cleanUrl = normalizeBaseUrl(baseUrl);\n return cleanUrl.endsWith(\"/v1\") ? `${cleanUrl}/models` : `${cleanUrl}/v1/models`;\n}\n\ninterface ModelItem {\n id?: string;\n}\n\ninterface ModelsApiResponse {\n data?: Array<ModelItem | string>;\n}\n\nexport async function checkServerHealth(\n baseUrl: string,\n apiKey?: string,\n timeoutMs: number = 3000\n): Promise<ServerHealthResult> {\n const endpoint = getModelsEndpoint(baseUrl);\n const start = Date.now();\n\n try {\n const headers: Record<string, string> = {\n Accept: \"application/json\"\n };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n const res = await fetch(endpoint, {\n method: \"GET\",\n headers,\n signal: controller.signal\n });\n clearTimeout(timer);\n\n if (!res.ok) {\n return {\n healthy: false,\n modelsCount: 0,\n error: `HTTP ${res.status}: ${res.statusText}`,\n latencyMs: Date.now() - start\n };\n }\n\n const data = (await res.json()) as ModelsApiResponse;\n const models = Array.isArray(data?.data) ? data.data : [];\n\n return {\n healthy: true,\n modelsCount: models.length,\n latencyMs: Date.now() - start\n };\n } catch (err: unknown) {\n const errorName = err instanceof Error ? err.name : \"\";\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n healthy: false,\n modelsCount: 0,\n error: errorName === \"AbortError\" ? \"Connection timeout\" : errorMessage,\n latencyMs: Date.now() - start\n };\n }\n}\n\nexport async function fetchAvailableModels(baseUrl: string, apiKey?: string): Promise<string[]> {\n const endpoint = getModelsEndpoint(baseUrl);\n\n try {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const res = await fetch(endpoint, { headers });\n if (!res.ok) return [];\n const data = (await res.json()) as ModelsApiResponse;\n if (!Array.isArray(data?.data)) return [];\n return data.data\n .map((m) => (typeof m === \"string\" ? m : m?.id))\n .filter((id): id is string => typeof id === \"string\" && id.length > 0);\n } catch {\n return [];\n }\n}\n","import type { BaseToolAdapter } from \"../types/index.js\";\nimport { ConfigStore, defaultStore } from \"../lib/configStore.js\";\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { OpenCodeAdapter } from \"./opencode.js\";\n\nexport { ClaudeAdapter } from \"./claude.js\";\nexport { OpenCodeAdapter } from \"./opencode.js\";\nexport { AbstractToolAdapter } from \"./base.js\";\n\nexport function createAdapters(store: ConfigStore = defaultStore): BaseToolAdapter[] {\n return [new ClaudeAdapter(store), new OpenCodeAdapter(store)];\n}\n\nlet cachedAdapters: BaseToolAdapter[] | null = null;\n\nexport function getAllAdapters(): BaseToolAdapter[] {\n if (!cachedAdapters) {\n cachedAdapters = createAdapters();\n }\n return cachedAdapters;\n}\n\nexport function getAdapter(id: string): BaseToolAdapter | undefined {\n const normalized = id.toLowerCase().trim();\n return getAllAdapters().find(\n (a) => a.id.toLowerCase() === normalized || a.name.toLowerCase().includes(normalized)\n );\n}\n","import pc from \"picocolors\";\nimport { intro, outro, spinner, note } from \"@clack/prompts\";\n\nexport const banner = `\n ____ ____ __ \n / __/ / __ \\\\___ __ __ / /____ ____ \n _\\\\ \\\\ / /_/ / _ \\\\/ // / / __/ -_)/ __/ \n/___/ \\\\____/\\\\___/\\\\_,_/ \\\\__/\\\\__//_/ \n ${pc.bold(pc.cyan(\"AI Gateway & LLM Proxy Router CLI\"))}\n`;\n\nexport function showHeader(): void {\n console.log(pc.magenta(banner));\n}\n\nexport function formatSuccess(msg: string): string {\n return `${pc.green(\"✔\")} ${msg}`;\n}\n\nexport function formatError(msg: string): string {\n return `${pc.red(\"✖\")} ${msg}`;\n}\n\nexport function formatWarning(msg: string): string {\n return `${pc.yellow(\"⚠\")} ${msg}`;\n}\n\nexport function formatInfo(msg: string): string {\n return `${pc.cyan(\"ℹ\")} ${msg}`;\n}\n\nexport { pc, intro, outro, spinner, note };\n","import { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { formatError, formatSuccess, pc } from \"../lib/ui.js\";\n\nexport interface LinkCommandOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n dryRun?: boolean;\n}\n\nexport async function linkCommand(toolId: string, options: LinkCommandOptions): Promise<void> {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available tools: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n const model = options.model || savedConfig.defaultModel;\n const opusModel = options.opusModel || savedConfig.defaultOpusModel;\n const sonnetModel = options.sonnetModel || savedConfig.defaultSonnetModel;\n const haikuModel = options.haikuModel || savedConfig.defaultHaikuModel;\n\n try {\n const result = await adapter.link({\n baseUrl,\n apiKey,\n model,\n opusModel,\n sonnetModel,\n haikuModel,\n dryRun: options.dryRun\n });\n\n console.log(\n formatSuccess(\n `Successfully configured ${pc.bold(pc.cyan(adapter.name))} with SRouter proxy!`\n )\n );\n console.log(` ${pc.gray(\"Target Config:\")} ${pc.white(result.modifiedPath)}`);\n console.log(` ${pc.gray(\"Proxy URL:\")} ${pc.white(baseUrl)}`);\n if (model) {\n console.log(` ${pc.gray(\"Model:\")} ${pc.white(model)}`);\n }\n if (opusModel) {\n console.log(` ${pc.gray(\"Opus Model:\")} ${pc.white(opusModel)}`);\n }\n if (sonnetModel) {\n console.log(` ${pc.gray(\"Sonnet Model:\")} ${pc.white(sonnetModel)}`);\n }\n if (haikuModel) {\n console.log(` ${pc.gray(\"Haiku Model:\")} ${pc.white(haikuModel)}`);\n }\n if (result.backupPath) {\n console.log(` ${pc.gray(\"Backup Saved:\")} ${pc.white(result.backupPath)}`);\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to link ${adapter.name}: ${msg}`));\n process.exitCode = 1;\n }\n}\n","import { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { formatError, formatInfo, formatSuccess, pc } from \"../lib/ui.js\";\n\nexport async function unlinkCommand(toolId: string): Promise<void> {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available tools: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n const restored = await adapter.unlink();\n if (restored) {\n console.log(\n formatSuccess(\n `Restored original configuration for ${pc.bold(pc.cyan(adapter.name))}!`\n )\n );\n } else {\n console.log(\n formatInfo(\n `No active SRouter configuration or backup found for ${pc.bold(adapter.name)}.`\n )\n );\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to unlink ${adapter.name}: ${msg}`));\n process.exitCode = 1;\n }\n}\n","import { getAllAdapters, getAdapter } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { checkServerHealth, fetchAvailableModels } from \"../lib/srouterClient.js\";\nimport { formatError, formatSuccess, formatWarning, pc } from \"../lib/ui.js\";\n\nexport interface SyncCommandOptions {\n url?: string;\n key?: string;\n}\n\nexport async function syncCommand(\n toolId?: string,\n options: SyncCommandOptions = {}\n): Promise<void> {\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n\n const health = await checkServerHealth(baseUrl, apiKey);\n if (!health.healthy) {\n console.error(\n formatError(\n `Cannot sync: SRouter Gateway is unreachable at ${pc.bold(baseUrl)} (${health.error || \"offline\"}).`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n const availableModels = await fetchAvailableModels(baseUrl, apiKey);\n if (availableModels.length === 0) {\n console.warn(\n formatWarning(`SRouter Gateway responded at ${baseUrl}, but returned 0 models.`)\n );\n }\n\n const adaptersToSync = toolId\n ? [getAdapter(toolId)].filter((a): a is NonNullable<typeof a> => Boolean(a))\n : getAllAdapters();\n\n if (toolId && adaptersToSync.length === 0) {\n console.error(formatError(`Tool '${pc.bold(toolId)}' not supported.`));\n process.exitCode = 1;\n return;\n }\n\n for (const adapter of adaptersToSync) {\n if (!adapter) continue;\n const status = await adapter.getStatus();\n if (!status.linked && !toolId) {\n // Skip unlinked tools if running global sync\n continue;\n }\n\n try {\n const result = await adapter.link({\n baseUrl,\n apiKey,\n model: savedConfig.defaultModel || status.currentModel,\n opusModel: savedConfig.defaultOpusModel,\n sonnetModel: savedConfig.defaultSonnetModel,\n haikuModel: savedConfig.defaultHaikuModel,\n availableModels\n });\n\n console.log(\n formatSuccess(\n `Synced ${pc.bold(pc.cyan(availableModels.length.toString()))} models to ${pc.bold(adapter.name)} (${pc.gray(result.modifiedPath)})`\n )\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to sync ${adapter.name}: ${msg}`));\n }\n }\n}\n","import { getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { getSystemInfo } from \"../lib/platform.js\";\nimport { checkServerHealth, fetchAvailableModels } from \"../lib/srouterClient.js\";\nimport {\n formatError,\n formatInfo,\n formatSuccess,\n formatWarning,\n pc,\n showHeader\n} from \"../lib/ui.js\";\n\nexport interface StatusCommandOptions {\n url?: string;\n key?: string;\n}\n\nexport async function statusCommand(options: StatusCommandOptions): Promise<void> {\n showHeader();\n\n const sysInfo = getSystemInfo();\n console.log(pc.bold(pc.underline(\"System Environment:\")));\n console.log(` ${pc.gray(\"OS:\")} ${pc.white(sysInfo.displayName)}`);\n console.log(` ${pc.gray(\"Platform:\")} ${pc.white(sysInfo.platform)} (${sysInfo.arch})`);\n console.log(` ${pc.gray(\"Shell:\")} ${pc.white(sysInfo.detectedShell)}`);\n console.log(` ${pc.gray(\"Home Dir:\")} ${pc.white(sysInfo.homeDir)}`);\n console.log(\"\");\n\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n\n console.log(pc.bold(pc.underline(\"Gateway Status:\")));\n console.log(` ${pc.gray(\"Target URL:\")} ${pc.white(baseUrl)}`);\n\n const health = await checkServerHealth(baseUrl, apiKey);\n if (health.healthy) {\n console.log(\n ` ${pc.gray(\"Health:\")} ${pc.green(\"ONLINE\")} ${pc.gray(`(${health.latencyMs}ms)`)}`\n );\n const models = await fetchAvailableModels(baseUrl, apiKey);\n console.log(` ${pc.gray(\"Models:\")} ${pc.cyan(`${models.length} available`)}`);\n if (models.length > 0) {\n const preview = models.slice(0, 5).join(\", \");\n const extra = models.length > 5 ? ` +${models.length - 5} more` : \"\";\n console.log(` ${pc.gray(`[${preview}${extra}]`)}`);\n }\n } else {\n console.log(` ${pc.gray(\"Health:\")} ${pc.red(\"OFFLINE / UNREACHABLE\")}`);\n if (health.error) {\n console.log(` ${pc.gray(\"Reason:\")} ${pc.yellow(health.error)}`);\n }\n }\n\n console.log(\"\");\n console.log(pc.bold(pc.underline(\"Supported AI Coding Tools:\")));\n\n const adapters = getAllAdapters();\n for (const adapter of adapters) {\n const status = await adapter.getStatus();\n const icon = status.linked\n ? pc.green(\"● CONFIGURED (LINKED)\")\n : pc.gray(\"○ NOT CONFIGURED (UNLINKED)\");\n const installBadge = status.installed\n ? pc.green(\"[Installed]\")\n : pc.yellow(\"[Not in PATH]\");\n\n console.log(`\\n ${pc.bold(pc.cyan(adapter.name))} ${icon} ${installBadge}`);\n console.log(` ${pc.gray(\"ID:\")} ${adapter.id}`);\n console.log(` ${pc.gray(\"Config Path:\")} ${status.configPath || \"N/A\"}`);\n if (status.linked) {\n console.log(` ${pc.gray(\"Active URL:\")} ${pc.green(status.currentBaseUrl || \"N/A\")}`);\n if (status.currentModel) {\n console.log(` ${pc.gray(\"Model:\")} ${pc.green(status.currentModel)}`);\n }\n if (status.currentOpusModel) {\n console.log(` ${pc.gray(\"Opus Model:\")} ${pc.green(status.currentOpusModel)}`);\n }\n if (status.currentSonnetModel) {\n console.log(` ${pc.gray(\"Sonnet Model:\")}${pc.green(status.currentSonnetModel)}`);\n }\n if (status.currentHaikuModel) {\n console.log(` ${pc.gray(\"Haiku Model:\")} ${pc.green(status.currentHaikuModel)}`);\n }\n } else {\n console.log(\n ` ${pc.gray(\"Status:\")} ${pc.yellow(\"Not connected to SRouter proxy\")}`\n );\n }\n }\n\n console.log(\"\");\n}\n","import { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { detectShell, formatShellExport, type ShellType } from \"../lib/platform.js\";\nimport { formatError, pc } from \"../lib/ui.js\";\n\nexport interface EnvCommandOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n fish?: boolean;\n shell?: string;\n}\n\nexport async function envCommand(toolId?: string, options: EnvCommandOptions = {}): Promise<void> {\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n const model = options.model || savedConfig.defaultModel;\n const opusModel = options.opusModel || savedConfig.defaultOpusModel;\n const sonnetModel = options.sonnetModel || savedConfig.defaultSonnetModel;\n const haikuModel = options.haikuModel || savedConfig.defaultHaikuModel;\n\n const context = {\n baseUrl,\n apiKey,\n model,\n opusModel,\n sonnetModel,\n haikuModel\n };\n\n let envVars: Record<string, string> = {};\n\n if (toolId) {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n envVars = adapter.getEnv(context);\n } else {\n envVars = {\n ANTHROPIC_BASE_URL: baseUrl,\n OPENAI_BASE_URL: baseUrl\n };\n if (apiKey) {\n envVars.ANTHROPIC_API_KEY = apiKey;\n envVars.OPENAI_API_KEY = apiKey;\n }\n if (model) {\n envVars.ANTHROPIC_MODEL = model;\n envVars.OPENCODE_MODEL = model;\n }\n if (opusModel) {\n envVars.ANTHROPIC_DEFAULT_OPUS_MODEL = opusModel;\n }\n if (sonnetModel) {\n envVars.ANTHROPIC_DEFAULT_SONNET_MODEL = sonnetModel;\n }\n if (haikuModel) {\n envVars.ANTHROPIC_DEFAULT_HAIKU_MODEL = haikuModel;\n }\n }\n\n let targetShell: ShellType = detectShell();\n if (options.fish) {\n targetShell = \"fish\";\n } else if (options.shell) {\n const s = options.shell.toLowerCase();\n if (\n s === \"fish\" ||\n s === \"powershell\" ||\n s === \"pwsh\" ||\n s === \"cmd\" ||\n s === \"zsh\" ||\n s === \"bash\"\n ) {\n targetShell = (s === \"pwsh\" ? \"powershell\" : s) as ShellType;\n }\n }\n\n for (const [key, value] of Object.entries(envVars)) {\n console.log(formatShellExport(key, value, targetShell));\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { getAdapter, getAllAdapters } from \"../adapters/index.js\";\nimport { defaultStore } from \"../lib/configStore.js\";\nimport { formatError, pc } from \"../lib/ui.js\";\n\nexport interface RunCommandOptions {\n url?: string;\n key?: string;\n model?: string;\n opusModel?: string;\n sonnetModel?: string;\n haikuModel?: string;\n}\n\nexport async function runCommand(\n toolId: string,\n toolArgs: string[],\n options: RunCommandOptions = {}\n): Promise<void> {\n const adapter = getAdapter(toolId);\n if (!adapter) {\n console.error(\n formatError(\n `Tool '${pc.bold(toolId)}' not supported. Available: ${getAllAdapters()\n .map((a) => a.id)\n .join(\", \")}`\n )\n );\n process.exitCode = 1;\n return;\n }\n\n const savedConfig = await defaultStore.loadConfig();\n const baseUrl = options.url || savedConfig.defaultBaseUrl || \"http://localhost:3000/v1\";\n const apiKey = options.key || savedConfig.defaultApiKey;\n const model = options.model || savedConfig.defaultModel;\n const opusModel = options.opusModel || savedConfig.defaultOpusModel;\n const sonnetModel = options.sonnetModel || savedConfig.defaultSonnetModel;\n const haikuModel = options.haikuModel || savedConfig.defaultHaikuModel;\n\n const envToInject = adapter.getEnv({\n baseUrl,\n apiKey,\n model,\n opusModel,\n sonnetModel,\n haikuModel\n });\n\n const binaryName = toolId === \"claude\" ? \"claude\" : \"opencode\";\n\n const child = spawn(binaryName, toolArgs, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n ...envToInject\n }\n });\n\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"ENOENT\") {\n console.error(\n formatError(\n `Executable '${pc.bold(binaryName)}' not found in your PATH. Please install ${adapter.name} first.`\n )\n );\n } else {\n console.error(formatError(`Failed to run ${binaryName}: ${err.message}`));\n }\n process.exitCode = 1;\n });\n\n child.on(\"exit\", (code) => {\n if (code !== null && code !== 0) {\n process.exitCode = code;\n }\n });\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { DEFAULT_DB_PATH, initDatabase, LEGACY_DB_LOCATIONS, SROUTER_DIR } from \"@srouter/db\";\nimport { formatError, formatInfo, formatSuccess, formatWarning, pc } from \"../lib/ui.js\";\n\ntype SqliteValue = string | number | bigint | Uint8Array | null;\n\ninterface NineRouterJsonBackup {\n settings?: Record<string, unknown>;\n providerConnections?: Array<{\n id: string;\n provider: string;\n name: string;\n authType?: string;\n apiKey?: string;\n accessToken?: string;\n access_token?: string;\n refreshToken?: string;\n refresh_token?: string;\n expiresAt?: string;\n tokenExpiresAt?: number;\n lastRefreshAt?: string;\n lastRefreshedAt?: number;\n providerSpecificData?: Record<string, unknown>;\n isActive?: boolean;\n createdAt?: string;\n updatedAt?: string;\n [key: string]: unknown;\n }>;\n providerNodes?: Array<{\n id: string;\n name: string;\n prefix?: string;\n apiType?: string;\n baseUrl?: string;\n type?: string;\n [key: string]: unknown;\n }>;\n apiKeys?: Array<{\n id?: string;\n key: string;\n name?: string;\n isActive?: boolean;\n createdAt?: string;\n [key: string]: unknown;\n }>;\n customModels?: Array<{\n providerAlias?: string;\n id: string;\n type?: string;\n name?: string;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n}\n\nfunction parseDateToTimestamp(val: unknown): number {\n if (typeof val === \"number\" && Number.isFinite(val)) return val;\n if (typeof val === \"string\") {\n const parsed = Date.parse(val);\n if (!Number.isNaN(parsed)) return parsed;\n }\n return Date.now();\n}\n\nfunction map9RouterProtocol(apiType?: string, type?: string): string {\n if (apiType === \"anthropic\" || type === \"anthropic\" || type?.includes(\"anthropic\")) {\n return \"anthropic\";\n }\n return \"openai\";\n}\n\nfunction importNineRouterJson(\n data: NineRouterJsonBackup,\n targetDb: DatabaseSync,\n action: \"copy\" | \"merge\" | \"backup_and_replace\"\n): { inserted: number; skipped: number; tablesCount: number } {\n const nodesMap = new Map<string, NonNullable<NineRouterJsonBackup[\"providerNodes\"]>[number]>();\n if (Array.isArray(data.providerNodes)) {\n for (const node of data.providerNodes) {\n nodesMap.set(node.id, node);\n }\n }\n\n if (action !== \"copy\") {\n try {\n targetDb.prepare('DELETE FROM \"providers\"').run();\n targetDb.prepare('DELETE FROM \"api_keys\"').run();\n targetDb.prepare('DELETE FROM \"custom_models\"').run();\n } catch {\n // Ignored if table doesn't exist\n }\n }\n\n let inserted = 0;\n let skipped = 0;\n let tablesCount = 0;\n\n // 1. Migrate Providers\n if (Array.isArray(data.providerConnections) && data.providerConnections.length > 0) {\n tablesCount++;\n const insertProvider = targetDb.prepare(`\n INSERT OR REPLACE INTO providers (\n id, provider_id, name, category, protocol, base_url, api_key, access_token,\n refresh_token, account_id, organization_id, token_expires_at, last_refreshed_at,\n custom_headers, provider_specific_data, enabled, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const conn of data.providerConnections) {\n try {\n const node = nodesMap.get(conn.provider);\n const providerId = node ? node.name.toLowerCase() : conn.provider;\n const protocol = node ? map9RouterProtocol(node.apiType, node.type) : \"openai\";\n const baseUrl = node?.baseUrl ?? (conn.providerSpecificData?.baseUrl as string) ?? null;\n const apiKey = conn.apiKey ?? null;\n const accessToken = conn.accessToken ?? conn.access_token ?? null;\n const refreshToken = conn.refreshToken ?? conn.refresh_token ?? null;\n\n const tokenExpiresAt = conn.tokenExpiresAt ?? (conn.expiresAt ? parseDateToTimestamp(conn.expiresAt) : null);\n const lastRefreshedAt = conn.lastRefreshedAt ?? (conn.lastRefreshAt ? parseDateToTimestamp(conn.lastRefreshAt) : null);\n\n const accountId = (conn.providerSpecificData?.chatgptAccountId as string) ?? (conn.providerSpecificData?.accountId as string) ?? null;\n const orgId = (conn.providerSpecificData?.organizationId as string) ?? null;\n const enabled = conn.isActive === false ? 0 : 1;\n const createdAt = parseDateToTimestamp(conn.createdAt);\n\n insertProvider.run(\n conn.id,\n providerId,\n conn.name || providerId,\n \"general\",\n protocol,\n baseUrl,\n apiKey,\n accessToken,\n refreshToken,\n accountId,\n orgId,\n tokenExpiresAt,\n lastRefreshedAt,\n null,\n conn.providerSpecificData ? JSON.stringify(conn.providerSpecificData) : null,\n enabled,\n createdAt\n );\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n // 2. Migrate API Keys\n if (Array.isArray(data.apiKeys) && data.apiKeys.length > 0) {\n tablesCount++;\n const insertKey = targetDb.prepare(`\n INSERT OR REPLACE INTO api_keys (\n id, key, name, enabled, rate_limit, quota_limit, usage_tokens, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n for (const keyItem of data.apiKeys) {\n try {\n insertKey.run(\n keyItem.id || `key_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n keyItem.key,\n keyItem.name || \"Default Key\",\n keyItem.isActive === false ? 0 : 1,\n 0,\n 0,\n 0,\n parseDateToTimestamp(keyItem.createdAt)\n );\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n // 3. Migrate Custom Models\n if (Array.isArray(data.customModels) && data.customModels.length > 0) {\n tablesCount++;\n const insertCustomModel = targetDb.prepare(`\n INSERT OR IGNORE INTO custom_models (\n provider_id, model_id, created_at\n ) VALUES (?, ?, ?)\n `);\n\n for (const model of data.customModels) {\n try {\n insertCustomModel.run(\n model.providerAlias || \"default\",\n model.id || model.name || \"unknown\",\n Date.now()\n );\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n return { inserted, skipped, tablesCount };\n}\n\nexport interface MigrateCommandOptions {\n source?: string;\n yes?: boolean;\n action?: \"copy\" | \"merge\" | \"backup_and_replace\";\n}\n\nconst TargetDbPath = DEFAULT_DB_PATH;\nconst BackupDir = path.join(SROUTER_DIR, \"backups\");\n\nconst NineRouterDbLocations = [\n path.join(os.homedir(), \".9router\", \"srouter.db\"),\n path.join(os.homedir(), \".9router\", \"9router.db\"),\n path.join(os.homedir(), \"9router\", \"srouter.db\"),\n path.join(os.homedir(), \"9router\", \"data.db\"),\n path.join(os.homedir(), \"9router\", \"db\", \"srouter.db\"),\n path.join(os.homedir(), \".config\", \"9router\", \"srouter.db\"),\n path.join(os.homedir(), \".config\", \"9router\", \"9router.db\"),\n \"/root/9router/srouter.db\",\n \"/root/project/9router/db/srouter.db\",\n ...LEGACY_DB_LOCATIONS\n];\n\nfunction fileKb(filePath: string): string {\n return `${(fs.statSync(filePath).size / 1024).toFixed(2)} KB`;\n}\n\nfunction ensureDirs(): void {\n fs.mkdirSync(SROUTER_DIR, { recursive: true, mode: 0o700 });\n fs.mkdirSync(BackupDir, { recursive: true, mode: 0o755 });\n}\n\nfunction backupDb(source: string, label: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(BackupDir, `${label}-backup-${timestamp}.db`);\n fs.copyFileSync(source, backupPath);\n p.log.step(`Backed up to ${pc.dim(backupPath)}`);\n return backupPath;\n}\n\nfunction getDownloadDirs(): string[] {\n const home = os.homedir();\n const dirs = [\n path.join(home, \"Downloads\"),\n path.join(home, \"download\"),\n path.join(home, \"downloads\"),\n path.join(home, \"Desktop\")\n ];\n\n if (process.platform === \"win32\") {\n if (process.env.USERPROFILE) {\n dirs.push(path.join(process.env.USERPROFILE, \"Downloads\"));\n dirs.push(path.join(process.env.USERPROFILE, \"Desktop\"));\n }\n }\n\n return Array.from(new Set(dirs.filter((d) => fs.existsSync(d))));\n}\n\nexport function scanFor9RouterFiles(): Array<{ path: string; label: string; mtime: number }> {\n const results: Array<{ path: string; label: string; mtime: number }> = [];\n const seen = new Set<string>();\n\n const addFile = (filePath: string, label: string) => {\n const resolved = path.resolve(filePath);\n if (!seen.has(resolved) && fs.existsSync(resolved)) {\n try {\n const stat = fs.statSync(resolved);\n if (stat.isFile()) {\n seen.add(resolved);\n results.push({ path: resolved, label, mtime: stat.mtimeMs });\n }\n } catch {\n // Ignore inaccessible files\n }\n }\n };\n\n // 1. Scan default App/DB locations\n for (const loc of NineRouterDbLocations) {\n addFile(loc, \"Installed Database\");\n }\n\n // 2. Scan Downloads and Desktop folders for 9router backup JSON and DB files\n for (const downloadDir of getDownloadDirs()) {\n try {\n const files = fs.readdirSync(downloadDir);\n for (const file of files) {\n const lower = file.toLowerCase();\n const fullPath = path.join(downloadDir, file);\n if (\n lower.includes(\"9router\") ||\n lower.includes(\"srouter-backup\") ||\n lower.endsWith(\".db\") ||\n (lower.endsWith(\".json\") && lower.includes(\"backup\"))\n ) {\n addFile(fullPath, path.basename(downloadDir));\n }\n }\n } catch {\n // Ignore unreadable directory\n }\n }\n\n return results.sort((a, b) => b.mtime - a.mtime);\n}\n\nfunction findDatabase(candidates: string[], label: string): string | null {\n for (const candidate of candidates) {\n const fullPath = path.resolve(candidate);\n if (fs.existsSync(fullPath)) {\n p.log.info(`Found ${label} database: ${pc.bold(fullPath)} (${fileKb(fullPath)})`);\n return fullPath;\n }\n }\n return null;\n}\n\nasync function migrateDb(options: MigrateCommandOptions): Promise<void> {\n p.intro(\"SRouter Database Migration\");\n\n if (fs.existsSync(TargetDbPath)) {\n p.log.warn(`Database already exists at ${TargetDbPath} (${fileKb(TargetDbPath)})`);\n p.outro(\"No migration needed — already using the new location.\");\n return;\n }\n\n const source =\n options.source && fs.existsSync(options.source)\n ? path.resolve(options.source)\n : findDatabase(LEGACY_DB_LOCATIONS, \"legacy\");\n\n if (!source) {\n p.log.error(\"No existing database found.\");\n p.outro(\n `Start SRouter and a fresh database will be created at ${TargetDbPath}, ` +\n \"or pass --source /path/to/srouter.db.\"\n );\n return;\n }\n\n ensureDirs();\n const proceed =\n options.yes || (await p.confirm({ message: `Migrate database from ${source}?` })) === true;\n\n if (!proceed) {\n p.outro(\"Migration cancelled.\");\n return;\n }\n\n try {\n backupDb(source, \"srouter\");\n fs.copyFileSync(source, TargetDbPath);\n fs.chmodSync(TargetDbPath, 0o600);\n p.log.success(`Database moved to ${TargetDbPath}`);\n p.outro(\"Restart SRouter to use the migrated database.\");\n } catch (error) {\n p.log.error(formatError(`Migration failed: ${(error as Error).message}`));\n process.exitCode = 1;\n }\n}\n\nasync function migrateNineRouter(options: MigrateCommandOptions): Promise<void> {\n p.intro(\"9Router → SRouter Database Migration\");\n\n let source = options.source && fs.existsSync(options.source) ? path.resolve(options.source) : null;\n\n if (!source) {\n const foundFiles = scanFor9RouterFiles();\n\n if (foundFiles.length === 1) {\n source = foundFiles[0].path;\n p.log.info(`Found 9Router file: ${pc.bold(source)} (${fileKb(source)}) [${foundFiles[0].label}]`);\n } else if (foundFiles.length > 1) {\n if (options.yes) {\n source = foundFiles[0].path;\n p.log.info(`Auto-selected latest 9Router file: ${pc.bold(source)} (${fileKb(source)})`);\n } else {\n const choice = await p.select({\n message: \"Multiple 9Router database/backup files found. Select one to migrate:\",\n options: [\n ...foundFiles.map((f) => ({\n value: f.path,\n label: `${path.basename(f.path)} (${fileKb(f.path)})`,\n hint: `${f.label} • ${f.path}`\n })),\n { value: \"custom\", label: \"Enter custom path manually...\" }\n ]\n });\n\n if (p.isCancel(choice)) {\n p.outro(\"Migration cancelled.\");\n return;\n }\n\n if (choice === \"custom\") {\n const customPath = await p.text({\n message: \"Enter path to 9Router .db or .json backup file:\",\n validate: (val) => {\n if (!val || !fs.existsSync(path.resolve(val))) {\n return \"File does not exist. Please check the path.\";\n }\n }\n });\n if (p.isCancel(customPath) || !customPath) {\n p.outro(\"Migration cancelled.\");\n return;\n }\n source = path.resolve(customPath);\n } else {\n source = choice as string;\n }\n }\n }\n }\n\n if (!source) {\n p.log.error(\"No 9Router database or backup file found.\");\n p.outro(\n \"Pass the location explicitly: srouter migrate 9router --source /path/to/9router-backup.json\"\n );\n process.exitCode = 1;\n return;\n }\n\n const existingTarget = fs.existsSync(TargetDbPath);\n let action: \"copy\" | \"merge\" | \"backup_and_replace\" = options.action ?? \"copy\";\n\n if (existingTarget && !options.action) {\n if (options.yes) {\n action = \"merge\";\n } else {\n p.log.warn(`Existing SRouter database found at ${TargetDbPath} (${fileKb(TargetDbPath)})`);\n const choice = await p.select({\n message: \"How should the existing SRouter database be handled?\",\n options: [\n { value: \"backup_and_replace\", label: \"Backup current, replace with 9Router data\" },\n { value: \"merge\", label: \"Overwrite tables with 9Router data\" },\n { value: \"abort\", label: \"Cancel migration\" }\n ]\n });\n if (choice === \"abort\" || p.isCancel(choice)) {\n p.outro(\"Migration cancelled. Your 9Router installation remains intact.\");\n return;\n }\n if (choice === \"merge\" || choice === \"backup_and_replace\") {\n action = choice;\n }\n }\n }\n\n const proceed =\n options.yes || (await p.confirm({ message: \"Proceed with migration?\" })) === true;\n if (!proceed) {\n p.outro(\"Migration cancelled. No changes made.\");\n return;\n }\n\n ensureDirs();\n const sourceBackup = backupDb(source, \"9router\");\n\n let targetBackup: string | null = null;\n if (action === \"backup_and_replace\") {\n targetBackup = backupDb(TargetDbPath, \"srouter\");\n }\n\n const s = p.spinner();\n try {\n s.start(\"Preparing target database\");\n initDatabase();\n\n const targetDb = new DatabaseSync(TargetDbPath);\n targetDb.exec(\"PRAGMA foreign_keys = OFF;\");\n\n let inserted = 0;\n let skipped = 0;\n let tablesCount = 0;\n\n const isJson = source.endsWith(\".json\");\n if (isJson) {\n s.message(\"Reading 9Router JSON backup\");\n const raw = fs.readFileSync(source, \"utf-8\");\n const parsed = JSON.parse(raw) as NineRouterJsonBackup;\n const res = importNineRouterJson(parsed, targetDb, action);\n inserted = res.inserted;\n skipped = res.skipped;\n tablesCount = res.tablesCount;\n } else {\n const sourceDb = new DatabaseSync(source);\n s.message(\"Reading source SQLite tables\");\n\n const sourceTables = (\n sourceDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name\")\n .all() as Array<{ name: string }>\n )\n .map((t) => t.name)\n .filter((name) => !name.startsWith(\"sqlite_\"));\n\n const targetTables = new Set(\n (\n targetDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table'\")\n .all() as Array<{ name: string }>\n ).map((t) => t.name)\n );\n\n for (const table of sourceTables) {\n if (!targetTables.has(table)) {\n p.log.warn(`Skipping table ${table} (not recognized by SRouter)`);\n continue;\n }\n\n const rows = sourceDb.prepare(`SELECT * FROM \"${table}\"`).all() as Record<\n string,\n SqliteValue\n >[];\n if (rows.length === 0) continue;\n\n if (action !== \"copy\") {\n try {\n targetDb.prepare(`DELETE FROM \"${table}\"`).run();\n } catch {\n p.log.warn(`Could not clear table ${table}, rows will be appended`);\n }\n }\n\n const sourceColumns = new Set(\n (\n sourceDb.prepare(`PRAGMA table_info(\"${table}\")`).all() as Array<{\n name: string;\n }>\n ).map((col) => col.name)\n );\n\n const targetColumns = (\n targetDb.prepare(`PRAGMA table_info(\"${table}\")`).all() as Array<{\n name: string;\n }>\n )\n .map((col) => col.name)\n .filter((col) => sourceColumns.has(col));\n\n if (targetColumns.length === 0) continue;\n\n const placeholders = targetColumns.map(() => \"?\").join(\", \");\n const insert = targetDb.prepare(\n `INSERT OR REPLACE INTO \"${table}\" (${targetColumns.map((c) => `\"${c}\"`).join(\", \")}) VALUES (${placeholders})`\n );\n\n for (const row of rows) {\n try {\n insert.run(...targetColumns.map((col) => row[col] ?? null));\n inserted++;\n } catch {\n skipped++;\n }\n }\n tablesCount++;\n }\n\n sourceDb.close();\n }\n\n targetDb.exec(\"PRAGMA foreign_keys = ON;\");\n targetDb.close();\n s.stop(\"Migration complete\");\n\n p.log.message(\n [\n `Tables/Categories migrated: ${tablesCount}`,\n `Rows/Items inserted: ${inserted}`,\n `Rows/Items skipped: ${skipped}`,\n `Source: ${source}`,\n `Target: ${TargetDbPath}`\n ].join(\"\\n\")\n );\n\n if (targetBackup) {\n p.log.info(`Old SRouter database backed up to ${targetBackup}`);\n }\n p.log.success(formatSuccess(`9Router backup saved to ${sourceBackup}`));\n p.outro(\"Your 9Router providers are now available in SRouter.\");\n } catch (error) {\n s.stop(formatError(\"Migration failed\"));\n p.log.error((error as Error).message);\n p.log.info(formatInfo(`Restore from backup if needed: cp ${sourceBackup} ${source}`));\n process.exitCode = 1;\n }\n}\n\nexport async function migrateCommand(\n target: string,\n options: MigrateCommandOptions\n): Promise<void> {\n switch (target) {\n case \"db\":\n return migrateDb(options);\n case \"9router\":\n return migrateNineRouter(options);\n default:\n p.log.error(formatError(`Unknown migration target: ${target}`));\n p.log.info(\n formatWarning(\"Available targets: db (legacy location), 9router (9Router import)\")\n );\n process.exitCode = 1;\n }\n}\n","import { DatabaseSync } from \"node:sqlite\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\n/** Directory holding the SRouter database (and backups) in the user's home directory. */\nexport const SROUTER_DIR = path.join(os.homedir(), \".srouter\");\n/** Default database location: ~/.srouter/srouter.db */\nexport const DEFAULT_DB_PATH = path.join(SROUTER_DIR, \"srouter.db\");\n/** Legacy database locations checked for backward compatibility (relative to cwd). */\nexport const LEGACY_DB_LOCATIONS = [\n path.resolve(process.cwd(), \"apps/api/srouter.db\"),\n path.resolve(process.cwd(), \"srouter.db\")\n];\nfunction getDatabasePath() {\n // Allow explicit override via DATABASE_PATH environment variable\n if (process.env.DATABASE_PATH)\n return process.env.DATABASE_PATH;\n // Fallback for legacy installations (keep existing for backward compatibility)\n for (const legacyPath of LEGACY_DB_LOCATIONS) {\n if (fs.existsSync(legacyPath))\n return legacyPath;\n }\n // Return new default path and create directory if needed\n return DEFAULT_DB_PATH;\n}\nconst dbPath = getDatabasePath();\n// Ensure parent folder exists if path contains subdirectories\nconst dbDir = path.dirname(dbPath);\nif (!fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n}\nexport const db = new DatabaseSync(dbPath);\n// Wait up to 5s instead of failing immediately when another connection\n// (e.g. a parallel test process or the CLI) holds the write lock.\ndb.exec(\"PRAGMA busy_timeout = 5000;\");\n// Enable WAL mode for high performance concurrency.\n// Retry briefly — concurrent processes initializing on the same DB file\n// (CI runs app test suites in parallel) can transiently hold the lock.\nfunction execWithRetry(sql, attempts = 5) {\n for (let i = 0; i < attempts; i++) {\n try {\n db.exec(sql);\n return;\n }\n catch (error) {\n const code = error.code;\n if (code === \"SQLITE_BUSY\" && i < attempts - 1) {\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 200 * (i + 1));\n continue;\n }\n throw error;\n }\n }\n}\nexecWithRetry(\"PRAGMA journal_mode = WAL;\");\nexecWithRetry(\"PRAGMA foreign_keys = ON;\");\n/**\n * Adds columns to a table if they do not already exist.\n * Declarative replacement for repeated try/catch ALTER TABLE blocks.\n */\nfunction ensureColumns(table, columns) {\n const existing = new Set(db.prepare(`PRAGMA table_info(\"${table}\")`).all().map((col) => col.name));\n for (const col of columns) {\n if (existing.has(col.name))\n continue;\n try {\n db.exec(`ALTER TABLE ${table} ADD COLUMN ${col.definition};`);\n existing.add(col.name);\n }\n catch (error) {\n const message = error.message || \"\";\n if (!message.includes(\"duplicate column name\")) {\n throw error;\n }\n }\n }\n}\n/**\n * Initialize database schema tables if they do not exist\n */\nexport function initDatabase() {\n // 1. Table for Providers configuration\n db.exec(`\n CREATE TABLE IF NOT EXISTS providers (\n id TEXT PRIMARY KEY,\n provider_id TEXT NOT NULL,\n name TEXT NOT NULL,\n category TEXT NOT NULL,\n protocol TEXT NOT NULL,\n base_url TEXT,\n api_key TEXT,\n access_token TEXT,\n refresh_token TEXT,\n custom_headers TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL\n );\n `);\n ensureColumns(\"providers\", [\n { name: \"refresh_token\", definition: \"refresh_token TEXT\" },\n // Multi-account OAuth binding (e.g. Codex ChatGPT-Account-ID)\n { name: \"account_id\", definition: \"account_id TEXT\" },\n // Provider-specific metadata (for example Kiro auth method/region/profile ARN)\n { name: \"provider_specific_data\", definition: \"provider_specific_data TEXT\" },\n // Token expiry tracking\n { name: \"token_expires_at\", definition: \"token_expires_at INTEGER\" },\n { name: \"last_refreshed_at\", definition: \"last_refreshed_at INTEGER\" },\n // Claude OAuth organization binding\n { name: \"organization_id\", definition: \"organization_id TEXT\" }\n ]);\n // 2. Table for Client API Keys / Endpoint Keys\n db.exec(`\n CREATE TABLE IF NOT EXISTS api_keys (\n id TEXT PRIMARY KEY,\n key TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n enabled INTEGER NOT NULL DEFAULT 1,\n rate_limit INTEGER DEFAULT 0,\n quota_limit INTEGER DEFAULT 0,\n usage_tokens INTEGER DEFAULT 0,\n created_at INTEGER NOT NULL\n );\n `);\n // 3. Table for Request Logs & Token Analytics\n db.exec(`\n CREATE TABLE IF NOT EXISTS request_logs (\n id TEXT PRIMARY KEY,\n api_key_id TEXT,\n provider_id TEXT NOT NULL,\n model TEXT NOT NULL,\n prompt_tokens INTEGER NOT NULL DEFAULT 0,\n completion_tokens INTEGER NOT NULL DEFAULT 0,\n total_tokens INTEGER NOT NULL DEFAULT 0,\n status_code INTEGER NOT NULL,\n latency_ms INTEGER NOT NULL,\n created_at INTEGER NOT NULL\n );\n `);\n // 4. Table for OAuth PKCE sessions (survive server restarts)\n db.exec(`\n CREATE TABLE IF NOT EXISTS oauth_sessions (\n state TEXT PRIMARY KEY,\n code_verifier TEXT NOT NULL,\n client_id TEXT NOT NULL,\n redirect_uri TEXT NOT NULL,\n created_at INTEGER NOT NULL\n );\n `);\n // Ensure analytics columns and fallback audit columns exist if table was created previously\n ensureColumns(\"request_logs\", [\n { name: \"cached_tokens\", definition: \"cached_tokens INTEGER NOT NULL DEFAULT 0\" },\n {\n name: \"cache_creation_tokens\",\n definition: \"cache_creation_tokens INTEGER NOT NULL DEFAULT 0\"\n },\n { name: \"reasoning_tokens\", definition: \"reasoning_tokens INTEGER NOT NULL DEFAULT 0\" },\n { name: \"estimated_cost\", definition: \"estimated_cost REAL NOT NULL DEFAULT 0\" },\n { name: \"fallback_occurred\", definition: \"fallback_occurred INTEGER NOT NULL DEFAULT 0\" },\n { name: \"fallback_path\", definition: \"fallback_path TEXT\" },\n { name: \"fallback_reason\", definition: \"fallback_reason TEXT\" },\n { name: \"resolved_model\", definition: \"resolved_model TEXT\" }\n ]);\n // 5. Table for Fallback Rules\n db.exec(`\n CREATE TABLE IF NOT EXISTS fallback_rules (\n id TEXT PRIMARY KEY,\n source_model TEXT NOT NULL,\n target_model TEXT NOT NULL,\n priority INTEGER NOT NULL DEFAULT 1,\n enabled INTEGER NOT NULL DEFAULT 1,\n trigger_on_status TEXT,\n max_retries INTEGER DEFAULT 1,\n created_at INTEGER NOT NULL\n );\n `);\n // 6. Table for Global System Settings\n db.exec(`\n CREATE TABLE IF NOT EXISTS system_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n `);\n // 7. Table for user-added custom models per provider driver\n db.exec(`\n CREATE TABLE IF NOT EXISTS custom_models (\n provider_id TEXT NOT NULL,\n model_id TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n PRIMARY KEY (provider_id, model_id)\n );\n `);\n}\n// Auto-run schema initialization\ninitDatabase();\n","import { randomUUID } from \"node:crypto\";\n/**\n * Generates a prefixed, collision-resistant identifier for DB rows.\n * Uses crypto.randomUUID instead of Math.random for unpredictability.\n */\nexport function generateId(prefix) {\n return `${prefix}_${randomUUID().replace(/-/g, \"\").slice(0, 12)}`;\n}\n/**\n * Safe scalar coercions for sqlite row values.\n */\nexport function str(value, fallback = \"\") {\n return value === null || value === undefined ? fallback : String(value);\n}\nexport function optStr(value) {\n return value === null || value === undefined ? undefined : String(value);\n}\nexport function num(value, fallback = 0) {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n","import { db } from \"./db.js\";\nimport { num, str } from \"./row-utils.js\";\nexport class AdminAuthStore {\n database;\n constructor(database = db) {\n this.database = database;\n this.database.exec(`\n CREATE TABLE IF NOT EXISTS admin_account (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n password_hash TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS admin_sessions (\n token_hash TEXT PRIMARY KEY,\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL\n );\n `);\n }\n hasAdminAccount() {\n const Row = this.database\n .prepare(\"SELECT 1 AS present FROM admin_account WHERE id = 1\")\n .get();\n return Boolean(Row);\n }\n createAdminAccount(passwordHash, now = Date.now()) {\n const Result = this.database\n .prepare(`INSERT OR IGNORE INTO admin_account (id, password_hash, created_at, updated_at)\n VALUES (1, ?, ?, ?)`)\n .run(passwordHash, now, now);\n return num(Result.changes) > 0;\n }\n getPasswordHash() {\n const Row = this.database\n .prepare(\"SELECT password_hash FROM admin_account WHERE id = 1\")\n .get();\n return Row?.password_hash ? str(Row.password_hash) : null;\n }\n updatePasswordHash(passwordHash, now = Date.now()) {\n const Result = this.database\n .prepare(`UPDATE admin_account\n SET password_hash = ?, updated_at = ?\n WHERE id = 1`)\n .run(passwordHash, now);\n return num(Result.changes) > 0;\n }\n createSession(tokenHash, createdAt, expiresAt) {\n this.database\n .prepare(`INSERT INTO admin_sessions (token_hash, created_at, expires_at)\n VALUES (?, ?, ?)`)\n .run(tokenHash, createdAt, expiresAt);\n }\n getSession(tokenHash, now = Date.now()) {\n this.database.prepare(\"DELETE FROM admin_sessions WHERE expires_at <= ?\").run(now);\n const Row = this.database\n .prepare(`SELECT token_hash, created_at, expires_at\n FROM admin_sessions\n WHERE token_hash = ? AND expires_at > ?`)\n .get(tokenHash, now);\n if (!Row)\n return null;\n return {\n tokenHash: str(Row.token_hash),\n createdAt: num(Row.created_at),\n expiresAt: num(Row.expires_at)\n };\n }\n deleteSession(tokenHash) {\n const Result = this.database\n .prepare(\"DELETE FROM admin_sessions WHERE token_hash = ?\")\n .run(tokenHash);\n return num(Result.changes) > 0;\n }\n}\nexport const adminAuthStore = new AdminAuthStore();\n","import { CODEBUDDY_CN_DOMAIN, CODEBUDDY_CN_USER_AGENT, isProviderBaseId } from \"@srouter/constants\";\nimport { getProviderModelUsageDB } from \"./logs.js\";\nimport { getAllProvidersDB } from \"./providers.js\";\nimport { num, str } from \"./row-utils.js\";\nfunction formatResetIn(resetTimeStr) {\n if (!resetTimeStr)\n return \"24h 0m\";\n const ResetTime = new Date(resetTimeStr).getTime();\n const Now = Date.now();\n const DiffMs = ResetTime - Now;\n if (DiffMs <= 0)\n return \"0m\";\n const Days = Math.floor(DiffMs / (1000 * 60 * 60 * 24));\n const Hours = Math.floor(DiffMs / (1000 * 60 * 60));\n if (Days > 0) {\n return `${Days}d ${Hours - Days * 24}h`;\n }\n const Minutes = Math.floor((DiffMs % (1000 * 60 * 60)) / (1000 * 60));\n if (Hours > 0) {\n return `${Hours}h ${Minutes}m`;\n }\n return `${Minutes}m`;\n}\nexport async function fetchAntigravityLiveQuota(providerId, accountName, accessToken, enabled = true) {\n if (!accessToken || !(accessToken.startsWith(\"ya29.\") || accessToken.length > 20)) {\n throw new Error(\"Antigravity quota requires a valid access token\");\n }\n const Res = await fetch(\"https://cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Antigravity/1.0 (VSCode)\",\n \"x-goog-api-client\": \"gl-node/18.0.0 gd/1.0.0\"\n },\n body: JSON.stringify({})\n });\n if (!Res.ok) {\n throw new Error(`Antigravity quota fetch failed: HTTP ${Res.status}`);\n }\n const Data = (await Res.json());\n if (!Data.models || Object.keys(Data.models).length === 0) {\n throw new Error(\"Antigravity quota fetch returned no models\");\n }\n const Quotas = Object.entries(Data.models).map(([modelId, item]) => {\n const RemainingFraction = item.quotaInfo?.remainingFraction ?? 1.0;\n const PercentageValue = Math.round(RemainingFraction * 100);\n const Limit = 1000;\n const Used = Math.round((1 - RemainingFraction) * Limit);\n const ResetIn = formatResetIn(item.quotaInfo?.resetTime);\n let Status = \"ok\";\n if (PercentageValue <= 5)\n Status = \"exhausted\";\n else if (PercentageValue <= 20)\n Status = \"warning\";\n return {\n name: item.displayName || modelId,\n used: Used,\n limit: Limit,\n percentage: `${PercentageValue}%`,\n percentageValue: PercentageValue,\n resetIn: ResetIn,\n resetTime: item.quotaInfo?.resetTime,\n status: Status\n };\n });\n return {\n id: providerId,\n provider: \"Antigravity\",\n account: accountName,\n enabled,\n quotaType: \"live_provider_quota\",\n totalQuotas: Quotas.length,\n quotas: Quotas\n };\n}\nconst CN_REFILL_GAP_MS = 2 * 24 * 60 * 60 * 1000;\nexport async function fetchCodeBuddyCNLiveQuota(providerId, accountName, accessToken, enabled = true) {\n if (!accessToken) {\n throw new Error(\"CodeBuddy CN quota requires an access token\");\n }\n const Res = await fetch(\"https://copilot.tencent.com/v2/billing/meter/get-user-resource\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": CODEBUDDY_CN_USER_AGENT,\n \"X-Product\": \"SaaS\",\n \"X-IDE-Type\": \"CLI\",\n \"X-IDE-Name\": \"CLI\",\n \"X-Domain\": CODEBUDDY_CN_DOMAIN,\n \"x-requested-with\": \"XMLHttpRequest\",\n \"x-codebuddy-request\": \"1\"\n },\n body: \"{}\"\n });\n if (!Res.ok) {\n throw new Error(`CodeBuddy CN quota fetch failed: HTTP ${Res.status}`);\n }\n const Json = (await Res.json());\n if (Json.code !== 0) {\n throw new Error(`CodeBuddy CN quota error: ${Json.msg || \"unknown\"}`);\n }\n const Accounts = Json.data?.Response?.Data?.Accounts ?? [];\n if (Accounts.length === 0) {\n throw new Error(\"CodeBuddy CN quota fetch returned no credit packages\");\n }\n const cycleEndMs = (acc) => {\n const T = acc.CycleEndTime ? new Date(acc.CycleEndTime).getTime() : NaN;\n return Number.isFinite(T) ? T : Number.POSITIVE_INFINITY;\n };\n const isRefill = (acc) => {\n const Ce = cycleEndMs(acc);\n const De = num(acc.DeductionEndTime);\n return Number.isFinite(Ce) && Number.isFinite(De) && De - Ce > CN_REFILL_GAP_MS;\n };\n const byExpiry = (a, b) => cycleEndMs(a) - cycleEndMs(b);\n const Refills = Accounts.filter(isRefill).sort(byExpiry);\n const Bonuses = Accounts.filter((a) => !isRefill(a)).sort(byExpiry);\n const toItem = (name, used, total, resetTime) => {\n const RemainingFraction = total > 0 ? (total - used) / total : 1;\n return {\n name,\n used: Math.round(used * 100) / 100,\n limit: Math.round(total * 100) / 100,\n percentage: total > 0 ? `${Math.round((used / total) * 100)}%` : \"0%\",\n percentageValue: total > 0 ? Math.round((used / total) * 100) : 0,\n resetIn: formatResetIn(resetTime),\n resetTime,\n status: RemainingFraction <= 0.05\n ? \"exhausted\"\n : RemainingFraction <= 0.2\n ? \"warning\"\n : \"ok\"\n };\n };\n const parseNum = (precise, plain) => {\n return num(precise ?? plain);\n };\n const Quotas = [];\n const SeenCadence = {};\n for (const acc of Refills) {\n const CycleStartMs = acc.CycleStartTime ? new Date(acc.CycleStartTime).getTime() : NaN;\n const CycleDays = (cycleEndMs(acc) - CycleStartMs) / 86400000;\n const Base = Number.isFinite(CycleDays) && CycleDays <= 1.5\n ? \"Daily\"\n : Number.isFinite(CycleDays) && CycleDays <= 10\n ? \"Weekly\"\n : \"Monthly\";\n SeenCadence[Base] = (SeenCadence[Base] ?? 0) + 1;\n const Name = SeenCadence[Base] > 1 ? `${Base} ${SeenCadence[Base]}` : Base;\n Quotas.push(toItem(Name, parseNum(acc.CycleCapacityUsedPrecise, acc.CycleCapacityUsed), parseNum(acc.CycleCapacitySizePrecise, acc.CycleCapacitySize), acc.CycleEndTime));\n }\n Bonuses.forEach((acc, i) => {\n Quotas.push(toItem(`Bonus Pack ${i + 1}`, parseNum(acc.CapacityUsedPrecise, acc.CapacityUsed), parseNum(acc.CapacitySizePrecise, acc.CapacitySize), acc.CycleEndTime));\n });\n const BasePkg = Refills[0] ?? Accounts[0] ?? {};\n const Plan = BasePkg.PackageName || BasePkg.SubProductName;\n return {\n id: providerId,\n provider: Plan ? `CodeBuddy CN (${Plan})` : \"CodeBuddy CN\",\n account: accountName,\n enabled,\n quotaType: \"live_provider_quota\",\n totalQuotas: Quotas.length,\n quotas: Quotas\n };\n}\nexport async function getProviderQuotaAccount(p) {\n const IsAntigravity = isProviderBaseId(p.providerId, \"antigravity\") || isProviderBaseId(p.id, \"antigravity\");\n const IsOpenAICodex = isProviderBaseId(p.providerId, \"openai_codex\") || isProviderBaseId(p.id, \"openai_codex\");\n const IsOpenAI = isProviderBaseId(p.providerId, \"openai\") || isProviderBaseId(p.id, \"openai\");\n const IsAnthropic = isProviderBaseId(p.providerId, \"anthropic\") || isProviderBaseId(p.id, \"anthropic\");\n const IsCodeBuddyCN = isProviderBaseId(p.providerId, \"codebuddy-cn\") || isProviderBaseId(p.id, \"codebuddy-cn\");\n const IsCodeBuddy = !IsCodeBuddyCN &&\n (isProviderBaseId(p.providerId, \"codebuddy\") || isProviderBaseId(p.id, \"codebuddy\"));\n const Token = p.accessToken || p.apiKey || \"\";\n if (IsCodeBuddy) {\n throw new Error(\"CodeBuddy (international) does not expose a live quota endpoint\");\n }\n if (IsCodeBuddyCN) {\n return await fetchCodeBuddyCNLiveQuota(p.id, p.name || \"CodeBuddy CN Account\", Token, p.enabled);\n }\n if (IsAntigravity) {\n return await fetchAntigravityLiveQuota(p.id, p.name || \"seaavey@gmail.com\", Token, p.enabled);\n }\n const UsageRows = getProviderModelUsageDB(p.id);\n const UsageMetrics = UsageRows.map((row) => ({\n model: row.model,\n totalRequests: row.totalRequests,\n totalTokens: row.totalTokens,\n promptTokens: row.promptTokens,\n completionTokens: row.completionTokens,\n lastUsedAt: row.lastUsedAt ? new Date(row.lastUsedAt).toISOString() : null\n }));\n let ProviderName = p.name || p.providerId || p.id;\n if (IsOpenAICodex)\n ProviderName = \"OpenAI Codex\";\n else if (IsOpenAI)\n ProviderName = \"OpenAI\";\n else if (IsAnthropic)\n ProviderName = \"Anthropic\";\n return {\n id: p.id,\n provider: ProviderName,\n account: p.name || `${ProviderName} Account`,\n enabled: p.enabled,\n quotaType: \"usage_logged\",\n usageMetrics: UsageMetrics\n };\n}\nexport async function getQuotaSummaryDB() {\n const DbProviders = getAllProvidersDB();\n const ProviderAccounts = [];\n for (const p of DbProviders) {\n try {\n const Account = await getProviderQuotaAccount(p);\n ProviderAccounts.push(Account);\n }\n catch {\n // Skip providers whose quota cannot be fetched\n }\n }\n return {\n object: \"quota\",\n totalAccounts: ProviderAccounts.length,\n providers: ProviderAccounts\n };\n}\n"],"mappings":"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","names":["intro","outro","spinner","note","fs","path","os","os","path","fs","p","p","os","path","fs","xdgConfig","fs","path","os","fs","path","str","fs","path","intro","spinner","note","outro","customInput","val","fs","os","path","DatabaseSync","path","fs","os","path","os","fs","DatabaseSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@srouter/cli",
3
- "version": "0.1.3-rc.1",
3
+ "version": "0.1.3-rc.2",
4
4
  "description": "CLI tool to seamlessly connect and configure AI coding tools with SRouter Gateway",
5
5
  "type": "module",
6
6
  "bin": {