@jeffreycao/copilot-api 2.2.2 → 2.2.5

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-u7yV0_hw.js","names":["isAbortError","toError","toAbortReason","isConfiguredResponsesApiWebSocketEnabled","COPILOT_WEBSOCKET_VERSION","delay"],"sources":["../src/lib/error.ts","../src/lib/state.ts","../src/services/responses-websocket.ts","../src/services/responses-websocket-helpers.ts","../src/services/responses-http.ts","../src/lib/request-context.ts","../src/services/codex/create-responses.ts","../src/lib/oauth/codex.ts","../src/lib/request-auth.ts","../src/lib/compact.ts","../src/lib/opencode.ts","../src/lib/api-config.ts","../src/lib/credential-store.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":["import type { Context } from \"hono\"\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\"\n\nimport consola from \"consola\"\n\nexport class HTTPError extends Error {\n response: Response\n\n constructor(message: string, response: Response) {\n super(message)\n this.response = response\n }\n}\n\nexport async function forwardError(\n c: Context,\n error: unknown,\n): Promise<Response> {\n if (c.req.raw.signal.aborted || isAbortError(error)) {\n return new Response(null, {\n status: 499,\n statusText: \"Client Closed Request\",\n })\n }\n\n consola.error(\"Error occurred:\", error)\n\n if (error instanceof HTTPError) {\n if (error.response.status === 429) {\n for (const [name, value] of error.response.headers) {\n const lowerName = name.toLowerCase()\n if (lowerName === \"retry-after\" || lowerName.startsWith(\"x-\")) {\n c.header(name, value)\n }\n }\n }\n\n const errorText = await error.response.text()\n let errorJson: unknown\n try {\n errorJson = JSON.parse(errorText)\n } catch {\n errorJson = errorText\n }\n consola.error(\"HTTP error:\", errorJson)\n return c.json(\n {\n error: {\n message: errorText,\n type: \"error\",\n },\n },\n error.response.status as ContentfulStatusCode,\n )\n }\n\n return c.json(\n {\n error: {\n message: (error as Error).message,\n type: \"error\",\n },\n },\n 500,\n )\n}\n\nconst isAbortError = (error: unknown): boolean =>\n error instanceof Error && error.name === \"AbortError\"\n","import { randomUUID } from \"node:crypto\"\n\nimport type { ModelsResponse } from \"~/lib/types/models\"\n\nexport interface State {\n githubToken?: string\n userName?: string\n copilotToken?: string\n codexAccessToken?: string\n codexRefreshToken?: string\n codexExpiresAt?: number\n codexAccountId?: string\n\n accountType: string\n models?: ModelsResponse\n vsCodeVersion?: string\n\n macMachineId?: string\n vsCodeSessionId?: string\n vsCodeDeviceId: string\n\n showToken: boolean\n\n verbose: boolean\n\n copilotApiUrl?: string\n tokenBasedBilling?: boolean\n}\n\nexport const state: State = {\n accountType: \"individual\",\n showToken: false,\n verbose: false,\n vsCodeDeviceId: randomUUID(),\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 poolKey: string\n signal?: AbortSignal\n url: string\n}\n\nexport interface PooledWebSocketStreamOptions<TChunk> {\n createChunk: (data: string) => TChunk\n isTerminalChunk: (chunk: TChunk) => boolean\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 websocket.send(JSON.stringify(request.payload))\n\n for await (const data of messageStream.iterable) {\n const chunk = options.createChunk(data)\n const isTerminal = options.isTerminalChunk(chunk)\n if (isTerminal) {\n messageStream.complete()\n reusable = true\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(() => {\n removePooledWebSocketEntry(request.poolKey, entry)\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 const websocket = new WebSocket(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 = () => {\n consola.debug(\"WebSocket closed\")\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\"\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\nexport const isTerminalResponsesStreamChunk = (chunk: {\n data?: string\n}): boolean => {\n if (!chunk.data || chunk.data === \"[DONE]\") {\n return false\n }\n\n try {\n const parsed = JSON.parse(chunk.data) as { type?: unknown }\n return (\n parsed.type === \"response.completed\"\n || parsed.type === \"response.failed\"\n || parsed.type === \"response.incomplete\"\n || parsed.type === \"error\"\n )\n } catch {\n return false\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 interface ResponsesHttpLifecycleOptions {\n headersTimeoutMs: number\n signal?: AbortSignal\n streamInactivityTimeoutMs: number\n}\n\nexport class ResponsesHeadersTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Responses upstream did not return headers within ${timeoutMs}ms`)\n this.name = \"ResponsesHeadersTimeoutError\"\n }\n}\n\nexport class ResponsesStreamInactivityTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`Responses upstream stream was inactive for ${timeoutMs}ms`)\n this.name = \"ResponsesStreamInactivityTimeoutError\"\n }\n}\n\nexport async function fetchResponsesWithLifecycle(\n input: string | URL | Request,\n init: RequestInit,\n options: ResponsesHttpLifecycleOptions,\n): Promise<Response> {\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: ResponsesHttpLifecycleOptions,\n): RequestLifecycle => {\n const controller = new AbortController()\n const downstreamSignal = options.signal\n let finished = false\n let headersTimer: ReturnType<typeof setTimeout> | null = null\n\n const abortFromDownstream = () => {\n controller.abort(toAbortReason(downstreamSignal?.reason))\n }\n\n if (downstreamSignal?.aborted) {\n abortFromDownstream()\n } else {\n downstreamSignal?.addEventListener(\"abort\", abortFromDownstream, {\n once: true,\n })\n }\n\n if (!controller.signal.aborted) {\n headersTimer = setTimeout(() => {\n controller.abort(\n new ResponsesHeadersTimeoutError(options.headersTimeoutMs),\n )\n }, options.headersTimeoutMs)\n }\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 downstreamSignal?.removeEventListener(\"abort\", abortFromDownstream)\n }\n\n return {\n abort: (reason) => {\n if (!controller.signal.aborted) controller.abort(reason)\n },\n finish,\n finishWithError: (error) => {\n clearHeadersTimer()\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: ResponsesHttpLifecycleOptions,\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: ResponsesHttpLifecycleOptions,\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\nexport const createResponsesHttpEventStream = async function* (\n response: Response,\n signal?: AbortSignal,\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), signal)\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\nconst readWithLifecycle = async (\n reader: {\n read: () => Promise<{ done: boolean; value?: Uint8Array }>\n },\n lifecycle: RequestLifecycle,\n options: ResponsesHttpLifecycleOptions,\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 ResponsesStreamInactivityTimeoutError(\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\"\n\nexport interface RequestContext {\n traceId: string\n startTime: number\n userAgent: string\n sessionAffinity: string | undefined\n parentSessionId: string | undefined\n}\n\nconst TRACE_ID_MAX_LENGTH = 64\nconst TRACE_ID_PATTERN = /^\\w[\\w.-]*$/\n\nconst asyncLocalStorage = new AsyncLocalStorage<RequestContext>()\n\nexport const requestContext = {\n getStore: () => asyncLocalStorage.getStore(),\n run: <T>(context: RequestContext, callback: () => T) =>\n asyncLocalStorage.run(context, callback),\n}\n\nexport function generateTraceId(): string {\n const timestamp = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `${timestamp}-${random}`\n}\n\nexport function resolveTraceId(traceId: string | null | undefined): string {\n const candidate = traceId?.trim()\n\n if (\n !candidate\n || candidate.length > TRACE_ID_MAX_LENGTH\n || !TRACE_ID_PATTERN.test(candidate)\n ) {\n return generateTraceId()\n }\n\n return candidate\n}\n","import { createHash } from \"node:crypto\"\n\nimport type { 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 getResponsesTransportConfig,\n isResponsesApiWebSocketEnabled as isConfiguredResponsesApiWebSocketEnabled,\n} from \"~/lib/config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\nimport {\n createPooledWebSocketStream,\n createWebSocketUrl,\n type PooledWebSocketRequest,\n} from \"~/services/responses-websocket\"\nimport {\n createResponsesSafeStream,\n encodePoolKeyPart,\n isTerminalResponsesStreamChunk,\n} from \"~/services/responses-websocket-helpers\"\nimport {\n createResponsesHttpEventStream,\n fetchResponsesWithLifecycle,\n} from \"~/services/responses-http\"\nimport { requestContext } from \"~/lib/request-context\"\nimport consola from \"consola\"\n\nexport const CODEX_API_BASE_URL = \"https://chatgpt.com/backend-api\"\n\ntype CodexResponsesWebSocketPayload = ResponsesPayload & {\n type: \"response.create\"\n}\n\ntype ServerSentEventChunk = ServerSentEventMessage\n\ntype CodexResponsesWebSocketRequest =\n PooledWebSocketRequest<CodexResponsesWebSocketPayload>\n\ninterface CodexResponsesHeaderOptions {\n stream?: boolean | null\n}\n\nconst STRIPPED_CODEX_REQUEST_HEADERS = new Set([\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([\"accept\", \"content-type\"])\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 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 applyOpencodeCodexHeaders(headers)\n return headers\n}\n\nexport function resolveCodexResponsesTransport(\n transport?: ResponsesTransport,\n): ResponsesTransport {\n return (\n transport\n ?? (isConfiguredResponsesApiWebSocketEnabled() ? \"websocket\" : \"http\")\n )\n}\n\nexport function buildCodexResponsesWebSocketHeaders(\n requestHeaders: Headers,\n): Record<string, string> {\n const headers = buildCodexResponsesHeaders(requestHeaders)\n 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 signal?: AbortSignal,\n): CodexResponsesWebSocketRequest {\n const headers = buildCodexResponsesWebSocketHeaders(requestHeaders)\n\n return {\n headers,\n payload: buildCodexResponsesWebSocketPayload(payload),\n poolKey: buildCodexResponsesWebSocketPoolKey(payload, headers, baseUrl),\n signal,\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 signal?: AbortSignal\n transport?: ResponsesTransport\n } = {},\n): Promise<CreateResponsesReturn> {\n consola.log(`<-- model: ${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.signal,\n )\n }\n\n const normalizedPayload = normalizeCodexResponsesPayload(payload)\n\n const transportConfig = getResponsesTransportConfig()\n const response = await fetchResponsesWithLifecycle(\n resolveCodexResponsesUrl(baseUrl),\n {\n method: \"POST\",\n headers: buildCodexResponsesHeaders(requestHeaders, {\n stream: normalizedPayload.stream,\n }),\n body: JSON.stringify(normalizedPayload),\n },\n {\n headersTimeoutMs: transportConfig.headersTimeoutMs,\n signal: options.signal,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n },\n )\n\n if (!response.ok) {\n throw new HTTPError(\"Failed to create codex responses\", response)\n }\n\n if (normalizedPayload.stream) {\n return createResponsesSafeStream(\n createResponsesHttpEventStream(response, options.signal),\n { signal: options.signal },\n )\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]) => !headerName.toLowerCase().includes(\"trace\"))\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 signal?: AbortSignal,\n): ResponsesStream => {\n const websocketRequest = prepareCodexResponsesWebSocketRequest(\n payload,\n requestHeaders,\n baseUrl,\n signal,\n )\n\n return createCodexResponsesWebSocketStream(websocketRequest)\n}\n\nconst createCodexResponsesWebSocketStream = (\n request: CodexResponsesWebSocketRequest,\n): ResponsesStream => {\n const transportConfig = getResponsesTransportConfig()\n return createResponsesSafeStream(\n createPooledWebSocketStream(request, {\n createChunk: createCodexResponsesWebSocketStreamChunk,\n maxBufferedBytes: transportConfig.websocketMaxBufferedBytes,\n maxBufferedMessages: transportConfig.websocketMaxBufferedMessages,\n isTerminalChunk: isTerminalResponsesStreamChunk,\n openErrorMessage: \"Failed to create codex responses websocket\",\n openTimeoutMs: transportConfig.websocketOpenTimeoutMs,\n poolIdleTimeoutMs: transportConfig.websocketPoolIdleTimeoutMs,\n streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,\n streamErrorMessage: \"Codex responses websocket stream error\",\n terminalChunkMissingMessage:\n \"Codex responses websocket ended without a terminal response\",\n }),\n { signal: request.signal },\n )\n}\n\nconst 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 if (parsed.type === \"error\" && parsed.error) {\n consola.warn(\"Codex responses websocket stream error:\", parsed.error)\n parsed.message = parsed.error.message\n }\n\n return {\n event: typeof parsed.type === \"string\" ? parsed.type : undefined,\n data: JSON.stringify(parsed),\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n }\n } catch {\n return { data }\n }\n}\n","import { randomBytes } from \"node:crypto\"\nimport { createServer } from \"node:http\"\n\nexport { CODEX_API_BASE_URL } from \"~/services/codex/create-responses\"\n\nconst CALLBACK_HOST = \"127.0.0.1\"\nconst CALLBACK_PORT = 1455\nconst CALLBACK_PATH = \"/auth/callback\"\nconst CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\"\nconst AUTHORIZE_URL = \"https://auth.openai.com/oauth/authorize\"\nconst TOKEN_URL = \"https://auth.openai.com/oauth/token\"\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`\nconst SCOPE = \"openid profile email offline_access\"\nconst JWT_CLAIM_PATH = \"https://api.openai.com/auth\"\nconst REFRESH_BUFFER_MS = 60_000\nconst CALLBACK_TIMEOUT_MS = 45_000\n\ninterface TokenSuccessResult {\n accessToken: string\n refreshToken: string\n expiresAt: number\n}\n\ninterface OAuthPageOptions {\n title: string\n heading: string\n message: string\n}\n\nexport interface CodexCredentials {\n accessToken: string\n refreshToken: string\n expiresAt: number\n accountId: string\n}\n\nexport interface CodexAuthInfo {\n url: string\n instructions?: string\n}\n\nexport interface LoginCodexOptions {\n onAuth: (info: CodexAuthInfo) => void\n onPrompt: (message: string) => Promise<string>\n onProgress?: (message: string) => void\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64url\")\n}\n\nasync function generatePkce(): Promise<{\n verifier: string\n challenge: string\n}> {\n const verifierBytes = new Uint8Array(32)\n crypto.getRandomValues(verifierBytes)\n const verifier = base64UrlEncode(verifierBytes)\n const hashBuffer = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(verifier),\n )\n\n return {\n verifier,\n challenge: base64UrlEncode(new Uint8Array(hashBuffer)),\n }\n}\n\nfunction createState(): string {\n return randomBytes(16).toString(\"hex\")\n}\n\nfunction parseAuthorizationInput(input: string): {\n code?: string\n state?: string\n} {\n const value = input.trim()\n if (!value) {\n return {}\n }\n\n try {\n const url = new URL(value)\n return {\n code: url.searchParams.get(\"code\") ?? undefined,\n state: url.searchParams.get(\"state\") ?? undefined,\n }\n } catch {\n // Continue and parse it as plain text.\n }\n\n if (value.includes(\"#\")) {\n const [code, state] = value.split(\"#\", 2)\n return { code, state }\n }\n\n if (value.includes(\"code=\")) {\n const params = new URLSearchParams(value)\n return {\n code: params.get(\"code\") ?? undefined,\n state: params.get(\"state\") ?? undefined,\n }\n }\n\n return { code: value }\n}\n\nfunction decodeJwt(accessToken: string): Record<string, unknown> | null {\n try {\n const payload = accessToken.split(\".\")[1]\n if (!payload) {\n return null\n }\n return JSON.parse(\n Buffer.from(payload, \"base64url\").toString(\"utf8\"),\n ) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nfunction getAccountId(accessToken: string): string | null {\n const payload = decodeJwt(accessToken)\n if (!payload) {\n return null\n }\n\n const authPayload = payload[JWT_CLAIM_PATH]\n if (!authPayload || typeof authPayload !== \"object\") {\n return null\n }\n\n const accountId = (authPayload as { chatgpt_account_id?: unknown })\n .chatgpt_account_id\n return typeof accountId === \"string\" && accountId ? accountId : null\n}\n\nfunction renderOAuthPage(options: OAuthPageOptions): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(options.title)}</title>\n <style>\n body {\n margin: 0;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #09090b;\n color: #fafafa;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n text-align: center;\n }\n main {\n max-width: 560px;\n }\n h1 {\n margin: 0 0 12px;\n font-size: 28px;\n line-height: 1.15;\n }\n p {\n margin: 0;\n color: #a1a1aa;\n line-height: 1.6;\n }\n </style>\n</head>\n<body>\n <main>\n <h1>${escapeHtml(options.heading)}</h1>\n <p>${escapeHtml(options.message)}</p>\n </main>\n</body>\n</html>`\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\")\n}\n\nfunction renderOAuthSuccessPage(message: string): string {\n return renderOAuthPage({\n title: \"Authentication successful\",\n heading: \"Authentication successful\",\n message,\n })\n}\n\nfunction renderOAuthErrorPage(message: string): string {\n return renderOAuthPage({\n title: \"Authentication failed\",\n heading: \"Authentication failed\",\n message,\n })\n}\n\nasync function exchangeAuthorizationCode(\n code: string,\n verifier: string,\n): Promise<TokenSuccessResult> {\n const response = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: CLIENT_ID,\n code,\n code_verifier: verifier,\n redirect_uri: REDIRECT_URI,\n }),\n })\n\n if (!response.ok) {\n const details = await response.text().catch(() => \"\")\n throw new Error(\n `Codex token exchange failed (${response.status}): ${details || response.statusText}`,\n )\n }\n\n const payload = (await response.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof payload.access_token !== \"string\"\n || typeof payload.refresh_token !== \"string\"\n || typeof payload.expires_in !== \"number\"\n ) {\n throw new TypeError(\n `Codex token exchange response missing fields: ${JSON.stringify(payload)}`,\n )\n }\n\n return {\n accessToken: payload.access_token,\n refreshToken: payload.refresh_token,\n expiresAt: Date.now() + payload.expires_in * 1000,\n }\n}\n\nasync function refreshAccessToken(\n refreshToken: string,\n): Promise<TokenSuccessResult> {\n const response = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: CLIENT_ID,\n }),\n })\n\n if (!response.ok) {\n const details = await response.text().catch(() => \"\")\n throw new Error(\n `Codex token refresh failed (${response.status}): ${details || response.statusText}`,\n )\n }\n\n const payload = (await response.json()) as {\n access_token?: unknown\n refresh_token?: unknown\n expires_in?: unknown\n }\n\n if (\n typeof payload.access_token !== \"string\"\n || typeof payload.refresh_token !== \"string\"\n || typeof payload.expires_in !== \"number\"\n ) {\n throw new TypeError(\n `Codex token refresh response missing fields: ${JSON.stringify(payload)}`,\n )\n }\n\n return {\n accessToken: payload.access_token,\n refreshToken: payload.refresh_token,\n expiresAt: Date.now() + payload.expires_in * 1000,\n }\n}\n\nasync function createAuthorizationFlow(): Promise<{\n verifier: string\n state: string\n url: string\n}> {\n const { verifier, challenge } = await generatePkce()\n const state = createState()\n const url = new URL(AUTHORIZE_URL)\n url.searchParams.set(\"response_type\", \"code\")\n url.searchParams.set(\"client_id\", CLIENT_ID)\n url.searchParams.set(\"redirect_uri\", REDIRECT_URI)\n url.searchParams.set(\"scope\", SCOPE)\n url.searchParams.set(\"code_challenge\", challenge)\n url.searchParams.set(\"code_challenge_method\", \"S256\")\n url.searchParams.set(\"state\", state)\n url.searchParams.set(\"id_token_add_organizations\", \"true\")\n url.searchParams.set(\"codex_cli_simplified_flow\", \"true\")\n url.searchParams.set(\"originator\", \"copilot-api\")\n\n return { verifier, state, url: url.toString() }\n}\n\nasync function waitForAuthorizationCode(state: string): Promise<string | null> {\n let resolveCode: ((code: string | null) => void) | undefined\n const waitForCode = new Promise<string | null>((resolve) => {\n resolveCode = resolve\n })\n\n const server = createServer((request, response) => {\n try {\n const url = new URL(request.url || \"\", \"http://localhost\")\n if (url.pathname !== CALLBACK_PATH) {\n response.statusCode = 404\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(renderOAuthErrorPage(\"Callback route not found.\"))\n return\n }\n\n if (url.searchParams.get(\"state\") !== state) {\n response.statusCode = 400\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(renderOAuthErrorPage(\"State mismatch.\"))\n return\n }\n\n const code = url.searchParams.get(\"code\")\n if (!code) {\n response.statusCode = 400\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(renderOAuthErrorPage(\"Missing authorization code.\"))\n return\n }\n\n response.statusCode = 200\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(\n renderOAuthSuccessPage(\n \"OpenAI Codex authentication completed. You can close this window.\",\n ),\n )\n resolveCode?.(code)\n } catch {\n response.statusCode = 500\n response.setHeader(\"Content-Type\", \"text/html; charset=utf-8\")\n response.end(\n renderOAuthErrorPage(\"Internal error while processing OAuth callback.\"),\n )\n }\n })\n\n try {\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(CALLBACK_PORT, CALLBACK_HOST, () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n } catch {\n return null\n }\n\n try {\n const timeout = new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), CALLBACK_TIMEOUT_MS)\n })\n return await Promise.race([waitForCode, timeout])\n } finally {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error)\n return\n }\n resolve()\n })\n }).catch(() => undefined)\n }\n}\n\nexport async function loginCodex(\n options: LoginCodexOptions,\n): Promise<CodexCredentials> {\n const { verifier, state, url } = await createAuthorizationFlow()\n options.onAuth({\n url,\n instructions:\n \"Please complete the login in the browser. If the browser does not automatically redirect, please paste the callback URL or code back to the terminal.\",\n })\n options.onProgress?.(\"Waiting for Codex OAuth callback\")\n\n let code = await waitForAuthorizationCode(state)\n if (!code) {\n const input = await options.onPrompt(\n \"Paste the authorization code or full redirect URL:\",\n )\n const parsed = parseAuthorizationInput(input)\n if (parsed.state && parsed.state !== state) {\n throw new Error(\"Codex OAuth state mismatch\")\n }\n code = parsed.code ?? null\n }\n\n if (!code) {\n throw new Error(\"Missing Codex authorization code\")\n }\n\n const tokenResult = await exchangeAuthorizationCode(code, verifier)\n const accountId = getAccountId(tokenResult.accessToken)\n if (!accountId) {\n throw new Error(\"Failed to extract Codex account id from access token\")\n }\n\n return {\n accessToken: tokenResult.accessToken,\n refreshToken: tokenResult.refreshToken,\n expiresAt: tokenResult.expiresAt,\n accountId,\n }\n}\n\nexport async function refreshCodexCredentials(\n credentials: CodexCredentials,\n): Promise<CodexCredentials> {\n const tokenResult = await refreshAccessToken(credentials.refreshToken)\n const accountId = getAccountId(tokenResult.accessToken)\n if (!accountId) {\n throw new Error(\"Failed to extract Codex account id from access token\")\n }\n\n return {\n accessToken: tokenResult.accessToken,\n refreshToken: tokenResult.refreshToken,\n expiresAt: tokenResult.expiresAt,\n accountId,\n }\n}\n\nexport function isCodexCredentialsExpired(\n credentials: Pick<CodexCredentials, \"expiresAt\">,\n now: number = Date.now(),\n): boolean {\n return credentials.expiresAt <= now + REFRESH_BUFFER_MS\n}\n","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 copilot-api 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 { COMPACT_REQUEST, type CompactType } from \"~/lib/compact\"\n\nimport type { State } from \"./state\"\n\nimport { getCachedOpencodeVersion } from \"./opencode\"\nimport { requestContext } from \"./request-context\"\n\nexport const isOpencodeOauthApp = (): boolean => {\n return process.env.COPILOT_API_OAUTH_APP?.trim() === \"opencode\"\n}\n\nexport const normalizeDomain = (input: string): string => {\n return input\n .trim()\n .replace(/^https?:\\/\\//u, \"\")\n .replace(/\\/+$/u, \"\")\n}\n\nexport const getEnterpriseDomain = (): string | null => {\n const raw = (process.env.COPILOT_API_ENTERPRISE_URL ?? \"\").trim()\n if (!raw) return null\n const normalized = normalizeDomain(raw)\n return normalized || null\n}\n\nexport const getGitHubBaseUrl = (): string => {\n const resolvedDomain = getEnterpriseDomain()\n return resolvedDomain ? `https://${resolvedDomain}` : GITHUB_BASE_URL\n}\n\nexport const getGitHubApiBaseUrl = (): string => {\n const resolvedDomain = getEnterpriseDomain()\n return resolvedDomain ? `https://api.${resolvedDomain}` : GITHUB_API_BASE_URL\n}\n\nconst getOpencodeOauthHeaders = (): Record<string, string> => {\n return {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": getOpencodeVersion(),\n }\n}\n\nconst getOpencodeLLMHeaders = (): Record<string, string> => {\n return {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"User-Agent\": OPENCODE_LLM_USER_AGENT,\n }\n}\n\nconst normalizeOpencodeUserAgent = (userAgent: string): string => {\n const candidate = userAgent.trim()\n const opencodeProduct = candidate.match(/^opencode\\/[^\\s,]+/u)?.[0]\n\n if (!opencodeProduct || candidate.includes(`, ${opencodeProduct}`)) {\n return candidate\n }\n\n return `${candidate}, ${opencodeProduct}`\n}\n\nexport const getOauthUrls = (): {\n deviceCodeUrl: string\n accessTokenUrl: string\n} => {\n const githubBaseUrl = getGitHubBaseUrl()\n\n return {\n deviceCodeUrl: `${githubBaseUrl}/login/device/code`,\n accessTokenUrl: `${githubBaseUrl}/login/oauth/access_token`,\n }\n}\n\ninterface OauthAppConfig {\n clientId: string\n headers: Record<string, string>\n scope: string\n}\n\nexport const getOauthAppConfig = (): OauthAppConfig => {\n if (isOpencodeOauthApp()) {\n return {\n clientId: OPENCODE_GITHUB_CLIENT_ID,\n headers: getOpencodeOauthHeaders(),\n scope: GITHUB_APP_SCOPES,\n }\n }\n\n return {\n clientId: GITHUB_CLIENT_ID,\n headers: standardHeaders(),\n scope: GITHUB_APP_SCOPES,\n }\n}\n\nexport const prepareForCompact = (\n headers: Record<string, string>,\n compactType?: CompactType,\n) => {\n if (compactType) {\n headers[\"x-initiator\"] = \"agent\"\n if (!isOpencodeOauthApp() && compactType === COMPACT_REQUEST) {\n headers[\"x-interaction-type\"] = \"conversation-compaction\"\n headers[\"openai-intent\"] = \"conversation-agent\"\n }\n }\n}\n\nexport const prepareInteractionHeaders = (\n sessionId: string | undefined,\n isSubagent: boolean,\n headers: Record<string, string>,\n) => {\n const sendInteractionHeaders = !isOpencodeOauthApp()\n\n if (isSubagent) {\n headers[\"x-initiator\"] = \"agent\"\n if (sendInteractionHeaders) {\n headers[\"x-interaction-type\"] = \"conversation-subagent\"\n }\n }\n\n if (sessionId && sendInteractionHeaders) {\n headers[\"x-interaction-id\"] = sessionId\n }\n}\n\nexport const standardHeaders = () => ({\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n})\n\nexport const getOpencodeVersion = () => {\n const version = getCachedOpencodeVersion()\n if (version) {\n return \"opencode/\" + version\n }\n return OPENCODE_VERSION\n}\n\nconst OPENCODE_VERSION = \"opencode/1.14.29\"\nconst OPENCODE_LLM_USER_AGENT =\n \"opencode/1.14.29 ai-sdk/provider-utils/4.0.23 runtime/bun/1.3.13, opencode/1.14.29\"\n\nconst COPILOT_VERSION = \"0.58.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.112 (external, sdk-ts, agent-sdk/0.2.112)\"\nconst COPILOT_WEBSOCKET_VERSION = COPILOT_VERSION\nconst EDITOR_WEBSOCKET_PLUGIN_VERSION = `copilot-chat/${COPILOT_WEBSOCKET_VERSION}`\n\nconst API_VERSION = \"2026-06-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 = (headers: Record<string, string>) => {\n if (isOpencodeOauthApp()) {\n return\n }\n\n // vscode copilot claude agent regenerates request id for\n // each request, keeping it consistent\n const requestIdValue = randomUUID()\n headers[\"x-agent-task-id\"] = requestIdValue\n headers[\"x-request-id\"] = requestIdValue\n\n // Consistent with vscode copilot claude agent\n headers[\"x-interaction-type\"] = \"messages-proxy\"\n headers[\"openai-intent\"] = \"messages-proxy\"\n headers[\"user-agent\"] = CLAUDE_AGENT_USER_AGENT\n\n delete headers[\"copilot-integration-id\"]\n}\n\nexport const githubUserHeaders = (state: State): Record<string, string> => {\n if (isOpencodeOauthApp()) {\n return {\n Authorization: `Bearer ${state.githubToken}`,\n \"User-Agent\": getOpencodeVersion(),\n }\n }\n return {\n accept: \"application/vnd.github+json\",\n authorization: `token ${state.githubToken}`,\n \"user-agent\": USER_AGENT,\n \"x-github-api-version\": \"2022-11-28\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\",\n }\n}\n\nexport const copilotModelsHeaders = (state: State) => {\n if (isOpencodeOauthApp()) {\n return {\n Authorization: `Bearer ${state.copilotToken}`,\n \"User-Agent\": getOpencodeVersion(),\n }\n }\n const headers = githubCopilotHeaders(state)\n headers[\"x-interaction-type\"] = \"model-access\"\n headers[\"openai-intent\"] = \"model-access\"\n delete headers[\"x-interaction-id\"]\n delete headers[\"content-type\"]\n return headers\n}\n\nexport const copilotHeaders = (\n state: State,\n requestId?: string,\n vision: boolean = false,\n) => {\n if (isOpencodeOauthApp()) {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${state.copilotToken}`,\n ...getOpencodeLLMHeaders(),\n \"Openai-Intent\": \"conversation-edits\",\n }\n\n const store = requestContext.getStore()\n const userAgent = store?.userAgent.trim()\n // Real opencode traffic already carries a versioned opencode/* UA,\n // so prefer the inbound header to keep upstream behavior aligned.\n if (userAgent?.startsWith(\"opencode/\")) {\n headers[\"User-Agent\"] = normalizeOpencodeUserAgent(userAgent)\n }\n\n if (store?.sessionAffinity) {\n headers[\"x-session-affinity\"] = store.sessionAffinity\n }\n\n if (store?.parentSessionId) {\n headers[\"x-parent-session-id\"] = store.parentSessionId\n }\n\n if (vision) headers[\"Copilot-Vision-Request\"] = \"true\"\n\n return headers\n }\n\n return githubCopilotHeaders(state, requestId, vision)\n}\n\nexport const copilotWebSocketHeaders = (\n preparedHeaders: Record<string, string>,\n) => {\n if (isOpencodeOauthApp()) {\n return omitHeader(preparedHeaders, \"x-initiator\")\n }\n\n const requestId =\n getPreparedHeader(preparedHeaders, \"x-request-id\") ?? randomUUID()\n const source = createHeaderResolver(preparedHeaders)\n const headers: Record<string, string> = {\n Authorization: source(\"authorization\"),\n \"X-Request-Id\": requestId,\n \"OpenAI-Intent\": source(\"openai-intent\", \"conversation-agent\"),\n \"X-GitHub-Api-Version\": source(\n \"x-github-api-version\",\n WEBSOCKET_API_VERSION,\n ),\n \"X-Interaction-Id\": source(\"x-interaction-id\", requestId),\n \"X-Interaction-Type\": source(\"x-interaction-type\", \"conversation-agent\"),\n \"X-Agent-Task-Id\": source(\"x-agent-task-id\", requestId),\n }\n\n setPreparedHeader(\n headers,\n \"VScode-SessionId\",\n preparedHeaders,\n \"vscode-sessionid\",\n )\n\n setPreparedHeader(\n headers,\n \"VScode-MachineId\",\n preparedHeaders,\n \"vscode-machineid\",\n )\n\n Object.assign(headers, {\n \"Editor-Device-Id\": source(\"editor-device-id\"),\n \"Editor-Plugin-Version\": source(\n \"editor-plugin-version\",\n EDITOR_WEBSOCKET_PLUGIN_VERSION,\n ),\n \"Editor-Version\": source(\"editor-version\"),\n \"Copilot-Integration-Id\": source(\"copilot-integration-id\", \"vscode-chat\"),\n })\n\n setPreparedHeader(\n headers,\n \"Copilot-Vision-Request\",\n preparedHeaders,\n \"copilot-vision-request\",\n )\n\n headers[\"user-agent\"] = \"node\"\n\n return headers\n}\n\nconst createHeaderResolver =\n (headers: Record<string, string>) =>\n (headerName: string, fallback: string = \"\"): string =>\n getPreparedHeader(headers, headerName) ?? fallback\n\nconst getPreparedHeader = (\n headers: Record<string, string>,\n headerName: string,\n): string | undefined => {\n const normalizedHeaderName = headerName.toLowerCase()\n const match = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === normalizedHeaderName,\n )\n\n return match?.[1]\n}\n\nconst setPreparedHeader = (\n target: Record<string, string>,\n targetHeaderName: string,\n source: Record<string, string>,\n sourceHeaderName: string,\n): void => {\n const value = getPreparedHeader(source, sourceHeaderName)\n if (value) {\n target[targetHeaderName] = value\n }\n}\n\nconst omitHeader = (\n headers: Record<string, string>,\n headerName: string,\n): Record<string, string> => {\n const normalizedHeaderName = headerName.toLowerCase()\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => key.toLowerCase() !== normalizedHeaderName,\n ),\n )\n}\n\nconst githubCopilotHeaders = (\n state: State,\n requestId?: string,\n vision: boolean = false,\n) => {\n const requestIdValue = requestId ?? randomUUID()\n const headers: Record<string, string> = {\n Authorization: `Bearer ${state.copilotToken}`,\n \"content-type\": standardHeaders()[\"content-type\"],\n \"copilot-integration-id\": \"vscode-chat\",\n \"editor-device-id\": state.vsCodeDeviceId,\n \"editor-version\": `vscode/${state.vsCodeVersion}`,\n \"editor-plugin-version\": EDITOR_PLUGIN_VERSION,\n \"user-agent\": USER_AGENT,\n \"openai-intent\": \"conversation-agent\",\n \"x-github-api-version\": API_VERSION,\n \"x-request-id\": requestIdValue,\n \"x-vscode-user-agent-library-version\": \"electron-fetch\",\n \"x-agent-task-id\": requestIdValue,\n \"x-interaction-type\": \"conversation-agent\",\n }\n\n if (vision) headers[\"copilot-vision-request\"] = \"true\"\n\n if (state.macMachineId) {\n headers[\"vscode-machineid\"] = state.macMachineId\n }\n\n if (state.vsCodeSessionId) {\n headers[\"vscode-sessionid\"] = state.vsCodeSessionId\n }\n\n return headers\n}\n\nexport const GITHUB_API_BASE_URL = \"https://api.github.com\"\nexport const githubHeaders = (state: State): Record<string, string> => {\n if (isOpencodeOauthApp()) {\n return {\n Authorization: `Bearer ${state.githubToken}`,\n ...getOpencodeOauthHeaders(),\n }\n }\n return {\n authorization: `token ${state.githubToken}`,\n \"user-agent\": USER_AGENT,\n \"x-github-api-version\": \"2025-04-01\",\n \"x-vscode-user-agent-library-version\": \"electron-fetch\",\n }\n}\n\nexport const GITHUB_BASE_URL = \"https://github.com\"\nexport const GITHUB_CLIENT_ID = \"Iv1.b507a08c87ecfe98\"\nexport const GITHUB_APP_SCOPES = [\"read:user\"].join(\" \")\nexport const OPENCODE_GITHUB_CLIENT_ID = \"Ov23li8tweQw6odWQebz\"\n","import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { CodexCredentials } from \"~/lib/oauth/codex\"\n\nimport { PATHS } from \"./paths\"\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nasync function readOptionalFile(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf8\")\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return null\n }\n throw error\n }\n}\n\nasync function writeProtectedFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, content, \"utf8\")\n try {\n await fs.chmod(filePath, 0o600)\n } catch {\n return\n }\n}\n\nfunction normalizeCodexCredentials(\n credentials: unknown,\n): CodexCredentials | null {\n if (!credentials || typeof credentials !== \"object\") {\n return null\n }\n\n const candidate = credentials as Partial<CodexCredentials>\n if (\n typeof candidate.accessToken !== \"string\"\n || typeof candidate.refreshToken !== \"string\"\n || typeof candidate.expiresAt !== \"number\"\n || typeof candidate.accountId !== \"string\"\n ) {\n return null\n }\n\n return {\n accessToken: candidate.accessToken,\n refreshToken: candidate.refreshToken,\n expiresAt: candidate.expiresAt,\n accountId: candidate.accountId,\n }\n}\n\nexport async function readGitHubToken(): Promise<string | null> {\n const token = await readOptionalFile(PATHS.GITHUB_TOKEN_PATH)\n const normalizedToken = token?.trim()\n return normalizedToken || null\n}\n\nexport async function writeGitHubToken(token: string): Promise<void> {\n await writeProtectedFile(PATHS.GITHUB_TOKEN_PATH, token.trim())\n}\n\nexport async function readCodexCredentials(): Promise<CodexCredentials | null> {\n const raw = await readOptionalFile(PATHS.CODEX_CREDENTIAL_PATH)\n if (!raw?.trim()) {\n return null\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw) as unknown\n } catch (error) {\n throw new Error(\n `Codex credentials file is not valid JSON: ${PATHS.CODEX_CREDENTIAL_PATH}`,\n {\n cause: error,\n },\n )\n }\n\n const credentials = normalizeCodexCredentials(parsed)\n if (!credentials) {\n throw new Error(\n `Codex credentials file is missing required fields: ${PATHS.CODEX_CREDENTIAL_PATH}`,\n )\n }\n\n return credentials\n}\n\nexport async function writeCodexCredentials(\n credentials: CodexCredentials,\n): Promise<void> {\n await writeProtectedFile(\n PATHS.CODEX_CREDENTIAL_PATH,\n `${JSON.stringify(credentials, null, 2)}\\n`,\n )\n}\n\nexport async function clearCodexCredentials(): Promise<void> {\n await writeProtectedFile(PATHS.CODEX_CREDENTIAL_PATH, \"\")\n}\n\nexport async function hasCodexCredentials(): Promise<boolean> {\n return (await readCodexCredentials()) !== null\n}\n","import consola from \"consola\"\n\nimport { getGitHubApiBaseUrl, githubHeaders } from \"~/lib/api-config\"\nimport { HTTPError } from \"~/lib/error\"\nimport { state } from \"~/lib/state\"\n\nexport const getCopilotToken = async () => {\n const response = await fetch(\n `${getGitHubApiBaseUrl()}/copilot_internal/v2/token`,\n {\n headers: githubHeaders(state),\n },\n )\n\n if (!response.ok) {\n const errorText = await response.clone().text()\n consola.error(\"Failed to get Copilot token response body\", errorText)\n\n throw new HTTPError(\"Failed to get Copilot token\", response)\n }\n\n return (await response.json()) as GetCopilotTokenResponse\n}\n\n// Trimmed for the sake of simplicity\ninterface GetCopilotTokenResponse {\n expires_at: number\n refresh_in: number\n token: string\n}\n","import 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): 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 },\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\"\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\nconst findLastUserContent = (\n messages: Array<PayloadMessage>,\n): string | null => {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg.role === \"user\" && msg.content) {\n if (typeof msg.content === \"string\") {\n return msg.content\n } else if (Array.isArray(msg.content)) {\n const array = msg.content\n .filter((n) => n.type !== \"tool_result\")\n .map((n) => ({ ...n, cache_control: undefined }))\n if (array.length > 0) {\n return JSON.stringify(array)\n }\n }\n }\n }\n return null\n}\n\nexport const generateRequestIdFromPayload = (\n payload: {\n messages: string | Array<PayloadMessage> | undefined\n },\n sessionId?: string,\n): string => {\n const messages = payload.messages\n if (messages) {\n const lastUserContent =\n typeof messages === \"string\" ? messages : findLastUserContent(messages)\n\n if (lastUserContent) {\n return getUUID(\n (sessionId ?? \"\") + (state.macMachineId ?? \"\") + lastUserContent,\n )\n }\n }\n\n return randomUUID()\n}\n\nexport const getRootSessionId = (\n anthropicPayload: AnthropicMessagesPayload,\n c: Context,\n): string | undefined => {\n const userId = anthropicPayload.metadata?.user_id\n const sessionId =\n userId ?\n parseUserIdMetadata(userId).sessionId || undefined\n : c.req.header(\"x-session-id\")\n\n return sessionId ? getUUID(sessionId) : sessionId\n}\n\nexport const getUUID = (content: string): string => {\n const uuidBytes = createHash(\"sha256\")\n .update(content)\n .digest()\n .subarray(0, 16)\n\n uuidBytes[6] = (uuidBytes[6] & 0x0f) | 0x40\n uuidBytes[8] = (uuidBytes[8] & 0x3f) | 0x80\n\n const uuidHex = uuidBytes.toString(\"hex\")\n\n return `${uuidHex.slice(0, 8)}-${uuidHex.slice(8, 12)}-${uuidHex.slice(12, 16)}-${uuidHex.slice(16, 20)}-${uuidHex.slice(20)}`\n}\n","import consola from \"consola\"\n\nimport { getOauthAppConfig, getOauthUrls } from \"~/lib/api-config\"\nimport { sleep } from \"~/lib/utils\"\n\nimport type { DeviceCodeResponse } from \"./get-device-code\"\n\nexport async function pollAccessToken(\n deviceCode: DeviceCodeResponse,\n): Promise<string> {\n const { clientId, headers } = getOauthAppConfig()\n const { accessTokenUrl } = getOauthUrls()\n\n // Interval is in seconds, we need to multiply by 1000 to get milliseconds\n // I'm also adding another second, just to be safe\n const sleepDuration = (deviceCode.interval + 1) * 1000\n consola.debug(`Polling access token with interval of ${sleepDuration}ms`)\n\n while (true) {\n const response = await fetch(accessTokenUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n client_id: clientId,\n device_code: deviceCode.device_code,\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n }),\n })\n\n if (!response.ok) {\n await sleep(sleepDuration)\n consola.error(\"Failed to poll access token:\", await response.text())\n\n continue\n }\n\n const json = await response.json()\n consola.debug(\"Polling access token response:\", json)\n\n const { access_token } = json as AccessTokenResponse\n\n if (access_token) {\n return access_token\n } else {\n await sleep(sleepDuration)\n }\n }\n}\n\ninterface AccessTokenResponse {\n access_token: string\n token_type: string\n scope: string\n}\n","import consola from \"consola\"\nimport { setTimeout as delay } from \"node:timers/promises\"\n\nimport { isOpencodeOauthApp } from \"~/lib/api-config\"\nimport { getRawProviderConfig, setProviderConfig } from \"~/lib/config\"\nimport {\n readCodexCredentials,\n readGitHubToken,\n writeCodexCredentials,\n writeGitHubToken,\n} from \"~/lib/credential-store\"\nimport {\n isCodexCredentialsExpired,\n refreshCodexCredentials,\n type CodexCredentials,\n} from \"~/lib/oauth/codex\"\nimport { CODEX_API_BASE_URL } from \"~/services/codex/create-responses\"\nimport { getCopilotToken } from \"~/services/github/get-copilot-token\"\nimport { getCopilotUsage } from \"~/services/github/get-copilot-usage\"\nimport { getDeviceCode } from \"~/services/github/get-device-code\"\nimport { pollAccessToken } from \"~/services/github/poll-access-token\"\n\nimport { HTTPError } from \"./error\"\nimport { state } from \"./state\"\n\nlet copilotRefreshLoopController: AbortController | null = null\nlet codexRefreshLoopController: AbortController | null = null\n\nexport const stopCopilotRefreshLoop = () => {\n if (!copilotRefreshLoopController) {\n return\n }\n\n copilotRefreshLoopController.abort()\n copilotRefreshLoopController = null\n}\n\nexport const stopCodexRefreshLoop = () => {\n if (!codexRefreshLoopController) {\n return\n }\n\n codexRefreshLoopController.abort()\n codexRefreshLoopController = null\n}\n\nfunction applyCodexCredentials(credentials: CodexCredentials): void {\n state.codexAccessToken = credentials.accessToken\n state.codexRefreshToken = credentials.refreshToken\n state.codexExpiresAt = credentials.expiresAt\n state.codexAccountId = credentials.accountId\n\n consola.debug(\"Codex credentials loaded successfully\")\n if (state.showToken) {\n consola.info(\"Codex access token:\", credentials.accessToken)\n }\n}\n\nfunction getLoadedCodexCredentials(): CodexCredentials | null {\n if (\n !state.codexAccessToken\n || !state.codexRefreshToken\n || !state.codexExpiresAt\n || !state.codexAccountId\n ) {\n return null\n }\n\n return {\n accessToken: state.codexAccessToken,\n refreshToken: state.codexRefreshToken,\n expiresAt: state.codexExpiresAt,\n accountId: state.codexAccountId,\n }\n}\n\nfunction syncCodexProviderConfig(options?: { enabled?: boolean }): void {\n const existingProviderConfig = getRawProviderConfig(\"codex\") ?? {}\n setProviderConfig(\"codex\", {\n ...existingProviderConfig,\n type: \"openai-responses\",\n enabled: options?.enabled ?? existingProviderConfig.enabled,\n baseUrl: CODEX_API_BASE_URL,\n authType: \"oauth2\",\n pricingCurrency: \"USD\",\n })\n}\n\nexport async function persistCodexCredentials(\n credentials: CodexCredentials,\n options?: { enableProvider?: boolean },\n): Promise<void> {\n await writeCodexCredentials(credentials)\n syncCodexProviderConfig({\n enabled: options?.enableProvider ? true : undefined,\n })\n applyCodexCredentials(credentials)\n}\n\nexport const setupCopilotToken = async () => {\n if (isOpencodeOauthApp()) {\n if (!state.githubToken) throw new Error(`opencode token not found`)\n\n state.copilotToken = state.githubToken\n\n consola.debug(\"GitHub Copilot token set from opencode auth token\")\n if (state.showToken) {\n consola.info(\"Copilot token:\", state.copilotToken)\n }\n\n stopCopilotRefreshLoop()\n return\n }\n\n const { token, refresh_in } = await getCopilotToken()\n state.copilotToken = token\n\n // Display the Copilot token to the screen\n consola.debug(\"GitHub Copilot Token fetched successfully!\")\n if (state.showToken) {\n consola.info(\"Copilot token:\", token)\n }\n\n stopCopilotRefreshLoop()\n\n const controller = new AbortController()\n copilotRefreshLoopController = controller\n\n runCopilotRefreshLoop(refresh_in, controller.signal)\n .catch(() => {\n consola.warn(\"Copilot token refresh loop stopped\")\n })\n .finally(() => {\n if (copilotRefreshLoopController === controller) {\n copilotRefreshLoopController = null\n }\n })\n}\n\nexport const setupCodexToken = async (): Promise<void> => {\n const loadedCredentials = getLoadedCodexCredentials()\n if (loadedCredentials && !isCodexCredentialsExpired(loadedCredentials)) {\n if (codexRefreshLoopController) {\n return\n }\n\n applyCodexCredentials(loadedCredentials)\n }\n\n const credentials = loadedCredentials ?? (await readCodexCredentials())\n if (!credentials) {\n throw new Error(\n `Codex credentials not found. Run \\`copilot-api auth login --provider codex\\` first.`,\n )\n }\n\n syncCodexProviderConfig()\n\n let nextCredentials = credentials\n if (isCodexCredentialsExpired(credentials)) {\n consola.debug(\"Refreshing expired Codex credentials\")\n nextCredentials = await refreshCodexCredentials(credentials)\n await persistCodexCredentials(nextCredentials)\n }\n\n applyCodexCredentials(nextCredentials)\n stopCodexRefreshLoop()\n\n const controller = new AbortController()\n codexRefreshLoopController = controller\n\n runCodexRefreshLoop(controller.signal)\n .catch(() => {\n consola.warn(\"Codex token refresh loop stopped\")\n })\n .finally(() => {\n if (codexRefreshLoopController === controller) {\n codexRefreshLoopController = null\n }\n })\n}\n\nconst REFRESH_POLL_INTERVAL_MS = 15_000\nconst EARLY_REFRESH_BUFFER_MS = 60_000\nconst RETRY_REFRESH_DELAY_MS = 15_000\nconst 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) => {\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 { token, refresh_in } = await getCopilotToken()\n state.copilotToken = token\n refreshAtMs = getRefreshDeadlineMs(refresh_in)\n retryDelayMs = RETRY_REFRESH_DELAY_MS\n consola.debug(\"Copilot token refreshed\")\n if (state.showToken) {\n consola.info(\"Refreshed Copilot token:\", token)\n }\n } catch (error) {\n consola.error(\"Failed to refresh Copilot token:\", error)\n 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 refreshCodexCredentials({\n accessToken: state.codexAccessToken ?? \"\",\n refreshToken,\n expiresAt,\n accountId: state.codexAccountId ?? \"\",\n })\n await persistCodexCredentials(credentials)\n refreshAtMs = Math.max(\n credentials.expiresAt - EARLY_REFRESH_BUFFER_MS,\n Date.now(),\n )\n consola.debug(\"Codex credentials refreshed\")\n } catch (error) {\n consola.error(\"Failed to refresh Codex credentials:\", error)\n refreshAtMs = Date.now() + RETRY_REFRESH_DELAY_MS\n consola.warn(\n `Retrying Codex token refresh in ${RETRY_REFRESH_DELAY_MS / 1000}s`,\n )\n }\n }\n}\n\ninterface SetupGitHubTokenOptions {\n force?: boolean\n}\n\nexport async function setupGitHubToken(\n options?: SetupGitHubTokenOptions,\n): Promise<void> {\n try {\n const githubToken = await readGitHubToken()\n\n if (githubToken && !options?.force) {\n state.githubToken = githubToken\n if (state.showToken) {\n consola.info(\"GitHub token:\", githubToken)\n }\n await logUser()\n\n return\n }\n\n consola.info(\"Not logged in, getting new access token\")\n const response = await getDeviceCode()\n consola.debug(\"Device code response:\", response)\n\n consola.info(\n `Please enter the code \"${response.user_code}\" in ${response.verification_uri}`,\n )\n\n const token = await pollAccessToken(response)\n await writeGitHubToken(token)\n state.githubToken = token\n\n if (state.showToken) {\n consola.info(\"GitHub token:\", token)\n }\n await logUser()\n } catch (error) {\n if (error instanceof HTTPError) {\n consola.error(\"Failed to get GitHub token:\", await error.response.json())\n throw error\n }\n\n consola.error(\"Failed to get GitHub token:\", error)\n throw error\n }\n}\n\nexport async function logUser() {\n const copilotUser = await 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.2.2",
4
+ "version": "2.2.5",
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",
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-Bb1k-ECx.js","names":[],"sources":["../src/lib/quick-providers.ts","../src/auth.ts"],"sourcesContent":["import type { ProviderType } from \"./config\"\n\ninterface QuickProviderConfig {\n type: ProviderType\n baseUrl: string\n pricingCurrency: string\n editableType: boolean\n}\n\nexport const QUICK_PROVIDER_CONFIGS = {\n \"opencode-go\": {\n type: \"openai-compatible\",\n baseUrl: \"https://opencode.ai/zen/go\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n kimi: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.kimi.com/coding\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n deepseek: {\n type: \"anthropic\",\n baseUrl: \"https://api.deepseek.com/anthropic\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n dashscope: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n openrouter: {\n type: \"anthropic\",\n baseUrl: \"https://openrouter.ai/api\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n} satisfies Record<string, QuickProviderConfig>\n\nexport type QuickProviderName = keyof typeof QUICK_PROVIDER_CONFIGS\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport {\n getRawProviderConfig,\n isSupportedProviderType,\n normalizeProviderBaseUrl,\n setProviderConfig,\n SUPPORTED_PROVIDER_TYPES,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./lib/config\"\nimport { loginCodex } from \"./lib/oauth/codex\"\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport {\n QUICK_PROVIDER_CONFIGS,\n type QuickProviderName,\n} from \"./lib/quick-providers\"\nimport { state } from \"./lib/state\"\nimport { persistCodexCredentials, setupGitHubToken } from \"./lib/token\"\n\ninterface RunAuthOptions {\n provider?: string\n verbose: boolean\n showToken: boolean\n}\n\nconst authArgs = {\n provider: {\n type: \"string\",\n description:\n \"Provider to log in with or configure (copilot, codex, opencode-go, kimi, deepseek, dashscope, openrouter, custom)\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show provider access token on auth\",\n },\n} as const\n\nconst BUILTIN_PROVIDER_NAMES = [\"copilot\", \"codex\"] as const\nconst QUICK_PROVIDER_NAMES = Object.keys(\n QUICK_PROVIDER_CONFIGS,\n) as Array<QuickProviderName>\nconst AUTH_PROVIDER_NAMES = [\n ...BUILTIN_PROVIDER_NAMES,\n ...QUICK_PROVIDER_NAMES,\n \"custom\",\n] as const\nconst CUSTOM_PROVIDER_AUTH_TYPE_OPTION = \"__default__\"\nconst QUICK_PROVIDER_DEFAULT_TYPE_OPTION = \"__default__\"\nconst CUSTOM_PROVIDER_AUTH_TYPES = [\"x-api-key\", \"authorization\"] as const\n\ntype BuiltinProviderName = (typeof BUILTIN_PROVIDER_NAMES)[number]\ntype AuthProviderName = (typeof AUTH_PROVIDER_NAMES)[number]\ntype CustomProviderAuthType = (typeof CUSTOM_PROVIDER_AUTH_TYPES)[number]\n\nconst BUILTIN_PROVIDER_LABELS: Record<BuiltinProviderName, string> = {\n copilot: \"GitHub Copilot\",\n codex: \"OpenAI Codex\",\n}\nconst AUTH_PROVIDER_LABELS: Record<AuthProviderName, string> = {\n ...BUILTIN_PROVIDER_LABELS,\n \"opencode-go\": \"OpenCode Go\",\n kimi: \"Kimi\",\n deepseek: \"DeepSeek\",\n dashscope: \"DashScope\",\n openrouter: \"OpenRouter\",\n custom: \"Custom provider\",\n}\n\nfunction isAuthProviderName(\n providerName: string,\n): providerName is AuthProviderName {\n return AUTH_PROVIDER_NAMES.includes(providerName as AuthProviderName)\n}\n\nfunction isCustomProviderAuthType(\n value: string,\n): value is CustomProviderAuthType {\n return CUSTOM_PROVIDER_AUTH_TYPES.includes(value as CustomProviderAuthType)\n}\n\nfunction isQuickProviderName(\n providerName: AuthProviderName,\n): providerName is QuickProviderName {\n return QUICK_PROVIDER_NAMES.includes(providerName as QuickProviderName)\n}\n\nasync function resolveProviderSelection(\n providerArg: string | undefined,\n): Promise<AuthProviderName> {\n const availableProviders = [...AUTH_PROVIDER_NAMES]\n\n if (providerArg !== undefined) {\n const providerName = providerArg.trim()\n if (!isAuthProviderName(providerName)) {\n throw new Error(\n `Unknown provider '${providerArg}'. Expected one of: ${availableProviders.join(\", \")}`,\n )\n }\n return providerName\n }\n\n if (availableProviders.length === 1) {\n return availableProviders[0]\n }\n\n const provider = await consola.prompt(\"Select a provider to log in with\", {\n type: \"select\",\n options: availableProviders.map((providerName) => ({\n label: `${AUTH_PROVIDER_LABELS[providerName]} (${providerName})`,\n value: providerName,\n })),\n })\n\n if (!provider || !isAuthProviderName(provider)) {\n throw new Error(\"No provider selected\")\n }\n\n return provider\n}\n\nfunction assertCustomProviderName(providerName: string): void {\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(providerName)) {\n throw new Error(\n \"Provider name must start with a letter or number and contain only letters, numbers, underscores, or hyphens\",\n )\n }\n\n if (providerName === \"copilot\" || providerName === \"codex\") {\n throw new Error(\n `Provider name '${providerName}' is reserved for a builtin provider`,\n )\n }\n}\n\nasync function promptRequiredText(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await consola.prompt(message, { type: \"text\" })\n const normalizedValue = typeof value === \"string\" ? value.trim() : \"\"\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nfunction canUseMaskedPrompt(): boolean {\n return Boolean(\n process.stdin.isTTY\n && process.stdout.isTTY\n && typeof process.stdin.setRawMode === \"function\",\n )\n}\n\nasync function promptMaskedText(message: string): Promise<string> {\n if (!canUseMaskedPrompt()) {\n const value = await consola.prompt(message, { type: \"text\" })\n return typeof value === \"string\" ? value : \"\"\n }\n\n return await new Promise<string>((resolve, reject) => {\n let value = \"\"\n const rawModeWasEnabled = process.stdin.isRaw === true\n\n function cleanup(): void {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode(rawModeWasEnabled)\n process.stdin.pause()\n }\n\n function finish(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n resolve(value)\n }\n\n function cancel(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n reject(new Error(\"Prompt cancelled\"))\n }\n\n function onData(chunk: Buffer): void {\n const input = chunk.toString(\"utf8\")\n\n if (input.startsWith(\"\\u001B\")) {\n return\n }\n\n for (const char of input) {\n if (char === \"\\u0003\") {\n cancel()\n return\n }\n\n if (char === \"\\r\" || char === \"\\n\") {\n finish()\n return\n }\n\n if (char === \"\\b\" || char === \"\\u007F\") {\n if (value.length > 0) {\n value = value.slice(0, -1)\n process.stdout.write(\"\\b \\b\")\n }\n continue\n }\n\n if (char >= \" \") {\n value += char\n process.stdout.write(\"*\")\n }\n }\n }\n\n process.stdout.write(`${message}: `)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.on(\"data\", onData)\n })\n}\n\nasync function promptRequiredSecret(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await promptMaskedText(message)\n const normalizedValue = value.trim()\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nasync function promptCustomProviderName(): Promise<string> {\n const providerName = await promptRequiredText(\n \"Enter provider name\",\n \"Provider name\",\n )\n assertCustomProviderName(providerName)\n return providerName\n}\n\nasync function promptCustomProviderType(): Promise<ProviderType> {\n const providerType = await consola.prompt(\"Select provider type\", {\n type: \"select\",\n options: SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n })\n\n if (\n typeof providerType !== \"string\"\n || !isSupportedProviderType(providerType)\n ) {\n throw new Error(\"No provider type selected\")\n }\n\n return providerType\n}\n\nasync function promptQuickProviderType(\n defaultType: ProviderType,\n): Promise<ProviderType> {\n const providerType = await consola.prompt(\n `Select provider type (default: ${defaultType})`,\n {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultType})`,\n value: QUICK_PROVIDER_DEFAULT_TYPE_OPTION,\n },\n ...SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n ],\n },\n )\n\n if (providerType === QUICK_PROVIDER_DEFAULT_TYPE_OPTION) {\n return defaultType\n }\n\n if (\n typeof providerType === \"string\"\n && isSupportedProviderType(providerType)\n ) {\n return providerType\n }\n\n throw new Error(\"No provider type selected\")\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nasync function promptCustomProviderAuthType(\n providerType: ProviderType,\n): Promise<ProviderAuthType | undefined> {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n const authType = await consola.prompt(\"Select provider auth type\", {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultAuthType})`,\n value: CUSTOM_PROVIDER_AUTH_TYPE_OPTION,\n },\n ...CUSTOM_PROVIDER_AUTH_TYPES.map((value) => ({\n label: value,\n value,\n })),\n ],\n })\n\n if (authType === CUSTOM_PROVIDER_AUTH_TYPE_OPTION) {\n return undefined\n }\n\n if (typeof authType === \"string\" && isCustomProviderAuthType(authType)) {\n return authType\n }\n\n throw new Error(\"No provider auth type selected\")\n}\n\nasync function promptQuickProviderBaseUrl(\n defaultBaseUrl: string,\n): Promise<string> {\n const value = await consola.prompt(\n `Enter provider baseUrl (default: ${defaultBaseUrl})`,\n {\n type: \"text\",\n default: defaultBaseUrl,\n initial: defaultBaseUrl,\n },\n )\n const baseUrl = normalizeProviderBaseUrl(\n typeof value === \"string\" && value.trim() ? value : defaultBaseUrl,\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n return baseUrl\n}\n\nfunction buildCustomProviderConfig(\n existingProviderConfig: ProviderConfig,\n options: {\n apiKey: string\n authType?: ProviderAuthType\n baseUrl: string\n pricingCurrency?: string\n type: ProviderType\n },\n): ProviderConfig {\n return {\n type: options.type,\n enabled: true,\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n ...(options.authType ? { authType: options.authType } : {}),\n pricingCurrency:\n options.pricingCurrency ?? existingProviderConfig.pricingCurrency,\n ...(existingProviderConfig.models ?\n { models: existingProviderConfig.models }\n : {}),\n }\n}\n\nasync function configureCustomProvider(): Promise<void> {\n const providerName = await promptCustomProviderName()\n const type = await promptCustomProviderType()\n const baseUrl = normalizeProviderBaseUrl(\n await promptRequiredText(\"Enter provider baseUrl\", \"baseUrl\"),\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n const apiKey = await promptRequiredSecret(\"Enter provider apiKey\", \"apiKey\")\n const authType = await promptCustomProviderAuthType(type)\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n authType,\n baseUrl,\n type,\n }),\n )\n\n consola.success(\n `Custom provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function configureQuickProvider(\n providerName: QuickProviderName,\n): Promise<void> {\n const defaultProviderConfig = QUICK_PROVIDER_CONFIGS[providerName]\n const apiKey = await promptRequiredSecret(\n `Enter ${providerName} apiKey`,\n \"apiKey\",\n )\n const type =\n defaultProviderConfig.editableType ?\n await promptQuickProviderType(defaultProviderConfig.type)\n : defaultProviderConfig.type\n const baseUrl = await promptQuickProviderBaseUrl(\n defaultProviderConfig.baseUrl,\n )\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n baseUrl,\n pricingCurrency: defaultProviderConfig.pricingCurrency,\n type,\n }),\n )\n\n consola.success(\n `${AUTH_PROVIDER_LABELS[providerName]} provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function loginWithCodex(): Promise<void> {\n const credentials = await loginCodex({\n onAuth(info) {\n consola.info(\"Open the following URL to authenticate with Codex:\")\n consola.log(info.url)\n if (info.instructions) {\n consola.info(info.instructions)\n }\n },\n onPrompt(message) {\n return consola.prompt(message, {\n type: \"text\",\n })\n },\n onProgress(message) {\n consola.debug(message)\n },\n })\n\n await persistCodexCredentials(credentials, { enableProvider: true })\n consola.success(\n `Codex provider config written to ${PATHS.CONFIG_PATH} and credentials written to ${PATHS.CODEX_CREDENTIAL_PATH}`,\n )\n}\n\nasync function loginWithProvider(provider: AuthProviderName): Promise<void> {\n if (provider === \"copilot\") {\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n return\n }\n\n if (provider === \"codex\") {\n await loginWithCodex()\n return\n }\n\n if (isQuickProviderName(provider)) {\n await configureQuickProvider(provider)\n return\n }\n\n await configureCustomProvider()\n}\n\nexport async function runProviderSetup(): Promise<void> {\n const provider = await resolveProviderSelection(undefined)\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider)\n}\n\nexport async function runAuthLogin(options: RunAuthOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n const provider = await resolveProviderSelection(options.provider)\n\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider)\n}\n\nconst authLogin = defineCommand({\n meta: {\n name: \"login\",\n description:\n \"Authenticate or configure a provider without running the server\",\n },\n args: authArgs,\n run({ args }) {\n return runAuthLogin({\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run authentication flows without running the server\",\n },\n args: authArgs,\n subCommands: {\n login: authLogin,\n },\n run({ args }) {\n if ((args._[0] ?? \"\").trim()) {\n return\n }\n\n return runAuthLogin({\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { t as auth } from "./auth-Bb1k-ECx.js";
2
- export { auth };
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-D0EIG26T.js","names":["fs"],"sources":["../src/lib/atomic-file.ts","../src/lib/paths.ts","../src/lib/config-store.ts","../src/lib/model-policy.ts","../src/lib/provider-config.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\n\nconst TEMP_FILE_RANDOM_BYTES = 8\n\n// The file-level fsync persists the contents, but the rename only updates the\n// parent directory entry, which needs its own fsync to survive a crash or\n// power loss. Best-effort: the rename has already taken effect, so a failure\n// here only weakens crash durability and must not fail the write. Directory\n// fsync is not supported on Windows (opening a directory handle fails there).\nconst fsyncDirectory = (directory: string): void => {\n if (process.platform === \"win32\") {\n return\n }\n\n let directoryFd: number | undefined\n try {\n directoryFd = fs.openSync(directory, \"r\")\n fs.fsyncSync(directoryFd)\n } catch (error) {\n console.warn(`Failed to fsync directory: ${directory}`, error)\n } finally {\n if (directoryFd !== undefined) {\n try {\n fs.closeSync(directoryFd)\n } catch {\n // Preserve the fsync warning.\n }\n }\n }\n}\n\nexport function writeFileAtomically(filePath: string, content: string): void {\n const directory = path.dirname(filePath)\n const tempPath = path.join(\n directory,\n `.${path.basename(filePath)}.${process.pid}.${randomBytes(TEMP_FILE_RANDOM_BYTES).toString(\"hex\")}.tmp`,\n )\n\n fs.mkdirSync(directory, { recursive: true })\n\n let fileDescriptor: number | undefined\n let tempFileCreated = false\n try {\n fileDescriptor = fs.openSync(tempPath, \"wx\", 0o600)\n tempFileCreated = true\n fs.writeFileSync(fileDescriptor, content, \"utf8\")\n fs.fsyncSync(fileDescriptor)\n fs.closeSync(fileDescriptor)\n fileDescriptor = undefined\n fs.renameSync(tempPath, filePath)\n tempFileCreated = false\n fsyncDirectory(directory)\n } catch (error) {\n if (fileDescriptor !== undefined) {\n try {\n fs.closeSync(fileDescriptor)\n } catch {\n // Preserve the original write error.\n }\n }\n\n if (tempFileCreated) {\n try {\n fs.rmSync(tempPath, { force: true })\n } catch {\n // Preserve the original write error.\n }\n }\n\n throw error\n }\n}\n","import fs from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\n\nconst AUTH_APP = process.env.COPILOT_API_OAUTH_APP?.trim() || \"\"\nconst ENTERPRISE_PREFIX = process.env.COPILOT_API_ENTERPRISE_URL ? \"ent_\" : \"\"\n\nconst DEFAULT_DIR = path.join(os.homedir(), \".local\", \"share\", \"copilot-api\")\nconst APP_DIR = process.env.COPILOT_API_HOME || DEFAULT_DIR\n\nconst GITHUB_TOKEN_PATH = path.join(\n APP_DIR,\n AUTH_APP,\n ENTERPRISE_PREFIX + \"github_token\",\n)\nconst CODEX_CREDENTIAL_PATH = path.join(APP_DIR, \"codex_credentials.json\")\nconst CONFIG_PATH = path.join(APP_DIR, \"config.json\")\n\nexport const PATHS = {\n APP_DIR,\n GITHUB_TOKEN_PATH,\n CODEX_CREDENTIAL_PATH,\n CONFIG_PATH,\n}\n\nexport async function ensurePaths(): Promise<void> {\n await fs.mkdir(path.join(PATHS.APP_DIR, AUTH_APP), { recursive: true })\n await ensureFile(PATHS.GITHUB_TOKEN_PATH)\n await ensureFile(PATHS.CONFIG_PATH)\n}\n\nasync function ensureFile(filePath: string): Promise<void> {\n try {\n await fs.access(filePath, fs.constants.W_OK)\n } catch {\n await fs.writeFile(filePath, \"\")\n await fs.chmod(filePath, 0o600)\n }\n}\n","import consola from \"consola\"\nimport { randomBytes } from \"node:crypto\"\nimport fs from \"node:fs\"\n\nimport type { TokenUsagePricingConfig } from \"~/lib/token-usage/pricing\"\n\nimport { writeFileAtomically } from \"./atomic-file\"\nimport { PATHS } from \"./paths\"\n\nexport interface AppConfig {\n auth?: {\n apiKeys?: Array<string>\n adminApiKey?: string\n }\n providers?: Record<string, ProviderConfig>\n modelMappings?: Record<string, string>\n extraPrompts?: Record<string, string>\n smallModel?: string\n contextManagement?: ContextManagementConfig\n modelResponsesApiCompactThresholds?: Record<string, number>\n modelReasoningEfforts?: Record<\n string,\n \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\"\n >\n useMessagesApi?: boolean\n useResponsesApiWebSocket?: boolean\n responsesTransport?: ResponsesTransportConfig\n anthropicApiKey?: string\n useResponsesApiWebSearch?: boolean\n alphaSearchCodexPriority?: boolean\n alphaSearchModel?: string\n // Copilot rejects Anthropic's web_search server tool on /v1/messages, so a\n // Claude request that only asks for web search is switched to this model.\n // A `provider/model` alias is passed straight through to that provider's\n // (websearch-capable) message API, while a plain GPT model runs the search\n // via /responses. Leave unset to disable (the tool is then stripped).\n // Mixing web_search with other tools is not supported.\n messageApiWebSearchModel?: string\n // Model used for Claude Code background security-monitor requests on\n // /v1/messages and provider message APIs: requests without tools, with\n // `stop_sequences: [\"</block>\"]` and a system block starting with\n // \"You are a security monitor for autonomous AI coding agents.\".\n // A `provider/model` alias is forwarded to that provider's message API on\n // the top-level route. Provider message routes use the configured value on\n // their current provider. Leave empty to disable (default).\n claudeAutoModel?: string\n claudeTokenMultiplier?: number\n}\n\nexport interface ContextManagementConfig {\n messages?: boolean\n responses?: boolean\n}\n\nexport interface ResponsesTransportConfig {\n headersTimeoutMs?: number\n streamInactivityTimeoutMs?: number\n websocketMaxBufferedBytes?: number\n websocketMaxBufferedMessages?: number\n websocketOpenTimeoutMs?: number\n websocketPoolIdleTimeoutMs?: number\n}\n\nexport const defaultResponsesTransportConfig = {\n headersTimeoutMs: 30_000,\n streamInactivityTimeoutMs: 5 * 60 * 1000,\n websocketMaxBufferedBytes: 8 * 1024 * 1024,\n websocketMaxBufferedMessages: 1024,\n websocketOpenTimeoutMs: 30_000,\n websocketPoolIdleTimeoutMs: 60_000,\n} satisfies Required<ResponsesTransportConfig>\n\nexport interface ModelConfig {\n temperature?: number\n topP?: number\n topK?: number\n extraBody?: Record<string, unknown>\n contextCache?: boolean\n contextWindow?: number\n maxOutputTokens?: number\n inputModalities?: Array<\"text\" | \"image\">\n reasoningEfforts?: Array<CodexReasoningEffort>\n defaultReasoningEffort?: CodexReasoningEffort\n pricing?: TokenUsagePricingConfig\n supportPdf?: boolean\n toolContentSupportType?: Array<ToolContentSupportType>\n type?: ProviderType\n}\n\nexport type CodexReasoningEffort =\n | \"none\"\n | \"minimal\"\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\"\n | \"ultra\"\n\nexport type ProviderAuthType = \"authorization\" | \"oauth2\" | \"x-api-key\"\nexport const SUPPORTED_PROVIDER_TYPES = [\n \"anthropic\",\n \"openai-compatible\",\n \"openai-responses\",\n] as const\nexport type ProviderType = (typeof SUPPORTED_PROVIDER_TYPES)[number]\nexport type ToolContentSupportType = \"array\" | \"image\" | \"pdf\"\n\nexport interface ProviderConfig {\n type?: string\n enabled?: boolean\n baseUrl?: string\n apiKey?: string\n authType?: ProviderAuthType\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n}\n\nconst gpt5ExplorationPrompt = `## Exploration and reading files\n- **Think first.** Before any tool call, decide ALL files/resources you will need.\n- **Batch everything.** If you need multiple files (even from different places), read them together.\n- **multi_tool_use.parallel** Use multi_tool_use.parallel to parallelize tool calls and only this.\n- **Only make sequential calls if you truly cannot know the next file without seeing a result first.**\n- **Workflow:** (a) plan all needed reads → (b) issue one parallel batch → (c) analyze results → (d) repeat if new, unpredictable reads arise.`\n\nconst modelResponsesApiCompactThresholds = {\n \"gpt-5.4\": 272_000 * 0.8,\n \"gpt-5.5\": 272_000 * 0.8,\n}\n\nexport const defaultContextManagement = {\n messages: true,\n responses: false,\n} satisfies Required<ContextManagementConfig>\n\nexport const defaultConfig: AppConfig = {\n auth: {\n apiKeys: [],\n },\n providers: {},\n modelMappings: {},\n extraPrompts: {\n \"gpt-5-mini\": gpt5ExplorationPrompt,\n },\n smallModel: \"gpt-5-mini\",\n contextManagement: defaultContextManagement,\n modelResponsesApiCompactThresholds,\n modelReasoningEfforts: {\n \"gpt-5-mini\": \"low\",\n },\n useMessagesApi: true,\n useResponsesApiWebSocket: true,\n responsesTransport: defaultResponsesTransportConfig,\n useResponsesApiWebSearch: true,\n alphaSearchCodexPriority: true,\n alphaSearchModel: \"gpt-5-mini\",\n messageApiWebSearchModel: \"gpt-5-mini\",\n}\n\nlet cachedConfig: AppConfig | null = null\n\nfunction normalizeAdminApiKey(adminApiKey: unknown): string | null {\n if (typeof adminApiKey !== \"string\") {\n if (adminApiKey !== undefined) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n }\n return null\n }\n\n const normalizedAdminApiKey = adminApiKey.trim()\n if (!normalizedAdminApiKey) {\n consola.warn(\n \"Invalid auth.adminApiKey config. Expected a non-empty string.\",\n )\n return null\n }\n\n return normalizedAdminApiKey\n}\n\nfunction generateAdminApiKey(): string {\n return randomBytes(32).toString(\"hex\")\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error\n}\n\nfunction ensureConfigFile(): void {\n try {\n fs.accessSync(PATHS.CONFIG_PATH, fs.constants.R_OK | fs.constants.W_OK)\n } catch {\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n )\n try {\n fs.chmodSync(PATHS.CONFIG_PATH, 0o600)\n } catch {\n return\n }\n }\n}\n\nfunction readConfigFromDisk(): AppConfig {\n ensureConfigFile()\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n writeFileAtomically(\n PATHS.CONFIG_PATH,\n `${JSON.stringify(defaultConfig, null, 2)}\\n`,\n )\n return defaultConfig\n }\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n consola.error(\"Failed to read config file, using default config\", error)\n return defaultConfig\n }\n}\n\nexport function readEditableConfigFromDisk(): AppConfig {\n try {\n const raw = fs.readFileSync(PATHS.CONFIG_PATH, \"utf8\")\n if (!raw.trim()) {\n return {}\n }\n return JSON.parse(raw) as AppConfig\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return {}\n }\n if (error instanceof SyntaxError) {\n throw new Error(`Config file is not valid JSON: ${PATHS.CONFIG_PATH}`)\n }\n throw error\n }\n}\n\nexport function writeConfigToDisk(config: AppConfig): void {\n writeFileAtomically(PATHS.CONFIG_PATH, `${JSON.stringify(config, null, 2)}\\n`)\n}\n\nfunction mergeDefaultConfig(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const extraPrompts = config.extraPrompts ?? {}\n const defaultExtraPrompts = defaultConfig.extraPrompts ?? {}\n const responsesApiCompactThresholds =\n config.modelResponsesApiCompactThresholds ?? {}\n const defaultResponsesApiCompactThresholds =\n defaultConfig.modelResponsesApiCompactThresholds ?? {}\n const modelReasoningEfforts = config.modelReasoningEfforts ?? {}\n const defaultModelReasoningEfforts = defaultConfig.modelReasoningEfforts ?? {}\n const contextManagement = normalizeContextManagementConfig(\n config.contextManagement,\n )\n const responsesTransport = normalizeResponsesTransportConfig(\n config.responsesTransport,\n )\n const defaultContextManagementConfig = defaultConfig.contextManagement ?? {}\n\n const missingExtraPromptModels = Object.keys(defaultExtraPrompts).filter(\n (model) => !Object.hasOwn(extraPrompts, model),\n )\n\n const missingReasoningEffortModels = Object.keys(\n defaultModelReasoningEfforts,\n ).filter((model) => !Object.hasOwn(modelReasoningEfforts, model))\n const missingResponsesApiCompactThresholdModels = Object.keys(\n defaultResponsesApiCompactThresholds,\n ).filter((model) => !Object.hasOwn(responsesApiCompactThresholds, model))\n const missingContextManagementKeys = Object.keys(\n defaultContextManagementConfig,\n ).filter((key) => !Object.hasOwn(contextManagement, key))\n\n const hasExtraPromptChanges = missingExtraPromptModels.length > 0\n const hasReasoningEffortChanges = missingReasoningEffortModels.length > 0\n const hasResponsesApiCompactThresholdChanges =\n missingResponsesApiCompactThresholdModels.length > 0\n const hasContextManagementChanges = missingContextManagementKeys.length > 0\n const hasResponsesTransportChanges = Object.entries(responsesTransport).some(\n ([key, value]) =>\n config.responsesTransport?.[key as keyof ResponsesTransportConfig]\n !== value,\n )\n\n if (\n !hasExtraPromptChanges\n && !hasReasoningEffortChanges\n && !hasResponsesApiCompactThresholdChanges\n && !hasContextManagementChanges\n && !hasResponsesTransportChanges\n ) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n contextManagement: {\n ...defaultContextManagementConfig,\n ...contextManagement,\n },\n extraPrompts: {\n ...defaultExtraPrompts,\n ...extraPrompts,\n },\n modelResponsesApiCompactThresholds: {\n ...defaultResponsesApiCompactThresholds,\n ...responsesApiCompactThresholds,\n },\n modelReasoningEfforts: {\n ...defaultModelReasoningEfforts,\n ...modelReasoningEfforts,\n },\n responsesTransport,\n },\n changed: true,\n }\n}\n\nfunction normalizeContextManagementConfig(\n value: ContextManagementConfig | undefined,\n): ContextManagementConfig {\n if (!value || typeof value !== \"object\") {\n return {}\n }\n\n return {\n ...(typeof value.messages === \"boolean\" ?\n { messages: value.messages }\n : {}),\n ...(typeof value.responses === \"boolean\" ?\n { responses: value.responses }\n : {}),\n }\n}\n\nfunction ensureAdminApiKey(config: AppConfig): {\n mergedConfig: AppConfig\n changed: boolean\n} {\n const normalizedAdminApiKey = normalizeAdminApiKey(config.auth?.adminApiKey)\n if (normalizedAdminApiKey) {\n if (config.auth?.adminApiKey === normalizedAdminApiKey) {\n return { mergedConfig: config, changed: false }\n }\n\n return {\n mergedConfig: {\n ...config,\n auth: {\n ...config.auth,\n adminApiKey: normalizedAdminApiKey,\n },\n },\n changed: true,\n }\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const { mergedConfig } = mergeDefaultConfig({\n ...editableConfig,\n auth: {\n ...editableConfig.auth,\n adminApiKey: generateAdminApiKey(),\n },\n })\n\n return { mergedConfig, changed: true }\n}\n\nexport function mergeConfigWithDefaults(): AppConfig {\n const config = readConfigFromDisk()\n const { mergedConfig, changed } = mergeDefaultConfig(config)\n const {\n mergedConfig: mergedConfigWithAdminApiKey,\n changed: adminApiKeyChanged,\n } = ensureAdminApiKey(mergedConfig)\n const shouldPersistConfig = changed || adminApiKeyChanged\n\n if (shouldPersistConfig) {\n try {\n writeConfigToDisk(mergedConfigWithAdminApiKey)\n } catch (writeError) {\n if (adminApiKeyChanged) {\n throw writeError\n }\n\n consola.warn(\n \"Failed to write merged default config to config file\",\n writeError,\n )\n }\n }\n\n cachedConfig = mergedConfigWithAdminApiKey\n return mergedConfigWithAdminApiKey\n}\n\nexport function getConfig(): AppConfig {\n cachedConfig ??= mergeDefaultConfig(readConfigFromDisk()).mergedConfig\n return cachedConfig\n}\n\nexport function reloadConfig(): AppConfig {\n return mergeConfigWithDefaults()\n}\n\nexport function isMessagesApiEnabled(): boolean {\n const config = getConfig()\n return config.useMessagesApi ?? true\n}\n\nexport function isResponsesApiWebSocketEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSocket ?? true\n}\n\nexport function getResponsesTransportConfig(): Required<ResponsesTransportConfig> {\n return normalizeResponsesTransportConfig(getConfig().responsesTransport)\n}\n\nexport const normalizeResponsesTransportConfig = (\n configured: ResponsesTransportConfig | undefined,\n): Required<ResponsesTransportConfig> => ({\n headersTimeoutMs: positiveIntegerOrDefault(\n configured?.headersTimeoutMs,\n defaultResponsesTransportConfig.headersTimeoutMs,\n ),\n streamInactivityTimeoutMs: positiveIntegerOrDefault(\n configured?.streamInactivityTimeoutMs,\n defaultResponsesTransportConfig.streamInactivityTimeoutMs,\n ),\n websocketMaxBufferedBytes: positiveIntegerOrDefault(\n configured?.websocketMaxBufferedBytes,\n defaultResponsesTransportConfig.websocketMaxBufferedBytes,\n ),\n websocketMaxBufferedMessages: positiveIntegerOrDefault(\n configured?.websocketMaxBufferedMessages,\n defaultResponsesTransportConfig.websocketMaxBufferedMessages,\n ),\n websocketOpenTimeoutMs: positiveIntegerOrDefault(\n configured?.websocketOpenTimeoutMs,\n defaultResponsesTransportConfig.websocketOpenTimeoutMs,\n ),\n websocketPoolIdleTimeoutMs: positiveIntegerOrDefault(\n configured?.websocketPoolIdleTimeoutMs,\n defaultResponsesTransportConfig.websocketPoolIdleTimeoutMs,\n ),\n})\n\nconst positiveIntegerOrDefault = (value: unknown, fallback: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback\n\n const normalized = Math.floor(value)\n return normalized > 0 ? normalized : fallback\n}\n\nexport function getAnthropicApiKey(): string | undefined {\n const config = getConfig()\n return config.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY ?? undefined\n}\n\nexport function isResponsesApiWebSearchEnabled(): boolean {\n const config = getConfig()\n return config.useResponsesApiWebSearch ?? true\n}\n\nexport function isAlphaSearchCodexPriorityEnabled(): boolean {\n const config = getConfig()\n return config.alphaSearchCodexPriority ?? true\n}\n\nexport function getAlphaSearchModel(): string | undefined {\n const model = getConfig().alphaSearchModel ?? \"gpt-5-mini\"\n return model.trim() || undefined\n}\n\nexport function getMessageApiWebSearchModel(): string | undefined {\n const config = getConfig()\n const model = config.messageApiWebSearchModel ?? \"gpt-5-mini\"\n return model && model.trim().length > 0 ? model : undefined\n}\n\nexport function getClaudeAutoModel(): string | undefined {\n const config = getConfig()\n const model = config.claudeAutoModel\n return model && model.trim().length > 0 ? model.trim() : undefined\n}\n\nexport function getClaudeTokenMultiplier(): number {\n const config = getConfig()\n return config.claudeTokenMultiplier ?? 1.15\n}\n","import {\n defaultConfig,\n defaultContextManagement,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n} from \"./config-store\"\n\nconst GPT_MODEL_PATTERN = /^gpt-(\\d+)(?:\\.(\\d+))?/\n\nfunction isGpt53OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 3\n}\n\nexport function isGpt56OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 6\n}\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n const userPrompt = config.extraPrompts?.[model]\n if (userPrompt !== undefined) {\n return userPrompt\n }\n return isGpt53OrAbove(model) ? gpt5CommentaryPrompt : \"\"\n}\n\nexport function getModelMappings(): Record<string, string> {\n const config = getConfig()\n const modelMappings = config.modelMappings\n if (!modelMappings) {\n return { ...defaultConfig.modelMappings }\n }\n\n const validMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (\n !sourceModel\n || typeof targetModel !== \"string\"\n || targetModel.length === 0\n ) {\n continue\n }\n validMappings[sourceModel] = targetModel\n }\n\n return validMappings\n}\n\nfunction validateModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const validatedMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (!sourceModel || !targetModel) {\n throw new Error(\n \"Each model mapping must use non-empty source and target values.\",\n )\n }\n validatedMappings[sourceModel] = targetModel\n }\n\n return validatedMappings\n}\n\nexport function setModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const nextConfig = {\n ...readEditableConfigFromDisk(),\n modelMappings: validateModelMappings(modelMappings),\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getModelMappings()\n}\n\nexport function resolveMappedModel(model: string): string {\n return getModelMappings()[model] ?? model\n}\n\nexport function getSmallModel(): string {\n const config = getConfig()\n return config.smallModel ?? \"gpt-5-mini\"\n}\n\nexport function isContextManagementEnabledForMessages(): boolean {\n const config = getConfig()\n return config.contextManagement?.messages ?? defaultContextManagement.messages\n}\n\nexport function isContextManagementEnabledForResponses(): boolean {\n const config = getConfig()\n return (\n config.contextManagement?.responses ?? defaultContextManagement.responses\n )\n}\n\nexport function getModelResponsesApiCompactThreshold(\n model: string,\n): number | undefined {\n const config = getConfig()\n const threshold = config.modelResponsesApiCompactThresholds?.[model]\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" {\n const config = getConfig()\n const userEffort = config.modelReasoningEfforts?.[model]\n if (userEffort !== undefined) {\n return userEffort\n }\n return isGpt53OrAbove(model) ? \"xhigh\" : \"high\"\n}\n","import consola from \"consola\"\n\nimport {\n SUPPORTED_PROVIDER_TYPES,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n type ModelConfig,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./config-store\"\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n apiKey: string\n authType: ProviderAuthType\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n}\n\nconst OPENCODE_ANTHROPIC_MODEL_PATTERN = /^(?:qwen|minimax)/iu\nconst OPENCODE_RESPONSES_MODEL_PATTERN = /^(?:gpt|grok)(?:[-_.]|$)/iu\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nexport function isSupportedProviderType(value: string): value is ProviderType {\n return SUPPORTED_PROVIDER_TYPES.includes(value as ProviderType)\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nexport function resolveProviderAuthType(\n providerName: string,\n authType: string | undefined,\n providerType: ProviderType,\n): ProviderAuthType {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n if (authType === undefined) {\n return defaultAuthType\n }\n\n if (authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"oauth2\") {\n if (providerName === \"codex\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has authType 'oauth2', which is only supported by the builtin codex provider, falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n }\n\n if (authType === \"authorization\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n}\n\nfunction isProviderApiKeyRequired(\n providerName: string,\n authType: ProviderAuthType,\n): boolean {\n return !(providerName === \"codex\" && authType === \"oauth2\")\n}\n\nexport function getRawProviderConfig(name: string): ProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n return config.providers?.[providerName] ?? null\n}\n\nexport function setProviderConfig(\n name: string,\n provider: ProviderConfig,\n): ProviderConfig {\n const providerName = name.trim()\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (isReservedProviderName(providerName)) {\n throw new Error(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const nextConfig = {\n ...editableConfig,\n providers: {\n ...editableConfig.providers,\n [providerName]: provider,\n },\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getRawProviderConfig(providerName) ?? provider\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n if (isReservedProviderName(providerName)) {\n consola.warn(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n return null\n }\n\n const provider = getRawProviderConfig(providerName)\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? \"anthropic\"\n if (!isSupportedProviderType(type)) {\n consola.warn(\n `Provider ${providerName} is ignored because type '${type}' is not supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const authType = resolveProviderAuthType(\n providerName,\n provider.authType,\n type,\n )\n const apiKey = (provider.apiKey ?? \"\").trim()\n const missingFields = [\n ...(baseUrl ? [] : [\"baseUrl\"]),\n ...(isProviderApiKeyRequired(providerName, authType) && !apiKey ?\n [\"apiKey\"]\n : []),\n ]\n\n if (missingFields.length > 0) {\n consola.warn(\n `Provider ${providerName} is enabled but missing ${missingFields.join(\" or \")}`,\n )\n return null\n }\n\n return {\n name: providerName,\n type,\n baseUrl,\n apiKey,\n authType,\n pricingCurrency: normalizePricingCurrency(provider.pricingCurrency),\n models: provider.models,\n }\n}\n\nexport function resolveEffectiveProviderType(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ProviderType {\n const modelConfig = providerConfig.models?.[model]\n if (modelConfig?.type && isSupportedProviderType(modelConfig.type)) {\n return modelConfig.type\n }\n\n if (providerConfig.name === \"opencode-go\") {\n if (OPENCODE_ANTHROPIC_MODEL_PATTERN.test(model)) {\n return \"anthropic\"\n }\n if (OPENCODE_RESPONSES_MODEL_PATTERN.test(model)) {\n return \"openai-responses\"\n }\n }\n\n return providerConfig.type\n}\n\nfunction normalizePricingCurrency(\n value: string | undefined,\n): string | undefined {\n const currency = value?.trim().toUpperCase()\n return currency || undefined\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter((name) => getProviderConfig(name) !== null)\n}\n\nexport function isReservedProviderName(name: string): boolean {\n return name.trim() === \"copilot\"\n}\n"],"mappings":"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"}