@jeffreycao/copilot-api 2.7.40 → 2.7.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth-IX3bOao0.js +1 -0
- package/dist/{auth-ByQjInU9.js → auth-mWM5qL2k.js} +3 -3
- package/dist/{auth-ByQjInU9.js.map → auth-mWM5qL2k.js.map} +1 -1
- package/dist/{config-BqSuE5h5.js → config-iQblHCkd.js} +13 -1
- package/dist/{config-BqSuE5h5.js.map → config-iQblHCkd.js.map} +1 -1
- package/dist/{copilot-runtime-D6YjAamL.js → copilot-runtime-CyB0L4lt.js} +2 -2
- package/dist/{copilot-runtime-D6YjAamL.js.map → copilot-runtime-CyB0L4lt.js.map} +1 -1
- package/dist/{debug-RUUyusA_.js → debug-B-XA6AD4.js} +2 -2
- package/dist/{debug-RUUyusA_.js.map → debug-B-XA6AD4.js.map} +1 -1
- package/dist/main.js +3 -3
- package/dist/{server-DhHL2SxL.js → server-BCdcNCtc.js} +189 -7
- package/dist/server-BCdcNCtc.js.map +1 -0
- package/dist/{start-CxJBWBbt.js → start-DEWKs2S3.js} +6 -6
- package/dist/{start-CxJBWBbt.js.map → start-DEWKs2S3.js.map} +1 -1
- package/dist/{token-CNWvfwYi.js → token-D_b2AmEW.js} +8 -6
- package/dist/token-D_b2AmEW.js.map +1 -0
- package/package.json +1 -1
- package/pages/index.html +5 -2
- package/dist/auth-BVjOyO_F.js +0 -1
- package/dist/server-DhHL2SxL.js.map +0 -1
- package/dist/token-CNWvfwYi.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-D_b2AmEW.js","names":["toError","toAbortReason","isConfiguredResponsesApiWebSocketEnabled","CLIENT_ID","SCOPE","REFRESH_BUFFER_MS","getAccountId","delay","delay","COPILOT_WEBSOCKET_VERSION","delay"],"sources":["../src/lib/internal-headers.ts","../src/services/responses-websocket.ts","../src/services/responses-websocket-helpers.ts","../src/services/responses-http.ts","../src/services/upstream-http.ts","../src/lib/request-context.ts","../src/services/codex/create-responses.ts","../src/lib/oauth/codex.ts","../src/lib/oauth/xai.ts","../src/lib/credential-store.ts","../src/lib/oauth-accounts.ts","../src/lib/xai-token.ts","../src/lib/request-auth.ts","../src/lib/compact.ts","../src/lib/opencode.ts","../src/lib/api-config.ts","../src/services/github/get-copilot-token.ts","../src/services/github/get-copilot-usage.ts","../src/services/github/get-device-code.ts","../src/lib/utils.ts","../src/services/github/poll-access-token.ts","../src/lib/token.ts"],"sourcesContent":["export const FULL_MODEL_CATALOG_HEADER = \"x-full-model-catalog\"\n\nexport function stripInternalRequestHeaders(headers: Headers): Headers {\n const forwarded = new Headers(headers)\n forwarded.delete(FULL_MODEL_CATALOG_HEADER)\n return forwarded\n}\n","import consola from \"consola\"\nimport { getProxyForUrl } from \"proxy-from-env\"\nimport { WebSocket } from \"undici\"\n\nexport interface PooledWebSocketRequest<TPayload> {\n headers: Record<string, string>\n payload: TPayload\n // Refresh request metadata after the socket is ready, immediately before send.\n preparePayload?: (payload: TPayload) => TPayload\n poolKey: string\n // Optional cancellation for a single pooled request. The Responses and Codex\n // request paths deliberately leave it unset: a client disconnect now drains\n // the upstream instead of cancelling it, because aborting here closes the\n // shared pooled socket and invalidates it for other in-flight requests.\n // Keep this hook for callers that own the lifecycle end to end (and for a\n // future bounded drain deadline).\n signal?: AbortSignal\n url: string\n}\n\n// \"continue\": not a terminal chunk. \"reuse\": terminal, the socket may return to\n// the pool. \"discard\": terminal, the socket must be closed instead of pooled.\nexport type PooledWebSocketTerminalDisposition =\n | \"continue\"\n | \"discard\"\n | \"reuse\"\n\nexport interface PooledWebSocketStreamOptions<TChunk> {\n createChunk: (data: string) => TChunk\n getTerminalDisposition: (chunk: TChunk) => PooledWebSocketTerminalDisposition\n maxBufferedBytes: number\n maxBufferedMessages: number\n openErrorMessage: string\n openTimeoutMs: number\n poolIdleTimeoutMs: number\n streamErrorMessage: string\n streamInactivityTimeoutMs: number\n terminalChunkMissingMessage: string\n unavailableErrorMessage?: string\n}\n\ntype WebSocketInstance = InstanceType<typeof WebSocket>\ntype WebSocketErrorEvent = Parameters<\n NonNullable<WebSocketInstance[\"onerror\"]>\n>[0]\ntype WebSocketMessageListener = (event: { data: unknown }) => void\n\nconst websocketPool = new Map<string, PooledWebSocketEntry>()\nconst websocketActiveRequests = new Map<string, number>()\n\ninterface PooledWebSocketEntry {\n closed: boolean\n idleMessageListener: WebSocketMessageListener | null\n idleTimer: ReturnType<typeof setTimeout> | null\n poolIdleTimeoutMs: number\n requestCount: number\n websocket: WebSocketInstance | null\n websocketPromise: Promise<WebSocketInstance>\n}\n\ninterface PooledWebSocketRequestTarget {\n entry: PooledWebSocketEntry\n pooled: boolean\n}\n\ninterface BufferedWebSocketMessage {\n data: Promise<string>\n size: number\n}\n\nexport class ResponsesWebSocketOpenTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Responses websocket did not open within ${timeoutMs}ms`)\n this.name = \"ResponsesWebSocketOpenTimeoutError\"\n }\n}\n\nexport class ResponsesWebSocketInactivityTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Responses websocket stream was inactive for ${timeoutMs}ms`)\n this.name = \"ResponsesWebSocketInactivityTimeoutError\"\n }\n}\n\nexport class ResponsesWebSocketBufferOverflowError extends Error {\n constructor(maxBufferedBytes: number, maxBufferedMessages: number) {\n super(\n `Responses websocket buffer exceeded ${maxBufferedBytes} bytes or ${maxBufferedMessages} messages; downstream consumption is too slow`,\n )\n this.name = \"ResponsesWebSocketBufferOverflowError\"\n }\n}\n\nexport class WebSocketMessageBuffer {\n private readonly entries: Array<BufferedWebSocketMessage | undefined> = []\n private head = 0\n private readonly maxBufferedBytes: number\n private readonly maxBufferedMessages: number\n private sizeBytes = 0\n\n constructor(maxBufferedBytes: number, maxBufferedMessages: number) {\n this.maxBufferedBytes = maxBufferedBytes\n this.maxBufferedMessages = maxBufferedMessages\n }\n\n get bufferedBytes(): number {\n return this.sizeBytes\n }\n\n get bufferedMessages(): number {\n return this.entries.length - this.head\n }\n\n enqueue(data: unknown): boolean {\n const size = getWebSocketMessageSize(data)\n if (\n this.sizeBytes + size > this.maxBufferedBytes\n || this.bufferedMessages + 1 > this.maxBufferedMessages\n ) {\n return false\n }\n\n this.entries.push({\n data: normalizeWebSocketMessageData(data),\n size,\n })\n this.sizeBytes += size\n return true\n }\n\n dequeue(): Promise<string> | undefined {\n const entry = this.entries[this.head]\n if (!entry) return undefined\n\n this.entries[this.head] = undefined\n this.head += 1\n this.sizeBytes -= entry.size\n this.compactIfNeeded()\n return entry.data\n }\n\n clear(): void {\n this.entries.length = 0\n this.head = 0\n this.sizeBytes = 0\n }\n\n private compactIfNeeded(): void {\n if (this.head < 256 || this.head * 2 < this.entries.length) return\n this.entries.splice(0, this.head)\n this.head = 0\n }\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 throwIfAborted(request.signal)\n const { entry, pooled } = getPooledWebSocketRequestTarget(request, options)\n const release = acquirePooledWebSocketEntry(request.poolKey, entry, pooled)\n let messageStream: WebSocketMessageStream | null = null\n let reusable = false\n\n try {\n const websocket = await getReadyPooledWebSocket(\n request.poolKey,\n entry,\n pooled,\n options,\n )\n throwIfAborted(request.signal)\n messageStream = createWebSocketMessageStream(\n websocket,\n request.signal,\n options,\n )\n messageStream.start()\n const payload = request.preparePayload?.(request.payload) ?? request.payload\n websocket.send(JSON.stringify(payload))\n\n for await (const data of messageStream.iterable) {\n const chunk = options.createChunk(data)\n const disposition = options.getTerminalDisposition(chunk)\n const isTerminal = disposition !== \"continue\"\n if (isTerminal) {\n messageStream.complete()\n reusable = disposition === \"reuse\"\n // Drop the socket from the pool before yielding so no later request\n // can pick it up while the consumer is still handling this chunk.\n if (!reusable) removePooledWebSocketEntry(request.poolKey, entry)\n }\n\n yield chunk\n\n if (isTerminal) {\n return\n }\n }\n\n throw new Error(options.terminalChunkMissingMessage)\n } catch (error) {\n throw toError(error)\n } finally {\n messageStream?.dispose()\n if (!reusable) removePooledWebSocketEntry(request.poolKey, entry)\n release(reusable)\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 consola.debug(\"websocket from pool\")\n clearPooledWebSocketIdleState(existing)\n return { entry: existing, pooled: true }\n }\n\n const entry = createPooledWebSocketEntry(request, options)\n websocketPool.set(request.poolKey, entry)\n return { entry, pooled: true }\n}\n\nconst createPooledWebSocketEntry = <TPayload, TChunk>(\n request: PooledWebSocketRequest<TPayload>,\n options: PooledWebSocketStreamOptions<TChunk>,\n): PooledWebSocketEntry => {\n const websocketPromise = openWebSocket({\n headers: request.headers,\n openErrorMessage: options.openErrorMessage,\n openTimeoutMs: options.openTimeoutMs,\n signal: request.signal,\n url: request.url,\n })\n const entry: PooledWebSocketEntry = {\n closed: false,\n idleMessageListener: null,\n idleTimer: null,\n poolIdleTimeoutMs: options.poolIdleTimeoutMs,\n requestCount: 0,\n websocket: null,\n websocketPromise,\n }\n\n entry.websocketPromise\n .then((websocket) => {\n entry.websocket = websocket\n websocket.addEventListener(\"close\", () => {\n removePooledWebSocketEntry(request.poolKey, entry)\n })\n websocket.addEventListener(\"error\", () => {\n removePooledWebSocketEntry(request.poolKey, entry)\n })\n })\n .catch((error: unknown) => {\n removePooledWebSocketEntry(request.poolKey, entry)\n if (!request.signal?.aborted) {\n consola.warn(\"\", error)\n }\n })\n\n return entry\n}\n\nconst acquirePooledWebSocketEntry = (\n poolKey: string,\n entry: PooledWebSocketEntry,\n pooled: boolean,\n): ((reusable: boolean) => void) => {\n clearPooledWebSocketIdleState(entry)\n incrementPooledWebSocketActiveRequestCount(poolKey)\n entry.requestCount += 1\n\n let released = false\n return (reusable) => {\n if (released) return\n released = true\n entry.requestCount -= 1\n decrementPooledWebSocketActiveRequestCount(poolKey)\n\n if (!reusable) {\n removePooledWebSocketEntry(poolKey, entry)\n return\n }\n if (entry.closed || entry.requestCount > 0) return\n\n if (pooled && websocketPool.get(poolKey) === entry) {\n schedulePooledWebSocketIdleClose(poolKey, entry)\n return\n }\n\n removePooledWebSocketEntry(poolKey, entry)\n }\n}\n\nconst getReadyPooledWebSocket = async <TChunk>(\n poolKey: string,\n entry: PooledWebSocketEntry,\n pooled: boolean,\n options: PooledWebSocketStreamOptions<TChunk>,\n): Promise<WebSocketInstance> => {\n const unavailableErrorMessage =\n options.unavailableErrorMessage\n ?? \"Websocket connection became unavailable before the request started\"\n\n if (entry.closed) throw new Error(unavailableErrorMessage)\n\n const websocket = await entry.websocketPromise\n if (entry.closed || (pooled && websocketPool.get(poolKey) !== entry)) {\n throw new Error(unavailableErrorMessage)\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 = (\n poolKey: string,\n entry: PooledWebSocketEntry,\n): void => {\n clearPooledWebSocketIdleState(entry)\n const websocket = entry.websocket\n if (!websocket || websocket.readyState !== WebSocket.OPEN) {\n removePooledWebSocketEntry(poolKey, entry)\n return\n }\n\n entry.idleMessageListener = () => {\n removePooledWebSocketEntry(poolKey, entry)\n }\n websocket.addEventListener(\"message\", entry.idleMessageListener)\n\n entry.idleTimer = setTimeout(() => {\n removePooledWebSocketEntry(poolKey, entry)\n }, entry.poolIdleTimeoutMs)\n unrefTimer(entry.idleTimer)\n}\n\nconst clearPooledWebSocketIdleState = (entry: PooledWebSocketEntry): void => {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer)\n entry.idleTimer = null\n }\n if (entry.websocket && entry.idleMessageListener) {\n entry.websocket.removeEventListener(\"message\", entry.idleMessageListener)\n entry.idleMessageListener = 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 } else {\n websocketActiveRequests.set(poolKey, nextCount)\n }\n}\n\nconst removePooledWebSocketEntry = (\n poolKey: string,\n entry: PooledWebSocketEntry,\n): void => {\n if (websocketPool.get(poolKey) === entry) websocketPool.delete(poolKey)\n if (entry.closed) return\n\n entry.closed = true\n clearPooledWebSocketIdleState(entry)\n entry.websocketPromise.then(closeWebSocket).catch(() => {})\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 === \"\") return new Error(message)\n\n const cause = toError(reason)\n return new Error(`${message}: ${cause.message}`, { cause })\n}\n\nconst openWebSocket = async ({\n headers,\n openErrorMessage,\n openTimeoutMs,\n signal,\n url,\n}: {\n headers: Record<string, string>\n openErrorMessage: string\n openTimeoutMs: number\n signal?: AbortSignal\n url: string\n}): Promise<WebSocketInstance> =>\n await new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(toAbortReason(signal.reason))\n return\n }\n\n const proxy = typeof Bun === \"undefined\" ? undefined : getProxyUrl(url)\n const init = { headers, ...(proxy ? { proxy } : {}) }\n // Desktop bundles inline undici, bypassing Bun's native module replacement.\n // Select Bun's native client explicitly so compression and proxy work there.\n const WebSocketClient =\n typeof Bun === \"undefined\" ? WebSocket : (\n (globalThis.WebSocket as unknown as typeof WebSocket)\n )\n const websocket = new WebSocketClient(url, init)\n let settled = false\n const timer = setTimeout(() => {\n fail(new ResponsesWebSocketOpenTimeoutError(openTimeoutMs))\n }, openTimeoutMs)\n\n const cleanup = () => {\n clearTimeout(timer)\n signal?.removeEventListener(\"abort\", onAbort)\n websocket.removeEventListener(\"open\", onOpen)\n websocket.removeEventListener(\"close\", onClose)\n websocket.removeEventListener(\"error\", onError)\n }\n\n const fail = (error: Error) => {\n if (settled) return\n settled = true\n cleanup()\n closeWebSocket(websocket)\n reject(error)\n }\n\n const onAbort = () => fail(toAbortReason(signal?.reason))\n const onOpen = () => {\n if (settled) return\n settled = true\n cleanup()\n resolve(websocket)\n }\n const onClose = () => fail(new Error(openErrorMessage))\n const onError = (event: WebSocketErrorEvent) => {\n fail(createWebSocketError(openErrorMessage, event))\n }\n\n signal?.addEventListener(\"abort\", onAbort, { once: true })\n websocket.addEventListener(\"open\", onOpen)\n websocket.addEventListener(\"close\", onClose)\n websocket.addEventListener(\"error\", onError)\n })\n\ninterface WebSocketMessageStream {\n complete: () => void\n dispose: () => void\n iterable: AsyncIterable<string>\n start: () => void\n}\n\nconst createWebSocketMessageStream = <TChunk>(\n websocket: WebSocketInstance,\n signal: AbortSignal | undefined,\n options: PooledWebSocketStreamOptions<TChunk>,\n): WebSocketMessageStream => {\n const buffer = new WebSocketMessageBuffer(\n options.maxBufferedBytes,\n options.maxBufferedMessages,\n )\n let closed = false\n let disposed = false\n let error: Error | null = null\n let inactivityTimer: ReturnType<typeof setTimeout> | null = null\n let notify: (() => void) | null = null\n\n const wake = () => {\n notify?.()\n notify = null\n }\n\n const clearInactivityTimer = () => {\n if (!inactivityTimer) return\n clearTimeout(inactivityTimer)\n inactivityTimer = null\n }\n\n const fail = (nextError: Error, close = true) => {\n if (error || disposed) return\n error = nextError\n clearInactivityTimer()\n buffer.clear()\n if (close) closeWebSocket(websocket)\n wake()\n }\n\n const resetInactivityTimer = () => {\n clearInactivityTimer()\n if (disposed || closed || error) return\n inactivityTimer = setTimeout(() => {\n fail(\n new ResponsesWebSocketInactivityTimeoutError(\n options.streamInactivityTimeoutMs,\n ),\n )\n }, options.streamInactivityTimeoutMs)\n }\n\n const onMessage = (event: { data: unknown }) => {\n resetInactivityTimer()\n if (!buffer.enqueue(event.data)) {\n fail(\n new ResponsesWebSocketBufferOverflowError(\n options.maxBufferedBytes,\n options.maxBufferedMessages,\n ),\n )\n return\n }\n wake()\n }\n\n const onClose = (event: CloseEvent) => {\n consola.debug(\"WebSocket closed\", {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n })\n closed = true\n clearInactivityTimer()\n wake()\n }\n\n const onError = (event: WebSocketErrorEvent) => {\n consola.error(\"WebSocket error:\", event, event.error)\n fail(createWebSocketError(options.streamErrorMessage, event), false)\n }\n\n const onAbort = () => fail(toAbortReason(signal?.reason))\n\n websocket.addEventListener(\"message\", onMessage)\n websocket.addEventListener(\"close\", onClose)\n websocket.addEventListener(\"error\", onError)\n signal?.addEventListener(\"abort\", onAbort, { once: true })\n\n const dispose = () => {\n if (disposed) return\n disposed = true\n clearInactivityTimer()\n buffer.clear()\n websocket.removeEventListener(\"message\", onMessage)\n websocket.removeEventListener(\"close\", onClose)\n websocket.removeEventListener(\"error\", onError)\n signal?.removeEventListener(\"abort\", onAbort)\n wake()\n }\n\n const iterable = (async function* (): AsyncIterable<string> {\n try {\n while (true) {\n const item = buffer.dequeue()\n if (item) {\n yield await item\n continue\n }\n if (error) throw toError(error)\n if (closed) return\n\n await new Promise<void>((resolve) => {\n notify = resolve\n })\n }\n } finally {\n dispose()\n }\n })()\n\n return {\n complete: clearInactivityTimer,\n dispose,\n iterable,\n start: resetInactivityTimer,\n }\n}\n\nconst normalizeWebSocketMessageData = async (\n data: unknown,\n): Promise<string> => {\n if (typeof data === \"string\") return data\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data)\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(\n new Uint8Array(\n data.buffer as ArrayBuffer,\n data.byteOffset,\n data.byteLength,\n ),\n )\n }\n if (isTextReadable(data)) return await data.text()\n return String(data)\n}\n\nconst getWebSocketMessageSize = (data: unknown): number => {\n if (typeof data === \"string\") return new TextEncoder().encode(data).byteLength\n if (data instanceof ArrayBuffer) return data.byteLength\n if (ArrayBuffer.isView(data)) return data.byteLength\n if (isSized(data)) return data.size\n return new TextEncoder().encode(String(data)).byteLength\n}\n\nconst isTextReadable = (\n value: unknown,\n): value is { text: () => Promise<string> } =>\n Boolean(\n value\n && typeof value === \"object\"\n && \"text\" in value\n && typeof (value as { text?: unknown }).text === \"function\",\n )\n\nconst isSized = (value: unknown): value is { size: number } =>\n Boolean(\n value\n && typeof value === \"object\"\n && \"size\" in value\n && typeof (value as { size?: unknown }).size === \"number\",\n )\n\nconst toAbortReason = (reason: unknown): Error => {\n if (reason instanceof Error) return reason\n const error = new Error(\"The operation was aborted\")\n error.name = \"AbortError\"\n return error\n}\n\nconst throwIfAborted = (signal: AbortSignal | undefined): void => {\n if (signal?.aborted) throw toAbortReason(signal.reason)\n}\n\nconst toError = (value: unknown): Error => {\n if (value instanceof Error) return value\n return new Error(String(value))\n}\n\nconst closeWebSocket = (websocket: WebSocketInstance): void => {\n if (\n websocket.readyState !== WebSocket.CONNECTING\n && websocket.readyState !== WebSocket.OPEN\n ) {\n return\n }\n try {\n websocket.close()\n } catch {\n // Some implementations reject close() while CONNECTING. The open\n // listeners have already been detached, so the socket cannot be reused.\n }\n}\n\nconst getProxyUrl = (url: string): string =>\n getProxyForUrl(url.replace(/^wss:/u, \"https:\").replace(/^ws:/u, \"http:\"))\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","import type { ResponseErrorEvent } from \"~/lib/types/responses\"\nimport type { PooledWebSocketTerminalDisposition } from \"~/services/responses-websocket\"\n\nexport interface ResponsesStreamErrorChunk {\n data?: string\n event?: string\n}\n\nexport const encodePoolKeyPart = (value: string): string =>\n encodeURIComponent(value)\n\nexport const getErrorMessage = (error: unknown): string => {\n if (error instanceof Error && error.message) {\n return error.message\n }\n\n return String(error)\n}\n\nexport const createResponsesErrorServerSentEventChunk = (\n message: string,\n): ResponsesStreamErrorChunk => {\n const errorEvent: ResponseErrorEvent = {\n code: null,\n message,\n param: null,\n sequence_number: 0,\n type: \"error\",\n }\n\n return {\n event: errorEvent.type,\n data: JSON.stringify(errorEvent),\n }\n}\n\n// A failed response (`error` or `response.failed`) can leave the upstream\n// connection in a state where the next request sent on it fails as well, so\n// the socket is discarded instead of being returned to the pool.\nexport const getResponsesStreamTerminalDisposition = (chunk: {\n data?: string\n event?: string\n}): PooledWebSocketTerminalDisposition => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return \"continue\"\n }\n\n try {\n // WebSocket decoders already extracted the event type. Parse only for\n // callers that provide a raw chunk without event metadata.\n const type =\n chunk.event === undefined ?\n (JSON.parse(chunk.data) as { type?: unknown }).type\n : chunk.event\n\n if (type === \"error\" || type === \"response.failed\") {\n return \"discard\"\n }\n\n if (type === \"response.completed\" || type === \"response.incomplete\") {\n return \"reuse\"\n }\n\n return \"continue\"\n } catch {\n return \"continue\"\n }\n}\n\nexport const createResponsesSafeStream = async function* <\n TChunk extends ResponsesStreamErrorChunk,\n>(\n source: AsyncIterable<TChunk>,\n options: { signal?: AbortSignal } = {},\n): AsyncGenerator<TChunk, void, unknown> {\n try {\n yield* source\n } catch (error) {\n if (options.signal?.aborted || isAbortError(error)) {\n return\n }\n // The cast relies on TChunk staying shape-compatible with the error chunk\n // ({ data, event } only, no required extra fields). Keep new call sites\n // within that constraint.\n yield createResponsesErrorServerSentEventChunk(\n getErrorMessage(error),\n ) as TChunk\n }\n}\n\nconst isAbortError = (error: unknown): boolean =>\n error instanceof Error && error.name === \"AbortError\"\n","import { events, type ServerSentEventMessage } from \"fetch-event-stream\"\n\nexport const createResponsesHttpEventStream = async function* (\n response: Response,\n): AsyncGenerator<ServerSentEventMessage, void, unknown> {\n const responseBody = response.body\n if (!responseBody) return\n\n const reader =\n responseBody.getReader() as ReadableStreamDefaultReader<Uint8Array>\n const readerBackedBody = new ReadableStream<Uint8Array>({\n async pull(controller) {\n const result = await reader.read()\n if (result.done) {\n controller.close()\n return\n }\n\n controller.enqueue(result.value)\n },\n async cancel(reason) {\n await reader.cancel(reason)\n },\n })\n\n try {\n yield* events(new Response(readerBackedBody))\n } finally {\n try {\n await reader.cancel()\n } catch {\n // The managed response may already have failed or been cancelled.\n } finally {\n reader.releaseLock()\n }\n }\n}\n","import {\n UpstreamHeadersTimeoutError,\n UpstreamStreamInactivityTimeoutError,\n} from \"~/lib/error\"\n\nexport interface UpstreamHttpLifecycleOptions {\n clientSignal?: AbortSignal\n headersTimeoutMs: number\n streamInactivityTimeoutMs: number\n}\n\nexport async function fetchUpstreamWithLifecycle(\n input: string | URL | Request,\n init: RequestInit,\n options: UpstreamHttpLifecycleOptions,\n): Promise<Response> {\n options.clientSignal?.throwIfAborted()\n const lifecycle = createRequestLifecycle(options)\n\n try {\n const response = await fetch(input, {\n ...init,\n signal: lifecycle.signal,\n })\n lifecycle.headersReceived()\n return createManagedResponse(response, lifecycle, options)\n } catch (error) {\n throw lifecycle.finishWithError(error)\n }\n}\n\ninterface RequestLifecycle {\n abort: (reason: Error) => void\n finish: () => void\n finishWithError: (error: unknown) => Error\n headersReceived: () => void\n signal: AbortSignal\n}\n\nconst createRequestLifecycle = (\n options: UpstreamHttpLifecycleOptions,\n): RequestLifecycle => {\n const controller = new AbortController()\n let finished = false\n let headersTimer: ReturnType<typeof setTimeout> | null = setTimeout(() => {\n controller.abort(new UpstreamHeadersTimeoutError(options.headersTimeoutMs))\n }, options.headersTimeoutMs)\n\n const clearHeadersTimer = () => {\n if (headersTimer === null) return\n clearTimeout(headersTimer)\n headersTimer = null\n }\n\n const finish = () => {\n if (finished) return\n finished = true\n clearHeadersTimer()\n }\n\n return {\n abort: (reason) => {\n if (!controller.signal.aborted) controller.abort(reason)\n },\n finish,\n finishWithError: (error) => {\n const reason = controller.signal.reason as unknown\n finish()\n return reason instanceof Error ? reason : toError(error)\n },\n headersReceived: clearHeadersTimer,\n signal: controller.signal,\n }\n}\n\nconst createManagedResponse = (\n response: Response,\n lifecycle: RequestLifecycle,\n options: UpstreamHttpLifecycleOptions,\n): Response => {\n if (!response.body) {\n lifecycle.finish()\n return response\n }\n\n const body = createManagedResponseBody(response.body, lifecycle, options)\n return new Response(body, {\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n })\n}\n\nconst createManagedResponseBody = (\n body: ReadableStream<Uint8Array>,\n lifecycle: RequestLifecycle,\n options: UpstreamHttpLifecycleOptions,\n): ReadableStream<Uint8Array> => {\n const reader = body.getReader()\n let finished = false\n let readerReleased = false\n\n const finish = () => {\n if (finished) return\n finished = true\n lifecycle.finish()\n }\n\n const releaseReader = () => {\n if (readerReleased) return\n readerReleased = true\n reader.releaseLock()\n }\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const result = await readWithLifecycle(reader, lifecycle, options)\n if (result.done) {\n finish()\n releaseReader()\n controller.close()\n return\n }\n\n controller.enqueue(result.value)\n } catch (error) {\n const reason = lifecycle.finishWithError(error)\n finish()\n await reader.cancel(reason).catch(() => {})\n releaseReader()\n controller.error(reason)\n }\n },\n async cancel(reason) {\n const error = toAbortReason(reason)\n lifecycle.abort(error)\n finish()\n await reader.cancel(error).catch(() => {})\n releaseReader()\n },\n })\n}\n\nconst readWithLifecycle = async (\n reader: {\n read: () => Promise<{ done: boolean; value?: Uint8Array }>\n },\n lifecycle: RequestLifecycle,\n options: UpstreamHttpLifecycleOptions,\n): Promise<{ done: boolean; value?: Uint8Array }> =>\n await new Promise((resolve, reject) => {\n let settled = false\n const signal = lifecycle.signal\n const timer = setTimeout(() => {\n const error = new UpstreamStreamInactivityTimeoutError(\n options.streamInactivityTimeoutMs,\n )\n lifecycle.abort(error)\n settle(() => reject(error))\n }, options.streamInactivityTimeoutMs)\n const onAbort = () => {\n settle(() => reject(toAbortReason(signal.reason)))\n }\n\n const cleanup = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", onAbort)\n }\n\n const settle = (action: () => void) => {\n if (settled) return\n settled = true\n cleanup()\n action()\n }\n\n if (signal.aborted) {\n onAbort()\n return\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true })\n reader.read().then(\n (result) => settle(() => resolve(result)),\n (error: unknown) => settle(() => reject(toError(error))),\n )\n })\n\nconst toAbortReason = (reason: unknown): Error => {\n if (reason instanceof Error) return reason\n const error = new Error(\"The operation was aborted\")\n error.name = \"AbortError\"\n return error\n}\n\nconst toError = (value: unknown): Error => {\n if (value instanceof Error) return value\n return new Error(String(value))\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\"\nimport type { RequestEventObserver } from \"./types/gateway-plugins\"\n\nexport interface RequestTiming {\n id: string\n firstTokenMs: number | null\n durationMs: number | null\n outcome: \"completed\" | \"cancelled\" | \"error\" | null\n hasUsage: boolean\n recordFirstToken: () => void\n}\n\nexport interface RequestContext {\n traceId: string\n startTime: number\n userAgent: string\n sessionAffinity: string | undefined\n rootSessionId?: string\n parentSessionId: string | undefined\n pluginRequest?: RequestEventObserver\n requestTiming?: RequestTiming\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\n// Observe the final target at upstream dispatch, after mapping and overrides.\nexport function setPluginRequestActualModel(model: string): void {\n requestContext.getStore()?.pluginRequest?.setActualModel(model)\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 { ServerSentEventMessage } from \"fetch-event-stream\"\n\nimport type {\n CreateResponsesReturn,\n ResponseInputContent,\n ResponseInputItem,\n ResponseInputMessage,\n ResponsesPayload,\n ResponsesResult,\n ResponsesStream,\n ResponsesTransport,\n} from \"~/lib/types/responses\"\n\nimport {\n getUpstreamTransportConfig,\n isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { FULL_MODEL_CATALOG_HEADER } from \"~/lib/internal-headers\"\nimport { state } from \"~/lib/state\"\nimport {\n createPooledWebSocketStream,\n createWebSocketUrl,\n type PooledWebSocketRequest,\n} from \"~/services/responses-websocket\"\nimport {\n createResponsesSafeStream,\n encodePoolKeyPart,\n getResponsesStreamTerminalDisposition,\n} from \"~/services/responses-websocket-helpers\"\nimport { createResponsesHttpEventStream } from \"~/services/responses-http\"\nimport { fetchUpstreamWithLifecycle } from \"~/services/upstream-http\"\nimport {\n requestContext,\n setPluginRequestActualModel,\n} from \"~/lib/request-context\"\nimport consola from \"consola\"\n\nexport const CODEX_API_BASE_URL = \"https://chatgpt.com/backend-api\"\n\nconst CODEX_RESPONSE_METADATA_EVENT = \"codex.response.metadata\"\nconst RESPONSE_CREATED_EVENT = \"response.created\"\nconst CODEX_USER_AGENT_VERSION_PATTERN =\n /\\bcodex(?:[-_ ][a-z0-9]+)*\\/(\\d+\\.\\d+\\.\\d+)(?:-[a-z0-9.-]+)?(?:\\+[a-z0-9.-]+)?(?=$|[\\s;)])/iu\nconst CODEX_RESPONSES_LITE_METADATA_KEY =\n \"ws_request_header_x_openai_internal_codex_responses_lite\"\n\ntype CodexResponsesWebSocketPayload = ResponsesPayload & {\n type: \"response.create\"\n}\n\ntype ServerSentEventChunk = ServerSentEventMessage\n\ntype CodexResponsesWebSocketRequest =\n PooledWebSocketRequest<CodexResponsesWebSocketPayload>\n\ninterface CodexResponsesHeaderOptions {\n payload?: Pick<ResponsesPayload, \"model\" | \"service_tier\">\n stream?: boolean | null\n}\n\nconst STRIPPED_CODEX_REQUEST_HEADERS = new Set([\n FULL_MODEL_CATALOG_HEADER,\n \"accept-encoding\",\n \"authorization\",\n \"cdn-loop\",\n \"connection\",\n \"content-length\",\n \"host\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"true-client-ip\",\n \"upgrade\",\n \"x-api-key\",\n \"x-forwarded-for\",\n \"x-forwarded-proto\",\n])\n\nconst STRIPPED_CODEX_WEBSOCKET_HEADERS = new Set([\n \"accept\",\n \"content-type\",\n \"x-openai-internal-codex-responses-lite\",\n \"x-codex-turn-state\",\n])\n\nconst shouldForwardCodexRequestHeader = (headerName: string): boolean => {\n const headerNameLower = headerName.toLowerCase()\n return (\n !STRIPPED_CODEX_REQUEST_HEADERS.has(headerNameLower)\n && !headerNameLower.includes(\"trace\")\n && !headerNameLower.startsWith(\"cf-\")\n )\n}\n\nconst buildForwardedCodexRequestHeaders = (\n requestHeaders: Headers,\n): Headers => {\n const headers = new Headers()\n for (const [headerName, headerValue] of requestHeaders) {\n if (shouldForwardCodexRequestHeader(headerName)) {\n headers.set(headerName, headerValue)\n }\n }\n return headers\n}\n\nconst setDefaultCodexHeader = (\n headers: Headers,\n headerName: string,\n headerValue: string,\n): void => {\n if (!headers.has(headerName)) {\n headers.set(headerName, headerValue)\n }\n}\n\nconst applyOpencodeCodexHeaders = (headers: Headers): void => {\n if (!headers.get(\"user-agent\")?.startsWith(\"opencode\")) {\n return\n }\n\n headers.set(\"originator\", \"opencode\")\n const sessionId = requestContext.getStore()?.sessionAffinity\n if (sessionId) {\n headers.set(\"session-id\", sessionId)\n }\n}\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 headers = buildCodexRequestHeaders(requestHeaders)\n\n setDefaultCodexHeader(\n headers,\n \"accept\",\n options.stream ? \"text/event-stream\" : \"application/json\",\n )\n setDefaultCodexHeader(headers, \"content-type\", \"application/json\")\n if (options.payload) {\n const { model, service_tier: serviceTier } = options.payload\n const routingHint = `model=${model}`\n headers.set(\n \"x-codex-routing-hint\",\n serviceTier ? `${routingHint};tier=${serviceTier}` : routingHint,\n )\n }\n return headers\n}\n\nexport function buildCodexRequestHeaders(requestHeaders: Headers): Headers {\n const { accessToken, accountId } = requireCodexAuthContext()\n const headers = buildForwardedCodexRequestHeaders(requestHeaders)\n\n headers.set(\"authorization\", `Bearer ${accessToken}`)\n headers.set(\"chatgpt-account-id\", accountId)\n setDefaultCodexHeader(headers, \"originator\", \"copilot-api\")\n setDefaultCodexHeader(headers, \"user-agent\", \"copilot-api\")\n if (!headers.has(\"version\")) {\n const version = headers\n .get(\"user-agent\")\n ?.match(CODEX_USER_AGENT_VERSION_PATTERN)?.[1]\n if (version) {\n headers.set(\"version\", version)\n }\n }\n applyOpencodeCodexHeaders(headers)\n return headers\n}\n\nexport const codexResponsesDependencies = {\n isResponsesApiWebSocketEnabled: () =>\n isConfiguredResponsesApiWebSocketEnabled(),\n}\n\nexport function resolveCodexResponsesTransport(\n transport?: ResponsesTransport,\n): ResponsesTransport {\n return (\n transport\n ?? (codexResponsesDependencies.isResponsesApiWebSocketEnabled() ?\n \"websocket\"\n : \"http\")\n )\n}\n\nexport function buildCodexResponsesWebSocketHeaders(\n requestHeaders: Headers,\n options: CodexResponsesHeaderOptions = {},\n): Record<string, string> {\n const headers = buildCodexResponsesHeaders(requestHeaders, options)\n setDefaultCodexHeader(\n headers,\n \"openai-beta\",\n \"responses_websockets=2026-02-06\",\n )\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 type: \"response.create\",\n ...normalizeCodexResponsesPayload(payload),\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 payload,\n })\n // websocket need not x-codex-turn-state, https need this.\n return {\n headers,\n payload: buildCodexResponsesWebSocketPayload(payload),\n preparePayload: (websocketPayload) => {\n const clientMetadata: Record<string, string> = {\n ...websocketPayload.client_metadata,\n \"x-codex-ws-stream-request-start-ms\": Date.now().toString(),\n }\n const responsesLite = requestHeaders.get(\n \"x-openai-internal-codex-responses-lite\",\n )\n if (responsesLite) {\n clientMetadata[CODEX_RESPONSES_LITE_METADATA_KEY] = responsesLite\n } else {\n delete clientMetadata[CODEX_RESPONSES_LITE_METADATA_KEY]\n }\n return { ...websocketPayload, client_metadata: clientMetadata }\n },\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 clientSignal?: AbortSignal\n onResponseHeaders?: (headers: Headers) => void\n transport?: ResponsesTransport\n } = {},\n): Promise<CreateResponsesReturn> {\n consola.log(`<-- model: ${payload.model}`)\n options.clientSignal?.throwIfAborted()\n setPluginRequestActualModel(payload.model)\n const transport = resolveCodexResponsesTransport(options.transport)\n if (payload.stream && transport === \"websocket\") {\n return forwardCodexResponsesOverWebSocket(\n payload,\n requestHeaders,\n baseUrl,\n options.clientSignal,\n options.onResponseHeaders,\n )\n }\n\n const normalizedPayload = normalizeCodexResponsesPayload(payload)\n const headers = buildCodexResponsesHeaders(requestHeaders, {\n payload: normalizedPayload,\n stream: normalizedPayload.stream,\n })\n\n const transportConfig = getUpstreamTransportConfig()\n const response = await fetchUpstreamWithLifecycle(\n resolveCodexResponsesUrl(baseUrl),\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(normalizedPayload),\n },\n {\n clientSignal: options.clientSignal,\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n\n if (!response.ok) {\n throw new HTTPError(\"Failed to create codex responses\", response)\n }\n\n options.onResponseHeaders?.(response.headers)\n\n if (normalizedPayload.stream) {\n return createResponsesSafeStream(createResponsesHttpEventStream(response))\n }\n\n return (await response.json()) as ResponsesResult\n}\n\nconst normalizeCodexResponsesPayload = (\n payload: ResponsesPayload,\n): ResponsesPayload => {\n const normalizedPayload: ResponsesPayload = {\n ...payload,\n store: false,\n }\n\n delete normalizedPayload.temperature\n delete normalizedPayload.top_p\n delete normalizedPayload.max_output_tokens\n delete normalizedPayload.metadata\n\n if (\n (typeof normalizedPayload.instructions === \"string\"\n && normalizedPayload.instructions.trim().length > 0)\n || !Array.isArray(normalizedPayload.input)\n ) {\n return normalizedPayload\n }\n\n const instructions: Array<string> = []\n let messageCount = 0\n const remainingInput = normalizedPayload.input.filter((inputItem) => {\n const message = getResponseInputMessage(inputItem)\n if (!message) {\n return true\n }\n\n messageCount += 1\n if (message.role !== \"system\" || messageCount > 3) {\n return true\n }\n\n const systemPrompt = getTextContent(message.content)\n if (systemPrompt === undefined) {\n return true\n }\n if (systemPrompt.trim().length > 0) {\n instructions.push(systemPrompt)\n }\n\n return false\n })\n\n if (remainingInput.length === normalizedPayload.input.length) {\n return normalizedPayload\n }\n\n if (instructions.length > 0) {\n // Codex expects system prompts in instructions instead of input messages.\n normalizedPayload.instructions = instructions.join(\"\\n\\n\")\n }\n\n if (remainingInput.length > 0) {\n normalizedPayload.input = remainingInput\n } else {\n delete normalizedPayload.input\n }\n\n return normalizedPayload\n}\n\nconst getResponseInputMessage = (\n inputItem: ResponseInputItem,\n): ResponseInputMessage | undefined => {\n if (typeof inputItem !== \"object\" || inputItem === null) {\n return undefined\n }\n\n const { role, type } = inputItem as {\n role?: unknown\n type?: unknown\n }\n if (typeof role !== \"string\" || (type !== undefined && type !== \"message\")) {\n return undefined\n }\n\n return inputItem as ResponseInputMessage\n}\n\nconst getTextContent = (\n content: ResponseInputMessage[\"content\"],\n): string | undefined => {\n if (typeof content === \"string\") {\n return content\n }\n\n if (content === undefined) {\n return \"\"\n }\n\n if (!Array.isArray(content)) {\n return undefined\n }\n\n const textBlocks: Array<string> = []\n for (const contentBlock of content) {\n const text = getTextBlock(contentBlock)\n if (text === undefined) {\n return undefined\n }\n\n if (text.length > 0) {\n textBlocks.push(text)\n }\n }\n\n return textBlocks.join(\"\\n\\n\")\n}\n\nconst getTextBlock = (\n contentBlock: ResponseInputContent,\n): string | undefined => {\n if (typeof contentBlock !== \"object\" || contentBlock === null) {\n return undefined\n }\n\n const { text, type } = contentBlock as {\n text?: unknown\n type?: unknown\n }\n\n if (type !== undefined && type !== \"input_text\" && type !== \"output_text\") {\n return undefined\n }\n\n return typeof text === \"string\" ? text : undefined\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)\n .filter(([headerName]) => shouldIncludeHeader(headerName))\n .sort(([left], [right]) => left.localeCompare(right)),\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 = (\n payload: ResponsesPayload,\n requestHeaders: Headers,\n baseUrl: string,\n clientSignal?: AbortSignal,\n onResponseHeaders?: (headers: Headers) => void,\n): ResponsesStream => {\n const websocketRequest = prepareCodexResponsesWebSocketRequest(\n payload,\n requestHeaders,\n baseUrl,\n )\n\n return createCodexResponsesWebSocketStream(\n websocketRequest,\n clientSignal,\n onResponseHeaders,\n )\n}\n\nconst createCodexResponsesWebSocketStream = (\n request: CodexResponsesWebSocketRequest,\n clientSignal?: AbortSignal,\n onResponseHeaders?: (headers: Headers) => void,\n): ResponsesStream => {\n const transportConfig = getUpstreamTransportConfig()\n return createResponsesSafeStream(\n createClientPreflightStream(\n filterCodexResponsesWebSocketMetadata(\n createPooledWebSocketStream(request, {\n createChunk: createCodexResponsesWebSocketStreamChunk,\n maxBufferedBytes: transportConfig.websocketMaxBufferedBytes,\n maxBufferedMessages: transportConfig.websocketMaxBufferedMessages,\n getTerminalDisposition: getResponsesStreamTerminalDisposition,\n openErrorMessage: \"Failed to create codex responses websocket\",\n openTimeoutMs: transportConfig.websocketOpenTimeoutMs,\n poolIdleTimeoutMs: transportConfig.websocketPoolIdleTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n streamErrorMessage:\n \"Upstream connection lost, Codex responses websocket stream error\",\n terminalChunkMissingMessage:\n \"Codex responses websocket ended without a terminal response, retry your request.\",\n }),\n onResponseHeaders,\n ),\n clientSignal,\n ),\n )\n}\n\nconst filterCodexResponsesWebSocketMetadata = async function* (\n source: AsyncIterable<ServerSentEventChunk>,\n onResponseHeaders?: (headers: Headers) => void,\n): AsyncGenerator<ServerSentEventChunk, void, unknown> {\n const pendingChunks: Array<ServerSentEventChunk> = []\n let responseStarted = false\n\n for await (const chunk of source) {\n const metadataHeaders = getCodexResponseMetadataHeaders(chunk)\n if (metadataHeaders !== undefined) {\n if (!responseStarted) {\n onResponseHeaders?.(metadataHeaders)\n }\n continue\n }\n\n if (!responseStarted) {\n if (chunk.event !== RESPONSE_CREATED_EVENT) {\n pendingChunks.push(chunk)\n continue\n }\n\n responseStarted = true\n for (const pendingChunk of pendingChunks) {\n yield pendingChunk\n }\n pendingChunks.length = 0\n }\n\n yield chunk\n }\n\n for (const pendingChunk of pendingChunks) {\n yield pendingChunk\n }\n}\n\nconst getCodexResponseMetadataHeaders = (\n chunk: ServerSentEventChunk,\n): Headers | undefined => {\n if (chunk.event !== CODEX_RESPONSE_METADATA_EVENT) return undefined\n if (!chunk.data || chunk.data === \"[DONE]\") return new Headers()\n\n let parsed: { headers?: unknown }\n try {\n parsed = JSON.parse(chunk.data) as typeof parsed\n } catch {\n return new Headers()\n }\n\n const headers = new Headers()\n if (typeof parsed.headers !== \"object\" || parsed.headers === null) {\n return headers\n }\n\n for (const [headerName, headerValue] of Object.entries(parsed.headers)) {\n if (typeof headerValue === \"string\") {\n try {\n headers.set(headerName, headerValue)\n } catch {\n // Ignore malformed metadata headers without exposing the internal event.\n }\n }\n }\n return headers\n}\n\nconst createClientPreflightStream = async function* <T>(\n source: AsyncIterable<T>,\n clientSignal?: AbortSignal,\n): AsyncGenerator<T, void, unknown> {\n if (clientSignal?.aborted) return\n yield* source\n}\n\nexport const createCodexResponsesWebSocketStreamChunk = (\n data: string,\n): ServerSentEventChunk => {\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 error?: {\n message: string\n }\n message?: string\n }\n\n // Preserve upstream JSON for normal events; error messages retain the\n // top-level field expected by existing Responses clients.\n let forwardedData = data\n if (parsed.type === \"error\" && parsed.error) {\n consola.warn(\"Codex responses websocket stream error:\", parsed.error)\n parsed.message = parsed.error.message\n forwardedData = JSON.stringify(parsed)\n }\n\n return {\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n data: forwardedData,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n\nfunction shouldIncludeHeader(headerName: string): boolean {\n const header = headerName.toLowerCase()\n return !header.includes(\"trace\") && !header.startsWith(\"x-codex-turn\")\n}\n","import { randomBytes } from \"node:crypto\"\nimport { createServer } from \"node:http\"\nimport type { OAuthCredentials } from \"~/lib/types/oauth\"\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\nconst CALLBACK_TIMEOUT_MS = 120_000\nconst REFRESH_TIMEOUT_MS = 30_000\n\ninterface TokenSuccessResult {\n accessToken: string\n refreshToken: string\n expiresAt: number\n}\n\nexport interface RefreshCodexCredentialsOptions {\n timeoutMs?: number\n}\n\ninterface OAuthPageOptions {\n title: string\n heading: string\n message: string\n}\n\nexport type CodexCredentials = OAuthCredentials\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 signal?: AbortSignal\n}\n\nexport class CodexOAuthError extends Error {\n readonly reason: \"callback_timeout\" | \"callback_unavailable\"\n\n constructor(reason: CodexOAuthError[\"reason\"]) {\n super(\n reason === \"callback_timeout\" ?\n \"Codex authorization timed out after 2 minutes\"\n : \"Could not listen for Codex authorization on port 1455\",\n )\n this.reason = reason\n this.name = \"CodexOAuthError\"\n }\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 signal?: AbortSignal,\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 signal,\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(\"Codex token exchange response missing required fields\")\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 options: RefreshCodexCredentialsOptions = {},\n): Promise<TokenSuccessResult> {\n const timeoutMs = options.timeoutMs ?? REFRESH_TIMEOUT_MS\n const signal = AbortSignal.timeout(timeoutMs)\n let response: Response\n\n try {\n 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 signal,\n })\n } catch (error) {\n if (signal.aborted) {\n throw new Error(`Codex token refresh timed out after ${timeoutMs}ms`, {\n cause: error,\n })\n }\n throw error\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(\"Codex token refresh response missing required fields\")\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(\n state: string,\n signal?: AbortSignal,\n): Promise<string> {\n signal?.throwIfAborted()\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 throw new CodexOAuthError(\"callback_unavailable\")\n }\n\n let timeout: ReturnType<typeof setTimeout> | undefined\n const onAbort = () => resolveCode?.(null)\n signal?.addEventListener(\"abort\", onAbort, { once: true })\n try {\n signal?.throwIfAborted()\n timeout = setTimeout(() => resolveCode?.(null), CALLBACK_TIMEOUT_MS)\n const code = await waitForCode\n signal?.throwIfAborted()\n if (!code) throw new CodexOAuthError(\"callback_timeout\")\n return code\n } finally {\n clearTimeout(timeout)\n signal?.removeEventListener(\"abort\", onAbort)\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error)\n return\n }\n resolve()\n })\n server.closeAllConnections()\n }).catch(() => undefined)\n }\n}\n\nexport async function loginCodex(\n options: LoginCodexOptions,\n): Promise<CodexCredentials> {\n options.signal?.throwIfAborted()\n const { verifier, state, url } = await createAuthorizationFlow()\n options.signal?.throwIfAborted()\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: string | null = null\n let callbackError: CodexOAuthError | undefined\n try {\n code = await waitForAuthorizationCode(state, options.signal)\n } catch (error) {\n options.signal?.throwIfAborted()\n if (!(error instanceof CodexOAuthError)) throw error\n callbackError = error\n }\n options.signal?.throwIfAborted()\n if (!code) {\n const input = await options.onPrompt(\n \"Paste the authorization code or full redirect URL:\",\n )\n options.signal?.throwIfAborted()\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 callbackError ?? new Error(\"Missing Codex authorization code\")\n }\n\n const tokenResult = await exchangeAuthorizationCode(\n code,\n verifier,\n options.signal,\n )\n options.signal?.throwIfAborted()\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 options: RefreshCodexCredentialsOptions = {},\n): Promise<CodexCredentials> {\n const tokenResult = await refreshAccessToken(\n credentials.refreshToken,\n options,\n )\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","import { setTimeout as delay } from \"node:timers/promises\"\nimport { z } from \"zod\"\nimport type { OAuthCredentials, XaiAuthInfo } from \"~/lib/types/oauth\"\nexport type { XaiAuthInfo } from \"~/lib/types/oauth\"\n\nexport const XAI_API_BASE_URL = \"https://cli-chat-proxy.grok.com\"\n\nconst CLIENT_ID = \"b1a00492-073a-47ea-816f-4c329264a828\"\nconst ISSUER = \"https://auth.x.ai/oauth2\"\nconst SCOPE = \"openid profile email offline_access grok-cli:access api:access\"\nconst REQUEST_TIMEOUT_MS = 30_000\nconst POLLING_SAFETY_MARGIN_MS = 3000\nconst REFRESH_BUFFER_MS = 60_000\n\nconst tokenSchema = z.object({\n access_token: z.string().trim().min(1),\n refresh_token: z.string().trim().min(1).optional(),\n id_token: z.string().optional(),\n expires_in: z.number().finite().optional(),\n})\nconst deviceSchema = z.object({\n device_code: z.string().min(1),\n user_code: z.string().min(1),\n verification_uri: z.url({ protocol: /^https$/u }),\n verification_uri_complete: z.url({ protocol: /^https$/u }).optional(),\n expires_in: z.number().finite().optional(),\n interval: z.number().finite().optional(),\n})\nconst errorSchema = z.object({ error: z.string().optional() })\n\nexport type XaiCredentials = OAuthCredentials\n\nexport interface LoginXaiOptions {\n onAuth: (info: XaiAuthInfo) => void\n signal?: AbortSignal\n}\n\ninterface XaiOAuthDependencies {\n fetcher?: (url: string, init: RequestInit) => Promise<Response>\n sleep?: (milliseconds: number, signal: AbortSignal) => Promise<void>\n}\n\nexport class XaiOAuthError extends Error {\n readonly reason: \"authorization_expired\" | \"authorization_denied\"\n\n constructor(reason: XaiOAuthError[\"reason\"]) {\n super(\n reason === \"authorization_expired\" ?\n \"xAI device code expired. Please sign in again.\"\n : \"xAI device authorization was denied.\",\n )\n this.name = \"XaiOAuthError\"\n this.reason = reason\n }\n}\n\nfunction positiveSeconds(value: number | undefined, fallback: number): number {\n return value !== undefined && value > 0 ? value : fallback\n}\n\nfunction tokenCredentials(\n tokens: z.infer<typeof tokenSchema>,\n currentRefreshToken?: string,\n): Omit<XaiCredentials, \"accountId\"> {\n const refreshToken = tokens.refresh_token ?? currentRefreshToken\n if (!refreshToken) {\n throw new Error(\"xAI token response is missing refresh_token\")\n }\n\n let expiresAt = Date.now() + positiveSeconds(tokens.expires_in, 3600) * 1000\n if (!tokens.expires_in || tokens.expires_in <= 0) {\n try {\n const payload: unknown = JSON.parse(\n Buffer.from(tokens.access_token.split(\".\")[1], \"base64url\").toString(\n \"utf8\",\n ),\n )\n const claims = z\n .object({ exp: z.number().finite().positive() })\n .safeParse(payload)\n if (claims.success) expiresAt = claims.data.exp * 1000\n } catch {\n // Opaque or malformed JWTs use a one-hour fallback lifetime.\n }\n }\n\n return { accessToken: tokens.access_token, refreshToken, expiresAt }\n}\n\nfunction tokenAccountId(token: string | undefined): string | undefined {\n if (!token) return undefined\n try {\n const payload: unknown = JSON.parse(\n Buffer.from(token.split(\".\")[1], \"base64url\").toString(\"utf8\"),\n )\n const claims = z\n .object({ sub: z.string().trim().min(1) })\n .safeParse(payload)\n return claims.success ? claims.data.sub : undefined\n } catch {\n return undefined\n }\n}\n\nasync function getAccountId(\n tokens: z.infer<typeof tokenSchema>,\n signal: AbortSignal,\n dependencies: XaiOAuthDependencies,\n): Promise<string> {\n const accountId =\n tokenAccountId(tokens.id_token) ?? tokenAccountId(tokens.access_token)\n if (accountId) return accountId\n // OIDC userinfo endpoint from auth.x.ai/.well-known/openid-configuration.\n const response = await (dependencies.fetcher ?? fetch)(`${ISSUER}/userinfo`, {\n headers: {\n Authorization: `Bearer ${tokens.access_token}`,\n Accept: \"application/json\",\n },\n signal: AbortSignal.any([signal, AbortSignal.timeout(REQUEST_TIMEOUT_MS)]),\n })\n if (!response.ok) throw requestError(response, await readOAuthError(response))\n const user = z\n .object({ sub: z.string().trim().min(1) })\n .parse(await response.json())\n signal.throwIfAborted()\n return user.sub\n}\n\nasync function send(\n endpoint: \"device/code\" | \"token\",\n body: Record<string, string>,\n options: { signal?: AbortSignal; timeoutMs?: number } = {},\n dependencies: XaiOAuthDependencies = {},\n): Promise<Response> {\n const timeoutMs = options.timeoutMs ?? REQUEST_TIMEOUT_MS\n const timeout = AbortSignal.timeout(timeoutMs)\n const signal =\n options.signal ? AbortSignal.any([options.signal, timeout]) : timeout\n try {\n return await (dependencies.fetcher ?? fetch)(`${ISSUER}/${endpoint}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n \"User-Agent\": \"copilot-api\",\n },\n body: new URLSearchParams(body),\n signal,\n })\n } catch (error) {\n options.signal?.throwIfAborted()\n if (timeout.aborted) {\n throw new Error(\n `xAI authorization request timed out after ${timeoutMs}ms`,\n { cause: error },\n )\n }\n throw error\n }\n}\n\nasync function readOAuthError(response: Response): Promise<string | undefined> {\n const payload: unknown = await response.json().catch(() => null)\n const parsed = errorSchema.safeParse(payload)\n return parsed.success ? parsed.data.error : undefined\n}\n\nfunction requestError(response: Response, error?: string): Error {\n // Do not include raw upstream bodies or descriptions that can contain tokens.\n const detail = error && /^[a-z_]+$/u.test(error) ? `: ${error}` : \"\"\n return new Error(\n `xAI authorization request failed (${response.status})${detail}`,\n )\n}\n\nexport async function loginXai(\n options: LoginXaiOptions,\n dependencies: XaiOAuthDependencies = {},\n): Promise<XaiCredentials> {\n options.signal?.throwIfAborted()\n const response = await send(\n \"device/code\",\n {\n client_id: CLIENT_ID,\n scope: SCOPE,\n referrer: \"opencode\",\n },\n options,\n dependencies,\n )\n if (!response.ok) throw requestError(response, await readOAuthError(response))\n const device = deviceSchema.parse(await response.json())\n options.signal?.throwIfAborted()\n const lifetimeMs = positiveSeconds(device.expires_in, 300) * 1000\n const expiresAt = Date.now() + lifetimeMs\n const timeout = AbortSignal.timeout(lifetimeMs)\n const signal =\n options.signal ? AbortSignal.any([options.signal, timeout]) : timeout\n options.onAuth({\n url: device.verification_uri_complete ?? device.verification_uri,\n verificationUri: device.verification_uri,\n userCode: device.user_code,\n expiresAt,\n })\n let intervalMs = Math.max(positiveSeconds(device.interval, 5) * 1000, 1000)\n const sleep =\n dependencies.sleep\n ?? ((ms, abortSignal) => delay(ms, undefined, { signal: abortSignal }))\n\n try {\n for (;;) {\n signal.throwIfAborted()\n const tokenResponse = await send(\n \"token\",\n {\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n client_id: CLIENT_ID,\n device_code: device.device_code,\n },\n { signal },\n dependencies,\n )\n signal.throwIfAborted()\n if (tokenResponse.ok) {\n const tokens = tokenSchema.parse(await tokenResponse.json())\n signal.throwIfAborted()\n const credentials = tokenCredentials(tokens)\n const accountId = await getAccountId(tokens, signal, dependencies)\n signal.throwIfAborted()\n return { ...credentials, accountId }\n }\n\n const error = await readOAuthError(tokenResponse)\n if (error === \"authorization_pending\" || error === \"slow_down\") {\n if (error === \"slow_down\") intervalMs += 5000\n await sleep(intervalMs + POLLING_SAFETY_MARGIN_MS, signal)\n continue\n }\n if (error === \"access_denied\" || error === \"authorization_denied\") {\n throw new XaiOAuthError(\"authorization_denied\")\n }\n if (error === \"expired_token\")\n throw new XaiOAuthError(\"authorization_expired\")\n throw requestError(tokenResponse, error)\n }\n } catch (error) {\n options.signal?.throwIfAborted()\n if (timeout.aborted) throw new XaiOAuthError(\"authorization_expired\")\n throw error\n }\n}\n\nexport async function refreshXaiCredentials(\n credentials: XaiCredentials,\n options: { timeoutMs?: number } = {},\n dependencies: XaiOAuthDependencies = {},\n): Promise<XaiCredentials> {\n const response = await send(\n \"token\",\n {\n grant_type: \"refresh_token\",\n refresh_token: credentials.refreshToken,\n client_id: CLIENT_ID,\n },\n options,\n dependencies,\n )\n if (!response.ok) throw requestError(response, await readOAuthError(response))\n const tokens = tokenSchema.parse(await response.json())\n const refreshedAccountId =\n tokenAccountId(tokens.id_token) ?? tokenAccountId(tokens.access_token)\n if (refreshedAccountId && refreshedAccountId !== credentials.accountId)\n throw new Error(\"xAI token refresh returned a different account\")\n return {\n ...tokenCredentials(tokens, credentials.refreshToken),\n accountId: credentials.accountId,\n }\n}\n\nexport function isXaiCredentialsExpired(\n credentials: Pick<XaiCredentials, \"expiresAt\">,\n now = Date.now(),\n): boolean {\n return credentials.expiresAt <= now + REFRESH_BUFFER_MS\n}\n","import { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { setTimeout as delay } from \"node:timers/promises\"\n\nimport type { CodexCredentials } from \"~/lib/oauth/codex\"\n\nimport { writeFileAtomically } from \"./atomic-file\"\nimport { PATHS } from \"./paths\"\n\nexport const MAX_CODEX_ACCOUNTS = 3\n\nconst CODEX_CREDENTIAL_LOCK_RETRY_MS = 10\nconst CODEX_CREDENTIAL_LOCK_TIMEOUT_MS = 10_000\nconst CODEX_CREDENTIAL_LOCK_STALE_MS = 60_000\n\nexport interface CodexStoredAccount extends CodexCredentials {\n alias?: string\n}\n\nexport interface CodexCredentialStoreV1 {\n version: 1\n accounts: Array<CodexStoredAccount>\n}\n\nexport interface WriteCodexCredentialsOptions {\n alias?: string\n // Refresh paths pass false so that a removed account is never re-created.\n insertIfMissing?: boolean\n // A refresh must not overwrite credentials from a newer sign-in.\n expectedRefreshToken?: string\n}\n\ninterface CodexCredentialLockMetadata {\n createdAt: number\n owner: string\n pid: number\n}\n\ninterface CodexCredentialLock {\n content: string\n fileHandle: Awaited<ReturnType<typeof fs.open>>\n lockPath: string\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nfunction normalizeCodexAccountSelector(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction parseCodexCredentialLockMetadata(\n value: string,\n): CodexCredentialLockMetadata | null {\n try {\n const candidate = JSON.parse(value) as Partial<CodexCredentialLockMetadata>\n if (\n typeof candidate.createdAt !== \"number\"\n || !Number.isFinite(candidate.createdAt)\n || typeof candidate.owner !== \"string\"\n || typeof candidate.pid !== \"number\"\n || !Number.isSafeInteger(candidate.pid)\n || candidate.pid <= 0\n ) {\n return null\n }\n\n return {\n createdAt: candidate.createdAt,\n owner: candidate.owner,\n pid: candidate.pid,\n }\n } catch {\n return null\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return !(isNodeError(error) && error.code === \"ESRCH\")\n }\n}\n\nasync function isCodexCredentialLockContention(\n error: unknown,\n lockPath: string,\n): Promise<boolean> {\n if (isNodeError(error) && error.code === \"EEXIST\") {\n return true\n }\n if (\n process.platform !== \"win32\"\n || !isNodeError(error)\n || (error.code !== \"EACCES\" && error.code !== \"EPERM\")\n ) {\n return false\n }\n\n try {\n await fs.stat(lockPath)\n return true\n } catch (statError) {\n if (isNodeError(statError) && statError.code === \"ENOENT\") {\n // Windows can briefly report EPERM while another writer removes the lock.\n return true\n }\n return false\n }\n}\n\nasync function removeStaleCodexCredentialLock(lockPath: string): Promise<void> {\n let content: string\n let modifiedAt: number\n try {\n const [lockContent, stats] = await Promise.all([\n fs.readFile(lockPath, \"utf8\"),\n fs.stat(lockPath),\n ])\n content = lockContent\n modifiedAt = stats.mtimeMs\n } catch (error) {\n if (\n (isNodeError(error) && error.code === \"ENOENT\")\n || (await isCodexCredentialLockContention(error, lockPath))\n ) {\n // A Windows lock can become temporarily unreadable while it is removed.\n return\n }\n throw error\n }\n\n const metadata = parseCodexCredentialLockMetadata(content)\n const lockAgeMs = Date.now() - (metadata?.createdAt ?? modifiedAt)\n if (\n lockAgeMs < CODEX_CREDENTIAL_LOCK_STALE_MS\n && (!metadata || isProcessAlive(metadata.pid))\n ) {\n return\n }\n\n try {\n if ((await fs.readFile(lockPath, \"utf8\")) !== content) {\n return\n }\n await fs.unlink(lockPath)\n } catch (error) {\n if (\n (isNodeError(error) && error.code === \"ENOENT\")\n || (await isCodexCredentialLockContention(error, lockPath))\n ) {\n return\n }\n throw error\n }\n}\n\nasync function acquireCodexCredentialLock(\n lockPath: string = `${PATHS.CODEX_CREDENTIAL_PATH}.lock`,\n): Promise<CodexCredentialLock> {\n await fs.mkdir(path.dirname(lockPath), { recursive: true })\n\n const startedAt = Date.now()\n while (true) {\n const metadata: CodexCredentialLockMetadata = {\n createdAt: Date.now(),\n owner: `${process.pid}-${randomBytes(8).toString(\"hex\")}`,\n pid: process.pid,\n }\n const content = `${JSON.stringify(metadata)}\\n`\n\n try {\n const fileHandle = await fs.open(lockPath, \"wx\", 0o600)\n try {\n await fileHandle.writeFile(content, \"utf8\")\n await fileHandle.sync()\n } catch (error) {\n await fileHandle.close().catch(() => {})\n await fs.unlink(lockPath).catch(() => {})\n throw error\n }\n return { content, fileHandle, lockPath }\n } catch (error) {\n if (!(await isCodexCredentialLockContention(error, lockPath))) {\n throw error\n }\n }\n\n await removeStaleCodexCredentialLock(lockPath)\n if (Date.now() - startedAt >= CODEX_CREDENTIAL_LOCK_TIMEOUT_MS) {\n throw new Error(\n `Timed out waiting for Codex credential store lock: ${lockPath}`,\n )\n }\n await delay(CODEX_CREDENTIAL_LOCK_RETRY_MS)\n }\n}\n\nasync function releaseCodexCredentialLock(\n lock: CodexCredentialLock,\n): Promise<void> {\n await lock.fileHandle.close()\n\n try {\n if ((await fs.readFile(lock.lockPath, \"utf8\")) !== lock.content) {\n return\n }\n await fs.unlink(lock.lockPath)\n } catch (error) {\n if (!(isNodeError(error) && error.code === \"ENOENT\")) {\n throw error\n }\n }\n}\n\nasync function withCodexCredentialLock<T>(\n operation: () => Promise<T>,\n lockPath?: string,\n): Promise<T> {\n const lock = await acquireCodexCredentialLock(lockPath)\n let result: T\n try {\n result = await operation()\n } catch (error) {\n await releaseCodexCredentialLock(lock).catch(() => {})\n throw error\n }\n\n await releaseCodexCredentialLock(lock)\n return result\n}\n\n/**\n * Serializes operations that must keep Codex account selection in config.json\n * consistent with the credential store. Credential writes retain their own\n * narrower lock so refreshes can run without changing the selected account.\n */\nexport function withCodexAccountMutationLock<T>(\n operation: () => Promise<T>,\n): Promise<T> {\n return withCodexCredentialLock(\n operation,\n `${PATHS.CODEX_CREDENTIAL_PATH}.accounts.lock`,\n )\n}\n\n// Use the same cross-process lock for OAuth refreshes and new sign-ins.\nexport function withCredentialFileLock<T>(\n credentialPath: string,\n operation: () => Promise<T>,\n): Promise<T> {\n return withCodexCredentialLock(operation, `${credentialPath}.lock`)\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\nfunction writeProtectedFile(filePath: string, content: string): Promise<void> {\n return Promise.resolve().then(() => writeFileAtomically(filePath, content))\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 || !candidate.accessToken.trim()\n || typeof candidate.refreshToken !== \"string\"\n || !candidate.refreshToken.trim()\n || typeof candidate.expiresAt !== \"number\"\n || !Number.isFinite(candidate.expiresAt)\n || typeof candidate.accountId !== \"string\"\n || !candidate.accountId.trim()\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\nfunction normalizeCodexStoredAccount(\n account: unknown,\n): CodexStoredAccount | null {\n const credentials = normalizeCodexCredentials(account)\n if (!credentials) {\n return null\n }\n\n const aliasValue = (account as { alias?: unknown }).alias\n if (aliasValue !== undefined && typeof aliasValue !== \"string\") {\n return null\n }\n\n const alias = aliasValue?.trim()\n return {\n ...credentials,\n ...(alias ? { alias } : {}),\n }\n}\n\nfunction normalizeCodexCredentialStore(\n value: unknown,\n): CodexCredentialStoreV1 | null {\n const legacyCredentials = normalizeCodexCredentials(value)\n if (legacyCredentials) {\n return {\n version: 1,\n accounts: [legacyCredentials],\n }\n }\n\n if (!value || typeof value !== \"object\") {\n return null\n }\n\n const candidate = value as {\n version?: unknown\n accounts?: unknown\n }\n if (candidate.version !== 1 || !Array.isArray(candidate.accounts)) {\n return null\n }\n\n if (candidate.accounts.length > MAX_CODEX_ACCOUNTS) {\n return null\n }\n\n const accounts: Array<CodexStoredAccount> = []\n const accountIds = new Set<string>()\n const aliases = new Set<string>()\n for (const value of candidate.accounts) {\n const account = normalizeCodexStoredAccount(value)\n if (!account || accountIds.has(account.accountId)) {\n return null\n }\n\n const normalizedAlias =\n account.alias ? normalizeCodexAccountSelector(account.alias) : undefined\n if (normalizedAlias && aliases.has(normalizedAlias)) {\n return null\n }\n\n accounts.push(account)\n accountIds.add(account.accountId)\n if (normalizedAlias) {\n aliases.add(normalizedAlias)\n }\n }\n\n // Versions before selector namespace validation allowed an alias to equal a\n // different account id. Drop only that ambiguous alias so existing tokens\n // remain usable and the next credential write repairs the persisted store.\n const normalizedAccounts = accounts.map((account, index) => {\n const alias = account.alias\n if (\n !alias\n || !accounts.some(\n (candidate, candidateIndex) =>\n candidateIndex !== index\n && normalizeCodexAccountSelector(candidate.accountId)\n === normalizeCodexAccountSelector(alias),\n )\n ) {\n return account\n }\n\n const { alias: _alias, ...credentials } = account\n return credentials\n })\n\n return { version: 1, accounts: normalizedAccounts }\n}\n\nasync function writeCodexCredentialStoreUnlocked(\n store: CodexCredentialStoreV1,\n credentialPath: string = PATHS.CODEX_CREDENTIAL_PATH,\n): Promise<void> {\n await writeProtectedFile(\n credentialPath,\n `${JSON.stringify(store, null, 2)}\\n`,\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\n// Command line arguments are readable by every local user through the process\n// list, so the environment is the preferred way to hand the server a token.\nexport const GITHUB_TOKEN_ENV = \"COPILOT_API_GITHUB_TOKEN\"\n\nexport function readGitHubTokenFromEnv(): string | undefined {\n return process.env[GITHUB_TOKEN_ENV]?.trim() || undefined\n}\n\nexport async function writeGitHubToken(token: string): Promise<void> {\n await writeProtectedFile(PATHS.GITHUB_TOKEN_PATH, token.trim())\n}\n\nexport function createOAuthCredentialStore(\n providerLabel: string,\n credentialPath: () => string,\n) {\n async function readStore(): Promise<CodexCredentialStoreV1 | null> {\n const raw = await readOptionalFile(credentialPath())\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 `${providerLabel} credentials file is not valid JSON: ${credentialPath()}`,\n {\n cause: error,\n },\n )\n }\n\n const store = normalizeCodexCredentialStore(parsed)\n if (!store) {\n throw new Error(\n `${providerLabel} credentials file is missing required fields: ${credentialPath()}`,\n )\n }\n\n return store\n }\n\n async function readCredentials(\n accountId?: string,\n ): Promise<CodexCredentials | null> {\n const store = await readStore()\n if (!store || store.accounts.length === 0) {\n return null\n }\n\n const normalizedAccountId = accountId?.trim()\n if (normalizedAccountId) {\n return (\n store.accounts.find(\n (account) => account.accountId === normalizedAccountId,\n ) ?? null\n )\n }\n\n if (store.accounts.length > 1) {\n throw new Error(\n `Multiple ${providerLabel} accounts found but no account is selected`,\n )\n }\n\n return store.accounts[0]\n }\n\n async function writeCredentials(\n credentials: CodexCredentials,\n options: WriteCodexCredentialsOptions = {},\n ): Promise<void> {\n const normalizedCredentials = normalizeCodexCredentials(credentials)\n if (!normalizedCredentials) {\n throw new Error(\n `${providerLabel} credentials are missing required fields`,\n )\n }\n\n await withCredentialFileLock(credentialPath(), async () => {\n const store = (await readStore()) ?? {\n version: 1 as const,\n accounts: [],\n }\n const accountIdSelector = normalizeCodexAccountSelector(\n normalizedCredentials.accountId,\n )\n const existingIndex = store.accounts.findIndex(\n (account) => account.accountId === normalizedCredentials.accountId,\n )\n if (existingIndex < 0 && options.insertIfMissing === false) {\n // Update-only writes come from credential refreshes. A missing row means\n // the account was removed while this process still held its credentials\n // in memory (for example a server that was not restarted after switching\n // accounts), so inserting it again would silently undo the removal.\n return\n }\n\n const existingRefreshToken = store.accounts[existingIndex]?.refreshToken\n if (\n options.expectedRefreshToken !== undefined\n && existingRefreshToken !== options.expectedRefreshToken\n && existingRefreshToken !== normalizedCredentials.refreshToken\n ) {\n return\n }\n\n if (\n existingIndex < 0\n && store.accounts.some(\n (account) =>\n normalizeCodexAccountSelector(account.accountId)\n === accountIdSelector,\n )\n ) {\n throw new Error(\n `${providerLabel} account id '${normalizedCredentials.accountId}' is already in use`,\n )\n }\n if (existingIndex < 0 && store.accounts.length >= MAX_CODEX_ACCOUNTS) {\n throw new Error(\n `${providerLabel} supports at most ${MAX_CODEX_ACCOUNTS} accounts`,\n )\n }\n if (\n store.accounts.some(\n (account, index) =>\n index !== existingIndex\n && account.alias\n && normalizeCodexAccountSelector(account.alias)\n === accountIdSelector,\n )\n ) {\n throw new Error(\n `${providerLabel} account id '${normalizedCredentials.accountId}' conflicts with another account alias`,\n )\n }\n\n const alias = options.alias?.trim()\n if (alias) {\n const aliasSelector = normalizeCodexAccountSelector(alias)\n if (\n store.accounts.some(\n (account, index) =>\n index !== existingIndex\n && account.alias\n && normalizeCodexAccountSelector(account.alias) === aliasSelector,\n )\n ) {\n throw new Error(\n `${providerLabel} account alias '${alias}' is already in use`,\n )\n }\n if (\n store.accounts.some(\n (account, index) =>\n index !== existingIndex\n && normalizeCodexAccountSelector(account.accountId)\n === aliasSelector,\n )\n ) {\n throw new Error(\n `${providerLabel} account alias '${alias}' conflicts with another account id`,\n )\n }\n }\n\n const existingAccount =\n existingIndex >= 0 ? store.accounts[existingIndex] : undefined\n const nextAccount: CodexStoredAccount = {\n ...normalizedCredentials,\n ...(alias ? { alias }\n : existingAccount?.alias ? { alias: existingAccount.alias }\n : {}),\n }\n const accounts = [...store.accounts]\n if (existingIndex >= 0) {\n accounts[existingIndex] = nextAccount\n } else {\n accounts.push(nextAccount)\n }\n\n await writeCodexCredentialStoreUnlocked(\n { version: 1, accounts },\n credentialPath(),\n )\n })\n }\n\n async function removeCredentials(\n accountId: string,\n ): Promise<CodexStoredAccount> {\n const normalizedAccountId = accountId.trim()\n if (!normalizedAccountId) {\n throw new Error(`${providerLabel} account id must be a non-empty string`)\n }\n\n return await withCredentialFileLock(credentialPath(), async () => {\n const store = await readStore()\n const index =\n store?.accounts.findIndex(\n (account) => account.accountId === normalizedAccountId,\n ) ?? -1\n if (!store || index < 0) {\n throw new Error(\n `${providerLabel} account '${normalizedAccountId}' was not found`,\n )\n }\n\n const removedAccount = store.accounts[index]\n const accounts = store.accounts.filter(\n (_account, accountIndex) => accountIndex !== index,\n )\n await writeCodexCredentialStoreUnlocked(\n { version: 1, accounts },\n credentialPath(),\n )\n\n return removedAccount\n })\n }\n\n return { readStore, readCredentials, writeCredentials, removeCredentials }\n}\n\nconst codexCredentialStore = createOAuthCredentialStore(\n \"Codex\",\n () => PATHS.CODEX_CREDENTIAL_PATH,\n)\nexport const readCodexCredentialStore = codexCredentialStore.readStore\nexport const readCodexCredentials = codexCredentialStore.readCredentials\nexport const writeCodexCredentials = codexCredentialStore.writeCredentials\nexport const removeCodexCredentials = codexCredentialStore.removeCredentials\n\nexport async function clearCodexCredentials(): Promise<void> {\n await withCodexCredentialLock(() =>\n writeProtectedFile(PATHS.CODEX_CREDENTIAL_PATH, \"\"),\n )\n}\n\nexport async function hasCodexCredentials(): Promise<boolean> {\n return ((await readCodexCredentialStore())?.accounts.length ?? 0) > 0\n}\n","import { readEditableConfigFromDisk } from \"~/lib/config\"\nimport {\n createOAuthCredentialStore,\n withCredentialFileLock,\n} from \"~/lib/credential-store\"\nimport type { OAuthAccountSummary, OAuthCredentials } from \"~/lib/types/oauth\"\n\nexport function createOAuthAccountManager(options: {\n provider: string\n label: string\n credentialPath: () => string\n selectAccount: (accountId: string) => void\n}) {\n const store = createOAuthCredentialStore(\n options.label,\n options.credentialPath,\n )\n const withMutationLock = <T>(operation: () => Promise<T>) =>\n withCredentialFileLock(`${options.credentialPath()}.accounts`, operation)\n const activeId = (accounts: Array<Pick<OAuthCredentials, \"accountId\">>) =>\n readEditableConfigFromDisk().providers?.[\n options.provider\n ]?.accountId?.trim()\n || (accounts.length === 1 ? accounts[0].accountId : undefined)\n const summarize = (\n account: { accountId: string; alias?: string },\n active: boolean,\n ): OAuthAccountSummary => ({\n accountId: account.accountId,\n ...(account.alias ? { alias: account.alias } : {}),\n active,\n })\n\n async function findAccount(selector: string) {\n const normalized = selector.trim()\n if (!normalized)\n throw new Error(\n `${options.label} account selector must be a non-empty string`,\n )\n const accounts = (await store.readStore())?.accounts ?? []\n const account =\n accounts.find((candidate) => candidate.accountId === normalized)\n ?? accounts.find(\n (candidate) =>\n candidate.alias?.toLowerCase() === normalized.toLowerCase(),\n )\n if (!account)\n throw new Error(`${options.label} account '${normalized}' was not found`)\n return { account, accounts }\n }\n\n return {\n store,\n withMutationLock,\n list: () =>\n withMutationLock(async () => {\n const accounts = (await store.readStore())?.accounts ?? []\n const active = activeId(accounts)\n return accounts.map((account) =>\n summarize(account, account.accountId === active),\n )\n }),\n select: (selector: string) =>\n withMutationLock(async () => {\n const { account } = await findAccount(selector)\n options.selectAccount(account.accountId)\n return summarize(account, true)\n }),\n remove: (selector: string) =>\n withMutationLock(async () => {\n const { account, accounts } = await findAccount(selector)\n if (account.accountId === activeId(accounts))\n throw new Error(\n `${options.label} account '${account.accountId}' is currently in use; switch to another account before removing it`,\n )\n const removed = await store.removeCredentials(account.accountId)\n return summarize(removed, false)\n }),\n }\n}\n","import {\n getRawProviderConfig,\n readEditableConfigFromDisk,\n setProviderConfig,\n} from \"~/lib/config\"\nimport { withCredentialFileLock } from \"~/lib/credential-store\"\nimport { createOAuthAccountManager } from \"~/lib/oauth-accounts\"\nimport {\n isXaiCredentialsExpired,\n refreshXaiCredentials,\n XAI_API_BASE_URL,\n type XaiCredentials,\n} from \"~/lib/oauth/xai\"\nimport { PATHS } from \"~/lib/paths\"\n\nfunction syncXaiProviderConfig(accountId: string, enable = false): void {\n const {\n apiKey: _apiKey,\n modelsDevProviderId: _catalog,\n ...existing\n } = readEditableConfigFromDisk().providers?.xai ?? {}\n setProviderConfig(\"xai\", {\n ...existing,\n type: \"openai-responses\",\n enabled: enable ? true : existing.enabled,\n baseUrl: XAI_API_BASE_URL,\n authType: \"oauth2\",\n accountId,\n pricingCurrency: \"USD\",\n })\n}\n\nconst xaiAccounts = createOAuthAccountManager({\n provider: \"xai\",\n label: \"xAI\",\n credentialPath: () => PATHS.XAI_CREDENTIAL_PATH,\n selectAccount: (accountId) => syncXaiProviderConfig(accountId),\n})\nexport const getXaiAccounts = xaiAccounts.list\nexport const selectXaiAccount = xaiAccounts.select\nexport const removeXaiAccount = xaiAccounts.remove\n\nexport async function readXaiCredentials(\n accountId = getRawProviderConfig(\"xai\")?.accountId,\n): Promise<XaiCredentials | null> {\n return await xaiAccounts.store.readCredentials(accountId)\n}\n\nexport function persistXaiCredentials(\n credentials: XaiCredentials,\n options: { alias?: string } = {},\n): Promise<void> {\n return xaiAccounts.withMutationLock(async () => {\n await xaiAccounts.store.writeCredentials(credentials, {\n alias: options.alias,\n })\n syncXaiProviderConfig(credentials.accountId, true)\n })\n}\n\nconst refreshInFlight = new Map<string, Promise<string | null>>()\nconst pendingPersistence = new Map<string, XaiCredentials>()\n\n// Disk reads make account changes visible without a token cache or timer.\nexport async function getXaiAccessToken(): Promise<string | null> {\n const credentials = await readXaiCredentials()\n if (!credentials || !isXaiCredentialsExpired(credentials))\n return credentials?.accessToken ?? null\n const key = `${credentials.accountId}:${credentials.refreshToken}`\n const inFlight = refreshInFlight.get(key)\n if (inFlight) return await inFlight\n\n const refresh = withCredentialFileLock(\n `${PATHS.XAI_CREDENTIAL_PATH}.refresh`,\n async () => {\n const current = await readXaiCredentials(credentials.accountId)\n if (!current) return null\n if (!isXaiCredentialsExpired(current)) return current.accessToken\n const currentKey = `${current.accountId}:${current.refreshToken}`\n const refreshed =\n pendingPersistence.get(currentKey)\n ?? (await refreshXaiCredentials(current))\n pendingPersistence.set(currentKey, refreshed)\n await xaiAccounts.store.writeCredentials(refreshed, {\n insertIfMissing: false,\n expectedRefreshToken: current.refreshToken,\n })\n pendingPersistence.delete(currentKey)\n return (\n (await readXaiCredentials(credentials.accountId))?.accessToken ?? null\n )\n },\n ).finally(() => {\n refreshInFlight.delete(key)\n })\n refreshInFlight.set(key, refresh)\n return await refresh\n}\n","import type { Context, MiddlewareHandler } from \"hono\"\n\nimport consola from \"consola\"\n\nimport { getConfig } from \"./config\"\n\ninterface AuthMiddlewareOptions {\n getApiKeys?: () => Array<string>\n allowUnauthenticatedPaths?: Array<string>\n allowOptionsBypass?: boolean\n allowWhenNoApiKeys?: boolean\n shouldSkipPath?: (path: string) => boolean\n}\n\nexport function normalizeApiKeys(apiKeys: unknown): Array<string> {\n if (!Array.isArray(apiKeys)) {\n if (apiKeys !== undefined) {\n consola.warn(\"Invalid auth.apiKeys config. Expected an array of strings.\")\n }\n return []\n }\n\n const normalizedKeys = apiKeys\n .filter((key): key is string => typeof key === \"string\")\n .map((key) => key.trim())\n .filter((key) => key.length > 0)\n\n if (normalizedKeys.length !== apiKeys.length) {\n consola.warn(\n \"Invalid auth.apiKeys entries found. Only non-empty strings are allowed.\",\n )\n }\n\n return [...new Set(normalizedKeys)]\n}\n\nexport function getConfiguredApiKeys(): Array<string> {\n const config = getConfig()\n return normalizeApiKeys(config.auth?.apiKeys)\n}\n\nexport function getMissingApiKeysMessage(): string | null {\n const apiKeys = getConfiguredApiKeys()\n if (apiKeys.length > 0) {\n return null\n }\n\n return [\n \"Requests currently bypass authentication.\",\n \"Run `npx @jeffreycao/copilot-api@latest auth keys --add <key>` to enable API key auth.\",\n ].join(\" \")\n}\n\nfunction normalizeApiKey(apiKey: unknown): string | null {\n if (typeof apiKey !== \"string\") {\n return null\n }\n\n const normalizedApiKey = apiKey.trim()\n return normalizedApiKey || null\n}\n\nexport function getConfiguredAdminApiKeys(): Array<string> {\n const config = getConfig()\n const adminApiKey = normalizeApiKey(config.auth?.adminApiKey)\n return adminApiKey ? [adminApiKey] : []\n}\n\nexport function extractRequestApiKey(c: Context): string | null {\n const xApiKey = c.req.header(\"x-api-key\")?.trim()\n if (xApiKey) {\n return xApiKey\n }\n\n const authorization = c.req.header(\"authorization\")\n if (!authorization) {\n return null\n }\n\n const [scheme, ...rest] = authorization.trim().split(/\\s+/)\n if (scheme.toLowerCase() !== \"bearer\") {\n return null\n }\n\n const bearerToken = rest.join(\" \").trim()\n return bearerToken || null\n}\n\nfunction createUnauthorizedResponse(c: Context): Response {\n c.header(\"WWW-Authenticate\", 'Bearer realm=\"copilot-api\"')\n return c.json(\n {\n error: {\n message: \"Unauthorized\",\n type: \"authentication_error\",\n },\n },\n 401,\n )\n}\n\nexport function createAuthMiddleware(\n options: AuthMiddlewareOptions = {},\n): MiddlewareHandler {\n const getApiKeys = options.getApiKeys ?? getConfiguredApiKeys\n const allowUnauthenticatedPaths = options.allowUnauthenticatedPaths ?? [\"/\"]\n const allowOptionsBypass = options.allowOptionsBypass ?? true\n const allowWhenNoApiKeys = options.allowWhenNoApiKeys ?? true\n const shouldSkipPath = options.shouldSkipPath ?? (() => false)\n\n return async (c, next) => {\n if (allowOptionsBypass && c.req.method === \"OPTIONS\") {\n return next()\n }\n\n if (shouldSkipPath(c.req.path)) {\n return next()\n }\n\n if (allowUnauthenticatedPaths.includes(c.req.path)) {\n return next()\n }\n\n const apiKeys = getApiKeys()\n if (apiKeys.length === 0) {\n return allowWhenNoApiKeys ? next() : createUnauthorizedResponse(c)\n }\n\n const requestApiKey = extractRequestApiKey(c)\n if (!requestApiKey || !apiKeys.includes(requestApiKey)) {\n return createUnauthorizedResponse(c)\n }\n\n return next()\n }\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 { assertGitHubCopilotEnabled } from \"./github-copilot-provider\"\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 if (candidate.startsWith(\"opencode/latest\")) return candidate\n\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.68.0\"\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.281 (external, sdk-ts, agent-sdk/0.3.281)\"\nconst COPILOT_WEBSOCKET_VERSION = COPILOT_VERSION\nconst EDITOR_WEBSOCKET_PLUGIN_VERSION = `copilot-chat/${COPILOT_WEBSOCKET_VERSION}`\n\nconst API_VERSION = \"2026-08-01\"\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 = (\n headers: Record<string, string>,\n state: State,\n) => {\n if (isOpencodeOauthApp()) {\n return\n }\n\n if (!state.githubToken) throw new Error(\"GitHub token not found\")\n\n // Preserve the Claude agent's fresh request ID for every upstream request.\n const requestIdValue = randomUUID()\n const source = createHeaderResolver(headers)\n const proxyHeaders: Record<string, string> = {\n \"anthropic-version\": source(\"anthropic-version\", \"2023-06-01\"),\n \"User-Agent\": CLAUDE_AGENT_USER_AGENT,\n \"Content-Type\": source(\"content-type\", \"application/json\"),\n Authorization: `Bearer ${state.githubToken}`,\n \"X-Request-Id\": requestIdValue,\n \"X-GitHub-Api-Version\": API_VERSION,\n \"OpenAI-Intent\": \"messages-proxy\",\n \"X-Interaction-Type\": \"messages-proxy\",\n }\n\n setPreparedHeader(proxyHeaders, \"anthropic-beta\", headers, \"anthropic-beta\")\n setPreparedHeader(\n proxyHeaders,\n \"VScode-SessionId\",\n headers,\n \"vscode-sessionid\",\n )\n setPreparedHeader(\n proxyHeaders,\n \"VScode-MachineId\",\n headers,\n \"vscode-machineid\",\n )\n Object.assign(proxyHeaders, {\n \"Editor-Device-Id\": source(\"editor-device-id\", state.vsCodeDeviceId),\n \"Editor-Plugin-Version\": `copilot-chat/${state.vsCodeVersion}`,\n \"Editor-Version\": source(\"editor-version\", `vscode/${state.vsCodeVersion}`),\n })\n\n for (const headerName of Object.keys(headers)) {\n delete headers[headerName]\n }\n Object.assign(headers, proxyHeaders)\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 assertGitHubCopilotEnabled()\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 assertGitHubCopilotEnabled()\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 assertGitHubCopilotEnabled()\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 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\nexport interface GetCopilotTokenResponse {\n expires_at: number\n refresh_in: number\n token: string\n // Per-SKU isolated endpoints returned by the token exchange. This is the\n // authoritative routing source for the issued token; `/copilot_internal/user`\n // may advertise a different segmented host (e.g. business vs enterprise).\n endpoints?: {\n api?: string\n proxy?: string\n telemetry?: string\n }\n}\n","import consola from \"consola\"\nimport { 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 signal?: AbortSignal,\n): Promise<CopilotUsageResponse | null> => {\n const resolvedGithubToken = githubToken ?? state.githubToken\n if (!resolvedGithubToken) {\n return null\n }\n\n const authState = { ...state, githubToken: resolvedGithubToken }\n const response = await fetch(\n `${getGitHubApiBaseUrl()}/copilot_internal/user`,\n {\n headers: githubHeaders(authState),\n signal,\n },\n )\n\n if (!response.ok) {\n const errorText = await response.clone().text()\n consola.error(\"Failed to get Copilot user response body\", errorText)\n\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 if (!usage) {\n throw new Error(\"GitHub token not found\")\n }\n\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 token_based_billing?: boolean\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 type { Context } from \"hono\"\n\nimport { createHash, randomUUID } from \"node:crypto\"\n\nimport type { AnthropicMessagesPayload } from \"~/lib/types/anthropic\"\nimport type { ResponsesStream } from \"~/lib/types/responses\"\n\nimport { state } from \"./state\"\nimport { requestContext } from \"./request-context\"\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 const isAsyncIterable = <T>(value: unknown): value is AsyncIterable<T> =>\n Boolean(value)\n && typeof (value as AsyncIterable<T>)[Symbol.asyncIterator] === \"function\"\n\nexport const isResponsesStream = (value: unknown): value is ResponsesStream =>\n isAsyncIterable<unknown>(value)\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\nexport const getPromptCacheKey = (\n payload: Pick<AnthropicMessagesPayload, \"metadata\">,\n): string | null => {\n const { sessionId } = parseUserIdMetadata(payload.metadata?.user_id)\n const store = requestContext.getStore()\n const rootSessionId = store?.rootSessionId?.trim() || null\n const sessionAffinity = store?.sessionAffinity?.trim() || null\n return rootSessionId ?? sessionId ?? sessionAffinity\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\n// Shared by the Messages and Responses routes: `session-id` comes from codex\n// clients, `x-root-session-id` is set by the agent-context plugin.\nexport const getRootSessionIdFromHeaders = (c: Context): string | undefined =>\n c.req.header(\"session-id\")?.trim()\n || c.req.header(\"x-root-session-id\")?.trim()\n || c.req.header(\"x-session-id\")?.trim()\n || undefined\n\n// Shared by the request context and the Responses route. The codex thread id\n// counts as a client request id, so it is accepted as the last resort.\nexport const getSessionAffinityFromHeaders = (c: Context): string | undefined =>\n c.req.header(\"x-opencode-session-id\")?.trim()\n || c.req.header(\"x-session-affinity\")?.trim()\n || c.req.header(\"x-client-request-id\")?.trim()\n || c.req.header(\"thread-id\")?.trim()\n || undefined\n\n// Unlike getRootSessionIdFromHeaders, this prefers metadata.user_id, ignores\n// the `session-id` header, and hashes the resolved value.\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-root-session-id\") ?? 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\n// RFC 8628 section 3.5: every slow_down adds 5 seconds to the poll interval.\nconst SLOW_DOWN_INTERVAL_INCREMENT_SECONDS = 5\n\nexport interface PollAccessTokenDependencies {\n now: () => number\n sleep: (ms: number) => Promise<unknown>\n}\n\nexport interface PollAccessTokenOptions {\n // Stops polling; the returned promise rejects with the signal's reason.\n signal?: AbortSignal\n}\n\nconst defaultPollAccessTokenDependencies: PollAccessTokenDependencies = {\n now: () => Date.now(),\n sleep,\n}\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\nconst toSleepDuration = (intervalSeconds: number) =>\n (intervalSeconds + 1) * 1000\n\nexport async function pollAccessToken(\n deviceCode: DeviceCodeResponse,\n dependencies: PollAccessTokenDependencies = defaultPollAccessTokenDependencies,\n options: PollAccessTokenOptions = {},\n): Promise<string> {\n const { signal } = options\n const { clientId, headers } = getOauthAppConfig()\n const { accessTokenUrl } = getOauthUrls()\n const expiresAt = dependencies.now() + deviceCode.expires_in * 1000\n let intervalSeconds = deviceCode.interval\n\n consola.debug(\n `Polling access token with interval of ${toSleepDuration(intervalSeconds)}ms`,\n )\n\n while (true) {\n signal?.throwIfAborted()\n\n if (dependencies.now() >= expiresAt) {\n throw new Error(\n \"GitHub device code expired before authorization completed. Please log in again.\",\n )\n }\n\n const json = await requestAccessToken(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 signal,\n })\n\n if (json) {\n consola.debug(\"Polling access token response received\")\n\n if (json.access_token) {\n return json.access_token\n }\n\n if (json.error === \"slow_down\") {\n const serverInterval =\n typeof json.interval === \"number\" ? json.interval : 0\n intervalSeconds = Math.max(\n serverInterval,\n intervalSeconds + SLOW_DOWN_INTERVAL_INCREMENT_SECONDS,\n )\n consola.debug(\n `GitHub asked to slow down, polling interval is now ${intervalSeconds}s`,\n )\n } else if (json.error && json.error !== \"authorization_pending\") {\n throw new Error(\n `GitHub device authorization failed: ${json.error_description ?? json.error}`,\n )\n }\n }\n\n await sleepUnlessAborted(\n dependencies.sleep,\n toSleepDuration(intervalSeconds),\n signal,\n )\n }\n}\n\nasync function sleepUnlessAborted(\n sleepFor: PollAccessTokenDependencies[\"sleep\"],\n ms: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (!signal) {\n await sleepFor(ms)\n return\n }\n\n signal.throwIfAborted()\n let onAbort: (() => void) | undefined\n // Listen before starting the sleep so an abort during it is never missed.\n const aborted = new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(signal.reason as Error)\n signal.addEventListener(\"abort\", onAbort, { once: true })\n })\n try {\n await Promise.race([aborted, sleepFor(ms)])\n } finally {\n if (onAbort) signal.removeEventListener(\"abort\", onAbort)\n }\n}\n\n/**\n * Resolves to `undefined` when the poll should simply be retried. The device\n * code stays valid until it expires, so a dropped connection (for example a\n * proxy closing the socket) or a non-2xx response must not abort the login.\n * A request aborted through `init.signal` rejects instead.\n */\nasync function requestAccessToken(\n url: string,\n init: RequestInit,\n): Promise<AccessTokenResponse | undefined> {\n try {\n const response = await fetch(url, init)\n\n if (!response.ok) {\n consola.error(\"Failed to poll access token:\", await response.text())\n return undefined\n }\n\n return (await response.json()) as AccessTokenResponse\n } catch (error) {\n if (init.signal?.aborted) {\n throw error\n }\n\n consola.warn(\n `Failed to poll access token, will retry: ${describeError(error)}`,\n )\n return undefined\n }\n}\n\nfunction describeError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n\n // Node's fetch rejects with \"fetch failed\" and keeps the reason in `cause`\n const { cause } = error\n if (!(cause instanceof Error)) {\n return error.message\n }\n\n const detail = cause.message || (cause as NodeJS.ErrnoException).code\n return detail ? `${error.message} (${detail})` : error.message\n}\n\ninterface AccessTokenResponse {\n access_token?: string\n token_type?: string\n scope?: string\n error?: string\n error_description?: string\n interval?: number\n}\n","import consola from \"consola\"\n\nimport { assertGitHubCopilotEnabled } from \"./github-copilot-provider\"\nimport { setTimeout as delay } from \"node:timers/promises\"\n\nimport { isOpencodeOauthApp } from \"~/lib/api-config\"\nimport {\n getRawProviderConfig,\n readEditableConfigFromDisk,\n setProviderConfig,\n} from \"~/lib/config\"\nimport {\n readCodexCredentialStore,\n readGitHubToken,\n withCodexAccountMutationLock,\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 {\n getCopilotToken,\n type GetCopilotTokenResponse,\n} from \"~/services/github/get-copilot-token\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { getDeviceCode } from \"~/services/github/get-device-code\"\nimport { pollAccessToken } from \"~/services/github/poll-access-token\"\n\nimport { HTTPError } from \"./error\"\nimport { state } from \"./state\"\nimport { createOAuthAccountManager } from \"./oauth-accounts\"\nimport type { OAuthAccountSummary } from \"./types/oauth\"\nimport { PATHS } from \"./paths\"\n\nlet copilotRefreshLoopController: AbortController | null = null\nlet codexRefreshLoopController: AbortController | null = null\nlet codexRuntimeGeneration = 0\nconst codexRefreshInFlight = new Map<string, Promise<CodexCredentials>>()\nconst codexCredentialsPendingPersistence = new Map<string, CodexCredentials>()\n\nexport type CodexAccountSummary = OAuthAccountSummary\n\nexport interface PersistCodexCredentialsOptions {\n activateAccount?: boolean\n alias?: string\n enableProvider?: boolean\n insertIfMissing?: boolean\n syncProvider?: boolean\n expectedRefreshToken?: string\n runtimeGeneration?: number\n}\n\ninterface CopilotUserIdentity {\n endpoints: { api: string }\n login: string\n token_based_billing?: boolean\n}\n\nexport interface CopilotTokenDependencies {\n getCopilotToken: () => Promise<GetCopilotTokenResponse>\n getCopilotUsage: () => Promise<CopilotUserIdentity | null>\n}\n\nconst defaultCopilotTokenDependencies: CopilotTokenDependencies = {\n getCopilotToken,\n getCopilotUsage,\n}\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\nexport const invalidateCodexRuntime = () => {\n codexRuntimeGeneration++\n stopCodexRefreshLoop()\n state.codexAccessToken = undefined\n state.codexRefreshToken = undefined\n state.codexExpiresAt = undefined\n state.codexAccountId = undefined\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?: {\n accountId?: string\n enabled?: boolean\n}): void {\n const existingProviderConfig =\n readEditableConfigFromDisk().providers?.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 accountId: options?.accountId ?? existingProviderConfig.accountId,\n pricingCurrency: \"USD\",\n })\n}\n\nfunction getConfiguredCodexAccountId(): string | undefined {\n return getRawProviderConfig(\"codex\")?.accountId?.trim() || undefined\n}\n\nconst codexAccounts = createOAuthAccountManager({\n provider: \"codex\",\n label: \"Codex\",\n credentialPath: () => PATHS.CODEX_CREDENTIAL_PATH,\n selectAccount: (accountId) => syncCodexProviderConfig({ accountId }),\n})\nexport const getCodexAccounts = codexAccounts.list\nexport const selectCodexAccount = codexAccounts.select\nexport const removeCodexAccount = codexAccounts.remove\n\nexport async function persistCodexCredentials(\n credentials: CodexCredentials,\n options: PersistCodexCredentialsOptions = {},\n): Promise<void> {\n const generation = options.runtimeGeneration ?? codexRuntimeGeneration\n const persist = async (): Promise<void> => {\n await writeCodexCredentials(credentials, {\n alias: options.alias,\n insertIfMissing: options.insertIfMissing,\n expectedRefreshToken: options.expectedRefreshToken,\n })\n if (options.syncProvider !== false) {\n syncCodexProviderConfig({\n accountId: options.activateAccount ? credentials.accountId : undefined,\n enabled: options.enableProvider ? true : undefined,\n })\n }\n if (\n generation === codexRuntimeGeneration\n && (options.syncProvider !== false\n || getConfiguredCodexAccountId() === credentials.accountId)\n ) {\n applyCodexCredentials(credentials)\n }\n if (options.syncProvider !== false) {\n for (const [key, pending] of codexCredentialsPendingPersistence) {\n if (pending.accountId === credentials.accountId) {\n codexCredentialsPendingPersistence.delete(key)\n }\n }\n }\n }\n\n if (options.syncProvider === false) {\n await persist()\n return\n }\n\n await withCodexAccountMutationLock(persist)\n}\n\nexport interface CodexRefreshDependencies {\n getCurrentCredentials: () => CodexCredentials | null\n persistCodexCredentials: (credentials: CodexCredentials) => Promise<void>\n refreshCodexCredentials: (\n credentials: CodexCredentials,\n ) => Promise<CodexCredentials>\n}\n\nfunction createCodexRefreshDependencies(\n credentials: CodexCredentials,\n): CodexRefreshDependencies {\n const generation = codexRuntimeGeneration\n return {\n getCurrentCredentials: getLoadedCodexCredentials,\n // Persist a rotated token for the old account, but never revive its\n // runtime or overwrite a token family saved by a newer sign-in.\n persistCodexCredentials: (refreshed) =>\n persistCodexCredentials(refreshed, {\n insertIfMissing: false,\n syncProvider: false,\n expectedRefreshToken: credentials.refreshToken,\n runtimeGeneration: generation,\n }),\n refreshCodexCredentials,\n }\n}\n\n/**\n * Refreshes and persists Codex credentials through one module level\n * single-flight guard.\n *\n * The upstream rotates the refresh token on every use, so two concurrent\n * refreshes with the same token make one caller fail and let the slower\n * response overwrite the persisted result. Provider resolution runs on every\n * Codex request, so a burst of requests (or the background loop waking at the\n * same moment) must share a single attempt instead of burning the token.\n */\nexport function refreshCodexCredentialsOnce(\n credentials: CodexCredentials,\n dependencies?: CodexRefreshDependencies,\n): Promise<CodexCredentials> {\n // Prefer a newer snapshot before choosing the single-flight key so callers\n // with old snapshots still share a refresh of the same rotated token.\n const current =\n dependencies ?\n dependencies.getCurrentCredentials()\n : getLoadedCodexCredentials()\n const rotated =\n (\n current\n && current.accountId === credentials.accountId\n && current.refreshToken !== credentials.refreshToken\n ) ?\n current\n : null\n const base = rotated ?? credentials\n const refreshDependencies =\n dependencies ?? createCodexRefreshDependencies(base)\n\n // A new sign-in for the same account has a different refresh token and must\n // not join a refresh or persistence retry from the previous sign-in.\n const refreshKey = JSON.stringify([base.accountId, base.refreshToken])\n const inFlight = codexRefreshInFlight.get(refreshKey)\n if (inFlight) {\n return inFlight\n }\n\n const attempt = (async () => {\n // A successful refresh may have rotated the upstream token before local\n // persistence failed. Retry writing that exact result instead of calling\n // the refresh endpoint again with the consumed token.\n const pendingPersistence =\n codexCredentialsPendingPersistence.get(refreshKey)\n if (pendingPersistence) {\n await refreshDependencies.persistCodexCredentials(pendingPersistence)\n if (\n codexCredentialsPendingPersistence.get(refreshKey)\n === pendingPersistence\n ) {\n codexCredentialsPendingPersistence.delete(refreshKey)\n }\n return pendingPersistence\n }\n\n if (rotated && !isCodexCredentialsExpired(rotated)) {\n return rotated\n }\n\n const refreshed = await refreshDependencies.refreshCodexCredentials(base)\n codexCredentialsPendingPersistence.set(refreshKey, refreshed)\n await refreshDependencies.persistCodexCredentials(refreshed)\n if (codexCredentialsPendingPersistence.get(refreshKey) === refreshed) {\n codexCredentialsPendingPersistence.delete(refreshKey)\n }\n return refreshed\n })()\n\n codexRefreshInFlight.set(refreshKey, attempt)\n\n const clearAttempt = () => {\n if (codexRefreshInFlight.get(refreshKey) === attempt) {\n codexRefreshInFlight.delete(refreshKey)\n }\n }\n\n // Rejected attempts are not shared after they settle. A rotated credential\n // whose persistence failed remains cached above for a write-only retry.\n attempt.then(clearAttempt, clearAttempt)\n\n return attempt\n}\n\nexport const applyCopilotTokenResponse = (\n response: GetCopilotTokenResponse,\n): void => {\n state.copilotToken = response.token\n\n // The token exchange response is authoritative for routing the token it just\n // issued: `/copilot_internal/user` can disagree (e.g. enterprise seats via an\n // org entitlement advertise the business host, while the issued token is\n // bound to the enterprise host, causing 421 Misdirected Request).\n if (response.endpoints?.api) {\n state.copilotApiUrl = response.endpoints.api\n }\n}\n\nexport const setupCopilotToken = async (\n dependencies: CopilotTokenDependencies = defaultCopilotTokenDependencies,\n) => {\n assertGitHubCopilotEnabled()\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 response = await dependencies.getCopilotToken()\n applyCopilotTokenResponse(response)\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:\", state.copilotToken)\n }\n\n stopCopilotRefreshLoop()\n\n const controller = new AbortController()\n copilotRefreshLoopController = controller\n\n runCopilotRefreshLoop(response.refresh_in, controller.signal, dependencies)\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 // A config reload can supersede an initialization awaiting disk or OAuth.\n // Re-resolve the current selection rather than returning stale credentials.\n while (getRawProviderConfig(\"codex\")?.enabled !== false) {\n const generation = codexRuntimeGeneration\n try {\n await setupCodexTokenForGeneration(generation)\n } catch (error) {\n if (generation === codexRuntimeGeneration) throw error\n }\n if (generation === codexRuntimeGeneration) return\n }\n}\n\nconst setupCodexTokenForGeneration = async (\n generation: number,\n): Promise<void> => {\n const configuredAccountId = getConfiguredCodexAccountId()\n const loadedCredentials = getLoadedCodexCredentials()\n if (\n configuredAccountId\n && loadedCredentials?.accountId === configuredAccountId\n && !isCodexCredentialsExpired(loadedCredentials)\n && codexRefreshLoopController\n ) {\n return\n }\n\n let store: Awaited<ReturnType<typeof readCodexCredentialStore>> | undefined\n let selectedAccountId = configuredAccountId\n if (!selectedAccountId) {\n store = await readCodexCredentialStore()\n if (generation !== codexRuntimeGeneration) return\n if (!store || store.accounts.length === 0) {\n throw new Error(\n `Codex credentials not found. Run \\`copilot-api auth login --provider codex\\` first.`,\n )\n }\n if (store.accounts.length > 1) {\n throw new Error(\n \"Multiple Codex accounts found but no account is selected. Run `copilot-api auth codex --use <alias-or-accountId>` first.\",\n )\n }\n\n selectedAccountId = store.accounts[0].accountId\n syncCodexProviderConfig({ accountId: selectedAccountId })\n }\n\n const selectedLoadedCredentials =\n loadedCredentials?.accountId === selectedAccountId ?\n loadedCredentials\n : null\n if (\n selectedLoadedCredentials\n && !isCodexCredentialsExpired(selectedLoadedCredentials)\n ) {\n if (codexRefreshLoopController) {\n return\n }\n\n applyCodexCredentials(selectedLoadedCredentials)\n }\n\n if (loadedCredentials && !selectedLoadedCredentials) {\n stopCodexRefreshLoop()\n }\n\n if (!selectedLoadedCredentials) {\n store ??= await readCodexCredentialStore()\n if (generation !== codexRuntimeGeneration) return\n if (!store || store.accounts.length === 0) {\n throw new Error(\n `Codex credentials not found. Run \\`copilot-api auth login --provider codex\\` first.`,\n )\n }\n }\n\n const credentials =\n selectedLoadedCredentials\n ?? store?.accounts.find(\n (account) => account.accountId === selectedAccountId,\n )\n if (!credentials) {\n throw new Error(\n `Selected Codex account '${selectedAccountId}' was not found. Run \\`copilot-api auth codex --list\\` to inspect available accounts.`,\n )\n }\n\n let nextCredentials = credentials\n if (isCodexCredentialsExpired(credentials)) {\n consola.debug(\"Refreshing expired Codex credentials\")\n nextCredentials = await refreshCodexCredentialsOnce(credentials)\n }\n\n if (generation !== codexRuntimeGeneration) return\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 MAX_RETRY_REFRESH_DELAY_MS = 600_000\nconst RETRY_REFRESH_JITTER_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 dependencies: Pick<CopilotTokenDependencies, \"getCopilotToken\">,\n) => {\n let refreshAtMs = getRefreshDeadlineMs(refreshIn)\n let retryDelayMs = RETRY_REFRESH_DELAY_MS\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 response = await dependencies.getCopilotToken()\n if (signal.aborted) return\n applyCopilotTokenResponse(response)\n refreshAtMs = getRefreshDeadlineMs(response.refresh_in)\n retryDelayMs = RETRY_REFRESH_DELAY_MS\n consola.debug(\"Copilot token refreshed\")\n if (state.showToken) {\n consola.info(\"Refreshed Copilot token:\", state.copilotToken)\n }\n } catch (error) {\n consola.error(\"Failed to refresh Copilot token:\", error)\n const delayMs = Math.min(\n retryDelayMs + Math.floor(Math.random() * RETRY_REFRESH_JITTER_MS),\n MAX_RETRY_REFRESH_DELAY_MS,\n )\n refreshAtMs = Date.now() + delayMs\n retryDelayMs = Math.min(retryDelayMs * 2, MAX_RETRY_REFRESH_DELAY_MS)\n consola.warn(\n `Retrying Copilot token refresh in ${Math.round(delayMs / 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 refreshCodexCredentialsOnce({\n accessToken: state.codexAccessToken ?? \"\",\n refreshToken,\n expiresAt,\n accountId: state.codexAccountId ?? \"\",\n })\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 dependencies: Pick<\n CopilotTokenDependencies,\n \"getCopilotUsage\"\n > = defaultCopilotTokenDependencies,\n) {\n const copilotUser = await dependencies.getCopilotUsage()\n if (!copilotUser) {\n throw new Error(\"GitHub token not found\")\n }\n\n state.userName = copilotUser.login\n consola.info(`Logged in as ${copilotUser.login}`)\n\n state.copilotApiUrl = copilotUser.endpoints.api\n state.tokenBasedBilling = copilotUser.token_based_billing\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@jeffreycao/copilot-api",
|
|
4
|
-
"version": "2.7.
|
|
4
|
+
"version": "2.7.42",
|
|
5
5
|
"description": "GitHub Copilot, OpenAI Codex, OpenCode Go, and third-party AI provider gateway with OpenAI and Anthropic API compatibility.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"github-copilot",
|
package/pages/index.html
CHANGED
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
|
|
19
19
|
<style>
|
|
20
20
|
:root {
|
|
21
|
+
--page-zoom: 0.9;
|
|
22
|
+
zoom: var(--page-zoom);
|
|
23
|
+
|
|
21
24
|
--color-red: #dc2626;
|
|
22
25
|
--color-green: #16a34a;
|
|
23
26
|
--color-yellow: #d97706;
|
|
@@ -62,7 +65,7 @@
|
|
|
62
65
|
}
|
|
63
66
|
|
|
64
67
|
.app-shell {
|
|
65
|
-
min-height: 100vh;
|
|
68
|
+
min-height: calc(100vh / var(--page-zoom));
|
|
66
69
|
background: linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);
|
|
67
70
|
}
|
|
68
71
|
|
|
@@ -1761,7 +1764,7 @@
|
|
|
1761
1764
|
function renderSubscriptionSummary(usage) {
|
|
1762
1765
|
const main = usage.windows.find((window) => window.kind === "usage") || usage.windows[0];
|
|
1763
1766
|
const credits = usage.credits;
|
|
1764
|
-
const showCredits = credits && (credits.
|
|
1767
|
+
const showCredits = credits && (credits.unlimited || (credits.hasCredits && credits.balance !== undefined) || !main);
|
|
1765
1768
|
const value = showCredits ? credits.unlimited ? "∞"
|
|
1766
1769
|
: formatSubscriptionAmount(credits.balance, credits.unit)
|
|
1767
1770
|
: main?.unlimited ? "∞"
|
package/dist/auth-BVjOyO_F.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { t as auth } from "./auth-ByQjInU9.js";
|