@code-yeongyu/senpi-ai 2026.7.25-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 (969) hide show
  1. package/README.md +1663 -0
  2. package/dist/api/anthropic-messages.d.ts +71 -0
  3. package/dist/api/anthropic-messages.d.ts.map +1 -0
  4. package/dist/api/anthropic-messages.js +1626 -0
  5. package/dist/api/anthropic-messages.js.map +1 -0
  6. package/dist/api/anthropic-messages.lazy.d.ts +3 -0
  7. package/dist/api/anthropic-messages.lazy.d.ts.map +1 -0
  8. package/dist/api/anthropic-messages.lazy.js +3 -0
  9. package/dist/api/anthropic-messages.lazy.js.map +1 -0
  10. package/dist/api/azure-openai-responses.d.ts +15 -0
  11. package/dist/api/azure-openai-responses.d.ts.map +1 -0
  12. package/dist/api/azure-openai-responses.js +242 -0
  13. package/dist/api/azure-openai-responses.js.map +1 -0
  14. package/dist/api/azure-openai-responses.lazy.d.ts +3 -0
  15. package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -0
  16. package/dist/api/azure-openai-responses.lazy.js +3 -0
  17. package/dist/api/azure-openai-responses.lazy.js.map +1 -0
  18. package/dist/api/bedrock-converse-stream.d.ts +38 -0
  19. package/dist/api/bedrock-converse-stream.d.ts.map +1 -0
  20. package/dist/api/bedrock-converse-stream.js +939 -0
  21. package/dist/api/bedrock-converse-stream.js.map +1 -0
  22. package/dist/api/bedrock-converse-stream.lazy.d.ts +9 -0
  23. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -0
  24. package/dist/api/bedrock-converse-stream.lazy.js +30 -0
  25. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -0
  26. package/dist/api/cloudflare.d.ts +12 -0
  27. package/dist/api/cloudflare.d.ts.map +1 -0
  28. package/dist/api/cloudflare.js +22 -0
  29. package/dist/api/cloudflare.js.map +1 -0
  30. package/dist/api/constrained-sampling.d.ts +17 -0
  31. package/dist/api/constrained-sampling.d.ts.map +1 -0
  32. package/dist/api/constrained-sampling.js +104 -0
  33. package/dist/api/constrained-sampling.js.map +1 -0
  34. package/dist/api/github-copilot-headers.d.ts +8 -0
  35. package/dist/api/github-copilot-headers.d.ts.map +1 -0
  36. package/dist/api/github-copilot-headers.js +29 -0
  37. package/dist/api/github-copilot-headers.js.map +1 -0
  38. package/dist/api/google-generative-ai.d.ts +13 -0
  39. package/dist/api/google-generative-ai.d.ts.map +1 -0
  40. package/dist/api/google-generative-ai.js +440 -0
  41. package/dist/api/google-generative-ai.js.map +1 -0
  42. package/dist/api/google-generative-ai.lazy.d.ts +3 -0
  43. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  44. package/dist/api/google-generative-ai.lazy.js +3 -0
  45. package/dist/api/google-generative-ai.lazy.js.map +1 -0
  46. package/dist/api/google-shared.d.ts +70 -0
  47. package/dist/api/google-shared.d.ts.map +1 -0
  48. package/dist/api/google-shared.js +360 -0
  49. package/dist/api/google-shared.js.map +1 -0
  50. package/dist/api/google-vertex.d.ts +15 -0
  51. package/dist/api/google-vertex.d.ts.map +1 -0
  52. package/dist/api/google-vertex.js +485 -0
  53. package/dist/api/google-vertex.js.map +1 -0
  54. package/dist/api/google-vertex.lazy.d.ts +3 -0
  55. package/dist/api/google-vertex.lazy.d.ts.map +1 -0
  56. package/dist/api/google-vertex.lazy.js +3 -0
  57. package/dist/api/google-vertex.lazy.js.map +1 -0
  58. package/dist/api/lazy.d.ts +15 -0
  59. package/dist/api/lazy.d.ts.map +1 -0
  60. package/dist/api/lazy.js +85 -0
  61. package/dist/api/lazy.js.map +1 -0
  62. package/dist/api/mistral-conversations.d.ts +25 -0
  63. package/dist/api/mistral-conversations.d.ts.map +1 -0
  64. package/dist/api/mistral-conversations.js +566 -0
  65. package/dist/api/mistral-conversations.js.map +1 -0
  66. package/dist/api/mistral-conversations.lazy.d.ts +3 -0
  67. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  68. package/dist/api/mistral-conversations.lazy.js +3 -0
  69. package/dist/api/mistral-conversations.lazy.js.map +1 -0
  70. package/dist/api/openai-codex-responses.d.ts +31 -0
  71. package/dist/api/openai-codex-responses.d.ts.map +1 -0
  72. package/dist/api/openai-codex-responses.js +1326 -0
  73. package/dist/api/openai-codex-responses.js.map +1 -0
  74. package/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  75. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  76. package/dist/api/openai-codex-responses.lazy.js +3 -0
  77. package/dist/api/openai-codex-responses.lazy.js.map +1 -0
  78. package/dist/api/openai-completions.d.ts +22 -0
  79. package/dist/api/openai-completions.d.ts.map +1 -0
  80. package/dist/api/openai-completions.js +1384 -0
  81. package/dist/api/openai-completions.js.map +1 -0
  82. package/dist/api/openai-completions.lazy.d.ts +3 -0
  83. package/dist/api/openai-completions.lazy.d.ts.map +1 -0
  84. package/dist/api/openai-completions.lazy.js +3 -0
  85. package/dist/api/openai-completions.lazy.js.map +1 -0
  86. package/dist/api/openai-prompt-cache.d.ts +3 -0
  87. package/dist/api/openai-prompt-cache.d.ts.map +1 -0
  88. package/dist/api/openai-prompt-cache.js +10 -0
  89. package/dist/api/openai-prompt-cache.js.map +1 -0
  90. package/dist/api/openai-responses-shared.d.ts +29 -0
  91. package/dist/api/openai-responses-shared.d.ts.map +1 -0
  92. package/dist/api/openai-responses-shared.js +730 -0
  93. package/dist/api/openai-responses-shared.js.map +1 -0
  94. package/dist/api/openai-responses.d.ts +14 -0
  95. package/dist/api/openai-responses.d.ts.map +1 -0
  96. package/dist/api/openai-responses.js +696 -0
  97. package/dist/api/openai-responses.js.map +1 -0
  98. package/dist/api/openai-responses.lazy.d.ts +3 -0
  99. package/dist/api/openai-responses.lazy.d.ts.map +1 -0
  100. package/dist/api/openai-responses.lazy.js +3 -0
  101. package/dist/api/openai-responses.lazy.js.map +1 -0
  102. package/dist/api/openrouter-images.d.ts +3 -0
  103. package/dist/api/openrouter-images.d.ts.map +1 -0
  104. package/dist/api/openrouter-images.js +131 -0
  105. package/dist/api/openrouter-images.js.map +1 -0
  106. package/dist/api/openrouter-images.lazy.d.ts +3 -0
  107. package/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  108. package/dist/api/openrouter-images.lazy.js +4 -0
  109. package/dist/api/openrouter-images.lazy.js.map +1 -0
  110. package/dist/api/pi-messages.d.ts +97 -0
  111. package/dist/api/pi-messages.d.ts.map +1 -0
  112. package/dist/api/pi-messages.js +305 -0
  113. package/dist/api/pi-messages.js.map +1 -0
  114. package/dist/api/pi-messages.lazy.d.ts +3 -0
  115. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  116. package/dist/api/pi-messages.lazy.js +3 -0
  117. package/dist/api/pi-messages.lazy.js.map +1 -0
  118. package/dist/api/simple-options.d.ts +33 -0
  119. package/dist/api/simple-options.d.ts.map +1 -0
  120. package/dist/api/simple-options.js +177 -0
  121. package/dist/api/simple-options.js.map +1 -0
  122. package/dist/api/transform-messages.d.ts +23 -0
  123. package/dist/api/transform-messages.d.ts.map +1 -0
  124. package/dist/api/transform-messages.js +255 -0
  125. package/dist/api/transform-messages.js.map +1 -0
  126. package/dist/api-registry.d.ts +34 -0
  127. package/dist/api-registry.d.ts.map +1 -0
  128. package/dist/api-registry.js +96 -0
  129. package/dist/api-registry.js.map +1 -0
  130. package/dist/auth/context.d.ts +7 -0
  131. package/dist/auth/context.d.ts.map +1 -0
  132. package/dist/auth/context.js +42 -0
  133. package/dist/auth/context.js.map +1 -0
  134. package/dist/auth/credential-store.d.ts +17 -0
  135. package/dist/auth/credential-store.d.ts.map +1 -0
  136. package/dist/auth/credential-store.js +42 -0
  137. package/dist/auth/credential-store.js.map +1 -0
  138. package/dist/auth/helpers.d.ts +21 -0
  139. package/dist/auth/helpers.d.ts.map +1 -0
  140. package/dist/auth/helpers.js +48 -0
  141. package/dist/auth/helpers.js.map +1 -0
  142. package/dist/auth/oauth/anthropic.d.ts +9 -0
  143. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  144. package/dist/auth/oauth/anthropic.js +302 -0
  145. package/dist/auth/oauth/anthropic.js.map +1 -0
  146. package/dist/auth/oauth/device-code.d.ts +23 -0
  147. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  148. package/dist/auth/oauth/device-code.js +69 -0
  149. package/dist/auth/oauth/device-code.js.map +1 -0
  150. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  151. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  152. package/dist/auth/oauth/github-copilot.js +312 -0
  153. package/dist/auth/oauth/github-copilot.js.map +1 -0
  154. package/dist/auth/oauth/kimi-coding.d.ts +10 -0
  155. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  156. package/dist/auth/oauth/kimi-coding.js +249 -0
  157. package/dist/auth/oauth/kimi-coding.js.map +1 -0
  158. package/dist/auth/oauth/load.d.ts +27 -0
  159. package/dist/auth/oauth/load.d.ts.map +1 -0
  160. package/dist/auth/oauth/load.js +59 -0
  161. package/dist/auth/oauth/load.js.map +1 -0
  162. package/dist/auth/oauth/oauth-page.d.ts +3 -0
  163. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  164. package/dist/auth/oauth/oauth-page.js +105 -0
  165. package/dist/auth/oauth/oauth-page.js.map +1 -0
  166. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  167. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  168. package/dist/auth/oauth/openai-codex.js +427 -0
  169. package/dist/auth/oauth/openai-codex.js.map +1 -0
  170. package/dist/auth/oauth/openrouter.d.ts +13 -0
  171. package/dist/auth/oauth/openrouter.d.ts.map +1 -0
  172. package/dist/auth/oauth/openrouter.js +222 -0
  173. package/dist/auth/oauth/openrouter.js.map +1 -0
  174. package/dist/auth/oauth/pkce.d.ts +13 -0
  175. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  176. package/dist/auth/oauth/pkce.js +31 -0
  177. package/dist/auth/oauth/pkce.js.map +1 -0
  178. package/dist/auth/oauth/radius.d.ts +17 -0
  179. package/dist/auth/oauth/radius.d.ts.map +1 -0
  180. package/dist/auth/oauth/radius.js +318 -0
  181. package/dist/auth/oauth/radius.js.map +1 -0
  182. package/dist/auth/oauth/xai.d.ts +6 -0
  183. package/dist/auth/oauth/xai.d.ts.map +1 -0
  184. package/dist/auth/oauth/xai.js +189 -0
  185. package/dist/auth/oauth/xai.js.map +1 -0
  186. package/dist/auth/resolve.d.ts +24 -0
  187. package/dist/auth/resolve.d.ts.map +1 -0
  188. package/dist/auth/resolve.js +112 -0
  189. package/dist/auth/resolve.js.map +1 -0
  190. package/dist/auth/types.d.ts +219 -0
  191. package/dist/auth/types.d.ts.map +1 -0
  192. package/dist/auth/types.js +2 -0
  193. package/dist/auth/types.js.map +1 -0
  194. package/dist/bedrock-provider.d.ts +5 -0
  195. package/dist/bedrock-provider.d.ts.map +1 -0
  196. package/dist/bedrock-provider.js +6 -0
  197. package/dist/bedrock-provider.js.map +1 -0
  198. package/dist/bun-oauth.d.ts +3 -0
  199. package/dist/bun-oauth.d.ts.map +1 -0
  200. package/dist/bun-oauth.js +21 -0
  201. package/dist/bun-oauth.js.map +1 -0
  202. package/dist/cli.d.ts +3 -0
  203. package/dist/cli.d.ts.map +1 -0
  204. package/dist/cli.js +112 -0
  205. package/dist/cli.js.map +1 -0
  206. package/dist/compat/extension-oauth-types.d.ts +42 -0
  207. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  208. package/dist/compat/extension-oauth-types.js +2 -0
  209. package/dist/compat/extension-oauth-types.js.map +1 -0
  210. package/dist/compat.d.ts +53 -0
  211. package/dist/compat.d.ts.map +1 -0
  212. package/dist/compat.js +176 -0
  213. package/dist/compat.js.map +1 -0
  214. package/dist/context-provenance.d.ts +16 -0
  215. package/dist/context-provenance.d.ts.map +1 -0
  216. package/dist/context-provenance.js +32 -0
  217. package/dist/context-provenance.js.map +1 -0
  218. package/dist/env-api-keys.d.ts +21 -0
  219. package/dist/env-api-keys.d.ts.map +1 -0
  220. package/dist/env-api-keys.js +155 -0
  221. package/dist/env-api-keys.js.map +1 -0
  222. package/dist/image-models.d.ts +10 -0
  223. package/dist/image-models.d.ts.map +1 -0
  224. package/dist/image-models.generated.d.ts +605 -0
  225. package/dist/image-models.generated.d.ts.map +1 -0
  226. package/dist/image-models.generated.js +607 -0
  227. package/dist/image-models.generated.js.map +1 -0
  228. package/dist/image-models.js +23 -0
  229. package/dist/image-models.js.map +1 -0
  230. package/dist/images-api-registry.d.ts +31 -0
  231. package/dist/images-api-registry.d.ts.map +1 -0
  232. package/dist/images-api-registry.js +87 -0
  233. package/dist/images-api-registry.js.map +1 -0
  234. package/dist/images-models.d.ts +95 -0
  235. package/dist/images-models.d.ts.map +1 -0
  236. package/dist/images-models.js +140 -0
  237. package/dist/images-models.js.map +1 -0
  238. package/dist/images.d.ts +4 -0
  239. package/dist/images.d.ts.map +1 -0
  240. package/dist/images.js +14 -0
  241. package/dist/images.js.map +1 -0
  242. package/dist/index.d.ts +45 -0
  243. package/dist/index.d.ts.map +1 -0
  244. package/dist/index.js +32 -0
  245. package/dist/index.js.map +1 -0
  246. package/dist/legacy-api-aliases.d.ts +42 -0
  247. package/dist/legacy-api-aliases.d.ts.map +1 -0
  248. package/dist/legacy-api-aliases.js +49 -0
  249. package/dist/legacy-api-aliases.js.map +1 -0
  250. package/dist/model-catalog.d.ts +17 -0
  251. package/dist/model-catalog.d.ts.map +1 -0
  252. package/dist/model-catalog.js +4 -0
  253. package/dist/model-catalog.js.map +1 -0
  254. package/dist/model.d.ts +27 -0
  255. package/dist/model.d.ts.map +1 -0
  256. package/dist/model.js +2 -0
  257. package/dist/model.js.map +1 -0
  258. package/dist/models-store.d.ts +32 -0
  259. package/dist/models-store.d.ts.map +1 -0
  260. package/dist/models-store.js +16 -0
  261. package/dist/models-store.js.map +1 -0
  262. package/dist/models.d.ts +179 -0
  263. package/dist/models.d.ts.map +1 -0
  264. package/dist/models.generated.d.ts +79 -0
  265. package/dist/models.generated.d.ts.map +1 -0
  266. package/dist/models.generated.js +81 -0
  267. package/dist/models.generated.js.map +1 -0
  268. package/dist/models.js +449 -0
  269. package/dist/models.js.map +1 -0
  270. package/dist/node/provider-scope.d.ts +12 -0
  271. package/dist/node/provider-scope.d.ts.map +1 -0
  272. package/dist/node/provider-scope.js +34 -0
  273. package/dist/node/provider-scope.js.map +1 -0
  274. package/dist/oauth.d.ts +3 -0
  275. package/dist/oauth.d.ts.map +1 -0
  276. package/dist/oauth.js +2 -0
  277. package/dist/oauth.js.map +1 -0
  278. package/dist/providers/alibaba-token-plan.d.ts +3 -0
  279. package/dist/providers/alibaba-token-plan.d.ts.map +1 -0
  280. package/dist/providers/alibaba-token-plan.js +15 -0
  281. package/dist/providers/alibaba-token-plan.js.map +1 -0
  282. package/dist/providers/alibaba-token-plan.models.d.ts +4 -0
  283. package/dist/providers/alibaba-token-plan.models.d.ts.map +1 -0
  284. package/dist/providers/alibaba-token-plan.models.js +6 -0
  285. package/dist/providers/alibaba-token-plan.models.js.map +1 -0
  286. package/dist/providers/all.d.ts +28 -0
  287. package/dist/providers/all.d.ts.map +1 -0
  288. package/dist/providers/all.js +162 -0
  289. package/dist/providers/all.js.map +1 -0
  290. package/dist/providers/amazon-bedrock.d.ts +3 -0
  291. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  292. package/dist/providers/amazon-bedrock.js +85 -0
  293. package/dist/providers/amazon-bedrock.js.map +1 -0
  294. package/dist/providers/amazon-bedrock.models.d.ts +4 -0
  295. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  296. package/dist/providers/amazon-bedrock.models.js +6 -0
  297. package/dist/providers/amazon-bedrock.models.js.map +1 -0
  298. package/dist/providers/ant-ling.d.ts +3 -0
  299. package/dist/providers/ant-ling.d.ts.map +1 -0
  300. package/dist/providers/ant-ling.js +15 -0
  301. package/dist/providers/ant-ling.js.map +1 -0
  302. package/dist/providers/ant-ling.models.d.ts +4 -0
  303. package/dist/providers/ant-ling.models.d.ts.map +1 -0
  304. package/dist/providers/ant-ling.models.js +6 -0
  305. package/dist/providers/ant-ling.models.js.map +1 -0
  306. package/dist/providers/anthropic.d.ts +7 -0
  307. package/dist/providers/anthropic.d.ts.map +1 -0
  308. package/dist/providers/anthropic.js +50 -0
  309. package/dist/providers/anthropic.js.map +1 -0
  310. package/dist/providers/anthropic.models.d.ts +4 -0
  311. package/dist/providers/anthropic.models.d.ts.map +1 -0
  312. package/dist/providers/anthropic.models.js +6 -0
  313. package/dist/providers/anthropic.models.js.map +1 -0
  314. package/dist/providers/azure-openai-responses.d.ts +3 -0
  315. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  316. package/dist/providers/azure-openai-responses.js +14 -0
  317. package/dist/providers/azure-openai-responses.js.map +1 -0
  318. package/dist/providers/azure-openai-responses.models.d.ts +4 -0
  319. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  320. package/dist/providers/azure-openai-responses.models.js +6 -0
  321. package/dist/providers/azure-openai-responses.models.js.map +1 -0
  322. package/dist/providers/cerebras.d.ts +3 -0
  323. package/dist/providers/cerebras.d.ts.map +1 -0
  324. package/dist/providers/cerebras.js +15 -0
  325. package/dist/providers/cerebras.js.map +1 -0
  326. package/dist/providers/cerebras.models.d.ts +4 -0
  327. package/dist/providers/cerebras.models.d.ts.map +1 -0
  328. package/dist/providers/cerebras.models.js +6 -0
  329. package/dist/providers/cerebras.models.js.map +1 -0
  330. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  331. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  332. package/dist/providers/cloudflare-ai-gateway.js +21 -0
  333. package/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  334. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -0
  335. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  336. package/dist/providers/cloudflare-ai-gateway.models.js +6 -0
  337. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  338. package/dist/providers/cloudflare-auth.d.ts +4 -0
  339. package/dist/providers/cloudflare-auth.d.ts.map +1 -0
  340. package/dist/providers/cloudflare-auth.js +81 -0
  341. package/dist/providers/cloudflare-auth.js.map +1 -0
  342. package/dist/providers/cloudflare-stream.d.ts +8 -0
  343. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  344. package/dist/providers/cloudflare-stream.js +21 -0
  345. package/dist/providers/cloudflare-stream.js.map +1 -0
  346. package/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  347. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  348. package/dist/providers/cloudflare-workers-ai.js +15 -0
  349. package/dist/providers/cloudflare-workers-ai.js.map +1 -0
  350. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -0
  351. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  352. package/dist/providers/cloudflare-workers-ai.models.js +6 -0
  353. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  354. package/dist/providers/data/.manifest.json +1 -0
  355. package/dist/providers/data/alibaba-token-plan.json +1 -0
  356. package/dist/providers/data/amazon-bedrock.json +1 -0
  357. package/dist/providers/data/ant-ling.json +1 -0
  358. package/dist/providers/data/anthropic.json +1 -0
  359. package/dist/providers/data/azure-openai-responses.json +1 -0
  360. package/dist/providers/data/cerebras.json +1 -0
  361. package/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  362. package/dist/providers/data/cloudflare-workers-ai.json +1 -0
  363. package/dist/providers/data/deepseek.json +1 -0
  364. package/dist/providers/data/fireworks.json +1 -0
  365. package/dist/providers/data/github-copilot.json +1 -0
  366. package/dist/providers/data/google-vertex.json +1 -0
  367. package/dist/providers/data/google.json +1 -0
  368. package/dist/providers/data/groq.json +1 -0
  369. package/dist/providers/data/huggingface.json +1 -0
  370. package/dist/providers/data/kimi-coding.json +1 -0
  371. package/dist/providers/data/minimax-cn.json +1 -0
  372. package/dist/providers/data/minimax.json +1 -0
  373. package/dist/providers/data/mistral.json +1 -0
  374. package/dist/providers/data/moonshotai-cn.json +1 -0
  375. package/dist/providers/data/moonshotai.json +1 -0
  376. package/dist/providers/data/nvidia.json +1 -0
  377. package/dist/providers/data/openai-codex.json +1 -0
  378. package/dist/providers/data/openai.json +1 -0
  379. package/dist/providers/data/opencode-go.json +1 -0
  380. package/dist/providers/data/opencode.json +1 -0
  381. package/dist/providers/data/openrouter.json +1 -0
  382. package/dist/providers/data/qwen-token-plan-cn.json +1 -0
  383. package/dist/providers/data/qwen-token-plan.json +1 -0
  384. package/dist/providers/data/together.json +1 -0
  385. package/dist/providers/data/vercel-ai-gateway.json +1 -0
  386. package/dist/providers/data/xai.json +1 -0
  387. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  388. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  389. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  390. package/dist/providers/data/xiaomi.json +1 -0
  391. package/dist/providers/data/zai-coding-cn.json +1 -0
  392. package/dist/providers/data/zai.json +1 -0
  393. package/dist/providers/deepseek.d.ts +3 -0
  394. package/dist/providers/deepseek.d.ts.map +1 -0
  395. package/dist/providers/deepseek.js +15 -0
  396. package/dist/providers/deepseek.js.map +1 -0
  397. package/dist/providers/deepseek.models.d.ts +4 -0
  398. package/dist/providers/deepseek.models.d.ts.map +1 -0
  399. package/dist/providers/deepseek.models.js +6 -0
  400. package/dist/providers/deepseek.models.js.map +1 -0
  401. package/dist/providers/faux.d.ts +116 -0
  402. package/dist/providers/faux.d.ts.map +1 -0
  403. package/dist/providers/faux.js +466 -0
  404. package/dist/providers/faux.js.map +1 -0
  405. package/dist/providers/fireworks.d.ts +3 -0
  406. package/dist/providers/fireworks.d.ts.map +1 -0
  407. package/dist/providers/fireworks.js +19 -0
  408. package/dist/providers/fireworks.js.map +1 -0
  409. package/dist/providers/fireworks.models.d.ts +4 -0
  410. package/dist/providers/fireworks.models.d.ts.map +1 -0
  411. package/dist/providers/fireworks.models.js +6 -0
  412. package/dist/providers/fireworks.models.js.map +1 -0
  413. package/dist/providers/github-copilot.d.ts +3 -0
  414. package/dist/providers/github-copilot.d.ts.map +1 -0
  415. package/dist/providers/github-copilot.js +35 -0
  416. package/dist/providers/github-copilot.js.map +1 -0
  417. package/dist/providers/github-copilot.models.d.ts +4 -0
  418. package/dist/providers/github-copilot.models.d.ts.map +1 -0
  419. package/dist/providers/github-copilot.models.js +6 -0
  420. package/dist/providers/github-copilot.models.js.map +1 -0
  421. package/dist/providers/google-shared.d.ts +2 -0
  422. package/dist/providers/google-shared.d.ts.map +1 -0
  423. package/dist/providers/google-shared.js +2 -0
  424. package/dist/providers/google-shared.js.map +1 -0
  425. package/dist/providers/google-vertex.d.ts +7 -0
  426. package/dist/providers/google-vertex.d.ts.map +1 -0
  427. package/dist/providers/google-vertex.js +89 -0
  428. package/dist/providers/google-vertex.js.map +1 -0
  429. package/dist/providers/google-vertex.models.d.ts +4 -0
  430. package/dist/providers/google-vertex.models.d.ts.map +1 -0
  431. package/dist/providers/google-vertex.models.js +6 -0
  432. package/dist/providers/google-vertex.models.js.map +1 -0
  433. package/dist/providers/google.d.ts +7 -0
  434. package/dist/providers/google.d.ts.map +1 -0
  435. package/dist/providers/google.js +18 -0
  436. package/dist/providers/google.js.map +1 -0
  437. package/dist/providers/google.models.d.ts +4 -0
  438. package/dist/providers/google.models.d.ts.map +1 -0
  439. package/dist/providers/google.models.js +6 -0
  440. package/dist/providers/google.models.js.map +1 -0
  441. package/dist/providers/groq.d.ts +3 -0
  442. package/dist/providers/groq.d.ts.map +1 -0
  443. package/dist/providers/groq.js +15 -0
  444. package/dist/providers/groq.js.map +1 -0
  445. package/dist/providers/groq.models.d.ts +4 -0
  446. package/dist/providers/groq.models.d.ts.map +1 -0
  447. package/dist/providers/groq.models.js +6 -0
  448. package/dist/providers/groq.models.js.map +1 -0
  449. package/dist/providers/huggingface.d.ts +3 -0
  450. package/dist/providers/huggingface.d.ts.map +1 -0
  451. package/dist/providers/huggingface.js +15 -0
  452. package/dist/providers/huggingface.js.map +1 -0
  453. package/dist/providers/huggingface.models.d.ts +4 -0
  454. package/dist/providers/huggingface.models.d.ts.map +1 -0
  455. package/dist/providers/huggingface.models.js +6 -0
  456. package/dist/providers/huggingface.models.js.map +1 -0
  457. package/dist/providers/images/register-builtins.d.ts +4 -0
  458. package/dist/providers/images/register-builtins.d.ts.map +1 -0
  459. package/dist/providers/images/register-builtins.js +34 -0
  460. package/dist/providers/images/register-builtins.js.map +1 -0
  461. package/dist/providers/kimi-coding.d.ts +3 -0
  462. package/dist/providers/kimi-coding.d.ts.map +1 -0
  463. package/dist/providers/kimi-coding.js +23 -0
  464. package/dist/providers/kimi-coding.js.map +1 -0
  465. package/dist/providers/kimi-coding.models.d.ts +4 -0
  466. package/dist/providers/kimi-coding.models.d.ts.map +1 -0
  467. package/dist/providers/kimi-coding.models.js +6 -0
  468. package/dist/providers/kimi-coding.models.js.map +1 -0
  469. package/dist/providers/minimax-cn.d.ts +3 -0
  470. package/dist/providers/minimax-cn.d.ts.map +1 -0
  471. package/dist/providers/minimax-cn.js +15 -0
  472. package/dist/providers/minimax-cn.js.map +1 -0
  473. package/dist/providers/minimax-cn.models.d.ts +4 -0
  474. package/dist/providers/minimax-cn.models.d.ts.map +1 -0
  475. package/dist/providers/minimax-cn.models.js +6 -0
  476. package/dist/providers/minimax-cn.models.js.map +1 -0
  477. package/dist/providers/minimax.d.ts +3 -0
  478. package/dist/providers/minimax.d.ts.map +1 -0
  479. package/dist/providers/minimax.js +15 -0
  480. package/dist/providers/minimax.js.map +1 -0
  481. package/dist/providers/minimax.models.d.ts +4 -0
  482. package/dist/providers/minimax.models.d.ts.map +1 -0
  483. package/dist/providers/minimax.models.js +6 -0
  484. package/dist/providers/minimax.models.js.map +1 -0
  485. package/dist/providers/mistral.d.ts +3 -0
  486. package/dist/providers/mistral.d.ts.map +1 -0
  487. package/dist/providers/mistral.js +15 -0
  488. package/dist/providers/mistral.js.map +1 -0
  489. package/dist/providers/mistral.models.d.ts +4 -0
  490. package/dist/providers/mistral.models.d.ts.map +1 -0
  491. package/dist/providers/mistral.models.js +6 -0
  492. package/dist/providers/mistral.models.js.map +1 -0
  493. package/dist/providers/moonshotai-cn.d.ts +3 -0
  494. package/dist/providers/moonshotai-cn.d.ts.map +1 -0
  495. package/dist/providers/moonshotai-cn.js +15 -0
  496. package/dist/providers/moonshotai-cn.js.map +1 -0
  497. package/dist/providers/moonshotai-cn.models.d.ts +4 -0
  498. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  499. package/dist/providers/moonshotai-cn.models.js +6 -0
  500. package/dist/providers/moonshotai-cn.models.js.map +1 -0
  501. package/dist/providers/moonshotai.d.ts +3 -0
  502. package/dist/providers/moonshotai.d.ts.map +1 -0
  503. package/dist/providers/moonshotai.js +15 -0
  504. package/dist/providers/moonshotai.js.map +1 -0
  505. package/dist/providers/moonshotai.models.d.ts +4 -0
  506. package/dist/providers/moonshotai.models.d.ts.map +1 -0
  507. package/dist/providers/moonshotai.models.js +6 -0
  508. package/dist/providers/moonshotai.models.js.map +1 -0
  509. package/dist/providers/nvidia.d.ts +3 -0
  510. package/dist/providers/nvidia.d.ts.map +1 -0
  511. package/dist/providers/nvidia.js +15 -0
  512. package/dist/providers/nvidia.js.map +1 -0
  513. package/dist/providers/nvidia.models.d.ts +4 -0
  514. package/dist/providers/nvidia.models.d.ts.map +1 -0
  515. package/dist/providers/nvidia.models.js +6 -0
  516. package/dist/providers/nvidia.models.js.map +1 -0
  517. package/dist/providers/openai-codex.d.ts +3 -0
  518. package/dist/providers/openai-codex.d.ts.map +1 -0
  519. package/dist/providers/openai-codex.js +18 -0
  520. package/dist/providers/openai-codex.js.map +1 -0
  521. package/dist/providers/openai-codex.models.d.ts +4 -0
  522. package/dist/providers/openai-codex.models.d.ts.map +1 -0
  523. package/dist/providers/openai-codex.models.js +6 -0
  524. package/dist/providers/openai-codex.models.js.map +1 -0
  525. package/dist/providers/openai-completions.d.ts +3 -0
  526. package/dist/providers/openai-completions.d.ts.map +1 -0
  527. package/dist/providers/openai-completions.js +2 -0
  528. package/dist/providers/openai-completions.js.map +1 -0
  529. package/dist/providers/openai-responses-shared.d.ts +2 -0
  530. package/dist/providers/openai-responses-shared.d.ts.map +1 -0
  531. package/dist/providers/openai-responses-shared.js +2 -0
  532. package/dist/providers/openai-responses-shared.js.map +1 -0
  533. package/dist/providers/openai-responses.d.ts +3 -0
  534. package/dist/providers/openai-responses.d.ts.map +1 -0
  535. package/dist/providers/openai-responses.js +2 -0
  536. package/dist/providers/openai-responses.js.map +1 -0
  537. package/dist/providers/openai.d.ts +3 -0
  538. package/dist/providers/openai.d.ts.map +1 -0
  539. package/dist/providers/openai.js +15 -0
  540. package/dist/providers/openai.js.map +1 -0
  541. package/dist/providers/openai.models.d.ts +4 -0
  542. package/dist/providers/openai.models.d.ts.map +1 -0
  543. package/dist/providers/openai.models.js +6 -0
  544. package/dist/providers/openai.models.js.map +1 -0
  545. package/dist/providers/opencode-go.d.ts +3 -0
  546. package/dist/providers/opencode-go.d.ts.map +1 -0
  547. package/dist/providers/opencode-go.js +20 -0
  548. package/dist/providers/opencode-go.js.map +1 -0
  549. package/dist/providers/opencode-go.models.d.ts +4 -0
  550. package/dist/providers/opencode-go.models.d.ts.map +1 -0
  551. package/dist/providers/opencode-go.models.js +6 -0
  552. package/dist/providers/opencode-go.models.js.map +1 -0
  553. package/dist/providers/opencode.d.ts +3 -0
  554. package/dist/providers/opencode.d.ts.map +1 -0
  555. package/dist/providers/opencode.js +22 -0
  556. package/dist/providers/opencode.js.map +1 -0
  557. package/dist/providers/opencode.models.d.ts +4 -0
  558. package/dist/providers/opencode.models.d.ts.map +1 -0
  559. package/dist/providers/opencode.models.js +6 -0
  560. package/dist/providers/opencode.models.js.map +1 -0
  561. package/dist/providers/openrouter-images.d.ts +3 -0
  562. package/dist/providers/openrouter-images.d.ts.map +1 -0
  563. package/dist/providers/openrouter-images.js +22 -0
  564. package/dist/providers/openrouter-images.js.map +1 -0
  565. package/dist/providers/openrouter.d.ts +3 -0
  566. package/dist/providers/openrouter.d.ts.map +1 -0
  567. package/dist/providers/openrouter.js +23 -0
  568. package/dist/providers/openrouter.js.map +1 -0
  569. package/dist/providers/openrouter.models.d.ts +4 -0
  570. package/dist/providers/openrouter.models.d.ts.map +1 -0
  571. package/dist/providers/openrouter.models.js +6 -0
  572. package/dist/providers/openrouter.models.js.map +1 -0
  573. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  574. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  575. package/dist/providers/qwen-token-plan-cn.js +15 -0
  576. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  577. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  578. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  579. package/dist/providers/qwen-token-plan-cn.models.js +6 -0
  580. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  581. package/dist/providers/qwen-token-plan.d.ts +3 -0
  582. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  583. package/dist/providers/qwen-token-plan.js +15 -0
  584. package/dist/providers/qwen-token-plan.js.map +1 -0
  585. package/dist/providers/qwen-token-plan.models.d.ts +4 -0
  586. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  587. package/dist/providers/qwen-token-plan.models.js +6 -0
  588. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  589. package/dist/providers/radius-config.d.ts +26 -0
  590. package/dist/providers/radius-config.d.ts.map +1 -0
  591. package/dist/providers/radius-config.js +63 -0
  592. package/dist/providers/radius-config.js.map +1 -0
  593. package/dist/providers/radius.d.ts +9 -0
  594. package/dist/providers/radius.d.ts.map +1 -0
  595. package/dist/providers/radius.js +54 -0
  596. package/dist/providers/radius.js.map +1 -0
  597. package/dist/providers/register-builtins.d.ts +2 -0
  598. package/dist/providers/register-builtins.d.ts.map +1 -0
  599. package/dist/providers/register-builtins.js +2 -0
  600. package/dist/providers/register-builtins.js.map +1 -0
  601. package/dist/providers/together.d.ts +3 -0
  602. package/dist/providers/together.d.ts.map +1 -0
  603. package/dist/providers/together.js +15 -0
  604. package/dist/providers/together.js.map +1 -0
  605. package/dist/providers/together.models.d.ts +4 -0
  606. package/dist/providers/together.models.d.ts.map +1 -0
  607. package/dist/providers/together.models.js +6 -0
  608. package/dist/providers/together.models.js.map +1 -0
  609. package/dist/providers/vercel-ai-gateway.d.ts +3 -0
  610. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  611. package/dist/providers/vercel-ai-gateway.js +15 -0
  612. package/dist/providers/vercel-ai-gateway.js.map +1 -0
  613. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -0
  614. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  615. package/dist/providers/vercel-ai-gateway.models.js +6 -0
  616. package/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  617. package/dist/providers/xai.d.ts +3 -0
  618. package/dist/providers/xai.d.ts.map +1 -0
  619. package/dist/providers/xai.js +27 -0
  620. package/dist/providers/xai.js.map +1 -0
  621. package/dist/providers/xai.models.d.ts +4 -0
  622. package/dist/providers/xai.models.d.ts.map +1 -0
  623. package/dist/providers/xai.models.js +6 -0
  624. package/dist/providers/xai.models.js.map +1 -0
  625. package/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  626. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  627. package/dist/providers/xiaomi-token-plan-ams.js +15 -0
  628. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  629. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -0
  630. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  631. package/dist/providers/xiaomi-token-plan-ams.models.js +6 -0
  632. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  633. package/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  634. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  635. package/dist/providers/xiaomi-token-plan-cn.js +15 -0
  636. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  637. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -0
  638. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  639. package/dist/providers/xiaomi-token-plan-cn.models.js +6 -0
  640. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  641. package/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  642. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  643. package/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  644. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  645. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -0
  646. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  647. package/dist/providers/xiaomi-token-plan-sgp.models.js +6 -0
  648. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  649. package/dist/providers/xiaomi.d.ts +3 -0
  650. package/dist/providers/xiaomi.d.ts.map +1 -0
  651. package/dist/providers/xiaomi.js +15 -0
  652. package/dist/providers/xiaomi.js.map +1 -0
  653. package/dist/providers/xiaomi.models.d.ts +4 -0
  654. package/dist/providers/xiaomi.models.d.ts.map +1 -0
  655. package/dist/providers/xiaomi.models.js +6 -0
  656. package/dist/providers/xiaomi.models.js.map +1 -0
  657. package/dist/providers/zai-coding-cn.d.ts +3 -0
  658. package/dist/providers/zai-coding-cn.d.ts.map +1 -0
  659. package/dist/providers/zai-coding-cn.js +15 -0
  660. package/dist/providers/zai-coding-cn.js.map +1 -0
  661. package/dist/providers/zai-coding-cn.models.d.ts +4 -0
  662. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  663. package/dist/providers/zai-coding-cn.models.js +6 -0
  664. package/dist/providers/zai-coding-cn.models.js.map +1 -0
  665. package/dist/providers/zai.d.ts +3 -0
  666. package/dist/providers/zai.d.ts.map +1 -0
  667. package/dist/providers/zai.js +15 -0
  668. package/dist/providers/zai.js.map +1 -0
  669. package/dist/providers/zai.models.d.ts +4 -0
  670. package/dist/providers/zai.models.d.ts.map +1 -0
  671. package/dist/providers/zai.models.js +6 -0
  672. package/dist/providers/zai.models.js.map +1 -0
  673. package/dist/session-resources.d.ts +4 -0
  674. package/dist/session-resources.d.ts.map +1 -0
  675. package/dist/session-resources.js +22 -0
  676. package/dist/session-resources.js.map +1 -0
  677. package/dist/stream.d.ts +2 -0
  678. package/dist/stream.d.ts.map +1 -0
  679. package/dist/stream.js +2 -0
  680. package/dist/stream.js.map +1 -0
  681. package/dist/tool-call-middleware/context-transformer.d.ts +22 -0
  682. package/dist/tool-call-middleware/context-transformer.d.ts.map +1 -0
  683. package/dist/tool-call-middleware/context-transformer.js +182 -0
  684. package/dist/tool-call-middleware/context-transformer.js.map +1 -0
  685. package/dist/tool-call-middleware/index.d.ts +14 -0
  686. package/dist/tool-call-middleware/index.d.ts.map +1 -0
  687. package/dist/tool-call-middleware/index.js +37 -0
  688. package/dist/tool-call-middleware/index.js.map +1 -0
  689. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +9 -0
  690. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +1 -0
  691. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +92 -0
  692. package/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +1 -0
  693. package/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +7 -0
  694. package/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +1 -0
  695. package/dist/tool-call-middleware/protocols/anthropic-xml/format.js +54 -0
  696. package/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +1 -0
  697. package/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts +4 -0
  698. package/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +1 -0
  699. package/dist/tool-call-middleware/protocols/anthropic-xml/index.js +4 -0
  700. package/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +1 -0
  701. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts +7 -0
  702. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +1 -0
  703. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js +16 -0
  704. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +1 -0
  705. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts +19 -0
  706. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.d.ts.map +1 -0
  707. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js +8 -0
  708. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-protocol.js.map +1 -0
  709. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts +20 -0
  710. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.d.ts.map +1 -0
  711. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js +79 -0
  712. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-stream-helpers.js.map +1 -0
  713. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +14 -0
  714. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -0
  715. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +42 -0
  716. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -0
  717. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts +38 -0
  718. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.d.ts.map +1 -0
  719. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js +210 -0
  720. package/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-syntax.js.map +1 -0
  721. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +6 -0
  722. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +1 -0
  723. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +49 -0
  724. package/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +1 -0
  725. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts +9 -0
  726. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.d.ts.map +1 -0
  727. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js +231 -0
  728. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-stream.js.map +1 -0
  729. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts +38 -0
  730. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -0
  731. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js +84 -0
  732. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.js.map +1 -0
  733. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts +13 -0
  734. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -0
  735. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +107 -0
  736. package/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -0
  737. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +7 -0
  738. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -0
  739. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +214 -0
  740. package/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -0
  741. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts +4 -0
  742. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +1 -0
  743. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +17 -0
  744. package/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +1 -0
  745. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts +5 -0
  746. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +1 -0
  747. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js +34 -0
  748. package/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +1 -0
  749. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts +15 -0
  750. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.d.ts.map +1 -0
  751. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.js +198 -0
  752. package/dist/tool-call-middleware/protocols/antml/coerce-parameters.js.map +1 -0
  753. package/dist/tool-call-middleware/protocols/antml/config.d.ts +3 -0
  754. package/dist/tool-call-middleware/protocols/antml/config.d.ts.map +1 -0
  755. package/dist/tool-call-middleware/protocols/antml/config.js +8 -0
  756. package/dist/tool-call-middleware/protocols/antml/config.js.map +1 -0
  757. package/dist/tool-call-middleware/protocols/antml/format.d.ts +6 -0
  758. package/dist/tool-call-middleware/protocols/antml/format.d.ts.map +1 -0
  759. package/dist/tool-call-middleware/protocols/antml/format.js +33 -0
  760. package/dist/tool-call-middleware/protocols/antml/format.js.map +1 -0
  761. package/dist/tool-call-middleware/protocols/antml/index.d.ts +7 -0
  762. package/dist/tool-call-middleware/protocols/antml/index.d.ts.map +1 -0
  763. package/dist/tool-call-middleware/protocols/antml/index.js +7 -0
  764. package/dist/tool-call-middleware/protocols/antml/index.js.map +1 -0
  765. package/dist/tool-call-middleware/protocols/antml/parse.d.ts +4 -0
  766. package/dist/tool-call-middleware/protocols/antml/parse.d.ts.map +1 -0
  767. package/dist/tool-call-middleware/protocols/antml/parse.js +6 -0
  768. package/dist/tool-call-middleware/protocols/antml/parse.js.map +1 -0
  769. package/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts +5 -0
  770. package/dist/tool-call-middleware/protocols/antml/recovery-stream.d.ts.map +1 -0
  771. package/dist/tool-call-middleware/protocols/antml/recovery-stream.js +6 -0
  772. package/dist/tool-call-middleware/protocols/antml/recovery-stream.js.map +1 -0
  773. package/dist/tool-call-middleware/protocols/antml/repair.d.ts +12 -0
  774. package/dist/tool-call-middleware/protocols/antml/repair.d.ts.map +1 -0
  775. package/dist/tool-call-middleware/protocols/antml/repair.js +46 -0
  776. package/dist/tool-call-middleware/protocols/antml/repair.js.map +1 -0
  777. package/dist/tool-call-middleware/protocols/antml/stream.d.ts +4 -0
  778. package/dist/tool-call-middleware/protocols/antml/stream.d.ts.map +1 -0
  779. package/dist/tool-call-middleware/protocols/antml/stream.js +6 -0
  780. package/dist/tool-call-middleware/protocols/antml/stream.js.map +1 -0
  781. package/dist/tool-call-middleware/protocols/gemma4.d.ts +28 -0
  782. package/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -0
  783. package/dist/tool-call-middleware/protocols/gemma4.js +663 -0
  784. package/dist/tool-call-middleware/protocols/gemma4.js.map +1 -0
  785. package/dist/tool-call-middleware/protocols/hermes.d.ts +21 -0
  786. package/dist/tool-call-middleware/protocols/hermes.d.ts.map +1 -0
  787. package/dist/tool-call-middleware/protocols/hermes.js +69 -0
  788. package/dist/tool-call-middleware/protocols/hermes.js.map +1 -0
  789. package/dist/tool-call-middleware/protocols/json-mix.d.ts +12 -0
  790. package/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -0
  791. package/dist/tool-call-middleware/protocols/json-mix.js +704 -0
  792. package/dist/tool-call-middleware/protocols/json-mix.js.map +1 -0
  793. package/dist/tool-call-middleware/protocols/morph-xml.d.ts +15 -0
  794. package/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -0
  795. package/dist/tool-call-middleware/protocols/morph-xml.js +957 -0
  796. package/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -0
  797. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts +14 -0
  798. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +1 -0
  799. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js +54 -0
  800. package/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +1 -0
  801. package/dist/tool-call-middleware/protocols/yaml-xml.d.ts +8 -0
  802. package/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -0
  803. package/dist/tool-call-middleware/protocols/yaml-xml.js +328 -0
  804. package/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -0
  805. package/dist/tool-call-middleware/recovery-code-mask.d.ts +19 -0
  806. package/dist/tool-call-middleware/recovery-code-mask.d.ts.map +1 -0
  807. package/dist/tool-call-middleware/recovery-code-mask.js +185 -0
  808. package/dist/tool-call-middleware/recovery-code-mask.js.map +1 -0
  809. package/dist/tool-call-middleware/recovery-content-lifecycle.d.ts +11 -0
  810. package/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -0
  811. package/dist/tool-call-middleware/recovery-content-lifecycle.js +24 -0
  812. package/dist/tool-call-middleware/recovery-content-lifecycle.js.map +1 -0
  813. package/dist/tool-call-middleware/recovery-diagnostics.d.ts +4 -0
  814. package/dist/tool-call-middleware/recovery-diagnostics.d.ts.map +1 -0
  815. package/dist/tool-call-middleware/recovery-diagnostics.js +13 -0
  816. package/dist/tool-call-middleware/recovery-diagnostics.js.map +1 -0
  817. package/dist/tool-call-middleware/recovery-event-stream.d.ts +15 -0
  818. package/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -0
  819. package/dist/tool-call-middleware/recovery-event-stream.js +37 -0
  820. package/dist/tool-call-middleware/recovery-event-stream.js.map +1 -0
  821. package/dist/tool-call-middleware/recovery-message-snapshot.d.ts +4 -0
  822. package/dist/tool-call-middleware/recovery-message-snapshot.d.ts.map +1 -0
  823. package/dist/tool-call-middleware/recovery-message-snapshot.js +61 -0
  824. package/dist/tool-call-middleware/recovery-message-snapshot.js.map +1 -0
  825. package/dist/tool-call-middleware/recovery-native-projection.d.ts +29 -0
  826. package/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -0
  827. package/dist/tool-call-middleware/recovery-native-projection.js +148 -0
  828. package/dist/tool-call-middleware/recovery-native-projection.js.map +1 -0
  829. package/dist/tool-call-middleware/recovery-stream-failure.d.ts +5 -0
  830. package/dist/tool-call-middleware/recovery-stream-failure.d.ts.map +1 -0
  831. package/dist/tool-call-middleware/recovery-stream-failure.js +36 -0
  832. package/dist/tool-call-middleware/recovery-stream-failure.js.map +1 -0
  833. package/dist/tool-call-middleware/recovery-stream-terminal.d.ts +15 -0
  834. package/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -0
  835. package/dist/tool-call-middleware/recovery-stream-terminal.js +88 -0
  836. package/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -0
  837. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts +3 -0
  838. package/dist/tool-call-middleware/recovery-stream-wrapper.d.ts.map +1 -0
  839. package/dist/tool-call-middleware/recovery-stream-wrapper.js +233 -0
  840. package/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -0
  841. package/dist/tool-call-middleware/recovery-text-projection.d.ts +23 -0
  842. package/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -0
  843. package/dist/tool-call-middleware/recovery-text-projection.js +77 -0
  844. package/dist/tool-call-middleware/recovery-text-projection.js.map +1 -0
  845. package/dist/tool-call-middleware/stream-message-metadata.d.ts +5 -0
  846. package/dist/tool-call-middleware/stream-message-metadata.d.ts.map +1 -0
  847. package/dist/tool-call-middleware/stream-message-metadata.js +63 -0
  848. package/dist/tool-call-middleware/stream-message-metadata.js.map +1 -0
  849. package/dist/tool-call-middleware/stream-thinking-projection.d.ts +13 -0
  850. package/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -0
  851. package/dist/tool-call-middleware/stream-thinking-projection.js +52 -0
  852. package/dist/tool-call-middleware/stream-thinking-projection.js.map +1 -0
  853. package/dist/tool-call-middleware/stream-wrapper-shared.d.ts +41 -0
  854. package/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -0
  855. package/dist/tool-call-middleware/stream-wrapper-shared.js +209 -0
  856. package/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -0
  857. package/dist/tool-call-middleware/stream-wrapper.d.ts +4 -0
  858. package/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -0
  859. package/dist/tool-call-middleware/stream-wrapper.js +121 -0
  860. package/dist/tool-call-middleware/stream-wrapper.js.map +1 -0
  861. package/dist/tool-call-middleware/types.d.ts +109 -0
  862. package/dist/tool-call-middleware/types.d.ts.map +1 -0
  863. package/dist/tool-call-middleware/types.js +2 -0
  864. package/dist/tool-call-middleware/types.js.map +1 -0
  865. package/dist/types.d.ts +762 -0
  866. package/dist/types.d.ts.map +1 -0
  867. package/dist/types.js +5 -0
  868. package/dist/types.js.map +1 -0
  869. package/dist/utils/abort-signals.d.ts +6 -0
  870. package/dist/utils/abort-signals.d.ts.map +1 -0
  871. package/dist/utils/abort-signals.js +34 -0
  872. package/dist/utils/abort-signals.js.map +1 -0
  873. package/dist/utils/deferred-tools.d.ts +9 -0
  874. package/dist/utils/deferred-tools.d.ts.map +1 -0
  875. package/dist/utils/deferred-tools.js +36 -0
  876. package/dist/utils/deferred-tools.js.map +1 -0
  877. package/dist/utils/diagnostics.d.ts +19 -0
  878. package/dist/utils/diagnostics.d.ts.map +1 -0
  879. package/dist/utils/diagnostics.js +25 -0
  880. package/dist/utils/diagnostics.js.map +1 -0
  881. package/dist/utils/error-body.d.ts +25 -0
  882. package/dist/utils/error-body.d.ts.map +1 -0
  883. package/dist/utils/error-body.js +114 -0
  884. package/dist/utils/error-body.js.map +1 -0
  885. package/dist/utils/estimate.d.ts +17 -0
  886. package/dist/utils/estimate.d.ts.map +1 -0
  887. package/dist/utils/estimate.js +119 -0
  888. package/dist/utils/estimate.js.map +1 -0
  889. package/dist/utils/event-stream.d.ts +24 -0
  890. package/dist/utils/event-stream.d.ts.map +1 -0
  891. package/dist/utils/event-stream.js +117 -0
  892. package/dist/utils/event-stream.js.map +1 -0
  893. package/dist/utils/hash.d.ts +3 -0
  894. package/dist/utils/hash.d.ts.map +1 -0
  895. package/dist/utils/hash.js +14 -0
  896. package/dist/utils/hash.js.map +1 -0
  897. package/dist/utils/headers.d.ts +4 -0
  898. package/dist/utils/headers.d.ts.map +1 -0
  899. package/dist/utils/headers.js +18 -0
  900. package/dist/utils/headers.js.map +1 -0
  901. package/dist/utils/json-parse.d.ts +16 -0
  902. package/dist/utils/json-parse.d.ts.map +1 -0
  903. package/dist/utils/json-parse.js +113 -0
  904. package/dist/utils/json-parse.js.map +1 -0
  905. package/dist/utils/node-http-proxy.d.ts +4 -0
  906. package/dist/utils/node-http-proxy.d.ts.map +1 -0
  907. package/dist/utils/node-http-proxy.js +92 -0
  908. package/dist/utils/node-http-proxy.js.map +1 -0
  909. package/dist/utils/openai-codex-auth.d.ts +11 -0
  910. package/dist/utils/openai-codex-auth.d.ts.map +1 -0
  911. package/dist/utils/openai-codex-auth.js +30 -0
  912. package/dist/utils/openai-codex-auth.js.map +1 -0
  913. package/dist/utils/overflow.d.ts +55 -0
  914. package/dist/utils/overflow.d.ts.map +1 -0
  915. package/dist/utils/overflow.js +155 -0
  916. package/dist/utils/overflow.js.map +1 -0
  917. package/dist/utils/provider-env.d.ts +7 -0
  918. package/dist/utils/provider-env.d.ts.map +1 -0
  919. package/dist/utils/provider-env.js +44 -0
  920. package/dist/utils/provider-env.js.map +1 -0
  921. package/dist/utils/provider-retry.d.ts +16 -0
  922. package/dist/utils/provider-retry.d.ts.map +1 -0
  923. package/dist/utils/provider-retry.js +94 -0
  924. package/dist/utils/provider-retry.js.map +1 -0
  925. package/dist/utils/retry.d.ts +53 -0
  926. package/dist/utils/retry.d.ts.map +1 -0
  927. package/dist/utils/retry.js +177 -0
  928. package/dist/utils/retry.js.map +1 -0
  929. package/dist/utils/sanitize-unicode.d.ts +22 -0
  930. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  931. package/dist/utils/sanitize-unicode.js +26 -0
  932. package/dist/utils/sanitize-unicode.js.map +1 -0
  933. package/dist/utils/server-fallback-receipt.d.ts +30 -0
  934. package/dist/utils/server-fallback-receipt.d.ts.map +1 -0
  935. package/dist/utils/server-fallback-receipt.js +70 -0
  936. package/dist/utils/server-fallback-receipt.js.map +1 -0
  937. package/dist/utils/stop-details.d.ts +4 -0
  938. package/dist/utils/stop-details.d.ts.map +1 -0
  939. package/dist/utils/stop-details.js +6 -0
  940. package/dist/utils/stop-details.js.map +1 -0
  941. package/dist/utils/text.d.ts +6 -0
  942. package/dist/utils/text.d.ts.map +1 -0
  943. package/dist/utils/text.js +10 -0
  944. package/dist/utils/text.js.map +1 -0
  945. package/dist/utils/tool-choice-fallback.d.ts +5 -0
  946. package/dist/utils/tool-choice-fallback.d.ts.map +1 -0
  947. package/dist/utils/tool-choice-fallback.js +41 -0
  948. package/dist/utils/tool-choice-fallback.js.map +1 -0
  949. package/dist/utils/tool-pair-repair.d.ts +5 -0
  950. package/dist/utils/tool-pair-repair.d.ts.map +1 -0
  951. package/dist/utils/tool-pair-repair.js +70 -0
  952. package/dist/utils/tool-pair-repair.js.map +1 -0
  953. package/dist/utils/tool-schema-compat.d.ts +19 -0
  954. package/dist/utils/tool-schema-compat.d.ts.map +1 -0
  955. package/dist/utils/tool-schema-compat.js +215 -0
  956. package/dist/utils/tool-schema-compat.js.map +1 -0
  957. package/dist/utils/typebox-helpers.d.ts +17 -0
  958. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  959. package/dist/utils/typebox-helpers.js +21 -0
  960. package/dist/utils/typebox-helpers.js.map +1 -0
  961. package/dist/utils/uuid.d.ts +3 -0
  962. package/dist/utils/uuid.d.ts.map +1 -0
  963. package/dist/utils/uuid.js +50 -0
  964. package/dist/utils/uuid.js.map +1 -0
  965. package/dist/utils/validation.d.ts +18 -0
  966. package/dist/utils/validation.d.ts.map +1 -0
  967. package/dist/utils/validation.js +269 -0
  968. package/dist/utils/validation.js.map +1 -0
  969. package/package.json +110 -0
@@ -0,0 +1,1326 @@
1
+ function loadNodeOs() {
2
+ if (typeof process === "undefined" || !(process.versions?.node || process.versions?.bun)) {
3
+ return null;
4
+ }
5
+ return process.getBuiltinModule?.("node:os") ?? null;
6
+ }
7
+ // NEVER convert to top-level runtime imports - breaks browser/Vite builds
8
+ const _os = loadNodeOs();
9
+ import { clampThinkingLevel, supportsXhigh } from "../models.js";
10
+ import { registerSessionResourceCleanup } from "../session-resources.js";
11
+ import { combineAbortSignals } from "../utils/abort-signals.js";
12
+ import { splitDeferredTools } from "../utils/deferred-tools.js";
13
+ import { appendAssistantMessageDiagnostic, createAssistantMessageDiagnostic, formatThrownValue, } from "../utils/diagnostics.js";
14
+ import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
15
+ import { AssistantMessageEventStream } from "../utils/event-stream.js";
16
+ import { headersToRecord } from "../utils/headers.js";
17
+ import { resolveHttpProxyUrlForTarget } from "../utils/node-http-proxy.js";
18
+ import { extractOpenAiCodexAccountId } from "../utils/openai-codex-auth.js";
19
+ import { uuidv7 } from "../utils/uuid.js";
20
+ import { createGrammarToolInputProperties } from "./constrained-sampling.js";
21
+ import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
22
+ import { convertResponsesMessages, convertResponsesTools, processResponsesStream } from "./openai-responses-shared.js";
23
+ import { applyExtraBody, buildBaseOptions, clampMaxForOpenAI, OPENAI_RESPONSES_RESERVED_BODY_KEYS, } from "./simple-options.js";
24
+ // ============================================================================
25
+ // Configuration
26
+ // ============================================================================
27
+ const DEFAULT_CODEX_BASE_URL = "https://chatgpt.com/backend-api";
28
+ const DEFAULT_MAX_RETRIES = 0;
29
+ const BASE_DELAY_MS = 1000;
30
+ const DEFAULT_MAX_RETRY_DELAY_MS = 60_000;
31
+ const DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS = 15_000;
32
+ // The Codex backend accepts zstd-compressed request bodies on the SSE responses
33
+ // endpoint (the same endpoint the official Codex client compresses against).
34
+ const REQUEST_COMPRESSION_ZSTD_LEVEL = 3;
35
+ const CODEX_TOOL_CALL_PROVIDERS = new Set(["openai", "openai-codex", "opencode"]);
36
+ const WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE = 1009;
37
+ const CODEX_PREVIOUS_RESPONSE_STALE_CODES = new Set(["codex_previous_response_stale"]);
38
+ const WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE = "websocket_connection_limit_reached";
39
+ const PREVIOUS_RESPONSE_NOT_FOUND_CODE = "previous_response_not_found";
40
+ const CODEX_RESPONSE_STATUSES = new Set([
41
+ "completed",
42
+ "incomplete",
43
+ "failed",
44
+ "cancelled",
45
+ "queued",
46
+ "in_progress",
47
+ ]);
48
+ // ============================================================================
49
+ // Retry Helpers
50
+ // ============================================================================
51
+ function isTerminalRateLimitError(errorText) {
52
+ return /GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing/i.test(errorText);
53
+ }
54
+ function isRetryableError(status, errorText) {
55
+ if (status === 429 && isTerminalRateLimitError(errorText)) {
56
+ return false;
57
+ }
58
+ if (status === 429 || status === 500 || status === 502 || status === 503 || status === 504) {
59
+ return true;
60
+ }
61
+ return /rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText);
62
+ }
63
+ function getRetryAfterDelayMs(headers) {
64
+ const retryAfterMs = headers.get("retry-after-ms");
65
+ if (retryAfterMs !== null) {
66
+ const millis = Number(retryAfterMs);
67
+ if (Number.isFinite(millis)) {
68
+ return Math.max(0, millis);
69
+ }
70
+ }
71
+ const retryAfter = headers.get("retry-after");
72
+ if (!retryAfter) {
73
+ return undefined;
74
+ }
75
+ const seconds = Number(retryAfter);
76
+ if (Number.isFinite(seconds)) {
77
+ return Math.max(0, seconds * 1000);
78
+ }
79
+ const date = Date.parse(retryAfter);
80
+ if (!Number.isNaN(date)) {
81
+ return Math.max(0, date - Date.now());
82
+ }
83
+ return undefined;
84
+ }
85
+ class RetryDelayExceededError extends Error {
86
+ }
87
+ function validateRetryDelayMs(delayMs, options) {
88
+ const maxRetryDelayMs = options?.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;
89
+ if (maxRetryDelayMs > 0 && delayMs > maxRetryDelayMs) {
90
+ throw new RetryDelayExceededError(`Server requested ${Math.ceil(delayMs / 1000)}s retry delay (max: ${Math.ceil(maxRetryDelayMs / 1000)}s)`);
91
+ }
92
+ return delayMs;
93
+ }
94
+ function sleep(ms, signal) {
95
+ return new Promise((resolve, reject) => {
96
+ if (signal?.aborted) {
97
+ reject(new Error("Request was aborted"));
98
+ return;
99
+ }
100
+ const timeout = setTimeout(resolve, ms);
101
+ signal?.addEventListener("abort", () => {
102
+ clearTimeout(timeout);
103
+ reject(new Error("Request was aborted"));
104
+ });
105
+ });
106
+ }
107
+ function normalizeTimeoutMs(value) {
108
+ if (value === undefined)
109
+ return undefined;
110
+ if (!Number.isFinite(value) || value < 0) {
111
+ throw new Error(`Invalid timeoutMs: ${String(value)}`);
112
+ }
113
+ return Math.floor(value);
114
+ }
115
+ function loadNodeZlib() {
116
+ if (typeof process === "undefined" || !(process.versions?.node || process.versions?.bun)) {
117
+ return null;
118
+ }
119
+ return process.getBuiltinModule?.("node:zlib") ?? null;
120
+ }
121
+ // Returns the zstd-compressed body bytes, or null when compression is
122
+ // unavailable (browser/Vite builds). Callers fall back to sending the
123
+ // uncompressed JSON when this returns null.
124
+ function compressRequestBodyZstd(bodyJson) {
125
+ const zlib = loadNodeZlib();
126
+ if (!zlib || typeof zlib.zstdCompressSync !== "function") {
127
+ return null;
128
+ }
129
+ try {
130
+ const compressed = zlib.zstdCompressSync(bodyJson, {
131
+ params: { [zlib.constants.ZSTD_c_compressionLevel]: REQUEST_COMPRESSION_ZSTD_LEVEL },
132
+ });
133
+ return new Uint8Array(compressed.buffer, compressed.byteOffset, compressed.byteLength);
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ }
139
+ function copyBytesToArrayBuffer(bytes) {
140
+ const copy = new Uint8Array(bytes.byteLength);
141
+ copy.set(bytes);
142
+ return copy.buffer;
143
+ }
144
+ // ============================================================================
145
+ // Main Stream Function
146
+ // ============================================================================
147
+ export const stream = (model, context, options) => {
148
+ const stream = new AssistantMessageEventStream();
149
+ (async () => {
150
+ const output = {
151
+ role: "assistant",
152
+ content: [],
153
+ api: "openai-codex-responses",
154
+ provider: model.provider,
155
+ model: model.id,
156
+ usage: {
157
+ input: 0,
158
+ output: 0,
159
+ cacheRead: 0,
160
+ cacheWrite: 0,
161
+ totalTokens: 0,
162
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
163
+ },
164
+ stopReason: "stop",
165
+ timestamp: Date.now(),
166
+ };
167
+ try {
168
+ const apiKey = options?.apiKey;
169
+ if (!apiKey) {
170
+ throw new Error(`No API key for provider: ${model.provider}`);
171
+ }
172
+ const accountId = extractAccountId(apiKey);
173
+ const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false);
174
+ const cacheSessionId = options?.cacheRetention === "none" ? undefined : options?.sessionId;
175
+ const codexSessionId = clampOpenAIPromptCacheKey(cacheSessionId);
176
+ let body = buildRequestBody(model, context, options, codexSessionId, grammarToolInputProperties);
177
+ const nextBody = await options?.onPayload?.(body, model);
178
+ if (nextBody !== undefined) {
179
+ body = nextBody;
180
+ }
181
+ const websocketRequestId = codexSessionId || uuidv7();
182
+ const sseHeaders = buildSSEHeaders(model.headers, options?.headers, accountId, apiKey, codexSessionId);
183
+ const websocketHeaders = buildWebSocketHeaders(model.headers, options?.headers, accountId, apiKey, websocketRequestId);
184
+ const bodyJson = JSON.stringify(body);
185
+ const httpTimeoutMs = normalizeTimeoutMs(options?.timeoutMs);
186
+ const websocketConnectTimeoutMs = normalizeTimeoutMs(options?.websocketConnectTimeoutMs);
187
+ const transport = options?.transport || "auto";
188
+ let startEmitted = false;
189
+ const websocketDisabledForSession = transport !== "sse" && isWebSocketSseFallbackActive(cacheSessionId);
190
+ if (websocketDisabledForSession) {
191
+ recordWebSocketSseFallback(cacheSessionId);
192
+ }
193
+ if (transport !== "sse" && !websocketDisabledForSession) {
194
+ let websocketStarted = false;
195
+ let retriedWebSocketConnectionLimit = false;
196
+ let retriedMissingWebSocketContinuation = false;
197
+ while (true) {
198
+ websocketStarted = false;
199
+ try {
200
+ await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl), body, websocketHeaders, output, stream, model, () => {
201
+ websocketStarted = true;
202
+ if (!startEmitted) {
203
+ startEmitted = true;
204
+ stream.push({ type: "start", partial: output });
205
+ }
206
+ }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, grammarToolInputProperties, options);
207
+ if (options?.signal?.aborted) {
208
+ throw new Error("Request was aborted");
209
+ }
210
+ stream.push({
211
+ type: "done",
212
+ reason: output.stopReason,
213
+ message: output,
214
+ });
215
+ stream.end();
216
+ return;
217
+ }
218
+ catch (error) {
219
+ const aborted = options?.signal?.aborted;
220
+ const connectionLimitBeforeStart = !websocketStarted && isWebSocketConnectionLimitReachedError(error);
221
+ const previousResponseNotFound = isPreviousResponseNotFoundError(error);
222
+ if (!aborted && previousResponseNotFound && !retriedMissingWebSocketContinuation) {
223
+ retriedMissingWebSocketContinuation = true;
224
+ continue;
225
+ }
226
+ if (!aborted && connectionLimitBeforeStart && !retriedWebSocketConnectionLimit) {
227
+ retriedWebSocketConnectionLimit = true;
228
+ continue;
229
+ }
230
+ if (aborted || (isCodexNonTransportError(error) && !connectionLimitBeforeStart)) {
231
+ throw error;
232
+ }
233
+ appendAssistantMessageDiagnostic(output, createAssistantMessageDiagnostic("provider_transport_failure", error, {
234
+ configuredTransport: transport,
235
+ fallbackTransport: websocketStarted ? undefined : "sse",
236
+ eventsEmitted: websocketStarted,
237
+ phase: websocketStarted ? "after_message_stream_start" : "before_message_stream_start",
238
+ requestBytes: new TextEncoder().encode(bodyJson).byteLength,
239
+ }));
240
+ recordWebSocketFailure(cacheSessionId, error);
241
+ if (websocketStarted) {
242
+ throw error;
243
+ }
244
+ recordWebSocketSseFallback(cacheSessionId);
245
+ break;
246
+ }
247
+ }
248
+ }
249
+ // Compress the request body once for the SSE path. The Codex backend
250
+ // decodes Content-Encoding: zstd; the WebSocket transport above sends the
251
+ // uncompressed JSON frame, matching the official Codex client.
252
+ const compressedBody = compressRequestBodyZstd(bodyJson);
253
+ if (compressedBody) {
254
+ sseHeaders.set("content-encoding", "zstd");
255
+ }
256
+ const sseBody = compressedBody ? copyBytesToArrayBuffer(compressedBody) : bodyJson;
257
+ // Fetch with retry logic for rate limits and transient errors
258
+ let response;
259
+ let lastError;
260
+ const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;
261
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
262
+ if (options?.signal?.aborted) {
263
+ throw new Error("Request was aborted");
264
+ }
265
+ try {
266
+ const headerTimeoutSignal = httpTimeoutMs !== undefined && httpTimeoutMs > 0 ? AbortSignal.timeout(httpTimeoutMs) : undefined;
267
+ const combinedSignal = combineAbortSignals([options?.signal, headerTimeoutSignal]);
268
+ try {
269
+ response = await fetch(resolveCodexUrl(model.baseUrl), {
270
+ method: "POST",
271
+ headers: sseHeaders,
272
+ body: sseBody,
273
+ signal: combinedSignal.signal,
274
+ });
275
+ }
276
+ catch (error) {
277
+ if (headerTimeoutSignal?.aborted && !options?.signal?.aborted) {
278
+ throw new Error(`Codex SSE response headers timed out after ${httpTimeoutMs}ms`);
279
+ }
280
+ throw error;
281
+ }
282
+ finally {
283
+ combinedSignal.cleanup();
284
+ }
285
+ await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
286
+ if (response.ok) {
287
+ break;
288
+ }
289
+ const errorText = await response.text();
290
+ if (attempt < maxRetries && isRetryableError(response.status, errorText)) {
291
+ const retryAfterDelayMs = getRetryAfterDelayMs(response.headers);
292
+ const delayMs = retryAfterDelayMs === undefined
293
+ ? BASE_DELAY_MS * 2 ** attempt
294
+ : validateRetryDelayMs(retryAfterDelayMs, options);
295
+ await sleep(delayMs, options?.signal);
296
+ continue;
297
+ }
298
+ // Parse error for friendly message on final attempt or non-retryable error
299
+ const fakeResponse = new Response(errorText, {
300
+ status: response.status,
301
+ statusText: response.statusText,
302
+ });
303
+ const info = await parseErrorResponse(fakeResponse);
304
+ throw new Error(info.friendlyMessage || info.message);
305
+ }
306
+ catch (error) {
307
+ if (error instanceof Error) {
308
+ if (error.name === "AbortError" || error.message === "Request was aborted") {
309
+ throw new Error("Request was aborted");
310
+ }
311
+ }
312
+ lastError = error instanceof Error ? error : new Error(String(error));
313
+ // Network errors are retryable
314
+ if (attempt < maxRetries &&
315
+ !(lastError instanceof RetryDelayExceededError) &&
316
+ !lastError.message.includes("usage limit")) {
317
+ const delayMs = BASE_DELAY_MS * 2 ** attempt;
318
+ await sleep(delayMs, options?.signal);
319
+ continue;
320
+ }
321
+ throw lastError;
322
+ }
323
+ }
324
+ if (!response?.ok) {
325
+ throw lastError ?? new Error("Failed after retries");
326
+ }
327
+ if (!response.body) {
328
+ throw new Error("No response body");
329
+ }
330
+ if (!startEmitted) {
331
+ startEmitted = true;
332
+ stream.push({ type: "start", partial: output });
333
+ }
334
+ await processStream(response, output, stream, model, grammarToolInputProperties, options);
335
+ if (options?.signal?.aborted) {
336
+ throw new Error("Request was aborted");
337
+ }
338
+ stream.push({ type: "done", reason: output.stopReason, message: output });
339
+ stream.end();
340
+ }
341
+ catch (error) {
342
+ for (const block of output.content) {
343
+ // Streaming scratch buffers are only used during parsing; never persist them.
344
+ delete block.partialJson;
345
+ delete block.customInput;
346
+ }
347
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
348
+ output.errorMessage = formatProviderError(normalizeProviderError(error));
349
+ stream.push({ type: "error", reason: output.stopReason, error: output });
350
+ stream.end();
351
+ }
352
+ })();
353
+ return stream;
354
+ };
355
+ export const streamSimple = (model, context, options) => {
356
+ const apiKey = options?.apiKey;
357
+ if (!apiKey) {
358
+ throw new Error(`No API key for provider: ${model.provider}`);
359
+ }
360
+ const base = buildBaseOptions(model, context, options, apiKey);
361
+ const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;
362
+ const reasoningEffort = clampedReasoning === "off"
363
+ ? undefined
364
+ : clampedReasoning === "max" && model.thinkingLevelMap?.max !== undefined
365
+ ? "max"
366
+ : clampMaxForOpenAI(clampedReasoning, supportsXhigh(model));
367
+ return stream(model, context, {
368
+ ...base,
369
+ reasoningEffort,
370
+ });
371
+ };
372
+ // ============================================================================
373
+ // Request Building
374
+ // ============================================================================
375
+ function buildRequestBody(model, context, options, cacheSessionId, grammarToolInputProperties = createGrammarToolInputProperties(context.tools, model.compat?.supportsOpenAIGrammarTools ?? false)) {
376
+ const requestedReasoningEffort = options?.reasoningEffort;
377
+ const mappedReasoningEffort = requestedReasoningEffort === undefined
378
+ ? undefined
379
+ : requestedReasoningEffort === "none"
380
+ ? model.thinkingLevelMap?.off
381
+ : model.thinkingLevelMap?.[requestedReasoningEffort];
382
+ const reasoningEffort = mappedReasoningEffort === undefined ? requestedReasoningEffort : mappedReasoningEffort;
383
+ const reasoningRequested = requestedReasoningEffort !== undefined && requestedReasoningEffort !== "none" && reasoningEffort !== null;
384
+ const supportsStrictMode = model.compat?.supportsStrictMode ?? true;
385
+ const supportsOpenAIGrammarTools = model.compat?.supportsOpenAIGrammarTools ?? false;
386
+ const toolPlacement = splitDeferredTools(context, model.compat?.supportsToolSearch ?? false);
387
+ const messages = convertResponsesMessages(model, context, CODEX_TOOL_CALL_PROVIDERS, {
388
+ includeSystemPrompt: false,
389
+ preserveThinking: reasoningRequested,
390
+ preserveTextSignatures: true,
391
+ grammarToolInputProperties,
392
+ deferredTools: toolPlacement.deferred,
393
+ toolOptions: {
394
+ strict: null,
395
+ supportsStrictMode,
396
+ supportsOpenAIGrammarTools,
397
+ },
398
+ });
399
+ const body = {
400
+ model: model.id,
401
+ store: false,
402
+ stream: true,
403
+ instructions: context.systemPrompt || "You are a helpful assistant.",
404
+ input: messages,
405
+ text: { verbosity: options?.textVerbosity || "low" },
406
+ include: ["reasoning.encrypted_content"],
407
+ prompt_cache_key: cacheSessionId,
408
+ tool_choice: options?.toolChoice ?? "auto",
409
+ parallel_tool_calls: true,
410
+ };
411
+ if (options?.temperature !== undefined) {
412
+ body.temperature = options.temperature;
413
+ }
414
+ if (options?.serviceTier !== undefined) {
415
+ body.service_tier = options.serviceTier;
416
+ }
417
+ if (toolPlacement.immediate.length > 0) {
418
+ body.tools = convertResponsesTools(toolPlacement.immediate, {
419
+ strict: null,
420
+ supportsStrictMode,
421
+ supportsOpenAIGrammarTools,
422
+ });
423
+ }
424
+ if (reasoningEffort !== undefined && reasoningEffort !== null) {
425
+ body.reasoning = {
426
+ effort: reasoningEffort,
427
+ summary: options?.reasoningSummary ?? "auto",
428
+ };
429
+ }
430
+ else if (reasoningEffort === undefined && model.reasoning && model.thinkingLevelMap?.off !== null) {
431
+ body.reasoning = {
432
+ effort: model.thinkingLevelMap?.off ?? "none",
433
+ summary: options?.reasoningSummary ?? "auto",
434
+ };
435
+ }
436
+ applyExtraBody(body, options?.extraBody, OPENAI_RESPONSES_RESERVED_BODY_KEYS);
437
+ return body;
438
+ }
439
+ function getServiceTierCostMultiplier(model, serviceTier) {
440
+ switch (serviceTier) {
441
+ case "flex":
442
+ return 0.5;
443
+ case "priority":
444
+ return model.id === "gpt-5.5" ? 2.5 : 2;
445
+ default:
446
+ return 1;
447
+ }
448
+ }
449
+ function applyServiceTierPricing(usage, serviceTier, model) {
450
+ const multiplier = getServiceTierCostMultiplier(model, serviceTier);
451
+ if (multiplier === 1)
452
+ return;
453
+ usage.cost.input *= multiplier;
454
+ usage.cost.output *= multiplier;
455
+ usage.cost.cacheRead *= multiplier;
456
+ usage.cost.cacheWrite *= multiplier;
457
+ usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
458
+ }
459
+ function resolveCodexServiceTier(responseServiceTier, requestServiceTier) {
460
+ if (responseServiceTier === "default" && (requestServiceTier === "flex" || requestServiceTier === "priority")) {
461
+ return requestServiceTier;
462
+ }
463
+ return responseServiceTier ?? requestServiceTier;
464
+ }
465
+ function resolveCodexUrl(baseUrl) {
466
+ const raw = baseUrl && baseUrl.trim().length > 0 ? baseUrl : DEFAULT_CODEX_BASE_URL;
467
+ const normalized = raw.replace(/\/+$/, "");
468
+ if (normalized.endsWith("/codex/responses"))
469
+ return normalized;
470
+ if (normalized.endsWith("/codex"))
471
+ return `${normalized}/responses`;
472
+ return `${normalized}/codex/responses`;
473
+ }
474
+ function resolveCodexWebSocketUrl(baseUrl) {
475
+ const url = new URL(resolveCodexUrl(baseUrl));
476
+ if (url.protocol === "https:")
477
+ url.protocol = "wss:";
478
+ if (url.protocol === "http:")
479
+ url.protocol = "ws:";
480
+ return url.toString();
481
+ }
482
+ // ============================================================================
483
+ // Response Processing
484
+ // ============================================================================
485
+ async function processStream(response, output, stream, model, grammarToolInputProperties, options) {
486
+ await processResponsesStream(mapCodexEvents(parseSSE(response, options?.signal)), output, stream, model, {
487
+ serviceTier: options?.serviceTier,
488
+ grammarToolInputProperties,
489
+ resolveServiceTier: resolveCodexServiceTier,
490
+ applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),
491
+ });
492
+ }
493
+ class CodexApiError extends Error {
494
+ constructor(message, options) {
495
+ super(message);
496
+ this.name = "CodexApiError";
497
+ this.code = options?.code;
498
+ this.payload = options?.payload;
499
+ this.cause = options?.cause;
500
+ }
501
+ }
502
+ class CodexProtocolError extends Error {
503
+ constructor(message, options) {
504
+ super(message);
505
+ this.name = "CodexProtocolError";
506
+ this.payload = options?.payload;
507
+ this.cause = options?.cause;
508
+ }
509
+ }
510
+ function isCodexNonTransportError(error) {
511
+ return error instanceof CodexApiError || error instanceof CodexProtocolError;
512
+ }
513
+ function asRecord(value) {
514
+ return value && typeof value === "object" ? value : null;
515
+ }
516
+ function getString(value) {
517
+ return typeof value === "string" ? value : undefined;
518
+ }
519
+ function getCodexEventError(event) {
520
+ const response = asRecord(event.response);
521
+ return asRecord(event.error) ?? (response ? asRecord(response.error) : null);
522
+ }
523
+ function getCodexEventErrorCode(event) {
524
+ const error = getCodexEventError(event);
525
+ return getString(error?.code) ?? getString(error?.type) ?? getString(event.code) ?? "";
526
+ }
527
+ function getCodexEventErrorMessage(event) {
528
+ const response = asRecord(event.response);
529
+ const error = getCodexEventError(event);
530
+ return getString(error?.message) ?? getString(event.message) ?? getString(response?.message) ?? "";
531
+ }
532
+ function isCodexPreviousResponseStale(error) {
533
+ return (error instanceof CodexApiError &&
534
+ typeof error.code === "string" &&
535
+ CODEX_PREVIOUS_RESPONSE_STALE_CODES.has(error.code));
536
+ }
537
+ function isPreviousResponseNotFoundError(error) {
538
+ return error instanceof CodexApiError && error.code === PREVIOUS_RESPONSE_NOT_FOUND_CODE;
539
+ }
540
+ function isWebSocketConnectionLimitReachedError(error) {
541
+ return error instanceof CodexApiError && error.code === WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE;
542
+ }
543
+ async function* mapCodexEvents(events) {
544
+ for await (const event of events) {
545
+ const type = typeof event.type === "string" ? event.type : undefined;
546
+ if (!type)
547
+ continue;
548
+ if (type === "error") {
549
+ const code = getCodexEventErrorCode(event);
550
+ const message = getCodexEventErrorMessage(event);
551
+ throw new CodexApiError(`Codex error: ${message || code || JSON.stringify(event)}`, {
552
+ code: code || undefined,
553
+ payload: event,
554
+ });
555
+ }
556
+ if (type === "response.failed") {
557
+ const code = getCodexEventErrorCode(event);
558
+ const message = getCodexEventErrorMessage(event);
559
+ throw new CodexApiError(message || "Codex response failed", { code, payload: event });
560
+ }
561
+ if (type === "response.done" || type === "response.completed" || type === "response.incomplete") {
562
+ const response = event.response;
563
+ const normalizedResponse = response
564
+ ? { ...response, status: normalizeCodexStatus(response.status) }
565
+ : response;
566
+ yield { ...event, type: "response.completed", response: normalizedResponse };
567
+ return;
568
+ }
569
+ const responseEvent = JSON.parse(JSON.stringify(event));
570
+ yield responseEvent;
571
+ }
572
+ }
573
+ function normalizeCodexStatus(status) {
574
+ if (typeof status !== "string")
575
+ return undefined;
576
+ return CODEX_RESPONSE_STATUSES.has(status) ? status : undefined;
577
+ }
578
+ // ============================================================================
579
+ // SSE Parsing
580
+ // ============================================================================
581
+ async function* parseSSE(response, signal) {
582
+ if (!response.body)
583
+ return;
584
+ const reader = response.body.getReader();
585
+ const decoder = new TextDecoder();
586
+ let buffer = "";
587
+ const onAbort = () => {
588
+ void reader.cancel().catch(() => { });
589
+ };
590
+ signal?.addEventListener("abort", onAbort, { once: true });
591
+ try {
592
+ while (true) {
593
+ if (signal?.aborted) {
594
+ throw new Error("Request was aborted");
595
+ }
596
+ const { done, value } = await reader.read();
597
+ if (signal?.aborted) {
598
+ throw new Error("Request was aborted");
599
+ }
600
+ if (done)
601
+ break;
602
+ buffer += decoder.decode(value, { stream: true });
603
+ let idx = buffer.indexOf("\n\n");
604
+ while (idx !== -1) {
605
+ const chunk = buffer.slice(0, idx);
606
+ buffer = buffer.slice(idx + 2);
607
+ const dataLines = chunk
608
+ .split("\n")
609
+ .filter((l) => l.startsWith("data:"))
610
+ .map((l) => l.slice(5).trim());
611
+ if (dataLines.length > 0) {
612
+ const data = dataLines.join("\n").trim();
613
+ if (data && data !== "[DONE]") {
614
+ try {
615
+ yield JSON.parse(data);
616
+ }
617
+ catch (cause) {
618
+ throw new CodexProtocolError(`Invalid Codex SSE JSON: ${formatThrownValue(cause)}`, {
619
+ cause,
620
+ payload: data,
621
+ });
622
+ }
623
+ }
624
+ }
625
+ idx = buffer.indexOf("\n\n");
626
+ }
627
+ }
628
+ }
629
+ finally {
630
+ signal?.removeEventListener("abort", onAbort);
631
+ try {
632
+ await reader.cancel();
633
+ }
634
+ catch { }
635
+ try {
636
+ reader.releaseLock();
637
+ }
638
+ catch { }
639
+ }
640
+ }
641
+ // ============================================================================
642
+ // WebSocket Parsing
643
+ // ============================================================================
644
+ const OPENAI_BETA_RESPONSES_WEBSOCKETS = "responses_websockets=2026-02-06";
645
+ const SESSION_WEBSOCKET_CACHE_TTL_MS = 5 * 60 * 1000;
646
+ const SESSION_WEBSOCKET_MAX_AGE_MS = 55 * 60 * 1000;
647
+ const websocketSessionCache = new Map();
648
+ const websocketDebugStats = new Map();
649
+ const websocketSseFallbackSessions = new Set();
650
+ function getOrCreateWebSocketDebugStats(sessionId) {
651
+ let stats = websocketDebugStats.get(sessionId);
652
+ if (!stats) {
653
+ stats = {
654
+ requests: 0,
655
+ connectionsCreated: 0,
656
+ connectionsReused: 0,
657
+ cachedContextRequests: 0,
658
+ storeTrueRequests: 0,
659
+ fullContextRequests: 0,
660
+ deltaRequests: 0,
661
+ lastInputItems: 0,
662
+ websocketFailures: 0,
663
+ sseFallbacks: 0,
664
+ };
665
+ websocketDebugStats.set(sessionId, stats);
666
+ }
667
+ return stats;
668
+ }
669
+ export function getOpenAICodexWebSocketDebugStats(sessionId) {
670
+ const stats = websocketDebugStats.get(sessionId);
671
+ return stats ? { ...stats } : undefined;
672
+ }
673
+ export function resetOpenAICodexWebSocketDebugStats(sessionId) {
674
+ if (sessionId) {
675
+ websocketDebugStats.delete(sessionId);
676
+ websocketSseFallbackSessions.delete(sessionId);
677
+ return;
678
+ }
679
+ websocketDebugStats.clear();
680
+ websocketSseFallbackSessions.clear();
681
+ }
682
+ export function closeOpenAICodexWebSocketSessions(sessionId) {
683
+ const closeEntry = (entry) => {
684
+ if (entry.idleTimer)
685
+ clearTimeout(entry.idleTimer);
686
+ closeWebSocketSilently(entry.socket, 1000, "debug_close");
687
+ };
688
+ if (sessionId) {
689
+ const entry = websocketSessionCache.get(sessionId);
690
+ if (entry)
691
+ closeEntry(entry);
692
+ websocketSessionCache.delete(sessionId);
693
+ return;
694
+ }
695
+ for (const entry of websocketSessionCache.values()) {
696
+ closeEntry(entry);
697
+ }
698
+ websocketSessionCache.clear();
699
+ }
700
+ registerSessionResourceCleanup(closeOpenAICodexWebSocketSessions);
701
+ function isWebSocketSseFallbackActive(sessionId) {
702
+ return sessionId ? websocketSseFallbackSessions.has(sessionId) : false;
703
+ }
704
+ function recordWebSocketSseFallback(sessionId) {
705
+ if (!sessionId)
706
+ return;
707
+ const stats = getOrCreateWebSocketDebugStats(sessionId);
708
+ stats.sseFallbacks++;
709
+ stats.websocketFallbackActive = isWebSocketSseFallbackActive(sessionId);
710
+ }
711
+ function recordWebSocketFailure(sessionId, error) {
712
+ if (!sessionId)
713
+ return;
714
+ websocketSseFallbackSessions.add(sessionId);
715
+ const stats = getOrCreateWebSocketDebugStats(sessionId);
716
+ stats.websocketFailures++;
717
+ stats.lastWebSocketError = formatThrownValue(error);
718
+ stats.websocketFallbackActive = true;
719
+ }
720
+ let _cachedWebsocket = null;
721
+ async function getWebSocketConstructor(env) {
722
+ if (!env && _cachedWebsocket)
723
+ return _cachedWebsocket;
724
+ // bun doesn't respect http proxy envs, ref: https://github.com/oven-sh/bun/issues/15489
725
+ // TODO: remove this when bun supports proxy envs in websocket.
726
+ if (typeof process !== "undefined" && process.versions?.bun) {
727
+ const WebSocketWithProxy = class {
728
+ constructor(url, options) {
729
+ let _opts = {};
730
+ if (Array.isArray(options) || typeof options === "string") {
731
+ _opts = { protocols: options };
732
+ }
733
+ else {
734
+ _opts = { ...options };
735
+ }
736
+ const proxyUrl = resolveHttpProxyUrlForTarget(url.toString().replace(/^wss:/, "https:").replace(/^ws:/, "http:"), env);
737
+ this.socket = Reflect.construct(WebSocket, [
738
+ url,
739
+ { ..._opts, ...(proxyUrl ? { proxy: proxyUrl.toString() } : {}) },
740
+ ]);
741
+ }
742
+ close(code, reason) {
743
+ this.socket.close(code, reason);
744
+ }
745
+ send(data) {
746
+ this.socket.send(data);
747
+ }
748
+ addEventListener(type, listener) {
749
+ this.socket.addEventListener(type, listener);
750
+ }
751
+ removeEventListener(type, listener) {
752
+ this.socket.removeEventListener(type, listener);
753
+ }
754
+ };
755
+ if (!env) {
756
+ _cachedWebsocket = WebSocketWithProxy;
757
+ }
758
+ return WebSocketWithProxy;
759
+ }
760
+ const ctor = globalThis.WebSocket;
761
+ if (!isWebSocketConstructor(ctor))
762
+ return null;
763
+ return ctor;
764
+ }
765
+ function isWebSocketConstructor(value) {
766
+ return typeof value === "function";
767
+ }
768
+ class WebSocketCloseError extends Error {
769
+ constructor(message, options) {
770
+ super(message);
771
+ this.name = "WebSocketCloseError";
772
+ this.code = options?.code;
773
+ this.reason = options?.reason;
774
+ this.wasClean = options?.wasClean;
775
+ }
776
+ }
777
+ function getWebSocketReadyState(socket) {
778
+ const readyState = socket.readyState;
779
+ return typeof readyState === "number" ? readyState : undefined;
780
+ }
781
+ function isWebSocketReusable(socket) {
782
+ const readyState = getWebSocketReadyState(socket);
783
+ // If readyState is unavailable, assume the runtime keeps it open/reusable.
784
+ return readyState === undefined || readyState === 1;
785
+ }
786
+ function isWebSocketSessionExpired(entry) {
787
+ return Date.now() - entry.createdAt >= SESSION_WEBSOCKET_MAX_AGE_MS;
788
+ }
789
+ function closeWebSocketSilently(socket, code = 1000, reason = "done") {
790
+ try {
791
+ socket.close(code, reason);
792
+ }
793
+ catch { }
794
+ }
795
+ function scheduleSessionWebSocketExpiry(sessionId, entry) {
796
+ if (entry.idleTimer) {
797
+ clearTimeout(entry.idleTimer);
798
+ }
799
+ entry.idleTimer = setTimeout(() => {
800
+ if (entry.busy)
801
+ return;
802
+ closeWebSocketSilently(entry.socket, 1000, "idle_timeout");
803
+ websocketSessionCache.delete(sessionId);
804
+ }, SESSION_WEBSOCKET_CACHE_TTL_MS);
805
+ }
806
+ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS, env) {
807
+ const WebSocketCtor = await getWebSocketConstructor(env);
808
+ if (!WebSocketCtor) {
809
+ throw new Error("WebSocket transport is not available in this runtime");
810
+ }
811
+ const wsHeaders = headersToRecord(headers);
812
+ delete wsHeaders["OpenAI-Beta"];
813
+ return new Promise((resolve, reject) => {
814
+ let settled = false;
815
+ let timeout;
816
+ let socket;
817
+ try {
818
+ socket = new WebSocketCtor(url, { headers: wsHeaders });
819
+ }
820
+ catch (error) {
821
+ reject(error instanceof Error ? error : new Error(String(error)));
822
+ return;
823
+ }
824
+ const cleanup = () => {
825
+ if (timeout) {
826
+ clearTimeout(timeout);
827
+ timeout = undefined;
828
+ }
829
+ socket.removeEventListener("open", onOpen);
830
+ socket.removeEventListener("error", onError);
831
+ socket.removeEventListener("close", onClose);
832
+ signal?.removeEventListener("abort", onAbort);
833
+ };
834
+ const fail = (error, closeReason) => {
835
+ if (settled)
836
+ return;
837
+ settled = true;
838
+ cleanup();
839
+ if (closeReason) {
840
+ closeWebSocketSilently(socket, 1000, closeReason);
841
+ }
842
+ reject(error);
843
+ };
844
+ const onOpen = () => {
845
+ if (settled)
846
+ return;
847
+ settled = true;
848
+ cleanup();
849
+ resolve(socket);
850
+ };
851
+ const onError = (event) => {
852
+ fail(extractWebSocketError(event));
853
+ };
854
+ const onClose = (event) => {
855
+ fail(extractWebSocketCloseError(event));
856
+ };
857
+ const onAbort = () => {
858
+ fail(new Error("Request was aborted"), "aborted");
859
+ };
860
+ socket.addEventListener("open", onOpen);
861
+ socket.addEventListener("error", onError);
862
+ socket.addEventListener("close", onClose);
863
+ signal?.addEventListener("abort", onAbort);
864
+ if (connectTimeoutMs > 0) {
865
+ timeout = setTimeout(() => {
866
+ fail(new Error(`WebSocket connect timeout after ${connectTimeoutMs}ms`), "connect_timeout");
867
+ }, connectTimeoutMs);
868
+ }
869
+ if (signal?.aborted) {
870
+ onAbort();
871
+ }
872
+ });
873
+ }
874
+ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutMs, env) {
875
+ if (!sessionId) {
876
+ const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
877
+ return {
878
+ socket,
879
+ reused: false,
880
+ release: () => closeWebSocketSilently(socket),
881
+ };
882
+ }
883
+ const cached = websocketSessionCache.get(sessionId);
884
+ if (cached) {
885
+ if (cached.idleTimer) {
886
+ clearTimeout(cached.idleTimer);
887
+ cached.idleTimer = undefined;
888
+ }
889
+ if (!cached.busy && isWebSocketSessionExpired(cached)) {
890
+ closeWebSocketSilently(cached.socket, 1000, "connection_age_limit");
891
+ websocketSessionCache.delete(sessionId);
892
+ }
893
+ else if (!cached.busy && isWebSocketReusable(cached.socket)) {
894
+ cached.busy = true;
895
+ return {
896
+ socket: cached.socket,
897
+ entry: cached,
898
+ reused: true,
899
+ release: ({ keep } = {}) => {
900
+ if (!keep || !isWebSocketReusable(cached.socket)) {
901
+ closeWebSocketSilently(cached.socket);
902
+ websocketSessionCache.delete(sessionId);
903
+ return;
904
+ }
905
+ cached.busy = false;
906
+ scheduleSessionWebSocketExpiry(sessionId, cached);
907
+ },
908
+ };
909
+ }
910
+ if (cached.busy) {
911
+ const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
912
+ return {
913
+ socket,
914
+ reused: false,
915
+ release: () => {
916
+ closeWebSocketSilently(socket);
917
+ },
918
+ };
919
+ }
920
+ if (!isWebSocketReusable(cached.socket)) {
921
+ closeWebSocketSilently(cached.socket);
922
+ websocketSessionCache.delete(sessionId);
923
+ }
924
+ }
925
+ const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
926
+ const entry = { socket, busy: true, createdAt: Date.now() };
927
+ websocketSessionCache.set(sessionId, entry);
928
+ return {
929
+ socket,
930
+ entry,
931
+ reused: false,
932
+ release: ({ keep } = {}) => {
933
+ if (!keep || !isWebSocketReusable(entry.socket)) {
934
+ closeWebSocketSilently(entry.socket);
935
+ if (entry.idleTimer)
936
+ clearTimeout(entry.idleTimer);
937
+ if (websocketSessionCache.get(sessionId) === entry) {
938
+ websocketSessionCache.delete(sessionId);
939
+ }
940
+ return;
941
+ }
942
+ entry.busy = false;
943
+ scheduleSessionWebSocketExpiry(sessionId, entry);
944
+ },
945
+ };
946
+ }
947
+ function extractWebSocketError(event) {
948
+ if (event && typeof event === "object") {
949
+ const message = "message" in event ? event.message : undefined;
950
+ if (typeof message === "string" && message.length > 0) {
951
+ return new Error(message);
952
+ }
953
+ const nestedError = "error" in event ? event.error : undefined;
954
+ if (nestedError instanceof Error && nestedError.message.length > 0) {
955
+ return nestedError;
956
+ }
957
+ if (nestedError && typeof nestedError === "object" && "message" in nestedError) {
958
+ const nestedMessage = nestedError.message;
959
+ if (typeof nestedMessage === "string" && nestedMessage.length > 0) {
960
+ return new Error(nestedMessage);
961
+ }
962
+ }
963
+ }
964
+ return new Error("WebSocket error");
965
+ }
966
+ function extractWebSocketCloseError(event) {
967
+ if (event && typeof event === "object") {
968
+ const code = "code" in event ? event.code : undefined;
969
+ const reason = "reason" in event ? event.reason : undefined;
970
+ const wasClean = "wasClean" in event ? event.wasClean : undefined;
971
+ const codeText = typeof code === "number" ? ` ${code}` : "";
972
+ let reasonText = typeof reason === "string" && reason.length > 0 ? ` ${reason}` : "";
973
+ if (!reasonText && code === WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE) {
974
+ reasonText = " message too big";
975
+ }
976
+ return new WebSocketCloseError(`WebSocket closed${codeText}${reasonText}`.trim(), {
977
+ code: typeof code === "number" ? code : undefined,
978
+ reason: typeof reason === "string" && reason.length > 0 ? reason : undefined,
979
+ wasClean: typeof wasClean === "boolean" ? wasClean : undefined,
980
+ });
981
+ }
982
+ return new Error("WebSocket closed");
983
+ }
984
+ async function decodeWebSocketData(data) {
985
+ if (typeof data === "string")
986
+ return data;
987
+ if (data instanceof ArrayBuffer) {
988
+ return new TextDecoder().decode(new Uint8Array(data));
989
+ }
990
+ if (ArrayBuffer.isView(data)) {
991
+ const view = data;
992
+ return new TextDecoder().decode(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
993
+ }
994
+ if (data && typeof data === "object" && "arrayBuffer" in data) {
995
+ const blobLike = data;
996
+ const arrayBuffer = await blobLike.arrayBuffer();
997
+ return new TextDecoder().decode(new Uint8Array(arrayBuffer));
998
+ }
999
+ return null;
1000
+ }
1001
+ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
1002
+ const queue = [];
1003
+ let pending = null;
1004
+ let done = false;
1005
+ let failed = null;
1006
+ let sawCompletion = false;
1007
+ const wake = () => {
1008
+ if (!pending)
1009
+ return;
1010
+ const resolve = pending;
1011
+ pending = null;
1012
+ resolve();
1013
+ };
1014
+ const onMessage = (event) => {
1015
+ void (async () => {
1016
+ let text = null;
1017
+ try {
1018
+ if (!event || typeof event !== "object" || !("data" in event))
1019
+ return;
1020
+ text = await decodeWebSocketData(event.data);
1021
+ if (!text)
1022
+ return;
1023
+ const parsed = JSON.parse(text);
1024
+ const type = typeof parsed.type === "string" ? parsed.type : "";
1025
+ if (type === "response.completed" || type === "response.done" || type === "response.incomplete") {
1026
+ sawCompletion = true;
1027
+ done = true;
1028
+ }
1029
+ queue.push(parsed);
1030
+ wake();
1031
+ }
1032
+ catch (cause) {
1033
+ failed = new CodexProtocolError(`Invalid Codex WebSocket JSON: ${formatThrownValue(cause)}`, {
1034
+ cause,
1035
+ payload: text,
1036
+ });
1037
+ done = true;
1038
+ wake();
1039
+ }
1040
+ })();
1041
+ };
1042
+ const onError = (event) => {
1043
+ failed = extractWebSocketError(event);
1044
+ done = true;
1045
+ wake();
1046
+ };
1047
+ const onClose = (event) => {
1048
+ if (sawCompletion) {
1049
+ done = true;
1050
+ wake();
1051
+ return;
1052
+ }
1053
+ if (!failed) {
1054
+ failed = extractWebSocketCloseError(event);
1055
+ }
1056
+ done = true;
1057
+ wake();
1058
+ };
1059
+ const onAbort = () => {
1060
+ failed = new Error("Request was aborted");
1061
+ done = true;
1062
+ wake();
1063
+ };
1064
+ socket.addEventListener("message", onMessage);
1065
+ socket.addEventListener("error", onError);
1066
+ socket.addEventListener("close", onClose);
1067
+ signal?.addEventListener("abort", onAbort);
1068
+ try {
1069
+ while (true) {
1070
+ if (signal?.aborted) {
1071
+ throw new Error("Request was aborted");
1072
+ }
1073
+ if (queue.length > 0) {
1074
+ yield queue.shift();
1075
+ continue;
1076
+ }
1077
+ if (done)
1078
+ break;
1079
+ let timeout;
1080
+ await new Promise((resolve, reject) => {
1081
+ pending = resolve;
1082
+ if (idleTimeoutMs !== undefined && idleTimeoutMs > 0) {
1083
+ timeout = setTimeout(() => {
1084
+ const error = new Error(`WebSocket idle timeout after ${idleTimeoutMs}ms`);
1085
+ failed = error;
1086
+ done = true;
1087
+ pending = null;
1088
+ closeWebSocketSilently(socket, 1000, "idle_timeout");
1089
+ reject(error);
1090
+ }, idleTimeoutMs);
1091
+ }
1092
+ }).finally(() => {
1093
+ if (timeout) {
1094
+ clearTimeout(timeout);
1095
+ }
1096
+ });
1097
+ }
1098
+ if (failed) {
1099
+ throw failed;
1100
+ }
1101
+ if (!sawCompletion) {
1102
+ throw new Error("WebSocket stream closed before response.completed");
1103
+ }
1104
+ }
1105
+ finally {
1106
+ socket.removeEventListener("message", onMessage);
1107
+ socket.removeEventListener("error", onError);
1108
+ socket.removeEventListener("close", onClose);
1109
+ signal?.removeEventListener("abort", onAbort);
1110
+ }
1111
+ }
1112
+ function requestBodyWithoutInput(body) {
1113
+ const { input: _input, previous_response_id: _previousResponseId, ...rest } = body;
1114
+ return rest;
1115
+ }
1116
+ function responseInputsEqual(a, b) {
1117
+ return JSON.stringify(a ?? []) === JSON.stringify(b ?? []);
1118
+ }
1119
+ function requestBodiesMatchExceptInput(a, b) {
1120
+ return JSON.stringify(requestBodyWithoutInput(a)) === JSON.stringify(requestBodyWithoutInput(b));
1121
+ }
1122
+ function getCachedWebSocketInputDelta(body, continuation) {
1123
+ if (!requestBodiesMatchExceptInput(body, continuation.lastRequestBody)) {
1124
+ return undefined;
1125
+ }
1126
+ const currentInput = body.input ?? [];
1127
+ const baseline = [...(continuation.lastRequestBody.input ?? []), ...continuation.lastResponseItems];
1128
+ if (currentInput.length < baseline.length) {
1129
+ return undefined;
1130
+ }
1131
+ const prefix = currentInput.slice(0, baseline.length);
1132
+ if (!responseInputsEqual(prefix, baseline)) {
1133
+ return undefined;
1134
+ }
1135
+ return currentInput.slice(baseline.length);
1136
+ }
1137
+ function buildCachedWebSocketRequestBody(entry, body) {
1138
+ const continuation = entry.continuation;
1139
+ if (!continuation) {
1140
+ return body;
1141
+ }
1142
+ const delta = getCachedWebSocketInputDelta(body, continuation);
1143
+ if (!delta || !continuation.lastResponseId) {
1144
+ entry.continuation = undefined;
1145
+ return body;
1146
+ }
1147
+ return {
1148
+ ...body,
1149
+ previous_response_id: continuation.lastResponseId,
1150
+ input: delta,
1151
+ };
1152
+ }
1153
+ function recordWebSocketRequestStats(stats, requestBody, reused, useCachedContext) {
1154
+ if (!stats)
1155
+ return;
1156
+ stats.requests++;
1157
+ if (reused)
1158
+ stats.connectionsReused++;
1159
+ else
1160
+ stats.connectionsCreated++;
1161
+ if (useCachedContext)
1162
+ stats.cachedContextRequests++;
1163
+ if (requestBody.store === true)
1164
+ stats.storeTrueRequests++;
1165
+ stats.lastInputItems = requestBody.input?.length ?? 0;
1166
+ if (requestBody.previous_response_id) {
1167
+ stats.deltaRequests++;
1168
+ stats.lastDeltaInputItems = requestBody.input?.length ?? 0;
1169
+ stats.lastPreviousResponseId = requestBody.previous_response_id;
1170
+ }
1171
+ else {
1172
+ stats.fullContextRequests++;
1173
+ stats.lastDeltaInputItems = undefined;
1174
+ stats.lastPreviousResponseId = undefined;
1175
+ }
1176
+ }
1177
+ async function* startWebSocketOutputOnFirstEvent(events, onStart) {
1178
+ let started = false;
1179
+ for await (const event of events) {
1180
+ if (!started) {
1181
+ started = true;
1182
+ onStart();
1183
+ }
1184
+ yield event;
1185
+ }
1186
+ }
1187
+ async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, grammarToolInputProperties, options) {
1188
+ const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, options?.signal, websocketConnectTimeoutMs, options?.env);
1189
+ let keepConnection = true;
1190
+ const useCachedContext = options?.transport === "websocket-cached" || options?.transport === "auto";
1191
+ // ChatGPT Codex Responses rejects `store: true` ("Store must be set to false").
1192
+ // WebSocket continuation still works via connection-scoped previous_response_id state.
1193
+ const fullBody = body;
1194
+ let requestBody = useCachedContext && entry ? buildCachedWebSocketRequestBody(entry, fullBody) : fullBody;
1195
+ const stats = cacheSessionId ? getOrCreateWebSocketDebugStats(cacheSessionId) : undefined;
1196
+ let recoveredStalePreviousResponse = false;
1197
+ try {
1198
+ while (true) {
1199
+ recordWebSocketRequestStats(stats, requestBody, reused && !recoveredStalePreviousResponse, useCachedContext);
1200
+ try {
1201
+ socket.send(JSON.stringify({ type: "response.create", ...requestBody }));
1202
+ await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket, options?.signal, idleTimeoutMs)), onStart), output, stream, model, {
1203
+ serviceTier: options?.serviceTier,
1204
+ grammarToolInputProperties,
1205
+ resolveServiceTier: resolveCodexServiceTier,
1206
+ applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),
1207
+ });
1208
+ break;
1209
+ }
1210
+ catch (error) {
1211
+ if (!recoveredStalePreviousResponse &&
1212
+ entry &&
1213
+ requestBody.previous_response_id &&
1214
+ isCodexPreviousResponseStale(error) &&
1215
+ !options?.signal?.aborted) {
1216
+ entry.continuation = undefined;
1217
+ requestBody = fullBody;
1218
+ recoveredStalePreviousResponse = true;
1219
+ continue;
1220
+ }
1221
+ throw error;
1222
+ }
1223
+ }
1224
+ if (options?.signal?.aborted) {
1225
+ keepConnection = false;
1226
+ }
1227
+ else if (useCachedContext && entry && output.responseId) {
1228
+ const responseItems = convertResponsesMessages(model, { messages: [output] }, CODEX_TOOL_CALL_PROVIDERS, {
1229
+ includeSystemPrompt: false,
1230
+ grammarToolInputProperties,
1231
+ }).filter((item) => item.type !== "function_call_output" && item.type !== "custom_tool_call_output");
1232
+ entry.continuation = {
1233
+ lastRequestBody: fullBody,
1234
+ lastResponseId: output.responseId,
1235
+ lastResponseItems: responseItems,
1236
+ };
1237
+ }
1238
+ }
1239
+ catch (error) {
1240
+ if (entry) {
1241
+ entry.continuation = undefined;
1242
+ }
1243
+ keepConnection = false;
1244
+ throw error;
1245
+ }
1246
+ finally {
1247
+ release({ keep: keepConnection });
1248
+ }
1249
+ }
1250
+ // ============================================================================
1251
+ // Error Handling
1252
+ // ============================================================================
1253
+ async function parseErrorResponse(response) {
1254
+ const raw = await response.text();
1255
+ let message = raw || response.statusText || "Request failed";
1256
+ let friendlyMessage;
1257
+ try {
1258
+ const parsed = JSON.parse(raw);
1259
+ const err = parsed?.error;
1260
+ if (err) {
1261
+ const code = err.code || err.type || "";
1262
+ if (/usage_limit_reached|usage_not_included|rate_limit_exceeded/i.test(code) || response.status === 429) {
1263
+ const plan = err.plan_type ? ` (${err.plan_type.toLowerCase()} plan)` : "";
1264
+ const mins = err.resets_at
1265
+ ? Math.max(0, Math.round((err.resets_at * 1000 - Date.now()) / 60000))
1266
+ : undefined;
1267
+ const when = mins !== undefined ? ` Try again in ~${mins} min.` : "";
1268
+ friendlyMessage = `You have hit your ChatGPT usage limit${plan}.${when}`.trim();
1269
+ }
1270
+ message = err.message || friendlyMessage || message;
1271
+ }
1272
+ }
1273
+ catch { }
1274
+ return { message, friendlyMessage };
1275
+ }
1276
+ // ============================================================================
1277
+ // Auth & Headers
1278
+ // ============================================================================
1279
+ function extractAccountId(token) {
1280
+ return extractOpenAiCodexAccountId(token);
1281
+ }
1282
+ function buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token) {
1283
+ const headers = new Headers(initHeaders);
1284
+ for (const [key, value] of Object.entries(additionalHeaders || {})) {
1285
+ if (value === null) {
1286
+ headers.delete(key);
1287
+ }
1288
+ else {
1289
+ headers.set(key, value);
1290
+ }
1291
+ }
1292
+ headers.set("Authorization", `Bearer ${token}`);
1293
+ if (accountId) {
1294
+ headers.set("chatgpt-account-id", accountId);
1295
+ }
1296
+ else {
1297
+ headers.delete("chatgpt-account-id");
1298
+ }
1299
+ headers.set("originator", "senpi");
1300
+ const userAgent = _os ? `senpi (${_os.platform()} ${_os.release()}; ${_os.arch()})` : "senpi (browser)";
1301
+ headers.set("User-Agent", userAgent);
1302
+ return headers;
1303
+ }
1304
+ function buildSSEHeaders(initHeaders, additionalHeaders, accountId, token, sessionId) {
1305
+ const headers = buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token);
1306
+ headers.set("OpenAI-Beta", "responses=experimental");
1307
+ headers.set("accept", "text/event-stream");
1308
+ headers.set("content-type", "application/json");
1309
+ if (sessionId) {
1310
+ headers.set("session-id", sessionId);
1311
+ headers.set("x-client-request-id", sessionId);
1312
+ }
1313
+ return headers;
1314
+ }
1315
+ function buildWebSocketHeaders(initHeaders, additionalHeaders, accountId, token, requestId) {
1316
+ const headers = buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token);
1317
+ headers.delete("accept");
1318
+ headers.delete("content-type");
1319
+ headers.delete("OpenAI-Beta");
1320
+ headers.delete("openai-beta");
1321
+ headers.set("OpenAI-Beta", OPENAI_BETA_RESPONSES_WEBSOCKETS);
1322
+ headers.set("x-client-request-id", requestId);
1323
+ headers.set("session-id", requestId);
1324
+ return headers;
1325
+ }
1326
+ //# sourceMappingURL=openai-codex-responses.js.map