@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
@@ -1,10 +1,13 @@
1
+ import { buildOpenAIError } from "./response/errors.js";
1
2
  import { DEFAULT_TEST_ID } from "./constants.js";
2
- import { fixtureToolCallErrorCode, flattenHeaders, generateToolCallId, isCombinedFixtureResponse, isErrorResponse, isFixtureToolCallError, isTextResponse, isToolCallResponse, isTranscriptionResponse, journalFixtureToolCallError, prepareOpenAIChatMisbehavior, rejectResponsesOnlyToolCalls, requireServedFunctionToolCalls, resolveFixtureBlocks, resolveOpenAIChatMisbehaviorUsage, resolveResponse, resolveStrictMode, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
3
+ import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
4
+ import { fixtureToolCallErrorCode, flattenHeaders, generateToolCallId, isCombinedFixtureResponse, isErrorResponse, isFixtureToolCallError, isTextResponse, isToolCallResponse, isTranscriptionResponse, journalFixtureToolCallError, prepareOpenAIChatMisbehavior, rejectResponsesOnlyToolCalls, requireServedFunctionToolCalls, resolveFixtureBlocks, resolveOpenAIChatMisbehaviorUsage, resolveResponse, strictNoMatchLogLine, strictNoMatchMessage } from "./helpers.js";
3
5
  import { calculateDelay, delay } from "./sse-writer.js";
4
6
  import { planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
5
7
  import { matchFixtureDiagnostic } from "./router.js";
6
8
  import "./journal.js";
7
- import { createInterruptionSignal } from "./interruption.js";
9
+ import { markInterrupted, markWsTurnStopped, watchWsClose, wsLifecycle } from "./response/lifecycle.js";
10
+ import { render } from "./response/usage/codecs/realtime.js";
8
11
  import { randomBytes } from "node:crypto";
9
12
 
10
13
  //#region src/ws-realtime.ts
@@ -315,11 +318,11 @@ function sendEvent(ws, event, isBeta) {
315
318
  function buildErrorRealtimeEvent(ws, message, isBeta, type = "invalid_request_error", code) {
316
319
  sendEvent(ws, {
317
320
  type: "error",
318
- error: {
321
+ error: buildOpenAIError({
319
322
  message,
320
323
  type,
321
324
  code
322
- }
325
+ })
323
326
  }, isBeta);
324
327
  }
325
328
  /**
@@ -365,6 +368,7 @@ function rejectRetiredBetaShape(ws, logger) {
365
368
  function handleWebSocketRealtime(ws, fixtures, journal, defaults) {
366
369
  const { logger } = defaults;
367
370
  const sessionId = realtimeId("sess");
371
+ watchWsClose(ws);
368
372
  const isBeta = defaults.upgradeHeaders?.["openai-beta"] ? String(defaults.upgradeHeaders["openai-beta"]).includes("realtime=v1") : false;
369
373
  if (isBeta) {
370
374
  rejectRetiredBetaShape(ws, logger);
@@ -435,11 +439,11 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session, con
435
439
  if (!validTypes.has(s.type)) {
436
440
  sendEvent(ws, {
437
441
  type: "error",
438
- error: {
442
+ error: buildOpenAIError({
439
443
  message: `Invalid session type: ${s.type}`,
440
444
  type: "invalid_request_error",
441
445
  code: "invalid_session_config"
442
- }
446
+ })
443
447
  }, isBeta);
444
448
  return;
445
449
  }
@@ -494,11 +498,11 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session, con
494
498
  Object.assign(session, prevSession);
495
499
  sendEvent(ws, {
496
500
  type: "error",
497
- error: {
501
+ error: buildOpenAIError({
498
502
  message: `Model ${candidateTranscriptionModel} does not support session type transcription`,
499
503
  type: "invalid_request_error",
500
504
  code: "invalid_session_config"
501
- }
505
+ })
502
506
  }, isBeta);
503
507
  return;
504
508
  }
@@ -506,11 +510,11 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session, con
506
510
  Object.assign(session, prevSession);
507
511
  sendEvent(ws, {
508
512
  type: "error",
509
- error: {
513
+ error: buildOpenAIError({
510
514
  message: `Model ${s.model ?? prevSession.model} does not support session type translation`,
511
515
  type: "invalid_request_error",
512
516
  code: "invalid_session_config"
513
- }
517
+ })
514
518
  }, isBeta);
515
519
  return;
516
520
  }
@@ -585,7 +589,7 @@ async function emitLiveTranscriptionEvents(ws, fixtures, journal, defaults, sess
585
589
  const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, request, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
586
590
  const itemId = audioItem.id ?? realtimeId("item");
587
591
  if (!fixture) {
588
- if (resolveStrictMode(defaults.strict, defaults.upgradeHeaders)) {
592
+ if (resolveRequestDecisions(defaults.strict, defaults.upgradeHeaders).fixtureMiss) {
589
593
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
590
594
  defaults.logger.error(strictNoMatchLogLine("WS", "/v1/realtime", skippedBySequenceOrTurn));
591
595
  journal.add({
@@ -673,18 +677,17 @@ async function emitLiveTranscriptionEvents(ws, fixtures, journal, defaults, sess
673
677
  const latency = fixture.latency ?? defaults.latency;
674
678
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
675
679
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
676
- const interruption = createInterruptionSignal(fixture);
680
+ const lifecycle = wsLifecycle(ws, fixture);
677
681
  let chunkIndex = 0;
678
682
  for (let index = 0; index < transcript.length; index += chunkSize) {
679
683
  const chunkDelay = calculateDelay(chunkIndex, fixture.streamingProfile, latency, fixture.recordedTimings, replaySpeed);
680
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
681
- if (interruption?.signal.aborted || ws.isClosed) {
682
- if (interruption?.signal.aborted) {
683
- journalEntry.response.interrupted = true;
684
- journalEntry.response.interruptReason = interruption.reason();
684
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
685
+ if (lifecycle.signal.aborted || ws.isClosed) {
686
+ if (lifecycle.signal.aborted) {
687
+ markInterrupted(journalEntry, lifecycle.reason());
685
688
  ws.destroy();
686
- }
687
- interruption?.cleanup();
689
+ } else markWsTurnStopped(journalEntry, ws, lifecycle);
690
+ lifecycle.dispose();
688
691
  return;
689
692
  }
690
693
  sendEvent(ws, {
@@ -693,14 +696,13 @@ async function emitLiveTranscriptionEvents(ws, fixtures, journal, defaults, sess
693
696
  content_index: 0,
694
697
  delta: transcript.slice(index, index + chunkSize)
695
698
  }, isBeta);
696
- interruption?.tick();
699
+ lifecycle.tick();
697
700
  chunkIndex++;
698
701
  }
699
- if (interruption?.signal.aborted) {
700
- journalEntry.response.interrupted = true;
701
- journalEntry.response.interruptReason = interruption.reason();
702
+ if (lifecycle.signal.aborted || ws.isClosed) {
703
+ markWsTurnStopped(journalEntry, ws, lifecycle);
702
704
  ws.destroy();
703
- interruption.cleanup();
705
+ lifecycle.dispose();
704
706
  return;
705
707
  }
706
708
  sendEvent(ws, {
@@ -711,7 +713,7 @@ async function emitLiveTranscriptionEvents(ws, fixtures, journal, defaults, sess
711
713
  usage,
712
714
  ...response.transcription.languages !== void 0 ? { languages: response.transcription.languages } : {}
713
715
  }, isBeta);
714
- interruption?.cleanup();
716
+ lifecycle.dispose();
715
717
  }
716
718
  function sendLiveTranscriptionFailure(ws, itemId, error, isBeta) {
717
719
  sendEvent(ws, {
@@ -762,11 +764,7 @@ function checkRealtimeFixtureToolCalls(ws, journalEntry, responseId, isBeta, log
762
764
  code: fixtureToolCallErrorCode(err)
763
765
  }
764
766
  },
765
- usage: {
766
- total_tokens: 0,
767
- input_tokens: 0,
768
- output_tokens: 0
769
- }
767
+ usage: render({ kind: "ordinary-zero" })
770
768
  }
771
769
  }, isBeta);
772
770
  return;
@@ -794,7 +792,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
794
792
  const responseId = realtimeId("resp");
795
793
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
796
794
  if (!fixture) {
797
- if (resolveStrictMode(defaults.strict, defaults.upgradeHeaders)) {
795
+ if (resolveRequestDecisions(defaults.strict, defaults.upgradeHeaders).fixtureMiss) {
798
796
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
799
797
  defaults.logger.error(strictNoMatchLogLine("WS", "/v1/realtime", skippedBySequenceOrTurn));
800
798
  journal.add({
@@ -848,11 +846,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
848
846
  code: "no_fixture_match"
849
847
  }
850
848
  },
851
- usage: {
852
- total_tokens: 0,
853
- input_tokens: 0,
854
- output_tokens: 0
855
- }
849
+ usage: render({ kind: "ordinary-zero" })
856
850
  }
857
851
  }, isBeta);
858
852
  return;
@@ -916,11 +910,10 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
916
910
  const usage = resolveOpenAIChatMisbehaviorUsage(misbehavior, completionReq, false);
917
911
  await streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, latency, chunkSize, isBeta, conversationItems, journalEntry, {
918
912
  stop: misbehavior.stop,
919
- usage: {
920
- input_tokens: usage.prompt_tokens,
921
- output_tokens: usage.completion_tokens,
922
- total_tokens: usage.total_tokens
923
- }
913
+ usage: render({
914
+ kind: "applied-misbehavior",
915
+ usage
916
+ })
924
917
  });
925
918
  return;
926
919
  }
@@ -952,11 +945,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
952
945
  code: response.error.code
953
946
  }
954
947
  },
955
- usage: {
956
- total_tokens: 0,
957
- input_tokens: 0,
958
- output_tokens: 0
959
- }
948
+ usage: render({ kind: "ordinary-zero" })
960
949
  }
961
950
  }, isBeta);
962
951
  return;
@@ -986,7 +975,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
986
975
  usage: null
987
976
  }
988
977
  }, isBeta);
989
- const interruption = createInterruptionSignal(fixture);
978
+ const lifecycle = wsLifecycle(ws, fixture);
990
979
  let interrupted = false;
991
980
  const allOutputItems = [];
992
981
  const textItemId = realtimeId("item");
@@ -1034,8 +1023,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1034
1023
  for (let i = 0; i < content.length; i += chunkSize) {
1035
1024
  if (ws.isClosed) break;
1036
1025
  const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1037
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1038
- if (interruption?.signal.aborted) {
1026
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
1027
+ if (lifecycle.signal.aborted) {
1039
1028
  interrupted = true;
1040
1029
  break;
1041
1030
  }
@@ -1055,21 +1044,21 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1055
1044
  break;
1056
1045
  }
1057
1046
  eventIndex++;
1058
- interruption?.tick();
1059
- if (interruption?.signal.aborted) {
1047
+ lifecycle.tick();
1048
+ if (lifecycle.signal.aborted) {
1060
1049
  interrupted = true;
1061
1050
  break;
1062
1051
  }
1063
1052
  }
1064
1053
  if (interrupted) {
1065
1054
  ws.destroy();
1066
- journalEntry.response.interrupted = true;
1067
- journalEntry.response.interruptReason = interruption?.reason();
1068
- interruption?.cleanup();
1055
+ markInterrupted(journalEntry, lifecycle.reason());
1056
+ lifecycle.dispose();
1069
1057
  return;
1070
1058
  }
1071
1059
  if (ws.isClosed) {
1072
- interruption?.cleanup();
1060
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1061
+ lifecycle.dispose();
1073
1062
  return;
1074
1063
  }
1075
1064
  sendEvent(ws, {
@@ -1081,7 +1070,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1081
1070
  text: content
1082
1071
  }, isBeta);
1083
1072
  if (ws.isClosed) {
1084
- interruption?.cleanup();
1073
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1074
+ lifecycle.dispose();
1085
1075
  return;
1086
1076
  }
1087
1077
  sendEvent(ws, {
@@ -1096,7 +1086,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1096
1086
  }
1097
1087
  }, isBeta);
1098
1088
  if (ws.isClosed) {
1099
- interruption?.cleanup();
1089
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1090
+ lifecycle.dispose();
1100
1091
  return;
1101
1092
  }
1102
1093
  sendEvent(ws, {
@@ -1120,7 +1111,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1120
1111
  }
1121
1112
  }, isBeta);
1122
1113
  if (ws.isClosed) {
1123
- interruption?.cleanup();
1114
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1115
+ lifecycle.dispose();
1124
1116
  return;
1125
1117
  }
1126
1118
  allOutputItems.push(textOutputItem);
@@ -1156,8 +1148,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1156
1148
  for (let i = 0; i < args.length; i += chunkSize) {
1157
1149
  if (ws.isClosed) break;
1158
1150
  const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1159
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1160
- if (interruption?.signal.aborted) {
1151
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
1152
+ if (lifecycle.signal.aborted) {
1161
1153
  interrupted = true;
1162
1154
  break;
1163
1155
  }
@@ -1177,8 +1169,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1177
1169
  break;
1178
1170
  }
1179
1171
  eventIndex++;
1180
- interruption?.tick();
1181
- if (interruption?.signal.aborted) {
1172
+ lifecycle.tick();
1173
+ if (lifecycle.signal.aborted) {
1182
1174
  interrupted = true;
1183
1175
  break;
1184
1176
  }
@@ -1220,13 +1212,15 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1220
1212
  }
1221
1213
  if (interrupted) {
1222
1214
  ws.destroy();
1223
- journalEntry.response.interrupted = true;
1224
- journalEntry.response.interruptReason = interruption?.reason();
1225
- interruption?.cleanup();
1215
+ markInterrupted(journalEntry, lifecycle.reason());
1216
+ lifecycle.dispose();
1217
+ return;
1218
+ }
1219
+ lifecycle.dispose();
1220
+ if (ws.isClosed) {
1221
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1226
1222
  return;
1227
1223
  }
1228
- interruption?.cleanup();
1229
- if (ws.isClosed) return;
1230
1224
  sendEvent(ws, {
1231
1225
  type: "response.done",
1232
1226
  response: {
@@ -1234,11 +1228,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1234
1228
  object: "realtime.response",
1235
1229
  status: "completed",
1236
1230
  output: allOutputItems,
1237
- usage: {
1238
- total_tokens: 0,
1239
- input_tokens: 0,
1240
- output_tokens: 0
1241
- }
1231
+ usage: render({ kind: "ordinary-zero" })
1242
1232
  }
1243
1233
  }, isBeta);
1244
1234
  conversationItems.push({
@@ -1306,14 +1296,14 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1306
1296
  const content = response.content ?? "";
1307
1297
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
1308
1298
  const { recordedTimings } = fixture;
1309
- const interruption = createInterruptionSignal(fixture);
1299
+ const lifecycle = wsLifecycle(ws, fixture);
1310
1300
  let interrupted = false;
1311
1301
  let eventIndex = 0;
1312
1302
  for (let i = 0; i < content.length; i += chunkSize) {
1313
1303
  if (ws.isClosed) break;
1314
1304
  const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1315
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1316
- if (interruption?.signal.aborted) {
1305
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
1306
+ if (lifecycle.signal.aborted) {
1317
1307
  interrupted = true;
1318
1308
  break;
1319
1309
  }
@@ -1333,21 +1323,23 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1333
1323
  break;
1334
1324
  }
1335
1325
  eventIndex++;
1336
- interruption?.tick();
1337
- if (interruption?.signal.aborted) {
1326
+ lifecycle.tick();
1327
+ if (lifecycle.signal.aborted) {
1338
1328
  interrupted = true;
1339
1329
  break;
1340
1330
  }
1341
1331
  }
1342
1332
  if (interrupted) {
1343
1333
  ws.destroy();
1344
- journalEntry.response.interrupted = true;
1345
- journalEntry.response.interruptReason = interruption?.reason();
1346
- interruption?.cleanup();
1334
+ markInterrupted(journalEntry, lifecycle.reason());
1335
+ lifecycle.dispose();
1336
+ return;
1337
+ }
1338
+ lifecycle.dispose();
1339
+ if (ws.isClosed) {
1340
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1347
1341
  return;
1348
1342
  }
1349
- interruption?.cleanup();
1350
- if (ws.isClosed) return;
1351
1343
  sendEvent(ws, {
1352
1344
  type: "response.output_text.done",
1353
1345
  response_id: responseId,
@@ -1394,11 +1386,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1394
1386
  object: "realtime.response",
1395
1387
  status: "completed",
1396
1388
  output: [outputItem],
1397
- usage: {
1398
- total_tokens: 0,
1399
- input_tokens: 0,
1400
- output_tokens: 0
1401
- }
1389
+ usage: render({ kind: "ordinary-zero" })
1402
1390
  }
1403
1391
  }, isBeta);
1404
1392
  conversationItems.push({
@@ -1428,7 +1416,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1428
1416
  }
1429
1417
  }, isBeta);
1430
1418
  const outputItems = [];
1431
- const interruption = createInterruptionSignal(fixture);
1419
+ const lifecycle = wsLifecycle(ws, fixture);
1432
1420
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
1433
1421
  const { recordedTimings } = fixture;
1434
1422
  let interrupted = false;
@@ -1463,8 +1451,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1463
1451
  for (let i = 0; i < args.length; i += chunkSize) {
1464
1452
  if (ws.isClosed) break;
1465
1453
  const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1466
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1467
- if (interruption?.signal.aborted) {
1454
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
1455
+ if (lifecycle.signal.aborted) {
1468
1456
  interrupted = true;
1469
1457
  break;
1470
1458
  }
@@ -1484,8 +1472,8 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1484
1472
  break;
1485
1473
  }
1486
1474
  eventIndex++;
1487
- interruption?.tick();
1488
- if (interruption?.signal.aborted) {
1475
+ lifecycle.tick();
1476
+ if (lifecycle.signal.aborted) {
1489
1477
  interrupted = true;
1490
1478
  break;
1491
1479
  }
@@ -1525,13 +1513,15 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1525
1513
  }
1526
1514
  if (interrupted) {
1527
1515
  ws.destroy();
1528
- journalEntry.response.interrupted = true;
1529
- journalEntry.response.interruptReason = interruption?.reason();
1530
- interruption?.cleanup();
1516
+ markInterrupted(journalEntry, lifecycle.reason());
1517
+ lifecycle.dispose();
1518
+ return;
1519
+ }
1520
+ lifecycle.dispose();
1521
+ if (ws.isClosed) {
1522
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1531
1523
  return;
1532
1524
  }
1533
- interruption?.cleanup();
1534
- if (ws.isClosed) return;
1535
1525
  sendEvent(ws, {
1536
1526
  type: "response.done",
1537
1527
  response: {
@@ -1539,11 +1529,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1539
1529
  object: "realtime.response",
1540
1530
  status: "completed",
1541
1531
  output: outputItems,
1542
- usage: {
1543
- total_tokens: 0,
1544
- input_tokens: 0,
1545
- output_tokens: 0
1546
- }
1532
+ usage: render({ kind: "ordinary-zero" })
1547
1533
  }
1548
1534
  }, isBeta);
1549
1535
  for (const item of outputItems) conversationItems.push(item);
@@ -1573,7 +1559,7 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1573
1559
  usage: null
1574
1560
  }
1575
1561
  }, isBeta);
1576
- const interruption = createInterruptionSignal(fixture);
1562
+ const lifecycle = wsLifecycle(ws, fixture);
1577
1563
  let interrupted = false;
1578
1564
  const allOutputItems = [];
1579
1565
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
@@ -1625,8 +1611,8 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1625
1611
  for (let i = 0; i < text.length; i += chunkSize) {
1626
1612
  if (ws.isClosed) break;
1627
1613
  const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1628
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1629
- if (interruption?.signal.aborted) {
1614
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
1615
+ if (lifecycle.signal.aborted) {
1630
1616
  interrupted = true;
1631
1617
  break;
1632
1618
  }
@@ -1646,8 +1632,8 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1646
1632
  break;
1647
1633
  }
1648
1634
  eventIndex++;
1649
- interruption?.tick();
1650
- if (interruption?.signal.aborted) {
1635
+ lifecycle.tick();
1636
+ if (lifecycle.signal.aborted) {
1651
1637
  interrupted = true;
1652
1638
  break;
1653
1639
  }
@@ -1726,8 +1712,8 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1726
1712
  for (let i = 0; i < args.length; i += chunkSize) {
1727
1713
  if (ws.isClosed) break;
1728
1714
  const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1729
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1730
- if (interruption?.signal.aborted) {
1715
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
1716
+ if (lifecycle.signal.aborted) {
1731
1717
  interrupted = true;
1732
1718
  break;
1733
1719
  }
@@ -1747,8 +1733,8 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1747
1733
  break;
1748
1734
  }
1749
1735
  eventIndex++;
1750
- interruption?.tick();
1751
- if (interruption?.signal.aborted) {
1736
+ lifecycle.tick();
1737
+ if (lifecycle.signal.aborted) {
1752
1738
  interrupted = true;
1753
1739
  break;
1754
1740
  }
@@ -1790,13 +1776,15 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1790
1776
  }
1791
1777
  if (interrupted) {
1792
1778
  ws.destroy();
1793
- journalEntry.response.interrupted = true;
1794
- journalEntry.response.interruptReason = interruption?.reason();
1795
- interruption?.cleanup();
1779
+ markInterrupted(journalEntry, lifecycle.reason());
1780
+ lifecycle.dispose();
1781
+ return;
1782
+ }
1783
+ lifecycle.dispose();
1784
+ if (ws.isClosed) {
1785
+ markWsTurnStopped(journalEntry, ws, lifecycle);
1796
1786
  return;
1797
1787
  }
1798
- interruption?.cleanup();
1799
- if (ws.isClosed) return;
1800
1788
  sendEvent(ws, {
1801
1789
  type: "response.done",
1802
1790
  response: {
@@ -1808,11 +1796,7 @@ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, l
1808
1796
  reason: fault.stop === "length" ? "max_output_tokens" : "content_filter"
1809
1797
  } } : {},
1810
1798
  output: allOutputItems,
1811
- usage: fault?.usage ?? {
1812
- total_tokens: 0,
1813
- input_tokens: 0,
1814
- output_tokens: 0
1815
- }
1799
+ usage: fault?.usage ?? render({ kind: "ordinary-zero" })
1816
1800
  }
1817
1801
  }, isBeta);
1818
1802
  for (const item of allOutputItems) {