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