@srouter/cli 0.1.4 → 0.1.5-rc.1

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.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 .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 path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { DEFAULT_DB_PATH, 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\nexport interface MigrateCommandOptions {\n source?: string;\n yes?: boolean;\n}\n\nconst TargetDbPath = DEFAULT_DB_PATH;\nconst BackupDir = path.join(SROUTER_DIR, \"backups\");\n\nconst NineRouterDbLocations = [\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\" = \"copy\";\n\n if (existingTarget) {\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 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(\"Opening databases\");\n const sourceDb = new DatabaseSync(source);\n const targetDb = new DatabaseSync(TargetDbPath);\n s.message(\"Reading source tables\");\n\n const tables = (\n sourceDb\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name\")\n .all() as Array<{ name: string }>\n ).map((t) => t.name);\n\n let inserted = 0;\n let skipped = 0;\n\n for (const table of tables) {\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 columns = (\n sourceDb.prepare(`PRAGMA table_info(\"${table}\")`).all() as Array<{\n name: string;\n }>\n ).map((col) => col.name);\n const placeholders = columns.map(() => \"?\").join(\", \");\n const insert = targetDb.prepare(\n `INSERT INTO \"${table}\" (${columns.join(\", \")}) VALUES (${placeholders})`\n );\n\n for (const row of rows) {\n try {\n insert.run(...columns.map((col) => row[col]));\n inserted++;\n } catch {\n skipped++;\n }\n }\n }\n\n sourceDb.close();\n targetDb.close();\n s.stop(\"Migration complete\");\n\n p.log.message(\n [\n `Tables migrated: ${tables.length}`,\n `Rows inserted: ${inserted}`,\n `Rows 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","path","DatabaseSync","path","fs","os","path","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/bai.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","../../../packages/pricing/dist/parser.js","../../../packages/pricing/dist/matcher.js","../../../packages/pricing/dist/pricing.js","../src/adapters/hindsight.ts","../src/adapters/index.ts","../src/lib/ui.ts","../src/commands/init.ts","../../../packages/db/dist/sqlite.js","../../../packages/db/dist/client.js","../../../packages/db/dist/db.js","../../../packages/db/dist/row-utils.js","../../../packages/db/dist/adminAuth.js","../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"],"sourcesContent":["import { Command } from \"commander\";\nimport { CLI_VERSION } from \"@srouter/constants\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { initCommand } from \"./commands/init.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(\"init\")\n .description(\"Initialize and run SRouter Gateway (Docker container or Source Code)\")\n .option(\"-m, --mode <mode>\", \"Run mode (docker or source)\")\n .option(\"-p, --port <port>\", \"Gateway port (default: 3000)\")\n .option(\"-d, --dir <dir>\", \"Source code clone directory (default: ~/srouter)\")\n .option(\"-y, --yes\", \"Accept default values without interactive prompt\")\n .option(\"--detached\", \"Run docker container in background (default: true)\")\n .action(async (opts) => {\n await initCommand(opts);\n });\n\n program\n .command(\"link <tool>\")\n .description(\"Configure a specific tool to use SRouter proxy (claude, opencode, hindsight)\")\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\nfunction runCli(): void {\n const isEntrypoint =\n process.argv[1]?.endsWith(\"srouter.js\") ||\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.includes(\"/.bin/srouter\") ||\n process.argv[1]?.includes(\"/bin/srouter\");\n\n if (isEntrypoint) {\n const program = createCli();\n program.parse(process.argv);\n }\n}\n\nrunCli();\n\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: \"free_tier\",\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: \"free_tier\",\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: \"free_tier\",\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: \"free_tier\",\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.8-flash-high\", name: \"Gemini 3.8 Flash (High)\" },\n { id: \"gemini-3.8-flash-medium\", name: \"Gemini 3.8 Flash (Medium)\" },\n { id: \"gemini-3.8-flash-low\", name: \"Gemini 3.8 Flash (Low)\" },\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: \"big-pickle\", name: \"Big Pickle (Free)\" },\n { id: \"nemotron-3.5-lightning-free\", name: \"Nemotron 3.5 Lightning (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","export const BAI_BASE_URL = \"https://api.b.ai/v1\";\nexport const BAI_DEFAULT_MODELS = [\n { id: \"deepseek-v4-flash\", name: \"DeepSeek V4 Flash (Free)\" },\n { id: \"deepseek-v4-flash-vision-exp\", name: \"DeepSeek V4 Flash Vision Exp (Free)\" },\n { id: \"mimo-v2.5\", name: \"MiMo V2.5 (Free)\" },\n { id: \"qwen3.8-flash\", name: \"Qwen 3.8 Flash (Free/Low-tier)\" }\n];\nexport const BAI_PROVIDER = {\n id: \"bai\",\n name: \"B.AI\",\n category: \"free_tier\",\n protocol: \"openai\",\n alias: \"bai\",\n base_url: BAI_BASE_URL,\n web_url: \"https://b.ai\",\n requires_api_key: true,\n supports_custom_url: true,\n status_message: \"B.AI API key missing\"\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 { BAI_PROVIDER } from \"./bai.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 BAI_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 // OpenCode Zen's executor registers with base id \"opencode_zen\"; its\n // listModels splits on \"_\" and produces \"opencode/<model>\" ids, while\n // alias-prefixed connections produce \"zen/<model>\". Map both so log\n // attribution and routing resolve to the registered base id.\n opencode: \"opencode_zen\"\n});\nexport function providerById(Id) {\n return KNOWN_PROVIDER_MAP[Id];\n}\nexport function isKnownProvider(Id) {\n return Id in KNOWN_PROVIDER_MAP;\n}\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nexport function providerBaseId(Id) {\n // Custom providers carry a UUID v4 as their immutable ID — never\n // truncate it; a UUID is its own base identity.\n if (UUID_RE.test(Id))\n return 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.6\";\nexport const APP_VERSION = \"0.1.6\";\nexport const API_VERSION = \"0.1.6\";\nexport const CLI_VERSION = \"0.1.5-rc.1\";\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 // Check primary configPath. If customConfigPath is not set, also check fallback candidate paths.\n const candidatePaths = [configPath];\n if (!this.customConfigPath) {\n const homeClaudeJson = path.join(os.homedir(), \".claude.json\");\n const homeClaudeSettings = path.join(os.homedir(), \".claude\", \"settings.json\");\n if (!candidatePaths.includes(homeClaudeJson)) candidatePaths.push(homeClaudeJson);\n if (!candidatePaths.includes(homeClaudeSettings)) candidatePaths.push(homeClaudeSettings);\n }\n\n let unlinkedModel: string | undefined;\n let unlinkedBaseUrl: string | undefined;\n\n for (const targetPath of candidatePaths) {\n try {\n const raw = await fs.readFile(targetPath, \"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 if (linked) {\n return {\n id: this.id,\n name: this.name,\n installed,\n linked: true,\n configPath: targetPath,\n currentBaseUrl: baseUrl,\n currentModel: model,\n currentOpusModel: opusModel,\n currentSonnetModel: sonnetModel,\n currentHaikuModel: haikuModel\n };\n }\n\n if (!unlinkedModel && model) unlinkedModel = model;\n if (!unlinkedBaseUrl && baseUrl) unlinkedBaseUrl = baseUrl;\n } catch {\n // check next candidate\n }\n }\n\n return {\n id: this.id,\n name: this.name,\n installed,\n linked: false,\n configPath,\n currentBaseUrl: unlinkedBaseUrl,\n currentModel: unlinkedModel\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 // Suppress \"not a model Claude Code recognizes\" warning for unknown models\n data.env.CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT = \"1\";\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 delete data.env.CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT;\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 CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT: \"1\"\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 // Standard ~/.claude.json across all platforms (check first if it contains config)\n candidatePaths.push(path.join(home, \".claude.json\"));\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 // 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\";\nimport { getModelMetadata } from \"@srouter/pricing\";\n\nexport interface OpenCodeModelConfig {\n id?: string;\n name: string;\n attachment?: boolean;\n modalities?: {\n input?: string[];\n output?: string[];\n };\n}\n\nfunction createOpenCodeModelConfig(id: string, name?: string): OpenCodeModelConfig {\n const displayName = name || formatModelDisplayName(id);\n const config: OpenCodeModelConfig = {\n id,\n name: displayName\n };\n\n // Check metadata from @srouter/pricing (pricing.jsonc / models.jsonc)\n const meta = getModelMetadata(id);\n if (meta?.modalities?.input?.includes(\"image\") || meta?.attachment) {\n config.attachment = true;\n config.modalities = {\n input: meta.modalities?.input || [\"text\", \"image\"],\n output: meta.modalities?.output || [\"text\"]\n };\n } else {\n // Heuristic fallback for known multimodal model families\n const lower = id.toLowerCase();\n const isKnownVision =\n lower.includes(\"gemini\") ||\n lower.includes(\"vision\") ||\n lower.includes(\"gpt-4o\") ||\n lower.includes(\"claude-3\") ||\n lower.includes(\"claude-sonnet\") ||\n lower.includes(\"claude-opus\") ||\n lower.includes(\"pixtral\");\n\n if (isKnownVision) {\n config.attachment = true;\n config.modalities = {\n input: [\"text\", \"image\"],\n output: [\"text\"]\n };\n }\n }\n\n return config;\n}\n\nexport const DEFAULT_SROUTER_MODELS: Array<{ id: string; name: string }> = [\n\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, OpenCodeModelConfig> = {};\n\n // 1. Seed with default catalog\n for (const m of DEFAULT_SROUTER_MODELS) {\n modelsMap[m.id] = createOpenCodeModelConfig(m.id, m.name);\n }\n\n // 2. Retain existing models from user config (enriching with vision/capabilities if missing)\n for (const [key, val] of Object.entries(existingModels)) {\n if (val && typeof val === \"object\") {\n const existingVal = val as OpenCodeModelConfig;\n const fresh = createOpenCodeModelConfig(key, existingVal.name);\n modelsMap[key] = {\n ...fresh,\n ...existingVal,\n ...(fresh.attachment !== undefined && { attachment: fresh.attachment }),\n ...(fresh.modalities !== undefined && { modalities: fresh.modalities })\n };\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] = createOpenCodeModelConfig(cleanId);\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] = createOpenCodeModelConfig(\n cleanModelId,\n modelsMap[cleanModelId]?.name\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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n/**\n * Strips single-line (// ...) and multi-line (/ * ... * /) comments\n * and removes trailing commas from a JSONC string while safely preserving string literals and URLs.\n */\nexport function stripJsonComments(jsonc) {\n let insideString = false;\n let isEscaped = false;\n let output = \"\";\n let i = 0;\n while (i < jsonc.length) {\n const char = jsonc[i];\n const nextChar = jsonc[i + 1];\n if (insideString) {\n output += char;\n if (isEscaped) {\n isEscaped = false;\n }\n else if (char === \"\\\\\") {\n isEscaped = true;\n }\n else if (char === '\"') {\n insideString = false;\n }\n i++;\n continue;\n }\n if (char === '\"') {\n insideString = true;\n output += char;\n i++;\n continue;\n }\n // Single line comment: // ...\n if (char === \"/\" && nextChar === \"/\") {\n i += 2;\n while (i < jsonc.length && jsonc[i] !== \"\\n\" && jsonc[i] !== \"\\r\") {\n i++;\n }\n continue;\n }\n // Multi line comment: /* ... */\n if (char === \"/\" && nextChar === \"*\") {\n i += 2;\n while (i < jsonc.length && !(jsonc[i] === \"*\" && jsonc[i + 1] === \"/\")) {\n i++;\n }\n i += 2;\n continue;\n }\n output += char;\n i++;\n }\n return output.replace(/,(\\s*[}\\]])/g, \"$1\");\n}\n/**\n * Parses a JSONC formatted string into a JavaScript object.\n */\nexport function parseJsonc(jsonc) {\n const cleanJson = stripJsonComments(jsonc);\n return JSON.parse(cleanJson);\n}\n/**\n * Flattens models whether they are grouped by provider arrays,\n * nested dictionaries, or flat dictionaries into a canonical Record<string, ModelPrice>.\n */\nexport function flattenModelPrices(models) {\n const flat = {};\n for (const [key, val] of Object.entries(models || {})) {\n if (Array.isArray(val)) {\n for (const item of val) {\n if (item && item.id) {\n flat[item.id] = item;\n }\n }\n }\n else if (val && typeof val === \"object\") {\n if (\"input\" in val && \"output\" in val) {\n flat[key] = val;\n }\n else {\n for (const [subKey, subVal] of Object.entries(val)) {\n flat[subKey] = subVal;\n }\n }\n }\n }\n return flat;\n}\n/**\n * Finds the path to pricing.jsonc or pricing.json data file.\n */\nexport function resolvePricingDataPath(customPath) {\n if (customPath)\n return customPath;\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(currentDir, \"../data/pricing.jsonc\"),\n path.resolve(currentDir, \"../data/pricing.json\"),\n path.resolve(currentDir, \"../../data/pricing.jsonc\"),\n path.resolve(currentDir, \"../../data/pricing.json\"),\n path.resolve(process.cwd(), \"packages/pricing/data/pricing.jsonc\"),\n path.resolve(process.cwd(), \"packages/pricing/data/pricing.json\"),\n path.resolve(process.cwd(), \"data/pricing.jsonc\"),\n path.resolve(process.cwd(), \"data/pricing.json\")\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n return candidates[0];\n}\n/**\n * Converts a ModelsDevModel into a ModelPrice if valid cost data is present.\n */\nexport function modelsDevToModelPrice(model) {\n if (!model.cost)\n return undefined;\n const input = model.cost.input ?? 0;\n const output = model.cost.output ?? 0;\n return {\n id: model.id,\n name: model.name,\n input,\n output,\n cached: model.cost.cache_read,\n reasoning: model.cost.reasoning ?? output,\n cache_creation: model.cost.cache_write ?? input\n };\n}\n/**\n * Loads pricing directly from models.jsonc.\n * Populates models map, aliases, and provider-grouped models.\n */\nexport function loadPricingFromModelsDev(customPath) {\n const modelsData = loadModelsDevData(customPath);\n const models = {};\n const providerModels = {};\n const aliases = {};\n for (const [key, item] of Object.entries(modelsData)) {\n const price = modelsDevToModelPrice(item);\n if (!price)\n continue;\n // 1. Map by full key e.g. \"tencent/hy3\" and item.id\n models[key] = price;\n if (item.id && item.id !== key) {\n models[item.id] = price;\n }\n // 2. Map by model name after provider prefix: <provider>/<model> -> <model>\n if (key.includes(\"/\")) {\n const modelName = key.split(\"/\").slice(1).join(\"/\");\n // Jika belum terdefinisi di models, daftarkan alias dan fallback model price\n if (!aliases[modelName]) {\n aliases[modelName] = key;\n }\n if (!models[modelName]) {\n models[modelName] = price;\n }\n }\n // Group into providerModels\n const provider = key.includes(\"/\") ? key.split(\"/\")[0] : \"other\";\n if (!providerModels[provider]) {\n providerModels[provider] = [];\n }\n providerModels[provider].push(price);\n }\n return {\n version: \"1.0.0\",\n updatedAt: new Date().toISOString().split(\"T\")[0],\n defaults: {\n input: 2.0,\n output: 8.0,\n cached: 1.0,\n reasoning: 12.0,\n cache_creation: 2.0\n },\n models,\n providerModels,\n aliases\n };\n}\n/**\n * Loads and parses the pricing dataset.\n * By default loads pricing from pricing.jsonc / pricing.json.\n * If customPath targets models.jsonc / models.json, loads directly from models.dev dataset.\n */\nexport function loadPricingData(customPath) {\n if (customPath && (customPath.endsWith(\"models.jsonc\") || customPath.endsWith(\"models.json\"))) {\n return loadPricingFromModelsDev(customPath);\n }\n const filePath = resolvePricingDataPath(customPath);\n if (!fs.existsSync(filePath)) {\n // Fallback to models.jsonc if pricing.jsonc does not exist\n const modelsDevPath = resolveModelsDevDataPath();\n if (fs.existsSync(modelsDevPath)) {\n return loadPricingFromModelsDev(modelsDevPath);\n }\n throw new Error(`Pricing dataset file not found at: ${filePath}`);\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const raw = parseJsonc(content);\n const flatModels = flattenModelPrices(raw.models);\n const isGroupedArray = raw.models &&\n Object.values(raw.models).length > 0 &&\n Array.isArray(Object.values(raw.models)[0]);\n const dataset = {\n version: raw.version,\n updatedAt: raw.updatedAt,\n defaults: raw.defaults,\n models: { ...flatModels },\n providerModels: isGroupedArray ? { ...raw.models } : undefined,\n aliases: { ...(raw.aliases || {}) }\n };\n // Enrich with any models from models.jsonc that are not in pricing.jsonc\n const modelsDevPath = resolveModelsDevDataPath();\n if (fs.existsSync(modelsDevPath)) {\n try {\n const modelsDevDataset = loadPricingFromModelsDev(modelsDevPath);\n // Hanya daftarkan model dari models.jsonc jika model tersebut belum ada di pricing.jsonc\n for (const [k, v] of Object.entries(modelsDevDataset.models)) {\n if (!dataset.models[k]) {\n dataset.models[k] = v;\n }\n }\n for (const [k, v] of Object.entries(modelsDevDataset.aliases)) {\n if (!dataset.aliases[k] && !dataset.models[k]) {\n dataset.aliases[k] = v;\n }\n }\n }\n catch {\n // Ignore enrichment errors\n }\n }\n return dataset;\n}\n/**\n * Finds the path to models.jsonc data file sourced from models.dev.\n */\nexport function resolveModelsDevDataPath(customPath) {\n if (customPath) {\n if (path.isAbsolute(customPath)) {\n return customPath;\n }\n return path.resolve(process.cwd(), customPath);\n }\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(currentDir, \"../models.jsonc\"),\n path.resolve(currentDir, \"../models.json\"),\n path.resolve(currentDir, \"../../models.jsonc\"),\n path.resolve(currentDir, \"../../models.json\"),\n path.resolve(process.cwd(), \"packages/pricing/models.jsonc\"),\n path.resolve(process.cwd(), \"packages/pricing/models.json\"),\n path.resolve(process.cwd(), \"models.jsonc\"),\n path.resolve(process.cwd(), \"models.json\")\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n return candidates[0];\n}\n/**\n * Loads and parses the models.dev dataset from models.jsonc.\n */\nexport function loadModelsDevData(customPath) {\n const filePath = resolveModelsDevDataPath(customPath);\n if (!fs.existsSync(filePath)) {\n return {};\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n return parseJsonc(content);\n}\n","/**\n * Normalizes raw model names by stripping provider prefixes, namespaces, and tags,\n * and resolving aliases.\n *\n * Example:\n * - \"commandcode/deepseek/deepseek-v4-flash\" -> \"deepseek-v4-flash\"\n * - \"deepseek/deepseek-v4-flash:latest\" -> \"deepseek-v4-flash\"\n * - \"claude-3.5-sonnet\" -> \"claude-3-5-sonnet-20241022\" (via alias)\n */\nexport function normalizeModelName(rawModel, aliases) {\n if (!rawModel)\n return \"\";\n let clean = rawModel.trim();\n // 1. Strip tags/suffixes like :free, :latest, :online, :extended\n if (clean.includes(\":\") && !clean.includes(\"://\")) {\n const colonIndex = clean.lastIndexOf(\":\");\n clean = clean.substring(0, colonIndex).trim();\n }\n // 2. Strip namespace / provider prefixes (e.g. \"commandcode/deepseek/deepseek-v4-flash\" -> \"deepseek-v4-flash\")\n if (clean.includes(\"/\")) {\n clean = clean.split(\"/\").pop()?.trim() ?? clean;\n }\n // 3. Match against aliases (case-insensitive)\n if (aliases) {\n const lower = clean.toLowerCase();\n for (const [alias, target] of Object.entries(aliases)) {\n if (alias.toLowerCase() === lower) {\n return target;\n }\n }\n }\n return clean;\n}\n/**\n * Finds the canonical model key in the `models` dictionary that matches `rawModel`.\n * Returns the canonical model key if found, or undefined.\n */\nexport function findCanonicalModelKey(rawModel, models, aliases) {\n if (!rawModel)\n return undefined;\n // 1. Normalized name lookup first (strips provider prefix, resolves aliases)\n const normalized = normalizeModelName(rawModel, aliases);\n if (models[normalized]) {\n return normalized;\n }\n // 2. Exact match on raw input\n if (models[rawModel]) {\n return rawModel;\n }\n // 3. Case-insensitive lookup on normalized name\n const normalizedLower = normalized.toLowerCase();\n for (const key of Object.keys(models)) {\n if (key.toLowerCase() === normalizedLower) {\n return key;\n }\n }\n // 4. Case-insensitive lookup on base name (before alias substitution)\n const baseClean = (rawModel.includes(\"/\") ? (rawModel.split(\"/\").pop() ?? rawModel) : rawModel)\n .split(\":\")[0]\n .trim()\n .toLowerCase();\n for (const key of Object.keys(models)) {\n if (key.toLowerCase() === baseClean) {\n return key;\n }\n }\n return undefined;\n}\n","import { loadModelsDevData, loadPricingData } from \"./parser.js\";\nimport { findCanonicalModelKey, normalizeModelName } from \"./matcher.js\";\nexport * from \"./types.js\";\nexport * from \"./parser.js\";\nexport * from \"./matcher.js\";\n/** Default pricing fallback when the dataset fails to load or model isn't in catalog */\nconst EMBEDDED_DEFAULT_PRICING = {\n input: 2.0,\n output: 8.0,\n cached: 1.0,\n reasoning: 12.0,\n cache_creation: 2.0\n};\nlet loadedDataset;\ntry {\n loadedDataset = loadPricingData();\n}\ncatch {\n loadedDataset = {\n defaults: EMBEDDED_DEFAULT_PRICING,\n models: {},\n aliases: {}\n };\n}\n/**\n * Default fallback pricing when model isn't found in catalog.\n */\nexport const DEFAULT_PRICING = loadedDataset.defaults || EMBEDDED_DEFAULT_PRICING;\n/**\n * Canonical model pricing table loaded from pricing.jsonc / pricing.json.\n */\nexport const MODEL_PRICING = loadedDataset.models;\n/**\n * Provider-grouped model pricing list loaded from pricing.jsonc / pricing.json.\n */\nexport const PROVIDER_MODELS = loadedDataset.providerModels;\n/**\n * Model aliases map loaded from pricing.jsonc / pricing.json.\n */\nexport const MODEL_ALIASES = loadedDataset.aliases;\n/** Default free tier pricing (zero cost across all token types) */\nexport const FREE_PRICING = {\n input: 0,\n output: 0,\n cached: 0,\n reasoning: 0,\n cache_creation: 0\n};\n/**\n * Resolves pricing for a model by normalizing prefixes (\"commandcode/deepseek/deepseek-v4-flash\"\n * or \"deepseek/deepseek-v4-flash\" -> \"deepseek-v4-flash\") and checking aliases.\n * If the model name explicitly indicates a free tier (e.g. contains 'free'), returns 0 cost.\n * Falls back to DEFAULT_PRICING for unknown models.\n */\nexport function getPricingForModel(_provider, model) {\n if (!model)\n return DEFAULT_PRICING;\n // Check if the raw model name or normalized name explicitly specifies \"free\"\n const lower = model.toLowerCase();\n if (/(?:^|[/:._-])free(?:[/:._-]|$)/i.test(lower) ||\n lower.endsWith(\":free\") ||\n lower.includes(\"/free\") ||\n lower === \"free\") {\n return FREE_PRICING;\n }\n const matchedKey = findCanonicalModelKey(model, MODEL_PRICING, MODEL_ALIASES);\n if (matchedKey && MODEL_PRICING[matchedKey]) {\n return MODEL_PRICING[matchedKey];\n }\n return DEFAULT_PRICING;\n}\nlet cachedModelsDevData;\n/**\n * Retrieves comprehensive metadata (modalities, limits, capabilities) for a model\n * by resolving aliases and canonical keys from pricing.jsonc / models.jsonc.\n */\nexport function getModelMetadata(modelId) {\n if (!modelId)\n return undefined;\n if (!cachedModelsDevData) {\n try {\n cachedModelsDevData = loadModelsDevData();\n }\n catch {\n cachedModelsDevData = {};\n }\n }\n const data = cachedModelsDevData;\n // 1. Direct key match\n if (data[modelId]) {\n return data[modelId];\n }\n // 2. Canonical / Normalized match using pricing aliases and catalog\n const canonical = findCanonicalModelKey(modelId, MODEL_PRICING, MODEL_ALIASES) ||\n normalizeModelName(modelId, MODEL_ALIASES);\n if (canonical && data[canonical]) {\n return data[canonical];\n }\n // 3. Search modelsDevData by suffix or id match\n const targetSuffix = `/${canonical}`;\n for (const [key, item] of Object.entries(data)) {\n if (key === canonical ||\n key.endsWith(targetSuffix) ||\n item.id === canonical ||\n item.id.endsWith(targetSuffix)) {\n return item;\n }\n }\n return undefined;\n}\n/**\n * Calculates cost in dollars from token counts and pricing rates.\n * prompt_tokens is cache-inclusive: cached + cache_creation are subsets,\n * so subtract both to avoid charging them at the full input rate.\n */\nexport function calculateCostFromTokens(tokens, pricing) {\n if (!tokens || !pricing)\n return 0;\n let cost = 0;\n const inputTokens = tokens.prompt_tokens || tokens.input_tokens || 0;\n const cachedTokens = tokens.cached_tokens || tokens.cache_read_input_tokens || 0;\n const cacheCreationTokens = tokens.cache_creation_input_tokens || 0;\n const nonCachedInput = Math.max(0, inputTokens - cachedTokens - cacheCreationTokens);\n cost += nonCachedInput * (pricing.input / 1_000_000);\n if (cachedTokens > 0) {\n cost += cachedTokens * ((pricing.cached ?? pricing.input) / 1_000_000);\n }\n const outputTokens = tokens.completion_tokens || tokens.output_tokens || 0;\n cost += outputTokens * (pricing.output / 1_000_000);\n const reasoningTokens = tokens.reasoning_tokens || 0;\n if (reasoningTokens > 0) {\n cost += reasoningTokens * ((pricing.reasoning ?? pricing.output) / 1_000_000);\n }\n if (cacheCreationTokens > 0) {\n cost += cacheCreationTokens * ((pricing.cache_creation ?? pricing.input) / 1_000_000);\n }\n return cost;\n}\n/**\n * Calculates itemized cost breakdown (input, output, cacheRead, cacheCreation, total)\n * in dollars from token counts and pricing rates.\n */\nexport function calculateCostBreakdownFromTokens(tokens, pricing) {\n if (!tokens || !pricing) {\n return {\n inputCost: 0,\n outputCost: 0,\n cacheReadCost: 0,\n cacheCreationCost: 0,\n totalCost: 0\n };\n }\n const inputTokens = tokens.prompt_tokens || tokens.input_tokens || 0;\n const cachedTokens = tokens.cached_tokens || tokens.cache_read_input_tokens || 0;\n const cacheCreationTokens = tokens.cache_creation_input_tokens || 0;\n const nonCachedInput = Math.max(0, inputTokens - cachedTokens - cacheCreationTokens);\n const inputCost = nonCachedInput * (pricing.input / 1_000_000);\n const cacheReadCost = cachedTokens > 0\n ? cachedTokens * ((pricing.cached ?? pricing.input) / 1_000_000)\n : 0;\n const cacheCreationCost = cacheCreationTokens > 0\n ? cacheCreationTokens * ((pricing.cache_creation ?? pricing.input) / 1_000_000)\n : 0;\n const outputTokens = tokens.completion_tokens || tokens.output_tokens || 0;\n const reasoningTokens = tokens.reasoning_tokens || 0;\n let outputCost = outputTokens * (pricing.output / 1_000_000);\n if (reasoningTokens > 0) {\n outputCost += reasoningTokens * ((pricing.reasoning ?? pricing.output) / 1_000_000);\n }\n const totalCost = inputCost + cacheReadCost + cacheCreationCost + outputCost;\n return {\n inputCost,\n outputCost,\n cacheReadCost,\n cacheCreationCost,\n totalCost\n };\n}\n/**\n * Checks whether a given model supports image generation (and optionally img2img input),\n * querying metadata directly from models.jsonc.\n */\nexport function isImageGenerationSupported(model, hasInputImage = false) {\n if (!model)\n return false;\n const metadata = getModelMetadata(model);\n if (metadata?.modalities?.output) {\n const outputSupportsImage = metadata.modalities.output.includes(\"image\");\n if (!outputSupportsImage)\n return false;\n if (hasInputImage && metadata.modalities.input) {\n return metadata.modalities.input.includes(\"image\");\n }\n return true;\n }\n return false;\n}\n/**\n * Formats cost for display (e.g. \"$0.00\").\n */\nexport function formatCost(cost) {\n if (cost === null || cost === undefined || isNaN(cost))\n return \"$0.00\";\n return `$${cost.toFixed(2)}`;\n}\n","import fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\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 { isExecutableInPath } from \"../lib/platform.js\";\n\nexport function getHindsightConfigPath(): string {\n const cwdEnv = path.join(process.cwd(), \".env\");\n const homeHindsightEnv = path.join(os.homedir(), \".hindsight\", \".env\");\n\n if (process.env.HINDSIGHT_CONFIG_PATH) {\n return process.env.HINDSIGHT_CONFIG_PATH;\n }\n\n try {\n if (fsSync.existsSync(cwdEnv)) {\n const content = fsSync.readFileSync(cwdEnv, \"utf-8\");\n if (content.includes(\"HINDSIGHT_\")) {\n return cwdEnv;\n }\n }\n if (fsSync.existsSync(homeHindsightEnv)) {\n return homeHindsightEnv;\n }\n } catch {\n // ignore and fallback\n }\n\n return homeHindsightEnv;\n}\n\nfunction parseEnvLines(content: string): Map<string, string> {\n const map = new Map<string, string>();\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx > 0) {\n const key = trimmed.slice(0, eqIdx).trim();\n let val = trimmed.slice(eqIdx + 1).trim();\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n map.set(key, val);\n }\n }\n return map;\n}\n\nfunction updateEnvContent(content: string, updates: Record<string, string>): string {\n const lines = content.split(\"\\n\");\n const updatedKeys = new Set<string>();\n const newLines = lines.map((line) => {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) return line;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx > 0) {\n const key = trimmed.slice(0, eqIdx).trim();\n if (key in updates) {\n updatedKeys.add(key);\n return `${key}=\"${updates[key]}\"`;\n }\n }\n return line;\n });\n\n for (const [k, v] of Object.entries(updates)) {\n if (!updatedKeys.has(k)) {\n newLines.push(`${k}=\"${v}\"`);\n }\n }\n\n return newLines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n\nexport class HindsightAdapter extends AbstractToolAdapter {\n readonly id = \"hindsight\";\n readonly name = \"Hindsight\";\n readonly description = \"Vectorize agent memory system (retain, recall, reflect)\";\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 getHindsightConfigPath();\n }\n\n async isInstalled(): Promise<boolean> {\n return (\n (await isExecutableInPath(\"hindsight\")) ||\n Boolean(process.env.HINDSIGHT_API_URL) ||\n Boolean(process.env.HINDSIGHT_API_LLM_PROVIDER)\n );\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 envMap = parseEnvLines(raw);\n const baseUrl = envMap.get(\"HINDSIGHT_API_LLM_BASE_URL\");\n const model = envMap.get(\"HINDSIGHT_API_LLM_MODEL\");\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 existingContent = \"\";\n try {\n existingContent = await fs.readFile(configPath, \"utf-8\");\n } catch {\n existingContent = \"# Hindsight Environment Configuration\\n\";\n }\n\n const model = context.model || \"antigravity/claude-sonnet-4-6\";\n const apiKey = context.apiKey || \"«redacted:sk-…»\";\n const normalizedBaseUrl = context.baseUrl.replace(/\\/+$/, \"\");\n\n const updates: Record<string, string> = {\n HINDSIGHT_API_LLM_PROVIDER: \"openai\",\n HINDSIGHT_API_LLM_BASE_URL: normalizedBaseUrl,\n HINDSIGHT_API_LLM_API_KEY: apiKey,\n HINDSIGHT_API_LLM_MODEL: model\n };\n\n const updatedContent = updateEnvContent(existingContent, updates);\n\n if (!context.dryRun) {\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n await fs.writeFile(configPath, updatedContent, \"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 lines = raw.split(\"\\n\");\n const filtered = lines.filter((l) => {\n const trimmed = l.trim();\n return (\n !trimmed.startsWith(\"HINDSIGHT_API_LLM_PROVIDER=\") &&\n !trimmed.startsWith(\"HINDSIGHT_API_LLM_BASE_URL=\") &&\n !trimmed.startsWith(\"HINDSIGHT_API_LLM_API_KEY=\") &&\n !trimmed.startsWith(\"HINDSIGHT_API_LLM_MODEL=\")\n );\n });\n await fs.writeFile(configPath, filtered.join(\"\\n\"), \"utf-8\");\n return true;\n } catch {\n return false;\n }\n }\n\n getEnv(context: ToolConfigContext): Record<string, string> {\n const model = context.model || \"antigravity/claude-sonnet-4-6\";\n const apiKey = context.apiKey || \"«redacted:sk-…»\";\n const normalizedBaseUrl = context.baseUrl.replace(/\\/+$/, \"\");\n\n return {\n HINDSIGHT_API_LLM_PROVIDER: \"openai\",\n HINDSIGHT_API_LLM_BASE_URL: normalizedBaseUrl,\n HINDSIGHT_API_LLM_API_KEY: apiKey,\n HINDSIGHT_API_LLM_MODEL: model\n };\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\";\nimport { HindsightAdapter } from \"./hindsight.js\";\n\nexport { ClaudeAdapter } from \"./claude.js\";\nexport { OpenCodeAdapter } from \"./opencode.js\";\nexport { HindsightAdapter } from \"./hindsight.js\";\nexport { AbstractToolAdapter } from \"./base.js\";\n\nexport function createAdapters(store: ConfigStore = defaultStore): BaseToolAdapter[] {\n return [new ClaudeAdapter(store), new OpenCodeAdapter(store), new HindsightAdapter(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 fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport * as p from \"@clack/prompts\";\nimport { SROUTER_DIR } from \"@srouter/db\";\nimport { formatError, formatInfo, formatSuccess, formatWarning, pc } from \"../lib/ui.js\";\nimport { isExecutableInPath } from \"../lib/platform.js\";\n\nexport interface InitCommandOptions {\n mode?: \"docker\" | \"source\";\n port?: string;\n dir?: string;\n yes?: boolean;\n detached?: boolean;\n}\n\nconst DEFAULT_PORT = \"3000\";\nconst REPO_URL = \"https://github.com/seaavey/SRouter.git\";\nconst DOCKER_IMAGE = \"ghcr.io/seaavey/srouter:latest\";\n\nfunction runProcess(\n command: string,\n args: string[],\n options?: { cwd?: string; stdio?: \"inherit\" | \"pipe\" }\n): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n cwd: options?.cwd,\n stdio: options?.stdio ?? \"inherit\"\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n if (options?.stdio === \"pipe\") {\n child.stdout?.on(\"data\", (d) => (stdout += d.toString()));\n child.stderr?.on(\"data\", (d) => (stderr += d.toString()));\n }\n\n child.on(\"close\", (code) => {\n resolve({ code: code ?? 0, stdout, stderr });\n });\n child.on(\"error\", (err) => {\n resolve({ code: 1, stdout, stderr: err.message });\n });\n });\n}\n\nasync function initDocker(port: string, detached: boolean): Promise<void> {\n const s = p.spinner();\n s.start(\"Checking Docker environment\");\n\n const hasDocker = await isExecutableInPath(\"docker\");\n if (!hasDocker) {\n s.stop(formatError(\"Docker is not installed or not available in PATH.\"));\n \n const fallbackChoice = await p.select({\n message: \"Docker was not found. What would you like to do?\",\n options: [\n {\n value: \"source\",\n label: \"Run from Source Code instead (Node.js & pnpm)\",\n hint: \"Clones repo and builds locally without Docker\"\n },\n {\n value: \"guide\",\n label: \"View Docker installation instructions\",\n hint: \"Get download link for your OS\"\n },\n {\n value: \"exit\",\n label: \"Exit\",\n hint: \"Cancel initialization\"\n }\n ]\n });\n\n if (p.isCancel(fallbackChoice) || fallbackChoice === \"exit\") {\n p.outro(\"Initialization cancelled. Install Docker from https://docs.docker.com/get-docker/ and try again.\");\n return;\n }\n\n if (fallbackChoice === \"guide\") {\n p.log.message(\n [\n \"📦 \" + pc.bold(\"How to install Docker:\"),\n `• Windows / macOS: ${pc.cyan(\"https://www.docker.com/products/docker-desktop/\")}`,\n `• Linux (Ubuntu/Debian): ${pc.yellow(\"curl -fsSL https://get.docker.com | sh\")}`,\n `• Linux (Arch): ${pc.yellow(\"sudo pacman -S docker && sudo systemctl enable --now docker\")}`\n ].join(\"\\n\")\n );\n p.outro(\"Run 'srouter init' again after installing Docker.\");\n return;\n }\n\n if (fallbackChoice === \"source\") {\n const defaultDir = path.join(os.homedir(), \"srouter\");\n await initSource(defaultDir, port);\n return;\n }\n }\n\n s.message(\"Verifying Docker daemon status\");\n const checkDaemon = await runProcess(\"docker\", [\"info\"], { stdio: \"pipe\" });\n if (checkDaemon.code !== 0) {\n s.stop(formatError(\"Docker daemon is not running.\"));\n p.log.info(\"Please start the Docker service/daemon and try again.\");\n process.exitCode = 1;\n return;\n }\n\n const dataDir = path.join(SROUTER_DIR, \"data\");\n fs.mkdirSync(dataDir, { recursive: true, mode: 0o700 });\n\n s.message(`Pulling latest SRouter Docker image (${DOCKER_IMAGE})`);\n const pullRes = await runProcess(\"docker\", [\"pull\", DOCKER_IMAGE], { stdio: \"inherit\" });\n if (pullRes.code !== 0) {\n s.stop(formatWarning(\"Failed to pull image from registry, checking local image cache\"));\n }\n\n // Stop and remove existing container if running\n await runProcess(\"docker\", [\"rm\", \"-f\", \"srouter\"], { stdio: \"pipe\" });\n\n s.message(`Starting SRouter Gateway container on port ${port}`);\n const dockerArgs = [\n \"run\",\n detached ? \"-d\" : \"-it\",\n \"--name\",\n \"srouter\",\n \"--restart\",\n \"unless-stopped\",\n \"-p\",\n `${port}:3000`,\n \"-p\",\n \"1455:1455\",\n \"-v\",\n `${dataDir}:/app/data`,\n \"-e\",\n `PORT=${port}`,\n \"-e\",\n \"OAUTH_PORT=1455\",\n \"-e\",\n \"DATABASE_PATH=/app/data/srouter.db\",\n DOCKER_IMAGE\n ];\n\n if (detached) {\n const runRes = await runProcess(\"docker\", dockerArgs, { stdio: \"pipe\" });\n if (runRes.code !== 0) {\n s.stop(formatError(\"Failed to start SRouter Docker container.\"));\n p.log.error(runRes.stderr);\n process.exitCode = 1;\n return;\n }\n s.stop(formatSuccess(\"SRouter Docker container started successfully!\"));\n p.log.message(\n [\n `🚀 Gateway URL: ${pc.bold(pc.cyan(`http://localhost:${port}`))}`,\n `📊 Web Dashboard: ${pc.bold(pc.cyan(`http://localhost:${port}`))}`,\n `💾 Persistent Data: ${pc.dim(dataDir)}`,\n \"\",\n `To inspect logs: ${pc.yellow(\"docker logs -f srouter\")}`,\n `To stop: ${pc.yellow(\"docker stop srouter\")}`\n ].join(\"\\n\")\n );\n p.outro(\"SRouter is ready to use!\");\n } else {\n s.stop(\"Launching container in foreground mode...\");\n await runProcess(\"docker\", dockerArgs, { stdio: \"inherit\" });\n }\n}\n\nasync function initSource(targetDir: string, port: string): Promise<void> {\n const s = p.spinner();\n\n // Check prerequisites: git, node, pnpm\n s.start(\"Checking prerequisites (git, node, pnpm)\");\n const hasGit = await isExecutableInPath(\"git\");\n const hasPnpm = await isExecutableInPath(\"pnpm\");\n\n if (!hasGit) {\n s.stop(formatError(\"Git is required to clone SRouter repository.\"));\n process.exitCode = 1;\n return;\n }\n\n const resolvedDir = path.resolve(targetDir);\n\n // 1. Clone repository if folder doesn't already have package.json\n if (!fs.existsSync(path.join(resolvedDir, \"package.json\"))) {\n s.message(`Cloning SRouter into ${pc.bold(resolvedDir)}`);\n fs.mkdirSync(resolvedDir, { recursive: true });\n const cloneRes = await runProcess(\"git\", [\"clone\", REPO_URL, resolvedDir], {\n stdio: \"inherit\"\n });\n if (cloneRes.code !== 0) {\n s.stop(formatError(\"Failed to clone SRouter repository.\"));\n process.exitCode = 1;\n return;\n }\n } else {\n p.log.info(`Using existing SRouter repository at ${pc.bold(resolvedDir)}`);\n }\n\n // 2. Install dependencies\n s.message(\"Installing dependencies with pnpm\");\n const pnpmCmd = hasPnpm ? \"pnpm\" : \"npx\";\n const installArgs = hasPnpm ? [\"install\"] : [\"pnpm\", \"install\"];\n\n const installRes = await runProcess(pnpmCmd, installArgs, {\n cwd: resolvedDir,\n stdio: \"inherit\"\n });\n if (installRes.code !== 0) {\n s.stop(formatError(\"Dependency installation failed.\"));\n process.exitCode = 1;\n return;\n }\n\n // 3. Build project\n s.message(\"Building SRouter packages, API, and Dashboard\");\n const buildArgs = hasPnpm ? [\"run\", \"build\"] : [\"pnpm\", \"run\", \"build\"];\n const buildRes = await runProcess(pnpmCmd, buildArgs, {\n cwd: resolvedDir,\n stdio: \"inherit\"\n });\n if (buildRes.code !== 0) {\n s.stop(formatError(\"Build step failed.\"));\n process.exitCode = 1;\n return;\n }\n\n s.stop(formatSuccess(\"SRouter built successfully!\"));\n\n p.log.message(\n [\n `📁 Project Directory: ${pc.bold(resolvedDir)}`,\n `🚀 Start Dev Server: ${pc.yellow(`cd ${resolvedDir} && pnpm dev`)}`,\n `⚡ Start Production: ${pc.yellow(`PORT=${port} cd ${resolvedDir}/apps/api && pnpm start`)}`\n ].join(\"\\n\")\n );\n\n const startNow = await p.confirm({\n message: \"Start SRouter API & Web server now?\",\n initialValue: true\n });\n\n if (startNow === true) {\n p.outro(`Starting SRouter Gateway on port ${port}...`);\n process.env.PORT = port;\n const startArgs = hasPnpm\n ? [\"--filter\", \"api\", \"start\"]\n : [\"pnpm\", \"--filter\", \"api\", \"start\"];\n await runProcess(pnpmCmd, startArgs, {\n cwd: resolvedDir,\n stdio: \"inherit\"\n });\n } else {\n p.outro(\"Setup complete! You can start SRouter anytime.\");\n }\n}\n\nexport async function initCommand(options: InitCommandOptions): Promise<void> {\n p.intro(pc.bold(pc.cyan(\"⚡ SRouter Gateway Initialization\")));\n\n let mode = options.mode;\n if (!mode) {\n const choice = await p.select({\n message: \"How would you like to run SRouter?\",\n options: [\n {\n value: \"docker\",\n label: \"Docker (Recommended)\",\n hint: \"Zero-config container with isolated environment & persistent database\"\n },\n {\n value: \"source\",\n label: \"Source Code (Node.js & pnpm)\",\n hint: \"Clone repository, build from source, and run natively\"\n }\n ]\n });\n\n if (p.isCancel(choice)) {\n p.outro(\"Initialization cancelled.\");\n return;\n }\n mode = choice as \"docker\" | \"source\";\n }\n\n let port = options.port;\n if (!port && !options.yes) {\n const inputPort = await p.text({\n message: \"Gateway Port:\",\n defaultValue: DEFAULT_PORT,\n placeholder: DEFAULT_PORT,\n validate: (val) => {\n const n = Number(val);\n if (Number.isNaN(n) || n <= 0 || n > 65535) {\n return \"Please enter a valid port number (1-65535).\";\n }\n }\n });\n\n if (p.isCancel(inputPort)) {\n p.outro(\"Initialization cancelled.\");\n return;\n }\n port = inputPort || DEFAULT_PORT;\n } else {\n port = port || DEFAULT_PORT;\n }\n\n if (mode === \"docker\") {\n const detached = options.detached ?? true;\n await initDocker(port, detached);\n } else {\n const defaultDir = path.join(os.homedir(), \"srouter\");\n let targetDir = options.dir;\n if (!targetDir && !options.yes) {\n const inputDir = await p.text({\n message: \"Target directory for SRouter source code:\",\n defaultValue: defaultDir,\n placeholder: defaultDir\n });\n if (p.isCancel(inputDir)) {\n p.outro(\"Initialization cancelled.\");\n return;\n }\n targetDir = inputDir || defaultDir;\n } else {\n targetDir = targetDir || defaultDir;\n }\n\n await initSource(targetDir, port);\n }\n}\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport { DatabaseSync } from \"node:sqlite\";\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];\n/** Resolve the SQLite file path. Reads `DATABASE_PATH` lazily so test\n * loaders (`--import tests/setup.ts`) can redirect to an isolated file\n * before the first query opens a connection. */\nexport function 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}\n/**\n * Fail fast when a test process accidentally targets the production\n * database. Test runners must redirect via `DATABASE_PATH`\n * (see `apps/api/tests/setup.ts`); wiping `~/.srouter/srouter.db`\n * from a test run deleted real API keys before this guard existed.\n */\nfunction assertNotProductionDatabaseInTests(dbPath) {\n if (process.env.NODE_ENV !== \"test\")\n return;\n if (path.resolve(dbPath) === path.resolve(DEFAULT_DB_PATH)) {\n throw new Error(\"Refusing to open the production database (DATABASE_PATH points at \" +\n `${DEFAULT_DB_PATH}) while NODE_ENV=test. ` +\n \"Run tests through `pnpm test` so tests/setup.ts redirects \" +\n \"to an isolated temp database.\");\n }\n}\nfunction openDatabase(dbPath) {\n assertNotProductionDatabaseInTests(dbPath);\n // Ensure parent folder exists if path contains subdirectories\n const dbDir = path.dirname(dbPath);\n if (!fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n }\n 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.\n db.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.\n for (let i = 0; i < 5; i++) {\n try {\n db.exec(\"PRAGMA journal_mode = WAL;\");\n break;\n }\n catch (error) {\n const code = error.code;\n if (code !== \"SQLITE_BUSY\" || i === 4)\n throw error;\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 200 * (i + 1));\n }\n }\n db.exec(\"PRAGMA foreign_keys = ON;\");\n db.exec(\"PRAGMA synchronous = NORMAL;\");\n db.exec(\"PRAGMA temp_store = MEMORY;\");\n db.exec(\"PRAGMA cache_size = -20000;\");\n return db;\n}\n// Lazy singleton: the connection opens on first use (not at import),\n// so `DATABASE_PATH` set by a test loader always wins over the default.\n// Re-opens when the path changes (e.g. tests redirecting mid-process).\nlet _sqliteDb = null;\nlet _sqliteDbPath = null;\nfunction getSqliteDbInstance() {\n const dbPath = getDatabasePath();\n if (!_sqliteDb || _sqliteDbPath !== path.resolve(dbPath)) {\n try {\n _sqliteDb?.close();\n }\n catch {\n // Ignore close errors on a stale handle.\n }\n _sqliteDb = openDatabase(dbPath);\n _sqliteDbPath = path.resolve(dbPath);\n }\n return _sqliteDb;\n}\n/**\n * Shared SQLite connection. Lazily opened on first property access —\n * behaves like the previous eager `DatabaseSync` export.\n */\nexport const sqliteDb = new Proxy({}, {\n get(_target, prop) {\n const instance = getSqliteDbInstance();\n const value = instance[prop];\n return typeof value === \"function\" ? value.bind(instance) : value;\n }\n});\n/** Currently opened database file, if any (for diagnostics/tests). */\nexport function getOpenDatabasePath() {\n return _sqliteDbPath;\n}\n/** Close the shared connection (test teardown / path switching). */\nexport function closeSqliteDb() {\n try {\n _sqliteDb?.close();\n }\n catch {\n // Ignore close errors on a stale handle.\n }\n _sqliteDb = null;\n _sqliteDbPath = null;\n}\n","import {} from \"node:sqlite\";\nimport { sqliteDb } from \"./sqlite.js\";\n// ──────────────────────────────────────────────────\n// SQLite implementation (wraps node:sqlite DatabaseSync)\n// ──────────────────────────────────────────────────\nexport class SqliteClient {\n db;\n constructor(db) {\n this.db = db;\n }\n /** Normalize undefined → null (node:sqlite previously tolerated undefined; pg needs null). */\n normalizeParams(params) {\n return params.map((p) => (p === undefined ? null : p));\n }\n all(sql, ...params) {\n return Promise.resolve(this.db.prepare(sql).all(...this.normalizeParams(params)));\n }\n get(sql, ...params) {\n return Promise.resolve(this.db.prepare(sql).get(...this.normalizeParams(params)));\n }\n run(sql, ...params) {\n const result = this.db.prepare(sql).run(...this.normalizeParams(params));\n return Promise.resolve(result);\n }\n exec(sql) {\n this.db.exec(sql);\n return Promise.resolve();\n }\n async tableColumns(table) {\n const rows = (await this.all(`PRAGMA table_info(\"${table}\")`));\n return rows.map((r) => r.name);\n }\n}\n// ──────────────────────────────────────────────────\n// PostgreSQL implementation (wraps pg.Pool)\n// ──────────────────────────────────────────────────\nlet pgPool = null;\nasync function getPool() {\n if (pgPool)\n return pgPool;\n const { Pool } = await import(\"pg\");\n pgPool = new Pool({\n connectionString: process.env.DATABASE_URL,\n max: 10,\n idleTimeoutMillis: 30_000,\n connectionTimeoutMillis: 10_000,\n // Heroku Postgres requires TLS; self-signed cert → rejectUnauthorized: false\n ssl: { rejectUnauthorized: false }\n });\n return pgPool;\n}\n/** Convert SQLite `?` placeholders to PG `$1`, `$2`, ... */\nfunction toPg(sql) {\n let i = 0;\n return sql.replace(/\\?/g, () => `$${++i}`);\n}\n/** Split a SQL script into individual statements on top-level semicolons (ignores quotes/strings). */\nfunction splitStatements(sql) {\n const statements = [];\n let current = \"\";\n let inSingle = false;\n let inDouble = false;\n let inDollar = false;\n for (let i = 0; i < sql.length; i++) {\n const ch = sql[i];\n const next = sql[i + 1];\n if (!inDollar && !inSingle && !inDouble && ch === \"'\") {\n inSingle = true;\n }\n else if (inSingle && ch === \"'\" && next !== \"'\") {\n inSingle = false;\n }\n else if (!inDollar && !inSingle && !inDouble && ch === '\"') {\n inDouble = true;\n }\n else if (inDouble && ch === '\"' && next !== '\"') {\n inDouble = false;\n }\n else if (!inSingle && !inDouble && ch === \"$\" && /^[a-zA-Z_0-9]*\\$/.test(sql.slice(i, i + 40))) {\n inDollar = true;\n }\n else if (inDollar && ch === \"$\" && next !== \"$\") {\n // crude dollar-quote end detection: only terminates if same tag — acceptable for our DDL\n inDollar = false;\n }\n else if (!inSingle && !inDouble && !inDollar && ch === \";\") {\n if (current.trim())\n statements.push(current.trim());\n current = \"\";\n continue;\n }\n current += ch;\n }\n if (current.trim())\n statements.push(current.trim());\n return statements;\n}\nexport class PgClient {\n /** Normalize undefined → null (pg rejects undefined params). */\n normalizeParams(params) {\n return params.map((p) => (p === undefined ? null : p));\n }\n async all(sql, ...params) {\n const pool = await getPool();\n const result = await pool.query(toPg(sql), this.normalizeParams(params));\n return result.rows;\n }\n async get(sql, ...params) {\n const pool = await getPool();\n const result = await pool.query(toPg(sql), this.normalizeParams(params));\n return result.rows[0] ?? null;\n }\n async run(sql, ...params) {\n const pool = await getPool();\n const result = await pool.query(toPg(sql), this.normalizeParams(params));\n return { changes: result.rowCount ?? 0 };\n }\n async exec(sql) {\n const trimmed = sql.trim().toUpperCase();\n if (trimmed.startsWith(\"PRAGMA\"))\n return;\n const pool = await getPool();\n // pg driver rejects multiple statements in a single query() call.\n // Split on top-level semicolons and execute each separately.\n const statements = splitStatements(sql);\n for (const stmt of statements) {\n await pool.query(stmt);\n }\n }\n async tableColumns(table) {\n const rows = (await this.all(\"SELECT column_name AS name FROM information_schema.columns WHERE table_name = $1\", table));\n return rows.map((r) => r.name);\n }\n}\n// ──────────────────────────────────────────────────\n// Singleton factory\n// ──────────────────────────────────────────────────\nlet _client = null;\nexport function getDbClient() {\n if (_client)\n return _client;\n if (process.env.DATABASE_URL) {\n _client = new PgClient();\n }\n else {\n _client = new SqliteClient(sqliteDb);\n }\n return _client;\n}\nexport function setDbClient(client) {\n _client = client;\n}\n/** Expose the raw SQLite DatabaseSync for tests/legacy paths. */\nexport function getSqliteDb() {\n return sqliteDb;\n}\n","import { sqliteDb } from \"./sqlite.js\";\nimport { getDbClient } from \"./client.js\";\n// Single source of truth for database locations lives in sqlite.ts\n// (re-exported here so existing `@srouter/db` importers keep working).\nexport { SROUTER_DIR, DEFAULT_DB_PATH, LEGACY_DB_LOCATIONS, getDatabasePath, getOpenDatabasePath, closeSqliteDb } from \"./sqlite.js\";\n// ─────────────────────────────────────────────────────────────\n// Compat wrapper — mirrors the node:sqlite statement API but is\n// async, so existing query modules only need `await` added.\n// For SQLite it wraps DatabaseSync synchronously; for Postgres\n// it funnels into PgClient.\n// ─────────────────────────────────────────────────────────────\nexport class CompatStatement {\n client;\n sql;\n constructor(client, sql) {\n this.client = client;\n this.sql = sql;\n }\n all(...params) {\n return this.client.all(this.sql, ...params);\n }\n get(...params) {\n return this.client.get(this.sql, ...params);\n }\n run(...params) {\n return this.client.run(this.sql, ...params);\n }\n}\nexport class CompatDb {\n client;\n constructor(client) {\n this.client = client;\n }\n prepare(sql) {\n return new CompatStatement(this.client, sql);\n }\n exec(sql) {\n return this.client.exec(sql);\n }\n}\n// Lazily resolve the client (env may change between import and boot in tests).\nfunction makeCompatDb() {\n return new CompatDb(getDbClient());\n}\nexport const db = makeCompatDb();\n// ─────────────────────────────────────────────────────────────\n// SQLite connection lifecycle (synchronous — preserves legacy\n// boot semantics and avoids test races).\n// ─────────────────────────────────────────────────────────────\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.\nsqliteDb.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 sqliteDb.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;\");\nexecWithRetry(\"PRAGMA synchronous = NORMAL;\");\nexecWithRetry(\"PRAGMA temp_store = MEMORY;\");\nexecWithRetry(\"PRAGMA cache_size = -20000;\");\n// ─────────────────────────────────────────────────────────────\n// Schema — dialect-aware so PG timestamps use BIGINT (INTEGER\n// overflows at ~2.1B; Date.now() is ~1.7T).\n// ─────────────────────────────────────────────────────────────\nexport function isPostgres() {\n return Boolean(process.env.DATABASE_URL);\n}\nfunction tableSql(table, pg) {\n const cols = table.columns\n .map((c) => `${c.name} ${pg && c.definition.includes(\"INTEGER\") ? \"BIGINT\" : c.definition}`)\n .join(\",\\n \");\n return `CREATE TABLE IF NOT EXISTS ${table.name} (\\n ${cols}\\n);`;\n}\nconst TABLES = [\n {\n name: \"providers\",\n columns: [\n { name: \"id\", definition: \"TEXT PRIMARY KEY\" },\n { name: \"provider_id\", definition: \"TEXT NOT NULL\" },\n { name: \"name\", definition: \"TEXT NOT NULL\" },\n { name: \"alias\", definition: \"TEXT\" },\n { name: \"category\", definition: \"TEXT NOT NULL\" },\n { name: \"protocol\", definition: \"TEXT NOT NULL\" },\n { name: \"base_url\", definition: \"TEXT\" },\n { name: \"api_key\", definition: \"TEXT\" },\n { name: \"access_token\", definition: \"TEXT\" },\n { name: \"refresh_token\", definition: \"TEXT\" },\n { name: \"account_id\", definition: \"TEXT\" },\n { name: \"organization_id\", definition: \"TEXT\" },\n { name: \"provider_specific_data\", definition: \"TEXT\" },\n { name: \"custom_headers\", definition: \"TEXT\" },\n { name: \"token_expires_at\", definition: \"INTEGER\" },\n { name: \"last_refreshed_at\", definition: \"INTEGER\" },\n { name: \"enabled\", definition: \"INTEGER NOT NULL DEFAULT 1\" },\n { name: \"created_at\", definition: \"INTEGER NOT NULL\" }\n ]\n },\n {\n name: \"api_keys\",\n columns: [\n { name: \"id\", definition: \"TEXT PRIMARY KEY\" },\n { name: \"key\", definition: \"TEXT UNIQUE NOT NULL\" },\n { name: \"name\", definition: \"TEXT NOT NULL\" },\n { name: \"enabled\", definition: \"INTEGER NOT NULL DEFAULT 1\" },\n { name: \"rate_limit\", definition: \"INTEGER DEFAULT 0\" },\n { name: \"quota_limit\", definition: \"INTEGER DEFAULT 0\" },\n { name: \"usage_tokens\", definition: \"INTEGER DEFAULT 0\" },\n { name: \"credit_limit\", definition: \"REAL DEFAULT 0\" },\n { name: \"usage_cost\", definition: \"REAL DEFAULT 0\" },\n { name: \"allowed_models\", definition: \"TEXT\" },\n { name: \"created_at\", definition: \"INTEGER NOT NULL\" }\n ]\n },\n {\n name: \"request_logs\",\n columns: [\n { name: \"id\", definition: \"TEXT PRIMARY KEY\" },\n { name: \"api_key_id\", definition: \"TEXT\" },\n { name: \"ip_address\", definition: \"TEXT\" },\n { name: \"user_agent\", definition: \"TEXT\" },\n { name: \"provider_id\", definition: \"TEXT NOT NULL\" },\n { name: \"model\", definition: \"TEXT NOT NULL\" },\n { name: \"prompt_tokens\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"completion_tokens\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"total_tokens\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"status_code\", definition: \"INTEGER NOT NULL\" },\n { name: \"latency_ms\", definition: \"INTEGER NOT NULL\" },\n { name: \"cached_tokens\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"cache_creation_tokens\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"reasoning_tokens\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"estimated_cost\", definition: \"REAL NOT NULL DEFAULT 0\" },\n { name: \"fallback_occurred\", definition: \"INTEGER NOT NULL DEFAULT 0\" },\n { name: \"fallback_path\", definition: \"TEXT\" },\n { name: \"fallback_reason\", definition: \"TEXT\" },\n { name: \"resolved_model\", definition: \"TEXT\" },\n { name: \"created_at\", definition: \"INTEGER NOT NULL\" }\n ]\n },\n {\n name: \"oauth_sessions\",\n columns: [\n { name: \"state\", definition: \"TEXT PRIMARY KEY\" },\n { name: \"code_verifier\", definition: \"TEXT NOT NULL\" },\n { name: \"client_id\", definition: \"TEXT NOT NULL\" },\n { name: \"redirect_uri\", definition: \"TEXT NOT NULL\" },\n { name: \"created_at\", definition: \"INTEGER NOT NULL\" }\n ]\n },\n {\n name: \"fallback_rules\",\n columns: [\n { name: \"id\", definition: \"TEXT PRIMARY KEY\" },\n { name: \"source_model\", definition: \"TEXT NOT NULL\" },\n { name: \"target_model\", definition: \"TEXT NOT NULL\" },\n { name: \"priority\", definition: \"INTEGER NOT NULL DEFAULT 1\" },\n { name: \"enabled\", definition: \"INTEGER NOT NULL DEFAULT 1\" },\n { name: \"trigger_on_status\", definition: \"TEXT\" },\n { name: \"max_retries\", definition: \"INTEGER DEFAULT 1\" },\n { name: \"created_at\", definition: \"INTEGER NOT NULL\" }\n ]\n },\n {\n name: \"system_settings\",\n columns: [\n { name: \"key\", definition: \"TEXT PRIMARY KEY\" },\n { name: \"value\", definition: \"TEXT NOT NULL\" }\n ]\n },\n {\n name: \"custom_models\",\n columns: [\n { name: \"provider_id\", definition: \"TEXT NOT NULL\" },\n { name: \"model_id\", definition: \"TEXT NOT NULL\" },\n { name: \"created_at\", definition: \"INTEGER NOT NULL\" },\n { name: \"PRIMARY KEY (provider_id, model_id)\", definition: \"\" }\n ]\n }\n];\nconst INDEXES = [\n { sql: \"CREATE INDEX IF NOT EXISTS idx_request_logs_created_at ON request_logs(created_at DESC);\" },\n { sql: \"CREATE INDEX IF NOT EXISTS idx_request_logs_provider_created ON request_logs(provider_id, created_at DESC);\" },\n { sql: \"CREATE INDEX IF NOT EXISTS idx_request_logs_provider_model ON request_logs(provider_id, model);\" },\n { sql: \"CREATE INDEX IF NOT EXISTS idx_request_logs_model ON request_logs(model);\" },\n { sql: \"CREATE INDEX IF NOT EXISTS idx_fallback_rules_priority ON fallback_rules(priority ASC, created_at ASC);\" },\n { sql: \"CREATE INDEX IF NOT EXISTS idx_providers_provider_id ON providers(provider_id);\" },\n { sql: \"CREATE INDEX IF NOT EXISTS idx_custom_models_provider ON custom_models(provider_id, created_at ASC);\" }\n];\nconst ADMIN_TABLES = (pg) => {\n const integer = pg ? \"BIGINT\" : \"INTEGER\";\n return `\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/**\n * Adds columns to a table if they do not already exist.\n * Declarative replacement for repeated try/catch ALTER TABLE blocks.\n */\nasync function ensureColumns(table, columns) {\n const client = getDbClient();\n const existing = new Set(await client.tableColumns(table));\n for (const col of columns) {\n if (existing.has(col.name))\n continue;\n try {\n await client.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\")) {\n throw error;\n }\n }\n }\n}\n/**\n * Initialize database schema tables if they do not exist.\n * For SQLite this runs synchronously at import (legacy semantics);\n * for Postgres callers await `initDatabase()`.\n */\nexport function initDatabase() {\n if (isPostgres()) {\n return initPostgresSchema();\n }\n initSqliteSchemaSync();\n}\nfunction initSqliteSchemaSync() {\n const raw = sqliteDb;\n for (const table of TABLES) {\n raw.exec(tableSql(table, false));\n }\n for (const index of INDEXES) {\n raw.exec(index.sql);\n }\n raw.exec(ADMIN_TABLES(false));\n const ensureSync = (table, columns) => {\n const existing = new Set(raw.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 raw.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\")) {\n throw error;\n }\n }\n }\n };\n ensureSync(\"providers\", [\n { name: \"alias\", definition: \"alias TEXT\" },\n { name: \"refresh_token\", definition: \"refresh_token TEXT\" },\n { name: \"account_id\", definition: \"account_id TEXT\" },\n { name: \"provider_specific_data\", definition: \"provider_specific_data TEXT\" },\n { name: \"token_expires_at\", definition: \"token_expires_at INTEGER\" },\n { name: \"last_refreshed_at\", definition: \"last_refreshed_at INTEGER\" },\n { name: \"organization_id\", definition: \"organization_id TEXT\" }\n ]);\n ensureSync(\"api_keys\", [\n { name: \"allowed_models\", definition: \"allowed_models TEXT\" },\n { name: \"credit_limit\", definition: \"credit_limit REAL DEFAULT 0\" },\n { name: \"usage_cost\", definition: \"usage_cost REAL DEFAULT 0\" }\n ]);\n ensureSync(\"request_logs\", [\n { name: \"ip_address\", definition: \"ip_address TEXT\" },\n { name: \"user_agent\", definition: \"user_agent TEXT\" },\n { name: \"cached_tokens\", definition: \"cached_tokens INTEGER NOT NULL DEFAULT 0\" },\n { name: \"cache_creation_tokens\", definition: \"cache_creation_tokens INTEGER NOT NULL DEFAULT 0\" },\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}\nasync function initPostgresSchema() {\n const client = getDbClient();\n for (const table of TABLES) {\n await client.exec(tableSql(table, true));\n }\n for (const index of INDEXES) {\n await client.exec(index.sql);\n }\n await client.exec(ADMIN_TABLES(true));\n await ensureColumns(\"providers\", [\n { name: \"alias\", definition: \"alias TEXT\" },\n { name: \"refresh_token\", definition: \"refresh_token TEXT\" },\n { name: \"account_id\", definition: \"account_id TEXT\" },\n { name: \"provider_specific_data\", definition: \"provider_specific_data TEXT\" },\n { name: \"token_expires_at\", definition: \"token_expires_at INTEGER\" },\n { name: \"last_refreshed_at\", definition: \"last_refreshed_at INTEGER\" },\n { name: \"organization_id\", definition: \"organization_id TEXT\" }\n ]);\n await ensureColumns(\"api_keys\", [\n { name: \"allowed_models\", definition: \"allowed_models TEXT\" },\n { name: \"credit_limit\", definition: \"credit_limit REAL DEFAULT 0\" },\n { name: \"usage_cost\", definition: \"usage_cost REAL DEFAULT 0\" }\n ]);\n await ensureColumns(\"request_logs\", [\n { name: \"ip_address\", definition: \"ip_address TEXT\" },\n { name: \"user_agent\", definition: \"user_agent TEXT\" },\n { name: \"cached_tokens\", definition: \"cached_tokens INTEGER NOT NULL DEFAULT 0\" },\n { name: \"cache_creation_tokens\", definition: \"cache_creation_tokens INTEGER NOT NULL DEFAULT 0\" },\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}\n// Schema init: synchronous for SQLite (legacy), async for Postgres (fired and awaited by boot).\n// For Postgres, boot code must explicitly await initDatabase() before serving.\nif (!isPostgres()) {\n initDatabase();\n}\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 { getDbClient } from \"./client.js\";\nimport { num, str } from \"./row-utils.js\";\nexport class AdminAuthStore {\n initialized = false;\n client;\n /** Accept a DbClient for isolation (tests use :memory: SqliteClient); defaults to global. */\n constructor(client) {\n this.client = client ?? getDbClient();\n }\n async ensureTables() {\n if (this.initialized)\n return;\n const pg = Boolean(process.env.DATABASE_URL);\n const integer = pg ? \"BIGINT\" : \"INTEGER\";\n await this.client.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 this.initialized = true;\n }\n async hasAdminAccount() {\n await this.ensureTables();\n const Row = await this.client.get(\"SELECT 1 AS present FROM admin_account WHERE id = 1\");\n return Boolean(Row);\n }\n async createAdminAccount(passwordHash, now = Date.now()) {\n await this.ensureTables();\n const Result = await this.client.run(`INSERT INTO admin_account (id, password_hash, created_at, updated_at)\n VALUES (1, ?, ?, ?)\n ON CONFLICT(id) DO NOTHING`, passwordHash, now, now);\n return num(Result.changes) > 0;\n }\n async getPasswordHash() {\n await this.ensureTables();\n const Row = await this.client.get(\"SELECT password_hash FROM admin_account WHERE id = 1\");\n return Row?.password_hash ? str(Row.password_hash) : null;\n }\n async updatePasswordHash(passwordHash, now = Date.now()) {\n await this.ensureTables();\n const Result = await this.client.run(`UPDATE admin_account\n SET password_hash = ?, updated_at = ?\n WHERE id = 1`, passwordHash, now);\n return num(Result.changes) > 0;\n }\n async createSession(tokenHash, createdAt, expiresAt) {\n await this.ensureTables();\n await this.client.run(`INSERT INTO admin_sessions (token_hash, created_at, expires_at)\n VALUES (?, ?, ?)`, tokenHash, createdAt, expiresAt);\n }\n async getSession(tokenHash, now = Date.now()) {\n await this.ensureTables();\n await this.client.run(\"DELETE FROM admin_sessions WHERE expires_at <= ?\", now);\n const Row = await this.client.get(`SELECT token_hash, created_at, expires_at\n FROM admin_sessions\n WHERE token_hash = ? AND expires_at > ?`, 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 async deleteSession(tokenHash) {\n await this.ensureTables();\n const Result = await this.client.run(\"DELETE FROM admin_sessions WHERE token_hash = ?\", tokenHash);\n return num(Result.changes) > 0;\n }\n}\nexport const adminAuthStore = new AdminAuthStore();\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 { getDatabasePath, initDatabase, LEGACY_DB_LOCATIONS } 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\n/** Resolved lazily (not at import) so tests can redirect via `DATABASE_PATH`\n * to an isolated file instead of the production database. */\nfunction getTargetDbPath(): string {\n return getDatabasePath();\n}\n\n/** Backups live next to the target database (isolated automatically in tests). */\nfunction getBackupDir(targetDbPath: string): string {\n return path.join(path.dirname(targetDbPath), \"backups\");\n}\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(targetDbPath: string): void {\n fs.mkdirSync(path.dirname(targetDbPath), { recursive: true, mode: 0o700 });\n fs.mkdirSync(getBackupDir(targetDbPath), { recursive: true, mode: 0o755 });\n}\n\nfunction backupDb(source: string, label: string, targetDbPath: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(getBackupDir(targetDbPath), `${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 const targetDbPath = getTargetDbPath();\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(targetDbPath);\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\", targetDbPath);\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 targetDbPath = getTargetDbPath();\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(targetDbPath);\n const sourceBackup = backupDb(source, \"9router\", targetDbPath);\n\n let targetBackup: string | null = null;\n if (action === \"backup_and_replace\") {\n targetBackup = backupDb(targetDbPath, \"srouter\", targetDbPath);\n }\n\n const s = p.spinner();\n try {\n s.start(\"Preparing target database\");\n await 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"],"mappings":"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","names":["intro","outro","spinner","note","fs","path","os","os","path","fs","p","p","os","path","fs","xdgConfig","path","os","fs","fs","path","fs","path","modelsDevPath","str","parseJsonc","fs","path","fs","path","os","path","os","fs","intro","spinner","note","outro","customInput","val","fs","os","path","path","fs","os","db","db","p","path","os","fs","spawn","spawn","fs","os","path","p","DatabaseSync","path","os","fs","DatabaseSync"]}