@jacobbd/relay-ai 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/chunk-JIDIH7DS.js +28 -0
- package/dist/chunk-O2XZFXHG.js +4763 -0
- package/dist/chunk-O2XZFXHG.js.map +1 -0
- package/dist/{chunk-SFN33VAE.js → chunk-TRM2WGI6.js} +5 -22
- package/dist/{chunk-SFN33VAE.js.map → chunk-TRM2WGI6.js.map} +1 -1
- package/dist/chunk-VXQ7ZVTW.js +152 -0
- package/dist/chunk-VXQ7ZVTW.js.map +1 -0
- package/dist/{chunk-G6QWYYAY.js → chunk-YD6A3ZB3.js} +2386 -6945
- package/dist/chunk-YD6A3ZB3.js.map +1 -0
- package/dist/cli.js +1180 -1049
- package/dist/cli.js.map +1 -1
- package/dist/core/index.js +55 -4
- package/dist/core/index.js.map +1 -1
- package/dist/manual-models-VEBTRQFK.js +12 -0
- package/dist/manual-models-VEBTRQFK.js.map +1 -0
- package/dist/{provider-templates-TZOM62WC.js → provider-templates-JY3NXZK7.js} +3 -2
- package/dist/provider-templates-JY3NXZK7.js.map +1 -0
- package/dist/ui/public/app.js +153 -2
- package/dist/ui/public/style.css +28 -0
- package/dist/{ui-command-RJVKDGGG.js → ui-command-WKPJI2CU.js} +118 -30
- package/dist/ui-command-WKPJI2CU.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-G6QWYYAY.js.map +0 -1
- package/dist/ui-command-RJVKDGGG.js.map +0 -1
- /package/dist/{provider-templates-TZOM62WC.js.map → chunk-JIDIH7DS.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../package.json","../src/paths.ts","../src/context-window.ts","../src/context-model-id.ts","../src/oauth/antigravity-oauth.ts","../src/oauth/pkce.ts","../src/oauth/callback-server.ts","../src/oauth/refresh-http.ts","../src/registry/opencode-auth.ts","../src/oauth/types.ts","../src/oauth/openai.ts","../src/oauth/github.ts","../src/oauth/xai.ts","../src/oauth/claude-code.ts","../src/cline-pass.ts","../src/oauth/cline-pass.ts","../src/oauth/refresh.ts","../src/secrets-file.ts","../src/env.ts","../src/registry/provider-models.ts","../src/registry/io.ts","../src/registry/types.ts","../src/registry/migrate.ts","../src/registry/validate.ts","../src/registry/url-security.ts","../src/oauth/claude-identity.ts","../src/provider-factory.ts","../src/oauth/responses-websocket.ts","../src/subagent-route-registry.ts","../src/subagent-model-routing.ts","../src/proxy-shared.ts","../src/codex/upstream-error.ts","../src/sdk-adapter.ts","../src/tool-search.ts"],"sourcesContent":["// src/constants.ts\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport pkg from '../package.json' with { type: 'json' };\nimport type { BackendConfig, ModelFormat } from './types.js';\n\nexport const BACKENDS: Record<'zen' | 'go', BackendConfig> = {\n zen: {\n id: 'zen',\n name: 'OpenCode Zen',\n // No /v1 suffix — the Anthropic SDK appends /v1/messages automatically\n baseUrl: 'https://opencode.ai/zen',\n },\n go: {\n id: 'go',\n name: 'OpenCode Go',\n baseUrl: 'https://opencode.ai/zen/go',\n },\n};\n\n// ChatGPT Codex Responses-Lite WebSocket transport (used by models the backend\n// flags with prefer_websockets, e.g. gpt-5.6-luna).\nexport const CODEX_RESPONSES_LITE_WS_URL = 'wss://chatgpt.com/backend-api/codex/responses';\n// `version` header the Codex backend expects on Responses-Lite requests. The\n// official Codex CLI sends its own version here; OpenAI may require this to be\n// bumped over time — confirm via --trace if Luna requests start failing.\nexport const CODEX_RESPONSES_LITE_VERSION = '0.153.4';\n// OpenAI-Beta opt-in for the WebSocket Responses transport.\nexport const CODEX_RESPONSES_WEBSOCKETS_BETA = 'responses_websockets=2026-02-06';\n\n// These must be removed from the child process environment to avoid conflicts\n// with Vertex AI, Bedrock, AWS, Foundry, and any stale Anthropic config.\nexport const CONFLICTING_ENV_VARS = [\n 'CLAUDE_CODE_USE_VERTEX',\n 'ANTHROPIC_VERTEX_PROJECT_ID',\n 'ANTHROPIC_VERTEX_BASE_URL',\n 'CLOUD_ML_REGION',\n 'ANTHROPIC_BEDROCK_BASE_URL',\n 'ANTHROPIC_AWS_BASE_URL',\n 'ANTHROPIC_AWS_API_KEY',\n 'ANTHROPIC_AWS_WORKSPACE_ID',\n 'ANTHROPIC_FOUNDRY_API_KEY',\n 'ANTHROPIC_FOUNDRY_BASE_URL',\n 'ANTHROPIC_AUTH_TOKEN',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_BASE_URL',\n 'ANTHROPIC_MODEL',\n 'ANTHROPIC_DEFAULT_OPUS_MODEL',\n 'ANTHROPIC_DEFAULT_SONNET_MODEL',\n 'ANTHROPIC_DEFAULT_HAIKU_MODEL',\n] as const;\n\nexport type ConflictingEnvVar = (typeof CONFLICTING_ENV_VARS)[number];\n\n// When relay-ai launches Claude Code from inside an existing Claude Code\n// session (its own terminal, a Code tab, an agent's shell), these identity\n// vars leak into the spawned child via process.env inheritance. The new\n// process then misidentifies itself as a nested child of the outer session\n// (e.g. CLAUDE_CODE_CHILD_SESSION disables transcript saving) even though\n// it's meant to be a fresh top-level launch. Strip before spawning.\nexport const PARENT_SESSION_ENV_VARS = [\n 'CLAUDECODE',\n 'CLAUDE_CODE_CHILD_SESSION',\n 'CLAUDE_CODE_SESSION_ID',\n 'CLAUDE_CODE_HOST_SESSION_ID',\n 'CLAUDE_CODE_ENTRYPOINT',\n 'CLAUDE_PID',\n] as const;\n\n// Optional enrichment from OpenCode CLI (~/.cache/opencode/models.json) — not a runtime dependency.\nexport const OPENCODE_CACHE_PATH = join(homedir(), '.cache', 'opencode', 'models.json');\n\n/** Max models in favorites list and mid-session /model switch catalog. */\nexport const MAX_MODEL_CATALOG = 20;\n\n/** Codex redirects every marked child session to this one explicit Relay model. */\nexport const CODEX_SUBAGENT_MODEL_CAP = 1;\n\n/**\n * Smallest context window worth offering: agent system prompts plus tool definitions\n * consume ~25K before the first user message, so smaller models fail immediately.\n * Antigravity enforces its own, higher floor (see `ANTIGRAVITY_MIN_CONTEXT_WINDOW`).\n */\nexport const MIN_CONTEXT_WINDOW = 128000;\n\n/** Vercel AI SDK package for Anthropic Claude models on Google Vertex AI (ADC auth). */\nexport const VERTEX_ANTHROPIC_NPM = '@ai-sdk/google-vertex/anthropic';\n\n// Classify a model's API format based on cache provider data or ID heuristics.\n// Used to decide whether to route directly or through the translation proxy.\nexport function classifyModelFormat(\n modelId: string,\n providerNpm: string | undefined,\n): ModelFormat {\n if (providerNpm === '@ai-sdk/anthropic') return 'anthropic';\n if (providerNpm === '@ai-sdk/openai') return 'unsupported';\n if (providerNpm === '@ai-sdk/google') return 'unsupported';\n\n // Fallback: ID-prefix heuristics for models not in cache\n const lower = modelId.toLowerCase();\n if (lower.startsWith('claude-')) return 'anthropic';\n if (lower.startsWith('gpt-')) return 'unsupported';\n if (lower.startsWith('gemini-')) return 'unsupported';\n\n return 'openai';\n}\n\nexport const VERSION = pkg.version;\n","{\n \"name\": \"@jacobbd/relay-ai\",\n \"version\": \"0.11.1\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"description\": \"Relay any model into any coding agent — launch Claude Code, Codex, and more with multi-provider gateways\",\n \"author\": \"jacob-bd\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jacob-bd/relay-ai.git\"\n },\n \"homepage\": \"https://github.com/jacob-bd/relay-ai#readme\",\n \"keywords\": [\n \"claude\",\n \"claude-code\",\n \"codex\",\n \"ai\",\n \"llm\",\n \"cli\",\n \"gateway\",\n \"relay\",\n \"vertex\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"relay-ai\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"scripts\": {\n \"build\": \"tsup && tsup --config tsup.core.config.ts && node scripts/copy-ui-assets.mjs\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run --exclude \\\"tests/debug-*.test.ts\\\"\",\n \"test:live\": \"vitest run tests/debug-xai.test.ts tests/debug-openai-oauth.test.ts\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"release:check\": \"node scripts/release-metadata.mjs\",\n \"refresh:models-dev\": \"node scripts/refresh-models-dev-cache.mjs\",\n \"prepublishOnly\": \"npm run release:check && npm run build\"\n },\n \"dependencies\": {\n \"@ai-sdk/alibaba\": \"^2.0.41\",\n \"@ai-sdk/amazon-bedrock\": \"^5.0.76\",\n \"@ai-sdk/azure\": \"^4.0.63\",\n \"@ai-sdk/cerebras\": \"^3.0.44\",\n \"@ai-sdk/cohere\": \"^4.0.37\",\n \"@ai-sdk/deepinfra\": \"^3.0.44\",\n \"@ai-sdk/gateway\": \"^4.0.75\",\n \"@ai-sdk/google\": \"^4.0.64\",\n \"@ai-sdk/google-vertex\": \"^5.0.76\",\n \"@ai-sdk/groq\": \"^4.0.37\",\n \"@ai-sdk/mistral\": \"^4.0.39\",\n \"@ai-sdk/openai\": \"^4.0.60\",\n \"@ai-sdk/openai-compatible\": \"^3.0.44\",\n \"@ai-sdk/perplexity\": \"^4.0.39\",\n \"@ai-sdk/togetherai\": \"^3.0.45\",\n \"@ai-sdk/vercel\": \"^3.0.30\",\n \"@ai-sdk/xai\": \"^4.0.54\",\n \"@clack/prompts\": \"^0.9.1\",\n \"@openrouter/ai-sdk-provider\": \"^3.0.0\",\n \"ai\": \"^7.0.93\",\n \"cross-spawn\": \"^7.0.6\",\n \"gitlab-ai-provider\": \"^6.15.0\",\n \"graphql\": \"^16.14.2\",\n \"ipaddr.js\": \"^2.4.0\",\n \"node-forge\": \"^1.4.0\",\n \"open\": \"^11.0.0\",\n \"picocolors\": \"^1.1.1\",\n \"smol-toml\": \"^1.6.1\",\n \"ws\": \"^8.21.0\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/node\": \"^22.0.0\",\n \"@types/node-forge\": \"^1.3.14\",\n \"@types/ws\": \"^8.18.1\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.5.0\",\n \"vite-node\": \"^6.0.0\",\n \"vitest\": \"^4.1.10\"\n },\n \"optionalDependencies\": {\n \"@napi-rs/keyring\": \"^1.3.0\"\n },\n \"overrides\": {\n \"ws\": \"^8.21.0\"\n },\n \"exports\": {\n \"./core\": {\n \"types\": \"./dist/core/index.d.ts\",\n \"import\": \"./dist/core/index.js\",\n \"default\": \"./dist/core/index.js\"\n },\n \"./package.json\": \"./package.json\"\n }\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport const APP_DIR_NAME = 'relay-ai';\nexport const LEGACY_APP_DIR_NAME = 'opencode-starter';\n\ninterface HomeEnv {\n APPDATA?: string;\n HOME?: string;\n RELAY_AI_HOME?: string;\n /** @deprecated Use RELAY_AI_HOME */\n OPENCODE_STARTER_HOME?: string;\n USERPROFILE?: string;\n XDG_CONFIG_HOME?: string;\n}\n\nfunction userHome(env: HomeEnv = process.env): string {\n return env.HOME ?? env.USERPROFILE ?? homedir();\n}\n\nexport function resolveAppHomeOverride(env: HomeEnv = process.env): string | undefined {\n const override = env.RELAY_AI_HOME ?? env.OPENCODE_STARTER_HOME;\n return override?.trim() || undefined;\n}\n\nexport function getAppHome(env: HomeEnv = process.env): string {\n const override = resolveAppHomeOverride(env);\n if (override) return override;\n return join(userHome(env), `.${APP_DIR_NAME}`);\n}\n\nexport function getLegacyAppHome(env: HomeEnv = process.env): string {\n return join(userHome(env), `.${LEGACY_APP_DIR_NAME}`);\n}\n\nexport function getConfigPath(env: HomeEnv = process.env): string {\n return join(getAppHome(env), 'config.json');\n}\n\nexport function getProvidersPath(env: HomeEnv = process.env): string {\n return join(getAppHome(env), 'providers.json');\n}\n\nexport function getSecretsPath(env: HomeEnv = process.env): string {\n return join(getAppHome(env), 'secrets.json');\n}\n\nexport function getLogsPath(env: HomeEnv = process.env): string {\n return join(getAppHome(env), 'logs');\n}\n\nexport function getVertexModelsPath(env: HomeEnv = process.env): string {\n return join(getAppHome(env), 'vertex-models.json');\n}\n\nexport function getLegacyConfPath(env: HomeEnv = process.env, platform = process.platform): string {\n const home = userHome(env);\n const appName = `${LEGACY_APP_DIR_NAME}-nodejs`;\n\n if (platform === 'darwin') {\n return join(home, 'Library', 'Preferences', appName, 'config.json');\n }\n\n if (platform === 'win32') {\n return join(env.APPDATA ?? join(home, 'AppData', 'Roaming'), appName, 'Config', 'config.json');\n }\n\n return join(env.XDG_CONFIG_HOME ?? join(home, '.config'), appName, 'config.json');\n}\n","// Context window resolution for proxy /v1/models and Claude Code child env.\n//\n// Priority:\n// 1. OpenCode models.json cache (limit.context) — `opencode` / `opencode-go` file keys first\n// 2. ID-pattern heuristics for models not in cache\n// 3. 200K default (Claude Code's own fallback for unknown models)\nimport { readFileSync } from 'node:fs';\nimport { OPENCODE_CACHE_PATH } from './constants.js';\n\nexport const DEFAULT_CONTEXT_WINDOW = 200_000;\n\n/** OpenCode cache file provider keys for Zen/Go (not relay-ai registry ids). */\nconst CACHE_PROVIDER_PRIORITY = new Set(['opencode', 'opencode-go']);\n\nexport interface OpencodeCacheModel {\n id?: string;\n name?: string;\n family?: string;\n status?: string;\n provider?: { npm?: string };\n cost?: { input: number; output: number };\n limit?: { context?: number; output?: number };\n reasoning?: boolean;\n interleaved?: { field?: string };\n}\n\nexport type OpencodeCacheFile = Record<string, { models?: Record<string, OpencodeCacheModel> }>;\n\n// Ordered by specificity — first match wins.\nconst HEURISTIC_RULES: Array<[RegExp, number]> = [\n [/gemini-2\\.5-pro|gemini-1\\.5-pro|gemini-3-pro/i, 2_000_000],\n [/gemini/i, 1_000_000],\n [/claude-opus-4-[678]|claude-sonnet-4-[678]/i, 1_000_000],\n [/claude-haiku-4-[567]/i, 200_000],\n [/claude.*\\[1m\\]/i, 1_000_000],\n [/claude-opus-4-[56]|claude-sonnet-4-[45]|claude-3/i, 200_000],\n [/claude/i, 200_000],\n [/deepseek-v4|deepseek-r1|deepseek-reasoner/i, 1_000_000],\n [/deepseek/i, 64_000],\n [/gpt-5|gpt-4\\.1|o3-|o4-/i, 1_000_000],\n [/gpt-4o|gpt-4-turbo|gpt-4/i, 128_000],\n [/gpt-oss/i, 131_072],\n [/qwen3|qwen-3|qwen2\\.5-72b|qwen2\\.5-32b|qwen-coder/i, 262_144],\n [/qwen/i, 131_072],\n [/kimi-k2|kimi-k2\\.5|moonshot/i, 262_144],\n [/minimax-m2/i, 204_800],\n [/minimax/i, 128_000],\n [/mistral-large|ministral|mistral/i, 262_144],\n [/llama-3\\.[23]|llama3/i, 131_072],\n [/grok-4\\.20/i, 1_000_000],\n [/grok-4\\.5/i, 500_000],\n [/grok-3|grok-4/i, 131_072],\n [/nemotron/i, 131_072],\n [/glm-4/i, 128_000],\n [/solar-pro3/i, 131_072],\n [/solar-pro2/i, 65_536],\n [/solar/i, 32_768],\n];\n\nlet parsedCache: OpencodeCacheFile | null | undefined;\nlet cacheIndex: Map<string, number> | undefined;\nconst heuristicCache = new Map<string, number>();\n\n/** Shared parse of ~/.cache/opencode/models.json — used by model list and context lookup. */\nexport function loadOpencodeCache(): OpencodeCacheFile | null {\n if (parsedCache === undefined) {\n try {\n parsedCache = JSON.parse(readFileSync(OPENCODE_CACHE_PATH, 'utf8')) as OpencodeCacheFile;\n } catch {\n parsedCache = null;\n }\n }\n return parsedCache;\n}\n\n/** Build a model-id → context-window map from OpenCode cache data. Exported for tests. */\nexport function buildContextWindowIndex(cache: OpencodeCacheFile): Map<string, number> {\n const index = new Map<string, number>();\n const allLimits = new Map<string, number[]>();\n\n for (const [providerKey, providerData] of Object.entries(cache)) {\n const models = providerData?.models;\n if (!models) continue;\n for (const [modelId, entry] of Object.entries(models)) {\n const ctx = entry.limit?.context;\n if (typeof ctx !== 'number' || ctx <= 0) continue;\n\n const limits = allLimits.get(modelId) ?? [];\n limits.push(ctx);\n allLimits.set(modelId, limits);\n\n if (CACHE_PROVIDER_PRIORITY.has(providerKey)) {\n index.set(modelId, ctx);\n }\n }\n }\n\n for (const [modelId, limits] of allLimits) {\n if (!index.has(modelId)) {\n index.set(modelId, Math.max(...limits));\n }\n }\n\n return index;\n}\n\nfunction getCacheIndex(): Map<string, number> {\n if (cacheIndex === undefined) {\n const cache = loadOpencodeCache();\n cacheIndex = cache ? buildContextWindowIndex(cache) : new Map();\n }\n return cacheIndex;\n}\n\nexport function contextWindowFromHeuristics(modelId: string): number {\n const cached = heuristicCache.get(modelId);\n if (cached !== undefined) return cached;\n for (const [pattern, size] of HEURISTIC_RULES) {\n if (pattern.test(modelId)) {\n heuristicCache.set(modelId, size);\n return size;\n }\n }\n heuristicCache.set(modelId, DEFAULT_CONTEXT_WINDOW);\n return DEFAULT_CONTEXT_WINDOW;\n}\n\nexport function lookupContextWindow(modelId: string): number {\n return getCacheIndex().get(modelId) ?? contextWindowFromHeuristics(modelId);\n}\n\n/** Prefer an explicit limit.context (or pre-resolved value), else resolve from cache/heuristics. */\nexport function resolveContextWindow(modelId: string, explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) return explicit;\n return lookupContextWindow(modelId);\n}\n","// Claude Code treats third-party routes as 200K unless the model id ends with [1m].\nimport { DEFAULT_CONTEXT_WINDOW, resolveContextWindow } from './context-window.js';\n\nexport const ONE_M_CONTEXT_SUFFIX = '[1m]';\n\nexport function stripOneMContextSuffix(modelId: string): string {\n return modelId.replace(/\\[1m\\]$/i, '');\n}\n\nexport function hasOneMContextSuffix(modelId: string): boolean {\n return /\\[1m\\]$/i.test(modelId);\n}\n\n/** Model id to pass to Claude Code (--model / ANTHROPIC_MODEL) for accurate context UX. */\nexport function claudeCodeClientModelId(modelId: string, contextWindow?: number): string {\n const bare = stripOneMContextSuffix(modelId);\n const window = resolveContextWindow(bare, contextWindow);\n if (window > DEFAULT_CONTEXT_WINDOW) {\n return `${bare}${ONE_M_CONTEXT_SUFFIX}`;\n }\n return bare;\n}\n\n/** Variants to match inbound Claude Code model ids against proxy catalog aliases. */\nexport function routeLookupIds(id: string): string[] {\n const bare = stripOneMContextSuffix(id);\n const googleBare = bare.startsWith('models/') ? bare.slice('models/'.length) : bare;\n return [...new Set([\n id,\n bare,\n `${bare}${ONE_M_CONTEXT_SUFFIX}`,\n googleBare,\n `${googleBare}${ONE_M_CONTEXT_SUFFIX}`,\n `models/${googleBare}`,\n `models/${bare}`,\n ])];\n}\n","// src/oauth/antigravity-oauth.ts — Authorization Code + PKCE flow for Antigravity\n// (Google Cloud Code Assist). Client credentials are the public values shipped in\n// the Antigravity CLI binary (PKCE — not secrets per RFC 8252 / Google docs).\n\nimport open from 'open';\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join as pathJoin } from 'node:path';\nimport { generatePkce, generateOAuthState } from './pkce.js';\nimport { startCallbackServer } from './callback-server.js';\nimport type { OAuthTokenResponse } from './types.js';\nimport { postOAuthRefresh } from './refresh-http.js';\n\nconst DEFAULT_ANTIGRAVITY_CLIENT_ID = ['107100606059', '1-tmhssin2h2', '1lcre235vtol', 'ojh4g403ep.a', 'pps.googleus', 'ercontent.co', 'm'].join('');\nconst DEFAULT_ANTIGRAVITY_CLIENT_SECRET = ['GOCS', 'PX-K', '58FW', 'R486', 'LdLJ', '1mLB', '8sXC', '4z6q', 'DAf'].join('');\n\nexport const ANTIGRAVITY_CLIENT_ID =\n process.env.ANTIGRAVITY_OAUTH_CLIENT_ID ?? DEFAULT_ANTIGRAVITY_CLIENT_ID;\n\nexport const ANTIGRAVITY_CLIENT_SECRET =\n process.env.ANTIGRAVITY_OAUTH_CLIENT_SECRET ?? DEFAULT_ANTIGRAVITY_CLIENT_SECRET;\n\nconst AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/v2/auth';\nconst TOKEN_URL = 'https://oauth2.googleapis.com/token';\nconst USER_INFO_URL = 'https://www.googleapis.com/oauth2/v1/userinfo';\n\nconst SCOPES = [\n 'openid',\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/userinfo.email',\n 'https://www.googleapis.com/auth/userinfo.profile',\n 'https://www.googleapis.com/auth/cclog',\n 'https://www.googleapis.com/auth/experimentsandconfigs',\n].join(' ');\n\n// Pinned to Antigravity-Manager version used for header fingerprinting.\nconst ANTIGRAVITY_VERSION = '4.2.0';\nexport const ANTIGRAVITY_USER_AGENT = `vscode/1.X.X (Antigravity/${ANTIGRAVITY_VERSION})`;\nconst ANTIGRAVITY_METADATA = { ideType: 'ANTIGRAVITY' };\n\n// Cloud Code Assist base URLs — tried in order, first success wins.\nexport const ANTIGRAVITY_BASE_URLS = [\n 'https://daily-cloudcode-pa.googleapis.com',\n 'https://cloudcode-pa.googleapis.com',\n 'https://daily-cloudcode-pa.sandbox.googleapis.com',\n];\nexport const ANTIGRAVITY_API_VERSION = 'v1internal';\n\nexport interface AntigravityPkceParams {\n authUrl: string;\n codeVerifier: string;\n oauthState: string;\n redirectUri: string;\n}\n\nexport async function buildAntigravityAuthUrl(\n redirectUri: string,\n): Promise<AntigravityPkceParams> {\n const { verifier, challenge } = await generatePkce();\n const state = generateOAuthState();\n const params = new URLSearchParams({\n client_id: ANTIGRAVITY_CLIENT_ID,\n response_type: 'code',\n redirect_uri: redirectUri,\n scope: SCOPES,\n state,\n access_type: 'offline',\n prompt: 'consent',\n code_challenge: challenge,\n code_challenge_method: 'S256',\n });\n return { authUrl: `${AUTHORIZE_URL}?${params}`, codeVerifier: verifier, oauthState: state, redirectUri };\n}\n\nexport async function exchangeAntigravityToken(\n code: string,\n codeVerifier: string,\n redirectUri: string,\n): Promise<OAuthTokenResponse> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: ANTIGRAVITY_CLIENT_ID,\n client_secret: ANTIGRAVITY_CLIENT_SECRET,\n code,\n redirect_uri: redirectUri,\n code_verifier: codeVerifier,\n });\n\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n 'User-Agent': ANTIGRAVITY_USER_AGENT,\n },\n body,\n });\n if (!res.ok) throw new Error(`Antigravity token exchange failed: ${await res.text()}`);\n return res.json() as Promise<OAuthTokenResponse>;\n}\n\nexport async function refreshAntigravityToken(refreshToken: string): Promise<OAuthTokenResponse> {\n return postOAuthRefresh(\n TOKEN_URL,\n new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: ANTIGRAVITY_CLIENT_ID,\n client_secret: ANTIGRAVITY_CLIENT_SECRET,\n refresh_token: refreshToken,\n }),\n {\n contentType: 'form',\n errorPrefix: 'Antigravity token refresh failed',\n includeBody: true,\n },\n );\n}\n\nexport interface AntigravityUserInfo {\n email?: string;\n name?: string;\n}\n\nasync function fetchUserInfo(accessToken: string): Promise<AntigravityUserInfo> {\n try {\n const res = await fetch(`${USER_INFO_URL}?alt=json`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n if (!res.ok) return {};\n const data = (await res.json()) as Record<string, unknown>;\n return {\n email: typeof data.email === 'string' ? data.email : undefined,\n name: typeof data.name === 'string' ? data.name : undefined,\n };\n } catch {\n return {};\n }\n}\n\nfunction apiHeaders(accessToken: string): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${accessToken}`,\n 'User-Agent': ANTIGRAVITY_USER_AGENT,\n };\n}\n\nasync function fetchFirstOk(\n paths: string[],\n init: RequestInit,\n): Promise<Response> {\n let lastErr: unknown;\n for (const url of paths) {\n try {\n const res = await fetch(url, init);\n if (res.ok) return res;\n lastErr = new Error(`${res.status} ${await res.text()}`);\n } catch (err) {\n lastErr = err;\n }\n }\n throw lastErr ?? new Error('All Antigravity endpoints failed');\n}\n\n// ── Onboarding tier extraction — adapted from OmniRoute codeAssistSubscription.ts (MIT) ──\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction toRecord(v: unknown): JsonRecord {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as JsonRecord) : {};\n}\n\nfunction pickTierId(tier: unknown): string | null {\n const v = toRecord(tier).id;\n return typeof v === 'string' && v.trim() ? v.trim() : null;\n}\n\nfunction findDefaultAllowedTier(sub: JsonRecord): JsonRecord | null {\n if (!Array.isArray(sub.allowedTiers)) return null;\n for (const t of sub.allowedTiers) {\n const tier = toRecord(t);\n if (tier.isDefault) return tier;\n }\n return null;\n}\n\nexport function resolveAntigravityOnboardTierId(data: unknown): string {\n const sub = toRecord(data);\n const hasIneligible = Array.isArray(sub.ineligibleTiers) && sub.ineligibleTiers.length > 0;\n if (!hasIneligible) {\n const current = pickTierId(sub.currentTier);\n if (current) return current;\n }\n const def = findDefaultAllowedTier(sub);\n if (def) {\n const defId = pickTierId(def);\n if (defId) return defId;\n }\n const paid = pickTierId(sub.paidTier);\n if (paid) return paid;\n return pickTierId(sub.currentTier) ?? 'legacy-tier';\n}\n\n// ── Cloud Code Assist bootstrap ────────────────────────────────────────────\n\nexport interface AntigravityBootstrap {\n projectId: string;\n tierId: string;\n}\n\nasync function loadCodeAssist(accessToken: string): Promise<AntigravityBootstrap> {\n const endpoints = ANTIGRAVITY_BASE_URLS.map(b => `${b}/${ANTIGRAVITY_API_VERSION}:loadCodeAssist`);\n\n const res = await fetchFirstOk(endpoints, {\n method: 'POST',\n headers: apiHeaders(accessToken),\n body: JSON.stringify({ metadata: ANTIGRAVITY_METADATA }),\n });\n\n const data = (await res.json()) as Record<string, unknown>;\n let projectId = data.cloudaicompanionProject;\n if (typeof projectId === 'object' && projectId !== null) {\n projectId = (projectId as Record<string, unknown>).id ?? '';\n }\n\n return {\n projectId: typeof projectId === 'string' ? projectId : '',\n tierId: resolveAntigravityOnboardTierId(data),\n };\n}\n\nasync function onboardUser(\n accessToken: string,\n tierId: string,\n maxAttempts = 10,\n): Promise<string> {\n const endpoints = ANTIGRAVITY_BASE_URLS.map(b => `${b}/${ANTIGRAVITY_API_VERSION}:onboardUser`);\n let finalProjectId = '';\n\n for (let i = 0; i < maxAttempts; i++) {\n const res = await fetchFirstOk(endpoints, {\n method: 'POST',\n headers: apiHeaders(accessToken),\n body: JSON.stringify({ tier_id: tierId, metadata: ANTIGRAVITY_METADATA }),\n });\n\n const result = (await res.json()) as Record<string, unknown>;\n if (result.done === true) {\n const p = result.response ? (result.response as Record<string, unknown>).cloudaicompanionProject : undefined;\n if (typeof p === 'string') finalProjectId = p.trim();\n else if (p && typeof p === 'object') finalProjectId = String((p as Record<string, unknown>).id ?? '') || finalProjectId;\n break;\n }\n\n if (i < maxAttempts - 1) await new Promise(r => setTimeout(r, 5000));\n }\n\n return finalProjectId;\n}\n\nexport interface AntigravityOAuthResult {\n tokens: OAuthTokenResponse;\n userInfo: AntigravityUserInfo;\n projectId: string;\n tierId: string;\n}\n\n/** Read the project ID the AGY CLI already set up on this machine, as a fallback\n * when loadCodeAssist fails with a fresh OAuth token. */\nfunction readAgyProjectId(): string {\n try {\n const cache = pathJoin(homedir(), '.gemini', 'antigravity-cli', 'cache', 'projects.json');\n const data = JSON.parse(readFileSync(cache, 'utf8')) as Record<string, string>;\n // Prefer the home-directory project (most general), then any other entry.\n return data[homedir()] ?? Object.values(data)[0] ?? '';\n } catch {\n return '';\n }\n}\n\n/** Shared post-exchange bootstrap: fetch user info + loadCodeAssist + onboardUser.\n * Bootstrap failures are best-effort — auth succeeds even if project setup fails.\n * Falls back to reading the AGY CLI's stored projectId if loadCodeAssist fails. */\nasync function runBootstrap(\n tokens: OAuthTokenResponse,\n): Promise<AntigravityOAuthResult> {\n const [userInfoResult, bootstrapResult] = await Promise.allSettled([\n fetchUserInfo(tokens.access_token),\n loadCodeAssist(tokens.access_token),\n ]);\n\n const userInfo = userInfoResult.status === 'fulfilled' ? userInfoResult.value : {};\n let projectId = bootstrapResult.status === 'fulfilled' ? bootstrapResult.value.projectId : '';\n const tierId = bootstrapResult.status === 'fulfilled' ? bootstrapResult.value.tierId : 'free-tier';\n\n const finalProjectId = await onboardUser(tokens.access_token, tierId, 3).catch(() => '');\n if (finalProjectId) projectId = finalProjectId;\n\n if (!projectId && tierId !== 'free-tier') {\n const freeTierProjectId = await onboardUser(tokens.access_token, 'free-tier', 3).catch(() => '');\n if (freeTierProjectId) projectId = freeTierProjectId;\n }\n\n // Google bootstrap failed or returned no project — fall back to the AGY CLI's stored project.\n if (!projectId) {\n projectId = readAgyProjectId();\n }\n\n return { tokens, userInfo, projectId, tierId };\n}\n\n/** Full CLI PKCE flow: starts local callback server, opens browser, exchanges code. */\nexport async function runAntigravityOAuthFlow(\n onAuthUrl: (url: string) => void,\n): Promise<AntigravityOAuthResult> {\n const server = await startCallbackServer();\n try {\n const { authUrl, codeVerifier, redirectUri } = await buildAntigravityAuthUrl(server.redirectUri);\n onAuthUrl(authUrl);\n open(authUrl).catch(() => {});\n const { code } = await server.waitForCallback();\n if (!code) throw new Error('No authorization code received from Google');\n const tokens = await exchangeAntigravityToken(code, codeVerifier, redirectUri);\n return runBootstrap(tokens);\n } finally {\n server.close();\n }\n}\n\n/** For the GUI: complete token exchange + bootstrap given code from /oauth/callback. */\nexport async function completeAntigravityExchange(\n code: string,\n codeVerifier: string,\n redirectUri: string,\n): Promise<AntigravityOAuthResult> {\n const tokens = await exchangeAntigravityToken(code, codeVerifier, redirectUri);\n return runBootstrap(tokens);\n}\n","// pkce.ts — shared PKCE helpers for OAuth device/browser flows\n\nexport interface PkceCodes {\n verifier: string;\n challenge: string;\n}\n\nexport function generateRandomString(length: number): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n return Array.from(crypto.getRandomValues(new Uint8Array(length)))\n .map(b => chars[b % chars.length])\n .join('');\n}\n\nfunction base64UrlEncode(buffer: ArrayBuffer): string {\n const binary = String.fromCharCode(...new Uint8Array(buffer));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport async function generatePkce(): Promise<PkceCodes> {\n const verifier = generateRandomString(64);\n const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n return { verifier, challenge: base64UrlEncode(hash) };\n}\n\nexport function generateOAuthState(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n const binary = String.fromCharCode(...bytes);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function positiveSecondsToMs(value: unknown, defaultMs: number): number {\n const seconds = Number(value);\n return Number.isFinite(seconds) && seconds > 0 ? seconds * 1000 : defaultMs;\n}\n\nexport async function sleepMs(ms: number): Promise<void> {\n await new Promise<void>(resolve => setTimeout(resolve, ms));\n}\n","// src/oauth/callback-server.ts — CLI fallback local callback server for PKCE OAuth flows.\n// Primary path: the GUI server handles /oauth/callback when the UI is open.\n// This is only used when running `relay-ai providers auth <provider>` without the GUI.\n\nimport http from 'node:http';\n\nexport interface CallbackParams {\n code: string;\n state: string;\n error?: string;\n}\n\nexport interface CallbackServer {\n port: number;\n redirectUri: string;\n waitForCallback(timeoutMs?: number): Promise<CallbackParams>;\n close(): void;\n}\n\nconst SUCCESS_HTML = `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>Authorized</title></head>\n<body style=\"font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0\">\n<div style=\"text-align:center;padding:2rem;background:#fff;border-radius:8px;box-shadow:0 2px 10px rgba(0,0,0,.1)\">\n<div style=\"color:#22c55e;font-size:2.5rem\">✓</div>\n<h1 style=\"margin:.5rem 0\">Authentication successful</h1>\n<p style=\"color:#666\">You can close this tab and return to the terminal.</p>\n</div></body></html>`;\n\nexport function startCallbackServer(): Promise<CallbackServer> {\n return new Promise((resolve, reject) => {\n let codeResolve: ((p: CallbackParams) => void) | undefined;\n let codeReject: ((e: Error) => void) | undefined;\n\n const server = http.createServer((req, res) => {\n const u = new URL(req.url ?? '/', 'http://localhost');\n if (u.pathname !== '/callback' && u.pathname !== '/oauth/callback') {\n res.writeHead(404); res.end(); return;\n }\n const code = u.searchParams.get('code') ?? '';\n const state = u.searchParams.get('state') ?? '';\n const error = u.searchParams.get('error') ?? '';\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(SUCCESS_HTML);\n codeResolve?.({ code, state, error: error || undefined });\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address() as { port: number };\n const port = addr.port;\n resolve({\n port,\n redirectUri: `http://127.0.0.1:${port}/callback`,\n waitForCallback(timeoutMs = 300_000) {\n return new Promise<CallbackParams>((res, rej) => {\n codeResolve = res;\n codeReject = rej;\n setTimeout(\n () => rej(new Error('OAuth timeout — browser closed without completing sign-in')),\n timeoutMs,\n );\n });\n },\n close() { server.close(); codeReject?.(new Error('Server closed')); },\n });\n });\n\n server.on('error', reject);\n });\n}\n","import type { OAuthTokenResponse } from './types.js';\n\nexport interface PostOAuthRefreshOptions {\n contentType: 'form' | 'json';\n errorPrefix: string;\n includeStatus?: boolean;\n includeBody?: boolean;\n headers?: Record<string, string>;\n}\n\nexport async function postOAuthRefresh(\n url: string,\n body: URLSearchParams | Record<string, string>,\n options: PostOAuthRefreshOptions,\n): Promise<OAuthTokenResponse> {\n const isJson = options.contentType === 'json';\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': isJson ? 'application/json' : 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n ...options.headers,\n },\n body: isJson ? JSON.stringify(body) : (body as URLSearchParams).toString(),\n });\n\n if (!response.ok) {\n const detail = options.includeBody ? await response.text().catch(() => '') : '';\n const status = options.includeStatus ? ` (${response.status})` : '';\n throw new Error(`${options.errorPrefix}${status}${detail ? `: ${detail}` : ''}`);\n }\n\n return response.json() as Promise<OAuthTokenResponse>;\n}\n","// opencode-auth.ts — read OpenCode ~/.local/share/opencode/auth.json for one-time OAuth import\n\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface OpencodeOAuthCredential {\n type: 'oauth';\n access: string;\n refresh: string;\n expires: number;\n accountId?: string;\n enterpriseUrl?: string;\n providerData?: Record<string, unknown>;\n}\n\nexport interface OpencodeWellKnownCredential {\n type: 'wellknown';\n key: string;\n token: string;\n}\n\nexport type OpencodeAuthEntry = OpencodeOAuthCredential | OpencodeWellKnownCredential | string;\n\nexport interface ReadOpencodeAuthResult {\n path: string;\n entries: Record<string, OpencodeAuthEntry>;\n permissionWarning?: string;\n}\n\nexport function resolveOpencodeAuthPath(env: NodeJS.ProcessEnv = process.env): string {\n const dataHome = env['XDG_DATA_HOME'] ?? join(homedir(), '.local', 'share');\n if (process.platform === 'win32') {\n return join(env['APPDATA'] ?? join(homedir(), 'AppData', 'Roaming'), 'opencode', 'auth.json');\n }\n return join(dataHome, 'opencode', 'auth.json');\n}\n\nfunction decodeAuthEntry(value: unknown): OpencodeAuthEntry | null {\n if (typeof value === 'string' && value.trim()) return value.trim();\n if (!value || typeof value !== 'object') return null;\n const record = value as Record<string, unknown>;\n if (record['type'] === 'oauth'\n && typeof record['access'] === 'string'\n && typeof record['refresh'] === 'string'\n && typeof record['expires'] === 'number') {\n return {\n type: 'oauth',\n access: record['access'],\n refresh: record['refresh'],\n expires: record['expires'],\n accountId: typeof record['accountId'] === 'string' ? record['accountId'] : undefined,\n enterpriseUrl: typeof record['enterpriseUrl'] === 'string' ? record['enterpriseUrl'] : undefined,\n providerData: record['providerData'] && typeof record['providerData'] === 'object' && !Array.isArray(record['providerData'])\n ? record['providerData'] as Record<string, unknown>\n : undefined,\n };\n }\n if (record['type'] === 'wellknown'\n && typeof record['key'] === 'string'\n && typeof record['token'] === 'string') {\n return { type: 'wellknown', key: record['key'], token: record['token'] };\n }\n return null;\n}\n\n/** Warn when auth.json is group/world readable (OpenCode uses 0600). */\nexport function authFilePermissionWarning(path: string): string | undefined {\n if (!existsSync(path)) return undefined;\n if (process.platform === 'win32') return undefined;\n try {\n const mode = statSync(path).mode & 0o777;\n if (mode & 0o077) {\n return `OpenCode auth file ${path} is readable by others (mode ${mode.toString(8)}). Consider chmod 600.`;\n }\n } catch {\n // ignore\n }\n return undefined;\n}\n\nexport function readOpencodeAuthFile(env: NodeJS.ProcessEnv = process.env): ReadOpencodeAuthResult | null {\n const path = resolveOpencodeAuthPath(env);\n if (!existsSync(path)) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'));\n } catch {\n return { path, entries: {}, permissionWarning: authFilePermissionWarning(path) };\n }\n\n const entries: Record<string, OpencodeAuthEntry> = {};\n if (parsed && typeof parsed === 'object') {\n for (const [providerId, value] of Object.entries(parsed as Record<string, unknown>)) {\n const entry = decodeAuthEntry(value);\n if (entry) entries[providerId] = entry;\n }\n }\n\n return {\n path,\n entries,\n permissionWarning: authFilePermissionWarning(path),\n };\n}\n\nexport function isOpencodeOAuth(entry: OpencodeAuthEntry | undefined): entry is OpencodeOAuthCredential {\n return !!entry && typeof entry === 'object' && entry.type === 'oauth';\n}\n\nexport function oauthCredentialToKeychainJson(cred: OpencodeOAuthCredential): string {\n return JSON.stringify(cred);\n}\n","// oauth/types.ts — stored OAuth credential shape (matches OpenCode auth.json)\n\nimport type { OpencodeOAuthCredential } from '../registry/opencode-auth.js';\n\nexport type StoredOAuthCredential = OpencodeOAuthCredential;\n\nexport interface OAuthTokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n id_token?: string;\n /** Non-secret provider metadata discovered during token exchange. */\n providerData?: Record<string, unknown>;\n}\n\nexport function tokensToStoredCredential(\n tokens: OAuthTokenResponse,\n existingRefresh?: string,\n accountId?: string,\n providerData?: Record<string, unknown>,\n): StoredOAuthCredential {\n const mergedProviderData = providerData || tokens.providerData\n ? { ...providerData, ...tokens.providerData }\n : undefined;\n return {\n type: 'oauth',\n access: tokens.access_token,\n refresh: tokens.refresh_token ?? existingRefresh ?? '',\n expires: Date.now() + (tokens.expires_in ?? 3600) * 1000,\n ...(accountId ? { accountId } : {}),\n ...(mergedProviderData ? { providerData: mergedProviderData } : {}),\n };\n}\n\nexport function parseStoredOAuthCredential(raw: string | null): StoredOAuthCredential | null {\n if (!raw?.trim().startsWith('{')) return null;\n try {\n const parsed = JSON.parse(raw) as StoredOAuthCredential;\n if (parsed.type === 'oauth'\n && typeof parsed.access === 'string'\n && typeof parsed.refresh === 'string'\n && typeof parsed.expires === 'number') {\n return parsed;\n }\n } catch {\n // ignore\n }\n return null;\n}\n\nexport const OAUTH_REFRESH_SKEW_MS = 120_000;\n\nexport function oauthCredentialNeedsRefresh(cred: StoredOAuthCredential, skewMs = OAUTH_REFRESH_SKEW_MS): boolean {\n return cred.expires <= Date.now() + Math.max(0, skewMs);\n}\n\n/** JWT exp claim — best-effort; opaque tokens return false (no proactive refresh). */\nexport function accessTokenIsExpiring(token: string | undefined, skewMs = OAUTH_REFRESH_SKEW_MS): boolean {\n if (!token) return false;\n const parts = token.split('.');\n if (parts.length < 2) return false;\n try {\n let payload = parts[1]!.replace(/-/g, '+').replace(/_/g, '/');\n while (payload.length % 4 !== 0) payload += '=';\n const claims = JSON.parse(Buffer.from(payload, 'base64').toString('utf8')) as { exp?: number };\n if (typeof claims.exp !== 'number') return false;\n return claims.exp * 1000 <= Date.now() + Math.max(0, skewMs);\n } catch {\n return false;\n }\n}\n\nexport const NATIVE_OAUTH_PROVIDER_IDS = ['xai', 'xai-oauth', 'openai', 'openai-oauth', 'github-copilot', 'claude-code', 'antigravity', 'cline-pass'] as const;\nexport type NativeOAuthProviderId = typeof NATIVE_OAUTH_PROVIDER_IDS[number];\n\nexport function supportsNativeOAuth(providerId: string): providerId is NativeOAuthProviderId {\n return (NATIVE_OAUTH_PROVIDER_IDS as readonly string[]).includes(providerId);\n}\n\n/** Providers that use Authorization Code + PKCE (browser redirect), not device code polling. */\nexport const BROWSER_REDIRECT_OAUTH_IDS = ['claude-code', 'antigravity'] as const;\nexport type BrowserRedirectOAuthId = typeof BROWSER_REDIRECT_OAUTH_IDS[number];\n\nexport function isBrowserRedirectOAuth(id: string): id is BrowserRedirectOAuthId {\n return (BROWSER_REDIRECT_OAUTH_IDS as readonly string[]).includes(id);\n}\n","// openai.ts — native OpenAI ChatGPT Plus/Pro OAuth (device code, ported from OpenCode)\n\nimport { positiveSecondsToMs, sleepMs } from './pkce.js';\nimport type { OAuthTokenResponse } from './types.js';\nimport { VERSION } from '../constants.js';\nimport { postOAuthRefresh } from './refresh-http.js';\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst ISSUER = 'https://auth.openai.com';\nconst OAUTH_POLLING_SAFETY_MARGIN_MS = 3_000;\nconst DEVICE_CODE_DEFAULT_EXPIRES_MS = 5 * 60 * 1000;\n\nexport interface OpenAiIdTokenClaims {\n chatgpt_account_id?: string;\n organizations?: Array<{ id: string }>;\n 'https://api.openai.com/auth'?: { chatgpt_account_id?: string };\n}\n\nexport interface OpenAiDeviceCodeData {\n device_auth_id: string;\n user_code: string;\n interval: string;\n expires_in?: number;\n}\n\nexport function extractOpenAiAccountId(tokens: OAuthTokenResponse): string | undefined {\n const token = tokens.id_token ?? tokens.access_token;\n if (!token) return undefined;\n const parts = token.split('.');\n if (parts.length !== 3) return undefined;\n try {\n const claims = JSON.parse(Buffer.from(parts[1]!, 'base64url').toString()) as OpenAiIdTokenClaims;\n return claims.chatgpt_account_id\n ?? claims['https://api.openai.com/auth']?.chatgpt_account_id\n ?? claims.organizations?.[0]?.id;\n } catch {\n return undefined;\n }\n}\n\nexport async function requestOpenAiDeviceCode(): Promise<OpenAiDeviceCodeData> {\n const response = await fetch(`${ISSUER}/api/accounts/deviceauth/usercode`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': `relay-ai/${VERSION}`,\n },\n body: JSON.stringify({ client_id: CLIENT_ID }),\n });\n if (!response.ok) {\n throw new Error('Failed to initiate OpenAI device authorization');\n }\n return response.json() as Promise<OpenAiDeviceCodeData>;\n}\n\nexport function openAiDeviceCodeUrl(): string {\n return `${ISSUER}/codex/device`;\n}\n\nexport async function pollOpenAiDeviceCodeToken(\n deviceData: OpenAiDeviceCodeData,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<{ tokens: OAuthTokenResponse; accountId?: string }> {\n const sleep = opts?.sleep ?? sleepMs;\n const now = opts?.now ?? (() => Date.now());\n const intervalMs = Math.max(parseInt(deviceData.interval, 10) || 5, 1) * 1000;\n const deadline = now() + positiveSecondsToMs(deviceData.expires_in, DEVICE_CODE_DEFAULT_EXPIRES_MS);\n\n while (now() < deadline) {\n const response = await fetch(`${ISSUER}/api/accounts/deviceauth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': `relay-ai/${VERSION}`,\n },\n body: JSON.stringify({\n device_auth_id: deviceData.device_auth_id,\n user_code: deviceData.user_code,\n }),\n });\n\n if (response.ok) {\n const data = await response.json() as { authorization_code: string; code_verifier: string };\n const tokenResponse = await fetch(`${ISSUER}/oauth/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n code: data.authorization_code,\n redirect_uri: `${ISSUER}/deviceauth/callback`,\n client_id: CLIENT_ID,\n code_verifier: data.code_verifier,\n }).toString(),\n });\n if (!tokenResponse.ok) {\n throw new Error(`OpenAI token exchange failed (${tokenResponse.status})`);\n }\n const tokens = await tokenResponse.json() as OAuthTokenResponse;\n return { tokens, accountId: extractOpenAiAccountId(tokens) };\n }\n\n if (response.status !== 403 && response.status !== 404) {\n throw new Error(`OpenAI device authorization failed (${response.status})`);\n }\n\n await sleep(Math.min(intervalMs + OAUTH_POLLING_SAFETY_MARGIN_MS, Math.max(0, deadline - now())));\n }\n throw new Error('OpenAI device authorization timed out');\n}\n\nexport async function refreshOpenAiAccessToken(refreshToken: string): Promise<OAuthTokenResponse> {\n return postOAuthRefresh(\n `${ISSUER}/oauth/token`,\n new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n }),\n {\n contentType: 'form',\n errorPrefix: 'OpenAI token refresh failed',\n includeStatus: true,\n },\n );\n}\n\nexport async function runOpenAiDeviceCodeFlow(\n onDeviceCode: (info: { url: string; userCode: string }) => void,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<{ tokens: OAuthTokenResponse; accountId?: string }> {\n const deviceData = await requestOpenAiDeviceCode();\n onDeviceCode({ url: openAiDeviceCodeUrl(), userCode: deviceData.user_code });\n return pollOpenAiDeviceCodeToken(deviceData, opts);\n}\n","// github.ts — native GitHub Copilot OAuth (RFC 8628 device code)\n// Uses the same public client ID as the VS Code Copilot extension.\n// Flow: device code → ghu_ access token → exchange for short-lived Copilot session token.\n// The ghu_ token is stored as the \"refresh token\" and re-exchanged when the Copilot token expires.\n\nimport { positiveSecondsToMs, sleepMs } from './pkce.js';\nimport type { OAuthTokenResponse } from './types.js';\nimport { VERSION } from '../constants.js';\n\n// Public OAuth App client ID used by VS Code GitHub Copilot extension\nconst CLIENT_ID = 'Iv1.b507a08c87ecfe98';\nconst DEVICE_CODE_URL = 'https://github.com/login/device/code';\nconst TOKEN_URL = 'https://github.com/login/oauth/access_token';\nconst COPILOT_TOKEN_URL = 'https://api.github.com/copilot_internal/v2/token';\nconst COPILOT_USER_URL = 'https://api.github.com/copilot_internal/user';\nconst SCOPE = 'copilot';\n\nconst DEVICE_CODE_DEFAULT_INTERVAL_MS = 5_000;\nconst DEVICE_CODE_DEFAULT_EXPIRES_MS = 15 * 60 * 1000; // 15 minutes\nconst OAUTH_POLLING_SAFETY_MARGIN_MS = 1_000;\nconst FREE_COPILOT_SKUS = new Set([\n 'free_limited_copilot',\n 'free_educational_quota',\n 'no_auth_limited_copilot',\n]);\n\nexport interface CopilotAccountSummary {\n login?: string;\n access_type_sku?: string;\n copilot_plan?: string;\n is_free_plan?: boolean;\n lookup_status: 'known' | 'unknown';\n}\n\nexport interface GithubDeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in?: number;\n interval?: number;\n}\n\nfunction commonHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': `relay-ai/${VERSION}`,\n };\n}\n\nexport function classifyCopilotAccount(user: Record<string, unknown>): CopilotAccountSummary {\n const login = typeof user['login'] === 'string' && user['login'].trim() ? user['login'].trim() : undefined;\n const sku = typeof user['access_type_sku'] === 'string' && user['access_type_sku'].trim()\n ? user['access_type_sku'].trim()\n : undefined;\n const plan = typeof user['copilot_plan'] === 'string' && user['copilot_plan'].trim()\n ? user['copilot_plan'].trim()\n : undefined;\n if (!sku && !plan) {\n return {\n ...(login ? { login } : {}),\n lookup_status: 'unknown',\n };\n }\n const isFree = FREE_COPILOT_SKUS.has(sku?.toLowerCase() ?? '') || plan?.toLowerCase() === 'free';\n return {\n ...(login ? { login } : {}),\n ...(sku ? { access_type_sku: sku } : {}),\n ...(plan ? { copilot_plan: plan } : {}),\n is_free_plan: isFree,\n lookup_status: 'known',\n };\n}\n\nexport async function fetchCopilotAccount(ghuToken: string): Promise<CopilotAccountSummary> {\n const response = await fetch(COPILOT_USER_URL, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${ghuToken}`,\n Accept: 'application/json',\n 'User-Agent': `relay-ai/${VERSION}`,\n 'Editor-Version': 'vscode/1.85.1',\n 'X-GitHub-Api-Version': '2025-04-01',\n },\n });\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(`GitHub Copilot account lookup failed (${response.status})${detail ? `: ${detail}` : ''}`);\n }\n const json = await response.json() as unknown;\n if (!json || typeof json !== 'object' || Array.isArray(json)) {\n throw new Error('GitHub Copilot account lookup returned invalid JSON');\n }\n return classifyCopilotAccount(json as Record<string, unknown>);\n}\n\nexport async function requestGithubDeviceCode(): Promise<GithubDeviceCodeResponse> {\n const response = await fetch(DEVICE_CODE_URL, {\n method: 'POST',\n headers: commonHeaders(),\n body: new URLSearchParams({ client_id: CLIENT_ID, scope: SCOPE }).toString(),\n });\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(`GitHub device code request failed (${response.status})${detail ? `: ${detail}` : ''}`);\n }\n const json = await response.json() as GithubDeviceCodeResponse;\n if (!json.device_code || !json.user_code || !json.verification_uri) {\n throw new Error('GitHub device code response is missing required fields');\n }\n return json;\n}\n\n/** Exchange a ghu_ GitHub OAuth user token for a short-lived Copilot session token. */\nexport async function exchangeForCopilotToken(ghuToken: string): Promise<OAuthTokenResponse> {\n const response = await fetch(COPILOT_TOKEN_URL, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${ghuToken}`,\n 'User-Agent': `relay-ai/${VERSION}`,\n Accept: 'application/json',\n },\n });\n if (!response.ok) {\n const msg = await response.text().catch(() => '');\n throw new Error(`GitHub Copilot token exchange failed (${response.status})${msg ? `: ${msg}` : ''}`);\n }\n const json = await response.json() as { token?: string; expires_at?: string };\n if (!json.token) {\n throw new Error('GitHub Copilot token exchange response missing token field — is Copilot subscription active?');\n }\n // expires_at is an ISO string; convert to expires_in seconds\n let expiresIn = 1800; // default 30 min\n if (json.expires_at) {\n const expiresMs = new Date(json.expires_at).getTime() - Date.now();\n if (expiresMs > 0) expiresIn = Math.floor(expiresMs / 1000);\n }\n let account: CopilotAccountSummary = { lookup_status: 'unknown' };\n try {\n account = await fetchCopilotAccount(ghuToken);\n } catch {\n // A plan lookup outage must not invalidate an otherwise usable session token.\n }\n return {\n access_token: json.token,\n expires_in: expiresIn,\n providerData: { copilot: account },\n };\n}\n\n/**\n * Refresh: the stored \"refresh token\" is actually the long-lived ghu_ OAuth token.\n * We just re-exchange it for a new short-lived Copilot session token.\n */\nexport async function refreshGithubCopilotToken(ghuToken: string): Promise<OAuthTokenResponse> {\n const copilot = await exchangeForCopilotToken(ghuToken);\n return {\n ...copilot,\n refresh_token: ghuToken, // keep the same ghu_ token as refresh\n };\n}\n\nexport async function pollGithubDeviceCodeToken(\n device: GithubDeviceCodeResponse,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<OAuthTokenResponse> {\n const sleep = opts?.sleep ?? sleepMs;\n const now = opts?.now ?? (() => Date.now());\n const deadline = now() + positiveSecondsToMs(device.expires_in, DEVICE_CODE_DEFAULT_EXPIRES_MS);\n let intervalMs = Math.max(\n positiveSecondsToMs(device.interval, DEVICE_CODE_DEFAULT_INTERVAL_MS),\n 1_000,\n );\n\n while (now() < deadline) {\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: commonHeaders(),\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n device_code: device.device_code,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }).toString(),\n });\n\n const body = await response.json().catch(() => ({}) as Record<string, unknown>) as Record<string, unknown>;\n const error = body['error'] as string | undefined;\n\n if (!error && body['access_token']) {\n const ghuToken = body['access_token'] as string;\n // Exchange ghu_ token for a Copilot session token\n const copilot = await exchangeForCopilotToken(ghuToken);\n return {\n access_token: copilot.access_token,\n refresh_token: ghuToken, // store ghu_ as refresh for re-exchange later\n expires_in: copilot.expires_in,\n providerData: copilot.providerData,\n };\n }\n\n if (error === 'authorization_pending') {\n await sleep(Math.min(intervalMs + OAUTH_POLLING_SAFETY_MARGIN_MS, Math.max(0, deadline - now())));\n continue;\n }\n if (error === 'slow_down') {\n intervalMs += 5_000;\n await sleep(Math.min(intervalMs + OAUTH_POLLING_SAFETY_MARGIN_MS, Math.max(0, deadline - now())));\n continue;\n }\n if (error === 'expired_token') {\n throw new Error('GitHub device code expired — please run relay-ai providers auth github-copilot again');\n }\n throw new Error(`GitHub device authorization failed${error ? `: ${error}` : ''}`);\n }\n throw new Error('GitHub device authorization timed out');\n}\n\nexport async function runGithubDeviceCodeFlow(\n onDeviceCode: (info: { url: string; userCode: string }) => void,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<OAuthTokenResponse> {\n const device = await requestGithubDeviceCode();\n onDeviceCode({ url: device.verification_uri, userCode: device.user_code });\n return pollGithubDeviceCodeToken(device, opts);\n}\n","// xai.ts — native xAI SuperGrok OAuth (RFC 8628 device code, ported from OpenCode)\n\nimport { positiveSecondsToMs, sleepMs } from './pkce.js';\nimport type { OAuthTokenResponse } from './types.js';\nimport { VERSION } from '../constants.js';\nimport { postOAuthRefresh } from './refresh-http.js';\n\nconst CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';\nconst TOKEN_URL = 'https://auth.x.ai/oauth2/token';\nconst DEVICE_AUTHORIZATION_URL = 'https://auth.x.ai/oauth2/device/code';\nconst DEVICE_CODE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';\nconst SCOPE = 'openid profile email offline_access grok-cli:access api:access';\n\nconst DEVICE_CODE_DEFAULT_INTERVAL_MS = 5_000;\nconst DEVICE_CODE_MIN_INTERVAL_MS = 1_000;\nconst DEVICE_CODE_SLOW_DOWN_INCREMENT_MS = 5_000;\nconst DEVICE_CODE_DEFAULT_EXPIRES_MS = 5 * 60 * 1000;\nconst OAUTH_POLLING_SAFETY_MARGIN_MS = 3_000;\n\nexport interface XaiDeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in?: number;\n interval?: number;\n}\n\nfunction authHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n 'User-Agent': `relay-ai/${VERSION}`,\n };\n}\n\nexport async function requestXaiDeviceCode(): Promise<XaiDeviceCodeResponse> {\n const response = await fetch(DEVICE_AUTHORIZATION_URL, {\n method: 'POST',\n headers: authHeaders(),\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n scope: SCOPE,\n }).toString(),\n });\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(`xAI device code request failed (${response.status})${detail ? `: ${detail}` : ''}`);\n }\n const json = await response.json() as XaiDeviceCodeResponse;\n if (!json.device_code || !json.user_code || !json.verification_uri) {\n throw new Error('xAI device code response is missing required fields');\n }\n return json;\n}\n\nexport async function pollXaiDeviceCodeToken(\n device: XaiDeviceCodeResponse,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<OAuthTokenResponse> {\n const sleep = opts?.sleep ?? sleepMs;\n const now = opts?.now ?? (() => Date.now());\n const deadline = now() + positiveSecondsToMs(device.expires_in, DEVICE_CODE_DEFAULT_EXPIRES_MS);\n let intervalMs = Math.max(\n positiveSecondsToMs(device.interval, DEVICE_CODE_DEFAULT_INTERVAL_MS),\n DEVICE_CODE_MIN_INTERVAL_MS,\n );\n\n while (now() < deadline) {\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: authHeaders(),\n body: new URLSearchParams({\n grant_type: DEVICE_CODE_GRANT_TYPE,\n client_id: CLIENT_ID,\n device_code: device.device_code,\n }).toString(),\n });\n if (response.ok) return response.json() as Promise<OAuthTokenResponse>;\n\n const body = await response.json().catch(() => ({})) as { error?: string };\n const remaining = Math.max(0, deadline - now());\n if (body.error === 'authorization_pending') {\n await sleep(Math.min(intervalMs + OAUTH_POLLING_SAFETY_MARGIN_MS, remaining));\n continue;\n }\n if (body.error === 'slow_down') {\n intervalMs += DEVICE_CODE_SLOW_DOWN_INCREMENT_MS;\n await sleep(Math.min(intervalMs + OAUTH_POLLING_SAFETY_MARGIN_MS, remaining));\n continue;\n }\n throw new Error(`xAI device authorization failed${body.error ? `: ${body.error}` : ''}`);\n }\n throw new Error('xAI device authorization timed out');\n}\n\nexport async function refreshXaiAccessToken(refreshToken: string): Promise<OAuthTokenResponse> {\n return postOAuthRefresh(\n TOKEN_URL,\n new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n }),\n {\n contentType: 'form',\n errorPrefix: 'xAI token refresh failed',\n includeStatus: true,\n includeBody: true,\n headers: authHeaders(),\n },\n );\n}\n\nexport async function runXaiDeviceCodeFlow(\n onDeviceCode: (info: { url: string; userCode: string }) => void,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<OAuthTokenResponse> {\n const device = await requestXaiDeviceCode();\n onDeviceCode({\n url: device.verification_uri_complete ?? device.verification_uri,\n userCode: device.user_code,\n });\n return pollXaiDeviceCodeToken(device, opts);\n}\n","// src/oauth/claude-code.ts — Authorization Code + PKCE flow for Claude Code OAuth.\n// Client ID is the public PKCE credential shipped in the Claude Code CLI binary.\n\nimport { randomBytes } from 'node:crypto';\nimport open from 'open';\nimport { generatePkce, generateOAuthState } from './pkce.js';\nimport type { OAuthTokenResponse } from './types.js';\nimport { postOAuthRefresh } from './refresh-http.js';\n\nexport const CLAUDE_CODE_CLIENT_ID =\n process.env.CLAUDE_OAUTH_CLIENT_ID ?? '9d1c250a-e61b-44d9-88ed-5944d1962f5e';\n\nconst AUTHORIZE_URL = 'https://claude.ai/oauth/authorize';\nconst TOKEN_URL = 'https://api.anthropic.com/v1/oauth/token';\nconst REDIRECT_URI =\n process.env.CLAUDE_CODE_REDIRECT_URI ?? 'https://platform.claude.com/oauth/code/callback';\nconst SCOPES =\n 'org:create_api_key user:profile user:inference user:sessions:claude_code user:mcp_servers';\n\n// Pinned to a captured claude-cli release — bump when Anthropic updates.\nexport const CLAUDE_CODE_CLI_VERSION = '2.1.195';\n\nexport interface ClaudeCodePkceParams {\n authUrl: string;\n codeVerifier: string;\n oauthState: string;\n redirectUri: string;\n}\n\nexport async function buildClaudeCodeAuthUrl(redirectUri = REDIRECT_URI): Promise<ClaudeCodePkceParams> {\n const { verifier, challenge } = await generatePkce();\n const state = generateOAuthState();\n const params = new URLSearchParams({\n code: 'true',\n client_id: CLAUDE_CODE_CLIENT_ID,\n response_type: 'code',\n redirect_uri: redirectUri,\n scope: SCOPES,\n code_challenge: challenge,\n code_challenge_method: 'S256',\n state,\n // Forces fresh auth — prevents session takeover that invalidates previous refresh tokens.\n prompt: 'login',\n });\n return { authUrl: `${AUTHORIZE_URL}?${params}`, codeVerifier: verifier, oauthState: state, redirectUri };\n}\n\nexport async function exchangeClaudeCodeToken(\n code: string,\n codeVerifier: string,\n redirectUri: string,\n state: string,\n): Promise<OAuthTokenResponse> {\n // Anthropic may return code as `authCode#stateValue` — split if needed.\n let authCode = extractClaudeAuthCode(code);\n let codeState = state;\n if (authCode.includes('#')) {\n const idx = authCode.indexOf('#');\n codeState = authCode.slice(idx + 1) || state;\n authCode = authCode.slice(0, idx);\n }\n\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({\n code: authCode,\n state: codeState,\n grant_type: 'authorization_code',\n client_id: CLAUDE_CODE_CLIENT_ID,\n redirect_uri: redirectUri,\n code_verifier: codeVerifier,\n }),\n });\n if (!res.ok) throw new Error(`Claude Code token exchange failed: ${await res.text()}`);\n return res.json() as Promise<OAuthTokenResponse>;\n}\n\nexport function extractClaudeAuthCode(input: string): string {\n const trimmed = input.trim();\n try {\n const parsed = new URL(trimmed);\n return parsed.searchParams.get('code') ?? trimmed;\n } catch {\n if (trimmed.startsWith('?') || trimmed.includes('code=')) {\n const query = trimmed.startsWith('?') ? trimmed.slice(1) : trimmed;\n return new URLSearchParams(query).get('code') ?? trimmed;\n }\n return trimmed;\n }\n}\n\nexport async function refreshClaudeCodeToken(refreshToken: string): Promise<OAuthTokenResponse> {\n return postOAuthRefresh(\n TOKEN_URL,\n {\n grant_type: 'refresh_token',\n client_id: CLAUDE_CODE_CLIENT_ID,\n refresh_token: refreshToken,\n },\n {\n contentType: 'json',\n errorPrefix: 'Claude Code token refresh failed',\n includeBody: true,\n },\n );\n}\n\nexport interface ClaudeBootstrapInfo {\n accountId?: string;\n email?: string;\n organizationId?: string;\n organizationName?: string;\n plan?: string;\n}\n\nexport async function fetchClaudeBootstrap(accessToken: string): Promise<ClaudeBootstrapInfo> {\n try {\n const res = await fetch('https://api.anthropic.com/api/claude_cli/bootstrap', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: 'application/json',\n 'User-Agent': `claude-cli/${CLAUDE_CODE_CLI_VERSION} (external, cli)`,\n 'anthropic-beta': 'oauth-2025-04-20',\n },\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) return {};\n const data = (await res.json()) as Record<string, unknown>;\n const acct = data.oauth_account as Record<string, unknown> | undefined;\n if (!acct) return {};\n return {\n accountId: typeof acct.account_uuid === 'string' ? acct.account_uuid : undefined,\n email: typeof acct.account_email === 'string' ? acct.account_email : undefined,\n organizationId: typeof acct.organization_uuid === 'string' ? acct.organization_uuid : undefined,\n organizationName: typeof acct.organization_name === 'string' ? acct.organization_name : undefined,\n plan: typeof acct.organization_rate_limit_tier === 'string' ? acct.organization_rate_limit_tier : undefined,\n };\n } catch {\n return {};\n }\n}\n\n/** Generate a new cliUserID — created once at provisioning and persisted in providerData. */\nexport function generateCliUserID(): string {\n return randomBytes(32).toString('hex');\n}\n\n/** Full CLI PKCE flow: opens browser, accepts Anthropic's returned code, exchanges it. */\nexport async function runClaudeCodeOAuthFlow(\n onAuthUrl: (url: string) => void,\n readAuthCode: () => Promise<string>,\n): Promise<{ tokens: OAuthTokenResponse; bootstrap: ClaudeBootstrapInfo }> {\n const { authUrl, codeVerifier, oauthState, redirectUri } = await buildClaudeCodeAuthUrl();\n onAuthUrl(authUrl);\n open(authUrl).catch(() => {});\n const code = (await readAuthCode()).trim();\n if (!code) throw new Error('No authorization code received from Anthropic');\n const tokens = await exchangeClaudeCodeToken(code, codeVerifier, redirectUri, oauthState);\n const bootstrap = await fetchClaudeBootstrap(tokens.access_token);\n return { tokens, bootstrap };\n}\n\nexport interface ClaudeCodeModelEntry {\n id: string;\n displayName: string;\n maxInputTokens?: number;\n maxTokens?: number;\n}\n\nexport async function fetchClaudeCodeModels(accessToken: string): Promise<ClaudeCodeModelEntry[]> {\n const res = await fetch('https://api.anthropic.com/v1/models', {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'anthropic-version': '2023-06-01',\n Accept: 'application/json',\n 'User-Agent': `claude-cli/${CLAUDE_CODE_CLI_VERSION} (external, cli)`,\n },\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) {\n throw new Error(`Claude Code model discovery failed (HTTP ${res.status}): ${await res.text().catch(() => '')}`);\n }\n const body = (await res.json()) as { data?: Array<Record<string, unknown>> };\n const entries = (body.data ?? [])\n .filter((m): m is Record<string, unknown> & { id: string } =>\n typeof m.id === 'string' && m.id.length > 0)\n .map(m => ({\n id: m.id as string,\n displayName: (typeof m.display_name === 'string' ? m.display_name : m.id) as string,\n maxInputTokens: typeof m.max_input_tokens === 'number' ? m.max_input_tokens : undefined,\n maxTokens: typeof m.max_tokens === 'number' ? m.max_tokens : undefined,\n }));\n if (entries.length === 0) {\n throw new Error('Claude Code model discovery returned no models');\n }\n return entries;\n}\n\n/** For the GUI: complete token exchange given code received via /oauth/callback. */\nexport async function completeClaudeCodeExchange(\n code: string,\n codeVerifier: string,\n oauthState: string,\n redirectUri: string,\n): Promise<{ tokens: OAuthTokenResponse; bootstrap: ClaudeBootstrapInfo }> {\n const tokens = await exchangeClaudeCodeToken(code, codeVerifier, redirectUri, oauthState);\n const bootstrap = await fetchClaudeBootstrap(tokens.access_token);\n return { tokens, bootstrap };\n}\n\n/** Redirect URI for the GUI callback (port extracted from Host header). */\nexport function guiCallbackRedirectUri(host: string): string {\n return `http://${host}/oauth/callback`;\n}\n","/** Shared ClinePass endpoint and runtime credential rules. */\n\nexport const CLINE_PASS_HOST = 'https://api.cline.bot';\nexport const CLINE_PASS_SDK_BASE_URL = `${CLINE_PASS_HOST}/api/v1`;\nexport const CLINE_PASS_CATALOG_URL = `${CLINE_PASS_HOST}/api/v1/ai/cline/recommended-models`;\n/** Authenticated, non-inference endpoint used to verify API-key credentials. */\nexport const CLINE_PASS_VALIDATION_URL = `${CLINE_PASS_HOST}/api/v1/users/me`;\nexport const CLINE_PASS_REGISTER_URL = `${CLINE_PASS_HOST}/api/v1/auth/register`;\nexport const CLINE_PASS_REFRESH_URL = `${CLINE_PASS_HOST}/api/v1/auth/refresh`;\n/** Value written by Relay 0.8.0 before ClinePass reported context metadata. */\nexport const CLINE_PASS_LEGACY_DEFAULT_CONTEXT_WINDOW = 131_072;\nexport const CLINE_PASS_WORKOS_PREFIX = 'workos:';\n\nexport function isClinePassOAuth(providerId?: string, authType?: string): boolean {\n return providerId === 'cline-pass' && authType === 'oauth';\n}\n\n/** Format only ClinePass OAuth access tokens; API keys remain raw. */\nexport function formatClineRuntimeCredential(\n providerId: string | undefined,\n authType: 'api' | 'oauth' | 'none' | undefined,\n key: string,\n): string {\n if (!isClinePassOAuth(providerId, authType)) return key;\n return key.toLowerCase().startsWith(CLINE_PASS_WORKOS_PREFIX)\n ? key\n : `${CLINE_PASS_WORKOS_PREFIX}${key}`;\n}\n\n/**\n * Wrap the SDK fetch used by ClinePass OAuth routes.\n *\n * WorkOS access tokens are stored without the runtime marker. ClinePass\n * requires `workos:` on the wire, and an expired token gets one retry after\n * the caller refreshes it. The request is cloned so a POST body can safely be\n * sent a second time, and the wrapper never retries more than once.\n */\nexport function createClinePassOAuthFetch(\n initialRuntimeCredential: string,\n refreshToken: () => Promise<string | null>,\n onTokenRefreshed?: (rawToken: string) => void,\n fetchImpl: typeof globalThis.fetch = globalThis.fetch,\n): typeof globalThis.fetch {\n let currentRuntimeCredential = initialRuntimeCredential;\n\n return async (input, init) => {\n const request = new Request(input, init);\n const send = (runtimeCredential: string) => {\n const headers = new Headers(request.headers);\n headers.set('Authorization', `Bearer ${runtimeCredential}`);\n return fetchImpl(request.clone(), { headers });\n };\n\n const response = await send(currentRuntimeCredential);\n if (response.status !== 401) return response;\n\n const refreshedRawToken = await refreshToken().catch(() => null);\n const refreshedRuntimeCredential = refreshedRawToken\n ? formatClineRuntimeCredential('cline-pass', 'oauth', refreshedRawToken)\n : null;\n if (!refreshedRawToken || !refreshedRuntimeCredential || refreshedRuntimeCredential === currentRuntimeCredential) {\n return response;\n }\n\n currentRuntimeCredential = refreshedRuntimeCredential;\n onTokenRefreshed?.(refreshedRawToken);\n return send(currentRuntimeCredential);\n };\n}\n","import { CLINE_PASS_REFRESH_URL, CLINE_PASS_REGISTER_URL } from '../cline-pass.js';\nimport { positiveSecondsToMs, sleepMs } from './pkce.js';\nimport type { OAuthTokenResponse } from './types.js';\n\nconst WORKOS_CLIENT_ID = 'client_01K3A541FN8TA3EPPHTD2325AR';\nconst WORKOS_DEVICE_URL = 'https://api.workos.com/user_management/authorize/device';\nconst WORKOS_TOKEN_URL = 'https://api.workos.com/user_management/authenticate';\nconst DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst SLOW_DOWN_INCREMENT_MS = 1_000;\nconst DEFAULT_EXPIRES_MS = 10 * 60 * 1000;\n\nexport interface ClinePassDeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in?: number;\n interval?: number;\n}\n\nexport interface ClinePassOAuthResult {\n tokens: OAuthTokenResponse;\n accountId?: string;\n providerData?: Record<string, unknown>;\n}\n\ninterface ClineAuthData {\n accessToken?: unknown;\n refreshToken?: unknown;\n expiresAt?: unknown;\n userInfo?: unknown;\n}\n\nfunction formHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n}\n\nfunction jsonHeaders(): Record<string, string> {\n return {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n };\n}\n\nfunction expiresInFromIso(expiresAt: unknown): number {\n if (typeof expiresAt !== 'string') throw new Error('ClinePass response is missing a valid expiresAt');\n const timestamp = Date.parse(expiresAt);\n if (!Number.isFinite(timestamp)) throw new Error('ClinePass response is missing a valid expiresAt');\n return Math.max(1, Math.floor((timestamp - Date.now()) / 1000));\n}\n\nfunction toOAuthResult(data: ClineAuthData): ClinePassOAuthResult {\n if (typeof data.accessToken !== 'string' || !data.accessToken) {\n throw new Error('ClinePass response is missing accessToken');\n }\n const userInfo = data.userInfo && typeof data.userInfo === 'object' && !Array.isArray(data.userInfo)\n ? data.userInfo as Record<string, unknown>\n : undefined;\n const accountId = typeof userInfo?.clineUserId === 'string' ? userInfo.clineUserId : undefined;\n return {\n tokens: {\n access_token: data.accessToken,\n ...(typeof data.refreshToken === 'string' ? { refresh_token: data.refreshToken } : {}),\n expires_in: expiresInFromIso(data.expiresAt),\n ...(userInfo ? { providerData: userInfo } : {}),\n },\n ...(accountId ? { accountId } : {}),\n ...(userInfo ? { providerData: userInfo } : {}),\n };\n}\n\nasync function readError(response: Response): Promise<string> {\n const text = await response.text().catch(() => '');\n if (!text) return `HTTP ${response.status}`;\n try {\n const parsed = JSON.parse(text) as { error?: unknown; message?: unknown };\n const detail = typeof parsed.error === 'string' ? parsed.error : typeof parsed.message === 'string' ? parsed.message : '';\n return detail || `HTTP ${response.status}`;\n } catch {\n return text.slice(0, 120);\n }\n}\n\nexport async function requestClinePassDeviceCode(): Promise<ClinePassDeviceCodeResponse> {\n const response = await fetch(WORKOS_DEVICE_URL, {\n method: 'POST',\n headers: formHeaders(),\n body: new URLSearchParams({ client_id: WORKOS_CLIENT_ID }).toString(),\n });\n if (!response.ok) throw new Error(`ClinePass device code request failed (${response.status})`);\n const json = await response.json() as ClinePassDeviceCodeResponse;\n if (!json.device_code || !json.user_code || !json.verification_uri) {\n throw new Error('ClinePass device code response is missing required fields');\n }\n return json;\n}\n\nexport async function registerClinePassTokens(\n accessToken: string,\n refreshToken: string,\n): Promise<ClinePassOAuthResult> {\n const response = await fetch(CLINE_PASS_REGISTER_URL, {\n method: 'POST',\n headers: jsonHeaders(),\n body: JSON.stringify({ accessToken, refreshToken }),\n });\n if (!response.ok) throw new Error(`ClinePass registration failed (${response.status})`);\n const body = await response.json() as { success?: unknown; data?: ClineAuthData; error?: unknown; message?: unknown };\n if (body.success !== true || !body.data) {\n const detail = typeof body.error === 'string' ? body.error : typeof body.message === 'string' ? body.message : 'unsuccessful response';\n throw new Error(`ClinePass registration failed: ${detail}`);\n }\n return toOAuthResult(body.data);\n}\n\nexport async function pollClinePassDeviceCode(\n device: ClinePassDeviceCodeResponse,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<ClinePassOAuthResult> {\n const sleep = opts?.sleep ?? sleepMs;\n const now = opts?.now ?? (() => Date.now());\n const deadline = now() + positiveSecondsToMs(device.expires_in, DEFAULT_EXPIRES_MS);\n let intervalMs = Math.max(positiveSecondsToMs(device.interval, DEFAULT_INTERVAL_MS), 1_000);\n\n while (now() < deadline) {\n const response = await fetch(WORKOS_TOKEN_URL, {\n method: 'POST',\n headers: formHeaders(),\n body: new URLSearchParams({\n grant_type: DEVICE_GRANT_TYPE,\n client_id: WORKOS_CLIENT_ID,\n device_code: device.device_code,\n }).toString(),\n });\n if (response.ok) {\n const workos = await response.json() as { access_token?: string; refresh_token?: string };\n if (!workos.access_token || !workos.refresh_token) {\n throw new Error('ClinePass WorkOS response is missing required tokens');\n }\n return registerClinePassTokens(workos.access_token, workos.refresh_token);\n }\n\n const body = await response.json().catch(() => ({})) as { error?: string };\n const remaining = Math.max(0, deadline - now());\n if (body.error === 'authorization_pending') {\n await sleep(Math.min(intervalMs, remaining));\n continue;\n }\n if (body.error === 'slow_down') {\n intervalMs += SLOW_DOWN_INCREMENT_MS;\n await sleep(Math.min(intervalMs, remaining));\n continue;\n }\n throw new Error(`ClinePass device authorization failed${body.error ? `: ${body.error}` : ''}`);\n }\n throw new Error('ClinePass device authorization timed out');\n}\n\nexport async function runClinePassDeviceCodeFlow(\n onDeviceCode: (info: { url: string; userCode: string }) => void,\n opts?: { sleep?: (ms: number) => Promise<void>; now?: () => number },\n): Promise<ClinePassOAuthResult> {\n const device = await requestClinePassDeviceCode();\n onDeviceCode({\n url: device.verification_uri_complete ?? device.verification_uri,\n userCode: device.user_code,\n });\n return pollClinePassDeviceCode(device, opts);\n}\n\nexport async function refreshClinePassAccessToken(refreshToken: string): Promise<OAuthTokenResponse> {\n const response = await fetch(CLINE_PASS_REFRESH_URL, {\n method: 'POST',\n headers: jsonHeaders(),\n body: JSON.stringify({ refreshToken, grantType: 'refresh_token' }),\n });\n if (!response.ok) {\n const detail = await readError(response);\n throw new Error(`ClinePass token refresh failed (${response.status}): ${detail}`);\n }\n const body = await response.json() as { success?: unknown; data?: ClineAuthData; error?: unknown; message?: unknown };\n if (body.success !== true || !body.data) {\n const detail = typeof body.error === 'string' ? body.error : typeof body.message === 'string' ? body.message : 'unsuccessful response';\n throw new Error(`ClinePass token refresh failed: ${detail}`);\n }\n return toOAuthResult(body.data).tokens;\n}\n","// oauth/refresh.ts — refresh OAuth tokens before inference\n\nimport { refreshOpenAiAccessToken } from './openai.js';\nimport { refreshGithubCopilotToken } from './github.js';\nimport type { StoredOAuthCredential } from './types.js';\nimport { accessTokenIsExpiring, NATIVE_OAUTH_PROVIDER_IDS, oauthCredentialNeedsRefresh, tokensToStoredCredential } from './types.js';\nimport { refreshXaiAccessToken } from './xai.js';\nimport { refreshClaudeCodeToken } from './claude-code.js';\nimport { refreshAntigravityToken } from './antigravity-oauth.js';\nimport { refreshClinePassAccessToken } from './cline-pass.js';\n\nexport function oauthCredentialShouldRefresh(\n cred: StoredOAuthCredential,\n providerId: string,\n): boolean {\n if (oauthCredentialNeedsRefresh(cred)) return true;\n // All native OAuth providers use short-lived access tokens — check expiry proactively\n if ((NATIVE_OAUTH_PROVIDER_IDS as readonly string[]).includes(providerId) && accessTokenIsExpiring(cred.access)) return true;\n return false;\n}\n\nexport async function refreshStoredOAuthCredential(\n providerId: string,\n cred: StoredOAuthCredential,\n): Promise<StoredOAuthCredential> {\n if (!cred.refresh) {\n throw new Error(`${providerId}: OAuth refresh token missing — run relay-ai providers auth ${providerId}`);\n }\n\n let tokens;\n if (providerId === 'openai' || providerId === 'openai-oauth') {\n tokens = await refreshOpenAiAccessToken(cred.refresh);\n } else if (providerId === 'xai' || providerId === 'xai-oauth') {\n tokens = await refreshXaiAccessToken(cred.refresh);\n } else if (providerId === 'github-copilot') {\n // cred.refresh is the long-lived ghu_ token; re-exchange for a new Copilot session token\n tokens = await refreshGithubCopilotToken(cred.refresh);\n } else if (providerId === 'claude-code') {\n tokens = await refreshClaudeCodeToken(cred.refresh);\n } else if (providerId === 'antigravity') {\n tokens = await refreshAntigravityToken(cred.refresh);\n } else if (providerId === 'cline-pass') {\n tokens = await refreshClinePassAccessToken(cred.refresh);\n } else {\n throw new Error(`OAuth refresh not implemented for provider \"${providerId}\"`);\n }\n\n const accountId = providerId === 'cline-pass' && typeof tokens.providerData?.clineUserId === 'string'\n ? tokens.providerData.clineUserId\n : cred.accountId;\n return tokensToStoredCredential(tokens, cred.refresh, accountId, cred.providerData);\n}\n","// src/secrets-file.ts — file-backed credential store when OS keyring is unavailable.\n// Prefer keyring; this is the RELAY_AI_HOME fallback (Docker / headless).\n\nimport { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { getAppHome, getSecretsPath } from './paths.js';\n\nconst DIR_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\nexport interface SecretsFile {\n version: 1;\n accounts: Record<string, string>;\n}\n\nfunction emptySecrets(): SecretsFile {\n return { version: 1, accounts: {} };\n}\n\nexport function readSecretsFile(env: NodeJS.ProcessEnv = process.env): SecretsFile {\n const path = getSecretsPath(env);\n if (!existsSync(path)) return emptySecrets();\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as Partial<SecretsFile>;\n if (raw?.version !== 1 || !raw.accounts || typeof raw.accounts !== 'object') {\n return emptySecrets();\n }\n const accounts: Record<string, string> = {};\n for (const [k, v] of Object.entries(raw.accounts)) {\n if (typeof v === 'string' && v.length > 0) accounts[k] = v;\n }\n return { version: 1, accounts };\n } catch {\n return emptySecrets();\n }\n}\n\nfunction writeSecretsFile(data: SecretsFile, env: NodeJS.ProcessEnv = process.env): void {\n const home = getAppHome(env);\n mkdirSync(home, { recursive: true, mode: DIR_MODE });\n try {\n chmodSync(home, DIR_MODE);\n } catch {\n // best-effort\n }\n const path = getSecretsPath(env);\n writeFileSync(path, `${JSON.stringify(data, null, 2)}\\n`, { encoding: 'utf8', mode: FILE_MODE });\n try {\n chmodSync(path, FILE_MODE);\n } catch {\n // best-effort (mode on create is ignored if the file already existed)\n }\n}\n\nexport function readFileAccount(account: string, env: NodeJS.ProcessEnv = process.env): string | null {\n const value = readSecretsFile(env).accounts[account];\n return value?.length ? value : null;\n}\n\nexport function writeFileAccount(\n account: string,\n value: string,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n if (!account || !value) return false;\n try {\n const data = readSecretsFile(env);\n data.accounts[account] = value;\n writeSecretsFile(data, env);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function deleteFileAccount(account: string, env: NodeJS.ProcessEnv = process.env): boolean {\n try {\n const data = readSecretsFile(env);\n if (!(account in data.accounts)) return true;\n delete data.accounts[account];\n writeSecretsFile(data, env);\n return true;\n } catch {\n return false;\n }\n}\n","// src/env.ts\nimport { CONFLICTING_ENV_VARS, PARENT_SESSION_ENV_VARS } from './constants.js';\nimport { claudeCodeClientModelId, stripOneMContextSuffix } from './context-model-id.js';\nimport { resolveContextWindow } from './context-window.js';\nimport { oauthCredentialToKeychainJson } from './registry/opencode-auth.js';\nimport {\n parseStoredOAuthCredential,\n} from './oauth/types.js';\nimport { refreshStoredOAuthCredential, oauthCredentialShouldRefresh } from './oauth/refresh.js';\nimport { fetchCopilotAccount } from './oauth/github.js';\nimport {\n deleteFileAccount,\n readFileAccount,\n writeFileAccount,\n} from './secrets-file.js';\nimport type { ConflictInfo } from './types.js';\n\nexport function detectConflicts(): ConflictInfo[] {\n return CONFLICTING_ENV_VARS\n .filter(name => process.env[name] !== undefined)\n .map(name => ({ name, value: process.env[name]! }));\n}\n\nexport function resolveApiKey(): string | null {\n const key = process.env['OPENCODE_API_KEY'];\n // Treat empty string as missing — happens when .zshrc auto-load line runs\n // but the Keychain entry has been deleted (security command returns nothing)\n if (!key?.trim()) return null;\n // First line only — users sometimes paste notes below the key in shell profiles\n return key.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n\n/** Restore first-party-like Claude Code behavior when routing through a proxy or gateway. */\nexport function applyClaudeCodeThirdPartyCompat(env: NodeJS.ProcessEnv): void {\n // Custom ANTHROPIC_BASE_URL disables MCP tool search by default, loading every\n // MCP tool (100+) on every turn. Requires defer_loading on tools — do not set\n // CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS when using the local translation proxy.\n env['ENABLE_TOOL_SEARCH'] = 'true';\n // Third-party routes may enable a shorter system prompt that drops conversational\n // guardrails while hooks/plugins still inject agentic instructions.\n env['CLAUDE_CODE_SIMPLE_SYSTEM_PROMPT'] = '0';\n}\n\nexport function buildChildEnv(\n baseUrl: string,\n model: string,\n apiKey: string,\n proxyPort?: number,\n contextWindow?: number,\n enableGatewayDiscovery?: boolean,\n): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = { ...process.env };\n for (const name of CONFLICTING_ENV_VARS) {\n delete env[name];\n }\n for (const name of PARENT_SESSION_ENV_VARS) {\n delete env[name];\n }\n env['ANTHROPIC_BASE_URL'] = proxyPort\n ? `http://127.0.0.1:${proxyPort}`\n : baseUrl;\n env['ANTHROPIC_API_KEY'] = apiKey;\n const bareModel = stripOneMContextSuffix(model);\n env['ANTHROPIC_MODEL'] = claudeCodeClientModelId(model, contextWindow);\n // Keep an explicit context budget for single-model proxy sessions. With\n // gateway discovery enabled, Claude Code can recalculate the window when the\n // user switches models, including between native and Relay 1M models.\n if (!enableGatewayDiscovery) {\n env['CLAUDE_CODE_MAX_CONTEXT_TOKENS'] = String(resolveContextWindow(bareModel, contextWindow));\n }\n if (enableGatewayDiscovery) {\n delete env['CLAUDE_CODE_MAX_CONTEXT_TOKENS'];\n env['CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY'] = '1';\n }\n applyClaudeCodeThirdPartyCompat(env);\n return env;\n}\n\n/** Child env for Antigravity — only CLOUD_CODE_URL, no Anthropic proxy vars. */\nexport function buildAntigravityChildEnv(gatewayUrl: string): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = { ...process.env };\n for (const name of CONFLICTING_ENV_VARS) {\n delete env[name];\n }\n env['CLOUD_CODE_URL'] = gatewayUrl;\n\n // Inject dummy API keys to bypass agy's slow keychain lookup (~500ms).\n // This prevents the race condition where loadCodeAssist fails and falls back\n // to the hardcoded, unsupported FLASH_LITE model.\n // The local Cloud Code Gateway ignores these keys, so any dummy value works.\n env['ANTIGRAVITY_API_KEY'] = 'relay-dummy-key';\n env['GEMINI_API_KEY'] = 'relay-dummy-key';\n env['GOOGLE_API_KEY'] = 'relay-dummy-key';\n env['GOOGLE_GEMINI_API_KEY'] = 'relay-dummy-key';\n\n return env;\n}\n\n/** Classify a keyring error into a human-readable reason (never throws). */\nexport function classifyKeyringError(err: unknown): string {\n const msg = err instanceof Error ? err.message : String(err);\n const lower = msg.toLowerCase();\n if (lower.includes('cannot find module') || lower.includes('module not found') || lower.includes('failed to load')) {\n return 'native keyring module not available on this system';\n }\n if (lower.includes('secret service') || lower.includes('dbus') || lower.includes('daemon')) {\n return 'Secret Service daemon is not running (start GNOME Keyring or KWallet)';\n }\n if (lower.includes('denied') || lower.includes('locked') || lower.includes('cancelled') || lower.includes('user refused')) {\n return 'keychain access was denied or the keychain is locked';\n }\n return `keyring error: ${msg}`;\n}\n\nconst KEYRING_SERVICE = 'relay-ai';\n/** @deprecated Use GLOBAL_OPENCODE_KEYRING_ACCOUNT — kept for migration reads */\nconst KEYRING_ACCOUNT = 'relay-ai';\n// Windows Credential Manager caps a single credential blob at 2560 bytes (CredWriteW).\n// keyring-rs encodes the password as UTF-16 (2 bytes/char) before that check, so the\n// usable limit is 2560 / 2 = 1280 chars — long OAuth tokens (e.g. OpenAI's JWTs) exceed\n// this, so secrets above the threshold are split across multiple keyring entries.\n// Harmless on macOS/Linux, which have no such limit.\nconst KEYRING_CHUNK_PREFIX = '__relay_chunked__:';\nconst KEYRING_CHUNK_SIZE = 1200;\nconst LEGACY_KEYRING_SERVICE = 'opencode-starter';\nconst LEGACY_KEYRING_ACCOUNT = 'opencode-starter';\n\nexport const GLOBAL_OPENCODE_KEYRING_ACCOUNT = 'global:opencode';\n\nexport function providerKeyringAccount(providerId: string): string {\n return `provider:${providerId}`;\n}\n\n/** Auth-ref used for a user-managed Relay override of the shared OpenCode catalog key. */\nexport function preferredRelayCredentialAuthRef(providerId: string, fallbackAuthRef: string): string {\n return providerId === 'go' || providerId === 'zen'\n ? `keyring:${providerKeyringAccount('opencode')}`\n : fallbackAuthRef;\n}\n\nexport function oauthProviderKeyringAccount(providerId: string): string {\n return `oauth:provider:${providerId}`;\n}\n\nfunction oauthProviderIdFromAccount(account: string): string | null {\n const prefix = 'oauth:provider:';\n return account.startsWith(prefix) ? account.slice(prefix.length) : null;\n}\n\nconst oauthRefreshInflight = new Map<string, Promise<string | null>>();\n\nexport type ParsedAuthRef =\n | { kind: 'keyring'; account: string }\n | { kind: 'env'; varName: string };\n\n/** Parse registry authRef strings like `keyring:provider:groq` or `env:OPENCODE_API_KEY`. */\nexport function parseAuthRef(authRef: string): ParsedAuthRef | null {\n if (authRef.startsWith('keyring:')) {\n const account = authRef.slice('keyring:'.length);\n return account ? { kind: 'keyring', account } : null;\n }\n if (authRef.startsWith('env:')) {\n const varName = authRef.slice('env:'.length);\n return varName ? { kind: 'env', varName } : null;\n }\n return null;\n}\n\n/** Env var name for relay-ai namespaced per-provider keys. */\nexport function relayAiKeyEnvVar(providerId: string): string {\n return `RELAY_AI_KEY_${providerId.toUpperCase().replace(/[^A-Z0-9]/g, '_')}`;\n}\n\nfunction readEnvCredential(varName: string): string | null {\n const raw = process.env[varName];\n if (!raw?.trim()) return null;\n return raw.trim().split(/\\r?\\n/)[0]?.trim() || null;\n}\n\nasync function readOsKeyringAccount(account: string, diag?: (msg: string) => void): Promise<string | null> {\n try {\n const { Entry } = await import('@napi-rs/keyring');\n const value = new Entry(KEYRING_SERVICE, account).getPassword() ?? null;\n if (!value?.startsWith(KEYRING_CHUNK_PREFIX)) return value;\n const chunkCount = Number(value.slice(KEYRING_CHUNK_PREFIX.length));\n let combined = '';\n for (let i = 0; i < chunkCount; i++) {\n combined += new Entry(KEYRING_SERVICE, `${account}::chunk::${i}`).getPassword() ?? '';\n }\n return combined;\n } catch (err) {\n diag?.(classifyKeyringError(err));\n return null;\n }\n}\n\nasync function writeOsKeyringAccount(\n account: string,\n key: string,\n diag?: (msg: string) => void,\n): Promise<boolean> {\n try {\n const { Entry } = await import('@napi-rs/keyring');\n if (key.length <= KEYRING_CHUNK_SIZE) {\n new Entry(KEYRING_SERVICE, account).setPassword(key);\n return true;\n }\n const chunkCount = Math.ceil(key.length / KEYRING_CHUNK_SIZE);\n for (let i = 0; i < chunkCount; i++) {\n const chunk = key.slice(i * KEYRING_CHUNK_SIZE, (i + 1) * KEYRING_CHUNK_SIZE);\n new Entry(KEYRING_SERVICE, `${account}::chunk::${i}`).setPassword(chunk);\n }\n new Entry(KEYRING_SERVICE, account).setPassword(`${KEYRING_CHUNK_PREFIX}${chunkCount}`);\n return true;\n } catch (err) {\n diag?.(classifyKeyringError(err));\n return false;\n }\n}\n\nasync function deleteOsKeyringAccount(account: string, diag?: (msg: string) => void): Promise<boolean> {\n try {\n const { Entry } = await import('@napi-rs/keyring');\n const value = new Entry(KEYRING_SERVICE, account).getPassword();\n if (value?.startsWith(KEYRING_CHUNK_PREFIX)) {\n const chunkCount = Number(value.slice(KEYRING_CHUNK_PREFIX.length));\n for (let i = 0; i < chunkCount; i++) {\n new Entry(KEYRING_SERVICE, `${account}::chunk::${i}`).deletePassword();\n }\n }\n new Entry(KEYRING_SERVICE, account).deletePassword();\n return true;\n } catch (err) {\n diag?.(classifyKeyringError(err));\n return false;\n }\n}\n\n/** OS keyring first, then ~/.relay-ai/secrets.json (Docker / headless). */\nasync function readKeyringAccount(account: string, diag?: (msg: string) => void): Promise<string | null> {\n const fromOs = await readOsKeyringAccount(account, diag);\n if (fromOs) return fromOs;\n return readFileAccount(account);\n}\n\n/** Prefer OS keyring; fall back to secrets.json when keyring is unavailable. */\nasync function writeKeyringAccount(\n account: string,\n key: string,\n diag?: (msg: string) => void,\n): Promise<boolean> {\n if (await writeOsKeyringAccount(account, key, diag)) {\n deleteFileAccount(account);\n return true;\n }\n if (writeFileAccount(account, key)) {\n diag?.('OS keyring unavailable — saved to secrets.json under RELAY_AI_HOME');\n return true;\n }\n return false;\n}\n\nasync function deleteKeyringAccount(account: string, diag?: (msg: string) => void): Promise<boolean> {\n const osOk = await deleteOsKeyringAccount(account, diag);\n const fileOk = deleteFileAccount(account);\n return osOk || fileOk;\n}\n\n/** Read Zen/Go API key: env → global:opencode → legacy relay-ai → opencode-starter. */\nexport async function readGlobalOpencodeCredential(diag?: (msg: string) => void): Promise<string | null> {\n const fromEnv = resolveApiKey();\n if (fromEnv) return fromEnv;\n\n const global = await readKeyringAccount(GLOBAL_OPENCODE_KEYRING_ACCOUNT, diag);\n if (global) return global;\n\n const current = await readKeyringAccount(KEYRING_ACCOUNT, diag);\n if (current) return current;\n\n try {\n const { Entry } = await import('@napi-rs/keyring');\n return new Entry(LEGACY_KEYRING_SERVICE, LEGACY_KEYRING_ACCOUNT).getPassword() ?? null;\n } catch (err) {\n diag?.(classifyKeyringError(err));\n return null;\n }\n}\n\n/** Read a stored credential without environment-variable precedence. */\nexport async function readStoredProviderCredential(\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<string | null> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring') return null;\n return readProviderSecret(parsed.account, diag);\n}\n\n/**\n * Migrate legacy keychain entries to `global:opencode`.\n * Protocol: read → write → verify → delete old (only after verify succeeds).\n */\nexport async function migrateGlobalOpencodeCredential(diag?: (msg: string) => void): Promise<boolean> {\n const existing = await readKeyringAccount(GLOBAL_OPENCODE_KEYRING_ACCOUNT, diag);\n if (existing) return true;\n\n const legacy =\n (await readKeyringAccount(KEYRING_ACCOUNT, diag)) ??\n (await (async () => {\n try {\n const { Entry } = await import('@napi-rs/keyring');\n return new Entry(LEGACY_KEYRING_SERVICE, LEGACY_KEYRING_ACCOUNT).getPassword() ?? null;\n } catch (err) {\n diag?.(classifyKeyringError(err));\n return null;\n }\n })());\n\n if (!legacy) return false;\n\n const wrote = await writeKeyringAccount(GLOBAL_OPENCODE_KEYRING_ACCOUNT, legacy, diag);\n if (!wrote) return false;\n\n const verified = await readKeyringAccount(GLOBAL_OPENCODE_KEYRING_ACCOUNT, diag);\n if (verified !== legacy) {\n diag?.('credential migration verification failed — keeping legacy keychain entries');\n return false;\n }\n\n if (await readKeyringAccount(KEYRING_ACCOUNT, diag)) {\n await deleteKeyringAccount(KEYRING_ACCOUNT, diag);\n }\n try {\n const { Entry } = await import('@napi-rs/keyring');\n if (new Entry(LEGACY_KEYRING_SERVICE, LEGACY_KEYRING_ACCOUNT).getPassword()) {\n new Entry(LEGACY_KEYRING_SERVICE, LEGACY_KEYRING_ACCOUNT).deletePassword();\n }\n } catch {\n // best-effort legacy cleanup\n }\n return true;\n}\n\n/** Resolve a provider secret from authRef (env → keyring). */\nexport async function resolveProviderCredential(\n providerId: string,\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<string | null> {\n const parsed = parseAuthRef(authRef);\n if (!parsed) return null;\n\n // A key explicitly saved in Relay for the shared OpenCode catalog is a deliberate\n // override. It must win over OPENCODE_API_KEY, RELAY_AI_KEY_GO/ ZEN, and OpenCode's\n // own global key so a user can actually replace a stale credential.\n if (parsed.kind === 'keyring' && parsed.account === GLOBAL_OPENCODE_KEYRING_ACCOUNT) {\n const relayOverride = await readProviderSecret(providerKeyringAccount('opencode'), diag);\n if (relayOverride) return relayOverride;\n }\n\n const namespaced = readEnvCredential(relayAiKeyEnvVar(providerId));\n if (namespaced) return namespaced;\n\n if (parsed.kind === 'env') {\n return readEnvCredential(parsed.varName);\n }\n\n if (parsed.account === GLOBAL_OPENCODE_KEYRING_ACCOUNT) {\n return readGlobalOpencodeCredential(diag);\n }\n\n return readProviderSecret(parsed.account, diag);\n}\n\n/**\n * Force-refresh a stored OAuth credential after an upstream 401.\n * Normal resolution refreshes only when expiry metadata says it is needed;\n * providers can revoke a token early, so the retry path must bypass that gate.\n */\nexport async function forceRefreshProviderCredential(\n providerId: string,\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<string | null> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring') {\n return resolveProviderCredential(providerId, authRef, diag);\n }\n\n if (parsed.account === GLOBAL_OPENCODE_KEYRING_ACCOUNT) {\n const relayOverride = await readProviderSecret(providerKeyringAccount('opencode'), diag);\n if (relayOverride) return relayOverride;\n }\n\n const namespaced = readEnvCredential(relayAiKeyEnvVar(providerId));\n if (namespaced) return namespaced;\n\n const oauthProviderId = oauthProviderIdFromAccount(parsed.account);\n const raw = await readKeyringAccount(parsed.account, diag);\n if (!raw || !oauthProviderId) return decodeProviderSecret(raw);\n return refreshOAuthKeyringAccount(parsed.account, oauthProviderId, raw, diag, true);\n}\n\n/** Read OAuth metadata retained alongside the access token. */\nexport async function resolveProviderOAuthAccountId(\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<string | undefined> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring' || !oauthProviderIdFromAccount(parsed.account)) return undefined;\n const raw = await readKeyringAccount(parsed.account, diag);\n return parseStoredOAuthCredential(raw)?.accountId;\n}\n\nexport async function resolveProviderOAuthProviderData(\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<Record<string, unknown> | undefined> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring' || !oauthProviderIdFromAccount(parsed.account)) return undefined;\n const raw = await readKeyringAccount(parsed.account, diag);\n return parseStoredOAuthCredential(raw)?.providerData;\n}\n\n/** Backfill Copilot plan metadata for credentials saved before plan detection existed. */\nexport async function enrichGithubCopilotOAuthProviderData(\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<Record<string, unknown> | undefined> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring' || oauthProviderIdFromAccount(parsed.account) !== 'github-copilot') {\n return undefined;\n }\n const raw = await readKeyringAccount(parsed.account, diag);\n const credential = parseStoredOAuthCredential(raw);\n if (!credential?.refresh) return credential?.providerData;\n try {\n const summary = await fetchCopilotAccount(credential.refresh);\n const providerData = { ...credential.providerData, copilot: summary };\n await writeKeyringAccount(\n parsed.account,\n oauthCredentialToKeychainJson({ ...credential, providerData }),\n diag,\n );\n return providerData;\n } catch (err) {\n diag?.(`GitHub Copilot plan lookup unavailable — ${err instanceof Error ? err.message : String(err)}`);\n return credential.providerData;\n }\n}\n\nfunction decodeProviderSecret(raw: string | null): string | null {\n if (!raw) return null;\n const trimmed = raw.trim();\n if (!trimmed.startsWith('{')) return trimmed;\n const oauth = parseStoredOAuthCredential(trimmed);\n if (oauth) return oauth.access;\n try {\n const parsed = JSON.parse(trimmed) as { type?: string; access?: string; token?: string };\n if (parsed.type === 'oauth' && typeof parsed.access === 'string') return parsed.access;\n if (parsed.type === 'wellknown' && typeof parsed.token === 'string') return parsed.token;\n } catch {\n // fall through\n }\n return trimmed;\n}\n\nasync function refreshOAuthKeyringAccount(\n account: string,\n providerId: string,\n raw: string,\n diag?: (msg: string) => void,\n force = false,\n): Promise<string | null> {\n const existing = oauthRefreshInflight.get(account);\n if (existing) return existing;\n\n const work = (async (): Promise<string | null> => {\n const cred = parseStoredOAuthCredential(raw);\n if (!cred || (!force && !oauthCredentialShouldRefresh(cred, providerId))) {\n return decodeProviderSecret(raw);\n }\n try {\n const refreshed = await refreshStoredOAuthCredential(providerId, cred);\n const json = oauthCredentialToKeychainJson(refreshed);\n await writeKeyringAccount(account, json, diag);\n return refreshed.access;\n } catch (err) {\n diag?.(err instanceof Error ? err.message : String(err));\n if (cred.access && cred.expires > Date.now()) return cred.access;\n throw err;\n }\n })();\n\n oauthRefreshInflight.set(account, work);\n try {\n return await work;\n } finally {\n oauthRefreshInflight.delete(account);\n }\n}\n\nasync function readProviderSecret(account: string, diag?: (msg: string) => void): Promise<string | null> {\n const raw = await readKeyringAccount(account, diag);\n if (!raw) return null;\n\n const oauthProviderId = oauthProviderIdFromAccount(account);\n if (oauthProviderId && raw.trim().startsWith('{')) {\n return refreshOAuthKeyringAccount(account, oauthProviderId, raw, diag);\n }\n return decodeProviderSecret(raw);\n}\n\nexport async function saveProviderCredential(\n authRef: string,\n key: string,\n diag?: (msg: string) => void,\n): Promise<boolean> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring') return false;\n return writeKeyringAccount(parsed.account, key, diag);\n}\n\n/** Delete a provider secret from keyring (no-op for env: refs). */\nexport async function deleteProviderCredential(\n authRef: string,\n diag?: (msg: string) => void,\n): Promise<boolean> {\n const parsed = parseAuthRef(authRef);\n if (!parsed || parsed.kind !== 'keyring') return false;\n return deleteKeyringAccount(parsed.account, diag);\n}\n\nexport async function readFromCredentialStore(diag?: (msg: string) => void): Promise<string | null> {\n return readGlobalOpencodeCredential(diag);\n}\n\nexport async function saveToCredentialStore(key: string, diag?: (msg: string) => void): Promise<boolean> {\n const wrote = await writeKeyringAccount(GLOBAL_OPENCODE_KEYRING_ACCOUNT, key, diag);\n if (wrote) {\n await deleteKeyringAccount(KEYRING_ACCOUNT, diag);\n }\n return wrote;\n}\n\nexport async function isSecretServiceAvailable(): Promise<boolean> {\n try {\n const { Entry } = await import('@napi-rs/keyring');\n new Entry(`${KEYRING_SERVICE}-probe`, 'probe').getPassword();\n return true;\n } catch {\n return false;\n }\n}\n","import type { CachedModel, ManualModel, RegistryProvider } from './types.js';\n\nconst MANUAL_MODEL_PACKAGES = new Set([\n '@ai-sdk/openai-compatible', '@ai-sdk/openai', '@ai-sdk/anthropic', '@openrouter/ai-sdk-provider',\n]);\n\nexport function supportsManualModels(provider: RegistryProvider): boolean {\n return provider.authType !== 'oauth'\n && !['zen', 'go', 'antigravity'].includes(provider.templateId)\n && MANUAL_MODEL_PACKAGES.has(provider.api.npm ?? '');\n}\n\n/** Refresh owns modelsCache; the user's entries win collisions without duplicating IDs. */\nexport function getProviderModels(provider: RegistryProvider): CachedModel[] {\n const models = new Map((provider.modelsCache?.models ?? []).map(model => [model.id, model]));\n if (supportsManualModels(provider)) {\n for (const model of provider.manualModels ?? []) {\n models.set(model.id, { ...model, modelFormat: provider.api.npm === '@ai-sdk/anthropic' ? 'anthropic' : 'openai' });\n }\n }\n return [...models.values()];\n}\n\nexport function modelIdError(value: unknown): string | undefined {\n if (typeof value !== 'string' || !value.trim()) return 'Model ID is required.';\n if (value.trim().length > 512 || /[\\s\\u0000-\\u001f\\u007f]/u.test(value.trim())) {\n return 'Model ID must be at most 512 characters with no whitespace or control characters.';\n }\n}\n\nexport function contextWindowError(value: unknown): string | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || Number(value) <= 0)) {\n return 'Context size must be a positive whole number of tokens, or left blank.';\n }\n}\n\n/** Explicitly pick stored fields: a manual entry cannot smuggle routing or credentials. */\nexport function parseManualModel(raw: unknown): ManualModel | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const m = raw as Record<string, unknown>;\n if (modelIdError(m.id) || typeof m.name !== 'string' || !m.name.trim()\n || m.name.length > 200 || m.source !== 'manual'\n || typeof m.validatedAt !== 'string' || !Number.isFinite(Date.parse(m.validatedAt))\n || contextWindowError(m.contextWindow)\n || (m.modelFormat !== 'openai' && m.modelFormat !== 'anthropic')) return undefined;\n return {\n id: (m.id as string).trim(), name: m.name.trim(), upstreamModelId: (m.id as string).trim(),\n modelFormat: m.modelFormat, source: 'manual', validatedAt: m.validatedAt,\n ...(m.contextWindow === undefined ? {} : { contextWindow: m.contextWindow as number, contextWindowSource: 'user' }),\n };\n}\n","// src/registry/io.ts — load/save providers.json with secure permissions\n\nimport {\n chmodSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n writeSync,\n closeSync,\n} from 'node:fs';\nimport { dirname } from 'node:path';\nimport { getAppHome, getProvidersPath } from '../paths.js';\nimport type { ProviderRegistry, RegistryProvider } from './types.js';\nimport { REGISTRY_SCHEMA_VERSION } from './types.js';\nimport {\n migrateAlibabaDashScopeChinaLabel,\n migrateLegacyCloudProviders,\n migrateOAuthOpenAiProvider,\n migrateOAuthXaiProvider,\n} from './migrate.js';\nimport { isValidProviderId } from './validate.js';\nimport { parseManualModel } from './provider-models.js';\n\nconst DIR_MODE = 0o700;\nconst FILE_MODE = 0o600;\n\nexport function ensureSecureAppHome(): void {\n const home = getAppHome();\n mkdirSync(home, { recursive: true, mode: DIR_MODE });\n try {\n chmodSync(home, DIR_MODE);\n } catch {\n // best-effort on platforms that restrict chmod\n }\n}\n\nfunction writeSecureFile(path: string, content: string): void {\n ensureSecureAppHome();\n mkdirSync(dirname(path), { recursive: true, mode: DIR_MODE });\n const fd = openSync(path, 'w', FILE_MODE);\n try {\n writeSync(fd, content);\n } finally {\n closeSync(fd);\n }\n try {\n chmodSync(path, FILE_MODE);\n } catch {\n // best-effort\n }\n}\n\nfunction parseProvider(raw: unknown): RegistryProvider | null {\n if (!raw || typeof raw !== 'object') return null;\n const p = raw as Record<string, unknown>;\n if (typeof p.id !== 'string' || !isValidProviderId(p.id)) return null;\n if (typeof p.templateId !== 'string' || !p.templateId) return null;\n if (typeof p.name !== 'string' || !p.name) return null;\n if (typeof p.enabled !== 'boolean') return null;\n if (typeof p.authRef !== 'string' || !p.authRef) return null;\n if (typeof p.addedAt !== 'string' || !p.addedAt) return null;\n const api = p.api;\n if (!api || typeof api !== 'object') return null;\n\n const provider: RegistryProvider = {\n id: p.id,\n templateId: p.templateId,\n name: p.name,\n enabled: p.enabled,\n authRef: p.authRef,\n api: api as RegistryProvider['api'],\n addedAt: p.addedAt,\n };\n\n if (p.subscriptionFilter === 'free' || p.subscriptionFilter === 'zen' || p.subscriptionFilter === 'go') {\n provider.subscriptionFilter = p.subscriptionFilter;\n }\n if (p.authType === 'api' || p.authType === 'oauth' || p.authType === 'none') {\n provider.authType = p.authType;\n }\n if (typeof p.refreshedAt === 'string') provider.refreshedAt = p.refreshedAt;\n if (Array.isArray(p.manualModels)) {\n provider.manualModels = p.manualModels.flatMap(raw => {\n const model = parseManualModel(raw);\n return model ? [model] : [];\n });\n }\n if (p.modelsCache && typeof p.modelsCache === 'object') {\n const cache = p.modelsCache as { fetchedAt?: string; models?: unknown[] };\n if (typeof cache.fetchedAt === 'string' && Array.isArray(cache.models)) {\n provider.modelsCache = {\n fetchedAt: cache.fetchedAt,\n models: cache.models.filter(m => m && typeof m === 'object') as RegistryProvider['modelsCache'] extends infer C\n ? C extends { models: infer M } ? M : never\n : never,\n };\n }\n }\n return provider;\n}\n\nfunction parseRegistry(raw: unknown): ProviderRegistry {\n const empty: ProviderRegistry = { schemaVersion: REGISTRY_SCHEMA_VERSION, providers: [] };\n if (!raw || typeof raw !== 'object') return empty;\n const data = raw as Record<string, unknown>;\n const providers: RegistryProvider[] = [];\n if (Array.isArray(data.providers)) {\n for (const entry of data.providers) {\n const parsed = parseProvider(entry);\n if (parsed) providers.push(parsed);\n }\n }\n const registry: ProviderRegistry = {\n schemaVersion:\n typeof data.schemaVersion === 'number' ? data.schemaVersion : REGISTRY_SCHEMA_VERSION,\n providers,\n };\n if (typeof data.importedAt === 'string') registry.importedAt = data.importedAt;\n if (typeof data.pricingCacheAt === 'string') registry.pricingCacheAt = data.pricingCacheAt;\n return registry;\n}\n\nexport function loadRegistry(path = getProvidersPath(), { persist = true }: { persist?: boolean } = {}): ProviderRegistry {\n if (!existsSync(path)) {\n return { schemaVersion: REGISTRY_SCHEMA_VERSION, providers: [] };\n }\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8'));\n const registry = parseRegistry(raw);\n let migrated = migrateLegacyCloudProviders(registry);\n if (migrateOAuthOpenAiProvider(registry)) migrated = true;\n if (migrateOAuthXaiProvider(registry)) migrated = true;\n if (migrateAlibabaDashScopeChinaLabel(registry)) migrated = true;\n // In-memory migrations always run (consumers like the embedded Core API\n // depend on them); persistence is gated so read-only callers never write.\n if (migrated && persist) {\n try {\n saveRegistry(registry, path);\n } catch {\n // Parsed data remains usable even when migration persistence fails.\n }\n }\n return registry;\n } catch {\n return { schemaVersion: REGISTRY_SCHEMA_VERSION, providers: [] };\n }\n}\n\nexport function saveRegistry(registry: ProviderRegistry, path = getProvidersPath()): void {\n const payload = `${JSON.stringify(registry, null, 2)}\\n`;\n const backup = `${path}.bak`;\n if (existsSync(path)) {\n try {\n copyFileSync(path, backup);\n } catch {\n // backup is best-effort\n }\n }\n const tmp = `${path}.tmp`;\n writeSecureFile(tmp, payload);\n renameSync(tmp, path);\n}\n\nexport function emptyRegistry(): ProviderRegistry {\n return { schemaVersion: REGISTRY_SCHEMA_VERSION, providers: [] };\n}\n","// src/registry/types.ts — native provider registry schema (no secrets)\n\nimport type { FreeStatus } from '../free-models.js';\n\nexport const REGISTRY_SCHEMA_VERSION = 1;\n\nexport type RegistrySubscriptionFilter = 'free' | 'zen' | 'go';\n\nexport interface CachedModel {\n /** User-owned addition, kept separately from the downloaded catalog. */\n source?: 'manual';\n id: string;\n name: string;\n upstreamModelId: string;\n family?: string;\n brand?: string;\n contextWindow?: number;\n /** Distinguishes provider-reported context from legacy Relay guesses. */\n contextWindowSource?: 'provider' | 'user';\n cost?: { input: number; output: number; cache_read?: number; cache_write?: number };\n isFree?: boolean;\n freeStatus?: FreeStatus;\n modelFormat: 'anthropic' | 'openai' | 'cloud-code';\n /** Per-model override — wins over provider-level api.npm */\n npm?: string;\n /** Per-model override — wins over provider-level api.url */\n apiUrl?: string;\n sourceBackend?: string;\n /** Provider-reported request parameters, e.g. OpenRouter supported_parameters. */\n supportedParameters?: string[];\n /** Broad model metadata: model can produce reasoning/thinking output. */\n reasoning?: boolean;\n /** Streaming/interleaved reasoning field name from metadata, e.g. reasoning_content. */\n interleavedReasoningField?: string;\n /** Backend capability: model requires the Responses-Lite request shape (x-openai-internal-codex-responses-lite). */\n useResponsesLite?: boolean;\n /** Backend capability: model must use the WebSocket Responses transport instead of HTTP. */\n preferWebSockets?: boolean;\n}\n\nexport interface ManualModel extends CachedModel {\n source: 'manual';\n /** Time generation, streaming and a harmless tool round-trip last passed. */\n validatedAt: string;\n}\n\nexport interface RegistryProvider {\n id: string;\n templateId: string;\n name: string;\n enabled: boolean;\n authRef: string;\n authType?: 'api' | 'oauth' | 'none';\n subscriptionFilter?: RegistrySubscriptionFilter;\n api: {\n npm?: string;\n url?: string;\n id?: string;\n /** Static headers sent on every upstream request (e.g. a plan/auth-tracking header a custom endpoint requires). */\n headers?: Record<string, string>;\n };\n modelsCache?: {\n fetchedAt: string;\n models: CachedModel[];\n };\n manualModels?: ManualModel[];\n addedAt: string;\n refreshedAt?: string;\n}\n\nexport interface ProviderRegistry {\n schemaVersion: number;\n providers: RegistryProvider[];\n importedAt?: string;\n pricingCacheAt?: string;\n}\n","import type { ProviderRegistry } from './types.js';\n\nconst LEGACY_CLOUD_PROVIDER_IDS = [\n { legacyId: 'opencode', id: 'zen', name: 'OpenCode Zen' },\n { legacyId: 'opencode-go', id: 'go', name: 'OpenCode Go' },\n] as const;\n\nexport function migrateLegacyCloudProviders(registry: ProviderRegistry): boolean {\n let changed = false;\n\n for (const { legacyId, id, name } of LEGACY_CLOUD_PROVIDER_IDS) {\n const legacyIdx = registry.providers.findIndex(provider => provider.id === legacyId);\n if (legacyIdx < 0) continue;\n\n if (registry.providers.some(provider => provider.id === id)) {\n registry.providers.splice(legacyIdx, 1);\n } else {\n registry.providers[legacyIdx] = {\n ...registry.providers[legacyIdx]!,\n id,\n templateId: id,\n name,\n api: {},\n };\n }\n changed = true;\n }\n\n return changed;\n}\n\n// Rename {id:'openai', authType:'oauth'} → {id:'openai-oauth'} so it can coexist\n// with the API-key 'openai' provider. Preserves the original authRef so the\n// keyring credential isn't orphaned.\nexport function migrateOAuthOpenAiProvider(registry: ProviderRegistry): boolean {\n if (registry.providers.some(p => p.id === 'openai-oauth')) return false;\n\n const idx = registry.providers.findIndex(\n p => p.id === 'openai' && p.authType === 'oauth',\n );\n if (idx < 0) return false;\n\n const existing = registry.providers[idx]!;\n registry.providers[idx] = {\n ...existing,\n id: 'openai-oauth',\n templateId: existing.templateId || 'openai',\n name: existing.name === 'OpenAI' ? 'OpenAI (ChatGPT)' : existing.name,\n };\n return true;\n}\n\n// Rename {id:'xai', authType:'oauth'} → {id:'xai-oauth'}\nexport function migrateOAuthXaiProvider(registry: ProviderRegistry): boolean {\n if (registry.providers.some(p => p.id === 'xai-oauth')) return false;\n\n const idx = registry.providers.findIndex(\n p => p.id === 'xai' && p.authType === 'oauth',\n );\n if (idx < 0) return false;\n\n const existing = registry.providers[idx]!;\n registry.providers[idx] = {\n ...existing,\n id: 'xai-oauth',\n templateId: existing.templateId || 'xai',\n name: existing.name === 'xAI' ? 'xAI Grok (SuperGrok)' : existing.name,\n };\n return true;\n}\n\n/** Clarify the stock China DashScope entry without altering custom configurations. */\nexport function migrateAlibabaDashScopeChinaLabel(registry: ProviderRegistry): boolean {\n const provider = registry.providers.find(p =>\n p.id === 'alibaba' &&\n p.templateId === 'alibaba' &&\n p.name === 'Alibaba DashScope' &&\n p.api.url === 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n );\n if (!provider) return false;\n\n provider.name = 'Alibaba DashScope (China)';\n return true;\n}\n","// src/registry/validate.ts\n\n/** Stable provider slug: lowercase alphanumeric + internal hyphens. */\nexport const PROVIDER_ID_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\n\nexport function isValidProviderId(id: string): boolean {\n return PROVIDER_ID_PATTERN.test(id);\n}\n\nexport function slugifyProviderId(displayName: string): string {\n const base = displayName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n if (!base) return 'custom-provider';\n if (isValidProviderId(base)) return base;\n const trimmed = base.replace(/^-+|-+$/g, '');\n return isValidProviderId(trimmed) ? trimmed : `custom-${trimmed.slice(0, 40)}`;\n}\n\nexport function customProviderId(displayName: string): string {\n const slug = slugifyProviderId(displayName);\n return slug.startsWith('custom-') ? slug : `custom-${slug}`;\n}\n","// src/registry/url-security.ts — SSRF guard for custom provider URLs\n\nimport { lookup } from 'node:dns/promises';\nimport ipaddr from 'ipaddr.js';\n\nexport interface UrlSecurityOptions {\n /** Allow http:// endpoints for user-approved local/LAN servers (Ollama, LM Studio, vLLM). */\n allowInsecureLocal?: boolean;\n}\n\nexport interface UrlSecurityResult {\n ok: boolean;\n error?: string;\n hint?: string;\n normalizedUrl?: string;\n}\n\nconst BLOCKED_HOSTNAMES = new Set([\n '169.254.169.254',\n 'metadata.google.internal',\n '169.254.170.2',\n 'fd00:ec2::254',\n]);\n\nfunction isBlockedIp(ipStr: string, allowInsecureLocal: boolean): boolean {\n try {\n const ip = ipaddr.process(ipStr);\n const range = ip.range();\n\n if (allowInsecureLocal && (range === 'loopback' || range === 'private')) {\n return false;\n }\n\n if (range === 'loopback') return true;\n if (range === 'private') return true;\n if (range === 'linkLocal') return true;\n if (range === 'uniqueLocal') return true;\n if (range === 'carrierGradeNat') return true;\n \n return false;\n } catch {\n return true; // If we can't parse it, block it to be safe\n }\n}\n\nasync function resolveHostAddresses(hostname: string): Promise<string[]> {\n try {\n ipaddr.parse(hostname);\n return [hostname];\n } catch {\n // Not an IP, proceed to DNS lookup\n }\n \n try {\n const records = await lookup(hostname, { all: true, verbatim: true });\n return records.map(r => r.address);\n } catch {\n return [];\n }\n}\n\n/** Validate a custom provider base URL before test or save. */\nexport async function validateCustomEndpointUrl(\n rawUrl: string,\n opts: UrlSecurityOptions = {},\n): Promise<UrlSecurityResult> {\n const trimmed = rawUrl.trim();\n if (!trimmed) {\n return { ok: false, error: 'Base URL is required.', hint: 'Example: https://api.example.com/v1' };\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n return { ok: false, error: 'Invalid URL.', hint: 'Include https:// and the full base path.' };\n }\n\n const allowLocal = opts.allowInsecureLocal === true;\n\n if (parsed.protocol === 'http:' && !allowLocal) {\n return {\n ok: false,\n error: 'Only HTTPS URLs are allowed.',\n hint: 'For local or LAN servers (Ollama, LM Studio, vLLM), allow insecure HTTP when prompted.',\n };\n } else if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return { ok: false, error: 'URL must use https:// or user-approved http:// for local/LAN servers.' };\n }\n \n // URL parses IPv6 hosts with brackets (e.g., \"[::1]\"). Strip them for DNS/IP checks.\n const rawHostname = parsed.hostname.toLowerCase();\n const hostname = rawHostname.replace(/^\\[(.*)\\]$/, '$1');\n\n if (BLOCKED_HOSTNAMES.has(hostname)) {\n return {\n ok: false,\n error: 'This URL points to a blocked internal/metadata host.',\n hint: 'Use a public API endpoint for your provider.',\n };\n }\n\n const addresses = await resolveHostAddresses(hostname);\n if (addresses.length === 0) {\n return {\n ok: false,\n error: `Could not resolve hostname: ${hostname}`,\n hint: 'Check the URL spelling and your network connection.',\n };\n }\n\n for (const addr of addresses) {\n try {\n ipaddr.process(addr);\n } catch {\n continue;\n }\n\n if (isBlockedIp(addr, allowLocal)) {\n return {\n ok: false,\n error: 'URL resolves to a private or restricted network address.',\n hint: 'Use a public HTTPS endpoint, or explicitly allow insecure HTTP for a trusted local/LAN server.',\n };\n }\n }\n\n if (parsed.protocol === 'http:') {\n const allResolvedAddressesAreLocal = addresses.every(addr => {\n try {\n const range = ipaddr.process(addr).range();\n return range === 'loopback' || range === 'private' || range === 'uniqueLocal';\n } catch {\n return false;\n }\n });\n if (!allowLocal || !allResolvedAddressesAreLocal) {\n return {\n ok: false,\n error: 'HTTP is only allowed for local loopback or private-network addresses.',\n hint: 'Use https://, or allow insecure HTTP for a trusted local/LAN server.',\n };\n }\n }\n\n const normalizedUrl = `${parsed.protocol}//${parsed.host}${parsed.pathname}`.replace(/\\/$/, '');\n return { ok: true, normalizedUrl };\n}\n","// src/oauth/claude-identity.ts — Request identity simulation for Claude Code OAuth.\n// Anthropic validates that OAuth requests match the claude-cli fingerprint.\n\nimport { createHash, randomUUID } from 'node:crypto';\n\nexport const CLAUDE_CODE_CLI_VERSION = '2.1.195';\nexport const CLAUDE_CODE_USER_AGENT = `claude-cli/${CLAUDE_CODE_CLI_VERSION} (external, cli)`;\nexport const CLAUDE_CODE_ENTRYPOINT = process.env.CLAUDE_CODE_ENTRYPOINT ?? 'cli';\nexport const CLAUDE_CODE_BILLING_HEADER_PREFIX = 'x-anthropic-billing-header:';\n\n// Per-process session IDs keyed by seed — same value emitted for X-Claude-Code-Session-Id\n// and metadata.user_id.session_id.\nconst sessionCache = new Map<string, string>();\n\nfunction getOrCreateSessionId(seed: string): string {\n let id = sessionCache.get(seed);\n if (!id) { id = randomUUID(); sessionCache.set(seed, id); }\n return id;\n}\n\n// Deterministic UUIDv4 from a SHA-256 hash — used as fallback when bootstrap hasn't run.\nfunction uuidFromHash(input: string): string {\n const h = createHash('sha256').update(input).digest('hex');\n return [h.slice(0,8), h.slice(8,12), '4'+h.slice(13,16),\n ((parseInt(h[16]!,16)&3)|8).toString(16)+h.slice(17,20), h.slice(20,32)].join('-');\n}\n\nconst HEX64_RE = /^[a-f0-9]{64}$/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** Resolve cliUserID (device_id) from stored providerData, falling back to a hash. */\nexport function resolveCliUserID(\n providerData: Record<string, unknown> | undefined,\n seed: string,\n): string {\n const v = providerData?.cliUserID;\n if (typeof v === 'string' && HEX64_RE.test(v)) return v;\n return createHash('sha256').update(`cliUserID:${seed}`).digest('hex');\n}\n\n/** Resolve accountUUID from stored providerData, falling back to a deterministic UUID. */\nexport function resolveAccountUUID(\n providerData: Record<string, unknown> | undefined,\n seed: string,\n): string {\n const v = providerData?.accountUUID;\n if (typeof v === 'string' && UUID_RE.test(v)) return v;\n return uuidFromHash(`account:${seed}`);\n}\n\nexport function buildUserIdJson(deviceId: string, accountUUID: string, sessionId: string): string {\n return JSON.stringify({ device_id: deviceId, account_uuid: accountUUID, session_id: sessionId });\n}\n\nexport function buildClaudeCodeBillingSystemLine(): string {\n return `${CLAUDE_CODE_BILLING_HEADER_PREFIX} cc_version=${CLAUDE_CODE_CLI_VERSION}.0; cc_entrypoint=${CLAUDE_CODE_ENTRYPOINT};`;\n}\n\nfunction systemBlockText(block: unknown): string | undefined {\n if (typeof block === 'string') return block;\n if (block && typeof block === 'object' && 'text' in block) {\n const text = (block as { text?: unknown }).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n}\n\nfunction hasClaudeCodeBillingSystemLine(system: unknown): boolean {\n if (typeof system === 'string') return system.startsWith(CLAUDE_CODE_BILLING_HEADER_PREFIX);\n if (!Array.isArray(system)) return false;\n return system.some(block => systemBlockText(block)?.startsWith(CLAUDE_CODE_BILLING_HEADER_PREFIX));\n}\n\nexport function injectClaudeCodeBillingSystemLine(body: Record<string, unknown>): void {\n if (hasClaudeCodeBillingSystemLine(body.system)) return;\n\n const billingBlock = { type: 'text', text: buildClaudeCodeBillingSystemLine() };\n if (body.system === undefined || body.system === null) {\n body.system = [billingBlock];\n } else if (typeof body.system === 'string') {\n body.system = [billingBlock, { type: 'text', text: body.system }];\n } else if (Array.isArray(body.system)) {\n body.system = [billingBlock, ...body.system];\n } else {\n body.system = [billingBlock];\n }\n}\n\n// ── Beta flag selection ────────────────────────────────────────────────────\n// Anthropic validates the anthropic-beta set matches the request shape.\n\nconst ALWAYS: string[] = [\n 'oauth-2025-04-20',\n 'context-management-2025-06-27',\n 'prompt-caching-scope-2026-01-05',\n];\nconst AGENT: string[] = [\n 'claude-code-20250219',\n 'extended-cache-ttl-2025-04-11',\n 'cache-diagnosis-2026-04-07',\n 'advisor-tool-2026-03-01',\n];\nconst THINKING: string[] = [\n 'interleaved-thinking-2025-05-14',\n 'redact-thinking-2026-02-12',\n 'thinking-token-count-2026-05-13',\n];\nconst HEAVY: string[] = ['advanced-tool-use-2025-11-20', 'effort-2025-11-24'];\nconst OPUS_ONLY: string[] = ['context-1m-2025-08-07', 'mid-conversation-system-2026-04-07'];\n\n/**\n * Select anthropic-beta flags matching the request shape.\n * clientBeta: the inbound anthropic-beta header from the client — respected to avoid\n * forcing betas the client never requested (can cause malformed tool_use streams).\n */\nexport function selectBetaFlags(\n body: Record<string, unknown>,\n model?: string | null,\n clientBeta?: string | null,\n): string {\n const hasSystem = !!body.system &&\n (typeof body.system === 'string' || (Array.isArray(body.system) && body.system.length > 0));\n const tools = body.tools as unknown[] | undefined;\n const isFullAgent = hasSystem && Array.isArray(tools) && tools.length > 0;\n const m = (model ?? (typeof body.model === 'string' ? body.model : '')).toLowerCase();\n const isOpus = m.includes('opus');\n const isSonnetOrOpus = isOpus || m.includes('sonnet');\n\n const clientSet = clientBeta\n ? new Set(clientBeta.split(',').map(s => s.trim()).filter(Boolean))\n : null;\n const allowThinking = !clientSet || clientSet.has('interleaved-thinking-2025-05-14');\n const allowHeavy = !clientSet\n || clientSet.has('advanced-tool-use-2025-11-20')\n || clientSet.has('effort-2025-11-24');\n\n const flags = [...ALWAYS];\n if (isFullAgent) flags.push(...AGENT);\n if (isOpus) flags.push(...OPUS_ONLY);\n if (allowThinking) flags.push(...THINKING);\n if (isFullAgent && isSonnetOrOpus && allowHeavy) flags.push(...HEAVY);\n\n return flags.join(',');\n}\n\n/**\n * Inject Claude Code identity metadata into an Anthropic request body in-place.\n * Must be called before forwarding the request to api.anthropic.com.\n */\nexport function injectClaudeIdentity(\n body: Record<string, unknown>,\n providerData: Record<string, unknown> | undefined,\n seed: string,\n): { sessionId: string; userId: string } {\n const deviceId = resolveCliUserID(providerData, seed);\n const accountUUID = resolveAccountUUID(providerData, seed);\n const sessionId = getOrCreateSessionId(seed);\n const userId = buildUserIdJson(deviceId, accountUUID, sessionId);\n const existing = body.metadata as Record<string, unknown> | undefined;\n body.metadata = { ...(existing ?? {}), user_id: userId };\n return { sessionId, userId };\n}\n","// Maps an OpenCode provider's `npm` package (the field providers.ts already\n// reads) to a Vercel AI SDK LanguageModel instance. The SDK owns wire format,\n// endpoint selection, and provider quirks.\nimport type { LanguageModel } from 'ai';\nimport { wrapLanguageModel, extractReasoningMiddleware } from 'ai';\nimport { VERTEX_ANTHROPIC_NPM, CODEX_RESPONSES_LITE_VERSION, CODEX_RESPONSES_LITE_WS_URL } from './constants.js';\nimport { extractOpenAiAccountId } from './oauth/openai.js';\nimport { createResponsesWebSocketFetch } from './oauth/responses-websocket.js';\nimport {\n CLAUDE_CODE_USER_AGENT,\n injectClaudeIdentity,\n} from './oauth/claude-identity.js';\nimport {\n createClinePassOAuthFetch,\n formatClineRuntimeCredential,\n isClinePassOAuth,\n} from './cline-pass.js';\n\n/** Models that must use /v1/responses instead of /v1/chat/completions. */\nconst RESPONSES_ONLY_PREFIXES = [\n 'gpt-5-codex',\n 'gpt-5-pro',\n 'gpt-5.2-pro',\n 'o3',\n 'o4',\n];\n\ntype SdkProviderFactory = (options: {\n apiKey: string;\n baseURL?: string;\n name?: string;\n headers?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n}) => {\n (modelId: string): LanguageModel;\n chat: (modelId: string) => LanguageModel;\n responses: (modelId: string) => LanguageModel;\n};\n\nconst factoryCache = new Map<string, Promise<SdkProviderFactory>>();\n\n/**\n * True when a model id must use the OpenAI/xAI Responses API instead of\n * chat/completions. The SDK reflects this by selecting `provider.responses(id)`.\n */\nexport function modelPrefersResponsesApi(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n if (RESPONSES_ONLY_PREFIXES.some(prefix => lower === prefix || lower.startsWith(`${prefix}-`))) {\n return true;\n }\n // gpt-5.4 and later minor versions require the Responses API (e.g. gpt-5.4, gpt-5.5, gpt-5.6, gpt-5.6-fast).\n const gpt5Minor = lower.match(/^gpt-5\\.(\\d+)(?:-|$)/);\n if (gpt5Minor && Number(gpt5Minor[1]) >= 4) return true;\n // Versioned Codex IDs (e.g. gpt-5.3-codex) don't match the gpt-5-codex prefix.\n if (lower.startsWith('gpt-') && lower.includes('-codex')) return true;\n // xAI multiagent models (e.g. grok-4.20-multi-agent, grok-4.2-multiagent).\n if (lower.startsWith('grok-') && (lower.includes('multi-agent') || lower.includes('multiagent'))) return true;\n return false;\n}\n\n/**\n * OpenAI's Responses API is a strict superset of Chat Completions for every\n * current model — there is no OpenAI model that Chat Completions can serve\n * that Responses cannot. So route every OpenAI model through Responses by\n * default, except pre-chat legacy completion models that predate both APIs\n * and are not agentic chat models at all.\n */\nconst OPENAI_CHAT_COMPLETIONS_ONLY = [\n 'davinci-002',\n 'babbage-002',\n 'gpt-3.5-turbo-instruct',\n];\n\nexport function shouldUseOpenAiResponsesEndpoint(modelId: string): boolean {\n return !OPENAI_CHAT_COMPLETIONS_ONLY.includes(modelId.toLowerCase());\n}\n\nexport interface VertexProviderConfig {\n project: string;\n location: string;\n}\n\nexport interface ProviderModelSpec {\n /** OpenCode `api.npm` package, e.g. `@ai-sdk/xai`. */\n npm: string;\n modelId: string;\n apiKey: string;\n /** Base URL for openai-compatible / openrouter providers (no trailing path). */\n baseURL?: string;\n /** Provider id for naming openai-compatible instances (diagnostics only). */\n providerId?: string;\n /** Registry authentication mode. OpenAI OAuth uses the ChatGPT Codex backend. */\n authType?: 'api' | 'oauth' | 'none';\n oauthAccountId?: string;\n providerData?: Record<string, unknown>;\n /** Google Vertex AI — uses Application Default Credentials, not apiKey. */\n vertex?: VertexProviderConfig;\n /** Static headers sent on every upstream request (e.g. a plan/auth-tracking header a custom endpoint requires). */\n headers?: Record<string, string>;\n /** Refresh an OAuth access token after the SDK receives one 401 response. */\n refreshToken?: () => Promise<string | null>;\n /** Persist a newly refreshed raw token for future requests. */\n onTokenRefreshed?: (token: string) => void;\n /** Backend capability: model requires the Responses-Lite request shape (x-openai-internal-codex-responses-lite). */\n useResponsesLite?: boolean;\n /** Backend capability: model must use the WebSocket Responses transport instead of HTTP. */\n preferWebSockets?: boolean;\n /** Optional debug logger (wired to the proxy trace log) for transport-level diagnostics. */\n onDebug?: (msg: string) => void;\n}\n\n/** True when this provider routes through the SDK adapter (local providers + Zen/Go openai-format). */\nexport function isSdkMigratedNpm(npm: string | undefined): boolean {\n return !!npm && npm !== '@ai-sdk/anthropic';\n}\n\nexport function maxToolsForNpm(npm: string | undefined): number | undefined {\n return npm === '@ai-sdk/groq' ? 128 : undefined;\n}\n\n/**\n * Venice's published SDK package still peers on AI SDK 6. Route it through the\n * first-party openai-compatible provider so Relay does not nest a v6 tree.\n * Existing registries that stored `venice-ai-sdk-provider` keep working.\n */\nexport function resolveProviderNpm(npm: string): string {\n return npm === 'venice-ai-sdk-provider' ? '@ai-sdk/openai-compatible' : npm;\n}\n\nfunction findCreateFactory(mod: Record<string, unknown>): SdkProviderFactory {\n for (const value of Object.values(mod)) {\n if (typeof value === 'function' && value.name.startsWith('create')) {\n return value as SdkProviderFactory;\n }\n }\n throw new Error('No create* factory export found in provider package');\n}\n\nasync function loadSdkProviderFactory(npm: string): Promise<SdkProviderFactory> {\n let cached = factoryCache.get(npm);\n if (!cached) {\n cached = (async () => {\n try {\n const mod = await import(npm);\n return findCreateFactory(mod as Record<string, unknown>);\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? err.code : undefined;\n if (code === 'ERR_MODULE_NOT_FOUND') {\n throw new Error(`SDK provider package not installed: ${npm}. Run: npm install ${npm}`);\n }\n throw err;\n }\n })();\n factoryCache.set(npm, cached);\n cached.catch(() => factoryCache.delete(npm));\n }\n return cached;\n}\n\nexport async function createLanguageModel(spec: ProviderModelSpec): Promise<LanguageModel> {\n const npm = resolveProviderNpm(spec.npm);\n const { modelId, apiKey, baseURL } = spec;\n\n if (npm === VERTEX_ANTHROPIC_NPM) {\n if (!spec.vertex?.project) {\n throw new Error('Vertex project is required for @ai-sdk/google-vertex/anthropic');\n }\n const { createVertexAnthropic } = await import('@ai-sdk/google-vertex/anthropic');\n const vertex = createVertexAnthropic({\n project: spec.vertex.project,\n location: spec.vertex.location,\n });\n return vertex(modelId);\n }\n\n if (npm === '@ai-sdk/openai') {\n const { createOpenAI } = await import('@ai-sdk/openai');\n const accountId = spec.authType === 'oauth'\n ? spec.oauthAccountId ?? extractOpenAiAccountId({ access_token: apiKey })\n : undefined;\n const oauthOptions = spec.authType === 'oauth'\n ? {\n apiKey,\n baseURL: 'https://chatgpt.com/backend-api/codex',\n headers: {\n ...(accountId ? { 'ChatGPT-Account-Id': accountId } : {}),\n originator: 'relay-ai',\n // Responses-Lite models (backend prefer_websockets/use_responses_lite,\n // e.g. gpt-5.6-luna) require these on the request.\n ...(spec.useResponsesLite\n ? { version: CODEX_RESPONSES_LITE_VERSION, 'x-openai-internal-codex-responses-lite': 'true' }\n : {}),\n },\n // Models the backend flags with prefer_websockets are only served over\n // the WebSocket Responses transport, not HTTP.\n ...(spec.preferWebSockets\n ? { fetch: createResponsesWebSocketFetch(CODEX_RESPONSES_LITE_WS_URL, spec.onDebug) }\n : {}),\n }\n : { apiKey };\n const openai = createOpenAI(oauthOptions);\n return shouldUseOpenAiResponsesEndpoint(modelId) ? openai.responses(modelId) : openai.chat(modelId);\n }\n if (npm === '@ai-sdk/xai') {\n const { createXai } = await import('@ai-sdk/xai');\n const xai = createXai({ apiKey });\n return modelPrefersResponsesApi(modelId) ? xai.responses(modelId) : xai(modelId);\n }\n // @ai-sdk/google owns its native v1beta endpoint. Registry templates store the\n // OpenAI-compatible URL only for GET /v1/models discovery — passing it here\n // produces .../v1beta/openai/models/...:streamGenerateContent → 404.\n if (npm === '@ai-sdk/google') {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n const google = createGoogleGenerativeAI({ apiKey });\n return google(modelId);\n }\n // Registry stores root URL (no /v1) for GET /v1/models discovery — passing it here\n // makes the SDK call https://api.anthropic.com/messages → 404.\n if (npm === '@ai-sdk/anthropic') {\n const { createAnthropic } = await import('@ai-sdk/anthropic');\n const root = baseURL?.replace(/\\/v1\\/?$/, '').replace(/\\/$/, '');\n const anthropicOptions: Parameters<typeof createAnthropic>[0] = spec.authType === 'oauth'\n ? {\n authToken: apiKey,\n ...(spec.providerId === 'claude-code'\n ? {\n headers: {\n 'User-Agent': CLAUDE_CODE_USER_AGENT,\n 'x-app': 'cli',\n 'X-Claude-Code-Session-Id': injectClaudeIdentity(\n {},\n spec.providerData,\n spec.oauthAccountId ?? apiKey,\n ).sessionId,\n },\n }\n : {}),\n }\n : { apiKey };\n if (spec.headers) {\n anthropicOptions.headers = { ...anthropicOptions.headers, ...spec.headers };\n }\n if (!root || root === 'https://api.anthropic.com') {\n return createAnthropic(anthropicOptions)(modelId);\n }\n const sdkBase = baseURL!.endsWith('/v1') ? baseURL : `${root}/v1`;\n return createAnthropic({ ...anthropicOptions, baseURL: sdkBase })(modelId);\n }\n let model: LanguageModel;\n\n if (npm === '@ai-sdk/openai-compatible') {\n const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible');\n const runtimeApiKey = formatClineRuntimeCredential(spec.providerId, spec.authType, apiKey);\n const options = {\n name: spec.providerId ?? 'openai-compatible',\n baseURL: baseURL ?? '',\n ...(runtimeApiKey.trim() ? { apiKey: runtimeApiKey } : {}),\n ...(spec.headers ? { headers: spec.headers } : {}),\n ...(isClinePassOAuth(spec.providerId, spec.authType) && spec.refreshToken\n ? {\n fetch: createClinePassOAuthFetch(\n runtimeApiKey,\n spec.refreshToken,\n spec.onTokenRefreshed,\n ),\n }\n : {}),\n };\n model = createOpenAICompatible({\n ...options,\n })(modelId);\n } else if (npm === '@openrouter/ai-sdk-provider') {\n const { createOpenRouter } = await import('@openrouter/ai-sdk-provider');\n model = createOpenRouter({ apiKey, baseURL, ...(spec.headers ? { headers: spec.headers } : {}) })(modelId);\n } else {\n const create = await loadSdkProviderFactory(npm);\n const provider = create({\n apiKey,\n ...(baseURL ? { baseURL } : {}),\n ...(spec.headers ? { headers: spec.headers } : {}),\n });\n model = provider(modelId);\n }\n\n const isReasoning = modelId.toLowerCase().match(/deepseek-r1|think|reasoning|qwq/);\n if (isReasoning) {\n return wrapLanguageModel({\n model: model as Parameters<typeof wrapLanguageModel>[0]['model'],\n middleware: [extractReasoningMiddleware({ tagName: 'think' })],\n }) as unknown as LanguageModel;\n }\n\n return model;\n}\n\nexport type ReasoningMode = 'none' | 'internal-only' | 'controllable';\nexport type ReasoningSource = 'provider-metadata' | 'provider-rule' | 'model-metadata' | 'none';\nexport type ReasoningConfidence = 'verified' | 'documented' | 'inferred';\nexport type ReasoningWireFormat =\n | { kind: 'openrouter-reasoning' }\n | { kind: 'openai-reasoning-effort' }\n | { kind: 'anthropic-thinking' }\n | { kind: 'google-thinking-config' }\n | { kind: 'mistral-reasoning-effort' }\n | { kind: 'deepseek-thinking' };\n\nexport interface ReasoningMetadata {\n providerId?: string;\n apiBaseUrl?: string;\n supportedParameters?: string[];\n reasoning?: boolean;\n interleavedReasoningField?: string;\n /**\n * Bare upstream model id (e.g. 'grok-4.5'), distinct from the request's `model`\n * field which may be a gateway alias or catalog slug (e.g. 'xai-oauth__grok-4.5').\n * Reasoning-capability id-pattern checks must match against this, not body.model.\n */\n upstreamModelId?: string;\n}\n\nexport interface ReasoningCapabilities {\n levels: string[];\n defaultLevel: string;\n supportsSummaries: boolean;\n mode: ReasoningMode;\n source: ReasoningSource;\n confidence: ReasoningConfidence;\n wireFormat?: ReasoningWireFormat;\n}\n\nconst ANTHROPIC_EFFORT_LEVELS = ['low', 'medium', 'high'] as const;\nconst OPENAI_EFFORT_LEVELS = ['low', 'medium', 'high'] as const;\nconst OPENAI_XHIGH_EFFORT_LEVELS = ['low', 'medium', 'high', 'xhigh'] as const;\nconst GEMINI_EFFORT_LEVELS = ['low', 'medium', 'high'] as const;\nconst MISTRAL_EFFORT_LEVELS = ['high', 'off'] as const;\n/**\n * xAI's accepted reasoning_effort values differ by transport, per the installed\n * adapter's own docs (`@ai-sdk/xai/docs/01-xai.mdx`): chat models take\n * `low | high`, Responses models take `low | medium | high`. Neither accepts a\n * `none`/`xhigh` value, so neither is offered.\n */\nconst XAI_CHAT_EFFORT_LEVELS = ['low', 'high'] as const;\nconst XAI_RESPONSES_EFFORT_LEVELS = ['low', 'medium', 'high'] as const;\nconst OPENROUTER_EFFORT_LEVELS = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh'] as const;\n/** DeepSeek V4 wire values (low/medium map to high; xhigh maps to max). */\nconst DEEPSEEK_EFFORT_LEVELS = ['high', 'max', 'off'] as const;\n/** GLM-5.2 published efforts (OpenRouter metadata): high and xhigh, default high. */\nconst GLM_52_EFFORT_LEVELS = ['high', 'xhigh'] as const;\n\nconst EMPTY_REASONING: ReasoningCapabilities = {\n levels: [],\n defaultLevel: '',\n supportsSummaries: false,\n mode: 'none',\n source: 'none',\n confidence: 'inferred',\n};\n\nconst EFFORT_DESCRIPTIONS: Record<string, string> = {\n off: 'Turn off extended reasoning',\n none: 'No reasoning',\n minimal: 'Minimal reasoning',\n low: 'Light reasoning',\n medium: 'Balanced reasoning',\n high: 'Deep reasoning',\n xhigh: 'Maximum reasoning',\n max: 'Maximum effort',\n};\n\nconst GEMINI_25_BUDGETS: Record<string, number> = {\n low: 1024,\n medium: 4096,\n high: 8192,\n xhigh: 16384,\n max: 16384,\n minimal: 512,\n none: 0,\n};\n\n/** Claude adaptive-thinking models (opus/sonnet/haiku 4.6+, fable, mythos). */\nfunction isClaudeReasoningModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n if (!lower.startsWith('claude-')) return false;\n if (lower.includes('fable') || lower.includes('mythos')) return true;\n const m = lower.match(/claude-(?:opus|sonnet|haiku)-(\\d+)-(\\d+)/);\n if (!m) return false;\n const major = Number(m[1]);\n const minor = Number(m[2]);\n return major > 4 || (major === 4 && minor >= 6);\n}\n\nfunction isGeminiReasoningModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n return lower.startsWith('gemini-2.5-')\n || lower.startsWith('gemini-3')\n || lower.startsWith('gemini-3.');\n}\n\nfunction isGemini3Model(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n return lower.startsWith('gemini-3') || lower.startsWith('gemini-3.');\n}\n\nfunction isMistralReasoningModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n return lower.startsWith('mistral-')\n || lower.startsWith('magistral-')\n || lower.startsWith('ministral-')\n || lower.includes('reasoning');\n}\n\n/**\n * xAI models that accept `reasoning_effort` on the wire (per xAI docs).\n * models.dev `reasoning: true` is broader — e.g. grok-build-0.1 reasons internally\n * but rejects reasoningEffort (HTTP 400).\n */\nfunction isXaiReasoningEffortModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n if (lower.includes('non-reasoning')) return false;\n if (lower.startsWith('grok-build')) return false;\n if (lower.startsWith('grok-imagine')) return false;\n if (modelPrefersResponsesApi(modelId)) return true;\n if (lower === 'grok-4.3' || lower.startsWith('grok-4.3-')) return true;\n if (lower === 'grok-4.5' || lower.startsWith('grok-4.5-')) return true;\n if (lower.includes('-reasoning')) return true;\n return false;\n}\n\n/**\n * xAI's own default reasoning_effort when the param is omitted (per xAI docs).\n * Varies by model — grok-4.3 defaults to 'low', grok-4.5 defaults to 'high'.\n */\nfunction xaiDefaultReasoningEffort(modelId: string): string {\n const lower = modelId.toLowerCase();\n if (lower === 'grok-4.5' || lower.startsWith('grok-4.5-')) return 'high';\n return 'low';\n}\n\n/** DeepSeek V4 models with thinking mode + reasoning_effort (direct API). */\nfunction isDeepSeekReasoningModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n return lower === 'deepseek-v4-flash'\n || lower === 'deepseek-v4-pro'\n || lower.startsWith('deepseek-v4-flash-')\n || lower.startsWith('deepseek-v4-pro-')\n || lower === 'deepseek-reasoner'\n || lower === 'deepseek-chat';\n}\n\nfunction isKimiReasoningModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n return lower.startsWith('kimi-');\n}\n\n// Keep exact matching. Kimi uses prefix matching, but switching GLM to prefix\n// would newly classify vendor-aliased IDs as reasoning models. That is a\n// behavior change, not duplication cleanup.\nfunction isGlm52ReasoningModel(modelId: string): boolean {\n const lower = modelId.toLowerCase();\n return lower === 'glm-5.2'\n || lower === 'z-ai/glm-5.2'\n || lower === 'zai/glm-5.2'\n || lower === 'zai-org/glm-5.2'\n || lower === 'zai-org/glm5.2'\n || lower === 'glm5.2';\n}\n\nfunction toCamelCase(str: string): string {\n return str.replace(/[-_]([a-z])/g, (_, g) => g.toUpperCase());\n}\n\nfunction hasSupportedParameter(metadata: ReasoningMetadata | undefined, param: string): boolean {\n return (metadata?.supportedParameters ?? []).some(p => p === param);\n}\n\nfunction isOpenRouterRoute(npm: string, metadata?: ReasoningMetadata): boolean {\n return npm === '@openrouter/ai-sdk-provider'\n || metadata?.providerId === 'openrouter'\n || metadata?.apiBaseUrl?.includes('openrouter.ai') === true;\n}\n\nfunction openRouterReasoningCapabilities(metadata?: ReasoningMetadata): ReasoningCapabilities {\n if (metadata?.supportedParameters && !hasSupportedParameter(metadata, 'reasoning')) {\n return {\n ...EMPTY_REASONING,\n source: 'provider-metadata',\n confidence: 'documented',\n };\n }\n if (hasSupportedParameter(metadata, 'reasoning')) {\n return {\n levels: [...OPENROUTER_EFFORT_LEVELS],\n defaultLevel: 'medium',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'provider-metadata',\n confidence: 'documented',\n wireFormat: { kind: 'openrouter-reasoning' },\n };\n }\n if (metadata?.reasoning) {\n return {\n ...EMPTY_REASONING,\n mode: 'internal-only',\n source: 'model-metadata',\n confidence: 'inferred',\n };\n }\n return EMPTY_REASONING;\n}\n\nfunction mapCodexEffortToDeepSeek(effort: string): 'high' | 'max' | 'off' | undefined {\n switch (effort) {\n case 'off':\n case 'none':\n return 'off';\n case 'low':\n case 'medium':\n case 'high':\n return 'high';\n case 'xhigh':\n case 'max':\n return 'max';\n default:\n if (effort === 'high' || effort === 'max') return effort;\n return undefined;\n }\n}\n\n/** DeepSeek thinking toggle spreads via provider id keys on @ai-sdk/openai-compatible. */\nfunction deepSeekEffortProviderOptions(\n effort: string,\n): Record<string, Record<string, unknown>> | undefined {\n const mapped = mapCodexEffortToDeepSeek(effort);\n if (!mapped) return undefined;\n const thinking = { type: mapped === 'off' ? 'disabled' : 'enabled' };\n const spread = { thinking };\n if (mapped === 'off') {\n return {\n deepseek: spread,\n openaiCompatible: spread,\n };\n }\n return {\n openaiCompatible: { reasoningEffort: mapped, ...spread },\n deepseek: spread,\n };\n}\n\nfunction mapCodexEffortToAnthropic(effort: string): string | undefined {\n switch (effort) {\n case 'none':\n case 'minimal':\n case 'low':\n return 'low';\n case 'medium':\n return 'medium';\n case 'high':\n case 'xhigh':\n case 'max':\n return effort === 'xhigh' ? 'high' : effort === 'max' ? 'max' : 'high';\n default:\n if (ANTHROPIC_EFFORT_LEVELS.includes(effort as typeof ANTHROPIC_EFFORT_LEVELS[number])) {\n return effort;\n }\n return undefined;\n }\n}\n\ninterface OpenAiReasoningProfile {\n levels: readonly string[];\n defaultLevel: string;\n}\n\n/**\n * Reasoning-effort profile per **exact** OpenAI model id.\n *\n * Sourced from developers.openai.com model pages (verified 2026-08-14) rather\n * than the installed `@ai-sdk/openai` docs, which still describe `xhigh` as\n * GPT-5.1-Codex-Max-only and are behind the API.\n *\n * Matching is deliberately exact, not prefix-based. A named descendant is a\n * different model with a different effort set — `gpt-5.5-pro` drops `none`/`low`\n * and defaults to `high`, `gpt-5.2-codex` drops `none`, and\n * `gpt-5.2-chat-latest` has no reasoning at all. Letting `gpt-5.5` classify\n * every `gpt-5.5-*` id would advertise values OpenAI rejects. The only alias\n * treated as the same model is a dated snapshot suffix.\n *\n * Unlisted reasoning models fall back to OPENAI_EFFORT_LEVELS, which\n * under-offers rather than sending a value the model may reject. Add entries\n * only with a documented source; re-check when new models ship.\n */\nconst OPENAI_MODEL_REASONING: Readonly<Record<string, OpenAiReasoningProfile>> = {\n 'gpt-5-pro': { levels: ['high'], defaultLevel: 'high' },\n 'gpt-5.1': { levels: ['none', 'low', 'medium', 'high'], defaultLevel: 'none' },\n 'gpt-5.1-codex-max': { levels: ['low', 'medium', 'high', 'xhigh'], defaultLevel: 'medium' },\n 'gpt-5.2': { levels: ['none', 'low', 'medium', 'high', 'xhigh'], defaultLevel: 'none' },\n 'gpt-5.2-codex': { levels: ['low', 'medium', 'high', 'xhigh'], defaultLevel: 'medium' },\n 'gpt-5.2-pro': { levels: ['medium', 'high', 'xhigh'], defaultLevel: 'medium' },\n 'gpt-5.3-codex': { levels: ['low', 'medium', 'high', 'xhigh'], defaultLevel: 'medium' },\n 'gpt-5.4': { levels: ['none', 'low', 'medium', 'high', 'xhigh'], defaultLevel: 'none' },\n 'gpt-5.4-mini': { levels: ['none', 'low', 'medium', 'high', 'xhigh'], defaultLevel: 'none' },\n 'gpt-5.4-nano': { levels: ['none', 'low', 'medium', 'high', 'xhigh'], defaultLevel: 'none' },\n 'gpt-5.4-pro': { levels: ['medium', 'high', 'xhigh'], defaultLevel: 'medium' },\n 'gpt-5.5': { levels: ['none', 'low', 'medium', 'high', 'xhigh'], defaultLevel: 'medium' },\n 'gpt-5.5-pro': { levels: ['medium', 'high', 'xhigh'], defaultLevel: 'high' },\n 'gpt-5.6': { levels: ['none', 'low', 'medium', 'high', 'xhigh', 'max'], defaultLevel: 'medium' },\n 'gpt-5.6-luna': { levels: ['none', 'low', 'medium', 'high', 'xhigh', 'max'], defaultLevel: 'medium' },\n 'gpt-5.6-sol': { levels: ['none', 'low', 'medium', 'high', 'xhigh', 'max'], defaultLevel: 'medium' },\n 'gpt-5.6-terra': { levels: ['none', 'low', 'medium', 'high', 'xhigh', 'max'], defaultLevel: 'medium' },\n};\n\n/**\n * Chat-tuned ids documented as having no reasoning-effort support at all.\n *\n * This overrides `metadata.reasoning`: the bundled models.dev cache marks some\n * of these as reasoning-capable, and trusting it would advertise (and send) an\n * effort OpenAI rejects for the model.\n */\nconst OPENAI_NON_REASONING_MODELS = new Set([\n 'chat-latest',\n 'gpt-5-chat-latest',\n 'gpt-5.1-chat-latest',\n 'gpt-5.2-chat-latest',\n 'gpt-5.3-chat-latest',\n]);\n\n/** `gpt-5.5-2026-04-23` is the same model as `gpt-5.5`; `gpt-5.5-pro` is not. */\nconst OPENAI_DATED_SNAPSHOT_SUFFIX = /-\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * The id capabilities are decided by: what actually goes on the wire.\n *\n * Catalog ids can be aliases (`gpt-5.5-fast` → `gpt-5.5`), so classifying by\n * the local id would give an alias the wrong — or no — profile, and Codex would\n * then rewrite a valid saved `xhigh` down to the fallback default.\n */\nfunction canonicalOpenAiModelId(modelId: string | undefined, metadata?: ReasoningMetadata): string {\n return (metadata?.upstreamModelId ?? modelId ?? '').toLowerCase();\n}\n\n/** The documented profile for a model, or undefined when it isn't listed. */\nfunction openAiReasoningProfile(modelId: string | undefined, metadata?: ReasoningMetadata): OpenAiReasoningProfile | undefined {\n const id = canonicalOpenAiModelId(modelId, metadata);\n if (!id) return undefined;\n return OPENAI_MODEL_REASONING[id]\n ?? OPENAI_MODEL_REASONING[id.replace(OPENAI_DATED_SNAPSHOT_SUFFIX, '')];\n}\n\n/**\n * Does this OpenAI model reason at all? Shared by the capability table and the\n * request mapper so they cannot disagree — otherwise the mapper happily builds\n * a `reasoning_effort` for a chat model the catalog reports as non-reasoning.\n * Deliberately free of any call back into `getReasoningCapabilities`, which\n * filters its levels *through* the mapper.\n */\nfunction openAiModelReasons(modelId: string, metadata?: ReasoningMetadata): boolean {\n const id = canonicalOpenAiModelId(modelId, metadata);\n if (OPENAI_NON_REASONING_MODELS.has(id.replace(OPENAI_DATED_SNAPSHOT_SUFFIX, ''))) return false;\n return !!openAiReasoningProfile(modelId, metadata) || modelPrefersResponsesApi(id) || !!metadata?.reasoning;\n}\n\n/**\n * First-party OpenAI/Azure: the value is sent verbatim when the model documents\n * it, and omitted otherwise. Never substituted — collapsing `xhigh` to `high`\n * silently sent a weaker level than the caller asked for, and sending `xhigh`\n * to a model without it is an upstream 400.\n */\nfunction mapCodexEffortToOpenAI(effort: string, allowed: readonly string[]): string | undefined {\n return allowed.includes(effort) ? effort : undefined;\n}\n\n/** Legacy nearest-value mapping, still used by metadata-inferred routes. */\nfunction mapCodexEffortToOpenAICompatible(effort: string): string | undefined {\n if (effort === 'xhigh') return 'high';\n const allowed = ['low', 'medium', 'high'];\n return allowed.includes(effort) ? effort : undefined;\n}\n\nfunction mapCodexEffortToGlm52(effort: string): 'high' | 'max' | undefined {\n switch (effort) {\n case 'high':\n return 'high';\n case 'xhigh':\n case 'max':\n return 'max';\n default:\n return undefined;\n }\n}\n\n/** `supportsMedium` is true only for the Responses transport — see XAI_*_EFFORT_LEVELS. */\nfunction mapCodexEffortToXai(effort: string, supportsMedium: boolean): string | undefined {\n switch (effort) {\n case 'low':\n return 'low';\n case 'medium':\n // Chat has no 'medium'; returning 'low' there would be a silent downgrade.\n return supportsMedium ? 'medium' : undefined;\n case 'high':\n case 'xhigh':\n case 'max':\n return 'high';\n default:\n return undefined; // none/minimal have no xAI equivalent\n }\n}\n\nfunction mapCodexEffortToGeminiLevel(effort: string): 'low' | 'medium' | 'high' | undefined {\n switch (effort) {\n case 'none':\n case 'minimal':\n case 'low':\n return 'low';\n case 'medium':\n return 'medium';\n case 'high':\n case 'xhigh':\n case 'max':\n return 'high';\n default:\n return GEMINI_EFFORT_LEVELS.includes(effort as typeof GEMINI_EFFORT_LEVELS[number])\n ? effort as 'low' | 'medium' | 'high'\n : undefined;\n }\n}\n\nfunction mapCodexEffortToGeminiBudget(effort: string): number | undefined {\n const direct = GEMINI_25_BUDGETS[effort];\n if (direct !== undefined) return direct > 0 ? direct : undefined;\n const level = mapCodexEffortToGeminiLevel(effort);\n if (!level) return undefined;\n return GEMINI_25_BUDGETS[level];\n}\n\n/**\n * Keep the advertised levels and the actual request mapping in lockstep.\n *\n * The capability table dispatches largely on *model id* while\n * `effortProviderOptions` dispatches on the SDK *package*, so the two used to\n * disagree — e.g. GLM/DeepSeek/Kimi ids served through `@ai-sdk/alibaba`\n * advertised levels that mapped to nothing, and xAI advertised a `none` its API\n * has no value for. Filtering the advertised list through the mapper makes that\n * class of drift impossible rather than merely fixed once.\n */\nfunction withMappableLevels(\n caps: ReasoningCapabilities,\n npm: string,\n modelId: string,\n metadata?: ReasoningMetadata,\n): ReasoningCapabilities {\n if (caps.mode !== 'controllable') return caps;\n // Keep a level only if it maps to a request at all, *and* to one no\n // lower-ranked level already produces. Two levels that send identical bytes\n // are one level with two names — offering both means the weaker-sounding\n // choice silently wins, which is the substitution this contract forbids.\n const seen = new Set<string>();\n const levels = caps.levels.filter(level => {\n const mapped = effortProviderOptions(npm, level, modelId, metadata);\n if (mapped === undefined) return false;\n const wire = JSON.stringify(mapped);\n if (seen.has(wire)) return false;\n seen.add(wire);\n return true;\n });\n if (levels.length === caps.levels.length) return caps;\n if (levels.length === 0) {\n // Reasons, but nothing about it can actually be set from here.\n return { ...caps, levels: [], defaultLevel: '', mode: 'internal-only' };\n }\n return {\n ...caps,\n levels,\n defaultLevel: levels.includes(caps.defaultLevel) ? caps.defaultLevel : levels[levels.length - 1]!,\n };\n}\n\n/** Per-model reasoning UI + wire metadata for Codex catalog and adapters. */\nexport function getReasoningCapabilities(\n npm: string,\n modelId: string,\n metadata?: ReasoningMetadata,\n): ReasoningCapabilities {\n return withMappableLevels(resolveRawReasoningCapabilities(npm, modelId, metadata), npm, modelId, metadata);\n}\n\nfunction resolveRawReasoningCapabilities(\n npm: string,\n modelId: string,\n metadata?: ReasoningMetadata,\n): ReasoningCapabilities {\n const id = modelId.toLowerCase();\n\n if (isOpenRouterRoute(npm, metadata)) {\n return openRouterReasoningCapabilities(metadata);\n }\n\n if (npm === '@ai-sdk/anthropic' || id.startsWith('claude-')) {\n const isClaude = isClaudeReasoningModel(modelId);\n if (isClaude || metadata?.reasoning) {\n return {\n levels: [...ANTHROPIC_EFFORT_LEVELS],\n defaultLevel: 'high',\n supportsSummaries: true,\n mode: 'controllable',\n source: isClaude ? 'provider-rule' : 'model-metadata',\n confidence: isClaude ? 'documented' : 'inferred',\n wireFormat: { kind: 'anthropic-thinking' },\n };\n }\n return EMPTY_REASONING;\n }\n\n if (npm === '@ai-sdk/openai' || npm === '@ai-sdk/azure') {\n // Everything below keys off the id that actually reaches OpenAI, not a\n // local catalog alias.\n const canonicalId = canonicalOpenAiModelId(modelId, metadata);\n const profile = openAiReasoningProfile(modelId, metadata);\n const prefersResponses = modelPrefersResponsesApi(canonicalId);\n // Two separate questions: does this model reason at all, and can this\n // transport carry `reasoning_effort`? Only the Responses endpoint can, and\n // that decision has to match the one the model factory actually makes.\n if (openAiModelReasons(modelId, metadata) && shouldUseOpenAiResponsesEndpoint(canonicalId)) {\n const levels = profile?.levels ?? [...OPENAI_EFFORT_LEVELS];\n return {\n levels: [...levels],\n defaultLevel: profile?.defaultLevel\n ?? (levels.includes('medium') ? 'medium' : levels[levels.length - 1]!),\n supportsSummaries: true,\n source: profile || prefersResponses ? 'provider-rule' : 'model-metadata',\n confidence: profile || prefersResponses ? 'documented' : 'inferred',\n mode: 'controllable',\n wireFormat: { kind: 'openai-reasoning-effort' },\n };\n }\n return EMPTY_REASONING;\n }\n\n if (npm === '@ai-sdk/google' || id.startsWith('gemini-')) {\n if (isGeminiReasoningModel(modelId)) {\n return {\n levels: [...GEMINI_EFFORT_LEVELS],\n defaultLevel: 'medium',\n supportsSummaries: true,\n mode: 'controllable',\n source: 'provider-rule',\n confidence: 'documented',\n wireFormat: { kind: 'google-thinking-config' },\n };\n }\n return EMPTY_REASONING;\n }\n\n if (npm === '@ai-sdk/mistral') {\n if (isMistralReasoningModel(modelId)) {\n return {\n levels: [...MISTRAL_EFFORT_LEVELS],\n defaultLevel: 'high',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'provider-rule',\n confidence: 'documented',\n wireFormat: { kind: 'mistral-reasoning-effort' },\n };\n }\n return EMPTY_REASONING;\n }\n\n if (npm === '@ai-sdk/xai') {\n if (isXaiReasoningEffortModel(modelId)) {\n const levels = modelPrefersResponsesApi(modelId)\n ? [...XAI_RESPONSES_EFFORT_LEVELS]\n : [...XAI_CHAT_EFFORT_LEVELS];\n return {\n levels,\n defaultLevel: xaiDefaultReasoningEffort(modelId),\n supportsSummaries: true,\n mode: 'controllable',\n source: 'provider-rule',\n confidence: 'documented',\n wireFormat: { kind: 'openai-reasoning-effort' },\n };\n }\n return EMPTY_REASONING;\n }\n\n if (isDeepSeekReasoningModel(modelId)) {\n return {\n levels: [...DEEPSEEK_EFFORT_LEVELS],\n defaultLevel: 'high',\n supportsSummaries: true,\n mode: 'controllable',\n source: 'provider-rule',\n confidence: 'documented',\n wireFormat: { kind: 'deepseek-thinking' },\n };\n }\n\n if (isKimiReasoningModel(modelId)) {\n return {\n levels: [...OPENAI_EFFORT_LEVELS],\n defaultLevel: 'high',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'provider-rule',\n confidence: 'documented',\n wireFormat: { kind: 'openai-reasoning-effort' },\n };\n }\n\n if (isGlm52ReasoningModel(modelId)) {\n return {\n levels: [...GLM_52_EFFORT_LEVELS],\n defaultLevel: 'high',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'provider-rule',\n confidence: 'documented',\n wireFormat: { kind: 'openai-reasoning-effort' },\n };\n }\n\n if (hasSupportedParameter(metadata, 'reasoning_effort')) {\n return {\n levels: ['low', 'medium', 'high', 'xhigh'],\n defaultLevel: 'medium',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'provider-metadata',\n confidence: 'documented',\n wireFormat: { kind: 'openai-reasoning-effort' },\n };\n }\n\n if (hasSupportedParameter(metadata, 'reasoning')) {\n return {\n levels: [...OPENROUTER_EFFORT_LEVELS],\n defaultLevel: 'medium',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'provider-metadata',\n confidence: 'documented',\n wireFormat: { kind: 'openrouter-reasoning' },\n };\n }\n\n if (metadata?.reasoning) {\n return {\n levels: ['low', 'medium', 'high'],\n defaultLevel: 'medium',\n supportsSummaries: false,\n mode: 'controllable',\n source: 'model-metadata',\n confidence: 'inferred',\n wireFormat: { kind: 'openai-reasoning-effort' },\n };\n }\n\n return EMPTY_REASONING;\n}\n\nexport function buildCodexReasoningLevels(\n capabilities: Pick<ReasoningCapabilities, 'levels'>,\n): Array<{ effort: string; description: string }> {\n return capabilities.levels.map(effort => ({\n effort,\n description: EFFORT_DESCRIPTIONS[effort] ?? effort,\n }));\n}\n\n/** Per-provider providerOptions for user-selected reasoning effort. */\nexport function effortProviderOptions(\n npm: string,\n effort?: string,\n modelId?: string,\n metadata?: ReasoningMetadata,\n): Record<string, Record<string, unknown>> | undefined {\n if (!effort) return undefined;\n\n if (isOpenRouterRoute(npm, metadata)) {\n const caps = openRouterReasoningCapabilities(metadata);\n if (caps.mode !== 'controllable') return undefined;\n const allowed = new Set(OPENROUTER_EFFORT_LEVELS);\n const mapped = allowed.has(effort as typeof OPENROUTER_EFFORT_LEVELS[number])\n ? effort\n : effort === 'max'\n ? 'xhigh'\n : undefined;\n return mapped\n ? { openrouter: { reasoning: { effort: mapped, exclude: false } } }\n : undefined;\n }\n\n if (npm === '@ai-sdk/openai' || npm === '@ai-sdk/azure') {\n // `reasoning_effort` only exists on the Responses transport — use the same\n // decision the model factory makes, not the narrower \"prefers responses\" —\n // and only for models that reason at all. Keyed on the upstream id so an\n // alias route gets its real model's levels.\n if (!modelId || !shouldUseOpenAiResponsesEndpoint(canonicalOpenAiModelId(modelId, metadata))) return undefined;\n if (!openAiModelReasons(modelId, metadata)) return undefined;\n const allowed = openAiReasoningProfile(modelId, metadata)?.levels ?? OPENAI_EFFORT_LEVELS;\n const reasoningEffort = mapCodexEffortToOpenAI(effort, allowed);\n return reasoningEffort ? { openai: { reasoningEffort } } : undefined;\n }\n\n if (npm === '@ai-sdk/xai') {\n if (!modelId || !isXaiReasoningEffortModel(modelId)) return undefined;\n const reasoningEffort = mapCodexEffortToXai(effort, modelPrefersResponsesApi(modelId));\n return reasoningEffort ? { xai: { reasoningEffort } } : undefined;\n }\n\n if (npm === '@ai-sdk/anthropic' || npm === VERTEX_ANTHROPIC_NPM) {\n if (!modelId || !isClaudeReasoningModel(modelId)) return undefined;\n const mapped = mapCodexEffortToAnthropic(effort);\n return mapped\n ? { anthropic: { thinking: { type: 'adaptive', effort: mapped } } }\n : undefined;\n }\n\n if (npm === '@ai-sdk/google') {\n const id = modelId ?? '';\n if (isGemini3Model(id)) {\n const thinkingLevel = mapCodexEffortToGeminiLevel(effort);\n return thinkingLevel\n ? { google: { thinkingConfig: { thinkingLevel, includeThoughts: true } } }\n : undefined;\n }\n const thinkingBudget = mapCodexEffortToGeminiBudget(effort);\n return thinkingBudget\n ? { google: { thinkingConfig: { thinkingBudget, includeThoughts: true } } }\n : undefined;\n }\n\n if (npm === '@ai-sdk/mistral') {\n if (!modelId || !isMistralReasoningModel(modelId)) return undefined;\n const reasoningEffort = effort === 'off' || effort === 'none' ? 'none' : 'high';\n return { mistral: { reasoningEffort } };\n }\n\n if (npm === '@ai-sdk/openai-compatible' || npm === '@ai-sdk/openai') {\n if (!modelId) return undefined;\n if (isDeepSeekReasoningModel(modelId)) {\n return deepSeekEffortProviderOptions(effort);\n }\n if (isKimiReasoningModel(modelId)) {\n const reasoningEffort = mapCodexEffortToOpenAICompatible(effort);\n if (reasoningEffort) {\n const key = metadata?.providerId ? toCamelCase(metadata.providerId) : 'openaiCompatible';\n return { [key]: { reasoningEffort } };\n }\n return undefined;\n }\n if (isGlm52ReasoningModel(modelId)) {\n const reasoningEffort = mapCodexEffortToGlm52(effort);\n if (reasoningEffort) {\n const key = metadata?.providerId ? toCamelCase(metadata.providerId) : 'openaiCompatible';\n return { [key]: { reasoningEffort } };\n }\n return undefined;\n }\n if (hasSupportedParameter(metadata, 'reasoning_effort')) {\n const reasoningEffort = mapCodexEffortToOpenAICompatible(effort);\n return reasoningEffort\n ? { openai: { reasoningEffort }, openaiCompatible: { reasoningEffort } }\n : undefined;\n }\n if (hasSupportedParameter(metadata, 'reasoning')) {\n const allowed = new Set(OPENROUTER_EFFORT_LEVELS);\n const mapped = allowed.has(effort as typeof OPENROUTER_EFFORT_LEVELS[number])\n ? effort\n : effort === 'max' ? 'xhigh' : undefined;\n return mapped\n ? { openrouter: { reasoning: { effort: mapped, exclude: false } } }\n : undefined;\n }\n return undefined;\n }\n\n return undefined;\n}\n\nexport function deepMergeProviderOptions(\n a?: Record<string, Record<string, unknown>>,\n b?: Record<string, Record<string, unknown>>,\n): Record<string, Record<string, unknown>> | undefined {\n if (!a && !b) return undefined;\n if (!a) return b;\n if (!b) return a;\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n const out: Record<string, Record<string, unknown>> = {};\n for (const key of keys) {\n out[key] = { ...(a[key] ?? {}), ...(b[key] ?? {}) };\n }\n return out;\n}\n\n/** Per-provider providerOptions to request reasoning/thinking output. */\nexport function thinkingProviderOptions(npm: string): Record<string, Record<string, unknown>> | undefined {\n if (npm === '@ai-sdk/google') {\n return { google: { thinkingConfig: { includeThoughts: true } } };\n }\n // Responses API: request encrypted reasoning blobs for multi-turn round-trip\n // (proxy owns conversation state — store:false + echo via thinking.signature).\n if (npm === '@ai-sdk/openai') {\n return {\n openai: {\n store: false,\n include: ['reasoning.encrypted_content'],\n },\n };\n }\n return undefined;\n}\n","// responses-websocket.ts — outbound WebSocket transport for OpenAI's Codex\n// \"Responses-Lite\" protocol (wss://chatgpt.com/backend-api/codex/responses).\n//\n// Some ChatGPT Codex models (flagged by the backend with prefer_websockets,\n// e.g. gpt-5.6-luna) are only served over a WebSocket Responses transport, not\n// the HTTP Responses endpoint. This module returns a `fetch` implementation that\n// the Vercel AI SDK's OpenAI provider uses transparently: the SDK still calls\n// `fetch(url, init)` once per request, but instead of an HTTP POST we open one\n// WebSocket per request, send the Responses payload as the first message, and\n// stream the JSON event frames back as Server-Sent Events the SDK already parses.\n//\n// One socket per request → responses are never crossed between concurrent\n// requests (e.g. Claude Code's parallel title-generation + main inference).\n\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport type { RawData, WebSocket as WsWebSocket } from 'ws';\nimport { CODEX_RESPONSES_WEBSOCKETS_BETA } from '../constants.js';\n\nconst RESPONSES_LITE_HEADER = 'x-openai-internal-codex-responses-lite';\n// Responses event types after which the stream is complete and the socket closes.\nconst TERMINAL_EVENT_TYPES = new Set(['response.completed', 'response.failed', 'response.incomplete', 'error']);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction recordKeys(value: unknown): string {\n return isRecord(value) ? Object.keys(value).sort().join(',') : '';\n}\n\n/** Sanitized one-line summary: types, keys, counts, lengths — never field values. */\nexport function summarizeResponsesLiteEvent(event: unknown): string {\n if (!isRecord(event)) return `kind=${event == null ? 'null' : typeof event}`;\n const parts = [`type=${typeof event.type === 'string' ? event.type : 'unknown'}`, `keys=${recordKeys(event)}`];\n if (typeof event.delta === 'string') parts.push(`deltaChars=${event.delta.length}`);\n if (typeof event.output_index === 'number') parts.push(`hasOutputIndex=1`);\n if (typeof event.item_id === 'string') parts.push(`hasItemId=1`);\n if (isRecord(event.item)) {\n parts.push(`itemType=${typeof event.item.type === 'string' ? event.item.type : 'unknown'}`);\n parts.push(`itemKeys=${recordKeys(event.item)}`);\n if (typeof event.item.arguments === 'string') parts.push(`argumentsChars=${event.item.arguments.length}`);\n }\n if (isRecord(event.response)) {\n parts.push(`responseKeys=${recordKeys(event.response)}`);\n if (Array.isArray(event.response.output)) {\n parts.push(`outputCount=${event.response.output.length}`);\n parts.push(`outputTypes=${event.response.output.map(item => (isRecord(item) && typeof item.type === 'string' ? item.type : 'unknown')).join(',')}`);\n }\n if (isRecord(event.response.usage)) parts.push(`usageKeys=${recordKeys(event.response.usage)}`);\n if (typeof event.response.status === 'string') parts.push(`status=${event.response.status}`);\n }\n if (isRecord(event.error)) {\n parts.push(`errorKeys=${recordKeys(event.error)}`);\n if (typeof event.error.message === 'string') parts.push(`messageChars=${event.error.message.length}`);\n }\n return parts.join(' ');\n}\n\n/**\n * Durable per-function-call state. Responses-Lite frames routinely omit `id`,\n * `arguments` and `status`, and can omit `item_id`/`output_index` on deltas —\n * so identity and accumulated arguments have to live here rather than being\n * re-derived from each frame in isolation.\n */\ninterface FunctionCallState {\n /** Stable item id reused across added → delta → done for this one call. */\n itemId: string;\n callId: string;\n name: string;\n /** Argument deltas appended in arrival order. */\n args: string;\n /** `arguments` as sent on an authoritative (done / completed.output) frame. */\n upstreamArgs?: string;\n /** Complete upstream item fields, merged across every frame that carried them. */\n upstream: Record<string, unknown>;\n outputIndex: number;\n /** An `output_item.added` has been emitted downstream for this call. */\n added: boolean;\n /** An argument delta has been forwarded downstream for this call. */\n deltaForwarded: boolean;\n /** Upstream sent an `output_item.done` for this call (even an incomplete one). */\n doneSeen: boolean;\n /** An authoritative `output_item.done` has been emitted downstream. */\n done: boolean;\n}\n\nexport interface ResponsesLiteNormalizeState {\n nextId: number;\n lastMessageItemId?: string;\n lastOutputIndex: number;\n textDeltaForwarded: boolean;\n messageAddedIds: Set<string>;\n messageDoneIds: Set<string>;\n functionCalls: FunctionCallState[];\n /** Last function call touched — the only anchor a delta with no identity has. */\n lastFunctionCall?: FunctionCallState;\n}\n\nexport function createResponsesLiteNormalizeState(): ResponsesLiteNormalizeState {\n return {\n nextId: 1,\n lastOutputIndex: 0,\n textDeltaForwarded: false,\n messageAddedIds: new Set(),\n messageDoneIds: new Set(),\n functionCalls: [],\n };\n}\n\nfunction nextId(state: ResponsesLiteNormalizeState, prefix: string): string {\n const id = `${prefix}_${state.nextId}`;\n state.nextId += 1;\n return id;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction normalizeErrorEvent(event: Record<string, unknown>): Record<string, unknown> {\n const raw = isRecord(event.error) ? event.error : { message: typeof event.error === 'string' ? event.error : 'upstream error' };\n return {\n type: 'error',\n sequence_number: typeof event.sequence_number === 'number' ? event.sequence_number : 0,\n error: {\n type: asString(raw.type) ?? 'server_error',\n code: asString(raw.code) ?? 'unknown',\n message: asString(raw.message) ?? 'upstream error',\n ...(raw.param == null ? {} : { param: raw.param }),\n },\n };\n}\n\ninterface FunctionCallHint {\n itemId?: string;\n callId?: string;\n outputIndex?: number;\n}\n\n/**\n * Find the call a frame belongs to, or start tracking a new one.\n *\n * Identity is checked strongest-first (`call_id`, then item id, then output\n * index). A frame carrying no identity at all belongs to the most recently\n * touched call. An output-index match is rejected when both sides know a\n * *different* `call_id`, so two calls can never merge.\n */\nfunction resolveFunctionCall(state: ResponsesLiteNormalizeState, hint: FunctionCallHint): FunctionCallState {\n if (hint.callId) {\n const byCallId = state.functionCalls.find(entry => entry.callId === hint.callId);\n if (byCallId) return byCallId;\n }\n if (hint.itemId) {\n const byItemId = state.functionCalls.find(entry => entry.itemId === hint.itemId);\n if (byItemId) return byItemId;\n }\n if (hint.outputIndex !== undefined) {\n // An index can be reused across sequential calls, so it identifies at most\n // the call *currently open* at that index. Search newest-first and prefer a\n // call that has not completed — matching the oldest entry would send a\n // second call's argument deltas to the first one.\n const open = [...state.functionCalls].reverse().find(entry => (\n entry.outputIndex === hint.outputIndex\n && !entry.done\n && !(hint.callId && entry.callId !== hint.callId)\n ));\n if (open) return open;\n }\n if (hint.callId === undefined && hint.itemId === undefined && hint.outputIndex === undefined && state.lastFunctionCall) {\n return state.lastFunctionCall;\n }\n const entry: FunctionCallState = {\n itemId: hint.itemId ?? nextId(state, 'fc'),\n callId: hint.callId ?? hint.itemId ?? nextId(state, 'call'),\n name: '',\n args: '',\n upstream: {},\n outputIndex: hint.outputIndex ?? state.lastOutputIndex,\n added: false,\n deltaForwarded: false,\n doneSeen: false,\n done: false,\n };\n state.functionCalls.push(entry);\n return entry;\n}\n\n/** Fold whatever this frame's item did carry into the call's durable state. */\nfunction absorbFunctionItem(entry: FunctionCallState, item: Record<string, unknown>, authoritative: boolean): void {\n entry.upstream = { ...entry.upstream, ...item };\n const name = asString(item.name);\n if (name) entry.name = name;\n const callId = asString(item.call_id);\n if (callId) entry.callId = callId;\n // `added` carries `arguments: ''` as a placeholder — only done/completed items\n // are authoritative about the final argument string.\n if (authoritative && typeof item.arguments === 'string') entry.upstreamArgs = item.arguments;\n}\n\n/** The argument string to complete this call with, or undefined if unknowable. */\nfunction resolveFunctionArgs(entry: FunctionCallState): string | undefined {\n if (entry.upstreamArgs) return entry.upstreamArgs;\n if (entry.args) return entry.args;\n return entry.upstreamArgs;\n}\n\nfunction functionItemPayload(entry: FunctionCallState, extra: Record<string, unknown>): Record<string, unknown> {\n return {\n ...entry.upstream,\n type: 'function_call',\n id: entry.itemId,\n call_id: entry.callId,\n name: entry.name,\n ...extra,\n };\n}\n\nfunction functionAddedEvent(entry: FunctionCallState): Record<string, unknown> {\n entry.added = true;\n return {\n type: 'response.output_item.added',\n output_index: entry.outputIndex,\n item: functionItemPayload(entry, { arguments: '' }),\n };\n}\n\nfunction functionDoneEvent(entry: FunctionCallState, args: string): Record<string, unknown> {\n entry.done = true;\n return {\n type: 'response.output_item.done',\n output_index: entry.outputIndex,\n item: functionItemPayload(entry, { arguments: args, status: 'completed' }),\n };\n}\n\n/**\n * Emit the added/delta/done triplet a call still owes, using its retained\n * identity and arguments. Returns nothing when the call is already complete —\n * that is what keeps `response.completed` recovery from duplicating a tool call.\n */\nfunction completeFunctionCall(entry: FunctionCallState, args: string): unknown[] {\n if (entry.done) return [];\n const events: unknown[] = [];\n if (!entry.added) events.push(functionAddedEvent(entry));\n if (!entry.deltaForwarded && args.length > 0) {\n entry.deltaForwarded = true;\n events.push({\n type: 'response.function_call_arguments.delta',\n item_id: entry.itemId,\n output_index: entry.outputIndex,\n delta: args,\n });\n }\n events.push(functionDoneEvent(entry, args));\n return events;\n}\n\nfunction messageText(item: Record<string, unknown>): string {\n if (typeof item.text === 'string') return item.text;\n if (!Array.isArray(item.content)) return '';\n let out = '';\n for (const part of item.content) {\n if (isRecord(part) && typeof part.text === 'string' && (part.type === 'output_text' || part.type === 'text')) {\n out += part.text;\n }\n }\n return out;\n}\n\nfunction synthesizeMessage(item: Record<string, unknown>, outputIndex: number, state: ResponsesLiteNormalizeState): unknown[] {\n const text = messageText(item);\n if (!text) return [];\n const id = asString(item.id) ?? nextId(state, 'msg');\n state.lastMessageItemId = id;\n state.textDeltaForwarded = true;\n state.messageAddedIds.add(id);\n state.messageDoneIds.add(id);\n return [\n { type: 'response.output_item.added', output_index: outputIndex, item: { type: 'message', id } },\n { type: 'response.output_text.delta', item_id: id, delta: text },\n { type: 'response.output_item.done', output_index: outputIndex, item: { type: 'message', id } },\n ];\n}\n\nfunction synthesizeFunctionCall(item: Record<string, unknown>, outputIndex: number, state: ResponsesLiteNormalizeState): unknown[] {\n const entry = resolveFunctionCall(state, {\n itemId: asString(item.id),\n callId: asString(item.call_id),\n outputIndex,\n });\n absorbFunctionItem(entry, item, true);\n state.lastFunctionCall = entry;\n state.lastOutputIndex = entry.outputIndex;\n const args = resolveFunctionArgs(entry);\n if (args === undefined) {\n // `completed.output` is authoritative for identity but still omitted the\n // arguments. Defaulting to `\"\"` here would fabricate the very call the\n // deferral path exists to avoid — mark it seen so it is reported instead.\n entry.doneSeen = true;\n return [];\n }\n return completeFunctionCall(entry, args);\n}\n\nfunction recoverFromCompletedOutput(response: Record<string, unknown>, state: ResponsesLiteNormalizeState): unknown[] {\n const recovered: unknown[] = [];\n if (Array.isArray(response.output)) {\n response.output.forEach((item, index) => {\n if (!isRecord(item) || typeof item.type !== 'string') return;\n if (item.type === 'message' && !state.textDeltaForwarded) {\n recovered.push(...synthesizeMessage(item, index, state));\n } else if (item.type === 'function_call') {\n recovered.push(...synthesizeFunctionCall(item, index, state));\n }\n });\n }\n // Upstream said these calls were done but never supplied arguments, and\n // `response.completed` did not repeat them either. There is no honest\n // completion available: `arguments: \"\"` is not valid JSON and would recreate\n // the empty-argument tool call this normalization exists to prevent. Report\n // the malformed stream instead of inventing one.\n for (const entry of state.functionCalls) {\n if (entry.done || !entry.doneSeen) continue;\n recovered.push(normalizeErrorEvent({\n error: {\n type: 'invalid_response',\n code: 'incomplete_function_call',\n message: `Provider ended the response without arguments for function call \"${entry.callId}\"`\n + `${entry.name ? ` (${entry.name})` : ''}.`,\n },\n }));\n }\n return recovered;\n}\n\n/**\n * Fill fields `@ai-sdk/openai` requires and recover final output that only\n * exists on `response.completed`. Incomplete frames otherwise become\n * `unknown_chunk` and are dropped while usage still parses — the production\n * \"empty response after N calls\" shape.\n */\nexport function normalizeResponsesLiteEvent(event: unknown, state: ResponsesLiteNormalizeState): unknown[] {\n if (!isRecord(event) || typeof event.type !== 'string') return [event];\n\n if (event.type === 'error') return [normalizeErrorEvent(event)];\n\n if (event.type === 'response.output_item.added' && isRecord(event.item)) {\n const outputIndex = typeof event.output_index === 'number' ? event.output_index : state.lastOutputIndex;\n state.lastOutputIndex = outputIndex;\n if (event.item.type === 'message') {\n const id = asString(event.item.id) ?? nextId(state, 'msg');\n state.lastMessageItemId = id;\n state.messageAddedIds.add(id);\n return [{ ...event, output_index: outputIndex, item: { ...event.item, id } }];\n }\n if (event.item.type === 'function_call') {\n const entry = resolveFunctionCall(state, {\n itemId: asString(event.item.id),\n callId: asString(event.item.call_id),\n outputIndex,\n });\n absorbFunctionItem(entry, event.item, false);\n entry.outputIndex = outputIndex;\n entry.added = true;\n state.lastFunctionCall = entry;\n return [{ ...event, output_index: outputIndex, item: functionItemPayload(entry, { arguments: '' }) }];\n }\n return [{ ...event, output_index: outputIndex }];\n }\n\n if (event.type === 'response.output_item.done' && isRecord(event.item)) {\n const outputIndex = typeof event.output_index === 'number' ? event.output_index : state.lastOutputIndex;\n if (event.item.type === 'function_call') {\n const entry = resolveFunctionCall(state, {\n itemId: asString(event.item.id),\n callId: asString(event.item.call_id),\n outputIndex,\n });\n absorbFunctionItem(entry, event.item, true);\n entry.outputIndex = outputIndex;\n entry.doneSeen = true;\n state.lastFunctionCall = entry;\n state.lastOutputIndex = outputIndex;\n const args = resolveFunctionArgs(entry);\n // Nothing to complete with, and no name to complete under: defer to the\n // authoritative `response.completed.output` instead of fabricating a call.\n if (args === undefined || !entry.name) return [];\n if (entry.done) return [];\n const events: unknown[] = [];\n if (!entry.added) events.push(functionAddedEvent(entry));\n events.push({ ...event, output_index: outputIndex, item: functionItemPayload(entry, { arguments: args, status: 'completed' }) });\n entry.done = true;\n return events;\n }\n if (event.item.type === 'message') {\n const id = asString(event.item.id) ?? state.lastMessageItemId ?? nextId(state, 'msg');\n state.lastMessageItemId = id;\n state.messageDoneIds.add(id);\n return [{ ...event, output_index: outputIndex, item: { ...event.item, id } }];\n }\n return [{ ...event, output_index: outputIndex }];\n }\n\n if (event.type === 'response.output_text.delta') {\n const itemId = asString(event.item_id) ?? state.lastMessageItemId ?? nextId(state, 'msg');\n state.lastMessageItemId = itemId;\n state.textDeltaForwarded = true;\n const events: unknown[] = [];\n if (!state.messageAddedIds.has(itemId)) {\n events.push({\n type: 'response.output_item.added',\n output_index: state.lastOutputIndex,\n item: { type: 'message', id: itemId },\n });\n state.messageAddedIds.add(itemId);\n }\n events.push({ ...event, item_id: itemId, delta: typeof event.delta === 'string' ? event.delta : '' });\n return events;\n }\n\n if (event.type === 'response.function_call_arguments.delta') {\n const entry = resolveFunctionCall(state, {\n itemId: asString(event.item_id),\n outputIndex: typeof event.output_index === 'number' ? event.output_index : undefined,\n });\n const delta = typeof event.delta === 'string' ? event.delta : '';\n entry.args += delta;\n entry.deltaForwarded = true;\n state.lastFunctionCall = entry;\n state.lastOutputIndex = entry.outputIndex;\n return [{ ...event, item_id: entry.itemId, output_index: entry.outputIndex, delta }];\n }\n\n if (event.type === 'response.completed' || event.type === 'response.incomplete') {\n const response = isRecord(event.response) ? event.response : {};\n const recovered = recoverFromCompletedOutput(response, state);\n if (state.lastMessageItemId && state.textDeltaForwarded && !state.messageDoneIds.has(state.lastMessageItemId)) {\n recovered.push({\n type: 'response.output_item.done',\n output_index: state.lastOutputIndex,\n item: { type: 'message', id: state.lastMessageItemId },\n });\n state.messageDoneIds.add(state.lastMessageItemId);\n }\n return [...recovered, event];\n }\n\n return [event];\n}\n\n/** Normalize the SDK's HeadersInit into a plain lowercased-key record for `ws`. */\nfunction toHeaderRecord(headers: HeadersInit | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n if (!headers) return out;\n if (headers instanceof Headers) {\n headers.forEach((value, key) => { out[key] = value; });\n } else if (Array.isArray(headers)) {\n for (const [key, value] of headers) out[key] = value;\n } else {\n for (const [key, value] of Object.entries(headers)) out[key] = String(value);\n }\n return out;\n}\n\nfunction hasResponsesLiteHeader(headers: Record<string, string>): boolean {\n return Object.entries(headers).some(\n ([k, v]) => k.toLowerCase() === RESPONSES_LITE_HEADER && v.toLowerCase() === 'true',\n );\n}\n\n/** Extract the request body as a string (the SDK sends a JSON string). */\nfunction bodyToString(body: BodyInit | null | undefined): string {\n if (body == null) return '';\n if (typeof body === 'string') return body;\n if (body instanceof Uint8Array) return Buffer.from(body).toString('utf8');\n if (body instanceof ArrayBuffer) return Buffer.from(new Uint8Array(body)).toString('utf8');\n return String(body);\n}\n\n/**\n * Apply the Responses-Lite request shape to the outgoing payload. These fields\n * are set on the wire (not via SDK providerOptions) so the transport fully owns\n * the Luna request shape. Adjust here if live traffic shows different field names.\n */\nfunction applyResponsesLiteShape(payload: Record<string, unknown>): Record<string, unknown> {\n const reasoning = (payload.reasoning && typeof payload.reasoning === 'object')\n ? { ...(payload.reasoning as Record<string, unknown>) }\n : {};\n reasoning.context = 'all_turns';\n return {\n ...payload,\n reasoning,\n parallel_tool_calls: false,\n store: false,\n };\n}\n\n/**\n * Build a `fetch` that speaks the Codex Responses-Lite WebSocket protocol.\n * @param wsUrl e.g. wss://chatgpt.com/backend-api/codex/responses\n * @param log optional debug logger (wired to the proxy trace log under --trace)\n */\nexport function createResponsesWebSocketFetch(wsUrl: string, log?: (msg: string) => void): FetchFunction {\n const debug = (msg: string) => { try { log?.(`ws: ${msg}`); } catch { /* ignore */ } };\n return async (_input, init): Promise<Response> => {\n const { WebSocket } = await import('ws');\n\n const headers = toHeaderRecord(init?.headers);\n headers['OpenAI-Beta'] = CODEX_RESPONSES_WEBSOCKETS_BETA;\n debug(`connecting ${wsUrl} headers=[${Object.keys(headers).join(', ')}]`);\n\n // Parse the SDK-built Responses body and, when this is a Responses-Lite\n // model, fold in the transport-specific request fields.\n let payload: Record<string, unknown> = {};\n try {\n payload = JSON.parse(bodyToString(init?.body)) as Record<string, unknown>;\n } catch {\n payload = {};\n }\n if (hasResponsesLiteHeader(headers)) {\n payload = applyResponsesLiteShape(payload);\n }\n debug(\n `request type=response.create keys=${Object.keys(payload).sort().join(',')} `\n + `toolCount=${Array.isArray(payload.tools) ? payload.tools.length : 0} `\n + `store=${String(payload.store)} parallelToolCalls=${String(payload.parallel_tool_calls)} `\n + `reasoningKeys=${recordKeys(payload.reasoning)}`,\n );\n // The Codex WS Responses protocol is internally tagged: the first (and only)\n // client message must be a `response.create` event carrying the Responses\n // body fields at the top level, alongside the type tag — not the raw body.\n // (See openai/codex `ResponsesWsRequest`, `#[serde(tag = \"type\")]`.)\n const outgoing = JSON.stringify({ type: 'response.create', ...payload });\n\n const encoder = new TextEncoder();\n let socket: WsWebSocket;\n let frameCount = 0;\n const normalizeState = createResponsesLiteNormalizeState();\n\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n try { controller.close(); } catch { /* already closed */ }\n try { socket.close(); } catch { /* ignore */ }\n };\n const fail = (message: string) => {\n if (closed) return;\n debug(`fail messageChars=${message.length}`);\n // Surface as an SSE error event the SDK's responses parser understands.\n try {\n const [errorEvent] = normalizeResponsesLiteEvent({ type: 'error', error: { message } }, normalizeState);\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`));\n } catch { /* ignore */ }\n close();\n };\n\n socket = new WebSocket(wsUrl, { headers });\n\n socket.on('open', () => {\n debug(`open — sending ${outgoing.length}B payload`);\n socket.send(outgoing);\n });\n socket.on('unexpected-response', (_req, res) => {\n debug(`unexpected-response status=${res.statusCode}`);\n });\n\n socket.on('message', (data: RawData) => {\n const text = Array.isArray(data)\n ? Buffer.concat(data).toString('utf8')\n : data.toString('utf8');\n frameCount += 1;\n let event: unknown;\n try {\n event = JSON.parse(text);\n } catch {\n debug(`frame#${frameCount} non-json chars=${text.length}`);\n controller.enqueue(encoder.encode(`data: ${text.replace(/\\r?\\n/g, ' ')}\\n\\n`));\n return;\n }\n if (frameCount <= 8) debug(`frame#${frameCount} ${summarizeResponsesLiteEvent(event)}`);\n for (const next of normalizeResponsesLiteEvent(event, normalizeState)) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(next)}\\n\\n`));\n }\n const type = isRecord(event) && typeof event.type === 'string' ? event.type : undefined;\n if (type && TERMINAL_EVENT_TYPES.has(type)) {\n debug(`terminal event: ${type} (after ${frameCount} frames)`);\n close();\n }\n });\n\n socket.on('error', (err: Error) => fail(err.message));\n socket.on('close', (code: number, reason: Buffer) => {\n debug(`close code=${code} frames=${frameCount}${reason?.length ? ` reasonChars=${reason.length}` : ''}`);\n if (closed) return;\n if (code === 1000 || code === 1005) { close(); return; }\n fail(`WebSocket closed (${code})${reason?.length ? `: ${reason.toString('utf8')}` : ''}`);\n });\n\n const signal = init?.signal;\n if (signal) {\n if (signal.aborted) { close(); return; }\n signal.addEventListener('abort', close, { once: true });\n }\n },\n cancel() {\n try { socket?.close(); } catch { /* ignore */ }\n },\n });\n\n return new Response(stream, {\n status: 200,\n headers: { 'content-type': 'text/event-stream; charset=utf-8' },\n });\n };\n}\n","import { randomUUID } from 'node:crypto';\n\nconst DEFAULT_TTL_MS = 5 * 60_000;\nconst DEFAULT_MAX_ENTRIES = 1_024;\nconst ROUTE_MARKER_PATTERN = /(?:\\n\\n)?<relay-ai-subagent-route token=\"([0-9a-f-]{36})\"\\s*\\/>/gi;\n\ntype HeaderValue = string | string[] | undefined;\ntype HeaderMap = Record<string, HeaderValue>;\ntype JsonBody = Record<string, any>;\n\ninterface RegistryEntry {\n sessionId: string;\n modelId: string;\n createdAt: number;\n}\n\nexport interface SubagentRouteRegistryOptions {\n ttlMs?: number;\n maxEntries?: number;\n now?: () => number;\n}\n\nexport interface CorrelatedSubagentRequest {\n modelId: string;\n body: JsonBody;\n}\n\nfunction firstHeader(value: HeaderValue): string | undefined {\n const first = Array.isArray(value) ? value[0] : value;\n return typeof first === 'string' && first.trim() ? first.trim() : undefined;\n}\n\nexport function extractClaudeSessionId(headers: HeaderMap, body: unknown): string | undefined {\n const headerSession = firstHeader(headers['x-claude-code-session-id']);\n if (headerSession) return headerSession;\n\n const userId = (body as JsonBody | undefined)?.metadata?.user_id;\n if (typeof userId !== 'string') return undefined;\n try {\n const parsed = JSON.parse(userId) as { session_id?: unknown };\n return typeof parsed.session_id === 'string' && parsed.session_id.trim()\n ? parsed.session_id.trim()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function appendSubagentRouteMarker(prompt: string, token: string): string {\n return `${prompt}\\n\\n<relay-ai-subagent-route token=\"${token}\"/>`;\n}\n\nfunction findMarkersInUserMessages(body: JsonBody): { tokens: string[]; body: JsonBody } | undefined {\n if (!Array.isArray(body.messages)) return undefined;\n\n const tokens: string[] = [];\n const messages = [...body.messages];\n for (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {\n const message = body.messages[messageIndex];\n if (!message || message.role !== 'user') continue;\n\n if (typeof message.content === 'string') {\n const matches = [...message.content.matchAll(ROUTE_MARKER_PATTERN)];\n if (matches.length === 0) continue;\n tokens.push(...matches.flatMap(match => match[1] ? [match[1]] : []));\n messages[messageIndex] = {\n ...message,\n content: message.content.replace(ROUTE_MARKER_PATTERN, '').trimEnd(),\n };\n continue;\n }\n\n if (!Array.isArray(message.content)) continue;\n const content = [...message.content];\n for (let partIndex = 0; partIndex < message.content.length; partIndex++) {\n const part = message.content[partIndex];\n if (!part || part.type !== 'text' || typeof part.text !== 'string') continue;\n const matches = [...part.text.matchAll(ROUTE_MARKER_PATTERN)];\n if (matches.length === 0) continue;\n tokens.push(...matches.flatMap(match => match[1] ? [match[1]] : []));\n content[partIndex] = {\n ...part,\n text: part.text.replace(ROUTE_MARKER_PATTERN, '').trimEnd(),\n };\n }\n messages[messageIndex] = { ...message, content };\n }\n return tokens.length > 0 ? { tokens, body: { ...body, messages } } : undefined;\n}\n\nexport class SubagentRouteRegistry {\n private readonly entries = new Map<string, RegistryEntry>();\n private readonly ttlMs: number;\n private readonly maxEntries: number;\n private readonly now: () => number;\n\n constructor(options: SubagentRouteRegistryOptions = {}) {\n this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;\n this.maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n this.now = options.now ?? Date.now;\n }\n\n register(sessionId: string, modelId: string): string {\n this.cleanup();\n while (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next().value as string | undefined;\n if (!oldest) break;\n this.entries.delete(oldest);\n }\n const token = randomUUID();\n this.entries.set(token, { sessionId, modelId, createdAt: this.now() });\n return token;\n }\n\n consume(headers: HeaderMap, body: JsonBody): CorrelatedSubagentRequest | undefined {\n this.cleanup();\n if (!firstHeader(headers['x-claude-code-agent-id'])) return undefined;\n\n const sessionId = extractClaudeSessionId(headers, body);\n if (!sessionId) return undefined;\n const marked = findMarkersInUserMessages(body);\n if (!marked) return undefined;\n const token = [...marked.tokens].reverse().find(candidate => (\n this.entries.get(candidate)?.sessionId === sessionId\n ));\n if (!token) return undefined;\n const entry = this.entries.get(token)!;\n\n this.entries.delete(token);\n return { modelId: entry.modelId, body: marked.body };\n }\n\n private cleanup(): void {\n const cutoff = this.now() - this.ttlMs;\n for (const [token, entry] of this.entries) {\n if (entry.createdAt < cutoff) this.entries.delete(token);\n }\n }\n}\n","import { MAX_MODEL_CATALOG } from './constants.js';\nimport type { AnthropicToolDefinition } from './proxy-types.js';\nimport { appendSubagentRouteMarker } from './subagent-route-registry.js';\n\nexport type ClaudeModelFamily = 'sonnet' | 'opus' | 'haiku' | 'fable';\n\nexport interface SubagentModelOption {\n id: string;\n compatibilityIds: string[];\n displayName: string;\n family?: ClaudeModelFamily;\n}\n\nexport interface SubagentModelRouting {\n parentModelId: string;\n models: SubagentModelOption[];\n registerSubagentRoute?: (modelId: string) => string;\n}\n\nexport type SubagentRoutingDecision =\n | { kind: 'inherit'; resolvedModelId: string }\n | { kind: 'compatibility'; requestedModelId: string; resolvedModelId: string }\n | { kind: 'family'; requestedModelId: ClaudeModelFamily; resolvedModelId: string }\n | { kind: 'family-fallback'; requestedModelId: ClaudeModelFamily; resolvedModelId: string }\n | { kind: 'explicit'; resolvedModelId: string }\n | { kind: 'fork' };\n\nexport interface NormalizedSubagentInput {\n input: Record<string, unknown>;\n decision: SubagentRoutingDecision;\n}\n\nconst CLAUDE_MODEL_FAMILIES: ClaudeModelFamily[] = ['sonnet', 'opus', 'haiku', 'fable'];\nconst CLAUDE_MODEL_FAMILY_SET = new Set<string>(CLAUDE_MODEL_FAMILIES);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function claudeModelFamily(modelId: string): ClaudeModelFamily | undefined {\n const normalized = modelId.toLowerCase();\n if (!normalized.startsWith('claude-')) return undefined;\n return CLAUDE_MODEL_FAMILIES.find(family => normalized.includes(family));\n}\n\nexport function isClaudeAgentTool(tool: AnthropicToolDefinition): boolean {\n if (tool.name !== 'Agent' || !isRecord(tool.input_schema)) return false;\n const properties = tool.input_schema.properties;\n if (!isRecord(properties)) return false;\n return ['description', 'prompt', 'subagent_type'].every(name => isRecord(properties[name]));\n}\n\nexport class UnavailableSubagentModelError extends Error {\n readonly statusCode = 400;\n\n constructor(\n readonly selector: string,\n routing: SubagentModelRouting,\n ) {\n const visible = routing.models.slice(0, MAX_MODEL_CATALOG).map(model => model.id);\n const omitted = routing.models.length - visible.length;\n const suffix = omitted > 0 ? `, and ${omitted} more` : '';\n super(\n `Subagent model \"${selector}\" is unavailable in this Relay AI session. `\n + `Available model ids: ${visible.join(', ')}${suffix}.`,\n );\n this.name = 'UnavailableSubagentModelError';\n }\n}\n\nexport function normalizeClaudeAgentInput(\n input: unknown,\n routing: SubagentModelRouting,\n): NormalizedSubagentInput {\n const source = isRecord(input) ? input : {};\n const normalized = { ...source };\n\n if (source.subagent_type === 'fork') {\n return { input: normalized, decision: { kind: 'fork' } };\n }\n\n const rawModel = source.model;\n if (rawModel == null) {\n normalized.model = routing.parentModelId;\n return {\n input: normalized,\n decision: { kind: 'inherit', resolvedModelId: routing.parentModelId },\n };\n }\n if (typeof rawModel !== 'string') {\n throw new UnavailableSubagentModelError(String(rawModel), routing);\n }\n const selector = rawModel.trim();\n if (selector === '' || selector === 'inherit') {\n normalized.model = routing.parentModelId;\n return {\n input: normalized,\n decision: { kind: 'inherit', resolvedModelId: routing.parentModelId },\n };\n }\n\n const exposed = routing.models.find(model => model.id === selector);\n if (exposed) {\n normalized.model = exposed.id;\n return {\n input: normalized,\n decision: { kind: 'explicit', resolvedModelId: exposed.id },\n };\n }\n\n const compatible = routing.models.find(model => model.compatibilityIds.includes(selector));\n if (compatible) {\n normalized.model = compatible.id;\n return {\n input: normalized,\n decision: {\n kind: 'compatibility',\n requestedModelId: selector,\n resolvedModelId: compatible.id,\n },\n };\n }\n\n if (CLAUDE_MODEL_FAMILY_SET.has(selector)) {\n const family = selector as ClaudeModelFamily;\n const nativeModel = routing.models.find(model => model.family === family);\n const resolvedModelId = nativeModel?.id ?? routing.parentModelId;\n normalized.model = resolvedModelId;\n return {\n input: normalized,\n decision: nativeModel\n ? { kind: 'family', requestedModelId: family, resolvedModelId }\n : { kind: 'family-fallback', requestedModelId: family, resolvedModelId },\n };\n }\n\n throw new UnavailableSubagentModelError(selector, routing);\n}\n\nexport function prepareClaudeAgentInput(\n input: unknown,\n routing: SubagentModelRouting,\n): NormalizedSubagentInput {\n const normalized = normalizeClaudeAgentInput(input, routing);\n const decision = normalized.decision;\n if (decision.kind === 'fork') return normalized;\n if (!routing.registerSubagentRoute) return normalized;\n const prompt = normalized.input.prompt;\n if (typeof prompt !== 'string') return normalized;\n\n const token = routing.registerSubagentRoute(decision.resolvedModelId);\n const clientInput = { ...normalized.input };\n const target = routing.models.find(model => model.id === decision.resolvedModelId);\n if (target?.family) clientInput.model = target.family;\n else delete clientInput.model;\n clientInput.prompt = appendSubagentRouteMarker(prompt, token);\n\n return { input: clientInput, decision };\n}\n\nexport function augmentClaudeAgentTool(\n tool: AnthropicToolDefinition,\n routing: SubagentModelRouting,\n): AnthropicToolDefinition {\n const inputSchema = isRecord(tool.input_schema) ? tool.input_schema : {};\n const properties = isRecord(inputSchema.properties) ? inputSchema.properties : {};\n const originalModel = isRecord(properties.model) ? properties.model : {};\n const smallCatalog = routing.models.length <= MAX_MODEL_CATALOG;\n\n const modelProperty: Record<string, unknown> = {\n ...originalModel,\n type: 'string',\n };\n if (smallCatalog) {\n const originalEnum = Array.isArray(originalModel.enum)\n ? originalModel.enum.filter((value): value is string => typeof value === 'string')\n : CLAUDE_MODEL_FAMILIES;\n modelProperty.enum = [...new Set([...originalEnum, ...routing.models.map(model => model.id)])];\n } else {\n delete modelProperty.enum;\n }\n\n const guidance = smallCatalog\n ? `Relay AI subagent model routing (default: ${routing.parentModelId}). `\n + routing.models.map(model => `${model.displayName}: ${model.id}`).join('; ')\n : `Relay AI subagent model routing (default: ${routing.parentModelId}). `\n + 'Other explicit model values must be exact ids from the current session catalog.';\n\n return {\n ...tool,\n description: [tool.description?.trim(), guidance].filter(Boolean).join('\\n\\n'),\n input_schema: {\n ...inputSchema,\n properties: {\n ...properties,\n model: modelProperty,\n },\n },\n };\n}\n","// Shared helpers for Anthropic ↔ upstream translation proxies.\n\nexport type FullStreamPart = {\n type: string;\n id?: string;\n text?: string;\n delta?: string;\n toolName?: string;\n toolCallId?: string;\n input?: unknown;\n finishReason?: string;\n totalUsage?: { inputTokens?: number; outputTokens?: number };\n providerMetadata?: {\n google?: { thoughtSignature?: string; thought_signature?: string };\n openai?: { reasoningEncryptedContent?: string | null };\n };\n error?: unknown;\n reason?: string;\n};\n\nexport function grabRoundTripSignature(part: FullStreamPart): string | undefined {\n const md = part.providerMetadata;\n return md?.google?.thoughtSignature\n ?? md?.google?.thought_signature\n ?? md?.openai?.reasoningEncryptedContent\n ?? undefined;\n}\n\nlet sdkWarningsSilenced = false;\n\nexport function silenceSdkWarnings(): void {\n if (sdkWarningsSilenced) return;\n sdkWarningsSilenced = true;\n (globalThis as { AI_SDK_LOG_WARNINGS?: false }).AI_SDK_LOG_WARNINGS = false;\n}\n\nconst TOOL_USE_SIG_SEP = '__ts__';\nconst MAX_INLINE_TOOL_SIGNATURE_BYTES = 256;\nconst MAX_STORED_TOOL_SIGNATURES = 1000;\nconst toolSignatureRegistry = new Map<string, string>();\n\nfunction rememberToolSignature(rawId: string, thoughtSignature: string): void {\n toolSignatureRegistry.set(rawId, thoughtSignature);\n if (toolSignatureRegistry.size <= MAX_STORED_TOOL_SIGNATURES) return;\n const oldest = toolSignatureRegistry.keys().next().value as string | undefined;\n if (oldest) toolSignatureRegistry.delete(oldest);\n}\n\nexport function parseToolArguments(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) return {};\n if (typeof value === 'object' && !Array.isArray(value)) return value as Record<string, unknown>;\n if (typeof value === 'string') {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch { /* fall through */ }\n }\n return {};\n}\n\nexport function sseChunk(eventType: string, data: unknown): string {\n return `event: ${eventType}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\n/**\n * DeepSeek V4's \"DSML\" tool-calling protocol: an XML-style block using the fullwidth\n * pipe `|` as a marker character, e.g. `<|DSML|tool_calls><|DSML|invoke name=\"x\">\n * <|DSML|parameter name=\"y\" string=\"true\">value</|DSML|parameter></|DSML|invoke>\n * </|DSML|tool_calls>`. Not officially documented by DeepSeek, but widely reported\n * (vLLM issue #41240, Cherry Studio issue #14714) as leaking into plain assistant text\n * instead of firing real tool calls when a serving backend's tool-call parser doesn't\n * fully handle it — observed live via OpenCode Zen's free deepseek-v4-flash-free.\n * The marker is also observed rendered with stray ASCII pipes/whitespace instead of the\n * clean fullwidth character, so matching tolerates either.\n */\nconst DSML_NOISE = '[||\\\\s]*';\nconst DSML_BLOCK_RE = new RegExp(`<${DSML_NOISE}DSML${DSML_NOISE}tool_calls>([\\\\s\\\\S]*?)<\\\\/${DSML_NOISE}DSML${DSML_NOISE}tool_calls>`, 'i');\nconst DSML_INVOKE_RE = new RegExp(`<${DSML_NOISE}DSML${DSML_NOISE}invoke\\\\s+name=\"([^\"]+)\"[^>]*>([\\\\s\\\\S]*?)<\\\\/${DSML_NOISE}DSML${DSML_NOISE}invoke>`, 'gi');\nconst DSML_PARAM_RE = new RegExp(`<${DSML_NOISE}DSML${DSML_NOISE}parameter\\\\s+name=\"([^\"]+)\"(?:\\\\s+string=\"(true|false)\")?[^>]*>([\\\\s\\\\S]*?)<\\\\/${DSML_NOISE}DSML${DSML_NOISE}parameter>`, 'gi');\n\nexport interface DsmlToolCall {\n name: string;\n args: Record<string, unknown>;\n}\n\nexport interface DsmlParseResult {\n /** Any text before the <DSML tool_calls> block (usually empty). */\n leadingText: string;\n calls: DsmlToolCall[];\n}\n\n/** Returns null when no complete DSML tool_calls block is present (including a\n * truncated/unclosed one — safer to leave a partial block as visible text than\n * guess at incomplete arguments). */\nexport function parseDsmlToolCalls(text: string): DsmlParseResult | null {\n const outer = DSML_BLOCK_RE.exec(text);\n if (!outer) return null;\n\n const calls: DsmlToolCall[] = [];\n for (const invokeMatch of outer[1]!.matchAll(DSML_INVOKE_RE)) {\n const name = invokeMatch[1]!;\n const body = invokeMatch[2]!;\n const args: Record<string, unknown> = {};\n for (const paramMatch of body.matchAll(DSML_PARAM_RE)) {\n const paramName = paramMatch[1]!;\n const isJson = paramMatch[2] === 'false';\n const rawValue = paramMatch[3] ?? '';\n if (isJson) {\n try {\n args[paramName] = JSON.parse(rawValue.trim());\n } catch {\n args[paramName] = rawValue;\n }\n } else {\n args[paramName] = rawValue;\n }\n }\n calls.push({ name, args });\n }\n if (!calls.length) return null;\n\n return { leadingText: text.slice(0, outer.index).trim(), calls };\n}\n\n/** Parse one SSE line into a JSON payload string, or null if not a data line. */\nexport function extractSseDataPayload(line: string): string | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) return null;\n if (trimmed.startsWith('data:')) {\n const payload = trimmed.slice(5).trimStart();\n if (!payload || payload === '[DONE]') return null;\n return payload;\n }\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) return trimmed;\n return null;\n}\n\nexport function splitToolUseId(id: string): { rawId: string; thoughtSignature?: string } {\n let sep = id.lastIndexOf(TOOL_USE_SIG_SEP);\n if (sep !== -1) {\n return {\n rawId: id.slice(0, sep),\n thoughtSignature: Buffer.from(id.slice(sep + TOOL_USE_SIG_SEP.length), 'base64url').toString('utf8'),\n };\n }\n\n // Legacy fallback for active sessions that used ::ts:: before the restart\n sep = id.lastIndexOf('::ts::');\n if (sep !== -1) {\n return {\n rawId: id.slice(0, sep),\n thoughtSignature: id.slice(sep + 6),\n };\n }\n\n return { rawId: id, thoughtSignature: toolSignatureRegistry.get(id) };\n}\n\nexport function encodeToolUseId(rawId: string, thoughtSignature?: string, inline = true): string {\n if (!thoughtSignature) return rawId;\n rememberToolSignature(rawId, thoughtSignature);\n if (!inline) return rawId;\n if (Buffer.byteLength(thoughtSignature, 'utf8') > MAX_INLINE_TOOL_SIGNATURE_BYTES) {\n return rawId;\n }\n const encoded = Buffer.from(thoughtSignature, 'utf8').toString('base64url');\n return `${rawId}${TOOL_USE_SIG_SEP}${encoded}`;\n}\n\nexport function stripToolUseIdSuffix(toolUseId: string): string {\n return splitToolUseId(toolUseId).rawId;\n}\n\nexport function serializeToolResultContent(content: unknown): string {\n if (typeof content === 'string') return content;\n // JSON.stringify(undefined) returns the JS value `undefined`, not a string — guard\n // explicitly so a missing tool_result content field can never ship an empty/malformed\n // tool-result payload upstream.\n if (content === undefined) return '';\n return JSON.stringify(content);\n}\n\n/** Incrementally read SSE lines from an upstream stream without re-splitting the full buffer. */\nexport function attachSseLineReader(\n upstream: NodeJS.ReadableStream,\n onLine: (line: string) => void,\n onDone: () => void,\n): void {\n const decoder = new TextDecoder();\n let buffer = '';\n\n const flushRemainder = () => {\n const trimmed = buffer.trim();\n if (trimmed) onLine(trimmed);\n buffer = '';\n };\n\n upstream.on('data', (chunk: Buffer) => {\n buffer += decoder.decode(chunk, { stream: true });\n let newline = buffer.indexOf('\\n');\n while (newline !== -1) {\n onLine(buffer.slice(0, newline));\n buffer = buffer.slice(newline + 1);\n newline = buffer.indexOf('\\n');\n }\n });\n\n upstream.on('end', () => {\n flushRemainder();\n onDone();\n });\n\n upstream.on('error', () => onDone());\n}\n","// Short user-facing messages from SDK/upstream failures — no stack traces in Codex TUI.\n\ninterface ApiCallLike {\n name?: string;\n message?: string;\n statusCode?: number;\n responseBody?: string;\n data?: { error?: { message?: string; type?: string } };\n lastError?: { message?: string; statusCode?: number };\n errors?: Array<{ message?: string; statusCode?: number }>;\n cause?: unknown;\n}\n\nconst TRACE_FIELD_LIMIT = 4_000;\n\nfunction clipTraceField(value: string): string {\n return value.length <= TRACE_FIELD_LIMIT ? value : `${value.slice(0, TRACE_FIELD_LIMIT)}…`;\n}\n\nfunction safeUpstreamErrorFields(err: unknown, includeCause: boolean): Record<string, unknown> {\n if (!err || typeof err !== 'object') {\n return { message: clipTraceField(String(err)) };\n }\n\n const rec = err as ApiCallLike;\n const result: Record<string, unknown> = {};\n if (rec.name) result.name = rec.name;\n if (rec.message) result.message = clipTraceField(rec.message);\n if (rec.statusCode !== undefined) result.statusCode = rec.statusCode;\n if (rec.responseBody) result.responseBody = clipTraceField(rec.responseBody);\n if (rec.data?.error) {\n result.data = {\n error: {\n ...(rec.data.error.type ? { type: rec.data.error.type } : {}),\n ...(rec.data.error.message\n ? { message: clipTraceField(rec.data.error.message) }\n : {}),\n },\n };\n }\n if (rec.lastError) {\n result.lastError = {\n ...(rec.lastError.message\n ? { message: clipTraceField(rec.lastError.message) }\n : {}),\n ...(rec.lastError.statusCode !== undefined\n ? { statusCode: rec.lastError.statusCode }\n : {}),\n };\n }\n if (rec.errors?.length) {\n result.errors = rec.errors.map(item => ({\n ...(item.message ? { message: clipTraceField(item.message) } : {}),\n ...(item.statusCode !== undefined ? { statusCode: item.statusCode } : {}),\n }));\n }\n if (includeCause && rec.cause !== undefined) {\n result.cause = safeUpstreamErrorFields(rec.cause, false);\n }\n return result;\n}\n\n/** Safe diagnostic fields for trace logs; deliberately excludes request data and headers. */\nexport function formatUpstreamErrorTrace(err: unknown): string {\n return JSON.stringify(safeUpstreamErrorFields(err, true));\n}\n\nexport function formatUpstreamError(err: unknown): string {\n if (!err || typeof err !== 'object') return 'Upstream model request failed.';\n\n const rec = err as ApiCallLike;\n\n if (rec.data?.error?.message) {\n const short = sanitizeMessage(rec.data.error.message);\n return rec.statusCode ? `${short} (HTTP ${rec.statusCode})` : short;\n }\n\n if (rec.responseBody) {\n try {\n const parsed = JSON.parse(rec.responseBody) as { error?: { message?: string } };\n if (parsed.error?.message) {\n const short = sanitizeMessage(parsed.error.message);\n return rec.statusCode ? `${short} (HTTP ${rec.statusCode})` : short;\n }\n } catch { /* ignore */ }\n }\n\n const last = rec.lastError;\n if (last?.message) {\n const code = last.statusCode;\n const short = sanitizeMessage(last.message);\n return code ? `${short} (HTTP ${code})` : short;\n }\n\n const fromList = rec.errors?.[rec.errors.length - 1];\n if (fromList?.message) {\n const short = sanitizeMessage(fromList.message);\n return fromList.statusCode ? `${short} (HTTP ${fromList.statusCode})` : short;\n }\n\n if (rec.message) {\n const short = sanitizeMessage(rec.message);\n if (short && !short.includes('file://') && !short.includes('APICallError') && short.length < 240) {\n return rec.statusCode ? `${short} (HTTP ${rec.statusCode})` : short;\n }\n }\n\n return 'Upstream model request failed.';\n}\n\n/** Real upstream HTTP status from an SDK error, falling back to sniffing the formatted message. */\nexport function upstreamHttpStatus(err: unknown, message: string): number {\n if (err && typeof err === 'object' && 'statusCode' in err) {\n const code = (err as { statusCode?: number }).statusCode;\n if (code === 400 || code === 401 || code === 403 || code === 404 || code === 429) return code;\n }\n if (message.includes('HTTP 429') || message.includes('429')) return 429;\n if (message.includes('HTTP 400')) return 400;\n return 500;\n}\n\n/** Anthropic SSE error `type` for a status code — lets clients tell retryable from terminal failures. */\nexport function anthropicErrorType(status: number): string {\n switch (status) {\n case 400: return 'invalid_request_error';\n case 401: return 'authentication_error';\n case 403: return 'permission_error';\n case 404: return 'not_found_error';\n case 429: return 'rate_limit_error';\n default: return 'api_error';\n }\n}\n\nfunction sanitizeMessage(message: string): string {\n const line = message.split('\\n')[0]?.trim() ?? message;\n if (line.startsWith('RetryError') || line.includes('AI_RetryError')) {\n return 'Upstream model request failed after retries.';\n }\n return line;\n}\n","// Anthropic /v1/messages ↔ Vercel AI SDK. One turn per request; Claude Code owns the tool loop.\nimport { streamText, generateText, tool, jsonSchema } from 'ai';\nimport type { LanguageModel, ModelMessage } from 'ai';\nimport {\n sseChunk,\n encodeToolUseId,\n splitToolUseId,\n serializeToolResultContent,\n silenceSdkWarnings,\n type FullStreamPart,\n grabRoundTripSignature,\n} from './proxy-shared.js';\nimport {\n deepMergeProviderOptions,\n effortProviderOptions,\n thinkingProviderOptions,\n type ReasoningMetadata,\n} from './provider-factory.js';\nimport { resolveUpstreamTools } from './tool-search.js';\nimport type { AnthropicRequestMessage, AnthropicToolDefinition } from './proxy-types.js';\nimport { anthropicErrorType, upstreamHttpStatus } from './codex/upstream-error.js';\nimport {\n augmentClaudeAgentTool,\n isClaudeAgentTool,\n prepareClaudeAgentInput,\n UnavailableSubagentModelError,\n type SubagentRoutingDecision,\n type SubagentModelRouting,\n} from './subagent-model-routing.js';\n\nexport { silenceSdkWarnings };\n\n// ── Anthropic request shapes (only the fields we read) ───────────────────────\ninterface AnthropicBlock {\n type: string;\n text?: string;\n thinking?: string;\n signature?: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n tool_use_id?: string;\n content?: unknown;\n source?: { type: 'base64' | 'url'; media_type?: string; data?: string; url?: string };\n // internal: resolved tool name for a tool_result, set by annotateToolNames\n _name?: string;\n}\ninterface AnthropicMsg { role: 'user' | 'assistant' | 'system'; content: string | AnthropicBlock[]; }\n\n// Providers whose serving-side chat template mishandles a conversation that ends on a\n// tool/function result — it hallucinates an empty user turn (qwen: quotes a phantom\n// `<<HUMAN_CONVERSATION_START>>` marker and stops working) instead of summarizing the tool\n// output. Documented qwen/DashScope quirk; the standard mitigation is to append a neutral\n// user \"continue\" turn so the template gets a real human turn. See docs/CORE.md / plan.\nconst NEEDS_TRAILING_TOOL_NUDGE = new Set(['@ai-sdk/alibaba']);\nconst TRAILING_TOOL_NUDGE_TEXT = 'Continue.';\ninterface AnthropicTool { name: string; description?: string; input_schema: Record<string, unknown>; }\nexport interface AnthropicRequest {\n model: string;\n system?: string | Array<string | { text?: string }>;\n messages: AnthropicMsg[];\n tools?: AnthropicTool[];\n tool_choice?: { type: 'auto' | 'any' | 'tool'; name?: string };\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n thinking?: { type?: string; budget_tokens?: number };\n output_config?: { effort?: string };\n}\n\nexport interface TranslateRequestOptions {\n /** Fallback when the client omits effort (e.g. Claude Desktop gateway). */\n defaultEffort?: string;\n reasoningMetadata?: ReasoningMetadata;\n /** ChatGPT Codex OAuth requires instructions and manages its own output limit. */\n openAiOAuth?: boolean;\n /** Hard cap on tools sent to the provider (e.g. Groq: 128). Excess tools are silently dropped. */\n maxTools?: number;\n /** Diagnostic sink — e.g. surfaces user turns silently dropped by translateMessages. */\n onDebug?: (msg: string) => void;\n /** Request-local Claude Agent model catalog for SDK-backed partner routes. */\n subagentRouting?: SubagentModelRouting;\n /** Request-scoped transport headers (for example OpenCode Go conversation identity). */\n requestHeaders?: Record<string, string>;\n}\n\n/** Read reasoning effort from an Anthropic-format request body. */\nexport function anthropicEffortFromRequest(body: AnthropicRequest): string | undefined {\n const effort = body.output_config?.effort;\n if (typeof effort === 'string' && effort.trim()) return effort.trim();\n return undefined;\n}\n\nexport interface SdkCallParams {\n instructions?: string;\n messages: ModelMessage[];\n tools?: Record<string, ReturnType<typeof tool>>;\n toolChoice?: 'auto' | 'required' | { type: 'tool'; toolName: string };\n maxOutputTokens?: number;\n temperature?: number;\n providerOptions?: Record<string, Record<string, unknown>>;\n /** Request-scoped transport headers passed to the AI SDK on every upstream attempt. */\n headers?: Record<string, string>;\n /** Internal response-normalization metadata; never forwarded to an SDK provider. */\n subagentRouting?: SubagentModelRouting;\n}\n\n// ── system ───────────────────────────────────────────────────────────────────\nfunction systemToString(system: AnthropicRequest['system']): string | undefined {\n if (!system) return undefined;\n if (typeof system === 'string') return system;\n return system.map(b => (typeof b === 'string' ? b : b.text ?? '')).join('\\n');\n}\n\n// Claude Code injects context (skills list, system-reminders) as role:'system'\n// messages inside the messages array — fold into the system prompt so they aren't dropped.\nfunction inlineSystemText(messages: AnthropicMsg[]): string[] {\n const parts: string[] = [];\n for (const msg of messages) {\n if (msg.role !== 'system') continue;\n const text = typeof msg.content === 'string'\n ? msg.content\n : msg.content.map(b => b.text ?? '').join('\\n');\n if (text.trim()) parts.push(text.trim());\n }\n return parts;\n}\n\n// ── images ───────────────────────────────────────────────────────────────────\nfunction imagePart(block: AnthropicBlock): { type: 'file'; mediaType: string; data: Uint8Array | { type: 'url'; url: URL } } | null {\n const src = block.source;\n if (!src) return null;\n if (src.type === 'base64' && src.data) {\n return { type: 'file', mediaType: src.media_type ?? 'image', data: Buffer.from(src.data, 'base64') };\n }\n if (src.type === 'url' && src.url) {\n return { type: 'file', mediaType: src.media_type ?? 'image', data: { type: 'url', url: new URL(src.url) } };\n }\n return null;\n}\n\n// ── tool_result name resolution (tool messages need the tool name) ────────────\nexport function annotateToolNames(messages: AnthropicMsg[]): void {\n const nameById = new Map<string, string>();\n for (const msg of messages) {\n if (!Array.isArray(msg.content)) continue;\n for (const b of msg.content) {\n if (b.type === 'tool_use' && b.id && b.name) nameById.set(splitToolUseId(b.id).rawId, b.name);\n }\n }\n for (const msg of messages) {\n if (!Array.isArray(msg.content)) continue;\n for (const b of msg.content) {\n if (b.type === 'tool_result' && b.tool_use_id) {\n b._name = nameById.get(splitToolUseId(b.tool_use_id).rawId);\n }\n }\n }\n}\n\nfunction thinkingToSdkPart(\n block: AnthropicBlock,\n npm: string,\n): Record<string, unknown> | null {\n const text = block.thinking ?? '';\n if (npm === '@ai-sdk/openai' && !block.signature && !text.trim()) return null;\n\n const part: Record<string, unknown> = { type: 'reasoning', text };\n if (block.signature) {\n if (npm === '@ai-sdk/google') {\n part.providerOptions = { google: { thoughtSignature: block.signature } };\n } else if (npm === '@ai-sdk/openai' || npm === '@ai-sdk/openai-compatible') {\n part.providerOptions = { openai: { reasoningEncryptedContent: block.signature } };\n }\n }\n return part;\n}\n\n// ── messages: Anthropic → SDK ModelMessage[] ─────────────────────────────────\nexport function translateMessages(\n messages: AnthropicMsg[],\n npm: string,\n onDebug?: (msg: string) => void,\n): ModelMessage[] {\n const isGoogle = npm === '@ai-sdk/google';\n const out: ModelMessage[] = [];\n\n for (const msg of messages) {\n const blocks: AnthropicBlock[] = typeof msg.content === 'string'\n ? [{ type: 'text', text: msg.content }]\n : msg.content ?? [];\n\n if (msg.role === 'user') {\n const toolResults = blocks.filter(b => b.type === 'tool_result');\n const parts: Array<Record<string, unknown>> = [];\n for (const b of blocks) {\n if (b.type === 'text') parts.push({ type: 'text', text: b.text ?? '' });\n else if (b.type === 'image') { const p = imagePart(b); if (p) parts.push(p); }\n }\n if (blocks.length && !toolResults.length && !parts.length) {\n const types = blocks.map(b => b.type).join(', ');\n onDebug?.(`sdk: dropped user turn with unrecognized block types: [${types}]`);\n }\n if (toolResults.length) {\n out.push({\n role: 'tool',\n content: toolResults.map(tr => ({\n type: 'tool-result',\n toolCallId: splitToolUseId(tr.tool_use_id ?? '').rawId,\n toolName: tr._name ?? 'unknown',\n output: { type: 'text', value: serializeToolResultContent(tr.content) },\n })),\n } as unknown as ModelMessage);\n }\n if (parts.length) out.push({ role: 'user', content: parts } as unknown as ModelMessage);\n } else if (msg.role === 'assistant') {\n const parts: Array<Record<string, unknown>> = [];\n for (const b of blocks) {\n if (b.type === 'text') {\n parts.push({ type: 'text', text: b.text ?? '' });\n } else if (b.type === 'thinking') {\n const part = thinkingToSdkPart(b, npm);\n if (part) parts.push(part);\n } else if (b.type === 'tool_use' && b.id) {\n const { rawId, thoughtSignature } = splitToolUseId(b.id);\n const part: Record<string, unknown> = {\n type: 'tool-call', toolCallId: rawId, toolName: b.name, input: b.input ?? {},\n };\n if (thoughtSignature && isGoogle) part.providerOptions = { google: { thoughtSignature } };\n parts.push(part);\n }\n }\n if (parts.length) out.push({ role: 'assistant', content: parts } as unknown as ModelMessage);\n }\n }\n\n // qwen/DashScope hallucinates an \"empty message\" when the request ends on a tool result\n // (every agentic tool-loop step). Append a neutral user turn so its chat template gets a\n // real human turn to respond to. Scoped to providers with the quirk; transparent to Claude\n // Code (the nudge lives only in the upstream request, never echoed back).\n if (NEEDS_TRAILING_TOOL_NUDGE.has(npm) && (out[out.length - 1] as { role?: string })?.role === 'tool') {\n out.push({ role: 'user', content: [{ type: 'text', text: TRAILING_TOOL_NUDGE_TEXT }] } as unknown as ModelMessage);\n onDebug?.('sdk: appended continuation nudge (request ended on tool result)');\n }\n\n return out;\n}\n\n/** Strip top-level null values so models that emit `null` for optional params don't fail schema validation. */\nfunction stripNullInputs(input: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input)) {\n if (v !== null) out[k] = v;\n }\n return out;\n}\n\nexport function translateTools(anthropicTools?: AnthropicTool[]): Record<string, ReturnType<typeof tool>> | undefined {\n if (!anthropicTools?.length) return undefined;\n const tools: Record<string, ReturnType<typeof tool>> = {};\n for (const t of anthropicTools) {\n if (!t.name || !t.input_schema) continue;\n tools[t.name] = tool({ description: t.description ?? '', inputSchema: jsonSchema(t.input_schema) });\n }\n return Object.keys(tools).length ? tools : undefined;\n}\n\nexport function translateToolChoice(tc: AnthropicRequest['tool_choice']): SdkCallParams['toolChoice'] {\n if (!tc) return undefined;\n if (tc.type === 'auto') return 'auto';\n if (tc.type === 'any') return 'required';\n if (tc.type === 'tool' && tc.name) return { type: 'tool', toolName: tc.name };\n return undefined;\n}\n\nexport function translateRequest(\n body: AnthropicRequest,\n npm: string,\n options?: TranslateRequestOptions,\n): SdkCallParams {\n const messages = body.messages ?? [];\n annotateToolNames(messages);\n\n // Fold inline role:'system' messages (skills list, system-reminders) into the\n // system prompt so they aren't dropped.\n const baseSystem = systemToString(body.system);\n const inlineParts = inlineSystemText(messages);\n const systemText = [baseSystem, ...inlineParts].filter(s => s && s.trim()).join('\\n\\n')\n || (options?.openAiOAuth ? 'You are a coding assistant.' : undefined);\n\n // resolveUpstreamTools uses the shared proxy types; the adapter keeps its own\n // minimal request shapes, so cast at this boundary.\n let upstreamTools = resolveUpstreamTools(\n body.tools as unknown as AnthropicToolDefinition[] | undefined,\n messages as unknown as AnthropicRequestMessage[],\n ) as unknown as AnthropicTool[];\n if (options?.maxTools !== undefined && upstreamTools.length > options.maxTools) {\n upstreamTools = upstreamTools.slice(0, options.maxTools);\n }\n let responseSubagentRouting: SubagentModelRouting | undefined;\n if (options?.subagentRouting) {\n const agentIndex = upstreamTools.findIndex(toolDefinition => (\n isClaudeAgentTool(toolDefinition as AnthropicToolDefinition)\n ));\n if (agentIndex >= 0) {\n upstreamTools = upstreamTools.map((toolDefinition, index) => (\n index === agentIndex\n ? augmentClaudeAgentTool(\n toolDefinition as AnthropicToolDefinition,\n options.subagentRouting!,\n ) as AnthropicTool\n : toolDefinition\n ));\n responseSubagentRouting = options.subagentRouting;\n }\n }\n const effort = anthropicEffortFromRequest(body) ?? options?.defaultEffort;\n let providerOptions = deepMergeProviderOptions(\n thinkingProviderOptions(npm),\n effortProviderOptions(npm, effort, options?.reasoningMetadata?.upstreamModelId ?? body.model, options?.reasoningMetadata),\n );\n\n // ChatGPT Codex OAuth backend requires `instructions` in providerOptions and\n // rejects the standard `system` field. It also manages its own output limit.\n if (options?.openAiOAuth && systemText) {\n providerOptions = deepMergeProviderOptions(providerOptions, {\n openai: { instructions: systemText },\n });\n }\n\n return {\n instructions: options?.openAiOAuth ? undefined : systemText,\n messages: translateMessages(messages, npm, options?.onDebug),\n tools: translateTools(upstreamTools.length ? upstreamTools : undefined),\n toolChoice: translateToolChoice(body.tool_choice),\n maxOutputTokens: options?.openAiOAuth ? undefined : body.max_tokens,\n temperature: body.temperature,\n providerOptions,\n headers: options?.requestHeaders,\n subagentRouting: responseSubagentRouting,\n };\n}\n\n// ── response: SDK fullStream → Anthropic SSE ─────────────────────────────────\ntype WriteFn = (chunk: string) => void;\n\ntype LogFn = (msg: () => string) => void;\n\nfunction logSubagentDecision(log: LogFn | undefined, decision: SubagentRoutingDecision): void {\n if (!log || decision.kind === 'fork' || decision.kind === 'explicit') return;\n log(() => decision.kind === 'family-fallback'\n ? `sdk Agent model \"${decision.requestedModelId}\" unavailable; using parent ${decision.resolvedModelId}`\n : `sdk Agent model ${decision.kind}: ${'requestedModelId' in decision ? `${decision.requestedModelId} -> ` : ''}${decision.resolvedModelId}`);\n}\n\nexport async function writeAnthropicStream(\n fullStream: AsyncIterable<FullStreamPart>,\n modelId: string,\n write: WriteFn,\n log?: LogFn,\n estimatedInputTokens = 0,\n subagentRouting?: SubagentModelRouting,\n): Promise<void> {\n const messageId = 'msg_' + Date.now();\n let blockIndex = -1;\n let started = false;\n let openType: 'text' | 'thinking' | 'tool' | null = null;\n let pendingThinkingSig: string | undefined;\n const idToBlock = new Map<string, number>();\n const bufferedAgentCalls = new Map<string, { blockIndex: number }>();\n let finishReason = 'end_turn';\n let usage = { input_tokens: estimatedInputTokens, output_tokens: 0 };\n\n const emit = (event: string, data: unknown) => write(sseChunk(event, data));\n const ensureStart = () => {\n if (started) return;\n emit('message_start', {\n type: 'message_start',\n message: {\n id: messageId, type: 'message', role: 'assistant', content: [],\n model: modelId, stop_reason: null, stop_sequence: null,\n usage: { input_tokens: estimatedInputTokens, output_tokens: 0 },\n },\n });\n started = true;\n };\n const closeOpen = () => {\n if (openType === 'thinking') {\n emit('content_block_delta', {\n type: 'content_block_delta', index: blockIndex,\n delta: { type: 'signature_delta', signature: pendingThinkingSig ?? '' },\n });\n pendingThinkingSig = undefined;\n }\n if (openType) emit('content_block_stop', { type: 'content_block_stop', index: blockIndex });\n openType = null;\n };\n const openBlock = (type: 'text' | 'thinking' | 'tool', contentBlock: unknown) => {\n ensureStart(); closeOpen(); blockIndex++; openType = type;\n emit('content_block_start', { type: 'content_block_start', index: blockIndex, content_block: contentBlock });\n };\n\n for await (const part of fullStream) {\n switch (part.type) {\n case 'start': ensureStart(); break;\n\n case 'reasoning-start':\n openBlock('thinking', { type: 'thinking', thinking: '', signature: '' });\n break;\n case 'reasoning-delta':\n if (openType !== 'thinking') openBlock('thinking', { type: 'thinking', thinking: '', signature: '' });\n emit('content_block_delta', {\n type: 'content_block_delta', index: blockIndex,\n delta: { type: 'thinking_delta', thinking: part.text ?? '' },\n });\n break;\n case 'reasoning-end': {\n const sig = grabRoundTripSignature(part);\n if (sig) pendingThinkingSig = sig;\n break;\n }\n\n case 'text-start':\n openBlock('text', { type: 'text', text: '' });\n break;\n case 'text-delta':\n if (openType !== 'text') openBlock('text', { type: 'text', text: '' });\n emit('content_block_delta', {\n type: 'content_block_delta', index: blockIndex,\n delta: { type: 'text_delta', text: part.text ?? '' },\n });\n break;\n case 'text-end': break;\n\n case 'tool-input-start': {\n const sig = grabRoundTripSignature(part);\n openBlock('tool', {\n type: 'tool_use', id: encodeToolUseId(part.id ?? '', sig), name: part.toolName, input: {},\n });\n idToBlock.set(part.id ?? '', blockIndex);\n if (subagentRouting && part.toolName === 'Agent') {\n bufferedAgentCalls.set(part.id ?? '', { blockIndex });\n }\n break;\n }\n case 'tool-input-delta':\n if (bufferedAgentCalls.has(part.id ?? '')) break;\n emit('content_block_delta', {\n type: 'content_block_delta', index: idToBlock.get(part.id ?? '') ?? blockIndex,\n delta: { type: 'input_json_delta', partial_json: part.delta ?? part.text ?? '' },\n });\n break;\n case 'tool-input-end': break;\n\n case 'tool-call': {\n finishReason = 'tool_use';\n const toolCallId = part.toolCallId ?? '';\n if (subagentRouting && part.toolName === 'Agent') {\n try {\n const normalized = prepareClaudeAgentInput(part.input, subagentRouting);\n logSubagentDecision(log, normalized.decision);\n const buffered = bufferedAgentCalls.get(toolCallId);\n if (!buffered && !idToBlock.has(toolCallId)) {\n const sig = grabRoundTripSignature(part);\n openBlock('tool', {\n type: 'tool_use',\n id: encodeToolUseId(toolCallId, sig),\n name: part.toolName,\n input: {},\n });\n idToBlock.set(toolCallId, blockIndex);\n }\n emit('content_block_delta', {\n type: 'content_block_delta',\n index: buffered?.blockIndex ?? idToBlock.get(toolCallId) ?? blockIndex,\n delta: {\n type: 'input_json_delta',\n partial_json: JSON.stringify(stripNullInputs(normalized.input)),\n },\n });\n bufferedAgentCalls.delete(toolCallId);\n } catch (error) {\n if (error instanceof UnavailableSubagentModelError) {\n bufferedAgentCalls.delete(toolCallId);\n closeOpen();\n emit('error', {\n type: 'error',\n error: {\n type: anthropicErrorType(error.statusCode),\n message: error.message,\n },\n });\n return;\n }\n throw error;\n }\n break;\n }\n // Non-streamed tool call (no input-start/delta arrived): emit a full block.\n if (!idToBlock.has(toolCallId) && openType !== 'tool') {\n const sig = grabRoundTripSignature(part);\n openBlock('tool', {\n type: 'tool_use', id: encodeToolUseId(toolCallId, sig), name: part.toolName, input: {},\n });\n emit('content_block_delta', {\n type: 'content_block_delta', index: blockIndex,\n delta: { type: 'input_json_delta', partial_json: JSON.stringify(stripNullInputs(part.input as Record<string, unknown> ?? {})) },\n });\n }\n break;\n }\n\n case 'finish':\n if (part.totalUsage) {\n usage = {\n input_tokens: part.totalUsage.inputTokens ?? estimatedInputTokens,\n output_tokens: part.totalUsage.outputTokens ?? 0,\n };\n }\n if (part.finishReason === 'tool-calls') finishReason = 'tool_use';\n else if (part.finishReason === 'length') finishReason = 'max_tokens';\n else if (part.finishReason === 'stop' && finishReason !== 'tool_use') finishReason = 'end_turn';\n break;\n\n case 'error': {\n const e = part.error as { data?: unknown; message?: string } | undefined;\n const errMsg = e?.message || (typeof part.error === 'string' ? part.error : JSON.stringify(e?.data ?? part.error));\n const errorType = anthropicErrorType(upstreamHttpStatus(part.error, errMsg));\n log?.(() => `sdk stream error (${errorType}): ${errMsg}`);\n bufferedAgentCalls.clear();\n closeOpen();\n emit('error', { type: 'error', error: { type: errorType, message: errMsg } });\n return;\n }\n\n default: break;\n }\n }\n\n closeOpen();\n ensureStart();\n emit('message_delta', { type: 'message_delta', delta: { stop_reason: finishReason, stop_sequence: null }, usage });\n emit('message_stop', { type: 'message_stop' });\n}\n\n// ── high-level entry points ──────────────────────────────────────────────────\nexport async function streamAnthropicResponse(\n model: LanguageModel,\n params: SdkCallParams,\n modelId: string,\n write: WriteFn,\n log?: LogFn,\n estimatedInputTokens = 0,\n): Promise<void> {\n const { subagentRouting, ...providerParams } = params;\n const result = streamText({ model, ...providerParams, onError: () => {} } as Parameters<typeof streamText>[0]);\n // Prevent unhandled promise rejections on stream properties:\n Promise.resolve(result.text).catch(() => {});\n Promise.resolve(result.toolCalls).catch(() => {});\n Promise.resolve(result.toolResults).catch(() => {});\n Promise.resolve(result.finishReason).catch(() => {});\n Promise.resolve(result.usage).catch(() => {});\n\n await writeAnthropicStream(\n result.stream as AsyncIterable<FullStreamPart>,\n modelId,\n write,\n log,\n estimatedInputTokens,\n subagentRouting,\n );\n}\n\nexport async function generateAnthropicResponse(\n model: LanguageModel,\n params: SdkCallParams,\n modelId: string,\n options?: { forceStream?: boolean; log?: LogFn },\n): Promise<Record<string, unknown>> {\n const { subagentRouting, ...providerParams } = params;\n let text: string;\n let toolCalls: Array<{ toolCallId: string; toolName: string; input: unknown }>;\n let finishReason: string;\n let usage: { inputTokens?: number; outputTokens?: number } | undefined;\n\n if (options?.forceStream) {\n // Some upstreams (e.g. ChatGPT's Codex backend) reject non-streaming requests\n // outright. Request a real stream from the SDK and collect it into one\n // response instead of forwarding the client's non-streaming request upstream.\n let firstStreamError: { error: unknown } | undefined;\n const r = streamText({\n model,\n ...providerParams,\n onError: (event) => { firstStreamError ??= event; },\n } as Parameters<typeof streamText>[0]);\n Promise.resolve(r.toolResults).catch(() => {});\n try {\n [text, toolCalls, finishReason, usage] = await Promise.all([r.text, r.toolCalls, r.finishReason, r.usage]);\n } catch (error) {\n // The SDK can replace an upstream failure with NoOutputGeneratedError\n // when its result promises reject. Keep the original status and details.\n throw firstStreamError ? firstStreamError.error : error;\n }\n } else {\n const r = await generateText({ model, ...providerParams } as Parameters<typeof generateText>[0]);\n ({ text, toolCalls, finishReason, usage } = r);\n }\n\n return {\n id: 'msg_' + Date.now(), type: 'message', role: 'assistant', model: modelId,\n content: [\n ...(text ? [{ type: 'text', text }] : []),\n ...toolCalls.map(tc => {\n let input = tc.input as Record<string, unknown>;\n if (subagentRouting && tc.toolName === 'Agent') {\n const normalized = prepareClaudeAgentInput(tc.input, subagentRouting);\n logSubagentDecision(options?.log, normalized.decision);\n input = normalized.input;\n }\n return {\n type: 'tool_use',\n id: encodeToolUseId(tc.toolCallId, grabRoundTripSignature(tc as FullStreamPart)),\n name: tc.toolName,\n input: stripNullInputs(input),\n };\n }),\n ],\n stop_reason: finishReason === 'tool-calls' ? 'tool_use' : 'end_turn',\n usage: { input_tokens: usage?.inputTokens ?? 0, output_tokens: usage?.outputTokens ?? 0 },\n };\n}\n","// Tool-search helpers for Anthropic ↔ upstream proxy translation.\n//\n// Claude Code defers MCP tools (defer_loading: true) and discovers them via\n// tool_reference blocks. Upstream models (Gemini, OpenAI) only receive tools\n// that are immediately available: non-deferred, tool-search, and any tool\n// already referenced in the conversation.\n\nimport type { AnthropicRequestMessage, AnthropicToolDefinition } from './proxy-types.js';\n\nconst TOOL_SEARCH_TYPE_PREFIX = 'tool_search_tool';\n\nexport function isToolSearchTool(tool: AnthropicToolDefinition): boolean {\n if (typeof tool.type === 'string' && tool.type.startsWith(TOOL_SEARCH_TYPE_PREFIX)) return true;\n const name = tool.name ?? '';\n return name.includes('tool_search') || name === 'ToolSearch';\n}\n\n/** Collect tool names referenced anywhere in the message history. */\nexport function extractReferencedToolNames(messages: AnthropicRequestMessage[] | undefined): Set<string> {\n const names = new Set<string>();\n\n const visitContent = (content: unknown) => {\n if (typeof content === 'string') return;\n if (!Array.isArray(content)) return;\n\n for (const block of content) {\n if (!block || typeof block !== 'object') continue;\n const part = block as Record<string, unknown>;\n\n if (part.type === 'tool_reference' && typeof part.tool_name === 'string') {\n names.add(part.tool_name);\n }\n\n if (part.type === 'tool_search_tool_result') {\n const inner = part.content as Record<string, unknown> | undefined;\n const refs = inner?.tool_references;\n if (Array.isArray(refs)) {\n for (const ref of refs) {\n if (ref && typeof ref === 'object' && typeof (ref as Record<string, unknown>).tool_name === 'string') {\n names.add((ref as Record<string, string>).tool_name);\n }\n }\n }\n }\n\n if (part.type === 'tool_result' && part.content) {\n visitContent(part.content);\n }\n }\n };\n\n for (const msg of messages ?? []) {\n visitContent(msg.content);\n }\n\n return names;\n}\n\n/** Tools to forward upstream — deferred tools omitted until referenced. */\nexport function resolveUpstreamTools(\n tools: AnthropicToolDefinition[] | undefined,\n messages: AnthropicRequestMessage[] | undefined,\n): AnthropicToolDefinition[] {\n if (!tools?.length) return [];\n\n const referenced = extractReferencedToolNames(messages);\n const upstream: AnthropicToolDefinition[] = [];\n\n for (const tool of tools) {\n if (isToolSearchTool(tool)) {\n upstream.push(tool);\n continue;\n }\n if (tool.defer_loading === true) {\n if (referenced.has(tool.name)) upstream.push(tool);\n continue;\n }\n upstream.push(tool);\n }\n\n return upstream;\n}\n"],"mappings":"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","names":["homedir","join","readFileSync","homedir","homedir","readFileSync","readFileSync","homedir","join","CLIENT_ID","TOKEN_URL","DEVICE_CODE_DEFAULT_EXPIRES_MS","OAUTH_POLLING_SAFETY_MARGIN_MS","CLIENT_ID","TOKEN_URL","SCOPE","DEVICE_CODE_DEFAULT_INTERVAL_MS","DEVICE_CODE_DEFAULT_EXPIRES_MS","OAUTH_POLLING_SAFETY_MARGIN_MS","open","AUTHORIZE_URL","TOKEN_URL","SCOPES","open","existsSync","readFileSync","existsSync","readFileSync","chmodSync","existsSync","mkdirSync","readFileSync","DIR_MODE","FILE_MODE","mkdirSync","chmodSync","raw","existsSync","readFileSync","CLAUDE_CODE_CLI_VERSION","entry","open","randomUUID","isRecord","tool","tool"]}
|