@jeffreycao/copilot-api 1.10.12 → 1.10.13

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.
@@ -1,5 +1,5 @@
1
- import { E as initOpencodeVersion, H as state, V as initProxyFromEnv, a as setupGitHubToken, c as cacheVSCodeVersion, i as setupCopilotToken, l as cacheVsCodeDeviceId, o as cacheMacMachineId, s as cacheModels, t as logUser, u as cacheVsCodeSessionId } from "./token-CQHif3s_.js";
2
- import { b as ensurePaths, h as mergeConfigWithDefaults } from "./config-ztdkLu9o.js";
1
+ import { b as ensurePaths, h as mergeConfigWithDefaults } from "./config-DtIF3Zvk.js";
2
+ import { L as initProxyFromEnv, R as state, a as setupGitHubToken, c as cacheVSCodeVersion, i as setupCopilotToken, l as cacheVsCodeDeviceId, o as cacheMacMachineId, s as cacheModels, t as logUser, u as cacheVsCodeSessionId, w as initOpencodeVersion } from "./token-CtfDxnY4.js";
3
3
  import { defineCommand } from "citty";
4
4
  import consola from "consola";
5
5
  import { execSync } from "node:child_process";
@@ -122,7 +122,7 @@ async function runServer(options) {
122
122
  }
123
123
  }
124
124
  consola.box(`🌐 Usage Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`);
125
- const { server } = await import("./server-C3iJWAUP.js");
125
+ const { server } = await import("./server-CPTxEK7c.js");
126
126
  serve({
127
127
  fetch: server.fetch,
128
128
  port: options.port,
@@ -211,4 +211,4 @@ const start = defineCommand({
211
211
  //#endregion
212
212
  export { start };
213
213
 
214
- //# sourceMappingURL=start-DSzP59pP.js.map
214
+ //# sourceMappingURL=start-BFEMlh3z.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-DSzP59pP.js","names":[],"sources":["../src/lib/shell.ts","../src/start.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport process from \"node:process\"\n\ntype ShellName = \"bash\" | \"zsh\" | \"fish\" | \"powershell\" | \"cmd\" | \"sh\"\ntype EnvVars = Record<string, string | undefined>\n\nfunction getShell(): ShellName {\n const { platform, ppid, env } = process\n\n if (platform === \"win32\") {\n try {\n const command = `wmic process get ParentProcessId,Name | findstr \"${ppid}\"`\n const parentProcess = execSync(command, { stdio: \"pipe\" }).toString()\n\n if (parentProcess.toLowerCase().includes(\"powershell.exe\")) {\n return \"powershell\"\n }\n } catch {\n return \"cmd\"\n }\n\n return \"cmd\"\n } else {\n const shellPath = env.SHELL\n if (shellPath) {\n if (shellPath.endsWith(\"zsh\")) return \"zsh\"\n if (shellPath.endsWith(\"fish\")) return \"fish\"\n if (shellPath.endsWith(\"bash\")) return \"bash\"\n }\n\n return \"sh\"\n }\n}\n\n/**\n * Generates a copy-pasteable script to set multiple environment variables\n * and run a subsequent command.\n * @param {EnvVars} envVars - An object of environment variables to set.\n * @param {string} commandToRun - The command to run after setting the variables.\n * @returns {string} The formatted script string.\n */\nexport function generateEnvScript(\n envVars: EnvVars,\n commandToRun: string = \"\",\n): string {\n const shell = getShell()\n const filteredEnvVars = Object.entries(envVars).filter(\n ([, value]) => value !== undefined,\n ) as Array<[string, string]>\n\n let commandBlock: string\n\n switch (shell) {\n case \"powershell\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `$env:${key} = ${value}`)\n .join(\"; \")\n break\n }\n case \"cmd\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set ${key}=${value}`)\n .join(\" & \")\n break\n }\n case \"fish\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set -gx ${key} ${value}`)\n .join(\"; \")\n break\n }\n default: {\n // bash, zsh, sh\n const assignments = filteredEnvVars\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : \"\"\n break\n }\n }\n\n if (commandBlock && commandToRun) {\n const separator = shell === \"cmd\" ? \" & \" : \" && \"\n return `${commandBlock}${separator}${commandToRun}`\n }\n\n return commandBlock || commandToRun\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport clipboard from \"clipboardy\"\nimport consola from \"consola\"\nimport { serve, type ServerHandler } from \"srvx\"\nimport invariant from \"tiny-invariant\"\n\nimport { mergeConfigWithDefaults } from \"./lib/config\"\nimport { initOpencodeVersion } from \"./lib/opencode\"\nimport { ensurePaths } from \"./lib/paths\"\nimport { initProxyFromEnv } from \"./lib/proxy\"\nimport { generateEnvScript } from \"./lib/shell\"\nimport { state } from \"./lib/state\"\nimport { logUser, setupCopilotToken, setupGitHubToken } from \"./lib/token\"\nimport {\n cacheMacMachineId,\n cacheModels,\n cacheVSCodeVersion,\n cacheVsCodeSessionId,\n cacheVsCodeDeviceId,\n} from \"./lib/utils\"\n\ninterface RunServerOptions {\n port: number\n verbose: boolean\n accountType: string\n manual: boolean\n rateLimit?: number\n rateLimitWait: boolean\n githubToken?: string\n claudeCode: boolean\n showToken: boolean\n proxyEnv: boolean\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n // Work around unjs/consola#357 until a release includes PR #359.\n consola.options.throttle = 0\n\n // Ensure config is merged with defaults at startup\n mergeConfigWithDefaults()\n\n await initOpencodeVersion()\n\n if (options.proxyEnv) {\n initProxyFromEnv()\n }\n\n state.verbose = options.verbose\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.accountType = options.accountType\n if (options.accountType !== \"individual\") {\n consola.info(`Using ${options.accountType} plan GitHub account`)\n }\n\n state.manualApprove = options.manual\n state.rateLimitSeconds = options.rateLimit\n state.rateLimitWait = options.rateLimitWait\n state.showToken = options.showToken\n\n await ensurePaths()\n await cacheVSCodeVersion()\n cacheMacMachineId()\n cacheVsCodeSessionId()\n await cacheVsCodeDeviceId()\n\n if (options.githubToken) {\n state.githubToken = options.githubToken\n consola.info(\"Using provided GitHub token\")\n await logUser()\n } else {\n await setupGitHubToken()\n }\n\n await setupCopilotToken()\n await cacheModels()\n\n consola.info(\n `Available models: \\n${state.models?.data.map((model) => `- ${model.id}`).join(\"\\n\")}`,\n )\n\n const serverUrl = `http://localhost:${options.port}`\n\n if (options.claudeCode) {\n consola.log(\n \"\\n💡 Tip: The --claude-code flag simply generates a clipboard command for launching Claude Code. \\n\"\n + \"All models remain fully accessible without this flag, just configure the model ID directly in your settings.json file.\",\n )\n\n invariant(state.models, \"Models should be loaded by now\")\n\n const selectedModel = await consola.prompt(\n \"Select a model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const selectedSmallModel = await consola.prompt(\n \"Select a small model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const command = generateEnvScript(\n {\n ANTHROPIC_BASE_URL: serverUrl,\n ANTHROPIC_AUTH_TOKEN: \"dummy\",\n ANTHROPIC_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: selectedSmallModel,\n DISABLE_NON_ESSENTIAL_MODEL_CALLS: \"1\",\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: \"1\",\n CLAUDE_CODE_ATTRIBUTION_HEADER: \"0\",\n CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: \"false\",\n CLAUDE_CODE_DISABLE_TERMINAL_TITLE: \"true\",\n CLAUDE_CODE_ENABLE_AWAY_SUMMARY: \"0\",\n CLAUDE_PLUGIN_ENABLE_QUESTION_RULES: \"true\",\n },\n \"claude\",\n )\n\n try {\n clipboard.writeSync(command)\n consola.success(\"Copied Claude Code command to clipboard!\")\n } catch {\n consola.warn(\n \"Failed to copy to clipboard. Here is the Claude Code command:\",\n )\n consola.log(command)\n }\n }\n\n consola.box(\n `🌐 Usage Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`,\n )\n\n const { server } = await import(\"./server\")\n\n serve({\n fetch: server.fetch as ServerHandler,\n port: options.port,\n bun: {\n idleTimeout: 0,\n },\n })\n}\n\nexport const start = defineCommand({\n meta: {\n name: \"start\",\n description: \"Start the Copilot API server\",\n },\n args: {\n port: {\n alias: \"p\",\n type: \"string\",\n default: \"4141\",\n description: \"Port to listen on\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"account-type\": {\n alias: \"a\",\n type: \"string\",\n default: \"individual\",\n description: \"Account type to use (individual, business, enterprise)\",\n },\n manual: {\n type: \"boolean\",\n default: false,\n description: \"Enable manual request approval\",\n },\n \"rate-limit\": {\n alias: \"r\",\n type: \"string\",\n description: \"Rate limit in seconds between requests\",\n },\n wait: {\n alias: \"w\",\n type: \"boolean\",\n default: false,\n description:\n \"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set\",\n },\n \"github-token\": {\n alias: \"g\",\n type: \"string\",\n description:\n \"Provide GitHub token directly (must be generated using the `auth` subcommand)\",\n },\n \"claude-code\": {\n alias: \"c\",\n type: \"boolean\",\n default: false,\n description:\n \"Generate a command to launch Claude Code with Copilot API config\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub and Copilot tokens on fetch and refresh\",\n },\n \"proxy-env\": {\n type: \"boolean\",\n default: false,\n description: \"Initialize proxy from environment variables\",\n },\n },\n run({ args }) {\n const rateLimitRaw = args[\"rate-limit\"]\n const rateLimit =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n rateLimitRaw === undefined ? undefined : Number.parseInt(rateLimitRaw, 10)\n\n return runServer({\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n accountType: args[\"account-type\"],\n manual: args.manual,\n rateLimit,\n rateLimitWait: args.wait,\n githubToken: args[\"github-token\"],\n claudeCode: args[\"claude-code\"],\n showToken: args[\"show-token\"],\n proxyEnv: args[\"proxy-env\"],\n })\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"start-BFEMlh3z.js","names":[],"sources":["../src/lib/shell.ts","../src/start.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport process from \"node:process\"\n\ntype ShellName = \"bash\" | \"zsh\" | \"fish\" | \"powershell\" | \"cmd\" | \"sh\"\ntype EnvVars = Record<string, string | undefined>\n\nfunction getShell(): ShellName {\n const { platform, ppid, env } = process\n\n if (platform === \"win32\") {\n try {\n const command = `wmic process get ParentProcessId,Name | findstr \"${ppid}\"`\n const parentProcess = execSync(command, { stdio: \"pipe\" }).toString()\n\n if (parentProcess.toLowerCase().includes(\"powershell.exe\")) {\n return \"powershell\"\n }\n } catch {\n return \"cmd\"\n }\n\n return \"cmd\"\n } else {\n const shellPath = env.SHELL\n if (shellPath) {\n if (shellPath.endsWith(\"zsh\")) return \"zsh\"\n if (shellPath.endsWith(\"fish\")) return \"fish\"\n if (shellPath.endsWith(\"bash\")) return \"bash\"\n }\n\n return \"sh\"\n }\n}\n\n/**\n * Generates a copy-pasteable script to set multiple environment variables\n * and run a subsequent command.\n * @param {EnvVars} envVars - An object of environment variables to set.\n * @param {string} commandToRun - The command to run after setting the variables.\n * @returns {string} The formatted script string.\n */\nexport function generateEnvScript(\n envVars: EnvVars,\n commandToRun: string = \"\",\n): string {\n const shell = getShell()\n const filteredEnvVars = Object.entries(envVars).filter(\n ([, value]) => value !== undefined,\n ) as Array<[string, string]>\n\n let commandBlock: string\n\n switch (shell) {\n case \"powershell\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `$env:${key} = ${value}`)\n .join(\"; \")\n break\n }\n case \"cmd\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set ${key}=${value}`)\n .join(\" & \")\n break\n }\n case \"fish\": {\n commandBlock = filteredEnvVars\n .map(([key, value]) => `set -gx ${key} ${value}`)\n .join(\"; \")\n break\n }\n default: {\n // bash, zsh, sh\n const assignments = filteredEnvVars\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n commandBlock = filteredEnvVars.length > 0 ? `export ${assignments}` : \"\"\n break\n }\n }\n\n if (commandBlock && commandToRun) {\n const separator = shell === \"cmd\" ? \" & \" : \" && \"\n return `${commandBlock}${separator}${commandToRun}`\n }\n\n return commandBlock || commandToRun\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport clipboard from \"clipboardy\"\nimport consola from \"consola\"\nimport { serve, type ServerHandler } from \"srvx\"\nimport invariant from \"tiny-invariant\"\n\nimport { mergeConfigWithDefaults } from \"./lib/config\"\nimport { initOpencodeVersion } from \"./lib/opencode\"\nimport { ensurePaths } from \"./lib/paths\"\nimport { initProxyFromEnv } from \"./lib/proxy\"\nimport { generateEnvScript } from \"./lib/shell\"\nimport { state } from \"./lib/state\"\nimport { logUser, setupCopilotToken, setupGitHubToken } from \"./lib/token\"\nimport {\n cacheMacMachineId,\n cacheModels,\n cacheVSCodeVersion,\n cacheVsCodeSessionId,\n cacheVsCodeDeviceId,\n} from \"./lib/utils\"\n\ninterface RunServerOptions {\n port: number\n verbose: boolean\n accountType: string\n manual: boolean\n rateLimit?: number\n rateLimitWait: boolean\n githubToken?: string\n claudeCode: boolean\n showToken: boolean\n proxyEnv: boolean\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n // Work around unjs/consola#357 until a release includes PR #359.\n consola.options.throttle = 0\n\n // Ensure config is merged with defaults at startup\n mergeConfigWithDefaults()\n\n await initOpencodeVersion()\n\n if (options.proxyEnv) {\n initProxyFromEnv()\n }\n\n state.verbose = options.verbose\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.accountType = options.accountType\n if (options.accountType !== \"individual\") {\n consola.info(`Using ${options.accountType} plan GitHub account`)\n }\n\n state.manualApprove = options.manual\n state.rateLimitSeconds = options.rateLimit\n state.rateLimitWait = options.rateLimitWait\n state.showToken = options.showToken\n\n await ensurePaths()\n await cacheVSCodeVersion()\n cacheMacMachineId()\n cacheVsCodeSessionId()\n await cacheVsCodeDeviceId()\n\n if (options.githubToken) {\n state.githubToken = options.githubToken\n consola.info(\"Using provided GitHub token\")\n await logUser()\n } else {\n await setupGitHubToken()\n }\n\n await setupCopilotToken()\n await cacheModels()\n\n consola.info(\n `Available models: \\n${state.models?.data.map((model) => `- ${model.id}`).join(\"\\n\")}`,\n )\n\n const serverUrl = `http://localhost:${options.port}`\n\n if (options.claudeCode) {\n consola.log(\n \"\\n💡 Tip: The --claude-code flag simply generates a clipboard command for launching Claude Code. \\n\"\n + \"All models remain fully accessible without this flag, just configure the model ID directly in your settings.json file.\",\n )\n\n invariant(state.models, \"Models should be loaded by now\")\n\n const selectedModel = await consola.prompt(\n \"Select a model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const selectedSmallModel = await consola.prompt(\n \"Select a small model to use with Claude Code\",\n {\n type: \"select\",\n options: state.models.data.map((model) => model.id),\n },\n )\n\n const command = generateEnvScript(\n {\n ANTHROPIC_BASE_URL: serverUrl,\n ANTHROPIC_AUTH_TOKEN: \"dummy\",\n ANTHROPIC_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel,\n ANTHROPIC_DEFAULT_HAIKU_MODEL: selectedSmallModel,\n DISABLE_NON_ESSENTIAL_MODEL_CALLS: \"1\",\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: \"1\",\n CLAUDE_CODE_ATTRIBUTION_HEADER: \"0\",\n CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION: \"false\",\n CLAUDE_CODE_DISABLE_TERMINAL_TITLE: \"true\",\n CLAUDE_CODE_ENABLE_AWAY_SUMMARY: \"0\",\n CLAUDE_PLUGIN_ENABLE_QUESTION_RULES: \"true\",\n },\n \"claude\",\n )\n\n try {\n clipboard.writeSync(command)\n consola.success(\"Copied Claude Code command to clipboard!\")\n } catch {\n consola.warn(\n \"Failed to copy to clipboard. Here is the Claude Code command:\",\n )\n consola.log(command)\n }\n }\n\n consola.box(\n `🌐 Usage Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`,\n )\n\n const { server } = await import(\"./server\")\n\n serve({\n fetch: server.fetch as ServerHandler,\n port: options.port,\n bun: {\n idleTimeout: 0,\n },\n })\n}\n\nexport const start = defineCommand({\n meta: {\n name: \"start\",\n description: \"Start the Copilot API server\",\n },\n args: {\n port: {\n alias: \"p\",\n type: \"string\",\n default: \"4141\",\n description: \"Port to listen on\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"account-type\": {\n alias: \"a\",\n type: \"string\",\n default: \"individual\",\n description: \"Account type to use (individual, business, enterprise)\",\n },\n manual: {\n type: \"boolean\",\n default: false,\n description: \"Enable manual request approval\",\n },\n \"rate-limit\": {\n alias: \"r\",\n type: \"string\",\n description: \"Rate limit in seconds between requests\",\n },\n wait: {\n alias: \"w\",\n type: \"boolean\",\n default: false,\n description:\n \"Wait instead of error when rate limit is hit. Has no effect if rate limit is not set\",\n },\n \"github-token\": {\n alias: \"g\",\n type: \"string\",\n description:\n \"Provide GitHub token directly (must be generated using the `auth` subcommand)\",\n },\n \"claude-code\": {\n alias: \"c\",\n type: \"boolean\",\n default: false,\n description:\n \"Generate a command to launch Claude Code with Copilot API config\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub and Copilot tokens on fetch and refresh\",\n },\n \"proxy-env\": {\n type: \"boolean\",\n default: false,\n description: \"Initialize proxy from environment variables\",\n },\n },\n run({ args }) {\n const rateLimitRaw = args[\"rate-limit\"]\n const rateLimit =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n rateLimitRaw === undefined ? undefined : Number.parseInt(rateLimitRaw, 10)\n\n return runServer({\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n accountType: args[\"account-type\"],\n manual: args.manual,\n rateLimit,\n rateLimitWait: args.wait,\n githubToken: args[\"github-token\"],\n claudeCode: args[\"claude-code\"],\n showToken: args[\"show-token\"],\n proxyEnv: args[\"proxy-env\"],\n })\n },\n})\n"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { p as isResponsesApiWebSocketEnabled, s as getRawProviderConfig, v as setProviderConfig, y as PATHS } from "./config-ztdkLu9o.js";
1
+ import { p as isResponsesApiWebSocketEnabled, s as getRawProviderConfig, v as setProviderConfig, y as PATHS } from "./config-DtIF3Zvk.js";
2
2
  import consola from "consola";
3
3
  import { createHash, randomBytes, randomUUID } from "node:crypto";
4
4
  import { createServer } from "node:http";
5
+ import { events } from "fetch-event-stream";
5
6
  import fs, { readFile } from "node:fs/promises";
6
7
  import { networkInterfaces } from "node:os";
7
8
  import path from "node:path";
@@ -10,38 +11,39 @@ import { getProxyForUrl } from "proxy-from-env";
10
11
  import { AsyncLocalStorage } from "node:async_hooks";
11
12
  import { setTimeout as setTimeout$1 } from "node:timers/promises";
12
13
  import { exec } from "node:child_process";
13
- //#region src/lib/codex-rate-limit.ts
14
- const codexRateLimitScopes = ["primary", "secondary"];
15
- const formatCodexRateLimitResetAt = (resetAt) => {
16
- const date = /* @__PURE__ */ new Date(resetAt * 1e3);
17
- return Number.isNaN(date.getTime()) ? String(resetAt) : date.toLocaleString();
18
- };
19
- const logCodexRateLimitsEvent = (event) => {
20
- if (!event || typeof event !== "object") return;
21
- const eventRecord = event;
22
- if (eventRecord.type !== "codex.rate_limits") return;
23
- const rateLimits = eventRecord.rate_limits;
24
- if (!rateLimits || typeof rateLimits !== "object") return;
25
- const planType = typeof eventRecord.plan_type === "string" ? eventRecord.plan_type : null;
26
- const rateLimitRecord = rateLimits;
27
- const allowed = typeof rateLimitRecord.allowed === "boolean" ? rateLimitRecord.allowed : null;
28
- const limitReached = typeof rateLimitRecord.limit_reached === "boolean" ? rateLimitRecord.limit_reached : null;
29
- for (const scope of codexRateLimitScopes) {
30
- const window = rateLimitRecord[scope];
31
- if (!isCodexRateLimitWindow(window)) continue;
32
- const summary = [];
33
- if (allowed !== null) summary.push(`allowed=${allowed}`);
34
- if (limitReached !== null) summary.push(`limit_reached=${limitReached}`);
35
- summary.push(`used=${window.used_percent}%`, `reset_at=${formatCodexRateLimitResetAt(window.reset_at)}`);
36
- const label = planType ? `Codex ${scope} rate limit (${planType})` : `Codex ${scope} rate limit`;
37
- consola.log(`${label}: ${summary.join(", ")}`);
14
+ //#region src/lib/error.ts
15
+ var HTTPError = class extends Error {
16
+ response;
17
+ constructor(message, response) {
18
+ super(message);
19
+ this.response = response;
38
20
  }
39
21
  };
40
- const isCodexRateLimitWindow = (value) => {
41
- if (!value || typeof value !== "object") return false;
42
- const record = value;
43
- return typeof record.reset_after_seconds === "number" && typeof record.reset_at === "number" && typeof record.used_percent === "number" && typeof record.window_minutes === "number";
44
- };
22
+ async function forwardError(c, error) {
23
+ consola.error("Error occurred:", error);
24
+ if (error instanceof HTTPError) {
25
+ if (error.response.status === 429) for (const [name, value] of error.response.headers) {
26
+ const lowerName = name.toLowerCase();
27
+ if (lowerName === "retry-after" || lowerName.startsWith("x-")) c.header(name, value);
28
+ }
29
+ const errorText = await error.response.text();
30
+ let errorJson;
31
+ try {
32
+ errorJson = JSON.parse(errorText);
33
+ } catch {
34
+ errorJson = errorText;
35
+ }
36
+ consola.error("HTTP error:", errorJson);
37
+ return c.json({ error: {
38
+ message: errorText,
39
+ type: "error"
40
+ } }, error.response.status);
41
+ }
42
+ return c.json({ error: {
43
+ message: error.message,
44
+ type: "error"
45
+ } }, 500);
46
+ }
45
47
  //#endregion
46
48
  //#region src/lib/state.ts
47
49
  const state = {
@@ -370,14 +372,6 @@ const STRIPPED_CODEX_REQUEST_HEADERS = new Set([
370
372
  "x-api-key"
371
373
  ]);
372
374
  const STRIPPED_CODEX_WEBSOCKET_HEADERS = new Set(["accept", "content-type"]);
373
- const CODEX_RESPONSE_STATUSES = new Set([
374
- "completed",
375
- "incomplete",
376
- "failed",
377
- "cancelled",
378
- "queued",
379
- "in_progress"
380
- ]);
381
375
  const requireCodexAuthContext = () => {
382
376
  const accessToken = state.codexAccessToken;
383
377
  const accountId = state.codexAccountId;
@@ -401,6 +395,7 @@ function buildCodexResponsesHeaders(requestHeaders, options = {}) {
401
395
  for (const [headerName, headerValue] of requestHeaders) {
402
396
  const headerNameLower = headerName.toLowerCase();
403
397
  if (STRIPPED_CODEX_REQUEST_HEADERS.has(headerNameLower)) continue;
398
+ if (headerNameLower.includes("trace")) continue;
404
399
  headers.set(headerName, headerValue);
405
400
  }
406
401
  if (!headers.has("accept")) headers.set("accept", options.stream ? "text/event-stream" : "application/json");
@@ -454,12 +449,16 @@ async function forwardCodexResponses(payload, requestHeaders, baseUrl = CODEX_AP
454
449
  max_output_tokens: void 0,
455
450
  metadata: void 0
456
451
  };
457
- if (normalizedPayload.stream && resolveCodexResponsesTransport(options.transport) === "websocket") return await forwardCodexResponsesOverWebSocket(normalizedPayload, requestHeaders, baseUrl);
458
- return await fetch(resolveCodexResponsesUrl(baseUrl), {
452
+ const transport = resolveCodexResponsesTransport(options.transport);
453
+ if (normalizedPayload.stream && transport === "websocket") return forwardCodexResponsesOverWebSocket(normalizedPayload, requestHeaders, baseUrl);
454
+ const response = await fetch(resolveCodexResponsesUrl(baseUrl), {
459
455
  method: "POST",
460
456
  headers: buildCodexResponsesHeaders(requestHeaders, { stream: normalizedPayload.stream }),
461
457
  body: JSON.stringify(normalizedPayload)
462
458
  });
459
+ if (!response.ok) throw new HTTPError("Failed to create codex responses", response);
460
+ if (normalizedPayload.stream) return events(response);
461
+ return await response.json();
463
462
  }
464
463
  const buildCodexResponsesWebSocketPoolKey = (payload, headers, baseUrl) => {
465
464
  const authFingerprint = createHash("sha256").update(`${state.codexAccessToken ?? "missing-token"}:${state.codexAccountId ?? "missing-account"}`).digest("hex").slice(0, 16);
@@ -472,22 +471,23 @@ const buildCodexResponsesWebSocketPoolKey = (payload, headers, baseUrl) => {
472
471
  headerFingerprint
473
472
  ].map(encodePoolKeyPart).join("|");
474
473
  };
475
- const forwardCodexResponsesOverWebSocket = async (payload, requestHeaders, baseUrl) => {
476
- const stream = createCodexResponsesWebSocketStream(prepareCodexResponsesWebSocketRequest(payload, requestHeaders, baseUrl));
477
- if (payload.stream) return createCodexResponsesWebSocketProxyResponse(stream);
478
- const response = await consumeCodexResponsesWebSocketStream(stream);
479
- return new Response(JSON.stringify(response), {
480
- headers: { "content-type": "application/json; charset=utf-8" },
481
- status: 200
482
- });
474
+ const forwardCodexResponsesOverWebSocket = (payload, requestHeaders, baseUrl) => {
475
+ return createCodexResponsesWebSocketStream(prepareCodexResponsesWebSocketRequest(payload, requestHeaders, baseUrl));
483
476
  };
484
- const createCodexResponsesWebSocketStream = (request) => createPooledWebSocketStream(request, {
477
+ const createCodexResponsesWebSocketStream = (request) => createCodexResponsesSafeStream(createPooledWebSocketStream(request, {
485
478
  createChunk: createCodexResponsesWebSocketStreamChunk,
486
479
  isTerminalChunk: isTerminalCodexResponsesWebSocketChunk,
487
480
  openErrorMessage: "Failed to create codex responses websocket",
488
481
  streamErrorMessage: "Codex responses websocket stream error",
489
482
  terminalChunkMissingMessage: "Codex responses websocket ended without a terminal response"
490
- });
483
+ }));
484
+ const createCodexResponsesSafeStream = async function* (source) {
485
+ try {
486
+ yield* source;
487
+ } catch (error) {
488
+ yield createResponsesErrorServerSentEventChunk(getErrorMessage(error));
489
+ }
490
+ };
491
491
  const createCodexResponsesWebSocketStreamChunk = (data) => {
492
492
  if (data === "[DONE]") return { data };
493
493
  try {
@@ -505,115 +505,11 @@ const isTerminalCodexResponsesWebSocketChunk = (chunk) => {
505
505
  if (!chunk.data || chunk.data === "[DONE]") return false;
506
506
  try {
507
507
  const parsed = JSON.parse(chunk.data);
508
- return parsed.type === "response.completed" || parsed.type === "response.done" || parsed.type === "response.failed" || parsed.type === "response.incomplete" || parsed.type === "error";
508
+ return parsed.type === "response.completed" || parsed.type === "response.failed" || parsed.type === "response.incomplete" || parsed.type === "error";
509
509
  } catch {
510
510
  return false;
511
511
  }
512
512
  };
513
- const consumeCodexResponsesWebSocketStream = async (stream) => {
514
- for await (const chunk of stream) {
515
- if (!chunk.data || chunk.data === "[DONE]") continue;
516
- const event = JSON.parse(chunk.data);
517
- if (event.type === "error") throw new Error(typeof event.message === "string" ? event.message : "Codex responses websocket returned an error event");
518
- if ((event.type === "response.completed" || event.type === "response.done") && event.response) return event.response;
519
- if ((event.type === "response.failed" || event.type === "response.incomplete") && event.response) return event.response;
520
- }
521
- throw new Error("Codex responses websocket ended without a terminal response");
522
- };
523
- const createCodexResponsesWebSocketProxyResponse = (stream) => {
524
- return new Response(createServerSentEventStream(normalizeCodexResponsesWebSocketStream(stream)), {
525
- headers: {
526
- "cache-control": "no-cache",
527
- "content-type": "text/event-stream; charset=utf-8"
528
- },
529
- status: 200
530
- });
531
- };
532
- const createStandardizedCodexResponsesEventStream = (source, options = {}) => {
533
- return createServerSentEventStream(normalizeCodexResponsesStandardStream(source, options));
534
- };
535
- const normalizeCodexResponsesWebSocketStream = async function* (stream) {
536
- for await (const chunk of stream) yield normalizeCodexResponsesProxyChunk(chunk);
537
- };
538
- const normalizeCodexResponsesStandardStream = async function* (stream, options) {
539
- try {
540
- for await (const chunk of stream) {
541
- const normalized = normalizeCodexResponsesStandardChunk(chunk);
542
- await options.onChunk?.(normalized.chunk);
543
- if (normalized.event) await options.onEvent?.(normalized.event);
544
- yield normalized.chunk;
545
- }
546
- } finally {
547
- await options.onClose?.();
548
- }
549
- };
550
- const normalizeCodexResponsesProxyChunk = (chunk) => {
551
- if (!chunk.data || chunk.data === "[DONE]") return chunk;
552
- try {
553
- const parsed = JSON.parse(chunk.data);
554
- if (parsed.type !== "response.completed") return chunk;
555
- return {
556
- ...chunk,
557
- data: JSON.stringify({
558
- ...parsed,
559
- type: "response.done"
560
- }),
561
- event: "response.done"
562
- };
563
- } catch {
564
- return chunk;
565
- }
566
- };
567
- const normalizeCodexResponsesStandardChunk = (chunk) => {
568
- if (!chunk.data || chunk.data === "[DONE]") return {
569
- chunk,
570
- event: null
571
- };
572
- try {
573
- const parsed = JSON.parse(chunk.data);
574
- logCodexRateLimitsEvent(parsed);
575
- const normalized = normalizeCodexResponsesEvent(parsed);
576
- if (!normalized) return {
577
- chunk,
578
- event: null
579
- };
580
- return {
581
- chunk: {
582
- ...chunk,
583
- data: JSON.stringify(normalized),
584
- event: normalized.type
585
- },
586
- event: normalized
587
- };
588
- } catch {
589
- return {
590
- chunk,
591
- event: null
592
- };
593
- }
594
- };
595
- const createServerSentEventStream = (source) => {
596
- const encoder = new TextEncoder();
597
- const iterator = source[Symbol.asyncIterator]();
598
- return new ReadableStream({
599
- async cancel() {
600
- await iterator.return?.();
601
- },
602
- async pull(controller) {
603
- try {
604
- const result = await iterator.next();
605
- if (result.done) {
606
- controller.close();
607
- return;
608
- }
609
- controller.enqueue(encoder.encode(serializeServerSentEvent(result.value)));
610
- } catch (error) {
611
- controller.enqueue(encoder.encode(serializeServerSentEvent(createResponsesErrorServerSentEventChunk(getErrorMessage(error)))));
612
- controller.close();
613
- }
614
- }
615
- });
616
- };
617
513
  const createResponsesErrorServerSentEventChunk = (message) => {
618
514
  const errorEvent = {
619
515
  code: null,
@@ -627,45 +523,11 @@ const createResponsesErrorServerSentEventChunk = (message) => {
627
523
  event: errorEvent.type
628
524
  };
629
525
  };
630
- const serializeServerSentEvent = (chunk) => {
631
- const lines = [];
632
- if (chunk.id) lines.push(`id: ${chunk.id}`);
633
- if (chunk.event) lines.push(`event: ${chunk.event}`);
634
- if (chunk.data !== void 0) for (const line of String(chunk.data).split(/\r?\n/u)) lines.push(`data: ${line}`);
635
- return `${lines.join("\n")}\n\n`;
636
- };
637
526
  const getErrorMessage = (error) => {
638
527
  if (error instanceof Error && error.message) return error.message;
639
528
  return String(error);
640
529
  };
641
530
  const encodePoolKeyPart = (value) => encodeURIComponent(value);
642
- function normalizeCodexResponseStatus(status) {
643
- return typeof status === "string" && CODEX_RESPONSE_STATUSES.has(status) ? status : void 0;
644
- }
645
- function normalizeCodexResponseRecord(eventRecord) {
646
- const response = eventRecord.response;
647
- if (!response || typeof response !== "object") return eventRecord;
648
- const normalizedStatus = normalizeCodexResponseStatus(response.status);
649
- if (!normalizedStatus) return eventRecord;
650
- return {
651
- ...eventRecord,
652
- response: {
653
- ...response,
654
- status: normalizedStatus
655
- }
656
- };
657
- }
658
- function normalizeCodexResponsesEvent(event) {
659
- if (!event || typeof event !== "object") return null;
660
- const eventRecord = normalizeCodexResponseRecord(event);
661
- const type = eventRecord.type;
662
- if (typeof type !== "string") return null;
663
- if (type === "response.done") return {
664
- ...eventRecord,
665
- type: "response.completed"
666
- };
667
- return eventRecord;
668
- }
669
531
  //#endregion
670
532
  //#region src/lib/oauth/codex.ts
671
533
  const CALLBACK_HOST = "127.0.0.1";
@@ -1293,40 +1155,6 @@ async function writeCodexCredentials(credentials) {
1293
1155
  await writeProtectedFile(PATHS.CODEX_CREDENTIAL_PATH, `${JSON.stringify(credentials, null, 2)}\n`);
1294
1156
  }
1295
1157
  //#endregion
1296
- //#region src/lib/error.ts
1297
- var HTTPError = class extends Error {
1298
- response;
1299
- constructor(message, response) {
1300
- super(message);
1301
- this.response = response;
1302
- }
1303
- };
1304
- async function forwardError(c, error) {
1305
- consola.error("Error occurred:", error);
1306
- if (error instanceof HTTPError) {
1307
- if (error.response.status === 429) for (const [name, value] of error.response.headers) {
1308
- const lowerName = name.toLowerCase();
1309
- if (lowerName === "retry-after" || lowerName.startsWith("x-")) c.header(name, value);
1310
- }
1311
- const errorText = await error.response.text();
1312
- let errorJson;
1313
- try {
1314
- errorJson = JSON.parse(errorText);
1315
- } catch {
1316
- errorJson = errorText;
1317
- }
1318
- consola.error("HTTP error:", errorJson);
1319
- return c.json({ error: {
1320
- message: errorText,
1321
- type: "error"
1322
- } }, error.response.status);
1323
- }
1324
- return c.json({ error: {
1325
- message: error.message,
1326
- type: "error"
1327
- } }, 500);
1328
- }
1329
- //#endregion
1330
1158
  //#region src/services/github/get-copilot-token.ts
1331
1159
  const getCopilotToken = async () => {
1332
1160
  const response = await fetch(`${getGitHubApiBaseUrl()}/copilot_internal/v2/token`, { headers: githubHeaders(state) });
@@ -1891,6 +1719,6 @@ async function logUser() {
1891
1719
  state.copilotApiUrl = (await getCopilotUsage()).endpoints.api;
1892
1720
  }
1893
1721
  //#endregion
1894
- export { compactSystemPromptStarts as A, createWebSocketUrl as B, prepareForCompact as C, compactAutoContinuePromptStarts as D, initOpencodeVersion as E, normalizeCodexResponsesEvent as F, state as H, generateTraceId as I, requestContext as L, loginCodex as M, createStandardizedCodexResponsesEventStream as N, compactMessageSections as O, forwardCodexResponses as P, resolveTraceId as R, copilotWebSocketHeaders as S, prepareMessageProxyHeaders as T, logCodexRateLimitsEvent as U, initProxyFromEnv as V, getCopilotUsage as _, setupGitHubToken as a, copilotBaseUrl as b, cacheVSCodeVersion as c, generateRequestIdFromPayload as d, getRootSessionId as f, sleep as g, parseUserIdMetadata as h, setupCopilotToken as i, compactTextOnlyGuard as j, compactSummaryPromptStart as k, cacheVsCodeDeviceId as l, isNullish as m, persistCodexCredentials as n, cacheMacMachineId as o, getUUID as p, setupCodexToken as r, cacheModels as s, logUser as t, cacheVsCodeSessionId as u, HTTPError as v, prepareInteractionHeaders as w, copilotHeaders as x, forwardError as y, createPooledWebSocketStream as z };
1722
+ export { loginCodex as A, forwardError as B, prepareMessageProxyHeaders as C, compactSummaryPromptStart as D, compactMessageSections as E, createPooledWebSocketStream as F, createWebSocketUrl as I, initProxyFromEnv as L, generateTraceId as M, requestContext as N, compactSystemPromptStarts as O, resolveTraceId as P, state as R, prepareInteractionHeaders as S, compactAutoContinuePromptStarts as T, getCopilotUsage as _, setupGitHubToken as a, copilotWebSocketHeaders as b, cacheVSCodeVersion as c, generateRequestIdFromPayload as d, getRootSessionId as f, sleep as g, parseUserIdMetadata as h, setupCopilotToken as i, forwardCodexResponses as j, compactTextOnlyGuard as k, cacheVsCodeDeviceId as l, isNullish as m, persistCodexCredentials as n, cacheMacMachineId as o, getUUID as p, setupCodexToken as r, cacheModels as s, logUser as t, cacheVsCodeSessionId as u, copilotBaseUrl as v, initOpencodeVersion as w, prepareForCompact as x, copilotHeaders as y, HTTPError as z };
1895
1723
 
1896
- //# sourceMappingURL=token-CQHif3s_.js.map
1724
+ //# sourceMappingURL=token-CtfDxnY4.js.map