anygate 0.1.0
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/LICENSE +21 -0
- package/README.md +613 -0
- package/dist/chunk-OACEC5EH.js +10552 -0
- package/dist/chunk-OACEC5EH.js.map +1 -0
- package/dist/chunk-YYSUTRMV.js +390 -0
- package/dist/chunk-YYSUTRMV.js.map +1 -0
- package/dist/cli.js +12484 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-SVHKYXNL.js +1452 -0
- package/dist/command-SVHKYXNL.js.map +1 -0
- package/dist/provider-templates-75KU6VA6.js +18 -0
- package/dist/provider-templates-75KU6VA6.js.map +1 -0
- package/dist/ui/public/app.js +2450 -0
- package/dist/ui/public/icon-antigravity-ide.png +0 -0
- package/dist/ui/public/icon-antigravity.png +0 -0
- package/dist/ui/public/index.html +217 -0
- package/dist/ui/public/style.css +1751 -0
- package/package.json +89 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/agents/shared/first-run.ts","../src/registry/validate-import-key.ts","../src/registry/import-opencode.ts","../src/agents/shared/key-setup.ts","../src/agents/shared/prompts.ts","../src/agents/shared/model-search.ts","../src/core/credentials.ts","../src/agents/claude/favorites.ts","../src/agents/claude/favorites-picker.ts","../src/providers/command.ts","../src/agents/codex/cli.ts","../src/agents/codex/proxy.ts","../src/oauth/claude-code-identity.ts","../src/agents/codex/responses-adapter.ts","../src/agents/codex/profile.ts","../src/agents/codex/routing.ts","../src/agents/codex/session.ts","../src/agents/codex/launch.ts","../src/agents/codex/prompts.ts","../src/agents/codex/ui.ts","../src/agents/codex/favorites-catalog.ts","../src/agents/codex/favorites-launch.ts","../src/agents/shared/favorites-resolver.ts","../src/agents/shared/cloud-code-backend.ts","../src/core/agent-io.ts","../src/agents/shared/launch-target.ts","../src/agents/gemini/cli.ts","../src/agents/gemini/launch.ts","../src/agents/gemini/prompts.ts","../src/agents/gemini/proxy.ts","../src/agents/gemini/backend-routes.ts","../src/agents/gemini/antigravity.ts","../src/gateway/antigravity/cloud-code-gateway.ts","../src/gateway/antigravity/response-adapter.ts","../src/gateway/antigravity/slot-registry.ts","../src/gateway/antigravity/catalog.ts","../src/gateway/antigravity/fixtures/loadCodeAssist.json","../src/gateway/antigravity/fixtures/fetchAvailableModels.json","../src/gateway/antigravity/launch-routes.ts","../src/gateway/antigravity/launch-cli.ts","../src/gateway/antigravity/launch-ide.ts","../src/gateway/antigravity/ide-profile.ts","../src/agents/codex/app.ts","../src/agents/codex/app-provider-routes.ts","../src/agents/codex/app-config.ts","../src/agents/codex/app-session.ts","../src/agents/claude/desktop.ts","../src/agents/claude/desktop-app.ts","../src/agents/claude/desktop-session.ts","../src/agents/shared/ai-doc.ts"],"sourcesContent":["// src/cli.ts\r\nimport pc from 'picocolors';\r\nimport { gateIntro, gateOutro, providerSelectOption, fmtModel, fmtEnabledStar, formatModelLabel, printAsciiBanner } from './agents/shared/ui.js';\r\nimport * as p from '@clack/prompts';\r\nimport { realpathSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { findClaudeBinary, launchClaude } from './agents/shared/launch.js';\r\nimport { resolveApiKey, detectConflicts, buildChildEnv, readGlobalOpencodeCredential } from './core/env.js';\r\nimport { claudeCodeClientModelId } from './agents/shared/context-model-id.js';\r\nimport { resolveOrCollectApiKey } from './agents/shared/key-setup.js';\r\nimport { needsFirstRunSetup, runFirstRunWizard } from './agents/shared/first-run.js';\r\nimport { MAX_MODEL_CATALOG } from './core/constants.js';\r\nimport { startProxy, startProxyCatalog } from './gateway/anthropic-proxy.js';\r\nimport type { ProxyHandle, ProxyRoute } from './gateway/anthropic-proxy.js';\r\nimport {\r\n buildCatalogRoutes,\r\n makeRouteResolver,\r\n} from './providers/provider-catalog.js';\r\nimport { runServerCommand } from './gateway/server.js';\r\nimport type { ModelFormat } from './core/types.js';\r\nimport { loadPreferences, savePreferences, recordLaunchSelection } from './core/config.js';\r\nimport { pickLocalModel, browseAllModels } from './agents/shared/prompts.js';\r\nimport { fetchProviderCatalog, providersForPicker } from './providers/provider-catalog.js';\r\nimport { resolveLocalProviderApiKey } from './core/credentials.js';\r\nimport { BACKENDS, VERSION } from './core/constants.js';\r\nimport { checkForUpdates, formatUpdateNotification } from './agents/shared/update-check.js';\r\nimport type { ParsedArgs, ModelInfo, FavoriteModel, LocalProvider, LocalProviderModel } from './core/types.js';\r\nimport { addFavorite, removeFavorite, isFavorite } from './agents/claude/favorites.js';\r\nimport {\r\n browseByProviderChoice,\r\n buildGlobalFavoriteIndex,\r\n pickGlobalFavoriteModel,\r\n} from './agents/claude/favorites-picker.js';\r\nimport { favoriteProviderDisplayName } from './agents/claude/favorites-provider-display.js';\r\nimport { resolveFirstAvailableFavorite } from './agents/shared/favorites-resolver.js';\r\nimport { runProvidersCommand, providersHelpText } from './providers/command.js';\r\nimport { runCodexCommand, codexHelpText } from './agents/codex/cli.js';\r\nimport { runGeminiCommand, geminiHelpText } from './agents/gemini/cli.js';\r\nimport { runAgyCommand, runAntigravityAppCommand, runAntigravityIdeCommand } from './agents/gemini/antigravity.js';\r\nimport { runCodexAppCommand } from './agents/codex/app.js';\r\nimport { runClaudeAppCommand } from './agents/claude/desktop.js';\r\nimport { prepareClaudeTraceLog, printTraceLog } from './agents/shared/trace-log.js';\r\nimport { ANTIGRAVITY_BASE_URLS } from './oauth/antigravity-oauth.js';\r\nimport { providersForTarget } from './agents/shared/target-compatibility.js';\r\nimport { refreshModelsDevCacheAsync } from './registry/models-dev.js';\r\nimport { setAgentStdoutMode, isAgentStdoutMode } from './core/agent-io.js';\r\nimport {\r\n findProviderAndModel,\r\n normalizeClaudeAgentArgs,\r\n planLaunchWizard,\r\n wantsCleanAgentStdout,\r\n} from './agents/shared/launch-target.js';\r\nimport { generateAiDoc, installAiDoc, printAiInstallResult } from './agents/shared/ai-doc.js';\r\nconst STARTER_CLAUDE_FLAGS = new Set(['--dry-run', '--setup', '--trace', '--help', '-h', '--version', '-v']);\r\nconst GATEWAY_LAUNCH_FLAGS = new Set(['--provider', '--model']);\r\n\r\nfunction parseGatewayLaunchFlag(\r\n arg: string,\r\n rest: string[],\r\n index: number,\r\n parsed: ParsedArgs,\r\n): number | 'error' {\r\n if (arg === '--provider' || arg === '--model') {\r\n const value = rest[index + 1];\r\n if (!value || value.startsWith('-')) {\r\n parsed.error = `Missing value for ${arg}`;\r\n return 'error';\r\n }\r\n if (arg === '--provider') parsed.launchProvider = value;\r\n else parsed.launchModel = value;\r\n return index + 1;\r\n }\r\n if (arg.startsWith('--provider=')) {\r\n parsed.launchProvider = arg.slice('--provider='.length);\r\n return index;\r\n }\r\n if (arg.startsWith('--model=')) {\r\n parsed.launchModel = arg.slice('--model='.length);\r\n return index;\r\n }\r\n return index;\r\n}\r\n\r\nfunction tryConsumeGatewayLaunchFlag(\r\n arg: string,\r\n rest: string[],\r\n index: number,\r\n parsed: ParsedArgs,\r\n): { next: number } | { error: true } | null {\r\n if (!GATEWAY_LAUNCH_FLAGS.has(arg) && !arg.startsWith('--provider=') && !arg.startsWith('--model=')) {\r\n return null;\r\n }\r\n const next = parseGatewayLaunchFlag(arg, rest, index, parsed);\r\n if (next === 'error') return { error: true };\r\n return { next };\r\n}\r\n\r\nfunction consumeServerOptionValue(\r\n arg: string,\r\n rest: string[],\r\n index: number,\r\n flag: string,\r\n parsed: ParsedArgs,\r\n): { value: string; next: number } | null {\r\n if (arg.startsWith(`${flag}=`)) {\r\n return { value: arg.slice(flag.length + 1), next: index };\r\n }\r\n if (arg !== flag) return null;\r\n const value = rest[index + 1];\r\n if (!value || value.startsWith('--')) {\r\n parsed.error = `Missing value for ${flag}`;\r\n return null;\r\n }\r\n return { value, next: index + 1 };\r\n}\r\n\r\nfunction applyServerProvidersOption(value: string, parsed: ParsedArgs): void {\r\n const trimmed = value.trim();\r\n if (trimmed === 'all') {\r\n parsed.serverProvidersMode = 'all';\r\n parsed.serverProviderIds = undefined;\r\n return;\r\n }\r\n if (trimmed === 'favorites') {\r\n parsed.serverProvidersMode = 'favorites';\r\n parsed.serverProviderIds = undefined;\r\n return;\r\n }\r\n\r\n const ids = trimmed.split(',').map(id => id.trim()).filter(Boolean);\r\n if (ids.length === 0) {\r\n parsed.error = 'Missing provider ids for --providers';\r\n return;\r\n }\r\n parsed.serverProvidersMode = 'specific';\r\n parsed.serverProviderIds = ids;\r\n}\r\n\r\nfunction emptyParsed(command: ParsedArgs['command']): ParsedArgs {\r\n return {\r\n command,\r\n showHelp: false,\r\n showVersion: false,\r\n dryRun: false,\r\n setup: false,\r\n trace: false,\r\n vertex: false,\r\n claudeArgs: [],\r\n };\r\n}\r\n\r\nexport function parseArgs(args: string[]): ParsedArgs {\r\n if (args.includes('--ai')) {\r\n return {\r\n ...emptyParsed('root'),\r\n showAi: true,\r\n aiInstall: args.includes('--install'),\r\n aiInstallForce: args.includes('--force'),\r\n };\r\n }\r\n\r\n if (args.length === 0) return { ...emptyParsed('root'), showHelp: true };\r\n\r\n const [first, ...rest] = args;\r\n\r\n if (first === '--help' || first === '-h') {\r\n return { ...emptyParsed('root'), showHelp: true };\r\n }\r\n if (first === '--version' || first === '-v') {\r\n return { ...emptyParsed('root'), showVersion: true };\r\n }\r\n\r\n if (first === 'server') {\r\n const parsed = emptyParsed('server');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--help' || arg === '-h') parsed.showHelp = true;\r\n else if (arg === '--version' || arg === '-v') parsed.showVersion = true;\r\n else if (arg === '--vertex') parsed.vertex = true;\r\n else if (arg === '--quick' || arg === '--saved') parsed.serverQuick = true;\r\n else if (arg === '--free-only') parsed.serverFreeOnly = true;\r\n else if (arg === '--no-free-only') parsed.serverFreeOnly = false;\r\n else if (arg === '--mask-gateway-ids') parsed.serverMaskGatewayIds = true;\r\n else if (arg === '--no-mask-gateway-ids') parsed.serverMaskGatewayIds = false;\r\n else if (arg === '--listen' || arg.startsWith('--listen=')) {\r\n const consumed = consumeServerOptionValue(arg, rest, i, '--listen', parsed);\r\n if (!consumed) return parsed;\r\n if (consumed.value !== 'local' && consumed.value !== 'network') {\r\n parsed.error = '--listen must be \"local\" or \"network\"';\r\n return parsed;\r\n }\r\n parsed.serverListenMode = consumed.value;\r\n i = consumed.next;\r\n }\r\n else if (arg === '--providers' || arg.startsWith('--providers=')) {\r\n const consumed = consumeServerOptionValue(arg, rest, i, '--providers', parsed);\r\n if (!consumed) return parsed;\r\n applyServerProvidersOption(consumed.value, parsed);\r\n if (parsed.error) return parsed;\r\n i = consumed.next;\r\n }\r\n else if (arg === '--password' || arg.startsWith('--password=')) {\r\n const consumed = consumeServerOptionValue(arg, rest, i, '--password', parsed);\r\n if (!consumed) return parsed;\r\n parsed.serverPassword = consumed.value;\r\n i = consumed.next;\r\n }\r\n else if (!parsed.error) parsed.error = `Unknown server option: ${arg}`;\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'models' || first === 'favorites') {\r\n const parsed = emptyParsed('models');\r\n for (const arg of rest) {\r\n if (arg === '--help' || arg === '-h') parsed.showHelp = true;\r\n else if (arg === '--version' || arg === '-v') parsed.showVersion = true;\r\n else if (arg === '--agy') parsed.favoritesAgy = true;\r\n else if (!parsed.error) parsed.error = `Unknown models option: ${arg}`;\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'providers') {\r\n const parsed = emptyParsed('providers');\r\n parsed.claudeArgs = [];\r\n for (const arg of rest) {\r\n if (arg === '--trace') parsed.trace = true;\r\n else if (arg === '--help' || arg === '-h') parsed.showHelp = true;\r\n else if (arg === '--version' || arg === '-v') parsed.showVersion = true;\r\n else parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'ui') {\r\n const parsed = emptyParsed('ui');\r\n for (const arg of rest) {\r\n if (arg === '--trace') parsed.trace = true;\r\n else if (arg === '--help' || arg === '-h') parsed.showHelp = true;\r\n else if (arg === '--version' || arg === '-v') parsed.showVersion = true;\r\n else if (!parsed.error) parsed.error = `Unknown ui option: ${arg}`;\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'codex-app' || first === 'chatgpt') {\r\n const parsed = emptyParsed('codex-app');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--help' || arg === '-h') { parsed.showHelp = true; continue; }\r\n if (arg === '--version' || arg === '-v') { parsed.showVersion = true; continue; }\r\n if (arg === '--vertex') { parsed.vertex = true; continue; }\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'claude-app') {\r\n const parsed = emptyParsed('claude-app');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--help' || arg === '-h') { parsed.showHelp = true; continue; }\r\n if (arg === '--version' || arg === '-v') { parsed.showVersion = true; continue; }\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'codex') {\r\n const parsed = emptyParsed('codex');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--trace') {\r\n parsed.trace = true;\r\n continue;\r\n }\r\n if (arg === '--vertex') {\r\n parsed.vertex = true;\r\n continue;\r\n }\r\n if (arg === '--help' || arg === '-h') {\r\n parsed.showHelp = true;\r\n continue;\r\n }\r\n if (arg === '--version' || arg === '-v') {\r\n parsed.showVersion = true;\r\n continue;\r\n }\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'gemini') {\r\n const parsed = emptyParsed('gemini');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--trace') {\r\n parsed.trace = true;\r\n continue;\r\n }\r\n if (arg === '--help' || arg === '-h') {\r\n parsed.showHelp = true;\r\n continue;\r\n }\r\n if (arg === '--version' || arg === '-v') {\r\n parsed.showVersion = true;\r\n continue;\r\n }\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'agy') {\r\n const parsed = emptyParsed('agy');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--') {\r\n parsed.claudeArgs.push(...rest.slice(i + 1));\r\n break;\r\n }\r\n if (arg === '--trace') {\r\n parsed.trace = true;\r\n continue;\r\n }\r\n if (arg === '--help' || arg === '-h') {\r\n parsed.showHelp = true;\r\n continue;\r\n }\r\n if (arg === '--version' || arg === '-v') {\r\n parsed.showVersion = true;\r\n continue;\r\n }\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first === 'antigravity' || first === 'antigravity-ide') {\r\n const parsed = emptyParsed(first);\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--') {\r\n parsed.claudeArgs.push(...rest.slice(i + 1));\r\n break;\r\n }\r\n if (arg === '--trace') {\r\n parsed.trace = true;\r\n continue;\r\n }\r\n if (arg === '--help' || arg === '-h') {\r\n parsed.showHelp = true;\r\n continue;\r\n }\r\n if (arg === '--version' || arg === '-v') {\r\n parsed.showVersion = true;\r\n continue;\r\n }\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n parsed.claudeArgs.push(arg);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (first !== 'claude') {\r\n return {\r\n ...emptyParsed('root'),\r\n error: first.startsWith('-') ? `Unknown root option: ${first}` : `Unknown command: ${first}`,\r\n };\r\n }\r\n\r\n const parsed = emptyParsed('claude');\r\n for (let i = 0; i < rest.length; i += 1) {\r\n const arg = rest[i]!;\r\n if (arg === '--') {\r\n parsed.claudeArgs.push(...rest.slice(i + 1));\r\n break;\r\n }\r\n\r\n const consumed = tryConsumeGatewayLaunchFlag(arg, rest, i, parsed);\r\n if (consumed !== null) {\r\n if ('error' in consumed) return parsed;\r\n i = consumed.next;\r\n continue;\r\n }\r\n\r\n if (!STARTER_CLAUDE_FLAGS.has(arg)) {\r\n parsed.claudeArgs.push(arg);\r\n continue;\r\n }\r\n\r\n if (arg === '--dry-run') parsed.dryRun = true;\r\n if (arg === '--setup') parsed.setup = true;\r\n if (arg === '--trace') parsed.trace = true;\r\n if (arg === '--help' || arg === '-h') parsed.showHelp = true;\r\n if (arg === '--version' || arg === '-v') parsed.showVersion = true;\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\nexport function rootHelpText(): string {\r\n return `${pc.bold('anygate')} v${VERSION}\r\nLaunch AI coding tools with OpenCode Zen / Go or local providers (Groq, Mistral,\r\nOpenAI, Gemini, Ollama, and more).\r\n\r\n${pc.bold('Usage:')}\r\n anygate claude [options] [claude-flags]\r\n anygate claude-app [options]\r\n anygate codex [options] [codex-flags]\r\n anygate codex-app [options]\r\n anygate chatgpt [options]\r\n anygate gemini [options] [gemini-flags]\r\n anygate agy [options] [agy-flags]\r\n anygate antigravity [options]\r\n anygate antigravity-ide [options]\r\n anygate server [options]\r\n anygate ui\r\n anygate models\r\n anygate favorites\r\n anygate providers\r\n anygate --help\r\n anygate --version\r\n anygate --ai Full reference for AI agents (run this when unsure)\r\n anygate --ai --install Install or upgrade agent skill when version changed\r\n anygate --ai --install --force Reinstall skill even if already current\r\n\r\n${pc.bold('Root options:')}\r\n -h, --help Show this help\r\n -v, --version Show version\r\n --ai Print the full reference for AI agents\r\n --ai --install Install or upgrade the anygate agent skill\r\n --force Reinstall the agent skill when used with --ai --install\r\n\r\n${pc.bold('Commands:')}\r\n claude Launch Claude Code — pick a provider from your registry\r\n models Manage favorite models for mid-session /model switching (max ${MAX_MODEL_CATALOG})\r\n favorites Alias for models\r\n providers Add, import, and manage your AI providers\r\n server Run a foreground API gateway (OpenCode Zen / Go and local providers)\r\n codex Launch OpenAI Codex CLI with registry providers\r\n gemini Launch Google Gemini CLI with registry providers\r\n agy Launch Antigravity CLI with registry providers\r\n antigravity Launch Antigravity app with registry providers (macOS)\r\n antigravity-ide Launch Antigravity IDE with registry providers (macOS)\r\n codex-app Launch ChatGPT desktop app (Codex mode) with registry providers (macOS + Windows)\r\n chatgpt Alias for codex-app\r\n claude-app Launch Claude Desktop app with registry providers (macOS + Windows)\r\n\r\n${pc.bold('Antigravity favorites:')}\r\n agy, antigravity, and antigravity-ide share up to six Antigravity favorites\r\n from anygate favorites --agy, plus the selected launch model.\r\n\r\n${pc.bold('Upgradeion:')}\r\n Bare anygate prints this help instead of launching Claude Code.\r\n Use anygate claude for the wizard and launcher.\r\n\r\n${pc.bold('Examples:')}\r\n anygate claude\r\n anygate models\r\n anygate providers\r\n anygate codex\r\n anygate gemini\r\n anygate agy\r\n anygate antigravity\r\n anygate antigravity-ide\r\n anygate codex-app\r\n anygate claude-app\r\n anygate server\r\n anygate claude -c\r\n anygate claude --resume abc-123\r\n anygate claude -- --print \"hello\"`;\r\n}\r\n\r\nexport function claudeHelpText(): string {\r\n return `${pc.bold('anygate claude')} v${VERSION}\r\nLaunch Claude Code with OpenCode Zen, Go, or local providers as the API backend.\r\n\r\n${pc.bold('Usage:')}\r\n anygate claude [options] [claude-flags]\r\n anygate claude --help\r\n anygate claude --version\r\n\r\n${pc.bold('Options:')}\r\n --dry-run Run the wizard but show a preview instead of launching Claude Code\r\n --setup Hint: use anygate providers to add or manage providers\r\n --trace Write debug logs to ~/.anygate/logs/ and show errors on exit\r\n --provider Boot provider id (skip wizard when paired with --model or in print mode)\r\n --model Boot model id (skip wizard when paired with --provider or in print mode)\r\n --help Show this command help\r\n --version Show version\r\n\r\n${pc.bold('Providers:')}\r\n Cloud (Zen/Go) Requires OPENCODE_API_KEY — get one at https://opencode.ai/auth\r\n Registry Configure with anygate providers add or import (Groq, Mistral,\r\n Nvidia, DeepSeek, OpenAI, custom endpoints, etc.).\r\n\r\n${pc.bold('Model switching:')}\r\n Run anygate models to save favorites (max ${MAX_MODEL_CATALOG}).\r\n When favorites exist, launch starts a multi-route proxy and Claude Code /model\r\n lists your starting model plus favorites for live switching.\r\n With no favorites, launch uses a single model as before.\r\n\r\n${pc.bold('Note:')}\r\n Claude Code may save the launched model to ~/.claude/settings.json.\r\n Bare claude later can still show that model — reset with claude --model sonnet.\r\n\r\n${pc.bold('Examples:')}\r\n anygate claude\r\n anygate claude -c\r\n anygate claude --resume abc-123\r\n anygate claude abc-123\r\n anygate claude --dry-run -c\r\n anygate claude --setup\r\n anygate claude --trace --resume abc-123\r\n anygate claude --provider groq --model llama-3.3-70b-versatile\r\n anygate claude --provider groq --model llama-3.3-70b-versatile -p \"review this file\"\r\n anygate claude -- --print \"hello\"\r\n anygate claude -- --dangerously-skip-permissions`;\r\n}\r\n\r\nexport function serverHelpText(): string {\r\n return `${pc.bold('anygate server')} v${VERSION}\r\nRun a foreground API gateway for registry providers, Zen/Go, or Vertex AI.\r\n\r\n${pc.bold('Usage:')}\r\n anygate server\r\n anygate server --quick\r\n anygate server --listen network --password <password>\r\n anygate server --vertex\r\n anygate server --help\r\n anygate server --version\r\n\r\n${pc.bold('Options:')}\r\n --quick, --saved Start immediately from saved/default settings\r\n --listen local|network One-run listen mode override\r\n --providers all|favorites|id1,id2\r\n One-run provider catalog override\r\n --free-only, --no-free-only One-run free-model filter override\r\n --mask-gateway-ids Mask provider names in Anthropic model ids\r\n --no-mask-gateway-ids Keep provider names in Anthropic model ids\r\n --password <value> One-run network-mode server password\r\n --vertex Use Claude on Google Vertex AI\r\n\r\n${pc.bold('Behavior:')}\r\n Default: interactive wizard for exposed providers, discovery id masking (for\r\n Claude Desktop / Cowork), optional favorites-only catalog, then listen mode.\r\n Quick mode skips prompts and uses saved settings. Any one-run option also\r\n starts without prompts. Non-interactive stdin uses quick mode automatically.\r\n Network quick mode requires a saved password or --password.\r\n --vertex: Anthropic-compatible gateway to Claude on Google Vertex AI using\r\n local gcloud Application Default Credentials (no OpenCode API key).\r\n Binds to port 17645. Network mode asks for a server password.\r\n\r\n${pc.bold('Vertex env:')}\r\n ANTHROPIC_VERTEX_PROJECT_ID or GOOGLE_CLOUD_PROJECT — your GCP project\r\n GOOGLE_CLOUD_LOCATION or CLOUD_ML_REGION — region (default: global)\r\n Optional catalog: ~/.anygate/vertex-models.json (see assets/vertex-models.example.json)\r\n\r\n${pc.bold('Endpoints:')}\r\n Anthropic-compatible: ANTHROPIC_BASE_URL=http://127.0.0.1:17645/anthropic\r\n OpenAI-compatible: OPENAI_BASE_URL=http://127.0.0.1:17645/openai/v1\r\n API key: use anything locally; use the server password in network mode.`;\r\n}\r\n\r\nexport function modelsHelpText(): string {\r\n return `${pc.bold('anygate favorites')} v${VERSION}\r\nManage favorite models for mid-session switching.\r\n\r\n${pc.bold('Usage:')}\r\n anygate favorites\r\n anygate favorites --agy\r\n anygate models\r\n anygate favorites --help\r\n anygate favorites --version\r\n\r\n${pc.bold('Behavior:')}\r\n Opens an interactive manager to add or remove favorites.\r\n Search all providers at once (paginated results) or browse one provider at a time.\r\n Pick from Zen, Go, or any provider in your registry.\r\n Global favorites are saved to ~/.anygate/config.json (max ${MAX_MODEL_CATALOG}).\r\n --agy manages Antigravity CLI favorites only (max 6).\r\n\r\n${pc.bold('How it works:')}\r\n Claude/Codex/Gemini/server use the global favorites list.\r\n Favorites appear in supported /model switch menus.\r\n anygate agy, antigravity, and antigravity-ide use the Antigravity favorites\r\n list so the limited native switch slots stay predictable: one selected launch\r\n model plus up to six Antigravity favorites.\r\n\r\n${pc.bold('Examples:')}\r\n anygate favorites\r\n anygate favorites --agy\r\n anygate claude # switch menu active when favorites are set`;\r\n}\r\n\r\n\r\nexport function antigravityCliHelpText(): string {\r\n return `${pc.bold('anygate agy')} v${VERSION}\r\nLaunch Antigravity CLI with anygate provider registry.\r\n\r\n${pc.bold('Usage:')}\r\n anygate agy [options] [agy-flags]\r\n anygate agy --help\r\n anygate agy --version\r\n\r\n${pc.bold('Options:')}\r\n --provider <id> Use a specific provider (skip picker)\r\n --model <id> Use a specific model (skip picker)\r\n --trace Write debug log to /tmp/anygate-debug.log\r\n -h, --help Show this help\r\n -v, --version Show version\r\n\r\n${pc.bold('How it works:')}\r\n Starts a local Cloud Code gateway, points agy at it via CLOUD_CODE_URL,\r\n and injects anygate models into Antigravity's native model picker.\r\n All Cloud Code traffic routes through anygate — no Google Cloud Code upstream.\r\n\r\n${pc.bold('Examples:')}\r\n anygate agy\r\n anygate agy --provider zen --model deepseek-v4-flash-free\r\n anygate agy -p \"fix this bug\"`;\r\n}\r\n\r\nexport function antigravityIdeHelpText(): string {\r\n return `${pc.bold('anygate antigravity-ide')} v${VERSION}\r\nLaunch Antigravity IDE with anygate provider registry.\r\n\r\n${pc.bold('Usage:')}\r\n anygate antigravity-ide [options]\r\n anygate antigravity-ide --help\r\n anygate antigravity-ide --version\r\n\r\n${pc.bold('Options:')}\r\n --provider <id> Use a specific provider (skip picker)\r\n --model <id> Use a specific model (skip picker)\r\n --trace Write debug log to /tmp/anygate-debug.log\r\n -h, --help Show this help\r\n -v, --version Show version\r\n\r\n${pc.bold('How it works:')}\r\n Creates an isolated anygate-managed IDE profile, starts a local Cloud Code\r\n gateway, and injects anygate models into Antigravity's native picker.\r\n The normal IDE profile is never modified.\r\n\r\n${pc.bold('Platform:')}\r\n macOS (Apple Silicon) — other platforms coming after testing.\r\n\r\n${pc.bold('Examples:')}\r\n anygate antigravity-ide\r\n anygate antigravity-ide --provider zen --model deepseek-v4-flash-free`;\r\n}\r\n\r\nexport function antigravityAppHelpText(): string {\r\n return `${pc.bold('anygate antigravity')} v${VERSION}\r\nLaunch Antigravity with anygate provider registry.\r\n\r\n${pc.bold('Usage:')}\r\n anygate antigravity [options]\r\n anygate antigravity --help\r\n anygate antigravity --version\r\n\r\n${pc.bold('Options:')}\r\n --provider <id> Use a specific provider (skip picker)\r\n --model <id> Use a specific model (skip picker)\r\n --trace Write debug log to /tmp/anygate-debug.log\r\n -h, --help Show this help\r\n -v, --version Show version\r\n\r\n${pc.bold('How it works:')}\r\n Creates an isolated anygate-managed Antigravity profile, starts a local Cloud\r\n Code gateway, and injects anygate models into Antigravity's native picker.\r\n The normal Antigravity profile is never modified.\r\n\r\n${pc.bold('Favorites:')}\r\n Uses the same Antigravity favorites list as anygate favorites --agy:\r\n up to six saved favorites plus the selected launch model.\r\n\r\n${pc.bold('Platform:')}\r\n macOS (Apple Silicon) — other platforms coming after testing.\r\n\r\n${pc.bold('Examples:')}\r\n anygate antigravity\r\n anygate antigravity --provider zen --model deepseek-v4-flash-free`;\r\n}\r\n\r\nfunction printHelp(text: string): void {\r\n console.log(`\\n${text}\\n`);\r\n}\r\n\r\nasync function launchClaudeViaCatalog(\r\n catalogRoutes: ProxyRoute[],\r\n startingRoute: ProxyRoute,\r\n contextWindow: number | undefined,\r\n trace: boolean,\r\n claudeArgs: string[],\r\n): Promise<number> {\r\n let proxyHandle: ProxyHandle;\r\n try {\r\n proxyHandle = await startProxyCatalog(catalogRoutes, startingRoute.aliasId, trace);\r\n p.log.info(\r\n `Switch menu active — proxy on port ${proxyHandle.port} ` +\r\n pc.dim(`(${catalogRoutes.length} model${catalogRoutes.length !== 1 ? 's' : ''} in /model)`),\r\n );\r\n } catch (err) {\r\n p.log.error(`Failed to start proxy: ${err instanceof Error ? err.message : String(err)}`);\r\n return 1;\r\n }\r\n\r\n const childEnv = buildChildEnv(\r\n `http://127.0.0.1:${proxyHandle.port}`,\r\n startingRoute.aliasId,\r\n proxyHandle.token,\r\n proxyHandle.port,\r\n contextWindow,\r\n true,\r\n );\r\n\r\n const debugLogPath = prepareClaudeTraceLog();\r\n const traceArgs = trace ? ['--debug-file', debugLogPath] : [];\r\n if (trace) p.log.info(`Debug log: ${debugLogPath}`);\r\n\r\n const exitCode = await launchClaude(\r\n childEnv,\r\n claudeCodeClientModelId(startingRoute.aliasId, contextWindow),\r\n [...traceArgs, ...claudeArgs],\r\n );\r\n proxyHandle.close();\r\n if (trace) printTraceLog(debugLogPath);\r\n return exitCode;\r\n}\r\n\r\nfunction printDryRun(\r\n backendName: string,\r\n modelId: string,\r\n baseUrl: string,\r\n modelFormat: ModelFormat,\r\n claudeArgs: string[],\r\n conflicts: Array<{ name: string; value: string }>,\r\n disableExperimentalBetas: boolean,\r\n npm?: string,\r\n): void {\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(' DRY RUN — would execute:')));\r\n console.log('');\r\n\r\n const claudeCmd = ['claude', '--model', modelId, ...claudeArgs].join(' ');\r\n console.log(` ${pc.bold('Command:')} ${claudeCmd}`);\r\n console.log(` ${pc.bold('Backend:')} ${backendName}`);\r\n if (modelFormat === 'openai') {\r\n console.log(` ${pc.bold('Proxy:')} would start local SDK adapter proxy ${pc.dim('(Vercel AI SDK)')}`);\r\n if (npm) console.log(` ${pc.dim(`npm: ${npm}`)}`);\r\n }\r\n console.log('');\r\n\r\n console.log(` ${pc.bold('Env vars SET:')}`);\r\n if (modelFormat === 'openai') {\r\n console.log(` ANTHROPIC_BASE_URL=http://127.0.0.1:<port> ${pc.dim('(local proxy)')}`);\r\n } else {\r\n console.log(` ANTHROPIC_BASE_URL=${baseUrl}`);\r\n }\r\n console.log(` ANTHROPIC_API_KEY=<your OPENCODE_API_KEY>`);\r\n console.log(` ANTHROPIC_MODEL=${modelId}`);\r\n if (disableExperimentalBetas) {\r\n console.log(` CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 ${pc.dim('(direct upstream — strips beta headers)')}`);\r\n } else {\r\n console.log(` ${pc.dim('(experimental betas enabled — tool search via local proxy)')}`);\r\n }\r\n console.log(` ENABLE_TOOL_SEARCH=true ${pc.dim('(defer MCP tools like native Claude Code)')}`);\r\n console.log(` CLAUDE_CODE_SIMPLE_SYSTEM_PROMPT=0 ${pc.dim('(keep full system prompt on proxy routes)')}`);\r\n console.log('');\r\n\r\n if (conflicts.length > 0) {\r\n console.log(` ${pc.bold('Env vars REMOVED:')}`);\r\n for (const c of conflicts) {\r\n console.log(` ${pc.dim(c.name)}=${pc.dim(c.value)}`);\r\n }\r\n console.log('');\r\n }\r\n\r\n console.log(pc.dim(' (dry run complete — Claude Code was NOT launched)'));\r\n console.log('');\r\n}\r\n\r\nconst AGY_CLI_FAVORITES_CAP = 6;\r\n\r\ninterface FavoritesCommandOptions {\r\n scope?: 'global' | 'agy';\r\n}\r\n\r\nexport async function runModelsCommand(opts: FavoritesCommandOptions = {}): Promise<number> {\r\n const scope = opts.scope ?? 'global';\r\n const maxFavorites = scope === 'agy' ? AGY_CLI_FAVORITES_CAP : MAX_MODEL_CATALOG;\r\n const scopeName = scope === 'agy' ? 'Antigravity CLI Favorites' : 'Favorite Models';\r\n const configKey = scope === 'agy' ? 'antigravityCliFavoriteModels' : 'favoriteModels';\r\n gateIntro(scopeName);\r\n\r\n const spinner = p.spinner();\r\n spinner.start('Loading providers...');\r\n\r\n const catalog = await fetchProviderCatalog();\r\n spinner.stop('');\r\n\r\n const allProviders = scope === 'agy'\r\n ? providersForTarget(providersForPicker(catalog), 'antigravity')\r\n : providersForPicker(catalog);\r\n const favoriteProviders = allProviders.map(provider => ({\r\n ...provider,\r\n name: favoriteProviderDisplayName(provider),\r\n }));\r\n\r\n if (favoriteProviders.length === 0) {\r\n p.log.warn('No providers found.');\r\n p.log.info(`${pc.dim('OpenCode Zen/Go is always available. Add providers with ')}${pc.cyan('anygate providers')}${pc.dim('.')}`);\r\n gateOutro('Done');\r\n return 0;\r\n }\r\n\r\n // Build a flat name lookup: \"providerId:modelId\" → display label\r\n const modelLookup = new Map<string, { modelName: string; providerName: string }>();\r\n for (const ap of favoriteProviders) {\r\n for (const m of ap.models) {\r\n modelLookup.set(`${ap.id}:${m.id}`, { modelName: m.name || m.id, providerName: ap.name });\r\n }\r\n }\r\n\r\n const prefs = loadPreferences();\r\n let favorites = scope === 'agy'\r\n ? prefs.antigravityCliFavoriteModels ?? []\r\n : prefs.favoriteModels ?? [];\r\n let favoritesDirty = false;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n type MenuChoice = string;\r\n const options: Array<{ value: MenuChoice; label: string; hint: string }> = [];\r\n\r\n // One entry per saved favorite; selecting it removes it\r\n for (let i = 0; i < favorites.length; i++) {\r\n const fav = favorites[i]!;\r\n const entry = modelLookup.get(`${fav.providerId}:${fav.modelId}`);\r\n const label = entry\r\n ? `${fmtEnabledStar(true)} ${fmtModel(entry.modelName)} ${pc.dim(`(${entry.providerName})`)}`\r\n : pc.dim(`★ ${fav.modelId} — provider gone`);\r\n options.push({ value: `fav-${i}`, label, hint: 'select to remove' });\r\n }\r\n\r\n const atCap = favorites.length >= maxFavorites;\r\n options.push({\r\n value: '__add__',\r\n label: atCap ? pc.dim(`+ Add a model → (limit of ${maxFavorites} reached)`) : pc.cyan('+ Add a model →'),\r\n hint: atCap\r\n ? 'Remove a favorite first to make room'\r\n : `${allProviders.length} provider${allProviders.length !== 1 ? 's' : ''} available`,\r\n });\r\n options.push({ value: '__done__', label: 'Done', hint: '' });\r\n\r\n const header = favorites.length === 0\r\n ? `${scopeName} (0/${maxFavorites})`\r\n : `${scopeName} (${favorites.length}/${maxFavorites}) — select to remove`;\r\n\r\n const choice = await p.select<string>({\r\n message: header,\r\n options,\r\n initialValue: '__done__',\r\n });\r\n\r\n if (p.isCancel(choice) || choice === '__done__') break;\r\n\r\n if (choice === '__add__') {\r\n if (atCap) {\r\n p.log.warn(`Limit of ${maxFavorites} favorites reached — remove one first.`);\r\n continue;\r\n }\r\n\r\n const globalCount = buildGlobalFavoriteIndex(favoriteProviders).length;\r\n const addPath = await p.select<string>({\r\n message: 'Add a favorite',\r\n options: [\r\n {\r\n value: 'global',\r\n label: pc.cyan('Search all providers'),\r\n hint: `${globalCount} models · ${favoriteProviders.length} provider${favoriteProviders.length !== 1 ? 's' : ''}`,\r\n },\r\n {\r\n value: 'free',\r\n label: pc.cyan('Search free models'),\r\n hint: `${buildGlobalFavoriteIndex(favoriteProviders).filter(e => e.model.isFree || e.model.freeStatus === 'verified_free' || e.model.freeStatus === 'free_provider').length} free/free-access models`,\r\n },\r\n {\r\n value: 'provider',\r\n label: pc.cyan('Browse by provider →'),\r\n hint: 'Pick one provider first',\r\n },\r\n ],\r\n });\r\n if (p.isCancel(addPath)) continue;\r\n\r\n let provider: LocalProvider | undefined;\r\n let browsedMultiple: LocalProviderModel[] = [];\r\n\r\n if (addPath === 'global') {\r\n const globalPick = await pickGlobalFavoriteModel(favoriteProviders, favorites);\r\n if (globalPick === null) continue;\r\n if (globalPick !== browseByProviderChoice) {\r\n provider = favoriteProviders.find(ap => ap.id === globalPick.providerId);\r\n browsedMultiple = [globalPick.model];\r\n }\r\n }\r\n if (addPath === 'free') {\r\n const globalPick = await pickGlobalFavoriteModel(favoriteProviders, favorites, { freeOnly: true });\r\n if (globalPick === null) continue;\r\n if (globalPick !== browseByProviderChoice) {\r\n provider = favoriteProviders.find(ap => ap.id === globalPick.providerId);\r\n browsedMultiple = [globalPick.model];\r\n }\r\n }\r\n\r\n if (browsedMultiple.length === 0) {\r\n let currentInitialProvider: string | undefined = undefined;\r\n while (true) {\r\n const providerOptions = favoriteProviders.map(ap => providerSelectOption(ap));\r\n const pickedProviderId: string | symbol = await p.select({\r\n message: 'Which provider?',\r\n options: providerOptions,\r\n initialValue: currentInitialProvider,\r\n });\r\n if (p.isCancel(pickedProviderId)) break;\r\n\r\n provider = favoriteProviders.find(ap => ap.id === pickedProviderId)!;\r\n \r\n const options = provider.models.map(m => {\r\n const favorited = isFavorite(favorites, { providerId: provider!.id, modelId: m.id });\r\n const label = formatModelLabel(m);\r\n return {\r\n value: m.id,\r\n label: fmtModel(label, m.id),\r\n hint: favorited ? pc.yellow('★ already favorite') : '',\r\n };\r\n });\r\n\r\n const pickedModelIds = await p.multiselect({\r\n message: `Select models to add from ${provider.name} ${pc.dim('(Space to select, Enter to confirm)')}`,\r\n options,\r\n required: false,\r\n });\r\n\r\n if (p.isCancel(pickedModelIds)) {\r\n currentInitialProvider = provider.id;\r\n continue;\r\n }\r\n\r\n if (pickedModelIds.length === 0) {\r\n currentInitialProvider = provider.id;\r\n continue;\r\n }\r\n\r\n browsedMultiple = provider.models.filter(m => (pickedModelIds as string[]).includes(m.id));\r\n break;\r\n }\r\n if (browsedMultiple.length === 0) continue;\r\n }\r\n\r\n const addedModels: LocalProviderModel[] = [];\r\n let duplicateCount = 0;\r\n let limitReached = false;\r\n\r\n for (const model of browsedMultiple) {\r\n const fav: FavoriteModel = { providerId: provider!.id, modelId: model.id };\r\n const result = addFavorite(favorites, fav, maxFavorites);\r\n if (!result.ok) {\r\n if (result.reason === 'duplicate') {\r\n duplicateCount++;\r\n } else {\r\n limitReached = true;\r\n break;\r\n }\r\n } else {\r\n favorites = result.list;\r\n favoritesDirty = true;\r\n addedModels.push(model);\r\n }\r\n }\r\n\r\n if (addedModels.length > 0) {\r\n if (addedModels.length === 1) {\r\n const modelName = addedModels[0].name || addedModels[0].id;\r\n p.log.success(`Added ${modelName} (${provider!.name}) to favorites.`);\r\n } else {\r\n p.log.success(`Added ${addedModels.length} models from ${provider!.name} to favorites.`);\r\n }\r\n }\r\n if (duplicateCount > 0) {\r\n p.log.warn(`${duplicateCount} selected model(s) were already in your favorites.`);\r\n }\r\n if (limitReached) {\r\n p.log.warn(`Limit of ${maxFavorites} favorites reached — some selected models could not be added.`);\r\n }\r\n } else if ((choice as string).startsWith('fav-')) {\r\n const idx = parseInt((choice as string).slice(4), 10);\r\n const fav = favorites[idx]!;\r\n const entry = modelLookup.get(`${fav.providerId}:${fav.modelId}`);\r\n const label = entry ? `${entry.modelName} (${entry.providerName})` : fav.modelId;\r\n const confirmed = await p.confirm({ message: `Remove ${label} from favorites?` });\r\n if (p.isCancel(confirmed) || !confirmed) continue;\r\n favorites = removeFavorite(favorites, fav);\r\n favoritesDirty = true;\r\n p.log.success(`Removed ${label} from favorites.`);\r\n }\r\n }\r\n\r\n if (favoritesDirty) {\r\n savePreferences({ [configKey]: favorites });\r\n }\r\n\r\n const favLabel = scope === 'agy' ? 'Antigravity CLI ' : '';\r\n gateOutro(\r\n favorites.length === 0\r\n ? `No ${favLabel}favorites saved`\r\n : `${favorites.length} ${favLabel}favorite${favorites.length !== 1 ? 's' : ''} saved`,\r\n favorites.length === 0\r\n ? pc.dim('Launch uses single-model mode')\r\n : pc.cyan('/model menu ready on next launch'),\r\n );\r\n return 0;\r\n}\r\n\r\nexport async function runClaudeCommand(parsed: ParsedArgs): Promise<number> {\r\n const { dryRun, setup, trace, launchProvider, launchModel } = parsed;\r\n const claudeArgs = normalizeClaudeAgentArgs(parsed.claudeArgs);\r\n const agentStdout = wantsCleanAgentStdout('claude', claudeArgs);\r\n setAgentStdoutMode(agentStdout);\r\n\r\n // Prerequisite: claude binary\r\n const claudePath = findClaudeBinary();\r\n if (!claudePath) {\r\n console.error(pc.red('\\nError: claude binary not found on PATH.\\n'));\r\n console.error('Install Claude Code:');\r\n console.error(' npm install -g @anthropic-ai/claude-code\\n');\r\n return 1;\r\n }\r\n\r\n const prefs = dryRun ? {} as ReturnType<typeof loadPreferences> : loadPreferences();\r\n const conflicts = detectConflicts();\r\n\r\n const favorites = dryRun ? [] : (prefs.favoriteModels ?? []);\r\n const launchPlan = planLaunchWizard({\r\n explicit: { providerId: launchProvider, modelId: launchModel },\r\n childArgs: claudeArgs,\r\n agent: 'claude',\r\n prefs,\r\n });\r\n if (launchPlan.error) {\r\n console.error(pc.red(`\\nError: ${launchPlan.error}\\n`));\r\n return 1;\r\n }\r\n const switchMenuActive = favorites.length > 0 && !launchPlan.skip;\r\n\r\n if (!agentStdout) gateIntro('Claude Code');\r\n\r\n if (setup && !dryRun && !agentStdout) {\r\n p.log.info('Provider setup now lives in anygate providers — opening that next is recommended.');\r\n }\r\n\r\n if (!dryRun && await needsFirstRunSetup()) {\r\n const firstRun = await runFirstRunWizard(trace);\r\n if (firstRun === 'cancel') return 0;\r\n }\r\n\r\n let catalog: Awaited<ReturnType<typeof fetchProviderCatalog>>;\r\n if (agentStdout) {\r\n try {\r\n catalog = await fetchProviderCatalog();\r\n } catch (err) {\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n } else {\r\n const catalogSpinner = p.spinner();\r\n catalogSpinner.start('Loading your providers...');\r\n try {\r\n catalog = await fetchProviderCatalog();\r\n } catch (err) {\r\n catalogSpinner.stop('');\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n catalogSpinner.stop('');\r\n }\r\n\r\n const allProviders = providersForTarget(providersForPicker(catalog), 'claude');\r\n if (allProviders.length === 0) {\r\n p.log.warn('No providers available.');\r\n p.log.info(pc.dim('Run anygate providers add or import to get started.'));\r\n return 0;\r\n }\r\n\r\n const providerOptions = allProviders.map(lp => providerSelectOption(lp));\r\n\r\n if (switchMenuActive) {\r\n providerOptions.unshift({\r\n value: '__favorites__',\r\n label: '⭐ Favorites Catalog',\r\n hint: `${favorites.length} saved favorites`,\r\n });\r\n }\r\n\r\n const initialProvider =\r\n prefs.lastProvider && providerOptions.some(o => o.value === prefs.lastProvider)\r\n ? prefs.lastProvider\r\n : providerOptions[0]!.value;\r\n\r\n let activeProvider: LocalProvider;\r\n let selectedModel: LocalProviderModel;\r\n\r\n if (launchPlan.skip && launchPlan.target) {\r\n const resolved = findProviderAndModel(allProviders, launchPlan.target);\r\n if (!resolved) {\r\n p.log.error(\r\n `Provider/model not found: ${launchPlan.target.providerId} / ${launchPlan.target.modelId}`,\r\n );\r\n return 1;\r\n }\r\n activeProvider = resolved.provider;\r\n selectedModel = resolved.model;\r\n if (!agentStdout) {\r\n p.log.step(`Using ${selectedModel.name || selectedModel.id} (${activeProvider.name})`);\r\n }\r\n if (!dryRun) recordLaunchSelection('claude', activeProvider.id, selectedModel.id, prefs);\r\n } else {\r\n let currentInitialProvider = initialProvider;\r\n while (true) {\r\n const chosen = await p.select<string>({\r\n message: 'Which provider?',\r\n options: providerOptions,\r\n initialValue: currentInitialProvider,\r\n });\r\n\r\n if (p.isCancel(chosen)) {\r\n p.cancel('Cancelled.');\r\n return 0;\r\n }\r\n\r\n const providerChoice = chosen as string;\r\n\r\n if (providerChoice === '__favorites__') {\r\n const available: Array<{ provider: LocalProvider; model: LocalProviderModel }> = [];\r\n for (const fav of favorites) {\r\n const prov = allProviders.find(lp => lp.id === fav.providerId);\r\n const mod = prov?.models.find(m => m.id === fav.modelId);\r\n if (prov && mod) available.push({ provider: prov, model: mod });\r\n }\r\n if (available.length === 0) {\r\n p.log.warn('No saved favorites are currently available.');\r\n return 0;\r\n }\r\n const favOptions = available.map((f, i) => ({\r\n value: String(i),\r\n label: `${f.model.name || f.model.id} — ${f.provider.name}`,\r\n hint: f.model.id,\r\n }));\r\n const pickedIdx = await p.select<string>({\r\n message: 'Starting model?',\r\n options: favOptions,\r\n initialValue: '0',\r\n });\r\n if (p.isCancel(pickedIdx)) { p.cancel('Cancelled.'); return 0; }\r\n const sel = available[Number(pickedIdx)]!;\r\n activeProvider = sel.provider;\r\n selectedModel = sel.model;\r\n if (!dryRun) recordLaunchSelection('claude', activeProvider.id, selectedModel.id, prefs);\r\n break;\r\n } else {\r\n activeProvider = allProviders.find(lp => lp.id === providerChoice)!;\r\n const pickedModelResult = await pickLocalModel(activeProvider, conflicts, prefs);\r\n if (pickedModelResult === 'back') {\r\n currentInitialProvider = activeProvider.id;\r\n continue;\r\n }\r\n if (!pickedModelResult) return 0;\r\n selectedModel = pickedModelResult;\r\n\r\n if (!dryRun) recordLaunchSelection('claude', activeProvider.id, selectedModel.id, prefs);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const localProviders = catalog.length > 0 ? catalog : null;\r\n if (switchMenuActive) {\r\n const resolveRoute = makeRouteResolver(\r\n localProviders,\r\n );\r\n const startingRoute = resolveRoute(activeProvider.id, selectedModel.id) ?? null;\r\n if (!startingRoute) {\r\n p.log.error('Could not resolve a proxy route for the selected model.');\r\n return 1;\r\n }\r\n const { routes: catalogRoutes, droppedFavorites } = buildCatalogRoutes(startingRoute, favorites, resolveRoute);\r\n if (droppedFavorites.length > 0) {\r\n p.log.warn(\r\n `Skipping ${droppedFavorites.length} favorite${droppedFavorites.length === 1 ? '' : 's'} `\r\n + 'that are no longer available in /model',\r\n );\r\n }\r\n\r\n if (dryRun) {\r\n const endpoint = selectedModel.baseUrl ?? selectedModel.completionsUrl ?? '(unknown)';\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(' DRY RUN — would execute (switch-menu mode):')));\r\n console.log('');\r\n console.log(` ${pc.bold('Provider:')} ${activeProvider.name}`);\r\n console.log(` ${pc.bold('Starting model:')} ${selectedModel.id}`);\r\n console.log(` ${pc.bold('Endpoint:')} ${endpoint}`);\r\n console.log(` ${pc.bold('/model catalog:')} ${catalogRoutes.length} model(s)`);\r\n catalogRoutes.forEach(r => console.log(` ${pc.dim(r.displayName)}`));\r\n console.log('');\r\n console.log(pc.dim(' (dry run complete — Claude Code was NOT launched)'));\r\n console.log('');\r\n return 0;\r\n }\r\n\r\n return launchClaudeViaCatalog(\r\n catalogRoutes,\r\n startingRoute,\r\n selectedModel.contextWindow,\r\n trace,\r\n claudeArgs,\r\n );\r\n }\r\n\r\n // ── Single-model path ──\r\n\r\n if (dryRun) {\r\n const formatDesc = selectedModel.modelFormat === 'anthropic'\r\n ? 'direct passthrough'\r\n : 'via SDK adapter proxy';\r\n const endpoint = selectedModel.modelFormat === 'anthropic'\r\n ? (selectedModel.baseUrl ?? '(unknown)')\r\n : (selectedModel.npm ?? 'SDK');\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(' DRY RUN — would execute:')));\r\n console.log('');\r\n console.log(` ${pc.bold('Provider:')} ${activeProvider.name}`);\r\n console.log(` ${pc.bold('Model:')} ${selectedModel.id}`);\r\n console.log(` ${pc.bold('Format:')} ${selectedModel.modelFormat} (${formatDesc})`);\r\n console.log(` ${pc.bold(selectedModel.modelFormat === 'anthropic' ? 'Endpoint:' : 'SDK npm:')} ${endpoint}`);\r\n console.log(` ${pc.bold('Key:')} ${activeProvider.name} provider key`);\r\n console.log('');\r\n console.log(pc.dim(' (dry run complete — Claude Code was NOT launched)'));\r\n console.log('');\r\n return 0;\r\n }\r\n\r\n const launchApiKey = await resolveLocalProviderApiKey(activeProvider);\r\n if (!launchApiKey?.trim()) {\r\n p.log.error(\r\n `No credential found for ${activeProvider.name}. Add a key with anygate providers or set OPENCODE_API_KEY.`,\r\n );\r\n return 1;\r\n }\r\n\r\n let proxyHandle: ProxyHandle | null = null;\r\n let childEnv: NodeJS.ProcessEnv;\r\n\r\n const isAntigravityOAuth = activeProvider.id === 'antigravity' && activeProvider.authType === 'oauth';\r\n const isOAuthAnthropic = selectedModel.modelFormat === 'anthropic' && activeProvider.authType === 'oauth' && !isAntigravityOAuth;\r\n\r\n if (isAntigravityOAuth) {\r\n // Antigravity OAuth — proxy translates Anthropic → Cloud Code Assist format.\r\n try {\r\n proxyHandle = await startProxy(\r\n ANTIGRAVITY_BASE_URLS[0],\r\n selectedModel.id,\r\n trace,\r\n selectedModel.contextWindow,\r\n {\r\n providerId: activeProvider.id,\r\n authType: 'oauth',\r\n providerData: activeProvider.providerData,\r\n modelFormat: 'cloud-code',\r\n },\r\n launchApiKey,\r\n );\r\n if (!isAgentStdoutMode()) p.log.info(`Cloud Code proxy started on port ${proxyHandle.port}`);\r\n } catch (err) {\r\n p.log.error(`Failed to start Cloud Code proxy: ${err instanceof Error ? err.message : String(err)}`);\r\n return 1;\r\n }\r\n childEnv = buildChildEnv(\r\n `http://127.0.0.1:${proxyHandle.port}`,\r\n selectedModel.id,\r\n proxyHandle.token,\r\n proxyHandle.port,\r\n selectedModel.contextWindow,\r\n );\r\n } else if (isOAuthAnthropic) {\r\n // Claude Code OAuth — proxy injects compatibility metadata and Bearer auth.\r\n try {\r\n proxyHandle = await startProxy(\r\n selectedModel.baseUrl ?? 'https://api.anthropic.com',\r\n selectedModel.id,\r\n trace,\r\n selectedModel.contextWindow,\r\n {\r\n providerId: activeProvider.id,\r\n authType: 'oauth',\r\n oauthAccountId: activeProvider.oauthAccountId,\r\n providerData: activeProvider.providerData,\r\n modelFormat: 'anthropic',\r\n },\r\n launchApiKey,\r\n );\r\n if (!isAgentStdoutMode()) p.log.info(`OAuth proxy started on port ${proxyHandle.port}`);\r\n } catch (err) {\r\n p.log.error(`Failed to start OAuth proxy: ${err instanceof Error ? err.message : String(err)}`);\r\n return 1;\r\n }\r\n childEnv = buildChildEnv(\r\n `http://127.0.0.1:${proxyHandle.port}`,\r\n selectedModel.id,\r\n proxyHandle.token,\r\n proxyHandle.port,\r\n selectedModel.contextWindow,\r\n );\r\n } else if (selectedModel.modelFormat === 'anthropic') {\r\n childEnv = buildChildEnv(\r\n selectedModel.baseUrl!,\r\n selectedModel.id,\r\n launchApiKey,\r\n undefined,\r\n selectedModel.contextWindow,\r\n );\r\n } else {\r\n try {\r\n proxyHandle = await startProxy(\r\n selectedModel.completionsUrl ?? '',\r\n selectedModel.id,\r\n trace,\r\n selectedModel.contextWindow,\r\n {\r\n npm: selectedModel.npm,\r\n baseURL: selectedModel.apiBaseUrl,\r\n upstreamModelId: selectedModel.upstreamModelId,\r\n providerId: activeProvider.id,\r\n authType: activeProvider.authType,\r\n oauthAccountId: activeProvider.oauthAccountId,\r\n supportedParameters: selectedModel.supportedParameters,\r\n reasoning: selectedModel.reasoning,\r\n interleavedReasoningField: selectedModel.interleavedReasoningField,\r\n useResponsesLite: selectedModel.useResponsesLite,\r\n preferWebSockets: selectedModel.preferWebSockets,\r\n },\r\n launchApiKey,\r\n );\r\n if (!isAgentStdoutMode()) {\r\n p.log.info(\r\n `SDK adapter proxy started on port ${proxyHandle.port}` +\r\n (selectedModel.npm ? pc.dim(` (${selectedModel.npm})`) : ''),\r\n );\r\n }\r\n } catch (err) {\r\n p.log.error(`Failed to start SDK adapter proxy: ${err instanceof Error ? err.message : String(err)}`);\r\n return 1;\r\n }\r\n childEnv = buildChildEnv(\r\n `http://127.0.0.1:${proxyHandle.port}`,\r\n selectedModel.id,\r\n proxyHandle.token,\r\n proxyHandle.port,\r\n selectedModel.contextWindow,\r\n );\r\n }\r\n\r\n if (selectedModel.modelFormat === 'anthropic' && !isOAuthAnthropic) {\r\n childEnv['CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS'] = '1';\r\n }\r\n\r\n const debugLogPath = prepareClaudeTraceLog();\r\n const traceArgs = trace ? ['--debug-file', debugLogPath] : [];\r\n if (trace) p.log.info(`Debug log: ${debugLogPath}`);\r\n\r\n const exitCode = await launchClaude(\r\n childEnv,\r\n claudeCodeClientModelId(selectedModel.id, selectedModel.contextWindow),\r\n [...traceArgs, ...claudeArgs],\r\n );\r\n proxyHandle?.close();\r\n if (trace) printTraceLog(debugLogPath);\r\n return exitCode;\r\n}\r\n\r\nexport async function main(args: string[] = process.argv.slice(2)): Promise<number> {\r\n const parsed = parseArgs(args);\r\n\r\n if (process.stdout.isTTY) {\r\n printAsciiBanner();\r\n const update = await checkForUpdates();\r\n if (update.updateAvailable && update.latestVersion) {\r\n console.log(`\\n${formatUpdateNotification(update.currentVersion, update.latestVersion)}\\n`);\r\n }\r\n }\r\n\r\n if (parsed.error) {\r\n console.error(pc.red(`\\nError: ${parsed.error}\\n`));\r\n printHelp(rootHelpText());\r\n return 1;\r\n }\r\n\r\n if (!parsed.showVersion && !parsed.showAi) {\r\n refreshModelsDevCacheAsync();\r\n }\r\n\r\n if (parsed.command === 'root') {\r\n if (parsed.showAi) {\r\n if (parsed.aiInstall) {\r\n return printAiInstallResult(installAiDoc({ force: parsed.aiInstallForce }));\r\n }\r\n console.log(generateAiDoc());\r\n return 0;\r\n }\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n } else {\r\n printHelp(rootHelpText());\r\n }\r\n return 0;\r\n }\r\n\r\n if (parsed.command === 'server') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n printHelp(serverHelpText());\r\n return 0;\r\n }\r\n return runServerCommand({\r\n vertex: parsed.vertex,\r\n quick: parsed.serverQuick,\r\n listenMode: parsed.serverListenMode,\r\n providersMode: parsed.serverProvidersMode,\r\n providerIds: parsed.serverProviderIds,\r\n freeOnly: parsed.serverFreeOnly,\r\n maskGatewayIds: parsed.serverMaskGatewayIds,\r\n password: parsed.serverPassword,\r\n });\r\n }\r\n\r\n if (parsed.command === 'ui') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n console.log('Usage: anygate ui [--trace]\\n\\nOpen the settings UI in your browser.');\r\n return 0;\r\n }\r\n const { runUiCommand } = await import('./ui/command.js');\r\n return runUiCommand({ trace: parsed.trace });\r\n }\r\n\r\n if (parsed.command === 'models') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n printHelp(modelsHelpText());\r\n return 0;\r\n }\r\n return runModelsCommand({ scope: parsed.favoritesAgy ? 'agy' : 'global' });\r\n }\r\n\r\n if (parsed.command === 'providers') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n printHelp(providersHelpText());\r\n return 0;\r\n }\r\n if (parsed.trace) {\r\n process.env.ANYGATE_TRACE = '1';\r\n }\r\n return runProvidersCommand(parsed.claudeArgs);\r\n }\r\n\r\n if (parsed.command === 'codex-app') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n return runCodexAppCommand(parsed.claudeArgs, { vertex: parsed.vertex, launchProvider: parsed.launchProvider, launchModel: parsed.launchModel });\r\n }\r\n\r\n if (parsed.command === 'claude-app') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n return runClaudeAppCommand(parsed.claudeArgs, { launchProvider: parsed.launchProvider, launchModel: parsed.launchModel });\r\n }\r\n\r\n if (parsed.command === 'codex') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n console.log(codexHelpText());\r\n return 0;\r\n }\r\n return runCodexCommand(parsed.claudeArgs, parsed.trace, {\r\n launchProvider: parsed.launchProvider,\r\n launchModel: parsed.launchModel,\r\n vertex: parsed.vertex,\r\n });\r\n }\r\n\r\n if (parsed.command === 'gemini') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n console.log(geminiHelpText());\r\n return 0;\r\n }\r\n return runGeminiCommand(parsed.claudeArgs, parsed.trace, {\r\n launchProvider: parsed.launchProvider,\r\n launchModel: parsed.launchModel,\r\n });\r\n }\r\n\r\n if (parsed.command === 'agy') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n console.log(antigravityCliHelpText());\r\n return 0;\r\n }\r\n return runAgyCommand(parsed.claudeArgs, parsed.trace, {\r\n launchProvider: parsed.launchProvider,\r\n launchModel: parsed.launchModel,\r\n });\r\n }\r\n\r\n if (parsed.command === 'antigravity') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n console.log(antigravityAppHelpText());\r\n return 0;\r\n }\r\n return runAntigravityAppCommand(parsed.claudeArgs, parsed.trace, {\r\n launchProvider: parsed.launchProvider,\r\n launchModel: parsed.launchModel,\r\n });\r\n }\r\n\r\n if (parsed.command === 'antigravity-ide') {\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n console.log(antigravityIdeHelpText());\r\n return 0;\r\n }\r\n return runAntigravityIdeCommand(parsed.claudeArgs, parsed.trace, {\r\n launchProvider: parsed.launchProvider,\r\n launchModel: parsed.launchModel,\r\n });\r\n }\r\n\r\n if (parsed.showVersion) {\r\n console.log(VERSION);\r\n return 0;\r\n }\r\n if (parsed.showHelp) {\r\n printHelp(claudeHelpText());\r\n return 0;\r\n }\r\n\r\n return runClaudeCommand(parsed);\r\n}\r\n\r\nfunction isCliEntryPoint(): boolean {\r\n if (!process.argv[1]) return false;\r\n try {\r\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nif (isCliEntryPoint()) {\r\n main().then((exitCode) => {\r\n process.exit(exitCode);\r\n }).catch((err: unknown) => {\r\n if (err === Symbol.for('clack:cancel')) {\r\n process.exit(0);\r\n }\r\n console.error(pc.red('\\nUnexpected error:'), err);\r\n process.exit(1);\r\n });\r\n}\r\n","// src/first-run.ts — inline first-run setup for anygate claude (never dead-end)\r\n\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport { printWelcomePanel } from '../../../src/agents/shared/ui.js';\r\nimport {\r\n upgradeGlobalOpencodeCredential,\r\n readGlobalOpencodeCredential,\r\n} from '../../../src/core/env.js';\r\nimport { findOpencodeBinary } from '../../../src/providers/opencode-serve.js';\r\nimport { zenRegistryStub } from '../../../src/registry/builtins.js';\r\nimport { importFromOpencode } from '../../../src/registry/import-opencode.js';\r\nimport { loadRegistry, saveRegistry } from '../../../src/registry/io.js';\r\nimport { resolveOrCollectApiKey } from './key-setup.js';\r\n\r\nexport type FirstRunResult = 'continue' | 'cancel';\r\n\r\n/** True when the user has no registry entries and no Zen/Go API key configured. */\r\nexport async function needsFirstRunSetup(): Promise<boolean> {\r\n const registry = loadRegistry();\r\n if (registry.providers.length > 0) return false;\r\n const key = await readGlobalOpencodeCredential();\r\n return !key;\r\n}\r\n\r\nfunction ensureZenRegistryStub(): void {\r\n const registry = loadRegistry();\r\n if (registry.providers.some(pr => pr.id === 'zen')) return;\r\n registry.providers.push(zenRegistryStub('free'));\r\n saveRegistry(registry);\r\n}\r\n\r\n/** Inline welcome wizard — every path should end with continue (launch) or explicit cancel. */\r\nexport async function runFirstRunWizard(trace = false): Promise<FirstRunResult> {\r\n printWelcomePanel();\r\n\r\n const hasOpencode = findOpencodeBinary() !== null;\r\n const options: Array<{ value: string; label: string; hint: string }> = [\r\n {\r\n value: 'zen',\r\n label: pc.cyan('Quick start with OpenCode Zen (free)'),\r\n hint: 'Enter your API key and pick a model — launches Claude Code',\r\n },\r\n {\r\n value: 'providers',\r\n label: pc.cyan('Set up your own AI provider'),\r\n hint: hasOpencode\r\n ? 'Import providers you configured in OpenCode'\r\n : 'Import from OpenCode or add providers via anygate providers',\r\n },\r\n ];\r\n if (hasOpencode) {\r\n options.push({\r\n value: 'import',\r\n label: pc.cyan('Bring settings from OpenCode'),\r\n hint: 'One-time import of your OpenCode provider config',\r\n });\r\n }\r\n\r\n const choice = await p.select({\r\n message: 'How do you want to get started?',\r\n options,\r\n });\r\n if (p.isCancel(choice)) {\r\n p.cancel('Cancelled.');\r\n return 'cancel';\r\n }\r\n\r\n if (choice === 'zen') {\r\n const apiKey = await resolveOrCollectApiKey(false, trace);\r\n if (!apiKey) return 'cancel';\r\n await upgradeGlobalOpencodeCredential();\r\n ensureZenRegistryStub();\r\n p.log.success('OpenCode Zen ready — picking a model next.');\r\n return 'continue';\r\n }\r\n\r\n if (choice === 'import' || choice === 'providers') {\r\n if (!hasOpencode && choice === 'import') {\r\n p.log.error('OpenCode CLI not found. Install from https://opencode.ai');\r\n return runFirstRunWizard(trace);\r\n }\r\n\r\n if (!hasOpencode) {\r\n p.log.info('Run anygate providers to add providers, then anygate claude again.');\r\n p.log.info('Quick start with Zen is the fastest path if you have an OpenCode API key.');\r\n const retry = await p.select({\r\n message: 'What next?',\r\n options: [\r\n { value: 'zen', label: 'Quick start with OpenCode Zen', hint: '' },\r\n { value: 'cancel', label: 'Cancel', hint: '' },\r\n ],\r\n });\r\n if (p.isCancel(retry) || retry === 'cancel') return 'cancel';\r\n return runFirstRunWizard(trace);\r\n }\r\n\r\n const spinner = p.spinner();\r\n spinner.start('Importing from OpenCode...');\r\n const result = await importFromOpencode();\r\n spinner.stop('');\r\n\r\n if (result.error) {\r\n p.log.error(result.error);\r\n return runFirstRunWizard(trace);\r\n }\r\n if (result.imported.length === 0) {\r\n p.log.warn('No providers imported. Configure providers in OpenCode first, or use Quick start with Zen.');\r\n return runFirstRunWizard(trace);\r\n }\r\n\r\n p.log.success(\r\n `Imported ${result.imported.length} provider${result.imported.length === 1 ? '' : 's'}.`,\r\n );\r\n return 'continue';\r\n }\r\n\r\n return 'continue';\r\n}\r\n","// src/registry/validate-import-key.ts — verify OpenCode credentials before import\r\n\r\nimport { fetchAnthropicModels } from './custom-endpoint.js';\r\nimport { fetchTemplateModels } from './fetch-template-models.js';\r\nimport { isLikelyPlaceholderKey } from './refresh-credentials.js';\r\nimport { resolveModelSource } from './model-source.js';\r\nimport { effectiveProviderBaseUrl, resolveProviderTemplate, syntheticTemplate } from './resolve-template.js';\r\nimport { validateCustomEndpointUrl } from './url-security.js';\r\nimport type { RegistryProvider } from './types.js';\r\nimport type { LocalProvider } from '../core/types.js';\r\n\r\nexport type ImportKeySkipReason = 'placeholder-key' | 'invalid-key' | 'untested-manual';\r\n\r\nexport interface ValidateImportKeyResult {\r\n /** When false, the provider must not be added to the registry. */\r\n canImport: boolean;\r\n reason?: ImportKeySkipReason;\r\n detail?: string;\r\n}\r\n\r\nfunction reject(\r\n reason: ImportKeySkipReason,\r\n detail: string,\r\n): ValidateImportKeyResult {\r\n return { canImport: false, reason, detail };\r\n}\r\n\r\nexport async function validateImportKey(\r\n lp: LocalProvider,\r\n entry: RegistryProvider,\r\n): Promise<ValidateImportKeyResult> {\r\n if (entry.authType === 'oauth') {\r\n return { canImport: true };\r\n }\r\n\r\n const key = lp.apiKey?.trim() ?? '';\r\n if (!key) {\r\n return reject('invalid-key', 'No API key in OpenCode config.');\r\n }\r\n\r\n const source = resolveModelSource(entry);\r\n if (source === 'manual-only') {\r\n return reject(\r\n 'untested-manual',\r\n 'Provider uses gcloud/AWS/Azure auth — configure via OpenCode env auth, not API key import.',\r\n );\r\n }\r\n\r\n if (source === 'zen-go-api') {\r\n return { canImport: true };\r\n }\r\n\r\n const placeholder = isLikelyPlaceholderKey(key);\r\n const npm = entry.api.npm ?? lp.models[0]?.npm ?? '@ai-sdk/openai-compatible';\r\n const catalogTemplate = resolveProviderTemplate(entry);\r\n const baseUrl = effectiveProviderBaseUrl(entry, catalogTemplate);\r\n\r\n if (!baseUrl) {\r\n if (placeholder) {\r\n return reject(\r\n 'placeholder-key',\r\n 'OpenCode has a placeholder key and no API URL — provider not imported.',\r\n );\r\n }\r\n return reject('invalid-key', 'No API base URL — cannot verify key.');\r\n }\r\n\r\n let safeBaseUrl = baseUrl;\r\n const configuredUrl = entry.api.url?.trim();\r\n const templateDefault = catalogTemplate?.defaultBaseUrl?.trim();\r\n if (configuredUrl && configuredUrl !== templateDefault) {\r\n const urlCheck = await validateCustomEndpointUrl(baseUrl, {\r\n allowInsecureLocal: catalogTemplate?.apiKeyOptional === true,\r\n });\r\n if (!urlCheck.ok || !urlCheck.normalizedUrl) {\r\n return reject('invalid-key', `${urlCheck.error ?? 'Invalid API base URL.'} ${urlCheck.hint ?? ''}`.trim());\r\n }\r\n safeBaseUrl = urlCheck.normalizedUrl;\r\n }\r\n\r\n if (npm === '@ai-sdk/anthropic') {\r\n const result = await fetchAnthropicModels(safeBaseUrl, key);\r\n if (result.error) {\r\n return reject(\r\n placeholder ? 'placeholder-key' : 'invalid-key',\r\n placeholder\r\n ? 'OpenCode has a placeholder key — API rejected it; provider not imported.'\r\n : result.error,\r\n );\r\n }\r\n return { canImport: true };\r\n }\r\n\r\n const template = catalogTemplate ?? syntheticTemplate(entry, safeBaseUrl);\r\n const result = await fetchTemplateModels(template, key, safeBaseUrl);\r\n if (result.error) {\r\n return reject(\r\n placeholder ? 'placeholder-key' : 'invalid-key',\r\n placeholder\r\n ? 'OpenCode has a placeholder key — API rejected it; provider not imported.'\r\n : result.error,\r\n );\r\n }\r\n\r\n return { canImport: true };\r\n}\r\n","// src/registry/import-opencode.ts — one-shot import from OpenCode serve API\r\n\r\nimport { resolveProviderCredential, saveProviderCredential } from '../core/env.js';\r\nimport { fetchRawOpencodeProviders } from '../providers/opencode-serve.ts';\r\nimport type { LocalProvider } from '../core/types.js';\r\nimport { localProviderToRegistry } from './convert.js';\r\nimport {\r\n buildImportProviderList,\r\n isOAuthImportProvider,\r\n listCredentialSkippedProviders,\r\n type CredentialGapReason,\r\n oauthAuthRef,\r\n type OAuthImportContext,\r\n} from './import-build.js';\r\nimport { loadRegistry, saveRegistry } from './io.js';\r\nimport { upgradeLegacyCloudProviders } from './upgrade.js';\r\nimport { readOpencodeAuthFile, oauthCredentialToKeychainJson } from './opencode-auth.js';\r\nimport type { RegistryProvider } from './types.js';\r\nimport { isValidProviderId } from './validate.js';\r\nimport {\r\n type ImportKeySkipReason,\r\n validateImportKey,\r\n} from './validate-import-key.js';\r\n\r\nexport type ImportSkipReason =\r\n | 'invalid-id'\r\n | 'no-models'\r\n | 'convert-failed'\r\n | 'user-skipped'\r\n | 'conflict-kept'\r\n | 'invalid-key'\r\n | 'placeholder-key'\r\n | 'credential-save-failed'\r\n | CredentialGapReason;\r\n\r\nexport interface ImportKeySkipped {\r\n id: string;\r\n name: string;\r\n reason: ImportKeySkipReason;\r\n detail?: string;\r\n}\r\n\r\nexport interface ImportConflictContext {\r\n existing: RegistryProvider;\r\n incoming: RegistryProvider;\r\n incomingProvider: LocalProvider;\r\n existingKeyHint: string;\r\n incomingKeyHint: string;\r\n}\r\n\r\nexport type ImportConflictChoice = 'keep' | 'import' | 'skip';\r\n\r\nexport interface ImportOpencodeResult {\r\n imported: RegistryProvider[];\r\n skipped: Array<{ id: string; name: string; reason: ImportSkipReason }>;\r\n keysSkipped: ImportKeySkipped[];\r\n keysSaved: number;\r\n oauthImported: number;\r\n authFileWarning?: string;\r\n error?: string;\r\n}\r\n\r\nexport interface ImportOpencodeOptions {\r\n resolveConflict?: (ctx: ImportConflictContext) => Promise<ImportConflictChoice>;\r\n}\r\n\r\nasync function saveProviderKey(provider: LocalProvider): Promise<boolean> {\r\n if (!provider.apiKey?.trim()) return false;\r\n return saveProviderCredential(`keyring:provider:${provider.id}`, provider.apiKey);\r\n}\r\n\r\nasync function saveOAuthKey(providerId: string, oauth: OAuthImportContext): Promise<boolean> {\r\n const cred = oauth.oauthByProviderId.get(providerId);\r\n if (!cred) return false;\r\n return saveProviderCredential(oauthAuthRef(providerId), oauthCredentialToKeychainJson(cred));\r\n}\r\n\r\nfunction importValidationSkipReason(\r\n reason: ImportKeySkipReason | undefined,\r\n): ImportSkipReason {\r\n if (reason === 'untested-manual') return 'manual-only';\r\n if (reason === 'placeholder-key') return 'placeholder-key';\r\n if (reason === 'invalid-key') return 'invalid-key';\r\n return 'no-api-key';\r\n}\r\n\r\nasync function keyHint(\r\n providerId: string,\r\n authRef: string,\r\n opts?: { fallbackKey?: string; oauth?: boolean },\r\n): Promise<string> {\r\n if (opts?.oauth) return 'Signed in via OAuth (OpenCode)';\r\n const fromStore = await resolveProviderCredential(providerId, authRef);\r\n const key = fromStore ?? opts?.fallbackKey ?? '';\r\n if (!key) return 'no key';\r\n if (key.length <= 5) return '····' + key;\r\n return '····' + key.slice(-5);\r\n}\r\n\r\nexport async function importFromOpencode(options: ImportOpencodeOptions = {}): Promise<ImportOpencodeResult> {\r\n const raw = await fetchRawOpencodeProviders();\r\n if (raw === null) {\r\n return {\r\n imported: [],\r\n skipped: [],\r\n keysSkipped: [],\r\n keysSaved: 0,\r\n oauthImported: 0,\r\n error: 'OpenCode CLI not found or failed to start. Install from https://opencode.ai',\r\n };\r\n }\r\n\r\n const authFile = readOpencodeAuthFile();\r\n const authEntries = authFile?.entries ?? {};\r\n const { providers: fetched, oauth } = buildImportProviderList(raw, authEntries);\r\n\r\n const registry = loadRegistry();\r\n upgradeLegacyCloudProviders(registry);\r\n const imported: RegistryProvider[] = [];\r\n const skipped: ImportOpencodeResult['skipped'] = [];\r\n const keysSkipped: ImportKeySkipped[] = [];\r\n let keysSaved = 0;\r\n let oauthImported = 0;\r\n const importedIds = new Set<string>();\r\n\r\n for (const lp of fetched) {\r\n if (!lp.models.length) {\r\n skipped.push({ id: lp.id, name: lp.name, reason: 'no-models' });\r\n continue;\r\n }\r\n\r\n const isOAuth = isOAuthImportProvider(lp.id, oauth);\r\n const entry = localProviderToRegistry(lp, isOAuth\r\n ? { authType: 'oauth', authRef: oauthAuthRef(lp.id) }\r\n : undefined);\r\n if (!entry) {\r\n skipped.push({\r\n id: lp.id,\r\n name: lp.name,\r\n reason: isValidProviderId(lp.id) ? 'convert-failed' : 'invalid-id',\r\n });\r\n continue;\r\n }\r\n\r\n const keyCheck = await validateImportKey(lp, entry);\r\n if (!keyCheck.canImport) {\r\n skipped.push({\r\n id: lp.id,\r\n name: lp.name,\r\n reason: importValidationSkipReason(keyCheck.reason),\r\n });\r\n if (keyCheck.detail) {\r\n keysSkipped.push({\r\n id: lp.id,\r\n name: lp.name,\r\n reason: keyCheck.reason ?? 'invalid-key',\r\n detail: keyCheck.detail,\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n const existingIdx = registry.providers.findIndex(p => p.id === entry.id);\r\n const existing = existingIdx >= 0 ? registry.providers[existingIdx]! : undefined;\r\n\r\n if (existing && options.resolveConflict) {\r\n const choice = await options.resolveConflict({\r\n existing,\r\n incoming: entry,\r\n incomingProvider: lp,\r\n existingKeyHint: await keyHint(existing.id, existing.authRef, { oauth: existing.authType === 'oauth' }),\r\n incomingKeyHint: await keyHint(entry.id, entry.authRef, {\r\n fallbackKey: lp.apiKey,\r\n oauth: isOAuth,\r\n }),\r\n });\r\n\r\n if (choice === 'skip') {\r\n skipped.push({ id: lp.id, name: lp.name, reason: 'user-skipped' });\r\n continue;\r\n }\r\n if (choice === 'keep') {\r\n skipped.push({ id: lp.id, name: lp.name, reason: 'conflict-kept' });\r\n continue;\r\n }\r\n }\r\n\r\n const saved = isOAuth\r\n ? await saveOAuthKey(lp.id, oauth)\r\n : await saveProviderKey(lp);\r\n if (!saved) {\r\n skipped.push({ id: lp.id, name: lp.name, reason: 'credential-save-failed' });\r\n continue;\r\n }\r\n\r\n if (existingIdx >= 0) {\r\n registry.providers[existingIdx] = { ...entry, addedAt: registry.providers[existingIdx]!.addedAt };\r\n } else {\r\n registry.providers.push(entry);\r\n }\r\n imported.push(entry);\r\n importedIds.add(lp.id);\r\n keysSaved += 1;\r\n if (isOAuth) oauthImported += 1;\r\n }\r\n\r\n const alreadyReportedIds = new Set(skipped.map(s => s.id));\r\n const registryProviderIds = new Set(registry.providers.map(p => p.id));\r\n for (const provider of listCredentialSkippedProviders(\r\n raw,\r\n authEntries,\r\n importedIds,\r\n alreadyReportedIds,\r\n registryProviderIds,\r\n )) {\r\n skipped.push({ id: provider.id, name: provider.name, reason: provider.reason });\r\n }\r\n\r\n registry.importedAt = new Date().toISOString();\r\n saveRegistry(registry);\r\n\r\n return {\r\n imported,\r\n skipped,\r\n keysSkipped,\r\n keysSaved,\r\n oauthImported,\r\n authFileWarning: authFile?.permissionWarning,\r\n };\r\n}\r\n","// src/key-setup.ts — interactive OpenCode API key collection and storage\r\n\r\nimport * as p from '@clack/prompts';\r\nimport pc from 'picocolors';\r\nimport { appendFileSync, readFileSync, existsSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { spawnSync } from 'node:child_process';\r\nimport { getClaudeDebugLogPath, writeSecureLogLine } from './trace-log.js';\r\nimport {\r\n GLOBAL_OPENCODE_KEYRING_ACCOUNT,\r\n isSecretServiceAvailable,\r\n readFromCredentialStore,\r\n resolveApiKey,\r\n saveToCredentialStore,\r\n} from '../../../src/core/env.js';\r\nimport { printApiKeyPanel, printDryRunPanel } from './ui.js';\r\n\r\nexport function detectShellProfile(): { display: string; path: string } {\r\n const shell = process.env['SHELL'] ?? '';\r\n if (process.platform === 'darwin') {\r\n if (shell.includes('zsh')) return { display: '~/.zshrc', path: `${homedir()}/.zshrc` };\r\n if (shell.includes('bash')) return { display: '~/.bash_profile', path: `${homedir()}/.bash_profile` };\r\n return { display: '~/.profile', path: `${homedir()}/.profile` };\r\n }\r\n if (process.platform === 'linux') {\r\n if (shell.includes('zsh')) return { display: '~/.zshrc', path: `${homedir()}/.zshrc` };\r\n if (shell.includes('bash')) return { display: '~/.bashrc', path: `${homedir()}/.bashrc` };\r\n return { display: '~/.profile', path: `${homedir()}/.profile` };\r\n }\r\n if (shell.includes('bash')) return { display: '~/.bashrc', path: `${homedir()}/.bashrc` };\r\n return { display: '~/.profile', path: `${homedir()}/.profile` };\r\n}\r\n\r\nexport async function resolveOrCollectApiKey(simulate = false, trace = false): Promise<string | null> {\r\n if (!simulate) {\r\n const existing = resolveApiKey();\r\n if (existing) return existing;\r\n }\r\n\r\n const isMac = process.platform === 'darwin';\r\n const isWindows = process.platform === 'win32';\r\n const isLinux = process.platform === 'linux';\r\n\r\n if (simulate) {\r\n printDryRunPanel();\r\n }\r\n\r\n if (!simulate) {\r\n const keyDiag = (reason: string) => {\r\n p.log.warn(`Credential store unavailable — ${reason}`);\r\n if (trace) {\r\n writeSecureLogLine(getClaudeDebugLogPath(), `keyring: ${reason}`);\r\n }\r\n };\r\n const storedKey = await readFromCredentialStore(keyDiag);\r\n if (storedKey) {\r\n const storeName = isMac ? 'macOS Keychain' : isWindows ? 'Windows Credential Manager' : 'Secret Service';\r\n p.log.success(`Found key in ${storeName}`);\r\n process.env['OPENCODE_API_KEY'] = storedKey;\r\n return storedKey;\r\n }\r\n }\r\n\r\n printApiKeyPanel('https://opencode.ai/auth');\r\n\r\n const key = await p.password({\r\n message: 'Paste your OPENCODE_API_KEY:',\r\n validate: (val) => val.trim() ? undefined : 'Key cannot be empty',\r\n });\r\n\r\n if (p.isCancel(key)) { p.cancel('Cancelled.'); return null; }\r\n\r\n const trimmedKey = (key as string).trim();\r\n let secretServiceAvailable = false;\r\n if (isLinux && !simulate) {\r\n secretServiceAvailable = await isSecretServiceAvailable();\r\n }\r\n\r\n const { display, path } = detectShellProfile();\r\n\r\n type SaveChoice = 'keychain' | 'keychain-autoload' | 'profile' | 'session' | 'credential-manager' | 'setx' | 'secret-service';\r\n\r\n const saveOptions: Array<{ value: SaveChoice; label: string; hint: string }> = (() => {\r\n if (isMac) {\r\n return [\r\n { value: 'keychain', label: 'Keychain only', hint: 'Key stored encrypted in Keychain; anygate reads it automatically next time' },\r\n { value: 'keychain-autoload', label: `Keychain + ${display} auto-load`, hint: `Key in Keychain; ${display} also exports it so all terminal tools can see it` },\r\n { value: 'profile', label: `${display} only (plaintext)`, hint: 'Key written directly to your shell profile — simpler but less secure' },\r\n { value: 'session', label: 'This session only', hint: \"Not saved anywhere — you'll be asked again next time\" },\r\n ];\r\n }\r\n if (isWindows) {\r\n return [\r\n { value: 'credential-manager', label: 'Windows Credential Manager', hint: 'Key stored securely; anygate reads it automatically next time' },\r\n { value: 'setx', label: 'Persistent environment variable (plaintext)', hint: 'Runs setx — key visible in System Properties → Environment Variables' },\r\n { value: 'session', label: 'This session only', hint: \"Not saved anywhere — you'll be asked again next time\" },\r\n ];\r\n }\r\n const opts: Array<{ value: SaveChoice; label: string; hint: string }> = [];\r\n if (secretServiceAvailable) {\r\n opts.push({ value: 'secret-service', label: 'Secret Service (GNOME Keyring / KWallet)', hint: 'Key stored securely in your desktop keyring; anygate reads it automatically next time' });\r\n } else if (!simulate) {\r\n p.log.info('No keyring daemon detected — secure storage requires GNOME Keyring or KWallet running.');\r\n }\r\n opts.push(\r\n { value: 'profile', label: `${display} (plaintext)`, hint: 'Key written directly to your shell profile' },\r\n { value: 'session', label: 'This session only', hint: \"Not saved anywhere — you'll be asked again next time\" },\r\n );\r\n return opts;\r\n })();\r\n\r\n const saveChoice = await p.select<SaveChoice>({\r\n message: 'Where should we save the key?',\r\n options: saveOptions,\r\n initialValue: (isMac ? 'keychain' : isWindows ? 'credential-manager' : secretServiceAvailable ? 'secret-service' : 'profile') as SaveChoice,\r\n });\r\n\r\n if (p.isCancel(saveChoice)) { p.cancel('Cancelled.'); return null; }\r\n\r\n if (simulate) {\r\n const dryRunMessages: Record<SaveChoice, string> = {\r\n keychain: 'Would save key to macOS Keychain',\r\n 'keychain-autoload': `Would save key to macOS Keychain and add auto-load to ${display}`,\r\n 'credential-manager': 'Would save key to Windows Credential Manager',\r\n setx: 'Would run: setx OPENCODE_API_KEY ***',\r\n 'secret-service': 'Would save key to Secret Service (GNOME Keyring / KWallet)',\r\n profile: `Would append OPENCODE_API_KEY export to ${display}`,\r\n session: 'Would use key for this session only',\r\n };\r\n p.log.info(`[dry-run] ${dryRunMessages[saveChoice]}`);\r\n } else if (saveChoice === 'keychain') {\r\n if (await saveToCredentialStore(trimmedKey)) {\r\n p.log.success('Key saved to macOS Keychain — active now and automatically loaded next time.');\r\n } else {\r\n p.log.warn('Could not write to Keychain — key will be used for this session only');\r\n }\r\n } else if (saveChoice === 'keychain-autoload') {\r\n if (await saveToCredentialStore(trimmedKey)) {\r\n try {\r\n const autoLoadLine = `export OPENCODE_API_KEY=\"$(security find-generic-password -s anygate -a ${GLOBAL_OPENCODE_KEYRING_ACCOUNT} -w 2>/dev/null)\"`;\r\n const existing = existsSync(path) ? readFileSync(path, 'utf8') : '';\r\n if (!existing.includes(autoLoadLine)) {\r\n appendFileSync(path, `\\n# anygate: load API key from macOS Keychain\\n${autoLoadLine}\\n`);\r\n }\r\n p.log.success(`Key saved to Keychain and auto-load added to ${display} — active now and in all future terminals.`);\r\n } catch {\r\n p.log.success('Key saved to Keychain — active now and automatically loaded next time.');\r\n p.log.warn(`Could not write auto-load line to ${display}`);\r\n }\r\n } else {\r\n p.log.warn('Could not write to Keychain — key will be used for this session only');\r\n }\r\n } else if (saveChoice === 'credential-manager') {\r\n if (await saveToCredentialStore(trimmedKey)) {\r\n p.log.success('Key saved to Windows Credential Manager — active now and automatically loaded next time.');\r\n } else {\r\n p.log.warn('Could not write to Credential Manager — key will be used for this session only');\r\n }\r\n } else if (saveChoice === 'setx') {\r\n try {\r\n const result = spawnSync('setx', ['OPENCODE_API_KEY', trimmedKey], { stdio: ['pipe', 'pipe', 'pipe'] });\r\n if (result.status !== 0) throw new Error('setx exited with non-zero status');\r\n p.log.success('Key saved as a user environment variable — active now and in all future terminals.');\r\n } catch {\r\n p.log.warn('Could not run setx — key will be used for this session only');\r\n }\r\n } else if (saveChoice === 'secret-service') {\r\n if (await saveToCredentialStore(trimmedKey)) {\r\n p.log.success('Key saved to Secret Service — active now and automatically loaded next time.');\r\n } else {\r\n p.log.warn('Could not write to Secret Service — key will be used for this session only');\r\n }\r\n } else if (saveChoice === 'profile') {\r\n try {\r\n if (!existsSync(path)) appendFileSync(path, '');\r\n const escapedKey = trimmedKey.replace(/'/g, \"'\\\\''\");\r\n appendFileSync(path, `\\nexport OPENCODE_API_KEY='${escapedKey}'\\n`);\r\n p.log.success(`Key saved to ${display} — active now and in all future terminals.`);\r\n } catch {\r\n p.log.warn(`Could not write to ${display} — key will be used for this session only`);\r\n }\r\n }\r\n\r\n if (!simulate) process.env['OPENCODE_API_KEY'] = trimmedKey;\r\n return trimmedKey;\r\n}\r\n","// src/prompts.ts\r\nimport * as p from '@clack/prompts';\r\nimport pc from 'picocolors';\r\nimport type { UserPreferences, ConflictInfo, LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\nimport {\r\n confirmLaunchMessage,\r\n fmtModel,\r\n modelSelectOption,\r\n navOption,\r\n printEnvConflictPanel,\r\n providerSelectOption,\r\n gateIntro,\r\n gateOutro,\r\n formatModelLabel,\r\n} from './ui.js';\r\nimport { scoreModelSearch } from './model-search.js';\r\n\r\nconst BROWSE_ALL = '__browse_all__';\r\nconst MAX_RECENT = 3;\r\n/** Providers with more models than this offer search or paginated browse. */\r\nexport const MODEL_SEARCH_THRESHOLD = 25;\r\n/** Models shown per page when browsing large catalogs. */\r\nexport const MODEL_PAGE_SIZE = 15;\r\n\r\nconst PAGE_PREV = '__page_prev__';\r\nconst PAGE_NEXT = '__page_next__';\r\nconst SWITCH_SEARCH = '__switch_search__';\r\nconst SWITCH_BROWSE = '__switch_browse__';\r\nconst MODE_SEARCH = 'search';\r\nconst MODE_BROWSE = 'browse';\r\n\r\ntype ModelSearchable = { id: string; name: string; brand: string };\r\ntype ModelSelectOption = { value: string; label: string; hint: string };\r\ntype LargeCatalogMode = 'choose' | 'search' | 'browse';\r\n\r\nfunction sortModelsByBrand<T extends ModelSearchable>(models: T[]): T[] {\r\n return [...models].sort((a, b) => {\r\n const brandCmp = a.brand.localeCompare(b.brand, undefined, { sensitivity: 'base' });\r\n if (brandCmp !== 0) return brandCmp;\r\n const nameA = a.name || a.id;\r\n const nameB = b.name || b.id;\r\n return nameA.localeCompare(nameB, undefined, { sensitivity: 'base', numeric: true });\r\n });\r\n}\r\n\r\nexport function filterModelsBySearch<T extends ModelSearchable>(models: T[], query: string): T[] {\r\n if (!query.trim()) return [];\r\n return models\r\n .map((model, index) => ({\r\n model,\r\n index,\r\n score: scoreModelSearch(query, [\r\n { value: model.name, weight: 800 },\r\n { value: model.id, weight: 700 },\r\n { value: model.brand, weight: 350 },\r\n ]),\r\n }))\r\n .filter(result => result.score > 0)\r\n .sort((a, b) => {\r\n if (b.score !== a.score) return b.score - a.score;\r\n return a.index - b.index;\r\n })\r\n .map(result => result.model);\r\n}\r\n\r\n/** Slice a model list for paginated browse UI. */\r\nexport function sliceModelPage<T>(\r\n items: T[],\r\n page: number,\r\n pageSize = MODEL_PAGE_SIZE,\r\n): { items: T[]; page: number; totalPages: number } {\r\n const totalPages = Math.max(1, Math.ceil(items.length / pageSize));\r\n const clampedPage = Math.min(Math.max(0, page), totalPages - 1);\r\n const start = clampedPage * pageSize;\r\n return {\r\n items: items.slice(start, start + pageSize),\r\n page: clampedPage,\r\n totalPages,\r\n };\r\n}\r\n\r\ntype PagedPickResult<T> = T | 'search' | 'browse' | 'menu';\r\n\r\nfunction isSelectedModel<T extends { id: string }>(value: PagedPickResult<T>): value is T {\r\n return value !== 'search' && value !== 'browse' && value !== 'menu';\r\n}\r\n\r\n/** Paginated model picker — exported for global favorites search. */\r\nexport async function pickModelFromPagedList<T extends { id: string }>(\r\n list: T[],\r\n toOption: (m: T) => ModelSelectOption,\r\n messagePrefix: string,\r\n initialModelId?: string,\r\n links?: { search?: boolean; browse?: boolean; newSearch?: boolean },\r\n): Promise<PagedPickResult<T>> {\r\n let page = 0;\r\n\r\n if (initialModelId) {\r\n const idx = list.findIndex(m => m.id === initialModelId);\r\n if (idx >= 0) page = Math.floor(idx / MODEL_PAGE_SIZE);\r\n }\r\n\r\n while (true) {\r\n const { items: pageItems, page: currentPage, totalPages } = sliceModelPage(list, page);\r\n const options: ModelSelectOption[] = [];\r\n\r\n if (currentPage > 0) {\r\n options.push(navOption(PAGE_PREV, '← Previous page', `Page ${currentPage} of ${totalPages}`));\r\n }\r\n\r\n options.push(...pageItems.map(toOption));\r\n\r\n if (currentPage < totalPages - 1) {\r\n options.push(navOption(PAGE_NEXT, 'Next page →', `Page ${currentPage + 2} of ${totalPages}`));\r\n }\r\n\r\n if (links?.search) {\r\n options.push(navOption(SWITCH_SEARCH, 'Search instead →', ''));\r\n }\r\n if (links?.browse) {\r\n options.push(navOption(SWITCH_BROWSE, 'Browse all instead →', ''));\r\n }\r\n if (links?.newSearch) {\r\n options.push(navOption(SWITCH_SEARCH, '← New search', ''));\r\n }\r\n\r\n const initialValue =\r\n (initialModelId && pageItems.some(m => m.id === initialModelId) ? initialModelId : pageItems[0]?.id)\r\n ?? options[0]?.value;\r\n\r\n const picked = await p.select({\r\n message: `${messagePrefix} (page ${currentPage + 1} of ${totalPages})`,\r\n options,\r\n initialValue,\r\n });\r\n\r\n if (p.isCancel(picked)) return 'menu';\r\n\r\n const choice = String(picked);\r\n if (choice === PAGE_PREV) {\r\n page = currentPage - 1;\r\n continue;\r\n }\r\n if (choice === PAGE_NEXT) {\r\n page = currentPage + 1;\r\n continue;\r\n }\r\n if (choice === SWITCH_SEARCH) return 'search';\r\n if (choice === SWITCH_BROWSE) return 'browse';\r\n\r\n const selected = list.find(m => m.id === choice);\r\n if (selected) return selected;\r\n continue;\r\n }\r\n}\r\n\r\nasync function selectLargeCatalog<T extends ModelSearchable & { id: string }>(\r\n models: T[],\r\n browseList: T[],\r\n toOption: (m: T) => ModelSelectOption,\r\n message: string,\r\n initialModelId?: string,\r\n): Promise<T | 'back' | null> {\r\n let mode: LargeCatalogMode = 'choose';\r\n\r\n while (true) {\r\n if (mode === 'choose') {\r\n const method = await p.select({\r\n message: `${message} (${models.length} available)`,\r\n options: [\r\n { value: MODE_SEARCH, label: pc.cyan('Search models'), hint: 'Filter by name, id, or brand' },\r\n {\r\n value: MODE_BROWSE,\r\n label: pc.cyan('Browse all models'),\r\n hint: `${MODEL_PAGE_SIZE} per page · ${Math.ceil(browseList.length / MODEL_PAGE_SIZE)} pages`,\r\n },\r\n navOption('__back__', '← Go back', 'Select a different provider'),\r\n ],\r\n });\r\n\r\n if (p.isCancel(method) || String(method) === '__back__') {\r\n return 'back';\r\n }\r\n\r\n mode = method === MODE_BROWSE ? 'browse' : 'search';\r\n continue;\r\n }\r\n\r\n if (mode === 'browse') {\r\n const picked = await pickModelFromPagedList(\r\n browseList,\r\n toOption,\r\n message,\r\n initialModelId,\r\n { search: true },\r\n );\r\n\r\n if (picked === 'search') {\r\n mode = 'search';\r\n continue;\r\n }\r\n if (picked === 'menu') {\r\n mode = 'choose';\r\n continue;\r\n }\r\n if (isSelectedModel(picked)) return picked;\r\n\r\n continue;\r\n }\r\n\r\n const searchInput = await p.text({\r\n message: `Search models (${models.length} available):`,\r\n placeholder: 'e.g. claude, sonnet, llama',\r\n });\r\n\r\n if (p.isCancel(searchInput)) {\r\n mode = 'choose';\r\n continue;\r\n }\r\n\r\n const matched = filterModelsBySearch(browseList, String(searchInput));\r\n if (matched.length === 0) {\r\n p.log.warn('No models match — try a different search');\r\n continue;\r\n }\r\n\r\n const result = await pickModelFromPagedList(\r\n matched,\r\n toOption,\r\n matched.length === 1 ? 'Match found' : `Select model (${matched.length} matches)`,\r\n initialModelId,\r\n { browse: true, newSearch: true },\r\n );\r\n\r\n if (result === 'search') continue;\r\n if (result === 'browse') {\r\n mode = 'browse';\r\n continue;\r\n }\r\n if (result === 'menu') {\r\n mode = 'choose';\r\n continue;\r\n }\r\n if (isSelectedModel(result)) return result;\r\n }\r\n}\r\n\r\nasync function selectModelWithSearch<T extends ModelSearchable & { id: string }>(\r\n models: T[],\r\n toOption: (m: T) => ModelSelectOption,\r\n message: string,\r\n initialModelId?: string,\r\n browseList?: T[],\r\n): Promise<T | 'back' | null> {\r\n if (models.length === 0) return null;\r\n\r\n const orderedBrowse = browseList ?? sortModelsByBrand(models);\r\n\r\n if (models.length <= MODEL_SEARCH_THRESHOLD) {\r\n const options = [\r\n ...models.map(toOption),\r\n navOption('__back__', '← Go back', ''),\r\n ];\r\n const initialValue =\r\n initialModelId && options.some(o => o.value === initialModelId)\r\n ? initialModelId\r\n : options[0]?.value;\r\n\r\n const picked = await p.select({\r\n message,\r\n options,\r\n initialValue,\r\n });\r\n\r\n if (p.isCancel(picked) || String(picked) === '__back__') {\r\n return 'back';\r\n }\r\n\r\n const selected = models.find(m => m.id === String(picked));\r\n if (!selected) return null;\r\n return selected;\r\n }\r\n\r\n return selectLargeCatalog(models, orderedBrowse, toOption, message, initialModelId);\r\n}\r\n\r\nfunction noteEnvConflicts(conflicts: ConflictInfo[]): void {\r\n printEnvConflictPanel(conflicts);\r\n}\r\n\r\nfunction modelToOption(model: LocalProviderModel, hint?: string) {\r\n return modelSelectOption(model, hint);\r\n}\r\n\r\nexport async function browseAllModels(\r\n provider: LocalProvider,\r\n prefs: UserPreferences,\r\n): Promise<LocalProviderModel | 'back' | null> {\r\n return selectModelWithSearch(\r\n provider.models,\r\n m => modelToOption(m),\r\n 'Which model?',\r\n prefs.lastModel,\r\n );\r\n}\r\n\r\nexport async function pickLocalModel(\r\n provider: LocalProvider,\r\n conflicts: ConflictInfo[],\r\n prefs: UserPreferences,\r\n): Promise<LocalProviderModel | 'back' | null> {\r\n // Show recently used models for this provider if we have any.\r\n const recentIds = (prefs.recentModelsByProvider?.[provider.id] ?? []).slice(0, MAX_RECENT);\r\n const recentModels = recentIds\r\n .map(id => provider.models.find(m => m.id === id))\r\n .filter((m): m is LocalProviderModel => m !== undefined);\r\n\r\n let selectedModel: LocalProviderModel | null = null;\r\n\r\n while (true) {\r\n if (recentModels.length > 0) {\r\n const options = [\r\n ...recentModels.map(m => modelToOption(m, 'recent')),\r\n navOption(BROWSE_ALL, 'Browse all models →', `${provider.models.length} available`),\r\n navOption('__back__', '← Go back', 'Select a different provider'),\r\n ];\r\n\r\n const picked = await p.select({\r\n message: 'Which model?',\r\n options,\r\n initialValue: recentModels[0].id,\r\n });\r\n\r\n if (p.isCancel(picked) || String(picked) === '__back__') {\r\n return 'back';\r\n }\r\n\r\n if (String(picked) === BROWSE_ALL) {\r\n const browsed = await browseAllModels(provider, prefs);\r\n if (browsed === 'back') {\r\n continue;\r\n }\r\n if (!browsed) return null;\r\n selectedModel = browsed;\r\n break;\r\n } else {\r\n selectedModel = recentModels.find(m => m.id === String(picked))!;\r\n break;\r\n }\r\n } else {\r\n const browsed = await browseAllModels(provider, prefs);\r\n if (browsed === 'back') {\r\n return 'back';\r\n }\r\n if (!browsed) return null;\r\n selectedModel = browsed;\r\n break;\r\n }\r\n }\r\n\r\n noteEnvConflicts(conflicts);\r\n\r\n const modelLabel = formatModelLabel(selectedModel);\r\n const confirmed = await p.confirm({\r\n message: confirmLaunchMessage('Claude Code', modelLabel, selectedModel.id, provider.name),\r\n initialValue: true,\r\n });\r\n\r\n if (p.isCancel(confirmed) || !confirmed) {\r\n p.cancel('Cancelled.');\r\n return null;\r\n }\r\n\r\n gateOutro('Launching', fmtModel(modelLabel, selectedModel.id));\r\n return selectedModel;\r\n}\r\n","export interface ModelSearchField {\r\n value?: string;\r\n weight: number;\r\n}\r\n\r\nexport function normalizeModelSearchText(value: string): string {\r\n return value\r\n .toLowerCase()\r\n .replace(/([a-z])([0-9])/g, '$1 $2')\r\n .replace(/([0-9])([a-z])/g, '$1 $2')\r\n .replace(/[\\s\\-._/:]+/g, ' ')\r\n .trim();\r\n}\r\n\r\nexport function compactModelSearchText(value: string): string {\r\n return normalizeModelSearchText(value).replace(/\\s+/g, '');\r\n}\r\n\r\nexport function scoreModelSearch(query: string, fields: ModelSearchField[]): number {\r\n const normalizedQuery = normalizeModelSearchText(query);\r\n const compactQuery = normalizedQuery.replace(/\\s+/g, '');\r\n if (!normalizedQuery || !compactQuery) return 0;\r\n\r\n const searchableFields = fields\r\n .filter(field => field.value)\r\n .map(field => {\r\n const normalized = normalizeModelSearchText(field.value!);\r\n return { normalized, compact: normalized.replace(/\\s+/g, ''), weight: field.weight };\r\n });\r\n const tokens = normalizedQuery.split(' ').filter(Boolean);\r\n\r\n if (!tokens.every(token => searchableFields.some(field => field.normalized.includes(token) || field.compact.includes(token)))) {\r\n return 0;\r\n }\r\n\r\n let score = 1;\r\n for (const field of searchableFields) {\r\n if (field.normalized === normalizedQuery) score = Math.max(score, field.weight + 300);\r\n else if (field.compact === compactQuery) score = Math.max(score, field.weight + 260);\r\n else if (field.normalized.startsWith(normalizedQuery)) score = Math.max(score, field.weight + 180);\r\n else if (field.compact.startsWith(compactQuery)) score = Math.max(score, field.weight + 150);\r\n else if (field.normalized.includes(normalizedQuery)) score = Math.max(score, field.weight + 90);\r\n else if (field.compact.includes(compactQuery)) score = Math.max(score, field.weight + 70);\r\n }\r\n\r\n return score + tokens.reduce((sum, token) => (\r\n sum + searchableFields.reduce((best, field) => {\r\n if (field.normalized.split(' ').includes(token)) return Math.max(best, 30);\r\n if (field.normalized.includes(token) || field.compact.includes(token)) return Math.max(best, 12);\r\n return best;\r\n }, 0)\r\n ), 0);\r\n}\r\n","// src/core/credentials.ts — single source of truth for resolving a provider's API key.\r\n//\r\n// Previously `resolveLocalProviderApiKey` lived in provider-catalog.ts but was\r\n// inlined/re-imported at 7 sites (cli.ts, codex.ts, codex-app.ts, claude-app.ts,\r\n// gemini.ts, favorites-resolver.ts, antigravity/launch-routes.ts). That drift is\r\n// exactly how the \"Kilo Code No credential\" bug shipped — codex.ts itself still\r\n// called the old inline copy instead of the shared helper. Centralizing here\r\n// guarantees every launcher uses identical credential resolution.\r\n\r\nimport { resolveProviderCredential } from './env.js';\r\nimport { getTemplateById } from '../providers/provider-templates.js';\r\nimport { loadRegistry } from '../registry/io.js';\r\nimport { oauthAuthRef } from '../registry/import-build.js';\r\nimport type { LocalProvider } from './types.js';\r\n\r\n/** Resolve API key when provider.apiKey is empty (registry authRef or global OpenCode key). */\r\nexport async function resolveLocalProviderApiKey(provider: LocalProvider): Promise<string | null> {\r\n const direct = provider.apiKey?.trim();\r\n if (direct) return direct;\r\n\r\n if (provider.authType === 'none') return 'anonymous';\r\n\r\n const template = getTemplateById(provider.id);\r\n if (template?.apiKeyOptional || template?.anonymousFreeModels) {\r\n return 'anonymous';\r\n }\r\n\r\n const reg = loadRegistry().providers.find(p => p.id === provider.id);\r\n const authRef = reg?.authRef\r\n ?? (provider.id === 'zen' || provider.id === 'go' ? 'keyring:global:opencode' : oauthAuthRef(provider.id));\r\n return resolveProviderCredential(provider.id, authRef);\r\n}\r\n","import { MAX_MODEL_CATALOG } from '../../../src/core/constants.js';\r\nimport type { FavoriteModel } from '../../../src/core/types.js';\r\n\r\nexport function isFavorite(list: FavoriteModel[], fav: FavoriteModel): boolean {\r\n return list.some(f => f.providerId === fav.providerId && f.modelId === fav.modelId);\r\n}\r\n\r\nexport type AddFavoriteResult =\r\n | { ok: true; list: FavoriteModel[] }\r\n | { ok: false; reason: 'duplicate' | 'cap' };\r\n\r\nexport function addFavorite(\r\n list: FavoriteModel[],\r\n fav: FavoriteModel,\r\n max = MAX_MODEL_CATALOG,\r\n): AddFavoriteResult {\r\n if (isFavorite(list, fav)) return { ok: false, reason: 'duplicate' };\r\n if (list.length >= max) return { ok: false, reason: 'cap' };\r\n return { ok: true, list: [...list, fav] };\r\n}\r\n\r\nexport function removeFavorite(list: FavoriteModel[], fav: FavoriteModel): FavoriteModel[] {\r\n return list.filter(f => !(f.providerId === fav.providerId && f.modelId === fav.modelId));\r\n}\r\n","// Global cross-provider search for anygate models (favorites manager).\r\nimport * as p from '@clack/prompts';\r\nimport pc from 'picocolors';\r\nimport type { FavoriteModel, LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\nimport { isFavorite } from './favorites.js';\r\nimport {\r\n pickModelFromPagedList,\r\n} from '../../../src/agents/shared/prompts.js';\r\nimport { fmtModel, fmtProviderBracket, formatModelLabel } from '../../../src/agents/shared/ui.js';\r\nimport { scoreModelSearch } from '../../../src/agents/shared/model-search.js';\r\nimport { favoriteProviderDisplayName } from './favorites-provider-display.js';\r\nimport { isFreeStatus } from '../../../src/agents/shared/free-models.js';\r\n\r\nexport interface GlobalFavoritePick {\r\n providerId: string;\r\n providerName: string;\r\n model: LocalProviderModel;\r\n}\r\n\r\nconst ADD_BY_PROVIDER = '__browse_by_provider__';\r\n\r\nexport function globalFavoritePickKey(entry: GlobalFavoritePick): string {\r\n return `${entry.providerId}::${entry.model.id}`;\r\n}\r\n\r\nexport function buildGlobalFavoriteIndex(providers: LocalProvider[]): GlobalFavoritePick[] {\r\n const out: GlobalFavoritePick[] = [];\r\n for (const provider of providers) {\r\n for (const model of provider.models) {\r\n out.push({\r\n providerId: provider.id,\r\n providerName: favoriteProviderDisplayName(provider),\r\n model,\r\n });\r\n }\r\n }\r\n return out.sort((a, b) => {\r\n const brandCmp = a.model.brand.localeCompare(b.model.brand);\r\n if (brandCmp !== 0) return brandCmp;\r\n const providerCmp = a.providerName.localeCompare(b.providerName);\r\n if (providerCmp !== 0) return providerCmp;\r\n return a.model.id.localeCompare(b.model.id);\r\n });\r\n}\r\n\r\nfunction favoriteSearchScore(entry: GlobalFavoritePick, query: string): number {\r\n const m = entry.model;\r\n return scoreModelSearch(query, [\r\n { value: m.name, weight: 800 },\r\n { value: m.id, weight: 700 },\r\n { value: m.upstreamModelId, weight: 650 },\r\n { value: m.brand, weight: 350 },\r\n { value: m.family, weight: 300 },\r\n { value: entry.providerName, weight: 240 },\r\n { value: entry.providerId, weight: 220 },\r\n ]);\r\n}\r\n\r\nexport function filterGlobalFavoriteIndex(\r\n entries: GlobalFavoritePick[],\r\n query: string,\r\n opts?: { freeOnly?: boolean },\r\n): GlobalFavoritePick[] {\r\n const pool = opts?.freeOnly\r\n ? entries.filter(entry => entry.model.isFree || isFreeStatus(entry.model.freeStatus))\r\n : entries;\r\n if (!query.trim()) return opts?.freeOnly ? pool : [];\r\n return pool\r\n .map((entry, index) => ({ entry, index, score: favoriteSearchScore(entry, query) }))\r\n .filter(result => result.score > 0)\r\n .sort((a, b) => {\r\n if (b.score !== a.score) return b.score - a.score;\r\n return a.index - b.index;\r\n })\r\n .map(result => result.entry);\r\n}\r\n\r\nexport function globalFavoriteSelectOption(\r\n entry: GlobalFavoritePick,\r\n favorites: FavoriteModel[],\r\n) {\r\n const label = formatModelLabel(entry.model);\r\n const favorited = isFavorite(favorites, { providerId: entry.providerId, modelId: entry.model.id });\r\n const providerTag = fmtProviderBracket(entry.providerId, entry.providerName, entry.model.isFree);\r\n return {\r\n value: globalFavoritePickKey(entry),\r\n label: `${fmtModel(label, entry.model.id)} ${providerTag}`,\r\n hint: favorited ? pc.dim('already in favorites') : '',\r\n };\r\n}\r\n\r\nfunction parseGlobalFavoritePickKey(\r\n key: string,\r\n index: GlobalFavoritePick[],\r\n): GlobalFavoritePick | undefined {\r\n return index.find(e => globalFavoritePickKey(e) === key);\r\n}\r\n\r\n/** Search all providers; returns null if user cancels or chooses browse-by-provider. */\r\nexport async function pickGlobalFavoriteModel(\r\n providers: LocalProvider[],\r\n favorites: FavoriteModel[],\r\n opts?: { freeOnly?: boolean },\r\n): Promise<GlobalFavoritePick | typeof ADD_BY_PROVIDER | null> {\r\n const index = buildGlobalFavoriteIndex(providers);\r\n if (index.length === 0) return null;\r\n const freeOnly = opts?.freeOnly === true;\r\n\r\n while (true) {\r\n const searchInput = await p.text({\r\n message: freeOnly\r\n ? `Search free models (${filterGlobalFavoriteIndex(index, '', { freeOnly: true }).length} models):`\r\n : `Search all providers (${index.length} models):`,\r\n placeholder: 'e.g. deepseek, claude, sonnet',\r\n });\r\n\r\n if (p.isCancel(searchInput)) {\r\n const fallback = await p.select({\r\n message: 'Add a favorite',\r\n options: [\r\n { value: 'back', label: pc.cyan('← Back to favorites'), hint: '' },\r\n { value: ADD_BY_PROVIDER, label: pc.cyan('Browse by provider →'), hint: 'Pick one provider first' },\r\n ],\r\n });\r\n if (p.isCancel(fallback) || fallback === 'back') return null;\r\n if (fallback === ADD_BY_PROVIDER) return ADD_BY_PROVIDER;\r\n continue;\r\n }\r\n\r\n const matched = filterGlobalFavoriteIndex(index, String(searchInput), { freeOnly });\r\n if (matched.length === 0) {\r\n p.log.warn('No models match — try a different search');\r\n continue;\r\n }\r\n\r\n const result = await pickModelFromPagedList(\r\n matched.map(e => ({ ...e, id: globalFavoritePickKey(e) })),\r\n e => globalFavoriteSelectOption(\r\n { providerId: e.providerId, providerName: e.providerName, model: e.model },\r\n favorites,\r\n ),\r\n matched.length === 1 ? 'Match found' : `Select model (${matched.length} matches)`,\r\n undefined,\r\n { newSearch: true },\r\n );\r\n\r\n if (result === 'search') continue;\r\n if (result === 'browse' || result === 'menu') continue;\r\n\r\n const picked = parseGlobalFavoritePickKey(result.id, matched);\r\n if (!picked) continue;\r\n\r\n if (isFavorite(favorites, { providerId: picked.providerId, modelId: picked.model.id })) {\r\n p.log.warn(`${picked.model.name || picked.model.id} (${picked.providerName}) is already in your favorites.`);\r\n continue;\r\n }\r\n\r\n return picked;\r\n }\r\n}\r\n\r\nexport { ADD_BY_PROVIDER as browseByProviderChoice };\r\n","// src/providers-command.ts — anygate providers command\r\n\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport { upgradeGlobalOpencodeCredential, readGlobalOpencodeCredential, resolveProviderCredential } from '../core/env.js';\r\nimport {\r\n formatRegistryAuthLabel,\r\n resolveProvidersForDisplay,\r\n type ProviderDisplayEntry,\r\n} from './provider-catalog.js';\r\nimport { findOpencodeBinary } from './opencode-serve.js';\r\nimport {\r\n filterTemplates,\r\n listAddableTemplates,\r\n listSupportedTemplates,\r\n listVisibleOAuthTemplates,\r\n type ProviderTemplate,\r\n} from './provider-templates.js';\r\nimport { addProviderFromTemplate } from '../registry/add-template.js';\r\nimport { addCustomEndpointProvider } from '../registry/custom-endpoint.js';\r\nimport { validateCustomEndpointUrl } from '../registry/url-security.js';\r\nimport { importFromOpencode, type ImportConflictChoice, type ImportConflictContext } from '../registry/import-opencode.js';\r\nimport {\r\n addGoRegistryStub,\r\n addZenRegistryStub,\r\n removeProviderFromRegistry,\r\n toggleProviderEnabled,\r\n} from '../registry/crud.js';\r\nimport { loadRegistry, saveRegistry } from '../registry/io.js';\r\nimport { refreshAllProviderModels, refreshProviderModels } from '../registry/refresh-models.js';\r\nimport { resolveRefreshCredential } from '../registry/refresh-credentials.js';\r\nimport { resolveOrCollectApiKey } from '../agents/shared/key-setup.js';\r\nimport { authenticateProvider, providerAuthHelpText, type ProviderAuthMethod } from '../registry/provider-auth.js';\r\nimport { supportsNativeOAuth } from '../oauth/types.js';\r\nimport { browseAllModels } from '../agents/shared/prompts.js';\r\nimport { cachedModelToLocal } from '../registry/materialize.js';\r\nimport { loadPreferences } from '../core/config.js';\r\nimport type { LocalProvider } from '../core/types.js';\r\nimport {\r\n fmtCount,\r\n fmtEnabledStar,\r\n fmtProvider,\r\n fmtUrl,\r\n logConnected,\r\n printCloudProviderPanel,\r\n printImportConflictPanel,\r\n printPanel,\r\n printProviderDetailPanel,\r\n gateIntro,\r\n} from '../agents/shared/ui.js';\r\n\r\nexport type ProvidersSubcommand = 'hub' | 'add' | 'import' | 'list' | 'remove' | 'refresh-models' | 'auth' | 'help';\r\n\r\nexport function parseProvidersArgs(args: string[]): {\r\n subcommand: ProvidersSubcommand;\r\n showHelp: boolean;\r\n removeId?: string;\r\n authMethod?: ProviderAuthMethod;\r\n error?: string;\r\n} {\r\n if (args.length === 0) return { subcommand: 'hub', showHelp: false };\r\n const [first, ...rest] = args;\r\n if (first === '--help' || first === '-h') return { subcommand: 'help', showHelp: true };\r\n if (first === 'add') {\r\n if (rest.length > 0) return { subcommand: 'add', showHelp: false, error: `Unknown add option: ${rest[0]}` };\r\n return { subcommand: 'add', showHelp: false };\r\n }\r\n if (first === 'import') {\r\n if (rest.length > 0) return { subcommand: 'import', showHelp: false, error: `Unknown import option: ${rest[0]}` };\r\n return { subcommand: 'import', showHelp: false };\r\n }\r\n if (first === 'list') {\r\n if (rest.length > 0) return { subcommand: 'list', showHelp: false, error: `Unknown list option: ${rest[0]}` };\r\n return { subcommand: 'list', showHelp: false };\r\n }\r\n if (first === 'auth') {\r\n if (rest.length === 0) return { subcommand: 'auth', showHelp: true };\r\n let authMethod: ProviderAuthMethod | undefined;\r\n const positional: string[] = [];\r\n for (const arg of rest) {\r\n if (arg === '--native') authMethod = 'native';\r\n else if (arg === '--broker') authMethod = 'broker';\r\n else if (arg.startsWith('-')) {\r\n return { subcommand: 'auth', showHelp: false, error: `Unknown auth option: ${arg}` };\r\n } else {\r\n positional.push(arg);\r\n }\r\n }\r\n if (positional.length !== 1) {\r\n return { subcommand: 'auth', showHelp: false, error: 'Usage: anygate providers auth <id> [--native|--broker]' };\r\n }\r\n return { subcommand: 'auth', showHelp: false, removeId: positional[0], authMethod };\r\n }\r\n if (first === 'remove') {\r\n if (rest.length === 0) return { subcommand: 'remove', showHelp: false, error: 'Usage: anygate providers remove <id>' };\r\n if (rest.length > 1) return { subcommand: 'remove', showHelp: false, error: `Unknown remove option: ${rest[1]}` };\r\n return { subcommand: 'remove', showHelp: false, removeId: rest[0] };\r\n }\r\n if (first === 'refresh-models') {\r\n if (rest.length === 0) return { subcommand: 'refresh-models', showHelp: false };\r\n if (rest.length > 1) return { subcommand: 'refresh-models', showHelp: false, error: `Unknown refresh-models option: ${rest[1]}` };\r\n return { subcommand: 'refresh-models', showHelp: false, removeId: rest[0] };\r\n }\r\n return { subcommand: 'hub', showHelp: false, error: `Unknown providers subcommand: ${first}` };\r\n}\r\n\r\nexport function providersHelpText(): string {\r\n return `${pc.bold('anygate providers')} — manage your AI providers\r\n\r\n${pc.bold('Usage:')}\r\n anygate providers\r\n anygate providers add\r\n anygate providers import\r\n anygate providers list\r\n anygate providers remove <id>\r\n anygate providers refresh-models [id]\r\n anygate providers auth <id> [--native|--broker]\r\n\r\n${pc.bold('Subcommands:')}\r\n (none) Provider hub wizard ${pc.dim('[Phase 1.1]')}\r\n add Add a provider (Groq, Mistral, Together AI, …) ${pc.dim('[Phase 1.1]')}\r\n import Import providers from OpenCode CLI (one-time) ${pc.dim('[Phase 1.0]')}\r\n auth Sign in with OAuth (GitHub Copilot, xAI, OpenAI)\r\n list Show configured providers ${pc.dim('[Phase 1.0]')}\r\n remove Remove a provider by id ${pc.dim('[Phase 1.1]')}\r\n refresh-models Update cached model lists ${pc.dim('[Phase 1.2]')}`;\r\n}\r\n\r\n\r\nfunction providerLabel(name: string, modelCount: number, enabled: boolean): string {\r\n return `${fmtEnabledStar(enabled)} ${fmtProvider(name)} ${pc.dim(`(${modelCount} model${modelCount === 1 ? '' : 's'})`)}`;\r\n}\r\n\r\nexport async function runProvidersImport(): Promise<number> {\r\n const registry = loadRegistry();\r\n const hasExisting = registry.providers.length > 0;\r\n\r\n const resolveConflict = hasExisting\r\n ? async (ctx: ImportConflictContext): Promise<ImportConflictChoice> => {\r\n printImportConflictPanel(ctx.existing.name, ctx.existingKeyHint, ctx.incomingKeyHint);\r\n const choice = await p.select({\r\n message: 'Which configuration should we keep?',\r\n options: [\r\n { value: 'keep', label: pc.cyan('Keep mine'), hint: 'Leave your current anygate config unchanged' },\r\n { value: 'import', label: pc.cyan('Use imported'), hint: 'Replace with OpenCode settings and refresh models' },\r\n { value: 'skip', label: pc.dim('Skip this provider'), hint: '' },\r\n ],\r\n });\r\n if (p.isCancel(choice)) return 'skip' as ImportConflictChoice;\r\n return choice as ImportConflictChoice;\r\n }\r\n : undefined;\r\n\r\n const spinner = p.spinner();\r\n spinner.start('Importing from OpenCode...');\r\n const result = await importFromOpencode({ resolveConflict });\r\n spinner.stop('');\r\n\r\n if (result.error) {\r\n p.log.error(result.error);\r\n return 1;\r\n }\r\n\r\n if (result.imported.length === 0 && result.skipped.length === 0) {\r\n p.log.warn('No configured providers found in OpenCode.');\r\n p.log.info('Add providers in OpenCode first, or use anygate providers add.');\r\n return 0;\r\n }\r\n\r\n if (result.authFileWarning) {\r\n p.log.warn(result.authFileWarning);\r\n }\r\n\r\n const importedNames = result.imported.map(pr => pr.name).join(', ');\r\n const modelTotal = result.imported.reduce((n, pr) => n + (pr.modelsCache?.models.length ?? 0), 0);\r\n const credNote = result.oauthImported > 0\r\n ? ` (${result.oauthImported} via OAuth)`\r\n : '';\r\n p.log.success(\r\n `Imported ${importedNames} — ${modelTotal} model${modelTotal === 1 ? '' : 's'}, `\r\n + `${result.keysSaved} credential${result.keysSaved === 1 ? '' : 's'} saved to Keychain${credNote}.`,\r\n );\r\n\r\n if (result.skipped.length > 0) {\r\n for (const s of result.skipped) {\r\n const reason =\r\n s.reason === 'user-skipped' ? 'skipped by you'\r\n : s.reason === 'conflict-kept' ? 'kept your existing config'\r\n : s.reason === 'oauth-no-token' ? 'OAuth provider in OpenCode but not signed in — run anygate providers auth'\r\n : s.reason === 'no-api-key' ? 'no API key in OpenCode — add key there or use anygate providers add'\r\n : s.reason === 'manual-only' ? 'uses gcloud/AWS credentials — not importable via API key'\r\n : s.reason === 'placeholder-key' ? 'placeholder API key — provider not imported'\r\n : s.reason === 'invalid-key' ? 'API key failed verification — provider not imported'\r\n : s.reason === 'credential-save-failed' ? 'could not save credential — provider not imported'\r\n : s.reason;\r\n p.log.warn(`Skipped ${s.name} (${s.id}): ${reason}`);\r\n }\r\n }\r\n\r\n if (result.keysSkipped.length > 0) {\r\n for (const k of result.keysSkipped) {\r\n if (k.detail) {\r\n p.log.info(`${k.name} (${k.id}): ${k.detail}`);\r\n }\r\n }\r\n }\r\n\r\n if (result.imported.length > 0) {\r\n const refreshSpinner = p.spinner();\r\n refreshSpinner.start('Fetching model capabilities from providers...');\r\n const registry = loadRegistry();\r\n for (const provider of result.imported) {\r\n const key = await resolveRefreshCredential(provider, async pr =>\r\n resolveProviderCredential(pr.id, pr.authRef),\r\n );\r\n await refreshProviderModels(provider.id, key, registry);\r\n }\r\n refreshSpinner.stop('Model capabilities refreshed.');\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nexport async function runProvidersAuth(providerId: string, method?: ProviderAuthMethod): Promise<number> {\r\n try {\r\n const result = await authenticateProvider(providerId, { method });\r\n p.log.success(`Signed in to ${result.registryProvider.name} — credential saved to Keychain.`);\r\n return 0;\r\n } catch (err) {\r\n if (err instanceof Error && err.message === 'Cancelled') {\r\n p.cancel('Cancelled.');\r\n return 0;\r\n }\r\n p.log.error(err instanceof Error ? err.message : String(err));\r\n return 1;\r\n }\r\n}\r\n\r\nexport async function runProvidersRefreshModels(providerId?: string): Promise<number> {\r\n const resolveKey = async (provider: import('../registry/types.js').RegistryProvider) =>\r\n resolveProviderCredential(provider.id, provider.authRef);\r\n\r\n if (providerId) {\r\n const registry = loadRegistry();\r\n const provider = registry.providers.find(p => p.id === providerId);\r\n if (!provider) {\r\n p.log.error(`Provider not found: ${providerId}`);\r\n return 1;\r\n }\r\n const spinner = p.spinner();\r\n spinner.start(`Refreshing ${provider.name}...`);\r\n const key = await resolveRefreshCredential(provider, async p =>\r\n resolveProviderCredential(p.id, p.authRef),\r\n );\r\n const result = await refreshProviderModels(providerId, key);\r\n spinner.stop('');\r\n if (result.skipped) {\r\n const countNote = result.modelCount ? ` (${result.modelCount} cached models kept)` : '';\r\n p.log.warn(`${result.name}: ${result.reason}${countNote}`);\r\n return 0;\r\n }\r\n if (!result.ok) {\r\n p.log.error(`${result.name}: ${result.reason ?? 'Refresh failed.'}`);\r\n return 1;\r\n }\r\n const diff = result.previousModelCount === undefined\r\n ? 0\r\n : (result.modelCount ?? 0) - result.previousModelCount;\r\n const diffStr = result.previousModelCount === undefined\r\n ? ''\r\n : diff > 0 ? ` (+${diff})` : diff < 0 ? ` (${diff})` : '';\r\n p.log.success(`${result.name}: ${result.modelCount} model${result.modelCount === 1 ? '' : 's'} updated${diffStr}.`);\r\n if (result.reason) {\r\n p.log.warn(result.reason);\r\n }\r\n return 0;\r\n }\r\n\r\n const spinner = p.spinner();\r\n spinner.start('Refreshing model lists...');\r\n const { refreshed } = await refreshAllProviderModels(resolveKey);\r\n spinner.stop('');\r\n\r\n const ok = refreshed.filter(r => r.ok && !r.skipped);\r\n const skipped = refreshed.filter(r => r.skipped);\r\n const failed = refreshed.filter(r => !r.ok);\r\n\r\n if (ok.length > 0) {\r\n p.log.success(`Updated ${ok.length} provider${ok.length === 1 ? '' : 's'}.`);\r\n for (const r of ok) {\r\n const diff = r.previousModelCount === undefined\r\n ? 0\r\n : (r.modelCount ?? 0) - r.previousModelCount;\r\n const diffStr = r.previousModelCount === undefined\r\n ? ''\r\n : diff > 0 ? ` (+${diff})` : diff < 0 ? ` (${diff})` : '';\r\n p.log.info(` ${r.name}: ${r.modelCount} model${r.modelCount === 1 ? '' : 's'}${diffStr}`);\r\n if (r.reason) {\r\n p.log.warn(` ${r.reason}`);\r\n }\r\n }\r\n }\r\n for (const r of skipped) {\r\n const countNote = r.modelCount ? ` (${r.modelCount} cached models kept)` : '';\r\n p.log.warn(`Skipped ${r.name}: ${r.reason}${countNote}`);\r\n }\r\n for (const r of failed) {\r\n p.log.error(`${r.name}: ${r.reason ?? 'Refresh failed.'}`);\r\n }\r\n return failed.length > 0 ? 1 : 0;\r\n}\r\n\r\nexport async function runProvidersList(): Promise<number> {\r\n const entries = await resolveProvidersForDisplay();\r\n if (entries.length === 0) {\r\n p.log.info('No providers configured. Run anygate providers add or import.');\r\n return 0;\r\n }\r\n\r\n console.log('');\r\n for (const entry of entries) {\r\n const status = entry.enabled ? pc.green('●') : pc.dim('○');\r\n console.log(\r\n ` ${status} ${pc.bold(entry.name)} ${pc.dim(`(${entry.id})`)} — `\r\n + `${entry.modelCount} model${entry.modelCount === 1 ? '' : 's'}, auth: ${entry.authLabel}`,\r\n );\r\n }\r\n console.log('');\r\n return 0;\r\n}\r\n\r\n\r\nasync function pickTemplateFromCatalog(): Promise<ProviderTemplate | null> {\r\n while (true) {\r\n const registry = loadRegistry();\r\n const configuredIds = new Set(registry.providers.map(p => p.id));\r\n const templates = listAddableTemplates(configuredIds);\r\n if (templates.length === 0) return null;\r\n\r\n const method = await p.select({\r\n message: `Choose a provider (${templates.length} available)`,\r\n options: [\r\n { value: 'search', label: 'Search providers', hint: 'e.g. gro, mistral, together' },\r\n { value: 'browse', label: 'Browse all providers', hint: 'Scroll the full list' },\r\n { value: 'back', label: 'Back', hint: '' },\r\n ],\r\n });\r\n if (p.isCancel(method) || method === 'back') return null;\r\n\r\n if (method === 'browse') {\r\n const options = templates.map(t => ({\r\n value: t.id,\r\n label: t.name,\r\n hint: t.npm,\r\n }));\r\n const picked = await p.select({ message: 'Select a provider', options });\r\n if (p.isCancel(picked)) continue;\r\n const template = templates.find(t => t.id === picked);\r\n if (template) return template;\r\n continue;\r\n }\r\n\r\n const searchInput = await p.text({\r\n message: 'Search providers:',\r\n placeholder: 'e.g. groq, mistral, openrouter',\r\n });\r\n if (p.isCancel(searchInput)) continue;\r\n\r\n const query = String(searchInput);\r\n const matched = filterTemplates(templates, query);\r\n if (matched.length === 0) {\r\n const alreadyAdded = filterTemplates(listSupportedTemplates(), query).filter(t => configuredIds.has(t.id));\r\n if (alreadyAdded.length > 0) {\r\n p.log.info(`Already configured: ${alreadyAdded.map(t => t.name).join(', ')}`);\r\n } else {\r\n p.log.warn('No providers match — try a different search');\r\n }\r\n continue;\r\n }\r\n\r\n const options = matched.map(t => ({\r\n value: t.id,\r\n label: t.name,\r\n hint: t.npm,\r\n }));\r\n const picked = await p.select({\r\n message: matched.length === 1 ? 'Match found' : `Select provider (${matched.length} matches)`,\r\n options,\r\n });\r\n if (p.isCancel(picked)) continue;\r\n const template = matched.find(t => t.id === picked);\r\n if (template) return template;\r\n }\r\n}\r\n\r\nasync function runTemplateAddFlow(): Promise<number> {\r\n if (listAddableTemplates(loadRegistry().providers.map(p => p.id)).length === 0) {\r\n p.log.info('All catalog providers are already configured.');\r\n return 0;\r\n }\r\n\r\n const template = await pickTemplateFromCatalog();\r\n if (!template) return 0;\r\n\r\n if (template.modelSource === 'zen-go-api') {\r\n const existingKey = await readGlobalOpencodeCredential();\r\n let apiKey = existingKey;\r\n if (!apiKey) {\r\n printPanel(pc.cyan('OpenCode cloud'), [\r\n `${pc.white('Get an API key at:')} ${fmtUrl('https://opencode.ai/auth')}`,\r\n `${pc.dim('Uses OpenCode Zen / Go cloud models — not the same as importing from the OpenCode CLI.')}`,\r\n ]);\r\n const collected = await resolveOrCollectApiKey(false, false);\r\n if (!collected) {\r\n p.cancel('Cancelled.');\r\n return 0;\r\n }\r\n apiKey = collected;\r\n }\r\n await upgradeGlobalOpencodeCredential();\r\n\r\n const spinner = p.spinner();\r\n spinner.start(`Adding ${template.name}...`);\r\n\r\n const zenStub = addZenRegistryStub();\r\n const goStub = addGoRegistryStub();\r\n if (!zenStub.added && !goStub.added) {\r\n spinner.stop('');\r\n p.log.warn('OpenCode Zen / Go is already configured.');\r\n return 0;\r\n }\r\n\r\n const registry = loadRegistry();\r\n const refreshResults = [\r\n await refreshProviderModels('zen', apiKey, registry),\r\n await refreshProviderModels('go', apiKey, registry),\r\n ];\r\n spinner.stop('');\r\n\r\n const modelCount = refreshResults.reduce((total, result) => total + (result.modelCount ?? 0), 0);\r\n const failed = refreshResults.filter(result => !result.ok);\r\n if (failed.length === 0) {\r\n p.log.success(`Added ${template.name} — ${fmtCount(modelCount, 'model')} updated.`);\r\n } else {\r\n p.log.warn(`Added ${template.name}, but ${failed.length} catalog refresh${failed.length === 1 ? '' : 'es'} failed.`);\r\n }\r\n return 0;\r\n }\r\n\r\n if (template.signupUrl) {\r\n printPanel(fmtProvider(template.name), [\r\n `${pc.white('Get an API key at:')} ${fmtUrl(template.signupUrl)}`,\r\n ]);\r\n }\r\n\r\n let baseUrlOverride: string | undefined;\r\n if (template.urlPrompt) {\r\n const urlInput = await p.text({\r\n message: template.urlPrompt,\r\n initialValue: template.defaultBaseUrl,\r\n validate: v => v.trim() ? undefined : 'URL is required',\r\n });\r\n if (p.isCancel(urlInput)) return 0;\r\n baseUrlOverride = String(urlInput).trim();\r\n \r\n const usesHttp = /^http:\\/\\//i.test(baseUrlOverride);\r\n if (usesHttp) {\r\n p.log.warn('HTTP is not encrypted. Use it only for trusted local or LAN servers, like Ollama on your own network.');\r\n }\r\n const valid = await validateCustomEndpointUrl(baseUrlOverride, { allowInsecureLocal: usesHttp });\r\n if (!valid.ok) {\r\n p.log.error(valid.error ?? 'Invalid URL');\r\n if (valid.hint) p.log.info(valid.hint);\r\n return 1;\r\n }\r\n }\r\n\r\n const apiKeyMsg = template.anonymousFreeModels\r\n ? `API key (leave empty to use free models only):`\r\n : template.apiKeyOptional\r\n ? `API key (leave empty for local servers without auth):`\r\n : `Paste your ${template.name} API key:`;\r\n\r\n const apiKeyInput = await p.password({\r\n message: apiKeyMsg,\r\n validate: val => template.apiKeyOptional ? undefined : (val.trim() ? undefined : 'Key cannot be empty'),\r\n });\r\n if (p.isCancel(apiKeyInput)) {\r\n p.cancel('Cancelled.');\r\n return 0;\r\n }\r\n \r\n const rawKey = String(apiKeyInput).trim();\r\n const apiKey = template.apiKeyOptional && !rawKey && !template.anonymousFreeModels ? template.id : rawKey;\r\n\r\n const spinner = p.spinner();\r\n spinner.start(`Testing connection to ${template.name}...`);\r\n const result = await addProviderFromTemplate(template, apiKey, { baseUrl: baseUrlOverride });\r\n spinner.stop('');\r\n\r\n if (!result.added) {\r\n p.log.error(result.error ?? 'Could not add provider.');\r\n if (result.hint) p.log.info(result.hint);\r\n return 1;\r\n }\r\n\r\n logConnected(template.name, result.modelCount ?? 0);\r\n return 0;\r\n}\r\n\r\n\r\nasync function runCustomEndpointAddFlow(): Promise<number> {\r\n const kindChoice = await p.select({\r\n message: 'Custom server type',\r\n options: [\r\n {\r\n value: 'openai',\r\n label: 'Works with most AI services',\r\n hint: 'OpenAI-compatible API (Together, vLLM, Ollama, …)',\r\n },\r\n {\r\n value: 'anthropic',\r\n label: 'Claude-style API servers',\r\n hint: 'Anthropic-compatible /v1/messages passthrough',\r\n },\r\n { value: 'back', label: 'Back', hint: '' },\r\n ],\r\n });\r\n if (p.isCancel(kindChoice) || kindChoice === 'back') return 0;\r\n\r\n const displayName = await p.text({\r\n message: 'Display name:',\r\n placeholder: 'My Work LLM',\r\n validate: v => v.trim() ? undefined : 'Name is required',\r\n });\r\n if (p.isCancel(displayName)) return 0;\r\n\r\n const baseUrl = await p.text({\r\n message: 'Base URL:',\r\n placeholder: kindChoice === 'openai' ? 'https://api.together.xyz/v1' : 'https://api.anthropic.com',\r\n validate: v => v.trim() ? undefined : 'URL is required',\r\n });\r\n if (p.isCancel(baseUrl)) return 0;\r\n\r\n const usesHttp = /^http:\\/\\//i.test(String(baseUrl).trim());\r\n let allowInsecureHttp = false;\r\n if (usesHttp) {\r\n p.log.warn('HTTP is not encrypted. Only use it for a trusted local or LAN server, like Ollama on your own network.');\r\n const allowLocal = await p.confirm({\r\n message: 'Allow insecure HTTP for this local/LAN server?',\r\n initialValue: true,\r\n });\r\n if (p.isCancel(allowLocal)) return 0;\r\n allowInsecureHttp = allowLocal === true;\r\n }\r\n\r\n const apiKey = await p.password({\r\n message: 'API key (leave empty for local servers without auth):',\r\n });\r\n if (p.isCancel(apiKey)) return 0;\r\n\r\n const wantsHeaders = await p.confirm({\r\n message: 'Does this endpoint need extra custom headers? (e.g. a plan/auth-tracking header)',\r\n initialValue: false,\r\n });\r\n if (p.isCancel(wantsHeaders)) return 0;\r\n\r\n const headers: Record<string, string> = {};\r\n if (wantsHeaders) {\r\n for (;;) {\r\n const headerLine = await p.text({\r\n message: 'Header (leave empty when done):',\r\n placeholder: 'X-Plan: coding',\r\n });\r\n if (p.isCancel(headerLine)) return 0;\r\n const trimmed = String(headerLine).trim();\r\n if (!trimmed) break;\r\n const idx = trimmed.indexOf(':');\r\n if (idx < 1) {\r\n p.log.warn('Use the format \"Name: Value\" — skipped.');\r\n continue;\r\n }\r\n const name = trimmed.slice(0, idx).trim();\r\n const value = trimmed.slice(idx + 1).trim();\r\n if (name) headers[name] = value;\r\n }\r\n }\r\n\r\n const spinner = p.spinner();\r\n spinner.start('Testing connection...');\r\n const result = await addCustomEndpointProvider({\r\n displayName: String(displayName).trim(),\r\n baseUrl: String(baseUrl).trim(),\r\n apiKey: String(apiKey ?? '').trim(),\r\n kind: kindChoice as 'openai' | 'anthropic',\r\n allowInsecureLocal: allowInsecureHttp,\r\n headers: Object.keys(headers).length > 0 ? headers : undefined,\r\n });\r\n spinner.stop('');\r\n\r\n if (!result.added) {\r\n p.log.error(result.error ?? 'Could not add custom provider.');\r\n if (result.hint) p.log.info(result.hint);\r\n return 1;\r\n }\r\n\r\n logConnected(result.provider?.name ?? 'Provider', result.modelCount ?? 0);\r\n return 0;\r\n}\r\n\r\nexport async function runProvidersAdd(): Promise<number> {\r\n const registry = loadRegistry();\r\n const hasOpencode = findOpencodeBinary() !== null;\r\n\r\n const options: Array<{ value: string; label: string; hint: string }> = [];\r\n const addableTemplates = listAddableTemplates(registry.providers.map(p => p.id));\r\n if (addableTemplates.length > 0) {\r\n options.push({\r\n value: 'templates',\r\n label: 'Add Groq, Mistral, Together AI, …',\r\n hint: `${addableTemplates.length} provider${addableTemplates.length === 1 ? '' : 's'} available`,\r\n });\r\n }\r\n options.push({\r\n value: 'custom',\r\n label: 'Custom server (Advanced)',\r\n hint: 'OpenAI-compatible or Claude-style API URL',\r\n });\r\n options.push({\r\n value: 'import',\r\n label: 'Import providers from OpenCode CLI',\r\n hint: hasOpencode ? 'Import Groq, OpenAI, etc. from your OpenCode config' : 'Requires OpenCode CLI',\r\n });\r\n\r\n const choice = await p.select({ message: 'Add a provider', options });\r\n if (p.isCancel(choice)) {\r\n p.cancel('Cancelled.');\r\n return 0;\r\n }\r\n\r\n if (choice === 'import') {\r\n if (!hasOpencode) {\r\n p.log.error('OpenCode CLI not found. Install from https://opencode.ai');\r\n return 1;\r\n }\r\n return runProvidersImport();\r\n }\r\n if (choice === 'templates') return runTemplateAddFlow();\r\n if (choice === 'custom') return runCustomEndpointAddFlow();\r\n return 0;\r\n}\r\n\r\nexport async function runProvidersRemove(id: string, interactive = false): Promise<number> {\r\n const registry = loadRegistry();\r\n const provider = registry.providers.find(pr => pr.id === id);\r\n if (!provider) {\r\n p.log.error(`Provider not found: ${id}`);\r\n return 1;\r\n }\r\n\r\n if (interactive) {\r\n const confirm = await p.confirm({\r\n message: `Remove ${provider.name} (${id})?`,\r\n initialValue: false,\r\n });\r\n if (p.isCancel(confirm) || !confirm) {\r\n p.cancel('Cancelled.');\r\n return 0;\r\n }\r\n }\r\n\r\n const result = await removeProviderFromRegistry(id);\r\n if (!result.removed) {\r\n p.log.error(result.error ?? `Could not remove ${id}`);\r\n return 1;\r\n }\r\n\r\n p.log.success(`Removed ${result.name ?? id}.`);\r\n if (result.credentialDeleted) {\r\n p.log.info('Provider API key removed from Keychain.');\r\n }\r\n return 0;\r\n}\r\n\r\nasync function runOpenCodeCloudDetail(): Promise<'back'> {\r\n const registry = loadRegistry();\r\n const routes = registry.providers.filter(provider => provider.id === 'zen' || provider.id === 'go');\r\n printCloudProviderPanel('OpenCode Zen / Go');\r\n if (routes.length === 0) return 'back';\r\n\r\n const choice = await p.select({\r\n message: 'Manage an OpenCode catalog',\r\n options: [\r\n ...routes.map(provider => ({\r\n value: provider.id,\r\n label: provider.name,\r\n hint: `${provider.modelsCache?.models.length ?? 0} cached models`,\r\n })),\r\n { value: 'back', label: 'Back', hint: '' },\r\n ],\r\n });\r\n if (!p.isCancel(choice) && choice !== 'back') {\r\n await runProviderDetail(String(choice));\r\n }\r\n return 'back';\r\n}\r\n\r\nexport function providerHubChoiceValue(entry: ProviderDisplayEntry): string {\r\n return `provider:${entry.id}`;\r\n}\r\n\r\nasync function runProviderDetail(id: string): Promise<'back' | 'removed'> {\r\n const registry = loadRegistry();\r\n const provider = registry.providers.find(pr => pr.id === id);\r\n if (!provider) return 'back';\r\n\r\n const modelCount = provider.modelsCache?.models.length ?? 0;\r\n const authLabel = formatRegistryAuthLabel(provider);\r\n printProviderDetailPanel(provider.name, modelCount, authLabel);\r\n\r\n const detailOptions: Array<{ value: string; label: string; hint?: string }> = [];\r\n if (modelCount > 0) {\r\n detailOptions.push({\r\n value: 'browse',\r\n label: 'Browse models',\r\n hint: `Search or browse ${modelCount} model${modelCount === 1 ? '' : 's'}`,\r\n });\r\n }\r\n detailOptions.push({\r\n value: 'refresh',\r\n label: 'Refresh model list',\r\n hint: 'Fetch latest models from the provider API',\r\n });\r\n if (supportsNativeOAuth(id) || provider.authType === 'oauth') {\r\n detailOptions.push({\r\n value: 'auth',\r\n label: 'Sign in again (OAuth)',\r\n hint: 'Refresh OAuth tokens or switch accounts',\r\n });\r\n }\r\n detailOptions.push(\r\n {\r\n value: 'toggle',\r\n label: provider.enabled ? 'Disable provider' : 'Enable provider',\r\n hint: provider.enabled ? 'Hide from anygate claude picker' : 'Show in anygate claude picker',\r\n },\r\n { value: 'remove', label: 'Remove provider', hint: 'Delete from registry and Keychain when safe' },\r\n { value: 'back', label: 'Back', hint: '' },\r\n );\r\n\r\n const action = await p.select({\r\n message: 'What would you like to do?',\r\n options: detailOptions,\r\n });\r\n if (p.isCancel(action) || action === 'back') return 'back';\r\n\r\n if (action === 'browse') {\r\n const cachedModels = provider.modelsCache?.models ?? [];\r\n const localModels = cachedModels\r\n .map(m => cachedModelToLocal(m, provider))\r\n .filter((m): m is NonNullable<typeof m> => m !== null);\r\n const localProvider: LocalProvider = {\r\n id: provider.id,\r\n name: provider.name,\r\n apiKey: '',\r\n models: localModels,\r\n };\r\n await browseAllModels(localProvider, loadPreferences());\r\n return 'back';\r\n }\r\n\r\n if (action === 'refresh') {\r\n await runProvidersRefreshModels(id);\r\n return 'back';\r\n }\r\n\r\n if (action === 'auth') {\r\n await runProvidersAuth(id);\r\n return 'back';\r\n }\r\n\r\n if (action === 'toggle') {\r\n const result = toggleProviderEnabled(id);\r\n if (result.toggled) {\r\n p.log.success(`${provider.name} ${result.enabled ? 'enabled' : 'disabled'}.`);\r\n }\r\n return 'back';\r\n }\r\n\r\n const code = await runProvidersRemove(id, true);\r\n return code === 0 ? 'removed' : 'back';\r\n}\r\n\r\nexport async function runProvidersHub(): Promise<number> {\r\n const hasOpencode = findOpencodeBinary() !== null;\r\n\r\n while (true) {\r\n const entries = await resolveProvidersForDisplay();\r\n const options: Array<{ value: string; label: string; hint?: string }> = [\r\n { value: 'add', label: pc.bold('+ Add a provider'), hint: '' },\r\n ];\r\n\r\n for (const entry of entries) {\r\n const hint = entry.id;\r\n const value = providerHubChoiceValue(entry);\r\n options.push({\r\n value,\r\n label: providerLabel(entry.name, entry.modelCount, entry.enabled),\r\n hint,\r\n });\r\n }\r\n\r\n options.push({ value: 'auth-menu', label: '→ Sign in with OAuth', hint: 'GitHub Copilot · xAI · OpenAI' });\r\n if (entries.length > 0) {\r\n options.push({ value: 'refresh-all', label: '↺ Refresh all models', hint: 'Update model lists for all providers' });\r\n }\r\n if (hasOpencode) {\r\n options.push({ value: 'import', label: '→ Import providers from OpenCode CLI', hint: 'One-time import' });\r\n }\r\n options.push({ value: 'done', label: 'Done', hint: '' });\r\n\r\n const choice = await p.select({\r\n message: entries.length > 0 ? 'Your AI providers' : 'Get started',\r\n options,\r\n });\r\n if (p.isCancel(choice) || choice === 'done') {\r\n return 0;\r\n }\r\n if (choice === 'add') {\r\n await runProvidersAdd();\r\n continue;\r\n }\r\n if (choice === 'import') {\r\n await runProvidersImport();\r\n continue;\r\n }\r\n if (choice === 'refresh-all') {\r\n await runProvidersRefreshModels();\r\n continue;\r\n }\r\n if (choice === 'auth-menu') {\r\n const configuredIds = loadRegistry().providers.map(provider => provider.id);\r\n const oauthTemplates = listVisibleOAuthTemplates(configuredIds);\r\n if (oauthTemplates.length === 0) {\r\n p.log.info('All visible OAuth providers are already configured.');\r\n continue;\r\n }\r\n const providerId = await p.select({\r\n message: 'Which provider?',\r\n options: oauthTemplates.map(template => ({\r\n value: template.id,\r\n label: template.name,\r\n hint: 'device code',\r\n })),\r\n });\r\n if (!p.isCancel(providerId)) await runProvidersAuth(providerId as string);\r\n continue;\r\n }\r\n if (typeof choice === 'string' && choice.startsWith('cloud:')) {\r\n const id = choice.slice('cloud:'.length);\r\n if (id === 'opencode') await runOpenCodeCloudDetail();\r\n continue;\r\n }\r\n if (typeof choice === 'string' && choice.startsWith('provider:')) {\r\n const id = choice.slice('provider:'.length);\r\n const outcome = await runProviderDetail(id);\r\n if (outcome === 'removed') continue;\r\n }\r\n }\r\n}\r\n\r\nexport async function runProvidersCommand(args: string[]): Promise<number> {\r\n const parsed = parseProvidersArgs(args);\r\n if (parsed.error) {\r\n p.log.error(parsed.error);\r\n return 1;\r\n }\r\n if (parsed.showHelp) {\r\n console.log(providersHelpText());\r\n return 0;\r\n }\r\n\r\n if (parsed.subcommand === 'import') return runProvidersImport();\r\n if (parsed.subcommand === 'list') return runProvidersList();\r\n if (parsed.subcommand === 'add') return runProvidersAdd();\r\n if (parsed.subcommand === 'remove' && parsed.removeId) return runProvidersRemove(parsed.removeId);\r\n if (parsed.subcommand === 'refresh-models') return runProvidersRefreshModels(parsed.removeId);\r\n if (parsed.subcommand === 'auth') {\r\n if (parsed.showHelp || !parsed.removeId) {\r\n console.log(providerAuthHelpText());\r\n return 0;\r\n }\r\n return runProvidersAuth(parsed.removeId, parsed.authMethod);\r\n }\r\n\r\n gateIntro('Your AI providers');\r\n return runProvidersHub();\r\n}\r\n","// codex.ts — anygate codex: launch OpenAI Codex CLI with registry providers\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport { fetchProviderCatalog, providersForPicker } from '../../../src/providers/provider-catalog.js';\r\nimport { resolveLocalProviderApiKey } from '../../../src/core/credentials.js';\r\nimport { loadPreferences, recordLaunchSelection } from '../../../src/core/config.js';\r\nimport { resolveApiKey, readFromCredentialStore } from '../../../src/core/env.js';\r\nimport { resolveOrCollectApiKey } from '../../agents/shared/key-setup.js';\r\nimport { startCodexProxy } from './proxy.js';\r\nimport type { CodexProxyHandle } from './proxy.js';\r\nimport { buildCatalogFile, formatCodexModelLabel, serializeCatalog } from './catalog.js';\r\nimport { buildCodexProfileToml, getCatalogOutputPath, getProfileOutputPath } from './profile.js';\r\nimport { findCodexBinary, buildCodexChildEnv, launchCodex } from './launch.js';\r\nimport { pickCodexProvider, pickCodexModel, confirmCodexLaunch, rejectManagedFlags } from './prompts.js';\r\nimport {\r\n codexCliIntro,\r\n codexCliOutro,\r\n logCodexActiveModel,\r\n logCodexProxy,\r\n printCodexCliCleanupPanel,\r\n} from './ui.js';\r\nimport {\r\n codexCompatibleProviders,\r\n resolveCodexRoute,\r\n routableModelsForProvider,\r\n type CodexRoute,\r\n} from './routing.js';\r\nimport { getReasoningCapabilities } from '../../../src/gateway/provider-factory.js';\r\nimport {\r\n checkSessionLock,\r\n recoverInterruptedCodexSession,\r\n remainingOverlayPaths,\r\n restoreCodexOverlay,\r\n writeOverlayFile,\r\n writeSessionLock,\r\n} from './session.js';\r\nimport {\r\n buildVertexRuntimeConfig,\r\n hasApplicationDefaultCredentials,\r\n type VertexModelEntry,\r\n} from '../../../src/gateway/vertex.js';\r\nimport { VERTEX_ANTHROPIC_NPM } from '../../../src/core/constants.js';\r\nimport { resolveContextWindow } from '../../agents/shared/context-window.js';\r\nimport type { ResolvedFavorite } from '../../agents/shared/favorites-resolver.js';\r\nimport {\r\n buildFavoritesCodexCatalog,\r\n codexCliFavoritesSlug,\r\n defaultReasoningEffortForFavorite,\r\n} from './favorites-catalog.js';\r\nimport {\r\n buildCodexProxyRoutesFromResolved,\r\n pickFavoriteStartingModel,\r\n resolveCodexFavorites,\r\n} from './favorites-launch.js';\r\nimport { getFavoritesCatalogPath } from './profile.js';\r\nimport type { LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\nimport {\r\n buildSingleModelCloudCodeRoute,\r\n needsCloudCodeBackend,\r\n partitionAndStartCloudCodeBackend,\r\n type CloudCodeBackend,\r\n} from '../shared/cloud-code-backend.js';\r\nimport { getCodexProxyDebugLogPath, printTraceLog } from '../../agents/shared/trace-log.js';\r\nimport { setAgentStdoutMode, isAgentStdoutMode } from '../../../src/core/agent-io.js';\r\nimport {\r\n findProviderAndModel,\r\n planLaunchWizard,\r\n wantsCleanAgentStdout,\r\n} from '../../agents/shared/launch-target.js';\r\n\r\nexport { findCodexBinary } from './launch.js';\r\nexport { codexCompatibleProviders } from './routing.js';\r\n\r\nexport function codexHelpText(): string {\r\n return `${pc.bold('anygate codex')} — launch OpenAI Codex CLI with your registry providers\r\n\r\n${pc.bold('Usage:')}\r\n anygate codex [options] [codex-flags]\r\n anygate codex --vertex\r\n anygate codex --restore\r\n anygate codex --config\r\n anygate codex --help\r\n anygate codex --version\r\n\r\n${pc.bold('Options:')}\r\n --trace Write proxy debug logs to ~/.anygate/logs/ and show errors on exit\r\n --provider Boot provider id (skip wizard when paired with --model or non-interactive)\r\n --model Boot model id (skip wizard when paired with --provider or non-interactive)\r\n --vertex Use Claude models through Google Vertex AI\r\n --restore Remove interrupted-session overlay files\r\n --config Preview/write launch configuration without starting Codex\r\n --help Show this command help\r\n --version Show version\r\n\r\n${pc.bold('Description:')}\r\n Picks a provider and model from ~/.anygate/providers.json, writes a temporary\r\n anygate-launch profile (never touches ~/.codex/config.toml), and launches Codex.\r\n Overlay files are removed automatically when Codex exits; use --restore after a crash.\r\n Anthropic and other registry models route through a local Responses API proxy.\r\n\r\n${pc.bold('Prerequisites:')}\r\n npm install -g @openai/codex\r\n\r\n${pc.bold('Cleanup:')}\r\n Temporary files: ~/.codex/anygate-launch.config.toml and ~/.anygate/codex/*\r\n Auto-removed on normal exit. After crash or force-quit: anygate codex --restore\r\n\r\n${pc.bold('Passing flags to Codex:')}\r\n Add Codex flags directly — no \"--\" separator needed.\r\n anygate launches with sandbox disabled (danger-full-access) by default so shell\r\n tools can reach the network. Override with your own -s flag if you want a tighter sandbox.\r\n anygate manages --profile, -m, -p (profile), --provider, and --model; other flags go to Codex.\r\n See docs/CODEX.md for sandbox, network, and troubleshooting.\r\n\r\n${pc.bold('OAuth:')}\r\n For ChatGPT Plus/Pro, run anygate providers auth openai first.\r\n\r\n${pc.bold('Examples:')}\r\n anygate codex\r\n anygate codex --trace\r\n anygate codex --provider zen --model deepseek-v4-flash-free\r\n anygate codex --provider zen --model deepseek-v4-flash-free exec \"fix the bug\"\r\n anygate codex -s workspace-write\r\n anygate codex --restore\r\n anygate codex --help\r\n${pc.bold('Favorites:')}\r\n When you have saved favorites via ${pc.cyan('anygate models')}, the Codex\r\n picker will show your starting model + favorites for mid-session switching.\r\n Zen/Go favorites are included when an OpenCode API key is available.`;\r\n}\r\n\r\nasync function writeLaunchArtifacts(\r\n route: CodexRoute,\r\n selectedModel: import('../../core/types.js').LocalProviderModel,\r\n providerName: string,\r\n proxyPort?: number,\r\n): Promise<{ profilePath: string; catalogPath: string }> {\r\n const catalogPath = getCatalogOutputPath(route.providerId);\r\n const catalog = buildCatalogFile([selectedModel], providerName);\r\n writeOverlayFile(catalogPath, serializeCatalog(catalog));\r\n const profilePath = getProfileOutputPath();\r\n const caps = getReasoningCapabilities(route.npm, route.upstreamModelId, {\r\n providerId: route.providerId,\r\n apiBaseUrl: route.baseURL,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n });\r\n writeOverlayFile(profilePath, buildCodexProfileToml({\r\n route,\r\n proxyPort,\r\n catalogPath,\r\n modelReasoningEffort: caps.defaultLevel || undefined,\r\n }));\r\n return { profilePath, catalogPath };\r\n}\r\n\r\nasync function writeFavoritesLaunchArtifacts(\r\n resolved: ResolvedFavorite[],\r\n starting: ResolvedFavorite,\r\n proxyPort: number,\r\n): Promise<{ profilePath: string; catalogPath: string }> {\r\n const catalogPath = getFavoritesCatalogPath();\r\n const catalog = buildFavoritesCodexCatalog(undefined, resolved);\r\n writeOverlayFile(catalogPath, serializeCatalog(catalog));\r\n const profilePath = getProfileOutputPath();\r\n const model = starting.model as import('../../core/types.js').LocalProviderModel;\r\n const dummyRoute: CodexRoute = {\r\n tier: 'proxy',\r\n modelId: codexCliFavoritesSlug(starting.providerId, model.id),\r\n providerId: 'anygate-proxy',\r\n npm: model.npm ?? '@ai-sdk/openai-compatible',\r\n upstreamModelId: model.upstreamModelId || model.id,\r\n apiKey: '',\r\n };\r\n writeOverlayFile(profilePath, buildCodexProfileToml({\r\n route: dummyRoute,\r\n proxyPort,\r\n catalogPath,\r\n modelReasoningEffort: defaultReasoningEffortForFavorite(starting),\r\n }));\r\n return { profilePath, catalogPath };\r\n}\r\n\r\nfunction printCodexCleanupReminder(hadProxy: boolean): void {\r\n if (isAgentStdoutMode()) return;\r\n const left = remainingOverlayPaths();\r\n if (left.length > 0) {\r\n p.log.warn('Temporary Codex overlay files may still be on disk.');\r\n p.log.info('Run: anygate codex --restore');\r\n return;\r\n }\r\n const parts = ['Temporary Codex profile removed.'];\r\n if (hadProxy) parts.push('Local Responses proxy stopped.');\r\n parts.push('If a future session acts stuck: anygate codex --restore');\r\n p.log.info(parts.join(' '));\r\n}\r\n\r\nfunction vertexEntryToLocalModel(entry: VertexModelEntry): import('../../core/types.js').LocalProviderModel {\r\n return {\r\n id: entry.id,\r\n name: entry.display_name,\r\n family: 'claude',\r\n brand: 'Anthropic',\r\n modelFormat: 'openai',\r\n upstreamModelId: entry.upstream_id ?? entry.id,\r\n baseUrl: '',\r\n npm: VERTEX_ANTHROPIC_NPM,\r\n contextWindow: resolveContextWindow(entry.id),\r\n };\r\n}\r\n\r\nasync function runCodexVertexLaunch(\r\n passthroughArgs: string[],\r\n trace: boolean,\r\n): Promise<number> {\r\n if (!hasApplicationDefaultCredentials()) {\r\n p.log.error('Google Application Default Credentials not found.');\r\n p.log.info('Run: gcloud auth application-default login');\r\n return 1;\r\n }\r\n\r\n const config = buildVertexRuntimeConfig();\r\n if (!config) {\r\n p.log.error('ANTHROPIC_VERTEX_PROJECT_ID (or GOOGLE_CLOUD_PROJECT) is not set.');\r\n p.log.info('Set your project: export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id');\r\n return 1;\r\n }\r\n\r\n let selectedEntry: VertexModelEntry;\r\n if (config.models.length === 1) {\r\n selectedEntry = config.models[0]!;\r\n } else {\r\n const choice = await p.select({\r\n message: 'Select a Vertex AI model:',\r\n options: config.models.map(m => ({ value: m, label: m.display_name, hint: m.id })),\r\n });\r\n if (p.isCancel(choice)) { p.cancel('Cancelled.'); return 0; }\r\n selectedEntry = choice as VertexModelEntry;\r\n }\r\n\r\n process.env['ANTHROPIC_VERTEX_PROJECT_ID'] = config.project;\r\n process.env['GOOGLE_CLOUD_LOCATION'] = config.location;\r\n\r\n const vertexConfig = { project: config.project, location: config.location };\r\n const allModels = config.models.map(vertexEntryToLocalModel);\r\n const allRoutes = allModels.map(m => ({\r\n modelId: m.id,\r\n upstreamModelId: m.upstreamModelId,\r\n npm: VERTEX_ANTHROPIC_NPM,\r\n apiKey: '',\r\n providerId: 'vertex',\r\n vertex: vertexConfig,\r\n }));\r\n\r\n const startingRoute: CodexRoute = {\r\n tier: 'proxy',\r\n modelId: selectedEntry.id,\r\n upstreamModelId: selectedEntry.upstream_id ?? selectedEntry.id,\r\n npm: VERTEX_ANTHROPIC_NPM,\r\n apiKey: '',\r\n providerId: 'vertex',\r\n };\r\n\r\n const debugLogPath = getCodexProxyDebugLogPath();\r\n let proxyHandle: CodexProxyHandle | null = null;\r\n try {\r\n p.log.info(`Vertex AI · ${selectedEntry.display_name} — project: ${config.project} / location: ${config.location}`);\r\n proxyHandle = await startCodexProxy(allRoutes, { debug: trace });\r\n const proxyPort = proxyHandle.port;\r\n\r\n const catalogPath = getCatalogOutputPath('vertex');\r\n writeOverlayFile(catalogPath, serializeCatalog(buildCatalogFile(allModels, 'Vertex AI')));\r\n const profilePath = getProfileOutputPath();\r\n const caps = getReasoningCapabilities(VERTEX_ANTHROPIC_NPM, selectedEntry.id);\r\n writeOverlayFile(profilePath, buildCodexProfileToml({\r\n route: startingRoute,\r\n proxyPort,\r\n catalogPath,\r\n modelReasoningEffort: caps.defaultLevel || undefined,\r\n }));\r\n\r\n writeSessionLock({\r\n pid: process.pid,\r\n startedAt: new Date().toISOString(),\r\n profilePath,\r\n catalogPaths: [catalogPath],\r\n proxyPort,\r\n });\r\n\r\n if (!isAgentStdoutMode()) {\r\n logCodexProxy(proxyPort);\r\n logCodexActiveModel(selectedEntry.display_name, selectedEntry.id);\r\n printCodexCliCleanupPanel('anygate codex --restore');\r\n }\r\n\r\n const childEnv = buildCodexChildEnv(startingRoute, proxyPort);\r\n const exitCode = await launchCodex(selectedEntry.id, childEnv, passthroughArgs);\r\n if (trace) printTraceLog(debugLogPath);\r\n printCodexCleanupReminder(true);\r\n return exitCode;\r\n } finally {\r\n proxyHandle?.close();\r\n restoreCodexOverlay();\r\n }\r\n}\r\n\r\nexport async function runCodexCommand(\r\n codexArgs: string[],\r\n trace = false,\r\n launch: { launchProvider?: string; launchModel?: string; vertex?: boolean } = {},\r\n): Promise<number> {\r\n if (codexArgs.includes('--help') || codexArgs.includes('-h')) {\r\n console.log(codexHelpText());\r\n return 0;\r\n }\r\n\r\n if (codexArgs.includes('--restore')) {\r\n const removed = restoreCodexOverlay();\r\n if (removed.length) {\r\n console.log(`Restored: removed ${removed.length} anygate Codex overlay file(s).`);\r\n } else {\r\n console.log('Nothing to restore.');\r\n }\r\n return 0;\r\n }\r\n\r\n const codexPath = findCodexBinary();\r\n if (!codexPath) {\r\n console.error(pc.red('\\nError: codex binary not found on PATH.\\n'));\r\n console.error('Install OpenAI Codex CLI:');\r\n console.error(' npm install -g @openai/codex\\n');\r\n return 1;\r\n }\r\n\r\n const interrupted = recoverInterruptedCodexSession();\r\n\r\n const configOnly = codexArgs.includes('--config');\r\n const passthroughArgs = rejectManagedFlags(codexArgs.filter(a => a !== '--config'));\r\n const agentStdout = wantsCleanAgentStdout('codex', passthroughArgs);\r\n setAgentStdoutMode(agentStdout);\r\n const debugLogPath = getCodexProxyDebugLogPath();\r\n if (trace && !configOnly) {\r\n p.log.info(`Debug log: ${debugLogPath}`);\r\n }\r\n\r\n const isTty = Boolean(process.stdin.isTTY);\r\n if (launch.vertex) {\r\n if (!configOnly) {\r\n const sessionCheck = checkSessionLock(isTty);\r\n if (!sessionCheck.ok) {\r\n if (sessionCheck.reason === 'non_tty') {\r\n console.error(pc.red('anygate codex --vertex requires an interactive terminal.'));\r\n return 1;\r\n }\r\n console.error(pc.yellow(`Another anygate codex session may be running (pid ${sessionCheck.lock.pid}).`));\r\n console.error('Run anygate codex --restore to clean up, or wait for it to finish.');\r\n return 1;\r\n }\r\n }\r\n return runCodexVertexLaunch(passthroughArgs, trace);\r\n }\r\n\r\n const prefs = loadPreferences();\r\n const launchPlan = planLaunchWizard({\r\n explicit: { providerId: launch.launchProvider, modelId: launch.launchModel },\r\n childArgs: passthroughArgs,\r\n agent: 'codex',\r\n prefs,\r\n });\r\n if (launchPlan.error) {\r\n console.error(pc.red(`\\nError: ${launchPlan.error}\\n`));\r\n return 1;\r\n }\r\n const allowNonTty = !!(launchPlan.skip && launchPlan.target);\r\n\r\n if (!configOnly) {\r\n const sessionCheck = checkSessionLock(isTty || allowNonTty);\r\n if (!sessionCheck.ok) {\r\n if (sessionCheck.reason === 'non_tty') {\r\n console.error(pc.red(\r\n 'anygate codex requires an interactive terminal (or use --provider and --model for non-interactive launch).',\r\n ));\r\n return 1;\r\n }\r\n console.error(pc.yellow(`Another anygate codex session may be running (pid ${sessionCheck.lock.pid}).`));\r\n console.error('Run anygate codex --restore to clean up, or wait for it to finish.');\r\n return 1;\r\n }\r\n }\r\n\r\n if (!configOnly) {\r\n if (!agentStdout) codexCliIntro();\r\n if (interrupted.recovered && !agentStdout) {\r\n p.log.warn(\r\n 'Found leftover Codex files from an interrupted session (closed terminal, crash, or force-quit).',\r\n );\r\n p.log.info(\r\n `Removed ${interrupted.removedCount ?? 'those'} file(s) automatically. `\r\n + 'If anything still looks wrong: anygate codex --restore',\r\n );\r\n }\r\n }\r\n\r\n let catalog;\r\n if (agentStdout) {\r\n try {\r\n catalog = await fetchProviderCatalog({ agent: 'codex' });\r\n } catch (err) {\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n } else {\r\n const catalogSpinner = p.spinner();\r\n catalogSpinner.start('Loading your providers...');\r\n try {\r\n catalog = await fetchProviderCatalog({ agent: 'codex' });\r\n } catch (err) {\r\n catalogSpinner.stop('');\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n catalogSpinner.stop('');\r\n }\r\n\r\n const compatible = codexCompatibleProviders(providersForPicker(catalog), 'codex');\r\n if (compatible.length === 0) {\r\n if (!configOnly) {\r\n p.log.warn('No Codex-compatible providers in your registry.');\r\n p.log.info('Add a provider with anygate providers add, or sign in with anygate providers auth openai.');\r\n }\r\n return 0;\r\n }\r\n\r\n const favorites = prefs.favoriteModels ?? [];\r\n const favoritesActive = favorites.length > 0 && !launchPlan.skip;\r\n if (favoritesActive && !configOnly) {\r\n p.log.info(\r\n `Favorites mode active — Codex picker will show ${favorites.length + 1} models (1 starting + ${favorites.length} favorites).`,\r\n );\r\n p.log.info('Edit with `anygate models`.');\r\n }\r\n let activeProvider = compatible.find(lp => lp.id === prefs.lastCodexProvider) ?? compatible[0]!;\r\n let selectedModel = activeProvider.models.find(m => m.id === prefs.lastCodexModel) ?? activeProvider.models[0]!;\r\n\r\n if (!configOnly && launchPlan.skip && launchPlan.target) {\r\n const resolved = findProviderAndModel(compatible, launchPlan.target);\r\n if (!resolved) {\r\n p.log.error(\r\n `Provider/model not found: ${launchPlan.target.providerId} / ${launchPlan.target.modelId}`,\r\n );\r\n return 1;\r\n }\r\n activeProvider = resolved.provider;\r\n selectedModel = resolved.model;\r\n if (!agentStdout) {\r\n p.log.step(`Using ${selectedModel.name || selectedModel.id} (${activeProvider.name})`);\r\n }\r\n } else if (!configOnly) {\r\n let currentInitialProvider = prefs.lastCodexProvider && compatible.some(o => o.id === prefs.lastCodexProvider)\r\n ? prefs.lastCodexProvider\r\n : compatible[0]!.id;\r\n while (true) {\r\n const pickedProvider = await pickCodexProvider(compatible, prefs, favoritesActive, currentInitialProvider);\r\n if (!pickedProvider) return 0;\r\n \r\n if (pickedProvider === '__favorites__') {\r\n const favoritePick = await pickFavoriteStartingModel(\r\n compatible,\r\n favorites,\r\n 'codex',\r\n 'Codex',\r\n provider => ({ ...provider, models: routableModelsForProvider(provider, 'codex') }),\r\n );\r\n if (favoritePick === 'cancelled' || favoritePick === 'unavailable') return 0;\r\n activeProvider = favoritePick.provider;\r\n selectedModel = favoritePick.model;\r\n break;\r\n } else {\r\n activeProvider = pickedProvider as LocalProvider;\r\n const pickedModelResult = await pickCodexModel(activeProvider, prefs);\r\n if (pickedModelResult === 'back') {\r\n currentInitialProvider = activeProvider.id;\r\n continue;\r\n }\r\n if (!pickedModelResult) return 0;\r\n selectedModel = pickedModelResult;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let resolvedFavorites: ResolvedFavorite[] = [];\r\n let providersById: Map<string, LocalProvider> = new Map();\r\n\r\n if (favoritesActive) {\r\n const res = await resolveCodexFavorites(\r\n activeProvider,\r\n selectedModel,\r\n compatible,\r\n favorites,\r\n 'codex',\r\n );\r\n resolvedFavorites = res.resolvedFavorites;\r\n providersById = res.providersById;\r\n }\r\n\r\n const apiKey = await resolveLocalProviderApiKey(activeProvider);\r\n if (!apiKey) {\r\n if (!configOnly) {\r\n p.log.error(`No credential for ${activeProvider.name}. Run anygate providers auth ${activeProvider.id} or add an API key.`);\r\n }\r\n return 1;\r\n }\r\n\r\n const route = resolveCodexRoute(activeProvider, selectedModel, apiKey);\r\n\r\n if (!configOnly && !(launchPlan.skip && launchPlan.target)) {\r\n const modelLabel = formatCodexModelLabel(selectedModel);\r\n const confirmed = await confirmCodexLaunch(\r\n activeProvider.name,\r\n modelLabel,\r\n selectedModel.id,\r\n route,\r\n );\r\n if (!confirmed) return 0;\r\n }\r\n\r\n let proxyHandle: CodexProxyHandle | null = null;\r\n let cloudCodeBackend: CloudCodeBackend | null = null;\r\n let cloudCodeBackendFav: CloudCodeBackend | null = null;\r\n try {\r\n let proxyPort: number | undefined;\r\n if (favoritesActive && resolvedFavorites.length > 0) {\r\n const needsBackend = (r: typeof resolvedFavorites[0]) => {\r\n const m = r.model as LocalProviderModel;\r\n const prov = providersById.get(r.providerId);\r\n return needsCloudCodeBackend(m, prov?.authType);\r\n };\r\n const backendResolved = resolvedFavorites.filter(needsBackend);\r\n const regularResolved = resolvedFavorites.filter(r => !needsBackend(r));\r\n\r\n let backendCodexRoutes: import('./proxy.js').CodexProxyRoute[] = [];\r\n\r\n if (backendResolved.length > 0) {\r\n const partitioned = await partitionAndStartCloudCodeBackend(\r\n backendResolved.map(r => {\r\n const provider = providersById.get(r.providerId);\r\n return {\r\n providerId: r.providerId,\r\n model: r.model as LocalProviderModel,\r\n apiKey: r.apiKey,\r\n oauthAccountId: provider?.oauthAccountId,\r\n providerData: (provider?.providerData ?? {}) as Record<string, unknown>,\r\n };\r\n }),\r\n (cr, backend, original) => ({\r\n modelId: cr.aliasId,\r\n npm: '@ai-sdk/anthropic',\r\n apiKey: backend.token,\r\n baseURL: `http://127.0.0.1:${backend.port}`,\r\n upstreamModelId: cr.aliasId,\r\n providerId: cr.providerId ?? 'antigravity',\r\n authType: 'oauth' as const,\r\n oauthAccountId: original.oauthAccountId,\r\n providerData: original.providerData,\r\n contextWindow: cr.contextWindow,\r\n }),\r\n trace,\r\n );\r\n cloudCodeBackendFav = partitioned.backend;\r\n backendCodexRoutes = partitioned.backendItems;\r\n }\r\n\r\n const regularRoutes = buildCodexProxyRoutesFromResolved(regularResolved, providersById);\r\n const allRoutes = [...backendCodexRoutes, ...regularRoutes];\r\n\r\n proxyHandle = await startCodexProxy(allRoutes, { requireAuth: true, debug: trace });\r\n proxyPort = proxyHandle.port;\r\n } else if (route.tier === 'cloud-code') {\r\n const providerData = (activeProvider.providerData ?? {}) as Record<string, unknown>;\r\n const { proxyRoute: cloudRoute, backend } = await buildSingleModelCloudCodeRoute(\r\n selectedModel,\r\n apiKey,\r\n route.providerId,\r\n providerData,\r\n trace,\r\n );\r\n cloudCodeBackend = backend;\r\n proxyHandle = await startCodexProxy([{\r\n modelId: cloudRoute.aliasId,\r\n npm: '@ai-sdk/anthropic',\r\n apiKey: cloudCodeBackend.token,\r\n baseURL: `http://127.0.0.1:${cloudCodeBackend.port}`,\r\n upstreamModelId: cloudRoute.aliasId,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData,\r\n contextWindow: route.contextWindow,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n }], { debug: trace });\r\n proxyPort = proxyHandle.port;\r\n } else if (route.authType === 'oauth' && selectedModel.modelFormat === 'anthropic') {\r\n const providerData = (activeProvider.providerData ?? {}) as Record<string, unknown>;\r\n const { proxyRoute: oauthRoute, backend } = await buildSingleModelCloudCodeRoute(\r\n selectedModel,\r\n apiKey,\r\n route.providerId,\r\n providerData,\r\n trace,\r\n );\r\n cloudCodeBackend = backend;\r\n proxyHandle = await startCodexProxy([{\r\n modelId: oauthRoute.aliasId,\r\n npm: '@ai-sdk/anthropic',\r\n apiKey: cloudCodeBackend.token,\r\n baseURL: `http://127.0.0.1:${cloudCodeBackend.port}`,\r\n upstreamModelId: oauthRoute.aliasId,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData,\r\n contextWindow: route.contextWindow,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n }], { debug: trace });\r\n proxyPort = proxyHandle.port;\r\n } else if (route.tier === 'proxy') {\r\n proxyHandle = await startCodexProxy([{\r\n modelId: route.modelId,\r\n npm: route.npm,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n upstreamModelId: route.upstreamModelId,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n headers: route.headers,\r\n }], { debug: trace });\r\n proxyPort = proxyHandle.port;\r\n }\r\n\r\n const startingFavorite = resolvedFavorites.find(\r\n r => r.providerId === activeProvider.id && r.model.id === selectedModel.id,\r\n ) ?? resolvedFavorites[0];\r\n const { profilePath, catalogPath } = favoritesActive && resolvedFavorites.length > 0 && proxyPort && startingFavorite\r\n ? await writeFavoritesLaunchArtifacts(resolvedFavorites, startingFavorite, proxyPort)\r\n : await writeLaunchArtifacts(route, selectedModel, activeProvider.name, proxyPort);\r\n\r\n writeSessionLock({\r\n pid: process.pid,\r\n startedAt: new Date().toISOString(),\r\n profilePath,\r\n catalogPaths: [catalogPath],\r\n proxyPort,\r\n });\r\n\r\n if (configOnly) {\r\n const home = process.env['HOME'] ?? '';\r\n const shortenPath = (p: string) => home ? p.replace(home, '~') : p;\r\n\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(' CONFIG PREVIEW — anygate codex')));\r\n console.log('');\r\n\r\n if (favoritesActive && resolvedFavorites.length > 0) {\r\n console.log(` ${pc.bold('Mode:')} Favorites Catalog (${resolvedFavorites.length} model${resolvedFavorites.length !== 1 ? 's' : ''})`);\r\n console.log('');\r\n console.log(` ${pc.bold('Models:')}`);\r\n for (const r of resolvedFavorites) {\r\n console.log(` ${pc.cyan(r.model.id)} ${pc.dim(`(${r.providerName})`)}`);\r\n }\r\n } else {\r\n console.log(` ${pc.bold('Mode:')} Single model`);\r\n console.log(` ${pc.bold('Provider:')} ${activeProvider.name}`);\r\n console.log(` ${pc.bold('Model:')} ${selectedModel.id}`);\r\n }\r\n\r\n console.log('');\r\n console.log(` ${pc.bold('Files written:')}`);\r\n console.log(` ${pc.dim(shortenPath(profilePath))}`);\r\n console.log(` ${pc.dim(shortenPath(catalogPath))}`);\r\n console.log('');\r\n console.log(pc.dim(' No Codex process was started.'));\r\n console.log(pc.dim(' Run ') + pc.cyan('anygate codex') + pc.dim(' to launch.'));\r\n console.log('');\r\n\r\n restoreCodexOverlay();\r\n return 0;\r\n }\r\n\r\n recordLaunchSelection('codex', activeProvider.id, selectedModel.id, prefs);\r\n\r\n const modelLabel = formatCodexModelLabel(selectedModel);\r\n\r\n if (!agentStdout) {\r\n if ((route.tier === 'proxy' || route.tier === 'cloud-code') && proxyPort) {\r\n logCodexProxy(proxyPort);\r\n }\r\n }\r\n\r\n const favoritesLaunch = favoritesActive && resolvedFavorites.length > 0;\r\n const launchModelId = favoritesLaunch\r\n ? codexCliFavoritesSlug(activeProvider.id, selectedModel.id)\r\n : selectedModel.id;\r\n if (!agentStdout) {\r\n logCodexActiveModel(modelLabel, launchModelId);\r\n printCodexCliCleanupPanel('anygate codex --restore');\r\n codexCliOutro(activeProvider.name, modelLabel, launchModelId);\r\n }\r\n const dummyRoute: CodexRoute = {\r\n tier: 'proxy',\r\n modelId: launchModelId,\r\n providerId: 'anygate-proxy',\r\n npm: selectedModel.npm ?? '@ai-sdk/openai-compatible',\r\n upstreamModelId: selectedModel.upstreamModelId || selectedModel.id,\r\n apiKey: '',\r\n };\r\n const childEnv = buildCodexChildEnv(\r\n (favoritesLaunch || route.tier === 'cloud-code') ? dummyRoute : route,\r\n proxyPort,\r\n );\r\n const hadProxy = (route.tier === 'proxy' || route.tier === 'cloud-code' || favoritesLaunch) && !!proxyPort;\r\n const exitCode = await launchCodex(launchModelId, childEnv, passthroughArgs);\r\n if (trace) printTraceLog(debugLogPath);\r\n printCodexCleanupReminder(hadProxy);\r\n return exitCode;\r\n } finally {\r\n proxyHandle?.close();\r\n if (cloudCodeBackend) {\r\n cloudCodeBackend.handle.close();\r\n }\r\n if (cloudCodeBackendFav) {\r\n cloudCodeBackendFav.handle.close();\r\n }\r\n restoreCodexOverlay();\r\n }\r\n}\r\n","// Local Responses API proxy for Codex (Tier 2 registry models).\r\nimport { createHash } from 'node:crypto';\r\nimport { createServer } from 'node:http';\r\nimport type { IncomingMessage, ServerResponse } from 'node:http';\r\nimport type { Socket } from 'node:net';\r\nimport type { LanguageModel } from 'ai';\r\nimport { readBody, extractApiKey, sendJson } from '../../../src/core/http-utils.js';\r\nimport { routeLookupIds } from '../../agents/shared/context-model-id.js';\r\nimport {\r\n CODEX_APP_AUTO_COMPACT_RATIO,\r\n parseCodexAppModelSlug,\r\n codexAppModelSlug,\r\n} from './app-profile.js';\r\nimport { createLanguageModel, maxToolsForNpm, type VertexProviderConfig } from '../../../src/gateway/provider-factory.js';\r\nimport { applyClaudeCodeOAuthIdentity } from '../../../src/oauth/claude-code-identity.js';\r\nimport {\r\n translateResponsesRequest,\r\n streamResponsesResponse,\r\n generateResponsesResponse,\r\n writeResponsesErrorStream,\r\n writeResponsesRateLimitStream,\r\n responsesRateLimitBody,\r\n type CodexSdkCallParams,\r\n} from './responses-adapter.js';\r\nimport { silenceSdkWarnings } from '../../../src/gateway/sdk-adapter.js';\r\nimport { formatUpstreamError, upstreamHttpStatus } from '../../../src/core/errors.js';\r\nimport { getCodexProxyDebugLogPath, makeTraceLogger } from '../../agents/shared/trace-log.js';\r\n\r\nexport function estimateCodexRequestChars(params: CodexSdkCallParams): number {\r\n let chars = (params.system ?? '').length;\r\n for (const msg of params.messages) {\r\n if (Array.isArray(msg.content)) {\r\n for (const part of msg.content) {\r\n if (!part || typeof part !== 'object') continue;\r\n const p = part as Record<string, unknown>;\r\n if (typeof p['text'] === 'string') {\r\n chars += p['text'].length;\r\n } else {\r\n chars += JSON.stringify(part).length;\r\n }\r\n }\r\n } else if (typeof msg.content === 'string') {\r\n chars += msg.content.length;\r\n }\r\n }\r\n return chars;\r\n}\r\n\r\nfunction clipTextForContext(text: string, maxChars: number): string {\r\n if (text.length <= maxChars) return text;\r\n const marker = `\\n\\n[... ${text.length} chars clipped from oversized context item ...]\\n\\n`;\r\n const edge = Math.max(1, Math.floor((maxChars - marker.length) / 2));\r\n return `${text.slice(0, edge)}${marker}${text.slice(-edge)}`;\r\n}\r\n\r\nfunction clipLargeTextParts(params: CodexSdkCallParams, maxCharsPerPart: number): CodexSdkCallParams {\r\n const messages = params.messages.map(msg => {\r\n if (typeof msg.content === 'string') {\r\n return { ...msg, content: clipTextForContext(msg.content, maxCharsPerPart) };\r\n }\r\n if (!Array.isArray(msg.content)) return msg;\r\n return {\r\n ...msg,\r\n content: msg.content.map(part => {\r\n if (!part || typeof part !== 'object') return part;\r\n const p = part as Record<string, unknown>;\r\n if (typeof p.text !== 'string') return part;\r\n return { ...p, text: clipTextForContext(p.text, maxCharsPerPart) };\r\n }),\r\n };\r\n }) as CodexSdkCallParams['messages'];\r\n\r\n return {\r\n ...params,\r\n messages,\r\n };\r\n}\r\n\r\nfunction trimToContextLimit(params: CodexSdkCallParams, contextWindow: number, charLimit = Math.floor(contextWindow * 0.85) * 3): CodexSdkCallParams {\r\n if (estimateCodexRequestChars(params) <= charLimit) return params;\r\n let messages = [...params.messages];\r\n while (messages.length > 1 && estimateCodexRequestChars({ ...params, messages }) > charLimit) {\r\n messages = messages.slice(1);\r\n while (messages.length > 1 && messages[0]!.role !== 'user') {\r\n messages = messages.slice(1);\r\n }\r\n }\r\n // Drop orphaned tool-result messages whose tool_use was in a trimmed assistant message.\r\n // Any role:'tool' message before the first role:'assistant' is orphaned.\r\n const firstAssistant = messages.findIndex(m => m.role === 'assistant');\r\n if (firstAssistant > 0) {\r\n messages = messages.filter((m, i) => i >= firstAssistant || m.role !== 'tool');\r\n }\r\n // Safety floor: if trimming would gut the request to <3 messages from >=3 (e.g. a\r\n // compaction payload), don't drop messages further — but still clip oversized text\r\n // parts so an unbounded payload isn't sent upstream untouched.\r\n if (messages.length < 3 && params.messages.length >= 3) {\r\n return clipLargeTextParts(params, 12_000);\r\n }\r\n if (messages.length === 0) {\r\n messages = [{ role: 'user', content: [{ type: 'text', text: '' }] } as typeof messages[0]];\r\n }\r\n return { ...params, messages };\r\n}\r\n\r\n/** Prompt-based compaction (codex-rs templates/compact/prompt.md) opens with this\r\n * sentence, sent as the final user message of the compaction turn. */\r\nconst COMPACTION_PROMPT_MARKER = 'You are performing a CONTEXT CHECKPOINT COMPACTION';\r\n\r\nfunction inputItemText(content: unknown): string {\r\n if (typeof content === 'string') return content;\r\n if (!Array.isArray(content)) return '';\r\n return content\r\n .map(p => (p && typeof p === 'object' && typeof (p as { text?: unknown }).text === 'string' ? (p as { text: string }).text : ''))\r\n .join('');\r\n}\r\n\r\n/**\r\n * Codex marks compaction requests explicitly, so detect the markers instead of\r\n * guessing from size. Size heuristics misclassified large normal agentic turns\r\n * (observed live: a 29-message review turn with 131 tools crossed the old\r\n * bodyBytes threshold and had its tools stripped mid-task, priming the model\r\n * to free-run). Remote compaction v2 appends a `compaction_trigger` input item\r\n * — a request control that never appears in durable history; the older\r\n * prompt-based path sends the checkpoint prompt as the final user message.\r\n */\r\nexport function isLikelyCodexCompactionRequest(body: Record<string, unknown>): boolean {\r\n if (!Array.isArray(body.input)) return false;\r\n const items = body.input as Array<Record<string, unknown> | null>;\r\n if (items.some(item => item && typeof item === 'object' && item.type === 'compaction_trigger')) {\r\n return true;\r\n }\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const item = items[i];\r\n if (!item || typeof item !== 'object' || !('role' in item)) continue;\r\n // Only the LAST message counts — the marker quoted mid-history (e.g. in a\r\n // reviewed diff) must not classify a normal turn as compaction.\r\n return inputItemText(item.content).trimStart().startsWith(COMPACTION_PROMPT_MARKER);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * A compaction summary is a short paragraph, never a long document. Observed live:\r\n * grok-4.5 given a stripped-tools compaction request can free-run into a text\r\n * repetition loop (same ~200-char tail regenerated forever, no finish) instead of\r\n * producing a short summary and stopping. Capping output bounds that failure to a\r\n * fixed, short delay instead of an indefinite hang the user has to kill by hand.\r\n */\r\nconst COMPACTION_MAX_OUTPUT_TOKENS = 4_000;\r\n\r\nexport function protectCodexCompactionParams(\r\n body: Record<string, unknown>,\r\n params: CodexSdkCallParams,\r\n contextWindow: number,\r\n): CodexSdkCallParams {\r\n if (!isLikelyCodexCompactionRequest(body)) {\r\n return trimToContextLimit(params, contextWindow);\r\n }\r\n const clipped = clipLargeTextParts(params, 12_000);\r\n const compactCharLimit = Math.floor(contextWindow * CODEX_APP_AUTO_COMPACT_RATIO) * 3;\r\n const trimmed = trimToContextLimit(clipped, contextWindow, compactCharLimit);\r\n // Codex's remote compaction v2 expects exactly one plain-text summary item back.\r\n // Leaving tools available invites an agentic model to keep calling them instead\r\n // of summarizing (e.g. resuming tool calls it had queued up before compaction\r\n // fired), which Codex rejects outright as a fatal error. Compaction never needs\r\n // tool access, so drop it entirely for this call.\r\n return {\r\n ...trimmed,\r\n tools: undefined,\r\n maxOutputTokens: trimmed.maxOutputTokens\r\n ? Math.min(trimmed.maxOutputTokens, COMPACTION_MAX_OUTPUT_TOKENS)\r\n : COMPACTION_MAX_OUTPUT_TOKENS,\r\n };\r\n}\r\n\r\nexport interface CodexProxyRoute {\r\n modelId: string;\r\n npm: string;\r\n apiKey: string;\r\n baseURL?: string;\r\n upstreamModelId: string;\r\n providerId?: string;\r\n authType?: 'api' | 'oauth' | 'none';\r\n oauthAccountId?: string;\r\n providerData?: Record<string, unknown>;\r\n supportedParameters?: string[];\r\n reasoning?: boolean;\r\n interleavedReasoningField?: string;\r\n vertex?: VertexProviderConfig;\r\n contextWindow?: number;\r\n /** Static headers sent on every upstream request (e.g. a plan/auth-tracking header a custom endpoint requires). */\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport interface CodexProxyHandle {\r\n port: number;\r\n close: () => void;\r\n}\r\n\r\nconst PROXY_PLACEHOLDER_KEY = 'proxy-local';\r\n\r\nfunction codexRouteLookupIds(requestedModel: string): string[] {\r\n const ids = routeLookupIds(requestedModel);\r\n const bare = parseCodexAppModelSlug(requestedModel);\r\n if (bare !== requestedModel) {\r\n ids.push(bare, ...routeLookupIds(bare));\r\n }\r\n const slash = requestedModel.indexOf('/');\r\n if (slash >= 0) {\r\n const afterProvider = requestedModel.slice(slash + 1);\r\n ids.push(afterProvider, ...routeLookupIds(afterProvider));\r\n }\r\n const doubleUnderscore = requestedModel.indexOf('__');\r\n if (doubleUnderscore >= 0) {\r\n const afterProvider = requestedModel.slice(doubleUnderscore + 2);\r\n ids.push(afterProvider, ...routeLookupIds(afterProvider));\r\n }\r\n return [...new Set(ids)];\r\n}\r\n\r\nexport function findCodexProxyRoute(\r\n routes: CodexProxyRoute[],\r\n requestedModel: string,\r\n): CodexProxyRoute | undefined {\r\n const ids = codexRouteLookupIds(requestedModel);\r\n for (const id of ids) {\r\n const route = routes.find(r =>\r\n r.modelId === id || codexAppModelSlug(r.modelId) === id,\r\n );\r\n if (route) return route;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction resolveModel(\r\n routes: CodexProxyRoute[],\r\n models: Map<string, LanguageModel>,\r\n requestedModel: string,\r\n): { route: CodexProxyRoute; languageModel: LanguageModel } | undefined {\r\n const route = findCodexProxyRoute(routes, requestedModel);\r\n if (!route) return undefined;\r\n const languageModel = models.get(route.modelId);\r\n if (!languageModel) return undefined;\r\n return { route, languageModel };\r\n}\r\n\r\nexport interface CodexProxyOptions {\r\n debug?: boolean;\r\n /** Default true. App mode passes false — GUI cannot inherit ANYGATE_CODEX_KEY. */\r\n requireAuth?: boolean;\r\n}\r\n\r\nexport async function startCodexProxy(\r\n routes: CodexProxyRoute[],\r\n options: CodexProxyOptions | boolean = {},\r\n): Promise<CodexProxyHandle> {\r\n const opts: CodexProxyOptions = typeof options === 'boolean' ? { debug: options } : options;\r\n const debug = opts.debug ?? false;\r\n const requireAuth = opts.requireAuth ?? true;\r\n silenceSdkWarnings();\r\n\r\n const models = new Map<string, LanguageModel>();\r\n for (const route of routes) {\r\n models.set(route.modelId, await createLanguageModel({\r\n npm: route.npm,\r\n modelId: route.upstreamModelId,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n providerId: route.providerId ?? route.modelId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n vertex: route.vertex,\r\n headers: route.headers,\r\n }));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const log = debug\r\n ? makeTraceLogger(getCodexProxyDebugLogPath())\r\n : () => {};\r\n const onRejection = (reason: unknown) => {\r\n if (debug) log(`unhandled-rejection: ${formatUpstreamError(reason)}`);\r\n };\r\n process.on('unhandledRejection', onRejection);\r\n\r\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\r\n const url = req.url ?? '/';\r\n\r\n if (debug) {\r\n log(`-> ${req.method} ${url} content-type=${req.headers['content-type'] ?? '(none)'} content-encoding=${req.headers['content-encoding'] ?? '(none)'} content-length=${req.headers['content-length'] ?? '(none)'}`);\r\n }\r\n\r\n if (!requireAuth && req.method === 'POST') {\r\n const origin = req.headers.origin;\r\n const referer = req.headers.referer;\r\n const isValidLoopback = (uStr?: string | string[]) => {\r\n if (!uStr) return true;\r\n try {\r\n const parsed = new URL(Array.isArray(uStr) ? uStr[0]! : uStr);\r\n const h = parsed.hostname;\r\n return h === '127.0.0.1' || h === 'localhost' || h === '::1';\r\n } catch {\r\n return false;\r\n }\r\n };\r\n if (!isValidLoopback(origin) || !isValidLoopback(referer)) {\r\n sendJson(res, 403, { error: { message: 'Forbidden origin', type: 'invalid_request_error' } });\r\n return;\r\n }\r\n }\r\n\r\n if (req.method === 'GET' && url === '/health') {\r\n sendJson(res, 200, { ok: true });\r\n return;\r\n }\r\n\r\n if (req.method === 'GET' && url === '/v1/models') {\r\n const data: Array<{ id: string; object: string; created: number; owned_by: string }> = [];\r\n const seenIds = new Set<string>();\r\n const addModel = (id: string, providerId?: string) => {\r\n if (seenIds.has(id)) return;\r\n seenIds.add(id);\r\n data.push({\r\n id,\r\n object: 'model',\r\n created: Math.floor(Date.now() / 1000),\r\n owned_by: providerId || 'anygate',\r\n });\r\n };\r\n\r\n for (const route of routes) {\r\n addModel(route.modelId, route.providerId);\r\n addModel(codexAppModelSlug(route.modelId), route.providerId);\r\n if (route.providerId) {\r\n addModel(`${route.providerId}__${route.modelId}`, route.providerId);\r\n }\r\n }\r\n\r\n sendJson(res, 200, {\r\n object: 'list',\r\n data,\r\n });\r\n return;\r\n }\r\n\r\n if (req.method === 'GET' && url.startsWith('/v1/models/')) {\r\n const id = url.slice('/v1/models/'.length);\r\n const route = findCodexProxyRoute(routes, id);\r\n if (!route) {\r\n sendJson(res, 404, { error: { message: `Model not found: ${id}`, type: 'invalid_request_error' } });\r\n return;\r\n }\r\n sendJson(res, 200, {\r\n id,\r\n object: 'model',\r\n created: Math.floor(Date.now() / 1000),\r\n owned_by: route.providerId || 'anygate',\r\n });\r\n return;\r\n }\r\n\r\n if (req.method === 'POST' && url === '/v1/responses') {\r\n if (requireAuth) {\r\n const inboundKey = extractApiKey(req);\r\n if (!inboundKey || inboundKey !== PROXY_PLACEHOLDER_KEY) {\r\n sendJson(res, 401, { error: { message: 'Unauthorized', type: 'invalid_api_key' } });\r\n return;\r\n }\r\n }\r\n\r\n let rawBody: string;\r\n try {\r\n rawBody = await readBody(req);\r\n } catch (err) {\r\n if (debug) {\r\n log(`Error: failed to read/decode request body on POST ${url}: ${formatUpstreamError(err)} content-encoding=${req.headers['content-encoding'] ?? '(none)'}`);\r\n }\r\n sendJson(res, 400, { error: { message: 'Invalid request body', type: 'invalid_request_error' } });\r\n return;\r\n }\r\n\r\n let body: Record<string, unknown>;\r\n try {\r\n body = JSON.parse(rawBody);\r\n } catch (err) {\r\n if (debug) {\r\n const headers = JSON.stringify(req.headers);\r\n log(`Error: Invalid JSON body on POST ${url}: ${formatUpstreamError(err)} headers=${headers} rawBody=${JSON.stringify(rawBody.slice(0, 2000))}`);\r\n }\r\n sendJson(res, 400, { error: { message: 'Invalid JSON body', type: 'invalid_request_error' } });\r\n return;\r\n }\r\n\r\n if (debug) {\r\n const prevId = body.previous_response_id ?? null;\r\n const inputItems = Array.isArray(body.input) ? body.input.length : (typeof body.input === 'string' ? 1 : 0);\r\n const tools = Array.isArray(body.tools) ? body.tools : [];\r\n const toolNames = tools.map((t: unknown) => (t && typeof t === 'object' && 'name' in t ? (t as { name: unknown }).name : '?')).join(',');\r\n log(`request: model=${String(body.model ?? '')} previous_response_id=${prevId ?? '(none)'} input_items=${inputItems} body_bytes=${rawBody.length} tools=[${toolNames || 'none'}]`);\r\n const mcpTools = tools.filter((t: unknown) => t && typeof t === 'object' && 'name' in t && String((t as { name: unknown }).name).startsWith('mcp__'));\r\n for (const t of mcpTools) {\r\n const mt = t as { name: unknown; type?: unknown; description?: unknown; parameters?: unknown; tools?: unknown[] };\r\n const subTools = mt.type === 'namespace' && Array.isArray(mt.tools) ? ` subTools=[${mt.tools.length}]` : '';\r\n log(` mcp-tool: name=${mt.name} type=${mt.type} desc=${JSON.stringify(String(mt.description ?? '')).slice(0, 120)}${subTools}`);\r\n }\r\n }\r\n\r\n const modelId = String(body.model ?? '');\r\n let resolved = resolveModel(routes, models, modelId);\r\n if (!resolved) {\r\n const fallbackRoute = routes[0];\r\n const fallbackLm = fallbackRoute ? models.get(fallbackRoute.modelId) : undefined;\r\n if (fallbackRoute && fallbackLm) {\r\n if (debug) {\r\n log(`resolveModel fallback: requested=\"${modelId}\" → ${fallbackRoute.modelId}`);\r\n }\r\n resolved = { route: fallbackRoute, languageModel: fallbackLm };\r\n } else {\r\n if (debug) {\r\n log(`resolveModel failed: requested=\"${modelId}\" known=[${routes.map(r => r.modelId).join(', ')}]`);\r\n }\r\n sendJson(res, 404, { error: { message: `Unknown model: ${modelId}`, type: 'invalid_request_error' } });\r\n return;\r\n }\r\n }\r\n\r\n const { route, languageModel } = resolved;\r\n\r\n try {\r\n let params = applyClaudeCodeOAuthIdentity(route, translateResponsesRequest(\r\n body as unknown as import('./responses-adapter.js').ResponsesRequest,\r\n route.npm,\r\n {\r\n providerId: route.providerId,\r\n apiBaseUrl: route.baseURL,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n upstreamModelId: route.upstreamModelId,\r\n },\r\n { maxTools: maxToolsForNpm(route.npm) },\r\n ));\r\n if (route.contextWindow && route.contextWindow > 0) {\r\n const before = params.messages.length;\r\n const estimatedChars = estimateCodexRequestChars(params);\r\n const compaction = isLikelyCodexCompactionRequest(body);\r\n if (debug) log(`context check: model=${route.modelId} window=${route.contextWindow} chars=${estimatedChars} compaction=${compaction ? 'yes' : 'no'} messages=${before}`);\r\n params = protectCodexCompactionParams(body, params, route.contextWindow);\r\n if (debug && params.messages.length < before) {\r\n log(`context trim: model=${route.modelId} window=${route.contextWindow} kept=${params.messages.length}/${before} messages`);\r\n }\r\n }\r\n if (debug) {\r\n const effort = (body as { reasoning?: { effort?: string } }).reasoning?.effort;\r\n log(`model=${route.modelId} effort=${effort ?? '(none)'} providerOptions=${JSON.stringify(params.providerOptions)}`);\r\n }\r\n\r\n if (body.stream) {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n Connection: 'keep-alive',\r\n });\r\n const write = (chunk: string) => res.write(chunk);\r\n try {\r\n await streamResponsesResponse(languageModel, params, modelId, write, summary => {\r\n if (debug) {\r\n const failure = `${summary.aborted ? ' aborted=yes' : ''}${summary.errorMessage ? ` error=${JSON.stringify(summary.errorMessage)}` : ''}`;\r\n log(`response done: model=${route.modelId} reasoningChars=${summary.reasoningChars} textChars=${summary.textChars} toolCalls=${summary.toolCallCount} toolNames=[${summary.toolNames.join(',')}] loopDetected=${summary.loopDetected ?? 'no'} dsmlRecovered=${summary.dsmlToolCallsRecovered ?? 0}${failure} reasoningPreview=${JSON.stringify(summary.reasoningPreview)}`);\r\n }\r\n }, progress => {\r\n if (debug) {\r\n log(`response progress: model=${route.modelId} elapsedMs=${progress.elapsedMs} reasoningChars=${progress.reasoningChars} textChars=${progress.textChars} toolCalls=${progress.toolCallCount} reasoningTail=${JSON.stringify(progress.reasoningTail)}`);\r\n }\r\n });\r\n } catch (err) {\r\n const msg = formatUpstreamError(err);\r\n const status = upstreamHttpStatus(err);\r\n if (debug) log(`sdk error: ${route.modelId}: ${msg}`);\r\n if (status === 429) {\r\n writeResponsesRateLimitStream(modelId, msg, write);\r\n } else {\r\n writeResponsesErrorStream(modelId, msg, write, status);\r\n }\r\n }\r\n res.end();\r\n } else {\r\n try {\r\n const response = await generateResponsesResponse(languageModel, params, modelId);\r\n sendJson(res, 200, response);\r\n } catch (err) {\r\n const msg = formatUpstreamError(err);\r\n const status = upstreamHttpStatus(err);\r\n if (debug) log(`sdk error: ${route.modelId}: ${msg}`);\r\n if (status === 429) {\r\n sendJson(res, 200, responsesRateLimitBody(modelId, msg));\r\n } else {\r\n sendJson(res, status, { error: { message: msg, type: 'api_error' } });\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n const msg = formatUpstreamError(err);\r\n log(`handler error: ${msg}`);\r\n sendJson(res, 500, { error: { message: msg, type: 'api_error' } });\r\n }\r\n return;\r\n }\r\n\r\n if (req.method === 'GET' && url === '/v1/responses') {\r\n sendJson(res, 200, { object: 'list', data: [] });\r\n return;\r\n }\r\n\r\n sendJson(res, 404, { error: { message: 'Not found', type: 'invalid_request_error' } });\r\n });\r\n\r\n\r\n // ── WebSocket upgrade handler (/v1/responses) ──────────────────────────\r\n // Fully implement WS streaming: accept upgrade, read request frame, stream\r\n // response events as WS text frames, close cleanly.\r\n //\r\n // History: we previously rejected with 503 (older Codex fell back to HTTP POST),\r\n // then tried close-1013 (same reconnect noise in newer Codex). Neither stops the\r\n // \"Stream error / Reconnecting 5/5\" UI — the only fix is proper WS support.\r\n //\r\n // Slow model concern: Codex has a ~15s timeout on \"time to first content\" via WS.\r\n // For fast providers (Groq, Z.AI) this isn't an issue. For slow reasoning models,\r\n // the timeout may still trigger — but the agent loop recovers and the net latency\r\n // is the same as before (HTTP fallback also takes the full model time).\r\n\r\n function wsAcceptKey(clientKey: string): string {\r\n return createHash('sha1')\r\n .update(clientKey + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')\r\n .digest('base64');\r\n }\r\n\r\n function wsDecodeFrame(buf: Buffer): { text: string; complete: boolean } | null {\r\n if (buf.length < 2) return null;\r\n const b0 = buf[0]!;\r\n const b1 = buf[1]!;\r\n const masked = (b1 & 0x80) !== 0;\r\n let payloadLen = b1 & 0x7f;\r\n let offset = 2;\r\n if (payloadLen === 126) {\r\n if (buf.length < 4) return null;\r\n payloadLen = buf.readUInt16BE(2);\r\n offset = 4;\r\n } else if (payloadLen === 127) {\r\n if (buf.length < 10) return null;\r\n payloadLen = Number(buf.readBigUInt64BE(2));\r\n offset = 10;\r\n }\r\n const maskLen = masked ? 4 : 0;\r\n if (buf.length < offset + maskLen + payloadLen) return null;\r\n const mask = masked ? buf.slice(offset, offset + 4) : null;\r\n offset += maskLen;\r\n const payload = Buffer.allocUnsafe(payloadLen);\r\n for (let i = 0; i < payloadLen; i++) {\r\n payload[i] = buf[offset + i]! ^ (mask ? mask[i % 4]! : 0);\r\n }\r\n const opcode = b0 & 0x0f;\r\n if (opcode !== 0x1) return null; // text frame only\r\n return { text: payload.toString('utf8'), complete: true };\r\n }\r\n\r\n function wsEncodeTextFrame(text: string): Buffer {\r\n const payload = Buffer.from(text, 'utf8');\r\n const len = payload.length;\r\n let header: Buffer;\r\n if (len < 126) {\r\n header = Buffer.from([0x81, len]);\r\n } else if (len < 65536) {\r\n header = Buffer.allocUnsafe(4);\r\n header[0] = 0x81; header[1] = 126;\r\n header.writeUInt16BE(len, 2);\r\n } else {\r\n header = Buffer.allocUnsafe(10);\r\n header[0] = 0x81; header[1] = 127;\r\n header.writeBigUInt64BE(BigInt(len), 2);\r\n }\r\n return Buffer.concat([header, payload]);\r\n }\r\n\r\n function wsCloseFrame(): Buffer {\r\n return Buffer.from([0x88, 0x00]); // close, no payload\r\n }\r\n\r\n function wsPingFrame(): Buffer {\r\n return Buffer.from([0x89, 0x00]); // ping, no payload\r\n }\r\n\r\n server.on('upgrade', (req: IncomingMessage, socket: Socket, head: Buffer) => {\r\n // Accept the WS upgrade and stream the response as WS text frames.\r\n // Rejecting (503) or immediately closing (1013) causes Codex App to show\r\n // \"Stream error / Reconnecting 5/5\" regardless — proper WS support avoids it.\r\n if (requireAuth) {\r\n const inboundKey = extractApiKey(req);\r\n if (!inboundKey || inboundKey !== PROXY_PLACEHOLDER_KEY) {\r\n socket.write('HTTP/1.1 401 Unauthorized\\r\\nContent-Length: 0\\r\\nConnection: close\\r\\n\\r\\n');\r\n socket.destroy();\r\n return;\r\n }\r\n }\r\n\r\n const clientKey = req.headers['sec-websocket-key'];\r\n if (!clientKey) {\r\n socket.write('HTTP/1.1 400 Bad Request\\r\\nContent-Length: 0\\r\\nConnection: close\\r\\n\\r\\n');\r\n socket.destroy();\r\n return;\r\n }\r\n\r\n socket.write(\r\n 'HTTP/1.1 101 Switching Protocols\\r\\n' +\r\n 'Upgrade: websocket\\r\\n' +\r\n 'Connection: Upgrade\\r\\n' +\r\n `Sec-WebSocket-Accept: ${wsAcceptKey(clientKey)}\\r\\n` +\r\n '\\r\\n',\r\n );\r\n\r\n let frameBuf = Buffer.alloc(0);\r\n let handled = false;\r\n\r\n const closeSocket = () => {\r\n if (!socket.destroyed) { socket.write(wsCloseFrame()); socket.end(); }\r\n };\r\n\r\n const sendWsEvent = (sseChunk: string) => {\r\n if (socket.destroyed) return;\r\n // SSE: \"event: TYPE\\ndata: {JSON}\\n\\n\" → WS text frame: \"{JSON}\"\r\n for (const line of sseChunk.split('\\n')) {\r\n if (line.startsWith('data: ')) {\r\n socket.write(wsEncodeTextFrame(line.slice(6)));\r\n }\r\n }\r\n };\r\n\r\n const onData = (chunk: Buffer) => {\r\n frameBuf = Buffer.concat([frameBuf, chunk]);\r\n if (handled) return;\r\n const frame = wsDecodeFrame(frameBuf);\r\n if (!frame) return;\r\n frameBuf = Buffer.alloc(0);\r\n handled = true;\r\n\r\n void (async () => {\r\n let body: Record<string, unknown>;\r\n try { body = JSON.parse(frame.text); } catch {\r\n if (debug) log(`WS Error: Invalid JSON body: rawBody=${JSON.stringify(frame.text.slice(0, 2000))}`);\r\n sendWsEvent(`event: error\\ndata: ${JSON.stringify({ error: { message: 'Invalid JSON', type: 'invalid_request_error' } })}\\n\\n`);\r\n closeSocket(); return;\r\n }\r\n\r\n if (debug) {\r\n const prevId = body.previous_response_id ?? null;\r\n const inputItems = Array.isArray(body.input) ? body.input.length : (typeof body.input === 'string' ? 1 : 0);\r\n const tools = Array.isArray(body.tools) ? body.tools : [];\r\n const toolNames = tools.map((t: unknown) => (t && typeof t === 'object' && 'name' in t ? (t as { name: unknown }).name : '?')).join(',');\r\n log(`WS request: model=${String(body.model ?? '')} previous_response_id=${prevId ?? '(none)'} input_items=${inputItems} body_bytes=${frame.text.length} tools=[${toolNames || 'none'}]`);\r\n }\r\n\r\n const modelId = String(body.model ?? '');\r\n let resolved = resolveModel(routes, models, modelId);\r\n if (!resolved) {\r\n const fb = routes[0];\r\n const fbLm = fb ? models.get(fb.modelId) : undefined;\r\n if (fb && fbLm) {\r\n if (debug) log(`WS resolveModel fallback: requested=\"${modelId}\" → ${fb.modelId}`);\r\n resolved = { route: fb, languageModel: fbLm };\r\n } else {\r\n if (debug) log(`WS resolveModel failed: requested=\"${modelId}\" known=[${routes.map(r => r.modelId).join(', ')}]`);\r\n sendWsEvent(`event: error\\ndata: ${JSON.stringify({ error: { message: `Unknown model: ${modelId}` } })}\\n\\n`); closeSocket(); return;\r\n }\r\n }\r\n\r\n const { route, languageModel } = resolved;\r\n try {\r\n let params = applyClaudeCodeOAuthIdentity(route, translateResponsesRequest(\r\n body as unknown as import('./responses-adapter.js').ResponsesRequest,\r\n route.npm,\r\n {\r\n providerId: route.providerId,\r\n apiBaseUrl: route.baseURL,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n upstreamModelId: route.upstreamModelId,\r\n },\r\n { maxTools: maxToolsForNpm(route.npm) },\r\n ));\r\n if (route.contextWindow && route.contextWindow > 0) {\r\n const before = params.messages.length;\r\n const estimatedChars = estimateCodexRequestChars(params);\r\n const compaction = isLikelyCodexCompactionRequest(body);\r\n if (debug) log(`WS context check: model=${route.modelId} window=${route.contextWindow} chars=${estimatedChars} compaction=${compaction ? 'yes' : 'no'} messages=${before} tools=${params.tools ? Object.keys(params.tools).length : 0}`);\r\n params = protectCodexCompactionParams(body, params, route.contextWindow);\r\n if (debug && params.messages.length < before) {\r\n log(`WS context trim: model=${route.modelId} window=${route.contextWindow} kept=${params.messages.length}/${before} messages tools=${params.tools ? Object.keys(params.tools).length : 0}`);\r\n }\r\n }\r\n if (debug) {\r\n const effort = (body as { reasoning?: { effort?: string } }).reasoning?.effort;\r\n log(`WS model=${route.modelId} effort=${effort ?? '(none)'} providerOptions=${JSON.stringify(params.providerOptions)}`);\r\n }\r\n await streamResponsesResponse(languageModel, params, modelId, sendWsEvent, summary => {\r\n if (debug) {\r\n const failure = `${summary.aborted ? ' aborted=yes' : ''}${summary.errorMessage ? ` error=${JSON.stringify(summary.errorMessage)}` : ''}`;\r\n log(`WS response done: model=${route.modelId} reasoningChars=${summary.reasoningChars} textChars=${summary.textChars} toolCalls=${summary.toolCallCount} toolNames=[${summary.toolNames.join(',')}] loopDetected=${summary.loopDetected ?? 'no'} dsmlRecovered=${summary.dsmlToolCallsRecovered ?? 0}${failure} reasoningPreview=${JSON.stringify(summary.reasoningPreview)}`);\r\n }\r\n }, progress => {\r\n if (debug) {\r\n log(`WS response progress: model=${route.modelId} elapsedMs=${progress.elapsedMs} reasoningChars=${progress.reasoningChars} textChars=${progress.textChars} toolCalls=${progress.toolCallCount} reasoningTail=${JSON.stringify(progress.reasoningTail)}`);\r\n }\r\n });\r\n } catch (err) {\r\n const msg = formatUpstreamError(err);\r\n const status = upstreamHttpStatus(err);\r\n if (debug) log(`WS sdk error: ${route.modelId}: ${msg}`);\r\n if (status === 429) {\r\n writeResponsesRateLimitStream(modelId, msg, sendWsEvent);\r\n } else {\r\n writeResponsesErrorStream(modelId, msg, sendWsEvent, status);\r\n }\r\n }\r\n closeSocket();\r\n })();\r\n };\r\n\r\n socket.on('error', () => socket.destroy());\r\n socket.on('data', onData);\r\n onData(head);\r\n });\r\n\r\n // Prevent Node's default 5s keepAlive timeout from closing idle connections\r\n // while a slow/reasoning model (Grok, o3, etc.) is thinking before first token.\r\n server.keepAliveTimeout = 0;\r\n server.headersTimeout = 0;\r\n\r\n server.on('error', reject);\r\n server.listen(0, '127.0.0.1', () => {\r\n const addr = server.address();\r\n if (!addr || typeof addr === 'string') {\r\n reject(new Error('Failed to bind codex proxy'));\r\n return;\r\n }\r\n resolve({\r\n port: addr.port,\r\n close: () => {\r\n process.off('unhandledRejection', onRejection);\r\n server.close();\r\n },\r\n });\r\n });\r\n });\r\n}\r\n\r\nexport { PROXY_PLACEHOLDER_KEY };\r\n","import {\r\n buildClaudeCodeBillingSystemLine,\r\n injectClaudeIdentity,\r\n selectBetaFlags,\r\n} from './claude-identity.js';\r\n\r\nexport interface ClaudeCodeOAuthIdentityInput {\r\n providerId?: string;\r\n authType?: 'api' | 'oauth' | 'none';\r\n oauthAccountId?: string;\r\n apiKey: string;\r\n providerData?: Record<string, unknown>;\r\n upstreamModelId?: string;\r\n}\r\n\r\nexport interface ClaudeCodeOAuthSdkParams {\r\n system?: string;\r\n tools?: Record<string, unknown>;\r\n providerOptions?: Record<string, Record<string, unknown>>;\r\n}\r\n\r\nexport function isClaudeCodeOAuthRoute(input: ClaudeCodeOAuthIdentityInput): boolean {\r\n return input.providerId === 'claude-code' && input.authType === 'oauth';\r\n}\r\n\r\nfunction prependClaudeCodeBillingLine(system: string | undefined): string {\r\n const line = buildClaudeCodeBillingSystemLine();\r\n if (!system?.trim()) return line;\r\n if (system.startsWith(line)) return system;\r\n return `${line}\\n\\n${system}`;\r\n}\r\n\r\nfunction mergeProviderOptions(\r\n a?: Record<string, Record<string, unknown>>,\r\n b?: Record<string, Record<string, unknown>>,\r\n): Record<string, Record<string, unknown>> | undefined {\r\n if (!a && !b) return undefined;\r\n if (!a) return b;\r\n if (!b) return a;\r\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\r\n const out: Record<string, Record<string, unknown>> = {};\r\n for (const key of keys) {\r\n out[key] = { ...(a[key] ?? {}), ...(b[key] ?? {}) };\r\n }\r\n return out;\r\n}\r\n\r\nfunction claudeCodeProviderOptions(\r\n input: ClaudeCodeOAuthIdentityInput,\r\n sdkParams: ClaudeCodeOAuthSdkParams,\r\n): Record<string, Record<string, unknown>> {\r\n const seed = input.oauthAccountId ?? input.apiKey;\r\n const { userId } = injectClaudeIdentity({}, input.providerData, seed);\r\n const betaBody = {\r\n ...(sdkParams.system ? { system: [{ type: 'text', text: sdkParams.system }] } : {}),\r\n ...(sdkParams.tools ? { tools: Object.keys(sdkParams.tools).map(name => ({ name })) } : {}),\r\n };\r\n return {\r\n anthropic: {\r\n metadata: { userId },\r\n anthropicBeta: selectBetaFlags(betaBody, input.upstreamModelId).split(',').filter(Boolean),\r\n },\r\n };\r\n}\r\n\r\nexport function applyClaudeCodeOAuthIdentity<T extends ClaudeCodeOAuthSdkParams>(\r\n input: ClaudeCodeOAuthIdentityInput,\r\n sdkParams: T,\r\n): T {\r\n if (!isClaudeCodeOAuthRoute(input)) return sdkParams;\r\n\r\n sdkParams.system = prependClaudeCodeBillingLine(sdkParams.system);\r\n sdkParams.providerOptions = mergeProviderOptions(\r\n sdkParams.providerOptions,\r\n claudeCodeProviderOptions(input, sdkParams),\r\n );\r\n return sdkParams;\r\n}\r\n","// OpenAI Responses API (/v1/responses) ↔ Vercel AI SDK. One turn per request; Codex owns the tool loop.\r\nimport { streamText, generateText, tool, jsonSchema } from 'ai';\r\nimport type { LanguageModel, ModelMessage, ToolSet } from 'ai';\r\nimport {\r\n sseChunk,\r\n encodeToolUseId,\r\n splitToolUseId,\r\n serializeToolResultContent,\r\n parseToolArguments,\r\n silenceSdkWarnings,\r\n grabRoundTripSignature,\r\n parseDsmlToolCalls,\r\n type FullStreamPart,\r\n} from '../../../src/gateway/proxy-shared.js';\r\nimport {\r\n deepMergeProviderOptions,\r\n effortProviderOptions,\r\n thinkingProviderOptions,\r\n type ReasoningMetadata,\r\n} from '../../../src/gateway/provider-factory.js';\r\nimport { formatUpstreamError } from '../../../src/core/errors.js';\r\n\r\nexport { silenceSdkWarnings };\r\n\r\n// ── Responses request shapes ─────────────────────────────────────────────────\r\n\r\nexport interface ResponsesFunctionCallItem {\r\n type: 'function_call';\r\n id?: string;\r\n call_id: string;\r\n name: string;\r\n arguments?: string;\r\n}\r\n\r\nexport interface ResponsesFunctionCallOutputItem {\r\n type: 'function_call_output';\r\n call_id: string;\r\n output: string | unknown;\r\n}\r\n\r\nexport interface ResponsesMessageItem {\r\n type?: 'message';\r\n role: 'user' | 'assistant' | 'developer';\r\n content: string | Array<{ type: string; text?: string }>;\r\n}\r\n\r\nexport interface ResponsesReasoningItem {\r\n type: 'reasoning';\r\n id?: string;\r\n summary?: Array<{ type: string; text?: string }>;\r\n}\r\n\r\nexport type ResponsesInputItem =\r\n | ResponsesMessageItem\r\n | ResponsesFunctionCallItem\r\n | ResponsesFunctionCallOutputItem\r\n | ResponsesReasoningItem;\r\n\r\nexport interface ResponsesFunctionTool {\r\n type: 'function';\r\n name: string;\r\n description?: string;\r\n parameters?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Codex App's proprietary wrapper for MCP server tools. The real ChatGPT backend\r\n * unwraps this server-side before the model ever sees it; custom Responses-API\r\n * providers (us) receive it as-is and must flatten it themselves, or the model\r\n * never sees any usable MCP tools. See translateResponsesTools.\r\n */\r\nexport interface ResponsesNamespaceTool {\r\n type: 'namespace';\r\n name: string;\r\n description?: string;\r\n tools: ResponsesFunctionTool[];\r\n}\r\n\r\nexport type ResponsesTool = ResponsesFunctionTool | ResponsesNamespaceTool;\r\n\r\nexport interface ResponsesRequest {\r\n model: string;\r\n input: string | ResponsesInputItem[];\r\n stream?: boolean;\r\n tools?: ResponsesTool[];\r\n instructions?: string;\r\n max_output_tokens?: number;\r\n temperature?: number;\r\n previous_response_id?: string;\r\n reasoning?: { effort?: string; summary?: string };\r\n}\r\n\r\nexport interface CodexSdkCallParams {\r\n system?: string;\r\n messages: ModelMessage[];\r\n tools?: ToolSet;\r\n maxOutputTokens?: number;\r\n temperature?: number;\r\n providerOptions?: Record<string, Record<string, unknown>>;\r\n}\r\n\r\nexport interface TranslateToolOptions {\r\n maxTools?: number;\r\n}\r\n\r\ntype WriteFn = (chunk: string) => void;\r\n\r\nfunction messageText(content: ResponsesMessageItem['content']): string {\r\n if (typeof content === 'string') return content;\r\n return (content ?? [])\r\n .map(p => (p.type === 'output_text' || p.type === 'input_text' || p.type === 'text' ? p.text ?? '' : ''))\r\n .join('');\r\n}\r\n\r\nfunction extractDeveloperAndInstructions(\r\n items: ResponsesInputItem[],\r\n instructions?: string,\r\n): { system?: string; remaining: ResponsesInputItem[] } {\r\n const developerParts: string[] = [];\r\n const remaining: ResponsesInputItem[] = [];\r\n for (const item of items) {\r\n if ('role' in item && item.role === 'developer') {\r\n const text = messageText(item.content);\r\n if (text.trim()) developerParts.push(text.trim());\r\n } else {\r\n remaining.push(item);\r\n }\r\n }\r\n const parts = [...developerParts];\r\n if (instructions?.trim()) parts.push(instructions.trim());\r\n const system = parts.length ? parts.join('\\n') : undefined;\r\n return { system, remaining };\r\n}\r\n\r\nfunction annotateToolNamesFromCalls(items: ResponsesInputItem[]): Map<string, string> {\r\n const nameByCallId = new Map<string, string>();\r\n for (const item of items) {\r\n if (item.type === 'function_call') {\r\n const { rawId } = splitToolUseId(item.call_id);\r\n nameByCallId.set(rawId, item.name);\r\n }\r\n }\r\n return nameByCallId;\r\n}\r\n\r\nfunction mergeConsecutiveMessages(messages: ModelMessage[]): ModelMessage[] {\r\n if (messages.length <= 1) return messages;\r\n const out: ModelMessage[] = [];\r\n for (const msg of messages) {\r\n const prev = out[out.length - 1];\r\n if (prev && prev.role === msg.role) {\r\n const prevContent = Array.isArray(prev.content) ? prev.content : [{ type: 'text', text: String(prev.content ?? '') }];\r\n const msgContent = Array.isArray(msg.content) ? msg.content : [{ type: 'text', text: String(msg.content ?? '') }];\r\n prev.content = [...prevContent, ...msgContent] as typeof prev.content;\r\n } else {\r\n out.push(msg);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction ensureUserFirst(messages: ModelMessage[]): ModelMessage[] {\r\n if (messages.length === 0) return [{ role: 'user', content: [{ type: 'text', text: '(empty input)' }] } as ModelMessage];\r\n if (messages[0]!.role === 'assistant') {\r\n return [{ role: 'user', content: [{ type: 'text', text: '(conversation continued)' }] } as ModelMessage, ...messages];\r\n }\r\n return messages;\r\n}\r\n\r\nfunction reasoningSummaryText(item: ResponsesReasoningItem): string {\r\n return (item.summary ?? [])\r\n .map(part => (part.type === 'summary_text' ? part.text ?? '' : ''))\r\n .join('');\r\n}\r\n\r\nfunction makeReasoningOutputItem(id: string, text: string): ResponsesReasoningItem {\r\n return {\r\n id,\r\n type: 'reasoning',\r\n summary: text.trim() ? [{ type: 'summary_text', text }] : [],\r\n };\r\n}\r\n\r\nexport function translateResponsesInput(\r\n input: string | ResponsesInputItem[],\r\n instructions: string | undefined,\r\n npm: string,\r\n): { system?: string; messages: ModelMessage[] } {\r\n if (typeof input === 'string') {\r\n return {\r\n system: instructions?.trim() || undefined,\r\n messages: [{ role: 'user', content: [{ type: 'text', text: input }] } as ModelMessage],\r\n };\r\n }\r\n\r\n const { system, remaining } = extractDeveloperAndInstructions(input, instructions);\r\n const toolNames = annotateToolNamesFromCalls(remaining);\r\n const messages: ModelMessage[] = [];\r\n let pendingReasoning = '';\r\n\r\n for (const item of remaining) {\r\n if (item.type === 'reasoning') {\r\n pendingReasoning += reasoningSummaryText(item as ResponsesReasoningItem);\r\n continue;\r\n }\r\n if (item.type === 'function_call') {\r\n const { rawId, thoughtSignature } = splitToolUseId(item.call_id);\r\n const parts: Record<string, unknown>[] = [];\r\n if (pendingReasoning.trim()) {\r\n parts.push({ type: 'reasoning', text: pendingReasoning });\r\n pendingReasoning = '';\r\n }\r\n const toolPart: Record<string, unknown> = {\r\n type: 'tool-call',\r\n toolCallId: rawId,\r\n toolName: item.name,\r\n input: parseToolArguments(item.arguments),\r\n };\r\n if (thoughtSignature && npm === '@ai-sdk/google') {\r\n toolPart.providerOptions = { google: { thoughtSignature } };\r\n }\r\n parts.push(toolPart);\r\n messages.push({ role: 'assistant', content: parts } as ModelMessage);\r\n } else if (item.type === 'function_call_output') {\r\n const { rawId } = splitToolUseId(item.call_id);\r\n messages.push({\r\n role: 'tool',\r\n content: [{\r\n type: 'tool-result',\r\n toolCallId: rawId,\r\n toolName: toolNames.get(rawId) ?? 'unknown',\r\n output: { type: 'text', value: serializeToolResultContent(item.output) },\r\n }],\r\n } as ModelMessage);\r\n } else if ('role' in item) {\r\n const role = item.role === 'assistant' ? 'assistant' : 'user';\r\n const text = messageText(item.content);\r\n messages.push({ role, content: [{ type: 'text', text }] } as ModelMessage);\r\n }\r\n }\r\n\r\n return {\r\n system,\r\n messages: ensureUserFirst(mergeConsecutiveMessages(messages)),\r\n };\r\n}\r\n\r\nexport function translateResponsesTools(\r\n tools?: ResponsesTool[],\r\n options: TranslateToolOptions = {},\r\n): CodexSdkCallParams['tools'] {\r\n if (!tools?.length) return undefined;\r\n const out: Record<string, ReturnType<typeof tool>> = {};\r\n let toolCount = 0;\r\n const addTool = (name: string, definition: ResponsesFunctionTool): void => {\r\n if (options.maxTools !== undefined && toolCount >= options.maxTools) return;\r\n out[name] = tool({\r\n description: definition.description ?? '',\r\n inputSchema: jsonSchema(definition.parameters ?? { type: 'object', properties: {} }),\r\n });\r\n toolCount++;\r\n };\r\n\r\n for (const t of tools) {\r\n if (t.type === 'namespace') {\r\n // Flatten \"mcp__<server>\" + nested \"query_docs\" -> \"mcp__<server>__query_docs\",\r\n // matching Codex's own flattened-name convention so the model's tool_call name\r\n // round-trips back to Codex's dispatcher unchanged.\r\n for (const nested of t.tools ?? []) {\r\n if (nested.type !== 'function' || !nested.name) continue;\r\n addTool(`${t.name}__${nested.name}`, nested);\r\n }\r\n continue;\r\n }\r\n if (t.type !== 'function' || !t.name) continue;\r\n addTool(t.name, t);\r\n }\r\n return Object.keys(out).length ? out : undefined;\r\n}\r\n\r\nexport function translateResponsesRequest(\r\n body: ResponsesRequest,\r\n npm: string,\r\n metadata?: ReasoningMetadata,\r\n options: TranslateToolOptions = {},\r\n): CodexSdkCallParams {\r\n const { system, messages } = translateResponsesInput(body.input, body.instructions, npm);\r\n const effort = body.reasoning?.effort;\r\n const providerOptions = deepMergeProviderOptions(\r\n thinkingProviderOptions(npm),\r\n effortProviderOptions(npm, effort, metadata?.upstreamModelId ?? body.model, metadata),\r\n );\r\n const tools = translateResponsesTools(body.tools, options);\r\n return {\r\n system,\r\n messages,\r\n tools,\r\n maxOutputTokens: body.max_output_tokens,\r\n temperature: body.temperature,\r\n providerOptions,\r\n };\r\n}\r\n\r\nfunction newResponseId(): string {\r\n return `resp_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\nfunction newItemId(prefix: string): string {\r\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\nfunction usageFromPart(part: FullStreamPart): { input_tokens: number; output_tokens: number; total_tokens: number } {\r\n const input = part.totalUsage?.inputTokens ?? 0;\r\n const output = part.totalUsage?.outputTokens ?? 0;\r\n return { input_tokens: input, output_tokens: output, total_tokens: input + output };\r\n}\r\n\r\ninterface StreamingToolState {\r\n itemId: string;\r\n callId: string;\r\n name: string;\r\n outputIndex: number;\r\n args: string;\r\n}\r\n\r\nexport interface ResponsesStreamSummary {\r\n reasoningChars: number;\r\n reasoningPreview: string;\r\n textChars: number;\r\n toolCallCount: number;\r\n toolNames: string[];\r\n /** Set when writeResponsesStream force-stopped the generation early — see REPEAT_TAIL_CHARS. */\r\n loopDetected?: 'reasoning' | 'text';\r\n /** Set when leaked DeepSeek DSML tool-call markup was recovered into real function calls. */\r\n dsmlToolCallsRecovered?: number;\r\n /** Set when the stream was aborted (idle timeout — upstream stopped sending data). */\r\n aborted?: boolean;\r\n /** Set when the stream ended with an upstream error part (e.g. HTTP 4xx/5xx). */\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface ResponsesStreamProgress {\r\n reasoningChars: number;\r\n reasoningTail: string;\r\n textChars: number;\r\n toolCallCount: number;\r\n elapsedMs: number;\r\n}\r\n\r\n/** Minimum time between onProgress calls, so a genuinely runaway/looping generation is\r\n * still visible in the trace log before (or instead of) a final onDone summary. */\r\nconst PROGRESS_INTERVAL_MS = 3_000;\r\n\r\n/**\r\n * Observed live: xAI grok-4.5 given a large, tools-stripped compaction request can finish\r\n * reasoning normally, then free-run regenerating an identical block of text forever instead\r\n * of reaching `finish` (same trailing 200 chars unchanged across dozens of progress checks\r\n * while textChars kept climbing). Checked on the same cadence as onProgress, independent of\r\n * whether tracing is enabled — this is a safety mechanism, not a debug feature.\r\n */\r\nconst REPEAT_TAIL_CHARS = 200;\r\n/** Consecutive stale-tail checks (each PROGRESS_INTERVAL_MS apart) before concluding the\r\n * model is looping rather than coincidentally producing similar output between checks. */\r\nconst REPEAT_STREAK_LIMIT = 3;\r\nconst LOOP_NOTICE = '\\n\\n[anygate: generation stopped after detecting a repetition loop]';\r\n\r\ninterface RepeatTracker {\r\n tail: string;\r\n len: number;\r\n streak: number;\r\n}\r\n\r\nconst INITIAL_REPEAT_TRACKER: RepeatTracker = { tail: '', len: 0, streak: 0 };\r\n\r\n/** Stale tail + substantial continued growth = regenerating the same content, not just\r\n * naturally ending on similar words. Requiring both avoids false positives on a stream\r\n * that briefly stalls with no new output at all. */\r\nfunction trackRepetition(current: string, prev: RepeatTracker): RepeatTracker {\r\n const tail = current.length >= REPEAT_TAIL_CHARS ? current.slice(-REPEAT_TAIL_CHARS) : current;\r\n const grew = current.length - prev.len >= REPEAT_TAIL_CHARS;\r\n const stale = tail.length === REPEAT_TAIL_CHARS && tail === prev.tail && grew;\r\n return { tail, len: current.length, streak: stale ? prev.streak + 1 : 0 };\r\n}\r\n\r\nexport interface WriteResponsesStreamOptions {\r\n /** Called when the stream is force-stopped (repetition loop) BEFORE breaking out of\r\n * fullStream. Breaking alone does not cancel the SDK's upstream request — the SDK\r\n * keeps consuming internally to settle its own promises — so the caller must abort. */\r\n onForceStop?: (reason: string) => void;\r\n}\r\n\r\nexport async function writeResponsesStream(\r\n fullStream: AsyncIterable<FullStreamPart>,\r\n modelId: string,\r\n write: WriteFn,\r\n onDone?: (summary: ResponsesStreamSummary) => void,\r\n onProgress?: (progress: ResponsesStreamProgress) => void,\r\n options?: WriteResponsesStreamOptions,\r\n): Promise<void> {\r\n const emit = (type: string, data: unknown) => write(sseChunk(type, data));\r\n const responseId = newResponseId();\r\n const createdAt = Math.floor(Date.now() / 1000);\r\n let usage = { input_tokens: 0, output_tokens: 0, total_tokens: 0 };\r\n\r\n emit('response.created', {\r\n type: 'response.created',\r\n response: {\r\n id: responseId,\r\n object: 'response',\r\n model: modelId,\r\n created_at: createdAt,\r\n status: 'in_progress',\r\n output: [],\r\n },\r\n });\r\n\r\n let outputIndex = 0;\r\n let textItemId: string | null = null;\r\n let textOutputIndex = 0;\r\n let textFull = '';\r\n const toolStates: StreamingToolState[] = [];\r\n const toolStatesById = new Map<string, StreamingToolState>();\r\n let currentToolState: StreamingToolState | null = null;\r\n const streamStartedAt = Date.now();\r\n let lastProgressAt = streamStartedAt;\r\n let reasoningItemId: string | null = null;\r\n let reasoningText = '';\r\n let reasoningOutputIndex = 0;\r\n const outputItems: unknown[] = [];\r\n let reasoningRepeat = INITIAL_REPEAT_TRACKER;\r\n let textRepeat = INITIAL_REPEAT_TRACKER;\r\n let loopDetected: 'reasoning' | 'text' | undefined;\r\n\r\n const ensureTextItem = (): string => {\r\n if (!textItemId) {\r\n textItemId = newItemId('msg');\r\n textOutputIndex = outputIndex;\r\n outputIndex++;\r\n emit('response.output_item.added', {\r\n type: 'response.output_item.added',\r\n output_index: textOutputIndex,\r\n item: { id: textItemId, type: 'message', role: 'assistant', status: 'in_progress', content: [] },\r\n });\r\n emit('response.content_part.added', {\r\n type: 'response.content_part.added',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n part: { type: 'output_text', text: '' },\r\n });\r\n }\r\n return textItemId;\r\n };\r\n\r\n const rememberToolState = (state: StreamingToolState): StreamingToolState => {\r\n toolStates.push(state);\r\n toolStatesById.set(state.itemId, state);\r\n toolStatesById.set(state.callId, state);\r\n currentToolState = state;\r\n return state;\r\n };\r\n\r\n const createToolState = (\r\n rawId: string | undefined,\r\n name: string | undefined,\r\n signature: string | undefined,\r\n ): StreamingToolState => {\r\n const itemId = rawId ?? newItemId('fc');\r\n const state = rememberToolState({\r\n itemId,\r\n callId: encodeToolUseId(itemId, signature, false),\r\n name: name ?? 'unknown',\r\n outputIndex: outputIndex++,\r\n args: '',\r\n });\r\n emit('response.output_item.added', {\r\n type: 'response.output_item.added',\r\n output_index: state.outputIndex,\r\n item: {\r\n type: 'function_call',\r\n id: state.itemId,\r\n call_id: state.callId,\r\n name: state.name,\r\n arguments: '',\r\n status: 'in_progress',\r\n },\r\n });\r\n return state;\r\n };\r\n\r\n const findToolState = (part: FullStreamPart): StreamingToolState | null => {\r\n const key = part.id ?? part.toolCallId;\r\n if (key) return toolStatesById.get(key) ?? currentToolState;\r\n return currentToolState;\r\n };\r\n\r\n const appendToolArgs = (state: StreamingToolState, delta: string): void => {\r\n if (!delta) return;\r\n state.args += delta;\r\n emit('response.function_call_arguments.delta', {\r\n type: 'response.function_call_arguments.delta',\r\n item_id: state.itemId,\r\n output_index: state.outputIndex,\r\n delta,\r\n });\r\n };\r\n\r\n for await (const part of fullStream) {\r\n switch (part.type) {\r\n case 'reasoning-start':\r\n reasoningText = '';\r\n reasoningItemId = newItemId('rs');\r\n reasoningOutputIndex = outputIndex++;\r\n emit('response.output_item.added', {\r\n type: 'response.output_item.added',\r\n output_index: reasoningOutputIndex,\r\n item: { id: reasoningItemId, type: 'reasoning', summary: [] },\r\n });\r\n break;\r\n\r\n case 'reasoning-delta':\r\n if (!reasoningItemId) {\r\n reasoningItemId = newItemId('rs');\r\n reasoningOutputIndex = outputIndex++;\r\n emit('response.output_item.added', {\r\n type: 'response.output_item.added',\r\n output_index: reasoningOutputIndex,\r\n item: { id: reasoningItemId, type: 'reasoning', summary: [] },\r\n });\r\n }\r\n reasoningText += part.text ?? '';\r\n break;\r\n\r\n case 'reasoning-end':\r\n break;\r\n\r\n case 'text-start':\r\n textFull = '';\r\n ensureTextItem();\r\n break;\r\n\r\n case 'text-delta':\r\n ensureTextItem();\r\n textFull += part.text ?? '';\r\n emit('response.output_text.delta', {\r\n type: 'response.output_text.delta',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n delta: part.text ?? '',\r\n });\r\n break;\r\n\r\n case 'tool-input-start': {\r\n const sig = grabRoundTripSignature(part);\r\n createToolState(part.id ?? part.toolCallId, part.toolName, sig);\r\n break;\r\n }\r\n\r\n case 'tool-input-delta': {\r\n const state = findToolState(part);\r\n if (state) appendToolArgs(state, part.delta ?? part.text ?? '');\r\n break;\r\n }\r\n\r\n case 'tool-call': {\r\n const sig = grabRoundTripSignature(part);\r\n const key = part.toolCallId ?? part.id;\r\n const state = (key ? toolStatesById.get(key) : undefined)\r\n ?? createToolState(key, part.toolName, sig);\r\n if (!state.args) {\r\n appendToolArgs(state, JSON.stringify(part.input ?? {}));\r\n }\r\n break;\r\n }\r\n\r\n case 'finish':\r\n if (part.totalUsage) usage = usageFromPart(part);\r\n break;\r\n\r\n case 'abort': {\r\n // The SDK ends the stream cleanly after an abort (no throw), so without\r\n // this case a timed-out request would finalize as status:\"completed\" and\r\n // Codex would treat dead-connection silence as a valid empty answer.\r\n const msg = `stream aborted: ${part.reason ?? 'no data received from provider'}`;\r\n process.stderr.write(`[anygate] ${modelId}: ${msg}\\n`);\r\n onDone?.({\r\n reasoningChars: reasoningText.length,\r\n reasoningPreview: reasoningText.slice(0, 200),\r\n textChars: textFull.length,\r\n toolCallCount: toolStates.length,\r\n toolNames: toolStates.map(t => t.name),\r\n loopDetected,\r\n aborted: true,\r\n });\r\n emit('response.completed', {\r\n type: 'response.completed',\r\n response: {\r\n id: responseId,\r\n object: 'response',\r\n model: modelId,\r\n created_at: createdAt,\r\n status: 'failed',\r\n output: [],\r\n error: { message: msg, type: 'api_error' },\r\n },\r\n });\r\n return;\r\n }\r\n\r\n case 'error': {\r\n const msg = formatUpstreamError(part.error);\r\n const is429 = msg.includes('429') ||\r\n (part.error && typeof part.error === 'object' &&\r\n ((part.error as { statusCode?: number }).statusCode === 429 ||\r\n (part.error as { lastError?: { statusCode?: number } }).lastError?.statusCode === 429));\r\n process.stderr.write(`[anygate] ${modelId}: ${msg}\\n`);\r\n onDone?.({\r\n reasoningChars: reasoningText.length,\r\n reasoningPreview: reasoningText.slice(0, 200),\r\n textChars: textFull.length,\r\n toolCallCount: toolStates.length,\r\n toolNames: toolStates.map(t => t.name),\r\n loopDetected,\r\n errorMessage: msg,\r\n });\r\n if (is429) {\r\n writeResponsesRateLimitStream(modelId, msg, write);\r\n } else {\r\n emit('response.completed', {\r\n type: 'response.completed',\r\n response: {\r\n id: responseId,\r\n object: 'response',\r\n model: modelId,\r\n created_at: createdAt,\r\n status: 'failed',\r\n output: [],\r\n error: { message: msg, type: 'api_error' },\r\n },\r\n });\r\n }\r\n return;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n const now = Date.now();\r\n if (now - lastProgressAt >= PROGRESS_INTERVAL_MS) {\r\n lastProgressAt = now;\r\n reasoningRepeat = trackRepetition(reasoningText, reasoningRepeat);\r\n textRepeat = trackRepetition(textFull, textRepeat);\r\n if (reasoningRepeat.streak >= REPEAT_STREAK_LIMIT) loopDetected = 'reasoning';\r\n else if (textRepeat.streak >= REPEAT_STREAK_LIMIT) loopDetected = 'text';\r\n\r\n if (onProgress) {\r\n onProgress({\r\n reasoningChars: reasoningText.length,\r\n reasoningTail: reasoningText.slice(-200),\r\n textChars: textFull.length,\r\n toolCallCount: toolStates.length,\r\n elapsedMs: now - streamStartedAt,\r\n });\r\n }\r\n\r\n if (loopDetected) {\r\n options?.onForceStop?.(`repetition loop detected (${loopDetected})`);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (loopDetected) {\r\n ensureTextItem();\r\n textFull += LOOP_NOTICE;\r\n emit('response.output_text.delta', {\r\n type: 'response.output_text.delta',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n delta: LOOP_NOTICE,\r\n });\r\n }\r\n\r\n const dsml = loopDetected ? null : parseDsmlToolCalls(textFull);\r\n\r\n if (dsml) {\r\n // The client already streamed the raw DSML markup live as ordinary text-delta events\r\n // (we don't know it's a tool-call block until the closing tag arrives) - but the\r\n // *final* output is what Codex actually acts on, so replace the garbled text item\r\n // with the real function calls the model intended, matching a normal tool-call turn.\r\n if (dsml.leadingText && textItemId) {\r\n emit('response.output_text.done', {\r\n type: 'response.output_text.done',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n text: dsml.leadingText,\r\n });\r\n emit('response.content_part.done', {\r\n type: 'response.content_part.done',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n part: { type: 'output_text', text: dsml.leadingText },\r\n });\r\n const textItem = {\r\n id: textItemId,\r\n type: 'message',\r\n role: 'assistant',\r\n status: 'completed',\r\n content: [{ type: 'output_text', text: dsml.leadingText }],\r\n };\r\n emit('response.output_item.done', {\r\n type: 'response.output_item.done',\r\n output_index: textOutputIndex,\r\n item: textItem,\r\n });\r\n outputItems.push(textItem);\r\n }\r\n for (const call of dsml.calls) {\r\n const itemId = newItemId('fc');\r\n const callId = encodeToolUseId(itemId, undefined, false);\r\n const idx = outputIndex++;\r\n const args = JSON.stringify(call.args);\r\n emit('response.output_item.added', {\r\n type: 'response.output_item.added',\r\n output_index: idx,\r\n item: { type: 'function_call', id: itemId, call_id: callId, name: call.name, arguments: '', status: 'in_progress' },\r\n });\r\n emit('response.function_call_arguments.done', {\r\n type: 'response.function_call_arguments.done',\r\n item_id: itemId,\r\n output_index: idx,\r\n arguments: args,\r\n });\r\n const fcItem = { type: 'function_call', id: itemId, call_id: callId, name: call.name, arguments: args, status: 'completed' };\r\n emit('response.output_item.done', { type: 'response.output_item.done', output_index: idx, item: fcItem });\r\n outputItems.push(fcItem);\r\n }\r\n } else if (textItemId) {\r\n emit('response.output_text.done', {\r\n type: 'response.output_text.done',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n text: textFull,\r\n });\r\n emit('response.content_part.done', {\r\n type: 'response.content_part.done',\r\n item_id: textItemId,\r\n output_index: textOutputIndex,\r\n content_index: 0,\r\n part: { type: 'output_text', text: textFull },\r\n });\r\n const textItem = {\r\n id: textItemId,\r\n type: 'message',\r\n role: 'assistant',\r\n status: 'completed',\r\n content: [{ type: 'output_text', text: textFull }],\r\n };\r\n emit('response.output_item.done', {\r\n type: 'response.output_item.done',\r\n output_index: textOutputIndex,\r\n item: textItem,\r\n });\r\n outputItems.push(textItem);\r\n }\r\n\r\n if (reasoningItemId) {\r\n const reasoningItem = makeReasoningOutputItem(reasoningItemId, reasoningText);\r\n emit('response.output_item.done', {\r\n type: 'response.output_item.done',\r\n output_index: reasoningOutputIndex,\r\n item: reasoningItem,\r\n });\r\n outputItems.unshift(reasoningItem);\r\n }\r\n\r\n for (const tool of toolStates) {\r\n emit('response.function_call_arguments.done', {\r\n type: 'response.function_call_arguments.done',\r\n item_id: tool.itemId,\r\n output_index: tool.outputIndex,\r\n arguments: tool.args,\r\n });\r\n const fcItem = {\r\n type: 'function_call',\r\n id: tool.itemId,\r\n call_id: tool.callId,\r\n name: tool.name,\r\n arguments: tool.args,\r\n status: 'completed',\r\n };\r\n emit('response.output_item.done', {\r\n type: 'response.output_item.done',\r\n output_index: tool.outputIndex,\r\n item: fcItem,\r\n });\r\n outputItems.push(fcItem);\r\n }\r\n\r\n if (outputItems.length === 0) {\r\n outputItems.push({ id: newItemId('msg'), type: 'message', role: 'assistant', status: 'completed', content: [{ type: 'output_text', text: '(conversation context was too large to summarize)' }] });\r\n }\r\n\r\n onDone?.({\r\n reasoningChars: reasoningText.length,\r\n reasoningPreview: reasoningText.slice(0, 200),\r\n textChars: textFull.length,\r\n toolCallCount: toolStates.length,\r\n toolNames: toolStates.map(t => t.name),\r\n loopDetected,\r\n dsmlToolCallsRecovered: dsml?.calls.length,\r\n });\r\n\r\n emit('response.completed', {\r\n type: 'response.completed',\r\n response: {\r\n id: responseId,\r\n object: 'response',\r\n model: modelId,\r\n created_at: createdAt,\r\n status: 'completed',\r\n output: outputItems,\r\n usage,\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Observed live: OpenCode Zen silently dropped an upstream connection before sending a\r\n * single byte — no HTTP error, no stream error, no TCP reset our fetch could see. With\r\n * no timeout anywhere in this path, the `for await` over fullStream waited forever and\r\n * every safety mechanism (progress logging, repetition detector) was invisible because\r\n * they only run when a part arrives. This watchdog is armed immediately (unlike the\r\n * SDK's `timeout.chunkMs`, which only arms after the first chunk) and reset on every\r\n * part, so it bounds both zero-byte hangs and mid-stream connection death.\r\n */\r\nconst STREAM_IDLE_TIMEOUT_MS = 120_000;\r\n\r\nexport interface StreamResponsesOptions {\r\n idleTimeoutMs?: number;\r\n}\r\n\r\nexport async function streamResponsesResponse(\r\n model: LanguageModel,\r\n params: CodexSdkCallParams,\r\n modelId: string,\r\n write: WriteFn,\r\n onDone?: (summary: ResponsesStreamSummary) => void,\r\n onProgress?: (progress: ResponsesStreamProgress) => void,\r\n options?: StreamResponsesOptions,\r\n): Promise<void> {\r\n const idleTimeoutMs = options?.idleTimeoutMs ?? STREAM_IDLE_TIMEOUT_MS;\r\n const abort = new AbortController();\r\n let idleTimer = setTimeout(\r\n () => abort.abort(new Error(`no data received from provider for ${Math.round(idleTimeoutMs / 1000)}s`)),\r\n idleTimeoutMs,\r\n );\r\n\r\n const result = streamText({ model, ...params, abortSignal: abort.signal, onError: () => {} } as Parameters<typeof streamText>[0]);\r\n // Prevent unhandled promise rejections on stream properties:\r\n Promise.resolve(result.text).catch(() => {});\r\n Promise.resolve(result.toolCalls).catch(() => {});\r\n Promise.resolve(result.toolResults).catch(() => {});\r\n Promise.resolve(result.finishReason).catch(() => {});\r\n Promise.resolve(result.usage).catch(() => {});\r\n Promise.resolve(result.response).catch(() => {});\r\n\r\n const watchedStream = (async function* () {\r\n try {\r\n for await (const part of result.fullStream as AsyncIterable<FullStreamPart>) {\r\n clearTimeout(idleTimer);\r\n idleTimer = setTimeout(\r\n () => abort.abort(new Error(`no data received from provider for ${Math.round(idleTimeoutMs / 1000)}s`)),\r\n idleTimeoutMs,\r\n );\r\n yield part;\r\n }\r\n } finally {\r\n clearTimeout(idleTimer);\r\n }\r\n })();\r\n\r\n await writeResponsesStream(watchedStream, modelId, write, onDone, onProgress, {\r\n onForceStop: reason => abort.abort(new Error(reason)),\r\n });\r\n}\r\n\r\nexport async function generateResponsesResponse(\r\n model: LanguageModel,\r\n params: CodexSdkCallParams,\r\n modelId: string,\r\n): Promise<Record<string, unknown>> {\r\n const r = await generateText({ model, ...params } as Parameters<typeof generateText>[0]);\r\n const createdAt = Math.floor(Date.now() / 1000);\r\n const responseId = newResponseId();\r\n const output: unknown[] = [];\r\n\r\n if (r.reasoningText?.trim()) {\r\n output.push(makeReasoningOutputItem(newItemId('rs'), r.reasoningText));\r\n }\r\n\r\n if (r.text !== null && r.text !== undefined) {\r\n output.push({\r\n id: newItemId('msg'),\r\n type: 'message',\r\n role: 'assistant',\r\n status: 'completed',\r\n content: [{ type: 'output_text', text: r.text }],\r\n });\r\n }\r\n\r\n for (const tc of r.toolCalls) {\r\n const encodedId = encodeToolUseId(tc.toolCallId, grabRoundTripSignature(tc as FullStreamPart), false);\r\n output.push({\r\n type: 'function_call',\r\n id: tc.toolCallId,\r\n call_id: encodedId,\r\n name: tc.toolName,\r\n arguments: JSON.stringify(tc.input ?? {}),\r\n status: 'completed',\r\n });\r\n }\r\n\r\n if (output.length === 0) {\r\n output.push({ id: newItemId('msg'), type: 'message', role: 'assistant', status: 'completed', content: [{ type: 'output_text', text: '(conversation context was too large to summarize)' }] });\r\n }\r\n\r\n const inputTokens = r.usage?.inputTokens ?? 0;\r\n const outputTokens = r.usage?.outputTokens ?? 0;\r\n\r\n return {\r\n id: responseId,\r\n object: 'response',\r\n model: modelId,\r\n created_at: createdAt,\r\n status: 'completed',\r\n output,\r\n usage: {\r\n input_tokens: inputTokens,\r\n output_tokens: outputTokens,\r\n total_tokens: inputTokens + outputTokens,\r\n },\r\n };\r\n}\r\n\r\nexport function responsesErrorBody(\r\n modelId: string,\r\n message: string,\r\n statusCode = 401,\r\n): Record<string, unknown> {\r\n return {\r\n id: newResponseId(),\r\n object: 'response',\r\n model: modelId,\r\n created_at: Math.floor(Date.now() / 1000),\r\n status: 'failed',\r\n output: [],\r\n error: { message, type: statusCode === 429 ? 'rate_limit_error' : 'api_error', code: String(statusCode) },\r\n };\r\n}\r\n\r\nexport function writeResponsesErrorStream(modelId: string, message: string, write: WriteFn, statusCode = 401): void {\r\n write(sseChunk('response.completed', {\r\n type: 'response.completed',\r\n response: responsesErrorBody(modelId, message, statusCode),\r\n }));\r\n}\r\n\r\nexport function writeResponsesRateLimitStream(modelId: string, message: string, write: WriteFn): void {\r\n const responseId = newResponseId();\r\n const itemId = newItemId('msg');\r\n const createdAt = Math.floor(Date.now() / 1000);\r\n const content = [{ type: 'output_text', text: message }];\r\n write(sseChunk('response.created', {\r\n type: 'response.created',\r\n response: {\r\n id: responseId,\r\n object: 'response',\r\n model: modelId,\r\n created_at: createdAt,\r\n status: 'in_progress',\r\n output: [],\r\n },\r\n }));\r\n write(sseChunk('response.output_item.added', {\r\n type: 'response.output_item.added',\r\n output_index: 0,\r\n item: { id: itemId, type: 'message', role: 'assistant', status: 'in_progress', content: [] },\r\n }));\r\n write(sseChunk('response.content_part.added', {\r\n type: 'response.content_part.added',\r\n item_id: itemId, output_index: 0, content_index: 0,\r\n part: { type: 'output_text', text: '' },\r\n }));\r\n write(sseChunk('response.output_text.delta', {\r\n type: 'response.output_text.delta',\r\n item_id: itemId, output_index: 0, content_index: 0,\r\n delta: message,\r\n }));\r\n write(sseChunk('response.output_text.done', {\r\n type: 'response.output_text.done',\r\n item_id: itemId, output_index: 0, content_index: 0,\r\n text: message,\r\n }));\r\n write(sseChunk('response.content_part.done', {\r\n type: 'response.content_part.done',\r\n item_id: itemId, output_index: 0, content_index: 0,\r\n part: { type: 'output_text', text: message },\r\n }));\r\n write(sseChunk('response.output_item.done', {\r\n type: 'response.output_item.done',\r\n output_index: 0,\r\n item: { id: itemId, type: 'message', role: 'assistant', status: 'completed', content },\r\n }));\r\n write(sseChunk('response.completed', {\r\n type: 'response.completed',\r\n response: {\r\n id: responseId, object: 'response', model: modelId, created_at: createdAt,\r\n status: 'completed',\r\n output: [{ id: itemId, type: 'message', role: 'assistant', status: 'completed', content }],\r\n },\r\n }));\r\n}\r\n\r\nexport function responsesRateLimitBody(modelId: string, message: string): Record<string, unknown> {\r\n const itemId = newItemId('msg');\r\n const content = [{ type: 'output_text', text: message }];\r\n return {\r\n id: newResponseId(),\r\n object: 'response',\r\n model: modelId,\r\n created_at: Math.floor(Date.now() / 1000),\r\n status: 'completed',\r\n output: [{ id: itemId, type: 'message', role: 'assistant', status: 'completed', content }],\r\n };\r\n}\r\n","// Write anygate-launch.config.toml for Codex — never touch ~/.codex/config.toml.\r\nimport { join } from 'node:path';\r\nimport { codexProviderEnvKey, type CodexRoute } from './routing.js';\r\nimport { CODEX_PROFILE_NAME, getCatalogPath, getCodexProfilePath, getAnygateICodexDir } from './session.js';\r\n\r\nexport interface CodexProfileSpec {\r\n route: CodexRoute;\r\n proxyPort?: number;\r\n catalogPath: string;\r\n /** When set, seeds Codex reasoning picker for capable models. */\r\n modelReasoningEffort?: string;\r\n}\r\n\r\n/** Full network + filesystem access for shell tools (nlm, curl, npm, MCP CLIs). */\r\nexport const CODEX_LAUNCH_SANDBOX = 'danger-full-access';\r\n\r\nfunction profileReasoningLine(effort?: string): string {\r\n return effort ? `model_reasoning_effort = ${tomlString(effort)}\\n` : '';\r\n}\r\n\r\nfunction profileSandboxLine(): string {\r\n return `sandbox = ${tomlString(CODEX_LAUNCH_SANDBOX)}\\n`;\r\n}\r\n\r\nfunction tomlString(value: string): string {\r\n return JSON.stringify(value);\r\n}\r\n\r\nexport function buildCodexProfileToml(spec: CodexProfileSpec): string {\r\n const { route, proxyPort, catalogPath, modelReasoningEffort } = spec;\r\n const model = route.modelId;\r\n const reasoning = profileReasoningLine(modelReasoningEffort);\r\n\r\n if (route.tier === 'direct') {\r\n const envKey = codexProviderEnvKey(route.providerId);\r\n const baseUrl = route.baseURL ?? 'https://api.openai.com/v1';\r\n return `# Generated by anygate — do not edit\r\n${profileSandboxLine()}model = ${tomlString(model)}\r\nmodel_provider = ${tomlString(route.providerId)}\r\nmodel_catalog_json = ${tomlString(catalogPath)}\r\n${reasoning}\r\n[model_providers.${route.providerId}]\r\nname = ${tomlString(route.providerId)}\r\nbase_url = ${tomlString(baseUrl)}\r\nenv_key = ${tomlString(envKey)}\r\nwire_api = \"responses\"\r\n`;\r\n }\r\n\r\n const proxyBase = `http://127.0.0.1:${proxyPort}/v1`;\r\n return `# Generated by anygate — do not edit\r\n${profileSandboxLine()}model = ${tomlString(model)}\r\nmodel_provider = \"anygate-proxy\"\r\nmodel_catalog_json = ${tomlString(catalogPath)}\r\n${reasoning}\r\n[model_providers.anygate-proxy]\r\nname = \"anygate\"\r\nbase_url = ${tomlString(proxyBase)}\r\nenv_key = \"ANYGATE_CODEX_KEY\"\r\nwire_api = \"responses\"\r\n`;\r\n}\r\n\r\nexport function getProfileOutputPath(): string {\r\n return getCodexProfilePath();\r\n}\r\n\r\nexport function getCatalogOutputPath(providerId: string): string {\r\n return getCatalogPath(providerId);\r\n}\r\n\r\nexport function getFavoritesCatalogPath(): string {\r\n return join(getAnygateICodexDir(), 'models-favorites.json');\r\n}\r\n\r\nexport function getFavoritesAppCatalogPath(): string {\r\n return join(getAnygateICodexDir(), 'app-models-favorites.json');\r\n}\r\n\r\nexport function profileName(): string {\r\n return CODEX_PROFILE_NAME;\r\n}\r\n","// Codex routing: tier 1 (direct OpenAI) vs tier 2 (Responses proxy).\r\nimport type { CodexProxyRoute } from './proxy.js';\r\nimport { BACKENDS } from '../../../src/core/constants.js';\r\nimport {\r\n isTargetCompatibleModel,\r\n providersForTarget,\r\n routableModelsForTarget,\r\n type GatewayLaunchTarget,\r\n} from '../../../src/agents/shared/target-compatibility.js';\r\nimport type { LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\n\r\nexport interface CodexRoute {\r\n tier: 'direct' | 'proxy' | 'cloud-code';\r\n npm: string;\r\n baseURL?: string;\r\n upstreamModelId: string;\r\n apiKey: string;\r\n contextWindow?: number;\r\n modelId: string;\r\n providerId: string;\r\n authType?: 'api' | 'oauth' | 'none';\r\n oauthAccountId?: string;\r\n providerData?: Record<string, unknown>;\r\n supportedParameters?: string[];\r\n reasoning?: boolean;\r\n interleavedReasoningField?: string;\r\n /** Static headers sent on every upstream request (e.g. a plan/auth-tracking header a custom endpoint requires). */\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport function isRoutableModel(\r\n model: LocalProviderModel,\r\n providerId: string,\r\n agent: GatewayLaunchTarget = 'codex',\r\n authType?: LocalProvider['authType'],\r\n): boolean {\r\n return isTargetCompatibleModel({ target: agent, providerId, authType, model }).compatible;\r\n}\r\n\r\n/** Registry providers with at least one routable model (includes Anthropic). */\r\nexport function codexCompatibleProviders(\r\n providers: LocalProvider[],\r\n agent: GatewayLaunchTarget = 'codex',\r\n): LocalProvider[] {\r\n return providersForTarget(providers, agent);\r\n}\r\n\r\nfunction resolveBaseURL(model: LocalProviderModel, provider: LocalProvider): string | undefined {\r\n if (provider.id === 'zen' || provider.id === 'go') {\r\n const isAnthropic = model.modelFormat === 'anthropic';\r\n const baseUrl = BACKENDS[provider.id].baseUrl;\r\n return isAnthropic ? baseUrl : `${baseUrl}/v1`;\r\n }\r\n return model.apiBaseUrl\r\n ?? model.completionsUrl?.replace(/\\/chat\\/completions$/, '')\r\n ?? model.baseUrl;\r\n}\r\n\r\n/** Tier 1 = OpenAI API keys only. OAuth needs the proxy for Codex endpoint headers. */\r\nexport function resolveCodexRoute(\r\n provider: LocalProvider,\r\n model: LocalProviderModel,\r\n apiKey: string,\r\n): CodexRoute {\r\n const upstreamModelId = model.upstreamModelId || model.id;\r\n const inferredNpm = model.modelFormat === 'anthropic' ? '@ai-sdk/anthropic' : '@ai-sdk/openai-compatible';\r\n // For zen/go cloud backends the registry modelsCache npm is unreliable — the\r\n // OpenCode models cache (via modelFormat) is authoritative for endpoint format.\r\n const isZenGo = provider.id === 'zen' || provider.id === 'go';\r\n const base = {\r\n npm: isZenGo ? inferredNpm : (model.npm ?? inferredNpm),\r\n baseURL: resolveBaseURL(model, provider),\r\n upstreamModelId,\r\n apiKey,\r\n contextWindow: model.contextWindow,\r\n modelId: model.id,\r\n providerId: provider.id,\r\n authType: provider.authType,\r\n oauthAccountId: provider.oauthAccountId,\r\n providerData: provider.providerData,\r\n supportedParameters: model.supportedParameters,\r\n reasoning: model.reasoning,\r\n interleavedReasoningField: model.interleavedReasoningField,\r\n headers: provider.headers,\r\n };\r\n\r\n if (model.modelFormat === 'cloud-code') {\r\n return {\r\n tier: 'cloud-code',\r\n npm: '@ai-sdk/anthropic',\r\n baseURL: '',\r\n upstreamModelId: model.upstreamModelId || model.id,\r\n apiKey,\r\n contextWindow: model.contextWindow,\r\n modelId: model.id,\r\n providerId: provider.id,\r\n authType: provider.authType,\r\n oauthAccountId: provider.oauthAccountId,\r\n providerData: provider.providerData,\r\n supportedParameters: model.supportedParameters,\r\n reasoning: model.reasoning,\r\n interleavedReasoningField: model.interleavedReasoningField,\r\n headers: provider.headers,\r\n };\r\n }\r\n\r\n if (model.npm === '@ai-sdk/openai' && provider.authType !== 'oauth' && model.modelFormat === 'openai') {\r\n return { tier: 'direct', ...base };\r\n }\r\n\r\n return { tier: 'proxy', ...base };\r\n}\r\n\r\nexport function routableModelsForProvider(\r\n provider: LocalProvider,\r\n agent: GatewayLaunchTarget = 'codex',\r\n): LocalProviderModel[] {\r\n return routableModelsForTarget(provider, agent);\r\n}\r\n\r\nexport function buildCodexProxyRoutesForProvider(\r\n provider: LocalProvider,\r\n apiKey: string,\r\n selectedModelId?: string,\r\n agent: GatewayLaunchTarget = 'codex',\r\n): CodexProxyRoute[] {\r\n const routable = routableModelsForProvider(provider, agent);\r\n const ordered = selectedModelId\r\n ? [\r\n ...routable.filter(m => m.id === selectedModelId),\r\n ...routable.filter(m => m.id !== selectedModelId),\r\n ]\r\n : routable;\r\n return ordered.map(model => {\r\n const route = resolveCodexRoute(provider, model, apiKey);\r\n return {\r\n modelId: route.modelId,\r\n npm: route.npm,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n upstreamModelId: route.upstreamModelId,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n contextWindow: route.contextWindow,\r\n headers: route.headers,\r\n };\r\n });\r\n}\r\n\r\nexport function codexProviderEnvKey(providerId: string): string {\r\n const known: Record<string, string> = {\r\n openai: 'OPENAI_API_KEY',\r\n xai: 'XAI_API_KEY',\r\n 'xai-oauth': 'XAI_API_KEY',\r\n anthropic: 'ANTHROPIC_API_KEY',\r\n google: 'GEMINI_API_KEY',\r\n };\r\n return known[providerId] ?? `${providerId.toUpperCase().replace(/[^A-Z0-9]/g, '_')}_API_KEY`;\r\n}\r\n","// Codex overlay session: backup, restore, lock, stale cleanup.\r\nimport {\r\n copyFileSync,\r\n existsSync,\r\n mkdirSync,\r\n readdirSync,\r\n readFileSync,\r\n renameSync,\r\n rmSync,\r\n statSync,\r\n unlinkSync,\r\n writeFileSync,\r\n} from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { basename, dirname, join } from 'node:path';\r\nimport { getAppHome } from '../../../src/core/paths.js';\r\n\r\nexport const CODEX_PROFILE_NAME = 'anygate-launch';\r\nexport const STALE_SESSION_MS = 5 * 60 * 1000;\r\nexport const MAX_BACKUPS = 5;\r\n\r\nexport interface CodexSessionLock {\r\n pid: number;\r\n startedAt: string;\r\n profilePath: string;\r\n catalogPaths: string[];\r\n proxyPort?: number;\r\n}\r\n\r\nexport function getCodexHome(): string {\r\n return join(homedir(), '.codex');\r\n}\r\n\r\nexport function getCodexProfilePath(): string {\r\n return join(getCodexHome(), `${CODEX_PROFILE_NAME}.config.toml`);\r\n}\r\n\r\nexport function getAnygateICodexDir(env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAppHome(env), 'codex');\r\n}\r\n\r\nexport function getSessionLockPath(env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAnygateICodexDir(env), 'session.json');\r\n}\r\n\r\nexport function getBackupsDir(env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAnygateICodexDir(env), 'backups');\r\n}\r\n\r\nexport function getCatalogPath(providerId: string, env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAnygateICodexDir(env), `models-${providerId}.json`);\r\n}\r\n\r\n/** Files anygate owns for Codex launch — never touch ~/.codex/config.toml. */\r\nexport function ownedOverlayPaths(env: NodeJS.ProcessEnv = process.env): string[] {\r\n const paths = [getCodexProfilePath(), getSessionLockPath(env)];\r\n const codexDir = getAnygateICodexDir(env);\r\n if (existsSync(codexDir)) {\r\n for (const name of readdirSync(codexDir)) {\r\n if (name.startsWith('models-') && name.endsWith('.json')) {\r\n paths.push(join(codexDir, name));\r\n }\r\n }\r\n }\r\n return paths;\r\n}\r\n\r\nexport function atomicWriteFile(path: string, content: string): void {\r\n mkdirSync(dirname(path), { recursive: true });\r\n const tmp = `${path}.tmp.${process.pid}`;\r\n writeFileSync(tmp, content, 'utf8');\r\n renameSync(tmp, path);\r\n}\r\n\r\nexport function rotateBackups(filePath: string, env: NodeJS.ProcessEnv = process.env): void {\r\n if (!existsSync(filePath)) return;\r\n const backupsDir = getBackupsDir(env);\r\n mkdirSync(backupsDir, { recursive: true });\r\n const base = basename(filePath);\r\n const stamp = Date.now();\r\n const backupPath = join(backupsDir, `${base}.${stamp}.bak`);\r\n copyFileSync(filePath, backupPath);\r\n const backups = readdirSync(backupsDir)\r\n .filter(n => n.startsWith(`${base}.`) && n.endsWith('.bak'))\r\n .map(n => ({ name: n, mtime: statSync(join(backupsDir, n)).mtimeMs }))\r\n .sort((a, b) => b.mtime - a.mtime);\r\n for (const old of backups.slice(MAX_BACKUPS)) {\r\n try {\r\n unlinkSync(join(backupsDir, old.name));\r\n } catch { /* ignore */ }\r\n }\r\n}\r\n\r\nexport function writeOverlayFile(path: string, content: string, env: NodeJS.ProcessEnv = process.env): void {\r\n rotateBackups(path, env);\r\n atomicWriteFile(path, content);\r\n}\r\n\r\nexport function readSessionLock(env: NodeJS.ProcessEnv = process.env): CodexSessionLock | null {\r\n const path = getSessionLockPath(env);\r\n if (!existsSync(path)) return null;\r\n try {\r\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as CodexSessionLock;\r\n if (typeof parsed.pid === 'number' && typeof parsed.startedAt === 'string') return parsed;\r\n } catch { /* ignore */ }\r\n return null;\r\n}\r\n\r\nexport function writeSessionLock(lock: CodexSessionLock, env: NodeJS.ProcessEnv = process.env): void {\r\n const path = getSessionLockPath(env);\r\n mkdirSync(getAnygateICodexDir(env), { recursive: true });\r\n atomicWriteFile(path, `${JSON.stringify(lock, null, 2)}\\n`);\r\n}\r\n\r\nexport function isProcessAlive(pid: number): boolean {\r\n if (pid <= 0) return false;\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function sessionAgeMs(lock: Pick<CodexSessionLock, 'startedAt'>): number {\r\n const started = Date.parse(lock.startedAt);\r\n if (Number.isNaN(started)) return Infinity;\r\n return Date.now() - started;\r\n}\r\n\r\n/** Stale only when the owning pid is no longer alive. */\r\nexport function isSessionStale(lock: CodexSessionLock): boolean {\r\n return !isProcessAlive(lock.pid);\r\n}\r\n\r\nexport function isConcurrentSession(lock: Pick<CodexSessionLock, 'pid' | 'startedAt'>): boolean {\r\n return isProcessAlive(lock.pid);\r\n}\r\n\r\nexport function restoreCodexOverlay(env: NodeJS.ProcessEnv = process.env): string[] {\r\n const removed: string[] = [];\r\n for (const path of ownedOverlayPaths(env)) {\r\n if (!existsSync(path)) continue;\r\n try {\r\n rmSync(path, { force: true });\r\n removed.push(path);\r\n } catch { /* ignore */ }\r\n }\r\n return removed;\r\n}\r\n\r\nexport function remainingOverlayPaths(env: NodeJS.ProcessEnv = process.env): string[] {\r\n return ownedOverlayPaths(env).filter(p => existsSync(p));\r\n}\r\n\r\nexport function cleanupStaleSession(env: NodeJS.ProcessEnv = process.env): boolean {\r\n return recoverInterruptedCodexSession(env).recovered;\r\n}\r\n\r\nexport type InterruptedRecovery = {\r\n recovered: boolean;\r\n removedCount?: number;\r\n /** dead anygate/codex pid or orphan overlay without a live lock */\r\n reason?: 'dead-session' | 'orphan-files';\r\n};\r\n\r\n/**\r\n * On launch: remove overlay files left by crash, force-quit, or closed terminal.\r\n * Does nothing when a concurrent live session holds the lock.\r\n */\r\nexport function recoverInterruptedCodexSession(env: NodeJS.ProcessEnv = process.env): InterruptedRecovery {\r\n const before = remainingOverlayPaths(env);\r\n if (before.length === 0) return { recovered: false };\r\n\r\n const lock = readSessionLock(env);\r\n if (lock && isConcurrentSession(lock)) {\r\n return { recovered: false };\r\n }\r\n\r\n restoreCodexOverlay(env);\r\n return {\r\n recovered: true,\r\n removedCount: before.length,\r\n reason: lock ? 'dead-session' : 'orphan-files',\r\n };\r\n}\r\n\r\nexport type SessionCheckResult =\r\n | { ok: true }\r\n | { ok: false; reason: 'concurrent'; lock: CodexSessionLock }\r\n | { ok: false; reason: 'non_tty' };\r\n\r\nexport function checkSessionLock(isTty: boolean, env: NodeJS.ProcessEnv = process.env): SessionCheckResult {\r\n if (!isTty) return { ok: false, reason: 'non_tty' };\r\n const lock = readSessionLock(env);\r\n if (lock && isConcurrentSession(lock)) {\r\n return { ok: false, reason: 'concurrent', lock };\r\n }\r\n return { ok: true };\r\n}\r\n","// Spawn Codex CLI with anygate-launch profile.\r\nimport { execFileSync, execSync, spawn } from 'node:child_process';\r\nimport { existsSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { CODEX_LAUNCH_SANDBOX, profileName } from './profile.js';\r\nimport { codexProviderEnvKey } from './routing.js';\r\nimport type { CodexRoute } from './routing.js';\r\nimport { PROXY_PLACEHOLDER_KEY } from './proxy.js';\r\nimport { getAppPathOverride } from '../../../src/core/config.js';\r\n\r\nconst isWindows = process.platform === 'win32';\r\n\r\n/** CI env inherited from IDE/agent terminals can force Codex into read-only CI sandbox mode. */\r\nconst CODEX_CI_ENV_VARS = [\r\n 'CI',\r\n 'CODEX_CI',\r\n 'CONTINUOUS_INTEGRATION',\r\n 'GITHUB_ACTIONS',\r\n 'GITLAB_CI',\r\n 'CIRCLECI',\r\n 'JENKINS_URL',\r\n 'TF_BUILD',\r\n 'BUILD_BUILDID',\r\n] as const;\r\n\r\nexport function stripCodexInheritedEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\r\n const out = { ...env };\r\n for (const name of CODEX_CI_ENV_VARS) {\r\n delete out[name];\r\n }\r\n return out;\r\n}\r\n\r\nconst CODEX_FALLBACK_PATHS = isWindows\r\n ? [\r\n join(process.env['APPDATA'] ?? homedir(), 'npm', 'codex.cmd'),\r\n join(process.env['APPDATA'] ?? homedir(), 'npm', 'codex'),\r\n ]\r\n : [\r\n join(homedir(), '.local', 'bin', 'codex'),\r\n join(homedir(), '.npm', 'bin', 'codex'),\r\n '/usr/local/bin/codex',\r\n '/opt/homebrew/bin/codex',\r\n ];\r\n\r\nexport function findCodexBinary(): string | null {\r\n const override = getAppPathOverride('codex');\r\n if (override) return selectCodexBinary([override], existsSync, canRunCodexBinary);\r\n\r\n const candidates: string[] = [];\r\n try {\r\n const result = execSync(isWindows ? 'where.exe codex' : 'which codex', {\r\n encoding: 'utf8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n });\r\n const lines = result.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n if (isWindows) {\r\n candidates.push(...lines.filter(l => l.toLowerCase().endsWith('.cmd')));\r\n }\r\n candidates.push(...lines);\r\n } catch {\r\n // try fallbacks\r\n }\r\n candidates.push(...CODEX_FALLBACK_PATHS);\r\n return selectCodexBinary(candidates, existsSync, canRunCodexBinary);\r\n}\r\n\r\nexport function selectCodexBinary(\r\n candidates: string[],\r\n exists: (path: string) => boolean,\r\n canRun: (path: string) => boolean,\r\n): string | null {\r\n const seen = new Set<string>();\r\n for (const path of candidates) {\r\n if (!path || seen.has(path)) continue;\r\n seen.add(path);\r\n if (exists(path) && canRun(path)) return path;\r\n }\r\n return null;\r\n}\r\n\r\nfunction canRunCodexBinary(path: string): boolean {\r\n try {\r\n execFileSync(path, ['--version'], {\r\n encoding: 'utf8',\r\n stdio: ['ignore', 'pipe', 'pipe'],\r\n timeout: 5000,\r\n shell: isWindows,\r\n });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function codexArgsIncludeSandboxFlag(args: string[]): boolean {\r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i]!;\r\n if (\r\n arg === '-s'\r\n || arg === '--sandbox'\r\n || arg === '--dangerously-bypass-approvals-and-sandbox'\r\n ) {\r\n return true;\r\n }\r\n if (arg.startsWith('--sandbox=')) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Default anygate launches to full access unless the user passed their own sandbox flag. */\r\nexport function ensureCodexSandboxArgs(extraArgs: string[]): string[] {\r\n if (codexArgsIncludeSandboxFlag(extraArgs)) return extraArgs;\r\n return ['-s', CODEX_LAUNCH_SANDBOX, ...extraArgs];\r\n}\r\n\r\nexport function buildCodexChildEnv(route: CodexRoute, proxyPort?: number): NodeJS.ProcessEnv {\r\n const env = stripCodexInheritedEnv(process.env);\r\n\r\n if (route.tier === 'proxy' && proxyPort) {\r\n env['ANYGATE_CODEX_KEY'] = PROXY_PLACEHOLDER_KEY;\r\n } else {\r\n const envKey = codexProviderEnvKey(route.providerId);\r\n env[envKey] = route.apiKey;\r\n }\r\n\r\n return env;\r\n}\r\n\r\nexport function launchCodex(\r\n modelId: string,\r\n env: NodeJS.ProcessEnv,\r\n extraArgs: string[],\r\n): Promise<number> {\r\n return new Promise((resolve) => {\r\n const codexPath = findCodexBinary()!;\r\n const args = ['--profile', profileName(), '-m', modelId, ...ensureCodexSandboxArgs(extraArgs)];\r\n const child = spawn(codexPath, args, {\r\n stdio: 'inherit',\r\n env,\r\n shell: isWindows,\r\n });\r\n\r\n const forward = (signal: NodeJS.Signals): void => {\r\n child.kill(signal);\r\n };\r\n process.once('SIGINT', () => forward('SIGINT'));\r\n process.once('SIGTERM', () => forward('SIGTERM'));\r\n\r\n child.on('exit', code => resolve(code ?? 0));\r\n });\r\n}\r\n","// Codex-only picker UX — no Claude Code strings.\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport type { LocalProvider, LocalProviderModel, UserPreferences } from '../../../src/core/types.js';\r\nimport type { CodexRoute } from './routing.js';\r\nimport {\r\n confirmLaunchMessage,\r\n modelSelectOption,\r\n navOption,\r\n providerSelectOption,\r\n} from '../../agents/shared/ui.js';\r\nimport { browseAllModels } from '../../agents/shared/prompts.js';\r\n\r\nexport async function pickCodexProvider(\r\n providers: LocalProvider[],\r\n prefs: UserPreferences,\r\n hasFavorites = false,\r\n initialProviderId?: string,\r\n): Promise<LocalProvider | '__favorites__' | null> {\r\n if (providers.length === 0 && !hasFavorites) return null;\r\n\r\n const options: { value: string; label: string; hint?: string }[] = providers.map(lp => providerSelectOption(lp));\r\n \r\n if (hasFavorites) {\r\n options.unshift({\r\n value: '__favorites__',\r\n label: '⭐ Favorites Catalog',\r\n hint: `${prefs.favoriteModels?.length ?? 0} saved favorites`,\r\n });\r\n }\r\n\r\n const initial =\r\n initialProviderId && options.some(o => o.value === initialProviderId)\r\n ? initialProviderId\r\n : prefs.lastCodexProvider && options.some(o => o.value === prefs.lastCodexProvider)\r\n ? prefs.lastCodexProvider\r\n : options[0]!.value;\r\n\r\n const chosen = await p.select<string>({\r\n message: 'Which provider for Codex?',\r\n options,\r\n initialValue: initial,\r\n });\r\n if (p.isCancel(chosen)) {\r\n p.cancel('Cancelled.');\r\n return null;\r\n }\r\n\r\n if (chosen === '__favorites__') return '__favorites__';\r\n\r\n return providers.find(lp => lp.id === chosen) ?? null;\r\n}\r\n\r\nexport async function pickCodexModel(\r\n provider: LocalProvider,\r\n prefs: UserPreferences,\r\n): Promise<LocalProviderModel | 'back' | null> {\r\n const recentIds = (prefs.recentModelsByProvider?.[provider.id] ?? []).slice(0, 3);\r\n const recentModels = recentIds\r\n .map(id => provider.models.find(m => m.id === id))\r\n .filter((m): m is LocalProviderModel => m !== undefined);\r\n\r\n let selectedModel: LocalProviderModel | null = null;\r\n\r\n while (true) {\r\n if (recentModels.length > 0) {\r\n const options = [\r\n ...recentModels.map(m => modelSelectOption(m, 'recent')),\r\n navOption('__browse_all__', 'Browse all models →', `${provider.models.length} available`),\r\n navOption('__back__', '← Go back', 'Select a different provider'),\r\n ];\r\n\r\n const picked = await p.select({\r\n message: `Model for ${provider.name}?`,\r\n options,\r\n initialValue: recentModels[0].id,\r\n });\r\n\r\n if (p.isCancel(picked) || String(picked) === '__back__') {\r\n return 'back';\r\n }\r\n\r\n if (String(picked) === '__browse_all__') {\r\n const browsed = await browseAllModels(provider, prefs);\r\n if (browsed === 'back') {\r\n continue;\r\n }\r\n if (!browsed) return null;\r\n selectedModel = browsed;\r\n break;\r\n } else {\r\n selectedModel = recentModels.find(m => m.id === String(picked))!;\r\n break;\r\n }\r\n } else {\r\n const browsed = await browseAllModels(provider, prefs);\r\n if (browsed === 'back') {\r\n return 'back';\r\n }\r\n if (!browsed) return null;\r\n selectedModel = browsed;\r\n break;\r\n }\r\n }\r\n\r\n return selectedModel;\r\n}\r\n\r\nexport function confirmCodexLaunch(\r\n providerName: string,\r\n modelLabel: string,\r\n modelId: string,\r\n route: CodexRoute,\r\n): Promise<boolean> {\r\n const via = route.tier === 'direct'\r\n ? pc.green('direct')\r\n : `${pc.dim('via')} ${pc.yellow('anygate proxy')}`;\r\n return p.confirm({\r\n message: `${confirmLaunchMessage('Codex', modelLabel, modelId, providerName)} ${pc.dim('(')}${via}${pc.dim(')')}`,\r\n initialValue: true,\r\n }).then(answer => {\r\n if (p.isCancel(answer)) {\r\n p.cancel('Cancelled.');\r\n return false;\r\n }\r\n return answer;\r\n });\r\n}\r\n\r\nexport function rejectManagedFlags(codexArgs: string[]): string[] {\r\n const blocked = new Set(['--profile', '-m', '--model', '--provider', '--trace', '-p']);\r\n const takesValue = new Set(['--profile', '-m', '--model', '--provider', '-p']);\r\n const out: string[] = [];\r\n for (let i = 0; i < codexArgs.length; i++) {\r\n const arg = codexArgs[i]!;\r\n if (blocked.has(arg)) {\r\n if (takesValue.has(arg)) i++;\r\n continue;\r\n }\r\n if (\r\n arg.startsWith('--profile=')\r\n || arg.startsWith('--model=')\r\n || arg.startsWith('--provider=')\r\n || arg.startsWith('-m=')\r\n ) continue;\r\n out.push(arg);\r\n }\r\n return out;\r\n}\r\n","// Codex-specific terminal panels (shared primitives in ../../agents/shared/ui.ts).\r\nimport pc from 'picocolors';\r\nimport {\r\n fmtCommand,\r\n fmtModel,\r\n fmtProvider,\r\n logActiveModel,\r\n logProxy,\r\n printPanel,\r\n gateIntro,\r\n gateOutro,\r\n} from '../../agents/shared/ui.js';\r\n\r\nexport {\r\n fmtModel as formatCodexModelRef,\r\n fmtProvider as formatCodexProviderRef,\r\n logActiveModel as logCodexActiveModel,\r\n logProxy as logCodexProxy,\r\n printPanel,\r\n} from '../../agents/shared/ui.js';\r\n\r\nexport function codexAppIntro(): void {\r\n gateIntro('Codex App');\r\n}\r\n\r\nexport function codexCliIntro(): void {\r\n gateIntro('Codex');\r\n}\r\n\r\nexport function printCodexAppSessionPanel(opts: {\r\n modelLabel: string;\r\n modelId: string;\r\n providerName: string;\r\n restoreCommand: string;\r\n}): void {\r\n printPanel(pc.cyan('Foreground session'), [\r\n `${pc.bold('Model')} ${fmtModel(opts.modelLabel, opts.modelId)}`,\r\n `${pc.bold('Provider')} ${fmtProvider(opts.providerName)}`,\r\n '',\r\n `${pc.yellow(pc.bold('Keep this terminal open'))}${pc.white(' while you use Codex.')}`,\r\n `${pc.white('Press ')}${pc.bold(pc.red('Ctrl+C'))}${pc.white(' to stop the proxy and restore ')}${fmtCommand('~/.codex/config.toml')}${pc.white('.')}`,\r\n `${pc.dim('Codex may show ')}${pc.yellow('\"Custom\"')}${pc.dim(' if the desktop picker cannot resolve registry models — check the terminal line above. After restart, pick your model from the picker if it appears.')}`,\r\n `${pc.dim('If Codex asks you to sign in after restart: choose API key and enter any character — that unlocks the model picker for registry providers.')}`,\r\n `${pc.dim('Stuck? Run ')}${fmtCommand(opts.restoreCommand)}${pc.dim('.')}`,\r\n ]);\r\n}\r\n\r\nexport function printCodexCliCleanupPanel(restoreCommand: string): void {\r\n printPanel(pc.cyan('While Codex runs'), [\r\n `${pc.white('Temporary profile: ')}${fmtCommand('~/.codex/anygate-launch.config.toml')}`,\r\n `${pc.white('Removed automatically when Codex exits.')}`,\r\n `${pc.dim('After a crash: ')}${fmtCommand(restoreCommand)}${pc.dim('.')}`,\r\n ]);\r\n}\r\n\r\nexport function codexAppOutro(modelLabel: string): void {\r\n gateOutro('Codex App', fmtModel(modelLabel));\r\n}\r\n\r\nexport function codexCliOutro(providerName: string, modelLabel: string, modelId: string): void {\r\n gateOutro(\r\n 'Launching Codex',\r\n `${fmtProvider(providerName)} ${pc.dim('/')} ${fmtModel(modelLabel, modelId)}`,\r\n );\r\n}\r\n","import type { ResolvedFavorite } from '../../agents/shared/favorites-resolver.js';\r\nimport type { LocalProviderModel } from '../../../src/core/types.js';\r\nimport { getReasoningCapabilities } from '../../../src/gateway/provider-factory.js';\r\nimport {\r\n catalogEntryFromModel,\r\n type CodexCatalogFile,\r\n type CodexCatalogModel,\r\n} from './catalog.js';\r\n\r\n/** CLI favorites catalog slug — must match profile `model` and `codex -m`. */\r\nexport function codexCliFavoritesSlug(providerId: string, modelId: string): string {\r\n return `${providerId}__${modelId}`;\r\n}\r\n\r\nexport function buildFavoritesCodexCatalog(\r\n starting: ResolvedFavorite | undefined,\r\n resolved: ResolvedFavorite[],\r\n): CodexCatalogFile {\r\n const models: CodexCatalogModel[] = [];\r\n let priority = 0;\r\n\r\n if (starting) {\r\n models.push(buildEntry(starting, priority++));\r\n }\r\n\r\n for (const r of resolved) {\r\n models.push(buildEntry(r, priority++));\r\n }\r\n\r\n return { models };\r\n}\r\n\r\nfunction enrichFavoriteModel(r: ResolvedFavorite): LocalProviderModel {\r\n const model = r.model as LocalProviderModel;\r\n return {\r\n ...model,\r\n npm: model.npm ?? (model.modelFormat === 'anthropic' ? '@ai-sdk/anthropic' : '@ai-sdk/openai-compatible'),\r\n upstreamModelId: model.upstreamModelId || model.id,\r\n };\r\n}\r\n\r\nfunction buildEntry(r: ResolvedFavorite, priority: number): CodexCatalogModel {\r\n const model = enrichFavoriteModel(r);\r\n const slug = codexCliFavoritesSlug(r.providerId, model.id);\r\n return catalogEntryFromModel(model, r.providerName, priority, false, slug);\r\n}\r\n\r\nexport function defaultReasoningEffortForFavorite(r: ResolvedFavorite): string {\r\n const model = enrichFavoriteModel(r);\r\n const caps = getReasoningCapabilities(model.npm ?? '', model.upstreamModelId ?? model.id, {\r\n providerId: r.providerId,\r\n apiBaseUrl: model.apiBaseUrl,\r\n supportedParameters: model.supportedParameters,\r\n reasoning: model.reasoning,\r\n interleavedReasoningField: model.interleavedReasoningField,\r\n });\r\n return caps.levels.length > 0 ? caps.defaultLevel : 'none';\r\n}\r\n\r\nexport function buildFavoritesAppCatalog(\r\n resolved: ResolvedFavorite[],\r\n): CodexCatalogFile {\r\n const models: CodexCatalogModel[] = [];\r\n let priority = 0;\r\n for (const r of resolved) {\r\n const model = enrichFavoriteModel(r);\r\n const slug = codexCliFavoritesSlug(r.providerId, model.id);\r\n models.push(catalogEntryFromModel(model, r.providerName, priority++, true, slug));\r\n }\r\n return { models };\r\n}\r\n","import * as p from '@clack/prompts';\r\nimport type { CodexProxyRoute } from './proxy.js';\r\nimport { buildFavoritesList, resolveFavorite } from '../../agents/shared/favorites-resolver.js';\r\nimport type { ResolveContext, ResolvedFavorite } from '../../agents/shared/favorites-resolver.js';\r\nimport { shouldHideModel, type CompatibilityAgent } from '../../agents/shared/model-compatibility.js';\r\nimport { resolveCodexRoute } from './routing.js';\r\nimport type { LocalProvider, LocalProviderModel, FavoriteModel } from '../../../src/core/types.js';\r\nimport { codexCliFavoritesSlug } from './favorites-catalog.js';\r\n\r\nexport type FavoriteStartingModelResult =\r\n | { provider: LocalProvider; model: LocalProviderModel }\r\n | 'cancelled'\r\n | 'unavailable';\r\n\r\nexport type BootSelectionResult =\r\n | { provider: LocalProvider; model: LocalProviderModel }\r\n | { error: string };\r\n\r\ntype ProviderWrapper = (provider: LocalProvider) => LocalProvider;\r\n\r\nconst identityProvider: ProviderWrapper = provider => provider;\r\n\r\nexport async function pickFavoriteStartingModel(\r\n compatible: LocalProvider[],\r\n favorites: FavoriteModel[],\r\n agent: CompatibilityAgent,\r\n productLabel: string,\r\n wrapProvider: ProviderWrapper = identityProvider,\r\n): Promise<FavoriteStartingModelResult> {\r\n const favoriteProviders = compatible.map(wrapProvider);\r\n const available: Array<{ provider: LocalProvider; model: LocalProviderModel }> = [];\r\n\r\n for (const fav of favorites) {\r\n if (shouldHideModel({ providerId: fav.providerId, modelId: fav.modelId, agent })) {\r\n continue;\r\n }\r\n const provider = favoriteProviders.find(lp => lp.id === fav.providerId);\r\n const model = provider?.models.find(m => m.id === fav.modelId);\r\n if (provider && model) available.push({ provider, model });\r\n }\r\n\r\n if (available.length === 0) {\r\n p.log.warn(`No saved ${productLabel} favorites are currently available.`);\r\n return 'unavailable';\r\n }\r\n\r\n const favOptions = available.map((f, i) => ({\r\n value: String(i),\r\n label: `${f.model.name || f.model.id} — ${f.provider.name}`,\r\n hint: f.model.id,\r\n }));\r\n const pickedIdx = await p.select<string>({\r\n message: 'Starting model?',\r\n options: favOptions,\r\n initialValue: '0',\r\n });\r\n if (p.isCancel(pickedIdx)) {\r\n p.cancel('Cancelled.');\r\n return 'cancelled';\r\n }\r\n\r\n return available[Number(pickedIdx)] ?? 'unavailable';\r\n}\r\n\r\nexport function resolveBootSelection(\r\n compatible: LocalProvider[],\r\n launchProvider: string,\r\n launchModel: string,\r\n wrapProvider: ProviderWrapper = identityProvider,\r\n): BootSelectionResult {\r\n const foundProvider = compatible.find(provider => provider.id === launchProvider);\r\n if (!foundProvider) {\r\n return { error: `Provider not found: ${launchProvider}` };\r\n }\r\n\r\n const provider = wrapProvider(foundProvider);\r\n const model = provider.models.find(m => m.id === launchModel);\r\n if (!model) {\r\n return { error: `Model ${launchModel} not found on provider ${foundProvider.name}` };\r\n }\r\n\r\n return { provider, model };\r\n}\r\n\r\nexport function buildCodexProxyRoutesFromResolved(\r\n resolved: ResolvedFavorite[],\r\n providersById: Map<string, LocalProvider>,\r\n): CodexProxyRoute[] {\r\n const skippedOAuth: string[] = [];\r\n const routes = resolved\r\n .map(r => {\r\n const provider = providersById.get(r.providerId);\r\n if (!provider) return undefined;\r\n const model = r.model as LocalProviderModel;\r\n\r\n // Skip if OAuth provider has empty apiKey (OAuth refresh flows not supported in favorites proxy)\r\n if (!r.apiKey && provider.authType === 'oauth') {\r\n skippedOAuth.push(`${r.providerId}/${model.id}`);\r\n return undefined;\r\n }\r\n\r\n const route = resolveCodexRoute(provider, model, r.apiKey);\r\n return {\r\n modelId: codexCliFavoritesSlug(r.providerId, model.id),\r\n npm: route.npm,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n upstreamModelId: route.upstreamModelId,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n contextWindow: route.contextWindow,\r\n headers: route.headers,\r\n } as CodexProxyRoute;\r\n })\r\n .filter((r): r is CodexProxyRoute => r !== undefined);\r\n\r\n if (skippedOAuth.length > 0) {\r\n p.log.warn(\r\n `Skipped ${skippedOAuth.length} OAuth favorite(s) (OAuth auth not supported in favorites catalog): ${skippedOAuth.join(', ')}`,\r\n );\r\n }\r\n\r\n return routes;\r\n}\r\n\r\n\r\nexport async function resolveCodexFavorites(\r\n activeProvider: LocalProvider,\r\n selectedModel: LocalProviderModel,\r\n compatible: LocalProvider[],\r\n favorites: FavoriteModel[],\r\n agent: CompatibilityAgent,\r\n): Promise<{\r\n resolvedFavorites: ResolvedFavorite[];\r\n providersById: Map<string, LocalProvider>;\r\n}> {\r\n const ctx: ResolveContext = {\r\n agent,\r\n localProviders: compatible,\r\n findLocalModel: (pid, mid) => {\r\n const provider = compatible.find(lp => lp.id === pid);\r\n const model = provider?.models.find(m => m.id === mid);\r\n return provider && model ? { provider, model } : undefined;\r\n },\r\n };\r\n const startingResolved = await resolveFavorite(\r\n { providerId: activeProvider.id, modelId: selectedModel.id },\r\n ctx,\r\n );\r\n const { resolved, droppedFavorites } = await buildFavoritesList(\r\n startingResolved,\r\n favorites,\r\n ctx,\r\n );\r\n if (droppedFavorites.length > 0) {\r\n p.log.warn(\r\n `Skipped ${droppedFavorites.length} stale/unauthorized favorite(s): ${droppedFavorites.map(f => `${f.providerId}:${f.modelId}`).join(', ')}`,\r\n );\r\n }\r\n return {\r\n resolvedFavorites: resolved,\r\n providersById: new Map(compatible.map(lp => [lp.id, lp])),\r\n };\r\n}\r\n","// src/favorites-resolver.ts\r\nimport type { FavoriteModel, LocalProvider, LocalProviderModel, ModelInfo } from '../../../src/core/types.js';\r\nimport type { ServerModelInfo } from '../../../src/gateway/models.js';\r\nimport { shouldHideModel, type CompatibilityAgent } from '../shared/model-compatibility.js';\r\nimport { resolveLocalProviderApiKey } from '../../../src/core/credentials.js';\r\n\r\nexport interface ResolvedFavorite {\r\n providerId: string;\r\n providerName: string;\r\n model: LocalProviderModel | ServerModelInfo;\r\n apiKey: string;\r\n authType?: 'api' | 'oauth' | 'none';\r\n oauthAccountId?: string;\r\n providerData?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Per-surface resolution context. Each surface (Claude, Codex, Server) builds\r\n * its own context and passes it to resolveFavorite / buildFavoritesList.\r\n * The resolver is route-shape-agnostic — each caller builds its own route type.\r\n */\r\nexport interface ResolveContext {\r\n /** When set, call shouldHideModel with this agent to filter blacklisted favorites. */\r\n agent?: CompatibilityAgent;\r\n /** Claude: registry providers from opencode. */\r\n localProviders?: LocalProvider[];\r\n /** Server: pre-loaded server model list. */\r\n serverModels?: ServerModelInfo[];\r\n /** Lookup function for a registry model. Returns the model + its parent provider. */\r\n findLocalModel?: LocalModelLookup;\r\n}\r\n\r\nexport interface LocalModelLookupResult {\r\n provider: LocalProvider;\r\n model: LocalProviderModel;\r\n}\r\n\r\nexport type LocalModelLookup =\r\n (providerId: string, modelId: string) => LocalModelLookupResult | undefined;\r\n\r\nconst ZEN_GO_PROVIDER_NAME: Record<'zen' | 'go', string> = {\r\n zen: 'OpenCode Zen',\r\n go: 'OpenCode Go',\r\n};\r\n\r\nexport async function resolveFavorite(\r\n fav: FavoriteModel,\r\n ctx: ResolveContext,\r\n): Promise<ResolvedFavorite | undefined> {\r\n if (ctx.findLocalModel) {\r\n const found = ctx.findLocalModel(fav.providerId, fav.modelId);\r\n if (!found) return undefined;\r\n if (ctx.agent && shouldHideModel({ providerId: fav.providerId, modelId: fav.modelId, agent: ctx.agent })) {\r\n return undefined;\r\n }\r\n return {\r\n providerId: fav.providerId,\r\n providerName: found.provider.name,\r\n model: found.model,\r\n apiKey: (await resolveLocalProviderApiKey(found.provider)) ?? '',\r\n authType: found.provider.authType,\r\n oauthAccountId: found.provider.oauthAccountId,\r\n providerData: found.provider.providerData,\r\n };\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport interface BuildFavoritesListOptions {\r\n dropEmptyApiKey?: boolean;\r\n trackCapacitySkipped?: boolean;\r\n}\r\n\r\nexport async function buildFavoritesList(\r\n starting: ResolvedFavorite | undefined,\r\n favorites: FavoriteModel[],\r\n ctx: ResolveContext,\r\n max = 20,\r\n options: BuildFavoritesListOptions = {},\r\n): Promise<{\r\n resolved: ResolvedFavorite[];\r\n droppedFavorites: FavoriteModel[];\r\n capacitySkippedFavorites: FavoriteModel[];\r\n}> {\r\n const seen = new Set<string>();\r\n const out: ResolvedFavorite[] = [];\r\n\r\n if (starting) {\r\n seen.add(`${starting.providerId}::${starting.model.id}`);\r\n out.push(starting);\r\n }\r\n\r\n const uniqueFavorites = favorites.filter(fav => {\r\n const key = `${fav.providerId}::${fav.modelId}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n\r\n const resolutions = await Promise.all(uniqueFavorites.map(fav => resolveFavorite(fav, ctx)));\r\n\r\n const droppedFavorites: FavoriteModel[] = [];\r\n const capacitySkippedFavorites: FavoriteModel[] = [];\r\n for (let i = 0; i < uniqueFavorites.length; i++) {\r\n const resolved = resolutions[i];\r\n if (!resolved || (options.dropEmptyApiKey && !resolved.apiKey.trim())) {\r\n droppedFavorites.push(uniqueFavorites[i]!);\r\n continue;\r\n }\r\n if (out.length < max) {\r\n out.push(resolved);\r\n } else if (options.trackCapacitySkipped) {\r\n capacitySkippedFavorites.push(uniqueFavorites[i]!);\r\n }\r\n }\r\n\r\n return { resolved: out, droppedFavorites, capacitySkippedFavorites };\r\n}\r\n\r\nexport function resolveFirstAvailableFavorite(\r\n favorites: FavoriteModel[],\r\n providers: LocalProvider[],\r\n): LocalModelLookupResult | undefined {\r\n for (const fav of favorites) {\r\n const provider = providers.find(lp => lp.id === fav.providerId);\r\n const model = provider?.models.find(m => m.id === fav.modelId);\r\n if (provider && model) return { provider, model };\r\n }\r\n return undefined;\r\n}\r\n","import { startProxyCatalog, aliasModelId, type ProxyHandle, type ProxyRoute } from '../../../src/gateway/anthropic-proxy.js';\r\nimport { claudeCodeClientModelId } from '../../agents/shared/context-model-id.js';\r\nimport { ANTIGRAVITY_BASE_URLS } from '../../../src/oauth/antigravity-oauth.js';\r\nimport { resolveProviderCredential } from '../../../src/core/env.js';\r\nimport { oauthAuthRef } from '../../../src/registry/import-build.js';\r\nimport type { LocalProviderModel } from '../../../src/core/types.js';\r\n\r\nexport interface CloudCodeBackend {\r\n port: number;\r\n token: string;\r\n handle: ProxyHandle;\r\n}\r\n\r\nexport function needsCloudCodeBackend(\r\n model: LocalProviderModel,\r\n authType?: 'api' | 'oauth' | 'none',\r\n): boolean {\r\n return model.modelFormat === 'cloud-code'\r\n || (model.modelFormat === 'anthropic' && authType === 'oauth');\r\n}\r\n\r\nexport interface BackendPartitionInput {\r\n providerId: string;\r\n model: LocalProviderModel;\r\n apiKey: string;\r\n providerData?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Build a ProxyRoute for a cloud-code model from the antigravity provider.\r\n * aliasId is constructed to be stable and consistent with what startProxy uses,\r\n * so callers can use route.aliasId as the modelId in downstream Codex/server routes.\r\n */\r\nexport function buildCloudCodeProxyRoute(\r\n model: LocalProviderModel,\r\n apiKey: string,\r\n providerData: Record<string, unknown>,\r\n): ProxyRoute {\r\n const aliasId = claudeCodeClientModelId(\r\n aliasModelId(model.id, 'antigravity'),\r\n model.contextWindow,\r\n );\r\n return {\r\n aliasId,\r\n realModelId: model.upstreamModelId || model.id,\r\n displayName: model.name || model.id,\r\n upstreamUrl: ANTIGRAVITY_BASE_URLS[0]!,\r\n apiKey,\r\n modelFormat: 'cloud-code',\r\n contextWindow: model.contextWindow,\r\n providerId: 'antigravity',\r\n authType: 'oauth',\r\n providerData,\r\n refreshToken: () => resolveProviderCredential('antigravity', oauthAuthRef('antigravity')),\r\n };\r\n}\r\n\r\n/**\r\n * Build a ProxyRoute for an OAuth anthropic model (e.g. claude-code provider).\r\n * The proxy handles Bearer auth + identity injection — downstream codex/gemini\r\n * proxies treat this as a regular local anthropic endpoint.\r\n */\r\nexport function buildOAuthAnthropicProxyRoute(\r\n model: LocalProviderModel,\r\n apiKey: string,\r\n providerId: string,\r\n providerData: Record<string, unknown>,\r\n): ProxyRoute {\r\n const aliasId = claudeCodeClientModelId(\r\n aliasModelId(model.id, providerId),\r\n model.contextWindow,\r\n );\r\n return {\r\n aliasId,\r\n realModelId: model.upstreamModelId || model.id,\r\n displayName: model.name || model.id,\r\n upstreamUrl: model.baseUrl ?? 'https://api.anthropic.com',\r\n apiKey,\r\n modelFormat: 'anthropic',\r\n contextWindow: model.contextWindow,\r\n providerId,\r\n authType: 'oauth',\r\n providerData,\r\n refreshToken: () => resolveProviderCredential(providerId, oauthAuthRef(providerId)),\r\n };\r\n}\r\n\r\nexport async function partitionAndStartCloudCodeBackend<\r\n TInput extends BackendPartitionInput,\r\n TOutput,\r\n>(\r\n items: TInput[],\r\n toOutput: (proxyRoute: ProxyRoute, backend: CloudCodeBackend, original: TInput) => TOutput,\r\n trace?: boolean,\r\n): Promise<{ backendItems: TOutput[]; backend: CloudCodeBackend | null }> {\r\n if (items.length === 0) return { backendItems: [], backend: null };\r\n\r\n const proxyRoutes = items.map(item =>\r\n item.model.modelFormat === 'cloud-code'\r\n ? buildCloudCodeProxyRoute(item.model, item.apiKey, item.providerData ?? {})\r\n : buildOAuthAnthropicProxyRoute(item.model, item.apiKey, item.providerId, item.providerData ?? {}),\r\n );\r\n const backend = await startCloudCodeCatalogBackend(proxyRoutes, proxyRoutes[0]!.aliasId, trace);\r\n\r\n return {\r\n backend,\r\n backendItems: proxyRoutes.map((proxyRoute, index) => toOutput(proxyRoute, backend, items[index]!)),\r\n };\r\n}\r\n\r\nexport async function buildSingleModelCloudCodeRoute(\r\n model: LocalProviderModel,\r\n apiKey: string,\r\n providerId: string,\r\n providerData: Record<string, unknown>,\r\n trace?: boolean,\r\n): Promise<{ proxyRoute: ProxyRoute; backend: CloudCodeBackend }> {\r\n const proxyRoute = model.modelFormat === 'cloud-code'\r\n ? buildCloudCodeProxyRoute(model, apiKey, providerData)\r\n : buildOAuthAnthropicProxyRoute(model, apiKey, providerId, providerData);\r\n const backend = await startCloudCodeCatalogBackend([proxyRoute], proxyRoute.aliasId, trace);\r\n return { proxyRoute, backend };\r\n}\r\n\r\n/** Start a multi-model cloud-code backend proxy (one instance for all routes). */\r\nexport async function startCloudCodeCatalogBackend(\r\n routes: ProxyRoute[],\r\n startingAliasId: string,\r\n trace?: boolean,\r\n): Promise<CloudCodeBackend> {\r\n const handle = await startProxyCatalog(routes, startingAliasId, trace ?? false);\r\n return { port: handle.port, token: handle.token, handle };\r\n}\r\n","/** When true, anygate must not write UI to stdout (child owns NDJSON/JSONL). */\r\n\r\nlet agentStdoutMode = false;\r\n\r\nexport function setAgentStdoutMode(enabled: boolean): void {\r\n agentStdoutMode = enabled;\r\n}\r\n\r\nexport function isAgentStdoutMode(): boolean {\r\n return agentStdoutMode;\r\n}\r\n","import type { LocalProvider, LocalProviderModel, UserPreferences } from '../../../src/core/types.js';\r\n\r\nexport interface LaunchTarget {\r\n providerId?: string;\r\n modelId?: string;\r\n}\r\n\r\nexport interface LaunchWizardPlan {\r\n skip: boolean;\r\n target: LaunchTarget | null;\r\n error?: string;\r\n}\r\n\r\nexport function parseModelSlug(modelRef: string): { providerId?: string; modelId: string } {\r\n const idx = modelRef.indexOf('__');\r\n if (idx > 0) {\r\n return { providerId: modelRef.slice(0, idx), modelId: modelRef.slice(idx + 2) };\r\n }\r\n return { modelId: modelRef };\r\n}\r\n\r\nexport function isClaudePrintMode(args: string[]): boolean {\r\n for (const arg of args) {\r\n if (arg === '--print' || arg === '-p') return true;\r\n if (arg.startsWith('--print=')) return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction readFlagValue(args: string[], flag: string): string | undefined {\r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i]!;\r\n if (arg === flag) return args[i + 1];\r\n if (arg.startsWith(`${flag}=`)) return arg.slice(flag.length + 1);\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction hasFlag(args: string[], flag: string): boolean {\r\n return args.some(arg => arg === flag || arg.startsWith(`${flag}=`));\r\n}\r\n\r\n/** Claude -p with JSON or NDJSON on stdout — anygate must stay off stdout. */\r\nexport function isClaudeMachineReadableOutput(args: string[]): boolean {\r\n if (!isClaudePrintMode(args)) return false;\r\n const outFmt = readFlagValue(args, '--output-format');\r\n if (outFmt === 'stream-json' || outFmt === 'json') return true;\r\n const inFmt = readFlagValue(args, '--input-format');\r\n return inFmt === 'stream-json';\r\n}\r\n\r\n/** Codex exec --json — JSONL events on stdout. */\r\nexport function isCodexMachineReadableOutput(args: string[]): boolean {\r\n return args.includes('--json');\r\n}\r\n\r\nexport function isGeminiNonInteractive(args: string[]): boolean {\r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i]!;\r\n if (arg === '--') return false;\r\n if (arg === '-p' || arg === '--prompt' || arg === '-i' || arg === '--prompt-interactive') return true;\r\n if (arg.startsWith('-')) {\r\n i = skipAttachedFlagValue(args, i);\r\n continue;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function wantsCleanAgentStdout(agent: 'claude' | 'codex' | 'gemini' | 'antigravity', childArgs: string[]): boolean {\r\n if (agent === 'claude') return isClaudeMachineReadableOutput(childArgs);\r\n if (agent === 'codex') return isCodexMachineReadableOutput(childArgs);\r\n if (agent === 'antigravity') return false; // agy print mode writes to stdout but we don't intercept it\r\n const outFmt = readFlagValue(childArgs, '-o') || readFlagValue(childArgs, '--output-format');\r\n return outFmt === 'json' || outFmt === 'stream-json';\r\n}\r\n\r\n/** Claude requires --verbose with stream-json in print mode. */\r\nexport function normalizeClaudeAgentArgs(args: string[]): string[] {\r\n const out = [...args];\r\n const streamOut = readFlagValue(out, '--output-format') === 'stream-json';\r\n const streamIn = readFlagValue(out, '--input-format') === 'stream-json';\r\n if ((streamOut || streamIn) && isClaudePrintMode(out) && !hasFlag(out, '--verbose')) {\r\n out.push('--verbose');\r\n }\r\n return out;\r\n}\r\n\r\nfunction skipAttachedFlagValue(args: string[], index: number): number {\r\n const arg = args[index]!;\r\n if (!arg.startsWith('-') || arg === '--' || arg.includes('=')) return index;\r\n const next = args[index + 1];\r\n if (next && !next.startsWith('-')) return index + 1;\r\n return index;\r\n}\r\n\r\n/** True when Codex gets a subcommand or positional prompt (not flag-only). */\r\nexport function isCodexNonInteractive(args: string[]): boolean {\r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i]!;\r\n if (arg === '--') return false;\r\n if (arg.startsWith('-')) {\r\n i = skipAttachedFlagValue(args, i);\r\n continue;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function resolveLaunchTarget(\r\n explicit: LaunchTarget,\r\n prefs: Pick<UserPreferences, 'lastProvider' | 'lastModel' | 'lastCodexProvider' | 'lastCodexModel' | 'lastGeminiProvider' | 'lastGeminiModel' | 'lastAntigravityProvider' | 'lastAntigravityModel'>,\r\n agent: 'claude' | 'codex' | 'gemini' | 'antigravity',\r\n): LaunchTarget | null {\r\n const slug = explicit.modelId ? parseModelSlug(explicit.modelId) : null;\r\n const providerId = explicit.providerId\r\n ?? slug?.providerId\r\n ?? (agent === 'claude' ? prefs.lastProvider : agent === 'codex' ? prefs.lastCodexProvider : agent === 'antigravity' ? prefs.lastAntigravityProvider : prefs.lastGeminiProvider);\r\n const modelId = slug?.modelId\r\n ?? explicit.modelId\r\n ?? (agent === 'claude' ? prefs.lastModel : agent === 'codex' ? prefs.lastCodexModel : agent === 'antigravity' ? prefs.lastAntigravityModel : prefs.lastGeminiModel);\r\n if (!providerId || !modelId) return null;\r\n return { providerId, modelId };\r\n}\r\n\r\nexport function findProviderAndModel(\r\n providers: LocalProvider[],\r\n target: LaunchTarget,\r\n): { provider: LocalProvider; model: LocalProviderModel } | null {\r\n if (!target.providerId || !target.modelId) return null;\r\n const provider = providers.find(p => p.id === target.providerId);\r\n if (!provider) return null;\r\n const model = provider.models.find(m => m.id === target.modelId);\r\n if (!model) return null;\r\n return { provider, model };\r\n}\r\n\r\nexport function hasCompleteExplicitLaunch(explicit: LaunchTarget): boolean {\r\n if (explicit.providerId && explicit.modelId) return true;\r\n if (explicit.modelId) {\r\n const slug = parseModelSlug(explicit.modelId);\r\n return !!slug.providerId;\r\n }\r\n return false;\r\n}\r\n\r\nexport function planLaunchWizard(opts: {\r\n explicit: LaunchTarget;\r\n childArgs: string[];\r\n agent: 'claude' | 'codex' | 'gemini' | 'antigravity';\r\n prefs: UserPreferences;\r\n}): LaunchWizardPlan {\r\n const { explicit, childArgs, agent, prefs } = opts;\r\n const explicitComplete = hasCompleteExplicitLaunch(explicit);\r\n const nonInteractive = agent === 'claude'\r\n ? isClaudePrintMode(childArgs)\r\n : agent === 'codex'\r\n ? isCodexNonInteractive(childArgs)\r\n : agent === 'antigravity'\r\n ? isAntigravityNonInteractive(childArgs)\r\n : isGeminiNonInteractive(childArgs);\r\n\r\n if (explicitComplete) {\r\n const target = resolveLaunchTarget(explicit, prefs, agent);\r\n if (!target) {\r\n return {\r\n skip: false,\r\n target: null,\r\n error: 'Both --provider and --model are required (or use provider__model slug with --model).',\r\n };\r\n }\r\n return { skip: true, target };\r\n }\r\n\r\n if (explicit.providerId || explicit.modelId) {\r\n return {\r\n skip: false,\r\n target: null,\r\n error: 'Both --provider and --model are required (or use provider__model slug with --model).',\r\n };\r\n }\r\n\r\n if (nonInteractive) {\r\n const target = resolveLaunchTarget(explicit, prefs, agent);\r\n if (!target) {\r\n return {\r\n skip: false,\r\n target: null,\r\n error: nonInteractiveLaunchError(agent),\r\n };\r\n }\r\n return { skip: true, target };\r\n }\r\n\r\n return { skip: false, target: null };\r\n}\r\n\r\nfunction nonInteractiveLaunchError(agent: 'claude' | 'codex' | 'gemini' | 'antigravity'): string {\r\n if (agent === 'claude') return 'Print mode requires --provider and --model, or saved preferences from a prior launch.';\r\n if (agent === 'codex') return 'Non-interactive Codex launch requires --provider and --model, or saved preferences from a prior launch.';\r\n if (agent === 'antigravity') return 'Non-interactive Antigravity launch requires --provider and --model, or saved preferences from a prior launch.';\r\n return 'Non-interactive Gemini launch requires --provider and --model, or saved preferences from a prior launch.';\r\n}\r\n\r\n/** agy -p or --prompt (non-interactive print mode). */\r\nexport function isAntigravityNonInteractive(args: string[]): boolean {\r\n for (const arg of args) {\r\n if (arg === '--') return false;\r\n if (arg === '-p' || arg === '--prompt' || arg === '--print') return true;\r\n }\r\n return false;\r\n}\r\n","// src/gemini.ts — anygate gemini: launch Google Gemini CLI with registry providers\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport { fetchProviderCatalog, providersForPicker } from '../../../src/providers/provider-catalog.js';\r\nimport { resolveLocalProviderApiKey } from '../../../src/core/credentials.js';\r\nimport { loadPreferences, recordLaunchSelection } from '../../../src/core/config.js';\r\nimport { findProviderAndModel, planLaunchWizard, wantsCleanAgentStdout } from '../../agents/shared/launch-target.js';\r\nimport { setAgentStdoutMode, isAgentStdoutMode } from '../../../src/core/agent-io.js';\r\nimport { findGeminiBinary, prepareGeminiChildEnv, launchGemini } from './launch.js';\r\nimport {\r\n pickGeminiProvider,\r\n pickGeminiModel,\r\n pickGeminiFavoriteModel,\r\n confirmGeminiLaunch,\r\n rejectGeminiManagedFlags,\r\n} from './prompts.js';\r\nimport { startGeminiProxy } from './proxy.js';\r\nimport { getGeminiProxyDebugLogPath, printTraceLog } from '../../agents/shared/trace-log.js';\r\nimport type { ProxyRoute, ProxyHandle } from '../../../src/gateway/anthropic-proxy.js';\r\nimport type { CloudCodeBackend } from '../shared/cloud-code-backend.js';\r\nimport { rewriteGeminiBackendRoutes } from './backend-routes.js';\r\nimport { VERSION } from '../../../src/core/constants.js';\r\nimport { providersForTarget } from '../../../src/agents/shared/target-compatibility.js';\r\n\r\nexport function geminiHelpText(): string {\r\n return `${pc.bold('anygate gemini')} v${VERSION}\r\nLaunch Google Gemini CLI with OpenCode Zen / Go or local registry providers.\r\n\r\n${pc.bold('Usage:')}\r\n anygate gemini [options] [gemini-flags]\r\n anygate gemini --help\r\n anygate gemini --version\r\n\r\n${pc.bold('Options:')}\r\n --trace Write proxy debug logs to ~/.anygate/logs/ and show errors on exit\r\n --provider Boot provider id (skip wizard when paired with --model or non-interactive)\r\n --model Boot model id (skip wizard when paired with --provider or non-interactive)\r\n --help Show this command help\r\n --version Show version\r\n\r\n${pc.bold('Description:')}\r\n Picks a provider and model from ~/.anygate/providers.json, starts a local Gemini-to-SDK translation\r\n proxy, and launches the Gemini CLI.\r\n All registry models (Anthropic, OpenAI, custom endpoints, etc.) route through the local translation proxy.\r\n\r\n${pc.bold('Prerequisites:')}\r\n npm install -g @google/gemini-cli\r\n\r\n${pc.bold('Passing flags to Gemini CLI:')}\r\n Add Gemini flags directly — no \"--\" separator needed.\r\n anygate manages -m / --model and -p / --prompt; other flags go to Gemini CLI.\r\n\r\n${pc.bold('Examples:')}\r\n anygate gemini\r\n anygate gemini --trace\r\n anygate gemini --provider zen --model gemini-2.5-flash\r\n anygate gemini -p \"review this file\"`;\r\n}\r\n\r\nexport async function runGeminiCommand(\r\n geminiArgs: string[],\r\n trace = false,\r\n launch: { launchProvider?: string; launchModel?: string } = {},\r\n): Promise<number> {\r\n if (geminiArgs.includes('--help') || geminiArgs.includes('-h')) {\r\n console.log(geminiHelpText());\r\n return 0;\r\n }\r\n\r\n const geminiPath = findGeminiBinary();\r\n if (!geminiPath) {\r\n console.error(pc.red('\\nError: gemini binary not found on PATH.\\n'));\r\n console.error('Install Google Gemini CLI:');\r\n console.error(' npm install -g @google/gemini-cli\\n');\r\n return 1;\r\n }\r\n\r\n const passthroughArgs = rejectGeminiManagedFlags(geminiArgs);\r\n const agentStdout = wantsCleanAgentStdout('gemini', passthroughArgs);\r\n setAgentStdoutMode(agentStdout);\r\n\r\n const prefs = loadPreferences();\r\n const launchPlan = planLaunchWizard({\r\n explicit: { providerId: launch.launchProvider, modelId: launch.launchModel },\r\n childArgs: passthroughArgs,\r\n agent: 'gemini',\r\n prefs,\r\n });\r\n\r\n if (launchPlan.error) {\r\n console.error(pc.red(`\\nError: ${launchPlan.error}\\n`));\r\n return 1;\r\n }\r\n\r\n let catalog;\r\n if (agentStdout) {\r\n try {\r\n catalog = await fetchProviderCatalog({ agent: 'gemini' });\r\n } catch (err) {\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n } else {\r\n const catalogSpinner = p.spinner();\r\n catalogSpinner.start('Loading your providers...');\r\n try {\r\n catalog = await fetchProviderCatalog({ agent: 'gemini' });\r\n } catch (err) {\r\n catalogSpinner.stop('');\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n catalogSpinner.stop('');\r\n }\r\n\r\n const compatible = providersForTarget(providersForPicker(catalog), 'gemini');\r\n if (compatible.length === 0) {\r\n p.log.warn('No Gemini-compatible providers in your registry.');\r\n p.log.info('Add a provider with anygate providers add, or sign in with anygate providers auth openai.');\r\n return 0;\r\n }\r\n\r\n let activeProvider = compatible.find(lp => lp.id === prefs.lastGeminiProvider) ?? compatible[0]!;\r\n let selectedModel = activeProvider.models.find(m => m.id === prefs.lastGeminiModel) ?? activeProvider.models[0];\r\n if (!selectedModel) {\r\n p.log.error(`Provider \"${activeProvider.name}\" has no models available.`);\r\n return 1;\r\n };\r\n\r\n if (launchPlan.skip && launchPlan.target) {\r\n const resolved = findProviderAndModel(compatible, launchPlan.target);\r\n if (!resolved) {\r\n p.log.error(\r\n `Provider/model not found: ${launchPlan.target.providerId} / ${launchPlan.target.modelId}`,\r\n );\r\n return 1;\r\n }\r\n activeProvider = resolved.provider;\r\n selectedModel = resolved.model;\r\n if (!agentStdout) {\r\n p.log.step(`Using ${selectedModel.name || selectedModel.id} (${activeProvider.name})`);\r\n }\r\n } else {\r\n if (!agentStdout) {\r\n console.log('');\r\n p.log.info(`Launching ${pc.bold('Gemini CLI')} with anygate`);\r\n }\r\n\r\n const chosenProvider = await pickGeminiProvider(\r\n compatible,\r\n prefs,\r\n (prefs.favoriteModels ?? []).length > 0,\r\n launch.launchProvider,\r\n );\r\n if (!chosenProvider) return 0;\r\n\r\n if (chosenProvider === '__favorites__') {\r\n const favPick = await pickGeminiFavoriteModel(compatible, prefs.favoriteModels ?? []);\r\n if (!favPick || favPick === 'back') return 0;\r\n activeProvider = favPick.provider;\r\n selectedModel = favPick.model;\r\n } else {\r\n activeProvider = chosenProvider;\r\n const chosenModel = await pickGeminiModel(activeProvider, prefs);\r\n if (!chosenModel || chosenModel === 'back') return 0;\r\n selectedModel = chosenModel;\r\n }\r\n\r\n if (!agentStdout) {\r\n const ok = await confirmGeminiLaunch(\r\n activeProvider.name,\r\n selectedModel.name || selectedModel.id,\r\n selectedModel.id,\r\n );\r\n if (!ok) return 0;\r\n }\r\n }\r\n\r\n // Save selected provider/model preferences\r\n recordLaunchSelection('gemini', activeProvider.id, selectedModel.id, prefs);\r\n\r\n const launchApiKey = await resolveLocalProviderApiKey(activeProvider);\r\n if (!launchApiKey?.trim()) {\r\n p.log.error(\r\n `No API key found for ${activeProvider.name}. Set it with anygate providers add.`,\r\n );\r\n return 1;\r\n }\r\n\r\n // Build route mapping for proxy catalog\r\n const providerRoutes: ProxyRoute[] = activeProvider.models.map(m => ({\r\n aliasId: m.id,\r\n realModelId: m.upstreamModelId || m.id,\r\n displayName: m.name || m.id,\r\n upstreamUrl: m.baseUrl || m.apiBaseUrl || '',\r\n apiKey: launchApiKey,\r\n modelFormat: m.modelFormat,\r\n contextWindow: m.contextWindow,\r\n npm: m.npm,\r\n baseURL: m.apiBaseUrl,\r\n providerId: activeProvider.id,\r\n authType: activeProvider.authType,\r\n oauthAccountId: activeProvider.oauthAccountId,\r\n providerData: activeProvider.providerData,\r\n headers: activeProvider.headers,\r\n supportedParameters: m.supportedParameters,\r\n reasoning: m.reasoning,\r\n interleavedReasoningField: m.interleavedReasoningField,\r\n }));\r\n\r\n // Resolve and append favorites to proxy routes\r\n const resolvedFavs: ProxyRoute[] = [];\r\n const favorites = prefs.favoriteModels ?? [];\r\n for (const fav of favorites) {\r\n const provider = compatible.find(lp => lp.id === fav.providerId);\r\n const model = provider?.models.find(m => m.id === fav.modelId);\r\n if (provider && model) {\r\n const apiKey = await resolveLocalProviderApiKey(provider);\r\n if (apiKey) {\r\n resolvedFavs.push({\r\n aliasId: model.id,\r\n realModelId: model.upstreamModelId || model.id,\r\n displayName: model.name || model.id,\r\n upstreamUrl: model.baseUrl || model.apiBaseUrl || '',\r\n apiKey,\r\n modelFormat: model.modelFormat,\r\n contextWindow: model.contextWindow,\r\n npm: model.npm,\r\n baseURL: model.apiBaseUrl,\r\n providerId: provider.id,\r\n authType: provider.authType,\r\n oauthAccountId: provider.oauthAccountId,\r\n providerData: provider.providerData,\r\n headers: provider.headers,\r\n supportedParameters: model.supportedParameters,\r\n reasoning: model.reasoning,\r\n interleavedReasoningField: model.interleavedReasoningField,\r\n });\r\n }\r\n }\r\n }\r\n\r\n const routesMap = new Map<string, ProxyRoute>();\r\n for (const route of providerRoutes) {\r\n routesMap.set(route.aliasId, route);\r\n }\r\n for (const route of resolvedFavs) {\r\n if (!routesMap.has(route.aliasId)) {\r\n routesMap.set(route.aliasId, route);\r\n }\r\n }\r\n\r\n // Ensure starting model is in routing catalog\r\n const startingRoute = routesMap.get(selectedModel.id);\r\n if (!startingRoute) {\r\n routesMap.set(selectedModel.id, {\r\n aliasId: selectedModel.id,\r\n realModelId: selectedModel.upstreamModelId || selectedModel.id,\r\n displayName: selectedModel.name || selectedModel.id,\r\n upstreamUrl: selectedModel.baseUrl || selectedModel.apiBaseUrl || '',\r\n apiKey: launchApiKey,\r\n modelFormat: selectedModel.modelFormat,\r\n contextWindow: selectedModel.contextWindow,\r\n npm: selectedModel.npm,\r\n baseURL: selectedModel.apiBaseUrl,\r\n providerId: activeProvider.id,\r\n authType: activeProvider.authType,\r\n oauthAccountId: activeProvider.oauthAccountId,\r\n providerData: activeProvider.providerData,\r\n headers: activeProvider.headers,\r\n supportedParameters: selectedModel.supportedParameters,\r\n reasoning: selectedModel.reasoning,\r\n interleavedReasoningField: selectedModel.interleavedReasoningField,\r\n });\r\n }\r\n\r\n let finalRoutes = [...routesMap.values()];\r\n // Backend-routed models get rewritten to a new local alias below — this tracks\r\n // what selectedModel.id becomes so Gemini CLI is launched with the id its\r\n // requests will actually be resolved by, not the pre-rewrite one.\r\n let launchModelId = selectedModel.id;\r\n let oauthBackend: CloudCodeBackend | null = null;\r\n\r\n let proxyHandle: ProxyHandle | null = null;\r\n try {\r\n const backendRoutes = await rewriteGeminiBackendRoutes(finalRoutes, launchModelId, trace);\r\n finalRoutes = backendRoutes.routes;\r\n launchModelId = backendRoutes.launchModelId;\r\n oauthBackend = backendRoutes.backend;\r\n proxyHandle = await startGeminiProxy(finalRoutes, trace);\r\n } catch (err) {\r\n p.log.error(`Failed to start Gemini proxy: ${err instanceof Error ? err.message : String(err)}`);\r\n oauthBackend?.handle.close();\r\n return 1;\r\n }\r\n\r\n const childEnv = prepareGeminiChildEnv(proxyHandle.port, proxyHandle.token);\r\n\r\n if (!agentStdout) {\r\n p.log.info(`Gemini proxy started on port ${proxyHandle.port}`);\r\n p.log.info(`💡 Type ${pc.bold('.model <id>')} in the chat to switch models mid-session.`);\r\n }\r\n\r\n let exitCode = 1;\r\n try {\r\n exitCode = await launchGemini(geminiPath, launchModelId, childEnv.env, passthroughArgs);\r\n } finally {\r\n childEnv.cleanup();\r\n proxyHandle.close();\r\n oauthBackend?.handle.close();\r\n }\r\n\r\n if (!agentStdout) {\r\n p.log.info('Gemini proxy stopped.');\r\n }\r\n\r\n if (trace) {\r\n printTraceLog(getGeminiProxyDebugLogPath());\r\n }\r\n\r\n return exitCode;\r\n}\r\n","// src/gemini/launch.ts\r\nimport { spawn } from 'node:child_process';\r\nimport { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';\r\nimport { homedir, tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { getAppPathOverride } from '../../../src/core/config.js';\r\nimport { findBinaryOnPath } from '../shared/binary-lookup.js';\r\n\r\nconst isWindows = process.platform === 'win32';\r\nconst GEMINI_API_KEY_AUTH_TYPE = 'gemini-api-key';\r\n\r\nconst GEMINI_FALLBACK_PATHS = isWindows\r\n ? [\r\n join(process.env['APPDATA'] ?? homedir(), 'npm', 'gemini.cmd'),\r\n join(process.env['APPDATA'] ?? homedir(), 'npm', 'gemini'),\r\n ]\r\n : [\r\n join(homedir(), '.local', 'bin', 'gemini'),\r\n join(homedir(), '.npm', 'bin', 'gemini'),\r\n '/usr/local/bin/gemini',\r\n '/opt/homebrew/bin/gemini',\r\n ];\r\n\r\nexport function findGeminiBinary(): string | null {\r\n const override = getAppPathOverride('gemini');\r\n if (override) return existsSync(override) ? override : null;\r\n\r\n return findBinaryOnPath('gemini', GEMINI_FALLBACK_PATHS);\r\n}\r\n\r\nexport function buildGeminiChildEnv(proxyPort: number, proxyToken: string): NodeJS.ProcessEnv {\r\n const env = { ...process.env };\r\n\r\n // Isolate by removing any conflicting/existing credentials\r\n delete env['GOOGLE_GEMINI_BASE_URL'];\r\n delete env['GEMINI_API_KEY'];\r\n delete env['GOOGLE_API_KEY'];\r\n delete env['GOOGLE_GENAI_API_KEY'];\r\n\r\n // Route to the local proxy\r\n env['GOOGLE_GEMINI_BASE_URL'] = `http://127.0.0.1:${proxyPort}`;\r\n env['GEMINI_API_KEY'] = proxyToken;\r\n env['GEMINI_DEFAULT_AUTH_TYPE'] = GEMINI_API_KEY_AUTH_TYPE;\r\n\r\n return env;\r\n}\r\n\r\nexport interface PreparedGeminiChildEnv {\r\n env: NodeJS.ProcessEnv;\r\n cleanup: () => void;\r\n}\r\n\r\nexport function createGeminiCliHomeOverlay(): string {\r\n const cliHome = mkdtempSync(join(tmpdir(), 'anygate-gemini-'));\r\n const settings = {\r\n security: {\r\n auth: {\r\n selectedType: GEMINI_API_KEY_AUTH_TYPE,\r\n },\r\n },\r\n };\r\n // GEMINI_CLI_HOME replaces os.homedir() inside Gemini CLI, so it reads\r\n // settings from $GEMINI_CLI_HOME/.gemini/settings.json — the overlay file\r\n // must live inside a .gemini subdirectory or it is silently ignored and\r\n // the CLI shows its first-run auth picker.\r\n const geminiDir = join(cliHome, '.gemini');\r\n mkdirSync(geminiDir);\r\n writeFileSync(join(geminiDir, 'settings.json'), `${JSON.stringify(settings, null, 2)}\\n`, {\r\n encoding: 'utf8',\r\n mode: 0o600,\r\n });\r\n return cliHome;\r\n}\r\n\r\nexport function prepareGeminiChildEnv(proxyPort: number, proxyToken: string): PreparedGeminiChildEnv {\r\n const cliHome = createGeminiCliHomeOverlay();\r\n const env = buildGeminiChildEnv(proxyPort, proxyToken);\r\n env['GEMINI_CLI_HOME'] = cliHome;\r\n\r\n return {\r\n env,\r\n cleanup: () => {\r\n try {\r\n rmSync(cliHome, { recursive: true, force: true });\r\n } catch {\r\n // Best-effort cleanup; the temp overlay contains no real credentials.\r\n }\r\n },\r\n };\r\n}\r\n\r\nexport function launchGemini(\r\n geminiPath: string,\r\n modelId: string,\r\n env: NodeJS.ProcessEnv,\r\n extraArgs: string[],\r\n): Promise<number> {\r\n return new Promise((resolve) => {\r\n // Instruct the Gemini CLI to use the chosen model via -m flag\r\n const args = ['-m', modelId, ...extraArgs];\r\n const child = spawn(geminiPath, args, {\r\n stdio: 'inherit',\r\n env,\r\n shell: isWindows,\r\n });\r\n\r\n const onSigInt = () => child.kill('SIGINT');\r\n const onSigTerm = () => child.kill('SIGTERM');\r\n process.once('SIGINT', onSigInt);\r\n process.once('SIGTERM', onSigTerm);\r\n\r\n const done = (code: number) => {\r\n process.off('SIGINT', onSigInt);\r\n process.off('SIGTERM', onSigTerm);\r\n resolve(code);\r\n };\r\n\r\n child.on('error', () => done(1));\r\n child.on('exit', (code) => done(code ?? 0));\r\n });\r\n}\r\n","// src/gemini/prompts.ts\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport type { LocalProvider, LocalProviderModel, UserPreferences } from '../../../src/core/types.js';\r\nimport {\r\n confirmLaunchMessage,\r\n modelSelectOption,\r\n navOption,\r\n providerSelectOption,\r\n} from '../../agents/shared/ui.js';\r\nimport { browseAllModels } from '../../agents/shared/prompts.js';\r\n\r\nexport async function pickGeminiProvider(\r\n providers: LocalProvider[],\r\n prefs: UserPreferences,\r\n hasFavorites = false,\r\n initialProviderId?: string,\r\n): Promise<LocalProvider | '__favorites__' | null> {\r\n if (providers.length === 0 && !hasFavorites) return null;\r\n\r\n const options: { value: string; label: string; hint?: string }[] = providers.map(lp => providerSelectOption(lp));\r\n \r\n if (hasFavorites) {\r\n options.unshift({\r\n value: '__favorites__',\r\n label: '⭐ Favorites Catalog',\r\n hint: `${prefs.favoriteModels?.length ?? 0} saved favorites`,\r\n });\r\n }\r\n\r\n const initial =\r\n initialProviderId && options.some(o => o.value === initialProviderId)\r\n ? initialProviderId\r\n : prefs.lastGeminiProvider && options.some(o => o.value === prefs.lastGeminiProvider)\r\n ? prefs.lastGeminiProvider\r\n : options[0]!.value;\r\n\r\n const chosen = await p.select<string>({\r\n message: 'Which provider for Gemini CLI?',\r\n options,\r\n initialValue: initial,\r\n });\r\n if (p.isCancel(chosen)) {\r\n p.cancel('Cancelled.');\r\n return null;\r\n }\r\n\r\n if (chosen === '__favorites__') return '__favorites__';\r\n\r\n return providers.find(lp => lp.id === chosen) ?? null;\r\n}\r\n\r\nexport async function pickGeminiModel(\r\n provider: LocalProvider,\r\n prefs: UserPreferences,\r\n): Promise<LocalProviderModel | 'back' | null> {\r\n const recentIds = (prefs.recentModelsByProvider?.[provider.id] ?? []).slice(0, 3);\r\n const recentModels = recentIds\r\n .map(id => provider.models.find(m => m.id === id))\r\n .filter((m): m is LocalProviderModel => m !== undefined);\r\n\r\n let selectedModel: LocalProviderModel | null = null;\r\n\r\n while (true) {\r\n if (recentModels.length > 0) {\r\n const options = [\r\n ...recentModels.map(m => modelSelectOption(m, 'recent')),\r\n navOption('__browse_all__', 'Browse all models →', `${provider.models.length} available`),\r\n navOption('__back__', '← Go back', 'Select a different provider'),\r\n ];\r\n\r\n const picked = await p.select({\r\n message: `Model for ${provider.name}?`,\r\n options,\r\n initialValue: recentModels[0].id,\r\n });\r\n\r\n if (p.isCancel(picked) || String(picked) === '__back__') {\r\n return 'back';\r\n }\r\n\r\n if (String(picked) === '__browse_all__') {\r\n const browsed = await browseAllModels(provider, prefs);\r\n if (browsed === 'back') {\r\n continue;\r\n }\r\n if (!browsed) return null;\r\n selectedModel = browsed;\r\n break;\r\n } else {\r\n selectedModel = recentModels.find(m => m.id === String(picked))!;\r\n break;\r\n }\r\n } else {\r\n const browsed = await browseAllModels(provider, prefs);\r\n if (browsed === 'back') {\r\n return 'back';\r\n }\r\n if (!browsed) return null;\r\n selectedModel = browsed;\r\n break;\r\n }\r\n }\r\n\r\n return selectedModel;\r\n}\r\n\r\nexport function confirmGeminiLaunch(\r\n providerName: string,\r\n modelLabel: string,\r\n modelId: string,\r\n): Promise<boolean> {\r\n return p.confirm({\r\n message: confirmLaunchMessage('Gemini CLI', modelLabel, modelId, providerName),\r\n initialValue: true,\r\n }).then(answer => {\r\n if (p.isCancel(answer)) {\r\n p.cancel('Cancelled.');\r\n return false;\r\n }\r\n return answer;\r\n });\r\n}\r\n\r\nexport async function pickGeminiFavoriteModel(\r\n providers: LocalProvider[],\r\n favorites: { providerId: string; modelId: string }[],\r\n): Promise<{ provider: LocalProvider; model: LocalProviderModel } | 'back' | null> {\r\n const favList: { provider: LocalProvider; model: LocalProviderModel }[] = [];\r\n for (const fav of favorites) {\r\n const provider = providers.find(lp => lp.id === fav.providerId);\r\n const model = provider?.models.find(m => m.id === fav.modelId);\r\n if (provider && model) favList.push({ provider, model });\r\n }\r\n\r\n if (favList.length === 0) {\r\n p.log.warn('None of your saved favorites are available in the current registry.');\r\n return null;\r\n }\r\n\r\n const options = [\r\n ...favList.map(({ provider, model }) => ({\r\n value: `${provider.id}::${model.id}`,\r\n label: model.name || model.id,\r\n hint: provider.name,\r\n })),\r\n { value: '__back__', label: '← Go back', hint: 'Select a different provider' },\r\n ];\r\n\r\n const picked = await p.select({\r\n message: 'Pick a favorite model for Gemini CLI:',\r\n options,\r\n initialValue: options[0]!.value,\r\n });\r\n\r\n if (p.isCancel(picked) || String(picked) === '__back__') return 'back';\r\n\r\n const [pickedProviderId, pickedModelId] = (picked as string).split('::');\r\n const provider = providers.find(lp => lp.id === pickedProviderId);\r\n const model = provider?.models.find(m => m.id === pickedModelId);\r\n if (!provider || !model) return null;\r\n return { provider, model };\r\n}\r\n\r\nexport function rejectGeminiManagedFlags(geminiArgs: string[]): string[] {\r\n const blocked = new Set(['--provider', '--model', '-m', '--trace']);\r\n const takesValue = new Set(['--provider', '--model', '-m']);\r\n const out: string[] = [];\r\n for (let i = 0; i < geminiArgs.length; i++) {\r\n const arg = geminiArgs[i]!;\r\n if (blocked.has(arg)) {\r\n if (takesValue.has(arg)) i++;\r\n continue;\r\n }\r\n if (\r\n arg.startsWith('--model=')\r\n || arg.startsWith('--provider=')\r\n || arg.startsWith('-m=')\r\n ) continue;\r\n out.push(arg);\r\n }\r\n return out;\r\n}\r\n","// src/gemini-proxy.ts — Local Gemini-to-SDK translation proxy\r\nimport { createServer } from 'node:http';\r\nimport type { IncomingMessage, ServerResponse } from 'node:http';\r\nimport { randomUUID } from 'node:crypto';\r\nimport { streamText, generateText, tool, jsonSchema } from 'ai';\r\nimport type { LanguageModel } from 'ai';\r\nimport { readBody, sendJson } from '../../../src/core/http-utils.js';\r\nimport {\r\n createLanguageModel,\r\n deepMergeProviderOptions,\r\n effortProviderOptions,\r\n maxToolsForNpm,\r\n thinkingProviderOptions,\r\n} from '../../../src/gateway/provider-factory.js';\r\nimport { applyClaudeCodeOAuthIdentity } from '../../../src/oauth/claude-code-identity.js';\r\nimport { silenceSdkWarnings } from '../../../src/gateway/sdk-adapter.js';\r\nimport { getGeminiProxyDebugLogPath, makeTraceLogger } from '../../agents/shared/trace-log.js';\r\nimport type { ProxyRoute, ProxyHandle } from '../../../src/gateway/anthropic-proxy.js';\r\nimport { routeLookupIds } from '../../agents/shared/context-model-id.js';\r\nimport { formatUpstreamError } from '../../../src/core/errors.js';\r\n\r\nfunction mapFinishReason(reason: string): string {\r\n if (reason === 'stop' || reason === 'tool-calls') return 'STOP';\r\n if (reason === 'length') return 'MAX_TOKENS';\r\n if (reason === 'content-filter') return 'SAFETY';\r\n return 'OTHER';\r\n}\r\n\r\nfunction lookupGeminiRoute(routes: ProxyRoute[], requestedModel: string): ProxyRoute | undefined {\r\n const ids = [requestedModel, ...routeLookupIds(requestedModel)];\r\n \r\n // Also support stripping prefixes/suffixes\r\n const slashIdx = requestedModel.indexOf('/');\r\n if (slashIdx >= 0) {\r\n const after = requestedModel.slice(slashIdx + 1);\r\n ids.push(after, ...routeLookupIds(after));\r\n }\r\n const doubleUnderscore = requestedModel.indexOf('__');\r\n if (doubleUnderscore >= 0) {\r\n const after = requestedModel.slice(doubleUnderscore + 2);\r\n ids.push(after, ...routeLookupIds(after));\r\n }\r\n\r\n const uniqueIds = [...new Set(ids)];\r\n for (const id of uniqueIds) {\r\n const route = routes.find(r => r.aliasId === id || r.realModelId === id);\r\n if (route) return route;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport interface TranslateGeminiRequestOptions {\r\n maxTools?: number;\r\n}\r\n\r\nfunction mergeConsecutiveMessages(messages: any[]): any[] {\r\n const merged: any[] = [];\r\n for (const msg of messages) {\r\n if (merged.length === 0) {\r\n merged.push(msg);\r\n continue;\r\n }\r\n const last = merged[merged.length - 1];\r\n if (last.role === msg.role) {\r\n const lastContent = Array.isArray(last.content) ? last.content : [{ type: 'text', text: last.content }];\r\n const nextContent = Array.isArray(msg.content) ? msg.content : [{ type: 'text', text: msg.content }];\r\n last.content = [...lastContent, ...nextContent];\r\n } else {\r\n merged.push(msg);\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\n// Strip Gemini CLI self-identification injected by the CLI into system and user content.\r\n// Paragraphs are erased first (while still matching the original \"Gemini CLI\" text),\r\n// then any residual brand mentions are renamed to a neutral label.\r\nfunction stripGeminiIdentity(text: string): string {\r\n return text\r\n .replace(/You are Gemini CLI[\\s\\S]*?(?=\\n\\n|$)/gi, '')\r\n .replace(/I'm Gemini CLI[\\s\\S]*?(?=\\n\\n|$)/gi, '')\r\n .replace(/Gemini CLI/gi, 'AI CLI');\r\n}\r\n\r\nexport function translateGeminiRequest(body: any, options: TranslateGeminiRequestOptions = {}): any {\r\n // 1. System instruction\r\n let system: string | undefined;\r\n if (body.systemInstruction?.parts) {\r\n const rawSystem = body.systemInstruction.parts.map((p: any) => p.text || '').join('\\n');\r\n system = stripGeminiIdentity(rawSystem).trim();\r\n }\r\n\r\n // 2. Messages (contents)\r\n const messages: any[] = [];\r\n const nameToIdList = new Map<string, string[]>();\r\n\r\n const contents = body.contents || [];\r\n for (const turn of contents) {\r\n const role = turn.role === 'model' ? 'assistant' : 'user';\r\n const parts: any[] = [];\r\n const toolResults: any[] = [];\r\n\r\n const turnParts = turn.parts || [];\r\n for (const p of turnParts) {\r\n if (p.text !== undefined) {\r\n // Strip <session_context> identity injected into user message parts\r\n const text = stripGeminiIdentity(p.text);\r\n if (text.includes('<thinking>')) {\r\n const tokens = text.split(/<thinking>([\\s\\S]*?)<\\/thinking>/);\r\n for (let i = 0; i < tokens.length; i++) {\r\n const token = tokens[i].trim();\r\n if (!token) continue;\r\n parts.push({ type: i % 2 === 1 ? 'reasoning' : 'text', text: token });\r\n }\r\n } else {\r\n parts.push({ type: 'text', text });\r\n }\r\n } else if (p.inlineData) {\r\n parts.push({\r\n type: 'image',\r\n image: Buffer.from(p.inlineData.data, 'base64'),\r\n mediaType: p.inlineData.mimeType,\r\n });\r\n } else if (p.functionCall) {\r\n const id = 'call_' + randomUUID().replace(/-/g, '');\r\n const name = p.functionCall.name;\r\n if (!nameToIdList.has(name)) nameToIdList.set(name, []);\r\n nameToIdList.get(name)!.push(id);\r\n\r\n parts.push({\r\n type: 'tool-call',\r\n toolCallId: id,\r\n toolName: name,\r\n input: p.functionCall.args || {},\r\n });\r\n } else if (p.functionResponse) {\r\n const name = p.functionResponse.name;\r\n const idList = nameToIdList.get(name) || [];\r\n const id = idList.shift() || ('call_' + randomUUID().replace(/-/g, ''));\r\n \r\n toolResults.push({\r\n type: 'tool-result',\r\n toolCallId: id,\r\n toolName: name,\r\n output: {\r\n type: 'text',\r\n value: typeof p.functionResponse.response === 'string'\r\n ? p.functionResponse.response\r\n : JSON.stringify(p.functionResponse.response || {}),\r\n },\r\n });\r\n }\r\n }\r\n\r\n if (toolResults.length > 0) {\r\n messages.push({\r\n role: 'tool',\r\n content: toolResults,\r\n });\r\n }\r\n if (parts.length > 0) {\r\n messages.push({\r\n role,\r\n content: parts,\r\n });\r\n }\r\n }\r\n\r\n // Merge consecutive user/assistant/tool messages\r\n const mergedMessages = mergeConsecutiveMessages(messages);\r\n\r\n // 3. Tools translation\r\n let tools: any;\r\n if (body.tools) {\r\n tools = {};\r\n let toolCount = 0;\r\n for (const t of body.tools) {\r\n if (t.functionDeclarations) {\r\n for (const fd of t.functionDeclarations) {\r\n if (options.maxTools !== undefined && toolCount >= options.maxTools) break;\r\n tools[fd.name] = tool({\r\n description: fd.description || '',\r\n inputSchema: jsonSchema(fd.parameters || { type: 'object', properties: {} }),\r\n });\r\n toolCount++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 4. Tool Choice\r\n let toolChoice: any;\r\n const mode = body.toolConfig?.functionCallingConfig?.mode;\r\n if (mode === 'ANY') {\r\n toolChoice = 'required';\r\n } else if (mode === 'AUTO') {\r\n toolChoice = 'auto';\r\n }\r\n\r\n const generationConfig = body.generationConfig || {};\r\n let responseFormat: { type: 'json' } | undefined;\r\n if (generationConfig.responseMimeType === 'application/json') {\r\n responseFormat = { type: 'json' };\r\n }\r\n\r\n return {\r\n system,\r\n messages: mergedMessages,\r\n tools: tools && Object.keys(tools).length > 0 ? tools : undefined,\r\n toolChoice,\r\n maxOutputTokens: generationConfig.maxOutputTokens,\r\n temperature: generationConfig.temperature,\r\n responseFormat,\r\n };\r\n}\r\n\r\nexport async function startGeminiProxy(\r\n routes: ProxyRoute[],\r\n debug = false,\r\n): Promise<ProxyHandle> {\r\n const proxyToken = randomUUID();\r\n silenceSdkWarnings();\r\n\r\n if (routes.length === 0) {\r\n return Promise.reject(new Error('Gemini proxy requires at least one route'));\r\n }\r\n\r\n const defaultRoute = routes[0]!;\r\n const models = new Map<string, LanguageModel>();\r\n const plog = debug ? makeTraceLogger(getGeminiProxyDebugLogPath()) : () => {};\r\n\r\n const onRejection = (reason: unknown) => {\r\n plog(`Unhandled Rejection: ${reason instanceof Error ? reason.stack || reason.message : String(reason)}`);\r\n };\r\n const onException = (error: Error) => {\r\n plog(`Uncaught Exception: ${error.stack || error.message}`);\r\n };\r\n\r\n // Helper to lazily resolve language model when needed\r\n const getOrInitModel = async (route: ProxyRoute): Promise<LanguageModel> => {\r\n let m = models.get(route.aliasId);\r\n if (!m) {\r\n m = await createLanguageModel({\r\n npm: route.npm || '@ai-sdk/openai-compatible',\r\n modelId: route.realModelId,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n providerId: route.providerId ?? route.aliasId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n headers: route.headers,\r\n });\r\n models.set(route.aliasId, m);\r\n }\r\n return m;\r\n };\r\n\r\n const formatGeminiModel = (route: ProxyRoute) => ({\r\n name: `models/${route.aliasId}`,\r\n version: '1.0',\r\n displayName: route.displayName,\r\n description: 'Registry model routed through anygate proxy',\r\n inputTokenLimit: route.contextWindow || 1000000,\r\n outputTokenLimit: 8192,\r\n supportedGenerationMethods: ['generateContent', 'streamGenerateContent'],\r\n });\r\n\r\n let sessionRouteOverride: ProxyRoute | undefined = undefined;\r\n\r\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\r\n try {\r\n const url = req.url ?? '';\r\n plog(`${req.method} ${url}`);\r\n\r\n // 1. GET /v1beta/models or /v1/models\r\n if (req.method === 'GET' && (url.endsWith('/models') || url.includes('/models?'))) {\r\n plog('GET models list');\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n const payload = JSON.stringify({\r\n models: routes.map(formatGeminiModel),\r\n });\r\n plog(`Response: ${payload}`);\r\n res.end(payload);\r\n return;\r\n }\r\n\r\n // 2. GET /v1beta/models/:model or /v1/models/:model\r\n if (req.method === 'GET' && url.includes('/models/')) {\r\n const modelMatch = url.match(/\\/models\\/([^?]+)/);\r\n if (modelMatch) {\r\n const modelId = decodeURIComponent(modelMatch[1]);\r\n const route = lookupGeminiRoute(routes, modelId) ?? defaultRoute;\r\n plog(`GET model details: ${modelId} -> mapped to route ${route.aliasId}`);\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n const payload = JSON.stringify(formatGeminiModel(route));\r\n plog(`Response: ${payload}`);\r\n res.end(payload);\r\n return;\r\n }\r\n }\r\n\r\n // 3. POST Generate content (streaming or non-streaming)\r\n if (req.method === 'POST' && url.includes(':')) {\r\n const isStream = url.includes('streamGenerateContent');\r\n const rawBody = await readBody(req);\r\n plog(`Request body:\\n${rawBody}`);\r\n let body: any;\r\n try {\r\n body = JSON.parse(rawBody);\r\n } catch {\r\n plog('Error: Invalid JSON body');\r\n res.writeHead(400);\r\n res.end('Invalid JSON');\r\n return;\r\n }\r\n\r\n const modelMatch = url.match(/\\/models\\/([^:]+)/);\r\n const requestedModel = modelMatch ? decodeURIComponent(modelMatch[1]) : defaultRoute.aliasId;\r\n\r\n // --- Model Switch Intercept ---\r\n const lastUserTurn = findLastUserTurn(body.contents || []);\r\n const modelCommand = parseModelCommand(lastUserTurn);\r\n\r\n if (modelCommand !== null) {\r\n if (modelCommand === '') {\r\n // .model with no args — show current model and available list\r\n const current = sessionRouteOverride ?? (lookupGeminiRoute(routes, requestedModel) ?? defaultRoute);\r\n const availableList = routes.map(r => ` - ${r.aliasId} (${r.displayName})`).join('\\n');\r\n const exampleId = routes.length > 1 ? routes[1].aliasId : (routes[0]?.aliasId ?? 'deepseek-v4');\r\n const text = `Current model: ${current.displayName} (${current.aliasId})\\n\\nAvailable models:\\n${availableList}\\n\\n💡 To switch models, type: .model <id>\\nExample: .model ${exampleId}`;\r\n sendMockGeminiResponse(res, text, isStream, current.aliasId);\r\n return;\r\n }\r\n\r\n const targetRoute = lookupGeminiRoute(routes, modelCommand);\r\n if (targetRoute) {\r\n sessionRouteOverride = targetRoute;\r\n plog(`.model switch: ${targetRoute.aliasId} (${targetRoute.realModelId})`);\r\n sendMockGeminiResponse(res, `✅ Switched model to ${targetRoute.displayName} (${targetRoute.aliasId})`, isStream, targetRoute.aliasId);\r\n } else {\r\n const available = routes.map(r => r.aliasId).join(', ');\r\n sendMockGeminiResponse(res, `❌ Model '${modelCommand}' not found.\\n\\nAvailable: ${available}`, isStream);\r\n }\r\n return;\r\n }\r\n\r\n const route = sessionRouteOverride ?? (lookupGeminiRoute(routes, requestedModel) ?? defaultRoute);\r\n plog(`Route selected: ${route.aliasId} (upstream model: ${route.realModelId})`);\r\n\r\n body.contents = sanitizeModelSwitchTurns(body.contents || []);\r\n\r\n const languageModel = await getOrInitModel(route);\r\n const params = applyClaudeCodeOAuthIdentity(\r\n { ...route, upstreamModelId: route.realModelId },\r\n translateGeminiRequest(body, { maxTools: maxToolsForNpm(route.npm) }),\r\n );\r\n params.providerOptions = deepMergeProviderOptions(\r\n params.providerOptions,\r\n deepMergeProviderOptions(\r\n thinkingProviderOptions(route.npm || '@ai-sdk/openai-compatible'),\r\n effortProviderOptions(route.npm || '@ai-sdk/openai-compatible', 'high', route.realModelId, route),\r\n ),\r\n );\r\n plog(`Translated SDK params:\\n${JSON.stringify(params, null, 2)}`);\r\n\r\n if (isStream) {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n });\r\n\r\n plog('Starting streamText...');\r\n const { fullStream } = streamText({\r\n model: languageModel,\r\n ...params,\r\n });\r\n\r\n const toolCallBuffers = new Map<string, { name: string; json: string }>();\r\n let isThinking = false;\r\n\r\n for await (const part of fullStream) {\r\n const p = part as any;\r\n plog(`Stream chunk type: ${p.type}`);\r\n \r\n // Auto-close thinking tag if moving to tool calls or finish\r\n if (isThinking && (p.type === 'tool-input-start' || p.type === 'tool-call' || p.type === 'finish')) {\r\n isThinking = false;\r\n const chunk = {\r\n candidates: [{ content: { role: 'model', parts: [{ text: `\\n</thinking>\\n\\n` }] } }],\r\n modelVersion: route.aliasId,\r\n };\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n }\r\n\r\n if (p.type === 'reasoning') {\r\n let text = p.textDelta ?? p.text ?? '';\r\n if (!isThinking) {\r\n isThinking = true;\r\n text = `<thinking>\\n` + text;\r\n }\r\n const chunk = {\r\n candidates: [{ content: { role: 'model', parts: [{ text }] } }],\r\n modelVersion: route.aliasId,\r\n };\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n } else if (p.type === 'text-delta') {\r\n let text = p.textDelta ?? p.text ?? '';\r\n if (isThinking) {\r\n isThinking = false;\r\n text = `\\n</thinking>\\n\\n` + text;\r\n }\r\n const chunk = {\r\n candidates: [{\r\n content: {\r\n role: 'model',\r\n parts: [{ text }]\r\n }\r\n }],\r\n modelVersion: route.aliasId,\r\n };\r\n const data = `data: ${JSON.stringify(chunk)}\\n\\n`;\r\n plog(`Streaming text delta: ${p.textDelta}`);\r\n res.write(data);\r\n } else if (p.type === 'tool-input-start') {\r\n toolCallBuffers.set(p.toolCallId, { name: p.toolName, json: '' });\r\n } else if (p.type === 'tool-input-delta') {\r\n const buf = toolCallBuffers.get(p.toolCallId);\r\n if (buf) buf.json += p.delta;\r\n } else if (p.type === 'tool-call') {\r\n const buf = toolCallBuffers.get(p.toolCallId);\r\n const args = buf ? JSON.parse(buf.json || '{}') : (p.input || {});\r\n const name = buf ? buf.name : p.toolName;\r\n plog(`Streaming tool call: ${name} with args: ${JSON.stringify(args)}`);\r\n \r\n const chunk = {\r\n candidates: [{\r\n content: {\r\n role: 'model',\r\n parts: [{\r\n functionCall: { name, args }\r\n }]\r\n }\r\n }],\r\n modelVersion: route.aliasId,\r\n };\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n } else if (p.type === 'finish') {\r\n const chunk = {\r\n candidates: [{\r\n finishReason: mapFinishReason(p.finishReason ?? '')\r\n }],\r\n usageMetadata: {\r\n promptTokenCount: p.totalUsage?.inputTokens || 0,\r\n candidatesTokenCount: p.totalUsage?.outputTokens || 0,\r\n },\r\n modelVersion: route.aliasId,\r\n };\r\n plog(`Stream finish. Reason: ${p.finishReason}`);\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n }\r\n }\r\n res.end();\r\n plog('Stream ended.');\r\n } else {\r\n // Non-streaming generateContent\r\n plog('Starting generateText...');\r\n const result = await generateText({\r\n model: languageModel,\r\n ...params,\r\n });\r\n plog('generateText finished.');\r\n\r\n const parts: any[] = [];\r\n if (result.reasoning) {\r\n parts.push({ text: `<thinking>\\n${result.reasoning}\\n</thinking>\\n\\n` });\r\n }\r\n if (result.text) {\r\n parts.push({ text: result.text });\r\n }\r\n if (result.toolCalls?.length) {\r\n for (const tc of result.toolCalls) {\r\n parts.push({\r\n functionCall: { name: tc.toolName, args: tc.input }\r\n });\r\n }\r\n }\r\n\r\n const response = {\r\n candidates: [{\r\n content: {\r\n role: 'model',\r\n parts,\r\n },\r\n finishReason: mapFinishReason(result.finishReason ?? '')\r\n }],\r\n usageMetadata: {\r\n promptTokenCount: result.usage?.inputTokens || 0,\r\n candidatesTokenCount: result.usage?.outputTokens || 0,\r\n },\r\n modelVersion: route.aliasId,\r\n };\r\n\r\n plog(`Response:\\n${JSON.stringify(response, null, 2)}`);\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(response));\r\n }\r\n return;\r\n }\r\n\r\n plog(`404 Not Found: ${url}`);\r\n res.writeHead(404);\r\n res.end('Not Found');\r\n } catch (err) {\r\n plog(`Error handling request: ${err instanceof Error ? err.stack || err.message : String(err)}`);\r\n const errMsg = formatUpstreamError(err);\r\n if (debug) {\r\n console.error(`[Gemini Proxy] ${errMsg}`);\r\n }\r\n if (!res.headersSent) {\r\n sendMockGeminiResponse(res, `⚠ ${errMsg}`, req.url?.includes('streamGenerateContent') ?? false);\r\n } else {\r\n // Headers already sent — we're mid-SSE stream; emit a normal Gemini text chunk before closing.\r\n try {\r\n writeGeminiStreamText(res, `⚠ ${errMsg}`);\r\n } catch {\r\n // ignore write errors on a closing socket\r\n }\r\n res.end();\r\n }\r\n }\r\n });\r\n\r\n process.on('unhandledRejection', onRejection);\r\n process.on('uncaughtException', onException);\r\n\r\n const cleanup = () => {\r\n process.off('unhandledRejection', onRejection);\r\n process.off('uncaughtException', onException);\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n server.on('error', (err) => {\r\n cleanup();\r\n reject(err);\r\n });\r\n server.listen(0, '127.0.0.1', () => {\r\n const addr = server.address();\r\n if (!addr || typeof addr === 'string') {\r\n cleanup();\r\n reject(new Error('Failed to bind gemini proxy'));\r\n return;\r\n }\r\n resolve({\r\n port: addr.port,\r\n token: proxyToken,\r\n close: () => {\r\n cleanup();\r\n server.close();\r\n },\r\n });\r\n });\r\n });\r\n}\r\n\r\nexport function sanitizeModelSwitchTurns(contents: any[]): any[] {\r\n const cleaned: any[] = [];\r\n let i = 0;\r\n while (i < contents.length) {\r\n const turn = contents[i];\r\n if (isModelSwitchTurn(turn)) {\r\n // Skip this user turn and the next model turn (the fake response)\r\n i += 1;\r\n if (i < contents.length && contents[i]?.role === 'model') {\r\n i += 1; // skip the paired model response\r\n }\r\n continue;\r\n }\r\n cleaned.push(turn);\r\n i += 1;\r\n }\r\n return cleaned;\r\n}\r\n\r\nexport function isModelSwitchTurn(turn: any): boolean {\r\n if (turn?.role !== 'user') return false;\r\n const parts = turn.parts || [];\r\n if (parts.length === 0) return false;\r\n const firstText = parts[0]?.text;\r\n if (typeof firstText !== 'string') return false;\r\n return firstText.trim().startsWith('.model');\r\n}\r\n\r\nexport function findLastUserTurn(contents: any[]): any | undefined {\r\n for (let i = contents.length - 1; i >= 0; i--) {\r\n if (contents[i]?.role === 'user') return contents[i];\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function parseModelCommand(turn: any): string | null {\r\n if (!turn || turn.role !== 'user') return null;\r\n const parts = turn.parts || [];\r\n if (parts.length !== 1) return null; // Must be a single-part message\r\n const text = parts[0]?.text;\r\n if (typeof text !== 'string') return null;\r\n const trimmed = text.trim();\r\n if (!trimmed.startsWith('.model')) return null;\r\n if (trimmed === '.model') return ''; // no args\r\n if (trimmed.charAt(6) !== ' ') return null; // \".modelfoo\" is not a command\r\n return trimmed.slice(7).trim();\r\n}\r\n\r\nfunction sendMockGeminiResponse(res: ServerResponse, text: string, isStream: boolean, modelVersion?: string): void {\r\n if (isStream) {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n });\r\n writeGeminiStreamText(res, text, modelVersion);\r\n res.end();\r\n } else {\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({\r\n candidates: [{\r\n content: { role: 'model', parts: [{ text }] },\r\n finishReason: 'STOP',\r\n }],\r\n usageMetadata: { promptTokenCount: 0, candidatesTokenCount: 0 },\r\n ...(modelVersion ? { modelVersion } : {}),\r\n }));\r\n }\r\n}\r\n\r\nfunction writeGeminiStreamText(res: ServerResponse, text: string, modelVersion?: string): void {\r\n const chunk = {\r\n candidates: [{\r\n content: { role: 'model', parts: [{ text }] },\r\n finishReason: 'STOP',\r\n }],\r\n usageMetadata: { promptTokenCount: 0, candidatesTokenCount: 0 },\r\n ...(modelVersion ? { modelVersion } : {}),\r\n };\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n const finishChunk = {\r\n candidates: [{ finishReason: 'STOP' }],\r\n usageMetadata: { promptTokenCount: 0, candidatesTokenCount: 0 },\r\n ...(modelVersion ? { modelVersion } : {}),\r\n };\r\n res.write(`data: ${JSON.stringify(finishChunk)}\\n\\n`);\r\n}\r\n","import {\r\n needsCloudCodeBackend,\r\n partitionAndStartCloudCodeBackend,\r\n type BackendPartitionInput,\r\n type CloudCodeBackend,\r\n} from '../shared/cloud-code-backend.js';\r\nimport type { ProxyRoute } from '../../../src/gateway/anthropic-proxy.js';\r\nimport type { LocalProviderModel } from '../../../src/core/types.js';\r\n\r\ninterface GeminiBackendInput extends BackendPartitionInput {\r\n originalAliasId: string;\r\n}\r\n\r\ninterface GeminiBackendRoute {\r\n originalAliasId: string;\r\n aliasId: string;\r\n backendUrl: string;\r\n apiKey: string;\r\n}\r\n\r\nexport interface GeminiBackendRoutesResult {\r\n routes: ProxyRoute[];\r\n launchModelId: string;\r\n backend: CloudCodeBackend | null;\r\n}\r\n\r\nfunction routeToModel(route: ProxyRoute): LocalProviderModel {\r\n return {\r\n id: route.realModelId,\r\n name: route.displayName,\r\n upstreamModelId: route.realModelId,\r\n family: '',\r\n brand: '',\r\n modelFormat: route.modelFormat,\r\n baseUrl: route.modelFormat === 'anthropic' ? route.upstreamUrl : undefined,\r\n npm: route.npm,\r\n apiBaseUrl: route.baseURL,\r\n contextWindow: route.contextWindow,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n };\r\n}\r\n\r\nfunction routeNeedsBackend(route: ProxyRoute): boolean {\r\n return needsCloudCodeBackend(routeToModel(route), route.authType);\r\n}\r\n\r\nexport async function rewriteGeminiBackendRoutes(\r\n routes: ProxyRoute[],\r\n launchModelId: string,\r\n trace?: boolean,\r\n): Promise<GeminiBackendRoutesResult> {\r\n const backendInputs: GeminiBackendInput[] = routes\r\n .filter(routeNeedsBackend)\r\n .map(route => ({\r\n originalAliasId: route.aliasId,\r\n providerId: route.providerId ?? '',\r\n model: routeToModel(route),\r\n apiKey: route.apiKey,\r\n providerData: route.providerData,\r\n }));\r\n\r\n const partitioned = await partitionAndStartCloudCodeBackend(\r\n backendInputs,\r\n (proxyRoute, backend, original): GeminiBackendRoute => ({\r\n originalAliasId: original.originalAliasId,\r\n aliasId: proxyRoute.aliasId,\r\n backendUrl: `http://127.0.0.1:${backend.port}`,\r\n apiKey: backend.token,\r\n }),\r\n trace,\r\n );\r\n\r\n if (!partitioned.backend) {\r\n return { routes, launchModelId, backend: null };\r\n }\r\n\r\n const backendAliasMap = new Map(\r\n partitioned.backendItems.map(item => [item.originalAliasId, item]),\r\n );\r\n\r\n return {\r\n backend: partitioned.backend,\r\n launchModelId: backendAliasMap.get(launchModelId)?.aliasId ?? launchModelId,\r\n routes: routes.map(route => {\r\n const backendRoute = backendAliasMap.get(route.aliasId);\r\n if (!backendRoute) return route;\r\n\r\n return {\r\n ...route,\r\n aliasId: backendRoute.aliasId,\r\n realModelId: backendRoute.aliasId,\r\n upstreamUrl: backendRoute.backendUrl,\r\n apiKey: backendRoute.apiKey,\r\n modelFormat: 'anthropic',\r\n npm: '@ai-sdk/anthropic',\r\n baseURL: backendRoute.backendUrl,\r\n authType: undefined,\r\n };\r\n }),\r\n };\r\n}\r\n","import pc from 'picocolors';\r\n\r\nconst SHUTDOWN_DRAIN_MS = 500;\r\nimport * as p from '@clack/prompts';\r\nimport { appendFileSync } from 'node:fs';\r\nimport { loadPreferences, savePreferences } from '../../../src/core/config.js';\r\nimport { fetchProviderCatalog, providersForPicker } from '../../../src/providers/provider-catalog.js';\r\nimport { providersForTarget } from '../../../src/agents/shared/target-compatibility.js';\r\nimport { detectConflicts, buildAntigravityChildEnv } from '../../../src/core/env.js';\r\nimport { buildAntigravityRoutes } from '../../../src/gateway/antigravity/catalog.js';\r\nimport { startCloudCodeGateway, type CloudCodeGatewayHandle } from '../../../src/gateway/antigravity/cloud-code-gateway.js';\r\nimport { evaluateAgySwitchCompatibility } from '../../../src/gateway/antigravity/slot-registry.js';\r\nimport { resolveAntigravityLaunchRoutes } from '../../../src/gateway/antigravity/launch-routes.js';\r\nimport { launchAntigravityCli, readAntigravityCliVersion } from '../../../src/gateway/antigravity/launch-cli.js';\r\nimport catalogFixtureRaw from '../../../src/gateway/antigravity/fixtures/fetchAvailableModels.json' with { type: 'json' };\r\nimport {\r\n forceQuitAntigravityApp,\r\n forceQuitAntigravityIde,\r\n isAntigravityAppRunning,\r\n isAntigravityIdeRunning,\r\n launchAntigravityApp,\r\n launchAntigravityIde,\r\n quitAntigravityAppGracefully,\r\n quitAntigravityIdeGracefully,\r\n waitForAntigravityAppQuit,\r\n waitForAntigravityIdeQuit,\r\n} from '../../../src/gateway/antigravity/launch-ide.js';\r\nimport { pickLocalModel } from '../../agents/shared/prompts.js';\r\nimport { providerSelectOption, formatModelLabel, gateIntro, gateOutro } from '../../agents/shared/ui.js';\r\nimport { homedir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport type { FavoriteModel, UserPreferences, LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\nimport type { CatalogFixture } from '../../../src/gateway/antigravity/types.js';\r\n\r\nconst AGY_FAVORITES_PROVIDER_ID = '__gateway_agy_favorites__';\r\nconst AGY_FAVORITES_PROVIDER_LABEL = '★ Antigravity CLI Favorites';\r\n\r\n/** True when child args already select a model (--model or --model=). */\r\nexport function agyArgsIncludeModelFlag(args: string[]): boolean {\r\n return args.some(arg => arg === '--model' || arg.startsWith('--model='));\r\n}\r\n\r\n/** Prepend --model <display label> unless the user already passed --model. */\r\nexport function buildAgyLaunchArgs(modelLabel: string, childArgs: string[]): string[] {\r\n if (agyArgsIncludeModelFlag(childArgs)) return childArgs;\r\n return ['--model', modelLabel, ...childArgs];\r\n}\r\n\r\nexport function agyArgsAreNonInteractive(args: string[]): boolean {\r\n return args.some(arg => arg === '-p' || arg === '--prompt' || arg.startsWith('--prompt='));\r\n}\r\n\r\nexport function formatAgyCapacityWarning(validatedSlotCount: number, skippedFavoriteCount: number): string {\r\n const slotWord = validatedSlotCount === 1 ? 'slot' : 'slots';\r\n const favoritePhrase = skippedFavoriteCount === 1\r\n ? '1 favorite was not exposed'\r\n : `${skippedFavoriteCount} favorites were not exposed`;\r\n return `AGY can switch among ${validatedSlotCount} validated model ${slotWord}; ${favoritePhrase}.`;\r\n}\r\n\r\nfunction isInteractiveTerminal(): boolean {\r\n return !!process.stdin.isTTY && !!process.stdout.isTTY;\r\n}\r\n\r\nfunction resolveFavoriteModel(\r\n favorite: FavoriteModel,\r\n allProviders: LocalProvider[],\r\n): { provider: LocalProvider; model: LocalProviderModel } | null {\r\n const provider = allProviders.find(candidate => candidate.id === favorite.providerId);\r\n const model = provider?.models.find(candidate => candidate.id === favorite.modelId);\r\n return provider && model ? { provider, model } : null;\r\n}\r\n\r\nfunction normalizeAgyModelSelector(value: string): string {\r\n return value\r\n .trim()\r\n .replace(/\\s*\\(anygate(?: - .*)?\\)\\s*$/i, '')\r\n .toLowerCase();\r\n}\r\n\r\nexport function resolveAntigravityBootModel(\r\n provider: LocalProvider,\r\n modelSelector: string,\r\n): { model: LocalProviderModel | null; error?: string } {\r\n const selector = normalizeAgyModelSelector(modelSelector);\r\n const exact = provider.models.filter(model =>\r\n normalizeAgyModelSelector(model.id) === selector\r\n || normalizeAgyModelSelector(model.name) === selector\r\n || normalizeAgyModelSelector(model.upstreamModelId) === selector\r\n );\r\n if (exact.length === 1) return { model: exact[0]! };\r\n\r\n const prefix = provider.models.filter(model =>\r\n normalizeAgyModelSelector(model.id).startsWith(selector)\r\n || normalizeAgyModelSelector(model.name).startsWith(selector)\r\n || normalizeAgyModelSelector(model.upstreamModelId).startsWith(selector)\r\n );\r\n if (prefix.length === 1) return { model: prefix[0]! };\r\n\r\n const candidates = (exact.length > 1 ? exact : prefix).slice(0, 5);\r\n const candidateText = candidates.length > 0\r\n ? ` Did you mean: ${candidates.map(model => `${model.name || model.id} (${model.id})`).join(', ')}?`\r\n : '';\r\n return {\r\n model: null,\r\n error: exact.length > 1 || prefix.length > 1\r\n ? `Model selector is ambiguous: ${modelSelector}.${candidateText}`\r\n : `Model not found: ${modelSelector} on provider ${provider.name}.${candidateText}`,\r\n };\r\n}\r\n\r\nasync function pickAntigravityCliFavoriteLaunchModel(\r\n favorites: FavoriteModel[],\r\n allProviders: LocalProvider[],\r\n): Promise<{ provider: LocalProvider; model: LocalProviderModel } | null> {\r\n const resolved = favorites\r\n .map(favorite => resolveFavoriteModel(favorite, allProviders))\r\n .filter((entry): entry is { provider: LocalProvider; model: LocalProviderModel } => entry !== null);\r\n\r\n if (resolved.length === 0) {\r\n p.log.warn('No Antigravity CLI favorites are available.');\r\n p.log.info(pc.dim('Manage them with `anygate favorites --agy`.'));\r\n return null;\r\n }\r\n\r\n const picked = await p.select<string>({\r\n message: 'Launch from Antigravity CLI favorites',\r\n options: resolved.map(({ provider, model }) => ({\r\n value: `${provider.id}:${model.id}`,\r\n label: formatModelLabel(model),\r\n hint: provider.name,\r\n })),\r\n initialValue: `${resolved[0]!.provider.id}:${resolved[0]!.model.id}`,\r\n });\r\n\r\n if (p.isCancel(picked)) {\r\n p.cancel('Cancelled.');\r\n return null;\r\n }\r\n\r\n const [providerId, ...modelParts] = picked.split(':');\r\n const modelId = modelParts.join(':');\r\n return resolved.find(entry => entry.provider.id === providerId && entry.model.id === modelId) ?? null;\r\n}\r\n\r\nasync function resolveAntigravityLaunch(\r\n prefs: UserPreferences,\r\n boot: { launchProvider?: string; launchModel?: string } | undefined,\r\n): Promise<{ provider: LocalProvider; model: LocalProviderModel; allProviders: LocalProvider[] } | null> {\r\n // Load the provider catalog\r\n let catalog;\r\n const catalogSpinner = p.spinner();\r\n catalogSpinner.start('Loading providers...');\r\n try {\r\n catalog = await fetchProviderCatalog();\r\n } catch (err) {\r\n catalogSpinner.stop('');\r\n p.log.error(String(err instanceof Error ? err.message : err));\r\n return null;\r\n }\r\n catalogSpinner.stop('');\r\n\r\n const allProviders = providersForTarget(providersForPicker(catalog), 'antigravity');\r\n if (allProviders.length === 0) {\r\n p.log.warn('No providers available.');\r\n p.log.info(pc.dim('Run anygate providers add or import to get started.'));\r\n return null;\r\n }\r\n\r\n // Check for explicit --provider + --model\r\n if (boot?.launchProvider && boot?.launchModel) {\r\n const provider = allProviders.find(p => p.id === boot.launchProvider);\r\n if (!provider) {\r\n p.log.error(`Provider not found: ${boot.launchProvider}`);\r\n return null;\r\n }\r\n const { model, error } = resolveAntigravityBootModel(provider, boot.launchModel);\r\n if (!model) {\r\n p.log.error(error ?? `Model not found: ${boot.launchModel} on provider ${provider.name}`);\r\n return null;\r\n }\r\n return { provider, model, allProviders };\r\n }\r\n\r\n // Interactive provider + model selection\r\n const providerOptions = [\r\n {\r\n value: AGY_FAVORITES_PROVIDER_ID,\r\n label: pc.cyan(AGY_FAVORITES_PROVIDER_LABEL),\r\n hint: `${prefs.antigravityCliFavoriteModels?.length ?? 0}/6 saved · manage with anygate favorites --agy`,\r\n },\r\n ...allProviders.map(lp => providerSelectOption(lp)),\r\n ];\r\n\r\n const initialProvider =\r\n prefs.lastAntigravityProvider && providerOptions.some(o => o.value === prefs.lastAntigravityProvider)\r\n ? prefs.lastAntigravityProvider\r\n : providerOptions[0]!.value;\r\n\r\n const conflicts = detectConflicts();\r\n\r\n let currentInitialProvider = initialProvider;\r\n while (true) {\r\n const chosen = await p.select<string>({\r\n message: 'Which provider?',\r\n options: providerOptions,\r\n initialValue: currentInitialProvider,\r\n });\r\n\r\n if (p.isCancel(chosen)) {\r\n p.cancel('Cancelled.');\r\n return null;\r\n }\r\n\r\n if (chosen === AGY_FAVORITES_PROVIDER_ID) {\r\n const favoriteSelection = await pickAntigravityCliFavoriteLaunchModel(\r\n prefs.antigravityCliFavoriteModels ?? [],\r\n allProviders,\r\n );\r\n if (!favoriteSelection) {\r\n currentInitialProvider = AGY_FAVORITES_PROVIDER_ID;\r\n continue;\r\n }\r\n return { ...favoriteSelection, allProviders };\r\n }\r\n\r\n const activeProvider = allProviders.find(lp => lp.id === chosen)!;\r\n const pickedModelResult = await pickLocalModel(activeProvider, conflicts, prefs);\r\n if (pickedModelResult === 'back') {\r\n currentInitialProvider = activeProvider.id;\r\n continue;\r\n }\r\n if (!pickedModelResult) return null;\r\n\r\n return { provider: activeProvider, model: pickedModelResult, allProviders };\r\n }\r\n}\r\n\r\nasync function resolveAndBuildRoutes(\r\n provider: LocalProvider,\r\n model: LocalProviderModel,\r\n allProviders: LocalProvider[],\r\n prefs: UserPreferences,\r\n opts: {\r\n maxRoutes: number;\r\n validatedSlotCount: number;\r\n pauseForCapacityWarning: boolean;\r\n childArgs: string[];\r\n },\r\n): Promise<{ routes: ReturnType<typeof buildAntigravityRoutes>; apiKey: string } | null> {\r\n const result = await resolveAntigravityLaunchRoutes({\r\n provider,\r\n model,\r\n allProviders,\r\n favorites: prefs.antigravityCliFavoriteModels ?? [],\r\n maxRoutes: opts.maxRoutes,\r\n });\r\n if (!result) {\r\n p.log.error(`No credential for ${provider.name}. Run: anygate providers auth ${provider.id} or add an API key.`);\r\n return null;\r\n }\r\n\r\n if (result.routes.length > 1) {\r\n p.log.info(\r\n `Favorites mode active — Antigravity picker will show ${result.routes.length} models.`,\r\n );\r\n p.log.info('Edit with `anygate favorites --agy`.');\r\n }\r\n if (result.droppedFavorites.length > 0) {\r\n p.log.warn(\r\n `Skipped ${result.droppedFavorites.length} stale/unauthorized favorite(s): `\r\n + result.droppedFavorites.map(fav => `${fav.providerId}:${fav.modelId}`).join(', '),\r\n );\r\n }\r\n if (result.capacitySkippedFavorites.length > 0) {\r\n p.log.warn(formatAgyCapacityWarning(opts.validatedSlotCount, result.capacitySkippedFavorites.length));\r\n p.log.warn(\r\n 'Not exposed: '\r\n + result.capacitySkippedFavorites.map(fav => `${fav.providerId}:${fav.modelId}`).join(', '),\r\n );\r\n\r\n if (\r\n opts.pauseForCapacityWarning\r\n && isInteractiveTerminal()\r\n && !agyArgsAreNonInteractive(opts.childArgs)\r\n ) {\r\n const proceed = await p.confirm({\r\n message: 'Continue with the validated AGY switch catalog?',\r\n initialValue: true,\r\n });\r\n if (p.isCancel(proceed) || !proceed) {\r\n p.cancel('Cancelled.');\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n return { routes: result.routes, apiKey: result.apiKey };\r\n}\r\n\r\nfunction waitForShutdown(): Promise<'sigint' | 'sigterm' | 'sighup'> {\r\n return new Promise(resolve => {\r\n const cleanup = (): void => {\r\n process.removeListener('SIGINT', onSigint);\r\n process.removeListener('SIGTERM', onSigterm);\r\n process.removeListener('SIGHUP', onSighup);\r\n };\r\n const onSigint = (): void => { cleanup(); resolve('sigint'); };\r\n const onSigterm = (): void => { cleanup(); resolve('sigterm'); };\r\n const onSighup = (): void => { cleanup(); resolve('sighup'); };\r\n process.once('SIGINT', onSigint);\r\n process.once('SIGTERM', onSigterm);\r\n process.once('SIGHUP', onSighup);\r\n });\r\n}\r\n\r\n\r\nasync function runAntigravityCommand(\r\n intro: string,\r\n tracePrefix: string,\r\n trace: boolean,\r\n boot: { launchProvider?: string; launchModel?: string } | undefined,\r\n launch: (env: NodeJS.ProcessEnv, routes: ReturnType<typeof buildAntigravityRoutes>, gatewayHandle: CloudCodeGatewayHandle) => Promise<number>,\r\n opts: {\r\n childArgs?: string[];\r\n versionGuard?: boolean;\r\n pauseForCapacityWarning?: boolean;\r\n } = {},\r\n): Promise<number> {\r\n const prefs = loadPreferences();\r\n\r\n gateIntro(intro);\r\n if (\r\n tracePrefix === 'agy'\r\n && (prefs.favoriteModels?.length ?? 0) > 0\r\n && (prefs.antigravityCliFavoriteModels?.length ?? 0) === 0\r\n && !prefs.antigravityCliFavoritesHintShown\r\n ) {\r\n p.log.info('Tip: AGY uses its own favorites list. Run `anygate favorites --agy` to set up switching.');\r\n savePreferences({ antigravityCliFavoritesHintShown: true });\r\n }\r\n\r\n const selection = await resolveAntigravityLaunch(prefs, boot);\r\n if (!selection) return 1;\r\n\r\n const { provider, model, allProviders } = selection;\r\n\r\n const versionResult = opts.versionGuard\r\n ? readAntigravityCliVersion()\r\n : { version: '1.0.10' };\r\n const compatibility = evaluateAgySwitchCompatibility({\r\n version: versionResult.version,\r\n versionReadError: 'error' in versionResult ? versionResult.error : undefined,\r\n fixture: catalogFixtureRaw as unknown as CatalogFixture,\r\n });\r\n for (const warning of compatibility.warnings) {\r\n p.log.warn(warning);\r\n }\r\n\r\n const routeLimit = compatibility.mode === 'multi-model'\r\n ? compatibility.validatedSwitchSlotCount\r\n : 1;\r\n const routeResult = await resolveAndBuildRoutes(provider, model, allProviders, prefs, {\r\n maxRoutes: routeLimit,\r\n validatedSlotCount: routeLimit,\r\n pauseForCapacityWarning: opts.pauseForCapacityWarning ?? false,\r\n childArgs: opts.childArgs ?? [],\r\n });\r\n if (!routeResult) return 1;\r\n\r\n savePreferences({\r\n lastAntigravityProvider: provider.id,\r\n lastAntigravityModel: model.id,\r\n });\r\n\r\n const traceLogPath = `/tmp/anygate-${tracePrefix}-trace-${Date.now()}.log`;\r\n const logFn = trace ? (msg: string) => { try { appendFileSync(traceLogPath, `${msg}\\n`); } catch {} } : undefined;\r\n\r\n let gatewayHandle: CloudCodeGatewayHandle;\r\n try {\r\n gatewayHandle = await startCloudCodeGateway(routeResult.routes, { trace, logFn });\r\n } catch (err) {\r\n p.log.error(`Failed to start Cloud Code gateway: ${err}`);\r\n return 1;\r\n }\r\n\r\n p.log.info(`Cloud Code gateway on ${pc.cyan(`127.0.0.1:${gatewayHandle.port}`)}`);\r\n p.log.success(`Active model: ${formatModelLabel(model)} ${pc.dim('via')} ${provider.name}`);\r\n if (trace) p.log.info(`Gateway trace → ${pc.dim(traceLogPath)}`);\r\n\r\n gateOutro('Launching', `${formatModelLabel(model)} (${provider.name})`);\r\n\r\n try {\r\n const cleanEnv = buildAntigravityChildEnv(gatewayHandle.url);\r\n return await launch(cleanEnv, routeResult.routes, gatewayHandle);\r\n } finally {\r\n await gatewayHandle.close();\r\n }\r\n}\r\n\r\nexport async function runAgyCommand(\r\n childArgs: string[],\r\n trace = false,\r\n boot?: { launchProvider?: string; launchModel?: string },\r\n): Promise<number> {\r\n return runAntigravityCommand(\r\n 'anygate agy — Antigravity CLI', 'agy', trace, boot,\r\n (env, routes) => launchAntigravityCli(env, buildAgyLaunchArgs(routes[0]!.displayName, childArgs)),\r\n { childArgs, versionGuard: true, pauseForCapacityWarning: true },\r\n );\r\n}\r\n\r\nexport async function runAntigravityAppCommand(\r\n childArgs: string[],\r\n trace = false,\r\n boot?: { launchProvider?: string; launchModel?: string },\r\n): Promise<number> {\r\n return runAntigravityCommand(\r\n 'anygate antigravity — Antigravity app', 'antigravity', trace, boot,\r\n async (env, _routes, gatewayHandle) => {\r\n const profileDir = join(homedir(), '.anygate', 'antigravity', 'app-profile');\r\n if (isAntigravityAppRunning(profileDir)) {\r\n const restart = await p.confirm({\r\n message: 'Restart Antigravity to apply this Gateway gateway?',\r\n initialValue: true,\r\n });\r\n if (p.isCancel(restart) || !restart) {\r\n p.log.info('Quit and reopen Antigravity when you are ready for the new gateway to take effect.');\r\n return 0;\r\n }\r\n quitAntigravityAppGracefully();\r\n if (!(await waitForAntigravityAppQuit(profileDir))) {\r\n forceQuitAntigravityApp(profileDir);\r\n await waitForAntigravityAppQuit(profileDir);\r\n }\r\n }\r\n\r\n const launchCode = await launchAntigravityApp(env, profileDir, gatewayHandle.url, childArgs);\r\n if (launchCode !== 0) return launchCode;\r\n\r\n p.log.info('Antigravity is using the Gateway Cloud Code gateway.');\r\n p.log.info(pc.cyan('Press Ctrl+C to stop the gateway.'));\r\n await waitForShutdown();\r\n await new Promise(r => setTimeout(r, SHUTDOWN_DRAIN_MS));\r\n console.log('');\r\n p.log.step('Gateway stopped.');\r\n const shouldClose = await p.confirm({\r\n message: 'Close Antigravity?',\r\n initialValue: true,\r\n });\r\n if (!p.isCancel(shouldClose) && shouldClose) {\r\n p.log.step('Stopping Antigravity...');\r\n quitAntigravityAppGracefully();\r\n if (!(await waitForAntigravityAppQuit(profileDir))) {\r\n forceQuitAntigravityApp(profileDir);\r\n await waitForAntigravityAppQuit(profileDir);\r\n }\r\n }\r\n return 0;\r\n },\r\n { childArgs, versionGuard: false, pauseForCapacityWarning: false },\r\n );\r\n}\r\n\r\nexport async function runAntigravityIdeCommand(\r\n childArgs: string[],\r\n trace = false,\r\n boot?: { launchProvider?: string; launchModel?: string },\r\n): Promise<number> {\r\n return runAntigravityCommand(\r\n 'anygate antigravity-ide — Antigravity IDE', 'ide', trace, boot,\r\n async (env, _routes, gatewayHandle) => {\r\n const profileDir = join(homedir(), '.anygate', 'antigravity', 'profile');\r\n if (isAntigravityIdeRunning(profileDir)) {\r\n const restart = await p.confirm({\r\n message: 'Restart Antigravity IDE to apply this Gateway gateway?',\r\n initialValue: true,\r\n });\r\n if (p.isCancel(restart) || !restart) {\r\n p.log.info('Quit and reopen Antigravity IDE when you are ready for the new gateway to take effect.');\r\n return 0;\r\n }\r\n quitAntigravityIdeGracefully();\r\n if (!(await waitForAntigravityIdeQuit(profileDir))) {\r\n forceQuitAntigravityIde(profileDir);\r\n await waitForAntigravityIdeQuit(profileDir);\r\n }\r\n }\r\n\r\n const launchCode = await launchAntigravityIde(env, profileDir, gatewayHandle.url, childArgs);\r\n if (launchCode !== 0) return launchCode;\r\n\r\n p.log.info('Antigravity IDE is using the Gateway Cloud Code gateway.');\r\n p.log.info(pc.cyan('Press Ctrl+C to stop the gateway.'));\r\n await waitForShutdown();\r\n await new Promise(r => setTimeout(r, SHUTDOWN_DRAIN_MS));\r\n console.log('');\r\n p.log.step('Gateway stopped.');\r\n const shouldClose = await p.confirm({\r\n message: 'Close Antigravity IDE?',\r\n initialValue: true,\r\n });\r\n if (!p.isCancel(shouldClose) && shouldClose) {\r\n p.log.step('Stopping Antigravity IDE...');\r\n quitAntigravityIdeGracefully();\r\n if (!(await waitForAntigravityIdeQuit(profileDir))) {\r\n forceQuitAntigravityIde(profileDir);\r\n await waitForAntigravityIdeQuit(profileDir);\r\n }\r\n }\r\n return 0;\r\n },\r\n { childArgs, versionGuard: false, pauseForCapacityWarning: false },\r\n );\r\n}\r\n","import http from 'node:http';\r\nimport { streamText, generateText } from 'ai';\r\nimport {\r\n createLanguageModel,\r\n deepMergeProviderOptions,\r\n effortProviderOptions,\r\n maxToolsForNpm,\r\n thinkingProviderOptions,\r\n} from '../provider-factory.js';\r\nimport { silenceSdkWarnings } from '../sdk-adapter.js';\r\nimport { formatUpstreamError } from '../../core/errors.js';\r\nimport { readBody } from '../../core/http-utils.js';\r\nimport { translateRequest, type TranslateRequestOptions } from './request-adapter.js';\r\nimport { formatCloudCodeChunk, mapFinishReason, normalizeFunctionCallArgs } from './response-adapter.js';\r\nimport { applyClaudeCodeOAuthIdentity } from '../../oauth/claude-code-identity.js';\r\nimport { ANTIGRAVITY_BASE_URLS } from '../../oauth/antigravity-oauth.js';\r\nimport type { AntigravityRoute, CatalogFixture } from './types.js';\r\nimport {\r\n injectGatewayModels,\r\n resolveGateCatalogSlots,\r\n buildListModelConfigsResponse,\r\n buildListExperimentsResponse,\r\n} from './catalog.js';\r\nimport loadCodeAssistFixture from './fixtures/loadCodeAssist.json' with { type: 'json' };\r\nimport catalogFixtureRaw from './fixtures/fetchAvailableModels.json' with { type: 'json' };\r\n\r\nexport interface CloudCodeGatewayHandle {\r\n port: number;\r\n url: string;\r\n close: () => Promise<void>;\r\n}\r\n\r\nexport interface GatewayOptions {\r\n templateKey?: string;\r\n trace?: boolean;\r\n /** Experimental: route intent helpers to the last observed selected user-turn slot. */\r\n trackActiveRoute?: boolean;\r\n /** When trace is enabled, all gateway log lines are written here instead of stdout/stderr. */\r\n logFn?: (msg: string) => void;\r\n}\r\n\r\ntype HelperRoutePolicy = 'launch' | 'launch-or-active';\r\n\r\nconst HELPER_ROUTE_POLICIES = new Map<string, HelperRoutePolicy>([\r\n ['gemini-2.5-flash', 'launch-or-active'],\r\n ['gemini-2.5-flash-lite', 'launch'],\r\n ['gemini-3-flash-agent', 'launch'],\r\n ['gemini-3.1-flash-lite', 'launch'],\r\n]);\r\n\r\nconst MAX_REASONING_ECHOES_PER_CONVERSATION = 20;\r\n\r\nfunction isCloudCodeOAuthRoute(route: AntigravityRoute): boolean {\r\n return route.providerId === 'antigravity' && route.authType === 'oauth' && route.modelFormat === 'cloud-code';\r\n}\r\n\r\nfunction isUserTurnRequest(parsed: Record<string, unknown> | undefined): boolean {\r\n return typeof parsed?.requestId === 'string' && parsed.requestId.startsWith('agent/');\r\n}\r\n\r\n/**\r\n * Start a local Cloud Code gateway on 127.0.0.1 with a random port.\r\n *\r\n * Serves:\r\n * - loadCodeAssist → from local fixture (no Google contact)\r\n * - fetchAvailableModels → local catalog with injected gateway models\r\n * - streamGenerateContent (gateway models) → translated via Vercel AI SDK (streaming)\r\n * - generateContent (gateway models) → translated via Vercel AI SDK (unary)\r\n * - Non-gateway model requests → 403 rejected\r\n * - Other endpoints → empty 200 (permissive)\r\n *\r\n * URL matching is case-insensitive to support both REST-style paths\r\n * (/v1internal:loadCodeAssist) and Connect-style paths\r\n * (/google.internal.cloud.code.v1internal.CloudCode/LoadCodeAssist).\r\n */\r\nexport async function startCloudCodeGateway(\r\n routes: AntigravityRoute[],\r\n opts: GatewayOptions = {},\r\n): Promise<CloudCodeGatewayHandle> {\r\n silenceSdkWarnings();\r\n const templateKey = opts.templateKey ?? 'gemini-3.5-flash-low';\r\n const trace = opts.trace ?? false;\r\n const trackActiveRoute = opts.trackActiveRoute ?? false;\r\n const log = opts.logFn ?? (() => {});\r\n\r\n const catalogFixture = catalogFixtureRaw as unknown as CatalogFixture;\r\n const injectedCatalog = injectGatewayModels(catalogFixture, routes, templateKey);\r\n\r\n const selectedSlotRoutes = resolveGateCatalogSlots(injectedCatalog, routes, templateKey);\r\n const selectedSlotIds = new Set<string>();\r\n const routeMap = new Map<string, AntigravityRoute>();\r\n const reasoningEchoesByConversation = new Map<string, string[]>();\r\n for (const { slotId, route } of selectedSlotRoutes) {\r\n selectedSlotIds.add(slotId);\r\n routeMap.set(slotId, route);\r\n routeMap.set(route.catalogId, route);\r\n }\r\n\r\n let activeRoute: AntigravityRoute | undefined;\r\n const launchRoute = selectedSlotRoutes[0]?.route ?? routes[0];\r\n const resolveRouteForModel = (model: string | undefined): AntigravityRoute | undefined => {\r\n if (!model) return undefined;\r\n const directRoute = routeMap.get(model);\r\n if (directRoute) return directRoute;\r\n const helperPolicy = HELPER_ROUTE_POLICIES.get(model);\r\n if (!helperPolicy || !launchRoute) return undefined;\r\n if (helperPolicy === 'launch-or-active' && trackActiveRoute && activeRoute) {\r\n return activeRoute;\r\n }\r\n return launchRoute;\r\n };\r\n\r\n // Pre-compute provider options per route (cheap, stateless; createLanguageModel called per-request\r\n // so credentials are always fresh — required for short-lived OAuth tokens)\r\n const providerOptionsCache = new Map<string, any>();\r\n for (const route of routes) {\r\n providerOptionsCache.set(\r\n route.catalogId,\r\n deepMergeProviderOptions(\r\n thinkingProviderOptions(route.npm),\r\n effortProviderOptions(route.npm, 'high', route.upstreamModelId),\r\n ),\r\n );\r\n }\r\n\r\n\r\n // Pre-compute invariant endpoint responses (routes don't change after startup)\r\n const experimentsResponse = buildListExperimentsResponse();\r\n const modelConfigsResponse = buildListModelConfigsResponse(routes, injectedCatalog, templateKey);\r\n const userSettings = {\r\n telemetryEnabled: false,\r\n userDataCollectionForceDisabled: true,\r\n marketingEmailsEnabled: false,\r\n };\r\n\r\n const server = http.createServer((req, res) => {\r\n readBody(req).then((bodyStr) => {\r\n const url = req.url || '';\r\n const method = req.method || 'GET';\r\n const contentType = (req.headers['content-type'] ?? '').toLowerCase();\r\n const lowerUrl = url.toLowerCase();\r\n\r\n if (trace) {\r\n log(`[gateway] ${method} ${url}`);\r\n log(`[gateway] content-type: ${contentType}`);\r\n log(`[gateway] body-size: ${bodyStr.length}`);\r\n }\r\n\r\n // --- Reject protobuf/grpc binary content types early ---\r\n if (contentType.includes('proto') || (contentType.includes('grpc') && !contentType.includes('json'))) {\r\n log(`[gateway] UNSUPPORTED content-type: ${contentType}`);\r\n respondJson(res, 415, {\r\n error: {\r\n code: 415,\r\n message: `Gateway only supports JSON. Received: ${contentType}`,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n let parsed: Record<string, unknown> | undefined;\r\n try { parsed = JSON.parse(bodyStr) as Record<string, unknown>; } catch {}\r\n\r\n if (trace && parsed) {\r\n const preview = JSON.stringify(parsed).slice(0, 500);\r\n log(`[gateway] body-preview: ${preview}`);\r\n }\r\n\r\n // --- loadCodeAssist ---\r\n if (lowerUrl.includes('loadcodeassist')) {\r\n if (trace) log('[gateway] → loadCodeAssist');\r\n // No cascadeModelConfigData — the real Google API doesn't return it here.\r\n // The LS resolves cascade config internally from model registry + experiments.\r\n respondJson(res, 200, loadCodeAssistFixture);\r\n return;\r\n }\r\n\r\n // --- fetchAvailableModels / GetAvailableModels ---\r\n if (lowerUrl.includes('fetchavailablemodels') || lowerUrl.includes('getavailablemodels')) {\r\n if (trace) log('[gateway] → fetchAvailableModels');\r\n respondJson(res, 200, injectedCatalog);\r\n return;\r\n }\r\n\r\n // --- listModelConfigs / GetCascadeModelConfigs / GetCommandModelConfigs ---\r\n if (lowerUrl.includes('modelconfigs')) {\r\n if (trace) log('[gateway] → listModelConfigs');\r\n respondJson(res, 200, modelConfigsResponse);\r\n return;\r\n }\r\n\r\n // --- GenerateContent / GenerateChat (streaming and unary) ---\r\n if (lowerUrl.includes('generatecontent') || lowerUrl.includes('generatechat')) {\r\n const model = parsed?.model as string | undefined;\r\n if (trace) log(`[gateway] extracted model: ${model ?? 'N/A'}`);\r\n\r\n const route = resolveRouteForModel(model);\r\n if (route) {\r\n if (trackActiveRoute && selectedSlotIds.has(model ?? '') && isUserTurnRequest(parsed)) {\r\n activeRoute = route;\r\n if (trace) log(`[gateway] active route: ${route.catalogId} via ${model}`);\r\n }\r\n if (isCloudCodeOAuthRoute(route)) {\r\n handleCloudCodeForwardRequest(res, route, parsed as Record<string, unknown>, lowerUrl, log).catch(err => {\r\n log(`[gateway] cloud-code forward error: ${err instanceof Error ? err.stack || err.message : String(err)}`);\r\n if (!res.headersSent) {\r\n respondJson(res, 500, { error: { code: 500, message: formatUpstreamError(err) } });\r\n } else if (!res.writableEnded) {\r\n res.end();\r\n }\r\n });\r\n return;\r\n }\r\n const baseProviderOptions = providerOptionsCache.get(route.catalogId);\r\n const isStream = lowerUrl.includes('stream');\r\n const conversationKey = conversationKeyFromRequest(parsed);\r\n const requestOptions = reasoningEchoOptionsForRoute(route, parsed, reasoningEchoesByConversation);\r\n const rememberReasoning = (reasoning: string) => {\r\n if (!shouldEchoReasoningForRoute(route)) return;\r\n rememberReasoningEcho(reasoningEchoesByConversation, conversationKey, reasoning);\r\n };\r\n\r\n if (isStream) {\r\n handleStreamingRequest(res, route, baseProviderOptions, parsed as any, log, {\r\n requestOptions,\r\n onReasoningWithToolCall: rememberReasoning,\r\n }).catch(err => {\r\n log(`[gateway] stream error: ${err instanceof Error ? err.stack || err.message : String(err)}`);\r\n if (!res.headersSent) {\r\n respondJson(res, 500, { error: { code: 500, message: formatUpstreamError(err) } });\r\n } else if (!res.writableEnded) {\r\n res.end();\r\n }\r\n });\r\n } else {\r\n handleUnaryRequest(res, route, baseProviderOptions, parsed as any, log, {\r\n requestOptions,\r\n onReasoningWithToolCall: rememberReasoning,\r\n }).catch(err => {\r\n log(`[gateway] unary error: ${err instanceof Error ? err.stack || err.message : String(err)}`);\r\n if (!res.headersSent) {\r\n respondJson(res, 500, { error: { code: 500, message: formatUpstreamError(err) } });\r\n }\r\n });\r\n }\r\n return;\r\n }\r\n\r\n respondJson(res, 403, {\r\n error: {\r\n code: 403,\r\n message: `Non-anygate model \"${model ?? 'unknown'}\" rejected in privacy mode`,\r\n },\r\n });\r\n return;\r\n }\r\n\r\n // --- Known endpoints with minimal local responses ---\r\n if (lowerUrl.includes('fetchadmincontrols')) {\r\n respondJson(res, 200, {});\r\n return;\r\n }\r\n if (lowerUrl.includes('userquota')) {\r\n respondJson(res, 200, { quotaSummary: { remainingQueries: 9999, totalQueries: 9999, quotaType: 'GATEWAY_UNLIMITED' } });\r\n return;\r\n }\r\n if (lowerUrl.includes('userinfo')) {\r\n respondJson(res, 200, {\r\n userSettings,\r\n regionCode: 'US',\r\n });\r\n return;\r\n }\r\n if (lowerUrl.includes('usersettings')) {\r\n respondJson(res, 200, { userSettings });\r\n return;\r\n }\r\n if (lowerUrl.includes('experiments') || lowerUrl.includes('experimentstatus')) {\r\n respondJson(res, 200, experimentsResponse);\r\n return;\r\n }\r\n if (lowerUrl.includes('onboarduser')) {\r\n respondJson(res, 200, {\r\n name: 'operations/cmpf.DONE_OPERATION',\r\n done: true,\r\n response: {\r\n '@type': 'type.googleapis.com/google.internal.cloud.code.v1internal.OnboardUserResponse',\r\n cloudaicompanionProject: {\r\n id: 'anygate-local-project',\r\n name: 'anygate-local-project',\r\n projectNumber: '0',\r\n },\r\n status: {\r\n statusCode: 'NOTICE',\r\n displayMessage: \"You've successfully connected your Google Account and can now get started with Gemini Code Assist\",\r\n messageTitle: 'Welcome to Gemini Code Assist',\r\n },\r\n },\r\n });\r\n return;\r\n }\r\n if (lowerUrl.includes('record') || lowerUrl.includes('feedback') || lowerUrl.includes('metrics')) {\r\n respondJson(res, 200, {});\r\n return;\r\n }\r\n if (lowerUrl.includes('snippet')) {\r\n respondJson(res, 200, { snippets: [] });\r\n return;\r\n }\r\n if (lowerUrl.includes('cascadenux') || lowerUrl.includes('listcascade')) {\r\n respondJson(res, 200, { cascadeNuxes: [] });\r\n return;\r\n }\r\n if (lowerUrl.includes('denylist') || lowerUrl.includes('checkurl')) {\r\n respondJson(res, 200, { denied: false });\r\n return;\r\n }\r\n if (lowerUrl.includes('plugin')) {\r\n respondJson(res, 200, { plugins: [] });\r\n return;\r\n }\r\n if (lowerUrl.includes('counttokens')) {\r\n respondJson(res, 200, { tokenCount: 0, totalTokens: 0 });\r\n return;\r\n }\r\n if (lowerUrl.includes('listremote') || lowerUrl.includes('listcloudai') || lowerUrl.includes('companionproject')) {\r\n respondJson(res, 200, { projects: [] });\r\n return;\r\n }\r\n if (lowerUrl.includes('upgrade')) {\r\n respondJson(res, 200, {});\r\n return;\r\n }\r\n\r\n // --- Health check ---\r\n if (url === '/' || lowerUrl.includes('health')) {\r\n respondJson(res, 200, { status: 'ok' });\r\n return;\r\n }\r\n\r\n // --- Unknown endpoints — permissive empty 200 ---\r\n if (trace) {\r\n log(`[gateway] unknown endpoint: ${url}`);\r\n }\r\n respondJson(res, 200, {});\r\n }).catch(err => {\r\n respondJson(res, 400, { error: { code: 400, message: `Failed to read request: ${err instanceof Error ? err.message : String(err)}` } });\r\n });\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n server.on('error', reject);\r\n server.listen(0, '127.0.0.1', () => {\r\n const addr = server.address();\r\n if (addr && typeof addr === 'object') {\r\n const port = addr.port;\r\n resolve({\r\n port,\r\n url: `http://127.0.0.1:${port}`,\r\n close: () => new Promise<void>((res, rej) => {\r\n server.closeAllConnections();\r\n server.close(err => { const code = (err as any)?.code; if (err && code !== \"ERR_SERVER_NOT_RUNNING\") { rej(err); } else { res(); } });\r\n }),\r\n });\r\n } else {\r\n reject(new Error('Failed to get server address'));\r\n }\r\n });\r\n });\r\n}\r\n\r\n\r\n\r\nfunction reasoningDeltaText(part: Record<string, unknown>): string {\r\n return String(part.text ?? part.textDelta ?? part.delta ?? '');\r\n}\r\n\r\nfunction reasoningOutputText(reasoning: unknown): string {\r\n if (typeof reasoning === 'string') return reasoning;\r\n if (Array.isArray(reasoning)) {\r\n return reasoning.map(item => {\r\n if (typeof item === 'string') return item;\r\n if (item && typeof item === 'object' && 'text' in item) {\r\n return String((item as { text?: unknown }).text ?? '');\r\n }\r\n return '';\r\n }).filter(Boolean).join('');\r\n }\r\n if (reasoning && typeof reasoning === 'object' && 'text' in reasoning) {\r\n return String((reasoning as { text?: unknown }).text ?? '');\r\n }\r\n return '';\r\n}\r\n\r\nfunction conversationKeyFromRequest(parsed: Record<string, unknown> | undefined): string {\r\n const requestId = typeof parsed?.requestId === 'string' ? parsed.requestId : '';\r\n const segments = requestId.split('/');\r\n if (segments.length >= 2 && segments[0] && segments[1]) {\r\n return `${segments[0]}/${segments[1]}`;\r\n }\r\n return 'global';\r\n}\r\n\r\nfunction shouldEchoReasoningForRoute(route: AntigravityRoute): boolean {\r\n if (route.npm !== '@ai-sdk/openai-compatible') return false;\r\n const routeIdentity = [\r\n route.providerId,\r\n route.providerName,\r\n route.catalogId,\r\n route.modelId,\r\n route.upstreamModelId,\r\n route.displayName,\r\n route.baseURL,\r\n ].join(' ');\r\n return /deepseek/i.test(routeIdentity);\r\n}\r\n\r\nfunction reasoningEchoOptionsForRoute(\r\n route: AntigravityRoute,\r\n parsed: Record<string, unknown> | undefined,\r\n cache: Map<string, string[]>,\r\n): TranslateRequestOptions {\r\n if (!shouldEchoReasoningForRoute(route)) return {};\r\n const existing = cache.get(conversationKeyFromRequest(parsed));\r\n return existing?.length ? { fallbackAssistantReasoning: existing } : {};\r\n}\r\n\r\nfunction rememberReasoningEcho(cache: Map<string, string[]>, key: string, reasoning: string): void {\r\n const normalized = reasoning.trim();\r\n if (!normalized) return;\r\n const existing = cache.get(key) ?? [];\r\n existing.push(normalized);\r\n cache.set(key, existing.slice(-MAX_REASONING_ECHOES_PER_CONVERSATION));\r\n}\r\n\r\nasync function handleCloudCodeForwardRequest(\r\n res: http.ServerResponse,\r\n route: AntigravityRoute,\r\n parsed: Record<string, unknown>,\r\n lowerUrl: string,\r\n log: (msg: string) => void,\r\n): Promise<void> {\r\n const projectId = typeof route.providerData?.projectId === 'string' ? route.providerData.projectId : '';\r\n if (!projectId) {\r\n respondJson(res, 500, {\r\n error: {\r\n code: 500,\r\n message: 'Antigravity provider missing projectId — re-authenticate with anygate providers auth antigravity',\r\n },\r\n });\r\n return;\r\n }\r\n\r\n const upstreamBody = {\r\n ...parsed,\r\n project: projectId,\r\n model: route.upstreamModelId,\r\n };\r\n const baseUrl = (route.baseURL || ANTIGRAVITY_BASE_URLS[0]!).replace(/\\/+$/, '');\r\n const endpoint = lowerUrl.includes('stream')\r\n ? `${baseUrl}/v1internal:streamGenerateContent?alt=sse`\r\n : `${baseUrl}/v1internal:generateContent`;\r\n\r\n const upstream = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${route.apiKey}`,\r\n 'User-Agent': 'vscode/1.X.X (Antigravity/4.2.0)',\r\n },\r\n body: JSON.stringify(upstreamBody),\r\n });\r\n\r\n if (!upstream.ok) {\r\n const errBody = await upstream.text();\r\n log(`[gateway] cloud-code upstream error ${upstream.status}: ${errBody}`);\r\n respondJson(res, upstream.status >= 500 ? 502 : upstream.status, {\r\n error: { code: upstream.status, message: errBody || upstream.statusText },\r\n });\r\n return;\r\n }\r\n\r\n if (lowerUrl.includes('stream')) {\r\n res.writeHead(200, {\r\n 'content-type': upstream.headers.get('content-type') ?? 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n 'grpc-status': '0',\r\n });\r\n if (!upstream.body) {\r\n res.end();\r\n return;\r\n }\r\n for await (const chunk of upstream.body as any) {\r\n res.write(chunk);\r\n }\r\n res.end();\r\n return;\r\n }\r\n\r\n const body = await upstream.text();\r\n res.writeHead(200, {\r\n 'content-type': upstream.headers.get('content-type') ?? 'application/json',\r\n 'content-length': String(Buffer.byteLength(body)),\r\n 'grpc-status': '0',\r\n });\r\n res.end(body);\r\n}\r\n\r\ninterface RequestHandlerOptions {\r\n requestOptions?: TranslateRequestOptions;\r\n onReasoningWithToolCall?: (reasoning: string) => void;\r\n}\r\n\r\nfunction emitThinkingDelta(\r\n res: http.ServerResponse,\r\n route: AntigravityRoute,\r\n responseId: string,\r\n text: string,\r\n startSse: () => void,\r\n): void {\r\n if (!text) return;\r\n startSse();\r\n const chunk = formatCloudCodeChunk({\r\n thought: text,\r\n modelVersion: route.catalogId,\r\n responseId,\r\n });\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n}\r\n\r\n/** Returns the length of the longest suffix of `text` that is also a prefix of `tag`. */\r\nfunction trailingPartial(text: string, tag: string): number {\r\n for (let len = Math.min(tag.length - 1, text.length); len > 0; len--) {\r\n if (text.endsWith(tag.slice(0, len))) return len;\r\n }\r\n return 0;\r\n}\r\n\r\n/**\r\n * Creates a per-request filter that extracts inline `<think>...</think>` blocks\r\n * from streamed text deltas (e.g. NVidia-hosted Kimi K2.6) and routes them as\r\n * thought content. Handles `<think>`/`</think>` tags split across chunk boundaries.\r\n */\r\nfunction createThinkFilter(): (chunk: string) => { thought: string; text: string } {\r\n let state: 'scanning' | 'inside' | 'passthrough' = 'scanning';\r\n let partial = '';\r\n return function processChunk(chunk: string): { thought: string; text: string } {\r\n if (state === 'passthrough') return { thought: '', text: chunk };\r\n let src = partial + chunk;\r\n partial = '';\r\n let thought = '';\r\n let text = '';\r\n while (src.length > 0) {\r\n if (state === 'scanning') {\r\n const idx = src.indexOf('<think>');\r\n if (idx === -1) {\r\n const len = trailingPartial(src, '<think>');\r\n text += src.slice(0, src.length - len);\r\n if (len > 0) { partial = src.slice(src.length - len); } else { state = 'passthrough'; }\r\n break;\r\n }\r\n text += src.slice(0, idx);\r\n src = src.slice(idx + 7);\r\n state = 'inside';\r\n } else {\r\n const idx = src.indexOf('</think>');\r\n if (idx === -1) {\r\n const len = trailingPartial(src, '</think>');\r\n thought += src.slice(0, src.length - len);\r\n if (len > 0) partial = src.slice(src.length - len);\r\n break;\r\n }\r\n thought += src.slice(0, idx);\r\n src = src.slice(idx + 8);\r\n if (src.startsWith('\\n')) src = src.slice(1);\r\n state = 'passthrough';\r\n }\r\n }\r\n return { thought, text };\r\n };\r\n}\r\n\r\nfunction emitStreamError(\r\n res: http.ServerResponse,\r\n route: AntigravityRoute,\r\n responseId: string,\r\n message: string,\r\n startSse: () => void,\r\n): void {\r\n startSse();\r\n const chunk = formatCloudCodeChunk({\r\n text: `\\n\\n⚠ ${message}\\n`,\r\n modelVersion: route.catalogId,\r\n responseId,\r\n finishReason: 'OTHER',\r\n });\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n}\r\n\r\nfunction respondJson(res: http.ServerResponse, status: number, data: unknown): void {\r\n const body = JSON.stringify(data);\r\n res.writeHead(status, {\r\n 'content-type': 'application/json',\r\n 'content-length': String(Buffer.byteLength(body)),\r\n 'grpc-status': status < 400 ? '0' : '13',\r\n });\r\n res.end(body);\r\n}\r\n\r\n/**\r\n * Handle a streaming GenerateContent request.\r\n * Uses fullStream to support text deltas, tool call events, and finish.\r\n */\r\nasync function handleStreamingRequest(\r\n res: http.ServerResponse,\r\n route: AntigravityRoute,\r\n providerOptions: any,\r\n parsed: any,\r\n log: (msg: string) => void,\r\n options: RequestHandlerOptions = {},\r\n): Promise<void> {\r\n const sdkParams = applyClaudeCodeOAuthIdentity(route, translateRequest(parsed, {\r\n ...options.requestOptions,\r\n maxTools: maxToolsForNpm(route.npm),\r\n }));\r\n const effectiveProviderOptions = deepMergeProviderOptions(\r\n providerOptions,\r\n sdkParams.providerOptions,\r\n );\r\n const langModel = await createLanguageModel({\r\n npm: route.npm,\r\n modelId: route.upstreamModelId,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n });\r\n const responseId = `gateway-${Date.now()}`;\r\n\r\n const { fullStream } = streamText({\r\n model: langModel,\r\n system: sdkParams.system,\r\n messages: sdkParams.messages,\r\n tools: sdkParams.tools,\r\n toolChoice: sdkParams.toolChoice,\r\n providerOptions: effectiveProviderOptions as any,\r\n });\r\n\r\n const startSse = () => {\r\n if (res.headersSent) return;\r\n res.writeHead(200, {\r\n 'content-type': 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n 'grpc-status': '0',\r\n });\r\n };\r\n\r\n const thinkFilter = createThinkFilter();\r\n\r\n const toolCallBuffers = new Map<string, { name: string; json: string }>();\r\n let responseReasoning = '';\r\n let sawToolCall = false;\r\n for await (const part of fullStream) {\r\n const p = part as any;\r\n\r\n if (p.type === 'reasoning-delta' || p.type === 'reasoning') {\r\n const reasoning = reasoningDeltaText(p);\r\n responseReasoning += reasoning;\r\n emitThinkingDelta(res, route, responseId, reasoning, startSse);\r\n continue;\r\n }\r\n\r\n if (p.type === 'text-delta') {\r\n const { thought, text } = thinkFilter(reasoningDeltaText(p));\r\n if (thought) {\r\n responseReasoning += thought;\r\n emitThinkingDelta(res, route, responseId, thought, startSse);\r\n }\r\n if (text) {\r\n log(`[gateway] text-delta: ${JSON.stringify(text.slice(0, 500))}`);\r\n startSse();\r\n const chunk = formatCloudCodeChunk({\r\n text,\r\n modelVersion: route.catalogId,\r\n responseId,\r\n });\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n }\r\n } else if (p.type === 'tool-input-start') {\r\n const id = p.id ?? p.toolCallId;\r\n toolCallBuffers.set(id, { name: p.toolName, json: '' });\r\n } else if (p.type === 'tool-input-delta') {\r\n const id = p.id ?? p.toolCallId;\r\n const buf = toolCallBuffers.get(id);\r\n if (buf) buf.json += p.delta;\r\n } else if (p.type === 'tool-call') {\r\n sawToolCall = true;\r\n const id = p.toolCallId ?? p.id;\r\n const buf = toolCallBuffers.get(id);\r\n let args: Record<string, unknown> = {};\r\n try { args = buf ? JSON.parse(buf.json || '{}') : (p.input || {}); } catch { args = p.input || {}; }\r\n const name = buf ? buf.name : p.toolName;\r\n log(`[gateway] tool-call: ${name}`);\r\n startSse();\r\n const chunk = formatCloudCodeChunk({\r\n functionCall: { name, args: normalizeFunctionCallArgs(args) },\r\n modelVersion: route.catalogId,\r\n responseId,\r\n });\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n } else if (p.type === 'finish') {\r\n log(`[gateway] finish: ${p.finishReason ?? 'unknown'}`);\r\n startSse();\r\n const reason = mapFinishReason(p.finishReason ?? '');\r\n const chunk = formatCloudCodeChunk({\r\n modelVersion: route.catalogId,\r\n responseId,\r\n finishReason: reason,\r\n usage: {\r\n promptTokens: p.totalUsage?.inputTokens || 0,\r\n completionTokens: p.totalUsage?.outputTokens || 0,\r\n },\r\n });\r\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\r\n } else if (p.type === 'error') {\r\n const message = formatUpstreamError(p.error);\r\n log(`[gateway] stream provider error: ${message}`);\r\n emitStreamError(res, route, responseId, message, startSse);\r\n break;\r\n } else if (p.type === 'reasoning-start' || p.type === 'reasoning-end') {\r\n log(`[gateway] ${p.type}`);\r\n }\r\n }\r\n if (!res.headersSent) {\r\n throw new Error('Provider returned an empty stream');\r\n }\r\n if (sawToolCall && responseReasoning.trim()) {\r\n options.onReasoningWithToolCall?.(responseReasoning);\r\n }\r\n res.end();\r\n}\r\n\r\n/**\r\n * Handle a non-streaming (unary) GenerateContent request.\r\n */\r\nasync function handleUnaryRequest(\r\n res: http.ServerResponse,\r\n route: AntigravityRoute,\r\n providerOptions: any,\r\n parsed: any,\r\n _log: (msg: string) => void,\r\n options: RequestHandlerOptions = {},\r\n): Promise<void> {\r\n const sdkParams = applyClaudeCodeOAuthIdentity(route, translateRequest(parsed, {\r\n ...options.requestOptions,\r\n maxTools: maxToolsForNpm(route.npm),\r\n }));\r\n const effectiveProviderOptions = deepMergeProviderOptions(\r\n providerOptions,\r\n sdkParams.providerOptions,\r\n );\r\n const langModel = await createLanguageModel({\r\n npm: route.npm,\r\n modelId: route.upstreamModelId,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n });\r\n const responseId = `gateway-${Date.now()}`;\r\n\r\n const result = await generateText({\r\n model: langModel,\r\n system: sdkParams.system,\r\n messages: sdkParams.messages,\r\n tools: sdkParams.tools,\r\n toolChoice: sdkParams.toolChoice,\r\n providerOptions: effectiveProviderOptions as any,\r\n });\r\n\r\n const parts: any[] = [];\r\n const reasoning = reasoningOutputText(result.reasoning);\r\n if (reasoning) {\r\n parts.push({ text: reasoning, thought: true });\r\n }\r\n if (result.text) {\r\n parts.push({ text: result.text });\r\n }\r\n if (result.toolCalls?.length) {\r\n for (const tc of result.toolCalls) {\r\n parts.push({\r\n functionCall: { name: tc.toolName, args: normalizeFunctionCallArgs(tc.input as Record<string, unknown>) },\r\n });\r\n }\r\n }\r\n if (reasoning && result.toolCalls?.length) {\r\n options.onReasoningWithToolCall?.(reasoning);\r\n }\r\n if (parts.length === 0) {\r\n parts.push({ text: '' });\r\n }\r\n\r\n const response = {\r\n candidates: [{\r\n content: { role: 'model', parts },\r\n finishReason: mapFinishReason(result.finishReason ?? ''),\r\n }],\r\n usageMetadata: {\r\n promptTokenCount: result.usage?.inputTokens || 0,\r\n candidatesTokenCount: result.usage?.outputTokens || 0,\r\n totalTokenCount: (result.usage?.inputTokens || 0) + (result.usage?.outputTokens || 0),\r\n },\r\n modelVersion: route.catalogId,\r\n responseId,\r\n };\r\n\r\n respondJson(res, 200, { response, traceId: 'gateway-trace', metadata: {} });\r\n}\r\n","export interface CloudCodeChunkOptions {\r\n text?: string;\r\n thought?: string;\r\n functionCall?: { name: string; args: Record<string, unknown> };\r\n modelVersion: string;\r\n responseId: string;\r\n finishReason?: 'STOP' | 'MAX_TOKENS' | 'OTHER' | string;\r\n usage?: {\r\n promptTokens: number;\r\n completionTokens: number;\r\n };\r\n}\r\n\r\n/**\r\n * Some non-Gemini models stringify nested object/array values in tool-call\r\n * arguments instead of emitting real JSON — observed with Antigravity's generic\r\n * `call_mcp_tool` wrapper, whose `Arguments` field has no fixed schema (it has\r\n * to accept any MCP tool's parameters). Google's own Gemini reliably fills it\r\n * with a real object; third-party models often stringify it instead, which\r\n * Antigravity's MCP execution rejects. Un-stringify anything that's valid JSON\r\n * and parses to an object/array so Antigravity receives the shape it expects.\r\n */\r\nexport function normalizeFunctionCallArgs(args: Record<string, unknown>): Record<string, unknown> {\r\n const out: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(args)) {\r\n if (typeof value === 'string') {\r\n try {\r\n const parsed = JSON.parse(value);\r\n if (parsed && typeof parsed === 'object') {\r\n out[key] = parsed;\r\n continue;\r\n }\r\n } catch { /* not JSON — keep as string */ }\r\n }\r\n out[key] = value;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Map SDK finish reasons to Cloud Code format.\r\n */\r\nexport function mapFinishReason(reason: string): string {\r\n if (reason === 'stop' || reason === 'tool-calls') return 'STOP';\r\n if (reason === 'length') return 'MAX_TOKENS';\r\n if (reason === 'content-filter') return 'SAFETY';\r\n return 'OTHER';\r\n}\r\n\r\n/**\r\n * Format a text delta, function call, stop reason, and usage stats\r\n * into the Cloud Code SSE shape.\r\n */\r\nexport function formatCloudCodeChunk(opts: CloudCodeChunkOptions): Record<string, any> {\r\n const parts: any[] = [];\r\n\r\n if (opts.thought !== undefined && opts.thought !== '') {\r\n parts.push({ text: opts.thought, thought: true });\r\n }\r\n if (opts.text !== undefined && opts.text !== '') {\r\n parts.push({ text: opts.text });\r\n }\r\n if (opts.functionCall) {\r\n parts.push({ functionCall: opts.functionCall });\r\n }\r\n if (parts.length === 0 && !opts.finishReason) {\r\n parts.push({ text: '' });\r\n }\r\n\r\n const candidate: Record<string, any> = {};\r\n\r\n if (parts.length > 0) {\r\n candidate.content = {\r\n role: 'model',\r\n parts,\r\n };\r\n }\r\n\r\n if (opts.finishReason) {\r\n candidate.finishReason = opts.finishReason;\r\n }\r\n\r\n const response: Record<string, any> = {\r\n candidates: [candidate],\r\n modelVersion: opts.modelVersion,\r\n responseId: opts.responseId,\r\n };\r\n\r\n if (opts.usage) {\r\n response.usageMetadata = {\r\n promptTokenCount: opts.usage.promptTokens,\r\n candidatesTokenCount: opts.usage.completionTokens,\r\n totalTokenCount: opts.usage.promptTokens + opts.usage.completionTokens,\r\n };\r\n }\r\n\r\n return {\r\n response,\r\n traceId: 'gateway-trace',\r\n metadata: {},\r\n };\r\n}\r\n","import type { CatalogFixture } from './types.js';\r\n\r\nexport type AgySlotStatus = 'validated' | 'reserved' | 'candidate' | 'unsafe';\r\n\r\nexport type AgySlotRole =\r\n | 'agent-switch'\r\n | 'cascade-plan'\r\n | 'cascade-intent'\r\n | 'cascade-fallback'\r\n | 'cascade-checkpoint'\r\n | 'command'\r\n | 'tab'\r\n | 'chat'\r\n | 'image'\r\n | 'unknown';\r\n\r\nexport interface AgySlotDefinition {\r\n slotId: string;\r\n model: string;\r\n role: AgySlotRole;\r\n status: AgySlotStatus;\r\n validatedWith: string;\r\n notes?: string;\r\n}\r\n\r\nexport interface AgySlotValidationResult {\r\n switchSlots: AgySlotDefinition[];\r\n reservedSlots: AgySlotDefinition[];\r\n candidateSlots: AgySlotDefinition[];\r\n warnings: string[];\r\n}\r\n\r\nexport interface AgySwitchCompatibility {\r\n mode: 'multi-model' | 'single-model';\r\n validatedSwitchSlotCount: number;\r\n warnings: string[];\r\n}\r\n\r\nexport const AGY_SLOT_VALIDATION_SOURCE =\r\n 'AGY CLI 1.0.10 / Antigravity IDE 2.1.1 fixture capture 2026-06-23';\r\n\r\nconst AGY_NATIVE_SLOT_REGISTRY: AgySlotDefinition[] = [\r\n {\r\n slotId: 'gemini-3.5-flash-low',\r\n model: 'MODEL_PLACEHOLDER_M20',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gemini-3.5-flash-extra-low',\r\n model: 'MODEL_PLACEHOLDER_M187',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gemini-3.1-pro-low',\r\n model: 'MODEL_PLACEHOLDER_M36',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gemini-pro-agent',\r\n model: 'MODEL_PLACEHOLDER_M16',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'claude-sonnet-4-6',\r\n model: 'MODEL_PLACEHOLDER_M35',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'claude-opus-4-6-thinking',\r\n model: 'MODEL_PLACEHOLDER_M26',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gpt-oss-120b-medium',\r\n model: 'MODEL_OPENAI_GPT_OSS_120B_MEDIUM',\r\n role: 'agent-switch',\r\n status: 'validated',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gemini-3-flash-agent',\r\n model: 'MODEL_PLACEHOLDER_M132',\r\n role: 'cascade-plan',\r\n status: 'reserved',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Visible in agentModelSorts, but reserved for cascade plan construction.',\r\n },\r\n {\r\n slotId: 'gemini-2.5-flash',\r\n model: 'MODEL_GOOGLE_GEMINI_2_5_FLASH',\r\n role: 'cascade-intent',\r\n status: 'reserved',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gemini-2.5-flash-lite',\r\n model: 'MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE',\r\n role: 'cascade-fallback',\r\n status: 'reserved',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'gemini-3.1-pro-high',\r\n model: 'MODEL_PLACEHOLDER_M37',\r\n role: 'agent-switch',\r\n status: 'candidate',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Model-shaped fixture entry; requires live switching proof before promotion.',\r\n },\r\n {\r\n slotId: 'gemini-2.5-pro',\r\n model: 'MODEL_GOOGLE_GEMINI_2_5_PRO',\r\n role: 'agent-switch',\r\n status: 'candidate',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Model-shaped fixture entry; requires live switching proof before promotion.',\r\n },\r\n {\r\n slotId: 'gemini-2.5-flash-thinking',\r\n model: 'MODEL_GOOGLE_GEMINI_2_5_FLASH_THINKING',\r\n role: 'agent-switch',\r\n status: 'candidate',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Model-shaped fixture entry; requires live switching proof before promotion.',\r\n },\r\n {\r\n slotId: 'gemini-3-flash',\r\n model: 'MODEL_PLACEHOLDER_M18',\r\n role: 'command',\r\n status: 'candidate',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Command model in the fixture; not switch-safe without live proof.',\r\n },\r\n {\r\n slotId: 'gemini-3.1-flash-lite',\r\n model: 'MODEL_PLACEHOLDER_M50',\r\n role: 'cascade-checkpoint',\r\n status: 'candidate',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Checkpoint/search/commit slot; route as helper until live proof exists.',\r\n },\r\n {\r\n slotId: 'gemini-3.1-flash-image',\r\n model: 'MODEL_PLACEHOLDER_M21',\r\n role: 'image',\r\n status: 'candidate',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n notes: 'Image generation slot; not switch-safe without live proof.',\r\n },\r\n {\r\n slotId: 'tab_jump_flash_lite_preview',\r\n model: 'MODEL_PLACEHOLDER_M28',\r\n role: 'tab',\r\n status: 'unsafe',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'tab_flash_lite_preview',\r\n model: 'MODEL_PLACEHOLDER_M19',\r\n role: 'tab',\r\n status: 'unsafe',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'chat_20706',\r\n model: 'MODEL_CHAT_20706',\r\n role: 'chat',\r\n status: 'unsafe',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n {\r\n slotId: 'chat_23310',\r\n model: 'MODEL_CHAT_23310',\r\n role: 'chat',\r\n status: 'unsafe',\r\n validatedWith: AGY_SLOT_VALIDATION_SOURCE,\r\n },\r\n];\r\n\r\nconst KNOWN_COMPATIBLE_AGY_VERSIONS = new Set(['1.0.10']);\r\nconst KNOWN_INCOMPATIBLE_AGY_VERSIONS = new Set(['1.0.9']);\r\n\r\nfunction withFixtureModel(definition: AgySlotDefinition, model: string): AgySlotDefinition {\r\n return model === definition.model ? definition : { ...definition, model };\r\n}\r\n\r\nfunction assertNoDuplicateSwitchEnums(\r\n fixture: CatalogFixture,\r\n definitions: AgySlotDefinition[],\r\n): void {\r\n const seen = new Map<string, string>();\r\n for (const definition of definitions) {\r\n if (definition.status !== 'validated') continue;\r\n const actualModel = fixture.models[definition.slotId]?.model;\r\n if (!actualModel) continue;\r\n\r\n const previousSlotId = seen.get(actualModel);\r\n if (previousSlotId) {\r\n throw new Error(\r\n `Duplicate AGY switch slot enum ${actualModel}: ${previousSlotId} and ${definition.slotId}`,\r\n );\r\n }\r\n seen.set(actualModel, definition.slotId);\r\n }\r\n}\r\n\r\nexport function validateAgySlotRegistry(fixture: CatalogFixture): AgySlotValidationResult {\r\n assertNoDuplicateSwitchEnums(fixture, AGY_NATIVE_SLOT_REGISTRY);\r\n\r\n const switchSlots: AgySlotDefinition[] = [];\r\n const reservedSlots: AgySlotDefinition[] = [];\r\n const candidateSlots: AgySlotDefinition[] = [];\r\n const warnings: string[] = [];\r\n\r\n for (const definition of AGY_NATIVE_SLOT_REGISTRY) {\r\n const entry = fixture.models[definition.slotId];\r\n if (!entry) {\r\n if (definition.status === 'validated' || definition.status === 'reserved') {\r\n warnings.push(`AGY slot ${definition.slotId} missing from fixture`);\r\n }\r\n continue;\r\n }\r\n\r\n if (entry.model !== definition.model) {\r\n warnings.push(\r\n `AGY slot ${definition.slotId} expected ${definition.model} but fixture has ${entry.model}`,\r\n );\r\n continue;\r\n }\r\n\r\n if (definition.status === 'validated') {\r\n switchSlots.push(withFixtureModel(definition, entry.model));\r\n } else if (definition.status === 'reserved') {\r\n reservedSlots.push(withFixtureModel(definition, entry.model));\r\n } else if (definition.status === 'candidate') {\r\n candidateSlots.push(withFixtureModel(definition, entry.model));\r\n }\r\n }\r\n\r\n return { switchSlots, reservedSlots, candidateSlots, warnings };\r\n}\r\n\r\nexport function getValidatedAgySwitchSlots(fixture: CatalogFixture): AgySlotDefinition[] {\r\n return validateAgySlotRegistry(fixture).switchSlots;\r\n}\r\n\r\nexport function isReservedAgyHelperSlot(slotId: string): boolean {\r\n return AGY_NATIVE_SLOT_REGISTRY.some(\r\n definition => definition.slotId === slotId && definition.status === 'reserved',\r\n );\r\n}\r\n\r\nexport function evaluateAgySwitchCompatibility(opts: {\r\n version?: string | null;\r\n versionReadError?: string;\r\n fixture: CatalogFixture;\r\n}): AgySwitchCompatibility {\r\n const validation = validateAgySlotRegistry(opts.fixture);\r\n const shapeMatches = validation.warnings.length === 0 && validation.switchSlots.length > 0;\r\n const warnings: string[] = [];\r\n\r\n if (opts.versionReadError) {\r\n warnings.push(`Could not read agy --version (${opts.versionReadError}); validating AGY fixture shape instead.`);\r\n }\r\n\r\n if (opts.version && KNOWN_INCOMPATIBLE_AGY_VERSIONS.has(opts.version)) {\r\n return {\r\n mode: 'single-model',\r\n validatedSwitchSlotCount: validation.switchSlots.length,\r\n warnings: [\r\n ...warnings,\r\n `Known-incompatible AGY version ${opts.version}; falling back to single-model mode.`,\r\n ],\r\n };\r\n }\r\n\r\n if (!shapeMatches) {\r\n return {\r\n mode: 'single-model',\r\n validatedSwitchSlotCount: validation.switchSlots.length,\r\n warnings: [\r\n ...warnings,\r\n ...validation.warnings,\r\n 'AGY fixture shape does not match the validated slot registry; falling back to single-model mode.',\r\n ],\r\n };\r\n }\r\n\r\n if (opts.version && !KNOWN_COMPATIBLE_AGY_VERSIONS.has(opts.version)) {\r\n warnings.push(`Unvalidated AGY version ${opts.version}; fixture shape matches, so multi-model switching remains enabled.`);\r\n } else if (!opts.version && !opts.versionReadError) {\r\n warnings.push('AGY version is unknown; fixture shape matches, so multi-model switching remains enabled.');\r\n }\r\n\r\n return {\r\n mode: 'multi-model',\r\n validatedSwitchSlotCount: validation.switchSlots.length,\r\n warnings,\r\n };\r\n}\r\n","import { MAX_MODEL_CATALOG } from '../../core/constants.js';\r\nimport type { ResolvedFavorite } from '../../agents/shared/favorites-resolver.js';\r\nimport type { AntigravityRoute, CatalogFixture, CatalogModelEntry } from './types.js';\r\nimport {\r\n getValidatedAgySwitchSlots,\r\n validateAgySlotRegistry,\r\n type AgySlotValidationResult,\r\n} from './slot-registry.js';\r\n\r\n/** Current Antigravity IDE flash-agent enum from fetchAvailableModels. */\r\nexport const GATEWAY_CASCADE_PLAN_MODEL = 'MODEL_PLACEHOLDER_M132';\r\n\r\n/** Current Antigravity IDE default agent enum from fetchAvailableModels. */\r\nexport const GATEWAY_AGENT_PLACEHOLDER = 'MODEL_PLACEHOLDER_M20';\r\n\r\n/** Current checkpointer model enum from captured modelExperiments. */\r\nconst GATEWAY_CASCADE_CHECKPOINT_MODEL = 'MODEL_PLACEHOLDER_M50';\r\n\r\n/** Current 2.5 Flash intent-model enum from fetchAvailableModels. */\r\nconst GATEWAY_CASCADE_INTENT_MODEL = 'MODEL_GOOGLE_GEMINI_2_5_FLASH';\r\n\r\n/** Fixture key for the hidden default agent anchor. */\r\nexport const GATEWAY_CASCADE_ANCHOR_ID = 'gemini-3.5-flash-low';\r\n\r\n/** Fixture key for the hidden flash-agent anchor. */\r\nexport const GATEWAY_CASCADE_PLAN_ANCHOR_ID = 'gemini-3-flash-agent';\r\nexport const GATEWAY_CASCADE_FALLBACK_ID = 'gemini-2.5-flash-lite';\r\nexport const GATEWAY_CASCADE_INTENT_MODEL_ID = 'gemini-2.5-flash';\r\n\r\nexport interface GateCatalogSlot {\r\n /** The model ID Antigravity sees and sends back to the gateway. */\r\n slotId: string;\r\n /** The Gateway route that slot should execute against. */\r\n route: AntigravityRoute;\r\n}\r\n\r\nexport interface GateCatalogSlotPlan {\r\n slots: GateCatalogSlot[];\r\n switchableRoutes: AntigravityRoute[];\r\n skippedRoutes: AntigravityRoute[];\r\n validation: AgySlotValidationResult;\r\n}\r\n\r\nfunction withCascadeCheckpointer(\r\n entry: CatalogModelEntry,\r\n maxTokenLimit = 128000,\r\n): CatalogModelEntry {\r\n const tokenThreshold = Math.min(50000, Math.floor(maxTokenLimit * 0.75));\r\n const existingModelExperiments = entry.modelExperiments as\r\n | { experiments?: Record<string, unknown>; [key: string]: unknown }\r\n | undefined;\r\n\r\n entry.modelExperiments = {\r\n ...existingModelExperiments,\r\n experiments: {\r\n ...(existingModelExperiments?.experiments ?? {}),\r\n CASCADE_USE_EXPERIMENT_CHECKPOINTER: {\r\n stringValue: JSON.stringify({\r\n strategy: 'CHECKPOINT_STRATEGY_SAME_MODEL',\r\n max_token_limit: String(maxTokenLimit),\r\n token_threshold: String(tokenThreshold),\r\n max_overhead_ratio: '0.15',\r\n moving_window_size: '1',\r\n enabled: true,\r\n max_output_tokens: '16384',\r\n checkpoint_model: GATEWAY_CASCADE_CHECKPOINT_MODEL,\r\n use_last_planner_model: true,\r\n is_sync: true,\r\n max_user_requests: 10,\r\n include_last_user_message: true,\r\n include_conversation_log: false,\r\n include_running_task_snapshots: true,\r\n include_subagent_snapshots: true,\r\n include_artifact_snapshots: true,\r\n retry_config: {\r\n max_retries: 0,\r\n initial_sleep_duration_ms: 1000,\r\n exponential_multiplier: 2,\r\n include_error_feedback: false,\r\n },\r\n }),\r\n },\r\n },\r\n };\r\n return entry;\r\n}\r\n\r\nfunction applyRouteContextBounds(\r\n entry: CatalogModelEntry,\r\n route: AntigravityRoute,\r\n): CatalogModelEntry {\r\n const maxTokenLimit = route.contextWindow ?? 128000;\r\n const maxOutputTokens = Math.min(entry.maxOutputTokens ?? 65536, maxTokenLimit);\r\n const checkpointTokenLimit = Math.min(\r\n 128000,\r\n Math.max(1, maxTokenLimit - maxOutputTokens),\r\n );\r\n\r\n entry.maxTokens = maxTokenLimit;\r\n entry.maxOutputTokens = maxOutputTokens;\r\n return withCascadeCheckpointer(entry, checkpointTokenLimit);\r\n}\r\n\r\nconst GATEWAY_CASCADE_FALLBACK_ENTRY: CatalogModelEntry = withCascadeCheckpointer({\r\n displayName: 'Gemini 3.1 Flash Lite',\r\n model: 'MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE',\r\n apiProvider: 'API_PROVIDER_GOOGLE_GEMINI',\r\n modelProvider: 'MODEL_PROVIDER_GOOGLE',\r\n tokenizerType: 'LLAMA_WITH_SPECIAL',\r\n maxTokens: 1048576,\r\n maxOutputTokens: 65535,\r\n quotaInfo: { remainingFraction: 1 },\r\n});\r\n\r\nconst GATEWAY_CASCADE_INTENT_MODEL_ENTRY: CatalogModelEntry = withCascadeCheckpointer({\r\n ...GATEWAY_CASCADE_FALLBACK_ENTRY,\r\n model: GATEWAY_CASCADE_INTENT_MODEL,\r\n});\r\n\r\nexport function planGateCatalogSlots(\r\n catalog: CatalogFixture,\r\n routes: AntigravityRoute[],\r\n templateKey: string,\r\n): GateCatalogSlotPlan {\r\n const validation = validateAgySlotRegistry(catalog);\r\n const switchSlots = getValidatedAgySwitchSlots(catalog);\r\n const templateSlot = switchSlots.find(slot => slot.slotId === templateKey);\r\n const orderedSlots = templateSlot\r\n ? [templateSlot, ...switchSlots.filter(slot => slot.slotId !== templateKey)]\r\n : switchSlots;\r\n\r\n if (routes.length > 0 && orderedSlots.length === 0) {\r\n throw new Error('No validated AGY switch slots are available for the selected launch route');\r\n }\r\n\r\n const switchableRoutes = routes.slice(0, orderedSlots.length);\r\n const skippedRoutes = routes.slice(orderedSlots.length);\r\n const slots = switchableRoutes.map((route, index) => ({\r\n slotId: orderedSlots[index]!.slotId,\r\n route,\r\n }));\r\n\r\n return {\r\n slots,\r\n switchableRoutes,\r\n skippedRoutes,\r\n validation,\r\n };\r\n}\r\n\r\nexport function resolveGateCatalogSlots(\r\n catalog: CatalogFixture,\r\n routes: AntigravityRoute[],\r\n templateKey: string,\r\n): GateCatalogSlot[] {\r\n return planGateCatalogSlots(catalog, routes, templateKey).slots;\r\n}\r\n\r\n/**\r\n * Build a gateway catalog entry by cloning a real model template.\r\n */\r\nexport function buildGateCatalogEntry(\r\n route: AntigravityRoute,\r\n template: CatalogModelEntry,\r\n): CatalogModelEntry {\r\n const entry: CatalogModelEntry = structuredClone(template);\r\n\r\n entry.displayName = route.displayName;\r\n entry.model = template.model ?? GATEWAY_AGENT_PLACEHOLDER;\r\n entry.requestedModelId = route.catalogId;\r\n entry.modelVersion = route.catalogId;\r\n entry.modelVersionId = route.catalogId;\r\n entry.quotaInfo = { remainingFraction: 1, resetTime: '2026-06-23T02:00:57Z' };\r\n return applyRouteContextBounds(entry, route);\r\n}\r\n\r\nfunction buildGateCatalogSlotEntry(\r\n route: AntigravityRoute,\r\n template: CatalogModelEntry,\r\n): CatalogModelEntry {\r\n const entry: CatalogModelEntry = structuredClone(template);\r\n\r\n entry.displayName = route.displayName;\r\n entry.quotaInfo = { remainingFraction: 1, resetTime: '2026-06-23T02:00:57Z' };\r\n delete entry.requestedModelId;\r\n delete entry.modelVersion;\r\n delete entry.modelVersionId;\r\n delete entry.isInternal;\r\n return applyRouteContextBounds(entry, route);\r\n}\r\n\r\n/**\r\n * Inject anygate routes into a captured Cloud Code catalog fixture.\r\n */\r\nexport function injectGatewayModels(\r\n fixture: CatalogFixture,\r\n routes: AntigravityRoute[],\r\n templateKey: string,\r\n): CatalogFixture {\r\n const result: CatalogFixture = structuredClone(fixture);\r\n\r\n const template = fixture.models[templateKey];\r\n if (!template) {\r\n throw new Error(`Template model \"${templateKey}\" not found in catalog fixture`);\r\n }\r\n\r\n const seen = new Set<string>();\r\n for (const route of routes) {\r\n if (seen.has(route.catalogId)) {\r\n throw new Error(`Catalog ID collision: ${route.catalogId}`);\r\n }\r\n if (fixture.models[route.catalogId]) {\r\n throw new Error(`Catalog ID collision with native model: ${route.catalogId}`);\r\n }\r\n seen.add(route.catalogId);\r\n }\r\n\r\n if (routes.length > 0) {\r\n // Gateway picker catalog + hidden cascade anchors. Visible picker entries use\r\n // native Antigravity IDs; the gateway maps those slots back to Gateway routes.\r\n result.models[GATEWAY_CASCADE_ANCHOR_ID] ??= structuredClone(template);\r\n result.models[GATEWAY_CASCADE_FALLBACK_ID] ??= structuredClone(GATEWAY_CASCADE_FALLBACK_ENTRY);\r\n result.models[GATEWAY_CASCADE_INTENT_MODEL_ID] ??= structuredClone(GATEWAY_CASCADE_INTENT_MODEL_ENTRY);\r\n if (!result.models[GATEWAY_CASCADE_PLAN_ANCHOR_ID]) {\r\n const planAnchor = withCascadeCheckpointer(structuredClone(template));\r\n planAnchor.model = GATEWAY_CASCADE_PLAN_MODEL;\r\n result.models[GATEWAY_CASCADE_PLAN_ANCHOR_ID] = planAnchor;\r\n }\r\n\r\n const slotPlan = planGateCatalogSlots(result, routes, templateKey);\r\n const slots = slotPlan.slots;\r\n for (const { slotId, route } of slots) {\r\n const slotTemplate = result.models[slotId] ?? template;\r\n if (result.models[slotId]) {\r\n result.models[slotId] = buildGateCatalogSlotEntry(route, slotTemplate);\r\n }\r\n result.models[route.catalogId] = buildGateCatalogEntry(route, slotTemplate);\r\n }\r\n\r\n result.defaultAgentModelId = slots[0]?.slotId ?? GATEWAY_CASCADE_ANCHOR_ID;\r\n result.agentModelSorts = [\r\n {\r\n displayName: 'Recommended',\r\n groups: [{\r\n modelIds: slots.map(slot => slot.slotId),\r\n }],\r\n },\r\n ];\r\n return result;\r\n }\r\n\r\n if (!result.agentModelSorts?.[0]?.groups?.[0]) {\r\n result.agentModelSorts = [\r\n {\r\n displayName: 'Recommended',\r\n groups: [{ modelIds: [] }],\r\n },\r\n ];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Build AntigravityRoute instances from resolved favorite models.\r\n *\r\n * Maps resolved model properties (`npm`, `upstreamModelId`, `apiKey`, `baseURL`)\r\n * to their opaque gateway route definitions, capping the total at `MAX_MODEL_CATALOG`.\r\n */\r\nexport function buildAntigravityRoutes(\r\n resolvedFavorites: ResolvedFavorite[],\r\n maxRoutes = MAX_MODEL_CATALOG,\r\n): AntigravityRoute[] {\r\n const routes: AntigravityRoute[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const fav of resolvedFavorites) {\r\n if (routes.length >= maxRoutes) break;\r\n\r\n const favModel = fav.model;\r\n const modelId = favModel.id;\r\n const catalogId = `anygate__${fav.providerId}__${modelId}`;\r\n\r\n if (seen.has(catalogId)) continue;\r\n seen.add(catalogId);\r\n\r\n // Extract Vercel AI SDK npm package and upstream parameters\r\n // Handle both LocalProviderModel and ServerModelInfo shapes\r\n const npm = (favModel as any).npm || '@ai-sdk/openai-compatible';\r\n const upstreamModelId = (favModel as any).upstreamModelId || modelId;\r\n const baseURL = (favModel as any).apiBaseUrl || (favModel as any).completionsUrl || undefined;\r\n const contextWindow = (favModel as any).contextWindow;\r\n const modelFormat = (favModel as any).modelFormat;\r\n\r\n routes.push({\r\n catalogId,\r\n providerId: fav.providerId,\r\n providerName: fav.providerName,\r\n modelId,\r\n upstreamModelId,\r\n displayName: `${favModel.name} (anygate)`,\r\n ...(modelFormat ? { modelFormat } : {}),\r\n npm,\r\n apiKey: fav.apiKey,\r\n ...(fav.authType ? { authType: fav.authType } : {}),\r\n ...(fav.oauthAccountId ? { oauthAccountId: fav.oauthAccountId } : {}),\r\n ...(fav.providerData ? { providerData: fav.providerData } : {}),\r\n baseURL,\r\n contextWindow,\r\n });\r\n }\r\n\r\n return applyUniqueAntigravityRouteLabels(routes);\r\n}\r\n\r\nfunction routeBaseModelName(route: AntigravityRoute): string {\r\n const gatewayMatch = route.displayName.match(/^(.*) \\(anygate(?: - .*)?\\)$/);\r\n return gatewayMatch?.[1] ?? route.displayName;\r\n}\r\n\r\nfunction authKindLabel(route: AntigravityRoute): string {\r\n if (route.authType === 'oauth') return 'OAuth';\r\n if (route.authType === 'api') return 'API key';\r\n if (route.authType === 'none') return 'local';\r\n return 'provider';\r\n}\r\n\r\nfunction duplicateCounts(values: string[]): Map<string, number> {\r\n const counts = new Map<string, number>();\r\n for (const value of values) {\r\n counts.set(value, (counts.get(value) ?? 0) + 1);\r\n }\r\n return counts;\r\n}\r\n\r\nfunction assertUniqueRouteDisplayNames(routes: AntigravityRoute[]): void {\r\n const counts = duplicateCounts(routes.map(route => route.displayName));\r\n const duplicate = [...counts.entries()].find(([, count]) => count > 1);\r\n if (duplicate) {\r\n throw new Error(`Duplicate AGY model label after disambiguation: ${duplicate[0]}`);\r\n }\r\n}\r\n\r\nexport function applyUniqueAntigravityRouteLabels(routes: AntigravityRoute[]): AntigravityRoute[] {\r\n const baseNames = routes.map(routeBaseModelName);\r\n const baseNameCounts = duplicateCounts(baseNames);\r\n const upstreamCounts = duplicateCounts(routes.map(route => route.upstreamModelId));\r\n const providerNameCounts = duplicateCounts(routes.map(route => route.providerName));\r\n\r\n const labeled = routes.map((route, index) => {\r\n const baseName = baseNames[index]!;\r\n const needsSuffix =\r\n (baseNameCounts.get(baseName) ?? 0) > 1\r\n || (upstreamCounts.get(route.upstreamModelId) ?? 0) > 1;\r\n\r\n if (!needsSuffix) {\r\n return { ...route, displayName: `${baseName} (anygate)` };\r\n }\r\n\r\n const providerName = route.providerName || route.providerId;\r\n const providerSuffix = (providerNameCounts.get(providerName) ?? 0) > 1\r\n ? `${providerName} ${authKindLabel(route)}`\r\n : providerName;\r\n return {\r\n ...route,\r\n displayName: `${baseName} (anygate - ${providerSuffix})`,\r\n };\r\n });\r\n\r\n const firstPassCounts = duplicateCounts(labeled.map(route => route.displayName));\r\n const withProviderIds = labeled.map(route => {\r\n if ((firstPassCounts.get(route.displayName) ?? 0) <= 1) return route;\r\n return {\r\n ...route,\r\n displayName: route.displayName.replace(/\\)$/, ` - ${route.providerId})`),\r\n };\r\n });\r\n\r\n assertUniqueRouteDisplayNames(withProviderIds);\r\n return withProviderIds;\r\n}\r\n\r\nfunction routeLabels(routes: AntigravityRoute[]): Map<string, string> {\r\n assertUniqueRouteDisplayNames(routes);\r\n\r\n const labels = new Map<string, string>();\r\n for (const route of routes) {\r\n labels.set(route.catalogId, route.displayName);\r\n }\r\n return labels;\r\n}\r\n\r\nfunction buildClientModelConfigData(\r\n routes: AntigravityRoute[],\r\n catalog?: CatalogFixture,\r\n templateKey = GATEWAY_CASCADE_ANCHOR_ID,\r\n precomputedSlots?: { slotId: string; route: AntigravityRoute }[],\r\n): Record<string, unknown> {\r\n const catalogRoutes = routes.slice(0, MAX_MODEL_CATALOG);\r\n const slots = precomputedSlots ?? (catalog\r\n ? resolveGateCatalogSlots(catalog, catalogRoutes, templateKey)\r\n : catalogRoutes.map(route => ({ slotId: route.catalogId, route })));\r\n const labels = routeLabels(catalogRoutes);\r\n const clientModelConfigs = slots.map(({ slotId, route }) => {\r\n const entry = catalog?.models[slotId] ?? catalog?.models[route.catalogId] ?? catalog?.models[GATEWAY_CASCADE_ANCHOR_ID];\r\n const label = labels.get(route.catalogId) ?? route.displayName;\r\n return {\r\n label,\r\n modelOrAlias: {\r\n alias: slotId,\r\n choice: { case: 'alias', value: slotId },\r\n },\r\n disabled: false,\r\n supportedMimeTypes: entry?.supportedMimeTypes ?? {},\r\n quotaInfo: entry?.quotaInfo ?? { remainingFraction: 1 },\r\n tagTitle: entry?.tagTitle,\r\n tagDescription: entry?.tagDescription,\r\n supportsThoughtCirculation: entry?.supportsThoughtCirculation ?? false,\r\n };\r\n });\r\n\r\n return {\r\n clientModelConfigs,\r\n clientModelSorts: [\r\n {\r\n name: 'Recommended',\r\n groups: [\r\n {\r\n groupName: '',\r\n modelLabels: clientModelConfigs.map(config => config.label),\r\n },\r\n ],\r\n },\r\n ],\r\n defaultOverrideModelConfig: clientModelConfigs[0] ?? {},\r\n };\r\n}\r\n\r\n/**\r\n * Build a minimal listModelConfigs response for agy's cascade executor.\r\n * agy requires PlanModel or RequestedModel — this supplies requestedModelId per route.\r\n */\r\nexport function buildListModelConfigsResponse(\r\n routes: AntigravityRoute[],\r\n catalog?: CatalogFixture,\r\n templateKey = GATEWAY_CASCADE_ANCHOR_ID,\r\n): Record<string, unknown> {\r\n const catalogRoutes = routes.slice(0, MAX_MODEL_CATALOG);\r\n const slots = catalog\r\n ? resolveGateCatalogSlots(catalog, catalogRoutes, templateKey)\r\n : catalogRoutes.map(route => ({ slotId: route.catalogId, route }));\r\n const config = slots.map(({ slotId }) => ({\r\n requestedModelId: slotId,\r\n planModel: GATEWAY_CASCADE_PLAN_MODEL,\r\n requestedModel: catalog?.models[slotId]?.model ?? GATEWAY_AGENT_PLACEHOLDER,\r\n }));\r\n\r\n return {\r\n ...buildClientModelConfigData(routes, catalog, templateKey, slots),\r\n allowedModelConfigs: config,\r\n defaultAgentModelConfig: config[0] ?? {},\r\n };\r\n}\r\n\r\nconst CURRENT_EXPERIMENT_IDS = [\r\n 105979552, 105979574, 106015351, 105979579, 105867471, 105979530, 105995634,\r\n 106121401, 106100625, 104638466, 101868197, 104817729, 105695344, 106064591,\r\n 104913215, 106324349, 106309078, 105821930, 104922093, 103012598, 106143956,\r\n 105856899, 106312323, 106064030, 105746183, 105757908, 104892493, 105822886,\r\n 105785683, 105721273, 105897325, 105658071, 106240758, 105943702, 106106760,\r\n 106283618, 105620019, 106038160, 106309520, 106281951, 106264532, 106222835,\r\n 106094629, 105887313, 105849474, 106032303, 106228452, 106113900, 106121607,\r\n 105979531, 105979553, 106015328, 105867469, 105979517, 106121399, 106100654,\r\n 104638459, 101551624, 104673683, 105695346, 106064590, 104913210, 105821928,\r\n 104922082, 103012592, 106064028, 105746181, 104892490, 105822881, 105721268,\r\n 105895316, 105658068, 106240748, 105943694, 106283614, 105620012, 106038153,\r\n 105887311, 106032301, 106113877, 106121604,\r\n] as const;\r\n\r\n/** Current Antigravity IDE listExperiments response shape. */\r\nexport function buildListExperimentsResponse(): Record<string, unknown> {\r\n return {\r\n experimentIds: [...CURRENT_EXPERIMENT_IDS],\r\n };\r\n}\r\n","{\r\n \"currentTier\": {\r\n \"id\": \"free-tier\",\r\n \"name\": \"Antigravity\",\r\n \"description\": \"Gemini-powered code suggestions and chat in multiple IDEs\",\r\n \"privacyNotice\": {\r\n \"showNotice\": false,\r\n \"noticeText\": \"\"\r\n },\r\n \"upgradeSubscriptionUri\": \"https://codeassist.google.com/upgrade\",\r\n \"upgradeSubscriptionText\": \"Upgrade to get higher rate limits\",\r\n \"upgradeSubscriptionType\": \"GDP_HELIUM\"\r\n },\r\n \"allowedTiers\": [\r\n {\r\n \"id\": \"free-tier\",\r\n \"name\": \"Antigravity\",\r\n \"description\": \"Gemini-powered code suggestions and chat in multiple IDEs\",\r\n \"isDefault\": true\r\n },\r\n {\r\n \"id\": \"standard-tier\",\r\n \"name\": \"Antigravity\",\r\n \"description\": \"Unlimited coding assistant\",\r\n \"userDefinedCloudaicompanionProject\": true,\r\n \"usesGcpTos\": true\r\n }\r\n ],\r\n \"cloudaicompanionProject\": \"anygate-local-project\",\r\n \"gcpManaged\": false,\r\n \"upgradeSubscriptionUri\": \"https://codeassist.google.com/upgrade\",\r\n \"paidTier\": {\r\n \"id\": \"g1-pro-tier\",\r\n \"name\": \"Google AI Pro\",\r\n \"description\": \"Google AI Pro\",\r\n \"upgradeSubscriptionUri\": \"https://antigravity.google/g1-upgrade\",\r\n \"availableCredits\": [\r\n {\r\n \"creditType\": \"GOOGLE_ONE_AI\",\r\n \"minimumCreditAmountForUsage\": \"50\"\r\n }\r\n ]\r\n }\r\n}\r\n","{\r\n \"models\": {\r\n \"gpt-oss-120b-medium\": {\r\n \"displayName\": \"GPT-OSS 120B (Medium)\",\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 8192,\r\n \"recommended\": true,\r\n \"maxTokens\": 131072,\r\n \"maxOutputTokens\": 32768,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 0.15333453,\r\n \"resetTime\": \"2026-06-26T16:48:02Z\"\r\n },\r\n \"model\": \"MODEL_OPENAI_GPT_OSS_120B_MEDIUM\",\r\n \"apiProvider\": \"API_PROVIDER_OPENAI_VERTEX\",\r\n \"modelProvider\": \"MODEL_PROVIDER_OPENAI\",\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_UNSPECIFIED\\\",\\n \\\"max_token_limit\\\": \\\"80000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"8192\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n },\r\n \"vertexModelId\": \"openai/gpt-oss-120b-maas\"\r\n },\r\n \"gemini-3-flash-agent\": {\r\n \"displayName\": \"Gemini 3.5 Flash (High)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 10000,\r\n \"minThinkingBudget\": 32,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65536,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M132\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"tagTitle\": \"Fast\",\r\n \"tagDescription\": \"Limited time\",\r\n \"supportedMimeTypes\": {\r\n \"application/x-python-code\": true,\r\n \"image/heif\": true,\r\n \"video/audio/wav\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"application/pdf\": true,\r\n \"text/markdown\": true,\r\n \"application/json\": true,\r\n \"text/css\": true,\r\n \"text/javascript\": true,\r\n \"text/csv\": true,\r\n \"application/x-typescript\": true,\r\n \"text/plain\": true,\r\n \"video/text/timestamp\": true,\r\n \"video/mp4\": true,\r\n \"image/jpeg\": true,\r\n \"application/rtf\": true,\r\n \"application/x-javascript\": true,\r\n \"image/webp\": true,\r\n \"video/webm\": true,\r\n \"text/rtf\": true,\r\n \"video/audio/s16le\": true,\r\n \"text/x-python\": true,\r\n \"image/png\": true,\r\n \"video/jpeg2000\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"text/x-python-script\": true,\r\n \"image/heic\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"text/html\": true,\r\n \"text/xml\": true,\r\n \"text/x-typescript\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SAME_MODEL\\\",\\n \\\"max_token_limit\\\": \\\"256000\\\",\\n \\\"token_threshold\\\": \\\"100000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": true,\\n \\\"is_sync\\\": true,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": true,\\n \\\"include_conversation_log\\\": false,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n },\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n }\r\n }\r\n }\r\n },\r\n \"tab_jump_flash_lite_preview\": {\r\n \"maxTokens\": 16384,\r\n \"maxOutputTokens\": 4096,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M28\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsCumulativeContext\": true,\r\n \"tabJumpPrintLineRange\": true,\r\n \"supportsEstimateTokenCounter\": true,\r\n \"addCursorToFindReplaceTarget\": true,\r\n \"toolFormatterType\": \"TOOL_FORMATTER_TYPE_XML\",\r\n \"requiresLeadInGeneration\": true,\r\n \"requiresNoXmlToolExamples\": true\r\n },\r\n \"tab_flash_lite_preview\": {\r\n \"maxTokens\": 16384,\r\n \"maxOutputTokens\": 4096,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M19\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsCumulativeContext\": true,\r\n \"supportsEstimateTokenCounter\": true,\r\n \"toolFormatterType\": \"TOOL_FORMATTER_TYPE_XML\",\r\n \"requiresLeadInGeneration\": true\r\n },\r\n \"gemini-3-flash\": {\r\n \"displayName\": \"Gemini 3 Flash\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": -1,\r\n \"minThinkingBudget\": 32,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65536,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M18\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"supportedMimeTypes\": {\r\n \"application/x-ipynb+json\": true,\r\n \"text/x-python\": true,\r\n \"text/css\": true,\r\n \"application/rtf\": true,\r\n \"text/csv\": true,\r\n \"application/x-javascript\": true,\r\n \"video/mp4\": true,\r\n \"video/audio/wav\": true,\r\n \"application/json\": true,\r\n \"video/webm\": true,\r\n \"text/xml\": true,\r\n \"text/x-python-script\": true,\r\n \"text/markdown\": true,\r\n \"text/html\": true,\r\n \"application/x-typescript\": true,\r\n \"image/jpeg\": true,\r\n \"image/heic\": true,\r\n \"image/heif\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"application/pdf\": true,\r\n \"text/x-typescript\": true,\r\n \"image/webp\": true,\r\n \"application/x-python-code\": true,\r\n \"text/plain\": true,\r\n \"video/text/timestamp\": true,\r\n \"text/rtf\": true,\r\n \"image/png\": true,\r\n \"video/audio/s16le\": true,\r\n \"video/jpeg2000\": true,\r\n \"text/javascript\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"template__system_prompts__communication_style\": {\r\n \"stringValue\": \"- Keep your responses concise.\\n- Provide a summary of your work when you end your turn. Ground your response in the work you did. Keep your tone professional and avoid overconfident language, bragging, or overclaiming success.\\n- AVOID using superlatives such as \\\"perfectly\\\", \\\"flawlessly\\\", \\\"100% correct\\\", \\\"Summary of Accomplishments\\\" etc. to summarize your work for the user. Be humble.\\n- AVOID over-the-top politeness or complimenting the user excessively.\\n- Format your responses in github-style markdown.\"\r\n }\r\n }\r\n }\r\n },\r\n \"gemini-2.5-flash\": {\r\n \"displayName\": \"Gemini 3.1 Flash Lite\",\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_GOOGLE_GEMINI_2_5_FLASH\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n }\r\n },\r\n \"gemini-3.5-flash-low\": {\r\n \"displayName\": \"Gemini 3.5 Flash (Medium)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 4000,\r\n \"minThinkingBudget\": 32,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65536,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M20\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"tagTitle\": \"Fast\",\r\n \"tagDescription\": \"Limited time\",\r\n \"supportedMimeTypes\": {\r\n \"video/mp4\": true,\r\n \"application/json\": true,\r\n \"video/audio/wav\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"video/audio/s16le\": true,\r\n \"image/jpeg\": true,\r\n \"image/heic\": true,\r\n \"text/javascript\": true,\r\n \"text/x-python\": true,\r\n \"video/text/timestamp\": true,\r\n \"text/xml\": true,\r\n \"application/x-python-code\": true,\r\n \"text/html\": true,\r\n \"text/x-python-script\": true,\r\n \"application/pdf\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"text/rtf\": true,\r\n \"text/csv\": true,\r\n \"image/png\": true,\r\n \"application/rtf\": true,\r\n \"video/jpeg2000\": true,\r\n \"application/x-javascript\": true,\r\n \"image/webp\": true,\r\n \"application/x-typescript\": true,\r\n \"text/x-typescript\": true,\r\n \"video/webm\": true,\r\n \"text/plain\": true,\r\n \"image/heif\": true,\r\n \"text/markdown\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"text/css\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n },\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SAME_MODEL\\\",\\n \\\"max_token_limit\\\": \\\"256000\\\",\\n \\\"token_threshold\\\": \\\"100000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": true,\\n \\\"is_sync\\\": true,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": true,\\n \\\"include_conversation_log\\\": false,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n }\r\n }\r\n }\r\n },\r\n \"gemini-2.5-flash-thinking\": {\r\n \"displayName\": \"Gemini 3.1 Flash Lite\",\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_GOOGLE_GEMINI_2_5_FLASH_THINKING\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n }\r\n },\r\n \"gemini-3.1-flash-lite\": {\r\n \"displayName\": \"Gemini 3.1 Flash Lite\",\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M50\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n }\r\n },\r\n \"gemini-3.1-pro-high\": {\r\n \"displayName\": \"Gemini 3.1 Pro (High)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 10001,\r\n \"minThinkingBudget\": 128,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M37\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"tagTitle\": \"New\",\r\n \"supportedMimeTypes\": {\r\n \"text/css\": true,\r\n \"application/pdf\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"text/csv\": true,\r\n \"video/jpeg2000\": true,\r\n \"text/javascript\": true,\r\n \"video/webm\": true,\r\n \"text/html\": true,\r\n \"text/x-python\": true,\r\n \"image/jpeg\": true,\r\n \"application/x-javascript\": true,\r\n \"application/json\": true,\r\n \"application/x-typescript\": true,\r\n \"text/xml\": true,\r\n \"image/png\": true,\r\n \"video/audio/wav\": true,\r\n \"image/heic\": true,\r\n \"video/audio/s16le\": true,\r\n \"text/x-python-script\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"application/rtf\": true,\r\n \"text/markdown\": true,\r\n \"video/text/timestamp\": true,\r\n \"application/x-python-code\": true,\r\n \"text/x-typescript\": true,\r\n \"video/mp4\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"image/webp\": true,\r\n \"text/rtf\": true,\r\n \"text/plain\": true,\r\n \"image/heif\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"cascade-include-ephemeral-message\": {\r\n \"stringValue\": \"{\\n \\\"enabled\\\": true,\\n \\\"disabledHeuristics\\\": [\\\"running_tasks_reminder\\\"],\\n \\\"staticMessages\\\": [],\\n \\\"useAllowlist\\\": false,\\n \\\"enabledHeuristics\\\": []\\n}\"\r\n },\r\n \"template__system_prompts__communication_style\": {\r\n \"stringValue\": \"- Keep your responses concise.\\n- Provide a summary of your work when you end your turn.\\n- Format your responses in github-style markdown.\\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\\n\\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\\\nCRITICAL INSTRUCTION 1: ...\\\\nCRITICAL INSTRUCTION 2: ...'.\"\r\n },\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n },\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n }\r\n }\r\n }\r\n },\r\n \"gemini-2.5-pro\": {\r\n \"displayName\": \"Gemini 2.5 Pro\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 1024,\r\n \"minThinkingBudget\": 128,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_GOOGLE_GEMINI_2_5_PRO\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportedMimeTypes\": {\r\n \"video/mp4\": true,\r\n \"text/html\": true,\r\n \"text/javascript\": true,\r\n \"image/heif\": true,\r\n \"text/x-python-script\": true,\r\n \"text/x-typescript\": true,\r\n \"video/text/timestamp\": true,\r\n \"text/xml\": true,\r\n \"text/x-python\": true,\r\n \"video/jpeg2000\": true,\r\n \"text/plain\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"image/webp\": true,\r\n \"video/audio/wav\": true,\r\n \"application/x-python-code\": true,\r\n \"text/csv\": true,\r\n \"text/rtf\": true,\r\n \"application/x-typescript\": true,\r\n \"image/png\": true,\r\n \"video/audio/s16le\": true,\r\n \"application/rtf\": true,\r\n \"application/pdf\": true,\r\n \"application/json\": true,\r\n \"application/x-javascript\": true,\r\n \"text/css\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"text/markdown\": true,\r\n \"image/heic\": true,\r\n \"image/jpeg\": true,\r\n \"video/webm\": true\r\n },\r\n \"requiresImageOutputOutsideFunctionResponses\": true,\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n }\r\n },\r\n \"claude-opus-4-6-thinking\": {\r\n \"displayName\": \"Claude Opus 4.6 (Thinking)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 1024,\r\n \"recommended\": true,\r\n \"maxTokens\": 250000,\r\n \"maxOutputTokens\": 64000,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 0.15333453,\r\n \"resetTime\": \"2026-06-26T16:48:02Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M26\",\r\n \"apiProvider\": \"API_PROVIDER_ANTHROPIC_VERTEX\",\r\n \"modelProvider\": \"MODEL_PROVIDER_ANTHROPIC\",\r\n \"supportedMimeTypes\": {\r\n \"video/jpeg2000\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"image/heic\": true,\r\n \"image/heif\": true,\r\n \"image/jpeg\": true,\r\n \"image/png\": true,\r\n \"image/webp\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_UNSPECIFIED\\\",\\n \\\"max_token_limit\\\": \\\"160000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n }\r\n }\r\n },\r\n \"vertexModelId\": \"claude-opus-4-6@default\"\r\n },\r\n \"gemini-3.1-pro-low\": {\r\n \"displayName\": \"Gemini 3.1 Pro (Low)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 1001,\r\n \"minThinkingBudget\": 128,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M36\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"supportedMimeTypes\": {\r\n \"text/x-python-script\": true,\r\n \"application/pdf\": true,\r\n \"image/webp\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"video/jpeg2000\": true,\r\n \"application/x-typescript\": true,\r\n \"image/heif\": true,\r\n \"text/markdown\": true,\r\n \"text/rtf\": true,\r\n \"video/audio/s16le\": true,\r\n \"text/plain\": true,\r\n \"video/mp4\": true,\r\n \"text/x-typescript\": true,\r\n \"application/json\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"video/webm\": true,\r\n \"video/audio/wav\": true,\r\n \"text/html\": true,\r\n \"application/rtf\": true,\r\n \"text/x-python\": true,\r\n \"image/png\": true,\r\n \"text/xml\": true,\r\n \"application/x-javascript\": true,\r\n \"image/jpeg\": true,\r\n \"text/csv\": true,\r\n \"application/x-python-code\": true,\r\n \"text/css\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"text/javascript\": true,\r\n \"video/text/timestamp\": true,\r\n \"image/heic\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"template__system_prompts__communication_style\": {\r\n \"stringValue\": \"- Keep your responses concise.\\n- Provide a summary of your work when you end your turn.\\n- Format your responses in github-style markdown.\\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\\n\\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\\\nCRITICAL INSTRUCTION 1: ...\\\\nCRITICAL INSTRUCTION 2: ...'.\"\r\n },\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n },\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n },\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"cascade-include-ephemeral-message\": {\r\n \"stringValue\": \"{\\n \\\"enabled\\\": true,\\n \\\"disabledHeuristics\\\": [\\\"running_tasks_reminder\\\"],\\n \\\"staticMessages\\\": [],\\n \\\"useAllowlist\\\": false,\\n \\\"enabledHeuristics\\\": []\\n}\"\r\n }\r\n }\r\n }\r\n },\r\n \"claude-sonnet-4-6\": {\r\n \"displayName\": \"Claude Sonnet 4.6 (Thinking)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 1024,\r\n \"recommended\": true,\r\n \"maxTokens\": 250000,\r\n \"maxOutputTokens\": 64000,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 0.15333453,\r\n \"resetTime\": \"2026-06-26T16:48:02Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M35\",\r\n \"apiProvider\": \"API_PROVIDER_ANTHROPIC_VERTEX\",\r\n \"modelProvider\": \"MODEL_PROVIDER_ANTHROPIC\",\r\n \"supportedMimeTypes\": {\r\n \"image/png\": true,\r\n \"image/webp\": true,\r\n \"video/jpeg2000\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"image/heic\": true,\r\n \"image/heif\": true,\r\n \"image/jpeg\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n },\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n },\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_UNSPECIFIED\\\",\\n \\\"max_token_limit\\\": \\\"160000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n },\r\n \"vertexModelId\": \"claude-sonnet-4-6@default\"\r\n },\r\n \"gemini-3.1-flash-image\": {\r\n \"displayName\": \"Gemini 3.1 Flash Image\",\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M21\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\"\r\n },\r\n \"gemini-3.5-flash-extra-low\": {\r\n \"displayName\": \"Gemini 3.5 Flash (Low)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 1000,\r\n \"minThinkingBudget\": 32,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65536,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M187\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"tagTitle\": \"Fast\",\r\n \"tagDescription\": \"Limited time\",\r\n \"supportedMimeTypes\": {\r\n \"text/xml\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"text/javascript\": true,\r\n \"text/csv\": true,\r\n \"video/audio/wav\": true,\r\n \"image/jpeg\": true,\r\n \"application/x-typescript\": true,\r\n \"text/html\": true,\r\n \"text/x-python\": true,\r\n \"text/css\": true,\r\n \"text/markdown\": true,\r\n \"video/jpeg2000\": true,\r\n \"image/heic\": true,\r\n \"text/rtf\": true,\r\n \"application/x-javascript\": true,\r\n \"text/x-python-script\": true,\r\n \"application/x-python-code\": true,\r\n \"image/png\": true,\r\n \"application/pdf\": true,\r\n \"text/x-typescript\": true,\r\n \"image/heif\": true,\r\n \"image/webp\": true,\r\n \"video/webm\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"video/text/timestamp\": true,\r\n \"text/plain\": true,\r\n \"video/mp4\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"video/audio/s16le\": true,\r\n \"application/json\": true,\r\n \"application/rtf\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n },\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SAME_MODEL\\\",\\n \\\"max_token_limit\\\": \\\"256000\\\",\\n \\\"token_threshold\\\": \\\"100000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": true,\\n \\\"is_sync\\\": true,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": true,\\n \\\"include_conversation_log\\\": false,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n }\r\n }\r\n }\r\n },\r\n \"chat_20706\": {\r\n \"maxTokens\": 16384,\r\n \"tokenizerType\": \"QWEN2\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1\r\n },\r\n \"model\": \"MODEL_CHAT_20706\",\r\n \"apiProvider\": \"API_PROVIDER_INTERNAL\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsCumulativeContext\": true,\r\n \"tabJumpPrintLineRange\": true,\r\n \"supportsEstimateTokenCounter\": true,\r\n \"isInternal\": true,\r\n \"addCursorToFindReplaceTarget\": true,\r\n \"promptTemplaterType\": \"PROMPT_TEMPLATER_TYPE_CHATML\",\r\n \"toolFormatterType\": \"TOOL_FORMATTER_TYPE_XML\",\r\n \"requiresLeadInGeneration\": true\r\n },\r\n \"gemini-2.5-flash-lite\": {\r\n \"displayName\": \"Gemini 3.1 Flash Lite\",\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n }\r\n }\r\n }\r\n },\r\n \"chat_23310\": {\r\n \"maxTokens\": 32768,\r\n \"tokenizerType\": \"QWEN2\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1\r\n },\r\n \"model\": \"MODEL_CHAT_23310\",\r\n \"apiProvider\": \"API_PROVIDER_INTERNAL\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsCumulativeContext\": true,\r\n \"supportsEstimateTokenCounter\": true,\r\n \"isInternal\": true,\r\n \"promptTemplaterType\": \"PROMPT_TEMPLATER_TYPE_CHATML\",\r\n \"toolFormatterType\": \"TOOL_FORMATTER_TYPE_XML\",\r\n \"requiresLeadInGeneration\": true\r\n },\r\n \"gemini-pro-agent\": {\r\n \"displayName\": \"Gemini 3.1 Pro (High)\",\r\n \"supportsImages\": true,\r\n \"supportsThinking\": true,\r\n \"thinkingBudget\": 10001,\r\n \"minThinkingBudget\": 128,\r\n \"recommended\": true,\r\n \"maxTokens\": 1048576,\r\n \"maxOutputTokens\": 65535,\r\n \"tokenizerType\": \"LLAMA_WITH_SPECIAL\",\r\n \"quotaInfo\": {\r\n \"remainingFraction\": 1,\r\n \"resetTime\": \"2026-06-24T06:22:06Z\"\r\n },\r\n \"model\": \"MODEL_PLACEHOLDER_M16\",\r\n \"apiProvider\": \"API_PROVIDER_GOOGLE_GEMINI\",\r\n \"modelProvider\": \"MODEL_PROVIDER_GOOGLE\",\r\n \"supportsVideo\": true,\r\n \"supportedMimeTypes\": {\r\n \"image/png\": true,\r\n \"image/heic\": true,\r\n \"video/audio/wav\": true,\r\n \"text/xml\": true,\r\n \"application/json\": true,\r\n \"video/jpeg2000\": true,\r\n \"text/html\": true,\r\n \"application/x-javascript\": true,\r\n \"text/plain\": true,\r\n \"video/text/timestamp\": true,\r\n \"application/x-ipynb+json\": true,\r\n \"text/javascript\": true,\r\n \"application/x-python-code\": true,\r\n \"video/videoframe/jpeg2000\": true,\r\n \"audio/webm;codecs=opus\": true,\r\n \"image/jpeg\": true,\r\n \"text/markdown\": true,\r\n \"video/webm\": true,\r\n \"text/x-python-script\": true,\r\n \"video/mp4\": true,\r\n \"text/x-typescript\": true,\r\n \"text/x-python\": true,\r\n \"text/css\": true,\r\n \"video/audio/s16le\": true,\r\n \"application/x-typescript\": true,\r\n \"application/pdf\": true,\r\n \"text/csv\": true,\r\n \"image/webp\": true,\r\n \"image/heif\": true,\r\n \"application/rtf\": true,\r\n \"text/rtf\": true\r\n },\r\n \"modelExperiments\": {\r\n \"experiments\": {\r\n \"template__system_prompts__planning_mode_artifacts\": {\r\n \"stringValue\": \"When in planning mode, you will work with three special artifacts.\\n\\n# Tasks\\nPath: {{ArtifactDirectoryPath}}/task.md\\n\\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\\n\\n**Format**:\\n```markdown\\n- `[ ]` uncompleted tasks\\n- `[/]` in progress tasks (custom notation)\\n- `[x]` completed tasks\\n- Use indented lists for sub-items\\n```\\n\\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\\n\\n# Implementation Plan\\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\\n\\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\\n\\n**Format**: Use the following format, omitting any irrelevant sections.\\n```markdown\\n# [Goal Description]\\n\\nProvide a brief description of the problem, any background context, and what the change accomplishes.\\n\\n## User Review Required\\n\\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Open Questions\\n\\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\\n\\n## Proposed Changes\\n\\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\\n\\n### [Component Name]\\n\\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\\n\\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\\n\\n## Verification Plan\\n\\nSummary of how you will verify that your changes have the desired effects.\\n\\n### Automated Tests\\n- The commands of any automated tests you'll run.\\n\\n### Manual Verification\\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\\n```\\n\\n# Walkthrough\\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\\n\\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\\n\\n**Document**:\\n- Changes made\\n- What was tested\\n- Validation results\\n\\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\\n\"\r\n },\r\n \"CASCADE_USE_EXPERIMENT_CHECKPOINTER\": {\r\n \"stringValue\": \"{\\n \\\"strategy\\\": \\\"CHECKPOINT_STRATEGY_SINGLE_PROMPT\\\",\\n \\\"max_token_limit\\\": \\\"128000\\\",\\n \\\"token_threshold\\\": \\\"50000\\\",\\n \\\"max_overhead_ratio\\\": \\\"0.15\\\",\\n \\\"moving_window_size\\\": \\\"1\\\",\\n \\\"enabled\\\": true,\\n \\\"max_output_tokens\\\": \\\"16384\\\",\\n \\\"checkpoint_model\\\": \\\"MODEL_PLACEHOLDER_M50\\\",\\n \\\"use_last_planner_model\\\": false,\\n \\\"is_sync\\\": false,\\n \\\"max_user_requests\\\": 10,\\n \\\"include_last_user_message\\\": false,\\n \\\"include_conversation_log\\\": true,\\n \\\"include_running_task_snapshots\\\": true,\\n \\\"include_subagent_snapshots\\\": true,\\n \\\"include_artifact_snapshots\\\": true,\\n \\\"retry_config\\\": {\\n \\\"max_retries\\\": 0,\\n \\\"initial_sleep_duration_ms\\\": 1000,\\n \\\"exponential_multiplier\\\": 2,\\n \\\"include_error_feedback\\\": false\\n }\\n}\"\r\n },\r\n \"cascade-include-ephemeral-message\": {\r\n \"stringValue\": \"{\\n \\\"enabled\\\": true,\\n \\\"disabledHeuristics\\\": [\\\"running_tasks_reminder\\\"],\\n \\\"staticMessages\\\": [],\\n \\\"useAllowlist\\\": false,\\n \\\"enabledHeuristics\\\": []\\n}\"\r\n },\r\n \"template__system_prompts__communication_style\": {\r\n \"stringValue\": \"- Keep your responses concise.\\n- Provide a summary of your work when you end your turn.\\n- Format your responses in github-style markdown.\\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\\n\\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\\\nCRITICAL INSTRUCTION 1: ...\\\\nCRITICAL INSTRUCTION 2: ...'.\"\r\n },\r\n \"template__system_prompts__identity\": {\r\n \"stringValue\": \"You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\\nThis information may or may not be relevant to the coding task, it is up for you to decide.\"\r\n }\r\n }\r\n }\r\n }\r\n },\r\n \"defaultAgentModelId\": \"gemini-3.5-flash-low\",\r\n \"agentModelSorts\": [\r\n {\r\n \"displayName\": \"Recommended\",\r\n \"groups\": [\r\n {\r\n \"modelIds\": [\r\n \"gemini-3.5-flash-low\",\r\n \"gemini-3-flash-agent\",\r\n \"gemini-3.5-flash-extra-low\",\r\n \"gemini-3.1-pro-low\",\r\n \"gemini-pro-agent\",\r\n \"claude-sonnet-4-6\",\r\n \"claude-opus-4-6-thinking\",\r\n \"gpt-oss-120b-medium\"\r\n ]\r\n }\r\n ]\r\n }\r\n ],\r\n \"commandModelIds\": [\r\n \"gemini-3-flash\"\r\n ],\r\n \"tabModelIds\": [\r\n \"chat_20706\",\r\n \"chat_23310\"\r\n ],\r\n \"imageGenerationModelIds\": [\r\n \"gemini-3.1-flash-image\"\r\n ],\r\n \"mqueryModelIds\": [\r\n \"gemini-3.1-flash-lite\"\r\n ],\r\n \"webSearchModelIds\": [\r\n \"gemini-3.1-flash-lite\"\r\n ],\r\n \"deprecatedModelIds\": {\r\n \"gemini-3.1-pro-high\": {\r\n \"newModelId\": \"gemini-pro-agent\",\r\n \"oldModelEnum\": \"MODEL_PLACEHOLDER_M37\",\r\n \"newModelEnum\": \"MODEL_PLACEHOLDER_M16\"\r\n }\r\n },\r\n \"commitMessageModelIds\": [\r\n \"gemini-3.1-flash-lite\"\r\n ],\r\n \"audioTranscriptionModelIds\": [\r\n \"models/proactive-observer\"\r\n ],\r\n \"experimentIds\": [\r\n 106101246,\r\n 106329230,\r\n 106366579,\r\n 105979552,\r\n 105979574,\r\n 106015333,\r\n 105979579,\r\n 105867471,\r\n 106123599,\r\n 106076629,\r\n 106121401,\r\n 106100625,\r\n 106143956,\r\n 105879567,\r\n 105856899,\r\n 106312323,\r\n 106064030,\r\n 105757908,\r\n 106240758,\r\n 106106760,\r\n 106021688,\r\n 106014288,\r\n 105887299,\r\n 106283618,\r\n 106278607,\r\n 106380926,\r\n 106212376,\r\n 106309520,\r\n 106281951,\r\n 106264532,\r\n 106222835,\r\n 106044947,\r\n 106032303,\r\n 106228452,\r\n 106121607,\r\n 105979531,\r\n 105979553,\r\n 106015328,\r\n 105867469,\r\n 106123597,\r\n 106121399,\r\n 106100654,\r\n 106064028,\r\n 106240748,\r\n 106283614,\r\n 106038164,\r\n 106032301,\r\n 106121604\r\n ],\r\n \"tieredModelIds\": {\r\n \"flashLite\": [\r\n \"gemini-3.1-flash-lite\"\r\n ],\r\n \"flash\": [\r\n \"gemini-3-flash-agent\"\r\n ],\r\n \"pro\": [\r\n \"gemini-3.1-pro-low\"\r\n ]\r\n }\r\n}\r\n","import { MAX_MODEL_CATALOG } from '../../core/constants.js';\r\nimport { resolveLocalProviderApiKey } from '../../core/credentials.js';\r\nimport { buildFavoritesList, type ResolveContext } from '../../agents/shared/favorites-resolver.js';\r\nimport type { FavoriteModel, LocalProvider, LocalProviderModel } from '../../core/types.js';\r\nimport { buildAntigravityRoutes } from './catalog.js';\r\nimport type { AntigravityRoute } from './types.js';\r\n\r\nexport interface ResolveAntigravityLaunchRoutesOptions {\r\n provider: LocalProvider;\r\n model: LocalProviderModel;\r\n allProviders: LocalProvider[];\r\n favorites?: FavoriteModel[];\r\n maxRoutes?: number;\r\n}\r\n\r\nexport interface ResolveAntigravityLaunchRoutesResult {\r\n routes: AntigravityRoute[];\r\n apiKey: string;\r\n droppedFavorites: FavoriteModel[];\r\n capacitySkippedFavorites: FavoriteModel[];\r\n}\r\n\r\nexport async function resolveAntigravityLaunchRoutes(\r\n opts: ResolveAntigravityLaunchRoutesOptions,\r\n): Promise<ResolveAntigravityLaunchRoutesResult | null> {\r\n const maxRoutes = opts.maxRoutes ?? MAX_MODEL_CATALOG;\r\n const apiKey = await resolveLocalProviderApiKey(opts.provider);\r\n if (!apiKey) return null;\r\n\r\n const starting = {\r\n providerId: opts.provider.id,\r\n providerName: opts.provider.name,\r\n model: opts.model,\r\n apiKey,\r\n authType: opts.provider.authType,\r\n oauthAccountId: opts.provider.oauthAccountId,\r\n providerData: opts.provider.providerData,\r\n };\r\n const ctx: ResolveContext = {\r\n agent: 'antigravity',\r\n localProviders: opts.allProviders,\r\n findLocalModel: (providerId, modelId) => {\r\n const provider = opts.allProviders.find(candidate => candidate.id === providerId);\r\n const model = provider?.models.find(candidate => candidate.id === modelId);\r\n return provider && model ? { provider, model } : undefined;\r\n },\r\n };\r\n const { resolved, droppedFavorites, capacitySkippedFavorites } = await buildFavoritesList(\r\n starting,\r\n opts.favorites ?? [],\r\n ctx,\r\n maxRoutes,\r\n { dropEmptyApiKey: true, trackCapacitySkipped: true },\r\n );\r\n\r\n return {\r\n routes: buildAntigravityRoutes(resolved, maxRoutes),\r\n apiKey,\r\n droppedFavorites,\r\n capacitySkippedFavorites,\r\n };\r\n}\r\n","import { execFileSync, execSync, spawn } from 'node:child_process';\r\nimport { existsSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { getAppPathOverride } from '../../core/config.js';\r\n\r\nconst isWindows = process.platform === 'win32';\r\n\r\nconst FALLBACK_PATHS = isWindows\r\n ? [\r\n join(process.env['APPDATA'] ?? homedir(), 'npm', 'agy.cmd'),\r\n join(process.env['APPDATA'] ?? homedir(), 'npm', 'agy'),\r\n join(homedir(), 'AppData', 'Roaming', 'npm', 'agy.cmd'),\r\n ]\r\n : [\r\n join(homedir(), '.local', 'bin', 'agy'),\r\n join(homedir(), '.npm', 'bin', 'agy'),\r\n '/usr/local/bin/agy',\r\n '/opt/homebrew/bin/agy',\r\n ];\r\n\r\nexport function findAntigravityCliBinary(): string | null {\r\n const override = getAppPathOverride('agy');\r\n if (override) return existsSync(override) ? override : null;\r\n\r\n try {\r\n const result = execSync(isWindows ? 'where.exe agy' : 'which agy', {\r\n encoding: 'utf8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n });\r\n const path = result.trim().split('\\n')[0]?.trim();\r\n if (path) return path;\r\n } catch {\r\n // command failed — try fallback paths\r\n }\r\n for (const path of FALLBACK_PATHS) {\r\n if (existsSync(path)) return path;\r\n }\r\n return null;\r\n}\r\n\r\nexport interface AntigravityCliVersionResult {\r\n version: string | null;\r\n raw?: string;\r\n error?: string;\r\n}\r\n\r\nexport function readAntigravityCliVersion(binaryPath = findAntigravityCliBinary() ?? undefined): AntigravityCliVersionResult {\r\n if (!binaryPath) {\r\n return { version: null, error: 'Antigravity CLI binary \"agy\" not found' };\r\n }\r\n\r\n try {\r\n const raw = execFileSync(binaryPath, ['--version'], {\r\n encoding: 'utf8',\r\n stdio: ['ignore', 'pipe', 'pipe'],\r\n }).trim();\r\n const version = raw.match(/\\d+\\.\\d+\\.\\d+/)?.[0] ?? null;\r\n return version\r\n ? { version, raw }\r\n : { version: null, raw, error: `Unexpected agy --version output: ${raw}` };\r\n } catch (err) {\r\n return {\r\n version: null,\r\n error: err instanceof Error ? err.message : String(err),\r\n };\r\n }\r\n}\r\n\r\nexport function launchAntigravityCli(\r\n env: NodeJS.ProcessEnv,\r\n extraArgs: string[],\r\n): Promise<number> {\r\n return new Promise((resolve) => {\r\n const binaryPath = findAntigravityCliBinary();\r\n if (!binaryPath) {\r\n console.error('Antigravity CLI binary \"agy\" not found.');\r\n resolve(127);\r\n return;\r\n }\r\n\r\n const child = spawn(binaryPath, extraArgs, {\r\n stdio: 'inherit',\r\n env,\r\n shell: isWindows,\r\n });\r\n\r\n const forward = (signal: NodeJS.Signals): void => {\r\n child.kill(signal);\r\n };\r\n\r\n const handleSIGINT = (): void => forward('SIGINT');\r\n const handleSIGTERM = (): void => forward('SIGTERM');\r\n const cleanup = (): void => {\r\n process.removeListener('SIGINT', handleSIGINT);\r\n process.removeListener('SIGTERM', handleSIGTERM);\r\n };\r\n process.once('SIGINT', handleSIGINT);\r\n process.once('SIGTERM', handleSIGTERM);\r\n\r\n child.on('exit', (code) => {\r\n cleanup();\r\n resolve(code ?? 1);\r\n });\r\n\r\n child.on('error', (err) => {\r\n cleanup();\r\n console.error(`Failed to launch Antigravity CLI: ${err.message}`);\r\n resolve(1);\r\n });\r\n });\r\n}\r\n","import { execFileSync, execSync, spawn } from 'node:child_process';\r\nimport { existsSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { prepareIdeProfile } from './ide-profile.js';\r\nimport { getAppPathOverride } from '../../core/config.js';\r\n\r\ntype ProcessListOptions = {\r\n processList?: () => string;\r\n};\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nfunction runPowerShell(script: string): string {\r\n return execSync(`powershell.exe -NoProfile -Command ${JSON.stringify(script)}`, {\r\n encoding: 'utf8',\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n }).trim();\r\n}\r\n\r\nfunction winIsProcessRunningForProfile(exeName: string, profileDir: string): boolean {\r\n try {\r\n const escapedDir = profileDir.replace(/'/g, \"''\");\r\n const out = runPowerShell(\r\n `Get-CimInstance Win32_Process -Filter \"Name='${exeName}'\" | Where-Object { $_.CommandLine -like '*--user-data-dir=${escapedDir}*' } | Select-Object -ExpandProperty ProcessId`,\r\n );\r\n return out.length > 0;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction winQuitProcess(exeName: string): void {\r\n try {\r\n runPowerShell(\r\n `Get-Process -Name '${exeName.replace(/\\.exe$/i, '')}' -ErrorAction SilentlyContinue | ForEach-Object { [void]$_.CloseMainWindow() }`,\r\n );\r\n } catch { /* ignore */ }\r\n}\r\n\r\n/**\r\n * Force-kill any still-running instance for this profile. Needed because\r\n * CloseMainWindow() only asks nicely — apps that minimize to the tray\r\n * instead of exiting on window-close will otherwise keep running with\r\n * the old config loaded, so a \"restart\" silently does nothing.\r\n */\r\nfunction winForceQuitProcess(exeName: string, profileDir: string): void {\r\n try {\r\n const escapedDir = profileDir.replace(/'/g, \"''\");\r\n runPowerShell(\r\n `Get-CimInstance Win32_Process -Filter \"Name='${exeName}'\" | Where-Object { $_.CommandLine -like '*--user-data-dir=${escapedDir}*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue }`,\r\n );\r\n } catch { /* ignore */ }\r\n}\r\n\r\nfunction defaultProcessList(): string {\r\n if (process.platform !== 'darwin') return '';\r\n try {\r\n return execFileSync('ps', ['-axo', 'pid=,command='], {\r\n encoding: 'utf8',\r\n stdio: ['ignore', 'pipe', 'ignore'],\r\n maxBuffer: 1024 * 1024 * 4,\r\n });\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\nexport function isAntigravityIdeRunning(profileDir: string, processList = defaultProcessList): boolean {\r\n if (process.platform === 'win32') return winIsProcessRunningForProfile('Antigravity IDE.exe', profileDir);\r\n const output = processList();\r\n return output\r\n .split('\\n')\r\n .some(line => line.includes('Antigravity IDE.app') && line.includes(`--user-data-dir=${profileDir}`));\r\n}\r\n\r\nexport function isAntigravityAppRunning(profileDir: string, processList = defaultProcessList): boolean {\r\n if (process.platform === 'win32') return winIsProcessRunningForProfile('Antigravity.exe', profileDir);\r\n const output = processList();\r\n return output\r\n .split('\\n')\r\n .some(line => line.includes('Antigravity.app') && line.includes(`--user-data-dir=${profileDir}`));\r\n}\r\n\r\nexport async function waitForAntigravityIdeQuit(\r\n profileDir: string,\r\n options: ProcessListOptions & { timeoutMs?: number; pollIntervalMs?: number } = {},\r\n): Promise<boolean> {\r\n const processList = options.processList ?? defaultProcessList;\r\n const deadline = Date.now() + (options.timeoutMs ?? 5_000);\r\n const pollIntervalMs = options.pollIntervalMs ?? 200;\r\n while (Date.now() < deadline) {\r\n if (!isAntigravityIdeRunning(profileDir, processList)) return true;\r\n await sleep(pollIntervalMs);\r\n }\r\n return !isAntigravityIdeRunning(profileDir, processList);\r\n}\r\n\r\nexport async function waitForAntigravityAppQuit(\r\n profileDir: string,\r\n options: ProcessListOptions & { timeoutMs?: number; pollIntervalMs?: number } = {},\r\n): Promise<boolean> {\r\n const processList = options.processList ?? defaultProcessList;\r\n const deadline = Date.now() + (options.timeoutMs ?? 5_000);\r\n const pollIntervalMs = options.pollIntervalMs ?? 200;\r\n while (Date.now() < deadline) {\r\n if (!isAntigravityAppRunning(profileDir, processList)) return true;\r\n await sleep(pollIntervalMs);\r\n }\r\n return !isAntigravityAppRunning(profileDir, processList);\r\n}\r\n\r\n/** Windows-only: force-kill a still-running managed Antigravity IDE process. No-op elsewhere. */\r\nexport function forceQuitAntigravityIde(profileDir: string): void {\r\n if (process.platform === 'win32') winForceQuitProcess('Antigravity IDE.exe', profileDir);\r\n}\r\n\r\n/** Windows-only: force-kill a still-running managed standalone Antigravity process. No-op elsewhere. */\r\nexport function forceQuitAntigravityApp(profileDir: string): void {\r\n if (process.platform === 'win32') winForceQuitProcess('Antigravity.exe', profileDir);\r\n}\r\n\r\nexport function quitAntigravityIdeGracefully(): void {\r\n if (process.platform === 'win32') { winQuitProcess('Antigravity IDE.exe'); return; }\r\n if (process.platform !== 'darwin') return;\r\n try {\r\n execFileSync('osascript', ['-e', 'tell application \"Antigravity IDE\" to quit'], {\r\n stdio: ['ignore', 'pipe', 'pipe'],\r\n });\r\n } catch {\r\n execFileSync('osascript', ['-e', 'tell application id \"com.google.antigravity-ide\" to quit'], {\r\n stdio: ['ignore', 'pipe', 'pipe'],\r\n });\r\n }\r\n}\r\n\r\nexport function quitAntigravityAppGracefully(): void {\r\n if (process.platform === 'win32') { winQuitProcess('Antigravity.exe'); return; }\r\n if (process.platform !== 'darwin') return;\r\n try {\r\n execFileSync('osascript', ['-e', 'tell application \"Antigravity\" to quit'], {\r\n stdio: ['ignore', 'pipe', 'pipe'],\r\n });\r\n } catch {\r\n execFileSync('osascript', ['-e', 'tell application id \"com.google.antigravity\" to quit'], {\r\n stdio: ['ignore', 'pipe', 'pipe'],\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Locate the standalone Antigravity app binary path (macOS + Windows).\r\n * Returns null if not installed or the platform is unsupported.\r\n */\r\nexport function findAntigravityAppBinary(): string | null {\r\n const override = getAppPathOverride('antigravity');\r\n if (override) return existsSync(override) ? override : null;\r\n\r\n if (process.platform === 'win32') {\r\n const localAppData = process.env['LOCALAPPDATA'] ?? join(homedir(), 'AppData', 'Local');\r\n const winPath = join(localAppData, 'Programs', 'Antigravity', 'Antigravity.exe');\r\n return existsSync(winPath) ? winPath : null;\r\n }\r\n\r\n if (process.platform !== 'darwin') return null;\r\n\r\n const defaultPath = '/Applications/Antigravity.app/Contents/MacOS/Antigravity';\r\n if (existsSync(defaultPath)) return defaultPath;\r\n\r\n const homePath = join(homedir(), 'Applications', 'Antigravity.app', 'Contents', 'MacOS', 'Antigravity');\r\n if (existsSync(homePath)) return homePath;\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Locate the Antigravity IDE binary path.\r\n *\r\n * Currently support macOS (/Applications/Antigravity IDE.app) with fallbacks.\r\n * Returns null if not on macOS or if the app is not installed.\r\n */\r\nexport function findAntigravityIdeBinary(): string | null {\r\n const override = getAppPathOverride('antigravity-ide');\r\n if (override) return existsSync(override) ? override : null;\r\n\r\n if (process.platform === 'win32') {\r\n const localAppData = process.env['LOCALAPPDATA'] ?? join(homedir(), 'AppData', 'Local');\r\n const winPath = join(localAppData, 'Programs', 'Antigravity IDE', 'Antigravity IDE.exe');\r\n return existsSync(winPath) ? winPath : null;\r\n }\r\n\r\n if (process.platform !== 'darwin') return null;\r\n\r\n const defaultPath = '/Applications/Antigravity IDE.app/Contents/Resources/app/bin/antigravity-ide';\r\n if (existsSync(defaultPath)) return defaultPath;\r\n\r\n const homePath = join(homedir(), 'Applications', 'Antigravity IDE.app', 'Contents', 'Resources', 'app', 'bin', 'antigravity-ide');\r\n if (existsSync(homePath)) return homePath;\r\n\r\n return null;\r\n}\r\n\r\nexport function launchAntigravityApp(\r\n env: NodeJS.ProcessEnv,\r\n profileDir: string,\r\n gatewayUrl: string,\r\n extraArgs: string[],\r\n): Promise<number> {\r\n return new Promise((resolve) => {\r\n let settled = false;\r\n const settle = (code: number): void => {\r\n if (settled) return;\r\n settled = true;\r\n resolve(code);\r\n };\r\n const binaryPath = findAntigravityAppBinary();\r\n if (!binaryPath) {\r\n console.error('Antigravity app bundle not found at \"/Applications/Antigravity.app\".');\r\n console.error('Please make sure Antigravity is installed on your Mac.');\r\n settle(127);\r\n return;\r\n }\r\n\r\n prepareIdeProfile(profileDir, gatewayUrl);\r\n\r\n const args = [\r\n `--user-data-dir=${profileDir}`,\r\n ...extraArgs,\r\n ];\r\n\r\n const child = spawn(binaryPath, args, {\r\n stdio: 'inherit',\r\n env,\r\n });\r\n\r\n child.on('spawn', () => {\r\n settle(0);\r\n });\r\n\r\n child.on('exit', (code) => {\r\n settle(code ?? 1);\r\n });\r\n\r\n child.on('error', (err) => {\r\n console.error(`Failed to launch Antigravity: ${err.message}`);\r\n settle(1);\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Launch the Antigravity IDE under an isolated Gateway-managed profile.\r\n *\r\n * It prepares the isolated user data directory, configures the local Cloud Code gateway URL\r\n * both in env and profile settings, and spawns the IDE with correct args.\r\n *\r\n * @param env Child process environment variables\r\n * @param profileDir Absolute path to the isolated profile directory\r\n * @param gatewayUrl Local gateway URL\r\n * @param extraArgs Passthrough args from the user\r\n */\r\nexport function launchAntigravityIde(\r\n env: NodeJS.ProcessEnv,\r\n profileDir: string,\r\n gatewayUrl: string,\r\n extraArgs: string[],\r\n): Promise<number> {\r\n return new Promise((resolve) => {\r\n const binaryPath = findAntigravityIdeBinary();\r\n if (!binaryPath) {\r\n console.error('Antigravity IDE app bundle not found at \"/Applications/Antigravity IDE.app\".');\r\n console.error('Please make sure Antigravity IDE is installed on your Mac.');\r\n resolve(127);\r\n return;\r\n }\r\n\r\n // 1. Prepare the isolated profile and set jetski.cloudCodeUrl\r\n prepareIdeProfile(profileDir, gatewayUrl);\r\n\r\n // 2. Build VS Code arguments\r\n // Keep Gateway's Antigravity profile fully isolated from the normal IDE profile.\r\n const gatewayExtensionsDir = join(homedir(), '.anygate', 'antigravity', 'extensions');\r\n const args = [\r\n `--user-data-dir=${profileDir}`,\r\n `--extensions-dir=${gatewayExtensionsDir}`,\r\n ...extraArgs,\r\n ];\r\n\r\n const child = spawn(binaryPath, args, {\r\n stdio: 'inherit',\r\n env,\r\n });\r\n\r\n child.on('exit', (code) => {\r\n resolve(code ?? 1);\r\n });\r\n\r\n child.on('error', (err) => {\r\n console.error(`Failed to launch Antigravity IDE: ${err.message}`);\r\n resolve(1);\r\n });\r\n });\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\n/**\r\n * Read the settings.json file from the specified path.\r\n *\r\n * @param settingsPath Absolute path to settings.json\r\n * @returns Parsed JSON settings object, or empty object if not found or malformed\r\n */\r\nexport function readIdeSettings(settingsPath: string): Record<string, any> {\r\n if (!fs.existsSync(settingsPath)) return {};\r\n try {\r\n const raw = fs.readFileSync(settingsPath, 'utf8');\r\n return JSON.parse(raw) as Record<string, any>;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Write a settings object atomically back to the specified path.\r\n *\r\n * @param settingsPath Absolute path to settings.json\r\n * @param settings Settings object to write\r\n */\r\nexport function writeIdeSettings(settingsPath: string, settings: Record<string, any>): void {\r\n const tempPath = `${settingsPath}.tmp-${Date.now()}`;\r\n fs.writeFileSync(tempPath, JSON.stringify(settings, null, 2), 'utf8');\r\n fs.renameSync(tempPath, settingsPath);\r\n}\r\n\r\n/**\r\n * Prepare an isolated, Gateway-owned profile directory for the Antigravity IDE.\r\n *\r\n * It creates the `User` directory, reads any existing `settings.json`, updates/sets\r\n * `jetski.cloudCodeUrl` to our randomized gateway URL, and writes it back atomically.\r\n * It also restricts permissions of the profile directory to 0700 for security.\r\n *\r\n * @param profileDir Absolute path to the isolated profile directory\r\n * @param gatewayUrl The randomized local gateway URL\r\n * @returns The resolved profile directory path\r\n */\r\nexport function prepareIdeProfile(profileDir: string, gatewayUrl: string): string {\r\n // 1. Create the directory with 0700 permissions (rwx------)\r\n fs.mkdirSync(profileDir, { recursive: true, mode: 0o700 });\r\n\r\n const userDir = path.join(profileDir, 'User');\r\n fs.mkdirSync(userDir, { recursive: true });\r\n\r\n const settingsPath = path.join(userDir, 'settings.json');\r\n const settings = readIdeSettings(settingsPath);\r\n\r\n // 2. Set/update only the jetski.cloudCodeUrl parameter\r\n settings['jetski.cloudCodeUrl'] = gatewayUrl;\r\n settings['telemetry.telemetryLevel'] = 'off';\r\n settings['telemetry.enableTelemetry'] = false;\r\n settings['telemetry.enableCrashReporter'] = false;\r\n\r\n // 3. Write atomically to prevent corrupting settings on write failures\r\n writeIdeSettings(settingsPath, settings);\r\n\r\n return profileDir;\r\n}\r\n","// codex-app.ts — anygate codex-app / chatgpt: launch the ChatGPT desktop app (Codex mode) with registry providers\r\nimport pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport { fetchProviderCatalog, providersForPicker } from '../../../src/providers/provider-catalog.js';\r\nimport { resolveLocalProviderApiKey } from '../../../src/core/credentials.js';\r\nimport { loadPreferences, savePreferences } from '../../../src/core/config.js';\r\nimport { resolveApiKey, readFromCredentialStore } from '../../../src/core/env.js';\r\nimport { resolveOrCollectApiKey } from '../../agents/shared/key-setup.js';\r\nimport { startCodexProxy } from './proxy.js';\r\nimport type { CodexProxyHandle, CodexProxyRoute } from './proxy.js';\r\nimport { getCodexProxyDebugLogPath, printTraceLog } from '../../agents/shared/trace-log.js';\r\nimport { buildAppCatalogFile, formatCodexModelLabel, serializeCatalog } from './catalog.js';\r\nimport { pickCodexProvider, pickCodexModel, confirmCodexLaunch } from './prompts.js';\r\nimport {\r\n codexCompatibleProviders,\r\n resolveCodexRoute,\r\n routableModelsForProvider,\r\n type CodexRoute,\r\n} from './routing.js';\r\nimport { buildCodexAppProviderCatalogRoutes } from './app-provider-routes.js';\r\nimport { applyAppConfigPatch, previewAppConfigToml } from './app-config.js';\r\nimport { PREVIEW_PROXY_PORT, type CodexAppConfigSpec } from './app-profile.js';\r\nimport type { LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\nimport {\r\n backupConfigToml,\r\n checkAppSessionLock,\r\n getAppCatalogPath,\r\n getAppRestoreStatePath,\r\n getCodexConfigPath,\r\n recoverInterruptedCodexAppSession,\r\n restoreCodexAppOverlay,\r\n saveAppRestoreStateBeforePatch,\r\n waitForShutdown,\r\n writeAppSessionLock,\r\n} from './app-session.js';\r\nimport { writeOverlayFile } from './session.js';\r\nimport { codexAppInstallHint, codexAppSupported, launchOrRestartCodexApp, isCodexAppRunning, quitCodexAppGracefully } from './app-launch.js';\r\nimport {\r\n codexAppIntro,\r\n codexAppOutro,\r\n logCodexActiveModel,\r\n logCodexProxy,\r\n printCodexAppSessionPanel,\r\n} from './ui.js';\r\nimport type { ResolvedFavorite } from '../../agents/shared/favorites-resolver.js';\r\nimport { buildFavoritesAppCatalog, codexCliFavoritesSlug } from './favorites-catalog.js';\r\nimport {\r\n buildVertexRuntimeConfig,\r\n hasApplicationDefaultCredentials,\r\n type VertexModelEntry,\r\n} from '../../../src/gateway/vertex.js';\r\nimport { VERTEX_ANTHROPIC_NPM } from '../../../src/core/constants.js';\r\nimport { resolveContextWindow } from '../../agents/shared/context-window.js';\r\nimport {\r\n buildCodexProxyRoutesFromResolved,\r\n pickFavoriteStartingModel,\r\n resolveBootSelection,\r\n resolveCodexFavorites,\r\n} from './favorites-launch.js';\r\nimport { getFavoritesAppCatalogPath } from './profile.js';\r\nimport {\r\n buildCloudCodeProxyRoute,\r\n buildOAuthAnthropicProxyRoute,\r\n startCloudCodeCatalogBackend,\r\n type CloudCodeBackend,\r\n} from '../shared/cloud-code-backend.js';\r\nimport type { ProxyRoute } from '../../../src/gateway/anthropic-proxy.js';\r\n\r\nfunction codexProxyRouteToCodexRoute(route: CodexProxyRoute, fallbackProviderId: string): CodexRoute {\r\n return {\r\n tier: 'proxy',\r\n modelId: route.modelId,\r\n providerId: route.providerId ?? fallbackProviderId,\r\n npm: route.npm,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n upstreamModelId: route.upstreamModelId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n contextWindow: route.contextWindow,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n headers: route.headers,\r\n };\r\n}\r\n\r\nasync function waitForShutdownWithConfirm(): Promise<void> {\r\n while (true) {\r\n const signal = await waitForShutdown();\r\n if (signal !== 'sigint') break; // SIGTERM/SIGHUP: close immediately, no one to ask\r\n console.log('');\r\n const choice = await p.select({\r\n message: 'Close ChatGPT Desktop and restore your Codex config?',\r\n options: [\r\n { value: 'yes', label: 'Yes, close ChatGPT Desktop and restore config' },\r\n { value: 'no', label: 'No, keep session running' },\r\n ],\r\n });\r\n if (p.isCancel(choice) || choice === 'yes') break; // Ctrl+C or Yes = close\r\n // choice === 'no' → loop back and keep waiting\r\n }\r\n}\r\n\r\nexport async function maybeCloseRunningCodexApp(): Promise<void> {\r\n if (!isCodexAppRunning()) return;\r\n\r\n const shouldClose = await p.confirm({ message: 'ChatGPT Desktop is still running. Close it?' });\r\n if (shouldClose && !p.isCancel(shouldClose)) {\r\n p.log.step('Stopping ChatGPT Desktop...');\r\n quitCodexAppGracefully();\r\n }\r\n}\r\n\r\nexport function codexAppHelpText(): string {\r\n return `${pc.bold('anygate codex-app')} — launch the ChatGPT desktop app (Codex mode) with your registry providers\r\n${pc.dim('(OpenAI merged the Codex app into ChatGPT desktop on 2026-07-09; \"chatgpt\" is an alias for this command)')}\r\n\r\n${pc.bold('Usage:')}\r\n anygate codex-app [options]\r\n anygate chatgpt [options]\r\n anygate codex-app --vertex\r\n anygate codex-app --restore\r\n anygate codex-app --config\r\n anygate codex-app --help\r\n anygate codex-app --version\r\n\r\n${pc.bold('Options:')}\r\n --vertex Use Claude models through Google Vertex AI\r\n --restore Restore Codex config after an interrupted app session\r\n --config Preview the generated Codex app configuration without launching\r\n --trace Write proxy debug logs to ~/.anygate/logs/ and show errors on exit\r\n --help Show this command help\r\n --version Show version\r\n\r\n${pc.bold('Description:')}\r\n Picks a provider and model from ~/.anygate/providers.json, patches ~/.codex/config.toml\r\n (with backup + restore on Ctrl+C), starts a local Responses proxy, and opens the\r\n ChatGPT desktop app in Codex mode. Keep this terminal open while using Codex.\r\n\r\n${pc.bold('Platforms:')}\r\n macOS and Windows. Linux is not supported (no ChatGPT desktop app).\r\n\r\n${pc.bold('Cleanup:')}\r\n Ctrl+C stops the proxy and restores your previous Codex config.\r\n After crash: anygate codex-app --restore\r\n\r\n${pc.bold('Preview (no writes):')}\r\n anygate codex-app --config\r\n\r\n See docs/CODEX.md for CLI vs app, files touched, and restore.\r\n\r\n${pc.bold('Examples:')}\r\n anygate codex-app\r\n anygate codex-app --vertex\r\n anygate codex-app --config\r\n anygate codex-app --restore\r\n \r\n${pc.bold('Favorites:')}\r\n When you have saved favorites via ${pc.cyan('anygate models')}, the Codex App\r\n picker will show your starting model + favorites for mid-session switching.\r\n Zen/Go favorites are included when an OpenCode API key is available.`;\r\n}\r\n\r\nfunction providerForCodexPicker(provider: LocalProvider): LocalProvider {\r\n return { ...provider, models: routableModelsForProvider(provider, 'codex-app') };\r\n}\r\n\r\nfunction vertexEntryToLocalModel(entry: VertexModelEntry): import('../../core/types.js').LocalProviderModel {\r\n return {\r\n id: entry.id,\r\n name: entry.display_name,\r\n family: 'claude',\r\n brand: 'Anthropic',\r\n modelFormat: 'openai',\r\n upstreamModelId: entry.upstream_id ?? entry.id,\r\n baseUrl: '',\r\n npm: VERTEX_ANTHROPIC_NPM,\r\n contextWindow: resolveContextWindow(entry.id),\r\n };\r\n}\r\n\r\nasync function runCodexAppVertexLaunch(configOnly: boolean, trace = false): Promise<number> {\r\n if (!hasApplicationDefaultCredentials()) {\r\n p.log.error('Google Application Default Credentials not found.');\r\n p.log.info('Run: gcloud auth application-default login');\r\n return 1;\r\n }\r\n\r\n const config = buildVertexRuntimeConfig();\r\n if (!config) {\r\n p.log.error('ANTHROPIC_VERTEX_PROJECT_ID (or GOOGLE_CLOUD_PROJECT) is not set.');\r\n p.log.info('Set your project: export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id');\r\n return 1;\r\n }\r\n\r\n let selectedEntry: VertexModelEntry;\r\n if (config.models.length === 1) {\r\n selectedEntry = config.models[0]!;\r\n } else {\r\n const choice = await p.select({\r\n message: 'Select a starting Vertex AI model:',\r\n options: config.models.map(m => ({ value: m, label: m.display_name, hint: m.id })),\r\n });\r\n if (p.isCancel(choice)) { p.cancel('Cancelled.'); return 0; }\r\n selectedEntry = choice as VertexModelEntry;\r\n }\r\n\r\n process.env['ANTHROPIC_VERTEX_PROJECT_ID'] = config.project;\r\n process.env['GOOGLE_CLOUD_LOCATION'] = config.location;\r\n\r\n const vertexConfig = { project: config.project, location: config.location };\r\n const vertexModels = config.models.map(vertexEntryToLocalModel);\r\n const catalogPath = getAppCatalogPath('vertex');\r\n\r\n const route = {\r\n tier: 'proxy' as const,\r\n modelId: selectedEntry.id,\r\n upstreamModelId: selectedEntry.upstream_id ?? selectedEntry.id,\r\n npm: VERTEX_ANTHROPIC_NPM,\r\n apiKey: '',\r\n providerId: 'vertex',\r\n contextWindow: resolveContextWindow(selectedEntry.id),\r\n };\r\n\r\n if (configOnly) {\r\n const home = process.env['HOME'] ?? '';\r\n const shortenPath = (fp: string) => home ? fp.replace(home, '~') : fp;\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(' CONFIG PREVIEW — anygate codex-app --vertex')));\r\n console.log('');\r\n console.log(` ${pc.bold('Mode:')} Vertex AI`);\r\n console.log(` ${pc.bold('Project:')} ${config.project}`);\r\n console.log(` ${pc.bold('Location:')} ${config.location}`);\r\n console.log(` ${pc.bold('Model:')} ${selectedEntry.display_name}`);\r\n console.log(` ${pc.bold('Catalog:')} ${vertexModels.length} model${vertexModels.length !== 1 ? 's' : ''} available`);\r\n console.log('');\r\n console.log(` ${pc.bold('Catalog file:')}`);\r\n console.log(` ${pc.dim(shortenPath(catalogPath))}`);\r\n console.log('');\r\n console.log(pc.dim(' No app was launched.'));\r\n console.log(pc.dim(' Run ') + pc.cyan('anygate codex-app --vertex') + pc.dim(' to launch.'));\r\n console.log('');\r\n return 0;\r\n }\r\n\r\n let proxyHandle: CodexProxyHandle | null = null;\r\n let sessionActive = false;\r\n try {\r\n proxyHandle = await startCodexProxy(\r\n vertexModels.map(m => ({\r\n modelId: m.id,\r\n upstreamModelId: m.upstreamModelId,\r\n npm: VERTEX_ANTHROPIC_NPM,\r\n apiKey: '',\r\n providerId: 'vertex',\r\n vertex: vertexConfig,\r\n contextWindow: m.contextWindow,\r\n })),\r\n { requireAuth: false, debug: trace },\r\n );\r\n const proxyPort = proxyHandle.port;\r\n\r\n const catalogFile = buildAppCatalogFile(vertexModels, 'Vertex AI', selectedEntry.id);\r\n writeOverlayFile(catalogPath, serializeCatalog(catalogFile));\r\n\r\n const spec: CodexAppConfigSpec = {\r\n route,\r\n proxyPort,\r\n catalogPath,\r\n };\r\n\r\n saveAppRestoreStateBeforePatch();\r\n const backupPath = backupConfigToml();\r\n applyAppConfigPatch(spec);\r\n\r\n writeAppSessionLock({\r\n pid: process.pid,\r\n startedAt: new Date().toISOString(),\r\n configPath: getCodexConfigPath(),\r\n catalogPaths: [catalogPath],\r\n restoreStatePath: getAppRestoreStatePath(),\r\n backupPath,\r\n proxyPort,\r\n });\r\n sessionActive = true;\r\n\r\n p.log.info(`Vertex AI · ${selectedEntry.display_name} — project: ${config.project} / location: ${config.location}`);\r\n logCodexProxy(proxyPort);\r\n logCodexActiveModel(selectedEntry.display_name, selectedEntry.id);\r\n\r\n try {\r\n await launchOrRestartCodexApp();\r\n } catch (err) {\r\n p.log.warn(String(err instanceof Error ? err.message : err));\r\n p.log.info(codexAppInstallHint());\r\n }\r\n\r\n printCodexAppSessionPanel({\r\n modelLabel: selectedEntry.display_name,\r\n modelId: selectedEntry.id,\r\n providerName: 'Vertex AI',\r\n restoreCommand: 'anygate codex-app --restore',\r\n });\r\n\r\n codexAppOutro(selectedEntry.display_name);\r\n await waitForShutdownWithConfirm();\r\n console.log('');\r\n\r\n if (sessionActive) {\r\n restoreCodexAppOverlay();\r\n sessionActive = false;\r\n }\r\n await maybeCloseRunningCodexApp();\r\n return 0;\r\n } finally {\r\n proxyHandle?.close();\r\n if (sessionActive) restoreCodexAppOverlay();\r\n }\r\n}\r\n\r\nexport async function runCodexAppCommand(args: string[], opts: { vertex?: boolean; launchProvider?: string; launchModel?: string } = {}): Promise<number> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(codexAppHelpText());\r\n return 0;\r\n }\r\n\r\n if (args.includes('--restore')) {\r\n const result = restoreCodexAppOverlay();\r\n console.log(result.message);\r\n return result.liveSession ? 1 : 0;\r\n }\r\n\r\n try {\r\n codexAppSupported();\r\n } catch (err) {\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n\r\n const interrupted = recoverInterruptedCodexAppSession();\r\n const configOnly = args.includes('--config');\r\n const trace = args.includes('--trace');\r\n const debugLogPath = getCodexProxyDebugLogPath();\r\n if (trace && !configOnly) {\r\n p.log.info(`Debug log: ${debugLogPath}`);\r\n }\r\n\r\n const isTty = Boolean(process.stdin.isTTY);\r\n if (!configOnly) {\r\n const sessionCheck = checkAppSessionLock(isTty);\r\n if (!sessionCheck.ok) {\r\n if (sessionCheck.reason === 'non_tty') {\r\n console.error(pc.red('anygate codex-app requires an interactive terminal.'));\r\n return 1;\r\n }\r\n console.error(pc.yellow(`Another anygate codex-app session may be running (pid ${sessionCheck.lock.pid}).`));\r\n console.error('Stop it with Ctrl+C in that terminal, or run anygate codex-app --restore after it exits.');\r\n return 1;\r\n }\r\n }\r\n\r\n if (!configOnly) {\r\n codexAppIntro();\r\n if (interrupted.recovered) {\r\n p.log.warn('Recovered from an interrupted codex-app session (restored Codex config).');\r\n }\r\n }\r\n\r\n if (opts.vertex) {\r\n return runCodexAppVertexLaunch(configOnly, trace);\r\n }\r\n\r\n const catalogSpinner = p.spinner();\r\n catalogSpinner.start('Loading your providers...');\r\n let catalog;\r\n try {\r\n catalog = await fetchProviderCatalog({ agent: 'codex-app' });\r\n } catch (err) {\r\n catalogSpinner.stop('');\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n catalogSpinner.stop('');\r\n\r\n const compatible = codexCompatibleProviders(providersForPicker(catalog), 'codex-app');\r\n if (compatible.length === 0) {\r\n if (!configOnly) {\r\n p.log.warn('No Codex-compatible providers in your registry.');\r\n p.log.info('Add a provider with anygate providers add.');\r\n }\r\n return 0;\r\n }\r\n\r\n const prefs = loadPreferences();\r\n const favorites = prefs.favoriteModels ?? [];\r\n const favoritesActive = favorites.length > 0;\r\n\r\n if (favoritesActive && !configOnly) {\r\n p.log.info(\r\n `Favorites mode active — Codex App picker will show ${favorites.length + 1} models (1 starting + ${favorites.length} favorites).`,\r\n );\r\n p.log.info('Edit with `anygate models`.');\r\n }\r\n\r\n let activeProvider = providerForCodexPicker(\r\n compatible.find(lp => lp.id === prefs.lastCodexProvider) ?? compatible[0]!,\r\n );\r\n let selectedModel = activeProvider.models.find(m => m.id === prefs.lastCodexModel)\r\n ?? activeProvider.models[0]!;\r\n\r\n if (!configOnly && opts.launchProvider && opts.launchModel) {\r\n const bootSelection = resolveBootSelection(\r\n compatible,\r\n opts.launchProvider,\r\n opts.launchModel,\r\n providerForCodexPicker,\r\n );\r\n if ('error' in bootSelection) {\r\n p.log.error(bootSelection.error);\r\n return 1;\r\n }\r\n activeProvider = bootSelection.provider;\r\n selectedModel = bootSelection.model;\r\n } else if (!configOnly) {\r\n let currentInitialProvider = prefs.lastCodexProvider && compatible.some(o => o.id === prefs.lastCodexProvider)\r\n ? prefs.lastCodexProvider\r\n : compatible[0]!.id;\r\n while (true) {\r\n const pickedProvider = await pickCodexProvider(compatible, prefs, favoritesActive, currentInitialProvider);\r\n if (!pickedProvider) return 0;\r\n \r\n if (pickedProvider === '__favorites__') {\r\n const favoritePick = await pickFavoriteStartingModel(\r\n compatible,\r\n favorites,\r\n 'codex-app',\r\n 'Codex App',\r\n providerForCodexPicker,\r\n );\r\n if (favoritePick === 'cancelled' || favoritePick === 'unavailable') return 0;\r\n activeProvider = favoritePick.provider;\r\n selectedModel = favoritePick.model;\r\n break;\r\n } else {\r\n activeProvider = providerForCodexPicker(pickedProvider as LocalProvider);\r\n const pickedModelResult = await pickCodexModel(activeProvider, prefs);\r\n if (pickedModelResult === 'back') {\r\n currentInitialProvider = activeProvider.id;\r\n continue;\r\n }\r\n if (!pickedModelResult) return 0;\r\n selectedModel = pickedModelResult;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const apiKey = await resolveLocalProviderApiKey(activeProvider);\r\n if (!apiKey) {\r\n if (!configOnly) {\r\n p.log.error(`No credential for ${activeProvider.name}. Run anygate providers auth ${activeProvider.id}.`);\r\n }\r\n return 1;\r\n }\r\n\r\n activeProvider.apiKey = apiKey;\r\n\r\n let cloudCodeBackend: CloudCodeBackend | null = null;\r\n let cloudCodeBackendFav: CloudCodeBackend | null = null;\r\n const appProviderRoutes = favoritesActive\r\n ? null\r\n : await buildCodexAppProviderCatalogRoutes(activeProvider, apiKey, selectedModel.id, trace);\r\n cloudCodeBackend = appProviderRoutes?.backend ?? null;\r\n\r\n const route = appProviderRoutes\r\n ? codexProxyRouteToCodexRoute(appProviderRoutes.selectedRoute, activeProvider.id)\r\n : resolveCodexRoute(activeProvider, selectedModel, apiKey);\r\n const appRoute = { ...route, tier: 'proxy' as const };\r\n const routable = appProviderRoutes?.routable ?? routableModelsForProvider(activeProvider, 'codex-app');\r\n const catalogModels = appProviderRoutes?.catalogModels ?? routable;\r\n\r\n let resolvedFavorites: ResolvedFavorite[] = [];\r\n let providersById: Map<string, LocalProvider> = new Map();\r\n\r\n if (favoritesActive) {\r\n const res = await resolveCodexFavorites(activeProvider, selectedModel, compatible, favorites, 'codex-app');\r\n resolvedFavorites = res.resolvedFavorites;\r\n providersById = res.providersById;\r\n }\r\n\r\n if (!configOnly) {\r\n const modelLabel = formatCodexModelLabel(selectedModel);\r\n const confirmed = await confirmCodexLaunch(\r\n activeProvider.name,\r\n modelLabel,\r\n selectedModel.id,\r\n appRoute,\r\n );\r\n if (!confirmed) {\r\n cloudCodeBackend?.handle.close();\r\n return 0;\r\n }\r\n }\r\n\r\n let proxyHandle: CodexProxyHandle | null = null;\r\n let sessionActive = false;\r\n try {\r\n const catalogPath = favoritesActive && resolvedFavorites.length > 0\r\n ? getFavoritesAppCatalogPath()\r\n : getAppCatalogPath(route.providerId);\r\n\r\n const activeRoute = favoritesActive && resolvedFavorites.length > 0 ? {\r\n tier: 'proxy' as const,\r\n modelId: codexCliFavoritesSlug(activeProvider.id, selectedModel.id),\r\n providerId: activeProvider.id,\r\n npm: '',\r\n upstreamModelId: '',\r\n apiKey: '',\r\n contextWindow: selectedModel.contextWindow,\r\n } : appRoute;\r\n\r\n const specBase = { route: activeRoute, catalogPath };\r\n\r\n if (configOnly) {\r\n const home = process.env['HOME'] ?? '';\r\n const shortenPath = (fp: string) => home ? fp.replace(home, '~') : fp;\r\n\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(' CONFIG PREVIEW — anygate codex-app')));\r\n console.log('');\r\n\r\n if (favoritesActive) {\r\n console.log(` ${pc.bold('Mode:')} Favorites Catalog (${resolvedFavorites.length} model${resolvedFavorites.length !== 1 ? 's' : ''})`);\r\n console.log('');\r\n console.log(` ${pc.bold('Models:')}`);\r\n for (const r of resolvedFavorites) {\r\n console.log(` ${pc.cyan(r.model.id)} ${pc.dim(`(${r.providerName})`)}`);\r\n }\r\n } else {\r\n console.log(` ${pc.bold('Mode:')} Single model`);\r\n console.log(` ${pc.bold('Provider:')} ${activeProvider.name}`);\r\n console.log(` ${pc.bold('Model:')} ${formatCodexModelLabel(selectedModel)}`);\r\n console.log(` ${pc.bold('Catalog:')} ${routable.length} model${routable.length !== 1 ? 's' : ''} available`);\r\n }\r\n\r\n console.log('');\r\n console.log(` ${pc.bold('config.toml patch preview:')}`);\r\n const tomlPreview = previewAppConfigToml({\r\n ...specBase,\r\n proxyPort: PREVIEW_PROXY_PORT,\r\n });\r\n for (const line of tomlPreview.split('\\n')) {\r\n console.log(` ${pc.dim(line)}`);\r\n }\r\n\r\n console.log('');\r\n console.log(` ${pc.bold('Catalog file:')}`);\r\n console.log(` ${pc.dim(shortenPath(catalogPath))}`);\r\n console.log('');\r\n console.log(pc.dim(' No app was launched.'));\r\n console.log(pc.dim(' Run ') + pc.cyan('anygate codex-app') + pc.dim(' to launch.'));\r\n console.log('');\r\n\r\n return 0;\r\n }\r\n\r\n let proxyPort: number;\r\n if (favoritesActive && resolvedFavorites.length > 0) {\r\n const needsBackend = (r: typeof resolvedFavorites[0]) => {\r\n const m = r.model as LocalProviderModel;\r\n const prov = providersById.get(r.providerId);\r\n return m.modelFormat === 'cloud-code'\r\n || (m.modelFormat === 'anthropic' && prov?.authType === 'oauth');\r\n };\r\n const backendResolved = resolvedFavorites.filter(needsBackend);\r\n const regularResolved = resolvedFavorites.filter(r => !needsBackend(r));\r\n\r\n let backendCodexRoutes: import('./proxy.js').CodexProxyRoute[] = [];\r\n if (backendResolved.length > 0) {\r\n const backendRoutes: ProxyRoute[] = backendResolved.map(r => {\r\n const provider = providersById.get(r.providerId);\r\n const providerData = (provider?.providerData ?? {}) as Record<string, unknown>;\r\n const m = r.model as LocalProviderModel;\r\n const route = m.modelFormat === 'cloud-code'\r\n ? buildCloudCodeProxyRoute(m, r.apiKey, providerData)\r\n : buildOAuthAnthropicProxyRoute(m, r.apiKey, r.providerId, providerData);\r\n return { ...route, oauthAccountId: provider?.oauthAccountId, providerData };\r\n });\r\n const startingAlias = backendRoutes[0]!.aliasId;\r\n cloudCodeBackendFav = await startCloudCodeCatalogBackend(backendRoutes, startingAlias, trace);\r\n backendCodexRoutes = backendRoutes.map(cr => ({\r\n modelId: cr.aliasId,\r\n npm: '@ai-sdk/anthropic',\r\n apiKey: cloudCodeBackendFav!.token,\r\n baseURL: `http://127.0.0.1:${cloudCodeBackendFav!.port}`,\r\n upstreamModelId: cr.aliasId,\r\n providerId: cr.providerId ?? 'antigravity',\r\n authType: 'oauth' as const,\r\n oauthAccountId: cr.oauthAccountId,\r\n providerData: cr.providerData,\r\n contextWindow: cr.contextWindow,\r\n }));\r\n }\r\n\r\n const regularRoutes = buildCodexProxyRoutesFromResolved(regularResolved, providersById);\r\n proxyHandle = await startCodexProxy(\r\n [...backendCodexRoutes, ...regularRoutes],\r\n { requireAuth: false, debug: trace },\r\n );\r\n proxyPort = proxyHandle.port;\r\n } else {\r\n if (!appProviderRoutes) {\r\n throw new Error('Codex App provider routes were not initialized');\r\n }\r\n proxyHandle = await startCodexProxy(\r\n appProviderRoutes.routes,\r\n { requireAuth: false, debug: trace },\r\n );\r\n proxyPort = proxyHandle.port;\r\n }\r\n\r\n const modelLabel = formatCodexModelLabel(selectedModel);\r\n const catalogFile = favoritesActive && resolvedFavorites.length > 0\r\n ? buildFavoritesAppCatalog(resolvedFavorites)\r\n : buildAppCatalogFile(catalogModels, activeProvider.name, appRoute.modelId);\r\n\r\n writeOverlayFile(catalogPath, serializeCatalog(catalogFile));\r\n\r\n const spec: CodexAppConfigSpec = {\r\n route: activeRoute,\r\n proxyPort,\r\n catalogPath,\r\n };\r\n\r\n saveAppRestoreStateBeforePatch();\r\n const backupPath = backupConfigToml();\r\n applyAppConfigPatch(spec);\r\n\r\n writeAppSessionLock({\r\n pid: process.pid,\r\n startedAt: new Date().toISOString(),\r\n configPath: getCodexConfigPath(),\r\n catalogPaths: [catalogPath],\r\n restoreStatePath: getAppRestoreStatePath(),\r\n backupPath,\r\n proxyPort,\r\n });\r\n sessionActive = true;\r\n\r\n const prevRecent = prefs.recentModelsByProvider?.[activeProvider.id] ?? [];\r\n const updatedRecent = [selectedModel.id, ...prevRecent.filter(id => id !== selectedModel.id)].slice(0, 3);\r\n savePreferences({\r\n lastCodexProvider: activeProvider.id,\r\n lastCodexModel: selectedModel.id,\r\n recentModelsByProvider: { ...prefs.recentModelsByProvider, [activeProvider.id]: updatedRecent },\r\n });\r\n\r\n logCodexProxy(proxyPort);\r\n\r\n logCodexActiveModel(modelLabel, selectedModel.id);\r\n\r\n try {\r\n await launchOrRestartCodexApp();\r\n } catch (err) {\r\n p.log.warn(String(err instanceof Error ? err.message : err));\r\n p.log.info(codexAppInstallHint());\r\n }\r\n\r\n printCodexAppSessionPanel({\r\n modelLabel,\r\n modelId: selectedModel.id,\r\n providerName: activeProvider.name,\r\n restoreCommand: 'anygate codex-app --restore',\r\n });\r\n\r\n codexAppOutro(modelLabel);\r\n await waitForShutdownWithConfirm();\r\n if (trace) printTraceLog(debugLogPath);\r\n console.log('');\r\n\r\n if (sessionActive) {\r\n restoreCodexAppOverlay();\r\n sessionActive = false;\r\n }\r\n await maybeCloseRunningCodexApp();\r\n return 0;\r\n } finally {\r\n proxyHandle?.close();\r\n if (cloudCodeBackend) {\r\n cloudCodeBackend.handle.close();\r\n }\r\n if (cloudCodeBackendFav) {\r\n cloudCodeBackendFav.handle.close();\r\n }\r\n if (sessionActive) restoreCodexAppOverlay();\r\n }\r\n}\r\n","import type { CodexProxyRoute } from './proxy.js';\r\nimport {\r\n needsCloudCodeBackend,\r\n partitionAndStartCloudCodeBackend,\r\n type CloudCodeBackend,\r\n} from '../shared/cloud-code-backend.js';\r\nimport type { LocalProvider, LocalProviderModel } from '../../../src/core/types.js';\r\nimport {\r\n resolveCodexRoute,\r\n routableModelsForProvider,\r\n} from './routing.js';\r\n\r\nexport interface CodexAppProviderCatalogRoutes {\r\n routable: LocalProviderModel[];\r\n catalogModels: LocalProviderModel[];\r\n routes: CodexProxyRoute[];\r\n selectedRoute: CodexProxyRoute;\r\n backend: CloudCodeBackend | null;\r\n}\r\n\r\nfunction codexRouteToProxyRoute(\r\n provider: LocalProvider,\r\n model: LocalProviderModel,\r\n apiKey: string,\r\n): CodexProxyRoute {\r\n const route = resolveCodexRoute(provider, model, apiKey);\r\n return {\r\n modelId: route.modelId,\r\n npm: route.npm,\r\n apiKey: route.apiKey,\r\n baseURL: route.baseURL,\r\n upstreamModelId: route.upstreamModelId,\r\n providerId: route.providerId,\r\n authType: route.authType,\r\n oauthAccountId: route.oauthAccountId,\r\n providerData: route.providerData,\r\n contextWindow: route.contextWindow,\r\n supportedParameters: route.supportedParameters,\r\n reasoning: route.reasoning,\r\n interleavedReasoningField: route.interleavedReasoningField,\r\n headers: route.headers,\r\n };\r\n}\r\n\r\nexport async function buildCodexAppProviderCatalogRoutes(\r\n provider: LocalProvider,\r\n apiKey: string,\r\n selectedModelId: string,\r\n trace?: boolean,\r\n): Promise<CodexAppProviderCatalogRoutes> {\r\n const routable = routableModelsForProvider(provider, 'codex-app');\r\n const ordered = [\r\n ...routable.filter(model => model.id === selectedModelId),\r\n ...routable.filter(model => model.id !== selectedModelId),\r\n ];\r\n\r\n const routeByModelId = new Map<string, CodexProxyRoute>();\r\n const catalogModelByModelId = new Map<string, LocalProviderModel>();\r\n const backendModels = ordered.filter(model => needsCloudCodeBackend(model, provider.authType));\r\n const regularModels = ordered.filter(model => !needsCloudCodeBackend(model, provider.authType));\r\n\r\n for (const model of regularModels) {\r\n routeByModelId.set(model.id, codexRouteToProxyRoute(provider, model, apiKey));\r\n catalogModelByModelId.set(model.id, model);\r\n }\r\n\r\n const partitioned = await partitionAndStartCloudCodeBackend(\r\n backendModels.map(model => ({\r\n providerId: provider.id,\r\n model,\r\n apiKey,\r\n providerData: provider.providerData,\r\n })),\r\n (proxyRoute, backend, original) => ({\r\n modelId: proxyRoute.aliasId,\r\n npm: '@ai-sdk/anthropic',\r\n apiKey: backend.token,\r\n baseURL: `http://127.0.0.1:${backend.port}`,\r\n upstreamModelId: proxyRoute.aliasId,\r\n providerId: proxyRoute.providerId ?? original.providerId,\r\n authType: 'oauth' as const,\r\n oauthAccountId: provider.oauthAccountId,\r\n providerData: provider.providerData,\r\n contextWindow: proxyRoute.contextWindow,\r\n supportedParameters: original.model.supportedParameters,\r\n reasoning: original.model.reasoning,\r\n interleavedReasoningField: original.model.interleavedReasoningField,\r\n headers: provider.headers,\r\n }),\r\n trace,\r\n );\r\n\r\n for (let index = 0; index < backendModels.length; index++) {\r\n const model = backendModels[index]!;\r\n const route = partitioned.backendItems[index]!;\r\n routeByModelId.set(model.id, route);\r\n catalogModelByModelId.set(model.id, {\r\n ...model,\r\n id: route.modelId,\r\n upstreamModelId: route.upstreamModelId,\r\n npm: route.npm,\r\n });\r\n }\r\n\r\n const routes = ordered\r\n .map(model => routeByModelId.get(model.id))\r\n .filter((route): route is CodexProxyRoute => route !== undefined);\r\n const catalogModels = ordered\r\n .map(model => catalogModelByModelId.get(model.id))\r\n .filter((model): model is LocalProviderModel => model !== undefined);\r\n const selectedRoute = routeByModelId.get(selectedModelId) ?? routes[0];\r\n if (!selectedRoute) {\r\n throw new Error(`No Codex App route available for selected model ${selectedModelId}`);\r\n }\r\n\r\n return {\r\n routable,\r\n catalogModels,\r\n routes,\r\n selectedRoute,\r\n backend: partitioned.backend,\r\n };\r\n}\r\n","// Read/merge/restore ~/.codex/config.toml for Codex App.\r\nimport { existsSync, readFileSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\nimport { parse, stringify } from 'smol-toml';\r\nimport {\r\n CODEX_APP_PROVIDER_ID,\r\n buildCodexAppRootConfig,\r\n type CodexAppConfigSpec,\r\n} from './app-profile.js';\r\nimport { getReasoningCapabilities } from '../../../src/gateway/provider-factory.js';\r\nimport { getCodexHome } from './session.js';\r\n\r\nexport type TomlRecord = Record<string, unknown>;\r\n\r\nexport function getCodexConfigPath(): string {\r\n return join(getCodexHome(), 'config.toml');\r\n}\r\n\r\nexport function getCodexAppSidecarProfilePath(): string {\r\n return join(getCodexHome(), `${CODEX_APP_PROVIDER_ID}.config.toml`);\r\n}\r\n\r\nexport interface CodexAppRestoreState {\r\n hadProfile: boolean;\r\n profile?: string;\r\n hadModel: boolean;\r\n model?: string;\r\n hadModelProvider: boolean;\r\n modelProvider?: string;\r\n hadModelCatalogJson: boolean;\r\n modelCatalogJson?: string;\r\n hadOpenAIBaseUrl?: boolean;\r\n openAIBaseUrl?: string;\r\n hadModelReasoningEffort: boolean;\r\n modelReasoningEffort?: string;\r\n hadModelContextWindow?: boolean;\r\n modelContextWindow?: number;\r\n hadModelAutoCompactTokenLimit?: boolean;\r\n modelAutoCompactTokenLimit?: number;\r\n}\r\n\r\nexport function asRecord(value: unknown): TomlRecord {\r\n return value && typeof value === 'object' && !Array.isArray(value)\r\n ? value as TomlRecord\r\n : {};\r\n}\r\n\r\nfunction rootString(config: TomlRecord, key: string): { had: boolean; value: string } {\r\n if (!(key in config)) return { had: false, value: '' };\r\n const v = config[key];\r\n return { had: true, value: typeof v === 'string' ? v : String(v ?? '') };\r\n}\r\n\r\nfunction rootNumber(config: TomlRecord, key: string): { had: boolean; value?: number } {\r\n if (!(key in config)) return { had: false };\r\n const v = config[key];\r\n return { had: true, value: typeof v === 'number' ? v : undefined };\r\n}\r\n\r\nfunction applyRestoreNumber(config: TomlRecord, key: string, had: boolean, value?: number): void {\r\n if (had && value !== undefined) {\r\n config[key] = value;\r\n } else {\r\n delete config[key];\r\n }\r\n}\r\n\r\nexport function readCodexConfigText(path = getCodexConfigPath()): string {\r\n if (!existsSync(path)) return '';\r\n return readFileSync(path, 'utf8');\r\n}\r\n\r\nexport function parseCodexConfig(text: string): TomlRecord {\r\n if (!text.trim()) return {};\r\n return asRecord(parse(text));\r\n}\r\n\r\nexport function captureRestoreState(text: string): CodexAppRestoreState {\r\n const config = parseCodexConfig(text);\r\n const profile = rootString(config, 'profile');\r\n const model = rootString(config, 'model');\r\n const modelProvider = rootString(config, 'model_provider');\r\n const modelCatalog = rootString(config, 'model_catalog_json');\r\n const openAIBaseUrl = rootString(config, 'openai_base_url');\r\n const reasoning = rootString(config, 'model_reasoning_effort');\r\n const contextWindow = rootNumber(config, 'model_context_window');\r\n const autoCompact = rootNumber(config, 'model_auto_compact_token_limit');\r\n return {\r\n hadProfile: profile.had,\r\n profile: profile.value,\r\n hadModel: model.had,\r\n model: model.value,\r\n hadModelProvider: modelProvider.had,\r\n modelProvider: modelProvider.value,\r\n hadModelCatalogJson: modelCatalog.had,\r\n modelCatalogJson: modelCatalog.value,\r\n hadOpenAIBaseUrl: openAIBaseUrl.had,\r\n openAIBaseUrl: openAIBaseUrl.value,\r\n hadModelReasoningEffort: reasoning.had,\r\n modelReasoningEffort: reasoning.value,\r\n hadModelContextWindow: contextWindow.had,\r\n modelContextWindow: contextWindow.value,\r\n hadModelAutoCompactTokenLimit: autoCompact.had,\r\n modelAutoCompactTokenLimit: autoCompact.value,\r\n };\r\n}\r\n\r\nexport function isAppManagedConfig(text: string): boolean {\r\n const config = parseCodexConfig(text);\r\n const mp = rootString(config, 'model_provider');\r\n if (mp.had && mp.value === CODEX_APP_PROVIDER_ID) return true;\r\n const baseUrl = rootString(config, 'openai_base_url');\r\n const catalog = rootString(config, 'model_catalog_json');\r\n return mp.value === 'openai'\r\n && /^http:\\/\\/127\\.0\\.0\\.1:\\d+\\/v1$/.test(baseUrl.value)\r\n && /(?:^|[\\\\/])app-models-[^\\\\/]+\\.json$/.test(catalog.value);\r\n}\r\n\r\nfunction mergeAppConfig(existing: TomlRecord, spec: CodexAppConfigSpec): TomlRecord {\r\n const patch = buildCodexAppRootConfig(spec);\r\n const out: TomlRecord = { ...existing };\r\n delete out.profile;\r\n out.model = patch.model;\r\n out.model_provider = patch.model_provider;\r\n out.openai_base_url = patch.openai_base_url;\r\n out.model_catalog_json = patch.model_catalog_json;\r\n if (patch.model_context_window !== undefined) {\r\n out.model_context_window = patch.model_context_window;\r\n } else {\r\n delete out.model_context_window;\r\n }\r\n if (patch.model_auto_compact_token_limit !== undefined) {\r\n out.model_auto_compact_token_limit = patch.model_auto_compact_token_limit;\r\n } else {\r\n delete out.model_auto_compact_token_limit;\r\n }\r\n const providers = asRecord(out.model_providers);\r\n delete providers[CODEX_APP_PROVIDER_ID];\r\n const profiles = asRecord(out.profiles);\r\n delete profiles[CODEX_APP_PROVIDER_ID];\r\n if (Object.keys(profiles).length === 0) {\r\n delete out.profiles;\r\n } else {\r\n out.profiles = profiles;\r\n }\r\n if (Object.keys(providers).length === 0) {\r\n delete out.model_providers;\r\n } else {\r\n out.model_providers = providers;\r\n }\r\n\r\n const existingEffort = typeof out.model_reasoning_effort === 'string' ? out.model_reasoning_effort : undefined;\r\n if (existingEffort !== undefined) {\r\n const caps = getReasoningCapabilities(spec.route.npm, spec.route.modelId, {\r\n providerId: spec.route.providerId,\r\n apiBaseUrl: spec.route.baseURL,\r\n supportedParameters: spec.route.supportedParameters,\r\n reasoning: spec.route.reasoning,\r\n interleavedReasoningField: spec.route.interleavedReasoningField,\r\n });\r\n if (caps.levels.length === 0 || !caps.levels.includes(existingEffort)) {\r\n if (caps.levels.length > 0 && caps.defaultLevel) {\r\n out.model_reasoning_effort = caps.defaultLevel;\r\n } else {\r\n delete out.model_reasoning_effort;\r\n }\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function validateAppConfigText(text: string, spec: CodexAppConfigSpec): void {\r\n const config = parseCodexConfig(text);\r\n if ('profile' in config) {\r\n throw new Error('Generated config still contains legacy root profile key');\r\n }\r\n const profiles = asRecord(config.profiles);\r\n if (profiles[CODEX_APP_PROVIDER_ID]) {\r\n throw new Error('Generated config still contains legacy profiles table');\r\n }\r\n const mp = rootString(config, 'model_provider');\r\n if (mp.value !== 'openai') {\r\n throw new Error('Generated config must keep the built-in OpenAI model_provider');\r\n }\r\n const baseUrl = rootString(config, 'openai_base_url');\r\n if (baseUrl.value !== `http://127.0.0.1:${spec.proxyPort}/v1`) {\r\n throw new Error('Generated config openai_base_url mismatch');\r\n }\r\n const catalog = rootString(config, 'model_catalog_json');\r\n if (catalog.value !== spec.catalogPath) {\r\n throw new Error('Generated config model_catalog_json mismatch');\r\n }\r\n}\r\n\r\nexport function applyAppConfigPatch(spec: CodexAppConfigSpec, configPath = getCodexConfigPath()): string {\r\n const existingText = readCodexConfigText(configPath);\r\n let existing: TomlRecord;\r\n try {\r\n existing = parseCodexConfig(existingText);\r\n } catch (err) {\r\n throw new Error(`Invalid existing Codex config at ${configPath}: ${err instanceof Error ? err.message : err}`);\r\n }\r\n const merged = mergeAppConfig(existing, spec);\r\n const text = `${stringify(merged)}\\n`;\r\n validateAppConfigText(text, spec);\r\n mkdirSync(dirname(configPath), { recursive: true });\r\n writeFileSync(configPath, text, 'utf8');\r\n return text;\r\n}\r\n\r\nfunction applyRestoreKey(config: TomlRecord, key: string, had: boolean, value: string | undefined): void {\r\n if (had && value !== undefined) {\r\n config[key] = value;\r\n } else {\r\n delete config[key];\r\n }\r\n}\r\n\r\nexport function restoreConfigFromState(state: CodexAppRestoreState, configPath = getCodexConfigPath()): boolean {\r\n const existingText = readCodexConfigText(configPath);\r\n const config = parseCodexConfig(existingText);\r\n const providers = asRecord(config.model_providers);\r\n delete providers[CODEX_APP_PROVIDER_ID];\r\n if (Object.keys(providers).length === 0) {\r\n delete config.model_providers;\r\n } else {\r\n config.model_providers = providers;\r\n }\r\n\r\n if (state.hadProfile && state.profile) {\r\n config.profile = state.profile;\r\n } else {\r\n delete config.profile;\r\n }\r\n applyRestoreKey(config, 'model', state.hadModel, state.model);\r\n applyRestoreKey(config, 'model_provider', state.hadModelProvider, state.modelProvider);\r\n applyRestoreKey(config, 'model_catalog_json', state.hadModelCatalogJson, state.modelCatalogJson);\r\n // Restore states written by anygate <= 0.2.6 predate this field. The old\r\n // overlay preserved openai_base_url, so leave it untouched during recovery.\r\n if ('hadOpenAIBaseUrl' in state) {\r\n applyRestoreKey(config, 'openai_base_url', Boolean(state.hadOpenAIBaseUrl), state.openAIBaseUrl);\r\n }\r\n applyRestoreKey(config, 'model_reasoning_effort', state.hadModelReasoningEffort, state.modelReasoningEffort);\r\n applyRestoreNumber(config, 'model_context_window', state.hadModelContextWindow ?? false, state.modelContextWindow);\r\n applyRestoreNumber(config, 'model_auto_compact_token_limit', state.hadModelAutoCompactTokenLimit ?? false, state.modelAutoCompactTokenLimit);\r\n\r\n const sidecar = getCodexAppSidecarProfilePath();\r\n if (existsSync(sidecar)) {\r\n try { rmSync(sidecar, { force: true }); } catch { /* ignore */ }\r\n }\r\n\r\n const hadFile = existsSync(configPath);\r\n const empty =\r\n Object.keys(config).length === 0\r\n || (Object.keys(config).length === 1 && 'model_providers' in config && Object.keys(asRecord(config.model_providers)).length === 0);\r\n\r\n if (!hadFile && empty) return false;\r\n if (empty) {\r\n rmSync(configPath, { force: true });\r\n return true;\r\n }\r\n writeFileSync(configPath, `${stringify(config)}\\n`, 'utf8');\r\n return true;\r\n}\r\n\r\nexport function previewAppConfigToml(spec: CodexAppConfigSpec): string {\r\n const text = `${stringify(buildCodexAppRootConfig(spec))}\\n`;\r\n validateAppConfigText(text, spec);\r\n return text;\r\n}\r\n","// Codex App session: config.toml backup, restore state, lock, recovery.\r\nimport {\r\n copyFileSync,\r\n existsSync,\r\n mkdirSync,\r\n readdirSync,\r\n readFileSync,\r\n rmSync,\r\n} from 'node:fs';\r\nimport { basename, join } from 'node:path';\r\nimport {\r\n atomicWriteFile,\r\n getAnygateICodexDir,\r\n getBackupsDir,\r\n rotateBackups,\r\n STALE_SESSION_MS,\r\n isProcessAlive,\r\n sessionAgeMs,\r\n isConcurrentSession,\r\n} from './session.js';\r\nimport {\r\n captureRestoreState,\r\n isAppManagedConfig,\r\n readCodexConfigText,\r\n restoreConfigFromState,\r\n getCodexConfigPath,\r\n type CodexAppRestoreState,\r\n} from './app-config.js';\r\n\r\nexport { getCodexConfigPath };\r\n\r\nexport function getAppSessionLockPath(env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAnygateICodexDir(env), 'session-app.json');\r\n}\r\n\r\nexport function getAppRestoreStatePath(env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAnygateICodexDir(env), 'app-restore-state.json');\r\n}\r\n\r\nexport function getAppCatalogPath(providerId: string, env: NodeJS.ProcessEnv = process.env): string {\r\n return join(getAnygateICodexDir(env), `app-models-${providerId}.json`);\r\n}\r\n\r\nexport interface CodexAppSessionLock {\r\n pid: number;\r\n startedAt: string;\r\n configPath: string;\r\n catalogPaths: string[];\r\n restoreStatePath: string;\r\n backupPath?: string;\r\n proxyPort?: number;\r\n}\r\n\r\nexport function readAppSessionLock(env: NodeJS.ProcessEnv = process.env): CodexAppSessionLock | null {\r\n const path = getAppSessionLockPath(env);\r\n if (!existsSync(path)) return null;\r\n try {\r\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as CodexAppSessionLock;\r\n if (typeof parsed.pid === 'number' && typeof parsed.startedAt === 'string') return parsed;\r\n } catch { /* ignore */ }\r\n return null;\r\n}\r\n\r\nexport function writeAppSessionLock(lock: CodexAppSessionLock, env: NodeJS.ProcessEnv = process.env): void {\r\n atomicWriteFile(getAppSessionLockPath(env), `${JSON.stringify(lock, null, 2)}\\n`);\r\n}\r\n\r\nexport function clearAppSessionLock(env: NodeJS.ProcessEnv = process.env): void {\r\n const path = getAppSessionLockPath(env);\r\n if (existsSync(path)) rmSync(path, { force: true });\r\n}\r\n\r\nexport function readAppRestoreState(env: NodeJS.ProcessEnv = process.env): CodexAppRestoreState | null {\r\n const path = getAppRestoreStatePath(env);\r\n if (!existsSync(path)) return null;\r\n try {\r\n return JSON.parse(readFileSync(path, 'utf8')) as CodexAppRestoreState;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeAppRestoreState(state: CodexAppRestoreState, env: NodeJS.ProcessEnv = process.env): void {\r\n rotateBackups(getAppRestoreStatePath(env), env);\r\n atomicWriteFile(getAppRestoreStatePath(env), `${JSON.stringify(state, null, 2)}\\n`);\r\n}\r\n\r\nexport function clearAppRestoreState(env: NodeJS.ProcessEnv = process.env): void {\r\n const path = getAppRestoreStatePath(env);\r\n if (existsSync(path)) rmSync(path, { force: true });\r\n}\r\n\r\nexport function backupConfigToml(env: NodeJS.ProcessEnv = process.env): string | undefined {\r\n const configPath = getCodexConfigPath();\r\n if (!existsSync(configPath)) return undefined;\r\n rotateBackups(configPath, env);\r\n const backupsDir = getBackupsDir(env);\r\n mkdirSync(backupsDir, { recursive: true });\r\n const base = basename(configPath);\r\n const backupPath = join(backupsDir, `${base}.${Date.now()}.bak`);\r\n copyFileSync(configPath, backupPath);\r\n return backupPath;\r\n}\r\n\r\nexport function saveAppRestoreStateBeforePatch(env: NodeJS.ProcessEnv = process.env): CodexAppRestoreState {\r\n const text = readCodexConfigText();\r\n const existing = readAppRestoreState(env);\r\n if (existing && isAppManagedConfig(text)) {\r\n return existing;\r\n }\r\n const state = captureRestoreState(text);\r\n writeAppRestoreState(state, env);\r\n return state;\r\n}\r\n\r\nexport function ownedAppCatalogPaths(env: NodeJS.ProcessEnv = process.env): string[] {\r\n const codexDir = getAnygateICodexDir(env);\r\n if (!existsSync(codexDir)) return [];\r\n return readdirSync(codexDir)\r\n .filter(n => n.startsWith('app-models-') && n.endsWith('.json'))\r\n .map(n => join(codexDir, n));\r\n}\r\n\r\nexport function removeAppCatalogs(env: NodeJS.ProcessEnv = process.env): string[] {\r\n const removed: string[] = [];\r\n for (const path of ownedAppCatalogPaths(env)) {\r\n try {\r\n rmSync(path, { force: true });\r\n removed.push(path);\r\n } catch { /* ignore */ }\r\n }\r\n return removed;\r\n}\r\n\r\nexport type RestoreAppOverlayResult = {\r\n restored: boolean;\r\n liveSession?: boolean;\r\n message: string;\r\n};\r\n\r\nexport function restoreCodexAppOverlay(env: NodeJS.ProcessEnv = process.env): RestoreAppOverlayResult {\r\n const lock = readAppSessionLock(env);\r\n if (lock && lock.pid !== process.pid && isConcurrentSession(lock)) {\r\n return {\r\n restored: false,\r\n liveSession: true,\r\n message: `Another anygate codex-app session is running (pid ${lock.pid}). Ctrl+C it first, then run --restore.`,\r\n };\r\n }\r\n\r\n const text = readCodexConfigText();\r\n const managed = isAppManagedConfig(text);\r\n const restoreState = readAppRestoreState(env);\r\n if (!managed && !restoreState && !lock) {\r\n removeAppCatalogs(env);\r\n clearAppSessionLock(env);\r\n return { restored: false, message: 'Nothing to restore.' };\r\n }\r\n\r\n if (restoreState) {\r\n restoreConfigFromState(restoreState);\r\n } else if (lock?.backupPath && existsSync(lock.backupPath)) {\r\n copyFileSync(lock.backupPath, getCodexConfigPath());\r\n }\r\n\r\n removeAppCatalogs(env);\r\n clearAppRestoreState(env);\r\n clearAppSessionLock(env);\r\n return { restored: true, message: 'Restored Codex App config and removed anygate app files.' };\r\n}\r\n\r\nexport type AppInterruptedRecovery = {\r\n recovered: boolean;\r\n};\r\n\r\nexport function recoverInterruptedCodexAppSession(env: NodeJS.ProcessEnv = process.env): AppInterruptedRecovery {\r\n const lock = readAppSessionLock(env);\r\n const managed = isAppManagedConfig(readCodexConfigText());\r\n if (!lock && !managed) return { recovered: false };\r\n if (lock && lock.pid !== process.pid && isConcurrentSession(lock)) {\r\n return { recovered: false };\r\n }\r\n restoreCodexAppOverlay(env);\r\n return { recovered: true };\r\n}\r\n\r\nexport type AppSessionCheckResult =\r\n | { ok: true }\r\n | { ok: false; reason: 'concurrent'; lock: CodexAppSessionLock }\r\n | { ok: false; reason: 'non_tty' };\r\n\r\nexport function checkAppSessionLock(isTty: boolean, env: NodeJS.ProcessEnv = process.env): AppSessionCheckResult {\r\n if (!isTty) return { ok: false, reason: 'non_tty' };\r\n const lock = readAppSessionLock(env);\r\n if (lock && lock.pid !== process.pid && isConcurrentSession(lock)) {\r\n return { ok: false, reason: 'concurrent', lock };\r\n }\r\n return { ok: true };\r\n}\r\n\r\nexport function waitForShutdown(): Promise<'sigint' | 'sigterm' | 'sighup'> {\r\n return new Promise(resolve => {\r\n const cleanup = (): void => {\r\n process.removeListener('SIGINT', onSigint);\r\n process.removeListener('SIGTERM', onSigterm);\r\n process.removeListener('SIGHUP', onSighup);\r\n };\r\n const onSigint = (): void => { cleanup(); resolve('sigint'); };\r\n const onSigterm = (): void => { cleanup(); resolve('sigterm'); };\r\n const onSighup = (): void => { cleanup(); resolve('sighup'); };\r\n process.once('SIGINT', onSigint);\r\n process.once('SIGTERM', onSigterm);\r\n process.once('SIGHUP', onSighup);\r\n });\r\n}\r\n","import pc from 'picocolors';\r\nimport * as p from '@clack/prompts';\r\nimport { fetchProviderCatalog, providersForPicker } from '../../../src/providers/provider-catalog.js';\r\nimport { resolveLocalProviderApiKey } from '../../../src/core/credentials.js';\r\nimport { loadPreferences, savePreferences } from '../../../src/core/config.js';\r\nimport { resolveApiKey, readFromCredentialStore } from '../../../src/core/env.js';\r\nimport { resolveOrCollectApiKey } from '../../agents/shared/key-setup.js';\r\nimport { pickCodexProvider, pickCodexModel } from '../codex/prompts.js';\r\nimport { resolveBootSelection } from '../codex/favorites-launch.js';\r\nimport {\r\n codexCompatibleProviders,\r\n routableModelsForProvider,\r\n} from '../codex/routing.js';\r\nimport { startServer, type ServerHandle } from '../../../src/gateway/router.js';\r\nimport { createGatewayModelCatalog, type ServerModelInfo } from '../../../src/gateway/models.js';\r\nimport { BACKENDS } from '../../../src/core/constants.js';\r\nimport { loadServerModels } from '../../../src/gateway/server.js';\r\nimport { filterServerModelsByFavorites } from '../../../src/gateway/catalog-filter.js';\r\nimport { writeAnygateIConfig, getClaudeDesktopHome } from './desktop-app.js';\r\nimport { getProxyDebugLogPath } from '../../agents/shared/trace-log.js';\r\nimport { readSessionLock, recoverSession, hasStaleSession, writeSessionLock, setupExitCleanup, cleanupSession, backupMetaJson, isConcurrentLiveSession, waitForShutdown } from './desktop-session.js';\r\nimport { launchOrRestartClaudeApp, claudeAppSupported, isClaudeAppRunning, quitClaudeAppGracefully } from './desktop-launch.js';\r\nimport type { LocalProvider, LocalProviderModel, FavoriteModel } from '../../../src/core/types.js';\r\nimport {\r\n buildCloudCodeProxyRoute,\r\n startCloudCodeCatalogBackend,\r\n type CloudCodeBackend,\r\n} from '../shared/cloud-code-backend.js';\r\nimport type { ProxyRoute } from '../../../src/gateway/anthropic-proxy.js';\r\n\r\nexport function claudeAppHelpText(): string {\r\n return `${pc.bold('anygate claude-app')} — launch Claude Desktop app in 3P mode with your registry providers\r\n\r\n${pc.bold('Usage:')}\r\n anygate claude-app [options]\r\n anygate claude-app --trace\r\n anygate claude-app --restore\r\n anygate claude-app --help\r\n anygate claude-app --version\r\n\r\n${pc.bold('Options:')}\r\n --trace Write proxy debug logs to ~/.anygate/logs/\r\n --restore Restore Claude Desktop config after an interrupted app session\r\n --help Show this command help\r\n --version Show version\r\n\r\n${pc.bold('Description:')}\r\n Picks a provider and model from ~/.anygate/providers.json, patches Claude Desktop config\r\n (with backup + restore on Ctrl+C), starts a local Responses proxy, and opens\r\n the Claude Desktop app. Keep this terminal open while using Claude.\r\n\r\n${pc.bold('Platforms:')}\r\n macOS and Windows. Linux is not supported.\r\n\r\n${pc.bold('Cleanup:')}\r\n Ctrl+C stops the proxy and restores your previous Claude config.\r\n After a crash: anygate claude-app --restore\r\n`;\r\n}\r\n\r\nfunction providerForClaudePicker(provider: LocalProvider): LocalProvider {\r\n return { ...provider, models: routableModelsForProvider(provider, 'claude-app') };\r\n}\r\n\r\nexport function modelToServerModelInfo(\r\n model: LocalProviderModel,\r\n provider: LocalProvider,\r\n overrides: Partial<ServerModelInfo> = {},\r\n): ServerModelInfo {\r\n return {\r\n id: model.id,\r\n name: model.name,\r\n isFree: model.isFree ?? false,\r\n brand: model.brand ?? '',\r\n providerLabel: provider.name,\r\n providerId: provider.id,\r\n sourceBackend: provider.id,\r\n modelFormat: model.modelFormat,\r\n upstreamModelId: model.upstreamModelId,\r\n cost: model.cost,\r\n baseUrl: model.baseUrl,\r\n completionsUrl: model.completionsUrl,\r\n npm: model.npm,\r\n apiBaseUrl: model.apiBaseUrl,\r\n apiKey: provider.apiKey,\r\n authType: provider.authType,\r\n oauthAccountId: provider.oauthAccountId,\r\n contextWindow: model.contextWindow,\r\n supportedParameters: model.supportedParameters,\r\n reasoning: model.reasoning,\r\n interleavedReasoningField: model.interleavedReasoningField,\r\n headers: provider.headers,\r\n ...overrides,\r\n };\r\n}\r\n\r\nexport async function runClaudeAppCommand(args: string[], boot?: { launchProvider?: string; launchModel?: string }): Promise<number> {\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(claudeAppHelpText());\r\n return 0;\r\n }\r\n\r\n if (args.includes('--restore')) {\r\n recoverSession();\r\n console.log('Restored Claude Desktop anygate config.');\r\n return 0;\r\n }\r\n\r\n const trace = args.includes('--trace');\r\n const debugLogPath = trace ? getProxyDebugLogPath() : undefined;\r\n if (trace) console.log(`Debug log: ${debugLogPath}`);\r\n\r\n try {\r\n claudeAppSupported();\r\n } catch (err) {\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n\r\n const isTty = Boolean(process.stdin.isTTY);\r\n if (!isTty) {\r\n console.error(pc.red('anygate claude-app requires an interactive terminal.'));\r\n return 1;\r\n }\r\n\r\n if (isConcurrentLiveSession()) {\r\n console.error(pc.yellow(`Another anygate claude-app session may be running.`));\r\n console.error('Stop it with Ctrl+C in that terminal.');\r\n return 1;\r\n }\r\n\r\n if (hasStaleSession()) {\r\n p.log.warn('Recovered from an interrupted claude-app session.');\r\n recoverSession();\r\n }\r\n\r\n const catalogSpinner = p.spinner();\r\n catalogSpinner.start('Loading your providers...');\r\n let catalog;\r\n try {\r\n catalog = await fetchProviderCatalog({ agent: 'codex-app' });\r\n } catch (err) {\r\n catalogSpinner.stop('');\r\n console.error(pc.red(String(err instanceof Error ? err.message : err)));\r\n return 1;\r\n }\r\n catalogSpinner.stop('');\r\n\r\n const compatible = codexCompatibleProviders(providersForPicker(catalog), 'claude-app');\r\n if (compatible.length === 0) {\r\n p.log.warn('No compatible providers in your registry.');\r\n return 0;\r\n }\r\n\r\n const prefs = loadPreferences();\r\n const favorites = prefs.favoriteModels ?? [];\r\n const hasFavorites = favorites.length > 0;\r\n\r\n let activeProvider: LocalProvider | null = null;\r\n let selectedModel: any = null;\r\n let useFavorites = false;\r\n\r\n if (boot?.launchProvider && boot?.launchModel) {\r\n const bootSelection = resolveBootSelection(\r\n compatible,\r\n boot.launchProvider,\r\n boot.launchModel,\r\n providerForClaudePicker,\r\n );\r\n if ('error' in bootSelection) {\r\n p.log.error(bootSelection.error);\r\n return 1;\r\n }\r\n activeProvider = bootSelection.provider;\r\n selectedModel = bootSelection.model;\r\n } else {\r\n const pickedProvider = await pickCodexProvider(compatible, prefs, hasFavorites);\r\n if (!pickedProvider) return 0;\r\n\r\n if (pickedProvider === '__favorites__') {\r\n useFavorites = true;\r\n } else {\r\n activeProvider = providerForClaudePicker(pickedProvider);\r\n const pickedModel = await pickCodexModel(activeProvider, prefs);\r\n if (!pickedModel) return 0;\r\n selectedModel = pickedModel;\r\n }\r\n }\r\n\r\n if (activeProvider) {\r\n const apiKey = await resolveLocalProviderApiKey(activeProvider);\r\n if (!apiKey) {\r\n p.log.error(`No credential for ${activeProvider.name}. Run anygate providers auth ${activeProvider.id}.`);\r\n return 1;\r\n }\r\n\r\n activeProvider.apiKey = apiKey;\r\n }\r\n\r\n let serverModels: ServerModelInfo[] = [];\r\n let cloudCodeBackend: CloudCodeBackend | null = null;\r\n let cloudCodeFavBackend: CloudCodeBackend | null = null;\r\n\r\n if (useFavorites) {\r\n // Identify cloud-code favorites from the already-fetched catalog\r\n const antigravityProvider = catalog.find((lp: LocalProvider) => lp.id === 'antigravity');\r\n const cloudCodeFavoriteModels = favorites\r\n .map((fav: FavoriteModel) => {\r\n if (fav.providerId !== 'antigravity') return null;\r\n const model = antigravityProvider?.models.find((m: LocalProviderModel) => m.id === fav.modelId);\r\n return model?.modelFormat === 'cloud-code' ? model : null;\r\n })\r\n .filter((m): m is import('../../core/types.js').LocalProviderModel => m !== null);\r\n\r\n const regularFavorites = favorites.filter(\r\n fav => !cloudCodeFavoriteModels.some(m => m.id === fav.modelId && fav.providerId === 'antigravity'),\r\n );\r\n\r\n // Start cloud-code backend if any cloud-code favorites\r\n let cloudCodeServerModels: ServerModelInfo[] = [];\r\n\r\n if (cloudCodeFavoriteModels.length > 0 && antigravityProvider?.apiKey) {\r\n const cloudRoutes: ProxyRoute[] = cloudCodeFavoriteModels.map(model =>\r\n buildCloudCodeProxyRoute(\r\n model,\r\n antigravityProvider.apiKey,\r\n (antigravityProvider.providerData ?? {}) as Record<string, unknown>,\r\n ),\r\n );\r\n const startingAlias = cloudRoutes[0]!.aliasId;\r\n cloudCodeFavBackend = await startCloudCodeCatalogBackend(cloudRoutes, startingAlias, trace);\r\n const favBackend = cloudCodeFavBackend;\r\n cloudCodeServerModels = cloudCodeFavoriteModels.map(model => modelToServerModelInfo(model, antigravityProvider, {\r\n isFree: false,\r\n providerId: 'antigravity',\r\n sourceBackend: 'antigravity',\r\n modelFormat: 'anthropic' as const,\r\n cost: undefined,\r\n baseUrl: `http://127.0.0.1:${favBackend.port}`,\r\n completionsUrl: undefined,\r\n npm: undefined,\r\n apiBaseUrl: undefined,\r\n apiKey: favBackend.token,\r\n authType: undefined,\r\n oauthAccountId: undefined,\r\n headers: undefined,\r\n }));\r\n }\r\n\r\n // Load remaining (non-cloud-code) favorites via the normal path\r\n const allModels = await loadServerModels();\r\n const regularServerModels = filterServerModelsByFavorites(allModels, regularFavorites);\r\n serverModels = [...cloudCodeServerModels, ...regularServerModels];\r\n } else if (selectedModel.modelFormat === 'cloud-code') {\r\n const providerData = (activeProvider!.providerData ?? {}) as Record<string, unknown>;\r\n const cloudRoute = buildCloudCodeProxyRoute(selectedModel, activeProvider!.apiKey, providerData);\r\n cloudCodeBackend = await startCloudCodeCatalogBackend([cloudRoute], cloudRoute.aliasId, trace);\r\n serverModels = [modelToServerModelInfo(selectedModel, activeProvider!, {\r\n modelFormat: 'anthropic',\r\n baseUrl: `http://127.0.0.1:${cloudCodeBackend.port}`,\r\n completionsUrl: undefined,\r\n npm: undefined,\r\n apiBaseUrl: undefined,\r\n apiKey: cloudCodeBackend.token,\r\n authType: undefined,\r\n oauthAccountId: undefined,\r\n headers: undefined,\r\n })];\r\n } else {\r\n serverModels = [modelToServerModelInfo(selectedModel, activeProvider!)];\r\n }\r\n\r\n let proxyHandle: ServerHandle | null = null;\r\n let sessionActive = false;\r\n let uuid = '';\r\n\r\n try {\r\n backupMetaJson();\r\n\r\n proxyHandle = await startServer({\r\n host: '127.0.0.1',\r\n port: 0, // random port\r\n apiKey: 'dummy',\r\n serverPassword: null,\r\n catalog: createGatewayModelCatalog(serverModels, { maskGatewayIds: true }),\r\n backends: BACKENDS,\r\n gateway: { maskGatewayIds: true },\r\n debugLogPath,\r\n });\r\n\r\n uuid = writeAnygateIConfig(proxyHandle.port);\r\n\r\n writeSessionLock({\r\n pid: process.pid,\r\n startedAt: new Date().toISOString(),\r\n uuid,\r\n proxyPort: proxyHandle.port\r\n });\r\n sessionActive = true;\r\n setupExitCleanup(uuid);\r\n\r\n if (!useFavorites) {\r\n const prevRecent = prefs.recentModelsByProvider?.[activeProvider!.id] ?? [];\r\n const updatedRecent = [selectedModel.id, ...prevRecent.filter((id: string) => id !== selectedModel.id)].slice(0, 3);\r\n savePreferences({\r\n lastCodexProvider: activeProvider!.id,\r\n lastCodexModel: selectedModel.id,\r\n recentModelsByProvider: { ...prefs.recentModelsByProvider, [activeProvider!.id]: updatedRecent },\r\n });\r\n }\r\n\r\n console.log(`\\n${pc.green('✔')} Proxy started on port ${proxyHandle.port}`);\r\n\r\n try {\r\n await launchOrRestartClaudeApp();\r\n } catch (err) {\r\n p.log.warn(String(err instanceof Error ? err.message : err));\r\n }\r\n\r\n console.log(`\\n${pc.bold('Claude Desktop 3P Mode Active')}`);\r\n if (useFavorites) {\r\n console.log(`${pc.dim('Catalog:')} Favorite models only`);\r\n } else {\r\n console.log(`${pc.dim('Model:')} ${selectedModel.id}`);\r\n console.log(`${pc.dim('Provider:')} ${activeProvider!.name}`);\r\n }\r\n console.log(`${pc.cyan('Press Ctrl+C to stop and restore config.')}`);\r\n\r\n await waitForShutdown();\r\n console.log('');\r\n \r\n // We do cleanup before prompting so that Claude gets restored ASAP\r\n // and if the user hits Ctrl+C again during the prompt, it's already restored.\r\n cleanupSession(uuid);\r\n sessionActive = false;\r\n if (cloudCodeBackend) cloudCodeBackend.handle.close();\r\n if (cloudCodeFavBackend) cloudCodeFavBackend.handle.close();\r\n\r\n if (isClaudeAppRunning()) {\r\n const shouldClose = await p.confirm({ message: 'Claude Desktop is still running. Close it?' });\r\n if (shouldClose && !p.isCancel(shouldClose)) {\r\n quitClaudeAppGracefully();\r\n }\r\n }\r\n return 0;\r\n\r\n } catch (err) {\r\n if (proxyHandle) await proxyHandle.close();\r\n if (sessionActive && uuid) {\r\n cleanupSession(uuid);\r\n }\r\n if (cloudCodeBackend) cloudCodeBackend.handle.close();\r\n if (cloudCodeFavBackend) cloudCodeFavBackend.handle.close();\r\n return 1;\r\n }\r\n}\r\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { join, dirname } from 'node:path';\r\nimport { randomUUID } from 'node:crypto';\r\n\r\nexport function getClaudeDesktopHome(): string {\r\n if (process.platform === 'win32') {\r\n return join(process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'), 'Claude-3p');\r\n }\r\n return join(homedir(), 'Library', 'Application Support', 'Claude-3p');\r\n}\r\n\r\nexport function getConfigLibraryPath(): string {\r\n return join(getClaudeDesktopHome(), 'configLibrary');\r\n}\r\n\r\nexport function getMetaJsonPath(): string {\r\n return join(getConfigLibraryPath(), '_meta.json');\r\n}\r\n\r\nexport function getClaudeDesktopConfigJsonPath(): string {\r\n return join(getClaudeDesktopHome(), 'claude_desktop_config.json');\r\n}\r\n\r\nexport interface MetaJson {\r\n appliedId: string;\r\n entries: { id: string; name: string }[];\r\n}\r\n\r\nexport function readMetaJson(): MetaJson | null {\r\n const metaPath = getMetaJsonPath();\r\n if (!existsSync(metaPath)) return null;\r\n try {\r\n return JSON.parse(readFileSync(metaPath, 'utf8')) as MetaJson;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeMetaJson(meta: MetaJson): void {\r\n const metaPath = getMetaJsonPath();\r\n mkdirSync(dirname(metaPath), { recursive: true });\r\n writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function buildAnygateIConfig(proxyPort: number) {\r\n return {\r\n inferenceProvider: 'gateway',\r\n inferenceGatewayBaseUrl: `http://127.0.0.1:${proxyPort}/anthropic`,\r\n inferenceGatewayApiKey: 'dummy',\r\n inferenceGatewayAuthScheme: 'bearer',\r\n coworkEgressAllowedHosts: ['*'],\r\n };\r\n}\r\n\r\nexport function writeAnygateIConfig(proxyPort: number): string {\r\n const uuid = randomUUID();\r\n const configPath = join(getConfigLibraryPath(), `${uuid}.json`);\r\n const config = buildAnygateIConfig(proxyPort);\r\n mkdirSync(dirname(configPath), { recursive: true });\r\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\r\n\r\n // We must update _meta.json so Claude Desktop knows which config is active.\r\n const meta = readMetaJson() || { appliedId: '', entries: [] };\r\n meta.appliedId = uuid;\r\n if (!meta.entries.some((e: any) => e.id === uuid)) {\r\n meta.entries.push({ id: uuid, name: 'anygate Gateway' });\r\n }\r\n writeMetaJson(meta);\r\n\r\n return uuid;\r\n}\r\n","import { existsSync, readFileSync, rmSync, writeFileSync, copyFileSync, unlinkSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { getClaudeDesktopHome, getMetaJsonPath, getConfigLibraryPath } from './desktop-app.js';\r\n\r\nexport interface ClaudeSessionLock {\r\n pid: number;\r\n startedAt: string;\r\n uuid: string;\r\n proxyPort: number;\r\n}\r\n\r\nexport function getSessionLockPath(): string {\r\n return join(getClaudeDesktopHome(), '.anygate.lock');\r\n}\r\n\r\nexport function readSessionLock(): ClaudeSessionLock | null {\r\n const path = getSessionLockPath();\r\n if (!existsSync(path)) return null;\r\n try {\r\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as ClaudeSessionLock;\r\n if (typeof parsed.pid === 'number' && typeof parsed.startedAt === 'string') return parsed;\r\n } catch { /* ignore */ }\r\n return null;\r\n}\r\n\r\nexport function writeSessionLock(lock: ClaudeSessionLock): void {\r\n const path = getSessionLockPath();\r\n writeFileSync(path, `${JSON.stringify(lock, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function isProcessAlive(pid: number): boolean {\r\n if (pid <= 0) return false;\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function backupMetaJson(): void {\r\n const metaPath = getMetaJsonPath();\r\n const backupPath = `${metaPath}.bak`;\r\n if (existsSync(metaPath)) {\r\n copyFileSync(metaPath, backupPath);\r\n }\r\n}\r\n\r\nexport function restoreMetaJson(): void {\r\n const metaPath = getMetaJsonPath();\r\n const backupPath = `${metaPath}.bak`;\r\n if (existsSync(backupPath)) {\r\n copyFileSync(backupPath, metaPath);\r\n unlinkSync(backupPath);\r\n }\r\n}\r\n\r\nexport function removeAnygateIConfig(uuid: string): void {\r\n const configPath = join(getConfigLibraryPath(), `${uuid}.json`);\r\n if (existsSync(configPath)) {\r\n try { rmSync(configPath, { force: true }); } catch { /* ignore */ }\r\n }\r\n}\r\n\r\nexport function hasStaleSession(): boolean {\r\n const lock = readSessionLock();\r\n if (!lock) return false;\r\n if (!isProcessAlive(lock.pid)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function isConcurrentLiveSession(): boolean {\r\n const lock = readSessionLock();\r\n if (!lock) return false;\r\n return isProcessAlive(lock.pid);\r\n}\r\n\r\nexport function recoverSession(): void {\r\n const lock = readSessionLock();\r\n if (lock) {\r\n restoreMetaJson();\r\n removeAnygateIConfig(lock.uuid);\r\n try { rmSync(getSessionLockPath(), { force: true }); } catch { /* ignore */ }\r\n } else {\r\n // Just in case there is no lock but the backup exists\r\n restoreMetaJson();\r\n }\r\n}\r\n\r\nexport function waitForShutdown(): Promise<'sigint' | 'sigterm'> {\r\n return new Promise(resolve => {\r\n const cleanup = (): void => {\r\n process.removeListener('SIGINT', onSigint);\r\n process.removeListener('SIGTERM', onSigterm);\r\n };\r\n const onSigint = (): void => {\r\n cleanup();\r\n resolve('sigint');\r\n };\r\n const onSigterm = (): void => {\r\n cleanup();\r\n resolve('sigterm');\r\n };\r\n process.once('SIGINT', onSigint);\r\n process.once('SIGTERM', onSigterm);\r\n });\r\n}\r\n\r\nexport function cleanupSession(uuid: string): void {\r\n restoreMetaJson();\r\n removeAnygateIConfig(uuid);\r\n try { rmSync(getSessionLockPath(), { force: true }); } catch { /* ignore */ }\r\n}\r\n\r\nexport function setupExitCleanup(uuid: string): void {\r\n process.on('exit', () => cleanupSession(uuid));\r\n}\r\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { homedir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { MAX_MODEL_CATALOG, VERSION } from '../../../src/core/constants.js';\r\nimport { loadPreferences } from '../../../src/core/config.js';\r\nimport { getAppHome, getConfigPath, getProvidersPath } from '../../../src/core/paths.js';\r\nimport { loadRegistry } from '../../../src/registry/io.js';\r\nimport type { RegistryProvider } from '../../../src/registry/types.js';\r\n\r\nconst SKILL_DIR_NAME = 'anygate-cli';\r\nconst SKILL_INSTALL_DIRS = [\r\n join(getAppHome(), 'skills'),\r\n join(homedir(), '.claude', 'skills'),\r\n join(homedir(), '.agents', 'skills'),\r\n join(homedir(), '.codex', 'skills'),\r\n join(homedir(), '.cursor', 'skills'),\r\n join(homedir(), '.cursor', 'skills-cursor'),\r\n];\r\n\r\nexport interface AiSkillInstallResult {\r\n version: string;\r\n installed: string[];\r\n updated: Array<{ path: string; fromVersion: string | null }>;\r\n skipped: string[];\r\n failed: string[];\r\n}\r\n\r\nexport function parseSkillVersion(content: string): string | null {\r\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\r\n if (!match) return null;\r\n for (const line of match[1]!.split('\\n')) {\r\n const trimmed = line.trim();\r\n if (!trimmed.startsWith('version:')) continue;\r\n const raw = trimmed.slice('version:'.length).trim();\r\n return raw.replace(/^[\"']|[\"']$/g, '');\r\n }\r\n return null;\r\n}\r\n\r\nfunction readInstalledSkillVersion(skillDir: string): string | null {\r\n const skillPath = join(skillDir, 'SKILL.md');\r\n if (!existsSync(skillPath)) return null;\r\n try {\r\n const head = readFileSync(skillPath, 'utf-8').slice(0, 1024);\r\n return parseSkillVersion(head.includes('---', 4) ? head : `${head}\\n---\\n`);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction skillInstallTargets(): Array<{ skillDir: string; skillPath: string }> {\r\n return SKILL_INSTALL_DIRS.map(dir => {\r\n const skillDir = join(dir, SKILL_DIR_NAME);\r\n return { skillDir, skillPath: join(skillDir, 'SKILL.md') };\r\n });\r\n}\r\n\r\nfunction formatProviderModels(provider: RegistryProvider): string {\r\n const models = provider.modelsCache?.models ?? [];\r\n if (models.length === 0) return ` (no cached models — run: anygate providers refresh-models ${provider.id})`;\r\n const lines = models.slice(0, 40).map(m => ` ${m.id}${m.name !== m.id ? ` (${m.name})` : ''}`);\r\n if (models.length > 40) lines.push(` ... and ${models.length - 40} more`);\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction buildLiveStateSection(): string {\r\n const prefs = loadPreferences();\r\n const registry = loadRegistry();\r\n const enabled = registry.providers.filter(p => p.enabled);\r\n\r\n const prefLines: string[] = [];\r\n if (prefs.lastProvider || prefs.lastModel) {\r\n prefLines.push(` Claude last launch: provider=${prefs.lastProvider ?? '(none)'} model=${prefs.lastModel ?? '(none)'}`);\r\n }\r\n if (prefs.lastCodexProvider || prefs.lastCodexModel) {\r\n prefLines.push(` Codex last launch: provider=${prefs.lastCodexProvider ?? '(none)'} model=${prefs.lastCodexModel ?? '(none)'}`);\r\n }\r\n if (prefs.lastGeminiProvider || prefs.lastGeminiModel) {\r\n prefLines.push(` Gemini last launch: provider=${prefs.lastGeminiProvider ?? '(none)'} model=${prefs.lastGeminiModel ?? '(none)'}`);\r\n }\r\n if (prefs.favoriteModels?.length) {\r\n prefLines.push(` Favorites (${prefs.favoriteModels.length}/${MAX_MODEL_CATALOG}):`);\r\n for (const f of prefs.favoriteModels) {\r\n prefLines.push(` ${f.providerId} / ${f.modelId}`);\r\n }\r\n }\r\n\r\n const providerBlocks = enabled.length === 0\r\n ? [' No registry providers configured. Built-in cloud: zen, go (OpenCode Zen/Go).']\r\n : enabled.map(p => [\r\n ` ${p.name} (${p.id}) — ${p.modelsCache?.models.length ?? 0} cached model(s)`,\r\n formatProviderModels(p),\r\n ].join('\\n'));\r\n\r\n return `\r\n================================================================================\r\nCURRENT LOCAL STATE (from disk — no network)\r\n================================================================================\r\n\r\nConfig: ${getConfigPath()}\r\nProviders: ${getProvidersPath()}\r\n\r\nSaved preferences:\r\n${prefLines.length ? prefLines.join('\\n') : ' (none — run an interactive launch first or pass --provider / --model)'}\r\n\r\nRegistry providers (enabled):\r\n${providerBlocks.join('\\n\\n')}\r\n\r\nBuilt-in cloud providers (always available when OPENCODE_API_KEY is set):\r\n zen — OpenCode Zen (free + paid models)\r\n go — OpenCode Go (paid models)\r\n\r\nTo refresh model lists after adding providers:\r\n anygate providers refresh-models\r\n anygate providers refresh-models <provider-id>\r\n\r\nZen/Go model IDs are fetched live at launch; run anygate claude --dry-run or\r\nanygate codex --config to preview without starting a session.\r\n`.trimEnd();\r\n}\r\n\r\nlet cachedStaticAiDocBody: { version: string; body: string } | null = null;\r\n\r\nfunction staticAiDocBody(): string {\r\n if (cachedStaticAiDocBody?.version === VERSION) return cachedStaticAiDocBody.body;\r\n\r\n const body = `\r\n================================================================================\r\nANYGATE — AI AGENT REFERENCE (v${VERSION})\r\n================================================================================\r\n\r\nanygate launches Claude Code, OpenAI Codex, Google Gemini CLI, and desktop apps\r\nagainst YOUR provider registry (Groq, Mistral, OpenAI, Zen/Go, Ollama, custom endpoints, …).\r\nIt handles API translation, local proxies, env isolation, and model routing.\r\n\r\nSKILL VERSIONING\r\n The installed skill version matches anygate --version (currently v${VERSION}).\r\n After upgrading anygate, run:\r\n anygate --ai --install\r\n Installs are skipped when the skill is already at the current version.\r\n Use --force to rewrite anyway (e.g. after editing providers without a release).\r\n\r\nWHEN UNSURE: run \\`anygate --ai\\` before exploring or guessing commands.\r\n\r\n================================================================================\r\nQUICK START FOR AI AGENTS\r\n================================================================================\r\n\r\n1. Discover providers and model IDs (see DISCOVERY section below).\r\n2. Launch non-interactively with boot flags — skip all wizards:\r\n anygate claude --provider <id> --model <model-id> -p \"<prompt>\"\r\n anygate codex --provider <id> --model <model-id> exec \"<prompt>\"\r\n3. To query many models/tools in a loop, call anygate once per model with -p\r\n (Claude) or exec (Codex). Each invocation is a separate one-shot session.\r\n4. For a persistent HTTP gateway (scripts, other tools): anygate server\r\n\r\n================================================================================\r\nDISCOVERY — PROVIDERS AND MODELS\r\n================================================================================\r\n\r\nLIST CONFIGURED PROVIDERS (human-readable):\r\n anygate providers list\r\n\r\nMACHINE-READABLE MODEL CATALOG (recommended for agents):\r\n Read ~/.anygate/providers.json\r\n → providers[].id provider id for --provider\r\n → providers[].modelsCache.models[].id model id for --model\r\n → providers[].enabled skip if false\r\n\r\nREFRESH STALE MODEL LISTS:\r\n anygate providers refresh-models\r\n anygate providers refresh-models groq\r\n\r\nBUILT-IN CLOUD PROVIDERS (not in providers.json):\r\n Provider id: zen (OpenCode Zen — requires OPENCODE_API_KEY)\r\n Provider id: go (OpenCode Go — requires OPENCODE_API_KEY)\r\n\r\nPREVIEW LAUNCH WITHOUT STARTING A SESSION:\r\n anygate claude --dry-run --provider groq --model <model-id>\r\n anygate codex --config --provider zen --model <model-id>\r\n\r\nINTERACTIVE BROWSE (requires TTY — avoid in agent scripts):\r\n anygate claude provider + model wizard\r\n anygate codex provider + model wizard\r\n anygate gemini provider + model wizard\r\n anygate providers provider management hub\r\n\r\n================================================================================\r\nAGENT PLATFORM PATTERNS — MULTI-MODEL / ONE-SHOT QUERIES\r\n================================================================================\r\n\r\nanygate is designed so agents can use Claude Code, Codex, or Gemini CLI as a PLATFORM:\r\nrun many models sequentially or in parallel shell jobs, each with a focused\r\nprompt, without interactive wizards.\r\n\r\nCLAUDE CODE — PRINT MODE (-p / --print)\r\n Skips the provider/model wizard when:\r\n • Both --provider and --model are set, OR\r\n • Print mode (-p / --print) and saved preferences exist from a prior launch\r\n\r\n Examples:\r\n anygate claude --provider groq --model llama-3.3-70b-versatile -p \"Summarize README.md\"\r\n anygate claude --provider zen --model deepseek-v4-flash-free -p \"Review this diff\"\r\n anygate claude -p \"quick question\" # uses lastProvider + lastModel from config\r\n\r\n Pass additional Claude Code flags after anygate flags:\r\n anygate claude --provider groq --model llama-3.3-70b-versatile -p \"task\" --output-format json\r\n\r\n Machine-readable stdout (anygate stays silent on stdout — boot UI goes to stderr):\r\n anygate claude --provider zen --model deepseek-v4-flash-free -p \"task\" --output-format stream-json\r\n anygate codex --provider zen --model deepseek-v4-flash-free exec --json \"task\"\r\n\r\n Triggers clean stdout:\r\n Claude: -p/--print + (--output-format stream-json|json OR --input-format stream-json)\r\n Codex: exec subcommand + --json\r\n\r\n anygate auto-adds --verbose when Claude uses stream-json without it.\r\n Interactive TTY launches (no stream-json / exec --json) still show normal human UI.\r\n\r\n Boot flags (anygate — NOT passed to Claude):\r\n --provider <id> Provider id (from providers list or providers.json)\r\n --model <id> Model id, or slug form: provider__model-id\r\n\r\nOPENAI CODEX — NON-INTERACTIVE (exec / positional prompt)\r\n Skips the provider/model wizard when:\r\n • Both --provider and --model are set, OR\r\n • Non-interactive args (exec subcommand or positional prompt) and saved prefs exist\r\n\r\n Examples:\r\n anygate codex --provider zen --model deepseek-v4-flash-free exec \"fix the failing test\"\r\n anygate codex --model zen__deepseek-v4-flash-free exec \"fix the bug\"\r\n anygate codex --provider openai --model gpt-5.4 exec \"implement feature X\"\r\n\r\n Codex does NOT use -p for print — anygate blocks -p (Codex uses it for --profile).\r\n\r\n Boot flags (anygate — NOT passed to Codex):\r\n --provider <id>\r\n --model <id> or provider__model-id slug\r\n\r\nGOOGLE GEMINI CLI — NON-INTERACTIVE (-p / --prompt)\r\n Skips the provider/model wizard when:\r\n • Both --provider and --model are set, OR\r\n • Non-interactive args (-p / --prompt, -i / --prompt-interactive, or positional query)\r\n and saved preferences exist\r\n\r\n Examples:\r\n anygate gemini --provider google --model gemini-2.5-flash -p \"Review this file\"\r\n anygate gemini -p \"What is the capital of France?\"\r\n\r\n Machine-readable stdout:\r\n anygate gemini --provider google --model gemini-2.5-flash -p \"task\" -o json\r\n anygate gemini --provider google --model gemini-2.5-flash -p \"task\" -o stream-json\r\n\r\n Boot flags (anygate — NOT passed to Gemini):\r\n --provider <id>\r\n --model <id> or provider__model-id slug\r\n\r\nMULTI-MODEL LOOP (shell pattern):\r\n for model in llama-3.3-70b-versatile mixtral-8x7b-32768; do\r\n anygate claude --provider groq --model \"$model\" -p \"Same prompt for all models\"\r\n done\r\n\r\n for model in deepseek-v4-flash-free qwen3.6-plus-free; do\r\n anygate codex --provider zen --model \"$model\" exec \"Same task\"\r\n done\r\n\r\n for model in gemini-2.5-flash gemini-2.5-pro; do\r\n anygate gemini --provider google --model \"$model\" -p \"Same task\"\r\n done\r\n\r\nFAVORITES / MID-SESSION SWITCHING:\r\n anygate models interactive favorites manager (max ${MAX_MODEL_CATALOG})\r\n When favorites exist, interactive claude/codex/gemini launches expose /model switching.\r\n Boot flags (--provider + --model) or print/exec/-p mode use SINGLE-MODEL launch\r\n (favorites catalog is skipped — better for agent one-shots).\r\n\r\n================================================================================\r\nCOMMANDS\r\n================================================================================\r\n\r\nROOT\r\n anygate --ai Print this reference (stdout)\r\n anygate --ai --install Install or upgrade SKILL.md when anygate version changed\r\n anygate --ai --install --force Reinstall skill even if version already matches\r\n anygate --help Short human help\r\n anygate --version Version string\r\n\r\nCLAUDE CODE\r\n anygate claude [options] [claude-flags]\r\n\r\n Options:\r\n --provider <id> Boot provider (skip wizard with --model)\r\n --model <id> Boot model id or provider__model slug\r\n --dry-run Preview launch, do not start Claude\r\n --trace Debug logs in ~/.anygate/logs/\r\n --setup Hint to use anygate providers\r\n\r\n Common Claude flags (passed through):\r\n -p, --print One-shot print mode (agent-friendly)\r\n -c Continue previous session\r\n --resume <id> Resume session\r\n --model <id> Claude's own model flag (overridden by anygate at launch)\r\n\r\n Examples:\r\n anygate claude\r\n anygate claude --provider anthropic --model claude-sonnet-4-6 -p \"review file.ts\"\r\n anygate claude --dry-run --provider groq --model llama-3.3-70b-versatile\r\n\r\nGOOGLE GEMINI CLI\r\n anygate gemini [options] [gemini-flags]\r\n\r\n Options:\r\n --provider <id> Boot provider (skip wizard with --model)\r\n --model <id> Boot model id or provider__model slug\r\n --trace Debug logs in ~/.anygate/logs/\r\n\r\n Examples:\r\n anygate gemini\r\n anygate gemini --provider google --model gemini-2.5-flash -p \"What is the capital of France?\"\r\n\r\nOPENAI CODEX CLI\r\n anygate codex [options] [codex-flags]\r\n\r\n Options:\r\n --provider <id>\r\n --model <id>\r\n --trace\r\n --restore Remove leftover overlay files after crash\r\n --config Write profile/catalog files and exit (no Codex process)\r\n\r\n anygate manages: --profile, -m, -p (profile), --provider, --model\r\n Sandbox defaults to danger-full-access (profile + -s flag) for network shell tools.\r\n Override with -s workspace-write or pass --dangerously-bypass-approvals-and-sandbox.\r\n\r\n Examples:\r\n anygate codex\r\n anygate codex --provider zen --model deepseek-v4-flash-free exec \"fix bug\"\r\n anygate codex --provider zen --model deepseek-v4-flash-free exec --json \"fix bug\"\r\n anygate codex -s workspace-write exec \"locked down\"\r\n anygate codex --trace\r\n anygate codex --restore\r\n\r\nPROVIDERS REGISTRY\r\n anygate providers interactive hub\r\n anygate providers add add Groq, Mistral, OpenAI, custom URL, …\r\n anygate providers import one-time import from OpenCode config\r\n anygate providers list show provider ids and model counts\r\n anygate providers remove <id>\r\n anygate providers refresh-models [id]\r\n anygate providers auth <id> OAuth (OpenAI ChatGPT, xAI, …)\r\n\r\nMODELS / FAVORITES\r\n anygate models manage favoriteModels in config (alias: favorites)\r\n Used for mid-session /model switching in interactive Claude/Codex/Gemini sessions.\r\n\r\nAPI GATEWAY (for tools that speak Anthropic/OpenAI HTTP)\r\n anygate server foreground gateway on port 17645\r\n anygate server --vertex Vertex AI gateway (gcloud ADC)\r\n\r\nDESKTOP APPS\r\n anygate codex-app ChatGPT desktop, Codex mode (macOS/Windows); alias: chatgpt\r\n anygate claude-app Claude desktop (macOS/Windows)\r\n\r\n================================================================================\r\nCONFIGURATION PATHS\r\n================================================================================\r\n\r\n ~/.anygate/config.json preferences (lastProvider, lastModel, favorites, …)\r\n ~/.anygate/providers.json provider registry + cached model lists (no secrets)\r\n ~/.anygate/logs/ trace/debug logs when --trace is used\r\n OPENCODE_API_KEY required for zen/go cloud providers\r\n ANYGATE_HOME override ~/.anygate\r\n\r\nCredentials live in OS keychain (macOS/Windows/Linux Secret Service), not in\r\nproviders.json. Use anygate providers auth or add flows to configure keys.\r\n\r\n================================================================================\r\nAGENT RULES OF THUMB\r\n================================================================================\r\n\r\nDO:\r\n • Run anygate --ai when unsure about commands or model ids\r\n • Use --provider + --model for every non-interactive agent invocation\r\n • Use Claude -p / Codex exec for one-shot tasks that must exit\r\n • Read providers.json for authoritative model id lists\r\n • Run anygate providers refresh-models after adding providers\r\n\r\nDO NOT:\r\n • Rely on interactive wizards in CI, scripts, or headless agent loops\r\n • Pass --provider / --model to Claude, Codex, or Gemini directly — anygate consumes them\r\n • Use Codex -p expecting print mode (it means --profile in Codex)\r\n • Assume favorites catalog in print/exec/-p mode — use explicit boot flags\r\n • Mutate settings files (e.g. ~/.claude/settings.json, ~/.codex/config.toml, ~/.gemini/config/config.json) — anygate uses env +\r\n temporary overlay profiles only\r\n\r\nNON-TTY:\r\n anygate codex requires --provider + --model (or saved prefs) when stdin is not\r\n a TTY. anygate claude print mode (-p) skips wizard with prefs or boot flags.\r\n\r\n================================================================================\r\nTROUBLESHOOTING\r\n================================================================================\r\n\r\n anygate codex --restore clean stale overlay after crash\r\n anygate claude --trace proxy + Claude debug logs\r\n anygate codex --trace proxy debug log on exit\r\n anygate gemini --trace proxy debug log on exit\r\n anygate providers list verify provider ids\r\n anygate providers refresh-models repopulate model cache\r\n\r\nCommon errors:\r\n \"Provider/model not found\" wrong id — check providers.json or providers list\r\n \"Print mode requires …\" set --provider and --model, or run interactive once\r\n \"requires an interactive terminal\" add --provider and --model for codex in CI\r\n JSON parse error on stdout line 1 missing stream-json (Claude) or exec --json (Codex)\r\n 404 unknown model (Codex favs) ensure zen/go routes — use --provider zen explicitly\r\n DeepSeek tool loop 400 update anygate — reasoning round-trip in Codex proxy\r\n Codex shell network blocked default is danger-full-access; check anygate codex --config\r\n\r\nHuman-readable guide: docs/AI-AGENTS.md in the anygate repo.\r\n\r\n================================================================================\r\nALEF AGENT INTEGRATION\r\n================================================================================\r\n\r\nalef-agent shells out to anygate to run Claude Code, Codex, or Gemini CLI against any\r\nprovider in ~/.anygate/providers.json. anygate is a launcher + proxy; the\r\nchild CLI owns NDJSON/JSONL on stdout.\r\n\r\nWHEN TO USE ANYGATE AS THE EXECUTABLE\r\n Instead of spawning claude or codex directly, spawn anygate with boot flags\r\n prepended. alef parses stdout as JSONL; anygate must not pollute stdout.\r\n\r\nSTDOUT / STDERR CONTRACT\r\n Machine-readable mode (Claude stream-json/json, Codex exec --json):\r\n stdout → child JSON only (every non-empty line must parse as JSON)\r\n stderr → anygate boot messages and errors (log or discard; do not parse)\r\n exit code → anygate launch failure OR child exit code\r\n\r\n Human interactive mode (anygate claude with no -p):\r\n stdout → normal TUI (do not parse as JSON)\r\n\r\nRECOMMENDED SPAWN — CLAUDE BACKEND (NDJSON)\r\n anygate claude \\\\\r\n --provider <provider-id> \\\\\r\n --model <model-id> \\\\\r\n -p \"<prompt>\" \\\\\r\n --output-format stream-json \\\\\r\n [--verbose] \\\\\r\n [--max-turns N] \\\\\r\n [--permission-mode bypassPermissions] \\\\\r\n [--allow-dangerously-skip-permissions] \\\\\r\n [--allowed-tools tool1,tool2]\r\n\r\n Slug alternative:\r\n anygate claude --model zen__deepseek-v4-flash-free -p \"...\" --output-format stream-json\r\n\r\n anygate injects --verbose automatically when stream-json is used without it.\r\n\r\nRECOMMENDED SPAWN — CODEX BACKEND (JSONL)\r\n anygate codex \\\\\r\n --provider <provider-id> \\\\\r\n --model <model-id> \\\\\r\n exec --json \"<prompt>\"\r\n\r\n Slug alternative:\r\n anygate codex --model zen__deepseek-v4-flash-free exec --json \"...\"\r\n\r\n Do NOT use -p for Codex print — Codex -p means --profile (anygate blocks it).\r\n\r\nPROVIDER / MODEL DISCOVERY FOR ALEF CONFIG\r\n 1. anygate providers list\r\n 2. Read ~/.anygate/providers.json → providers[].id, modelsCache.models[].id\r\n 3. anygate providers refresh-models (after adding providers)\r\n 4. Built-ins: zen, go (require OPENCODE_API_KEY in env or keychain)\r\n 5. anygate --ai (includes live state section at bottom of output)\r\n\r\nALEF CHECKLIST\r\n □ anygate on PATH (npm install -g anygate; dev: npm link after builds)\r\n □ Always pass --provider + --model (or provider__model slug) — never rely on wizard\r\n □ Claude: --output-format stream-json (or json) with -p\r\n □ Codex: exec --json (not bare codex exec without --json if parsing stdout)\r\n □ Gemini: -o json (or stream-json) with -p\r\n □ Parse stdout only; ignore stderr for JSONL/NDJSON stream\r\n □ Zen/Go: --provider zen explicitly + OPENCODE_API_KEY available\r\n □ Codex network: default danger-full-access — no extra -s needed for nlm/curl/npm\r\n □ MCP (Claude): --allowed-tools mcp__server__tool on claude args after anygate flags\r\n □ MCP (Codex): configure in ~/.codex/config.toml (anygate does not inject MCP list)\r\n □ Install skill for agents: anygate --ai --install\r\n\r\nVERIFY CLEAN STDOUT (run before wiring alef backend)\r\n anygate claude --provider zen --model deepseek-v4-flash-free \\\\\r\n -p \"PONG\" --output-format stream-json 2>/dev/null \\\\\r\n | node -e \"process.stdin.on('data',d=>d.toString().split('\\\\\\\\n').filter(Boolean).forEach(l=>JSON.parse(l))); console.log('claude ok')\"\r\n\r\n anygate codex --provider zen --model deepseek-v4-flash-free \\\\\r\n exec --json \"PONG\" 2>/dev/null \\\\\r\n | node -e \"process.stdin.on('data',d=>d.toString().split('\\\\\\\\n').filter(Boolean).forEach(l=>JSON.parse(l))); console.log('codex ok')\"\r\n\r\nMULTI-MODEL ALEF LOOPS\r\n Each anygate invocation is one session. Loop in alef/shell with different --model values.\r\n Favorites catalog is NOT used in print/exec mode — always explicit boot flags.\r\n\r\nTOOL CALLING EXAMPLE (Claude + MCP)\r\n anygate claude --provider google --model gemini-2.5-flash \\\\\r\n -p \"How many notebooks?\" \\\\\r\n --output-format stream-json \\\\\r\n --allowed-tools mcp__notebooklm-mcp__notebook_list\r\n\r\nRELATED DOCS\r\n docs/AI-AGENTS.md human-readable agent guide (this repo)\r\n docs/CODEX.md Codex CLI, sandbox, restore, routing\r\n anygate --ai full reference + live provider state\r\n`.trimEnd();\r\n\r\n cachedStaticAiDocBody = { version: VERSION, body };\r\n return body;\r\n}\r\n\r\nexport function generateAiDoc(): string {\r\n const frontmatter = `---\r\nname: anygate-cli\r\ndescription: \"Launch Claude Code and OpenAI Codex against your AI provider registry. Use for alef-agent, multi-model agent workflows, NDJSON stream-json, and non-interactive codex exec --json.\"\r\nversion: \"${VERSION}\"\r\ntype: tool\r\nstatus: approved\r\n---\r\n\r\n# anygate CLI Reference (v${VERSION})\r\n\r\n`;\r\n\r\n return frontmatter + staticAiDocBody() + '\\n\\n' + buildLiveStateSection() + '\\n';\r\n}\r\n\r\nexport function installAiDoc(opts: { force?: boolean } = {}): AiSkillInstallResult {\r\n const version = VERSION;\r\n const result: AiSkillInstallResult = {\r\n version,\r\n installed: [],\r\n updated: [],\r\n skipped: [],\r\n failed: [],\r\n };\r\n\r\n const targets = skillInstallTargets();\r\n if (!opts.force && targets.every(({ skillDir }) => readInstalledSkillVersion(skillDir) === version)) {\r\n result.skipped.push(...targets.map(t => t.skillPath));\r\n return result;\r\n }\r\n\r\n const doc = generateAiDoc();\r\n for (const { skillDir, skillPath } of targets) {\r\n try {\r\n const previous = readInstalledSkillVersion(skillDir);\r\n if (!opts.force && previous === version) {\r\n result.skipped.push(skillPath);\r\n continue;\r\n }\r\n mkdirSync(skillDir, { recursive: true });\r\n writeFileSync(skillPath, doc, 'utf-8');\r\n if (previous) {\r\n result.updated.push({ path: skillPath, fromVersion: previous });\r\n } else {\r\n result.installed.push(skillPath);\r\n }\r\n } catch {\r\n result.failed.push(skillPath);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function printAiInstallResult(result: AiSkillInstallResult): number {\r\n console.error(`anygate agent skill target version: v${result.version}`);\r\n if (result.installed.length > 0) {\r\n console.error(`Installed ${result.installed.length} new skill(s):`);\r\n for (const path of result.installed) console.error(` ✓ ${path}`);\r\n }\r\n if (result.updated.length > 0) {\r\n console.error(`Updated ${result.updated.length} skill(s):`);\r\n for (const { path, fromVersion } of result.updated) {\r\n const from = fromVersion ? `v${fromVersion}` : 'unknown';\r\n console.error(` ✓ ${path} (${from} → v${result.version})`);\r\n }\r\n }\r\n if (result.skipped.length > 0) {\r\n console.error(`Skipped ${result.skipped.length} (already v${result.version}):`);\r\n for (const path of result.skipped) console.error(` · ${path}`);\r\n }\r\n if (result.failed.length > 0) {\r\n console.error(`Failed ${result.failed.length}:`);\r\n for (const path of result.failed) console.error(` ✗ ${path}`);\r\n }\r\n return result.failed.length > 0 ? 1 : 0;\r\n}\r\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mEAuIV,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["pc","p","p","result","p","isWindows","path","spinner","p","pc","pc","p","p","pc","pc","pc","p","pc","spinner","registry","p","options","picked","template","apiKey","result","confirm","pc","p","p","text","tool","p","text","reject","log","sseChunk","join","existsSync","readFileSync","homedir","homedir","existsSync","path","readFileSync","path","existsSync","p","join","existsSync","homedir","join","join","homedir","existsSync","path","pc","p","pc","pc","pc","p","provider","p","pc","p","pc","p","spawn","existsSync","mkdirSync","rmSync","writeFileSync","homedir","join","isWindows","join","homedir","existsSync","mkdirSync","writeFileSync","rmSync","spawn","p","provider","model","createServer","streamText","generateText","tool","jsonSchema","mergeConsecutiveMessages","text","p","tool","jsonSchema","createServer","streamText","generateText","reject","pc","pc","p","appendFileSync","streamText","generateText","mapFinishReason","log","reject","text","streamText","p","mapFinishReason","generateText","execFileSync","execSync","spawn","existsSync","homedir","join","isWindows","join","homedir","existsSync","execSync","path","execFileSync","spawn","execFileSync","execSync","spawn","existsSync","homedir","join","execSync","execFileSync","existsSync","join","homedir","spawn","homedir","join","pc","p","appendFileSync","pc","p","existsSync","readFileSync","rmSync","writeFileSync","mkdirSync","dirname","join","join","path","existsSync","readFileSync","text","mkdirSync","dirname","writeFileSync","rmSync","copyFileSync","existsSync","mkdirSync","readdirSync","readFileSync","rmSync","basename","join","join","path","existsSync","readFileSync","rmSync","mkdirSync","basename","copyFileSync","text","readdirSync","waitForShutdown","waitForShutdown","pc","vertexEntryToLocalModel","route","pc","p","existsSync","readFileSync","writeFileSync","mkdirSync","homedir","join","dirname","randomUUID","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","randomUUID","join","existsSync","readFileSync","rmSync","writeFileSync","copyFileSync","unlinkSync","join","getSessionLockPath","join","readSessionLock","path","existsSync","readFileSync","writeSessionLock","writeFileSync","isProcessAlive","copyFileSync","unlinkSync","rmSync","waitForShutdown","pc","writeSessionLock","waitForShutdown","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","join","join","homedir","existsSync","readFileSync","p","mkdirSync","writeFileSync","path","parsed","pc","text","spinner","pc","options"]}
|