@jeffreycao/copilot-api 2.6.12 → 2.6.14
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 +5 -2
- package/README.zh-CN.md +5 -2
- package/dist/auth-80i7uQZz.js +2 -0
- package/dist/{auth-BmwqHw2M.js → auth-BrjvQ0qN.js} +3 -3
- package/dist/{auth-BmwqHw2M.js.map → auth-BrjvQ0qN.js.map} +1 -1
- package/dist/{config-DrIQvPh1.js → config-B_pC8QXv.js} +13 -4
- package/dist/config-B_pC8QXv.js.map +1 -0
- package/dist/{debug-CsnBCL0y.js → debug-C4rsL806.js} +2 -2
- package/dist/{debug-CsnBCL0y.js.map → debug-C4rsL806.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{models-DBLluNx2.js → models-CP0sdQmq.js} +2 -2
- package/dist/{models-DBLluNx2.js.map → models-CP0sdQmq.js.map} +1 -1
- package/dist/{server-DDx3vRfk.js → server-CWfDxvKW.js} +33 -9
- package/dist/server-CWfDxvKW.js.map +1 -0
- package/dist/{start-lV093nRP.js → start-BBW3xFvJ.js} +6 -6
- package/dist/{start-lV093nRP.js.map → start-BBW3xFvJ.js.map} +1 -1
- package/dist/{token-BffZVEF7.js → token-FQiOqL6l.js} +14 -4
- package/dist/token-FQiOqL6l.js.map +1 -0
- package/package.json +1 -1
- package/dist/auth--lP6X6CT.js +0 -2
- package/dist/config-DrIQvPh1.js.map +0 -1
- package/dist/server-DDx3vRfk.js.map +0 -1
- package/dist/token-BffZVEF7.js.map +0 -1
package/README.md
CHANGED
|
@@ -706,7 +706,10 @@ Gateway API keys live under `auth.apiKeys` in `config.json`. Manage them with `c
|
|
|
706
706
|
},
|
|
707
707
|
"providers": {},
|
|
708
708
|
"modelMappings": {},
|
|
709
|
-
"
|
|
709
|
+
"smallModels": {
|
|
710
|
+
"codex": "gpt-6-luna",
|
|
711
|
+
"copilot": "gpt-6-luna"
|
|
712
|
+
},
|
|
710
713
|
"contextManagement": {
|
|
711
714
|
"messages": true,
|
|
712
715
|
"responses": false
|
|
@@ -759,7 +762,7 @@ Gateway API keys live under `auth.apiKeys` in `config.json`. Manage them with `c
|
|
|
759
762
|
- `reasoningEfforts` (optional): Reasoning levels advertised for Codex. Missing configured and upstream values use the built-in non-GPT model catalog before falling back to `["high", "xhigh", "max", "ultra"]`. Provider Responses requests with an unsupported effort are normalized to a supported level when these capabilities are known.
|
|
760
763
|
- `defaultReasoningEffort` (optional): Default Codex reasoning level. Built-in model metadata may provide a known default; otherwise it defaults to `max` when available, then the first configured level. Synthetic Codex models always enable parallel tool calls.
|
|
761
764
|
- `reasoningField` (optional): Assistant thinking field sent upstream on OpenAI-compatible `/v1/messages` requests. Supports `reasoning` and `reasoning_content`; defaults to `reasoning_content`. Use `reasoning` for OpenRouter-style models; OpenCode Go Hy-family models use this field based on the models.dev family metadata.
|
|
762
|
-
- **
|
|
765
|
+
- **smallModels:** Per-provider model IDs for Codex task-title `/v1/responses` requests. `codex` and `copilot` default to `gpt-6-luna`; other providers switch only when named explicitly (e.g. `smallModels.dashscope`). Use a model supported by that provider; an empty string disables switching. The request must have matching user `input_text` in one of its last two input items. `copilot` also controls tool-less Claude Code warmups for non-token-based-billing accounts. The old `smallModel` key is ignored.
|
|
763
766
|
- **contextManagement:** Controls whether the proxy adds Responses API `context_management` compaction instructions. `messages` applies when Anthropic-style `/v1/messages` requests are translated to Responses API, including `openai-responses` provider message routes, and defaults to `true`. `responses` applies to native `/v1/responses` traffic, including `provider/model` aliases and the built-in `codex` provider, and defaults to `false`. Enable `responses` only after checking that your client supports context management compaction. When enabled, the request includes `context_management` in the body and keeps only the latest compaction carrier on follow-up turns. The proxy only adds context management and compacts history for `gpt-*` models; both configuration switches have no effect on non-GPT models such as Grok. **Note:** Context management is also forcibly disabled for GPT-5.6 and above models (e.g. `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`) because enabling it breaks prompt cache hits on those models. These overrides take precedence over the `contextManagement` and `modelResponsesApiCompactThresholds` settings.
|
|
764
767
|
- **modelResponsesApiCompactThresholds:** Per-model Responses API `compact_threshold` overrides used when the proxy adds `context_management`. These values take precedence over the fallback threshold from `resolveResponsesCompactThreshold` (`max_prompt_tokens * ratio`, or the default fallback). Defaults set `gpt-5.4` and `gpt-5.5` to `217600` (`272000 * 0.8`). Models not listed continue to use the normal fallback logic.
|
|
765
768
|
- **modelReasoningEfforts:** Per-model fallback reasoning effort for `/v1/messages` requests. It is used only when the request does not provide `output_config.effort`.
|
package/README.zh-CN.md
CHANGED
|
@@ -750,7 +750,10 @@ OpenCode Go 的模型列表(`/opencode-go/v1/models` 及 `/v1/models` 中的
|
|
|
750
750
|
},
|
|
751
751
|
"providers": {},
|
|
752
752
|
"modelMappings": {},
|
|
753
|
-
"
|
|
753
|
+
"smallModels": {
|
|
754
|
+
"codex": "gpt-6-luna",
|
|
755
|
+
"copilot": "gpt-6-luna"
|
|
756
|
+
},
|
|
754
757
|
"contextManagement": {
|
|
755
758
|
"messages": true,
|
|
756
759
|
"responses": false
|
|
@@ -803,7 +806,7 @@ OpenCode Go 的模型列表(`/opencode-go/v1/models` 及 `/v1/models` 中的
|
|
|
803
806
|
- `reasoningEfforts`:可选,Codex 支持的推理档位。配置和上游元数据均未提供时,会先使用非 GPT 模型的内置目录,再回退到 `["high", "xhigh", "max", "ultra"]`。已知模型能力时,Provider Responses 请求中的不支持档位会被归一化为支持的档位。
|
|
804
807
|
- `defaultReasoningEffort`:可选,Codex 默认推理档位;内置模型元数据可以提供已知默认值,否则可用档位包含 `max` 时默认取 `max`,再回退到配置的第一个档位。合成 Codex 模型始终启用并行工具调用。
|
|
805
808
|
- `reasoningField`:可选,OpenAI-compatible `/v1/messages` 转发 assistant 思考文本时使用的字段,支持 `reasoning` 与 `reasoning_content`,默认 `reasoning_content`;OpenRouter 风格模型设为 `reasoning`,OpenCode Go 的 Hy 系列模型会根据 models.dev 的 family 元数据使用 `reasoning` 字段。
|
|
806
|
-
- **
|
|
809
|
+
- **smallModels:** 按 provider 指定 Codex 客户端 `/v1/responses` 标题请求的模型。`codex`、`copilot` 默认使用 `gpt-6-luna`;其他 provider 仅在配置同名键时切换(如 `smallModels.dashscope`)。模型须受对应 provider 支持;设为空字符串可禁用切换。标题提示词须出现在最后两个 input 项之一的 user `input_text` 中。`copilot` 也用于非 token-based 计费账户的 Claude Code 无工具预热;旧 `smallModel` 不再生效。
|
|
807
810
|
- **contextManagement:** 控制代理是否为 Responses API 附加 `context_management` 压缩指令。`messages` 作用于被翻译成 Responses API 的 Anthropic 风格 `/v1/messages` 请求,包括 `openai-responses` provider 的 Messages 路由,默认值为 `true`。`responses` 作用于 native `/v1/responses` 流量,包括 `provider/model` 别名和内置 `codex` provider,默认值为 `false`。只有在确认客户端支持 context management compaction 后,才建议在 Responses API 下启用 `responses`。启用后,请求体会带上 `context_management`,并在后续轮次中仅保留最新的压缩承载内容。代理仅为 `gpt-*` 模型添加 context management 并压缩历史;这两个配置开关对 Grok 等非 GPT 模型不生效。**注意:** 对于 GPT-5.6 及以上模型(如 `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna`),context management 功能同样会被强制禁用,因为开启后会破坏这些模型的 prompt 缓存命中。这些强制覆盖优先于 `contextManagement` 和 `modelResponsesApiCompactThresholds` 配置。
|
|
808
811
|
- **modelResponsesApiCompactThresholds:** 按模型覆盖 Responses API 的 `compact_threshold`,仅在代理自动附加 `context_management` 时使用。它的优先级高于 `resolveResponsesCompactThreshold` 基于 `max_prompt_tokens * ratio` 的兜底阈值。默认将 `gpt-5.4` 和 `gpt-5.5` 设为 `217600`(`272000 * 0.8`)。未列出的模型继续使用原有兜底逻辑。
|
|
809
812
|
- **modelReasoningEfforts:** `/v1/messages` 请求的模型级默认推理强度。仅当请求没有传入 `output_config.effort` 时,该配置才会生效。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as
|
|
2
|
-
import { F as getConfiguredApiKeys, L as loginCodex, Z as state, a as selectCodexAccount, c as setupGitHubToken, i as removeCodexAccount, r as persistCodexCredentials, t as getCodexAccounts } from "./token-
|
|
1
|
+
import { B as PATHS, T as SUPPORTED_PROVIDER_TYPES, V as ensurePaths, a as normalizeProviderBaseUrl, c as setProviderConfig, f as loadModelsDevProviderOptions, n as getRawProviderConfig, r as isSupportedProviderType, z as setConfiguredApiKeys } from "./config-B_pC8QXv.js";
|
|
2
|
+
import { F as getConfiguredApiKeys, L as loginCodex, Z as state, a as selectCodexAccount, c as setupGitHubToken, i as removeCodexAccount, r as persistCodexCredentials, t as getCodexAccounts } from "./token-FQiOqL6l.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import consola from "consola";
|
|
5
5
|
//#region src/lib/quick-providers.ts
|
|
@@ -609,4 +609,4 @@ const auth = defineCommand({
|
|
|
609
609
|
//#endregion
|
|
610
610
|
export { runProviderSetup as a, runAuthLogin as i, runAuthCodex as n, runAuthKeys as r, auth as t };
|
|
611
611
|
|
|
612
|
-
//# sourceMappingURL=auth-
|
|
612
|
+
//# sourceMappingURL=auth-BrjvQ0qN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-BmwqHw2M.js","names":[],"sources":["../src/lib/quick-providers.ts","../src/lib/interactive-prompt.ts","../src/auth.ts"],"sourcesContent":["import type { ProviderType } from \"./config\"\n\ninterface QuickProviderConfig {\n type: ProviderType\n baseUrl: string\n pricingCurrency: string\n editableType: boolean\n}\n\nexport const QUICK_PROVIDER_CONFIGS = {\n \"opencode-go\": {\n type: \"openai-compatible\",\n baseUrl: \"https://opencode.ai/zen/go\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n kimi: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.kimi.com/coding\",\n pricingCurrency: \"USD\",\n editableType: true,\n },\n deepseek: {\n type: \"anthropic\",\n baseUrl: \"https://api.deepseek.com/anthropic\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n dashscope: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n openrouter: {\n type: \"anthropic\",\n baseUrl: \"https://openrouter.ai/api\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n} satisfies Record<string, QuickProviderConfig>\n\nexport type QuickProviderName = keyof typeof QUICK_PROVIDER_CONFIGS\n","import consola from \"consola\"\n\ninterface PromptSelectOption {\n label: string\n value: string\n hint?: string\n}\n\ninterface TextPromptOptions {\n type?: \"text\"\n default?: string\n initial?: string\n placeholder?: string\n}\n\ninterface SelectPromptOptions {\n type: \"select\"\n initial?: string\n options: Array<string | PromptSelectOption>\n}\n\nexport type InteractivePromptOptions = SelectPromptOptions | TextPromptOptions\n\ninterface ClackSelectOptions {\n message: string\n initialValue?: string\n options: Array<PromptSelectOption>\n}\n\ninterface ClackTextOptions {\n message: string\n defaultValue?: string\n initialValue?: string\n placeholder?: string\n}\n\nexport interface ClackPromptBackend {\n isCancel(value: unknown): boolean\n select(options: ClackSelectOptions): Promise<string | symbol>\n text(options: ClackTextOptions): Promise<string | symbol>\n}\n\ninterface PromptRuntime {\n bunVersion?: string\n platform: NodeJS.Platform\n stdinIsTTY?: boolean\n stdoutIsTTY?: boolean\n stdoutIsTTYStream?: boolean\n}\n\n// Consola 3.4.2 bundles a prompt implementation that writes keyboard input to\n// tty fd 0. Bun treats that as a real stdin write on Windows and throws EPIPE.\nexport function shouldUseClackPrompt(\n runtime: PromptRuntime = {\n bunVersion: process.versions.bun,\n platform: process.platform,\n stdinIsTTY: process.stdin.isTTY,\n stdoutIsTTY: process.stdout.isTTY,\n stdoutIsTTYStream: typeof process.stdout.getColorDepth === \"function\",\n },\n): boolean {\n return Boolean(\n runtime.platform === \"win32\"\n && runtime.bunVersion\n && runtime.stdinIsTTY\n && runtime.stdoutIsTTY\n && runtime.stdoutIsTTYStream,\n )\n}\n\nfunction getCancelValue(options: InteractivePromptOptions): string | undefined {\n return options.type === \"select\" ?\n options.initial\n : (options.default ?? options.initial)\n}\n\nexport async function promptWithClack(\n message: string,\n options: InteractivePromptOptions,\n backend: ClackPromptBackend,\n): Promise<string | undefined> {\n if (options.type === \"select\") {\n const value = await backend.select({\n message,\n options: options.options.map((option) =>\n typeof option === \"string\" ? { label: option, value: option } : option,\n ),\n initialValue: options.initial,\n })\n if (backend.isCancel(value)) {\n return getCancelValue(options)\n }\n return typeof value === \"string\" ? value : undefined\n }\n\n const value = await backend.text({\n message,\n defaultValue: options.default,\n initialValue: options.initial,\n placeholder: options.placeholder,\n })\n if (backend.isCancel(value)) {\n return getCancelValue(options)\n }\n return typeof value === \"string\" ? value : undefined\n}\n\nexport async function prompt(\n message: string,\n options: InteractivePromptOptions,\n): Promise<string | undefined> {\n if (!shouldUseClackPrompt()) {\n if (options.type === \"select\") {\n const value = await consola.prompt(message, options)\n return typeof value === \"string\" ? value : undefined\n }\n return await consola.prompt(message, options)\n }\n\n const clack = await import(\"@clack/prompts\")\n return await promptWithClack(message, options, clack)\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport {\n getRawProviderConfig,\n isSupportedProviderType,\n normalizeProviderBaseUrl,\n setProviderConfig,\n setConfiguredApiKeys,\n SUPPORTED_PROVIDER_TYPES,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./lib/config\"\nimport { loginCodex } from \"./lib/oauth/codex\"\nimport {\n loadModelsDevProviderOptions,\n type ModelsDevProviderOption,\n} from \"./lib/models-dev-cache\"\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { getConfiguredApiKeys } from \"./lib/request-auth\"\nimport {\n QUICK_PROVIDER_CONFIGS,\n type QuickProviderName,\n} from \"./lib/quick-providers\"\nimport { prompt } from \"./lib/interactive-prompt\"\nimport { state } from \"./lib/state\"\nimport {\n getCodexAccounts,\n persistCodexCredentials,\n removeCodexAccount,\n selectCodexAccount,\n setupGitHubToken,\n type CodexAccountSummary,\n} from \"./lib/token\"\n\ninterface RunAuthOptions {\n alias?: string\n provider?: string\n verbose: boolean\n showToken: boolean\n}\n\nconst authArgs = {\n provider: {\n type: \"string\",\n description:\n \"Provider to log in with or configure (copilot, codex, opencode-go, kimi, deepseek, dashscope, openrouter, custom)\",\n },\n alias: {\n type: \"string\",\n description: \"Optional alias for a Codex account\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show provider access token on auth\",\n },\n} as const\n\nconst BUILTIN_PROVIDER_NAMES = [\"copilot\", \"codex\"] as const\nconst QUICK_PROVIDER_NAMES = Object.keys(\n QUICK_PROVIDER_CONFIGS,\n) as Array<QuickProviderName>\nconst AUTH_PROVIDER_NAMES = [\n ...BUILTIN_PROVIDER_NAMES,\n ...QUICK_PROVIDER_NAMES,\n \"custom\",\n] as const\nconst CUSTOM_PROVIDER_AUTH_TYPE_OPTION = \"__default__\"\nconst QUICK_PROVIDER_DEFAULT_TYPE_OPTION = \"__default__\"\nconst CUSTOM_PROVIDER_AUTH_TYPES = [\"x-api-key\", \"authorization\"] as const\n\ntype BuiltinProviderName = (typeof BUILTIN_PROVIDER_NAMES)[number]\ntype AuthProviderName = (typeof AUTH_PROVIDER_NAMES)[number]\ntype CustomProviderAuthType = (typeof CUSTOM_PROVIDER_AUTH_TYPES)[number]\n\nconst BUILTIN_PROVIDER_LABELS: Record<BuiltinProviderName, string> = {\n copilot: \"GitHub Copilot\",\n codex: \"OpenAI Codex\",\n}\nconst AUTH_PROVIDER_LABELS: Record<AuthProviderName, string> = {\n ...BUILTIN_PROVIDER_LABELS,\n \"opencode-go\": \"OpenCode Go\",\n kimi: \"Kimi\",\n deepseek: \"DeepSeek\",\n dashscope: \"DashScope\",\n openrouter: \"OpenRouter\",\n custom: \"Custom provider\",\n}\n\nfunction isAuthProviderName(\n providerName: string,\n): providerName is AuthProviderName {\n return AUTH_PROVIDER_NAMES.includes(providerName as AuthProviderName)\n}\n\nfunction isCustomProviderAuthType(\n value: string,\n): value is CustomProviderAuthType {\n return CUSTOM_PROVIDER_AUTH_TYPES.includes(value as CustomProviderAuthType)\n}\n\nfunction isQuickProviderName(\n providerName: AuthProviderName,\n): providerName is QuickProviderName {\n return QUICK_PROVIDER_NAMES.includes(providerName as QuickProviderName)\n}\n\nasync function resolveProviderSelection(\n providerArg: string | undefined,\n): Promise<AuthProviderName> {\n const availableProviders = [...AUTH_PROVIDER_NAMES]\n\n if (providerArg !== undefined) {\n const providerName = providerArg.trim()\n if (!isAuthProviderName(providerName)) {\n throw new Error(\n `Unknown provider '${providerArg}'. Expected one of: ${availableProviders.join(\", \")}`,\n )\n }\n return providerName\n }\n\n if (availableProviders.length === 1) {\n return availableProviders[0]\n }\n\n const provider = await prompt(\"Select a provider to log in with\", {\n type: \"select\",\n options: availableProviders.map((providerName) => ({\n label: `${AUTH_PROVIDER_LABELS[providerName]} (${providerName})`,\n value: providerName,\n })),\n })\n\n if (!provider || !isAuthProviderName(provider)) {\n throw new Error(\"No provider selected\")\n }\n\n return provider\n}\n\nfunction assertCustomProviderName(providerName: string): void {\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(providerName)) {\n throw new Error(\n \"Provider name must start with a letter or number and contain only letters, numbers, underscores, or hyphens\",\n )\n }\n\n if (providerName === \"copilot\" || providerName === \"codex\") {\n throw new Error(\n `Provider name '${providerName}' is reserved for a builtin provider`,\n )\n }\n}\n\nasync function promptRequiredText(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await prompt(message, { type: \"text\" })\n const normalizedValue = typeof value === \"string\" ? value.trim() : \"\"\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nfunction canUseMaskedPrompt(): boolean {\n return Boolean(\n process.stdin.isTTY\n && process.stdout.isTTY\n && typeof process.stdin.setRawMode === \"function\",\n )\n}\n\nasync function promptMaskedText(message: string): Promise<string> {\n if (!canUseMaskedPrompt()) {\n const value = await prompt(message, { type: \"text\" })\n return typeof value === \"string\" ? value : \"\"\n }\n\n return await new Promise<string>((resolve, reject) => {\n let value = \"\"\n const rawModeWasEnabled = process.stdin.isRaw === true\n\n function cleanup(): void {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode(rawModeWasEnabled)\n process.stdin.pause()\n }\n\n function finish(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n resolve(value)\n }\n\n function cancel(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n reject(new Error(\"Prompt cancelled\"))\n }\n\n function onData(chunk: Buffer): void {\n const input = chunk.toString(\"utf8\")\n\n if (input.startsWith(\"\\u001B\")) {\n return\n }\n\n for (const char of input) {\n if (char === \"\\u0003\") {\n cancel()\n return\n }\n\n if (char === \"\\r\" || char === \"\\n\") {\n finish()\n return\n }\n\n if (char === \"\\b\" || char === \"\\u007F\") {\n if (value.length > 0) {\n value = value.slice(0, -1)\n process.stdout.write(\"\\b \\b\")\n }\n continue\n }\n\n if (char >= \" \") {\n value += char\n process.stdout.write(\"*\")\n }\n }\n }\n\n process.stdout.write(`${message}: `)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.on(\"data\", onData)\n })\n}\n\nasync function promptRequiredSecret(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await promptMaskedText(message)\n const normalizedValue = value.trim()\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nasync function promptCustomProviderName(defaultName?: string): Promise<string> {\n const value = await prompt(\"Enter provider name\", {\n type: \"text\",\n ...(defaultName ? { default: defaultName, initial: defaultName } : {}),\n })\n const providerName = (value || defaultName || \"\").trim()\n assertCustomProviderName(providerName)\n return providerName\n}\n\nasync function promptCustomProviderType(\n defaultType?: ProviderType,\n): Promise<ProviderType> {\n const providerType = await prompt(\"Select provider type\", {\n type: \"select\",\n initial: defaultType,\n options: SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n })\n\n if (\n typeof providerType !== \"string\"\n || !isSupportedProviderType(providerType)\n ) {\n throw new Error(\"No provider type selected\")\n }\n\n return providerType\n}\n\nasync function promptModelsDevProvider(): Promise<\n ModelsDevProviderOption | undefined\n> {\n const source = await prompt(\"Choose custom provider source\", {\n type: \"select\",\n options: [\n { label: \"Enter manually\", value: \"manual\" },\n { label: \"Choose from models.dev\", value: \"models-dev\" },\n ],\n })\n if (source === \"manual\") return undefined\n if (source !== \"models-dev\") throw new Error(\"No provider source selected\")\n\n const providers = await loadModelsDevProviderOptions()\n const query = (\n (await prompt(\"Search models.dev providers (blank to list all)\", {\n type: \"text\",\n })) ?? \"\"\n )\n .trim()\n .toLowerCase()\n const matches = providers.filter(\n (provider) =>\n provider.id.toLowerCase().includes(query)\n || provider.name.toLowerCase().includes(query),\n )\n if (matches.length === 0) {\n throw new Error(\"No matching models.dev providers with a supported API URL\")\n }\n const selectedId = await prompt(\"Select a models.dev provider\", {\n type: \"select\",\n options: matches.map((provider) => ({\n label: `${provider.name} (${provider.id}) — ${provider.type}`,\n value: provider.id,\n })),\n })\n const selectedProvider = matches.find(\n (provider) => provider.id === selectedId,\n )\n if (!selectedProvider) throw new Error(\"No models.dev provider selected\")\n return selectedProvider\n}\n\nasync function promptQuickProviderType(\n defaultType: ProviderType,\n): Promise<ProviderType> {\n const providerType = await prompt(\n `Select provider type (default: ${defaultType})`,\n {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultType})`,\n value: QUICK_PROVIDER_DEFAULT_TYPE_OPTION,\n },\n ...SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n ],\n },\n )\n\n if (providerType === QUICK_PROVIDER_DEFAULT_TYPE_OPTION) {\n return defaultType\n }\n\n if (\n typeof providerType === \"string\"\n && isSupportedProviderType(providerType)\n ) {\n return providerType\n }\n\n throw new Error(\"No provider type selected\")\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nasync function promptCustomProviderAuthType(\n providerType: ProviderType,\n): Promise<ProviderAuthType | undefined> {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n const authType = await prompt(\"Select provider auth type\", {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultAuthType})`,\n value: CUSTOM_PROVIDER_AUTH_TYPE_OPTION,\n },\n ...CUSTOM_PROVIDER_AUTH_TYPES.map((value) => ({\n label: value,\n value,\n })),\n ],\n })\n\n if (authType === CUSTOM_PROVIDER_AUTH_TYPE_OPTION) {\n return undefined\n }\n\n if (typeof authType === \"string\" && isCustomProviderAuthType(authType)) {\n return authType\n }\n\n throw new Error(\"No provider auth type selected\")\n}\n\nasync function promptQuickProviderBaseUrl(\n defaultBaseUrl: string,\n): Promise<string> {\n const value = await prompt(\n `Enter provider baseUrl (default: ${defaultBaseUrl})`,\n {\n type: \"text\",\n default: defaultBaseUrl,\n initial: defaultBaseUrl,\n },\n )\n const baseUrl = normalizeProviderBaseUrl(\n typeof value === \"string\" && value.trim() ? value : defaultBaseUrl,\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n return baseUrl\n}\n\nfunction buildCustomProviderConfig(\n existingProviderConfig: ProviderConfig,\n options: {\n apiKey: string\n authType?: ProviderAuthType\n baseUrl: string\n pricingCurrency?: string\n type: ProviderType\n modelsDevProviderId?: string\n },\n): ProviderConfig {\n return {\n type: options.type,\n enabled: true,\n baseUrl: options.baseUrl,\n ...(options.modelsDevProviderId && {\n modelsDevProviderId: options.modelsDevProviderId,\n }),\n apiKey: options.apiKey,\n ...(options.authType ? { authType: options.authType } : {}),\n pricingCurrency:\n options.pricingCurrency ?? existingProviderConfig.pricingCurrency,\n ...(existingProviderConfig.models ?\n { models: existingProviderConfig.models }\n : {}),\n }\n}\n\nasync function configureCustomProvider(): Promise<void> {\n const catalogProvider = await promptModelsDevProvider()\n const providerName = await promptCustomProviderName(catalogProvider?.id)\n const type = await promptCustomProviderType(catalogProvider?.type)\n const baseUrl =\n catalogProvider ?\n await promptQuickProviderBaseUrl(catalogProvider.api)\n : normalizeProviderBaseUrl(\n await promptRequiredText(\"Enter provider baseUrl\", \"baseUrl\"),\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n const apiKey = await promptRequiredSecret(\"Enter provider apiKey\", \"apiKey\")\n const authType = await promptCustomProviderAuthType(type)\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n authType,\n baseUrl,\n modelsDevProviderId: catalogProvider?.id,\n type,\n }),\n )\n\n consola.success(\n `Custom provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function configureQuickProvider(\n providerName: QuickProviderName,\n): Promise<void> {\n const defaultProviderConfig = QUICK_PROVIDER_CONFIGS[providerName]\n const apiKey = await promptRequiredSecret(\n `Enter ${providerName} apiKey`,\n \"apiKey\",\n )\n const type =\n defaultProviderConfig.editableType ?\n await promptQuickProviderType(defaultProviderConfig.type)\n : defaultProviderConfig.type\n const baseUrl = await promptQuickProviderBaseUrl(\n defaultProviderConfig.baseUrl,\n )\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n baseUrl,\n pricingCurrency: defaultProviderConfig.pricingCurrency,\n type,\n }),\n )\n\n consola.success(\n `${AUTH_PROVIDER_LABELS[providerName]} provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function loginWithCodex(alias?: string): Promise<void> {\n const credentials = await loginCodex({\n onAuth(info) {\n consola.info(\"Open the following URL to authenticate with Codex:\")\n consola.log(info.url)\n if (info.instructions) {\n consola.info(info.instructions)\n }\n },\n onPrompt(message) {\n return prompt(message, { type: \"text\" }).then((value) => value ?? \"\")\n },\n onProgress(message) {\n consola.debug(message)\n },\n })\n\n await persistCodexCredentials(credentials, {\n activateAccount: true,\n alias,\n enableProvider: true,\n })\n consola.success(\n `Codex provider config written to ${PATHS.CONFIG_PATH} and credentials written to ${PATHS.CODEX_CREDENTIAL_PATH}`,\n )\n}\n\nasync function loginWithProvider(\n provider: AuthProviderName,\n alias?: string,\n): Promise<void> {\n if (alias !== undefined && provider !== \"codex\") {\n throw new Error(\"--alias is only supported with the codex provider\")\n }\n\n if (provider === \"copilot\") {\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n return\n }\n\n if (provider === \"codex\") {\n await loginWithCodex(alias)\n return\n }\n\n if (isQuickProviderName(provider)) {\n await configureQuickProvider(provider)\n return\n }\n\n await configureCustomProvider()\n}\n\nexport async function runProviderSetup(): Promise<void> {\n const provider = await resolveProviderSelection(undefined)\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider)\n}\n\nexport async function runAuthLogin(options: RunAuthOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n const provider = await resolveProviderSelection(options.provider)\n\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider, options.alias)\n}\n\nconst authCodexArgs = {\n list: {\n alias: \"l\",\n type: \"boolean\",\n default: false,\n description: \"List stored Codex accounts\",\n },\n remove: {\n alias: \"r\",\n type: \"string\",\n description:\n \"Remove a Codex account by alias or account id; the account in use cannot be removed\",\n },\n use: {\n alias: \"u\",\n type: \"string\",\n description: \"Select a Codex account by alias or account id\",\n },\n} as const\n\ninterface RunAuthCodexOptions {\n list?: boolean\n remove?: string\n use?: string\n}\n\nfunction formatCodexAccountName(\n account: Pick<CodexAccountSummary, \"accountId\" | \"alias\">,\n): string {\n return account.alias ?\n `${account.alias} (${account.accountId})`\n : account.accountId\n}\n\nfunction formatCodexAccount(account: CodexAccountSummary): string {\n return `${account.active ? \"*\" : \"-\"} ${formatCodexAccountName(account)}`\n}\n\nexport async function runAuthCodex(\n options: RunAuthCodexOptions,\n): Promise<void> {\n await ensurePaths()\n\n const operationCount = [\n options.list === true,\n options.use !== undefined,\n options.remove !== undefined,\n ].filter(Boolean).length\n if (operationCount > 1) {\n throw new Error(\"Use only one of --list, --use, or --remove per invocation\")\n }\n\n if (options.use !== undefined) {\n const account = await selectCodexAccount(options.use)\n consola.success(`Selected Codex account ${formatCodexAccountName(account)}`)\n consola.info(\"Restart the server to use the selected Codex account.\")\n return\n }\n\n if (options.remove !== undefined) {\n const account = await removeCodexAccount(options.remove)\n consola.success(`Removed Codex account ${formatCodexAccountName(account)}`)\n return\n }\n\n const accounts = await getCodexAccounts()\n if (accounts.length === 0) {\n consola.info(\n \"No Codex accounts configured. Run `copilot-api auth login --provider codex` to add one.\",\n )\n return\n }\n\n consola.info(\"Configured Codex accounts:\")\n for (const account of accounts) {\n consola.info(formatCodexAccount(account))\n }\n}\n\nconst authKeysArgs = {\n add: {\n alias: \"a\",\n type: \"string\",\n description: \"Add an API key for gateway authentication\",\n },\n remove: {\n alias: \"r\",\n type: \"string\",\n description: \"Remove an API key\",\n },\n list: {\n alias: \"l\",\n type: \"boolean\",\n default: false,\n description: \"List configured API keys\",\n },\n clear: {\n type: \"boolean\",\n default: false,\n description: \"Remove all configured API keys\",\n },\n} as const\n\ninterface RunAuthKeysOptions {\n add?: string\n remove?: string\n list?: boolean\n clear?: boolean\n}\n\nfunction normalizeAuthKeyValue(value: string): string {\n const normalizedKey = value.trim()\n if (!normalizedKey) {\n throw new Error(\"API key must be a non-empty string\")\n }\n return normalizedKey\n}\n\nexport async function runAuthKeys(options: RunAuthKeysOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n await ensurePaths()\n\n const operations = [\n ...(options.add !== undefined ? [\"add\"] : []),\n ...(options.remove !== undefined ? [\"remove\"] : []),\n ...(options.list ? [\"list\"] : []),\n ...(options.clear ? [\"clear\"] : []),\n ]\n if (operations.length > 1) {\n throw new Error(\n \"Use only one of --add, --remove, --list, or --clear per invocation\",\n )\n }\n\n const operation = operations[0] ?? \"list\"\n\n if (operation === \"add\") {\n const apiKey = normalizeAuthKeyValue(options.add ?? \"\")\n const currentKeys = getConfiguredApiKeys()\n if (currentKeys.includes(apiKey)) {\n consola.info(\n `API key already configured. ${currentKeys.length} API key(s) configured.`,\n )\n return\n }\n const storedKeys = setConfiguredApiKeys([...currentKeys, apiKey])\n consola.success(\n `API key added to ${PATHS.CONFIG_PATH}. ${storedKeys.length} API key(s) configured.`,\n )\n return\n }\n\n if (operation === \"remove\") {\n const apiKey = normalizeAuthKeyValue(options.remove ?? \"\")\n const currentKeys = getConfiguredApiKeys()\n if (!currentKeys.includes(apiKey)) {\n consola.info(\n `API key not found. ${currentKeys.length} API key(s) configured.`,\n )\n return\n }\n const storedKeys = setConfiguredApiKeys(\n currentKeys.filter((key) => key !== apiKey),\n )\n consola.success(\n `API key removed from ${PATHS.CONFIG_PATH}. ${storedKeys.length} API key(s) configured.`,\n )\n return\n }\n\n if (operation === \"clear\") {\n setConfiguredApiKeys([])\n consola.success(`Removed all API keys from ${PATHS.CONFIG_PATH}.`)\n return\n }\n\n const currentKeys = getConfiguredApiKeys()\n if (currentKeys.length === 0) {\n consola.info(\n \"No API keys configured. Run `npx @jeffreycao/copilot-api@latest auth keys --add <key>` to add one.\",\n )\n return\n }\n consola.info(\"Configured API keys:\")\n for (const key of currentKeys) {\n consola.info(`- ${key}`)\n }\n}\n\nconst authLogin = defineCommand({\n meta: {\n name: \"login\",\n description:\n \"Authenticate or configure a provider without running the server\",\n },\n args: authArgs,\n run({ args }) {\n return runAuthLogin({\n alias: args.alias,\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n\nconst authKeys = defineCommand({\n meta: {\n name: \"keys\",\n description: \"Manage gateway API keys (auth.apiKeys) in the config\",\n },\n args: authKeysArgs,\n run({ args }) {\n return runAuthKeys({\n add: args.add,\n remove: args.remove,\n list: args.list,\n clear: args.clear,\n })\n },\n})\n\nconst authCodex = defineCommand({\n meta: {\n name: \"codex\",\n description: \"List, select, or remove stored Codex accounts\",\n },\n args: authCodexArgs,\n run({ args }) {\n return runAuthCodex({\n list: args.list,\n remove: args.remove,\n use: args.use,\n })\n },\n})\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run authentication flows without running the server\",\n },\n args: authArgs,\n subCommands: {\n codex: authCodex,\n login: authLogin,\n keys: authKeys,\n },\n run({ args }) {\n if ((args._[0] ?? \"\").trim()) {\n return\n }\n\n return runAuthLogin({\n alias: args.alias,\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth-BrjvQ0qN.js","names":[],"sources":["../src/lib/quick-providers.ts","../src/lib/interactive-prompt.ts","../src/auth.ts"],"sourcesContent":["import type { ProviderType } from \"./config\"\n\ninterface QuickProviderConfig {\n type: ProviderType\n baseUrl: string\n pricingCurrency: string\n editableType: boolean\n}\n\nexport const QUICK_PROVIDER_CONFIGS = {\n \"opencode-go\": {\n type: \"openai-compatible\",\n baseUrl: \"https://opencode.ai/zen/go\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n kimi: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.kimi.com/coding\",\n pricingCurrency: \"USD\",\n editableType: true,\n },\n deepseek: {\n type: \"anthropic\",\n baseUrl: \"https://api.deepseek.com/anthropic\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n dashscope: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n openrouter: {\n type: \"anthropic\",\n baseUrl: \"https://openrouter.ai/api\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n} satisfies Record<string, QuickProviderConfig>\n\nexport type QuickProviderName = keyof typeof QUICK_PROVIDER_CONFIGS\n","import consola from \"consola\"\n\ninterface PromptSelectOption {\n label: string\n value: string\n hint?: string\n}\n\ninterface TextPromptOptions {\n type?: \"text\"\n default?: string\n initial?: string\n placeholder?: string\n}\n\ninterface SelectPromptOptions {\n type: \"select\"\n initial?: string\n options: Array<string | PromptSelectOption>\n}\n\nexport type InteractivePromptOptions = SelectPromptOptions | TextPromptOptions\n\ninterface ClackSelectOptions {\n message: string\n initialValue?: string\n options: Array<PromptSelectOption>\n}\n\ninterface ClackTextOptions {\n message: string\n defaultValue?: string\n initialValue?: string\n placeholder?: string\n}\n\nexport interface ClackPromptBackend {\n isCancel(value: unknown): boolean\n select(options: ClackSelectOptions): Promise<string | symbol>\n text(options: ClackTextOptions): Promise<string | symbol>\n}\n\ninterface PromptRuntime {\n bunVersion?: string\n platform: NodeJS.Platform\n stdinIsTTY?: boolean\n stdoutIsTTY?: boolean\n stdoutIsTTYStream?: boolean\n}\n\n// Consola 3.4.2 bundles a prompt implementation that writes keyboard input to\n// tty fd 0. Bun treats that as a real stdin write on Windows and throws EPIPE.\nexport function shouldUseClackPrompt(\n runtime: PromptRuntime = {\n bunVersion: process.versions.bun,\n platform: process.platform,\n stdinIsTTY: process.stdin.isTTY,\n stdoutIsTTY: process.stdout.isTTY,\n stdoutIsTTYStream: typeof process.stdout.getColorDepth === \"function\",\n },\n): boolean {\n return Boolean(\n runtime.platform === \"win32\"\n && runtime.bunVersion\n && runtime.stdinIsTTY\n && runtime.stdoutIsTTY\n && runtime.stdoutIsTTYStream,\n )\n}\n\nfunction getCancelValue(options: InteractivePromptOptions): string | undefined {\n return options.type === \"select\" ?\n options.initial\n : (options.default ?? options.initial)\n}\n\nexport async function promptWithClack(\n message: string,\n options: InteractivePromptOptions,\n backend: ClackPromptBackend,\n): Promise<string | undefined> {\n if (options.type === \"select\") {\n const value = await backend.select({\n message,\n options: options.options.map((option) =>\n typeof option === \"string\" ? { label: option, value: option } : option,\n ),\n initialValue: options.initial,\n })\n if (backend.isCancel(value)) {\n return getCancelValue(options)\n }\n return typeof value === \"string\" ? value : undefined\n }\n\n const value = await backend.text({\n message,\n defaultValue: options.default,\n initialValue: options.initial,\n placeholder: options.placeholder,\n })\n if (backend.isCancel(value)) {\n return getCancelValue(options)\n }\n return typeof value === \"string\" ? value : undefined\n}\n\nexport async function prompt(\n message: string,\n options: InteractivePromptOptions,\n): Promise<string | undefined> {\n if (!shouldUseClackPrompt()) {\n if (options.type === \"select\") {\n const value = await consola.prompt(message, options)\n return typeof value === \"string\" ? value : undefined\n }\n return await consola.prompt(message, options)\n }\n\n const clack = await import(\"@clack/prompts\")\n return await promptWithClack(message, options, clack)\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport {\n getRawProviderConfig,\n isSupportedProviderType,\n normalizeProviderBaseUrl,\n setProviderConfig,\n setConfiguredApiKeys,\n SUPPORTED_PROVIDER_TYPES,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./lib/config\"\nimport { loginCodex } from \"./lib/oauth/codex\"\nimport {\n loadModelsDevProviderOptions,\n type ModelsDevProviderOption,\n} from \"./lib/models-dev-cache\"\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { getConfiguredApiKeys } from \"./lib/request-auth\"\nimport {\n QUICK_PROVIDER_CONFIGS,\n type QuickProviderName,\n} from \"./lib/quick-providers\"\nimport { prompt } from \"./lib/interactive-prompt\"\nimport { state } from \"./lib/state\"\nimport {\n getCodexAccounts,\n persistCodexCredentials,\n removeCodexAccount,\n selectCodexAccount,\n setupGitHubToken,\n type CodexAccountSummary,\n} from \"./lib/token\"\n\ninterface RunAuthOptions {\n alias?: string\n provider?: string\n verbose: boolean\n showToken: boolean\n}\n\nconst authArgs = {\n provider: {\n type: \"string\",\n description:\n \"Provider to log in with or configure (copilot, codex, opencode-go, kimi, deepseek, dashscope, openrouter, custom)\",\n },\n alias: {\n type: \"string\",\n description: \"Optional alias for a Codex account\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show provider access token on auth\",\n },\n} as const\n\nconst BUILTIN_PROVIDER_NAMES = [\"copilot\", \"codex\"] as const\nconst QUICK_PROVIDER_NAMES = Object.keys(\n QUICK_PROVIDER_CONFIGS,\n) as Array<QuickProviderName>\nconst AUTH_PROVIDER_NAMES = [\n ...BUILTIN_PROVIDER_NAMES,\n ...QUICK_PROVIDER_NAMES,\n \"custom\",\n] as const\nconst CUSTOM_PROVIDER_AUTH_TYPE_OPTION = \"__default__\"\nconst QUICK_PROVIDER_DEFAULT_TYPE_OPTION = \"__default__\"\nconst CUSTOM_PROVIDER_AUTH_TYPES = [\"x-api-key\", \"authorization\"] as const\n\ntype BuiltinProviderName = (typeof BUILTIN_PROVIDER_NAMES)[number]\ntype AuthProviderName = (typeof AUTH_PROVIDER_NAMES)[number]\ntype CustomProviderAuthType = (typeof CUSTOM_PROVIDER_AUTH_TYPES)[number]\n\nconst BUILTIN_PROVIDER_LABELS: Record<BuiltinProviderName, string> = {\n copilot: \"GitHub Copilot\",\n codex: \"OpenAI Codex\",\n}\nconst AUTH_PROVIDER_LABELS: Record<AuthProviderName, string> = {\n ...BUILTIN_PROVIDER_LABELS,\n \"opencode-go\": \"OpenCode Go\",\n kimi: \"Kimi\",\n deepseek: \"DeepSeek\",\n dashscope: \"DashScope\",\n openrouter: \"OpenRouter\",\n custom: \"Custom provider\",\n}\n\nfunction isAuthProviderName(\n providerName: string,\n): providerName is AuthProviderName {\n return AUTH_PROVIDER_NAMES.includes(providerName as AuthProviderName)\n}\n\nfunction isCustomProviderAuthType(\n value: string,\n): value is CustomProviderAuthType {\n return CUSTOM_PROVIDER_AUTH_TYPES.includes(value as CustomProviderAuthType)\n}\n\nfunction isQuickProviderName(\n providerName: AuthProviderName,\n): providerName is QuickProviderName {\n return QUICK_PROVIDER_NAMES.includes(providerName as QuickProviderName)\n}\n\nasync function resolveProviderSelection(\n providerArg: string | undefined,\n): Promise<AuthProviderName> {\n const availableProviders = [...AUTH_PROVIDER_NAMES]\n\n if (providerArg !== undefined) {\n const providerName = providerArg.trim()\n if (!isAuthProviderName(providerName)) {\n throw new Error(\n `Unknown provider '${providerArg}'. Expected one of: ${availableProviders.join(\", \")}`,\n )\n }\n return providerName\n }\n\n if (availableProviders.length === 1) {\n return availableProviders[0]\n }\n\n const provider = await prompt(\"Select a provider to log in with\", {\n type: \"select\",\n options: availableProviders.map((providerName) => ({\n label: `${AUTH_PROVIDER_LABELS[providerName]} (${providerName})`,\n value: providerName,\n })),\n })\n\n if (!provider || !isAuthProviderName(provider)) {\n throw new Error(\"No provider selected\")\n }\n\n return provider\n}\n\nfunction assertCustomProviderName(providerName: string): void {\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(providerName)) {\n throw new Error(\n \"Provider name must start with a letter or number and contain only letters, numbers, underscores, or hyphens\",\n )\n }\n\n if (providerName === \"copilot\" || providerName === \"codex\") {\n throw new Error(\n `Provider name '${providerName}' is reserved for a builtin provider`,\n )\n }\n}\n\nasync function promptRequiredText(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await prompt(message, { type: \"text\" })\n const normalizedValue = typeof value === \"string\" ? value.trim() : \"\"\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nfunction canUseMaskedPrompt(): boolean {\n return Boolean(\n process.stdin.isTTY\n && process.stdout.isTTY\n && typeof process.stdin.setRawMode === \"function\",\n )\n}\n\nasync function promptMaskedText(message: string): Promise<string> {\n if (!canUseMaskedPrompt()) {\n const value = await prompt(message, { type: \"text\" })\n return typeof value === \"string\" ? value : \"\"\n }\n\n return await new Promise<string>((resolve, reject) => {\n let value = \"\"\n const rawModeWasEnabled = process.stdin.isRaw === true\n\n function cleanup(): void {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode(rawModeWasEnabled)\n process.stdin.pause()\n }\n\n function finish(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n resolve(value)\n }\n\n function cancel(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n reject(new Error(\"Prompt cancelled\"))\n }\n\n function onData(chunk: Buffer): void {\n const input = chunk.toString(\"utf8\")\n\n if (input.startsWith(\"\\u001B\")) {\n return\n }\n\n for (const char of input) {\n if (char === \"\\u0003\") {\n cancel()\n return\n }\n\n if (char === \"\\r\" || char === \"\\n\") {\n finish()\n return\n }\n\n if (char === \"\\b\" || char === \"\\u007F\") {\n if (value.length > 0) {\n value = value.slice(0, -1)\n process.stdout.write(\"\\b \\b\")\n }\n continue\n }\n\n if (char >= \" \") {\n value += char\n process.stdout.write(\"*\")\n }\n }\n }\n\n process.stdout.write(`${message}: `)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.on(\"data\", onData)\n })\n}\n\nasync function promptRequiredSecret(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await promptMaskedText(message)\n const normalizedValue = value.trim()\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nasync function promptCustomProviderName(defaultName?: string): Promise<string> {\n const value = await prompt(\"Enter provider name\", {\n type: \"text\",\n ...(defaultName ? { default: defaultName, initial: defaultName } : {}),\n })\n const providerName = (value || defaultName || \"\").trim()\n assertCustomProviderName(providerName)\n return providerName\n}\n\nasync function promptCustomProviderType(\n defaultType?: ProviderType,\n): Promise<ProviderType> {\n const providerType = await prompt(\"Select provider type\", {\n type: \"select\",\n initial: defaultType,\n options: SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n })\n\n if (\n typeof providerType !== \"string\"\n || !isSupportedProviderType(providerType)\n ) {\n throw new Error(\"No provider type selected\")\n }\n\n return providerType\n}\n\nasync function promptModelsDevProvider(): Promise<\n ModelsDevProviderOption | undefined\n> {\n const source = await prompt(\"Choose custom provider source\", {\n type: \"select\",\n options: [\n { label: \"Enter manually\", value: \"manual\" },\n { label: \"Choose from models.dev\", value: \"models-dev\" },\n ],\n })\n if (source === \"manual\") return undefined\n if (source !== \"models-dev\") throw new Error(\"No provider source selected\")\n\n const providers = await loadModelsDevProviderOptions()\n const query = (\n (await prompt(\"Search models.dev providers (blank to list all)\", {\n type: \"text\",\n })) ?? \"\"\n )\n .trim()\n .toLowerCase()\n const matches = providers.filter(\n (provider) =>\n provider.id.toLowerCase().includes(query)\n || provider.name.toLowerCase().includes(query),\n )\n if (matches.length === 0) {\n throw new Error(\"No matching models.dev providers with a supported API URL\")\n }\n const selectedId = await prompt(\"Select a models.dev provider\", {\n type: \"select\",\n options: matches.map((provider) => ({\n label: `${provider.name} (${provider.id}) — ${provider.type}`,\n value: provider.id,\n })),\n })\n const selectedProvider = matches.find(\n (provider) => provider.id === selectedId,\n )\n if (!selectedProvider) throw new Error(\"No models.dev provider selected\")\n return selectedProvider\n}\n\nasync function promptQuickProviderType(\n defaultType: ProviderType,\n): Promise<ProviderType> {\n const providerType = await prompt(\n `Select provider type (default: ${defaultType})`,\n {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultType})`,\n value: QUICK_PROVIDER_DEFAULT_TYPE_OPTION,\n },\n ...SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n ],\n },\n )\n\n if (providerType === QUICK_PROVIDER_DEFAULT_TYPE_OPTION) {\n return defaultType\n }\n\n if (\n typeof providerType === \"string\"\n && isSupportedProviderType(providerType)\n ) {\n return providerType\n }\n\n throw new Error(\"No provider type selected\")\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nasync function promptCustomProviderAuthType(\n providerType: ProviderType,\n): Promise<ProviderAuthType | undefined> {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n const authType = await prompt(\"Select provider auth type\", {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultAuthType})`,\n value: CUSTOM_PROVIDER_AUTH_TYPE_OPTION,\n },\n ...CUSTOM_PROVIDER_AUTH_TYPES.map((value) => ({\n label: value,\n value,\n })),\n ],\n })\n\n if (authType === CUSTOM_PROVIDER_AUTH_TYPE_OPTION) {\n return undefined\n }\n\n if (typeof authType === \"string\" && isCustomProviderAuthType(authType)) {\n return authType\n }\n\n throw new Error(\"No provider auth type selected\")\n}\n\nasync function promptQuickProviderBaseUrl(\n defaultBaseUrl: string,\n): Promise<string> {\n const value = await prompt(\n `Enter provider baseUrl (default: ${defaultBaseUrl})`,\n {\n type: \"text\",\n default: defaultBaseUrl,\n initial: defaultBaseUrl,\n },\n )\n const baseUrl = normalizeProviderBaseUrl(\n typeof value === \"string\" && value.trim() ? value : defaultBaseUrl,\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n return baseUrl\n}\n\nfunction buildCustomProviderConfig(\n existingProviderConfig: ProviderConfig,\n options: {\n apiKey: string\n authType?: ProviderAuthType\n baseUrl: string\n pricingCurrency?: string\n type: ProviderType\n modelsDevProviderId?: string\n },\n): ProviderConfig {\n return {\n type: options.type,\n enabled: true,\n baseUrl: options.baseUrl,\n ...(options.modelsDevProviderId && {\n modelsDevProviderId: options.modelsDevProviderId,\n }),\n apiKey: options.apiKey,\n ...(options.authType ? { authType: options.authType } : {}),\n pricingCurrency:\n options.pricingCurrency ?? existingProviderConfig.pricingCurrency,\n ...(existingProviderConfig.models ?\n { models: existingProviderConfig.models }\n : {}),\n }\n}\n\nasync function configureCustomProvider(): Promise<void> {\n const catalogProvider = await promptModelsDevProvider()\n const providerName = await promptCustomProviderName(catalogProvider?.id)\n const type = await promptCustomProviderType(catalogProvider?.type)\n const baseUrl =\n catalogProvider ?\n await promptQuickProviderBaseUrl(catalogProvider.api)\n : normalizeProviderBaseUrl(\n await promptRequiredText(\"Enter provider baseUrl\", \"baseUrl\"),\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n const apiKey = await promptRequiredSecret(\"Enter provider apiKey\", \"apiKey\")\n const authType = await promptCustomProviderAuthType(type)\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n authType,\n baseUrl,\n modelsDevProviderId: catalogProvider?.id,\n type,\n }),\n )\n\n consola.success(\n `Custom provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function configureQuickProvider(\n providerName: QuickProviderName,\n): Promise<void> {\n const defaultProviderConfig = QUICK_PROVIDER_CONFIGS[providerName]\n const apiKey = await promptRequiredSecret(\n `Enter ${providerName} apiKey`,\n \"apiKey\",\n )\n const type =\n defaultProviderConfig.editableType ?\n await promptQuickProviderType(defaultProviderConfig.type)\n : defaultProviderConfig.type\n const baseUrl = await promptQuickProviderBaseUrl(\n defaultProviderConfig.baseUrl,\n )\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n baseUrl,\n pricingCurrency: defaultProviderConfig.pricingCurrency,\n type,\n }),\n )\n\n consola.success(\n `${AUTH_PROVIDER_LABELS[providerName]} provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function loginWithCodex(alias?: string): Promise<void> {\n const credentials = await loginCodex({\n onAuth(info) {\n consola.info(\"Open the following URL to authenticate with Codex:\")\n consola.log(info.url)\n if (info.instructions) {\n consola.info(info.instructions)\n }\n },\n onPrompt(message) {\n return prompt(message, { type: \"text\" }).then((value) => value ?? \"\")\n },\n onProgress(message) {\n consola.debug(message)\n },\n })\n\n await persistCodexCredentials(credentials, {\n activateAccount: true,\n alias,\n enableProvider: true,\n })\n consola.success(\n `Codex provider config written to ${PATHS.CONFIG_PATH} and credentials written to ${PATHS.CODEX_CREDENTIAL_PATH}`,\n )\n}\n\nasync function loginWithProvider(\n provider: AuthProviderName,\n alias?: string,\n): Promise<void> {\n if (alias !== undefined && provider !== \"codex\") {\n throw new Error(\"--alias is only supported with the codex provider\")\n }\n\n if (provider === \"copilot\") {\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n return\n }\n\n if (provider === \"codex\") {\n await loginWithCodex(alias)\n return\n }\n\n if (isQuickProviderName(provider)) {\n await configureQuickProvider(provider)\n return\n }\n\n await configureCustomProvider()\n}\n\nexport async function runProviderSetup(): Promise<void> {\n const provider = await resolveProviderSelection(undefined)\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider)\n}\n\nexport async function runAuthLogin(options: RunAuthOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n const provider = await resolveProviderSelection(options.provider)\n\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider, options.alias)\n}\n\nconst authCodexArgs = {\n list: {\n alias: \"l\",\n type: \"boolean\",\n default: false,\n description: \"List stored Codex accounts\",\n },\n remove: {\n alias: \"r\",\n type: \"string\",\n description:\n \"Remove a Codex account by alias or account id; the account in use cannot be removed\",\n },\n use: {\n alias: \"u\",\n type: \"string\",\n description: \"Select a Codex account by alias or account id\",\n },\n} as const\n\ninterface RunAuthCodexOptions {\n list?: boolean\n remove?: string\n use?: string\n}\n\nfunction formatCodexAccountName(\n account: Pick<CodexAccountSummary, \"accountId\" | \"alias\">,\n): string {\n return account.alias ?\n `${account.alias} (${account.accountId})`\n : account.accountId\n}\n\nfunction formatCodexAccount(account: CodexAccountSummary): string {\n return `${account.active ? \"*\" : \"-\"} ${formatCodexAccountName(account)}`\n}\n\nexport async function runAuthCodex(\n options: RunAuthCodexOptions,\n): Promise<void> {\n await ensurePaths()\n\n const operationCount = [\n options.list === true,\n options.use !== undefined,\n options.remove !== undefined,\n ].filter(Boolean).length\n if (operationCount > 1) {\n throw new Error(\"Use only one of --list, --use, or --remove per invocation\")\n }\n\n if (options.use !== undefined) {\n const account = await selectCodexAccount(options.use)\n consola.success(`Selected Codex account ${formatCodexAccountName(account)}`)\n consola.info(\"Restart the server to use the selected Codex account.\")\n return\n }\n\n if (options.remove !== undefined) {\n const account = await removeCodexAccount(options.remove)\n consola.success(`Removed Codex account ${formatCodexAccountName(account)}`)\n return\n }\n\n const accounts = await getCodexAccounts()\n if (accounts.length === 0) {\n consola.info(\n \"No Codex accounts configured. Run `copilot-api auth login --provider codex` to add one.\",\n )\n return\n }\n\n consola.info(\"Configured Codex accounts:\")\n for (const account of accounts) {\n consola.info(formatCodexAccount(account))\n }\n}\n\nconst authKeysArgs = {\n add: {\n alias: \"a\",\n type: \"string\",\n description: \"Add an API key for gateway authentication\",\n },\n remove: {\n alias: \"r\",\n type: \"string\",\n description: \"Remove an API key\",\n },\n list: {\n alias: \"l\",\n type: \"boolean\",\n default: false,\n description: \"List configured API keys\",\n },\n clear: {\n type: \"boolean\",\n default: false,\n description: \"Remove all configured API keys\",\n },\n} as const\n\ninterface RunAuthKeysOptions {\n add?: string\n remove?: string\n list?: boolean\n clear?: boolean\n}\n\nfunction normalizeAuthKeyValue(value: string): string {\n const normalizedKey = value.trim()\n if (!normalizedKey) {\n throw new Error(\"API key must be a non-empty string\")\n }\n return normalizedKey\n}\n\nexport async function runAuthKeys(options: RunAuthKeysOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n await ensurePaths()\n\n const operations = [\n ...(options.add !== undefined ? [\"add\"] : []),\n ...(options.remove !== undefined ? [\"remove\"] : []),\n ...(options.list ? [\"list\"] : []),\n ...(options.clear ? [\"clear\"] : []),\n ]\n if (operations.length > 1) {\n throw new Error(\n \"Use only one of --add, --remove, --list, or --clear per invocation\",\n )\n }\n\n const operation = operations[0] ?? \"list\"\n\n if (operation === \"add\") {\n const apiKey = normalizeAuthKeyValue(options.add ?? \"\")\n const currentKeys = getConfiguredApiKeys()\n if (currentKeys.includes(apiKey)) {\n consola.info(\n `API key already configured. ${currentKeys.length} API key(s) configured.`,\n )\n return\n }\n const storedKeys = setConfiguredApiKeys([...currentKeys, apiKey])\n consola.success(\n `API key added to ${PATHS.CONFIG_PATH}. ${storedKeys.length} API key(s) configured.`,\n )\n return\n }\n\n if (operation === \"remove\") {\n const apiKey = normalizeAuthKeyValue(options.remove ?? \"\")\n const currentKeys = getConfiguredApiKeys()\n if (!currentKeys.includes(apiKey)) {\n consola.info(\n `API key not found. ${currentKeys.length} API key(s) configured.`,\n )\n return\n }\n const storedKeys = setConfiguredApiKeys(\n currentKeys.filter((key) => key !== apiKey),\n )\n consola.success(\n `API key removed from ${PATHS.CONFIG_PATH}. ${storedKeys.length} API key(s) configured.`,\n )\n return\n }\n\n if (operation === \"clear\") {\n setConfiguredApiKeys([])\n consola.success(`Removed all API keys from ${PATHS.CONFIG_PATH}.`)\n return\n }\n\n const currentKeys = getConfiguredApiKeys()\n if (currentKeys.length === 0) {\n consola.info(\n \"No API keys configured. Run `npx @jeffreycao/copilot-api@latest auth keys --add <key>` to add one.\",\n )\n return\n }\n consola.info(\"Configured API keys:\")\n for (const key of currentKeys) {\n consola.info(`- ${key}`)\n }\n}\n\nconst authLogin = defineCommand({\n meta: {\n name: \"login\",\n description:\n \"Authenticate or configure a provider without running the server\",\n },\n args: authArgs,\n run({ args }) {\n return runAuthLogin({\n alias: args.alias,\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n\nconst authKeys = defineCommand({\n meta: {\n name: \"keys\",\n description: \"Manage gateway API keys (auth.apiKeys) in the config\",\n },\n args: authKeysArgs,\n run({ args }) {\n return runAuthKeys({\n add: args.add,\n remove: args.remove,\n list: args.list,\n clear: args.clear,\n })\n },\n})\n\nconst authCodex = defineCommand({\n meta: {\n name: \"codex\",\n description: \"List, select, or remove stored Codex accounts\",\n },\n args: authCodexArgs,\n run({ args }) {\n return runAuthCodex({\n list: args.list,\n remove: args.remove,\n use: args.use,\n })\n },\n})\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run authentication flows without running the server\",\n },\n args: authArgs,\n subCommands: {\n codex: authCodex,\n login: authLogin,\n keys: authKeys,\n },\n run({ args }) {\n if ((args._[0] ?? \"\").trim()) {\n return\n }\n\n return runAuthLogin({\n alias: args.alias,\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":"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"}
|
|
@@ -98,7 +98,10 @@ const defaultConfig = {
|
|
|
98
98
|
auth: { apiKeys: [] },
|
|
99
99
|
providers: {},
|
|
100
100
|
modelMappings: {},
|
|
101
|
-
|
|
101
|
+
smallModels: {
|
|
102
|
+
codex: "gpt-6-luna",
|
|
103
|
+
copilot: "gpt-6-luna"
|
|
104
|
+
},
|
|
102
105
|
contextManagement: defaultContextManagement,
|
|
103
106
|
modelResponsesApiCompactThresholds,
|
|
104
107
|
useMessagesApi: true,
|
|
@@ -421,7 +424,13 @@ function resolveMappedModel(model) {
|
|
|
421
424
|
return getModelMappings()[model] ?? model;
|
|
422
425
|
}
|
|
423
426
|
function getSmallModel() {
|
|
424
|
-
return
|
|
427
|
+
return getSmallModelForProvider("copilot") ?? "gpt-6-luna";
|
|
428
|
+
}
|
|
429
|
+
function getSmallModelForProvider(provider) {
|
|
430
|
+
const providerName = provider.trim();
|
|
431
|
+
const configuredModels = getConfig().smallModels;
|
|
432
|
+
const model = configuredModels && Object.hasOwn(configuredModels, providerName) ? configuredModels[providerName] : defaultConfig.smallModels?.[providerName];
|
|
433
|
+
return typeof model === "string" ? model.trim() || void 0 : void 0;
|
|
425
434
|
}
|
|
426
435
|
function isContextManagementEnabledForMessages() {
|
|
427
436
|
return getConfig().contextManagement?.messages ?? defaultContextManagement.messages;
|
|
@@ -946,6 +955,6 @@ function isReservedProviderName(name) {
|
|
|
946
955
|
return name.trim() === "copilot";
|
|
947
956
|
}
|
|
948
957
|
//#endregion
|
|
949
|
-
export {
|
|
958
|
+
export { getConfig as A, PATHS as B, resolveMappedModel as C, getAnthropicApiKey as D, getAlphaSearchModel as E, isResponsesApiWebSearchEnabled as F, writeFileAtomically as H, isResponsesApiWebSocketEnabled as I, mergeConfigWithDefaults as L, getUpstreamTransportConfig as M, isAlphaSearchCodexPriorityEnabled as N, getClaudeAutoModel as O, isMessagesApiEnabled as P, readEditableConfigFromDisk as R, isGpt56OrAbove as S, SUPPORTED_PROVIDER_TYPES as T, ensurePaths as V, getReasoningEffortForModel as _, normalizeProviderBaseUrl as a, isContextManagementEnabledForMessages as b, setProviderConfig as c, getOpencodeGoModelRecords as d, loadModelsDevProviderOptions as f, getModelResponsesApiCompactThreshold as g, getModelMappings as h, listEnabledProviders as i, getMessageApiWebSearchModel as j, getClaudeTokenMultiplier as k, getOpencodeGoModelConfig as l, getExtraPromptForModel as m, getRawProviderConfig as n, resolveEffectiveProviderType as o, startModelsDevCache as p, isSupportedProviderType as r, resolveProviderConfigForModel as s, getProviderConfig as t, getOpencodeGoModelIds as u, getSmallModel as v, setModelMappings as w, isContextManagementEnabledForResponses as x, getSmallModelForProvider as y, setConfiguredApiKeys as z };
|
|
950
959
|
|
|
951
|
-
//# sourceMappingURL=config-
|
|
960
|
+
//# sourceMappingURL=config-B_pC8QXv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-B_pC8QXv.js","names":["fs","fs"],"sources":["../src/lib/atomic-file.ts","../src/lib/paths.ts","../src/lib/config-store.ts","../src/lib/model-policy.ts","../src/lib/models-dev-cache.ts","../src/lib/provider-config.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\n\nconst TEMP_FILE_RANDOM_BYTES = 8\n\n// The file-level fsync persists the contents, but the rename only updates the\n// parent directory entry, which needs its own fsync to survive a crash or\n// power loss. Best-effort: the rename has already taken effect, so a failure\n// here only weakens crash durability and must not fail the write. Directory\n// fsync is not supported on Windows (opening a directory handle fails there).\nconst fsyncDirectory = (directory: string): void => {\n if (process.platform === \"win32\") {\n return\n }\n\n let directoryFd: number | undefined\n try {\n directoryFd = fs.openSync(directory, \"r\")\n fs.fsyncSync(directoryFd)\n } catch (error) {\n console.warn(`Failed to fsync directory: ${directory}`, error)\n } finally {\n if (directoryFd !== undefined) {\n try {\n fs.closeSync(directoryFd)\n } catch {\n // Preserve the fsync warning.\n }\n }\n }\n}\n\nexport function writeFileAtomically(filePath: string, content: string): void {\n const directory = path.dirname(filePath)\n const tempPath = path.join(\n directory,\n `.${path.basename(filePath)}.${process.pid}.${randomBytes(TEMP_FILE_RANDOM_BYTES).toString(\"hex\")}.tmp`,\n )\n\n fs.mkdirSync(directory, { recursive: true })\n\n let fileDescriptor: number | undefined\n let tempFileCreated = false\n try {\n fileDescriptor = fs.openSync(tempPath, \"wx\", 0o600)\n tempFileCreated = true\n fs.writeFileSync(fileDescriptor, content, \"utf8\")\n fs.fsyncSync(fileDescriptor)\n fs.closeSync(fileDescriptor)\n fileDescriptor = undefined\n fs.renameSync(tempPath, filePath)\n tempFileCreated = false\n fsyncDirectory(directory)\n } catch (error) {\n if (fileDescriptor !== undefined) {\n try {\n fs.closeSync(fileDescriptor)\n } catch {\n // Preserve the original write error.\n }\n }\n\n if (tempFileCreated) {\n try {\n fs.rmSync(tempPath, { force: true })\n } catch {\n // Preserve the original write error.\n }\n }\n\n throw error\n }\n}\n","import fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\n\nconst AUTH_APP = process.env.COPILOT_API_OAUTH_APP?.trim() || \"\"\nconst ENTERPRISE_PREFIX = process.env.COPILOT_API_ENTERPRISE_URL ? \"ent_\" : \"\"\n\nconst DEFAULT_DIR = path.join(os.homedir(), \".local\", \"share\", \"copilot-api\")\nconst APP_DIR = process.env.COPILOT_API_HOME || DEFAULT_DIR\n\nconst GITHUB_TOKEN_PATH = path.join(\n APP_DIR,\n AUTH_APP,\n ENTERPRISE_PREFIX + \"github_token\",\n)\nconst CODEX_CREDENTIAL_PATH = path.join(APP_DIR, \"codex_credentials.json\")\nconst CONFIG_PATH = path.join(APP_DIR, \"config.json\")\n\nexport const PATHS = {\n APP_DIR,\n GITHUB_TOKEN_PATH,\n CODEX_CREDENTIAL_PATH,\n CONFIG_PATH,\n}\n\nexport async function ensurePaths(): Promise<void> {\n await fs.mkdir(path.join(PATHS.APP_DIR, AUTH_APP), { recursive: true })\n await ensureFile(PATHS.GITHUB_TOKEN_PATH)\n await ensureFile(PATHS.CONFIG_PATH)\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n try {\n await fs.access(filePath, fs.constants.W_OK)\n } catch {\n await fs.writeFile(filePath, \"\")\n await fs.chmod(filePath, 0o600)\n }\n}\n","import consola from \"consola\"\nimport { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\n\nimport type { TokenUsagePricingConfig } from \"~/lib/token-usage/pricing\"\n\nimport { writeFileAtomically } from \"./atomic-file\"\nimport { PATHS } from \"./paths\"\n\nexport interface AppConfig {\n auth?: {\n apiKeys?: Array<string>\n adminApiKey?: string\n }\n providers?: Record<string, ProviderConfig>\n modelMappings?: Record<string, string>\n extraPrompts?: Record<string, string>\n smallModels?: SmallModelsConfig\n contextManagement?: ContextManagementConfig\n modelResponsesApiCompactThresholds?: Record<string, number>\n modelReasoningEfforts?: Record<\n string,\n \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\"\n >\n useMessagesApi?: boolean\n useResponsesApiWebSocket?: boolean\n upstreamTransport?: UpstreamTransportConfig\n anthropicApiKey?: string\n useResponsesApiWebSearch?: boolean\n alphaSearchCodexPriority?: boolean\n alphaSearchModel?: string\n // Copilot rejects Anthropic's web_search server tool on /v1/messages, so a\n // Claude request that only asks for web search is switched to this model.\n // A `provider/model` alias is passed straight through to that provider's\n // (websearch-capable) message API, while a plain GPT model runs the search\n // via /responses. Leave unset to disable (the tool is then stripped).\n // Mixing web_search with other tools is not supported.\n messageApiWebSearchModel?: string\n // Model used for Claude Code background security-monitor requests on\n // /v1/messages and provider message APIs: requests without tools, with\n // `stop_sequences: [\"</block>\"]` and a system block starting with\n // \"You are a security monitor for autonomous AI coding agents.\".\n // A `provider/model` alias is forwarded to that provider's message API on\n // the top-level route. Provider message routes use the configured value on\n // their current provider. Leave empty to disable (default).\n claudeAutoModel?: string\n claudeTokenMultiplier?: number\n}\n\nexport interface SmallModelsConfig {\n codex?: string\n copilot?: string\n [providerName: string]: string | undefined\n}\n\nexport interface ContextManagementConfig {\n messages?: boolean\n responses?: boolean\n}\n\nexport interface UpstreamTransportConfig {\n headersTimeoutMs?: number\n streamInactivityTimeoutMs?: number\n websocketMaxBufferedBytes?: number\n websocketMaxBufferedMessages?: number\n websocketOpenTimeoutMs?: number\n websocketPoolIdleTimeoutMs?: number\n}\n\nexport const defaultUpstreamTransportConfig = {\n headersTimeoutMs: 5 * 60 * 1000,\n streamInactivityTimeoutMs: 5 * 60 * 1000,\n websocketMaxBufferedBytes: 8 * 1024 * 1024,\n websocketMaxBufferedMessages: 1024,\n websocketOpenTimeoutMs: 30_000,\n websocketPoolIdleTimeoutMs: 60_000,\n} satisfies Required<UpstreamTransportConfig>\n\nexport interface ModelConfig {\n temperature?: number\n topP?: number\n topK?: number\n extraBody?: Record<string, unknown>\n contextCache?: boolean\n contextWindow?: number\n maxOutputTokens?: number\n inputModalities?: Array<\"text\" | \"image\">\n reasoningEfforts?: Array<CodexReasoningEffort>\n defaultReasoningEffort?: CodexReasoningEffort\n pricing?: TokenUsagePricingConfig\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n type?: ProviderType\n // Message field used to carry assistant thinking text when forwarding\n // requests upstream; defaults to \"reasoning_content\"\n reasoningField?: ModelReasoningField\n}\n\nexport type ModelReasoningField = \"reasoning\" | \"reasoning_content\"\n\nexport type CodexReasoningEffort =\n | \"none\"\n | \"minimal\"\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\"\n | \"ultra\"\n\nexport type ProviderAuthType =\n | \"authorization\"\n | \"azure-entra\"\n | \"oauth2\"\n | \"x-api-key\"\nexport const SUPPORTED_PROVIDER_TYPES = [\n \"anthropic\",\n \"openai-compatible\",\n \"openai-responses\",\n] as const\nexport type ProviderType = (typeof SUPPORTED_PROVIDER_TYPES)[number]\nexport type ToolContentSupportType = \"array\" | \"image\" | \"pdf\"\n\nexport interface ProviderConfig {\n type?: string\n enabled?: boolean\n baseUrl?: string\n modelsDevProviderId?: string\n apiKey?: string\n authType?: ProviderAuthType\n accountId?: string\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n}\n\nconst modelResponsesApiCompactThresholds = {\n \"gpt-5.4\": 272_000 * 0.8,\n \"gpt-5.5\": 272_000 * 0.8,\n}\n\nexport const defaultContextManagement = {\n messages: true,\n responses: false,\n} satisfies Required<ContextManagementConfig>\n\nexport const defaultConfig: AppConfig = {\n auth: {\n apiKeys: [],\n },\n providers: {},\n modelMappings: {},\n smallModels: {\n codex: \"gpt-6-luna\",\n copilot: \"gpt-6-luna\",\n },\n contextManagement: defaultContextManagement,\n modelResponsesApiCompactThresholds,\n useMessagesApi: true,\n useResponsesApiWebSocket: true,\n upstreamTransport: defaultUpstreamTransportConfig,\n useResponsesApiWebSearch: true,\n alphaSearchCodexPriority: true,\n alphaSearchModel: \"gpt-6-luna\",\n messageApiWebSearchModel: \"gpt-6-luna\",\n}\n\nlet cachedConfig: AppConfig | null = null\n\nfunction normalizeAdminApiKey(adminApiKey: unknown): string | null {\n if (typeof adminApiKey !== \"string\") {\n if (adminApiKey !== undefined) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n }\n return null\n }\n\n const normalizedAdminApiKey = adminApiKey.trim()\n if (!normalizedAdminApiKey) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n return null\n }\n\n return normalizedAdminApiKey\n}\n\nfunction generateAdminApiKey(): string {\n return randomBytes(32).toString(\"hex\")\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nfunction ensureConfigFile(): void {\n try {\n fs.accessSync(PATHS.CONFIG_PATH, fs.constants.F_OK)\n } catch (error) {\n if (!isNodeError(error) || error.code !== \"ENOENT\") {\n throw error\n }\n\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n )\n }\n}\n\nfunction readConfigFromDisk(): AppConfig {\n ensureConfigFile()\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n )\n return defaultConfig\n }\n\n try {\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n // Fail closed: falling back to the default config here would let the\n // startup merge overwrite the corrupt file (discarding providers, API\n // keys, and model mappings) and, because the default has no apiKeys,\n // silently disable API key authentication on normal routes.\n const message = `Config file is not valid JSON: ${PATHS.CONFIG_PATH}. Refusing to start with the default config. Fix the JSON syntax or delete the file to regenerate a fresh config.`\n consola.error(message, error)\n throw new Error(message, { cause: error })\n }\n}\n\nexport function readEditableConfigFromDisk(): AppConfig {\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n return {}\n }\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {}\n }\n if (error instanceof SyntaxError) {\n throw new Error(`Config file is not valid JSON: ${PATHS.CONFIG_PATH}`)\n }\n throw error\n }\n}\n\nexport function writeConfigToDisk(config: AppConfig): void {\n writeFileAtomically(PATHS.CONFIG_PATH, `${JSON.stringify(config, null, 2)}\\n`)\n}\n\nexport function setConfiguredApiKeys(apiKeys: Array<string>): Array<string> {\n const normalizedKeys = apiKeys\n .map((key) => key.trim())\n .filter((key) => key.length > 0)\n const uniqueKeys = [...new Set(normalizedKeys)]\n\n const editableConfig = readEditableConfigFromDisk()\n writeConfigToDisk({\n ...editableConfig,\n auth: {\n ...editableConfig.auth,\n apiKeys: uniqueKeys,\n },\n })\n reloadConfig()\n return [...uniqueKeys]\n}\n\nfunction mergeDefaultConfig(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const extraPrompts = config.extraPrompts ?? {}\n const defaultExtraPrompts = defaultConfig.extraPrompts ?? {}\n const responsesApiCompactThresholds =\n config.modelResponsesApiCompactThresholds ?? {}\n const defaultResponsesApiCompactThresholds =\n defaultConfig.modelResponsesApiCompactThresholds ?? {}\n const modelReasoningEfforts = config.modelReasoningEfforts ?? {}\n const defaultModelReasoningEfforts = defaultConfig.modelReasoningEfforts ?? {}\n const contextManagement = normalizeContextManagementConfig(\n config.contextManagement,\n )\n const {\n changed: upstreamTransportMigrated,\n migrated: migratedUpstreamTransport,\n } = migrateUpstreamTransportConfig(config)\n\n const upstreamTransport = normalizeUpstreamTransportConfig(\n migratedUpstreamTransport,\n )\n const defaultContextManagementConfig = defaultConfig.contextManagement ?? {}\n\n const missingExtraPromptModels = Object.keys(defaultExtraPrompts).filter(\n (model) => !Object.hasOwn(extraPrompts, model),\n )\n\n const missingReasoningEffortModels = Object.keys(\n defaultModelReasoningEfforts,\n ).filter((model) => !Object.hasOwn(modelReasoningEfforts, model))\n const missingResponsesApiCompactThresholdModels = Object.keys(\n defaultResponsesApiCompactThresholds,\n ).filter((model) => !Object.hasOwn(responsesApiCompactThresholds, model))\n const missingContextManagementKeys = Object.keys(\n defaultContextManagementConfig,\n ).filter((key) => !Object.hasOwn(contextManagement, key))\n\n const hasExtraPromptChanges = missingExtraPromptModels.length > 0\n const hasReasoningEffortChanges = missingReasoningEffortModels.length > 0\n const hasResponsesApiCompactThresholdChanges =\n missingResponsesApiCompactThresholdModels.length > 0\n const hasContextManagementChanges = missingContextManagementKeys.length > 0\n const hasUpstreamTransportChanges = Object.entries(upstreamTransport).some(\n ([key, value]) =>\n migratedUpstreamTransport[key as keyof UpstreamTransportConfig] !== value,\n )\n\n if (\n !hasExtraPromptChanges\n && !hasReasoningEffortChanges\n && !hasResponsesApiCompactThresholdChanges\n && !hasContextManagementChanges\n && !hasUpstreamTransportChanges\n && !upstreamTransportMigrated\n ) {\n return { mergedConfig: config, changed: false }\n }\n\n // The deprecated responsesTransport key is dropped once it is migrated.\n const { responsesTransport: _legacyResponsesTransport, ...persistedConfig } =\n config as LegacyAppConfig\n\n return {\n mergedConfig: {\n ...persistedConfig,\n contextManagement: {\n ...defaultContextManagementConfig,\n ...contextManagement,\n },\n extraPrompts: {\n ...defaultExtraPrompts,\n ...extraPrompts,\n },\n modelResponsesApiCompactThresholds: {\n ...defaultResponsesApiCompactThresholds,\n ...responsesApiCompactThresholds,\n },\n modelReasoningEfforts: {\n ...defaultModelReasoningEfforts,\n ...modelReasoningEfforts,\n },\n upstreamTransport,\n },\n changed: true,\n }\n}\n\nfunction normalizeContextManagementConfig(\n value: ContextManagementConfig | undefined,\n): ContextManagementConfig {\n if (!value || typeof value !== \"object\") {\n return {}\n }\n\n return {\n ...(typeof value.messages === \"boolean\" ?\n { messages: value.messages }\n : {}),\n ...(typeof value.responses === \"boolean\" ?\n { responses: value.responses }\n : {}),\n }\n}\n\n// responsesTransport was renamed to upstreamTransport, and headersTimeoutMsV2\n// to headersTimeoutMs, when this block started applying to every upstream HTTP\n// transport. Legacy configs are migrated once during the startup merge and the\n// old keys are dropped from disk.\ninterface LegacyAppConfig extends AppConfig {\n responsesTransport?: LegacyUpstreamTransportConfig\n}\n\ninterface LegacyUpstreamTransportConfig extends UpstreamTransportConfig {\n headersTimeoutMsV2?: number\n}\n\nconst migrateUpstreamTransportConfig = (\n config: AppConfig,\n): { changed: boolean; migrated: UpstreamTransportConfig } => {\n const legacyBlock = (config as LegacyAppConfig).responsesTransport\n const { headersTimeoutMsV2, ...migrated } = (config.upstreamTransport\n ?? legacyBlock\n ?? {}) as LegacyUpstreamTransportConfig\n\n const hasLegacyBlock = legacyBlock !== undefined\n const hasLegacyHeadersTimeout = headersTimeoutMsV2 !== undefined\n if (!hasLegacyBlock && !hasLegacyHeadersTimeout) {\n return { changed: false, migrated }\n }\n\n consola.info(\n \"Migrating deprecated transport config: responsesTransport -> upstreamTransport, headersTimeoutMsV2 -> headersTimeoutMs\",\n )\n\n return {\n changed: true,\n migrated:\n migrated.headersTimeoutMs === undefined && hasLegacyHeadersTimeout ?\n { ...migrated, headersTimeoutMs: headersTimeoutMsV2 }\n : migrated,\n }\n}\n\nfunction ensureAdminApiKey(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const normalizedAdminApiKey = normalizeAdminApiKey(config.auth?.adminApiKey)\n if (normalizedAdminApiKey) {\n if (config.auth?.adminApiKey === normalizedAdminApiKey) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n auth: {\n ...config.auth,\n adminApiKey: normalizedAdminApiKey,\n },\n },\n changed: true,\n }\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const { mergedConfig } = mergeDefaultConfig({\n ...editableConfig,\n auth: {\n ...editableConfig.auth,\n adminApiKey: generateAdminApiKey(),\n },\n })\n\n return { mergedConfig, changed: true }\n}\n\nexport function mergeConfigWithDefaults(): AppConfig {\n const config = readConfigFromDisk()\n const { mergedConfig, changed } = mergeDefaultConfig(config)\n const {\n mergedConfig: mergedConfigWithAdminApiKey,\n changed: adminApiKeyChanged,\n } = ensureAdminApiKey(mergedConfig)\n const shouldPersistConfig = changed || adminApiKeyChanged\n\n if (shouldPersistConfig) {\n try {\n writeConfigToDisk(mergedConfigWithAdminApiKey)\n } catch (writeError) {\n if (adminApiKeyChanged) {\n throw writeError\n }\n\n consola.warn(\n \"Failed to write merged default config to config file\",\n writeError,\n )\n }\n }\n\n cachedConfig = mergedConfigWithAdminApiKey\n return mergedConfigWithAdminApiKey\n}\n\nexport function getConfig(): AppConfig {\n cachedConfig ??= mergeDefaultConfig(readConfigFromDisk()).mergedConfig\n return cachedConfig\n}\n\nexport function reloadConfig(): AppConfig {\n return mergeConfigWithDefaults()\n}\n\nexport function isMessagesApiEnabled(): boolean {\n const config = getConfig()\n return config.useMessagesApi ?? true\n}\n\nexport function isResponsesApiWebSocketEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSocket ?? true\n}\n\n// Applies to every upstream HTTP transport (Copilot Chat Completions and\n// Messages, Codex Responses, and provider-forwarded requests), not only the\n// Responses API.\nexport function getUpstreamTransportConfig(): Required<UpstreamTransportConfig> {\n return normalizeUpstreamTransportConfig(getConfig().upstreamTransport)\n}\n\nexport const normalizeUpstreamTransportConfig = (\n configured: UpstreamTransportConfig | undefined,\n): Required<UpstreamTransportConfig> => ({\n headersTimeoutMs: positiveIntegerOrDefault(\n configured?.headersTimeoutMs,\n defaultUpstreamTransportConfig.headersTimeoutMs,\n ),\n streamInactivityTimeoutMs: positiveIntegerOrDefault(\n configured?.streamInactivityTimeoutMs,\n defaultUpstreamTransportConfig.streamInactivityTimeoutMs,\n ),\n websocketMaxBufferedBytes: positiveIntegerOrDefault(\n configured?.websocketMaxBufferedBytes,\n defaultUpstreamTransportConfig.websocketMaxBufferedBytes,\n ),\n websocketMaxBufferedMessages: positiveIntegerOrDefault(\n configured?.websocketMaxBufferedMessages,\n defaultUpstreamTransportConfig.websocketMaxBufferedMessages,\n ),\n websocketOpenTimeoutMs: positiveIntegerOrDefault(\n configured?.websocketOpenTimeoutMs,\n defaultUpstreamTransportConfig.websocketOpenTimeoutMs,\n ),\n websocketPoolIdleTimeoutMs: positiveIntegerOrDefault(\n configured?.websocketPoolIdleTimeoutMs,\n defaultUpstreamTransportConfig.websocketPoolIdleTimeoutMs,\n ),\n})\n\nconst positiveIntegerOrDefault = (value: unknown, fallback: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback\n\n const normalized = Math.floor(value)\n return normalized > 0 ? normalized : fallback\n}\n\nexport function getAnthropicApiKey(): string | undefined {\n const config = getConfig()\n return config.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY ?? undefined\n}\n\nexport function isResponsesApiWebSearchEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSearch ?? true\n}\n\nexport function isAlphaSearchCodexPriorityEnabled(): boolean {\n const config = getConfig()\n return config.alphaSearchCodexPriority ?? true\n}\n\nexport function getAlphaSearchModel(): string | undefined {\n const model = getConfig().alphaSearchModel ?? \"gpt-6-luna\"\n return model.trim() || undefined\n}\n\nexport function getMessageApiWebSearchModel(): string | undefined {\n const config = getConfig()\n const model = config.messageApiWebSearchModel ?? \"gpt-6-luna\"\n return model && model.trim().length > 0 ? model : undefined\n}\n\nexport function getClaudeAutoModel(): string | undefined {\n const config = getConfig()\n const model = config.claudeAutoModel\n return model && model.trim().length > 0 ? model.trim() : undefined\n}\n\nexport function getClaudeTokenMultiplier(): number {\n const config = getConfig()\n return config.claudeTokenMultiplier ?? 1.15\n}\n","import {\n defaultConfig,\n defaultContextManagement,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n} from \"./config-store\"\n\nconst GPT_MODEL_PATTERN = /^gpt-(\\d+)(?:\\.(\\d+))?/\n\nfunction isGpt53OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 3\n}\n\nexport function isGpt56OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 6\n}\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n const userPrompt = config.extraPrompts?.[model]\n if (userPrompt !== undefined) {\n return userPrompt\n }\n return isGpt53OrAbove(model) ? gpt5CommentaryPrompt : \"\"\n}\n\nexport function getModelMappings(): Record<string, string> {\n const config = getConfig()\n const modelMappings = config.modelMappings\n if (!modelMappings) {\n return { ...defaultConfig.modelMappings }\n }\n\n const validMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (\n !sourceModel\n || typeof targetModel !== \"string\"\n || targetModel.length === 0\n ) {\n continue\n }\n validMappings[sourceModel] = targetModel\n }\n\n return validMappings\n}\n\nfunction validateModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const validatedMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (!sourceModel || !targetModel) {\n throw new Error(\n \"Each model mapping must use non-empty source and target values.\",\n )\n }\n validatedMappings[sourceModel] = targetModel\n }\n\n return validatedMappings\n}\n\nexport function setModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const nextConfig = {\n ...readEditableConfigFromDisk(),\n modelMappings: validateModelMappings(modelMappings),\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getModelMappings()\n}\n\nexport function resolveMappedModel(model: string): string {\n return getModelMappings()[model] ?? model\n}\n\nexport function getSmallModel(): string {\n return getSmallModelForProvider(\"copilot\") ?? \"gpt-6-luna\"\n}\n\nexport function getSmallModelForProvider(provider: string): string | undefined {\n const providerName = provider.trim()\n const configuredModels = getConfig().smallModels\n const model =\n configuredModels && Object.hasOwn(configuredModels, providerName) ?\n configuredModels[providerName]\n : defaultConfig.smallModels?.[providerName]\n\n return typeof model === \"string\" ? model.trim() || undefined : undefined\n}\n\nexport function isContextManagementEnabledForMessages(): boolean {\n const config = getConfig()\n return config.contextManagement?.messages ?? defaultContextManagement.messages\n}\n\nexport function isContextManagementEnabledForResponses(): boolean {\n const config = getConfig()\n return (\n config.contextManagement?.responses ?? defaultContextManagement.responses\n )\n}\n\nexport function getModelResponsesApiCompactThreshold(\n model: string,\n): number | undefined {\n const config = getConfig()\n const threshold = config.modelResponsesApiCompactThresholds?.[model]\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" {\n const config = getConfig()\n const userEffort = config.modelReasoningEfforts?.[model]\n if (userEffort !== undefined) {\n return userEffort\n }\n return isGpt53OrAbove(model) ? \"xhigh\" : \"high\"\n}\n","import { createHash, randomUUID } from \"node:crypto\"\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type {\n Cost as ModelsDevCost,\n Model as ModelsDevModel,\n ModelCost as ModelsDevModelCost,\n ProviderMap as ModelsDevProviderMap,\n} from \"@opencode-ai/models\"\nimport consola from \"consola\"\n\nimport type {\n BuiltinProviderInputModality,\n BuiltinProviderModelConfig,\n} from \"./builtin-provider-models\"\nimport type {\n CodexReasoningEffort,\n ModelReasoningField,\n ProviderType,\n} from \"./config-store\"\nimport { PATHS } from \"./paths\"\nimport type {\n TokenUsagePricingConfig,\n TokenUsagePricingTier,\n} from \"./token-usage/pricing\"\n\nconst MODELS_DEV_URL = \"https://models.dev/api.json\"\nconst REFRESH_INTERVAL_MS = 5 * 60 * 1000\nconst FETCH_TIMEOUT_MS = 15_000\nconst OPENCODE_GO = \"opencode-go\"\nconst REASONING_EFFORTS = new Set<CodexReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n])\n\ninterface ModelRecord {\n [key: string]: string | number | Array<string> | undefined\n id: string\n name: string\n object: \"model\"\n created: number\n owned_by: typeof OPENCODE_GO\n context_window?: number\n max_output_tokens?: number\n input_modalities?: Array<BuiltinProviderInputModality>\n reasoning_efforts?: Array<CodexReasoningEffort>\n}\ntype ModelsDevFetcher = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>\n\ninterface CatalogSnapshot {\n configs: Record<string, BuiltinProviderModelConfig>\n providerTypes: Record<string, ProviderType>\n records: Array<ModelRecord>\n selectableProviders: Array<ModelsDevProviderOption>\n selectableProviderModelTypes: Record<string, Record<string, ProviderType>>\n selectableProviderModelApis: Record<string, Record<string, string>>\n selectableProviderModelPricing: Record<\n string,\n Record<string, TokenUsagePricingConfig>\n >\n}\n\nexport interface ModelsDevProviderOption {\n id: string\n name: string\n api: string\n type: ProviderType\n}\n\ninterface ResponseValidator {\n etag?: string\n lastModified?: string\n}\n\nexport interface ModelsDevCacheOptions {\n cachePath?: string\n fetcher?: ModelsDevFetcher\n intervalMs?: number\n}\n\nlet snapshot: CatalogSnapshot | null = null\nlet refreshTimer: ReturnType<typeof setTimeout> | null = null\nlet refreshGeneration = 0\nlet responseValidator: ResponseValidator | null = null\nlet cachedBodyHash: string | null = null\nlet activeCachePath: string | null = null\nlet refreshAbortController: AbortController | null = null\nlet activeRefresh: Promise<void> | null = null\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction getMetadataPath(cachePath: string): string {\n const extension = path.extname(cachePath)\n return path.join(\n path.dirname(cachePath),\n `${path.basename(cachePath, extension)}.meta.json`,\n )\n}\n\nfunction hashBody(body: string): string {\n return createHash(\"sha256\").update(body).digest(\"hex\")\n}\n\nfunction nonNegativeNumber(value: number | undefined): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : undefined\n}\n\nfunction positiveNumber(value: number | undefined): number | undefined {\n const number = nonNegativeNumber(value)\n return number && number > 0 ? number : undefined\n}\n\nfunction mapPriceTier(value: ModelsDevCost): TokenUsagePricingTier {\n const input = nonNegativeNumber(value.input)\n const output = nonNegativeNumber(value.output)\n const cachedInput = nonNegativeNumber(value.cache_read)\n const cacheCreationInput = nonNegativeNumber(value.cache_write)\n return {\n ...(input !== undefined && { input }),\n ...(output !== undefined && { output }),\n ...(cachedInput !== undefined && { cachedInput }),\n ...(cacheCreationInput !== undefined && { cacheCreationInput }),\n }\n}\n\nfunction mapPricing(\n value: ModelsDevModelCost | undefined,\n): TokenUsagePricingConfig | undefined {\n if (!isRecord(value)) return undefined\n\n const base = mapPriceTier(value)\n const higherTiers = (Array.isArray(value.tiers) ? value.tiers : [])\n .flatMap((tier) => {\n const threshold = positiveNumber(tier?.tier?.size)\n return threshold && threshold >= 1 && tier.tier.type === \"context\" ?\n [{ threshold, price: mapPriceTier(tier) }]\n : []\n })\n .sort((a, b) => a.threshold - b.threshold)\n\n if (higherTiers.length === 0) return base\n\n const firstTierMax = Math.ceil(higherTiers[0].threshold) - 1\n const tiers: Array<TokenUsagePricingTier> = [\n ...(firstTierMax > 0 ? [{ ...base, maxInputTokens: firstTierMax }] : []),\n ...higherTiers.map((tier, index) => ({\n ...tier.price,\n ...(higherTiers[index + 1] && {\n maxInputTokens: Math.ceil(higherTiers[index + 1].threshold) - 1,\n }),\n })),\n ]\n return { tiers }\n}\n\nfunction mapReasoningEfforts(\n value: ModelsDevModel[\"reasoning_options\"],\n): Array<CodexReasoningEffort> {\n if (!Array.isArray(value)) return []\n const efforts: Array<string | null> = []\n for (const option of value) {\n if (option?.type === \"effort\" && Array.isArray(option.values)) {\n efforts.push(...option.values)\n }\n }\n return [\n ...new Set(\n efforts.filter(\n (effort): effort is CodexReasoningEffort =>\n typeof effort === \"string\"\n && REASONING_EFFORTS.has(effort as CodexReasoningEffort),\n ),\n ),\n ]\n}\n\nfunction mapInputModalities(\n value: ModelsDevModel[\"modalities\"],\n): Array<BuiltinProviderInputModality> {\n if (!isRecord(value) || !Array.isArray(value.input)) return []\n return [\n ...new Set(\n value.input.filter(\n (modality): modality is BuiltinProviderInputModality =>\n modality === \"text\" || modality === \"image\",\n ),\n ),\n ]\n}\n\nfunction mapReasoningField(\n model: ModelsDevModel,\n): ModelReasoningField | undefined {\n const interleaved = model.interleaved\n const field = isRecord(interleaved) ? interleaved.field : interleaved\n if (field === \"reasoning_content\") return field\n // models.dev omits `interleaved` for the Hy family, whose Chat Completions\n // history expects the OpenRouter-style `reasoning` field.\n if (model.family === \"Hy\") return \"reasoning\"\n return undefined\n}\n\nfunction mapModelConfig(model: ModelsDevModel): BuiltinProviderModelConfig {\n const contextWindow = positiveNumber(model.limit?.context)\n const maxOutputTokens = positiveNumber(model.limit?.output)\n const reasoningEfforts = mapReasoningEfforts(model.reasoning_options)\n const inputModalities = mapInputModalities(model.modalities)\n const reasoningField = mapReasoningField(model)\n const pricing = mapPricing(model.cost)\n const defaultReasoningEffort =\n (\n (model.family === \"Hy\" || model.family === \"grok\")\n && reasoningEfforts.includes(\"high\")\n ) ?\n \"high\"\n : undefined\n return {\n ...(contextWindow && { contextWindow }),\n ...(maxOutputTokens && { maxOutputTokens }),\n ...(inputModalities.length > 0 && { inputModalities }),\n ...(reasoningEfforts.length > 0 && { reasoningEfforts }),\n ...(defaultReasoningEffort && { defaultReasoningEffort }),\n ...(reasoningField && { reasoningField }),\n ...(pricing && { pricing }),\n }\n}\n\nfunction mapProviderType(\n model: ModelsDevModel,\n providerNpm: string | undefined,\n): ProviderType {\n switch (model.provider?.npm || providerNpm) {\n case \"@ai-sdk/anthropic\":\n return \"anthropic\"\n case \"@ai-sdk/openai\":\n return model.provider?.shape === \"completions\" ?\n \"openai-compatible\"\n : \"openai-responses\"\n case \"@ai-sdk/openai-compatible\":\n default:\n return \"openai-compatible\"\n }\n}\n\nfunction normalizeCatalogApi(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.includes(\"${\")) return undefined\n const api = value.trim().replace(/\\/+$/u, \"\")\n let url: URL\n try {\n url = new URL(api)\n } catch {\n return undefined\n }\n if (\n (url.protocol !== \"https:\" && url.protocol !== \"http:\")\n || url.username\n || url.password\n || url.search\n || url.hash\n ) {\n return undefined\n }\n return api\n}\n\nfunction parseSelectableProviders(\n data: Record<string, unknown>,\n): Pick<\n CatalogSnapshot,\n | \"selectableProviders\"\n | \"selectableProviderModelTypes\"\n | \"selectableProviderModelApis\"\n | \"selectableProviderModelPricing\"\n> {\n const selectableProviders: Array<ModelsDevProviderOption> = []\n const selectableProviderModelTypes: Record<\n string,\n Record<string, ProviderType>\n > = Object.create(null) as Record<string, Record<string, ProviderType>>\n const selectableProviderModelApis: Record<\n string,\n Record<string, string>\n > = Object.create(null) as Record<string, Record<string, string>>\n const selectableProviderModelPricing: Record<\n string,\n Record<string, TokenUsagePricingConfig>\n > = Object.create(null) as Record<\n string,\n Record<string, TokenUsagePricingConfig>\n >\n\n for (const [id, value] of Object.entries(data)) {\n if (\n id === \"openrouter\"\n || id === \"github-copilot\"\n || id === \"opencode-go\"\n || id === \"copilot\"\n || id === \"codex\"\n || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(id)\n || !isRecord(value)\n || (value.npm !== \"@ai-sdk/openai-compatible\"\n && value.npm !== \"@ai-sdk/openai\"\n && value.npm !== \"@ai-sdk/anthropic\")\n ) {\n continue\n }\n\n const api = normalizeCatalogApi(value.api)\n if (!api) continue\n\n selectableProviders.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ?\n value.name.trim()\n : id,\n api,\n type:\n value.npm === \"@ai-sdk/openai\" ? \"openai-responses\"\n : value.npm === \"@ai-sdk/anthropic\" ? \"anthropic\"\n : \"openai-compatible\",\n })\n\n const modelTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const modelApis: Record<string, string> = Object.create(null) as Record<\n string,\n string\n >\n const modelPricing: Record<string, TokenUsagePricingConfig> = Object.create(\n null,\n ) as Record<string, TokenUsagePricingConfig>\n if (isRecord(value.models)) {\n for (const [modelId, model] of Object.entries(value.models)) {\n if (!isRecord(model) || model.status === \"deprecated\") continue\n const modelProvider = isRecord(model.provider) ? model.provider : null\n const modelNpm = modelProvider?.npm ?? value.npm\n if (\n modelNpm !== \"@ai-sdk/openai-compatible\"\n && modelNpm !== \"@ai-sdk/openai\"\n && modelNpm !== \"@ai-sdk/anthropic\"\n ) {\n continue\n }\n const type = mapProviderType(\n model as unknown as ModelsDevModel,\n value.npm,\n )\n modelTypes[modelId] = type\n const modelApi = normalizeCatalogApi(modelProvider?.api)\n if (modelApi) modelApis[modelId] = modelApi\n const pricing = mapPricing((model as unknown as ModelsDevModel).cost)\n if (pricing) modelPricing[modelId] = pricing\n }\n }\n selectableProviderModelTypes[id] = modelTypes\n selectableProviderModelApis[id] = modelApis\n selectableProviderModelPricing[id] = modelPricing\n }\n\n selectableProviders.sort(\n (a, b) =>\n a.name.localeCompare(b.name, \"en\") || a.id.localeCompare(b.id, \"en\"),\n )\n return {\n selectableProviders,\n selectableProviderModelTypes,\n selectableProviderModelApis,\n selectableProviderModelPricing,\n }\n}\n\nfunction parseCatalog(data: unknown): CatalogSnapshot {\n const provider = isRecord(data) ? data[OPENCODE_GO] : undefined\n const models = isRecord(provider) ? provider.models : undefined\n if (!isRecord(models)) {\n throw new Error(\"models.dev response has no opencode-go models\")\n }\n const providerNpm =\n isRecord(provider) && typeof provider.npm === \"string\" ?\n provider.npm\n : undefined\n\n const configs: Record<string, BuiltinProviderModelConfig> = Object.create(\n null,\n ) as Record<string, BuiltinProviderModelConfig>\n const providerTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const records: Array<ModelRecord> = []\n const typedModels = models as ModelsDevProviderMap[string][\"models\"]\n for (const id of Object.keys(typedModels).sort()) {\n const value = typedModels[id]\n if (\n !id.trim()\n || !isRecord(value)\n || value.id !== id\n || value.status === \"deprecated\"\n )\n continue\n const config = mapModelConfig(value)\n configs[id] = config\n providerTypes[id] = mapProviderType(value, providerNpm)\n records.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ? value.name : id,\n object: \"model\",\n created: 0,\n owned_by: OPENCODE_GO,\n ...(config.contextWindow && { context_window: config.contextWindow }),\n ...(config.maxOutputTokens && {\n max_output_tokens: config.maxOutputTokens,\n }),\n ...(config.inputModalities && {\n input_modalities: config.inputModalities,\n }),\n ...(config.reasoningEfforts && {\n reasoning_efforts: config.reasoningEfforts,\n }),\n })\n }\n\n if (records.length === 0) {\n throw new Error(\"models.dev response has no valid opencode-go models\")\n }\n return {\n configs,\n providerTypes,\n records,\n ...parseSelectableProviders(data as Record<string, unknown>),\n }\n}\n\nexport function installModelsDevCatalog(data: unknown): number {\n snapshot = parseCatalog(data)\n return snapshot.records.length\n}\n\nexport function getOpencodeGoModelIds(): Array<string> {\n return snapshot?.records.map((model) => model.id) ?? []\n}\n\nexport function getOpencodeGoModelConfig(\n modelId: string,\n): BuiltinProviderModelConfig | undefined {\n return (\n snapshot?.configs[modelId.trim()]\n ?? snapshot?.configs[modelId.trim().toLowerCase()]\n )\n}\n\nexport function getOpencodeGoModelProviderType(modelId: string): ProviderType {\n const id = modelId.trim()\n return (\n snapshot?.providerTypes[id]\n ?? snapshot?.providerTypes[id.toLowerCase()]\n ?? \"openai-compatible\"\n )\n}\n\nexport function getOpencodeGoModelRecords(): Array<ModelRecord> {\n return snapshot?.records ?? []\n}\n\nexport function getModelsDevProviderOptions(): Array<ModelsDevProviderOption> {\n return snapshot?.selectableProviders ?? []\n}\n\nexport function getModelsDevProviderApi(\n providerId: string,\n): string | undefined {\n return snapshot?.selectableProviders.find(\n (provider) => provider.id === providerId,\n )?.api\n}\n\nexport function getModelsDevModelProviderType(\n providerId: string,\n modelId: string,\n): ProviderType | undefined {\n return snapshot?.selectableProviderModelTypes[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelApi(\n providerId: string,\n modelId: string,\n): string | undefined {\n return snapshot?.selectableProviderModelApis[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelPricing(\n providerId: string,\n modelId: string,\n): TokenUsagePricingConfig | undefined {\n return snapshot?.selectableProviderModelPricing[providerId]?.[modelId]\n}\n\nexport async function loadModelsDevProviderOptions(): Promise<\n Array<ModelsDevProviderOption>\n> {\n if (!snapshot) {\n const cachePath =\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n await loadDiskCache(cachePath)\n if (!snapshot) {\n await refreshCatalog(\n cachePath,\n fetch,\n new AbortController().signal,\n refreshGeneration,\n )\n activeCachePath = cachePath\n }\n }\n return getModelsDevProviderOptions()\n}\n\nexport async function stopModelsDevRefreshLoop(): Promise<void> {\n refreshGeneration += 1\n if (refreshTimer) clearTimeout(refreshTimer)\n refreshTimer = null\n refreshAbortController?.abort()\n await activeRefresh?.catch(() => undefined)\n activeRefresh = null\n}\n\nasync function loadDiskCache(cachePath: string): Promise<void> {\n let body: string\n try {\n body = await fs.readFile(cachePath, \"utf8\")\n installModelsDevCatalog(JSON.parse(body))\n cachedBodyHash = hashBody(body)\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev disk cache.\", error)\n return\n }\n\n try {\n const metadata = JSON.parse(\n await fs.readFile(getMetadataPath(cachePath), \"utf8\"),\n ) as unknown\n if (isRecord(metadata) && metadata.sha256 === cachedBodyHash) {\n responseValidator = {\n etag:\n typeof metadata.etag === \"string\" && metadata.etag.trim() ?\n metadata.etag\n : undefined,\n lastModified:\n (\n typeof metadata.lastModified === \"string\"\n && metadata.lastModified.trim()\n ) ?\n metadata.lastModified\n : undefined,\n }\n }\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev cache metadata.\", error)\n }\n}\n\nasync function persistMetadata(\n cachePath: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n const metadataPath = getMetadataPath(cachePath)\n const temporaryPath = `${metadataPath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(\n temporaryPath,\n JSON.stringify({ sha256, ...validator }),\n { mode: 0o600 },\n )\n await fs.rename(temporaryPath, metadataPath)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function persistCache(\n cachePath: string,\n body: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n const temporaryPath = `${cachePath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(temporaryPath, body, { mode: 0o600 })\n await fs.rename(temporaryPath, cachePath)\n await persistMetadata(cachePath, sha256, validator)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function refreshCatalog(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n signal: AbortSignal,\n generation: number,\n): Promise<void> {\n const headers = new Headers({ accept: \"application/json\" })\n if (snapshot && responseValidator?.etag) {\n headers.set(\"if-none-match\", responseValidator.etag)\n } else if (snapshot && responseValidator?.lastModified) {\n headers.set(\"if-modified-since\", responseValidator.lastModified)\n }\n const response = await fetcher(MODELS_DEV_URL, {\n headers,\n signal: AbortSignal.any([signal, AbortSignal.timeout(FETCH_TIMEOUT_MS)]),\n })\n if (signal.aborted || generation !== refreshGeneration) return\n if (response.status === 304) {\n if (!snapshot) {\n throw new Error(\"models.dev returned HTTP 304 without a cached catalog\")\n }\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? responseValidator?.etag,\n lastModified:\n response.headers.get(\"last-modified\")\n ?? responseValidator?.lastModified,\n }\n if (cachedBodyHash) {\n try {\n await persistMetadata(cachePath, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev cache metadata.\", error)\n }\n }\n consola.debug(\"models.dev catalog is unchanged\")\n return\n }\n if (!response.ok) {\n throw new Error(`models.dev returned HTTP ${response.status}`)\n }\n\n const body = await response.text()\n if (signal.aborted || generation !== refreshGeneration) return\n const nextSnapshot = parseCatalog(JSON.parse(body))\n snapshot = nextSnapshot\n cachedBodyHash = hashBody(body)\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? undefined,\n lastModified: response.headers.get(\"last-modified\") ?? undefined,\n }\n try {\n await persistCache(cachePath, body, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev disk cache.\", error)\n }\n consola.debug(\n `Loaded ${nextSnapshot.records.length} OpenCode Go models from models.dev`,\n )\n}\n\nfunction scheduleRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n): void {\n refreshTimer = setTimeout(() => {\n refreshTimer = null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n false,\n )\n }, intervalMs)\n}\n\nasync function runRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n required: boolean,\n): Promise<void> {\n const controller = new AbortController()\n refreshAbortController = controller\n let refreshed = false\n try {\n await refreshCatalog(cachePath, fetcher, controller.signal, generation)\n refreshed = true\n } catch (error) {\n if (required) {\n throw new Error(\n `Failed to fetch initial models.dev catalog: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n )\n }\n if (generation === refreshGeneration && !controller.signal.aborted) {\n consola.warn(\n \"Failed to refresh models.dev catalog; keeping cached models.\",\n error,\n )\n }\n } finally {\n if (refreshAbortController === controller) refreshAbortController = null\n if (generation === refreshGeneration && (!required || refreshed)) {\n scheduleRefresh(cachePath, fetcher, intervalMs, generation)\n }\n }\n}\n\nexport async function startModelsDevCache(\n options: ModelsDevCacheOptions = {},\n): Promise<void> {\n await stopModelsDevRefreshLoop()\n responseValidator = null\n const generation = refreshGeneration\n const cachePath =\n options.cachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n if (activeCachePath !== cachePath) {\n snapshot = null\n cachedBodyHash = null\n }\n activeCachePath = cachePath\n const fetcher = options.fetcher ?? fetch\n const intervalMs = options.intervalMs ?? REFRESH_INTERVAL_MS\n await loadDiskCache(cachePath)\n if (generation === refreshGeneration) {\n const required = snapshot === null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n required,\n )\n if (required) await activeRefresh\n }\n}\n","import consola from \"consola\"\n\nimport {\n SUPPORTED_PROVIDER_TYPES,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n type ModelConfig,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./config-store\"\nimport {\n getModelsDevModelApi,\n getModelsDevModelPricing,\n getModelsDevModelProviderType,\n getModelsDevProviderApi,\n getOpencodeGoModelProviderType,\n} from \"./models-dev-cache\"\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n modelsDevProviderId?: string\n apiKey: string\n authType: ProviderAuthType\n authTypeExplicit?: boolean\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n}\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nexport function isSupportedProviderType(value: string): value is ProviderType {\n return SUPPORTED_PROVIDER_TYPES.includes(value as ProviderType)\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nexport function resolveProviderAuthType(\n providerName: string,\n authType: string | undefined,\n providerType: ProviderType,\n): ProviderAuthType {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n if (authType === undefined) {\n return defaultAuthType\n }\n\n if (authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"oauth2\") {\n if (providerName === \"codex\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has authType 'oauth2', which is only supported by the builtin codex provider, falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n }\n\n if (authType === \"authorization\" || authType === \"azure-entra\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n}\n\nfunction isProviderApiKeyRequired(\n providerName: string,\n authType: ProviderAuthType,\n): boolean {\n return (\n authType !== \"azure-entra\"\n && !(providerName === \"codex\" && authType === \"oauth2\")\n )\n}\n\nexport function getRawProviderConfig(name: string): ProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n return config.providers?.[providerName] ?? null\n}\n\nexport function setProviderConfig(\n name: string,\n provider: ProviderConfig,\n): ProviderConfig {\n const providerName = name.trim()\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (isReservedProviderName(providerName)) {\n throw new Error(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const nextConfig = {\n ...editableConfig,\n providers: {\n ...editableConfig.providers,\n [providerName]: provider,\n },\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getRawProviderConfig(providerName) ?? provider\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n if (isReservedProviderName(providerName)) {\n consola.warn(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n return null\n }\n\n const provider = getRawProviderConfig(providerName)\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? \"anthropic\"\n if (!isSupportedProviderType(type)) {\n consola.warn(\n `Provider ${providerName} is ignored because type '${type}' is not supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const authType = resolveProviderAuthType(\n providerName,\n provider.authType,\n type,\n )\n const apiKey = (provider.apiKey ?? \"\").trim()\n const missingFields = [\n ...(baseUrl ? [] : [\"baseUrl\"]),\n ...(isProviderApiKeyRequired(providerName, authType) && !apiKey ?\n [\"apiKey\"]\n : []),\n ]\n\n if (missingFields.length > 0) {\n consola.warn(\n `Provider ${providerName} is enabled but missing ${missingFields.join(\" or \")}`,\n )\n return null\n }\n\n return {\n name: providerName,\n type,\n baseUrl,\n modelsDevProviderId: provider.modelsDevProviderId,\n apiKey,\n authType,\n authTypeExplicit: provider.authType !== undefined,\n pricingCurrency: normalizePricingCurrency(provider.pricingCurrency),\n models: provider.models,\n }\n}\n\nexport function resolveEffectiveProviderType(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ProviderType {\n const modelConfig = providerConfig.models?.[model]\n if (modelConfig?.type && isSupportedProviderType(modelConfig.type)) {\n return modelConfig.type\n }\n\n if (providerConfig.name === \"opencode-go\") {\n return getOpencodeGoModelProviderType(model)\n }\n\n if (providerConfig.modelsDevProviderId) {\n const catalogType = getModelsDevModelProviderType(\n providerConfig.modelsDevProviderId,\n model,\n )\n if (catalogType) return catalogType\n }\n\n if (providerConfig.name === \"openrouter\") {\n if (model.includes(\"gpt-\")) {\n return \"openai-responses\"\n }\n }\n\n return providerConfig.type\n}\n\nexport function resolveProviderConfigForModel(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ResolvedProviderConfig {\n const type = resolveEffectiveProviderType(providerConfig, model)\n const modelApi =\n (\n providerConfig.modelsDevProviderId\n && providerConfig.baseUrl\n === getModelsDevProviderApi(providerConfig.modelsDevProviderId)\n ) ?\n getModelsDevModelApi(providerConfig.modelsDevProviderId, model)\n : undefined\n const configuredModel = providerConfig.models?.[model]\n const catalogPricing =\n providerConfig.modelsDevProviderId ?\n getModelsDevModelPricing(providerConfig.modelsDevProviderId, model)\n : undefined\n const useCatalogPricing =\n catalogPricing !== undefined && configuredModel?.pricing === undefined\n if (type === providerConfig.type && !modelApi && !useCatalogPricing) {\n return providerConfig\n }\n\n return {\n ...providerConfig,\n type,\n baseUrl: modelApi ?? providerConfig.baseUrl,\n models:\n useCatalogPricing ?\n {\n ...providerConfig.models,\n [model]: { ...configuredModel, pricing: catalogPricing },\n }\n : providerConfig.models,\n pricingCurrency: useCatalogPricing ? \"USD\" : providerConfig.pricingCurrency,\n authType:\n (\n type !== providerConfig.type\n && !providerConfig.authTypeExplicit\n && providerConfig.authType !== \"azure-entra\"\n && providerConfig.authType !== \"oauth2\"\n ) ?\n resolveProviderAuthType(providerConfig.name, undefined, type)\n : providerConfig.authType,\n }\n}\n\nfunction normalizePricingCurrency(\n value: string | undefined,\n): string | undefined {\n const currency = value?.trim().toUpperCase()\n return currency || undefined\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter((name) => getProviderConfig(name) !== null)\n}\n\nexport function isReservedProviderName(name: string): boolean {\n return name.trim() === \"copilot\"\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { B as PATHS, i as listEnabledProviders, n as getRawProviderConfig } from "./config-B_pC8QXv.js";
|
|
2
2
|
import { defineCommand } from "citty";
|
|
3
3
|
import consola from "consola";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
@@ -89,4 +89,4 @@ const debug = defineCommand({
|
|
|
89
89
|
//#endregion
|
|
90
90
|
export { debug };
|
|
91
91
|
|
|
92
|
-
//# sourceMappingURL=debug-
|
|
92
|
+
//# sourceMappingURL=debug-C4rsL806.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-
|
|
1
|
+
{"version":3,"file":"debug-C4rsL806.js","names":[],"sources":["../src/debug.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\nimport fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { getRawProviderConfig, listEnabledProviders } from \"./lib/config\"\nimport { PATHS } from \"./lib/paths\"\n\ninterface DebugInfo {\n providers: {\n codexConfigured: boolean\n enabled: Array<string>\n }\n version: string\n runtime: {\n name: string\n version: string\n platform: string\n arch: string\n }\n paths: {\n APP_DIR: string\n CONFIG_PATH: string\n GITHUB_TOKEN_PATH: string\n }\n tokenExists: boolean\n}\n\ninterface RunDebugOptions {\n json: boolean\n}\n\nasync function getPackageVersion(): Promise<string> {\n try {\n const packageJsonPath = fileURLToPath(\n new URL(\"../package.json\", import.meta.url),\n )\n // @ts-expect-error https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v59.0.1/docs/rules/prefer-json-parse-buffer.md\n // JSON.parse() can actually parse buffers\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath)) as {\n version: string\n }\n return packageJson.version\n } catch {\n return \"unknown\"\n }\n}\n\nfunction getRuntimeInfo() {\n const isBun = typeof Bun !== \"undefined\"\n\n return {\n name: isBun ? \"bun\" : \"node\",\n version: isBun ? Bun.version : process.version.slice(1),\n platform: os.platform(),\n arch: os.arch(),\n }\n}\n\nasync function checkFileExists(filePath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(filePath)\n if (!stats.isFile()) return false\n\n const content = await fs.readFile(filePath, \"utf8\")\n return content.trim().length > 0\n } catch {\n return false\n }\n}\n\nasync function getDebugInfo(): Promise<DebugInfo> {\n const [version, tokenExists] = await Promise.all([\n getPackageVersion(),\n checkFileExists(PATHS.GITHUB_TOKEN_PATH),\n ])\n\n return {\n providers: {\n codexConfigured: getRawProviderConfig(\"codex\") !== null,\n enabled: listEnabledProviders(),\n },\n version,\n runtime: getRuntimeInfo(),\n paths: {\n APP_DIR: PATHS.APP_DIR,\n CONFIG_PATH: PATHS.CONFIG_PATH,\n GITHUB_TOKEN_PATH: PATHS.GITHUB_TOKEN_PATH,\n },\n tokenExists,\n }\n}\n\nfunction printDebugInfoPlain(info: DebugInfo): void {\n consola.info(`copilot-api debug\n\nVersion: ${info.version}\nRuntime: ${info.runtime.name} ${info.runtime.version} (${info.runtime.platform} ${info.runtime.arch})\n\nProviders:\n- enabled: ${info.providers.enabled.join(\", \") || \"none\"}\n- codex configured: ${info.providers.codexConfigured ? \"Yes\" : \"No\"}\n\nPaths:\n- APP_DIR: ${info.paths.APP_DIR}\n- CONFIG_PATH: ${info.paths.CONFIG_PATH}\n- GITHUB_TOKEN_PATH: ${info.paths.GITHUB_TOKEN_PATH}\n\nGitHub token exists: ${info.tokenExists ? \"Yes\" : \"No\"}`)\n}\n\nfunction printDebugInfoJson(info: DebugInfo): void {\n console.log(JSON.stringify(info, null, 2))\n}\n\nexport async function runDebug(options: RunDebugOptions): Promise<void> {\n const debugInfo = await getDebugInfo()\n\n if (options.json) {\n printDebugInfoJson(debugInfo)\n } else {\n printDebugInfoPlain(debugInfo)\n }\n}\n\nexport const debug = defineCommand({\n meta: {\n name: \"debug\",\n description: \"Print debug information about the application\",\n },\n args: {\n json: {\n type: \"boolean\",\n default: false,\n description: \"Output debug information as JSON\",\n },\n },\n run({ args }) {\n return runDebug({\n json: args.json,\n })\n },\n})\n"],"mappings":";;;;;;;AAmCA,eAAe,oBAAqC;CAClD,IAAI;EACF,MAAM,kBAAkB,cACtB,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAC5C;EAMA,OAHoB,KAAK,MAAM,MAAM,GAAG,SAAS,eAAe,CAG/C,CAAC,CAAC;CACrB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,iBAAiB;CACxB,MAAM,QAAQ,OAAO,QAAQ;CAE7B,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,SAAS,QAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,CAAC;EACtD,UAAU,GAAG,SAAS;EACtB,MAAM,GAAG,KAAK;CAChB;AACF;AAEA,eAAe,gBAAgB,UAAoC;CACjE,IAAI;EAEF,IAAI,EAAC,MADe,GAAG,KAAK,QAAQ,EAAA,CACzB,OAAO,GAAG,OAAO;EAG5B,QAAO,MADe,GAAG,SAAS,UAAU,MAAM,EAAA,CACnC,KAAK,CAAC,CAAC,SAAS;CACjC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAe,eAAmC;CAChD,MAAM,CAAC,SAAS,eAAe,MAAM,QAAQ,IAAI,CAC/C,kBAAkB,GAClB,gBAAgB,MAAM,iBAAiB,CACzC,CAAC;CAED,OAAO;EACL,WAAW;GACT,iBAAiB,qBAAqB,OAAO,MAAM;GACnD,SAAS,qBAAqB;EAChC;EACA;EACA,SAAS,eAAe;EACxB,OAAO;GACL,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,mBAAmB,MAAM;EAC3B;EACA;CACF;AACF;AAEA,SAAS,oBAAoB,MAAuB;CAClD,QAAQ,KAAK;;WAEJ,KAAK,QAAQ;WACb,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,KAAK;;;aAGvF,KAAK,UAAU,QAAQ,KAAK,IAAI,KAAK,OAAO;sBACnC,KAAK,UAAU,kBAAkB,QAAQ,KAAK;;;aAGvD,KAAK,MAAM,QAAQ;iBACf,KAAK,MAAM,YAAY;uBACjB,KAAK,MAAM,kBAAkB;;uBAE7B,KAAK,cAAc,QAAQ,MAAM;AACxD;AAEA,SAAS,mBAAmB,MAAuB;CACjD,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAEA,eAAsB,SAAS,SAAyC;CACtE,MAAM,YAAY,MAAM,aAAa;CAErC,IAAI,QAAQ,MACV,mBAAmB,SAAS;MAE5B,oBAAoB,SAAS;AAEjC;AAEA,MAAa,QAAQ,cAAc;CACjC,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EACJ,MAAM;EACJ,MAAM;EACN,SAAS;EACT,aAAa;CACf,EACF;CACA,IAAI,EAAE,QAAQ;EACZ,OAAO,SAAS,EACd,MAAM,KAAK,KACb,CAAC;CACH;AACF,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -27,10 +27,10 @@ if (isMcpFastPath(process.argv)) {
|
|
|
27
27
|
if (process.platform === "win32" && process.stdout.isTTY && !process.env.WT_SESSION) process.env.WT_SESSION = "copilot-api";
|
|
28
28
|
const { bindElectronFetch } = await import("./electron-fetch-DsMaRX6v.js");
|
|
29
29
|
bindElectronFetch();
|
|
30
|
-
const { auth } = await import("./auth
|
|
31
|
-
const { debug } = await import("./debug-
|
|
30
|
+
const { auth } = await import("./auth-80i7uQZz.js");
|
|
31
|
+
const { debug } = await import("./debug-C4rsL806.js");
|
|
32
32
|
const { mcp } = await import("./mcp-Byz9h_xz.js");
|
|
33
|
-
const { start } = await import("./start-
|
|
33
|
+
const { start } = await import("./start-BBW3xFvJ.js");
|
|
34
34
|
await runMain(defineCommand({
|
|
35
35
|
meta: {
|
|
36
36
|
name: "copilot-api",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Z as state } from "./token-
|
|
1
|
+
import { Z as state } from "./token-FQiOqL6l.js";
|
|
2
2
|
//#region src/lib/models.ts
|
|
3
3
|
/**
|
|
4
4
|
* Converts a Copilot upstream model ID to a client-friendly ID that Claude Code
|
|
@@ -87,4 +87,4 @@ const normalizeSdkModelId = (sdkModelId) => {
|
|
|
87
87
|
//#endregion
|
|
88
88
|
export { toClientModelId as i, getLatestModelForFamily as n, normalizeSdkModelId as r, findEndpointModel as t };
|
|
89
89
|
|
|
90
|
-
//# sourceMappingURL=models-
|
|
90
|
+
//# sourceMappingURL=models-CP0sdQmq.js.map
|