@copilotkit/aimock 1.45.1 → 1.47.0

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 (492) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -1
  4. package/README.md +11 -2
  5. package/dist/agui-mock.cjs +25 -25
  6. package/dist/agui-mock.cjs.map +1 -1
  7. package/dist/agui-mock.d.cts.map +1 -1
  8. package/dist/agui-mock.d.ts.map +1 -1
  9. package/dist/agui-mock.js +25 -25
  10. package/dist/agui-mock.js.map +1 -1
  11. package/dist/agui-types.d.cts.map +1 -1
  12. package/dist/aimock-cli.cjs +15 -1
  13. package/dist/aimock-cli.cjs.map +1 -1
  14. package/dist/aimock-cli.d.cts.map +1 -1
  15. package/dist/aimock-cli.d.ts.map +1 -1
  16. package/dist/aimock-cli.js +16 -2
  17. package/dist/aimock-cli.js.map +1 -1
  18. package/dist/api-key-auth.cjs +10 -9
  19. package/dist/api-key-auth.cjs.map +1 -1
  20. package/dist/api-key-auth.d.cts.map +1 -1
  21. package/dist/api-key-auth.d.ts.map +1 -1
  22. package/dist/api-key-auth.js +11 -10
  23. package/dist/api-key-auth.js.map +1 -1
  24. package/dist/aws-event-stream.cjs +20 -23
  25. package/dist/aws-event-stream.cjs.map +1 -1
  26. package/dist/aws-event-stream.d.cts +0 -1
  27. package/dist/aws-event-stream.d.ts +0 -1
  28. package/dist/aws-event-stream.js +20 -24
  29. package/dist/aws-event-stream.js.map +1 -1
  30. package/dist/batches.cjs +2 -4
  31. package/dist/batches.cjs.map +1 -1
  32. package/dist/batches.d.cts.map +1 -1
  33. package/dist/batches.d.ts.map +1 -1
  34. package/dist/batches.js +2 -4
  35. package/dist/batches.js.map +1 -1
  36. package/dist/bedrock-converse.cjs +139 -161
  37. package/dist/bedrock-converse.cjs.map +1 -1
  38. package/dist/bedrock-converse.d.cts.map +1 -1
  39. package/dist/bedrock-converse.d.ts.map +1 -1
  40. package/dist/bedrock-converse.js +137 -159
  41. package/dist/bedrock-converse.js.map +1 -1
  42. package/dist/bedrock.cjs +175 -216
  43. package/dist/bedrock.cjs.map +1 -1
  44. package/dist/bedrock.d.cts.map +1 -1
  45. package/dist/bedrock.d.ts.map +1 -1
  46. package/dist/bedrock.js +172 -213
  47. package/dist/bedrock.js.map +1 -1
  48. package/dist/byteplus-video.cjs +11 -10
  49. package/dist/byteplus-video.cjs.map +1 -1
  50. package/dist/byteplus-video.d.cts.map +1 -1
  51. package/dist/byteplus-video.d.ts.map +1 -1
  52. package/dist/byteplus-video.js +5 -4
  53. package/dist/byteplus-video.js.map +1 -1
  54. package/dist/chaos.cjs +5 -4
  55. package/dist/chaos.cjs.map +1 -1
  56. package/dist/chaos.d.cts.map +1 -1
  57. package/dist/chaos.d.ts.map +1 -1
  58. package/dist/chaos.js +5 -4
  59. package/dist/chaos.js.map +1 -1
  60. package/dist/cli.cjs +15 -0
  61. package/dist/cli.cjs.map +1 -1
  62. package/dist/cli.js +15 -0
  63. package/dist/cli.js.map +1 -1
  64. package/dist/cohere.cjs +107 -180
  65. package/dist/cohere.cjs.map +1 -1
  66. package/dist/cohere.d.cts.map +1 -1
  67. package/dist/cohere.d.ts.map +1 -1
  68. package/dist/cohere.js +106 -179
  69. package/dist/cohere.js.map +1 -1
  70. package/dist/config-loader.cjs +29 -1
  71. package/dist/config-loader.cjs.map +1 -1
  72. package/dist/config-loader.d.cts +7 -1
  73. package/dist/config-loader.d.cts.map +1 -1
  74. package/dist/config-loader.d.ts +7 -1
  75. package/dist/config-loader.d.ts.map +1 -1
  76. package/dist/config-loader.js +29 -2
  77. package/dist/config-loader.js.map +1 -1
  78. package/dist/count-tokens.cjs +146 -0
  79. package/dist/count-tokens.cjs.map +1 -0
  80. package/dist/count-tokens.js +146 -0
  81. package/dist/count-tokens.js.map +1 -0
  82. package/dist/elevenlabs-audio.cjs +36 -34
  83. package/dist/elevenlabs-audio.cjs.map +1 -1
  84. package/dist/elevenlabs-audio.d.cts.map +1 -1
  85. package/dist/elevenlabs-audio.d.ts.map +1 -1
  86. package/dist/elevenlabs-audio.js +33 -31
  87. package/dist/elevenlabs-audio.js.map +1 -1
  88. package/dist/elevenlabs-voice.cjs +38 -37
  89. package/dist/elevenlabs-voice.cjs.map +1 -1
  90. package/dist/elevenlabs-voice.d.cts.map +1 -1
  91. package/dist/elevenlabs-voice.d.ts.map +1 -1
  92. package/dist/elevenlabs-voice.js +33 -32
  93. package/dist/elevenlabs-voice.js.map +1 -1
  94. package/dist/embedding-request.cjs +16 -0
  95. package/dist/embedding-request.cjs.map +1 -0
  96. package/dist/embedding-request.js +14 -0
  97. package/dist/embedding-request.js.map +1 -0
  98. package/dist/embeddings.cjs +30 -20
  99. package/dist/embeddings.cjs.map +1 -1
  100. package/dist/embeddings.d.cts.map +1 -1
  101. package/dist/embeddings.d.ts.map +1 -1
  102. package/dist/embeddings.js +30 -20
  103. package/dist/embeddings.js.map +1 -1
  104. package/dist/fal-audio.cjs +45 -43
  105. package/dist/fal-audio.cjs.map +1 -1
  106. package/dist/fal-audio.d.cts.map +1 -1
  107. package/dist/fal-audio.d.ts.map +1 -1
  108. package/dist/fal-audio.js +42 -40
  109. package/dist/fal-audio.js.map +1 -1
  110. package/dist/fal.cjs +17 -15
  111. package/dist/fal.cjs.map +1 -1
  112. package/dist/fal.js +16 -14
  113. package/dist/fal.js.map +1 -1
  114. package/dist/files.cjs +2 -4
  115. package/dist/files.cjs.map +1 -1
  116. package/dist/files.d.cts.map +1 -1
  117. package/dist/files.d.ts.map +1 -1
  118. package/dist/files.js +2 -4
  119. package/dist/files.js.map +1 -1
  120. package/dist/fine-tuning.cjs +2 -4
  121. package/dist/fine-tuning.cjs.map +1 -1
  122. package/dist/fine-tuning.d.cts.map +1 -1
  123. package/dist/fine-tuning.d.ts.map +1 -1
  124. package/dist/fine-tuning.js +2 -4
  125. package/dist/fine-tuning.js.map +1 -1
  126. package/dist/fixture-loader.cjs +140 -44
  127. package/dist/fixture-loader.cjs.map +1 -1
  128. package/dist/fixture-loader.d.cts.map +1 -1
  129. package/dist/fixture-loader.d.ts.map +1 -1
  130. package/dist/fixture-loader.js +141 -46
  131. package/dist/fixture-loader.js.map +1 -1
  132. package/dist/gemini-embeddings.cjs +26 -24
  133. package/dist/gemini-embeddings.cjs.map +1 -1
  134. package/dist/gemini-embeddings.js +26 -24
  135. package/dist/gemini-embeddings.js.map +1 -1
  136. package/dist/gemini-interactions.cjs +113 -156
  137. package/dist/gemini-interactions.cjs.map +1 -1
  138. package/dist/gemini-interactions.d.cts +0 -1
  139. package/dist/gemini-interactions.d.cts.map +1 -1
  140. package/dist/gemini-interactions.d.ts +0 -1
  141. package/dist/gemini-interactions.d.ts.map +1 -1
  142. package/dist/gemini-interactions.js +113 -156
  143. package/dist/gemini-interactions.js.map +1 -1
  144. package/dist/gemini.cjs +295 -218
  145. package/dist/gemini.cjs.map +1 -1
  146. package/dist/gemini.d.cts.map +1 -1
  147. package/dist/gemini.d.ts.map +1 -1
  148. package/dist/gemini.js +295 -219
  149. package/dist/gemini.js.map +1 -1
  150. package/dist/grok-video.cjs +14 -12
  151. package/dist/grok-video.cjs.map +1 -1
  152. package/dist/grok-video.d.cts.map +1 -1
  153. package/dist/grok-video.d.ts.map +1 -1
  154. package/dist/grok-video.js +8 -6
  155. package/dist/grok-video.js.map +1 -1
  156. package/dist/helpers.cjs +411 -75
  157. package/dist/helpers.cjs.map +1 -1
  158. package/dist/helpers.d.cts +51 -1
  159. package/dist/helpers.d.cts.map +1 -1
  160. package/dist/helpers.d.ts +51 -1
  161. package/dist/helpers.d.ts.map +1 -1
  162. package/dist/helpers.js +402 -74
  163. package/dist/helpers.js.map +1 -1
  164. package/dist/images.cjs +30 -28
  165. package/dist/images.cjs.map +1 -1
  166. package/dist/images.d.cts.map +1 -1
  167. package/dist/images.d.ts.map +1 -1
  168. package/dist/images.js +27 -25
  169. package/dist/images.js.map +1 -1
  170. package/dist/index.cjs +4 -2
  171. package/dist/index.d.cts +4 -4
  172. package/dist/index.d.ts +4 -4
  173. package/dist/index.js +4 -4
  174. package/dist/journal.cjs +3 -1
  175. package/dist/journal.cjs.map +1 -1
  176. package/dist/journal.d.cts.map +1 -1
  177. package/dist/journal.d.ts.map +1 -1
  178. package/dist/journal.js +2 -1
  179. package/dist/journal.js.map +1 -1
  180. package/dist/llmock.cjs +3 -0
  181. package/dist/llmock.cjs.map +1 -1
  182. package/dist/llmock.d.cts.map +1 -1
  183. package/dist/llmock.d.ts.map +1 -1
  184. package/dist/llmock.js +3 -0
  185. package/dist/llmock.js.map +1 -1
  186. package/dist/mcp-fakes.d.cts.map +1 -1
  187. package/dist/mcp-handler.cjs +7 -3
  188. package/dist/mcp-handler.cjs.map +1 -1
  189. package/dist/mcp-handler.js +7 -3
  190. package/dist/mcp-handler.js.map +1 -1
  191. package/dist/mcp-recorder.cjs +2 -1
  192. package/dist/mcp-recorder.cjs.map +1 -1
  193. package/dist/mcp-recorder.js +3 -2
  194. package/dist/mcp-recorder.js.map +1 -1
  195. package/dist/messages.cjs +235 -202
  196. package/dist/messages.cjs.map +1 -1
  197. package/dist/messages.d.cts.map +1 -1
  198. package/dist/messages.d.ts.map +1 -1
  199. package/dist/messages.js +234 -202
  200. package/dist/messages.js.map +1 -1
  201. package/dist/metrics.cjs +5 -2
  202. package/dist/metrics.cjs.map +1 -1
  203. package/dist/metrics.d.cts.map +1 -1
  204. package/dist/metrics.d.ts.map +1 -1
  205. package/dist/metrics.js +6 -3
  206. package/dist/metrics.js.map +1 -1
  207. package/dist/misbehavior.cjs +62 -3
  208. package/dist/misbehavior.cjs.map +1 -1
  209. package/dist/misbehavior.d.cts.map +1 -1
  210. package/dist/misbehavior.d.ts.map +1 -1
  211. package/dist/misbehavior.js +63 -4
  212. package/dist/misbehavior.js.map +1 -1
  213. package/dist/model-utils.cjs +1 -0
  214. package/dist/model-utils.cjs.map +1 -1
  215. package/dist/model-utils.js +1 -1
  216. package/dist/model-utils.js.map +1 -1
  217. package/dist/moderation.cjs +15 -12
  218. package/dist/moderation.cjs.map +1 -1
  219. package/dist/moderation.js +14 -11
  220. package/dist/moderation.js.map +1 -1
  221. package/dist/ndjson-writer.cjs +21 -23
  222. package/dist/ndjson-writer.cjs.map +1 -1
  223. package/dist/ndjson-writer.d.cts +0 -1
  224. package/dist/ndjson-writer.d.cts.map +1 -1
  225. package/dist/ndjson-writer.d.ts +0 -1
  226. package/dist/ndjson-writer.d.ts.map +1 -1
  227. package/dist/ndjson-writer.js +21 -24
  228. package/dist/ndjson-writer.js.map +1 -1
  229. package/dist/ollama.cjs +276 -210
  230. package/dist/ollama.cjs.map +1 -1
  231. package/dist/ollama.d.cts.map +1 -1
  232. package/dist/ollama.d.ts.map +1 -1
  233. package/dist/ollama.js +273 -207
  234. package/dist/ollama.js.map +1 -1
  235. package/dist/openapi.cjs +323 -3
  236. package/dist/openapi.cjs.map +1 -1
  237. package/dist/openapi.d.cts.map +1 -1
  238. package/dist/openapi.d.ts.map +1 -1
  239. package/dist/openapi.js +324 -4
  240. package/dist/openapi.js.map +1 -1
  241. package/dist/openrouter-chat.cjs +11 -155
  242. package/dist/openrouter-chat.cjs.map +1 -1
  243. package/dist/openrouter-chat.js +11 -155
  244. package/dist/openrouter-chat.js.map +1 -1
  245. package/dist/openrouter-video.cjs +51 -74
  246. package/dist/openrouter-video.cjs.map +1 -1
  247. package/dist/openrouter-video.d.cts.map +1 -1
  248. package/dist/openrouter-video.d.ts.map +1 -1
  249. package/dist/openrouter-video.js +37 -60
  250. package/dist/openrouter-video.js.map +1 -1
  251. package/dist/raw-validation.cjs +177 -0
  252. package/dist/raw-validation.cjs.map +1 -0
  253. package/dist/raw-validation.js +176 -0
  254. package/dist/raw-validation.js.map +1 -0
  255. package/dist/recorder.cjs +176 -95
  256. package/dist/recorder.cjs.map +1 -1
  257. package/dist/recorder.d.cts.map +1 -1
  258. package/dist/recorder.d.ts.map +1 -1
  259. package/dist/recorder.js +176 -95
  260. package/dist/recorder.js.map +1 -1
  261. package/dist/rerank.cjs +13 -11
  262. package/dist/rerank.cjs.map +1 -1
  263. package/dist/rerank.js +12 -10
  264. package/dist/rerank.js.map +1 -1
  265. package/dist/response/catalog/anthropic-page.cjs +39 -0
  266. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  267. package/dist/response/catalog/anthropic-page.js +38 -0
  268. package/dist/response/catalog/anthropic-page.js.map +1 -0
  269. package/dist/response/catalog/collect.cjs +61 -0
  270. package/dist/response/catalog/collect.cjs.map +1 -0
  271. package/dist/response/catalog/collect.js +59 -0
  272. package/dist/response/catalog/collect.js.map +1 -0
  273. package/dist/response/catalog/gemini-page.cjs +25 -0
  274. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  275. package/dist/response/catalog/gemini-page.js +24 -0
  276. package/dist/response/catalog/gemini-page.js.map +1 -0
  277. package/dist/response/catalog/render.cjs +182 -0
  278. package/dist/response/catalog/render.cjs.map +1 -0
  279. package/dist/response/catalog/render.js +171 -0
  280. package/dist/response/catalog/render.js.map +1 -0
  281. package/dist/response/deliver.cjs +144 -0
  282. package/dist/response/deliver.cjs.map +1 -0
  283. package/dist/response/deliver.js +143 -0
  284. package/dist/response/deliver.js.map +1 -0
  285. package/dist/response/errors.cjs +225 -0
  286. package/dist/response/errors.cjs.map +1 -0
  287. package/dist/response/errors.js +224 -0
  288. package/dist/response/errors.js.map +1 -0
  289. package/dist/response/finish.cjs +39 -0
  290. package/dist/response/finish.cjs.map +1 -0
  291. package/dist/response/finish.js +35 -0
  292. package/dist/response/finish.js.map +1 -0
  293. package/dist/response/frame-loop.cjs +102 -0
  294. package/dist/response/frame-loop.cjs.map +1 -0
  295. package/dist/response/frame-loop.js +100 -0
  296. package/dist/response/frame-loop.js.map +1 -0
  297. package/dist/response/lifecycle.cjs +223 -0
  298. package/dist/response/lifecycle.cjs.map +1 -0
  299. package/dist/response/lifecycle.js +211 -0
  300. package/dist/response/lifecycle.js.map +1 -0
  301. package/dist/response/policy.cjs +126 -0
  302. package/dist/response/policy.cjs.map +1 -0
  303. package/dist/response/policy.js +120 -0
  304. package/dist/response/policy.js.map +1 -0
  305. package/dist/response/profiles.cjs +69 -0
  306. package/dist/response/profiles.cjs.map +1 -0
  307. package/dist/response/profiles.js +65 -0
  308. package/dist/response/profiles.js.map +1 -0
  309. package/dist/response/proxy.cjs +71 -0
  310. package/dist/response/proxy.cjs.map +1 -0
  311. package/dist/response/proxy.js +70 -0
  312. package/dist/response/proxy.js.map +1 -0
  313. package/dist/response/raw.cjs +228 -0
  314. package/dist/response/raw.cjs.map +1 -0
  315. package/dist/response/raw.js +227 -0
  316. package/dist/response/raw.js.map +1 -0
  317. package/dist/response/timing.cjs +157 -0
  318. package/dist/response/timing.cjs.map +1 -0
  319. package/dist/response/timing.js +150 -0
  320. package/dist/response/timing.js.map +1 -0
  321. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  322. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  323. package/dist/response/usage/codecs/anthropic.js +50 -0
  324. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  325. package/dist/response/usage/codecs/cohere.cjs +36 -0
  326. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  327. package/dist/response/usage/codecs/cohere.js +35 -0
  328. package/dist/response/usage/codecs/cohere.js.map +1 -0
  329. package/dist/response/usage/codecs/converse.cjs +16 -0
  330. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  331. package/dist/response/usage/codecs/converse.js +15 -0
  332. package/dist/response/usage/codecs/converse.js.map +1 -0
  333. package/dist/response/usage/codecs/gemini.cjs +31 -0
  334. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  335. package/dist/response/usage/codecs/gemini.js +31 -0
  336. package/dist/response/usage/codecs/gemini.js.map +1 -0
  337. package/dist/response/usage/codecs/interactions.cjs +22 -0
  338. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  339. package/dist/response/usage/codecs/interactions.js +21 -0
  340. package/dist/response/usage/codecs/interactions.js.map +1 -0
  341. package/dist/response/usage/codecs/ollama.cjs +17 -0
  342. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  343. package/dist/response/usage/codecs/ollama.js +17 -0
  344. package/dist/response/usage/codecs/ollama.js.map +1 -0
  345. package/dist/response/usage/codecs/openai.cjs +52 -0
  346. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  347. package/dist/response/usage/codecs/openai.js +50 -0
  348. package/dist/response/usage/codecs/openai.js.map +1 -0
  349. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  350. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  351. package/dist/response/usage/codecs/openrouter.js +67 -0
  352. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  353. package/dist/response/usage/codecs/realtime.cjs +19 -0
  354. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  355. package/dist/response/usage/codecs/realtime.js +18 -0
  356. package/dist/response/usage/codecs/realtime.js.map +1 -0
  357. package/dist/response/usage/codecs/responses.cjs +21 -0
  358. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  359. package/dist/response/usage/codecs/responses.js +20 -0
  360. package/dist/response/usage/codecs/responses.js.map +1 -0
  361. package/dist/response/usage/estimate.cjs +23 -0
  362. package/dist/response/usage/estimate.cjs.map +1 -0
  363. package/dist/response/usage/estimate.js +21 -0
  364. package/dist/response/usage/estimate.js.map +1 -0
  365. package/dist/response/usage/fields.cjs +72 -0
  366. package/dist/response/usage/fields.cjs.map +1 -0
  367. package/dist/response/usage/fields.js +70 -0
  368. package/dist/response/usage/fields.js.map +1 -0
  369. package/dist/response/usage/recording.cjs +52 -0
  370. package/dist/response/usage/recording.cjs.map +1 -0
  371. package/dist/response/usage/recording.js +52 -0
  372. package/dist/response/usage/recording.js.map +1 -0
  373. package/dist/responses.cjs +304 -196
  374. package/dist/responses.cjs.map +1 -1
  375. package/dist/responses.d.cts.map +1 -1
  376. package/dist/responses.d.ts.map +1 -1
  377. package/dist/responses.js +303 -195
  378. package/dist/responses.js.map +1 -1
  379. package/dist/route-registry.cjs +45 -0
  380. package/dist/route-registry.cjs.map +1 -1
  381. package/dist/route-registry.d.cts.map +1 -1
  382. package/dist/route-registry.d.ts.map +1 -1
  383. package/dist/route-registry.js +41 -1
  384. package/dist/route-registry.js.map +1 -1
  385. package/dist/router.cjs +24 -4
  386. package/dist/router.cjs.map +1 -1
  387. package/dist/router.d.cts +7 -1
  388. package/dist/router.d.cts.map +1 -1
  389. package/dist/router.d.ts +7 -1
  390. package/dist/router.d.ts.map +1 -1
  391. package/dist/router.js +24 -5
  392. package/dist/router.js.map +1 -1
  393. package/dist/search.cjs +13 -11
  394. package/dist/search.cjs.map +1 -1
  395. package/dist/search.js +12 -10
  396. package/dist/search.js.map +1 -1
  397. package/dist/server.cjs +293 -248
  398. package/dist/server.cjs.map +1 -1
  399. package/dist/server.d.cts.map +1 -1
  400. package/dist/server.d.ts.map +1 -1
  401. package/dist/server.js +294 -249
  402. package/dist/server.js.map +1 -1
  403. package/dist/speech.cjs +20 -18
  404. package/dist/speech.cjs.map +1 -1
  405. package/dist/speech.d.cts.map +1 -1
  406. package/dist/speech.d.ts.map +1 -1
  407. package/dist/speech.js +19 -17
  408. package/dist/speech.js.map +1 -1
  409. package/dist/sse-writer.cjs +56 -30
  410. package/dist/sse-writer.cjs.map +1 -1
  411. package/dist/sse-writer.d.cts +0 -1
  412. package/dist/sse-writer.d.cts.map +1 -1
  413. package/dist/sse-writer.d.ts +0 -1
  414. package/dist/sse-writer.d.ts.map +1 -1
  415. package/dist/sse-writer.js +55 -31
  416. package/dist/sse-writer.js.map +1 -1
  417. package/dist/stream-collapse.cjs +118 -11
  418. package/dist/stream-collapse.cjs.map +1 -1
  419. package/dist/stream-collapse.d.cts +10 -9
  420. package/dist/stream-collapse.d.cts.map +1 -1
  421. package/dist/stream-collapse.d.ts +10 -9
  422. package/dist/stream-collapse.d.ts.map +1 -1
  423. package/dist/stream-collapse.js +118 -11
  424. package/dist/stream-collapse.js.map +1 -1
  425. package/dist/transcription.cjs +31 -43
  426. package/dist/transcription.cjs.map +1 -1
  427. package/dist/transcription.d.cts.map +1 -1
  428. package/dist/transcription.d.ts.map +1 -1
  429. package/dist/transcription.js +31 -43
  430. package/dist/transcription.js.map +1 -1
  431. package/dist/types.cjs.map +1 -1
  432. package/dist/types.d.cts +231 -9
  433. package/dist/types.d.cts.map +1 -1
  434. package/dist/types.d.ts +231 -9
  435. package/dist/types.d.ts.map +1 -1
  436. package/dist/types.js.map +1 -1
  437. package/dist/vector-mock.cjs +3 -8
  438. package/dist/vector-mock.cjs.map +1 -1
  439. package/dist/vector-mock.d.cts.map +1 -1
  440. package/dist/vector-mock.d.ts.map +1 -1
  441. package/dist/vector-mock.js +3 -8
  442. package/dist/vector-mock.js.map +1 -1
  443. package/dist/vector-stores.cjs +2 -4
  444. package/dist/vector-stores.cjs.map +1 -1
  445. package/dist/vector-stores.d.cts.map +1 -1
  446. package/dist/vector-stores.d.ts.map +1 -1
  447. package/dist/vector-stores.js +2 -4
  448. package/dist/vector-stores.js.map +1 -1
  449. package/dist/veo-video.cjs +16 -14
  450. package/dist/veo-video.cjs.map +1 -1
  451. package/dist/veo-video.js +10 -8
  452. package/dist/veo-video.js.map +1 -1
  453. package/dist/video.cjs +21 -19
  454. package/dist/video.cjs.map +1 -1
  455. package/dist/video.d.cts.map +1 -1
  456. package/dist/video.d.ts.map +1 -1
  457. package/dist/video.js +20 -18
  458. package/dist/video.js.map +1 -1
  459. package/dist/ws-framing.cjs +12 -6
  460. package/dist/ws-framing.cjs.map +1 -1
  461. package/dist/ws-framing.d.cts +2 -0
  462. package/dist/ws-framing.d.cts.map +1 -1
  463. package/dist/ws-framing.d.ts +2 -0
  464. package/dist/ws-framing.d.ts.map +1 -1
  465. package/dist/ws-framing.js +12 -6
  466. package/dist/ws-framing.js.map +1 -1
  467. package/dist/ws-gemini-live.cjs +131 -96
  468. package/dist/ws-gemini-live.cjs.map +1 -1
  469. package/dist/ws-gemini-live.d.cts +0 -1
  470. package/dist/ws-gemini-live.d.cts.map +1 -1
  471. package/dist/ws-gemini-live.d.ts +0 -1
  472. package/dist/ws-gemini-live.d.ts.map +1 -1
  473. package/dist/ws-gemini-live.js +130 -95
  474. package/dist/ws-gemini-live.js.map +1 -1
  475. package/dist/ws-live.cjs +6 -5
  476. package/dist/ws-live.cjs.map +1 -1
  477. package/dist/ws-live.js +5 -4
  478. package/dist/ws-live.js.map +1 -1
  479. package/dist/ws-realtime.cjs +108 -124
  480. package/dist/ws-realtime.cjs.map +1 -1
  481. package/dist/ws-realtime.d.cts.map +1 -1
  482. package/dist/ws-realtime.d.ts.map +1 -1
  483. package/dist/ws-realtime.js +105 -121
  484. package/dist/ws-realtime.js.map +1 -1
  485. package/dist/ws-responses.cjs +80 -59
  486. package/dist/ws-responses.cjs.map +1 -1
  487. package/dist/ws-responses.d.cts.map +1 -1
  488. package/dist/ws-responses.d.ts.map +1 -1
  489. package/dist/ws-responses.js +79 -58
  490. package/dist/ws-responses.js.map +1 -1
  491. package/package.json +4 -1
  492. package/skills/write-fixtures/SKILL.md +57 -16
@@ -0,0 +1,143 @@
1
+ import { httpSink, runFrameLoop } from "./frame-loop.js";
2
+ import { delay } from "../sse-writer.js";
3
+ import { responseGoneReason } from "../chaos.js";
4
+ import { AIMOCK_DISCONNECTED, closedByClient, httpLifecycle, markInterrupted, noteDeliveryStart, requestSocket, statusLineSent, teardownReason } from "./lifecycle.js";
5
+ import { extendRecordedTimings, nonStreamingDelayMs, nonStreamingRecordedTimings, nonStreamingTimingEnabled } from "./timing.js";
6
+
7
+ //#region src/response/deliver.ts
8
+ /**
9
+ * Journal a delivery that ended early. The reason is always set: the
10
+ * lifecycle's first cause when it fired, else {@link teardownReason} for the
11
+ * response that is gone. When no byte of the response reached the socket
12
+ * ({@link statusLineSent}), the status is 0, the rule the server and the
13
+ * chaos `disconnect` apply to a torn socket. A fixture interruption
14
+ * (`disconnectAfterMs`, `truncateAfterChunks`) keeps the status it was
15
+ * journaled with, as base recorded it.
16
+ */
17
+ function journalTeardown(entry, res, lifecycle) {
18
+ markInterrupted(entry, lifecycle?.reason() ?? teardownReason(res));
19
+ if (lifecycle?.cause() !== "fixture" && !statusLineSent(res)) entry.response.status = 0;
20
+ }
21
+ /**
22
+ * Whether the response was torn down: the lifecycle fired, the response is
23
+ * destroyed or chaos disconnected it, or the client closed the socket.
24
+ */
25
+ function tornDown(res, lifecycle) {
26
+ const socket = requestSocket(res);
27
+ const gone = responseGoneReason(res);
28
+ return lifecycle?.reason() !== void 0 || gone === "client-gone" || gone === "chaos-disconnected" || !res.writableEnded && !!socket && closedByClient(socket);
29
+ }
30
+ /**
31
+ * Journal a response that something else on aimock's side already answered
32
+ * (head committed or body ended) as aimock's teardown, with the status the
33
+ * client actually got.
34
+ */
35
+ function journalAnsweredElsewhere(entry, res) {
36
+ markInterrupted(entry, AIMOCK_DISCONNECTED);
37
+ entry.response.status = statusLineSent(res) ? res.statusCode : 0;
38
+ }
39
+ /**
40
+ * Whether `deliverJson` can no longer write its reply, journaling why when it
41
+ * cannot. Torn down ({@link tornDown}): {@link journalTeardown}. Already
42
+ * answered by something else on aimock's side (head committed or body
43
+ * ended): writing again would throw `ERR_HTTP_HEADERS_SENT`, so it is
44
+ * journaled by {@link journalAnsweredElsewhere}, and a body that never ended
45
+ * is destroyed so the client does not hang.
46
+ */
47
+ function journalUnwritable(entry, res, lifecycle) {
48
+ if (tornDown(res, lifecycle)) {
49
+ journalTeardown(entry, res, lifecycle);
50
+ return true;
51
+ }
52
+ if (res.headersSent || res.writableEnded) {
53
+ journalAnsweredElsewhere(entry, res);
54
+ if (!res.writableEnded) res.destroy();
55
+ return true;
56
+ }
57
+ return false;
58
+ }
59
+ /**
60
+ * Deliver one streamed reply and journal how it ended. Builds the HTTP
61
+ * lifecycle (client close + fixture interruption) and runs the frame loop on
62
+ * it. When the loop stops early it destroys `res` (if it has not ended) and
63
+ * marks the entry with the first cause's reason (or, when no cause fired, who
64
+ * tore the response down). A response other code already answered (head
65
+ * committed before the stream, or body ended) is journaled as
66
+ * {@link deliverJson} journals it. It disposes the lifecycle on every path.
67
+ */
68
+ async function deliverStream(res, entry, fixture, codec, frames, timing, opts) {
69
+ noteDeliveryStart(res);
70
+ const headSentBefore = res.headersSent;
71
+ const lifecycle = httpLifecycle(res, fixture, { streaming: true });
72
+ try {
73
+ if (!await runFrameLoop(httpSink(res), frames, codec, timing, {
74
+ lifecycle,
75
+ onChunkSent: lifecycle.tick,
76
+ status: opts?.status,
77
+ headers: opts?.headers
78
+ })) {
79
+ const answeredElsewhere = (headSentBefore || res.writableEnded) && !tornDown(res, lifecycle);
80
+ if (!res.writableEnded) res.destroy();
81
+ if (answeredElsewhere) journalAnsweredElsewhere(entry, res);
82
+ else journalTeardown(entry, res, lifecycle);
83
+ }
84
+ } finally {
85
+ lifecycle.dispose();
86
+ }
87
+ }
88
+ /**
89
+ * Deliver one non-streaming JSON reply. The body is a thunk.
90
+ *
91
+ * On both paths it first checks {@link journalUnwritable}, before any wait. A
92
+ * response that can no longer take the reply (torn down, or already answered)
93
+ * is not written, the thunk is never called, and the entry is marked
94
+ * interrupted. An already-answered response whose body never ended is
95
+ * destroyed, so the client does not hang.
96
+ *
97
+ * With non-streaming timing off (the default) it then runs
98
+ * `JSON.stringify(body())`, then `writeHead`, then `end`: the body is built
99
+ * before anything is written, so a builder that throws leaves the response
100
+ * unwritten.
101
+ *
102
+ * With timing on, it waits the non-streaming delay on the client's close
103
+ * signal, checks {@link journalUnwritable} again (the response can be torn
104
+ * down or answered during the wait), then runs the thunk, so a `created`
105
+ * timestamp reflects the write time.
106
+ *
107
+ * Rejects with a `RangeError` when `chunkSize` is a number below 1: that is
108
+ * a programming error, and the delay math divides by it. No user input reaches
109
+ * it, because every caller clamps with `Math.max(1, ...)`. A user value that
110
+ * is not a number clamps to `NaN`: the reply is still served, with a zero
111
+ * wait when timing is on.
112
+ */
113
+ async function deliverJson(res, entry, fixture, body, opts) {
114
+ if (opts.chunkSize < 1) throw new RangeError(`deliverJson: chunkSize must be >= 1, got ${opts.chunkSize}`);
115
+ const write = () => {
116
+ const text = JSON.stringify(body());
117
+ res.writeHead(opts.status ?? 200, {
118
+ "Content-Type": "application/json",
119
+ ...opts.headers
120
+ });
121
+ res.end(text);
122
+ };
123
+ noteDeliveryStart(res);
124
+ if (journalUnwritable(entry, res, void 0)) return;
125
+ if (!nonStreamingTimingEnabled(fixture, opts.surface)) {
126
+ write();
127
+ return;
128
+ }
129
+ const lifecycle = httpLifecycle(res, fixture, { streaming: false });
130
+ try {
131
+ const fixtureTimings = nonStreamingRecordedTimings(fixture, opts.surface, opts.recordedTimings);
132
+ const recordedTimings = opts.duplicateId ? extendRecordedTimings(fixtureTimings, Math.max(1, Math.ceil(opts.payloadLength / opts.chunkSize)), true) : fixtureTimings;
133
+ await delay(nonStreamingDelayMs(fixture, opts.payloadLength, opts.chunkSize, recordedTimings, opts.replaySpeed), lifecycle.signal);
134
+ if (journalUnwritable(entry, res, lifecycle)) return;
135
+ write();
136
+ } finally {
137
+ lifecycle.dispose();
138
+ }
139
+ }
140
+
141
+ //#endregion
142
+ export { deliverJson, deliverStream };
143
+ //# sourceMappingURL=deliver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliver.js","names":[],"sources":["../../src/response/deliver.ts"],"sourcesContent":["import type * as http from \"node:http\";\nimport type { Fixture, JournalEntry, RecordedTimings } from \"../types.js\";\nimport { delay } from \"../sse-writer.js\";\nimport { httpSink, runFrameLoop, type FrameCodec, type FrameTiming } from \"./frame-loop.js\";\nimport { responseGoneReason } from \"../chaos.js\";\nimport {\n AIMOCK_DISCONNECTED,\n closedByClient,\n httpLifecycle,\n markInterrupted,\n noteDeliveryStart,\n statusLineSent,\n teardownReason,\n requestSocket,\n type DeliveryLifecycle,\n} from \"./lifecycle.js\";\nimport {\n extendRecordedTimings,\n nonStreamingDelayMs,\n nonStreamingRecordedTimings,\n nonStreamingTimingEnabled,\n type NonStreamingSurface,\n} from \"./timing.js\";\n\n/** The lifecycle fields the teardown journal reads. */\ntype TeardownSource = Pick<DeliveryLifecycle, \"cause\" | \"reason\">;\n\n/**\n * Journal a delivery that ended early. The reason is always set: the\n * lifecycle's first cause when it fired, else {@link teardownReason} for the\n * response that is gone. When no byte of the response reached the socket\n * ({@link statusLineSent}), the status is 0, the rule the server and the\n * chaos `disconnect` apply to a torn socket. A fixture interruption\n * (`disconnectAfterMs`, `truncateAfterChunks`) keeps the status it was\n * journaled with, as base recorded it.\n */\nfunction journalTeardown(\n entry: JournalEntry,\n res: http.ServerResponse,\n lifecycle: TeardownSource | undefined,\n): void {\n markInterrupted(entry, lifecycle?.reason() ?? teardownReason(res));\n if (lifecycle?.cause() !== \"fixture\" && !statusLineSent(res)) entry.response.status = 0;\n}\n\n/**\n * Whether the response was torn down: the lifecycle fired, the response is\n * destroyed or chaos disconnected it, or the client closed the socket.\n */\nfunction tornDown(res: http.ServerResponse, lifecycle: TeardownSource | undefined): boolean {\n const socket = requestSocket(res);\n const gone = responseGoneReason(res);\n return (\n lifecycle?.reason() !== undefined ||\n gone === \"client-gone\" ||\n gone === \"chaos-disconnected\" ||\n (!res.writableEnded && !!socket && closedByClient(socket))\n );\n}\n\n/**\n * Journal a response that something else on aimock's side already answered\n * (head committed or body ended) as aimock's teardown, with the status the\n * client actually got.\n */\nfunction journalAnsweredElsewhere(entry: JournalEntry, res: http.ServerResponse): void {\n markInterrupted(entry, AIMOCK_DISCONNECTED);\n entry.response.status = statusLineSent(res) ? res.statusCode : 0;\n}\n\n/**\n * Whether `deliverJson` can no longer write its reply, journaling why when it\n * cannot. Torn down ({@link tornDown}): {@link journalTeardown}. Already\n * answered by something else on aimock's side (head committed or body\n * ended): writing again would throw `ERR_HTTP_HEADERS_SENT`, so it is\n * journaled by {@link journalAnsweredElsewhere}, and a body that never ended\n * is destroyed so the client does not hang.\n */\nfunction journalUnwritable(\n entry: JournalEntry,\n res: http.ServerResponse,\n lifecycle: TeardownSource | undefined,\n): boolean {\n if (tornDown(res, lifecycle)) {\n journalTeardown(entry, res, lifecycle);\n return true;\n }\n if (res.headersSent || res.writableEnded) {\n journalAnsweredElsewhere(entry, res);\n if (!res.writableEnded) res.destroy();\n return true;\n }\n return false;\n}\n\n/**\n * Deliver one streamed reply and journal how it ended. Builds the HTTP\n * lifecycle (client close + fixture interruption) and runs the frame loop on\n * it. When the loop stops early it destroys `res` (if it has not ended) and\n * marks the entry with the first cause's reason (or, when no cause fired, who\n * tore the response down). A response other code already answered (head\n * committed before the stream, or body ended) is journaled as\n * {@link deliverJson} journals it. It disposes the lifecycle on every path.\n */\nexport async function deliverStream<F>(\n res: http.ServerResponse,\n entry: JournalEntry,\n fixture: Fixture,\n codec: FrameCodec<F>,\n frames: readonly F[],\n timing: FrameTiming,\n opts?: {\n status?: number; // When set, sent with `writeHead` before the first frame (issue #549).\n headers?: Record<string, string>; // Merged over the codec's headers (issue #549).\n },\n): Promise<void> {\n noteDeliveryStart(res);\n const headSentBefore = res.headersSent;\n const lifecycle = httpLifecycle(res, fixture, { streaming: true });\n try {\n const completed = await runFrameLoop(httpSink(res), frames, codec, timing, {\n lifecycle,\n onChunkSent: lifecycle.tick,\n status: opts?.status,\n headers: opts?.headers,\n });\n if (!completed) {\n // Read before the destroy below, which makes any response look torn down.\n const answeredElsewhere = (headSentBefore || res.writableEnded) && !tornDown(res, lifecycle);\n if (!res.writableEnded) res.destroy();\n if (answeredElsewhere) journalAnsweredElsewhere(entry, res);\n else journalTeardown(entry, res, lifecycle);\n }\n } finally {\n lifecycle.dispose();\n }\n}\n\nexport interface DeliverJsonOptions {\n /**\n * Passed to `nonStreamingTimingEnabled` and `nonStreamingRecordedTimings`:\n * OpenAI chat, or any other provider.\n */\n surface: NonStreamingSurface;\n status?: number; // The response status, 200 when unset (issue #549).\n headers?: Record<string, string>; // Merged over the JSON `Content-Type` header (issue #549).\n /** The served payload length the wait is sized from. */\n payloadLength: number;\n /**\n * The wait is sized in chunks of this many characters. Callers pass\n * `Math.max(1, <fixture or server chunkSize>)`: 1 or more, or `NaN` for a\n * non-numeric value. `NaN` gives a zero wait.\n */\n chunkSize: number;\n recordedTimings?: RecordedTimings;\n /** A K4 duplicate-id plan: extend the recorded gaps before sizing the wait. */\n duplicateId?: boolean;\n replaySpeed?: number;\n}\n\n/**\n * Deliver one non-streaming JSON reply. The body is a thunk.\n *\n * On both paths it first checks {@link journalUnwritable}, before any wait. A\n * response that can no longer take the reply (torn down, or already answered)\n * is not written, the thunk is never called, and the entry is marked\n * interrupted. An already-answered response whose body never ended is\n * destroyed, so the client does not hang.\n *\n * With non-streaming timing off (the default) it then runs\n * `JSON.stringify(body())`, then `writeHead`, then `end`: the body is built\n * before anything is written, so a builder that throws leaves the response\n * unwritten.\n *\n * With timing on, it waits the non-streaming delay on the client's close\n * signal, checks {@link journalUnwritable} again (the response can be torn\n * down or answered during the wait), then runs the thunk, so a `created`\n * timestamp reflects the write time.\n *\n * Rejects with a `RangeError` when `chunkSize` is a number below 1: that is\n * a programming error, and the delay math divides by it. No user input reaches\n * it, because every caller clamps with `Math.max(1, ...)`. A user value that\n * is not a number clamps to `NaN`: the reply is still served, with a zero\n * wait when timing is on.\n */\nexport async function deliverJson(\n res: http.ServerResponse,\n entry: JournalEntry,\n fixture: Fixture,\n body: () => unknown,\n opts: DeliverJsonOptions,\n): Promise<void> {\n if (opts.chunkSize < 1) {\n throw new RangeError(`deliverJson: chunkSize must be >= 1, got ${opts.chunkSize}`);\n }\n const write = (): void => {\n const text = JSON.stringify(body());\n res.writeHead(opts.status ?? 200, { \"Content-Type\": \"application/json\", ...opts.headers });\n res.end(text);\n };\n noteDeliveryStart(res);\n // Checked before the lifecycle and the wait on both paths: a response that\n // cannot take the reply is journaled at once, with no wait.\n if (journalUnwritable(entry, res, undefined)) return;\n if (!nonStreamingTimingEnabled(fixture, opts.surface)) {\n write();\n return;\n }\n const lifecycle = httpLifecycle(res, fixture, { streaming: false });\n try {\n const fixtureTimings = nonStreamingRecordedTimings(fixture, opts.surface, opts.recordedTimings);\n const recordedTimings = opts.duplicateId\n ? extendRecordedTimings(\n fixtureTimings,\n Math.max(1, Math.ceil(opts.payloadLength / opts.chunkSize)),\n true,\n )\n : fixtureTimings;\n await delay(\n nonStreamingDelayMs(\n fixture,\n opts.payloadLength,\n opts.chunkSize,\n recordedTimings,\n opts.replaySpeed,\n ),\n lifecycle.signal,\n );\n if (journalUnwritable(entry, res, lifecycle)) return;\n write();\n } finally {\n lifecycle.dispose();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAoCA,SAAS,gBACP,OACA,KACA,WACM;AACN,iBAAgB,OAAO,WAAW,QAAQ,IAAI,eAAe,IAAI,CAAC;AAClE,KAAI,WAAW,OAAO,KAAK,aAAa,CAAC,eAAe,IAAI,CAAE,OAAM,SAAS,SAAS;;;;;;AAOxF,SAAS,SAAS,KAA0B,WAAgD;CAC1F,MAAM,SAAS,cAAc,IAAI;CACjC,MAAM,OAAO,mBAAmB,IAAI;AACpC,QACE,WAAW,QAAQ,KAAK,UACxB,SAAS,iBACT,SAAS,wBACR,CAAC,IAAI,iBAAiB,CAAC,CAAC,UAAU,eAAe,OAAO;;;;;;;AAS7D,SAAS,yBAAyB,OAAqB,KAAgC;AACrF,iBAAgB,OAAO,oBAAoB;AAC3C,OAAM,SAAS,SAAS,eAAe,IAAI,GAAG,IAAI,aAAa;;;;;;;;;;AAWjE,SAAS,kBACP,OACA,KACA,WACS;AACT,KAAI,SAAS,KAAK,UAAU,EAAE;AAC5B,kBAAgB,OAAO,KAAK,UAAU;AACtC,SAAO;;AAET,KAAI,IAAI,eAAe,IAAI,eAAe;AACxC,2BAAyB,OAAO,IAAI;AACpC,MAAI,CAAC,IAAI,cAAe,KAAI,SAAS;AACrC,SAAO;;AAET,QAAO;;;;;;;;;;;AAYT,eAAsB,cACpB,KACA,OACA,SACA,OACA,QACA,QACA,MAIe;AACf,mBAAkB,IAAI;CACtB,MAAM,iBAAiB,IAAI;CAC3B,MAAM,YAAY,cAAc,KAAK,SAAS,EAAE,WAAW,MAAM,CAAC;AAClE,KAAI;AAOF,MAAI,CANc,MAAM,aAAa,SAAS,IAAI,EAAE,QAAQ,OAAO,QAAQ;GACzE;GACA,aAAa,UAAU;GACvB,QAAQ,MAAM;GACd,SAAS,MAAM;GAChB,CAAC,EACc;GAEd,MAAM,qBAAqB,kBAAkB,IAAI,kBAAkB,CAAC,SAAS,KAAK,UAAU;AAC5F,OAAI,CAAC,IAAI,cAAe,KAAI,SAAS;AACrC,OAAI,kBAAmB,0BAAyB,OAAO,IAAI;OACtD,iBAAgB,OAAO,KAAK,UAAU;;WAErC;AACR,YAAU,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDvB,eAAsB,YACpB,KACA,OACA,SACA,MACA,MACe;AACf,KAAI,KAAK,YAAY,EACnB,OAAM,IAAI,WAAW,4CAA4C,KAAK,YAAY;CAEpF,MAAM,cAAoB;EACxB,MAAM,OAAO,KAAK,UAAU,MAAM,CAAC;AACnC,MAAI,UAAU,KAAK,UAAU,KAAK;GAAE,gBAAgB;GAAoB,GAAG,KAAK;GAAS,CAAC;AAC1F,MAAI,IAAI,KAAK;;AAEf,mBAAkB,IAAI;AAGtB,KAAI,kBAAkB,OAAO,KAAK,OAAU,CAAE;AAC9C,KAAI,CAAC,0BAA0B,SAAS,KAAK,QAAQ,EAAE;AACrD,SAAO;AACP;;CAEF,MAAM,YAAY,cAAc,KAAK,SAAS,EAAE,WAAW,OAAO,CAAC;AACnE,KAAI;EACF,MAAM,iBAAiB,4BAA4B,SAAS,KAAK,SAAS,KAAK,gBAAgB;EAC/F,MAAM,kBAAkB,KAAK,cACzB,sBACE,gBACA,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,gBAAgB,KAAK,UAAU,CAAC,EAC3D,KACD,GACD;AACJ,QAAM,MACJ,oBACE,SACA,KAAK,eACL,KAAK,WACL,iBACA,KAAK,YACN,EACD,UAAU,OACX;AACD,MAAI,kBAAkB,OAAO,KAAK,UAAU,CAAE;AAC9C,SAAO;WACC;AACR,YAAU,SAAS"}
@@ -0,0 +1,225 @@
1
+ const require_profiles = require('./profiles.cjs');
2
+
3
+ //#region src/response/errors.ts
4
+ function buildOpenAIError(input, details) {
5
+ if (input === "service-validation") {
6
+ if (!details) throw new TypeError("Missing service validation error details");
7
+ return { error: {
8
+ message: details.message,
9
+ type: require_profiles.errorProfiles.openai.validationType
10
+ } };
11
+ }
12
+ if (input === "openrouter-error") {
13
+ if (!details || typeof details.code !== "number") throw new TypeError("Missing OpenRouter numeric error details");
14
+ return { error: {
15
+ code: details.code,
16
+ message: details.message,
17
+ ...details.metadata !== void 0 && { metadata: details.metadata }
18
+ } };
19
+ }
20
+ return {
21
+ message: input.message,
22
+ type: input.type,
23
+ ...input.includeParam === true ? { param: input.param ?? null } : {},
24
+ code: input.code
25
+ };
26
+ }
27
+ /** Native purpose templates preserve field presence and insertion order. No status or I/O. */
28
+ function renderError(wire, purpose, details) {
29
+ if (wire === "ollama-embed") return { body: JSON.stringify({ error: details.message }) };
30
+ const profile = require_profiles.errorProfiles[wire];
31
+ if (wire === "interactions" && (purpose === "validation" || purpose === "strict-miss" || purpose === "fixture-miss" || purpose === "fixture" || purpose === "misbehavior" || purpose === "unknown-response")) return { body: JSON.stringify({ error: {
32
+ code: details.code ?? "INVALID_ARGUMENT",
33
+ message: details.message
34
+ } }) };
35
+ switch (purpose) {
36
+ case "authentication":
37
+ if (wire === "messages") return { body: JSON.stringify({
38
+ type: "error",
39
+ error: {
40
+ type: "authentication_error",
41
+ message: details.message
42
+ }
43
+ }) };
44
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
45
+ code: 401,
46
+ message: details.message,
47
+ status: "UNAUTHENTICATED"
48
+ } }) };
49
+ return renderError(wire, "legacy-auth", details);
50
+ case "legacy-auth": return { body: JSON.stringify({ error: {
51
+ message: details.message,
52
+ type: "authentication_error",
53
+ code: "invalid_api_key"
54
+ } }) };
55
+ case "stream-failure": return { body: JSON.stringify({ error: { message: details.message } }) };
56
+ case "route-failure": return { body: JSON.stringify({ error: {
57
+ message: details.message,
58
+ type: details.type
59
+ } }) };
60
+ case "invalid-misbehavior-header":
61
+ if (wire === "ollama") return { body: JSON.stringify({ error: details.message }) };
62
+ if (wire === "cohere") return { body: JSON.stringify({ message: details.message }) };
63
+ if (wire === "interactions") return { body: JSON.stringify({ error: {
64
+ code: details.code,
65
+ message: details.message
66
+ } }) };
67
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
68
+ code: 400,
69
+ message: details.message,
70
+ status: "INVALID_ARGUMENT"
71
+ } }) };
72
+ if (wire === "messages") return { body: JSON.stringify({
73
+ type: "error",
74
+ error: {
75
+ type: profile.validationType,
76
+ code: details.code,
77
+ message: details.message
78
+ }
79
+ }) };
80
+ if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
81
+ __type: "ValidationException",
82
+ message: details.message
83
+ }) };
84
+ return { body: JSON.stringify({ error: {
85
+ message: details.message,
86
+ type: profile.validationType,
87
+ code: details.code
88
+ } }) };
89
+ case "validation":
90
+ case "strict-miss":
91
+ case "fixture-miss":
92
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
93
+ message: details.message,
94
+ code: details.bodyCode,
95
+ status: details.status
96
+ } }) };
97
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
98
+ ...details,
99
+ type: details.type ?? profile.validationType
100
+ }) }) };
101
+ return { body: JSON.stringify({ error: {
102
+ message: details.message,
103
+ type: details.type ?? profile.validationType
104
+ } }) };
105
+ case "thinking": return { body: JSON.stringify({
106
+ type: "error",
107
+ error: {
108
+ type: details.type ?? profile.validationType,
109
+ message: details.message
110
+ },
111
+ ...wire === "messages" && details.requestId !== void 0 ? { request_id: details.requestId } : {}
112
+ }) };
113
+ case "fixture":
114
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
115
+ code: details.bodyCode,
116
+ message: details.message,
117
+ status: details.status
118
+ } }) };
119
+ if (wire === "openai") return { body: JSON.stringify({ error: {
120
+ message: details.message,
121
+ type: details.type ?? profile.fixtureType,
122
+ param: details.param ?? null,
123
+ code: details.code ?? null
124
+ } }) };
125
+ return { body: JSON.stringify({
126
+ type: "error",
127
+ error: {
128
+ type: details.type ?? profile.fixtureType,
129
+ message: details.message
130
+ }
131
+ }) };
132
+ case "tool-argument":
133
+ if (wire === "ollama") return { body: JSON.stringify({
134
+ error: details.message,
135
+ code: details.code
136
+ }) };
137
+ if (wire === "interactions") return { body: JSON.stringify({ error: {
138
+ code: details.code,
139
+ message: details.message
140
+ } }) };
141
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
142
+ code: 500,
143
+ message: details.message,
144
+ status: "INTERNAL",
145
+ details: details.googleDetails
146
+ } }) };
147
+ if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
148
+ __type: details.type ?? require_profiles.errorProfiles.bedrock.toolArgumentType,
149
+ message: details.message,
150
+ reason: details.code
151
+ }) };
152
+ if (wire === "messages") return { body: JSON.stringify({
153
+ type: "error",
154
+ error: {
155
+ type: details.type ?? profile.fixtureType,
156
+ code: details.code,
157
+ message: details.message
158
+ }
159
+ }) };
160
+ return { body: JSON.stringify({ error: {
161
+ message: details.message,
162
+ type: details.type ?? profile.fixtureType,
163
+ code: details.code
164
+ } }) };
165
+ case "misbehavior":
166
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError(details) }) };
167
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
168
+ code: details.bodyCode,
169
+ message: details.message,
170
+ status: details.status
171
+ } }) };
172
+ if (wire === "cohere") return { body: JSON.stringify({
173
+ message: details.message,
174
+ code: details.code
175
+ }) };
176
+ if (wire === "ollama") return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };
177
+ if (wire === "bedrock-converse") return {
178
+ body: JSON.stringify({
179
+ __type: details.type,
180
+ message: details.message,
181
+ code: details.code
182
+ }),
183
+ headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
184
+ };
185
+ if (wire === "bedrock") return {
186
+ body: JSON.stringify({
187
+ __type: details.type,
188
+ code: details.code,
189
+ message: details.message
190
+ }),
191
+ headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
192
+ };
193
+ return { body: JSON.stringify({
194
+ type: "error",
195
+ error: {
196
+ type: details.type,
197
+ code: details.code,
198
+ message: details.message
199
+ }
200
+ }) };
201
+ case "unknown-response":
202
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
203
+ message: details.message,
204
+ code: details.bodyCode,
205
+ status: details.status
206
+ } }) };
207
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
208
+ ...details,
209
+ type: details.type ?? "server_error"
210
+ }) }) };
211
+ return { body: JSON.stringify({ error: {
212
+ message: details.message,
213
+ type: details.type ?? "server_error"
214
+ } }) };
215
+ case "transport-failure": return { body: JSON.stringify({ error: {
216
+ message: details.message,
217
+ type: details.type ?? "proxy_error"
218
+ } }) };
219
+ }
220
+ }
221
+
222
+ //#endregion
223
+ exports.buildOpenAIError = buildOpenAIError;
224
+ exports.renderError = renderError;
225
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","names":["errorProfiles"],"sources":["../../src/response/errors.ts"],"sourcesContent":["import { errorProfiles, type ErrorWire } from \"./profiles.js\";\n\nexport type ErrorPurpose =\n | \"validation\"\n | \"strict-miss\"\n | \"fixture-miss\"\n | \"thinking\"\n | \"fixture\"\n | \"tool-argument\"\n | \"misbehavior\"\n | \"unknown-response\"\n | \"transport-failure\"\n | \"route-failure\"\n | \"stream-failure\"\n | \"invalid-misbehavior-header\"\n | \"authentication\"\n | \"legacy-auth\";\n\nexport interface ErrorDetails {\n message: string;\n type?: string | null;\n param?: string | null;\n /** Explicitly retain the native OpenAI param slot; omitted preserves legacy templates. */\n includeParam?: true;\n /** Normalized correlation metadata explicitly supplied by native header-policy rejects. */\n requestId?: string;\n code?: string | null;\n bodyCode?: number;\n status?: string | null;\n googleDetails?: {\n \"@type\": string;\n reason: string;\n domain: string;\n metadata: { code: string };\n }[];\n}\n\ntype OpenAIInnerDetails = Pick<\n ErrorDetails,\n \"message\" | \"type\" | \"param\" | \"code\" | \"includeParam\"\n>;\ntype OpenAIInnerBody = {\n message: string;\n type?: string | null;\n param?: string | null;\n code?: string | null;\n};\ntype ServiceValidationBody = { error: { message: string; type: string } };\ntype OpenRouterErrorBody = {\n error: { code: number; message: string; metadata?: Record<string, unknown> };\n};\n\n/** Common error owner; fixed native forms preserve caller signatures and ordering. */\nexport function buildOpenAIError(details: OpenAIInnerDetails): OpenAIInnerBody;\nexport function buildOpenAIError(\n purpose: \"service-validation\",\n details: { message: string },\n): ServiceValidationBody;\nexport function buildOpenAIError(\n purpose: \"openrouter-error\",\n details: { code: number; message: string; metadata?: Record<string, unknown> },\n): OpenRouterErrorBody;\nexport function buildOpenAIError(\n input: OpenAIInnerDetails | \"service-validation\" | \"openrouter-error\",\n details?: { message: string; code?: number; metadata?: Record<string, unknown> },\n): OpenAIInnerBody | ServiceValidationBody | OpenRouterErrorBody {\n if (input === \"service-validation\") {\n if (!details) throw new TypeError(\"Missing service validation error details\");\n return {\n error: { message: details.message, type: errorProfiles.openai.validationType },\n };\n }\n if (input === \"openrouter-error\") {\n if (!details || typeof details.code !== \"number\")\n throw new TypeError(\"Missing OpenRouter numeric error details\");\n return {\n error: {\n code: details.code,\n message: details.message,\n ...(details.metadata !== undefined && { metadata: details.metadata }),\n },\n };\n }\n return {\n message: input.message,\n type: input.type,\n ...(input.includeParam === true ? { param: input.param ?? null } : {}),\n code: input.code,\n };\n}\n\n/** Native purpose templates preserve field presence and insertion order. No status or I/O. */\nexport function renderError(\n wire: ErrorWire,\n purpose: ErrorPurpose,\n details: ErrorDetails,\n): { body: string; headers?: Record<string, string> } {\n if (wire === \"ollama-embed\") {\n return { body: JSON.stringify({ error: details.message }) };\n }\n const profile = errorProfiles[wire];\n if (\n wire === \"interactions\" &&\n (purpose === \"validation\" ||\n purpose === \"strict-miss\" ||\n purpose === \"fixture-miss\" ||\n purpose === \"fixture\" ||\n purpose === \"misbehavior\" ||\n purpose === \"unknown-response\")\n ) {\n return {\n body: JSON.stringify({\n error: { code: details.code ?? \"INVALID_ARGUMENT\", message: details.message },\n }),\n };\n }\n switch (purpose) {\n case \"authentication\":\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: \"authentication_error\", message: details.message },\n }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: 401, message: details.message, status: \"UNAUTHENTICATED\" },\n }),\n };\n }\n return renderError(wire, \"legacy-auth\", details);\n case \"legacy-auth\":\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: \"authentication_error\",\n code: \"invalid_api_key\",\n },\n }),\n };\n case \"stream-failure\":\n return { body: JSON.stringify({ error: { message: details.message } }) };\n case \"route-failure\":\n return {\n body: JSON.stringify({ error: { message: details.message, type: details.type } }),\n };\n case \"invalid-misbehavior-header\":\n if (wire === \"ollama\") return { body: JSON.stringify({ error: details.message }) };\n if (wire === \"cohere\") return { body: JSON.stringify({ message: details.message }) };\n if (wire === \"interactions\") {\n return {\n body: JSON.stringify({ error: { code: details.code, message: details.message } }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: 400, message: details.message, status: \"INVALID_ARGUMENT\" },\n }),\n };\n }\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: profile.validationType, code: details.code, message: details.message },\n }),\n };\n }\n if (wire === \"bedrock\" || wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({ __type: \"ValidationException\", message: details.message }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: profile.validationType, code: details.code },\n }),\n };\n case \"validation\":\n case \"strict-miss\":\n case \"fixture-miss\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { message: details.message, code: details.bodyCode, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: buildOpenAIError({\n ...details,\n type: details.type ?? profile.validationType,\n }),\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? profile.validationType },\n }),\n };\n case \"thinking\":\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type ?? profile.validationType, message: details.message },\n ...(wire === \"messages\" && details.requestId !== undefined\n ? { request_id: details.requestId }\n : {}),\n }),\n };\n case \"fixture\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: details.bodyCode, message: details.message, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: details.type ?? profile.fixtureType,\n param: details.param ?? null,\n code: details.code ?? null,\n },\n }),\n };\n }\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type ?? profile.fixtureType, message: details.message },\n }),\n };\n case \"tool-argument\":\n if (wire === \"ollama\") {\n return { body: JSON.stringify({ error: details.message, code: details.code }) };\n }\n if (wire === \"interactions\") {\n return {\n body: JSON.stringify({ error: { code: details.code, message: details.message } }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: {\n code: 500,\n message: details.message,\n status: \"INTERNAL\",\n details: details.googleDetails,\n },\n }),\n };\n }\n if (wire === \"bedrock\" || wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({\n __type: details.type ?? errorProfiles.bedrock.toolArgumentType,\n message: details.message,\n reason: details.code,\n }),\n };\n }\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: {\n type: details.type ?? profile.fixtureType,\n code: details.code,\n message: details.message,\n },\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: details.type ?? profile.fixtureType,\n code: details.code,\n },\n }),\n };\n case \"misbehavior\":\n if (wire === \"openai\") {\n return { body: JSON.stringify({ error: buildOpenAIError(details) }) };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: details.bodyCode, message: details.message, status: details.status },\n }),\n };\n }\n if (wire === \"cohere\") {\n return { body: JSON.stringify({ message: details.message, code: details.code }) };\n }\n if (wire === \"ollama\") {\n return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };\n }\n if (wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({\n __type: details.type,\n message: details.message,\n code: details.code,\n }),\n headers:\n details.type === undefined || details.type === null\n ? undefined\n : { \"x-amzn-errortype\": details.type },\n };\n }\n if (wire === \"bedrock\") {\n return {\n body: JSON.stringify({\n __type: details.type,\n code: details.code,\n message: details.message,\n }),\n headers:\n details.type === undefined || details.type === null\n ? undefined\n : { \"x-amzn-errortype\": details.type },\n };\n }\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type, code: details.code, message: details.message },\n }),\n };\n case \"unknown-response\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { message: details.message, code: details.bodyCode, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: buildOpenAIError({ ...details, type: details.type ?? \"server_error\" }),\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? \"server_error\" },\n }),\n };\n case \"transport-failure\":\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? \"proxy_error\" },\n }),\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ import { errorProfiles } from "./profiles.js";
2
+
3
+ //#region src/response/errors.ts
4
+ function buildOpenAIError(input, details) {
5
+ if (input === "service-validation") {
6
+ if (!details) throw new TypeError("Missing service validation error details");
7
+ return { error: {
8
+ message: details.message,
9
+ type: errorProfiles.openai.validationType
10
+ } };
11
+ }
12
+ if (input === "openrouter-error") {
13
+ if (!details || typeof details.code !== "number") throw new TypeError("Missing OpenRouter numeric error details");
14
+ return { error: {
15
+ code: details.code,
16
+ message: details.message,
17
+ ...details.metadata !== void 0 && { metadata: details.metadata }
18
+ } };
19
+ }
20
+ return {
21
+ message: input.message,
22
+ type: input.type,
23
+ ...input.includeParam === true ? { param: input.param ?? null } : {},
24
+ code: input.code
25
+ };
26
+ }
27
+ /** Native purpose templates preserve field presence and insertion order. No status or I/O. */
28
+ function renderError(wire, purpose, details) {
29
+ if (wire === "ollama-embed") return { body: JSON.stringify({ error: details.message }) };
30
+ const profile = errorProfiles[wire];
31
+ if (wire === "interactions" && (purpose === "validation" || purpose === "strict-miss" || purpose === "fixture-miss" || purpose === "fixture" || purpose === "misbehavior" || purpose === "unknown-response")) return { body: JSON.stringify({ error: {
32
+ code: details.code ?? "INVALID_ARGUMENT",
33
+ message: details.message
34
+ } }) };
35
+ switch (purpose) {
36
+ case "authentication":
37
+ if (wire === "messages") return { body: JSON.stringify({
38
+ type: "error",
39
+ error: {
40
+ type: "authentication_error",
41
+ message: details.message
42
+ }
43
+ }) };
44
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
45
+ code: 401,
46
+ message: details.message,
47
+ status: "UNAUTHENTICATED"
48
+ } }) };
49
+ return renderError(wire, "legacy-auth", details);
50
+ case "legacy-auth": return { body: JSON.stringify({ error: {
51
+ message: details.message,
52
+ type: "authentication_error",
53
+ code: "invalid_api_key"
54
+ } }) };
55
+ case "stream-failure": return { body: JSON.stringify({ error: { message: details.message } }) };
56
+ case "route-failure": return { body: JSON.stringify({ error: {
57
+ message: details.message,
58
+ type: details.type
59
+ } }) };
60
+ case "invalid-misbehavior-header":
61
+ if (wire === "ollama") return { body: JSON.stringify({ error: details.message }) };
62
+ if (wire === "cohere") return { body: JSON.stringify({ message: details.message }) };
63
+ if (wire === "interactions") return { body: JSON.stringify({ error: {
64
+ code: details.code,
65
+ message: details.message
66
+ } }) };
67
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
68
+ code: 400,
69
+ message: details.message,
70
+ status: "INVALID_ARGUMENT"
71
+ } }) };
72
+ if (wire === "messages") return { body: JSON.stringify({
73
+ type: "error",
74
+ error: {
75
+ type: profile.validationType,
76
+ code: details.code,
77
+ message: details.message
78
+ }
79
+ }) };
80
+ if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
81
+ __type: "ValidationException",
82
+ message: details.message
83
+ }) };
84
+ return { body: JSON.stringify({ error: {
85
+ message: details.message,
86
+ type: profile.validationType,
87
+ code: details.code
88
+ } }) };
89
+ case "validation":
90
+ case "strict-miss":
91
+ case "fixture-miss":
92
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
93
+ message: details.message,
94
+ code: details.bodyCode,
95
+ status: details.status
96
+ } }) };
97
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
98
+ ...details,
99
+ type: details.type ?? profile.validationType
100
+ }) }) };
101
+ return { body: JSON.stringify({ error: {
102
+ message: details.message,
103
+ type: details.type ?? profile.validationType
104
+ } }) };
105
+ case "thinking": return { body: JSON.stringify({
106
+ type: "error",
107
+ error: {
108
+ type: details.type ?? profile.validationType,
109
+ message: details.message
110
+ },
111
+ ...wire === "messages" && details.requestId !== void 0 ? { request_id: details.requestId } : {}
112
+ }) };
113
+ case "fixture":
114
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
115
+ code: details.bodyCode,
116
+ message: details.message,
117
+ status: details.status
118
+ } }) };
119
+ if (wire === "openai") return { body: JSON.stringify({ error: {
120
+ message: details.message,
121
+ type: details.type ?? profile.fixtureType,
122
+ param: details.param ?? null,
123
+ code: details.code ?? null
124
+ } }) };
125
+ return { body: JSON.stringify({
126
+ type: "error",
127
+ error: {
128
+ type: details.type ?? profile.fixtureType,
129
+ message: details.message
130
+ }
131
+ }) };
132
+ case "tool-argument":
133
+ if (wire === "ollama") return { body: JSON.stringify({
134
+ error: details.message,
135
+ code: details.code
136
+ }) };
137
+ if (wire === "interactions") return { body: JSON.stringify({ error: {
138
+ code: details.code,
139
+ message: details.message
140
+ } }) };
141
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
142
+ code: 500,
143
+ message: details.message,
144
+ status: "INTERNAL",
145
+ details: details.googleDetails
146
+ } }) };
147
+ if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
148
+ __type: details.type ?? errorProfiles.bedrock.toolArgumentType,
149
+ message: details.message,
150
+ reason: details.code
151
+ }) };
152
+ if (wire === "messages") return { body: JSON.stringify({
153
+ type: "error",
154
+ error: {
155
+ type: details.type ?? profile.fixtureType,
156
+ code: details.code,
157
+ message: details.message
158
+ }
159
+ }) };
160
+ return { body: JSON.stringify({ error: {
161
+ message: details.message,
162
+ type: details.type ?? profile.fixtureType,
163
+ code: details.code
164
+ } }) };
165
+ case "misbehavior":
166
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError(details) }) };
167
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
168
+ code: details.bodyCode,
169
+ message: details.message,
170
+ status: details.status
171
+ } }) };
172
+ if (wire === "cohere") return { body: JSON.stringify({
173
+ message: details.message,
174
+ code: details.code
175
+ }) };
176
+ if (wire === "ollama") return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };
177
+ if (wire === "bedrock-converse") return {
178
+ body: JSON.stringify({
179
+ __type: details.type,
180
+ message: details.message,
181
+ code: details.code
182
+ }),
183
+ headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
184
+ };
185
+ if (wire === "bedrock") return {
186
+ body: JSON.stringify({
187
+ __type: details.type,
188
+ code: details.code,
189
+ message: details.message
190
+ }),
191
+ headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
192
+ };
193
+ return { body: JSON.stringify({
194
+ type: "error",
195
+ error: {
196
+ type: details.type,
197
+ code: details.code,
198
+ message: details.message
199
+ }
200
+ }) };
201
+ case "unknown-response":
202
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
203
+ message: details.message,
204
+ code: details.bodyCode,
205
+ status: details.status
206
+ } }) };
207
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
208
+ ...details,
209
+ type: details.type ?? "server_error"
210
+ }) }) };
211
+ return { body: JSON.stringify({ error: {
212
+ message: details.message,
213
+ type: details.type ?? "server_error"
214
+ } }) };
215
+ case "transport-failure": return { body: JSON.stringify({ error: {
216
+ message: details.message,
217
+ type: details.type ?? "proxy_error"
218
+ } }) };
219
+ }
220
+ }
221
+
222
+ //#endregion
223
+ export { buildOpenAIError, renderError };
224
+ //# sourceMappingURL=errors.js.map