@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,12 +1,20 @@
1
1
  import { DEFAULT_TEST_ID } from "./constants.js";
2
- import { fixtureToolCallErrorCode, flattenHeaders, formatToMime, generateToolCallId, googleFixtureToolCallErrorDetails, isAudioResponse, isCombinedFixtureResponse, isErrorResponse, isFixtureToolCallError, isTextResponse, isToolCallResponse, journalFixtureToolCallError, rejectResponsesOnlyToolCalls, requireServedFunctionToolCalls, resolveFixtureBlockOutcome, resolveFixtureBlocks, resolveResponse, resolveStrictMode, runWithToolArgumentsScope, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField, strictToolArgumentsEnabled, toolArgsForWire } from "./helpers.js";
2
+ import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
3
+ import { fixtureToolCallErrorCode, flattenHeaders, formatToMime, generateToolCallId, googleFixtureToolCallErrorDetails, isAudioResponse, isCombinedFixtureResponse, isErrorResponse, isFixtureToolCallError, isTextResponse, isToolCallResponse, journalFixtureToolCallError, rejectResponsesOnlyToolCalls, requireServedFunctionToolCalls, resolveFixtureBlockOutcome, resolveFixtureBlocks, resolveResponse, runWithToolArgumentsScope, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, strictToolArgumentsEnabled, toolArgsForWire } from "./helpers.js";
3
4
  import { calculateDelay, delay } from "./sse-writer.js";
4
5
  import { planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
5
6
  import { matchFixtureDiagnostic } from "./router.js";
6
7
  import "./journal.js";
7
- import { createInterruptionSignal } from "./interruption.js";
8
+ import { markWsTurnStopped, watchWsClose, wsLifecycle } from "./response/lifecycle.js";
8
9
 
9
10
  //#region src/ws-gemini-live.ts
11
+ /**
12
+ * WebSocket handler for Gemini Live BidiGenerateContent API.
13
+ *
14
+ * Accepts setup, clientContent, and toolResponse messages over WebSocket
15
+ * and responds with setupComplete, serverContent, toolCall, and error
16
+ * messages in the Gemini Live streaming format.
17
+ */
10
18
  const WS_PATH = "/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent";
11
19
  /**
12
20
  * Map HTTP status codes to gRPC error codes.
@@ -193,6 +201,7 @@ function preflightBlocks(response, journalEntry) {
193
201
  }
194
202
  function handleWebSocketGeminiLive(ws, fixtures, journal, defaults) {
195
203
  const { logger } = defaults;
204
+ watchWsClose(ws);
196
205
  const session = {
197
206
  setupDone: false,
198
207
  model: defaults.model,
@@ -301,7 +310,7 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
301
310
  const path = WS_PATH;
302
311
  if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
303
312
  if (!fixture) {
304
- if (resolveStrictMode(defaults.strict, defaults.upgradeHeaders)) {
313
+ if (resolveRequestDecisions(defaults.strict, defaults.upgradeHeaders).fixtureMiss) {
305
314
  const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
306
315
  defaults.logger.error(strictNoMatchLogLine("WS", path, skippedBySequenceOrTurn));
307
316
  journal.add({
@@ -389,40 +398,45 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
389
398
  const latency = fixture.latency ?? defaults.latency;
390
399
  if (misbehavior.kind === "applied" && (misbehavior.summary.fault === "tool-args-invalid-json" || misbehavior.summary.fault === "empty-response")) {
391
400
  const journalEntry = addResponseEntry(200);
392
- const interruption = createInterruptionSignal(fixture);
393
- const markInterrupted = () => {
394
- journalEntry.response.interrupted = true;
395
- journalEntry.response.interruptReason = interruption?.reason();
401
+ const lifecycle = wsLifecycle(ws, fixture);
402
+ const interruptTurn = () => {
403
+ markWsTurnStopped(journalEntry, ws, lifecycle);
396
404
  ws.destroy();
397
405
  };
398
406
  try {
399
- if (ws.isClosed) return;
407
+ if (ws.isClosed) {
408
+ interruptTurn();
409
+ return;
410
+ }
400
411
  const chunkDelay = calculateDelay(0, void 0, latency, fixture.recordedTimings, fixture.replaySpeed ?? defaults.replaySpeed);
401
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
402
- if (interruption?.signal.aborted) {
403
- markInterrupted();
412
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
413
+ if (lifecycle.signal.aborted || ws.isClosed) {
414
+ interruptTurn();
404
415
  return;
405
416
  }
406
- if (ws.isClosed) return;
407
417
  const malformed = misbehavior.summary.fault === "tool-args-invalid-json";
408
418
  ws.send(JSON.stringify({ serverContent: malformed ? {
409
419
  turnComplete: true,
410
420
  turnCompleteReason: "MALFORMED_FUNCTION_CALL"
411
421
  } : { modelTurn: { parts: [{ text: "" }] } } }));
412
- interruption?.tick();
413
- if (interruption?.signal.aborted) {
414
- markInterrupted();
422
+ lifecycle.tick();
423
+ if (lifecycle.signal.aborted || ws.isClosed) {
424
+ interruptTurn();
415
425
  return;
416
426
  }
417
- if (!malformed && !ws.isClosed) {
427
+ if (!malformed) {
418
428
  ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
429
+ if (ws.isClosed) {
430
+ interruptTurn();
431
+ return;
432
+ }
419
433
  session.conversationHistory.push({
420
434
  role: "assistant",
421
435
  content: ""
422
436
  });
423
437
  }
424
438
  } finally {
425
- interruption?.cleanup();
439
+ lifecycle.dispose();
426
440
  }
427
441
  return;
428
442
  }
@@ -459,25 +473,32 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
459
473
  ...tc,
460
474
  resolvedId: tc.id ?? generateToolCallId()
461
475
  }));
476
+ const stoppedByClose = () => {
477
+ if (!ws.isClosed) return false;
478
+ markWsTurnStopped(journalEntry, ws);
479
+ return true;
480
+ };
481
+ if (stoppedByClose()) return;
462
482
  if (resolvedToolCalls.length === 0) ws.send(JSON.stringify({ serverContent: {
463
483
  modelTurn: { parts },
464
484
  turnComplete: true
465
485
  } }));
466
486
  else {
467
487
  ws.send(JSON.stringify({ serverContent: { modelTurn: { parts } } }));
468
- if (!ws.isClosed) {
469
- const functionCalls = resolvedToolCalls.map((tc) => {
470
- const argsObj = liveToolArguments(tc);
471
- return {
472
- name: tc.name,
473
- args: argsObj,
474
- id: tc.resolvedId
475
- };
476
- });
477
- ws.send(JSON.stringify({ toolCall: { functionCalls } }));
478
- }
479
- if (!ws.isClosed) ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
488
+ if (stoppedByClose()) return;
489
+ const functionCalls = resolvedToolCalls.map((tc) => {
490
+ const argsObj = liveToolArguments(tc);
491
+ return {
492
+ name: tc.name,
493
+ args: argsObj,
494
+ id: tc.resolvedId
495
+ };
496
+ });
497
+ ws.send(JSON.stringify({ toolCall: { functionCalls } }));
498
+ if (stoppedByClose()) return;
499
+ ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
480
500
  }
501
+ if (stoppedByClose()) return;
481
502
  session.conversationHistory.push({
482
503
  role: "assistant",
483
504
  content: audioResp.content ?? "[audio]",
@@ -496,7 +517,7 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
496
517
  const journalEntry = addResponseEntry(200);
497
518
  if (response.blocks && response.blocks.length > 0) {
498
519
  const resolvedBlocks = preflightBlocks(response, journalEntry);
499
- const interruption = createInterruptionSignal(fixture);
520
+ const lifecycle = wsLifecycle(ws, fixture);
500
521
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
501
522
  const { recordedTimings } = fixture;
502
523
  let chunkIndex = 0;
@@ -506,8 +527,8 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
506
527
  outer: for (const block of resolvedBlocks) if (block.type === "toolCall") {
507
528
  if (ws.isClosed) break;
508
529
  const tcDelay = calculateDelay(chunkIndex, void 0, latency, recordedTimings, replaySpeed);
509
- if (tcDelay > 0) await delay(tcDelay, interruption?.signal);
510
- if (interruption?.signal.aborted) {
530
+ if (tcDelay > 0) await delay(tcDelay, lifecycle.signal);
531
+ if (lifecycle.signal.aborted) {
511
532
  interrupted = true;
512
533
  break;
513
534
  }
@@ -533,8 +554,8 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
533
554
  arguments: block.arguments
534
555
  }
535
556
  });
536
- interruption?.tick();
537
- if (interruption?.signal.aborted) {
557
+ lifecycle.tick();
558
+ if (lifecycle.signal.aborted) {
538
559
  interrupted = true;
539
560
  break;
540
561
  }
@@ -545,8 +566,8 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
545
566
  for (let i = 0; i < text.length; i += chunkSize) {
546
567
  if (ws.isClosed) break outer;
547
568
  const chunkDelay = calculateDelay(chunkIndex, void 0, latency, recordedTimings, replaySpeed);
548
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
549
- if (interruption?.signal.aborted) {
569
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
570
+ if (lifecycle.signal.aborted) {
550
571
  interrupted = true;
551
572
  break outer;
552
573
  }
@@ -558,22 +579,25 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
558
579
  break outer;
559
580
  }
560
581
  chunkIndex++;
561
- interruption?.tick();
562
- if (interruption?.signal.aborted) {
582
+ lifecycle.tick();
583
+ if (lifecycle.signal.aborted) {
563
584
  interrupted = true;
564
585
  break outer;
565
586
  }
566
587
  }
567
588
  }
568
- if (interrupted) {
589
+ if (interrupted || ws.isClosed) {
569
590
  ws.destroy();
570
- journalEntry.response.interrupted = true;
571
- journalEntry.response.interruptReason = interruption?.reason();
572
- interruption?.cleanup();
591
+ markWsTurnStopped(journalEntry, ws, lifecycle);
592
+ lifecycle.dispose();
593
+ return;
594
+ }
595
+ lifecycle.dispose();
596
+ ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
597
+ if (ws.isClosed) {
598
+ markWsTurnStopped(journalEntry, ws, lifecycle);
573
599
  return;
574
600
  }
575
- interruption?.cleanup();
576
- if (!ws.isClosed) ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
577
601
  session.conversationHistory.push({
578
602
  role: "assistant",
579
603
  content: historyContent || null,
@@ -585,7 +609,7 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
585
609
  const content = response.content ?? "";
586
610
  const chunkList = [];
587
611
  for (let i = 0; i < content.length; i += chunkSize) chunkList.push(content.slice(i, i + chunkSize));
588
- const interruption = createInterruptionSignal(fixture);
612
+ const lifecycle = wsLifecycle(ws, fixture);
589
613
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
590
614
  const { recordedTimings } = fixture;
591
615
  let interrupted = false;
@@ -594,8 +618,8 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
594
618
  } else for (let i = 0; i < chunkList.length; i++) {
595
619
  if (ws.isClosed) break;
596
620
  const chunkDelay = calculateDelay(i, void 0, latency, recordedTimings, replaySpeed);
597
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
598
- if (interruption?.signal.aborted) {
621
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
622
+ if (lifecycle.signal.aborted) {
599
623
  interrupted = true;
600
624
  break;
601
625
  }
@@ -606,17 +630,16 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
606
630
  defaults.logger.debug("[gemini-live] send failed during text streaming, closing", err);
607
631
  break;
608
632
  }
609
- interruption?.tick();
610
- if (interruption?.signal.aborted) {
633
+ lifecycle.tick();
634
+ if (lifecycle.signal.aborted) {
611
635
  interrupted = true;
612
636
  break;
613
637
  }
614
638
  }
615
- if (interrupted) {
639
+ if (interrupted || ws.isClosed) {
616
640
  ws.destroy();
617
- journalEntry.response.interrupted = true;
618
- journalEntry.response.interruptReason = interruption?.reason();
619
- interruption?.cleanup();
641
+ markWsTurnStopped(journalEntry, ws, lifecycle);
642
+ lifecycle.dispose();
620
643
  return;
621
644
  }
622
645
  const resolvedToolCalls = functionToolCalls.map((tc) => ({
@@ -625,12 +648,11 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
625
648
  }));
626
649
  if (!ws.isClosed) {
627
650
  const tcDelay = calculateDelay(chunkList.length, void 0, latency, recordedTimings, replaySpeed);
628
- if (tcDelay > 0) await delay(tcDelay, interruption?.signal);
629
- if (interruption?.signal.aborted) {
651
+ if (tcDelay > 0) await delay(tcDelay, lifecycle.signal);
652
+ if (lifecycle.signal.aborted || ws.isClosed) {
630
653
  ws.destroy();
631
- journalEntry.response.interrupted = true;
632
- journalEntry.response.interruptReason = interruption?.reason();
633
- interruption?.cleanup();
654
+ markWsTurnStopped(journalEntry, ws, lifecycle);
655
+ lifecycle.dispose();
634
656
  return;
635
657
  }
636
658
  const functionCalls = resolvedToolCalls.map((tc) => {
@@ -642,17 +664,20 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
642
664
  };
643
665
  });
644
666
  ws.send(JSON.stringify({ toolCall: { functionCalls } }));
645
- interruption?.tick();
667
+ lifecycle.tick();
646
668
  }
647
- if (interruption?.signal.aborted) {
669
+ if (lifecycle.signal.aborted || ws.isClosed) {
648
670
  ws.destroy();
649
- journalEntry.response.interrupted = true;
650
- journalEntry.response.interruptReason = interruption?.reason();
651
- interruption?.cleanup();
671
+ markWsTurnStopped(journalEntry, ws, lifecycle);
672
+ lifecycle.dispose();
673
+ return;
674
+ }
675
+ lifecycle.dispose();
676
+ ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
677
+ if (ws.isClosed) {
678
+ markWsTurnStopped(journalEntry, ws, lifecycle);
652
679
  return;
653
680
  }
654
- interruption?.cleanup();
655
- if (!ws.isClosed) ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
656
681
  session.conversationHistory.push({
657
682
  role: "assistant",
658
683
  content: content || null,
@@ -671,22 +696,30 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
671
696
  const journalEntry = addResponseEntry(200);
672
697
  const content = response.content;
673
698
  if (content.length === 0) {
674
- if (ws.isClosed) return;
699
+ if (ws.isClosed) {
700
+ markWsTurnStopped(journalEntry, ws);
701
+ return;
702
+ }
675
703
  ws.send(JSON.stringify({ serverContent: { modelTurn: { parts: [{ text: "" }] } } }));
704
+ if (ws.isClosed) {
705
+ markWsTurnStopped(journalEntry, ws);
706
+ return;
707
+ }
676
708
  ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
709
+ if (ws.isClosed) markWsTurnStopped(journalEntry, ws);
677
710
  return;
678
711
  }
679
712
  const chunks = [];
680
713
  for (let i = 0; i < content.length; i += chunkSize) chunks.push(content.slice(i, i + chunkSize));
681
- const interruption = createInterruptionSignal(fixture);
714
+ const lifecycle = wsLifecycle(ws, fixture);
682
715
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
683
716
  const { recordedTimings } = fixture;
684
717
  let interrupted = false;
685
718
  for (let i = 0; i < chunks.length; i++) {
686
719
  if (ws.isClosed) break;
687
720
  const chunkDelay = calculateDelay(i, void 0, latency, recordedTimings, replaySpeed);
688
- if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
689
- if (interruption?.signal.aborted) {
721
+ if (chunkDelay > 0) await delay(chunkDelay, lifecycle.signal);
722
+ if (lifecycle.signal.aborted) {
690
723
  interrupted = true;
691
724
  break;
692
725
  }
@@ -697,21 +730,24 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
697
730
  defaults.logger.debug("[gemini-live] send failed during text streaming, closing", err);
698
731
  break;
699
732
  }
700
- interruption?.tick();
701
- if (interruption?.signal.aborted) {
733
+ lifecycle.tick();
734
+ if (lifecycle.signal.aborted) {
702
735
  interrupted = true;
703
736
  break;
704
737
  }
705
738
  }
706
- if (interrupted) {
739
+ if (interrupted || ws.isClosed) {
707
740
  ws.destroy();
708
- journalEntry.response.interrupted = true;
709
- journalEntry.response.interruptReason = interruption?.reason();
710
- interruption?.cleanup();
741
+ markWsTurnStopped(journalEntry, ws, lifecycle);
742
+ lifecycle.dispose();
743
+ return;
744
+ }
745
+ lifecycle.dispose();
746
+ ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
747
+ if (ws.isClosed) {
748
+ markWsTurnStopped(journalEntry, ws, lifecycle);
711
749
  return;
712
750
  }
713
- interruption?.cleanup();
714
- if (!ws.isClosed) ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
715
751
  session.conversationHistory.push({
716
752
  role: "assistant",
717
753
  content
@@ -721,24 +757,20 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
721
757
  if (isToolCallResponse(response)) {
722
758
  const journalEntry = addResponseEntry(200);
723
759
  const functionToolCalls = preflightToolArguments(response, journalEntry);
724
- const interruption = createInterruptionSignal(fixture);
760
+ const lifecycle = wsLifecycle(ws, fixture);
725
761
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
726
762
  const { recordedTimings } = fixture;
727
763
  if (ws.isClosed) {
728
- interruption?.cleanup();
764
+ markWsTurnStopped(journalEntry, ws, lifecycle);
765
+ lifecycle.dispose();
729
766
  return;
730
767
  }
731
768
  const tcDelay = calculateDelay(0, void 0, latency, recordedTimings, replaySpeed);
732
- if (tcDelay > 0) await delay(tcDelay, interruption?.signal);
733
- if (interruption?.signal.aborted) {
769
+ if (tcDelay > 0) await delay(tcDelay, lifecycle.signal);
770
+ if (lifecycle.signal.aborted || ws.isClosed) {
734
771
  ws.destroy();
735
- journalEntry.response.interrupted = true;
736
- journalEntry.response.interruptReason = interruption?.reason();
737
- interruption?.cleanup();
738
- return;
739
- }
740
- if (ws.isClosed) {
741
- interruption?.cleanup();
772
+ markWsTurnStopped(journalEntry, ws, lifecycle);
773
+ lifecycle.dispose();
742
774
  return;
743
775
  }
744
776
  const resolvedToolCalls = functionToolCalls.map((tc) => ({
@@ -754,16 +786,19 @@ async function processMessage(raw, ws, fixtures, journal, defaults, session) {
754
786
  };
755
787
  });
756
788
  ws.send(JSON.stringify({ toolCall: { functionCalls } }));
757
- interruption?.tick();
758
- if (interruption?.signal.aborted) {
789
+ lifecycle.tick();
790
+ if (lifecycle.signal.aborted || ws.isClosed) {
759
791
  ws.destroy();
760
- journalEntry.response.interrupted = true;
761
- journalEntry.response.interruptReason = interruption?.reason();
762
- interruption?.cleanup();
792
+ markWsTurnStopped(journalEntry, ws, lifecycle);
793
+ lifecycle.dispose();
794
+ return;
795
+ }
796
+ lifecycle.dispose();
797
+ ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
798
+ if (ws.isClosed) {
799
+ markWsTurnStopped(journalEntry, ws, lifecycle);
763
800
  return;
764
801
  }
765
- interruption?.cleanup();
766
- if (!ws.isClosed) ws.send(JSON.stringify({ serverContent: { turnComplete: true } }));
767
802
  session.conversationHistory.push({
768
803
  role: "assistant",
769
804
  content: null,