@jeffreycao/copilot-api 1.10.9 → 1.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -213
- package/README.zh-CN.md +47 -209
- package/dist/auth-BO_SkMVw.js +116 -0
- package/dist/auth-BO_SkMVw.js.map +1 -0
- package/dist/{check-usage-BdXGp1Wr.js → check-usage-D-W6VD7k.js} +3 -4
- package/dist/{check-usage-BdXGp1Wr.js.map → check-usage-D-W6VD7k.js.map} +1 -1
- package/dist/{proxy-DvlF9a-7.js → config-ztdkLu9o.js} +83 -70
- package/dist/config-ztdkLu9o.js.map +1 -0
- package/dist/{debug-C_TBkyUw.js → debug-BVHmoCzY.js} +17 -7
- package/dist/debug-BVHmoCzY.js.map +1 -0
- package/dist/main.js +5 -5
- package/dist/{mcp-CTb-DbQH.js → mcp-DZgcvqQY.js} +2 -2
- package/dist/{mcp-CTb-DbQH.js.map → mcp-DZgcvqQY.js.map} +1 -1
- package/dist/{server-FPXzFkg9.js → server-2tRe3sDu.js} +1798 -1713
- package/dist/server-2tRe3sDu.js.map +1 -0
- package/dist/{start-CbKg_0bY.js → start-CM-b3DRX.js} +4 -6
- package/dist/{start-CbKg_0bY.js.map → start-CM-b3DRX.js.map} +1 -1
- package/dist/token-BVXHiYEl.js +1875 -0
- package/dist/token-BVXHiYEl.js.map +1 -0
- package/dist/{tool-search-D3SN0jX-.js → tool-search-wA-fLduL.js} +1 -1
- package/dist/{tool-search-D3SN0jX-.js.map → tool-search-wA-fLduL.js.map} +1 -1
- package/package.json +2 -2
- package/dist/auth-BHa2OHXf.js +0 -45
- package/dist/auth-BHa2OHXf.js.map +0 -1
- package/dist/debug-C_TBkyUw.js.map +0 -1
- package/dist/paths-DC-mqCY3.js +0 -30
- package/dist/paths-DC-mqCY3.js.map +0 -1
- package/dist/proxy-DvlF9a-7.js.map +0 -1
- package/dist/server-FPXzFkg9.js.map +0 -1
- package/dist/token-Dj8XsAxn.js +0 -170
- package/dist/token-Dj8XsAxn.js.map +0 -1
- package/dist/utils-jHLgqAq2.js +0 -657
- package/dist/utils-jHLgqAq2.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-BVXHiYEl.js","names":["get","isConfiguredResponsesApiWebSocketEnabled","COPILOT_WEBSOCKET_VERSION","getCopilotModels","delay"],"sources":["../src/lib/codex-rate-limit.ts","../src/lib/state.ts","../src/lib/proxy.ts","../src/services/responses-websocket.ts","../src/lib/request-context.ts","../src/services/codex/create-responses.ts","../src/lib/oauth/codex.ts","../src/lib/compact.ts","../src/lib/opencode.ts","../src/lib/api-config.ts","../src/lib/credential-store.ts","../src/lib/error.ts","../src/services/github/get-copilot-token.ts","../src/services/github/get-copilot-usage.ts","../src/services/github/get-device-code.ts","../src/services/github/get-user.ts","../src/services/copilot/get-models.ts","../src/services/get-vscode-version.ts","../src/lib/deviceid.ts","../src/lib/utils.ts","../src/services/github/poll-access-token.ts","../src/lib/token.ts"],"sourcesContent":["import consola from \"consola\"\n\nconst codexRateLimitScopes = [\"primary\", \"secondary\"] as const\n\ninterface CodexRateLimitWindow {\n reset_after_seconds: number\n reset_at: number\n used_percent: number\n window_minutes: number\n}\n\nexport const formatCodexRateLimitResetAt = (resetAt: number): string => {\n const date = new Date(resetAt * 1000)\n return Number.isNaN(date.getTime()) ? String(resetAt) : date.toLocaleString()\n}\n\nexport const logCodexRateLimitsEvent = (event: unknown): void => {\n if (!event || typeof event !== \"object\") {\n return\n }\n\n const eventRecord = event as Record<string, unknown>\n if (eventRecord.type !== \"codex.rate_limits\") {\n return\n }\n\n const rateLimits = eventRecord.rate_limits\n if (!rateLimits || typeof rateLimits !== \"object\") {\n return\n }\n\n const planType =\n typeof eventRecord.plan_type === \"string\" ? eventRecord.plan_type : null\n const rateLimitRecord = rateLimits as Record<string, unknown>\n const allowed =\n typeof rateLimitRecord.allowed === \"boolean\" ?\n rateLimitRecord.allowed\n : null\n const limitReached =\n typeof rateLimitRecord.limit_reached === \"boolean\" ?\n rateLimitRecord.limit_reached\n : null\n\n for (const scope of codexRateLimitScopes) {\n const window = rateLimitRecord[scope]\n if (!isCodexRateLimitWindow(window)) {\n continue\n }\n\n const summary: Array<string> = []\n if (allowed !== null) {\n summary.push(`allowed=${allowed}`)\n }\n if (limitReached !== null) {\n summary.push(`limit_reached=${limitReached}`)\n }\n summary.push(\n `used=${window.used_percent}%`,\n `reset_at=${formatCodexRateLimitResetAt(window.reset_at)}`,\n )\n\n const label =\n planType ?\n `Codex ${scope} rate limit (${planType})`\n : `Codex ${scope} rate limit`\n consola.log(`${label}: ${summary.join(\", \")}`)\n }\n}\n\nconst isCodexRateLimitWindow = (\n value: unknown,\n): value is CodexRateLimitWindow => {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const record = value as Record<string, unknown>\n return (\n typeof record.reset_after_seconds === \"number\"\n && typeof record.reset_at === \"number\"\n && typeof record.used_percent === \"number\"\n && typeof record.window_minutes === \"number\"\n )\n}\n","import { randomUUID } from \"node:crypto\"\n\nimport type { ModelsResponse } from \"~/services/copilot/get-models\"\n\nexport interface State {\n githubToken?: string\n userName?: string\n copilotToken?: string\n codexAccessToken?: string\n codexRefreshToken?: string\n codexExpiresAt?: number\n codexAccountId?: string\n\n accountType: string\n models?: ModelsResponse\n vsCodeVersion?: string\n\n macMachineId?: string\n vsCodeSessionId?: string\n vsCodeDeviceId: string\n\n manualApprove: boolean\n rateLimitWait: boolean\n showToken: boolean\n\n // Rate limiting configuration\n rateLimitSeconds?: number\n lastRequestTimestamp?: number\n verbose: boolean\n\n copilotApiUrl?: string\n}\n\nexport const state: State = {\n accountType: \"individual\",\n manualApprove: false,\n rateLimitWait: false,\n showToken: false,\n verbose: false,\n vsCodeDeviceId: randomUUID(),\n}\n","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","import { WebSocket } from \"undici\"\n\nimport { getProxyEnvDispatcher } from \"~/lib/proxy\"\n\nexport interface PooledWebSocketRequest<TPayload> {\n headers: Record<string, string>\n payload: TPayload\n poolKey: string\n url: string\n}\n\nexport interface PooledWebSocketStreamOptions<TChunk> {\n createChunk: (data: string) => TChunk\n idleTimeoutMs?: number\n isTerminalChunk: (chunk: TChunk) => boolean\n openErrorMessage: string\n streamErrorMessage: string\n terminalChunkMissingMessage: string\n unavailableErrorMessage?: string\n}\n\ntype WebSocketErrorEvent = Parameters<\n NonNullable<InstanceType<typeof WebSocket>[\"onerror\"]>\n>[0]\n\nconst DEFAULT_WEBSOCKET_IDLE_TIMEOUT_MS = 60_000\n\nconst websocketPool = new Map<string, PooledWebSocketEntry>()\nconst websocketActiveRequests = new Map<string, number>()\n\ninterface PooledWebSocketEntry {\n closed: boolean\n idleTimer: ReturnType<typeof setTimeout> | null\n requestCount: number\n websocketPromise: Promise<InstanceType<typeof WebSocket>>\n}\n\ninterface PooledWebSocketRequestTarget {\n entry: PooledWebSocketEntry\n pooled: boolean\n}\n\nexport const createWebSocketUrl = (url: string): string => {\n const websocketUrl = new URL(url)\n\n if (websocketUrl.protocol === \"https:\") {\n websocketUrl.protocol = \"wss:\"\n } else if (websocketUrl.protocol === \"http:\") {\n websocketUrl.protocol = \"ws:\"\n }\n\n return websocketUrl.toString()\n}\n\nexport const createPooledWebSocketStream = <TPayload, TChunk>(\n request: PooledWebSocketRequest<TPayload>,\n options: PooledWebSocketStreamOptions<TChunk>,\n): AsyncIterable<TChunk> => runPooledWebSocketRequest(request, options)\n\nconst runPooledWebSocketRequest = async function* <TPayload, TChunk>(\n request: PooledWebSocketRequest<TPayload>,\n options: PooledWebSocketStreamOptions<TChunk>,\n): AsyncIterable<TChunk> {\n const { entry, pooled } = getPooledWebSocketRequestTarget(request, options)\n const release = acquirePooledWebSocketEntry(\n request.poolKey,\n entry,\n pooled,\n options,\n )\n\n try {\n const websocket = await getReadyPooledWebSocket(\n request.poolKey,\n entry,\n pooled,\n options,\n )\n websocket.send(JSON.stringify(request.payload))\n\n for await (const data of createWebSocketMessageStream(websocket, options)) {\n const chunk = options.createChunk(data)\n yield chunk\n\n if (options.isTerminalChunk(chunk)) {\n return\n }\n }\n\n removePooledWebSocketEntry(request.poolKey, entry)\n throw new Error(options.terminalChunkMissingMessage)\n } catch (error) {\n removePooledWebSocketEntry(request.poolKey, entry)\n throw toError(error)\n } finally {\n release()\n }\n}\n\nconst getPooledWebSocketRequestTarget = <TPayload, TChunk>(\n request: PooledWebSocketRequest<TPayload>,\n options: PooledWebSocketStreamOptions<TChunk>,\n): PooledWebSocketRequestTarget => {\n if (getPooledWebSocketActiveRequestCount(request.poolKey) > 0) {\n return {\n entry: createPooledWebSocketEntry(request, options),\n pooled: false,\n }\n }\n\n const existing = websocketPool.get(request.poolKey)\n if (existing && !existing.closed) {\n clearPooledWebSocketIdleTimer(existing)\n return {\n entry: existing,\n pooled: true,\n }\n }\n\n const entry = createPooledWebSocketEntry(request, options)\n websocketPool.set(request.poolKey, entry)\n return {\n entry,\n pooled: true,\n }\n}\n\nconst createPooledWebSocketEntry = <TPayload, TChunk>(\n request: PooledWebSocketRequest<TPayload>,\n options: PooledWebSocketStreamOptions<TChunk>,\n): PooledWebSocketEntry => {\n const entry: PooledWebSocketEntry = {\n closed: false,\n idleTimer: null,\n requestCount: 0,\n websocketPromise: openWebSocket({\n headers: request.headers,\n openErrorMessage: options.openErrorMessage,\n url: request.url,\n }),\n }\n\n entry.websocketPromise\n .then((websocket) => {\n websocket.addEventListener(\"close\", () => {\n removePooledWebSocketEntry(request.poolKey, entry)\n })\n websocket.addEventListener(\"error\", () => {\n removePooledWebSocketEntry(request.poolKey, entry)\n })\n })\n .catch(() => {\n removePooledWebSocketEntry(request.poolKey, entry)\n })\n\n return entry\n}\n\nconst acquirePooledWebSocketEntry = <TChunk>(\n poolKey: string,\n entry: PooledWebSocketEntry,\n pooled: boolean,\n options: PooledWebSocketStreamOptions<TChunk>,\n): (() => void) => {\n clearPooledWebSocketIdleTimer(entry)\n incrementPooledWebSocketActiveRequestCount(poolKey)\n entry.requestCount += 1\n\n let released = false\n return () => {\n if (released) {\n return\n }\n\n released = true\n entry.requestCount -= 1\n\n decrementPooledWebSocketActiveRequestCount(poolKey)\n if (entry.closed || entry.requestCount > 0) {\n return\n }\n\n if (pooled && websocketPool.get(poolKey) === entry) {\n schedulePooledWebSocketIdleClose(poolKey, entry, options)\n return\n }\n\n removePooledWebSocketEntry(poolKey, entry)\n }\n}\n\nconst getReadyPooledWebSocket = async (\n poolKey: string,\n entry: PooledWebSocketEntry,\n pooled: boolean,\n options?: { unavailableErrorMessage?: string },\n): Promise<InstanceType<typeof WebSocket>> => {\n const unavailableErrorMessage =\n options?.unavailableErrorMessage\n ?? \"Websocket connection became unavailable before the request started\"\n\n if (entry.closed) {\n throw new Error(unavailableErrorMessage)\n }\n\n const websocket = await entry.websocketPromise\n if (entry.closed || (pooled && websocketPool.get(poolKey) !== entry)) {\n throw new Error(unavailableErrorMessage)\n }\n\n if (websocket.readyState !== WebSocket.OPEN) {\n removePooledWebSocketEntry(poolKey, entry)\n throw new Error(unavailableErrorMessage)\n }\n\n return websocket\n}\n\nconst schedulePooledWebSocketIdleClose = <TChunk>(\n poolKey: string,\n entry: PooledWebSocketEntry,\n options: PooledWebSocketStreamOptions<TChunk>,\n): void => {\n clearPooledWebSocketIdleTimer(entry)\n entry.idleTimer = setTimeout(() => {\n removePooledWebSocketEntry(poolKey, entry)\n }, options.idleTimeoutMs ?? DEFAULT_WEBSOCKET_IDLE_TIMEOUT_MS)\n unrefTimer(entry.idleTimer)\n}\n\nconst clearPooledWebSocketIdleTimer = (entry: PooledWebSocketEntry): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer)\n entry.idleTimer = null\n }\n}\n\nconst getPooledWebSocketActiveRequestCount = (poolKey: string): number =>\n websocketActiveRequests.get(poolKey) ?? 0\n\nconst incrementPooledWebSocketActiveRequestCount = (poolKey: string): void => {\n websocketActiveRequests.set(\n poolKey,\n getPooledWebSocketActiveRequestCount(poolKey) + 1,\n )\n}\n\nconst decrementPooledWebSocketActiveRequestCount = (poolKey: string): void => {\n const nextCount = getPooledWebSocketActiveRequestCount(poolKey) - 1\n if (nextCount <= 0) {\n websocketActiveRequests.delete(poolKey)\n return\n }\n\n websocketActiveRequests.set(poolKey, nextCount)\n}\n\nconst removePooledWebSocketEntry = (\n poolKey: string,\n entry: PooledWebSocketEntry,\n): void => {\n if (websocketPool.get(poolKey) === entry) {\n websocketPool.delete(poolKey)\n }\n\n if (entry.closed) {\n return\n }\n\n entry.closed = true\n clearPooledWebSocketIdleTimer(entry)\n entry.websocketPromise.then(closeWebSocket).catch(() => {})\n}\n\nconst unrefTimer = (timer: ReturnType<typeof setTimeout>): void => {\n if (\n typeof timer === \"object\"\n && \"unref\" in timer\n && typeof timer.unref === \"function\"\n ) {\n timer.unref()\n }\n}\n\nconst createWebSocketError = (\n message: string,\n event?: Pick<WebSocketErrorEvent, \"error\" | \"message\">,\n): Error => {\n const reason = event?.error ?? event?.message\n if (reason === undefined || reason === \"\") {\n return new Error(message)\n }\n\n const cause = toError(reason)\n return new Error(`${message}: ${cause.message}`, { cause })\n}\n\nconst openWebSocket = async ({\n headers,\n openErrorMessage,\n url,\n}: {\n headers: Record<string, string>\n openErrorMessage: string\n url: string\n}): Promise<InstanceType<typeof WebSocket>> =>\n await new Promise((resolve, reject) => {\n const dispatcher = getProxyEnvDispatcher()\n const init = dispatcher ? { dispatcher, headers } : { headers }\n const websocket = new WebSocket(url, init)\n\n const cleanup = () => {\n websocket.removeEventListener(\"open\", onOpen)\n websocket.removeEventListener(\"error\", onError)\n }\n\n const onOpen = () => {\n cleanup()\n resolve(websocket)\n }\n\n const onError = (event: WebSocketErrorEvent) => {\n cleanup()\n reject(createWebSocketError(openErrorMessage, event))\n }\n\n websocket.addEventListener(\"open\", onOpen)\n websocket.addEventListener(\"error\", onError)\n })\n\nconst createWebSocketMessageStream = async function* <TChunk>(\n websocket: InstanceType<typeof WebSocket>,\n options: PooledWebSocketStreamOptions<TChunk>,\n): AsyncIterable<string> {\n const queue: Array<Promise<string>> = []\n let closed = false\n let error: Error | null = null\n let notify: (() => void) | null = null\n\n const wake = () => {\n notify?.()\n notify = null\n }\n\n const onMessage = (event: { data: unknown }) => {\n queue.push(normalizeWebSocketMessageData(event.data))\n wake()\n }\n\n const onClose = () => {\n closed = true\n wake()\n }\n\n const onError = (event: WebSocketErrorEvent) => {\n error = createWebSocketError(options.streamErrorMessage, event)\n wake()\n }\n\n websocket.addEventListener(\"message\", onMessage)\n websocket.addEventListener(\"close\", onClose)\n websocket.addEventListener(\"error\", onError)\n\n try {\n while (true) {\n const item = queue.shift()\n if (item) {\n yield await item\n continue\n }\n\n if (error) {\n throw toError(error)\n }\n\n if (closed) {\n break\n }\n\n await new Promise<void>((resolve) => {\n notify = resolve\n })\n }\n } finally {\n websocket.removeEventListener(\"message\", onMessage)\n websocket.removeEventListener(\"close\", onClose)\n websocket.removeEventListener(\"error\", onError)\n }\n}\n\nconst normalizeWebSocketMessageData = async (\n data: unknown,\n): Promise<string> => {\n if (typeof data === \"string\") {\n return data\n }\n\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(data)\n }\n\n if (ArrayBuffer.isView(data)) {\n const view = data\n return new TextDecoder().decode(\n new Uint8Array(\n view.buffer as ArrayBuffer,\n view.byteOffset,\n view.byteLength,\n ),\n )\n }\n\n if (isTextReadable(data)) {\n return await data.text()\n }\n\n return String(data)\n}\n\nconst isTextReadable = (\n value: unknown,\n): value is { text: () => Promise<string> } => {\n if (!value || typeof value !== \"object\" || !(\"text\" in value)) {\n return false\n }\n\n return typeof (value as { text?: unknown }).text === \"function\"\n}\n\nconst toError = (value: unknown): Error => {\n if (value instanceof Error) {\n return value\n }\n\n return new Error(String(value))\n}\n\nconst closeWebSocket = (websocket: InstanceType<typeof WebSocket>): void => {\n if (\n websocket.readyState === WebSocket.CONNECTING\n || websocket.readyState === WebSocket.OPEN\n ) {\n websocket.close()\n }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\"\n\nexport interface RequestContext {\n traceId: string\n startTime: number\n userAgent: string\n sessionAffinity: string | undefined\n parentSessionId: string | undefined\n}\n\nconst TRACE_ID_MAX_LENGTH = 64\nconst TRACE_ID_PATTERN = /^\\w[\\w.-]*$/\n\nconst asyncLocalStorage = new AsyncLocalStorage<RequestContext>()\n\nexport const requestContext = {\n getStore: () => asyncLocalStorage.getStore(),\n run: <T>(context: RequestContext, callback: () => T) =>\n asyncLocalStorage.run(context, callback),\n}\n\nexport function generateTraceId(): string {\n const timestamp = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `${timestamp}-${random}`\n}\n\nexport function resolveTraceId(traceId: string | null | undefined): string {\n const candidate = traceId?.trim()\n\n if (\n !candidate\n || candidate.length > TRACE_ID_MAX_LENGTH\n || !TRACE_ID_PATTERN.test(candidate)\n ) {\n return generateTraceId()\n }\n\n return candidate\n}\n","import { createHash } from \"node:crypto\"\n\nimport type {\n ResponsesPayload,\n ResponsesResult,\n ResponseErrorEvent,\n ResponseStreamEvent,\n ResponsesTransport,\n} from \"~/services/copilot/create-responses\"\n\nimport { logCodexRateLimitsEvent } from \"~/lib/codex-rate-limit\"\nimport { isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled } from \"~/lib/config\"\nimport { state } from \"~/lib/state\"\nimport {\n createPooledWebSocketStream,\n createWebSocketUrl,\n type PooledWebSocketRequest,\n} from \"~/services/responses-websocket\"\nimport { requestContext } from \"~/lib/request-context\"\n\nexport const CODEX_API_BASE_URL = \"https://chatgpt.com/backend-api\"\n\ntype CodexResponsesWebSocketPayload = ResponsesPayload & {\n type: \"response.create\"\n}\n\ntype ServerSentEventChunk = {\n data?: string\n event?: string\n id?: number | string\n}\n\ntype CodexResponsesWebSocketChunk = ServerSentEventChunk\n\ntype CodexResponsesWebSocketRequest =\n PooledWebSocketRequest<CodexResponsesWebSocketPayload>\n\ninterface CodexResponsesHeaderOptions {\n stream?: boolean | null\n}\n\nconst STRIPPED_CODEX_REQUEST_HEADERS = new Set([\n \"authorization\",\n \"connection\",\n \"content-length\",\n \"host\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n \"x-api-key\",\n])\n\nconst STRIPPED_CODEX_WEBSOCKET_HEADERS = new Set([\"accept\", \"content-type\"])\n\nconst CODEX_RESPONSE_STATUSES = new Set([\n \"completed\",\n \"incomplete\",\n \"failed\",\n \"cancelled\",\n \"queued\",\n \"in_progress\",\n])\n\ntype CodexResponseStatus =\n | \"completed\"\n | \"incomplete\"\n | \"failed\"\n | \"cancelled\"\n | \"queued\"\n | \"in_progress\"\n\nconst requireCodexAuthContext = (): {\n accessToken: string\n accountId: string\n} => {\n const accessToken = state.codexAccessToken\n const accountId = state.codexAccountId\n\n if (!accessToken) {\n throw new Error(\"Codex access token is not loaded\")\n }\n\n if (!accountId) {\n throw new Error(\"Codex account id is not loaded\")\n }\n\n return { accessToken, accountId }\n}\n\nexport function resolveCodexResponsesUrl(\n baseUrl: string = CODEX_API_BASE_URL,\n): string {\n const normalized = baseUrl.trim().replace(/\\/+$/, \"\")\n if (!normalized) {\n return `${CODEX_API_BASE_URL}/codex/responses`\n }\n\n if (normalized.endsWith(\"/codex/responses\")) {\n return normalized\n }\n\n if (normalized.endsWith(\"/codex\")) {\n return `${normalized}/responses`\n }\n\n return `${normalized}/codex/responses`\n}\n\nexport function buildCodexResponsesHeaders(\n requestHeaders: Headers,\n options: CodexResponsesHeaderOptions = {},\n): Headers {\n const { accessToken, accountId } = requireCodexAuthContext()\n const headers = new Headers()\n for (const [headerName, headerValue] of requestHeaders) {\n const headerNameLower = headerName.toLowerCase()\n if (STRIPPED_CODEX_REQUEST_HEADERS.has(headerNameLower)) {\n continue\n }\n headers.set(headerName, headerValue)\n }\n\n if (!headers.has(\"accept\")) {\n headers.set(\n \"accept\",\n options.stream ? \"text/event-stream\" : \"application/json\",\n )\n }\n\n headers.set(\"authorization\", `Bearer ${accessToken}`)\n headers.set(\"chatgpt-account-id\", accountId)\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n if (!headers.has(\"OpenAI-Beta\")) {\n headers.set(\"OpenAI-Beta\", \"responses=experimental\")\n }\n if (!headers.has(\"originator\")) {\n headers.set(\"originator\", \"copilot-api\")\n }\n if (!headers.has(\"user-agent\")) {\n headers.set(\"user-agent\", \"copilot-api\")\n }\n if (headers.get(\"user-agent\")?.startsWith(\"opencode\")) {\n headers.set(\"originator\", \"opencode\")\n const sessionId = requestContext.getStore()?.sessionAffinity\n if (sessionId) {\n headers.set(\"session_id\", sessionId)\n }\n }\n return headers\n}\n\nexport function resolveCodexResponsesTransport(\n transport?: ResponsesTransport,\n): ResponsesTransport {\n return (\n transport\n ?? (isConfiguredResponsesApiWebSocketEnabled() ? \"websocket\" : \"http\")\n )\n}\n\nexport function buildCodexResponsesWebSocketHeaders(\n requestHeaders: Headers,\n): Record<string, string> {\n const headers = buildCodexResponsesHeaders(requestHeaders)\n for (const headerName of STRIPPED_CODEX_WEBSOCKET_HEADERS) {\n headers.delete(headerName)\n }\n return Object.fromEntries(headers)\n}\n\nexport function buildCodexResponsesWebSocketPayload(\n payload: ResponsesPayload,\n): CodexResponsesWebSocketPayload {\n const websocketPayload: CodexResponsesWebSocketPayload = {\n ...payload,\n type: \"response.create\",\n }\n\n delete websocketPayload.stream\n\n return websocketPayload\n}\n\nexport function buildCodexResponsesWebSocketUrl(\n baseUrl: string = CODEX_API_BASE_URL,\n): string {\n return createWebSocketUrl(resolveCodexResponsesUrl(baseUrl))\n}\n\nexport function prepareCodexResponsesWebSocketRequest(\n payload: ResponsesPayload,\n requestHeaders: Headers,\n baseUrl: string = CODEX_API_BASE_URL,\n): CodexResponsesWebSocketRequest {\n const headers = buildCodexResponsesWebSocketHeaders(requestHeaders)\n\n return {\n headers,\n payload: buildCodexResponsesWebSocketPayload(payload),\n poolKey: buildCodexResponsesWebSocketPoolKey(payload, headers, baseUrl),\n url: buildCodexResponsesWebSocketUrl(baseUrl),\n }\n}\n\nexport async function forwardCodexResponses(\n payload: ResponsesPayload,\n requestHeaders: Headers,\n baseUrl: string = CODEX_API_BASE_URL,\n options: {\n transport?: ResponsesTransport\n } = {},\n): Promise<Response> {\n const normalizedPayload: ResponsesPayload = {\n ...payload,\n store: false,\n temperature: undefined,\n top_p: undefined,\n max_output_tokens: undefined,\n metadata: undefined,\n }\n\n if (\n normalizedPayload.stream\n && resolveCodexResponsesTransport(options.transport) === \"websocket\"\n ) {\n return await forwardCodexResponsesOverWebSocket(\n normalizedPayload,\n requestHeaders,\n baseUrl,\n )\n }\n\n return await fetch(resolveCodexResponsesUrl(baseUrl), {\n method: \"POST\",\n headers: buildCodexResponsesHeaders(requestHeaders, {\n stream: normalizedPayload.stream,\n }),\n body: JSON.stringify(normalizedPayload),\n })\n}\n\nconst buildCodexResponsesWebSocketPoolKey = (\n payload: ResponsesPayload,\n headers: Record<string, string>,\n baseUrl: string,\n): string => {\n const authFingerprint = createHash(\"sha256\")\n .update(\n `${state.codexAccessToken ?? \"missing-token\"}:${state.codexAccountId ?? \"missing-account\"}`,\n )\n .digest(\"hex\")\n .slice(0, 16)\n const headerFingerprint = createHash(\"sha256\")\n .update(\n JSON.stringify(\n Object.entries(headers).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n ),\n )\n .digest(\"hex\")\n .slice(0, 16)\n\n return [\n \"codex\",\n resolveCodexResponsesUrl(baseUrl),\n payload.model,\n authFingerprint,\n headerFingerprint,\n ]\n .map(encodePoolKeyPart)\n .join(\"|\")\n}\n\nconst forwardCodexResponsesOverWebSocket = async (\n payload: ResponsesPayload,\n requestHeaders: Headers,\n baseUrl: string,\n): Promise<Response> => {\n const websocketRequest = prepareCodexResponsesWebSocketRequest(\n payload,\n requestHeaders,\n baseUrl,\n )\n const stream = createCodexResponsesWebSocketStream(websocketRequest)\n\n if (payload.stream) {\n return createCodexResponsesWebSocketProxyResponse(stream)\n }\n\n const response = await consumeCodexResponsesWebSocketStream(stream)\n return new Response(JSON.stringify(response), {\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n status: 200,\n })\n}\n\nconst createCodexResponsesWebSocketStream = (\n request: CodexResponsesWebSocketRequest,\n): AsyncIterable<CodexResponsesWebSocketChunk> =>\n createPooledWebSocketStream(request, {\n createChunk: createCodexResponsesWebSocketStreamChunk,\n isTerminalChunk: isTerminalCodexResponsesWebSocketChunk,\n openErrorMessage: \"Failed to create codex responses websocket\",\n streamErrorMessage: \"Codex responses websocket stream error\",\n terminalChunkMissingMessage:\n \"Codex responses websocket ended without a terminal response\",\n })\n\nconst createCodexResponsesWebSocketStreamChunk = (\n data: string,\n): CodexResponsesWebSocketChunk => {\n if (data === \"[DONE]\") {\n return { data }\n }\n\n try {\n const parsed = JSON.parse(data) as {\n id?: unknown\n type?: unknown\n }\n\n return {\n data: JSON.stringify(parsed),\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n\nconst isTerminalCodexResponsesWebSocketChunk = (\n chunk: CodexResponsesWebSocketChunk,\n): boolean => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return false\n }\n\n try {\n const parsed = JSON.parse(chunk.data) as { type?: unknown }\n return (\n parsed.type === \"response.completed\"\n || parsed.type === \"response.done\"\n || parsed.type === \"response.failed\"\n || parsed.type === \"response.incomplete\"\n || parsed.type === \"error\"\n )\n } catch {\n return false\n }\n}\n\nconst consumeCodexResponsesWebSocketStream = async (\n stream: AsyncIterable<CodexResponsesWebSocketChunk>,\n): Promise<ResponsesResult> => {\n for await (const chunk of stream) {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n continue\n }\n\n const event = JSON.parse(chunk.data) as {\n message?: unknown\n response?: ResponsesResult\n type?: unknown\n }\n if (event.type === \"error\") {\n throw new Error(\n typeof event.message === \"string\" ?\n event.message\n : \"Codex responses websocket returned an error event\",\n )\n }\n\n if (\n (event.type === \"response.completed\" || event.type === \"response.done\")\n && event.response\n ) {\n return event.response\n }\n\n if (\n (event.type === \"response.failed\" || event.type === \"response.incomplete\")\n && event.response\n ) {\n return event.response\n }\n }\n\n throw new Error(\"Codex responses websocket ended without a terminal response\")\n}\n\nconst createCodexResponsesWebSocketProxyResponse = (\n stream: AsyncIterable<CodexResponsesWebSocketChunk>,\n): Response => {\n return new Response(\n createServerSentEventStream(normalizeCodexResponsesWebSocketStream(stream)),\n {\n headers: {\n \"cache-control\": \"no-cache\",\n \"content-type\": \"text/event-stream; charset=utf-8\",\n },\n status: 200,\n },\n )\n}\n\nexport const createStandardizedCodexResponsesEventStream = (\n source: AsyncIterable<ServerSentEventChunk>,\n): ReadableStream<Uint8Array> => {\n return createServerSentEventStream(\n normalizeCodexResponsesStandardStream(source),\n )\n}\n\nconst normalizeCodexResponsesWebSocketStream = async function* (\n stream: AsyncIterable<CodexResponsesWebSocketChunk>,\n): AsyncIterable<CodexResponsesWebSocketChunk> {\n for await (const chunk of stream) {\n yield normalizeCodexResponsesProxyChunk(chunk)\n }\n}\n\nconst normalizeCodexResponsesStandardStream = async function* (\n stream: AsyncIterable<ServerSentEventChunk>,\n): AsyncIterable<ServerSentEventChunk> {\n for await (const chunk of stream) {\n yield normalizeCodexResponsesStandardChunk(chunk)\n }\n}\n\nconst normalizeCodexResponsesProxyChunk = (\n chunk: CodexResponsesWebSocketChunk,\n): CodexResponsesWebSocketChunk => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return chunk\n }\n\n try {\n const parsed = JSON.parse(chunk.data) as { type?: unknown }\n if (parsed.type !== \"response.completed\") {\n return chunk\n }\n\n return {\n ...chunk,\n data: JSON.stringify({\n ...parsed,\n type: \"response.done\",\n }),\n event: \"response.done\",\n }\n } catch {\n return chunk\n }\n}\n\nconst normalizeCodexResponsesStandardChunk = (\n chunk: ServerSentEventChunk,\n): ServerSentEventChunk => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return chunk\n }\n\n try {\n const parsed = JSON.parse(chunk.data) as Record<string, unknown>\n logCodexRateLimitsEvent(parsed)\n const normalized = normalizeCodexResponsesEvent(parsed)\n if (!normalized) {\n return chunk\n }\n\n return {\n ...chunk,\n data: JSON.stringify(normalized),\n event: normalized.type,\n }\n } catch {\n return chunk\n }\n}\n\nconst createServerSentEventStream = (\n source: AsyncIterable<ServerSentEventChunk>,\n): ReadableStream<Uint8Array> => {\n const encoder = new TextEncoder()\n const iterator = source[Symbol.asyncIterator]()\n\n return new ReadableStream<Uint8Array>({\n async cancel() {\n await iterator.return?.()\n },\n async pull(controller) {\n try {\n const result: IteratorResult<ServerSentEventChunk> =\n await iterator.next()\n if (result.done) {\n controller.close()\n return\n }\n\n controller.enqueue(\n encoder.encode(serializeServerSentEvent(result.value)),\n )\n } catch (error) {\n controller.enqueue(\n encoder.encode(\n serializeServerSentEvent(\n createResponsesErrorServerSentEventChunk(getErrorMessage(error)),\n ),\n ),\n )\n controller.close()\n }\n },\n })\n}\n\nconst createResponsesErrorServerSentEventChunk = (\n message: string,\n): ServerSentEventChunk => {\n const errorEvent: ResponseErrorEvent = {\n code: null,\n message,\n param: null,\n sequence_number: 0,\n type: \"error\",\n }\n\n return {\n data: JSON.stringify(errorEvent),\n event: errorEvent.type,\n }\n}\n\nconst serializeServerSentEvent = (chunk: ServerSentEventChunk): string => {\n const lines: Array<string> = []\n\n if (chunk.id) {\n lines.push(`id: ${chunk.id}`)\n }\n\n if (chunk.event) {\n lines.push(`event: ${chunk.event}`)\n }\n\n if (chunk.data !== undefined) {\n for (const line of String(chunk.data).split(/\\r?\\n/u)) {\n lines.push(`data: ${line}`)\n }\n }\n\n return `${lines.join(\"\\n\")}\\n\\n`\n}\n\nconst getErrorMessage = (error: unknown): string => {\n if (error instanceof Error && error.message) {\n return error.message\n }\n\n return String(error)\n}\n\nconst encodePoolKeyPart = (value: string): string => encodeURIComponent(value)\n\nfunction normalizeCodexResponseStatus(\n status: unknown,\n): CodexResponseStatus | undefined {\n return typeof status === \"string\" && CODEX_RESPONSE_STATUSES.has(status) ?\n (status as CodexResponseStatus)\n : undefined\n}\n\nfunction normalizeCodexResponseRecord(\n eventRecord: Record<string, unknown>,\n): Record<string, unknown> {\n const response = eventRecord.response\n if (!response || typeof response !== \"object\") {\n return eventRecord\n }\n\n const normalizedStatus = normalizeCodexResponseStatus(\n (response as { status?: unknown }).status,\n )\n if (!normalizedStatus) {\n return eventRecord\n }\n\n return {\n ...eventRecord,\n response: {\n ...response,\n status: normalizedStatus,\n },\n }\n}\n\nexport function normalizeCodexResponsesEvent(\n event: unknown,\n): ResponseStreamEvent | null {\n if (!event || typeof event !== \"object\") {\n return null\n }\n\n const eventRecord = normalizeCodexResponseRecord(\n event as Record<string, unknown>,\n )\n const type = eventRecord.type\n if (typeof type !== \"string\") {\n return null\n }\n\n if (type === \"response.done\") {\n return {\n ...eventRecord,\n type: \"response.completed\",\n } as ResponseStreamEvent\n }\n\n return eventRecord as unknown as ResponseStreamEvent\n}\n","import { randomBytes } from \"node:crypto\"\nimport { createServer } from \"node:http\"\n\nexport { CODEX_API_BASE_URL } from \"~/services/codex/create-responses\"\n\nconst CALLBACK_HOST = \"127.0.0.1\"\nconst CALLBACK_PORT = 1455\nconst CALLBACK_PATH = \"/auth/callback\"\nconst CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\"\nconst AUTHORIZE_URL = \"https://auth.openai.com/oauth/authorize\"\nconst TOKEN_URL = \"https://auth.openai.com/oauth/token\"\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`\nconst SCOPE = \"openid profile email offline_access\"\nconst JWT_CLAIM_PATH = \"https://api.openai.com/auth\"\nconst REFRESH_BUFFER_MS = 60_000\n\ninterface TokenSuccessResult {\n accessToken: string\n refreshToken: string\n expiresAt: number\n}\n\ninterface OAuthPageOptions {\n title: string\n heading: string\n message: string\n}\n\nexport interface CodexCredentials {\n accessToken: string\n refreshToken: string\n expiresAt: number\n accountId: string\n}\n\nexport interface CodexAuthInfo {\n url: string\n instructions?: string\n}\n\nexport interface LoginCodexOptions {\n onAuth: (info: CodexAuthInfo) => void\n onPrompt: (message: string) => Promise<string>\n onProgress?: (message: string) => void\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64url\")\n}\n\nasync function generatePkce(): Promise<{\n verifier: string\n challenge: string\n}> {\n const verifierBytes = new Uint8Array(32)\n crypto.getRandomValues(verifierBytes)\n const verifier = base64UrlEncode(verifierBytes)\n const hashBuffer = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(verifier),\n )\n\n return {\n verifier,\n challenge: base64UrlEncode(new Uint8Array(hashBuffer)),\n }\n}\n\nfunction createState(): string {\n return randomBytes(16).toString(\"hex\")\n}\n\nfunction parseAuthorizationInput(input: string): {\n code?: string\n state?: string\n} {\n const value = input.trim()\n if (!value) {\n return {}\n }\n\n try {\n const url = new URL(value)\n return {\n code: url.searchParams.get(\"code\") ?? undefined,\n state: url.searchParams.get(\"state\") ?? undefined,\n }\n } catch {\n // Continue and parse it as plain text.\n }\n\n if (value.includes(\"#\")) {\n const [code, state] = value.split(\"#\", 2)\n return { code, state }\n }\n\n if (value.includes(\"code=\")) {\n const params = new URLSearchParams(value)\n return {\n code: params.get(\"code\") ?? undefined,\n state: params.get(\"state\") ?? undefined,\n }\n }\n\n return { code: value }\n}\n\nfunction decodeJwt(accessToken: string): Record<string, unknown> | null {\n try {\n const payload = accessToken.split(\".\")[1]\n if (!payload) {\n return null\n }\n return JSON.parse(\n Buffer.from(payload, \"base64url\").toString(\"utf8\"),\n ) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nfunction getAccountId(accessToken: string): string | null {\n const payload = decodeJwt(accessToken)\n if (!payload) {\n return null\n }\n\n const authPayload = payload[JWT_CLAIM_PATH]\n if (!authPayload || typeof authPayload !== \"object\") {\n return null\n }\n\n const accountId = (authPayload as { chatgpt_account_id?: unknown })\n .chatgpt_account_id\n return typeof accountId === \"string\" && accountId ? accountId : null\n}\n\nfunction renderOAuthPage(options: OAuthPageOptions): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(options.title)}</title>\n <style>\n body {\n margin: 0;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #09090b;\n color: #fafafa;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n text-align: center;\n }\n main {\n max-width: 560px;\n }\n h1 {\n margin: 0 0 12px;\n font-size: 28px;\n line-height: 1.15;\n }\n p {\n margin: 0;\n color: #a1a1aa;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <main>\n <h1>${escapeHtml(options.heading)}</h1>\n <p>${escapeHtml(options.message)}</p>\n </main>\n</body>\n</html>`\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\")\n}\n\nfunction renderOAuthSuccessPage(message: string): string {\n return renderOAuthPage({\n title: \"Authentication successful\",\n heading: \"Authentication successful\",\n message,\n })\n}\n\nfunction renderOAuthErrorPage(message: string): string {\n return renderOAuthPage({\n title: \"Authentication failed\",\n heading: \"Authentication failed\",\n message,\n })\n}\n\nasync function exchangeAuthorizationCode(\n code: string,\n verifier: string,\n): Promise<TokenSuccessResult> {\n const response = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: CLIENT_ID,\n code,\n code_verifier: verifier,\n redirect_uri: REDIRECT_URI,\n }),\n })\n\n if (!response.ok) {\n const details = await response.text().catch(() => \"\")\n throw new Error(\n `Codex token exchange failed (${response.status}): ${details || response.statusText}`,\n )\n }\n\n const payload = (await response.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof payload.access_token !== \"string\"\n || typeof payload.refresh_token !== \"string\"\n || typeof payload.expires_in !== \"number\"\n ) {\n throw new TypeError(\n `Codex token exchange response missing fields: ${JSON.stringify(payload)}`,\n )\n }\n\n return {\n accessToken: payload.access_token,\n refreshToken: payload.refresh_token,\n expiresAt: Date.now() + payload.expires_in * 1000,\n }\n}\n\nasync function refreshAccessToken(\n refreshToken: string,\n): Promise<TokenSuccessResult> {\n const response = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n }),\n })\n\n if (!response.ok) {\n const details = await response.text().catch(() => \"\")\n throw new Error(\n `Codex token refresh failed (${response.status}): ${details || response.statusText}`,\n )\n }\n\n const payload = (await response.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof payload.access_token !== \"string\"\n || typeof payload.refresh_token !== \"string\"\n || typeof payload.expires_in !== \"number\"\n ) {\n throw new TypeError(\n `Codex token refresh response missing fields: ${JSON.stringify(payload)}`,\n )\n }\n\n return {\n accessToken: payload.access_token,\n refreshToken: payload.refresh_token,\n expiresAt: Date.now() + payload.expires_in * 1000,\n }\n}\n\nasync function createAuthorizationFlow(): Promise<{\n verifier: string\n state: string\n url: string\n}> {\n const { verifier, challenge } = await generatePkce()\n const state = createState()\n const url = new URL(AUTHORIZE_URL)\n url.searchParams.set(\"response_type\", \"code\")\n url.searchParams.set(\"client_id\", CLIENT_ID)\n url.searchParams.set(\"redirect_uri\", REDIRECT_URI)\n url.searchParams.set(\"scope\", SCOPE)\n url.searchParams.set(\"code_challenge\", challenge)\n url.searchParams.set(\"code_challenge_method\", \"S256\")\n url.searchParams.set(\"state\", state)\n url.searchParams.set(\"id_token_add_organizations\", \"true\")\n url.searchParams.set(\"codex_cli_simplified_flow\", \"true\")\n url.searchParams.set(\"originator\", \"copilot-api\")\n\n return { verifier, state, url: url.toString() }\n}\n\nasync function waitForAuthorizationCode(state: string): Promise<string | null> {\n let resolveCode: ((code: string | null) => void) | undefined\n const waitForCode = new Promise<string | null>((resolve) => {\n resolveCode = resolve\n })\n\n const server = createServer((request, response) => {\n try {\n const url = new URL(request.url || \"\", \"http://localhost\")\n if (url.pathname !== CALLBACK_PATH) {\n response.statusCode = 404\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(renderOAuthErrorPage(\"Callback route not found.\"))\n return\n }\n\n if (url.searchParams.get(\"state\") !== state) {\n response.statusCode = 400\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(renderOAuthErrorPage(\"State mismatch.\"))\n return\n }\n\n const code = url.searchParams.get(\"code\")\n if (!code) {\n response.statusCode = 400\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(renderOAuthErrorPage(\"Missing authorization code.\"))\n return\n }\n\n response.statusCode = 200\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(\n renderOAuthSuccessPage(\n \"OpenAI Codex authentication completed. You can close this window.\",\n ),\n )\n resolveCode?.(code)\n } catch {\n response.statusCode = 500\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(\n renderOAuthErrorPage(\"Internal error while processing OAuth callback.\"),\n )\n }\n })\n\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(CALLBACK_PORT, CALLBACK_HOST, () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n } catch {\n return null\n }\n\n try {\n return await waitForCode\n } finally {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error)\n return\n }\n resolve()\n })\n }).catch(() => undefined)\n }\n}\n\nexport async function loginCodex(\n options: LoginCodexOptions,\n): Promise<CodexCredentials> {\n const { verifier, state, url } = await createAuthorizationFlow()\n options.onAuth({\n url,\n instructions:\n \"Please complete the login in the browser. If the browser does not automatically redirect, please paste the callback URL or code back to the terminal.\",\n })\n options.onProgress?.(\"Waiting for Codex OAuth callback\")\n\n let code = await waitForAuthorizationCode(state)\n if (!code) {\n const input = await options.onPrompt(\n \"Paste the authorization code or full redirect URL:\",\n )\n const parsed = parseAuthorizationInput(input)\n if (parsed.state && parsed.state !== state) {\n throw new Error(\"Codex OAuth state mismatch\")\n }\n code = parsed.code ?? null\n }\n\n if (!code) {\n throw new Error(\"Missing Codex authorization code\")\n }\n\n const tokenResult = await exchangeAuthorizationCode(code, verifier)\n const accountId = getAccountId(tokenResult.accessToken)\n if (!accountId) {\n throw new Error(\"Failed to extract Codex account id from access token\")\n }\n\n return {\n accessToken: tokenResult.accessToken,\n refreshToken: tokenResult.refreshToken,\n expiresAt: tokenResult.expiresAt,\n accountId,\n }\n}\n\nexport async function refreshCodexCredentials(\n credentials: CodexCredentials,\n): Promise<CodexCredentials> {\n const tokenResult = await refreshAccessToken(credentials.refreshToken)\n const accountId = getAccountId(tokenResult.accessToken)\n if (!accountId) {\n throw new Error(\"Failed to extract Codex account id from access token\")\n }\n\n return {\n accessToken: tokenResult.accessToken,\n refreshToken: tokenResult.refreshToken,\n expiresAt: tokenResult.expiresAt,\n accountId,\n }\n}\n\nexport function isCodexCredentialsExpired(\n credentials: Pick<CodexCredentials, \"expiresAt\">,\n now: number = Date.now(),\n): boolean {\n return credentials.expiresAt <= now + REFRESH_BUFFER_MS\n}\n","export const COMPACT_REQUEST = 1 as const\nexport const COMPACT_AUTO_CONTINUE = 2 as const\n\nexport const compactSystemPromptStart =\n \"You are a helpful AI assistant tasked with summarizing conversations\"\nexport const compactOpenCodeSystemPromptStart =\n \"You are an anchored context summarization assistant for coding sessions.\"\nexport const compactSystemPromptStarts = [\n compactSystemPromptStart,\n compactOpenCodeSystemPromptStart,\n] as const\nexport const compactTextOnlyGuard =\n \"CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.\"\nexport const compactSummaryPromptStart =\n \"Your task is to create a detailed summary of the conversation so far\"\nexport const compactAutoContinueClaudeCodePromptStart =\n \"This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.\"\nexport const compactAutoContinueOpenCodePromptStart =\n \"Continue if you have next steps, or stop and ask for clarification if you are unsure how to proceed.\"\nexport const compactAutoContinueOpenCodePromptStart2 =\n \"The previous request exceeded the provider's size limit due to large media attachments. The conversation was compacted and media files were removed from context.\"\nexport const compactAutoContinuePromptStarts = [\n compactAutoContinueClaudeCodePromptStart,\n compactAutoContinueOpenCodePromptStart,\n compactAutoContinueOpenCodePromptStart2,\n] as const\nexport const compactMessageSections = [\n \"Pending Tasks:\",\n \"Current Work:\",\n] as const\n\nexport type CompactType =\n | 0\n | typeof COMPACT_REQUEST\n | typeof COMPACT_AUTO_CONTINUE\n","import consola from \"consola\"\nimport { exec } from \"node:child_process\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\n\nconst execAsync = (command: string): Promise<string> => {\n return new Promise((resolve, reject) => {\n exec(command, (error, stdout) => {\n if (error) {\n reject(error)\n return\n }\n\n resolve(stdout)\n })\n })\n}\n\nlet opencodeVersionCache: string | undefined\n\nconst getGlobalNpmRoot = async (): Promise<string> => {\n const stdout = await execAsync(\"npm root -g\")\n return stdout.trim()\n}\n\nasync function resolveOpencodeVersion(): Promise<void> {\n try {\n const npmRootPath = await getGlobalNpmRoot()\n const opencodePackagePath = path.join(\n npmRootPath,\n \"opencode-ai\",\n \"package.json\",\n )\n const packageJson = await readFile(opencodePackagePath, \"utf8\")\n const { version } = JSON.parse(packageJson) as { version: string }\n opencodeVersionCache = version\n } catch (error) {\n consola.warn(`Failed to resolve opencode version`, error)\n }\n}\n\nexport const initOpencodeVersion = (): Promise<void> => {\n if (process.env.COPILOT_API_OAUTH_APP?.trim() !== \"opencode\") {\n return Promise.resolve()\n }\n return resolveOpencodeVersion()\n}\n\nexport const getCachedOpencodeVersion = (): string | undefined => {\n return opencodeVersionCache\n}\n","import { randomUUID } from \"node:crypto\"\n\nimport { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\n\nimport type { State } from \"./state\"\n\nimport { getCachedOpencodeVersion } from \"./opencode\"\nimport { requestContext } from \"./request-context\"\n\nexport const isOpencodeOauthApp = (): boolean => {\n return process.env.COPILOT_API_OAUTH_APP?.trim() === \"opencode\"\n}\n\nexport const normalizeDomain = (input: string): string => {\n return input\n .trim()\n .replace(/^https?:\\/\\//u, \"\")\n .replace(/\\/+$/u, \"\")\n}\n\nexport const getEnterpriseDomain = (): string | null => {\n const raw = (process.env.COPILOT_API_ENTERPRISE_URL ?? \"\").trim()\n if (!raw) return null\n const normalized = normalizeDomain(raw)\n return normalized || null\n}\n\nexport const getGitHubBaseUrl = (): string => {\n const resolvedDomain = getEnterpriseDomain()\n return resolvedDomain ? `https://${resolvedDomain}` : GITHUB_BASE_URL\n}\n\nexport const getGitHubApiBaseUrl = (): string => {\n const resolvedDomain = getEnterpriseDomain()\n return resolvedDomain ? `https://api.${resolvedDomain}` : GITHUB_API_BASE_URL\n}\n\nconst getOpencodeOauthHeaders = (): Record<string, string> => {\n return {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": getOpencodeVersion(),\n }\n}\n\nconst getOpencodeLLMHeaders = (): Record<string, string> => {\n return {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": OPENCODE_LLM_USER_AGENT,\n }\n}\n\nconst normalizeOpencodeUserAgent = (userAgent: string): string => {\n const candidate = userAgent.trim()\n const opencodeProduct = candidate.match(/^opencode\\/[^\\s,]+/u)?.[0]\n\n if (!opencodeProduct || candidate.includes(`, ${opencodeProduct}`)) {\n return candidate\n }\n\n return `${candidate}, ${opencodeProduct}`\n}\n\nexport const getOauthUrls = (): {\n deviceCodeUrl: string\n accessTokenUrl: string\n} => {\n const githubBaseUrl = getGitHubBaseUrl()\n\n return {\n deviceCodeUrl: `${githubBaseUrl}/login/device/code`,\n accessTokenUrl: `${githubBaseUrl}/login/oauth/access_token`,\n }\n}\n\ninterface OauthAppConfig {\n clientId: string\n headers: Record<string, string>\n scope: string\n}\n\nexport const getOauthAppConfig = (): OauthAppConfig => {\n if (isOpencodeOauthApp()) {\n return {\n clientId: OPENCODE_GITHUB_CLIENT_ID,\n headers: getOpencodeOauthHeaders(),\n scope: GITHUB_APP_SCOPES,\n }\n }\n\n return {\n clientId: GITHUB_CLIENT_ID,\n headers: standardHeaders(),\n scope: GITHUB_APP_SCOPES,\n }\n}\n\nexport const prepareForCompact = (\n headers: Record<string, string>,\n compactType?: CompactType,\n) => {\n if (compactType) {\n headers[\"x-initiator\"] = \"agent\"\n if (!isOpencodeOauthApp() && compactType === COMPACT_REQUEST) {\n headers[\"x-interaction-type\"] = \"conversation-compaction\"\n headers[\"openai-intent\"] = \"conversation-agent\"\n }\n }\n}\n\nexport const prepareInteractionHeaders = (\n sessionId: string | undefined,\n isSubagent: boolean,\n headers: Record<string, string>,\n) => {\n const sendInteractionHeaders = !isOpencodeOauthApp()\n\n if (isSubagent) {\n headers[\"x-initiator\"] = \"agent\"\n if (sendInteractionHeaders) {\n headers[\"x-interaction-type\"] = \"conversation-subagent\"\n }\n }\n\n if (sessionId && sendInteractionHeaders) {\n headers[\"x-interaction-id\"] = sessionId\n }\n}\n\nexport const standardHeaders = () => ({\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n})\n\nexport const getOpencodeVersion = () => {\n const version = getCachedOpencodeVersion()\n if (version) {\n return \"opencode/\" + version\n }\n return OPENCODE_VERSION\n}\n\nconst OPENCODE_VERSION = \"opencode/1.14.29\"\nconst OPENCODE_LLM_USER_AGENT =\n \"opencode/1.14.29 ai-sdk/provider-utils/4.0.23 runtime/bun/1.3.13, opencode/1.14.29\"\n\nconst COPILOT_VERSION = \"0.47.1\"\nconst EDITOR_PLUGIN_VERSION = `copilot-chat/${COPILOT_VERSION}`\nconst USER_AGENT = `GitHubCopilotChat/${COPILOT_VERSION}`\nconst CLAUDE_AGENT_USER_AGENT =\n \"vscode_claude_code/2.1.112 (external, sdk-ts, agent-sdk/0.2.112)\"\nconst COPILOT_WEBSOCKET_VERSION = COPILOT_VERSION\nconst EDITOR_WEBSOCKET_PLUGIN_VERSION = `copilot-chat/${COPILOT_WEBSOCKET_VERSION}`\n\nconst API_VERSION = \"2026-01-09\"\nconst WEBSOCKET_API_VERSION = API_VERSION\n\nexport const copilotBaseUrl = (state: State) => {\n const enterpriseDomain = getEnterpriseDomain()\n if (enterpriseDomain) {\n return `https://copilot-api.${enterpriseDomain}`\n }\n\n if (isOpencodeOauthApp()) {\n return \"https://api.githubcopilot.com\"\n }\n\n if (state.copilotApiUrl) {\n return state.copilotApiUrl\n }\n\n return state.accountType === \"individual\" ?\n \"https://api.githubcopilot.com\"\n : `https://api.${state.accountType}.githubcopilot.com`\n}\n\nexport const prepareMessageProxyHeaders = (headers: Record<string, string>) => {\n if (isOpencodeOauthApp()) {\n return\n }\n\n // vscode copilot claude agent regenerates request id for\n // each request, keeping it consistent\n const requestIdValue = randomUUID()\n headers[\"x-agent-task-id\"] = requestIdValue\n headers[\"x-request-id\"] = requestIdValue\n\n // Consistent with vscode copilot claude agent\n headers[\"x-interaction-type\"] = \"messages-proxy\"\n headers[\"openai-intent\"] = \"messages-proxy\"\n headers[\"user-agent\"] = CLAUDE_AGENT_USER_AGENT\n\n delete headers[\"copilot-integration-id\"]\n}\n\nexport const githubUserHeaders = (state: State): Record<string, string> => {\n if (isOpencodeOauthApp()) {\n return {\n Authorization: `Bearer ${state.githubToken}`,\n \"User-Agent\": getOpencodeVersion(),\n }\n }\n return {\n accept: \"application/vnd.github+json\",\n authorization: `token ${state.githubToken}`,\n \"user-agent\": USER_AGENT,\n \"x-github-api-version\": \"2022-11-28\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\",\n }\n}\n\nexport const copilotModelsHeaders = (state: State) => {\n if (isOpencodeOauthApp()) {\n return {\n Authorization: `Bearer ${state.copilotToken}`,\n \"User-Agent\": getOpencodeVersion(),\n }\n }\n const headers = githubCopilotHeaders(state)\n headers[\"x-interaction-type\"] = \"model-access\"\n headers[\"openai-intent\"] = \"model-access\"\n delete headers[\"x-interaction-id\"]\n delete headers[\"content-type\"]\n return headers\n}\n\nexport const copilotHeaders = (\n state: State,\n requestId?: string,\n vision: boolean = false,\n) => {\n if (isOpencodeOauthApp()) {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${state.copilotToken}`,\n ...getOpencodeLLMHeaders(),\n \"Openai-Intent\": \"conversation-edits\",\n }\n\n const store = requestContext.getStore()\n const userAgent = store?.userAgent.trim()\n // Real opencode traffic already carries a versioned opencode/* UA,\n // so prefer the inbound header to keep upstream behavior aligned.\n if (userAgent?.startsWith(\"opencode/\")) {\n headers[\"User-Agent\"] = normalizeOpencodeUserAgent(userAgent)\n }\n\n if (store?.sessionAffinity) {\n headers[\"x-session-affinity\"] = store.sessionAffinity\n }\n\n if (store?.parentSessionId) {\n headers[\"x-parent-session-id\"] = store.parentSessionId\n }\n\n if (vision) headers[\"Copilot-Vision-Request\"] = \"true\"\n\n return headers\n }\n\n return githubCopilotHeaders(state, requestId, vision)\n}\n\nexport const copilotWebSocketHeaders = (\n preparedHeaders: Record<string, string>,\n) => {\n if (isOpencodeOauthApp()) {\n return omitHeader(preparedHeaders, \"x-initiator\")\n }\n\n const requestId =\n getPreparedHeader(preparedHeaders, \"x-request-id\") ?? randomUUID()\n const source = createHeaderResolver(preparedHeaders)\n const headers: Record<string, string> = {\n Authorization: source(\"authorization\"),\n \"X-Request-Id\": requestId,\n \"OpenAI-Intent\": source(\"openai-intent\", \"conversation-agent\"),\n \"X-GitHub-Api-Version\": source(\n \"x-github-api-version\",\n WEBSOCKET_API_VERSION,\n ),\n \"X-Interaction-Id\": source(\"x-interaction-id\", requestId),\n \"X-Interaction-Type\": source(\"x-interaction-type\", \"conversation-agent\"),\n \"X-Agent-Task-Id\": source(\"x-agent-task-id\", requestId),\n }\n\n setPreparedHeader(\n headers,\n \"VScode-SessionId\",\n preparedHeaders,\n \"vscode-sessionid\",\n )\n\n setPreparedHeader(\n headers,\n \"VScode-MachineId\",\n preparedHeaders,\n \"vscode-machineid\",\n )\n\n Object.assign(headers, {\n \"Editor-Device-Id\": source(\"editor-device-id\"),\n \"Editor-Plugin-Version\": source(\n \"editor-plugin-version\",\n EDITOR_WEBSOCKET_PLUGIN_VERSION,\n ),\n \"Editor-Version\": source(\"editor-version\"),\n \"Copilot-Integration-Id\": source(\"copilot-integration-id\", \"vscode-chat\"),\n })\n\n setPreparedHeader(\n headers,\n \"Copilot-Vision-Request\",\n preparedHeaders,\n \"copilot-vision-request\",\n )\n\n headers[\"user-agent\"] = \"node\"\n\n return headers\n}\n\nconst createHeaderResolver =\n (headers: Record<string, string>) =>\n (headerName: string, fallback: string = \"\"): string =>\n getPreparedHeader(headers, headerName) ?? fallback\n\nconst getPreparedHeader = (\n headers: Record<string, string>,\n headerName: string,\n): string | undefined => {\n const normalizedHeaderName = headerName.toLowerCase()\n const match = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return match?.[1]\n}\n\nconst setPreparedHeader = (\n target: Record<string, string>,\n targetHeaderName: string,\n source: Record<string, string>,\n sourceHeaderName: string,\n): void => {\n const value = getPreparedHeader(source, sourceHeaderName)\n if (value) {\n target[targetHeaderName] = value\n }\n}\n\nconst omitHeader = (\n headers: Record<string, string>,\n headerName: string,\n): Record<string, string> => {\n const normalizedHeaderName = headerName.toLowerCase()\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => key.toLowerCase() !== normalizedHeaderName,\n ),\n )\n}\n\nconst githubCopilotHeaders = (\n state: State,\n requestId?: string,\n vision: boolean = false,\n) => {\n const requestIdValue = requestId ?? randomUUID()\n const headers: Record<string, string> = {\n Authorization: `Bearer ${state.copilotToken}`,\n \"content-type\": standardHeaders()[\"content-type\"],\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-device-id\": state.vsCodeDeviceId,\n \"editor-version\": `vscode/${state.vsCodeVersion}`,\n \"editor-plugin-version\": EDITOR_PLUGIN_VERSION,\n \"user-agent\": USER_AGENT,\n \"openai-intent\": \"conversation-agent\",\n \"x-github-api-version\": API_VERSION,\n \"x-request-id\": requestIdValue,\n \"x-vscode-user-agent-library-version\": \"electron-fetch\",\n \"x-agent-task-id\": requestIdValue,\n \"x-interaction-type\": \"conversation-agent\",\n }\n\n if (vision) headers[\"copilot-vision-request\"] = \"true\"\n\n if (state.macMachineId) {\n headers[\"vscode-machineid\"] = state.macMachineId\n }\n\n if (state.vsCodeSessionId) {\n headers[\"vscode-sessionid\"] = state.vsCodeSessionId\n }\n\n return headers\n}\n\nexport const GITHUB_API_BASE_URL = \"https://api.github.com\"\nexport const githubHeaders = (state: State): Record<string, string> => {\n if (isOpencodeOauthApp()) {\n return {\n Authorization: `Bearer ${state.githubToken}`,\n ...getOpencodeOauthHeaders(),\n }\n }\n return {\n authorization: `token ${state.githubToken}`,\n \"user-agent\": USER_AGENT,\n \"x-github-api-version\": \"2025-04-01\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\",\n }\n}\n\nexport const GITHUB_BASE_URL = \"https://github.com\"\nexport const GITHUB_CLIENT_ID = \"Iv1.b507a08c87ecfe98\"\nexport const GITHUB_APP_SCOPES = [\"read:user\"].join(\" \")\nexport const OPENCODE_GITHUB_CLIENT_ID = \"Ov23li8tweQw6odWQebz\"\n","import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { CodexCredentials } from \"~/lib/oauth/codex\"\n\nimport { PATHS } from \"./paths\"\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nasync function readOptionalFile(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf8\")\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return null\n }\n throw error\n }\n}\n\nasync function writeProtectedFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, content, \"utf8\")\n try {\n await fs.chmod(filePath, 0o600)\n } catch {\n return\n }\n}\n\nfunction normalizeCodexCredentials(\n credentials: unknown,\n): CodexCredentials | null {\n if (!credentials || typeof credentials !== \"object\") {\n return null\n }\n\n const candidate = credentials as Partial<CodexCredentials>\n if (\n typeof candidate.accessToken !== \"string\"\n || typeof candidate.refreshToken !== \"string\"\n || typeof candidate.expiresAt !== \"number\"\n || typeof candidate.accountId !== \"string\"\n ) {\n return null\n }\n\n return {\n accessToken: candidate.accessToken,\n refreshToken: candidate.refreshToken,\n expiresAt: candidate.expiresAt,\n accountId: candidate.accountId,\n }\n}\n\nexport async function readGitHubToken(): Promise<string | null> {\n const token = await readOptionalFile(PATHS.GITHUB_TOKEN_PATH)\n const normalizedToken = token?.trim()\n return normalizedToken || null\n}\n\nexport async function writeGitHubToken(token: string): Promise<void> {\n await writeProtectedFile(PATHS.GITHUB_TOKEN_PATH, token.trim())\n}\n\nexport async function readCodexCredentials(): Promise<CodexCredentials | null> {\n const raw = await readOptionalFile(PATHS.CODEX_CREDENTIAL_PATH)\n if (!raw?.trim()) {\n return null\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw) as unknown\n } catch (error) {\n throw new Error(\n `Codex credentials file is not valid JSON: ${PATHS.CODEX_CREDENTIAL_PATH}`,\n {\n cause: error,\n },\n )\n }\n\n const credentials = normalizeCodexCredentials(parsed)\n if (!credentials) {\n throw new Error(\n `Codex credentials file is missing required fields: ${PATHS.CODEX_CREDENTIAL_PATH}`,\n )\n }\n\n return credentials\n}\n\nexport async function writeCodexCredentials(\n credentials: CodexCredentials,\n): Promise<void> {\n await writeProtectedFile(\n PATHS.CODEX_CREDENTIAL_PATH,\n `${JSON.stringify(credentials, null, 2)}\\n`,\n )\n}\n\nexport async function clearCodexCredentials(): Promise<void> {\n await writeProtectedFile(PATHS.CODEX_CREDENTIAL_PATH, \"\")\n}\n\nexport async function hasCodexCredentials(): Promise<boolean> {\n return (await readCodexCredentials()) !== null\n}\n","import type { Context } from \"hono\"\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\"\n\nimport consola from \"consola\"\n\nexport class HTTPError extends Error {\n response: Response\n\n constructor(message: string, response: Response) {\n super(message)\n this.response = response\n }\n}\n\nexport async function forwardError(\n c: Context,\n error: unknown,\n): Promise<Response> {\n consola.error(\"Error occurred:\", error)\n\n if (error instanceof HTTPError) {\n if (error.response.status === 429) {\n for (const [name, value] of error.response.headers) {\n const lowerName = name.toLowerCase()\n if (lowerName === \"retry-after\" || lowerName.startsWith(\"x-\")) {\n c.header(name, value)\n }\n }\n }\n\n const errorText = await error.response.text()\n let errorJson: unknown\n try {\n errorJson = JSON.parse(errorText)\n } catch {\n errorJson = errorText\n }\n consola.error(\"HTTP error:\", errorJson)\n return c.json(\n {\n error: {\n message: errorText,\n type: \"error\",\n },\n },\n error.response.status as ContentfulStatusCode,\n )\n }\n\n return c.json(\n {\n error: {\n message: (error as Error).message,\n type: \"error\",\n },\n },\n 500,\n )\n}\n","import consola from \"consola\"\n\nimport { getGitHubApiBaseUrl, githubHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const getCopilotToken = async () => {\n const response = await fetch(\n `${getGitHubApiBaseUrl()}/copilot_internal/v2/token`,\n {\n headers: githubHeaders(state),\n },\n )\n\n if (!response.ok) {\n const errorText = await response.clone().text()\n consola.error(\"Failed to get Copilot token response body\", errorText)\n\n throw new HTTPError(\"Failed to get Copilot token\", response)\n }\n\n return (await response.json()) as GetCopilotTokenResponse\n}\n\n// Trimmed for the sake of simplicity\ninterface GetCopilotTokenResponse {\n expires_at: number\n refresh_in: number\n token: string\n}\n","import { getGitHubApiBaseUrl, githubHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport type CopilotAccountType = \"individual\" | \"business\" | \"enterprise\"\n\nexport const getCopilotUsage = async (\n githubToken?: string,\n): Promise<CopilotUsageResponse> => {\n const resolvedGithubToken = githubToken ?? state.githubToken\n if (!resolvedGithubToken) {\n throw new Error(\"GitHub token not found\")\n }\n\n const authState = { ...state, githubToken: resolvedGithubToken }\n const response = await fetch(\n `${getGitHubApiBaseUrl()}/copilot_internal/user`,\n {\n headers: githubHeaders(authState),\n },\n )\n\n if (!response.ok) {\n throw new HTTPError(\"Failed to get Copilot usage\", response)\n }\n\n return (await response.json()) as CopilotUsageResponse\n}\n\nexport const getCopilotAccountType = async (\n githubToken?: string,\n): Promise<CopilotAccountType> => {\n const usage = await getCopilotUsage(githubToken)\n const plan = (usage.copilot_plan ?? \"\").toLowerCase()\n\n if (plan.includes(\"enterprise\")) return \"enterprise\"\n if (plan.includes(\"business\")) return \"business\"\n return \"individual\"\n}\n\nexport interface QuotaDetail {\n entitlement: number\n overage_count: number\n overage_permitted: boolean\n percent_remaining: number\n quota_id: string\n quota_remaining: number\n remaining: number\n unlimited: boolean\n}\n\ninterface QuotaSnapshots {\n chat: QuotaDetail\n completions: QuotaDetail\n premium_interactions: QuotaDetail\n}\n\ninterface CopilotUsageResponse {\n login: string\n access_type_sku: string\n analytics_tracking_id: string\n assigned_date: string\n can_signup_for_limited: boolean\n chat_enabled: boolean\n copilot_plan?: string\n organization_login_list: Array<unknown>\n organization_list: Array<unknown>\n quota_reset_date: string\n quota_snapshots: QuotaSnapshots\n endpoints: {\n api: string\n telemetry: string\n }\n}\n","import { getOauthAppConfig, getOauthUrls } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\n\nexport async function getDeviceCode(): Promise<DeviceCodeResponse> {\n const { clientId, headers, scope } = getOauthAppConfig()\n const { deviceCodeUrl } = getOauthUrls()\n\n const response = await fetch(deviceCodeUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n client_id: clientId,\n scope,\n }),\n })\n\n if (!response.ok) throw new HTTPError(\"Failed to get device code\", response)\n\n return (await response.json()) as DeviceCodeResponse\n}\n\nexport interface DeviceCodeResponse {\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n}\n","import { getGitHubApiBaseUrl, githubUserHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport async function getGitHubUser(githubToken?: string) {\n const resolvedGithubToken = githubToken ?? state.githubToken\n if (!resolvedGithubToken) {\n throw new Error(\"GitHub token not found\")\n }\n\n const authState = { ...state, githubToken: resolvedGithubToken }\n const response = await fetch(`${getGitHubApiBaseUrl()}/user`, {\n headers: githubUserHeaders(authState),\n })\n\n if (!response.ok) throw new HTTPError(\"Failed to get GitHub user\", response)\n\n return (await response.json()) as GithubUserResponse\n}\n\n// Trimmed for the sake of simplicity\ninterface GithubUserResponse {\n login: string\n}\n","import consola from \"consola\"\n\nimport { copilotBaseUrl, copilotModelsHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const getModels = async () => {\n consola.info(`Fetching models from ${copilotBaseUrl(state)}/models`)\n const response = await fetch(`${copilotBaseUrl(state)}/models`, {\n headers: copilotModelsHeaders(state),\n })\n\n if (!response.ok) {\n const errorText = await response.clone().text()\n\n consola.error(\"Failed to get models response body\", errorText)\n\n throw new HTTPError(\"Failed to get models\", response)\n }\n\n return (await response.json()) as ModelsResponse\n}\n\nexport interface ModelsResponse {\n data: Array<Model>\n object: string\n}\n\ninterface ModelLimits {\n max_context_window_tokens?: number\n max_output_tokens?: number\n max_prompt_tokens?: number\n max_inputs?: number\n}\n\ninterface ModelSupports {\n max_thinking_budget?: number\n min_thinking_budget?: number\n tool_calls?: boolean\n parallel_tool_calls?: boolean\n dimensions?: boolean\n streaming?: boolean\n structured_outputs?: boolean\n vision?: boolean\n adaptive_thinking?: boolean\n reasoning_effort?: Array<string>\n}\n\ninterface ModelCapabilities {\n family: string\n limits: ModelLimits\n object: string\n supports: ModelSupports\n tokenizer: string\n type: string\n}\n\nexport interface Model {\n capabilities: ModelCapabilities\n id: string\n model_picker_enabled: boolean\n name: string\n object: string\n preview: boolean\n vendor: string\n version: string\n policy?: {\n state: string\n terms: string\n }\n supported_endpoints?: Array<string>\n}\n","const FALLBACK = \"1.119.1\"\n\nexport async function getVSCodeVersion() {\n await Promise.resolve()\n return FALLBACK\n}\n","import consola from \"consola\"\nimport { randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\n\nconst WINDOWS_DEVICE_ID_KEY = String.raw`\\SOFTWARE\\Microsoft\\DeveloperTools`\nconst WINDOWS_DEVICE_ID_NAME = \"deviceid\"\n\ntype RegistryArch = \"x86\" | \"x64\"\n\ninterface WinregConstructor {\n new (options: {\n hive: string\n key: string\n arch?: RegistryArch\n }): WinregRegistry\n HKCU: string\n REG_SZ: string\n}\n\ninterface WinregRegistry {\n get(\n name: string,\n callback: (error: RegistryError | null, item: RegistryItem | null) => void,\n ): void\n set(\n name: string,\n type: string,\n value: string,\n callback: (error: RegistryError | null) => void,\n ): void\n}\n\ninterface RegistryItem {\n value?: string\n}\n\ninterface RegistryError extends Error {\n code?: number | string\n}\n\nconst windows64Architectures = new Set([\"AMD64\", \"ARM64\", \"IA64\"])\n\nconst getPosixHomeDir = (): string => {\n if (!process.env.HOME) {\n throw new Error(\"Home directory not found\")\n }\n\n return process.env.HOME\n}\n\nconst getDeviceIdFilePath = (): string => {\n let folder: string\n\n switch (process.platform) {\n case \"darwin\": {\n folder = path.posix.join(\n getPosixHomeDir(),\n \"Library\",\n \"Application Support\",\n )\n break\n }\n case \"linux\": {\n folder =\n process.env.XDG_CACHE_HOME\n ?? path.posix.join(getPosixHomeDir(), \".cache\")\n break\n }\n default: {\n throw new Error(\"Unsupported platform\")\n }\n }\n\n return path.posix.join(folder, \"Microsoft\", \"DeveloperTools\", \"deviceid\")\n}\n\nconst isMissingFileError = (error: unknown): error is NodeJS.ErrnoException => {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\"\n}\n\nconst readStoredDeviceIdFile = async (\n filePath: string,\n): Promise<string | undefined> => {\n const { readFile } = await import(\"node:fs/promises\")\n\n try {\n return await readFile(filePath, \"utf8\")\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined\n }\n\n throw error\n }\n}\n\nconst writeStoredDeviceIdFile = async (\n filePath: string,\n deviceId: string,\n): Promise<void> => {\n const { mkdir, writeFile } = await import(\"node:fs/promises\")\n\n await mkdir(path.posix.dirname(filePath), { recursive: true })\n await writeFile(filePath, deviceId, \"utf8\")\n}\n\nconst getWindowsRegistryArch = (): RegistryArch | undefined => {\n const architecture = (\n process.env.PROCESSOR_ARCHITEW6432 ?? process.env.PROCESSOR_ARCHITECTURE\n )?.toUpperCase()\n\n return architecture && windows64Architectures.has(architecture) ?\n \"x64\"\n : undefined\n}\n\nconst loadWinreg = async (): Promise<WinregConstructor> => {\n const module = await import(\"winreg\")\n const winreg =\n \"default\" in module ? (module.default as unknown) : (module as unknown)\n\n return winreg as WinregConstructor\n}\n\nconst isMissingRegistryError = (error: RegistryError | null): boolean => {\n if (!error) {\n return false\n }\n\n const errorCode = Number(error.code)\n\n return Number.isFinite(errorCode) && errorCode === 1\n}\n\nconst createWindowsRegistry = async (): Promise<{\n registry: WinregRegistry\n regSz: string\n}> => {\n const Winreg = await loadWinreg()\n\n return {\n registry: new Winreg({\n hive: Winreg.HKCU,\n key: WINDOWS_DEVICE_ID_KEY,\n arch: getWindowsRegistryArch(),\n }),\n regSz: Winreg.REG_SZ,\n }\n}\n\nconst readRegistryString = async (\n registry: WinregRegistry,\n name: string,\n): Promise<string | undefined> => {\n return new Promise((resolve, reject) => {\n registry.get(name, (error, item) => {\n if (isMissingRegistryError(error)) {\n resolve(undefined)\n return\n }\n\n if (error) {\n reject(\n error instanceof Error ? error : new Error(\"Unknown registry error\"),\n )\n return\n }\n\n resolve(item?.value)\n })\n })\n}\n\nconst writeRegistryString = async ({\n registry,\n regSz,\n name,\n value,\n}: {\n registry: WinregRegistry\n regSz: string\n name: string\n value: string\n}): Promise<void> => {\n return new Promise((resolve, reject) => {\n registry.set(name, regSz, value, (error) => {\n if (error) {\n reject(\n error instanceof Error ? error : new Error(\"Unknown registry error\"),\n )\n return\n }\n\n resolve()\n })\n })\n}\n\nexport const getStoredVSCodeDeviceId = async (): Promise<\n string | undefined\n> => {\n switch (process.platform) {\n case \"win32\": {\n const { registry } = await createWindowsRegistry()\n\n return readRegistryString(registry, WINDOWS_DEVICE_ID_NAME)\n }\n case \"darwin\":\n case \"linux\": {\n return readStoredDeviceIdFile(getDeviceIdFilePath())\n }\n default: {\n throw new Error(\"Unsupported platform\")\n }\n }\n}\n\nconst setStoredVSCodeDeviceId = async (deviceId: string): Promise<void> => {\n switch (process.platform) {\n case \"win32\": {\n const { registry, regSz } = await createWindowsRegistry()\n\n await writeRegistryString({\n registry,\n regSz,\n name: WINDOWS_DEVICE_ID_NAME,\n value: deviceId,\n })\n return\n }\n case \"darwin\":\n case \"linux\": {\n await writeStoredDeviceIdFile(getDeviceIdFilePath(), deviceId)\n return\n }\n default: {\n throw new Error(\"Unsupported platform\")\n }\n }\n}\n\nconst createVSCodeDeviceId = (): string => randomUUID().toLowerCase()\n\nexport async function getVSCodeDeviceId(): Promise<string> {\n let deviceId: string | undefined\n\n try {\n deviceId = await getStoredVSCodeDeviceId()\n } catch (error) {\n consola.debug(\"Failed to read VSCode device id\", error)\n }\n\n if (deviceId) {\n return deviceId\n }\n\n const newDeviceId = createVSCodeDeviceId()\n\n try {\n await setStoredVSCodeDeviceId(newDeviceId)\n } catch (error) {\n consola.warn(\n \"Failed to persist VSCode device id, using ephemeral id\",\n error,\n )\n }\n\n return newDeviceId\n}\n","import type { Context } from \"hono\"\n\nimport consola from \"consola\"\nimport { createHash, randomUUID } from \"node:crypto\"\nimport { networkInterfaces } from \"node:os\"\n\nimport type { AnthropicMessagesPayload } from \"~/routes/messages/anthropic-types\"\n\nimport { getModels as getCopilotModels } from \"~/services/copilot/get-models\"\nimport { getVSCodeVersion } from \"~/services/get-vscode-version\"\n\nimport { getVSCodeDeviceId } from \"./deviceid\"\nimport { state } from \"./state\"\n\nexport const sleep = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n\nexport const isNullish = (value: unknown): value is null | undefined =>\n value === null || value === undefined\n\nexport async function cacheModels(): Promise<void> {\n const models = await getCopilotModels()\n\n state.models = {\n ...models,\n data: models.data.filter(\n (model) =>\n model.model_picker_enabled || model.capabilities.type === \"embeddings\",\n ),\n }\n}\n\nexport const cacheVSCodeVersion = async () => {\n const response = await getVSCodeVersion()\n state.vsCodeVersion = response\n\n consola.info(`Using VSCode version: ${response}`)\n}\n\nconst invalidMacAddresses = new Set([\n \"00:00:00:00:00:00\",\n \"ff:ff:ff:ff:ff:ff\",\n \"ac:de:48:00:11:22\",\n])\n\nfunction validateMacAddress(candidate: string): boolean {\n const tempCandidate = candidate.replaceAll(\"-\", \":\").toLowerCase()\n return !invalidMacAddresses.has(tempCandidate)\n}\n\nexport function getMac(): string | null {\n const ifaces = networkInterfaces()\n // eslint-disable-next-line guard-for-in\n for (const name in ifaces) {\n const networkInterface = ifaces[name]\n if (networkInterface) {\n for (const { mac } of networkInterface) {\n if (validateMacAddress(mac)) {\n return mac\n }\n }\n }\n }\n return null\n}\n\nexport const cacheMacMachineId = () => {\n const macAddress = getMac() ?? randomUUID()\n state.macMachineId = createHash(\"sha256\")\n .update(macAddress, \"utf8\")\n .digest(\"hex\")\n consola.debug(`Using machine ID: ${state.macMachineId}`)\n}\n\nexport const cacheVsCodeDeviceId = async () => {\n state.vsCodeDeviceId = await getVSCodeDeviceId()\n consola.debug(`Using VSCode device ID: ${state.vsCodeDeviceId}`)\n}\n\nconst SESSION_REFRESH_BASE_MS = 60 * 60 * 1000\nconst SESSION_REFRESH_JITTER_MS = 20 * 60 * 1000\nlet vsCodeSessionRefreshTimer: ReturnType<typeof setTimeout> | null = null\n\nconst generateSessionId = () => {\n state.vsCodeSessionId = randomUUID() + Date.now().toString()\n consola.debug(`Generated VSCode session ID: ${state.vsCodeSessionId}`)\n}\n\nexport const stopVsCodeSessionRefreshLoop = () => {\n if (vsCodeSessionRefreshTimer) {\n clearTimeout(vsCodeSessionRefreshTimer)\n vsCodeSessionRefreshTimer = null\n }\n}\n\nconst scheduleSessionIdRefresh = () => {\n const randomDelay = Math.floor(Math.random() * SESSION_REFRESH_JITTER_MS)\n const delay = SESSION_REFRESH_BASE_MS + randomDelay\n consola.debug(\n `Scheduling next VSCode session ID refresh in ${Math.round(\n delay / 1000,\n )} seconds`,\n )\n\n stopVsCodeSessionRefreshLoop()\n vsCodeSessionRefreshTimer = setTimeout(() => {\n try {\n generateSessionId()\n } catch (error) {\n consola.error(\"Failed to refresh session ID, rescheduling...\", error)\n } finally {\n scheduleSessionIdRefresh()\n }\n }, delay)\n}\n\nexport const cacheVsCodeSessionId = () => {\n stopVsCodeSessionRefreshLoop()\n generateSessionId()\n scheduleSessionIdRefresh()\n}\n\ninterface PayloadMessage {\n role?: string\n content?: string | Array<{ type?: string; text?: string }> | null\n type?: string\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null\n\nconst getUserIdJsonField = (\n userIdPayload: Record<string, unknown> | null,\n field: string,\n): string | null => {\n const value = userIdPayload?.[field]\n return typeof value === \"string\" && value.length > 0 ? value : null\n}\n\nconst parseJsonUserId = (userId: string): Record<string, unknown> | null => {\n try {\n const parsed: unknown = JSON.parse(userId)\n return isRecord(parsed) ? parsed : null\n } catch {\n return null\n }\n}\n\nexport const parseUserIdMetadata = (\n userId: string | undefined,\n): { safetyIdentifier: string | null; sessionId: string | null } => {\n if (!userId || typeof userId !== \"string\") {\n return { safetyIdentifier: null, sessionId: null }\n }\n\n const legacySafetyIdentifier =\n userId.match(/user_([^_]+)_account/)?.[1] ?? null\n const legacySessionId = userId.match(/_session_(.+)$/)?.[1] ?? null\n\n const parsedUserId =\n legacySafetyIdentifier && legacySessionId ? null : parseJsonUserId(userId)\n\n const safetyIdentifier =\n legacySafetyIdentifier\n ?? getUserIdJsonField(parsedUserId, \"device_id\")\n ?? getUserIdJsonField(parsedUserId, \"account_uuid\")\n const sessionId =\n legacySessionId ?? getUserIdJsonField(parsedUserId, \"session_id\")\n\n return { safetyIdentifier, sessionId }\n}\n\nconst findLastUserContent = (\n messages: Array<PayloadMessage>,\n): string | null => {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg.role === \"user\" && msg.content) {\n if (typeof msg.content === \"string\") {\n return msg.content\n } else if (Array.isArray(msg.content)) {\n const array = msg.content\n .filter((n) => n.type !== \"tool_result\")\n .map((n) => ({ ...n, cache_control: undefined }))\n if (array.length > 0) {\n return JSON.stringify(array)\n }\n }\n }\n }\n return null\n}\n\nexport const generateRequestIdFromPayload = (\n payload: {\n messages: string | Array<PayloadMessage> | undefined\n },\n sessionId?: string,\n): string => {\n const messages = payload.messages\n if (messages) {\n const lastUserContent =\n typeof messages === \"string\" ? messages : findLastUserContent(messages)\n\n if (lastUserContent) {\n return getUUID(\n (sessionId ?? \"\") + (state.macMachineId ?? \"\") + lastUserContent,\n )\n }\n }\n\n return randomUUID()\n}\n\nexport const getRootSessionId = (\n anthropicPayload: AnthropicMessagesPayload,\n c: Context,\n): string | undefined => {\n const userId = anthropicPayload.metadata?.user_id\n const sessionId =\n userId ?\n parseUserIdMetadata(userId).sessionId || undefined\n : c.req.header(\"x-session-id\")\n\n return sessionId ? getUUID(sessionId) : sessionId\n}\n\nexport const getUUID = (content: string): string => {\n const uuidBytes = createHash(\"sha256\")\n .update(content)\n .digest()\n .subarray(0, 16)\n\n uuidBytes[6] = (uuidBytes[6] & 0x0f) | 0x40\n uuidBytes[8] = (uuidBytes[8] & 0x3f) | 0x80\n\n const uuidHex = uuidBytes.toString(\"hex\")\n\n return `${uuidHex.slice(0, 8)}-${uuidHex.slice(8, 12)}-${uuidHex.slice(12, 16)}-${uuidHex.slice(16, 20)}-${uuidHex.slice(20)}`\n}\n","import consola from \"consola\"\n\nimport { getOauthAppConfig, getOauthUrls } from \"~/lib/api-config\"\nimport { sleep } from \"~/lib/utils\"\n\nimport type { DeviceCodeResponse } from \"./get-device-code\"\n\nexport async function pollAccessToken(\n deviceCode: DeviceCodeResponse,\n): Promise<string> {\n const { clientId, headers } = getOauthAppConfig()\n const { accessTokenUrl } = getOauthUrls()\n\n // Interval is in seconds, we need to multiply by 1000 to get milliseconds\n // I'm also adding another second, just to be safe\n const sleepDuration = (deviceCode.interval + 1) * 1000\n consola.debug(`Polling access token with interval of ${sleepDuration}ms`)\n\n while (true) {\n const response = await fetch(accessTokenUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n client_id: clientId,\n device_code: deviceCode.device_code,\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n }),\n })\n\n if (!response.ok) {\n await sleep(sleepDuration)\n consola.error(\"Failed to poll access token:\", await response.text())\n\n continue\n }\n\n const json = await response.json()\n consola.debug(\"Polling access token response:\", json)\n\n const { access_token } = json as AccessTokenResponse\n\n if (access_token) {\n return access_token\n } else {\n await sleep(sleepDuration)\n }\n }\n}\n\ninterface AccessTokenResponse {\n access_token: string\n token_type: string\n scope: string\n}\n","import consola from \"consola\"\nimport { setTimeout as delay } from \"node:timers/promises\"\n\nimport { isOpencodeOauthApp } from \"~/lib/api-config\"\nimport { getRawProviderConfig, setProviderConfig } from \"~/lib/config\"\nimport {\n readCodexCredentials,\n readGitHubToken,\n writeCodexCredentials,\n writeGitHubToken,\n} from \"~/lib/credential-store\"\nimport {\n isCodexCredentialsExpired,\n refreshCodexCredentials,\n type CodexCredentials,\n} from \"~/lib/oauth/codex\"\nimport { CODEX_API_BASE_URL } from \"~/services/codex/create-responses\"\nimport { getCopilotToken } from \"~/services/github/get-copilot-token\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { getDeviceCode } from \"~/services/github/get-device-code\"\nimport { getGitHubUser } from \"~/services/github/get-user\"\nimport { pollAccessToken } from \"~/services/github/poll-access-token\"\n\nimport { HTTPError } from \"./error\"\nimport { state } from \"./state\"\n\nlet copilotRefreshLoopController: AbortController | null = null\nlet codexRefreshLoopController: AbortController | null = null\n\nexport const stopCopilotRefreshLoop = () => {\n if (!copilotRefreshLoopController) {\n return\n }\n\n copilotRefreshLoopController.abort()\n copilotRefreshLoopController = null\n}\n\nexport const stopCodexRefreshLoop = () => {\n if (!codexRefreshLoopController) {\n return\n }\n\n codexRefreshLoopController.abort()\n codexRefreshLoopController = null\n}\n\nfunction applyCodexCredentials(credentials: CodexCredentials): void {\n state.codexAccessToken = credentials.accessToken\n state.codexRefreshToken = credentials.refreshToken\n state.codexExpiresAt = credentials.expiresAt\n state.codexAccountId = credentials.accountId\n\n consola.debug(\"Codex credentials loaded successfully\")\n if (state.showToken) {\n consola.info(\"Codex access token:\", credentials.accessToken)\n }\n}\n\nfunction getLoadedCodexCredentials(): CodexCredentials | null {\n if (\n !state.codexAccessToken\n || !state.codexRefreshToken\n || !state.codexExpiresAt\n || !state.codexAccountId\n ) {\n return null\n }\n\n return {\n accessToken: state.codexAccessToken,\n refreshToken: state.codexRefreshToken,\n expiresAt: state.codexExpiresAt,\n accountId: state.codexAccountId,\n }\n}\n\nfunction syncCodexProviderConfig(options?: { enabled?: boolean }): void {\n const existingProviderConfig = getRawProviderConfig(\"codex\") ?? {}\n setProviderConfig(\"codex\", {\n ...existingProviderConfig,\n type: \"openai-responses\",\n enabled: options?.enabled ?? existingProviderConfig.enabled,\n baseUrl: CODEX_API_BASE_URL,\n authType: \"oauth2\",\n })\n}\n\nexport async function persistCodexCredentials(\n credentials: CodexCredentials,\n options?: { enableProvider?: boolean },\n): Promise<void> {\n await writeCodexCredentials(credentials)\n syncCodexProviderConfig({\n enabled: options?.enableProvider ? true : undefined,\n })\n applyCodexCredentials(credentials)\n}\n\nexport const setupCopilotToken = async () => {\n if (isOpencodeOauthApp()) {\n if (!state.githubToken) throw new Error(`opencode token not found`)\n\n state.copilotToken = state.githubToken\n\n consola.debug(\"GitHub Copilot token set from opencode auth token\")\n if (state.showToken) {\n consola.info(\"Copilot token:\", state.copilotToken)\n }\n\n stopCopilotRefreshLoop()\n return\n }\n\n const { token, refresh_in } = await getCopilotToken()\n state.copilotToken = token\n\n // Display the Copilot token to the screen\n consola.debug(\"GitHub Copilot Token fetched successfully!\")\n if (state.showToken) {\n consola.info(\"Copilot token:\", token)\n }\n\n stopCopilotRefreshLoop()\n\n const controller = new AbortController()\n copilotRefreshLoopController = controller\n\n runCopilotRefreshLoop(refresh_in, controller.signal)\n .catch(() => {\n consola.warn(\"Copilot token refresh loop stopped\")\n })\n .finally(() => {\n if (copilotRefreshLoopController === controller) {\n copilotRefreshLoopController = null\n }\n })\n}\n\nexport const setupCodexToken = async (): Promise<void> => {\n const loadedCredentials = getLoadedCodexCredentials()\n if (loadedCredentials && !isCodexCredentialsExpired(loadedCredentials)) {\n if (codexRefreshLoopController) {\n return\n }\n\n applyCodexCredentials(loadedCredentials)\n }\n\n const credentials = loadedCredentials ?? (await readCodexCredentials())\n if (!credentials) {\n throw new Error(\n `Codex credentials not found. Run \\`copilot-api auth login --provider codex\\` first.`,\n )\n }\n\n syncCodexProviderConfig()\n\n let nextCredentials = credentials\n if (isCodexCredentialsExpired(credentials)) {\n consola.debug(\"Refreshing expired Codex credentials\")\n nextCredentials = await refreshCodexCredentials(credentials)\n await persistCodexCredentials(nextCredentials)\n }\n\n applyCodexCredentials(nextCredentials)\n stopCodexRefreshLoop()\n\n const controller = new AbortController()\n codexRefreshLoopController = controller\n\n runCodexRefreshLoop(controller.signal)\n .catch(() => {\n consola.warn(\"Codex token refresh loop stopped\")\n })\n .finally(() => {\n if (codexRefreshLoopController === controller) {\n codexRefreshLoopController = null\n }\n })\n}\n\nconst REFRESH_POLL_INTERVAL_MS = 15_000\nconst EARLY_REFRESH_BUFFER_MS = 60_000\nconst RETRY_REFRESH_DELAY_MS = 15_000\nconst MIN_REFRESH_DELAY_MS = 1_000\n\nexport const getRefreshDeadlineMs = (\n refreshIn: number,\n nowMs: number = Date.now(),\n) =>\n nowMs\n + Math.max(refreshIn * 1000 - EARLY_REFRESH_BUFFER_MS, MIN_REFRESH_DELAY_MS)\n\n// Use short wall-clock chunks so the next wake after sleep notices elapsed time\n// quickly, without relying on the server's absolute expires_at matching local time.\nexport const getRefreshPollDelayMs = (\n refreshAtMs: number,\n nowMs: number = Date.now(),\n) => Math.min(Math.max(refreshAtMs - nowMs, 0), REFRESH_POLL_INTERVAL_MS)\n\nconst runCopilotRefreshLoop = async (\n refreshIn: number,\n signal: AbortSignal,\n) => {\n let refreshAtMs = getRefreshDeadlineMs(refreshIn)\n\n while (!signal.aborted) {\n const nextDelayMs = getRefreshPollDelayMs(refreshAtMs)\n if (nextDelayMs > 0) {\n await delay(nextDelayMs, undefined, { signal })\n continue\n }\n\n consola.debug(\"Refreshing Copilot token\")\n\n try {\n const { token, refresh_in } = await getCopilotToken()\n state.copilotToken = token\n refreshAtMs = getRefreshDeadlineMs(refresh_in)\n consola.debug(\"Copilot token refreshed\")\n if (state.showToken) {\n consola.info(\"Refreshed Copilot token:\", token)\n }\n } catch (error) {\n consola.error(\"Failed to refresh Copilot token:\", error)\n refreshAtMs = Date.now() + RETRY_REFRESH_DELAY_MS\n consola.warn(\n `Retrying Copilot token refresh in ${RETRY_REFRESH_DELAY_MS / 1000}s`,\n )\n }\n }\n}\n\nconst runCodexRefreshLoop = async (signal: AbortSignal) => {\n let refreshAtMs = Math.max(\n (state.codexExpiresAt ?? Date.now()) - EARLY_REFRESH_BUFFER_MS,\n Date.now(),\n )\n\n while (!signal.aborted) {\n const expiresAt = state.codexExpiresAt\n const refreshToken = state.codexRefreshToken\n if (!expiresAt || !refreshToken) {\n return\n }\n\n const nextDelayMs = getRefreshPollDelayMs(refreshAtMs)\n if (nextDelayMs > 0) {\n await delay(nextDelayMs, undefined, { signal })\n continue\n }\n\n consola.debug(\"Refreshing Codex credentials\")\n\n try {\n const credentials = await refreshCodexCredentials({\n accessToken: state.codexAccessToken ?? \"\",\n refreshToken,\n expiresAt,\n accountId: state.codexAccountId ?? \"\",\n })\n await persistCodexCredentials(credentials)\n refreshAtMs = Math.max(\n credentials.expiresAt - EARLY_REFRESH_BUFFER_MS,\n Date.now(),\n )\n consola.debug(\"Codex credentials refreshed\")\n } catch (error) {\n consola.error(\"Failed to refresh Codex credentials:\", error)\n refreshAtMs = Date.now() + RETRY_REFRESH_DELAY_MS\n consola.warn(\n `Retrying Codex token refresh in ${RETRY_REFRESH_DELAY_MS / 1000}s`,\n )\n }\n }\n}\n\ninterface SetupGitHubTokenOptions {\n force?: boolean\n}\n\nexport async function setupGitHubToken(\n options?: SetupGitHubTokenOptions,\n): Promise<void> {\n try {\n const githubToken = await readGitHubToken()\n\n if (githubToken && !options?.force) {\n state.githubToken = githubToken\n if (state.showToken) {\n consola.info(\"GitHub token:\", githubToken)\n }\n await logUser()\n\n return\n }\n\n consola.info(\"Not logged in, getting new access token\")\n const response = await getDeviceCode()\n consola.debug(\"Device code response:\", response)\n\n consola.info(\n `Please enter the code \"${response.user_code}\" in ${response.verification_uri}`,\n )\n\n const token = await pollAccessToken(response)\n await writeGitHubToken(token)\n state.githubToken = token\n\n if (state.showToken) {\n consola.info(\"GitHub token:\", token)\n }\n await logUser()\n } catch (error) {\n if (error instanceof HTTPError) {\n consola.error(\"Failed to get GitHub token:\", await error.response.json())\n throw error\n }\n\n consola.error(\"Failed to get GitHub token:\", error)\n throw error\n }\n}\n\nexport async function logUser() {\n const user = await getGitHubUser()\n state.userName = user.login\n consola.info(`Logged in as ${user.login}`)\n\n const copilotUser = await getCopilotUsage()\n state.copilotApiUrl = copilotUser.endpoints.api\n}\n"],"mappings":"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"}
|
|
@@ -111,4 +111,4 @@ const selectDeferredToolsByNames = (names, tools) => {
|
|
|
111
111
|
//#endregion
|
|
112
112
|
export { isDeferredToolName as a, parseMcpToolSearchSentinel as c, shouldEnableResponsesToolSearch as d, isBridgeToolSearchName as i, resolveBridgeToolSearchName as l, createMcpToolSearchSentinel as n, listDeferredToolNames as o, formatToolSearchBridgeArguments as r, normalizeToolSearchBridgeArguments as s, BRIDGE_TOOL_SEARCH_NAME as t, selectDeferredToolsByNames as u };
|
|
113
113
|
|
|
114
|
-
//# sourceMappingURL=tool-search-
|
|
114
|
+
//# sourceMappingURL=tool-search-wA-fLduL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-search-
|
|
1
|
+
{"version":3,"file":"tool-search-wA-fLduL.js","names":["record"],"sources":["../src/lib/tool-search.ts"],"sourcesContent":["export const BRIDGE_TOOL_SEARCH_NAME = \"mcp__tool_search__search\"\nexport const BRIDGE_TOOL_SEARCH_ALIASES = [\n BRIDGE_TOOL_SEARCH_NAME,\n \"tool_search_search\",\n \"mcp__plugin_tool-search_tool_search__search\",\n] as const\nexport const MCP_TOOL_SEARCH_SENTINEL_TYPE = \"copilot_api_tool_search\"\n\nexport const ALWAYS_LOADED_TOOL_NAMES = [\n \"Agent\",\n \"AskUserQuestion\",\n \"Bash\",\n \"Edit\",\n \"EnterPlanMode\",\n \"ExitPlanMode\",\n \"Glob\",\n \"Grep\",\n \"Read\",\n \"Skill\",\n \"TodoWrite\",\n \"ToolSearch\",\n \"WebFetch\",\n \"Write\",\n \"apply_patch\",\n \"bash\",\n \"glob\",\n \"grep\",\n \"plan_exit\",\n \"question\",\n \"read\",\n \"skill\",\n \"task\",\n \"todowrite\",\n \"webfetch\",\n] as const\n\nconst alwaysLoadedToolNameSet = new Set<string>(ALWAYS_LOADED_TOOL_NAMES)\nconst bridgeToolSearchNameSet = new Set<string>(BRIDGE_TOOL_SEARCH_ALIASES)\n\nexport interface ToolSearchToolLike {\n name: string\n description?: string\n input_schema?: Record<string, unknown>\n defer_loading?: boolean\n}\n\nexport interface McpToolSearchSentinel {\n type: typeof MCP_TOOL_SEARCH_SENTINEL_TYPE\n names: Array<string>\n}\n\nexport const isBridgeToolSearchName = (name: string): boolean =>\n bridgeToolSearchNameSet.has(name)\n\nexport const isAlwaysLoadedToolName = (name: string): boolean =>\n alwaysLoadedToolNameSet.has(name)\n\nexport const isDeferredToolName = (name: string): boolean =>\n !isBridgeToolSearchName(name) && !isAlwaysLoadedToolName(name)\n\nexport const supportsResponsesToolSearchModel = (model: string): boolean => {\n const match = /^gpt-(\\d+)(?:\\.(\\d+))?/iu.exec(model)\n if (!match) {\n return false\n }\n\n const major = Number.parseInt(match[1], 10)\n const minor = match[2] ? Number.parseInt(match[2], 10) : 0\n\n return major > 5 || (major === 5 && minor >= 4)\n}\n\nexport const hasBridgeToolSearchTool = (\n tools: Array<ToolSearchToolLike> | undefined,\n): boolean =>\n Array.isArray(tools)\n && tools.some((tool) => isBridgeToolSearchName(tool.name))\n\nexport const resolveBridgeToolSearchName = (\n tools: Array<ToolSearchToolLike> | undefined,\n): string => {\n if (!Array.isArray(tools)) {\n return BRIDGE_TOOL_SEARCH_NAME\n }\n\n return (\n tools.find((tool) => isBridgeToolSearchName(tool.name))?.name\n ?? BRIDGE_TOOL_SEARCH_NAME\n )\n}\n\nexport const hasDeferredToolCandidate = (\n tools: Array<ToolSearchToolLike> | undefined,\n): boolean =>\n Array.isArray(tools) && tools.some((tool) => isDeferredToolName(tool.name))\n\nexport const shouldEnableResponsesToolSearch = (params: {\n model: string\n tools?: Array<ToolSearchToolLike>\n}): boolean =>\n supportsResponsesToolSearchModel(params.model)\n && hasBridgeToolSearchTool(params.tools)\n && hasDeferredToolCandidate(params.tools)\n\nexport const hasDeferredNamespaceTool = (\n tools: Array<unknown> | null | undefined,\n): boolean =>\n Array.isArray(tools)\n && tools.some((tool) => {\n if (!tool || typeof tool !== \"object\") {\n return false\n }\n\n const record = tool as Record<string, unknown>\n if (record.type !== \"namespace\" || typeof record.name !== \"string\") {\n return false\n }\n\n if (!isDeferredToolName(record.name)) {\n return false\n }\n\n const namespaceTools = record.tools\n return (\n Array.isArray(namespaceTools)\n && namespaceTools.some(\n (entry) =>\n entry\n && typeof entry === \"object\"\n && (entry as Record<string, unknown>).defer_loading === true,\n )\n )\n })\n\nexport const listDeferredToolNames = (\n tools: Array<ToolSearchToolLike>,\n): Array<string> => [\n ...new Set(\n tools\n .filter((tool) => isDeferredToolName(tool.name))\n .map((tool) => tool.name),\n ),\n]\n\nconst extractDeferredToolNamesSource = (\n record: Record<string, unknown>,\n): unknown => record.names ?? record.query ?? record.paths\n\nexport const parseDeferredToolNames = (names: unknown): Array<string> => {\n let rawNames: Array<string> = []\n\n if (typeof names === \"string\") {\n rawNames = names.split(\",\")\n } else if (Array.isArray(names)) {\n rawNames = names.flatMap((name) =>\n typeof name === \"string\" ? name.split(\",\") : [],\n )\n }\n\n return [\n ...new Set(\n rawNames.map((name) => name.trim()).filter((name) => name.length > 0),\n ),\n ]\n}\n\nexport const createMcpToolSearchSentinel = (names: unknown): string =>\n JSON.stringify({\n type: MCP_TOOL_SEARCH_SENTINEL_TYPE,\n names: parseDeferredToolNames(names),\n } satisfies McpToolSearchSentinel)\n\nexport const parseMcpToolSearchSentinel = (\n text: string,\n): McpToolSearchSentinel | null => {\n try {\n const parsed: unknown = JSON.parse(text)\n if (!parsed || typeof parsed !== \"object\") {\n return null\n }\n\n const record = parsed as Record<string, unknown>\n if (record.type !== MCP_TOOL_SEARCH_SENTINEL_TYPE) {\n return null\n }\n\n const names = parseDeferredToolNames(extractDeferredToolNamesSource(record))\n if (names.length === 0) {\n return null\n }\n\n return {\n type: MCP_TOOL_SEARCH_SENTINEL_TYPE,\n names,\n }\n } catch {\n return null\n }\n}\n\nexport const normalizeToolSearchBridgeArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n if (typeof argumentsValue !== \"string\") {\n const names = parseDeferredToolNames(\n extractDeferredToolNamesSource(argumentsValue),\n )\n return names.length > 0 ? { names } : {}\n }\n\n try {\n const parsed: unknown = JSON.parse(argumentsValue)\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const record = parsed as Record<string, unknown>\n const names = parseDeferredToolNames(\n extractDeferredToolNamesSource(record),\n )\n return names.length > 0 ? { names } : {}\n }\n } catch {\n // Treat a raw string as the comma-separated protocol payload.\n }\n\n const names = parseDeferredToolNames(argumentsValue)\n return names.length > 0 ? { names } : {}\n}\n\nexport const formatToolSearchBridgeArguments = (\n argumentsValue: Record<string, unknown> | string,\n): Record<string, unknown> => {\n const normalized = normalizeToolSearchBridgeArguments(argumentsValue)\n const names = normalized.names\n\n if (!Array.isArray(names) || names.length === 0) {\n return {}\n }\n\n return { names: names.join(\",\") }\n}\n\nexport const selectDeferredToolsByNames = (\n names: unknown,\n tools: Array<ToolSearchToolLike>,\n): Array<ToolSearchToolLike> => {\n const requestedNames = parseDeferredToolNames(names)\n if (requestedNames.length === 0) {\n return []\n }\n\n const deferredToolByName = new Map(\n tools\n .filter((tool) => isDeferredToolName(tool.name))\n .map((tool) => [tool.name, tool]),\n )\n\n return requestedNames.flatMap((name) => {\n const tool = deferredToolByName.get(name)\n return tool ? [tool] : []\n })\n}\n\nexport const hasDeferredMcpNamespaceTool = hasDeferredNamespaceTool\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@jeffreycao/copilot-api",
|
|
4
|
-
"version": "1.10.
|
|
5
|
-
"description": "OpenAI and Anthropic-compatible gateway for GitHub Copilot or third-party providers.",
|
|
4
|
+
"version": "1.10.11",
|
|
5
|
+
"description": "OpenAI and Anthropic-compatible gateway for GitHub Copilot or Codex or third-party providers.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"ai-gateway",
|
|
8
8
|
"github-copilot"
|
package/dist/auth-BHa2OHXf.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { n as ensurePaths, t as PATHS } from "./paths-DC-mqCY3.js";
|
|
2
|
-
import { I as state } from "./utils-jHLgqAq2.js";
|
|
3
|
-
import { r as setupGitHubToken } from "./token-Dj8XsAxn.js";
|
|
4
|
-
import { defineCommand } from "citty";
|
|
5
|
-
import consola from "consola";
|
|
6
|
-
//#region src/auth.ts
|
|
7
|
-
async function runAuth(options) {
|
|
8
|
-
if (options.verbose) {
|
|
9
|
-
consola.level = 5;
|
|
10
|
-
consola.info("Verbose logging enabled");
|
|
11
|
-
}
|
|
12
|
-
state.showToken = options.showToken;
|
|
13
|
-
await ensurePaths();
|
|
14
|
-
await setupGitHubToken({ force: true });
|
|
15
|
-
consola.success("GitHub token written to", PATHS.GITHUB_TOKEN_PATH);
|
|
16
|
-
}
|
|
17
|
-
const auth = defineCommand({
|
|
18
|
-
meta: {
|
|
19
|
-
name: "auth",
|
|
20
|
-
description: "Run GitHub auth flow without running the server"
|
|
21
|
-
},
|
|
22
|
-
args: {
|
|
23
|
-
verbose: {
|
|
24
|
-
alias: "v",
|
|
25
|
-
type: "boolean",
|
|
26
|
-
default: false,
|
|
27
|
-
description: "Enable verbose logging"
|
|
28
|
-
},
|
|
29
|
-
"show-token": {
|
|
30
|
-
type: "boolean",
|
|
31
|
-
default: false,
|
|
32
|
-
description: "Show GitHub token on auth"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
run({ args }) {
|
|
36
|
-
return runAuth({
|
|
37
|
-
verbose: args.verbose,
|
|
38
|
-
showToken: args["show-token"]
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
//#endregion
|
|
43
|
-
export { auth };
|
|
44
|
-
|
|
45
|
-
//# sourceMappingURL=auth-BHa2OHXf.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-BHa2OHXf.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { state } from \"./lib/state\"\nimport { setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n verbose: boolean\n showToken: boolean\n}\n\nexport async function runAuth(options: RunAuthOptions): Promise<void> {\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 setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n}\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run GitHub auth flow without running the server\",\n },\n args: {\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show GitHub token on auth\",\n },\n },\n run({ args }) {\n return runAuth({\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":";;;;;;AAcA,eAAsB,QAAQ,SAAwC;CACpE,IAAI,QAAQ,SAAS;EACnB,QAAQ,QAAQ;EAChB,QAAQ,KAAK,0BAA0B;;CAGzC,MAAM,YAAY,QAAQ;CAE1B,MAAM,aAAa;CACnB,MAAM,iBAAiB,EAAE,OAAO,MAAM,CAAC;CACvC,QAAQ,QAAQ,2BAA2B,MAAM,kBAAkB;;AAGrE,MAAa,OAAO,cAAc;CAChC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM;EACJ,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACD,cAAc;GACZ,MAAM;GACN,SAAS;GACT,aAAa;GACd;EACF;CACD,IAAI,EAAE,QAAQ;EACZ,OAAO,QAAQ;GACb,SAAS,KAAK;GACd,WAAW,KAAK;GACjB,CAAC;;CAEL,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-C_TBkyUw.js","names":[],"sources":["../src/debug.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\nimport fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { PATHS } from \"./lib/paths\"\n\ninterface DebugInfo {\n version: string\n runtime: {\n name: string\n version: string\n platform: string\n arch: string\n }\n paths: {\n APP_DIR: string\n GITHUB_TOKEN_PATH: string\n }\n tokenExists: boolean\n}\n\ninterface RunDebugOptions {\n json: boolean\n}\n\nasync function getPackageVersion(): Promise<string> {\n try {\n const packageJsonPath = fileURLToPath(\n new URL(\"../package.json\", import.meta.url),\n )\n // @ts-expect-error https://github.com/sindresorhus/eslint-plugin-unicorn/blob/v59.0.1/docs/rules/prefer-json-parse-buffer.md\n // JSON.parse() can actually parse buffers\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath)) as {\n version: string\n }\n return packageJson.version\n } catch {\n return \"unknown\"\n }\n}\n\nfunction getRuntimeInfo() {\n const isBun = typeof Bun !== \"undefined\"\n\n return {\n name: isBun ? \"bun\" : \"node\",\n version: isBun ? Bun.version : process.version.slice(1),\n platform: os.platform(),\n arch: os.arch(),\n }\n}\n\nasync function checkTokenExists(): Promise<boolean> {\n try {\n const stats = await fs.stat(PATHS.GITHUB_TOKEN_PATH)\n if (!stats.isFile()) return false\n\n const content = await fs.readFile(PATHS.GITHUB_TOKEN_PATH, \"utf8\")\n return content.trim().length > 0\n } catch {\n return false\n }\n}\n\nasync function getDebugInfo(): Promise<DebugInfo> {\n const [version, tokenExists] = await Promise.all([\n getPackageVersion(),\n checkTokenExists(),\n ])\n\n return {\n version,\n runtime: getRuntimeInfo(),\n paths: {\n APP_DIR: PATHS.APP_DIR,\n GITHUB_TOKEN_PATH: PATHS.GITHUB_TOKEN_PATH,\n },\n tokenExists,\n }\n}\n\nfunction printDebugInfoPlain(info: DebugInfo): void {\n consola.info(`copilot-api debug\n\nVersion: ${info.version}\nRuntime: ${info.runtime.name} ${info.runtime.version} (${info.runtime.platform} ${info.runtime.arch})\n\nPaths:\n- APP_DIR: ${info.paths.APP_DIR}\n- GITHUB_TOKEN_PATH: ${info.paths.GITHUB_TOKEN_PATH}\n\nToken exists: ${info.tokenExists ? \"Yes\" : \"No\"}`)\n}\n\nfunction printDebugInfoJson(info: DebugInfo): void {\n console.log(JSON.stringify(info, null, 2))\n}\n\nexport async function runDebug(options: RunDebugOptions): Promise<void> {\n const debugInfo = await getDebugInfo()\n\n if (options.json) {\n printDebugInfoJson(debugInfo)\n } else {\n printDebugInfoPlain(debugInfo)\n }\n}\n\nexport const debug = defineCommand({\n meta: {\n name: \"debug\",\n description: \"Print debug information about the application\",\n },\n args: {\n json: {\n type: \"boolean\",\n default: false,\n description: \"Output debug information as JSON\",\n },\n },\n run({ args }) {\n return runDebug({\n json: args.json,\n })\n },\n})\n"],"mappings":";;;;;;;AA6BA,eAAe,oBAAqC;CAClD,IAAI;EACF,MAAM,kBAAkB,cACtB,IAAI,IAAI,mBAAmB,OAAO,KAAK,IAAI,CAC5C;EAMD,OAHoB,KAAK,MAAM,MAAM,GAAG,SAAS,gBAAgB,CAG/C,CAAC;SACb;EACN,OAAO;;;AAIX,SAAS,iBAAiB;CACxB,MAAM,QAAQ,OAAO,QAAQ;CAE7B,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,SAAS,QAAQ,IAAI,UAAU,QAAQ,QAAQ,MAAM,EAAE;EACvD,UAAU,GAAG,UAAU;EACvB,MAAM,GAAG,MAAM;EAChB;;AAGH,eAAe,mBAAqC;CAClD,IAAI;EAEF,IAAI,EAAC,MADe,GAAG,KAAK,MAAM,kBAAkB,EACzC,QAAQ,EAAE,OAAO;EAG5B,QAAO,MADe,GAAG,SAAS,MAAM,mBAAmB,OAAO,EACnD,MAAM,CAAC,SAAS;SACzB;EACN,OAAO;;;AAIX,eAAe,eAAmC;CAChD,MAAM,CAAC,SAAS,eAAe,MAAM,QAAQ,IAAI,CAC/C,mBAAmB,EACnB,kBAAkB,CACnB,CAAC;CAEF,OAAO;EACL;EACA,SAAS,gBAAgB;EACzB,OAAO;GACL,SAAS,MAAM;GACf,mBAAmB,MAAM;GAC1B;EACD;EACD;;AAGH,SAAS,oBAAoB,MAAuB;CAClD,QAAQ,KAAK;;WAEJ,KAAK,QAAQ;WACb,KAAK,QAAQ,KAAK,GAAG,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,KAAK;;;aAGvF,KAAK,MAAM,QAAQ;uBACT,KAAK,MAAM,kBAAkB;;gBAEpC,KAAK,cAAc,QAAQ,OAAO;;AAGlD,SAAS,mBAAmB,MAAuB;CACjD,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;;AAG5C,eAAsB,SAAS,SAAyC;CACtE,MAAM,YAAY,MAAM,cAAc;CAEtC,IAAI,QAAQ,MACV,mBAAmB,UAAU;MAE7B,oBAAoB,UAAU;;AAIlC,MAAa,QAAQ,cAAc;CACjC,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,EACJ,MAAM;EACJ,MAAM;EACN,SAAS;EACT,aAAa;EACd,EACF;CACD,IAAI,EAAE,QAAQ;EACZ,OAAO,SAAS,EACd,MAAM,KAAK,MACZ,CAAC;;CAEL,CAAC"}
|
package/dist/paths-DC-mqCY3.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
//#region src/lib/paths.ts
|
|
5
|
-
const AUTH_APP = process.env.COPILOT_API_OAUTH_APP?.trim() || "";
|
|
6
|
-
const ENTERPRISE_PREFIX = process.env.COPILOT_API_ENTERPRISE_URL ? "ent_" : "";
|
|
7
|
-
const DEFAULT_DIR = path.join(os.homedir(), ".local", "share", "copilot-api");
|
|
8
|
-
const APP_DIR = process.env.COPILOT_API_HOME || DEFAULT_DIR;
|
|
9
|
-
const PATHS = {
|
|
10
|
-
APP_DIR,
|
|
11
|
-
GITHUB_TOKEN_PATH: path.join(APP_DIR, AUTH_APP, ENTERPRISE_PREFIX + "github_token"),
|
|
12
|
-
CONFIG_PATH: path.join(APP_DIR, "config.json")
|
|
13
|
-
};
|
|
14
|
-
async function ensurePaths() {
|
|
15
|
-
await fs.mkdir(path.join(PATHS.APP_DIR, AUTH_APP), { recursive: true });
|
|
16
|
-
await ensureFile(PATHS.GITHUB_TOKEN_PATH);
|
|
17
|
-
await ensureFile(PATHS.CONFIG_PATH);
|
|
18
|
-
}
|
|
19
|
-
async function ensureFile(filePath) {
|
|
20
|
-
try {
|
|
21
|
-
await fs.access(filePath, fs.constants.W_OK);
|
|
22
|
-
} catch {
|
|
23
|
-
await fs.writeFile(filePath, "");
|
|
24
|
-
await fs.chmod(filePath, 384);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
//#endregion
|
|
28
|
-
export { ensurePaths as n, PATHS as t };
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=paths-DC-mqCY3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths-DC-mqCY3.js","names":[],"sources":["../src/lib/paths.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\n\nconst AUTH_APP = process.env.COPILOT_API_OAUTH_APP?.trim() || \"\"\nconst ENTERPRISE_PREFIX = process.env.COPILOT_API_ENTERPRISE_URL ? \"ent_\" : \"\"\n\nconst DEFAULT_DIR = path.join(os.homedir(), \".local\", \"share\", \"copilot-api\")\nconst APP_DIR = process.env.COPILOT_API_HOME || DEFAULT_DIR\n\nconst GITHUB_TOKEN_PATH = path.join(\n APP_DIR,\n AUTH_APP,\n ENTERPRISE_PREFIX + \"github_token\",\n)\nconst CONFIG_PATH = path.join(APP_DIR, \"config.json\")\n\nexport const PATHS = {\n APP_DIR,\n GITHUB_TOKEN_PATH,\n CONFIG_PATH,\n}\n\nexport async function ensurePaths(): Promise<void> {\n await fs.mkdir(path.join(PATHS.APP_DIR, AUTH_APP), { recursive: true })\n await ensureFile(PATHS.GITHUB_TOKEN_PATH)\n await ensureFile(PATHS.CONFIG_PATH)\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n try {\n await fs.access(filePath, fs.constants.W_OK)\n } catch {\n await fs.writeFile(filePath, \"\")\n await fs.chmod(filePath, 0o600)\n }\n}\n"],"mappings":";;;;AAIA,MAAM,WAAW,QAAQ,IAAI,uBAAuB,MAAM,IAAI;AAC9D,MAAM,oBAAoB,QAAQ,IAAI,6BAA6B,SAAS;AAE5E,MAAM,cAAc,KAAK,KAAK,GAAG,SAAS,EAAE,UAAU,SAAS,cAAc;AAC7E,MAAM,UAAU,QAAQ,IAAI,oBAAoB;AAShD,MAAa,QAAQ;CACnB;CACA,mBATwB,KAAK,KAC7B,SACA,UACA,oBAAoB,eAMpB;CACA,aALkB,KAAK,KAAK,SAAS,cAKrC;CACD;AAED,eAAsB,cAA6B;CACjD,MAAM,GAAG,MAAM,KAAK,KAAK,MAAM,SAAS,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;CACvE,MAAM,WAAW,MAAM,kBAAkB;CACzC,MAAM,WAAW,MAAM,YAAY;;AAGrC,eAAe,WAAW,UAAiC;CACzD,IAAI;EACF,MAAM,GAAG,OAAO,UAAU,GAAG,UAAU,KAAK;SACtC;EACN,MAAM,GAAG,UAAU,UAAU,GAAG;EAChC,MAAM,GAAG,MAAM,UAAU,IAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-DvlF9a-7.js","names":["get"],"sources":["../src/lib/config.ts","../src/lib/proxy.ts"],"sourcesContent":["import consola from \"consola\"\nimport { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\n\nimport { PATHS } from \"./paths\"\n\nexport interface AppConfig {\n auth?: {\n apiKeys?: Array<string>\n adminApiKey?: string\n }\n providers?: Record<string, ProviderConfig>\n modelMappings?: Record<string, string>\n extraPrompts?: Record<string, string>\n smallModel?: string\n responsesApiContextManagementModels?: Array<string>\n modelReasoningEfforts?: Record<\n string,\n \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"\n >\n useMessagesApi?: boolean\n useResponsesApiWebSocket?: boolean\n anthropicApiKey?: string\n useResponsesApiWebSearch?: boolean\n claudeTokenMultiplier?: number\n}\n\nexport interface ModelConfig {\n temperature?: number\n topP?: number\n topK?: number\n extraBody?: Record<string, unknown>\n contextCache?: boolean\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n}\n\nexport type ProviderAuthType = \"authorization\" | \"x-api-key\"\nexport type ProviderType = \"anthropic\" | \"openai-compatible\"\nexport type ToolContentSupportType = \"array\" | \"image\" | \"pdf\"\n\nexport interface ProviderConfig {\n type?: string\n enabled?: boolean\n baseUrl?: string\n apiKey?: string\n authType?: ProviderAuthType\n models?: Record<string, ModelConfig>\n adjustInputTokens?: boolean\n}\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n apiKey: string\n authType: ProviderAuthType\n models?: Record<string, ModelConfig>\n adjustInputTokens?: boolean\n}\n\nconst gpt5ExplorationPrompt = `## Exploration and reading files\n- **Think first.** Before any tool call, decide ALL files/resources you will need.\n- **Batch everything.** If you need multiple files (even from different places), read them together.\n- **multi_tool_use.parallel** Use multi_tool_use.parallel to parallelize tool calls and only this.\n- **Only make sequential calls if you truly cannot know the next file without seeing a result first.**\n- **Workflow:** (a) plan all needed reads → (b) issue one parallel batch → (c) analyze results → (d) repeat if new, unpredictable reads arise.`\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nconst defaultConfig: AppConfig = {\n auth: {\n apiKeys: [],\n },\n providers: {},\n modelMappings: {},\n extraPrompts: {\n \"gpt-5-mini\": gpt5ExplorationPrompt,\n \"gpt-5.3-codex\": gpt5CommentaryPrompt,\n \"gpt-5.4-mini\": gpt5CommentaryPrompt,\n \"gpt-5.4\": gpt5CommentaryPrompt,\n \"gpt-5.5\": gpt5CommentaryPrompt,\n },\n smallModel: \"gpt-5-mini\",\n responsesApiContextManagementModels: [],\n modelReasoningEfforts: {\n \"gpt-5-mini\": \"low\",\n \"gpt-5.3-codex\": \"xhigh\",\n \"gpt-5.4-mini\": \"xhigh\",\n \"gpt-5.4\": \"xhigh\",\n \"gpt-5.5\": \"xhigh\",\n },\n useMessagesApi: true,\n useResponsesApiWebSocket: true,\n useResponsesApiWebSearch: true,\n}\n\nlet cachedConfig: AppConfig | null = null\n\nfunction normalizeAdminApiKey(adminApiKey: unknown): string | null {\n if (typeof adminApiKey !== \"string\") {\n if (adminApiKey !== undefined) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n }\n return null\n }\n\n const normalizedAdminApiKey = adminApiKey.trim()\n if (!normalizedAdminApiKey) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n return null\n }\n\n return normalizedAdminApiKey\n}\n\nfunction generateAdminApiKey(): string {\n return randomBytes(32).toString(\"hex\")\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nfunction ensureConfigFile(): void {\n try {\n fs.accessSync(PATHS.CONFIG_PATH, fs.constants.R_OK | fs.constants.W_OK)\n } catch {\n fs.mkdirSync(PATHS.APP_DIR, { recursive: true })\n fs.writeFileSync(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n \"utf8\",\n )\n try {\n fs.chmodSync(PATHS.CONFIG_PATH, 0o600)\n } catch {\n return\n }\n }\n}\n\nfunction readConfigFromDisk(): AppConfig {\n ensureConfigFile()\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n fs.writeFileSync(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n \"utf8\",\n )\n return defaultConfig\n }\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n consola.error(\"Failed to read config file, using default config\", error)\n return defaultConfig\n }\n}\n\nfunction readEditableConfigFromDisk(): AppConfig {\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n return {}\n }\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {}\n }\n if (error instanceof SyntaxError) {\n throw new Error(`Config file is not valid JSON: ${PATHS.CONFIG_PATH}`)\n }\n throw error\n }\n}\n\nfunction writeConfigToDisk(config: AppConfig): void {\n fs.mkdirSync(PATHS.APP_DIR, { recursive: true })\n fs.writeFileSync(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(config, null, 2)}\\n`,\n \"utf8\",\n )\n}\n\nfunction mergeDefaultConfig(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const extraPrompts = config.extraPrompts ?? {}\n const defaultExtraPrompts = defaultConfig.extraPrompts ?? {}\n const modelReasoningEfforts = config.modelReasoningEfforts ?? {}\n const defaultModelReasoningEfforts = defaultConfig.modelReasoningEfforts ?? {}\n\n const missingExtraPromptModels = Object.keys(defaultExtraPrompts).filter(\n (model) => !Object.hasOwn(extraPrompts, model),\n )\n\n const missingReasoningEffortModels = Object.keys(\n defaultModelReasoningEfforts,\n ).filter((model) => !Object.hasOwn(modelReasoningEfforts, model))\n\n const hasExtraPromptChanges = missingExtraPromptModels.length > 0\n const hasReasoningEffortChanges = missingReasoningEffortModels.length > 0\n\n if (!hasExtraPromptChanges && !hasReasoningEffortChanges) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n extraPrompts: {\n ...defaultExtraPrompts,\n ...extraPrompts,\n },\n modelReasoningEfforts: {\n ...defaultModelReasoningEfforts,\n ...modelReasoningEfforts,\n },\n },\n changed: true,\n }\n}\n\nfunction ensureAdminApiKey(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const normalizedAdminApiKey = normalizeAdminApiKey(config.auth?.adminApiKey)\n if (normalizedAdminApiKey) {\n if (config.auth?.adminApiKey === normalizedAdminApiKey) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n auth: {\n ...(config.auth ?? {}),\n adminApiKey: normalizedAdminApiKey,\n },\n },\n changed: true,\n }\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const { mergedConfig } = mergeDefaultConfig({\n ...editableConfig,\n auth: {\n ...(editableConfig.auth ?? {}),\n adminApiKey: generateAdminApiKey(),\n },\n })\n\n return { mergedConfig, changed: true }\n}\n\nexport function mergeConfigWithDefaults(): AppConfig {\n const config = readConfigFromDisk()\n const { mergedConfig, changed } = mergeDefaultConfig(config)\n const {\n mergedConfig: mergedConfigWithAdminApiKey,\n changed: adminApiKeyChanged,\n } = ensureAdminApiKey(mergedConfig)\n const shouldPersistConfig = changed || adminApiKeyChanged\n\n if (shouldPersistConfig) {\n try {\n writeConfigToDisk(mergedConfigWithAdminApiKey)\n } catch (writeError) {\n if (adminApiKeyChanged) {\n throw writeError\n }\n\n consola.warn(\n \"Failed to write merged extraPrompts to config file\",\n writeError,\n )\n }\n }\n\n cachedConfig = mergedConfigWithAdminApiKey\n return mergedConfigWithAdminApiKey\n}\n\nexport function getConfig(): AppConfig {\n cachedConfig ??= mergeDefaultConfig(readConfigFromDisk()).mergedConfig\n return cachedConfig\n}\n\nexport function reloadConfig(): AppConfig {\n return mergeConfigWithDefaults()\n}\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n return config.extraPrompts?.[model] ?? \"\"\n}\n\nexport function getModelMappings(): Record<string, string> {\n const config = getConfig()\n const modelMappings = config.modelMappings\n if (!modelMappings) {\n return { ...(defaultConfig.modelMappings ?? {}) }\n }\n\n const validMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (\n !sourceModel\n || typeof targetModel !== \"string\"\n || targetModel.length === 0\n ) {\n continue\n }\n validMappings[sourceModel] = targetModel\n }\n\n return validMappings\n}\n\nfunction validateModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const validatedMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (!sourceModel || !targetModel) {\n throw new Error(\n \"Each model mapping must use non-empty source and target values.\",\n )\n }\n validatedMappings[sourceModel] = targetModel\n }\n\n return validatedMappings\n}\n\nexport function setModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const nextConfig = {\n ...readEditableConfigFromDisk(),\n modelMappings: validateModelMappings(modelMappings),\n }\n\n writeConfigToDisk(nextConfig)\n cachedConfig = reloadConfig()\n return getModelMappings()\n}\n\nexport function resolveMappedModel(model: string): string {\n return getModelMappings()[model] ?? model\n}\n\nexport function getSmallModel(): string {\n const config = getConfig()\n return config.smallModel ?? \"gpt-5-mini\"\n}\n\nexport function getResponsesApiContextManagementModels(): Array<string> {\n const config = getConfig()\n return (\n config.responsesApiContextManagementModels\n ?? defaultConfig.responsesApiContextManagementModels\n ?? []\n )\n}\n\nexport function isResponsesApiContextManagementModel(model: string): boolean {\n return getResponsesApiContextManagementModels().includes(model)\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" {\n const config = getConfig()\n return config.modelReasoningEfforts?.[model] ?? \"high\"\n}\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"openai-compatible\" ? \"authorization\" : \"x-api-key\"\n}\n\nexport function resolveProviderAuthType(\n providerName: string,\n authType: string | undefined,\n providerType: ProviderType,\n): ProviderAuthType {\n if (authType === undefined) {\n return getDefaultProviderAuthType(providerType)\n }\n\n if (authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"authorization\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', falling back to ${getDefaultProviderAuthType(providerType)}`,\n )\n return getDefaultProviderAuthType(providerType)\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n const provider = config.providers?.[providerName]\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? \"anthropic\"\n if (type !== \"anthropic\" && type !== \"openai-compatible\") {\n consola.warn(\n `Provider ${providerName} is ignored because type '${type}' is not supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const apiKey = (provider.apiKey ?? \"\").trim()\n const authType = resolveProviderAuthType(\n providerName,\n provider.authType,\n type,\n )\n if (!baseUrl || !apiKey) {\n consola.warn(\n `Provider ${providerName} is enabled but missing baseUrl or apiKey`,\n )\n return null\n }\n\n return {\n name: providerName,\n type,\n baseUrl,\n apiKey,\n authType,\n models: provider.models,\n adjustInputTokens: provider.adjustInputTokens,\n }\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter((name) => getProviderConfig(name) !== null)\n}\n\nexport function isMessagesApiEnabled(): boolean {\n const config = getConfig()\n return config.useMessagesApi ?? true\n}\n\nexport function isResponsesApiWebSocketEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSocket ?? true\n}\n\nexport function getAnthropicApiKey(): string | undefined {\n const config = getConfig()\n return config.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY ?? undefined\n}\n\nexport function isResponsesApiWebSearchEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSearch ?? true\n}\n\nexport function getClaudeTokenMultiplier(): number {\n const config = getConfig()\n return config.claudeTokenMultiplier ?? 1.15\n}\n","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"],"mappings":"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"}
|