@jeffreycao/copilot-api 1.10.12 → 1.10.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/dist/{auth-9cNGmKTS.js → auth-pzJhbgbH.js} +3 -3
- package/dist/{auth-9cNGmKTS.js.map → auth-pzJhbgbH.js.map} +1 -1
- package/dist/{check-usage-TtF-fhRm.js → check-usage-Cz41OYeD.js} +3 -3
- package/dist/{check-usage-TtF-fhRm.js.map → check-usage-Cz41OYeD.js.map} +1 -1
- package/dist/{config-ztdkLu9o.js → config-DtIF3Zvk.js} +1 -1
- package/dist/{config-ztdkLu9o.js.map → config-DtIF3Zvk.js.map} +1 -1
- package/dist/{debug-BVHmoCzY.js → debug-Cc-hdADF.js} +2 -2
- package/dist/{debug-BVHmoCzY.js.map → debug-Cc-hdADF.js.map} +1 -1
- package/dist/main.js +4 -4
- package/dist/{server-C3iJWAUP.js → server-yJcTwrWm.js} +118 -73
- package/dist/server-yJcTwrWm.js.map +1 -0
- package/dist/{start-DSzP59pP.js → start-DpP5nm-1.js} +4 -4
- package/dist/{start-DSzP59pP.js.map → start-DpP5nm-1.js.map} +1 -1
- package/dist/{token-CQHif3s_.js → token-CtfDxnY4.js} +54 -226
- package/dist/token-CtfDxnY4.js.map +1 -0
- package/package.json +1 -1
- package/dist/server-C3iJWAUP.js.map +0 -1
- package/dist/token-CQHif3s_.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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-
|
|
125
|
+
const { server } = await import("./server-yJcTwrWm.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-
|
|
214
|
+
//# sourceMappingURL=start-DpP5nm-1.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-DpP5nm-1.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-
|
|
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/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
458
|
-
return
|
|
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 =
|
|
476
|
-
|
|
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.
|
|
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 {
|
|
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-
|
|
1724
|
+
//# sourceMappingURL=token-CtfDxnY4.js.map
|