@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
package/dist/bedrock.cjs CHANGED
@@ -1,39 +1,24 @@
1
+ const require_errors = require('./response/errors.cjs');
2
+ const require_policy = require('./response/policy.cjs');
1
3
  const require_helpers = require('./helpers.cjs');
2
4
  const require_sse_writer = require('./sse-writer.cjs');
3
5
  const require_chaos = require('./chaos.cjs');
4
6
  const require_misbehavior = require('./misbehavior.cjs');
5
7
  const require_router = require('./router.cjs');
8
+ const require_anthropic = require('./response/usage/codecs/anthropic.cjs');
6
9
  const require_recorder = require('./recorder.cjs');
7
- const require_interruption = require('./interruption.cjs');
8
- const require_messages = require('./messages.cjs');
10
+ const require_timing = require('./response/timing.cjs');
11
+ const require_deliver = require('./response/deliver.cjs');
12
+ const require_proxy = require('./response/proxy.cjs');
9
13
  const require_aws_event_stream = require('./aws-event-stream.cjs');
14
+ const require_raw = require('./response/raw.cjs');
15
+ const require_finish = require('./response/finish.cjs');
16
+ const require_messages = require('./messages.cjs');
10
17
 
11
18
  //#region src/bedrock.ts
12
19
  function bedrockStopReason(overrideFinishReason, defaultReason) {
13
20
  if (!overrideFinishReason) return defaultReason;
14
- if (overrideFinishReason === "stop") return "end_turn";
15
- if (overrideFinishReason === "tool_calls") return "tool_use";
16
- if (overrideFinishReason === "length") return "max_tokens";
17
- return overrideFinishReason;
18
- }
19
- /**
20
- * Build a Bedrock-style usage object from optional overrides.
21
- *
22
- * When no overrides are provided (the common case for mock fixtures),
23
- * returns all-zero token counts. This is intentional — aimock does not
24
- * attempt to estimate token usage from fixture content. Callers that
25
- * need realistic usage numbers should set `usage` in their fixture's
26
- * response overrides.
27
- */
28
- function bedrockUsage(overrides) {
29
- if (!overrides?.usage) return {
30
- input_tokens: 0,
31
- output_tokens: 0
32
- };
33
- return {
34
- input_tokens: overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0,
35
- output_tokens: overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0
36
- };
21
+ return require_finish.mapAnthropicFinish(overrideFinishReason);
37
22
  }
38
23
  function extractTextContent(content) {
39
24
  if (content === null || content === void 0) return "";
@@ -146,7 +131,7 @@ function buildBedrockTextResponse(content, model, reasoning, overrides) {
146
131
  model: overrides?.model ?? model,
147
132
  stop_reason: bedrockStopReason(overrides?.finishReason, "end_turn"),
148
133
  stop_sequence: null,
149
- usage: bedrockUsage(overrides)
134
+ usage: require_anthropic.render(require_anthropic.resolve(overrides), "bedrock-final")
150
135
  };
151
136
  }
152
137
  function buildBedrockToolCallResponse(toolCalls, model, logger, reasoning, overrides) {
@@ -173,7 +158,7 @@ function buildBedrockToolCallResponse(toolCalls, model, logger, reasoning, overr
173
158
  model: overrides?.model ?? model,
174
159
  stop_reason: bedrockStopReason(overrides?.finishReason, "tool_use"),
175
160
  stop_sequence: null,
176
- usage: bedrockUsage(overrides)
161
+ usage: require_anthropic.render(require_anthropic.resolve(overrides), "bedrock-final")
177
162
  };
178
163
  }
179
164
  /**
@@ -217,7 +202,7 @@ function buildBedrockBlocksResponse(blocks, model, logger, reasoning, overrides)
217
202
  model: overrides?.model ?? model,
218
203
  stop_reason: bedrockStopReason(overrides?.finishReason, outcome.hasToolCalls ? "tool_use" : "end_turn"),
219
204
  stop_sequence: null,
220
- usage: bedrockUsage(overrides)
205
+ usage: require_anthropic.render(require_anthropic.resolve(overrides), "bedrock-final")
221
206
  };
222
207
  }
223
208
  async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults, setCorsHeaders) {
@@ -239,10 +224,10 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
239
224
  fixture: null
240
225
  }
241
226
  });
242
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
227
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("bedrock", "validation", {
243
228
  message: `Malformed JSON: ${detail}`,
244
229
  type: "invalid_request_error"
245
- } }));
230
+ }).body);
246
231
  return;
247
232
  }
248
233
  if (!require_helpers.isJsonObject(bedrockReq)) {
@@ -256,10 +241,10 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
256
241
  fixture: null
257
242
  }
258
243
  });
259
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
244
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("bedrock", "validation", {
260
245
  message: "Request body must be a JSON object",
261
246
  type: "invalid_request_error"
262
- } }));
247
+ }).body);
263
248
  return;
264
249
  }
265
250
  const bedrockShapeError = require_helpers.validateChatMessages(bedrockReq.messages, { checkToolCalls: false }) ?? require_helpers.validateToolsField(bedrockReq.tools) ?? (bedrockReq.system !== void 0 && bedrockReq.system !== null && typeof bedrockReq.system !== "string" && !Array.isArray(bedrockReq.system) ? "system must be a string or an array" : null);
@@ -274,17 +259,20 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
274
259
  fixture: null
275
260
  }
276
261
  });
277
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
262
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("bedrock", "validation", {
278
263
  message: `Invalid request: ${bedrockShapeError}`,
279
264
  type: "invalid_request_error"
280
- } }));
265
+ }).body);
281
266
  return;
282
267
  }
283
268
  const completionReq = bedrockToCompletionRequest(bedrockReq, modelId, logger);
284
269
  completionReq._endpointType = "chat";
285
270
  completionReq._context = require_helpers.getContext(req);
286
271
  const testId = require_helpers.getTestId(req);
287
- const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, require_router.recordMatchOptions(!!defaults.record, defaults.logger));
272
+ const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
273
+ ...require_router.recordMatchOptions(!!defaults.record, defaults.logger),
274
+ wire: "bedrock-invoke"
275
+ });
288
276
  if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
289
277
  else logger.debug(`No fixture matched for request`);
290
278
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
@@ -295,7 +283,7 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
295
283
  body: completionReq
296
284
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
297
285
  if (!fixture) {
298
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
286
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
299
287
  const strictStatus = 503;
300
288
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
301
289
  logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -307,17 +295,17 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
307
295
  response: {
308
296
  status: strictStatus,
309
297
  fixture: null,
310
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
298
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
311
299
  }
312
300
  });
313
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
301
+ require_sse_writer.writeErrorResponse(res, strictStatus, require_errors.renderError("bedrock", "strict-miss", {
314
302
  message: strictMessage,
315
303
  type: "invalid_request_error"
316
- } }));
304
+ }).body);
317
305
  return;
318
306
  }
319
307
  if (defaults.record) {
320
- const outcome = await require_recorder.proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw);
308
+ const { outcome, clientHungUp } = await require_proxy.withHangUpDetection(req, res, () => require_recorder.proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw));
321
309
  if (outcome === "handled_by_hook") return;
322
310
  if (outcome !== "not_configured") {
323
311
  journal.add({
@@ -328,7 +316,8 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
328
316
  response: {
329
317
  status: res.statusCode ?? 200,
330
318
  fixture: null,
331
- source: "proxy"
319
+ source: "proxy",
320
+ ...require_proxy.proxyInterruption(res, clientHungUp)
332
321
  }
333
322
  });
334
323
  return;
@@ -342,13 +331,13 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
342
331
  response: {
343
332
  status: 404,
344
333
  fixture: null,
345
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
334
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
346
335
  }
347
336
  });
348
- require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
337
+ require_sse_writer.writeErrorResponse(res, 404, require_errors.renderError("bedrock", "fixture-miss", {
349
338
  message: "No fixture matched",
350
339
  type: "invalid_request_error"
351
- } }));
340
+ }).body);
352
341
  return;
353
342
  }
354
343
  const response = await require_helpers.resolveResponse(fixture, completionReq);
@@ -385,41 +374,69 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
385
374
  fixture
386
375
  }
387
376
  });
388
- const type = misbehavior.status === 400 ? "ValidationException" : "NotImplementedException";
389
- res.setHeader("x-amzn-errortype", type);
390
- require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({
391
- __type: type,
377
+ const renderedError = require_errors.renderError("bedrock", "misbehavior", {
378
+ type: misbehavior.status === 400 ? "ValidationException" : "NotImplementedException",
392
379
  code: misbehavior.code,
393
380
  message: misbehavior.message
394
- }));
381
+ });
382
+ for (const [name, value] of Object.entries(renderedError.headers ?? {})) res.setHeader(name, value);
383
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, renderedError.body);
395
384
  return;
396
385
  }
386
+ const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
387
+ const jsonOpts = (payloadLength, duplicateId = false) => ({
388
+ surface: "other",
389
+ payloadLength,
390
+ chunkSize,
391
+ recordedTimings: fixture.recordedTimings,
392
+ duplicateId,
393
+ replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed
394
+ });
397
395
  if (misbehavior.kind === "applied") {
398
396
  const prepared = require_messages.prepareClaudeMisbehavior(misbehavior, {
399
397
  request: completionReq,
400
398
  stream: false,
401
- chunkSize: Math.max(1, fixture.chunkSize ?? defaults.chunkSize),
399
+ chunkSize,
402
400
  logger,
403
- strict: require_helpers.resolveStrictMode(defaults.strict, req.headers)
401
+ strict: require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,
402
+ citations: false
404
403
  });
405
404
  if (prepared.stream) throw new TypeError("InvokeModel requires non-stream Claude output");
405
+ const entry = journal.add({
406
+ method: req.method ?? "POST",
407
+ path: urlPath,
408
+ headers: require_helpers.flattenHeaders(req.headers),
409
+ body: completionReq,
410
+ response: {
411
+ status: 200,
412
+ fixture
413
+ }
414
+ });
406
415
  require_misbehavior.recordMisbehaviorOutcome({
407
- entry: journal.add({
408
- method: req.method ?? "POST",
409
- path: urlPath,
410
- headers: require_helpers.flattenHeaders(req.headers),
411
- body: completionReq,
412
- response: {
413
- status: 200,
414
- fixture
415
- }
416
- }),
416
+ entry,
417
417
  summary: prepared.plan.summary,
418
418
  defaults,
419
419
  testId
420
420
  });
421
- res.writeHead(200, { "Content-Type": "application/json" });
422
- res.end(JSON.stringify(prepared.body));
421
+ const preparedBody = prepared.body;
422
+ await require_deliver.deliverJson(res, entry, fixture, () => preparedBody, jsonOpts(require_timing.misbehaviorPayloadLength(misbehavior, misbehavior.reasoning === void 0 ? prepared.reasoning : void 0), !!misbehavior.duplicateId));
423
+ return;
424
+ }
425
+ if (require_helpers.isRawResponse(response)) {
426
+ await require_raw.serveRawResponse({
427
+ wire: "bedrock-invoke",
428
+ stream: false,
429
+ req,
430
+ res,
431
+ fixture,
432
+ response,
433
+ body: completionReq,
434
+ journal,
435
+ defaults,
436
+ testId,
437
+ misbehaviorSummary: misbehavior.summary,
438
+ errorWire: "bedrock"
439
+ });
423
440
  return;
424
441
  }
425
442
  if (require_helpers.isErrorResponse(response)) {
@@ -434,21 +451,14 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
434
451
  fixture
435
452
  }
436
453
  });
437
- const anthropicError = {
438
- type: "error",
439
- error: {
440
- type: response.error.type ?? "api_error",
441
- message: response.error.message
442
- }
443
- };
444
- require_sse_writer.writeErrorResponse(res, status, JSON.stringify(anthropicError), { retryAfter: response.retryAfter });
454
+ require_sse_writer.writeErrorResponse(res, status, require_errors.renderError("bedrock", "fixture", response.error).body, { retryAfter: response.retryAfter });
445
455
  return;
446
456
  }
447
457
  if (require_helpers.isCombinedFixtureResponse(response)) {
448
458
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
449
459
  const overrides = require_helpers.extractOverrides(response);
450
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
451
- addResponseEntry({
460
+ const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
461
+ const journalEntry = addResponseEntry({
452
462
  method: req.method ?? "POST",
453
463
  path: urlPath,
454
464
  headers: require_helpers.flattenHeaders(req.headers),
@@ -459,28 +469,27 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
459
469
  }
460
470
  });
461
471
  const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock InvokeModel");
462
- if (response.blocks && response.blocks.length > 0) {
463
- const blocksBody = buildBedrockBlocksResponse(response.blocks, completionReq.model, logger, effReasoning, overrides);
464
- res.writeHead(200, { "Content-Type": "application/json" });
465
- res.end(JSON.stringify(blocksBody));
472
+ const blocks = response.blocks;
473
+ if (blocks && blocks.length > 0) {
474
+ await require_deliver.deliverJson(res, journalEntry, fixture, () => buildBedrockBlocksResponse(blocks, completionReq.model, logger, effReasoning, overrides), jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
466
475
  return;
467
476
  }
468
- const textBody = buildBedrockTextResponse(response.content ?? "", completionReq.model, effReasoning, overrides);
469
- const toolBody = buildBedrockToolCallResponse(functionToolCalls, completionReq.model, logger, void 0, overrides);
470
- const merged = {
471
- ...textBody,
472
- content: [...textBody.content, ...toolBody.content],
473
- stop_reason: bedrockStopReason(overrides?.finishReason, "tool_use")
474
- };
475
- res.writeHead(200, { "Content-Type": "application/json" });
476
- res.end(JSON.stringify(merged));
477
+ await require_deliver.deliverJson(res, journalEntry, fixture, () => {
478
+ const textBody = buildBedrockTextResponse(response.content ?? "", completionReq.model, effReasoning, overrides);
479
+ const toolBody = buildBedrockToolCallResponse(functionToolCalls, completionReq.model, logger, void 0, overrides);
480
+ return {
481
+ ...textBody,
482
+ content: [...textBody.content, ...toolBody.content],
483
+ stop_reason: bedrockStopReason(overrides?.finishReason, "tool_use")
484
+ };
485
+ }, jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
477
486
  return;
478
487
  }
479
488
  if (require_helpers.isTextResponse(response)) {
480
489
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
481
490
  const overrides = require_helpers.extractOverrides(response);
482
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
483
- addResponseEntry({
491
+ const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
492
+ await require_deliver.deliverJson(res, addResponseEntry({
484
493
  method: req.method ?? "POST",
485
494
  path: urlPath,
486
495
  headers: require_helpers.flattenHeaders(req.headers),
@@ -489,17 +498,14 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
489
498
  status: 200,
490
499
  fixture
491
500
  }
492
- });
493
- const body = buildBedrockTextResponse(response.content, completionReq.model, effReasoning, overrides);
494
- res.writeHead(200, { "Content-Type": "application/json" });
495
- res.end(JSON.stringify(body));
501
+ }), fixture, () => buildBedrockTextResponse(response.content, completionReq.model, effReasoning, overrides), jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
496
502
  return;
497
503
  }
498
504
  if (require_helpers.isToolCallResponse(response)) {
499
505
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
500
506
  const overrides = require_helpers.extractOverrides(response);
501
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
502
- addResponseEntry({
507
+ const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
508
+ const journalEntry = addResponseEntry({
503
509
  method: req.method ?? "POST",
504
510
  path: urlPath,
505
511
  headers: require_helpers.flattenHeaders(req.headers),
@@ -509,9 +515,8 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
509
515
  fixture
510
516
  }
511
517
  });
512
- const body = buildBedrockToolCallResponse(require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock InvokeModel"), completionReq.model, logger, effReasoning, overrides);
513
- res.writeHead(200, { "Content-Type": "application/json" });
514
- res.end(JSON.stringify(body));
518
+ const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock InvokeModel");
519
+ await require_deliver.deliverJson(res, journalEntry, fixture, () => buildBedrockToolCallResponse(functionToolCalls, completionReq.model, logger, effReasoning, overrides), jsonOpts(require_timing.servedPayloadLength(response, effReasoning)));
515
520
  return;
516
521
  }
517
522
  addResponseEntry({
@@ -524,19 +529,14 @@ async function handleBedrock(req, res, raw, modelId, fixtures, journal, defaults
524
529
  fixture
525
530
  }
526
531
  });
527
- require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
532
+ require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError("bedrock", "unknown-response", {
528
533
  message: "Fixture response did not match any known type",
529
534
  type: "server_error"
530
- } }));
535
+ }).body);
531
536
  }
532
537
  const BEDROCK_INVOKE_STREAM_EVENT_TYPE = "chunk";
533
538
  /** Serialize Claude events as InvokeModel PayloadPart, leaving generic AWS framing unchanged. */
534
- function writeBedrockInvokeStream(res, events, options) {
535
- return require_aws_event_stream.writeEventStream(res, events.map((event) => ({
536
- eventType: event.eventType,
537
- payload: { bytes: Buffer.from(JSON.stringify(event.payload), "utf8").toString("base64") }
538
- })), options);
539
- }
539
+ const bedrockInvokeCodec = require_aws_event_stream.eventStreamCodec((event) => require_aws_event_stream.encodeEventStreamMessage(event.eventType, { bytes: Buffer.from(JSON.stringify(event.payload), "utf8").toString("base64") }));
540
540
  function buildBedrockInvokeMessageStart(model, overrides) {
541
541
  return {
542
542
  eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,
@@ -550,12 +550,12 @@ function buildBedrockInvokeMessageStart(model, overrides) {
550
550
  model: overrides?.model ?? model,
551
551
  stop_reason: null,
552
552
  stop_sequence: null,
553
- usage: bedrockUsage(overrides)
553
+ usage: require_anthropic.render(require_anthropic.resolve(overrides), "bedrock-start")
554
554
  }
555
555
  }
556
556
  };
557
557
  }
558
- function buildBedrockInvokeMessageDelta(stopReason) {
558
+ function buildBedrockInvokeMessageDelta(stopReason, overrides) {
559
559
  return {
560
560
  eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,
561
561
  payload: {
@@ -564,7 +564,7 @@ function buildBedrockInvokeMessageDelta(stopReason) {
564
564
  stop_reason: stopReason,
565
565
  stop_sequence: null
566
566
  },
567
- usage: { output_tokens: 0 }
567
+ usage: require_anthropic.render(require_anthropic.resolve(overrides), "bedrock-delta")
568
568
  }
569
569
  };
570
570
  }
@@ -660,7 +660,7 @@ function buildBedrockStreamTextEvents(content, model, chunkSize, reasoning, over
660
660
  index: textBlockIndex
661
661
  }
662
662
  });
663
- events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, "end_turn")));
663
+ events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, "end_turn"), overrides));
664
664
  events.push(buildBedrockInvokeMessageStop());
665
665
  return events;
666
666
  }
@@ -794,7 +794,7 @@ function buildBedrockStreamContentWithToolCallsEvents(content, toolCalls, model,
794
794
  });
795
795
  blockIndex++;
796
796
  }
797
- events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, outcome.hasToolCalls ? "tool_use" : "end_turn")));
797
+ events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, outcome.hasToolCalls ? "tool_use" : "end_turn"), overrides));
798
798
  events.push(buildBedrockInvokeMessageStop());
799
799
  return events;
800
800
  }
@@ -871,7 +871,7 @@ function buildBedrockStreamContentWithToolCallsEvents(content, toolCalls, model,
871
871
  }
872
872
  });
873
873
  }
874
- events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, "tool_use")));
874
+ events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, "tool_use"), overrides));
875
875
  events.push(buildBedrockInvokeMessageStop());
876
876
  return events;
877
877
  }
@@ -966,7 +966,7 @@ function buildBedrockStreamToolCallEvents(toolCalls, model, chunkSize, logger, r
966
966
  }
967
967
  });
968
968
  }
969
- events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, "tool_use")));
969
+ events.push(buildBedrockInvokeMessageDelta(bedrockStopReason(overrides?.finishReason, "tool_use"), overrides));
970
970
  events.push(buildBedrockInvokeMessageStop());
971
971
  return events;
972
972
  }
@@ -989,10 +989,10 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
989
989
  fixture: null
990
990
  }
991
991
  });
992
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
992
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("bedrock", "validation", {
993
993
  message: `Malformed JSON: ${detail}`,
994
994
  type: "invalid_request_error"
995
- } }));
995
+ }).body);
996
996
  return;
997
997
  }
998
998
  if (!require_helpers.isJsonObject(bedrockReq)) {
@@ -1006,10 +1006,10 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1006
1006
  fixture: null
1007
1007
  }
1008
1008
  });
1009
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1009
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("bedrock", "validation", {
1010
1010
  message: "Request body must be a JSON object",
1011
1011
  type: "invalid_request_error"
1012
- } }));
1012
+ }).body);
1013
1013
  return;
1014
1014
  }
1015
1015
  const bedrockShapeError = require_helpers.validateChatMessages(bedrockReq.messages, { checkToolCalls: false }) ?? require_helpers.validateToolsField(bedrockReq.tools) ?? (bedrockReq.system !== void 0 && bedrockReq.system !== null && typeof bedrockReq.system !== "string" && !Array.isArray(bedrockReq.system) ? "system must be a string or an array" : null);
@@ -1024,10 +1024,10 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1024
1024
  fixture: null
1025
1025
  }
1026
1026
  });
1027
- require_sse_writer.writeErrorResponse(res, 400, JSON.stringify({ error: {
1027
+ require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("bedrock", "validation", {
1028
1028
  message: `Invalid request: ${bedrockShapeError}`,
1029
1029
  type: "invalid_request_error"
1030
- } }));
1030
+ }).body);
1031
1031
  return;
1032
1032
  }
1033
1033
  const completionReq = bedrockToCompletionRequest(bedrockReq, modelId, logger);
@@ -1035,7 +1035,10 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1035
1035
  completionReq._endpointType = "chat";
1036
1036
  completionReq._context = require_helpers.getContext(req);
1037
1037
  const testId = require_helpers.getTestId(req);
1038
- const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, require_router.recordMatchOptions(!!defaults.record, defaults.logger));
1038
+ const { fixture, skippedBySequenceOrTurn } = require_router.matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
1039
+ ...require_router.recordMatchOptions(!!defaults.record, defaults.logger),
1040
+ wire: "bedrock-invoke"
1041
+ });
1039
1042
  if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
1040
1043
  else logger.debug(`No fixture matched for request`);
1041
1044
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
@@ -1046,7 +1049,7 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1046
1049
  body: completionReq
1047
1050
  }, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
1048
1051
  if (!fixture) {
1049
- if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
1052
+ if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
1050
1053
  const strictStatus = 503;
1051
1054
  const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
1052
1055
  logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
@@ -1058,17 +1061,17 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1058
1061
  response: {
1059
1062
  status: strictStatus,
1060
1063
  fixture: null,
1061
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
1064
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
1062
1065
  }
1063
1066
  });
1064
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
1067
+ require_sse_writer.writeErrorResponse(res, strictStatus, require_errors.renderError("bedrock", "strict-miss", {
1065
1068
  message: strictMessage,
1066
1069
  type: "invalid_request_error"
1067
- } }));
1070
+ }).body);
1068
1071
  return;
1069
1072
  }
1070
1073
  if (defaults.record) {
1071
- const outcome = await require_recorder.proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw);
1074
+ const { outcome, clientHungUp } = await require_proxy.withHangUpDetection(req, res, () => require_recorder.proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw));
1072
1075
  if (outcome === "handled_by_hook") return;
1073
1076
  if (outcome !== "not_configured") {
1074
1077
  journal.add({
@@ -1079,7 +1082,8 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1079
1082
  response: {
1080
1083
  status: res.statusCode ?? 200,
1081
1084
  fixture: null,
1082
- source: "proxy"
1085
+ source: "proxy",
1086
+ ...require_proxy.proxyInterruption(res, clientHungUp)
1083
1087
  }
1084
1088
  });
1085
1089
  return;
@@ -1093,13 +1097,13 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1093
1097
  response: {
1094
1098
  status: 404,
1095
1099
  fixture: null,
1096
- ...require_helpers.strictOverrideField(defaults.strict, req.headers)
1100
+ ...require_policy.strictOverrideField(defaults.strict, req.headers)
1097
1101
  }
1098
1102
  });
1099
- require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
1103
+ require_sse_writer.writeErrorResponse(res, 404, require_errors.renderError("bedrock", "fixture-miss", {
1100
1104
  message: "No fixture matched",
1101
1105
  type: "invalid_request_error"
1102
- } }));
1106
+ }).body);
1103
1107
  return;
1104
1108
  }
1105
1109
  const response = await require_helpers.resolveResponse(fixture, completionReq);
@@ -1136,24 +1140,30 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1136
1140
  fixture
1137
1141
  }
1138
1142
  });
1139
- const type = misbehavior.status === 400 ? "ValidationException" : "NotImplementedException";
1140
- res.setHeader("x-amzn-errortype", type);
1141
- require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({
1142
- __type: type,
1143
+ const renderedError = require_errors.renderError("bedrock", "misbehavior", {
1144
+ type: misbehavior.status === 400 ? "ValidationException" : "NotImplementedException",
1143
1145
  code: misbehavior.code,
1144
1146
  message: misbehavior.message
1145
- }));
1147
+ });
1148
+ for (const [name, value] of Object.entries(renderedError.headers ?? {})) res.setHeader(name, value);
1149
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, renderedError.body);
1146
1150
  return;
1147
1151
  }
1148
- const latency = fixture.latency ?? defaults.latency;
1149
1152
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
1153
+ const streamTiming = {
1154
+ latency: fixture.latency ?? defaults.latency,
1155
+ streamingProfile: fixture.streamingProfile,
1156
+ recordedTimings: fixture.recordedTimings,
1157
+ replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed
1158
+ };
1150
1159
  if (misbehavior.kind === "applied") {
1151
1160
  const prepared = require_messages.prepareClaudeMisbehavior(misbehavior, {
1152
1161
  request: completionReq,
1153
1162
  stream: true,
1154
1163
  chunkSize,
1155
1164
  logger,
1156
- strict: require_helpers.resolveStrictMode(defaults.strict, req.headers)
1165
+ strict: require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression,
1166
+ citations: false
1157
1167
  });
1158
1168
  if (!prepared.stream) throw new TypeError("InvokeModel stream requires Claude events");
1159
1169
  const entry = journal.add({
@@ -1172,27 +1182,27 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1172
1182
  defaults,
1173
1183
  testId
1174
1184
  });
1175
- const events = prepared.events.map((event) => ({
1185
+ await require_deliver.deliverStream(res, entry, fixture, bedrockInvokeCodec, prepared.events.map((event) => ({
1176
1186
  eventType: BEDROCK_INVOKE_STREAM_EVENT_TYPE,
1177
1187
  payload: event
1178
- }));
1179
- const interruption = require_interruption.createInterruptionSignal(fixture);
1180
- try {
1181
- if (!await writeBedrockInvokeStream(res, events, {
1182
- latency,
1183
- streamingProfile: fixture.streamingProfile,
1184
- recordedTimings: fixture.recordedTimings,
1185
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1186
- signal: interruption?.signal,
1187
- onChunkSent: interruption?.tick
1188
- })) {
1189
- if (!res.writableEnded) res.destroy();
1190
- entry.response.interrupted = true;
1191
- entry.response.interruptReason = interruption?.reason();
1192
- }
1193
- } finally {
1194
- interruption?.cleanup();
1195
- }
1188
+ })), streamTiming);
1189
+ return;
1190
+ }
1191
+ if (require_helpers.isRawResponse(response)) {
1192
+ await require_raw.serveRawResponse({
1193
+ wire: "bedrock-invoke",
1194
+ stream: true,
1195
+ req,
1196
+ res,
1197
+ fixture,
1198
+ response,
1199
+ body: completionReq,
1200
+ journal,
1201
+ defaults,
1202
+ testId,
1203
+ misbehaviorSummary: misbehavior.summary,
1204
+ errorWire: "bedrock"
1205
+ });
1196
1206
  return;
1197
1207
  }
1198
1208
  if (require_helpers.isErrorResponse(response)) {
@@ -1207,20 +1217,13 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1207
1217
  fixture
1208
1218
  }
1209
1219
  });
1210
- const anthropicError = {
1211
- type: "error",
1212
- error: {
1213
- type: response.error.type ?? "api_error",
1214
- message: response.error.message
1215
- }
1216
- };
1217
- require_sse_writer.writeErrorResponse(res, status, JSON.stringify(anthropicError), { retryAfter: response.retryAfter });
1220
+ require_sse_writer.writeErrorResponse(res, status, require_errors.renderError("bedrock", "fixture", response.error).body, { retryAfter: response.retryAfter });
1218
1221
  return;
1219
1222
  }
1220
1223
  if (require_helpers.isCombinedFixtureResponse(response)) {
1221
1224
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
1222
1225
  const overrides = require_helpers.extractOverrides(response);
1223
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
1226
+ const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
1224
1227
  const journalEntry = addResponseEntry({
1225
1228
  method: req.method ?? "POST",
1226
1229
  path: urlPath,
@@ -1232,28 +1235,14 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1232
1235
  }
1233
1236
  });
1234
1237
  const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock InvokeModel");
1235
- const events = buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", functionToolCalls, completionReq.model, chunkSize, logger, effReasoning, overrides, response.blocks);
1236
- const interruption = require_interruption.createInterruptionSignal(fixture);
1237
- if (!await writeBedrockInvokeStream(res, events, {
1238
- latency,
1239
- streamingProfile: fixture.streamingProfile,
1240
- recordedTimings: fixture.recordedTimings,
1241
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1242
- signal: interruption?.signal,
1243
- onChunkSent: interruption?.tick
1244
- })) {
1245
- if (!res.writableEnded) res.destroy();
1246
- journalEntry.response.interrupted = true;
1247
- journalEntry.response.interruptReason = interruption?.reason();
1248
- }
1249
- interruption?.cleanup();
1238
+ await require_deliver.deliverStream(res, journalEntry, fixture, bedrockInvokeCodec, buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", functionToolCalls, completionReq.model, chunkSize, logger, effReasoning, overrides, response.blocks), streamTiming);
1250
1239
  return;
1251
1240
  }
1252
1241
  if (require_helpers.isTextResponse(response)) {
1253
1242
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
1254
1243
  const overrides = require_helpers.extractOverrides(response);
1255
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
1256
- const journalEntry = addResponseEntry({
1244
+ const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
1245
+ await require_deliver.deliverStream(res, addResponseEntry({
1257
1246
  method: req.method ?? "POST",
1258
1247
  path: urlPath,
1259
1248
  headers: require_helpers.flattenHeaders(req.headers),
@@ -1262,29 +1251,14 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1262
1251
  status: 200,
1263
1252
  fixture
1264
1253
  }
1265
- });
1266
- const events = buildBedrockStreamTextEvents(response.content, completionReq.model, chunkSize, effReasoning, overrides);
1267
- const interruption = require_interruption.createInterruptionSignal(fixture);
1268
- if (!await writeBedrockInvokeStream(res, events, {
1269
- latency,
1270
- streamingProfile: fixture.streamingProfile,
1271
- recordedTimings: fixture.recordedTimings,
1272
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1273
- signal: interruption?.signal,
1274
- onChunkSent: interruption?.tick
1275
- })) {
1276
- if (!res.writableEnded) res.destroy();
1277
- journalEntry.response.interrupted = true;
1278
- journalEntry.response.interruptReason = interruption?.reason();
1279
- }
1280
- interruption?.cleanup();
1254
+ }), fixture, bedrockInvokeCodec, buildBedrockStreamTextEvents(response.content, completionReq.model, chunkSize, effReasoning, overrides), streamTiming);
1281
1255
  return;
1282
1256
  }
1283
1257
  if (require_helpers.isToolCallResponse(response)) {
1284
1258
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock API — ignoring");
1285
1259
  const overrides = require_helpers.extractOverrides(response);
1286
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger);
1287
- const journalEntry = addResponseEntry({
1260
+ const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
1261
+ await require_deliver.deliverStream(res, addResponseEntry({
1288
1262
  method: req.method ?? "POST",
1289
1263
  path: urlPath,
1290
1264
  headers: require_helpers.flattenHeaders(req.headers),
@@ -1293,22 +1267,7 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1293
1267
  status: 200,
1294
1268
  fixture
1295
1269
  }
1296
- });
1297
- const events = buildBedrockStreamToolCallEvents(require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock InvokeModel"), completionReq.model, chunkSize, logger, effReasoning, overrides);
1298
- const interruption = require_interruption.createInterruptionSignal(fixture);
1299
- if (!await writeBedrockInvokeStream(res, events, {
1300
- latency,
1301
- streamingProfile: fixture.streamingProfile,
1302
- recordedTimings: fixture.recordedTimings,
1303
- replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
1304
- signal: interruption?.signal,
1305
- onChunkSent: interruption?.tick
1306
- })) {
1307
- if (!res.writableEnded) res.destroy();
1308
- journalEntry.response.interrupted = true;
1309
- journalEntry.response.interruptReason = interruption?.reason();
1310
- }
1311
- interruption?.cleanup();
1270
+ }), fixture, bedrockInvokeCodec, buildBedrockStreamToolCallEvents(require_helpers.requireEmittedFunctionToolCalls(response, "Bedrock InvokeModel"), completionReq.model, chunkSize, logger, effReasoning, overrides), streamTiming);
1312
1271
  return;
1313
1272
  }
1314
1273
  addResponseEntry({
@@ -1321,10 +1280,10 @@ async function handleBedrockStream(req, res, raw, modelId, fixtures, journal, de
1321
1280
  fixture
1322
1281
  }
1323
1282
  });
1324
- require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
1283
+ require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError("bedrock", "unknown-response", {
1325
1284
  message: "Fixture response did not match any known type",
1326
1285
  type: "server_error"
1327
- } }));
1286
+ }).body);
1328
1287
  }
1329
1288
 
1330
1289
  //#endregion