pi2dsh 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +31 -11
  2. package/README.zh.md +31 -11
  3. package/dist/all-Rt4K68QA.mjs +28512 -0
  4. package/dist/all-Rt4K68QA.mjs.map +1 -0
  5. package/dist/anthropic-messages-Beym0_aC.mjs +6438 -0
  6. package/dist/anthropic-messages-Beym0_aC.mjs.map +1 -0
  7. package/dist/azure-openai-responses-cHqZTgLD.mjs +209 -0
  8. package/dist/azure-openai-responses-cHqZTgLD.mjs.map +1 -0
  9. package/dist/{build-DsGYAgiT.mjs → build-BG7p2Lbr.mjs} +2 -2
  10. package/dist/{build-DsGYAgiT.mjs.map → build-BG7p2Lbr.mjs.map} +1 -1
  11. package/dist/cli.mjs +1 -1
  12. package/dist/compat/pi-ai.d.mts +25 -3
  13. package/dist/compat/pi-ai.d.mts.map +1 -1
  14. package/dist/compat/pi-ai.mjs +3 -2919
  15. package/dist/compat/pi-coding-agent.d.mts +12 -1
  16. package/dist/compat/pi-coding-agent.d.mts.map +1 -1
  17. package/dist/compat/pi-coding-agent.mjs +2 -2
  18. package/dist/credentials-oauth.d.mts +27 -0
  19. package/dist/credentials-oauth.d.mts.map +1 -0
  20. package/dist/credentials-oauth.mjs +91 -0
  21. package/dist/credentials-oauth.mjs.map +1 -0
  22. package/dist/deferred-tools-BD4g5QUx.mjs +32 -0
  23. package/dist/deferred-tools-BD4g5QUx.mjs.map +1 -0
  24. package/dist/diagnostics-CJye1UFh.mjs +99 -0
  25. package/dist/diagnostics-CJye1UFh.mjs.map +1 -0
  26. package/dist/dist-IQKOgQyt.mjs +10035 -0
  27. package/dist/dist-IQKOgQyt.mjs.map +1 -0
  28. package/dist/dist-QBBA-dL_.mjs +1246 -0
  29. package/dist/dist-QBBA-dL_.mjs.map +1 -0
  30. package/dist/error-body-DKA3lknR.mjs +104 -0
  31. package/dist/error-body-DKA3lknR.mjs.map +1 -0
  32. package/dist/github-copilot-headers-CZo2QHrt.mjs +25 -0
  33. package/dist/github-copilot-headers-CZo2QHrt.mjs.map +1 -0
  34. package/dist/google-generative-ai-B7OZs5lu.mjs +358 -0
  35. package/dist/google-generative-ai-B7OZs5lu.mjs.map +1 -0
  36. package/dist/google-shared-CRsAUItF.mjs +29042 -0
  37. package/dist/google-shared-CRsAUItF.mjs.map +1 -0
  38. package/dist/google-vertex-DmdaHQtB.mjs +402 -0
  39. package/dist/google-vertex-DmdaHQtB.mjs.map +1 -0
  40. package/dist/hash-Dbggamac.mjs +19 -0
  41. package/dist/hash-Dbggamac.mjs.map +1 -0
  42. package/dist/headers-CPzZhJQn.mjs +17 -0
  43. package/dist/headers-CPzZhJQn.mjs.map +1 -0
  44. package/dist/host.d.mts.map +1 -1
  45. package/dist/host.mjs +15 -3
  46. package/dist/host.mjs.map +1 -1
  47. package/dist/images-models-DJtHo9Rp.mjs +1068 -0
  48. package/dist/images-models-DJtHo9Rp.mjs.map +1 -0
  49. package/dist/index.d.mts.map +1 -1
  50. package/dist/index.mjs +1 -1
  51. package/dist/json-parse-CFyFZSLJ.mjs +384 -0
  52. package/dist/json-parse-CFyFZSLJ.mjs.map +1 -0
  53. package/dist/{mcp-config-gqg7GJEE.mjs → mcp-config-D2B3kv-Z.mjs} +34 -16
  54. package/dist/mcp-config-D2B3kv-Z.mjs.map +1 -0
  55. package/dist/mistral-conversations-HHZCcFv_.mjs +42007 -0
  56. package/dist/mistral-conversations-HHZCcFv_.mjs.map +1 -0
  57. package/dist/multipart-parser-CIa5BbwO.mjs +301 -0
  58. package/dist/multipart-parser-CIa5BbwO.mjs.map +1 -0
  59. package/dist/oauth-bridge-C6fL1qSv.mjs +375 -0
  60. package/dist/oauth-bridge-C6fL1qSv.mjs.map +1 -0
  61. package/dist/openai-DkzRh5_G.mjs +6732 -0
  62. package/dist/openai-DkzRh5_G.mjs.map +1 -0
  63. package/dist/openai-codex-responses-vmovNu-q.mjs +1169 -0
  64. package/dist/openai-codex-responses-vmovNu-q.mjs.map +1 -0
  65. package/dist/openai-completions-fXHhRolF.mjs +947 -0
  66. package/dist/openai-completions-fXHhRolF.mjs.map +1 -0
  67. package/dist/openai-prompt-cache-BDWtZRKh.mjs +11 -0
  68. package/dist/openai-prompt-cache-BDWtZRKh.mjs.map +1 -0
  69. package/dist/openai-responses-DKdCYf3h.mjs +247 -0
  70. package/dist/openai-responses-DKdCYf3h.mjs.map +1 -0
  71. package/dist/openai-responses-shared-D0Jq7yVP.mjs +572 -0
  72. package/dist/openai-responses-shared-D0Jq7yVP.mjs.map +1 -0
  73. package/dist/openrouter-images-fG3Aj6M4.mjs +127 -0
  74. package/dist/openrouter-images-fG3Aj6M4.mjs.map +1 -0
  75. package/dist/otel-BQSQRBLF.mjs +24935 -0
  76. package/dist/otel-BQSQRBLF.mjs.map +1 -0
  77. package/dist/pi-ai-DhYGgq4Y.mjs +2984 -0
  78. package/dist/pi-ai-DhYGgq4Y.mjs.map +1 -0
  79. package/dist/{pi-coding-agent-Z1hTs61i.mjs → pi-coding-agent-fPHwKP4d.mjs} +27 -3
  80. package/dist/{pi-coding-agent-Z1hTs61i.mjs.map → pi-coding-agent-fPHwKP4d.mjs.map} +1 -1
  81. package/dist/pi-messages-CV-Ts8An.mjs +306 -0
  82. package/dist/pi-messages-CV-Ts8An.mjs.map +1 -0
  83. package/dist/provider-env-C72pF4vP.mjs +40 -0
  84. package/dist/provider-env-C72pF4vP.mjs.map +1 -0
  85. package/dist/provider-retry-Cw6YJ4cr.mjs +80 -0
  86. package/dist/provider-retry-Cw6YJ4cr.mjs.map +1 -0
  87. package/dist/rolldown-runtime-CTfmNlz1.mjs +44 -0
  88. package/dist/{runtime-oLd2EInK.mjs → runtime-B9R7bDWT.mjs} +838 -345
  89. package/dist/runtime-B9R7bDWT.mjs.map +1 -0
  90. package/dist/runtime.d.mts.map +1 -1
  91. package/dist/runtime.mjs +1 -1
  92. package/dist/sanitize-unicode-wLA11KvZ.mjs +29 -0
  93. package/dist/sanitize-unicode-wLA11KvZ.mjs.map +1 -0
  94. package/dist/src-C3WBfOks.mjs +5031 -0
  95. package/dist/src-C3WBfOks.mjs.map +1 -0
  96. package/dist/transform-messages-DGq9mvhA.mjs +379 -0
  97. package/dist/transform-messages-DGq9mvhA.mjs.map +1 -0
  98. package/dist/uuid-DtFT7tOE.mjs +65 -0
  99. package/dist/uuid-DtFT7tOE.mjs.map +1 -0
  100. package/package.json +11 -1
  101. package/dist/compat/pi-ai.mjs.map +0 -1
  102. package/dist/mcp-config-gqg7GJEE.mjs.map +0 -1
  103. package/dist/rolldown-runtime-D-uZhY3_.mjs +0 -16
  104. package/dist/runtime-oLd2EInK.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-codex-responses-vmovNu-q.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/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/api/openai-codex-responses.js"],"sourcesContent":["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","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],"mappings":"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"}