{"repo": "cgaeking/clawrouter", "files": {"src/cli.ts": {"91f0cd44183467eedd4b4cb6eb6020bdac29bf6a": {"t": 1785745562.5340278, "n": 4110, "h": "6a83d9fc7b820697", "c": "#!/usr/bin/env node\n/**\n * ClawRouter CLI — Standalone proxy mode\n *\n * Usage:\n * npx clawrouter # Start standalone proxy\n * npx clawrouter --version # Show version\n */\n\nimport { startProxy, getProxyPort } from \"./proxy.js\";\nimport { loadApiKeys, getConfiguredProviders, hasOpenRouter, getAccessibleProviders } from \"./api-keys.js\";\nimport { VERSION } from \"./version.js\";\n\nfunction printHelp(): void {\n console.log(`\nClawRouter v${VERSION} - Smart LLM Router (Direct API Keys)\n\nUsage:\n clawrouter [options]\n\nOptions:\n --version, -v Show version number\n --help, -h Show this help message\n --port Port to listen on (default: ${getProxyPort()})\n\nExamples:\n # Set API keys and start\n export OPENAI_API_KEY=sk-...\n export ANTHROPIC_API_KEY=sk-ant-...\n npx clawrouter\n\n # Custom port\n npx clawrouter --port 9000\n\nEnvironment Variables:\n OPENROUTER_API_KEY OpenRouter key (one key → all models!)\n OPENAI_API_KEY OpenAI API key (direct, cheaper)\n ANTHROPIC_API_KEY Anthropic API key (direct, cheaper)\n GOOGLE_API_KEY Google AI API key (direct, cheaper)\n XAI_API_KEY xAI/Grok API key (direct, cheaper)\n DEEPSEEK_API_KEY DeepSeek API key (direct, cheaper)\n MOONSHOT_API_KEY Moonshot/Kimi API key (direct, cheaper)\n NVIDIA_API_KEY NVIDIA API key (direct, cheaper)\n CLAWROUTER_PORT Default proxy port (default: 8402)\n\n Direct keys take priority over OpenRouter for that provider's models.\n`);\n}\n\nfunction parseArgs(args: string[]): { version: boolean; help: boolean; port?: number } {\n const result = { version: false, help: false, port: undefined as number | undefined };\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--version\" || arg === \"-v\") result.version = true;\n else if (arg === \"--help\" || arg === \"-h\") result.help = true;\n else if (arg === \"--port\" && args[i + 1]) { result.port = parseInt(args[i + 1], 10); i++; }\n }\n return result;\n}\n\nasync function main(): Promise {\n const args = parseArgs(process.argv.slice(2));\n if (args.version) { console.log(VERSION); process.exit(0); }\n if (args.help) { printHelp(); process.exit(0); }\n\n const apiKeys = loadApiKeys();\n const configured = getConfiguredProviders(apiKeys);\n\n if (configured.length === 0) {\n console.error(\"[ClawRouter] No API keys configured!\");\n console.error(\"[ClawRouter] Quickest: export OPENROUTER_API_KEY=sk-or-... (one key → all models)\");\n console.error(\"[ClawRouter] Or set individual keys: OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.\");\n console.error(\"[ClawRouter] Or edit ~/.openclaw/clawrouter/config.json\");\n process.exit(1);\n }\n\n const accessible = getAccessibleProviders(apiKeys);\n const orFallback = hasOpenRouter(apiKeys);\n console.log(`[ClawRouter] Configured providers: ${configured.join(\", \")}${orFallback ? \" (OpenRouter covers all)\" : \"\"}`);\n console.log(`[ClawRouter] Accessible providers: ${accessible.join(\", \")} (${accessible.length} total)`);\n\n const proxy = await startProxy({\n apiKeys,\n port: args.port,\n onReady: (port) => {\n console.log(`[ClawRouter] Proxy listening on http://127.0.0.1:${port}`);\n console.log(`[ClawRouter] Health check: http://127.0.0.1:${port}/health`);\n },\n onError: (error) => console.error(`[ClawRouter] Error: ${error.message}`),\n onRouted: (decision) => {\n const cost = decision.costEstimate.toFixed(4);\n const saved = (decision.savings * 100).toFixed(0);\n console.log(`[ClawRouter] [${decision.tier}] ${decision.model} ~$${cost} (saved ${saved}%)`);\n },\n });\n\n console.log(`[ClawRouter] Ready - Ctrl+C to stop`);\n\n const shutdown = async (signal: string) => {\n console.log(`\\n[ClawRouter] Received ${signal}, shutting down...`);\n try { await proxy.close(); process.exit(0); } catch { process.exit(1); }\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise(() => {});\n}\n\nmain().catch((err) => { console.error(`[ClawRouter] Fatal: ${err.message}`); process.exit(1); });\n"}, "512fb3e7e7b9b50537329037563a76abdf7a3999": {"t": 1785754238.7332873, "n": 4110, "h": "6a83d9fc7b820697", "c": "#!/usr/bin/env node\n/**\n * ClawRouter CLI — Standalone proxy mode\n *\n * Usage:\n * npx clawrouter # Start standalone proxy\n * npx clawrouter --version # Show version\n */\n\nimport { startProxy, getProxyPort } from \"./proxy.js\";\nimport { loadApiKeys, getConfiguredProviders, hasOpenRouter, getAccessibleProviders } from \"./api-keys.js\";\nimport { VERSION } from \"./version.js\";\n\nfunction printHelp(): void {\n console.log(`\nClawRouter v${VERSION} - Smart LLM Router (Direct API Keys)\n\nUsage:\n clawrouter [options]\n\nOptions:\n --version, -v Show version number\n --help, -h Show this help message\n --port Port to listen on (default: ${getProxyPort()})\n\nExamples:\n # Set API keys and start\n export OPENAI_API_KEY=sk-...\n export ANTHROPIC_API_KEY=sk-ant-...\n npx clawrouter\n\n # Custom port\n npx clawrouter --port 9000\n\nEnvironment Variables:\n OPENROUTER_API_KEY OpenRouter key (one key → all models!)\n OPENAI_API_KEY OpenAI API key (direct, cheaper)\n ANTHROPIC_API_KEY Anthropic API key (direct, cheaper)\n GOOGLE_API_KEY Google AI API key (direct, cheaper)\n XAI_API_KEY xAI/Grok API key (direct, cheaper)\n DEEPSEEK_API_KEY DeepSeek API key (direct, cheaper)\n MOONSHOT_API_KEY Moonshot/Kimi API key (direct, cheaper)\n NVIDIA_API_KEY NVIDIA API key (direct, cheaper)\n CLAWROUTER_PORT Default proxy port (default: 8402)\n\n Direct keys take priority over OpenRouter for that provider's models.\n`);\n}\n\nfunction parseArgs(args: string[]): { version: boolean; help: boolean; port?: number } {\n const result = { version: false, help: false, port: undefined as number | undefined };\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--version\" || arg === \"-v\") result.version = true;\n else if (arg === \"--help\" || arg === \"-h\") result.help = true;\n else if (arg === \"--port\" && args[i + 1]) { result.port = parseInt(args[i + 1], 10); i++; }\n }\n return result;\n}\n\nasync function main(): Promise {\n const args = parseArgs(process.argv.slice(2));\n if (args.version) { console.log(VERSION); process.exit(0); }\n if (args.help) { printHelp(); process.exit(0); }\n\n const apiKeys = loadApiKeys();\n const configured = getConfiguredProviders(apiKeys);\n\n if (configured.length === 0) {\n console.error(\"[ClawRouter] No API keys configured!\");\n console.error(\"[ClawRouter] Quickest: export OPENROUTER_API_KEY=sk-or-... (one key → all models)\");\n console.error(\"[ClawRouter] Or set individual keys: OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.\");\n console.error(\"[ClawRouter] Or edit ~/.openclaw/clawrouter/config.json\");\n process.exit(1);\n }\n\n const accessible = getAccessibleProviders(apiKeys);\n const orFallback = hasOpenRouter(apiKeys);\n console.log(`[ClawRouter] Configured providers: ${configured.join(\", \")}${orFallback ? \" (OpenRouter covers all)\" : \"\"}`);\n console.log(`[ClawRouter] Accessible providers: ${accessible.join(\", \")} (${accessible.length} total)`);\n\n const proxy = await startProxy({\n apiKeys,\n port: args.port,\n onReady: (port) => {\n console.log(`[ClawRouter] Proxy listening on http://127.0.0.1:${port}`);\n console.log(`[ClawRouter] Health check: http://127.0.0.1:${port}/health`);\n },\n onError: (error) => console.error(`[ClawRouter] Error: ${error.message}`),\n onRouted: (decision) => {\n const cost = decision.costEstimate.toFixed(4);\n const saved = (decision.savings * 100).toFixed(0);\n console.log(`[ClawRouter] [${decision.tier}] ${decision.model} ~$${cost} (saved ${saved}%)`);\n },\n });\n\n console.log(`[ClawRouter] Ready - Ctrl+C to stop`);\n\n const shutdown = async (signal: string) => {\n console.log(`\\n[ClawRouter] Received ${signal}, shutting down...`);\n try { await proxy.close(); process.exit(0); } catch { process.exit(1); }\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise(() => {});\n}\n\nmain().catch((err) => { console.error(`[ClawRouter] Fatal: ${err.message}`); process.exit(1); });\n"}}}}