{"version":3,"file":"openai-codex-responses-DedxQjNG.mjs","names":["blobLike"],"sources":["../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/session-resources.js","../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js","../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js","../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/utils/uuid.js","../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js"],"sourcesContent":["const sessionResourceCleanups = new Set();\nexport function registerSessionResourceCleanup(cleanup) {\n    sessionResourceCleanups.add(cleanup);\n    return () => {\n        sessionResourceCleanups.delete(cleanup);\n    };\n}\nexport function cleanupSessionResources(sessionId) {\n    const errors = [];\n    for (const cleanup of sessionResourceCleanups) {\n        try {\n            cleanup(sessionId);\n        }\n        catch (error) {\n            errors.push(error);\n        }\n    }\n    if (errors.length > 0) {\n        throw new AggregateError(errors, \"Failed to cleanup session resources\");\n    }\n}\n//# sourceMappingURL=session-resources.js.map","export function combineAbortSignals(signals) {\n    const activeSignals = signals.filter((signal) => signal !== undefined);\n    if (activeSignals.length === 0) {\n        return { cleanup: () => { } };\n    }\n    if (activeSignals.length === 1) {\n        return { signal: activeSignals[0], cleanup: () => { } };\n    }\n    const controller = new AbortController();\n    const listeners = [];\n    const abort = (signal) => {\n        if (!controller.signal.aborted) {\n            controller.abort(signal.reason);\n        }\n    };\n    for (const signal of activeSignals) {\n        if (signal.aborted) {\n            abort(signal);\n            break;\n        }\n        const listener = () => abort(signal);\n        signal.addEventListener(\"abort\", listener, { once: true });\n        listeners.push({ signal, listener });\n    }\n    return {\n        signal: controller.signal,\n        cleanup: () => {\n            for (const { signal, listener } of listeners) {\n                signal.removeEventListener(\"abort\", listener);\n            }\n        },\n    };\n}\n//# sourceMappingURL=abort-signals.js.map","import { getProviderEnvValue } from \"./provider-env.js\";\nconst DEFAULT_PROXY_PORTS = {\n    ftp: 21,\n    gopher: 70,\n    http: 80,\n    https: 443,\n    ws: 80,\n    wss: 443,\n};\nfunction getProxyEnv(key, env) {\n    const lowercaseKey = key.toLowerCase();\n    const uppercaseKey = key.toUpperCase();\n    return (env?.[lowercaseKey] ||\n        env?.[uppercaseKey] ||\n        getProviderEnvValue(lowercaseKey) ||\n        getProviderEnvValue(uppercaseKey) ||\n        \"\");\n}\nfunction parseProxyTargetUrl(targetUrl) {\n    if (targetUrl instanceof URL) {\n        return targetUrl;\n    }\n    try {\n        return new URL(targetUrl);\n    }\n    catch {\n        return undefined;\n    }\n}\nfunction shouldProxyHostname(hostname, port, env) {\n    const noProxy = getProxyEnv(\"no_proxy\", env).toLowerCase();\n    if (!noProxy) {\n        return true;\n    }\n    if (noProxy === \"*\") {\n        return false;\n    }\n    return noProxy.split(/[,\\s]/).every((proxy) => {\n        if (!proxy) {\n            return true;\n        }\n        const parsedProxy = proxy.match(/^(.+):(\\d+)$/);\n        let proxyHostname = parsedProxy ? parsedProxy[1] : proxy;\n        const proxyPort = parsedProxy ? Number.parseInt(parsedProxy[2], 10) : 0;\n        if (proxyPort && proxyPort !== port) {\n            return true;\n        }\n        if (!/^[.*]/.test(proxyHostname)) {\n            return hostname !== proxyHostname;\n        }\n        if (proxyHostname.startsWith(\"*\")) {\n            proxyHostname = proxyHostname.slice(1);\n        }\n        return !hostname.endsWith(proxyHostname);\n    });\n}\nfunction getProxyForUrl(targetUrl, env) {\n    const parsedUrl = parseProxyTargetUrl(targetUrl);\n    if (!parsedUrl?.protocol || !parsedUrl.host) {\n        return \"\";\n    }\n    const protocol = parsedUrl.protocol.split(\":\", 1)[0];\n    const hostname = parsedUrl.host.replace(/:\\d*$/, \"\");\n    const port = Number.parseInt(parsedUrl.port, 10) || DEFAULT_PROXY_PORTS[protocol] || 0;\n    if (!shouldProxyHostname(hostname, port, env)) {\n        return \"\";\n    }\n    let proxy = getProxyEnv(`${protocol}_proxy`, env) || getProxyEnv(\"all_proxy\", env);\n    if (proxy && !proxy.includes(\"://\")) {\n        proxy = `${protocol}://${proxy}`;\n    }\n    return proxy;\n}\nexport const UNSUPPORTED_PROXY_PROTOCOL_MESSAGE = \"Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.\";\nexport function resolveHttpProxyUrlForTarget(targetUrl, env) {\n    const proxy = getProxyForUrl(targetUrl, env);\n    if (!proxy) {\n        return undefined;\n    }\n    let proxyUrl;\n    try {\n        proxyUrl = new URL(proxy);\n    }\n    catch (error) {\n        throw new Error(`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error ? error.message : String(error)}`);\n    }\n    if (proxyUrl.protocol !== \"http:\" && proxyUrl.protocol !== \"https:\") {\n        throw new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);\n    }\n    return proxyUrl;\n}\n//# sourceMappingURL=node-http-proxy.js.map","let lastTimestamp = -Infinity;\nlet sequence = 0;\nfunction fillRandomBytes(bytes) {\n    if (globalThis.crypto?.getRandomValues) {\n        globalThis.crypto.getRandomValues(bytes);\n        return;\n    }\n    for (let i = 0; i < bytes.length; i++) {\n        bytes[i] = Math.floor(Math.random() * 256);\n    }\n}\n/** Generate a time-ordered UUIDv7. */\nexport function uuidv7() {\n    const random = new Uint8Array(16);\n    fillRandomBytes(random);\n    const timestamp = Date.now();\n    if (timestamp > lastTimestamp) {\n        sequence = random[6] * 0x1000000 + random[7] * 0x10000 + random[8] * 0x100 + random[9];\n        lastTimestamp = timestamp;\n    }\n    else {\n        sequence = (sequence + 1) >>> 0;\n        if (sequence === 0)\n            lastTimestamp++;\n    }\n    const bytes = new Uint8Array(16);\n    bytes[0] = (lastTimestamp / 0x10000000000) & 0xff;\n    bytes[1] = (lastTimestamp / 0x100000000) & 0xff;\n    bytes[2] = (lastTimestamp / 0x1000000) & 0xff;\n    bytes[3] = (lastTimestamp / 0x10000) & 0xff;\n    bytes[4] = (lastTimestamp / 0x100) & 0xff;\n    bytes[5] = lastTimestamp & 0xff;\n    bytes[6] = 0x70 | ((sequence >>> 28) & 0x0f);\n    bytes[7] = (sequence >>> 20) & 0xff;\n    bytes[8] = 0x80 | ((sequence >>> 14) & 0x3f);\n    bytes[9] = (sequence >>> 6) & 0xff;\n    bytes[10] = ((sequence & 0x3f) << 2) | (random[10] & 0x03);\n    bytes[11] = random[11];\n    bytes[12] = random[12];\n    bytes[13] = random[13];\n    bytes[14] = random[14];\n    bytes[15] = random[15];\n    const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\"));\n    return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n//# sourceMappingURL=uuid.js.map","function loadNodeOs() {\n    if (typeof process === \"undefined\" || !(process.versions?.node || process.versions?.bun)) {\n        return null;\n    }\n    return process.getBuiltinModule?.(\"node:os\") ?? null;\n}\n// NEVER convert to top-level runtime imports - breaks browser/Vite builds\nconst _os = loadNodeOs();\nimport { clampThinkingLevel } from \"../models.js\";\nimport { registerSessionResourceCleanup } from \"../session-resources.js\";\nimport { combineAbortSignals } from \"../utils/abort-signals.js\";\nimport { splitDeferredTools } from \"../utils/deferred-tools.js\";\nimport { appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, formatThrownValue, } from \"../utils/diagnostics.js\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { headersToRecord } from \"../utils/headers.js\";\nimport { resolveHttpProxyUrlForTarget } from \"../utils/node-http-proxy.js\";\nimport { uuidv7 } from \"../utils/uuid.js\";\nimport { createGrammarToolInputProperties } from \"./constrained-sampling.js\";\nimport { clampOpenAIPromptCacheKey } from \"./openai-prompt-cache.js\";\nimport { convertResponsesMessages, convertResponsesTools, processResponsesStream } from \"./openai-responses-shared.js\";\nimport { buildBaseOptions } from \"./simple-options.js\";\n// ============================================================================\n// Configuration\n// ============================================================================\nconst DEFAULT_CODEX_BASE_URL = \"https://chatgpt.com/backend-api\";\nconst JWT_CLAIM_PATH = \"https://api.openai.com/auth\";\nconst DEFAULT_MAX_RETRIES = 0;\nconst BASE_DELAY_MS = 1000;\nconst DEFAULT_MAX_RETRY_DELAY_MS = 60_000;\nconst DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS = 15_000;\n// The Codex backend accepts zstd-compressed request bodies on the SSE responses\n// endpoint (the same endpoint the official Codex client compresses against).\nconst REQUEST_COMPRESSION_ZSTD_LEVEL = 3;\nconst CODEX_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\"]);\nconst WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE = 1009;\nconst WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE = \"websocket_connection_limit_reached\";\nconst PREVIOUS_RESPONSE_NOT_FOUND_CODE = \"previous_response_not_found\";\nconst CODEX_RESPONSE_STATUSES = new Set([\n    \"completed\",\n    \"incomplete\",\n    \"failed\",\n    \"cancelled\",\n    \"queued\",\n    \"in_progress\",\n]);\nfunction assertSuccessfulOutput(output) {\n    if (output.stopReason === \"pending\") {\n        throw new Error(\"Codex stream ended without a stop reason\");\n    }\n    if (output.stopReason === \"error\" || output.stopReason === \"aborted\") {\n        throw new Error(output.errorMessage || \"An unknown error occurred\");\n    }\n}\n// ============================================================================\n// Retry Helpers\n// ============================================================================\nfunction isTerminalRateLimitError(errorText) {\n    return /GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing/i.test(errorText);\n}\nfunction isRetryableError(status, errorText) {\n    if (status === 429 && isTerminalRateLimitError(errorText)) {\n        return false;\n    }\n    if (status === 429 || status === 500 || status === 502 || status === 503 || status === 504) {\n        return true;\n    }\n    return /rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText);\n}\nfunction getRetryAfterDelayMs(headers) {\n    const retryAfterMs = headers.get(\"retry-after-ms\");\n    if (retryAfterMs !== null) {\n        const millis = Number(retryAfterMs);\n        if (Number.isFinite(millis)) {\n            return Math.max(0, millis);\n        }\n    }\n    const retryAfter = headers.get(\"retry-after\");\n    if (!retryAfter) {\n        return undefined;\n    }\n    const seconds = Number(retryAfter);\n    if (Number.isFinite(seconds)) {\n        return Math.max(0, seconds * 1000);\n    }\n    const date = Date.parse(retryAfter);\n    if (!Number.isNaN(date)) {\n        return Math.max(0, date - Date.now());\n    }\n    return undefined;\n}\nclass RetryDelayExceededError extends Error {\n}\nfunction validateRetryDelayMs(delayMs, options) {\n    const maxRetryDelayMs = options?.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;\n    if (maxRetryDelayMs > 0 && delayMs > maxRetryDelayMs) {\n        throw new RetryDelayExceededError(`Server requested ${Math.ceil(delayMs / 1000)}s retry delay (max: ${Math.ceil(maxRetryDelayMs / 1000)}s)`);\n    }\n    return delayMs;\n}\nfunction sleep(ms, signal) {\n    return new Promise((resolve, reject) => {\n        if (signal?.aborted) {\n            reject(new Error(\"Request was aborted\"));\n            return;\n        }\n        const timeout = setTimeout(resolve, ms);\n        signal?.addEventListener(\"abort\", () => {\n            clearTimeout(timeout);\n            reject(new Error(\"Request was aborted\"));\n        });\n    });\n}\nfunction normalizeTimeoutMs(value) {\n    if (value === undefined)\n        return undefined;\n    if (!Number.isFinite(value) || value < 0) {\n        throw new Error(`Invalid timeoutMs: ${String(value)}`);\n    }\n    return Math.floor(value);\n}\nfunction loadNodeZlib() {\n    if (typeof process === \"undefined\" || !(process.versions?.node || process.versions?.bun)) {\n        return null;\n    }\n    return process.getBuiltinModule?.(\"node:zlib\") ?? null;\n}\n// Returns the zstd-compressed body bytes, or null when compression is\n// unavailable (browser/Vite builds). Callers fall back to sending the\n// uncompressed JSON when this returns null.\nfunction compressRequestBodyZstd(bodyJson) {\n    const zlib = loadNodeZlib();\n    if (!zlib || typeof zlib.zstdCompressSync !== \"function\") {\n        return null;\n    }\n    try {\n        const compressed = zlib.zstdCompressSync(bodyJson, {\n            params: { [zlib.constants.ZSTD_c_compressionLevel]: REQUEST_COMPRESSION_ZSTD_LEVEL },\n        });\n        return new Uint8Array(compressed.buffer, compressed.byteOffset, compressed.byteLength);\n    }\n    catch {\n        return null;\n    }\n}\n// ============================================================================\n// Main Stream Function\n// ============================================================================\nexport const stream = (model, context, options) => {\n    const stream = new AssistantMessageEventStream();\n    (async () => {\n        const output = {\n            role: \"assistant\",\n            content: [],\n            api: \"openai-codex-responses\",\n            provider: model.provider,\n            model: model.id,\n            usage: {\n                input: 0,\n                output: 0,\n                cacheRead: 0,\n                cacheWrite: 0,\n                totalTokens: 0,\n                cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n            },\n            stopReason: \"pending\",\n            timestamp: Date.now(),\n        };\n        try {\n            const apiKey = options?.apiKey;\n            if (!apiKey) {\n                throw new Error(`No API key for provider: ${model.provider}`);\n            }\n            const accountId = extractAccountId(apiKey);\n            const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false);\n            const cacheSessionId = options?.cacheRetention === \"none\" ? undefined : options?.sessionId;\n            const codexSessionId = clampOpenAIPromptCacheKey(cacheSessionId);\n            let body = buildRequestBody(model, context, options, codexSessionId, grammarToolInputProperties);\n            const nextBody = await options?.onPayload?.(body, model);\n            if (nextBody !== undefined) {\n                body = nextBody;\n            }\n            const websocketRequestId = codexSessionId || uuidv7();\n            const sseHeaders = buildSSEHeaders(model.headers, options?.headers, accountId, apiKey, codexSessionId);\n            const websocketHeaders = buildWebSocketHeaders(model.headers, options?.headers, accountId, apiKey, websocketRequestId);\n            const bodyJson = JSON.stringify(body);\n            const httpTimeoutMs = normalizeTimeoutMs(options?.timeoutMs);\n            const websocketConnectTimeoutMs = normalizeTimeoutMs(options?.websocketConnectTimeoutMs);\n            const transport = options?.transport || \"auto\";\n            let startEmitted = false;\n            const websocketDisabledForSession = transport !== \"sse\" && isWebSocketSseFallbackActive(cacheSessionId);\n            if (websocketDisabledForSession) {\n                recordWebSocketSseFallback(cacheSessionId);\n            }\n            if (transport !== \"sse\" && !websocketDisabledForSession) {\n                let websocketStarted = false;\n                let retriedWebSocketConnectionLimit = false;\n                let retriedMissingWebSocketContinuation = false;\n                while (true) {\n                    websocketStarted = false;\n                    try {\n                        await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl), body, websocketHeaders, output, stream, model, () => {\n                            websocketStarted = true;\n                            if (!startEmitted) {\n                                startEmitted = true;\n                                stream.push({ type: \"start\", partial: output });\n                            }\n                        }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options);\n                        if (options?.signal?.aborted) {\n                            throw new Error(\"Request was aborted\");\n                        }\n                        assertSuccessfulOutput(output);\n                        stream.push({\n                            type: \"done\",\n                            reason: output.stopReason,\n                            message: output,\n                        });\n                        stream.end();\n                        return;\n                    }\n                    catch (error) {\n                        const aborted = options?.signal?.aborted;\n                        const connectionLimitBeforeStart = !websocketStarted && isWebSocketConnectionLimitReachedError(error);\n                        const previousResponseNotFound = isPreviousResponseNotFoundError(error);\n                        if (!aborted && previousResponseNotFound && !retriedMissingWebSocketContinuation) {\n                            retriedMissingWebSocketContinuation = true;\n                            continue;\n                        }\n                        if (!aborted && connectionLimitBeforeStart && !retriedWebSocketConnectionLimit) {\n                            retriedWebSocketConnectionLimit = true;\n                            continue;\n                        }\n                        if (aborted || (isCodexNonTransportError(error) && !connectionLimitBeforeStart)) {\n                            throw error;\n                        }\n                        appendAssistantMessageDiagnostic(output, createAssistantMessageDiagnostic(\"provider_transport_failure\", error, {\n                            configuredTransport: transport,\n                            fallbackTransport: websocketStarted ? undefined : \"sse\",\n                            eventsEmitted: websocketStarted,\n                            phase: websocketStarted ? \"after_message_stream_start\" : \"before_message_stream_start\",\n                            requestBytes: new TextEncoder().encode(bodyJson).byteLength,\n                        }));\n                        recordWebSocketFailure(cacheSessionId, error);\n                        if (websocketStarted) {\n                            throw error;\n                        }\n                        recordWebSocketSseFallback(cacheSessionId);\n                        break;\n                    }\n                }\n            }\n            // Compress the request body once for the SSE path. The Codex backend\n            // decodes Content-Encoding: zstd; the WebSocket transport above sends the\n            // uncompressed JSON frame, matching the official Codex client.\n            const compressedBody = compressRequestBodyZstd(bodyJson);\n            if (compressedBody) {\n                sseHeaders.set(\"content-encoding\", \"zstd\");\n            }\n            const sseBody = compressedBody ?? bodyJson;\n            // Fetch with retry logic for rate limits and transient errors\n            let response;\n            let lastError;\n            const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\n            for (let attempt = 0; attempt <= maxRetries; attempt++) {\n                if (options?.signal?.aborted) {\n                    throw new Error(\"Request was aborted\");\n                }\n                try {\n                    const headerTimeoutSignal = httpTimeoutMs !== undefined && httpTimeoutMs > 0 ? AbortSignal.timeout(httpTimeoutMs) : undefined;\n                    const combinedSignal = combineAbortSignals([options?.signal, headerTimeoutSignal]);\n                    try {\n                        response = await (options?.fetch ?? globalThis.fetch)(resolveCodexUrl(model.baseUrl), {\n                            method: \"POST\",\n                            headers: sseHeaders,\n                            body: sseBody,\n                            signal: combinedSignal.signal,\n                        });\n                    }\n                    catch (error) {\n                        if (headerTimeoutSignal?.aborted && !options?.signal?.aborted) {\n                            throw new Error(`Codex SSE response headers timed out after ${httpTimeoutMs}ms`);\n                        }\n                        throw error;\n                    }\n                    finally {\n                        combinedSignal.cleanup();\n                    }\n                    await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n                    if (response.ok) {\n                        break;\n                    }\n                    const errorText = await response.text();\n                    if (attempt < maxRetries && isRetryableError(response.status, errorText)) {\n                        const retryAfterDelayMs = getRetryAfterDelayMs(response.headers);\n                        const delayMs = retryAfterDelayMs === undefined\n                            ? BASE_DELAY_MS * 2 ** attempt\n                            : validateRetryDelayMs(retryAfterDelayMs, options);\n                        await sleep(delayMs, options?.signal);\n                        continue;\n                    }\n                    // Parse error for friendly message on final attempt or non-retryable error\n                    const fakeResponse = new Response(errorText, {\n                        status: response.status,\n                        statusText: response.statusText,\n                    });\n                    const info = await parseErrorResponse(fakeResponse);\n                    throw new Error(info.friendlyMessage || info.message);\n                }\n                catch (error) {\n                    if (error instanceof Error) {\n                        if (error.name === \"AbortError\" || error.message === \"Request was aborted\") {\n                            throw new Error(\"Request was aborted\");\n                        }\n                    }\n                    lastError = error instanceof Error ? error : new Error(String(error));\n                    // Network errors are retryable\n                    if (attempt < maxRetries &&\n                        !(lastError instanceof RetryDelayExceededError) &&\n                        !lastError.message.includes(\"usage limit\")) {\n                        const delayMs = BASE_DELAY_MS * 2 ** attempt;\n                        await sleep(delayMs, options?.signal);\n                        continue;\n                    }\n                    throw lastError;\n                }\n            }\n            if (!response?.ok) {\n                throw lastError ?? new Error(\"Failed after retries\");\n            }\n            if (!response.body) {\n                throw new Error(\"No response body\");\n            }\n            if (!startEmitted) {\n                startEmitted = true;\n                stream.push({ type: \"start\", partial: output });\n            }\n            await processStream(response, output, stream, model, grammarToolInputProperties, options);\n            if (options?.signal?.aborted) {\n                throw new Error(\"Request was aborted\");\n            }\n            assertSuccessfulOutput(output);\n            stream.push({ type: \"done\", reason: output.stopReason, message: output });\n            stream.end();\n        }\n        catch (error) {\n            for (const block of output.content) {\n                // Streaming scratch buffers are only used during parsing; never persist them.\n                delete block.partialJson;\n                delete block.customInput;\n            }\n            output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n            output.errorMessage = formatProviderError(normalizeProviderError(error));\n            stream.push({ type: \"error\", reason: output.stopReason, error: output });\n            stream.end();\n        }\n    })();\n    return stream;\n};\nexport const streamSimple = (model, context, options) => {\n    const apiKey = options?.apiKey;\n    if (!apiKey) {\n        throw new Error(`No API key for provider: ${model.provider}`);\n    }\n    const base = buildBaseOptions(model, context, options, apiKey);\n    const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;\n    const reasoningEffort = clampedReasoning === \"off\" ? undefined : clampedReasoning;\n    return stream(model, context, {\n        ...base,\n        reasoningEffort,\n    });\n};\n// ============================================================================\n// Request Building\n// ============================================================================\nfunction buildRequestBody(model, context, options, cacheSessionId, grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false)) {\n    const supportsStrictMode = model.compat?.supportsStrictMode ?? true;\n    const supportsOpenAIGrammarTools = model.compat?.supportsOpenAIGrammarTools ?? false;\n    const toolPlacement = splitDeferredTools(context, model.compat?.supportsToolSearch ?? false);\n    const messages = convertResponsesMessages(model, context, CODEX_TOOL_CALL_PROVIDERS, {\n        includeSystemPrompt: false,\n        grammarToolInputProperties,\n        deferredTools: toolPlacement.deferred,\n        toolOptions: {\n            strict: null,\n            supportsStrictMode,\n            supportsOpenAIGrammarTools,\n        },\n    });\n    const body = {\n        model: model.id,\n        store: false,\n        stream: true,\n        instructions: context.systemPrompt || \"You are a helpful assistant.\",\n        input: messages,\n        text: { verbosity: options?.textVerbosity || \"low\" },\n        include: [\"reasoning.encrypted_content\"],\n        prompt_cache_key: cacheSessionId,\n        tool_choice: options?.toolChoice ?? \"auto\",\n        parallel_tool_calls: true,\n    };\n    if (options?.temperature !== undefined) {\n        body.temperature = options.temperature;\n    }\n    if (options?.serviceTier !== undefined) {\n        body.service_tier = options.serviceTier;\n    }\n    if (toolPlacement.immediate.length > 0) {\n        body.tools = convertResponsesTools(toolPlacement.immediate, {\n            strict: null,\n            supportsStrictMode,\n            supportsOpenAIGrammarTools,\n        });\n    }\n    if (options?.reasoningEffort !== undefined) {\n        const effort = options.reasoningEffort === \"none\"\n            ? (model.thinkingLevelMap?.off ?? \"none\")\n            : (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort);\n        if (effort !== null) {\n            body.reasoning = {\n                effort,\n                summary: options.reasoningSummary ?? \"auto\",\n            };\n        }\n    }\n    return body;\n}\nfunction getServiceTierCostMultiplier(model, serviceTier) {\n    switch (serviceTier) {\n        case \"flex\":\n            return 0.5;\n        case \"priority\":\n            return model.id === \"gpt-5.5\" ? 2.5 : 2;\n        default:\n            return 1;\n    }\n}\nfunction applyServiceTierPricing(usage, serviceTier, model) {\n    const multiplier = getServiceTierCostMultiplier(model, serviceTier);\n    if (multiplier === 1)\n        return;\n    usage.cost.input *= multiplier;\n    usage.cost.output *= multiplier;\n    usage.cost.cacheRead *= multiplier;\n    usage.cost.cacheWrite *= multiplier;\n    usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n}\nfunction resolveCodexServiceTier(responseServiceTier, requestServiceTier) {\n    if (responseServiceTier === \"default\" && (requestServiceTier === \"flex\" || requestServiceTier === \"priority\")) {\n        return requestServiceTier;\n    }\n    return responseServiceTier ?? requestServiceTier;\n}\nfunction resolveCodexUrl(baseUrl) {\n    const raw = baseUrl && baseUrl.trim().length > 0 ? baseUrl : DEFAULT_CODEX_BASE_URL;\n    const normalized = raw.replace(/\\/+$/, \"\");\n    if (normalized.endsWith(\"/codex/responses\"))\n        return normalized;\n    if (normalized.endsWith(\"/codex\"))\n        return `${normalized}/responses`;\n    return `${normalized}/codex/responses`;\n}\nfunction resolveCodexWebSocketUrl(baseUrl) {\n    const url = new URL(resolveCodexUrl(baseUrl));\n    if (url.protocol === \"https:\")\n        url.protocol = \"wss:\";\n    if (url.protocol === \"http:\")\n        url.protocol = \"ws:\";\n    return url.toString();\n}\n// ============================================================================\n// Response Processing\n// ============================================================================\nasync function processStream(response, output, stream, model, grammarToolInputProperties, options) {\n    await processResponsesStream(mapCodexEvents(parseSSE(response, options?.signal)), output, stream, model, {\n        serviceTier: options?.serviceTier,\n        grammarToolInputProperties,\n        resolveServiceTier: resolveCodexServiceTier,\n        applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),\n    });\n}\nclass CodexApiError extends Error {\n    code;\n    payload;\n    constructor(message, options) {\n        super(message);\n        this.name = \"CodexApiError\";\n        this.code = options?.code;\n        this.payload = options?.payload;\n        this.cause = options?.cause;\n    }\n}\nclass CodexProtocolError extends Error {\n    payload;\n    constructor(message, options) {\n        super(message);\n        this.name = \"CodexProtocolError\";\n        this.payload = options?.payload;\n        this.cause = options?.cause;\n    }\n}\nfunction isCodexNonTransportError(error) {\n    return error instanceof CodexApiError || error instanceof CodexProtocolError;\n}\nfunction isWebSocketConnectionLimitReachedError(error) {\n    return error instanceof CodexApiError && error.code === WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE;\n}\nfunction isPreviousResponseNotFoundError(error) {\n    return error instanceof CodexApiError && error.code === PREVIOUS_RESPONSE_NOT_FOUND_CODE;\n}\nfunction extractCodexEventError(event) {\n    const nested = event.error && typeof event.error === \"object\" ? event.error : undefined;\n    return {\n        code: typeof event.code === \"string\" ? event.code : typeof nested?.code === \"string\" ? nested.code : undefined,\n        message: typeof event.message === \"string\"\n            ? event.message\n            : typeof nested?.message === \"string\"\n                ? nested.message\n                : undefined,\n    };\n}\nasync function* mapCodexEvents(events) {\n    for await (const event of events) {\n        const type = typeof event.type === \"string\" ? event.type : undefined;\n        if (!type)\n            continue;\n        if (type === \"error\") {\n            const { code, message } = extractCodexEventError(event);\n            throw new CodexApiError(`Codex error: ${message || code || JSON.stringify(event)}`, {\n                code,\n                payload: event,\n            });\n        }\n        if (type === \"response.failed\") {\n            const response = event.response;\n            const code = response?.error?.code;\n            const message = response?.error?.message;\n            throw new CodexApiError(message || \"Codex response failed\", { code, payload: event });\n        }\n        if (type === \"response.done\" || type === \"response.completed\" || type === \"response.incomplete\") {\n            const response = event.response;\n            const normalizedResponse = response\n                ? { ...response, status: normalizeCodexStatus(response.status) }\n                : response;\n            yield { ...event, type: \"response.completed\", response: normalizedResponse };\n            return;\n        }\n        yield event;\n    }\n}\nfunction normalizeCodexStatus(status) {\n    if (typeof status !== \"string\")\n        return undefined;\n    return CODEX_RESPONSE_STATUSES.has(status) ? status : undefined;\n}\n// ============================================================================\n// SSE Parsing\n// ============================================================================\nasync function* parseSSE(response, signal) {\n    if (!response.body)\n        return;\n    const reader = response.body.getReader();\n    const decoder = new TextDecoder();\n    let buffer = \"\";\n    const onAbort = () => {\n        void reader.cancel().catch(() => { });\n    };\n    signal?.addEventListener(\"abort\", onAbort, { once: true });\n    try {\n        while (true) {\n            if (signal?.aborted) {\n                throw new Error(\"Request was aborted\");\n            }\n            const { done, value } = await reader.read();\n            if (signal?.aborted) {\n                throw new Error(\"Request was aborted\");\n            }\n            if (done)\n                break;\n            buffer += decoder.decode(value, { stream: true });\n            let idx = buffer.indexOf(\"\\n\\n\");\n            while (idx !== -1) {\n                const chunk = buffer.slice(0, idx);\n                buffer = buffer.slice(idx + 2);\n                const dataLines = chunk\n                    .split(\"\\n\")\n                    .filter((l) => l.startsWith(\"data:\"))\n                    .map((l) => l.slice(5).trim());\n                if (dataLines.length > 0) {\n                    const data = dataLines.join(\"\\n\").trim();\n                    if (data && data !== \"[DONE]\") {\n                        try {\n                            yield JSON.parse(data);\n                        }\n                        catch (cause) {\n                            throw new CodexProtocolError(`Invalid Codex SSE JSON: ${formatThrownValue(cause)}`, {\n                                cause,\n                                payload: data,\n                            });\n                        }\n                    }\n                }\n                idx = buffer.indexOf(\"\\n\\n\");\n            }\n        }\n    }\n    finally {\n        signal?.removeEventListener(\"abort\", onAbort);\n        try {\n            await reader.cancel();\n        }\n        catch { }\n        try {\n            reader.releaseLock();\n        }\n        catch { }\n    }\n}\n// ============================================================================\n// WebSocket Parsing\n// ============================================================================\nconst OPENAI_BETA_RESPONSES_WEBSOCKETS = \"responses_websockets=2026-02-06\";\nconst SESSION_WEBSOCKET_CACHE_TTL_MS = 5 * 60 * 1000;\nconst SESSION_WEBSOCKET_MAX_AGE_MS = 55 * 60 * 1000;\nconst websocketSessionCache = new Map();\nconst websocketDebugStats = new Map();\nconst websocketSseFallbackSessions = new Set();\nfunction getOrCreateWebSocketDebugStats(sessionId) {\n    let stats = websocketDebugStats.get(sessionId);\n    if (!stats) {\n        stats = {\n            requests: 0,\n            connectionsCreated: 0,\n            connectionsReused: 0,\n            cachedContextRequests: 0,\n            storeTrueRequests: 0,\n            fullContextRequests: 0,\n            deltaRequests: 0,\n            lastInputItems: 0,\n            websocketFailures: 0,\n            sseFallbacks: 0,\n        };\n        websocketDebugStats.set(sessionId, stats);\n    }\n    return stats;\n}\nexport function getOpenAICodexWebSocketDebugStats(sessionId) {\n    const stats = websocketDebugStats.get(sessionId);\n    return stats ? { ...stats } : undefined;\n}\nexport function resetOpenAICodexWebSocketDebugStats(sessionId) {\n    if (sessionId) {\n        websocketDebugStats.delete(sessionId);\n        websocketSseFallbackSessions.delete(sessionId);\n        return;\n    }\n    websocketDebugStats.clear();\n    websocketSseFallbackSessions.clear();\n}\nexport function closeOpenAICodexWebSocketSessions(sessionId) {\n    const closeEntry = (entry) => {\n        if (entry.idleTimer)\n            clearTimeout(entry.idleTimer);\n        closeWebSocketSilently(entry.socket, 1000, \"debug_close\");\n    };\n    if (sessionId) {\n        for (const entry of websocketSessionCache.get(sessionId)?.values() ?? [])\n            closeEntry(entry);\n        websocketSessionCache.delete(sessionId);\n        return;\n    }\n    for (const accountEntries of websocketSessionCache.values()) {\n        for (const entry of accountEntries.values())\n            closeEntry(entry);\n    }\n    websocketSessionCache.clear();\n}\nregisterSessionResourceCleanup(closeOpenAICodexWebSocketSessions);\nfunction isWebSocketSseFallbackActive(sessionId) {\n    return sessionId ? websocketSseFallbackSessions.has(sessionId) : false;\n}\nfunction recordWebSocketSseFallback(sessionId) {\n    if (!sessionId)\n        return;\n    const stats = getOrCreateWebSocketDebugStats(sessionId);\n    stats.sseFallbacks++;\n    stats.websocketFallbackActive = isWebSocketSseFallbackActive(sessionId);\n}\nfunction recordWebSocketFailure(sessionId, error) {\n    if (!sessionId)\n        return;\n    websocketSseFallbackSessions.add(sessionId);\n    const stats = getOrCreateWebSocketDebugStats(sessionId);\n    stats.websocketFailures++;\n    stats.lastWebSocketError = formatThrownValue(error);\n    stats.websocketFallbackActive = true;\n}\nlet _cachedWebsocket = null;\nasync function getWebSocketConstructor(env) {\n    if (!env && _cachedWebsocket)\n        return _cachedWebsocket;\n    // bun doesn't respect http proxy envs, ref: https://github.com/oven-sh/bun/issues/15489\n    // TODO: remove this when bun supports proxy envs in websocket.\n    if (typeof process !== \"undefined\" && process.versions?.bun) {\n        const WebSocketWithProxy = class extends WebSocket {\n            constructor(url, options) {\n                let _opts = {};\n                if (Array.isArray(options) || typeof options === \"string\") {\n                    _opts = { protocols: options };\n                }\n                else {\n                    _opts = { ...options };\n                }\n                const proxyUrl = resolveHttpProxyUrlForTarget(url.toString().replace(/^wss:/, \"https:\").replace(/^ws:/, \"http:\"), env);\n                super(url, { ..._opts, ...(proxyUrl ? { proxy: proxyUrl.toString() } : {}) });\n            }\n        };\n        if (!env) {\n            _cachedWebsocket = WebSocketWithProxy;\n        }\n        return WebSocketWithProxy;\n    }\n    const ctor = globalThis.WebSocket;\n    if (typeof ctor !== \"function\")\n        return null;\n    return ctor;\n}\nclass WebSocketCloseError extends Error {\n    code;\n    reason;\n    wasClean;\n    constructor(message, options) {\n        super(message);\n        this.name = \"WebSocketCloseError\";\n        this.code = options?.code;\n        this.reason = options?.reason;\n        this.wasClean = options?.wasClean;\n    }\n}\nfunction getWebSocketReadyState(socket) {\n    const readyState = socket.readyState;\n    return typeof readyState === \"number\" ? readyState : undefined;\n}\nfunction isWebSocketReusable(socket) {\n    const readyState = getWebSocketReadyState(socket);\n    // If readyState is unavailable, assume the runtime keeps it open/reusable.\n    return readyState === undefined || readyState === 1;\n}\nfunction isWebSocketSessionExpired(entry) {\n    return Date.now() - entry.createdAt >= SESSION_WEBSOCKET_MAX_AGE_MS;\n}\nfunction closeWebSocketSilently(socket, code = 1000, reason = \"done\") {\n    try {\n        socket.close(code, reason);\n    }\n    catch { }\n}\nfunction scheduleSessionWebSocketExpiry(sessionId, accountId, entry) {\n    if (entry.idleTimer) {\n        clearTimeout(entry.idleTimer);\n    }\n    entry.idleTimer = setTimeout(() => {\n        if (entry.busy)\n            return;\n        closeWebSocketSilently(entry.socket, 1000, \"idle_timeout\");\n        const accountEntries = websocketSessionCache.get(sessionId);\n        if (accountEntries?.get(accountId) === entry)\n            accountEntries.delete(accountId);\n        if (accountEntries?.size === 0)\n            websocketSessionCache.delete(sessionId);\n    }, SESSION_WEBSOCKET_CACHE_TTL_MS);\n}\nasync function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS, env) {\n    const WebSocketCtor = await getWebSocketConstructor(env);\n    if (!WebSocketCtor) {\n        throw new Error(\"WebSocket transport is not available in this runtime\");\n    }\n    const wsHeaders = headersToRecord(headers);\n    delete wsHeaders[\"OpenAI-Beta\"];\n    return new Promise((resolve, reject) => {\n        let settled = false;\n        let timeout;\n        let socket;\n        try {\n            socket = new WebSocketCtor(url, { headers: wsHeaders });\n        }\n        catch (error) {\n            reject(error instanceof Error ? error : new Error(String(error)));\n            return;\n        }\n        const cleanup = () => {\n            if (timeout) {\n                clearTimeout(timeout);\n                timeout = undefined;\n            }\n            socket.removeEventListener(\"open\", onOpen);\n            socket.removeEventListener(\"error\", onError);\n            socket.removeEventListener(\"close\", onClose);\n            signal?.removeEventListener(\"abort\", onAbort);\n        };\n        const fail = (error, closeReason) => {\n            if (settled)\n                return;\n            settled = true;\n            cleanup();\n            if (closeReason) {\n                closeWebSocketSilently(socket, 1000, closeReason);\n            }\n            reject(error);\n        };\n        const onOpen = () => {\n            if (settled)\n                return;\n            settled = true;\n            cleanup();\n            resolve(socket);\n        };\n        const onError = (event) => {\n            fail(extractWebSocketError(event));\n        };\n        const onClose = (event) => {\n            fail(extractWebSocketCloseError(event));\n        };\n        const onAbort = () => {\n            fail(new Error(\"Request was aborted\"), \"aborted\");\n        };\n        socket.addEventListener(\"open\", onOpen);\n        socket.addEventListener(\"error\", onError);\n        socket.addEventListener(\"close\", onClose);\n        signal?.addEventListener(\"abort\", onAbort);\n        if (connectTimeoutMs > 0) {\n            timeout = setTimeout(() => {\n                fail(new Error(`WebSocket connect timeout after ${connectTimeoutMs}ms`), \"connect_timeout\");\n            }, connectTimeoutMs);\n        }\n        if (signal?.aborted) {\n            onAbort();\n        }\n    });\n}\nasync function acquireWebSocket(url, headers, sessionId, accountId, signal, connectTimeoutMs, env) {\n    if (!sessionId) {\n        const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);\n        return {\n            socket,\n            reused: false,\n            release: () => closeWebSocketSilently(socket),\n        };\n    }\n    let accountEntries = websocketSessionCache.get(sessionId);\n    const cached = accountEntries?.get(accountId);\n    if (cached) {\n        if (cached.idleTimer) {\n            clearTimeout(cached.idleTimer);\n            cached.idleTimer = undefined;\n        }\n        if (!cached.busy && isWebSocketSessionExpired(cached)) {\n            closeWebSocketSilently(cached.socket, 1000, \"connection_age_limit\");\n            accountEntries?.delete(accountId);\n            if (accountEntries?.size === 0)\n                websocketSessionCache.delete(sessionId);\n        }\n        else if (!cached.busy && isWebSocketReusable(cached.socket)) {\n            cached.busy = true;\n            return {\n                socket: cached.socket,\n                entry: cached,\n                reused: true,\n                release: ({ keep } = {}) => {\n                    if (!keep || !isWebSocketReusable(cached.socket)) {\n                        closeWebSocketSilently(cached.socket);\n                        const currentEntries = websocketSessionCache.get(sessionId);\n                        if (currentEntries?.get(accountId) === cached)\n                            currentEntries.delete(accountId);\n                        if (currentEntries?.size === 0)\n                            websocketSessionCache.delete(sessionId);\n                        return;\n                    }\n                    cached.busy = false;\n                    scheduleSessionWebSocketExpiry(sessionId, accountId, cached);\n                },\n            };\n        }\n        if (cached.busy) {\n            const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);\n            return {\n                socket,\n                reused: false,\n                release: () => {\n                    closeWebSocketSilently(socket);\n                },\n            };\n        }\n        if (!isWebSocketReusable(cached.socket)) {\n            closeWebSocketSilently(cached.socket);\n            accountEntries?.delete(accountId);\n            if (accountEntries?.size === 0)\n                websocketSessionCache.delete(sessionId);\n        }\n    }\n    const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);\n    const entry = { socket, busy: true, createdAt: Date.now() };\n    accountEntries = websocketSessionCache.get(sessionId);\n    if (!accountEntries) {\n        accountEntries = new Map();\n        websocketSessionCache.set(sessionId, accountEntries);\n    }\n    accountEntries.set(accountId, entry);\n    return {\n        socket,\n        entry,\n        reused: false,\n        release: ({ keep } = {}) => {\n            if (!keep || !isWebSocketReusable(entry.socket)) {\n                closeWebSocketSilently(entry.socket);\n                if (entry.idleTimer)\n                    clearTimeout(entry.idleTimer);\n                const currentEntries = websocketSessionCache.get(sessionId);\n                if (currentEntries?.get(accountId) === entry)\n                    currentEntries.delete(accountId);\n                if (currentEntries?.size === 0)\n                    websocketSessionCache.delete(sessionId);\n                return;\n            }\n            entry.busy = false;\n            scheduleSessionWebSocketExpiry(sessionId, accountId, entry);\n        },\n    };\n}\nfunction extractWebSocketError(event) {\n    if (event && typeof event === \"object\") {\n        const message = \"message\" in event ? event.message : undefined;\n        if (typeof message === \"string\" && message.length > 0) {\n            return new Error(message);\n        }\n        const nestedError = \"error\" in event ? event.error : undefined;\n        if (nestedError instanceof Error && nestedError.message.length > 0) {\n            return nestedError;\n        }\n        if (nestedError && typeof nestedError === \"object\" && \"message\" in nestedError) {\n            const nestedMessage = nestedError.message;\n            if (typeof nestedMessage === \"string\" && nestedMessage.length > 0) {\n                return new Error(nestedMessage);\n            }\n        }\n    }\n    return new Error(\"WebSocket error\");\n}\nfunction extractWebSocketCloseError(event) {\n    if (event && typeof event === \"object\") {\n        const code = \"code\" in event ? event.code : undefined;\n        const reason = \"reason\" in event ? event.reason : undefined;\n        const wasClean = \"wasClean\" in event ? event.wasClean : undefined;\n        const codeText = typeof code === \"number\" ? ` ${code}` : \"\";\n        let reasonText = typeof reason === \"string\" && reason.length > 0 ? ` ${reason}` : \"\";\n        if (!reasonText && code === WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE) {\n            reasonText = \" message too big\";\n        }\n        return new WebSocketCloseError(`WebSocket closed${codeText}${reasonText}`.trim(), {\n            code: typeof code === \"number\" ? code : undefined,\n            reason: typeof reason === \"string\" && reason.length > 0 ? reason : undefined,\n            wasClean: typeof wasClean === \"boolean\" ? wasClean : undefined,\n        });\n    }\n    return new Error(\"WebSocket closed\");\n}\nasync function decodeWebSocketData(data) {\n    if (typeof data === \"string\")\n        return data;\n    if (data instanceof ArrayBuffer) {\n        return new TextDecoder().decode(new Uint8Array(data));\n    }\n    if (ArrayBuffer.isView(data)) {\n        const view = data;\n        return new TextDecoder().decode(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n    }\n    if (data && typeof data === \"object\" && \"arrayBuffer\" in data) {\n        const blobLike = data;\n        const arrayBuffer = await blobLike.arrayBuffer();\n        return new TextDecoder().decode(new Uint8Array(arrayBuffer));\n    }\n    return null;\n}\nasync function* parseWebSocket(socket, signal, idleTimeoutMs) {\n    const queue = [];\n    let pending = null;\n    let done = false;\n    let failed = null;\n    let sawCompletion = false;\n    const wake = () => {\n        if (!pending)\n            return;\n        const resolve = pending;\n        pending = null;\n        resolve();\n    };\n    const onMessage = (event) => {\n        void (async () => {\n            let text = null;\n            try {\n                if (!event || typeof event !== \"object\" || !(\"data\" in event))\n                    return;\n                text = await decodeWebSocketData(event.data);\n                if (!text)\n                    return;\n                const parsed = JSON.parse(text);\n                const type = typeof parsed.type === \"string\" ? parsed.type : \"\";\n                if (type === \"response.completed\" || type === \"response.done\" || type === \"response.incomplete\") {\n                    sawCompletion = true;\n                    done = true;\n                }\n                queue.push(parsed);\n                wake();\n            }\n            catch (cause) {\n                failed = new CodexProtocolError(`Invalid Codex WebSocket JSON: ${formatThrownValue(cause)}`, {\n                    cause,\n                    payload: text,\n                });\n                done = true;\n                wake();\n            }\n        })();\n    };\n    const onError = (event) => {\n        failed = extractWebSocketError(event);\n        done = true;\n        wake();\n    };\n    const onClose = (event) => {\n        if (sawCompletion) {\n            done = true;\n            wake();\n            return;\n        }\n        if (!failed) {\n            failed = extractWebSocketCloseError(event);\n        }\n        done = true;\n        wake();\n    };\n    const onAbort = () => {\n        failed = new Error(\"Request was aborted\");\n        done = true;\n        wake();\n    };\n    socket.addEventListener(\"message\", onMessage);\n    socket.addEventListener(\"error\", onError);\n    socket.addEventListener(\"close\", onClose);\n    signal?.addEventListener(\"abort\", onAbort);\n    try {\n        while (true) {\n            if (signal?.aborted) {\n                throw new Error(\"Request was aborted\");\n            }\n            if (queue.length > 0) {\n                yield queue.shift();\n                continue;\n            }\n            if (done)\n                break;\n            let timeout;\n            await new Promise((resolve, reject) => {\n                pending = resolve;\n                if (idleTimeoutMs !== undefined && idleTimeoutMs > 0) {\n                    timeout = setTimeout(() => {\n                        const error = new Error(`WebSocket idle timeout after ${idleTimeoutMs}ms`);\n                        failed = error;\n                        done = true;\n                        pending = null;\n                        closeWebSocketSilently(socket, 1000, \"idle_timeout\");\n                        reject(error);\n                    }, idleTimeoutMs);\n                }\n            }).finally(() => {\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n            });\n        }\n        if (failed) {\n            throw failed;\n        }\n        if (!sawCompletion) {\n            throw new Error(\"WebSocket stream closed before response.completed\");\n        }\n    }\n    finally {\n        socket.removeEventListener(\"message\", onMessage);\n        socket.removeEventListener(\"error\", onError);\n        socket.removeEventListener(\"close\", onClose);\n        signal?.removeEventListener(\"abort\", onAbort);\n    }\n}\nfunction requestBodyWithoutInput(body) {\n    const { input: _input, previous_response_id: _previousResponseId, ...rest } = body;\n    return rest;\n}\nfunction responseInputsEqual(a, b) {\n    return JSON.stringify(a ?? []) === JSON.stringify(b ?? []);\n}\nfunction requestBodiesMatchExceptInput(a, b) {\n    return JSON.stringify(requestBodyWithoutInput(a)) === JSON.stringify(requestBodyWithoutInput(b));\n}\nfunction getCachedWebSocketInputDelta(body, continuation) {\n    if (!requestBodiesMatchExceptInput(body, continuation.lastRequestBody)) {\n        return undefined;\n    }\n    const currentInput = body.input ?? [];\n    const baseline = [...(continuation.lastRequestBody.input ?? []), ...continuation.lastResponseItems];\n    if (currentInput.length < baseline.length) {\n        return undefined;\n    }\n    const prefix = currentInput.slice(0, baseline.length);\n    if (!responseInputsEqual(prefix, baseline)) {\n        return undefined;\n    }\n    return currentInput.slice(baseline.length);\n}\nfunction buildCachedWebSocketRequestBody(entry, body) {\n    const continuation = entry.continuation;\n    if (!continuation) {\n        return body;\n    }\n    const delta = getCachedWebSocketInputDelta(body, continuation);\n    if (!delta || !continuation.lastResponseId) {\n        entry.continuation = undefined;\n        return body;\n    }\n    return {\n        ...body,\n        previous_response_id: continuation.lastResponseId,\n        input: delta,\n    };\n}\nasync function* startWebSocketOutputOnFirstEvent(events, onStart) {\n    let started = false;\n    for await (const event of events) {\n        if (!started) {\n            started = true;\n            onStart();\n        }\n        yield event;\n    }\n}\nasync function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options) {\n    const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, accountId, options?.signal, websocketConnectTimeoutMs, options?.env);\n    let keepConnection = true;\n    const useCachedContext = options?.transport === \"websocket-cached\" || options?.transport === \"auto\";\n    // ChatGPT Codex Responses rejects `store: true` (\"Store must be set to false\").\n    // WebSocket continuation still works via connection-scoped previous_response_id state.\n    const fullBody = body;\n    const requestBody = useCachedContext && entry ? buildCachedWebSocketRequestBody(entry, fullBody) : fullBody;\n    const stats = cacheSessionId ? getOrCreateWebSocketDebugStats(cacheSessionId) : undefined;\n    if (stats) {\n        stats.requests++;\n        if (reused)\n            stats.connectionsReused++;\n        else\n            stats.connectionsCreated++;\n        if (useCachedContext)\n            stats.cachedContextRequests++;\n        if (requestBody.store === true)\n            stats.storeTrueRequests++;\n        stats.lastInputItems = requestBody.input?.length ?? 0;\n        if (requestBody.previous_response_id) {\n            stats.deltaRequests++;\n            stats.lastDeltaInputItems = requestBody.input?.length ?? 0;\n            stats.lastPreviousResponseId = requestBody.previous_response_id;\n        }\n        else {\n            stats.fullContextRequests++;\n            stats.lastDeltaInputItems = undefined;\n            stats.lastPreviousResponseId = undefined;\n        }\n    }\n    try {\n        socket.send(JSON.stringify({ type: \"response.create\", ...requestBody }));\n        await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket, options?.signal, idleTimeoutMs)), onStart), output, stream, model, {\n            serviceTier: options?.serviceTier,\n            grammarToolInputProperties,\n            resolveServiceTier: resolveCodexServiceTier,\n            applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),\n        });\n        if (options?.signal?.aborted) {\n            keepConnection = false;\n        }\n        else if (useCachedContext && entry && output.responseId) {\n            const responseItems = convertResponsesMessages(model, { messages: [output] }, CODEX_TOOL_CALL_PROVIDERS, {\n                includeSystemPrompt: false,\n                grammarToolInputProperties,\n            }).filter((item) => item.type !== \"function_call_output\" && item.type !== \"custom_tool_call_output\");\n            entry.continuation = {\n                lastRequestBody: fullBody,\n                lastResponseId: output.responseId,\n                lastResponseItems: responseItems,\n            };\n        }\n    }\n    catch (error) {\n        if (entry) {\n            entry.continuation = undefined;\n        }\n        keepConnection = false;\n        throw error;\n    }\n    finally {\n        release({ keep: keepConnection });\n    }\n}\n// ============================================================================\n// Error Handling\n// ============================================================================\nasync function parseErrorResponse(response) {\n    const raw = await response.text();\n    let message = raw || response.statusText || \"Request failed\";\n    let friendlyMessage;\n    try {\n        const parsed = JSON.parse(raw);\n        const err = parsed?.error;\n        if (err) {\n            const code = err.code || err.type || \"\";\n            if (/usage_limit_reached|usage_not_included|rate_limit_exceeded/i.test(code) || response.status === 429) {\n                const plan = err.plan_type ? ` (${err.plan_type.toLowerCase()} plan)` : \"\";\n                const mins = err.resets_at\n                    ? Math.max(0, Math.round((err.resets_at * 1000 - Date.now()) / 60000))\n                    : undefined;\n                const when = mins !== undefined ? ` Try again in ~${mins} min.` : \"\";\n                friendlyMessage = `You have hit your ChatGPT usage limit${plan}.${when}`.trim();\n            }\n            message = err.message || friendlyMessage || message;\n        }\n    }\n    catch { }\n    return { message, friendlyMessage };\n}\n// ============================================================================\n// Auth & Headers\n// ============================================================================\nfunction extractAccountId(token) {\n    try {\n        const parts = token.split(\".\");\n        if (parts.length !== 3)\n            throw new Error(\"Invalid token\");\n        const payload = JSON.parse(atob(parts[1]));\n        const accountId = payload?.[JWT_CLAIM_PATH]?.chatgpt_account_id;\n        if (!accountId)\n            throw new Error(\"No account ID in token\");\n        return accountId;\n    }\n    catch {\n        throw new Error(\"Failed to extract accountId from token\");\n    }\n}\nfunction buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token) {\n    const headers = new Headers(initHeaders);\n    for (const [key, value] of Object.entries(additionalHeaders || {})) {\n        if (value === null) {\n            headers.delete(key);\n        }\n        else {\n            headers.set(key, value);\n        }\n    }\n    headers.set(\"Authorization\", `Bearer ${token}`);\n    headers.set(\"chatgpt-account-id\", accountId);\n    headers.set(\"originator\", \"pi\");\n    const userAgent = _os ? `pi (${_os.platform()} ${_os.release()}; ${_os.arch()})` : \"pi (browser)\";\n    headers.set(\"User-Agent\", userAgent);\n    return headers;\n}\nfunction buildSSEHeaders(initHeaders, additionalHeaders, accountId, token, sessionId) {\n    const headers = buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token);\n    headers.set(\"OpenAI-Beta\", \"responses=experimental\");\n    headers.set(\"accept\", \"text/event-stream\");\n    headers.set(\"content-type\", \"application/json\");\n    if (sessionId) {\n        headers.set(\"session-id\", sessionId);\n        headers.set(\"x-client-request-id\", sessionId);\n    }\n    return headers;\n}\nfunction buildWebSocketHeaders(initHeaders, additionalHeaders, accountId, token, requestId) {\n    const headers = buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token);\n    headers.delete(\"accept\");\n    headers.delete(\"content-type\");\n    headers.delete(\"OpenAI-Beta\");\n    headers.delete(\"openai-beta\");\n    headers.set(\"OpenAI-Beta\", OPENAI_BETA_RESPONSES_WEBSOCKETS);\n    headers.set(\"x-client-request-id\", requestId);\n    headers.set(\"session-id\", requestId);\n    return headers;\n}\n//# sourceMappingURL=openai-codex-responses.js.map"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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"}