@jeffreycao/copilot-api 2.7.41 → 2.7.43

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.
Files changed (29) hide show
  1. package/README.md +5 -2
  2. package/README.zh-CN.md +5 -2
  3. package/dist/{auth-jRuZhT_b.js → auth-B9pYwLYA.js} +4 -4
  4. package/dist/{auth-jRuZhT_b.js.map → auth-B9pYwLYA.js.map} +1 -1
  5. package/dist/auth-dswtyrvJ.js +1 -0
  6. package/dist/{config-BqSuE5h5.js → config-BvACNGIp.js} +19 -3
  7. package/dist/config-BvACNGIp.js.map +1 -0
  8. package/dist/{config-store-BsluQttR.js → config-store-BLr5xjym.js} +10 -3
  9. package/dist/config-store-BLr5xjym.js.map +1 -0
  10. package/dist/{copilot-runtime-CjQPxPeV.js → copilot-runtime-DvmA6ALD.js} +3 -3
  11. package/dist/{copilot-runtime-CjQPxPeV.js.map → copilot-runtime-DvmA6ALD.js.map} +1 -1
  12. package/dist/{debug-RUUyusA_.js → debug-C_uR3s4n.js} +3 -3
  13. package/dist/{debug-RUUyusA_.js.map → debug-C_uR3s4n.js.map} +1 -1
  14. package/dist/main.js +4 -4
  15. package/dist/{provider-BMPS2mij.js → provider-_0MixRky.js} +2 -2
  16. package/dist/{provider-BMPS2mij.js.map → provider-_0MixRky.js.map} +1 -1
  17. package/dist/{provider-management-vyEQj9RR.js → provider-management-C8AWr-Gk.js} +2 -2
  18. package/dist/{provider-management-vyEQj9RR.js.map → provider-management-C8AWr-Gk.js.map} +1 -1
  19. package/dist/{server-h60svXN0.js → server-Bz8hGP4q.js} +199 -8
  20. package/dist/server-Bz8hGP4q.js.map +1 -0
  21. package/dist/{start-C6fQ39n5.js → start-BBEryu3z.js} +7 -7
  22. package/dist/{start-C6fQ39n5.js.map → start-BBEryu3z.js.map} +1 -1
  23. package/dist/{token-CZmr-geT.js → token-D3nRiw9B.js} +3 -3
  24. package/dist/{token-CZmr-geT.js.map → token-D3nRiw9B.js.map} +1 -1
  25. package/package.json +1 -1
  26. package/dist/auth-CelraKXD.js +0 -1
  27. package/dist/config-BqSuE5h5.js.map +0 -1
  28. package/dist/config-store-BsluQttR.js.map +0 -1
  29. package/dist/server-h60svXN0.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { C as ensurePaths, D as state, E as isGitHubCopilotEnabled, S as PATHS, _ as mergeConfigWithDefaults } from "./config-store-BsluQttR.js";
2
- import { b as startModelsDevCache, i as listEnabledProviders } from "./config-BqSuE5h5.js";
3
- import { A as initOpencodeVersion, J as readGitHubTokenFromEnv, K as GITHUB_TOKEN_ENV, R as getConfiguredApiKeys, q as readGitHubToken, z as getMissingApiKeysMessage } from "./token-CZmr-geT.js";
4
- import { o as runProviderSetup } from "./auth-jRuZhT_b.js";
5
- import { i as registerProcessCleanup, r as EventBus, t as setupCopilotRuntime } from "./copilot-runtime-CjQPxPeV.js";
1
+ import { C as ensurePaths, D as state, E as isGitHubCopilotEnabled, S as PATHS, _ as mergeConfigWithDefaults } from "./config-store-BLr5xjym.js";
2
+ import { b as startModelsDevCache, i as listEnabledProviders } from "./config-BvACNGIp.js";
3
+ import { A as initOpencodeVersion, J as readGitHubTokenFromEnv, K as GITHUB_TOKEN_ENV, R as getConfiguredApiKeys, q as readGitHubToken, z as getMissingApiKeysMessage } from "./token-D3nRiw9B.js";
4
+ import { o as runProviderSetup } from "./auth-B9pYwLYA.js";
5
+ import { i as registerProcessCleanup, r as EventBus, t as setupCopilotRuntime } from "./copilot-runtime-DvmA6ALD.js";
6
6
  import { defineCommand } from "citty";
7
7
  import consola from "consola";
8
8
  import { resolve } from "node:path";
@@ -301,7 +301,7 @@ async function runServer(options) {
301
301
  if (resolvedGitHubToken && isGitHubCopilotEnabled()) await setupCopilotMode(resolvedGitHubToken.token, resolvedGitHubToken.source);
302
302
  else await setupProviderMode();
303
303
  consola.box(`🌐 Dashboard Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`);
304
- const { createServer } = await import("./server-h60svXN0.js");
304
+ const { createServer } = await import("./server-Bz8hGP4q.js");
305
305
  const plugins = await loadGatewayPlugins(process.env.COPILOT_API_PLUGINS, {
306
306
  port: options.port,
307
307
  baseDir: PATHS.APP_DIR
@@ -371,4 +371,4 @@ const start = defineCommand({
371
371
  });
372
372
  export { start };
373
373
 
374
- //# sourceMappingURL=start-C6fQ39n5.js.map
374
+ //# sourceMappingURL=start-BBEryu3z.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-C6fQ39n5.js","names":["get"],"sources":["../src/lib/proxy.ts","../src/lib/server-host-shared.ts","../src/lib/server-host.ts","../src/lib/gateway-plugins.ts","../src/start.ts"],"sourcesContent":["import consola from \"consola\"\nimport { getProxyForUrl } from \"proxy-from-env\"\nimport { Agent, ProxyAgent, setGlobalDispatcher, type Dispatcher } from \"undici\"\n\nlet proxyEnvDispatcher: Dispatcher | undefined\n\nexport function getProxyEnvDispatcher(): Dispatcher | undefined {\n return proxyEnvDispatcher\n}\n\nexport function initProxyFromEnv(): void {\n try {\n const direct = new Agent()\n const proxies = new Map<string, ProxyAgent>()\n\n // We only need a minimal dispatcher that implements `dispatch` at runtime.\n // Typing the object as `Dispatcher` forces TypeScript to require many\n // additional methods. Instead, keep a plain object and cast when passing\n // to `setGlobalDispatcher`.\n const dispatcher = {\n dispatch(\n options: Dispatcher.DispatchOptions,\n handler: Dispatcher.DispatchHandler,\n ) {\n try {\n const origin =\n typeof options.origin === \"string\" ?\n new URL(options.origin)\n : (options.origin as URL)\n const get = getProxyForUrl as unknown as (\n u: string,\n ) => string | undefined\n const raw = get(origin.toString())\n const proxyUrl = raw && raw.length > 0 ? raw : undefined\n if (!proxyUrl) {\n consola.debug(`HTTP proxy bypass: ${origin.hostname}`)\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n let agent = proxies.get(proxyUrl)\n if (!agent) {\n agent = new ProxyAgent(proxyUrl)\n proxies.set(proxyUrl, agent)\n }\n let label = proxyUrl\n try {\n const u = new URL(proxyUrl)\n label = `${u.protocol}//${u.host}`\n } catch {\n /* noop */\n }\n consola.debug(`HTTP proxy route: ${origin.hostname} via ${label}`)\n return (agent as unknown as Dispatcher).dispatch(options, handler)\n } catch {\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n },\n close() {\n return direct.close()\n },\n destroy() {\n return direct.destroy()\n },\n }\n\n proxyEnvDispatcher = dispatcher as unknown as Dispatcher\n\n if (typeof Bun !== \"undefined\") {\n consola.debug(\"WebSocket proxy configured from environment (per-URL)\")\n return\n }\n\n setGlobalDispatcher(proxyEnvDispatcher)\n consola.debug(\"HTTP proxy configured from environment (per-URL)\")\n } catch (err) {\n consola.debug(\"Proxy setup skipped:\", err)\n }\n}\n","// Pure hostname helpers shared by the gateway server (Node) and the desktop\n// app (including the renderer bundle). This module must stay free of\n// `node:*` imports because the renderer cannot use `node:net`; all\n// address-family checks live in `server-host.ts`.\nexport const INVALID_HOST_CHARACTERS = /[\\s/?#]/\n\n// Bind hosts that listen on every interface, in normalized form (no\n// brackets, so \"[::]\" is covered via `stripIpv6Brackets`).\nexport const NORMALIZED_WILDCARD_HOSTS = new Set([\"0.0.0.0\", \"::\"])\n\nexport function stripIpv6Brackets(hostname: string): string {\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n return hostname.slice(1, -1)\n }\n return hostname\n}\n\nexport function normalizeHostnameBase(hostname: string): string {\n const normalized = stripIpv6Brackets(hostname.trim())\n if (!normalized || INVALID_HOST_CHARACTERS.test(normalized)) {\n throw new Error(`Invalid server host: ${JSON.stringify(hostname)}`)\n }\n return normalized\n}\n\nexport function isWildcardHostname(hostname: string): boolean {\n return NORMALIZED_WILDCARD_HOSTS.has(stripIpv6Brackets(hostname.trim()))\n}\n","import { isIP } from \"node:net\"\n\nimport { isWildcardHostname, normalizeHostnameBase } from \"./server-host-shared\"\n\nexport const DEFAULT_SERVER_HOST = \"127.0.0.1\"\n\n// Listen failures that mean the hostname itself cannot be bound, as opposed\n// to the port being occupied (EADDRINUSE) or forbidden (EACCES). ENOTFOUND\n// covers unresolvable names such as typos, EADDRNOTAVAIL covers valid IPs\n// that are not assigned to this machine.\nconst INVALID_BIND_ERROR_CODES = new Set([\n \"ENOTFOUND\",\n \"EADDRNOTAVAIL\",\n \"EINVAL\",\n \"EAFNOSUPPORT\",\n \"ENXIO\",\n])\n\nexport function isInvalidBindErrorCode(code?: string): boolean {\n return !!code && INVALID_BIND_ERROR_CODES.has(code)\n}\n\nexport interface ServerBinding {\n hostname: string\n clientHostname: string\n networkExposed: boolean\n}\n\nfunction isLoopbackIpv4(hostname: string): boolean {\n return isIP(hostname) === 4 && hostname.split(\".\", 1)[0] === \"127\"\n}\n\nfunction isLoopbackMappedIpv4(hostname: string): boolean {\n try {\n const canonicalHostname = new URL(`http://[${hostname}]/`).hostname.slice(\n 1,\n -1,\n )\n const mappedIpv4 = canonicalHostname.match(\n /^::ffff:([\\da-f]{1,4}):[\\da-f]{1,4}$/,\n )\n if (!mappedIpv4) {\n return false\n }\n\n return (Number.parseInt(mappedIpv4[1], 16) & 0xff00) === 0x7f00\n } catch {\n return false\n }\n}\n\nexport function normalizeServerHostname(hostname: string): string {\n return normalizeHostnameBase(hostname)\n}\n\nexport function isLoopbackHostname(hostname: string): boolean {\n const normalized = normalizeServerHostname(hostname).toLowerCase()\n if (normalized === \"localhost\" || normalized === \"localhost.\") {\n return true\n }\n if (isLoopbackIpv4(normalized)) {\n return true\n }\n if (isIP(normalized) !== 6) {\n return false\n }\n\n if (normalized === \"::1\" || normalized === \"0:0:0:0:0:0:0:1\") {\n return true\n }\n\n return isLoopbackMappedIpv4(normalized)\n}\n\nexport function resolveServerBinding(\n hostname: string,\n hasApiKeys: boolean,\n): ServerBinding {\n const normalizedHostname = normalizeServerHostname(hostname)\n const networkExposed = !isLoopbackHostname(normalizedHostname)\n\n if (networkExposed && !hasApiKeys) {\n throw new Error(\n `Refusing to listen on non-loopback host ${JSON.stringify(normalizedHostname)} without gateway API keys. Run \\`npx @jeffreycao/copilot-api@latest auth keys --add <key>\\` first, or use \\`--host ${DEFAULT_SERVER_HOST}\\`.`,\n )\n }\n\n return {\n hostname: normalizedHostname,\n clientHostname: resolveClientHostname(normalizedHostname),\n networkExposed,\n }\n}\n\nexport function resolveClientHostname(hostname: string): string {\n const normalizedHostname = normalizeServerHostname(hostname)\n // Wildcard binds listen on every interface, which clients cannot dial\n // directly (0.0.0.0 is not a routable destination).\n return isWildcardHostname(normalizedHostname) ? DEFAULT_SERVER_HOST : (\n normalizedHostname.toLowerCase()\n )\n}\n\nexport function resolveClientHostnameOrDefault(\n hostname: string | null | undefined,\n): string {\n const normalizedHostname = hostname?.trim()\n return normalizedHostname ?\n resolveClientHostname(normalizedHostname)\n : DEFAULT_SERVER_HOST\n}\n\nexport function formatServerUrl(hostname: string, port: number): string {\n const urlHostname =\n isIP(hostname) === 6 ? `[${hostname.replace(\"%\", \"%25\")}]` : hostname\n return `http://${urlHostname}:${port}`\n}\n","import consola from \"consola\"\nimport { resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\n\nimport { EventBus } from \"./event-bus\"\nimport type {\n GatewayPluginApi,\n GatewayPluginEvents,\n GatewayPluginSetup,\n} from \"./types/gateway-plugins\"\nexport type {\n GatewayPluginApi,\n GatewayPluginEvents,\n GatewayPluginSetup,\n PluginRequest,\n} from \"./types/gateway-plugins\"\n\nconst MAX_PENDING_EVENTS = 1024\n\ninterface PluginState {\n name: string\n pending: number\n overflowReported: boolean\n tail: Promise<void>\n unsubscribe: Array<() => void>\n cleanup?: () => void | Promise<void>\n}\n\n// Each plugin has a bounded, ordered queue. Requests never await plugin I/O.\nexport class GatewayPlugins {\n private readonly bus = new EventBus<GatewayPluginEvents>()\n private readonly plugins: Array<PluginState> = []\n private subscriptions = 0\n private closing: Promise<void> | undefined\n\n private readonly port: number\n\n constructor(port: number) {\n this.port = port\n }\n\n get enabled(): boolean {\n return this.subscriptions > 0\n }\n\n async register(name: string, setup: GatewayPluginSetup): Promise<void> {\n if (this.closing) throw new Error(\"Gateway plugins are closing\")\n const plugin: PluginState = {\n name,\n pending: 0,\n overflowReported: false,\n tail: Promise.resolve(),\n unsubscribe: [],\n }\n const api: GatewayPluginApi = Object.freeze({\n version: 1 as const,\n server: Object.freeze({ pid: process.pid, port: this.port }),\n on: <Name extends keyof GatewayPluginEvents>(\n event: Name,\n handler: (\n value: Readonly<GatewayPluginEvents[Name]>,\n ) => void | Promise<void>,\n ) => {\n if (this.closing) throw new Error(\"Gateway plugins are closing\")\n const off = this.bus.subscribe(event, (value) => {\n if (plugin.pending >= MAX_PENDING_EVENTS) {\n if (!plugin.overflowReported) {\n plugin.overflowReported = true\n consola.warn(\n `Plugin '${name}' event queue is full; dropping events`,\n )\n }\n return\n }\n plugin.pending++\n plugin.tail = plugin.tail.then(async () => {\n try {\n await handler(value)\n } catch (error) {\n consola.warn(`Plugin '${name}' hook failed`, error)\n } finally {\n plugin.pending--\n if (!plugin.pending) plugin.overflowReported = false\n }\n })\n })\n this.subscriptions++\n let active = true\n const unsubscribe = () => {\n if (!active) return\n active = false\n off()\n this.subscriptions--\n }\n plugin.unsubscribe.push(unsubscribe)\n return unsubscribe\n },\n log: (message: string) => consola.info(`[plugin:${name}] ${message}`),\n })\n try {\n const cleanup = await setup(api)\n if (typeof cleanup === \"function\") plugin.cleanup = cleanup\n this.plugins.push(plugin)\n } catch (error) {\n for (const off of plugin.unsubscribe) off()\n throw error\n }\n }\n\n publish<Name extends keyof GatewayPluginEvents>(\n name: Name,\n event: GatewayPluginEvents[Name],\n ): void {\n if (this.enabled) {\n const snapshot = { ...event }\n Object.freeze(snapshot)\n this.bus.publish<Name>(name, snapshot)\n }\n }\n\n async flush(): Promise<void> {\n await Promise.all(this.plugins.map((plugin) => plugin.tail))\n }\n\n close(timeoutMs = 2000): Promise<void> {\n if (this.closing) return this.closing\n for (const plugin of this.plugins) {\n for (const off of plugin.unsubscribe) off()\n }\n let timer: ReturnType<typeof setTimeout>\n const shutdown = Promise.all(\n this.plugins.map(async (plugin) => {\n await plugin.tail\n try {\n await plugin.cleanup?.()\n } catch (error) {\n consola.warn(`Plugin '${plugin.name}' cleanup failed`, error)\n }\n }),\n )\n const timeout = new Promise<void>((resolveTimeout) => {\n timer = setTimeout(resolveTimeout, timeoutMs)\n })\n this.closing = Promise.race([shutdown, timeout]).then(() => {\n clearTimeout(timer)\n })\n return this.closing\n }\n}\n\nexport async function loadGatewayPlugins(\n setting: string | undefined,\n options: { port: number; baseDir: string },\n): Promise<GatewayPlugins | undefined> {\n if (!setting?.trim()) return undefined\n const paths: unknown = JSON.parse(setting)\n if (\n !Array.isArray(paths)\n || !paths.every((path: unknown) => typeof path === \"string\" && path.trim())\n ) {\n throw new Error(\n \"COPILOT_API_PLUGINS must be a JSON array of local module paths\",\n )\n }\n const plugins = new GatewayPlugins(options.port)\n for (const path of new Set(paths as Array<string>)) {\n const url = pathToFileURL(resolve(options.baseDir, path)).href\n try {\n const module: unknown = await import(url)\n if (\n !module\n || typeof module !== \"object\"\n || !(\"default\" in module)\n || typeof module.default !== \"function\"\n ) {\n throw new Error(\"Plugin must default-export a setup function\")\n }\n await plugins.register(path, module.default as GatewayPluginSetup)\n } catch (error) {\n consola.warn(`Failed to load gateway plugin '${path}'`, error)\n }\n }\n return plugins\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\nimport { serve, type ServerHandler } from \"srvx\"\n\nimport { runProviderSetup } from \"./auth\"\nimport { isGitHubCopilotEnabled } from \"./lib/github-copilot-provider\"\nimport { listEnabledProviders, mergeConfigWithDefaults } from \"./lib/config\"\nimport { setupCopilotRuntime } from \"~/lib/copilot-runtime\"\nimport {\n GITHUB_TOKEN_ENV,\n readGitHubToken,\n readGitHubTokenFromEnv,\n} from \"./lib/credential-store\"\nimport { startModelsDevCache } from \"./lib/models-dev-cache\"\nimport { initOpencodeVersion } from \"./lib/opencode\"\nimport { ensurePaths, PATHS } from \"./lib/paths\"\nimport { initProxyFromEnv } from \"./lib/proxy\"\nimport {\n getConfiguredApiKeys,\n getMissingApiKeysMessage,\n} from \"./lib/request-auth\"\nimport {\n DEFAULT_SERVER_HOST,\n formatServerUrl,\n resolveServerBinding,\n} from \"./lib/server-host\"\nimport { state } from \"./lib/state\"\nimport { loadGatewayPlugins } from \"./lib/gateway-plugins\"\nimport { registerProcessCleanup } from \"./lib/process-cleanup\"\n\ninterface RunServerOptions {\n host: string\n port: number\n verbose: boolean\n githubToken?: string\n showToken: boolean\n proxyEnv: boolean\n}\n\ntype GitHubTokenSource = \"cli\" | \"env\" | \"file\"\n\n// The environment is preferred over the token file so the token never has to\n// travel through the process list; --github-token stays first for callers that\n// opt in explicitly.\nasync function resolveGitHubToken(\n cliToken: string | undefined,\n): Promise<{ token: string; source: GitHubTokenSource } | null> {\n if (cliToken) return { token: cliToken, source: \"cli\" }\n\n const envToken = readGitHubTokenFromEnv()\n if (envToken) return { token: envToken, source: \"env\" }\n\n const fileToken = await readGitHubToken()\n if (fileToken) return { token: fileToken, source: \"file\" }\n\n return null\n}\n\nasync function setupCopilotMode(\n githubToken: string,\n source: GitHubTokenSource,\n): Promise<void> {\n state.githubTokenSource = source\n consola.info(\n source === \"cli\" ? \"Using provided GitHub token\"\n : source === \"env\" ?\n `Using GitHub token from the ${GITHUB_TOKEN_ENV} environment variable`\n : \"Using GitHub token from local file\",\n )\n\n await setupCopilotRuntime(githubToken)\n}\n\nasync function setupProviderMode(): Promise<void> {\n const enabledProviders = listEnabledProviders()\n\n if (enabledProviders.length > 0) {\n consola.info(`Using enabled providers: ${enabledProviders.join(\", \")}`)\n return\n }\n\n if (!isGitHubCopilotEnabled()) {\n throw new Error(\n \"No enabled providers found. Enable GitHub Copilot with `copilot-api provider enable github-copilot`, or enable another configured provider.\",\n )\n }\n\n consola.info(\"No enabled providers found. Setting one up...\")\n await runProviderSetup()\n\n if (state.githubToken && isGitHubCopilotEnabled()) {\n // The setup flow persisted the token with the credential store.\n await setupCopilotMode(state.githubToken, \"file\")\n return\n }\n\n const providersAfterSetup = listEnabledProviders()\n if (providersAfterSetup.length === 0) {\n throw new Error(\n \"Failed to configure any provider. Run `copilot-api auth login` to set one up.\",\n )\n }\n consola.info(`Configured providers: ${providersAfterSetup.join(\", \")}`)\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n consola.options.throttle = 0\n\n mergeConfigWithDefaults()\n\n const configuredApiKeys = getConfiguredApiKeys()\n const binding = resolveServerBinding(\n options.host,\n configuredApiKeys.length > 0,\n )\n\n const missingApiKeysMessage = getMissingApiKeysMessage()\n if (missingApiKeysMessage) {\n consola.info(missingApiKeysMessage)\n }\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.showToken = options.showToken\n\n await ensurePaths()\n await startModelsDevCache()\n\n const serverUrl = formatServerUrl(binding.clientHostname, options.port)\n\n const resolvedGitHubToken =\n isGitHubCopilotEnabled() ?\n await resolveGitHubToken(options.githubToken)\n : null\n if (resolvedGitHubToken && isGitHubCopilotEnabled()) {\n await setupCopilotMode(\n resolvedGitHubToken.token,\n resolvedGitHubToken.source,\n )\n } else {\n await setupProviderMode()\n }\n\n consola.box(\n `🌐 Dashboard Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`,\n )\n\n const { createServer } = await import(\"./server\")\n const plugins = await loadGatewayPlugins(process.env.COPILOT_API_PLUGINS, {\n port: options.port,\n baseDir: PATHS.APP_DIR,\n })\n if (plugins) registerProcessCleanup(() => plugins.close())\n const server = createServer({\n networkExposed: binding.networkExposed,\n port: options.port,\n plugins,\n })\n\n serve({\n fetch: server.fetch as ServerHandler,\n hostname: binding.hostname,\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 host: {\n type: \"string\",\n default: process.env.HOST?.trim() || DEFAULT_SERVER_HOST,\n description: \"Host to listen on\",\n },\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 \"github-token\": {\n alias: \"g\",\n type: \"string\",\n description:\n \"Provide GitHub token directly (must be generated using the `auth` subcommand)\",\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 return runServer({\n host: args.host,\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n githubToken: args[\"github-token\"],\n showToken: args[\"show-token\"],\n proxyEnv: args[\"proxy-env\"],\n })\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"start-BBEryu3z.js","names":["get"],"sources":["../src/lib/proxy.ts","../src/lib/server-host-shared.ts","../src/lib/server-host.ts","../src/lib/gateway-plugins.ts","../src/start.ts"],"sourcesContent":["import consola from \"consola\"\nimport { getProxyForUrl } from \"proxy-from-env\"\nimport { Agent, ProxyAgent, setGlobalDispatcher, type Dispatcher } from \"undici\"\n\nlet proxyEnvDispatcher: Dispatcher | undefined\n\nexport function getProxyEnvDispatcher(): Dispatcher | undefined {\n return proxyEnvDispatcher\n}\n\nexport function initProxyFromEnv(): void {\n try {\n const direct = new Agent()\n const proxies = new Map<string, ProxyAgent>()\n\n // We only need a minimal dispatcher that implements `dispatch` at runtime.\n // Typing the object as `Dispatcher` forces TypeScript to require many\n // additional methods. Instead, keep a plain object and cast when passing\n // to `setGlobalDispatcher`.\n const dispatcher = {\n dispatch(\n options: Dispatcher.DispatchOptions,\n handler: Dispatcher.DispatchHandler,\n ) {\n try {\n const origin =\n typeof options.origin === \"string\" ?\n new URL(options.origin)\n : (options.origin as URL)\n const get = getProxyForUrl as unknown as (\n u: string,\n ) => string | undefined\n const raw = get(origin.toString())\n const proxyUrl = raw && raw.length > 0 ? raw : undefined\n if (!proxyUrl) {\n consola.debug(`HTTP proxy bypass: ${origin.hostname}`)\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n let agent = proxies.get(proxyUrl)\n if (!agent) {\n agent = new ProxyAgent(proxyUrl)\n proxies.set(proxyUrl, agent)\n }\n let label = proxyUrl\n try {\n const u = new URL(proxyUrl)\n label = `${u.protocol}//${u.host}`\n } catch {\n /* noop */\n }\n consola.debug(`HTTP proxy route: ${origin.hostname} via ${label}`)\n return (agent as unknown as Dispatcher).dispatch(options, handler)\n } catch {\n return (direct as unknown as Dispatcher).dispatch(options, handler)\n }\n },\n close() {\n return direct.close()\n },\n destroy() {\n return direct.destroy()\n },\n }\n\n proxyEnvDispatcher = dispatcher as unknown as Dispatcher\n\n if (typeof Bun !== \"undefined\") {\n consola.debug(\"WebSocket proxy configured from environment (per-URL)\")\n return\n }\n\n setGlobalDispatcher(proxyEnvDispatcher)\n consola.debug(\"HTTP proxy configured from environment (per-URL)\")\n } catch (err) {\n consola.debug(\"Proxy setup skipped:\", err)\n }\n}\n","// Pure hostname helpers shared by the gateway server (Node) and the desktop\n// app (including the renderer bundle). This module must stay free of\n// `node:*` imports because the renderer cannot use `node:net`; all\n// address-family checks live in `server-host.ts`.\nexport const INVALID_HOST_CHARACTERS = /[\\s/?#]/\n\n// Bind hosts that listen on every interface, in normalized form (no\n// brackets, so \"[::]\" is covered via `stripIpv6Brackets`).\nexport const NORMALIZED_WILDCARD_HOSTS = new Set([\"0.0.0.0\", \"::\"])\n\nexport function stripIpv6Brackets(hostname: string): string {\n if (hostname.startsWith(\"[\") && hostname.endsWith(\"]\")) {\n return hostname.slice(1, -1)\n }\n return hostname\n}\n\nexport function normalizeHostnameBase(hostname: string): string {\n const normalized = stripIpv6Brackets(hostname.trim())\n if (!normalized || INVALID_HOST_CHARACTERS.test(normalized)) {\n throw new Error(`Invalid server host: ${JSON.stringify(hostname)}`)\n }\n return normalized\n}\n\nexport function isWildcardHostname(hostname: string): boolean {\n return NORMALIZED_WILDCARD_HOSTS.has(stripIpv6Brackets(hostname.trim()))\n}\n","import { isIP } from \"node:net\"\n\nimport { isWildcardHostname, normalizeHostnameBase } from \"./server-host-shared\"\n\nexport const DEFAULT_SERVER_HOST = \"127.0.0.1\"\n\n// Listen failures that mean the hostname itself cannot be bound, as opposed\n// to the port being occupied (EADDRINUSE) or forbidden (EACCES). ENOTFOUND\n// covers unresolvable names such as typos, EADDRNOTAVAIL covers valid IPs\n// that are not assigned to this machine.\nconst INVALID_BIND_ERROR_CODES = new Set([\n \"ENOTFOUND\",\n \"EADDRNOTAVAIL\",\n \"EINVAL\",\n \"EAFNOSUPPORT\",\n \"ENXIO\",\n])\n\nexport function isInvalidBindErrorCode(code?: string): boolean {\n return !!code && INVALID_BIND_ERROR_CODES.has(code)\n}\n\nexport interface ServerBinding {\n hostname: string\n clientHostname: string\n networkExposed: boolean\n}\n\nfunction isLoopbackIpv4(hostname: string): boolean {\n return isIP(hostname) === 4 && hostname.split(\".\", 1)[0] === \"127\"\n}\n\nfunction isLoopbackMappedIpv4(hostname: string): boolean {\n try {\n const canonicalHostname = new URL(`http://[${hostname}]/`).hostname.slice(\n 1,\n -1,\n )\n const mappedIpv4 = canonicalHostname.match(\n /^::ffff:([\\da-f]{1,4}):[\\da-f]{1,4}$/,\n )\n if (!mappedIpv4) {\n return false\n }\n\n return (Number.parseInt(mappedIpv4[1], 16) & 0xff00) === 0x7f00\n } catch {\n return false\n }\n}\n\nexport function normalizeServerHostname(hostname: string): string {\n return normalizeHostnameBase(hostname)\n}\n\nexport function isLoopbackHostname(hostname: string): boolean {\n const normalized = normalizeServerHostname(hostname).toLowerCase()\n if (normalized === \"localhost\" || normalized === \"localhost.\") {\n return true\n }\n if (isLoopbackIpv4(normalized)) {\n return true\n }\n if (isIP(normalized) !== 6) {\n return false\n }\n\n if (normalized === \"::1\" || normalized === \"0:0:0:0:0:0:0:1\") {\n return true\n }\n\n return isLoopbackMappedIpv4(normalized)\n}\n\nexport function resolveServerBinding(\n hostname: string,\n hasApiKeys: boolean,\n): ServerBinding {\n const normalizedHostname = normalizeServerHostname(hostname)\n const networkExposed = !isLoopbackHostname(normalizedHostname)\n\n if (networkExposed && !hasApiKeys) {\n throw new Error(\n `Refusing to listen on non-loopback host ${JSON.stringify(normalizedHostname)} without gateway API keys. Run \\`npx @jeffreycao/copilot-api@latest auth keys --add <key>\\` first, or use \\`--host ${DEFAULT_SERVER_HOST}\\`.`,\n )\n }\n\n return {\n hostname: normalizedHostname,\n clientHostname: resolveClientHostname(normalizedHostname),\n networkExposed,\n }\n}\n\nexport function resolveClientHostname(hostname: string): string {\n const normalizedHostname = normalizeServerHostname(hostname)\n // Wildcard binds listen on every interface, which clients cannot dial\n // directly (0.0.0.0 is not a routable destination).\n return isWildcardHostname(normalizedHostname) ? DEFAULT_SERVER_HOST : (\n normalizedHostname.toLowerCase()\n )\n}\n\nexport function resolveClientHostnameOrDefault(\n hostname: string | null | undefined,\n): string {\n const normalizedHostname = hostname?.trim()\n return normalizedHostname ?\n resolveClientHostname(normalizedHostname)\n : DEFAULT_SERVER_HOST\n}\n\nexport function formatServerUrl(hostname: string, port: number): string {\n const urlHostname =\n isIP(hostname) === 6 ? `[${hostname.replace(\"%\", \"%25\")}]` : hostname\n return `http://${urlHostname}:${port}`\n}\n","import consola from \"consola\"\nimport { resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\n\nimport { EventBus } from \"./event-bus\"\nimport type {\n GatewayPluginApi,\n GatewayPluginEvents,\n GatewayPluginSetup,\n} from \"./types/gateway-plugins\"\nexport type {\n GatewayPluginApi,\n GatewayPluginEvents,\n GatewayPluginSetup,\n PluginRequest,\n} from \"./types/gateway-plugins\"\n\nconst MAX_PENDING_EVENTS = 1024\n\ninterface PluginState {\n name: string\n pending: number\n overflowReported: boolean\n tail: Promise<void>\n unsubscribe: Array<() => void>\n cleanup?: () => void | Promise<void>\n}\n\n// Each plugin has a bounded, ordered queue. Requests never await plugin I/O.\nexport class GatewayPlugins {\n private readonly bus = new EventBus<GatewayPluginEvents>()\n private readonly plugins: Array<PluginState> = []\n private subscriptions = 0\n private closing: Promise<void> | undefined\n\n private readonly port: number\n\n constructor(port: number) {\n this.port = port\n }\n\n get enabled(): boolean {\n return this.subscriptions > 0\n }\n\n async register(name: string, setup: GatewayPluginSetup): Promise<void> {\n if (this.closing) throw new Error(\"Gateway plugins are closing\")\n const plugin: PluginState = {\n name,\n pending: 0,\n overflowReported: false,\n tail: Promise.resolve(),\n unsubscribe: [],\n }\n const api: GatewayPluginApi = Object.freeze({\n version: 1 as const,\n server: Object.freeze({ pid: process.pid, port: this.port }),\n on: <Name extends keyof GatewayPluginEvents>(\n event: Name,\n handler: (\n value: Readonly<GatewayPluginEvents[Name]>,\n ) => void | Promise<void>,\n ) => {\n if (this.closing) throw new Error(\"Gateway plugins are closing\")\n const off = this.bus.subscribe(event, (value) => {\n if (plugin.pending >= MAX_PENDING_EVENTS) {\n if (!plugin.overflowReported) {\n plugin.overflowReported = true\n consola.warn(\n `Plugin '${name}' event queue is full; dropping events`,\n )\n }\n return\n }\n plugin.pending++\n plugin.tail = plugin.tail.then(async () => {\n try {\n await handler(value)\n } catch (error) {\n consola.warn(`Plugin '${name}' hook failed`, error)\n } finally {\n plugin.pending--\n if (!plugin.pending) plugin.overflowReported = false\n }\n })\n })\n this.subscriptions++\n let active = true\n const unsubscribe = () => {\n if (!active) return\n active = false\n off()\n this.subscriptions--\n }\n plugin.unsubscribe.push(unsubscribe)\n return unsubscribe\n },\n log: (message: string) => consola.info(`[plugin:${name}] ${message}`),\n })\n try {\n const cleanup = await setup(api)\n if (typeof cleanup === \"function\") plugin.cleanup = cleanup\n this.plugins.push(plugin)\n } catch (error) {\n for (const off of plugin.unsubscribe) off()\n throw error\n }\n }\n\n publish<Name extends keyof GatewayPluginEvents>(\n name: Name,\n event: GatewayPluginEvents[Name],\n ): void {\n if (this.enabled) {\n const snapshot = { ...event }\n Object.freeze(snapshot)\n this.bus.publish<Name>(name, snapshot)\n }\n }\n\n async flush(): Promise<void> {\n await Promise.all(this.plugins.map((plugin) => plugin.tail))\n }\n\n close(timeoutMs = 2000): Promise<void> {\n if (this.closing) return this.closing\n for (const plugin of this.plugins) {\n for (const off of plugin.unsubscribe) off()\n }\n let timer: ReturnType<typeof setTimeout>\n const shutdown = Promise.all(\n this.plugins.map(async (plugin) => {\n await plugin.tail\n try {\n await plugin.cleanup?.()\n } catch (error) {\n consola.warn(`Plugin '${plugin.name}' cleanup failed`, error)\n }\n }),\n )\n const timeout = new Promise<void>((resolveTimeout) => {\n timer = setTimeout(resolveTimeout, timeoutMs)\n })\n this.closing = Promise.race([shutdown, timeout]).then(() => {\n clearTimeout(timer)\n })\n return this.closing\n }\n}\n\nexport async function loadGatewayPlugins(\n setting: string | undefined,\n options: { port: number; baseDir: string },\n): Promise<GatewayPlugins | undefined> {\n if (!setting?.trim()) return undefined\n const paths: unknown = JSON.parse(setting)\n if (\n !Array.isArray(paths)\n || !paths.every((path: unknown) => typeof path === \"string\" && path.trim())\n ) {\n throw new Error(\n \"COPILOT_API_PLUGINS must be a JSON array of local module paths\",\n )\n }\n const plugins = new GatewayPlugins(options.port)\n for (const path of new Set(paths as Array<string>)) {\n const url = pathToFileURL(resolve(options.baseDir, path)).href\n try {\n const module: unknown = await import(url)\n if (\n !module\n || typeof module !== \"object\"\n || !(\"default\" in module)\n || typeof module.default !== \"function\"\n ) {\n throw new Error(\"Plugin must default-export a setup function\")\n }\n await plugins.register(path, module.default as GatewayPluginSetup)\n } catch (error) {\n consola.warn(`Failed to load gateway plugin '${path}'`, error)\n }\n }\n return plugins\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\nimport { serve, type ServerHandler } from \"srvx\"\n\nimport { runProviderSetup } from \"./auth\"\nimport { isGitHubCopilotEnabled } from \"./lib/github-copilot-provider\"\nimport { listEnabledProviders, mergeConfigWithDefaults } from \"./lib/config\"\nimport { setupCopilotRuntime } from \"~/lib/copilot-runtime\"\nimport {\n GITHUB_TOKEN_ENV,\n readGitHubToken,\n readGitHubTokenFromEnv,\n} from \"./lib/credential-store\"\nimport { startModelsDevCache } from \"./lib/models-dev-cache\"\nimport { initOpencodeVersion } from \"./lib/opencode\"\nimport { ensurePaths, PATHS } from \"./lib/paths\"\nimport { initProxyFromEnv } from \"./lib/proxy\"\nimport {\n getConfiguredApiKeys,\n getMissingApiKeysMessage,\n} from \"./lib/request-auth\"\nimport {\n DEFAULT_SERVER_HOST,\n formatServerUrl,\n resolveServerBinding,\n} from \"./lib/server-host\"\nimport { state } from \"./lib/state\"\nimport { loadGatewayPlugins } from \"./lib/gateway-plugins\"\nimport { registerProcessCleanup } from \"./lib/process-cleanup\"\n\ninterface RunServerOptions {\n host: string\n port: number\n verbose: boolean\n githubToken?: string\n showToken: boolean\n proxyEnv: boolean\n}\n\ntype GitHubTokenSource = \"cli\" | \"env\" | \"file\"\n\n// The environment is preferred over the token file so the token never has to\n// travel through the process list; --github-token stays first for callers that\n// opt in explicitly.\nasync function resolveGitHubToken(\n cliToken: string | undefined,\n): Promise<{ token: string; source: GitHubTokenSource } | null> {\n if (cliToken) return { token: cliToken, source: \"cli\" }\n\n const envToken = readGitHubTokenFromEnv()\n if (envToken) return { token: envToken, source: \"env\" }\n\n const fileToken = await readGitHubToken()\n if (fileToken) return { token: fileToken, source: \"file\" }\n\n return null\n}\n\nasync function setupCopilotMode(\n githubToken: string,\n source: GitHubTokenSource,\n): Promise<void> {\n state.githubTokenSource = source\n consola.info(\n source === \"cli\" ? \"Using provided GitHub token\"\n : source === \"env\" ?\n `Using GitHub token from the ${GITHUB_TOKEN_ENV} environment variable`\n : \"Using GitHub token from local file\",\n )\n\n await setupCopilotRuntime(githubToken)\n}\n\nasync function setupProviderMode(): Promise<void> {\n const enabledProviders = listEnabledProviders()\n\n if (enabledProviders.length > 0) {\n consola.info(`Using enabled providers: ${enabledProviders.join(\", \")}`)\n return\n }\n\n if (!isGitHubCopilotEnabled()) {\n throw new Error(\n \"No enabled providers found. Enable GitHub Copilot with `copilot-api provider enable github-copilot`, or enable another configured provider.\",\n )\n }\n\n consola.info(\"No enabled providers found. Setting one up...\")\n await runProviderSetup()\n\n if (state.githubToken && isGitHubCopilotEnabled()) {\n // The setup flow persisted the token with the credential store.\n await setupCopilotMode(state.githubToken, \"file\")\n return\n }\n\n const providersAfterSetup = listEnabledProviders()\n if (providersAfterSetup.length === 0) {\n throw new Error(\n \"Failed to configure any provider. Run `copilot-api auth login` to set one up.\",\n )\n }\n consola.info(`Configured providers: ${providersAfterSetup.join(\", \")}`)\n}\n\nexport async function runServer(options: RunServerOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n consola.options.throttle = 0\n\n mergeConfigWithDefaults()\n\n const configuredApiKeys = getConfiguredApiKeys()\n const binding = resolveServerBinding(\n options.host,\n configuredApiKeys.length > 0,\n )\n\n const missingApiKeysMessage = getMissingApiKeysMessage()\n if (missingApiKeysMessage) {\n consola.info(missingApiKeysMessage)\n }\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.showToken = options.showToken\n\n await ensurePaths()\n await startModelsDevCache()\n\n const serverUrl = formatServerUrl(binding.clientHostname, options.port)\n\n const resolvedGitHubToken =\n isGitHubCopilotEnabled() ?\n await resolveGitHubToken(options.githubToken)\n : null\n if (resolvedGitHubToken && isGitHubCopilotEnabled()) {\n await setupCopilotMode(\n resolvedGitHubToken.token,\n resolvedGitHubToken.source,\n )\n } else {\n await setupProviderMode()\n }\n\n consola.box(\n `🌐 Dashboard Viewer: ${serverUrl}/usage-viewer?endpoint=${serverUrl}/usage`,\n )\n\n const { createServer } = await import(\"./server\")\n const plugins = await loadGatewayPlugins(process.env.COPILOT_API_PLUGINS, {\n port: options.port,\n baseDir: PATHS.APP_DIR,\n })\n if (plugins) registerProcessCleanup(() => plugins.close())\n const server = createServer({\n networkExposed: binding.networkExposed,\n port: options.port,\n plugins,\n })\n\n serve({\n fetch: server.fetch as ServerHandler,\n hostname: binding.hostname,\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 host: {\n type: \"string\",\n default: process.env.HOST?.trim() || DEFAULT_SERVER_HOST,\n description: \"Host to listen on\",\n },\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 \"github-token\": {\n alias: \"g\",\n type: \"string\",\n description:\n \"Provide GitHub token directly (must be generated using the `auth` subcommand)\",\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 return runServer({\n host: args.host,\n port: Number.parseInt(args.port, 10),\n verbose: args.verbose,\n githubToken: args[\"github-token\"],\n showToken: args[\"show-token\"],\n proxyEnv: args[\"proxy-env\"],\n })\n },\n})\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { A as UpstreamStreamInactivityTimeoutError, D as state, M as writeFileAtomically, O as HTTPError, S as PATHS, T as assertGitHubCopilotEnabled, c as getConfig, d as getUpstreamTransportConfig, g as isResponsesApiWebSocketEnabled, k as UpstreamHeadersTimeoutError, v as readEditableConfigFromDisk } from "./config-store-BsluQttR.js";
2
- import { c as setProviderConfig, n as getRawProviderConfig } from "./config-BqSuE5h5.js";
1
+ import { A as UpstreamStreamInactivityTimeoutError, D as state, M as writeFileAtomically, O as HTTPError, S as PATHS, T as assertGitHubCopilotEnabled, c as getConfig, d as getUpstreamTransportConfig, g as isResponsesApiWebSocketEnabled, k as UpstreamHeadersTimeoutError, v as readEditableConfigFromDisk } from "./config-store-BLr5xjym.js";
2
+ import { c as setProviderConfig, n as getRawProviderConfig } from "./config-BvACNGIp.js";
3
3
  import consola from "consola";
4
4
  import { createHash, randomBytes, randomUUID } from "node:crypto";
5
5
  import path from "node:path";
@@ -2748,4 +2748,4 @@ async function logUser(dependencies = defaultCopilotTokenDependencies) {
2748
2748
  }
2749
2749
  export { buildCodexRequestHeaders as $, initOpencodeVersion as A, getXaiAccessToken as B, copilotHeaders as C, prepareForCompact as D, isOpencodeOauthApp as E, compactTextOnlyGuard as F, selectXaiAccount as G, persistXaiCredentials as H, createAuthMiddleware as I, readGitHubTokenFromEnv as J, GITHUB_TOKEN_ENV as K, getConfiguredAdminApiKeys as L, compactMessageSections as M, compactSummaryPromptStart as N, prepareInteractionHeaders as O, compactSystemPromptStarts as P, CODEX_API_BASE_URL as Q, getConfiguredApiKeys as R, copilotBaseUrl as S, copilotWebSocketHeaders as T, readXaiCredentials as U, getXaiAccounts as V, removeXaiAccount as W, loginXai as X, XAI_API_BASE_URL as Y, loginCodex as Z, isAsyncIterable as _, removeCodexAccount as a, fetchUpstreamWithLifecycle as at, parseUserIdMetadata as b, setupCopilotToken as c, encodePoolKeyPart as ct, generateRequestIdFromPayload as d, createWebSocketUrl as dt, forwardCodexResponses as et, getPromptCacheKey as f, FULL_MODEL_CATALOG_HEADER as ft, getUUID as g, getSessionAffinityFromHeaders as h, persistCodexCredentials as i, setPluginRequestActualModel as it, compactAutoContinuePromptStarts as j, prepareMessageProxyHeaders as k, setupGitHubToken as l, getResponsesStreamTerminalDisposition as lt, getRootSessionIdFromHeaders as m, invalidateCodexRuntime as n, requestContext as nt, selectCodexAccount as o, createResponsesHttpEventStream as ot, getRootSessionId as p, stripInternalRequestHeaders as pt, readGitHubToken as q, logUser as r, resolveTraceId as rt, setupCodexToken as s, createResponsesSafeStream as st, getCodexAccounts as t, generateTraceId as tt, stopCopilotRefreshLoop as u, createPooledWebSocketStream as ut, isNullish as v, copilotModelsHeaders as w, getCopilotUsage as x, isResponsesStream as y, getMissingApiKeysMessage as z };
2750
2750
 
2751
- //# sourceMappingURL=token-CZmr-geT.js.map
2751
+ //# sourceMappingURL=token-D3nRiw9B.js.map