@copilotkit/aimock 1.42.1 → 1.44.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 (442) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +65 -0
  4. package/README.md +108 -16
  5. package/dist/agui-handler.d.ts.map +1 -1
  6. package/dist/agui-mock.cjs +1 -1
  7. package/dist/agui-mock.cjs.map +1 -1
  8. package/dist/agui-mock.d.cts.map +1 -1
  9. package/dist/agui-mock.d.ts.map +1 -1
  10. package/dist/agui-mock.js +1 -1
  11. package/dist/agui-mock.js.map +1 -1
  12. package/dist/agui-recorder.cjs +33 -11
  13. package/dist/agui-recorder.cjs.map +1 -1
  14. package/dist/agui-recorder.d.cts +10 -1
  15. package/dist/agui-recorder.d.cts.map +1 -1
  16. package/dist/agui-recorder.d.ts +10 -1
  17. package/dist/agui-recorder.d.ts.map +1 -1
  18. package/dist/agui-recorder.js +33 -11
  19. package/dist/agui-recorder.js.map +1 -1
  20. package/dist/agui-types.d.cts +1 -0
  21. package/dist/agui-types.d.cts.map +1 -1
  22. package/dist/agui-types.d.ts +1 -0
  23. package/dist/agui-types.d.ts.map +1 -1
  24. package/dist/aimock-cli.cjs +38 -10
  25. package/dist/aimock-cli.cjs.map +1 -1
  26. package/dist/aimock-cli.d.cts +5 -0
  27. package/dist/aimock-cli.d.cts.map +1 -1
  28. package/dist/aimock-cli.d.ts +5 -0
  29. package/dist/aimock-cli.d.ts.map +1 -1
  30. package/dist/aimock-cli.js +38 -10
  31. package/dist/aimock-cli.js.map +1 -1
  32. package/dist/batches.cjs +458 -0
  33. package/dist/batches.cjs.map +1 -0
  34. package/dist/batches.d.cts +57 -0
  35. package/dist/batches.d.cts.map +1 -0
  36. package/dist/batches.d.ts +57 -0
  37. package/dist/batches.d.ts.map +1 -0
  38. package/dist/batches.js +453 -0
  39. package/dist/batches.js.map +1 -0
  40. package/dist/bedrock-converse.cjs +44 -12
  41. package/dist/bedrock-converse.cjs.map +1 -1
  42. package/dist/bedrock-converse.d.cts.map +1 -1
  43. package/dist/bedrock-converse.d.ts.map +1 -1
  44. package/dist/bedrock-converse.js +46 -14
  45. package/dist/bedrock-converse.js.map +1 -1
  46. package/dist/bedrock.cjs +10 -8
  47. package/dist/bedrock.cjs.map +1 -1
  48. package/dist/bedrock.d.cts.map +1 -1
  49. package/dist/bedrock.d.ts.map +1 -1
  50. package/dist/bedrock.js +12 -10
  51. package/dist/bedrock.js.map +1 -1
  52. package/dist/byteplus-video.cjs +3 -3
  53. package/dist/byteplus-video.cjs.map +1 -1
  54. package/dist/byteplus-video.js +4 -4
  55. package/dist/byteplus-video.js.map +1 -1
  56. package/dist/chaos.cjs +625 -72
  57. package/dist/chaos.cjs.map +1 -1
  58. package/dist/chaos.d.cts +164 -7
  59. package/dist/chaos.d.cts.map +1 -1
  60. package/dist/chaos.d.ts +164 -7
  61. package/dist/chaos.d.ts.map +1 -1
  62. package/dist/chaos.js +616 -74
  63. package/dist/chaos.js.map +1 -1
  64. package/dist/cli.cjs +131 -30
  65. package/dist/cli.cjs.map +1 -1
  66. package/dist/cli.js +132 -31
  67. package/dist/cli.js.map +1 -1
  68. package/dist/cohere.cjs +37 -9
  69. package/dist/cohere.cjs.map +1 -1
  70. package/dist/cohere.d.cts.map +1 -1
  71. package/dist/cohere.d.ts.map +1 -1
  72. package/dist/cohere.js +39 -11
  73. package/dist/cohere.js.map +1 -1
  74. package/dist/config-loader.cjs +1 -1
  75. package/dist/config-loader.js +1 -1
  76. package/dist/constants.cjs +8 -0
  77. package/dist/constants.cjs.map +1 -1
  78. package/dist/constants.d.cts +6 -2
  79. package/dist/constants.d.ts +6 -2
  80. package/dist/constants.js +8 -1
  81. package/dist/constants.js.map +1 -1
  82. package/dist/convert.cjs +1 -1
  83. package/dist/convert.cjs.map +1 -1
  84. package/dist/convert.js +1 -1
  85. package/dist/convert.js.map +1 -1
  86. package/dist/echo-text.cjs +65 -0
  87. package/dist/echo-text.cjs.map +1 -0
  88. package/dist/echo-text.d.cts +22 -0
  89. package/dist/echo-text.d.cts.map +1 -0
  90. package/dist/echo-text.d.ts +22 -0
  91. package/dist/echo-text.d.ts.map +1 -0
  92. package/dist/echo-text.js +65 -0
  93. package/dist/echo-text.js.map +1 -0
  94. package/dist/elevenlabs-audio.cjs +3 -3
  95. package/dist/elevenlabs-audio.cjs.map +1 -1
  96. package/dist/elevenlabs-audio.js +4 -4
  97. package/dist/elevenlabs-audio.js.map +1 -1
  98. package/dist/elevenlabs-voice.cjs +1053 -0
  99. package/dist/elevenlabs-voice.cjs.map +1 -0
  100. package/dist/elevenlabs-voice.d.cts +72 -0
  101. package/dist/elevenlabs-voice.d.cts.map +1 -0
  102. package/dist/elevenlabs-voice.d.ts +72 -0
  103. package/dist/elevenlabs-voice.d.ts.map +1 -0
  104. package/dist/elevenlabs-voice.js +1048 -0
  105. package/dist/elevenlabs-voice.js.map +1 -0
  106. package/dist/embeddings.cjs +26 -5
  107. package/dist/embeddings.cjs.map +1 -1
  108. package/dist/embeddings.d.cts +1 -1
  109. package/dist/embeddings.d.cts.map +1 -1
  110. package/dist/embeddings.d.ts +1 -1
  111. package/dist/embeddings.d.ts.map +1 -1
  112. package/dist/embeddings.js +27 -6
  113. package/dist/embeddings.js.map +1 -1
  114. package/dist/fal-audio.cjs +3 -3
  115. package/dist/fal-audio.cjs.map +1 -1
  116. package/dist/fal-audio.js +4 -4
  117. package/dist/fal-audio.js.map +1 -1
  118. package/dist/fal.cjs +28 -4
  119. package/dist/fal.cjs.map +1 -1
  120. package/dist/fal.d.cts +16 -1
  121. package/dist/fal.d.cts.map +1 -1
  122. package/dist/fal.d.ts +16 -1
  123. package/dist/fal.d.ts.map +1 -1
  124. package/dist/fal.js +28 -5
  125. package/dist/fal.js.map +1 -1
  126. package/dist/files.cjs +1069 -0
  127. package/dist/files.cjs.map +1 -0
  128. package/dist/files.d.cts +68 -0
  129. package/dist/files.d.cts.map +1 -0
  130. package/dist/files.d.ts +68 -0
  131. package/dist/files.d.ts.map +1 -0
  132. package/dist/files.js +1056 -0
  133. package/dist/files.js.map +1 -0
  134. package/dist/fine-tuning.cjs +1033 -0
  135. package/dist/fine-tuning.cjs.map +1 -0
  136. package/dist/fine-tuning.d.cts +96 -0
  137. package/dist/fine-tuning.d.cts.map +1 -0
  138. package/dist/fine-tuning.d.ts +96 -0
  139. package/dist/fine-tuning.d.ts.map +1 -0
  140. package/dist/fine-tuning.js +1026 -0
  141. package/dist/fine-tuning.js.map +1 -0
  142. package/dist/fixture-loader-services.cjs +116 -0
  143. package/dist/fixture-loader-services.cjs.map +1 -0
  144. package/dist/fixture-loader-services.d.cts +48 -0
  145. package/dist/fixture-loader-services.d.cts.map +1 -0
  146. package/dist/fixture-loader-services.d.ts +48 -0
  147. package/dist/fixture-loader-services.d.ts.map +1 -0
  148. package/dist/fixture-loader-services.js +114 -0
  149. package/dist/fixture-loader-services.js.map +1 -0
  150. package/dist/fixture-loader.cjs +0 -0
  151. package/dist/fixture-loader.cjs.map +1 -1
  152. package/dist/fixture-loader.d.cts +131 -5
  153. package/dist/fixture-loader.d.cts.map +1 -1
  154. package/dist/fixture-loader.d.ts +131 -5
  155. package/dist/fixture-loader.d.ts.map +1 -1
  156. package/dist/fixture-loader.js +0 -0
  157. package/dist/fixture-loader.js.map +1 -1
  158. package/dist/gemini-embeddings.cjs +44 -4
  159. package/dist/gemini-embeddings.cjs.map +1 -1
  160. package/dist/gemini-embeddings.js +46 -6
  161. package/dist/gemini-embeddings.js.map +1 -1
  162. package/dist/gemini-interactions.cjs +51 -7
  163. package/dist/gemini-interactions.cjs.map +1 -1
  164. package/dist/gemini-interactions.d.cts.map +1 -1
  165. package/dist/gemini-interactions.d.ts.map +1 -1
  166. package/dist/gemini-interactions.js +53 -9
  167. package/dist/gemini-interactions.js.map +1 -1
  168. package/dist/gemini.cjs +19 -8
  169. package/dist/gemini.cjs.map +1 -1
  170. package/dist/gemini.d.cts.map +1 -1
  171. package/dist/gemini.d.ts.map +1 -1
  172. package/dist/gemini.js +21 -10
  173. package/dist/gemini.js.map +1 -1
  174. package/dist/grok-video.cjs +14 -14
  175. package/dist/grok-video.cjs.map +1 -1
  176. package/dist/grok-video.js +15 -15
  177. package/dist/grok-video.js.map +1 -1
  178. package/dist/helpers.cjs +497 -10
  179. package/dist/helpers.cjs.map +1 -1
  180. package/dist/helpers.d.cts +38 -2
  181. package/dist/helpers.d.cts.map +1 -1
  182. package/dist/helpers.d.ts +38 -2
  183. package/dist/helpers.d.ts.map +1 -1
  184. package/dist/helpers.js +487 -12
  185. package/dist/helpers.js.map +1 -1
  186. package/dist/images.cjs +57 -125
  187. package/dist/images.cjs.map +1 -1
  188. package/dist/images.d.cts.map +1 -1
  189. package/dist/images.d.ts.map +1 -1
  190. package/dist/images.js +58 -126
  191. package/dist/images.js.map +1 -1
  192. package/dist/index.cjs +71 -9
  193. package/dist/index.d.cts +17 -7
  194. package/dist/index.d.ts +17 -7
  195. package/dist/index.js +21 -11
  196. package/dist/jest.cjs +24 -12
  197. package/dist/jest.cjs.map +1 -1
  198. package/dist/jest.d.cts +6 -3
  199. package/dist/jest.d.cts.map +1 -1
  200. package/dist/jest.d.ts +6 -3
  201. package/dist/jest.d.ts.map +1 -1
  202. package/dist/jest.js +25 -13
  203. package/dist/jest.js.map +1 -1
  204. package/dist/journal.cjs +61 -4
  205. package/dist/journal.cjs.map +1 -1
  206. package/dist/journal.d.cts +60 -3
  207. package/dist/journal.d.cts.map +1 -1
  208. package/dist/journal.d.ts +60 -3
  209. package/dist/journal.d.ts.map +1 -1
  210. package/dist/journal.js +61 -5
  211. package/dist/journal.js.map +1 -1
  212. package/dist/live-fixture.cjs +1192 -0
  213. package/dist/live-fixture.cjs.map +1 -0
  214. package/dist/live-fixture.js +1187 -0
  215. package/dist/live-fixture.js.map +1 -0
  216. package/dist/live-recorder.cjs +256 -0
  217. package/dist/live-recorder.cjs.map +1 -0
  218. package/dist/live-recorder.js +254 -0
  219. package/dist/live-recorder.js.map +1 -0
  220. package/dist/live-replay.cjs +286 -0
  221. package/dist/live-replay.cjs.map +1 -0
  222. package/dist/live-replay.js +285 -0
  223. package/dist/live-replay.js.map +1 -0
  224. package/dist/live-sanitize.cjs +196 -0
  225. package/dist/live-sanitize.cjs.map +1 -0
  226. package/dist/live-sanitize.js +196 -0
  227. package/dist/live-sanitize.js.map +1 -0
  228. package/dist/live-types.d.cts +71 -0
  229. package/dist/live-types.d.cts.map +1 -0
  230. package/dist/live-types.d.ts +71 -0
  231. package/dist/live-types.d.ts.map +1 -0
  232. package/dist/llmock.cjs +132 -49
  233. package/dist/llmock.cjs.map +1 -1
  234. package/dist/llmock.d.cts +51 -5
  235. package/dist/llmock.d.cts.map +1 -1
  236. package/dist/llmock.d.ts +51 -5
  237. package/dist/llmock.d.ts.map +1 -1
  238. package/dist/llmock.js +133 -50
  239. package/dist/llmock.js.map +1 -1
  240. package/dist/mcp-fakes-mount.cjs +216 -0
  241. package/dist/mcp-fakes-mount.cjs.map +1 -0
  242. package/dist/mcp-fakes-mount.js +210 -0
  243. package/dist/mcp-fakes-mount.js.map +1 -0
  244. package/dist/mcp-fakes.cjs +1619 -0
  245. package/dist/mcp-fakes.cjs.map +1 -0
  246. package/dist/mcp-fakes.d.cts +101 -0
  247. package/dist/mcp-fakes.d.cts.map +1 -0
  248. package/dist/mcp-fakes.d.ts +101 -0
  249. package/dist/mcp-fakes.d.ts.map +1 -0
  250. package/dist/mcp-fakes.js +1614 -0
  251. package/dist/mcp-fakes.js.map +1 -0
  252. package/dist/mcp-handler.cjs +331 -17
  253. package/dist/mcp-handler.cjs.map +1 -1
  254. package/dist/mcp-handler.js +330 -18
  255. package/dist/mcp-handler.js.map +1 -1
  256. package/dist/mcp-mock.cjs +217 -49
  257. package/dist/mcp-mock.cjs.map +1 -1
  258. package/dist/mcp-mock.d.cts +66 -1
  259. package/dist/mcp-mock.d.cts.map +1 -1
  260. package/dist/mcp-mock.d.ts +66 -1
  261. package/dist/mcp-mock.d.ts.map +1 -1
  262. package/dist/mcp-mock.js +218 -50
  263. package/dist/mcp-mock.js.map +1 -1
  264. package/dist/mcp-stub.cjs +5 -1
  265. package/dist/mcp-stub.d.cts +3 -1
  266. package/dist/mcp-stub.d.ts +3 -1
  267. package/dist/mcp-stub.js +3 -1
  268. package/dist/mcp-types.d.cts +6 -0
  269. package/dist/mcp-types.d.ts +6 -0
  270. package/dist/message-text.cjs +192 -0
  271. package/dist/message-text.cjs.map +1 -0
  272. package/dist/message-text.d.cts +31 -0
  273. package/dist/message-text.d.cts.map +1 -0
  274. package/dist/message-text.d.ts +31 -0
  275. package/dist/message-text.d.ts.map +1 -0
  276. package/dist/message-text.js +184 -0
  277. package/dist/message-text.js.map +1 -0
  278. package/dist/messages.cjs +49 -7
  279. package/dist/messages.cjs.map +1 -1
  280. package/dist/messages.d.cts.map +1 -1
  281. package/dist/messages.d.ts.map +1 -1
  282. package/dist/messages.js +51 -9
  283. package/dist/messages.js.map +1 -1
  284. package/dist/metrics.cjs +278 -45
  285. package/dist/metrics.cjs.map +1 -1
  286. package/dist/metrics.d.cts +17 -7
  287. package/dist/metrics.d.cts.map +1 -1
  288. package/dist/metrics.d.ts +17 -7
  289. package/dist/metrics.d.ts.map +1 -1
  290. package/dist/metrics.js +270 -29
  291. package/dist/metrics.js.map +1 -1
  292. package/dist/moderation.cjs +10 -1
  293. package/dist/moderation.cjs.map +1 -1
  294. package/dist/moderation.d.cts.map +1 -1
  295. package/dist/moderation.d.ts.map +1 -1
  296. package/dist/moderation.js +10 -1
  297. package/dist/moderation.js.map +1 -1
  298. package/dist/ollama.cjs +10 -6
  299. package/dist/ollama.cjs.map +1 -1
  300. package/dist/ollama.d.cts.map +1 -1
  301. package/dist/ollama.d.ts.map +1 -1
  302. package/dist/ollama.js +11 -7
  303. package/dist/ollama.js.map +1 -1
  304. package/dist/openapi.cjs +3405 -0
  305. package/dist/openapi.cjs.map +1 -0
  306. package/dist/openapi.d.cts +30 -0
  307. package/dist/openapi.d.cts.map +1 -0
  308. package/dist/openapi.d.ts +30 -0
  309. package/dist/openapi.d.ts.map +1 -0
  310. package/dist/openapi.js +3404 -0
  311. package/dist/openapi.js.map +1 -0
  312. package/dist/openrouter-video.cjs +9 -9
  313. package/dist/openrouter-video.cjs.map +1 -1
  314. package/dist/openrouter-video.d.cts.map +1 -1
  315. package/dist/openrouter-video.d.ts.map +1 -1
  316. package/dist/openrouter-video.js +10 -10
  317. package/dist/openrouter-video.js.map +1 -1
  318. package/dist/recorder.cjs +54 -10
  319. package/dist/recorder.cjs.map +1 -1
  320. package/dist/recorder.d.cts.map +1 -1
  321. package/dist/recorder.d.ts.map +1 -1
  322. package/dist/recorder.js +52 -12
  323. package/dist/recorder.js.map +1 -1
  324. package/dist/responses.cjs +47 -7
  325. package/dist/responses.cjs.map +1 -1
  326. package/dist/responses.d.cts.map +1 -1
  327. package/dist/responses.d.ts.map +1 -1
  328. package/dist/responses.js +48 -9
  329. package/dist/responses.js.map +1 -1
  330. package/dist/route-registry.cjs +951 -0
  331. package/dist/route-registry.cjs.map +1 -0
  332. package/dist/route-registry.d.cts +33 -0
  333. package/dist/route-registry.d.cts.map +1 -0
  334. package/dist/route-registry.d.ts +33 -0
  335. package/dist/route-registry.d.ts.map +1 -0
  336. package/dist/route-registry.js +866 -0
  337. package/dist/route-registry.js.map +1 -0
  338. package/dist/router.cjs +21 -34
  339. package/dist/router.cjs.map +1 -1
  340. package/dist/router.d.cts +4 -1
  341. package/dist/router.d.cts.map +1 -1
  342. package/dist/router.d.ts +4 -1
  343. package/dist/router.d.ts.map +1 -1
  344. package/dist/router.js +21 -35
  345. package/dist/router.js.map +1 -1
  346. package/dist/server.cjs +1252 -777
  347. package/dist/server.cjs.map +1 -1
  348. package/dist/server.d.cts +5 -1
  349. package/dist/server.d.cts.map +1 -1
  350. package/dist/server.d.ts +5 -1
  351. package/dist/server.d.ts.map +1 -1
  352. package/dist/server.js +1185 -710
  353. package/dist/server.js.map +1 -1
  354. package/dist/speech.cjs +6 -4
  355. package/dist/speech.cjs.map +1 -1
  356. package/dist/speech.js +7 -5
  357. package/dist/speech.js.map +1 -1
  358. package/dist/suite.cjs +1 -1
  359. package/dist/suite.js +1 -1
  360. package/dist/transcription.cjs +6 -6
  361. package/dist/transcription.cjs.map +1 -1
  362. package/dist/transcription.d.cts.map +1 -1
  363. package/dist/transcription.d.ts.map +1 -1
  364. package/dist/transcription.js +7 -7
  365. package/dist/transcription.js.map +1 -1
  366. package/dist/types.cjs +18 -0
  367. package/dist/types.cjs.map +1 -0
  368. package/dist/types.d.cts +320 -17
  369. package/dist/types.d.cts.map +1 -1
  370. package/dist/types.d.ts +320 -17
  371. package/dist/types.d.ts.map +1 -1
  372. package/dist/types.js +17 -0
  373. package/dist/types.js.map +1 -0
  374. package/dist/validate-cli.cjs +983 -0
  375. package/dist/validate-cli.cjs.map +1 -0
  376. package/dist/validate-cli.js +982 -0
  377. package/dist/validate-cli.js.map +1 -0
  378. package/dist/vector-stores.cjs +1180 -0
  379. package/dist/vector-stores.cjs.map +1 -0
  380. package/dist/vector-stores.d.cts +106 -0
  381. package/dist/vector-stores.d.cts.map +1 -0
  382. package/dist/vector-stores.d.ts +106 -0
  383. package/dist/vector-stores.d.ts.map +1 -0
  384. package/dist/vector-stores.js +1164 -0
  385. package/dist/vector-stores.js.map +1 -0
  386. package/dist/vector-types.d.cts.map +1 -1
  387. package/dist/vector-types.d.ts.map +1 -1
  388. package/dist/veo-video.cjs +13 -13
  389. package/dist/veo-video.cjs.map +1 -1
  390. package/dist/veo-video.js +14 -14
  391. package/dist/veo-video.js.map +1 -1
  392. package/dist/video.cjs +23 -4
  393. package/dist/video.cjs.map +1 -1
  394. package/dist/video.d.cts +1 -1
  395. package/dist/video.d.cts.map +1 -1
  396. package/dist/video.d.ts +1 -1
  397. package/dist/video.d.ts.map +1 -1
  398. package/dist/video.js +24 -5
  399. package/dist/video.js.map +1 -1
  400. package/dist/vitest.cjs +23 -11
  401. package/dist/vitest.cjs.map +1 -1
  402. package/dist/vitest.d.cts +5 -2
  403. package/dist/vitest.d.cts.map +1 -1
  404. package/dist/vitest.d.ts +5 -2
  405. package/dist/vitest.d.ts.map +1 -1
  406. package/dist/vitest.js +25 -13
  407. package/dist/vitest.js.map +1 -1
  408. package/dist/watcher.cjs +2 -1
  409. package/dist/watcher.cjs.map +1 -1
  410. package/dist/watcher.js +2 -1
  411. package/dist/watcher.js.map +1 -1
  412. package/dist/ws-framing.cjs +150 -35
  413. package/dist/ws-framing.cjs.map +1 -1
  414. package/dist/ws-framing.d.cts +18 -3
  415. package/dist/ws-framing.d.cts.map +1 -1
  416. package/dist/ws-framing.d.ts +18 -3
  417. package/dist/ws-framing.d.ts.map +1 -1
  418. package/dist/ws-framing.js +151 -36
  419. package/dist/ws-framing.js.map +1 -1
  420. package/dist/ws-gemini-live.cjs +2 -2
  421. package/dist/ws-gemini-live.js +2 -2
  422. package/dist/ws-live.cjs +401 -0
  423. package/dist/ws-live.cjs.map +1 -0
  424. package/dist/ws-live.js +400 -0
  425. package/dist/ws-live.js.map +1 -0
  426. package/dist/ws-realtime.cjs +46 -2
  427. package/dist/ws-realtime.cjs.map +1 -1
  428. package/dist/ws-realtime.d.cts.map +1 -1
  429. package/dist/ws-realtime.d.ts.map +1 -1
  430. package/dist/ws-realtime.js +46 -2
  431. package/dist/ws-realtime.js.map +1 -1
  432. package/dist/ws-responses.cjs +16 -4
  433. package/dist/ws-responses.cjs.map +1 -1
  434. package/dist/ws-responses.js +16 -4
  435. package/dist/ws-responses.js.map +1 -1
  436. package/dist/ws-upstream.cjs +118 -0
  437. package/dist/ws-upstream.cjs.map +1 -0
  438. package/dist/ws-upstream.js +115 -0
  439. package/dist/ws-upstream.js.map +1 -0
  440. package/fixtures/openai-live-client.json +390 -0
  441. package/fixtures/openai-live-managed.json +709 -0
  442. package/package.json +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-fixture.js","names":[],"sources":["../src/live-fixture.ts"],"sourcesContent":["import type {\n LiveFixtureResponse,\n LiveJson,\n LiveObject,\n LiveOptions,\n LivePosition,\n LiveTranscript,\n} from \"./live-types.js\";\n\nexport const DEFAULT_LIVE_OPTIONS = Object.freeze({\n maxSessions: 16,\n maxMessageBytes: 1024 * 1024,\n maxBufferedBytes: 2 * 1024 * 1024,\n maxWriteBytes: 1024 * 1024,\n maxDecodedAudioBytes: 16 * 1024 * 1024,\n maxDurationMs: 120_000,\n idleTimeoutMs: 30_000,\n mismatchTimeoutMs: 30_000,\n});\n\n// Frozen from independently reviewed contract.v3.json (a2ccf050b464c2ca0cfb2f8e880b4976\n// 17d2a028c5147662a1accbcbacd6339d). Additional JSON fields remain literal.\ninterface Shape {\n type?: string | string[];\n const?: LiveJson;\n enum?: LiveJson[];\n $ref?: string;\n anyOf?: Shape[];\n properties?: { [key: string]: Shape };\n required?: string[];\n items?: Shape;\n additionalProperties?: boolean;\n}\nconst DEFINITIONS: { [key: string]: Shape } = {\n Pcm24: {\n type: \"object\",\n properties: { type: { const: \"audio/pcm\" }, rate: { const: 24000 } },\n required: [\"type\", \"rate\"],\n additionalProperties: true,\n },\n Voice: {\n anyOf: [\n { type: \"string\" },\n {\n type: \"object\",\n properties: { id: { type: \"string\" } },\n required: [\"id\"],\n additionalProperties: true,\n },\n ],\n },\n Audio: {\n type: \"object\",\n properties: {\n format: { $ref: \"#/$defs/Pcm24\" },\n output: {\n type: \"object\",\n properties: { voice: { $ref: \"#/$defs/Voice\" } },\n required: [],\n additionalProperties: true,\n },\n },\n required: [],\n additionalProperties: true,\n },\n FunctionTool: {\n type: \"object\",\n properties: {\n type: { const: \"function\" },\n name: { type: \"string\" },\n description: { type: [\"string\", \"null\"] },\n parameters: { type: [\"object\", \"null\"] },\n strict: { type: [\"boolean\", \"null\"] },\n },\n required: [\"type\", \"name\"],\n additionalProperties: true,\n },\n Backend: {\n type: \"object\",\n properties: {\n model: { type: \"string\" },\n instructions: { type: [\"string\", \"null\"] },\n max_output_tokens: { type: [\"number\", \"null\"] },\n parallel_tool_calls: { type: [\"boolean\", \"null\"] },\n reasoning: {\n anyOf: [\n { type: \"null\" },\n {\n type: \"object\",\n properties: {\n effort: { enum: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", null] },\n summary: { enum: [\"concise\", \"detailed\", \"auto\", null] },\n },\n required: [],\n additionalProperties: true,\n },\n ],\n },\n service_tier: {\n enum: [\"auto\", \"default\", \"fast_tier_temp_pilot\", \"flex\", \"priority\", \"ultrafast\", null],\n },\n text: {\n anyOf: [\n { type: \"null\" },\n {\n type: \"object\",\n properties: { verbosity: { enum: [\"low\", \"medium\", \"high\", null] } },\n required: [],\n additionalProperties: true,\n },\n ],\n },\n tool_choice: {\n anyOf: [\n { enum: [\"auto\", \"none\", \"required\"] },\n {\n type: \"object\",\n properties: { type: { const: \"function\" }, name: { type: \"string\" } },\n required: [\"type\", \"name\"],\n additionalProperties: true,\n },\n {\n type: \"object\",\n properties: {\n type: { const: \"mcp\" },\n name: { type: \"string\" },\n server_label: { type: \"string\" },\n },\n required: [\"type\", \"name\", \"server_label\"],\n additionalProperties: true,\n },\n ],\n },\n tools: {\n type: \"array\",\n items: {\n anyOf: [\n { $ref: \"#/$defs/FunctionTool\" },\n {\n type: \"object\",\n properties: { type: { const: \"web_search\" } },\n required: [\"type\"],\n additionalProperties: true,\n },\n ],\n },\n },\n },\n required: [\"model\"],\n additionalProperties: true,\n },\n BackendPatch: {\n type: \"object\",\n properties: {\n model: { type: \"string\" },\n instructions: { type: [\"string\", \"null\"] },\n max_output_tokens: { type: [\"number\", \"null\"] },\n parallel_tool_calls: { type: [\"boolean\", \"null\"] },\n reasoning: {\n anyOf: [\n { type: \"null\" },\n {\n type: \"object\",\n properties: {\n effort: { enum: [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", null] },\n summary: { enum: [\"concise\", \"detailed\", \"auto\", null] },\n },\n required: [],\n additionalProperties: true,\n },\n ],\n },\n service_tier: {\n enum: [\"auto\", \"default\", \"fast_tier_temp_pilot\", \"flex\", \"priority\", \"ultrafast\", null],\n },\n text: {\n anyOf: [\n { type: \"null\" },\n {\n type: \"object\",\n properties: { verbosity: { enum: [\"low\", \"medium\", \"high\", null] } },\n required: [],\n additionalProperties: true,\n },\n ],\n },\n tool_choice: {\n anyOf: [\n { enum: [\"auto\", \"none\", \"required\"] },\n {\n type: \"object\",\n properties: { type: { const: \"function\" }, name: { type: \"string\" } },\n required: [\"type\", \"name\"],\n additionalProperties: true,\n },\n {\n type: \"object\",\n properties: {\n type: { const: \"mcp\" },\n name: { type: \"string\" },\n server_label: { type: \"string\" },\n },\n required: [\"type\", \"name\", \"server_label\"],\n additionalProperties: true,\n },\n ],\n },\n tools: {\n type: \"array\",\n items: {\n anyOf: [\n { $ref: \"#/$defs/FunctionTool\" },\n {\n type: \"object\",\n properties: { type: { const: \"web_search\" } },\n required: [\"type\"],\n additionalProperties: true,\n },\n ],\n },\n },\n },\n required: [],\n additionalProperties: true,\n },\n Delegation: {\n anyOf: [\n { type: \"null\" },\n {\n type: \"object\",\n properties: { type: { const: \"client\" } },\n required: [\"type\"],\n additionalProperties: true,\n },\n {\n type: \"object\",\n properties: { type: { const: \"responses\" }, responses: { $ref: \"#/$defs/Backend\" } },\n required: [\"type\", \"responses\"],\n additionalProperties: true,\n },\n ],\n },\n DelegationPatch: {\n anyOf: [\n { type: \"null\" },\n {\n type: \"object\",\n properties: { type: { const: \"client\" } },\n required: [\"type\"],\n additionalProperties: true,\n },\n {\n type: \"object\",\n properties: { type: { const: \"responses\" }, responses: { $ref: \"#/$defs/BackendPatch\" } },\n required: [\"type\"],\n additionalProperties: true,\n },\n ],\n },\n SessionConfig: {\n type: \"object\",\n properties: {\n model: { const: \"gpt-live-1\" },\n audio: { $ref: \"#/$defs/Audio\" },\n delegation: { $ref: \"#/$defs/Delegation\" },\n instructions: { type: [\"string\", \"null\"] },\n store: { type: \"boolean\" },\n input: { type: \"array\", items: { type: \"object\" } },\n client: { type: \"object\" },\n },\n required: [\"model\"],\n additionalProperties: true,\n },\n SessionResource: {\n type: \"object\",\n properties: {\n model: { const: \"gpt-live-1\" },\n audio: { $ref: \"#/$defs/Audio\" },\n delegation: { $ref: \"#/$defs/Delegation\" },\n instructions: { type: [\"string\", \"null\"] },\n store: { type: \"boolean\" },\n input: { type: \"array\", items: { type: \"object\" } },\n client: { type: \"object\" },\n id: { type: \"string\" },\n expires_at: { type: \"number\" },\n status: { const: \"active\" },\n },\n required: [\"id\", \"expires_at\", \"model\", \"status\"],\n additionalProperties: true,\n },\n SessionPatch: {\n type: \"object\",\n properties: { delegation: { $ref: \"#/$defs/DelegationPatch\" } },\n required: [],\n additionalProperties: true,\n },\n Usage: {\n type: \"object\",\n properties: { seconds: { type: \"number\" } },\n required: [\"seconds\"],\n additionalProperties: true,\n },\n DelegationEventBody: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n type: { const: \"delegation\" },\n target: { enum: [\"client\", \"responses\"] },\n response_id: { type: \"string\" },\n },\n required: [\"id\", \"type\", \"target\"],\n additionalProperties: true,\n },\n Error: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n code: { type: \"string\" },\n message: { type: \"string\" },\n param: { type: [\"string\", \"null\"] },\n client_event_id: { type: \"string\" },\n },\n required: [\"type\", \"code\", \"message\"],\n additionalProperties: true,\n },\n FunctionOutput: {\n type: \"object\",\n properties: {\n type: { const: \"function_call_output\" },\n call_id: { type: \"string\" },\n output: { type: \"string\" },\n id: { type: \"string\" },\n status: { enum: [\"in_progress\", \"completed\", \"incomplete\"] },\n },\n required: [\"type\", \"call_id\", \"output\"],\n additionalProperties: true,\n },\n NestedResponse: {\n type: \"object\",\n properties: {\n type: { type: \"string\" },\n sequence_number: { type: \"number\" },\n response: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n previous_response_id: { type: [\"string\", \"null\"] },\n status: { type: \"string\" },\n usage: { type: [\"object\", \"null\"] },\n output: { type: \"array\" },\n instructions: { type: [\"string\", \"null\"] },\n tools: { type: \"array\" },\n },\n required: [],\n additionalProperties: true,\n },\n item: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n type: { type: \"string\" },\n call_id: { type: \"string\" },\n arguments: { type: \"string\" },\n name: { type: \"string\" },\n status: { type: \"string\" },\n },\n required: [],\n additionalProperties: true,\n },\n item_id: { type: \"string\" },\n output_index: { type: \"number\" },\n delta: { type: \"string\" },\n arguments: { type: \"string\" },\n },\n required: [],\n additionalProperties: true,\n },\n};\nconst CLIENT_SCHEMAS: { [key: string]: Shape } = {\n \"session.start\": {\n type: \"object\",\n properties: {\n type: { const: \"session.start\" },\n event_id: { type: [\"string\", \"null\"] },\n session: { $ref: \"#/$defs/SessionConfig\" },\n },\n required: [\"type\", \"session\"],\n additionalProperties: true,\n },\n \"session.update\": {\n type: \"object\",\n properties: {\n type: { const: \"session.update\" },\n event_id: { type: [\"string\", \"null\"] },\n session: { $ref: \"#/$defs/SessionPatch\" },\n },\n required: [\"type\", \"session\"],\n additionalProperties: true,\n },\n \"session.input_audio.append\": {\n type: \"object\",\n properties: {\n type: { const: \"session.input_audio.append\" },\n event_id: { type: [\"string\", \"null\"] },\n audio: { type: \"string\" },\n },\n required: [\"type\", \"audio\"],\n additionalProperties: true,\n },\n \"response.item.create\": {\n type: \"object\",\n properties: {\n type: { const: \"response.item.create\" },\n event_id: { type: [\"string\", \"null\"] },\n item: { $ref: \"#/$defs/FunctionOutput\" },\n },\n required: [\"type\", \"item\"],\n additionalProperties: true,\n },\n \"response.create\": {\n type: \"object\",\n properties: { type: { const: \"response.create\" }, event_id: { type: [\"string\", \"null\"] } },\n required: [\"type\"],\n additionalProperties: true,\n },\n \"session.close\": {\n type: \"object\",\n properties: { type: { const: \"session.close\" }, event_id: { type: [\"string\", \"null\"] } },\n required: [\"type\"],\n additionalProperties: true,\n },\n \"session.instructions.append\": {\n type: \"object\",\n properties: {\n type: { const: \"session.instructions.append\" },\n event_id: { type: [\"string\", \"null\"] },\n content: { type: \"string\" },\n delegation_id: { type: [\"string\", \"null\"] },\n },\n required: [\"type\", \"content\", \"delegation_id\"],\n additionalProperties: true,\n },\n \"session.thinking.append\": {\n type: \"object\",\n properties: {\n type: { const: \"session.thinking.append\" },\n event_id: { type: [\"string\", \"null\"] },\n content: { type: \"string\" },\n delegation_id: { type: [\"string\", \"null\"] },\n },\n required: [\"type\", \"content\", \"delegation_id\"],\n additionalProperties: true,\n },\n \"session.commentary.append\": {\n type: \"object\",\n properties: {\n type: { const: \"session.commentary.append\" },\n event_id: { type: [\"string\", \"null\"] },\n content: { type: \"string\" },\n delegation_id: { type: [\"string\", \"null\"] },\n },\n required: [\"type\", \"content\", \"delegation_id\"],\n additionalProperties: true,\n },\n \"session.input_audio.mute\": {\n type: \"object\",\n properties: {\n type: { const: \"session.input_audio.mute\" },\n event_id: { type: [\"string\", \"null\"] },\n },\n required: [\"type\"],\n additionalProperties: true,\n },\n \"session.input_audio.unmute\": {\n type: \"object\",\n properties: {\n type: { const: \"session.input_audio.unmute\" },\n event_id: { type: [\"string\", \"null\"] },\n },\n required: [\"type\"],\n additionalProperties: true,\n },\n};\nconst SERVER_SCHEMAS: { [key: string]: Shape } = {\n \"session.started\": {\n type: \"object\",\n properties: {\n type: { const: \"session.started\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n session: { $ref: \"#/$defs/SessionResource\" },\n },\n required: [\"type\", \"event_id\", \"session\"],\n additionalProperties: true,\n },\n \"session.updated\": {\n type: \"object\",\n properties: {\n type: { const: \"session.updated\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n session: { $ref: \"#/$defs/SessionResource\" },\n },\n required: [\"type\", \"event_id\", \"session\"],\n additionalProperties: true,\n },\n \"session.closed\": {\n type: \"object\",\n properties: {\n type: { const: \"session.closed\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n session: { $ref: \"#/$defs/SessionResource\" },\n usage: { $ref: \"#/$defs/Usage\" },\n reason: {\n enum: [\"close_requested\", \"expired\", \"content\", \"remote_hangup\", \"connection_lost\"],\n },\n },\n required: [\"type\", \"event_id\", \"session\", \"usage\", \"reason\"],\n additionalProperties: true,\n },\n \"session.output_audio.delta\": {\n type: \"object\",\n properties: {\n type: { const: \"session.output_audio.delta\" },\n delta: { type: \"string\" },\n start_ms: { type: \"number\" },\n end_ms: { type: \"number\" },\n },\n required: [\"type\", \"delta\"],\n additionalProperties: true,\n },\n \"session.input_transcript.delta\": {\n type: \"object\",\n properties: {\n type: { const: \"session.input_transcript.delta\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n start_ms: { type: \"number\" },\n end_ms: { type: \"number\" },\n delta: { type: \"string\" },\n },\n required: [\"type\", \"event_id\", \"start_ms\", \"end_ms\", \"delta\"],\n additionalProperties: true,\n },\n \"session.output_transcript.delta\": {\n type: \"object\",\n properties: {\n type: { const: \"session.output_transcript.delta\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n start_ms: { type: \"number\" },\n end_ms: { type: \"number\" },\n delta: { type: \"string\" },\n },\n required: [\"type\", \"event_id\", \"start_ms\", \"end_ms\", \"delta\"],\n additionalProperties: true,\n },\n \"session.instructions.appended\": {\n type: \"object\",\n properties: {\n type: { const: \"session.instructions.appended\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n start_ms: { type: \"number\" },\n end_ms: { type: \"number\" },\n },\n required: [\"type\", \"event_id\", \"start_ms\", \"end_ms\"],\n additionalProperties: true,\n },\n \"session.thinking.appended\": {\n type: \"object\",\n properties: {\n type: { const: \"session.thinking.appended\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n start_ms: { type: \"number\" },\n end_ms: { type: \"number\" },\n },\n required: [\"type\", \"event_id\", \"start_ms\", \"end_ms\"],\n additionalProperties: true,\n },\n \"session.commentary.appended\": {\n type: \"object\",\n properties: {\n type: { const: \"session.commentary.appended\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n start_ms: { type: \"number\" },\n end_ms: { type: \"number\" },\n },\n required: [\"type\", \"event_id\", \"start_ms\", \"end_ms\"],\n additionalProperties: true,\n },\n \"session.input_audio.muted\": {\n type: \"object\",\n properties: {\n type: { const: \"session.input_audio.muted\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n },\n required: [\"type\", \"event_id\"],\n additionalProperties: true,\n },\n \"session.input_audio.unmuted\": {\n type: \"object\",\n properties: {\n type: { const: \"session.input_audio.unmuted\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n },\n required: [\"type\", \"event_id\"],\n additionalProperties: true,\n },\n \"session.delegation.created\": {\n type: \"object\",\n properties: {\n type: { const: \"session.delegation.created\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n delegation: { $ref: \"#/$defs/DelegationEventBody\" },\n offset_ms: { type: \"number\" },\n },\n required: [\"type\", \"event_id\", \"delegation\", \"offset_ms\"],\n additionalProperties: true,\n },\n \"session.usage.updated\": {\n type: \"object\",\n properties: {\n type: { const: \"session.usage.updated\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n usage: { $ref: \"#/$defs/Usage\" },\n context_window: {\n type: \"object\",\n properties: { usage_ratio: { type: \"number\" } },\n required: [\"usage_ratio\"],\n additionalProperties: true,\n },\n },\n required: [\"type\", \"event_id\", \"usage\"],\n additionalProperties: true,\n },\n \"response.event\": {\n type: \"object\",\n properties: {\n type: { const: \"response.event\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n event: { $ref: \"#/$defs/NestedResponse\" },\n delegation_id: { type: [\"string\", \"null\"] },\n },\n required: [\"type\", \"event_id\", \"event\"],\n additionalProperties: true,\n },\n error: {\n type: \"object\",\n properties: {\n type: { const: \"error\" },\n event_id: { type: \"string\" },\n client_event_id: { type: \"string\" },\n error: { $ref: \"#/$defs/Error\" },\n },\n required: [\"type\", \"event_id\", \"error\"],\n additionalProperties: true,\n },\n};\nconst DOCUMENTED_ONLY = new Set([\n \"session.instructions.append\",\n \"session.input_audio.mute\",\n \"session.input_audio.unmute\",\n]);\n\nconst MAX_JSON_BYTES = 64 * 1024 * 1024;\nconst MAX_ENTRIES = 5_000_000;\nconst dangerous = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nfunction fail(path: string, message: string): never {\n throw new Error(`Live fixture ${path}: ${message}`);\n}\nfunction object(value: LiveJson | undefined, path: string): LiveObject {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) fail(path, \"must be an object\");\n return value;\n}\nfunction string(value: LiveJson | undefined, path: string): string {\n if (typeof value !== \"string\" || !value.length) fail(path, \"must be a nonempty string\");\n return value;\n}\nfunction integer(value: LiveJson | undefined, path: string): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0)\n fail(path, \"must be a nonnegative safe integer\");\n return value;\n}\nfunction array(value: LiveJson | undefined, path: string): LiveJson[] {\n if (!Array.isArray(value)) fail(path, \"must be an array\");\n return value;\n}\n\n/** Clone before registration; reject getters, prototypes, cycles and oversized JSON before allocating. */\nfunction cloneJson(value: unknown, maxBytes = MAX_JSON_BYTES, rootPath = \"live\"): LiveJson {\n let bytes = 0;\n const ancestors = new Set<object>();\n function charge(count: number, path: string) {\n bytes += count;\n if (bytes > maxBytes) fail(path, \"exceeds JSON byte limit\");\n }\n function visit(current: unknown, path: string, depth: number): LiveJson {\n if (depth > 32) fail(path, \"exceeds JSON depth 32\");\n if (\n current === null ||\n typeof current === \"boolean\" ||\n typeof current === \"number\" ||\n typeof current === \"string\"\n ) {\n if (typeof current === \"number\" && !Number.isFinite(current))\n fail(path, \"must be finite JSON\");\n // A string's UTF-16 length is a lower bound on its serialized byte length.\n if (typeof current === \"string\" && current.length > maxBytes - bytes)\n fail(path, \"exceeds JSON byte limit\");\n charge(Buffer.byteLength(JSON.stringify(current)), path);\n return current;\n }\n if (typeof current !== \"object\") fail(path, \"must be JSON\");\n if (ancestors.has(current)) fail(path, \"contains a cycle\");\n const isArray = Array.isArray(current);\n if (\n Object.getPrototypeOf(current) !== (isArray ? Array.prototype : Object.prototype) &&\n Object.getPrototypeOf(current) !== null\n )\n fail(path, \"must have a plain JSON prototype\");\n if (Object.getOwnPropertySymbols(current).length) fail(path, \"symbol properties are not JSON\");\n ancestors.add(current);\n charge(2, path);\n const result: LiveObject | LiveJson[] = isArray ? [] : {};\n const keys = Object.getOwnPropertyNames(current);\n if (isArray && current.length > MAX_ENTRIES) fail(path, \"exceeds array entry limit\");\n let count = 0;\n for (const key of keys) {\n if (isArray && key === \"length\") continue;\n if (dangerous.has(key)) fail(`${path}.${key}`, \"unsafe property\");\n const desc = Object.getOwnPropertyDescriptor(current, key);\n if (!desc || !desc.enumerable || !(\"value\" in desc))\n fail(`${path}.${key}`, \"must be an enumerable data property\");\n if (isArray && key !== String(count)) fail(path, \"must be a dense JSON array\");\n charge((count++ ? 1 : 0) + (isArray ? 0 : Buffer.byteLength(JSON.stringify(key)) + 1), path);\n const child = visit(desc.value, isArray ? `${path}[${key}]` : `${path}.${key}`, depth + 1);\n if (Array.isArray(result)) result.push(child);\n else result[key] = child;\n }\n if (isArray && count !== current.length) fail(path, \"must be a dense JSON array\");\n ancestors.delete(current);\n return result;\n }\n return visit(value, rootPath, 0);\n}\n\nfunction shape(value: LiveJson | undefined, schema: Shape, path: string): void {\n if (schema.$ref) return shape(value, DEFINITIONS[schema.$ref.slice(\"#/$defs/\".length)], path);\n if (schema.anyOf) {\n for (const option of schema.anyOf) {\n try {\n shape(value, option, path);\n return;\n } catch {\n /* Try the next documented union member. */\n }\n }\n fail(path, \"does not match documented shape\");\n }\n if (\"const\" in schema && value !== schema.const)\n fail(path, `must equal ${JSON.stringify(schema.const)}`);\n if (schema.enum && !schema.enum.includes(value ?? null)) fail(path, \"is not a documented value\");\n if (schema.type) {\n const types = typeof schema.type === \"string\" ? [schema.type] : schema.type;\n const actual = value === null ? \"null\" : Array.isArray(value) ? \"array\" : typeof value;\n if (!types.includes(actual)) fail(path, `must be ${types.join(\" or \")}`);\n }\n if (schema.properties || schema.required) {\n const obj = object(value, path);\n for (const key of schema.required ?? [])\n if (!Object.hasOwn(obj, key)) fail(`${path}.${key}`, \"is required\");\n for (const [key, child] of Object.entries(schema.properties ?? {}))\n if (Object.hasOwn(obj, key)) shape(obj[key], child, `${path}.${key}`);\n }\n if (schema.items)\n array(value, path).forEach((item, i) => shape(item, schema.items!, `${path}[${i}]`));\n}\n\nexport function normalizeLiveOptions(options: LiveOptions = {}) {\n const result: { -readonly [K in keyof typeof DEFAULT_LIVE_OPTIONS]: number } = {\n ...DEFAULT_LIVE_OPTIONS,\n };\n for (const key of Object.keys(DEFAULT_LIVE_OPTIONS) as (keyof typeof DEFAULT_LIVE_OPTIONS)[]) {\n const value = options[key];\n if (value !== undefined) {\n if (!Number.isSafeInteger(value) || value <= 0)\n fail(`options.${key}`, \"must be a positive safe integer\");\n result[key] = value;\n }\n }\n if (\n options.secretValues !== undefined &&\n (!Array.isArray(options.secretValues) ||\n options.secretValues.some((value) => typeof value !== \"string\"))\n )\n fail(\"options.secretValues\", \"must be strings\");\n return { ...result, secretValues: options.secretValues?.slice() ?? [] };\n}\n\n/** Canonical object ordering without changing arrays or literal unknown fields. */\nfunction canonical(value: LiveJson): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n if (value && typeof value === \"object\")\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)\n .join(\",\")}}`;\n return JSON.stringify(value);\n}\n// Provider snapshots may add resolved fields, but cannot change explicitly configured values.\nfunction matchConfiguration(expected: LiveJson, actual: LiveJson | undefined, path: string): void {\n if (expected && typeof expected === \"object\" && !Array.isArray(expected)) {\n const actualObject = object(actual, path);\n for (const [key, value] of Object.entries(expected))\n matchConfiguration(value, actualObject[key], `${path}.${key}`);\n } else if (actual === undefined || canonical(expected) !== canonical(actual))\n fail(path, \"differs from accepted configuration\");\n}\nfunction pcmBytes(value: LiveJson | undefined, path: string, remaining: number): number {\n if (typeof value !== \"string\") fail(path, \"must be canonical base64 PCM\");\n if (\n value.length % 4 ||\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(value)\n )\n fail(path, \"must be canonical base64 PCM\");\n const bytes = (value.length / 4) * 3 - (value.endsWith(\"==\") ? 2 : value.endsWith(\"=\") ? 1 : 0);\n if (bytes > remaining) fail(path, \"exceeds decoded audio byte limit\");\n if (bytes % 2) fail(path, \"must contain complete PCM16 samples\");\n // Check unused padding bits without decoding/allocating a second audio buffer.\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n if (\n (value.endsWith(\"==\") && alphabet.indexOf(value.at(-3)!) & 15) ||\n (value.endsWith(\"=\") && !value.endsWith(\"==\") && alphabet.indexOf(value.at(-2)!) & 3)\n )\n fail(path, \"must be canonical base64 PCM\");\n return bytes;\n}\n/** Shared shape check; callers retain capture source, mode and lifecycle policy. */\nfunction validateClientShape(event: LiveObject, path: string): void {\n const type = string(event.type, `${path}.type`);\n if (!Object.hasOwn(CLIENT_SCHEMAS, type)) fail(`${path}.type`, \"unsupported client command\");\n shape(event, CLIENT_SCHEMAS[type], path);\n}\n\n/** Validate one inbound command before matching a fixture or starting a recording.\n * Per-session audio totals, startup configuration and update/lifecycle policy belong to the caller.\n */\nexport function validateLiveClientEvent(value: unknown, options: LiveOptions = {}): LiveObject {\n const limits = normalizeLiveOptions(options);\n const event = object(\n cloneJson(value, Math.min(limits.maxMessageBytes, MAX_JSON_BYTES), \"event\"),\n \"event\",\n );\n validateClientShape(event, \"event\");\n if (event.type === \"session.input_audio.append\")\n pcmBytes(event.audio, \"event.audio\", limits.maxDecodedAudioBytes);\n return event;\n}\n\nfunction pointer(event: LiveObject, path: string): LiveJson | undefined {\n if (!path.startsWith(\"/\") || /~(?![01])/u.test(path))\n fail(\"bindings.pointer\", \"must be a JSON Pointer\");\n let value: LiveJson | undefined = event;\n for (const segment of path.slice(1).split(\"/\")) {\n const key = segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n if (dangerous.has(key)) fail(\"bindings.pointer\", \"unsafe segment\");\n if (!value || typeof value !== \"object\" || !Object.hasOwn(value, key)) return undefined;\n value = Array.isArray(value) ? value[Number(key)] : value[key];\n }\n return value;\n}\n\nexport type Site = {\n namespace: string;\n owner: \"client\" | \"server\";\n define: boolean;\n imported?: boolean;\n};\nconst lifecycle = new Set([\"response.created\", \"response.in_progress\", \"response.completed\"]);\nexport function bindingSites(event: LiveObject, direction: string): Map<string, Site> {\n const sites = new Map<string, Site>();\n const server = direction === \"server\";\n function add(\n path: string,\n namespace: string,\n define = false,\n owner: \"client\" | \"server\" = \"server\",\n imported = false,\n ) {\n if (typeof pointer(event, path) === \"string\")\n sites.set(path, { namespace, owner, define, imported });\n }\n add(\"/event_id\", server ? \"server-event\" : \"client-event\", true, server ? \"server\" : \"client\");\n if (server) add(\"/client_event_id\", \"client-event\", false, \"client\");\n if (server && event.type === \"error\")\n add(\"/error/client_event_id\", \"client-event\", false, \"client\");\n if (\n server &&\n [\"session.started\", \"session.updated\", \"session.closed\"].includes(String(event.type))\n )\n add(\"/session/id\", \"session\", event.type === \"session.started\");\n if (server && event.type === \"session.delegation.created\") {\n add(\"/delegation/id\", \"delegation\", true);\n add(\"/delegation/response_id\", \"response\", true);\n }\n if (\n (!server &&\n [\n \"session.thinking.append\",\n \"session.commentary.append\",\n \"session.instructions.append\",\n ].includes(String(event.type))) ||\n (server && event.type === \"response.event\")\n )\n add(\"/delegation_id\", \"delegation\");\n if (!server && event.type === \"response.item.create\") add(\"/item/call_id\", \"tool-call\");\n if (server && event.type === \"response.event\") {\n const nested = object(event.event, \"event.event\");\n add(\"/event/response/id\", \"response\", nested.type === \"response.created\");\n add(\n \"/event/response/previous_response_id\",\n \"response\",\n false,\n \"server\",\n lifecycle.has(String(nested.type)),\n );\n add(\"/event/item/id\", \"response-item\", nested.type === \"response.output_item.added\");\n add(\"/event/item_id\", \"response-item\");\n add(\"/event/item/call_id\", \"tool-call\", nested.type === \"response.output_item.added\");\n }\n return sites;\n}\n\nexport function validateLiveTranscript(value: unknown, options: LiveOptions = {}): LiveTranscript {\n const limits = normalizeLiveOptions(options);\n const root = object(cloneJson(value), \"live\");\n if (root.version !== 1) fail(\"version\", \"must equal 1\");\n if (root.model !== \"gpt-live-1\") fail(\"model\", \"must equal gpt-live-1\");\n if (root.mode !== \"client\" && root.mode !== \"managed\") fail(\"mode\", \"must be client or managed\");\n const audio = object(root.audio, \"audio\");\n if (audio.encoding !== \"pcm16le\" || audio.sampleRateHz !== 24000 || audio.channels !== 1)\n fail(\"audio\", \"requires mono PCM16LE at 24000 Hz\");\n const config = object(root.configuration, \"configuration\");\n shape(config, DEFINITIONS.SessionConfig, \"configuration\");\n shape(\n object(config.audio, \"configuration.audio\").format,\n DEFINITIONS.Pcm24,\n \"configuration.audio.format\",\n );\n const delegation = object(config.delegation, \"configuration.delegation\");\n if (delegation.type !== (root.mode === \"managed\" ? \"responses\" : \"client\"))\n fail(\"configuration.delegation\", \"must match mode explicitly\");\n let effectiveConfiguration = structuredClone(config);\n const capture = object(root.capture, \"capture\");\n if (capture.complete !== true)\n fail(\"capture.complete\", \"only complete successful captures are loadable\");\n if (capture.source !== \"authored\" && capture.source !== \"provider\")\n fail(\"capture.source\", \"must be authored or provider\");\n if (capture.provenance !== undefined) {\n const provenance = object(capture.provenance, \"capture.provenance\");\n string(provenance.host, \"capture.provenance.host\");\n string(provenance.referenceVersion, \"capture.provenance.referenceVersion\");\n if (\n !Number.isFinite(Date.parse(string(provenance.observedAt, \"capture.provenance.observedAt\")))\n )\n fail(\"capture.provenance.observedAt\", \"must be a timestamp\");\n if (provenance.path !== \"/v1/live/sessions\" || provenance.sanitationVersion !== 1)\n fail(\"capture.provenance\", \"invalid path or sanitationVersion\");\n }\n const entries = array(root.entries, \"entries\");\n if (!entries.length || entries.length > MAX_ENTRIES) fail(\"entries\", \"invalid entry count\");\n const terminal = integer(capture.terminalEntry, \"capture.terminalEntry\");\n if (terminal !== entries.length - 1)\n fail(\"capture.terminalEntry\", \"must identify the final session.closed event\");\n const bindings = array(root.bindings, \"bindings\");\n const byEntry = new Map<number, { binding: LiveObject; path: string }[]>();\n bindings.forEach((raw, index) => {\n const path = `bindings[${index}]`;\n const binding = object(raw, path);\n const entry = integer(binding.entry, `${path}.entry`);\n if (entry >= entries.length) fail(`${path}.entry`, \"out of range\");\n const bucket = byEntry.get(entry) ?? [];\n bucket.push({ binding, path });\n byEntry.set(entry, bucket);\n });\n const identities = new Map<string, { name: string; owner: string; value: string }>();\n const names = new Map<\n string,\n { namespace: string; owner: string; value: string; acceptedAt?: LivePosition }\n >();\n let command = 0,\n audioBytes = 0,\n previousTime = -1,\n previousServerCommand = 0,\n previousServerAudio = 0;\n const runBytes = new Map<number, number>([[0, 0]]);\n const totals = { client: 0, server: 0 };\n for (let i = 0; i < entries.length; i++) {\n const path = `entries[${i}]`;\n const entry = object(entries[i], path);\n if (entry.direction !== \"client\" && entry.direction !== \"server\")\n fail(`${path}.direction`, \"must be client or server\");\n const atMs = integer(entry.atMs, `${path}.atMs`);\n if (atMs < previousTime || atMs > limits.maxDurationMs)\n fail(`${path}.atMs`, \"must be monotonic and within duration limit\");\n previousTime = atMs;\n const event = object(entry.event, `${path}.event`);\n const type = string(event.type, `${path}.event.type`);\n const client = entry.direction === \"client\";\n if (client) {\n validateClientShape(event, `${path}.event`);\n if (capture.source === \"provider\" && DOCUMENTED_ONLY.has(type))\n fail(`${path}.event.type`, \"unsupported client command for this capture source\");\n } else if (Object.hasOwn(SERVER_SCHEMAS, type))\n shape(event, SERVER_SCHEMAS[type], `${path}.event`);\n if (Buffer.byteLength(JSON.stringify(event)) > limits.maxMessageBytes)\n fail(`${path}.event`, \"exceeds message byte limit\");\n if (type === \"error\") fail(`${path}.event`, \"error probes are not successful fixtures\");\n if (i === 0 && (!client || type !== \"session.start\"))\n fail(path, \"must begin with client session.start\");\n if (type === \"session.start\") {\n if (!client || i !== 0) fail(`${path}.event.type`, \"session.start is only valid at startup\");\n if (canonical(event.session) !== canonical(config))\n fail(`${path}.event.session`, \"must equal configuration\");\n }\n if (type === \"session.update\" && client) {\n const patch = object(event.session, `${path}.event.session`);\n const del = object(patch.delegation, `${path}.event.session.delegation`);\n const backend = object(del.responses, `${path}.event.session.delegation.responses`);\n if (\n root.mode !== \"managed\" ||\n Object.keys(patch).some((key) => key !== \"delegation\") ||\n Object.keys(del).some((key) => key !== \"type\" && key !== \"responses\") ||\n (del.type !== undefined && del.type !== \"responses\") ||\n Object.keys(backend).some((key) => key !== \"instructions\") ||\n !Object.hasOwn(backend, \"instructions\")\n )\n fail(`${path}.event.session`, \"only observed backend instructions update is supported\");\n }\n if (client && type === \"session.update\") {\n const backend = object(\n object(\n object(event.session, `${path}.event.session`).delegation,\n `${path}.event.session.delegation`,\n ).responses,\n `${path}.event.session.delegation.responses`,\n );\n const del = object(effectiveConfiguration.delegation, \"configuration.delegation\");\n effectiveConfiguration = {\n ...effectiveConfiguration,\n delegation: {\n ...del,\n responses: {\n ...object(del.responses, \"configuration.delegation.responses\"),\n instructions: backend.instructions,\n },\n },\n };\n }\n if (!client && [\"session.started\", \"session.updated\", \"session.closed\"].includes(type))\n matchConfiguration(effectiveConfiguration, event.session, `${path}.event.session`);\n if (!client && type === \"response.event\") {\n const nested = object(event.event, `${path}.event.event`);\n if (lifecycle.has(String(nested.type)))\n string(\n object(nested.response, `${path}.event.event.response`).id,\n `${path}.event.event.response.id`,\n );\n if (\n [\"response.output_item.added\", \"response.output_item.done\"].includes(String(nested.type)) &&\n object(nested.item, `${path}.event.event.item`).type === \"function_call\"\n ) {\n const item = object(nested.item, `${path}.event.event.item`);\n for (const field of [\"id\", \"call_id\", \"name\"])\n string(item[field], `${path}.event.event.item.${field}`);\n if (typeof item.arguments !== \"string\")\n fail(`${path}.event.event.item.arguments`, \"must be a string\");\n }\n if (\n [\n \"response.function_call_arguments.delta\",\n \"response.function_call_arguments.done\",\n ].includes(String(nested.type))\n )\n string(nested.item_id, `${path}.event.event.item_id`);\n }\n let decoded = 0;\n if (\n (client && type === \"session.input_audio.append\") ||\n (!client && type === \"session.output_audio.delta\")\n ) {\n decoded = pcmBytes(\n event[client ? \"audio\" : \"delta\"],\n `${path}.event.${client ? \"audio\" : \"delta\"}`,\n limits.maxDecodedAudioBytes - totals[entry.direction],\n );\n totals[entry.direction] += decoded;\n }\n if (client) {\n if (entry.barrier !== undefined)\n fail(`${path}.barrier`, \"client entries cannot have barriers\");\n if (type === \"session.input_audio.append\") audioBytes += decoded;\n else {\n command++;\n audioBytes = 0;\n }\n runBytes.set(command, audioBytes);\n } else {\n const barrier = object(entry.barrier, `${path}.barrier`);\n const c = integer(barrier.command, `${path}.barrier.command`);\n const a = integer(barrier.audioBytes, `${path}.barrier.audioBytes`);\n if (\n a % 2 ||\n c > command ||\n a > (runBytes.get(c) ?? -1) ||\n c < previousServerCommand ||\n (c === previousServerCommand && a < previousServerAudio)\n )\n fail(\n `${path}.barrier`,\n \"must be monotonic, sample-aligned and within preceding client prefix\",\n );\n previousServerCommand = c;\n previousServerAudio = a;\n }\n if (\n i === terminal &&\n (client ||\n type !== \"session.closed\" ||\n ![\"close_requested\", \"remote_hangup\"].includes(String(event.reason)))\n )\n fail(\"capture.terminalEntry\", \"must identify successful server session.closed\");\n if (i !== terminal && type === \"session.closed\")\n fail(`${path}.event.type`, \"session.closed must be terminal\");\n const sites = bindingSites(event, entry.direction);\n const annotated = new Set<string>();\n // Ordinary definitions first, imported definitions next, then references at one wire entry.\n const ordered = (byEntry.get(i) ?? []).slice().sort((a, b) => {\n const rank = (binding: LiveObject) =>\n binding.action === \"reference\" ? 2 : binding.origin === \"imported-context\" ? 1 : 0;\n return rank(a.binding) - rank(b.binding);\n });\n for (const { binding, path: bindingPath } of ordered) {\n const ptr = string(binding.pointer, `${bindingPath}.pointer`);\n const value = pointer(event, ptr);\n const site = sites.get(ptr);\n if (!site || typeof value !== \"string\" || !value.length)\n fail(`${bindingPath}.pointer`, \"not a non-null described identifier field\");\n if (annotated.has(ptr)) fail(bindingPath, \"duplicate pointer annotation\");\n annotated.add(ptr);\n const name = string(binding.name, `${bindingPath}.name`);\n if (binding.owner !== site.owner) fail(`${bindingPath}.owner`, \"does not match descriptor\");\n if (binding.action !== \"define\" && binding.action !== \"reference\")\n fail(`${bindingPath}.action`, \"must be define or reference\");\n if (\n binding.origin !== undefined &&\n binding.origin !== \"observed\" &&\n binding.origin !== \"imported-context\"\n )\n fail(`${bindingPath}.origin`, \"invalid origin\");\n const imported = binding.origin === \"imported-context\";\n if (\n imported &&\n (binding.action !== \"define\" || !site.imported || client || site.owner !== \"server\")\n )\n fail(`${bindingPath}.origin`, \"illegal imported-context site\");\n const key = JSON.stringify([site.namespace, value]);\n const prior = identities.get(key);\n const named = names.get(name);\n if (binding.action === \"define\") {\n if ((!site.define && !imported) || prior || named)\n fail(bindingPath, \"invalid or duplicate identity definition\");\n identities.set(key, { name, owner: site.owner, value });\n names.set(name, {\n namespace: site.namespace,\n owner: site.owner,\n value,\n ...(client ? { acceptedAt: { command, audioBytes } } : {}),\n });\n } else if (\n !prior ||\n !named ||\n prior.name !== name ||\n named.namespace !== site.namespace ||\n named.owner !== site.owner ||\n named.value !== value\n )\n fail(bindingPath, \"reference precedes definition or violates identifier bijection\");\n else if (\n !client &&\n named.acceptedAt &&\n (previousServerCommand < named.acceptedAt.command ||\n (previousServerCommand === named.acceptedAt.command &&\n previousServerAudio < named.acceptedAt.audioBytes))\n )\n fail(`${path}.barrier`, `precedes referenced client input at ${ptr}`);\n }\n for (const ptr of sites.keys())\n if (!annotated.has(ptr)) fail(`${path}.event${ptr}`, \"missing identifier binding\");\n }\n // Every structural field and all JSON values have been checked above; the cast exposes the public contract.\n return root as LiveObject & LiveTranscript;\n}\n\nexport function normalizeLiveFixture(\n value: unknown,\n options: LiveOptions = {},\n): LiveFixtureResponse {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n fail(\"response\", \"must be an object\");\n const descriptor = Object.getOwnPropertyDescriptor(value, \"live\");\n if (!descriptor || !(\"value\" in descriptor))\n fail(\"response.live\", \"must be an own data property\");\n const timing = Object.getOwnPropertyDescriptor(value, \"liveTiming\");\n if (\n timing &&\n (!(\"value\" in timing) || (timing.value !== \"recorded\" && timing.value !== \"immediate\"))\n )\n fail(\"response.liveTiming\", \"must be recorded or immediate\");\n const live = validateLiveTranscript(descriptor.value, options);\n return timing ? { live, liveTiming: timing.value } : { live };\n}\n"],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ const require_constants = require('./constants.cjs');
3
+ const require_live_fixture = require('./live-fixture.cjs');
4
+ const require_recorder = require('./recorder.cjs');
5
+ const require_logger = require('./logger.cjs');
6
+ const require_live_sanitize = require('./live-sanitize.cjs');
7
+ let node_perf_hooks = require("node:perf_hooks");
8
+
9
+ //#region src/live-recorder.ts
10
+ var LiveRecorderError = class extends Error {
11
+ constructor(category) {
12
+ super(`Live capture failed: ${category}`);
13
+ this.category = category;
14
+ }
15
+ };
16
+ function object(value) {
17
+ return value !== null && typeof value === "object" && !Array.isArray(value);
18
+ }
19
+ function boundedJson(value, depth = 0) {
20
+ if (depth > 32) return false;
21
+ if (value === null || typeof value === "string" || typeof value === "boolean") return true;
22
+ if (typeof value === "number") return Number.isFinite(value);
23
+ if (Array.isArray(value)) return value.every((v) => boundedJson(v, depth + 1));
24
+ return typeof value === "object" && Object.entries(value).every(([key, v]) => ![
25
+ "__proto__",
26
+ "prototype",
27
+ "constructor"
28
+ ].includes(key) && boundedJson(v, depth + 1));
29
+ }
30
+ function field(event, pointer) {
31
+ let value = event;
32
+ for (const part of pointer.slice(1).split("/")) {
33
+ const key = part.replace(/~1/g, "/").replace(/~0/g, "~");
34
+ if (!object(value)) throw new LiveRecorderError("protocol-divergence");
35
+ value = value[key];
36
+ }
37
+ if (typeof value !== "string") throw new LiveRecorderError("protocol-divergence");
38
+ return value;
39
+ }
40
+ function limit(value, fallback) {
41
+ const result = value ?? fallback;
42
+ if (!Number.isSafeInteger(result) || result <= 0) throw new LiveRecorderError("resource-limit");
43
+ return result;
44
+ }
45
+ /** Capture at arrival/acceptance, before awaiting any downstream socket write.
46
+ * Inputs are complete wire JSON strings, so byte caps apply before parse/copy.
47
+ * The socket owner owns deadlines, mode/lifecycle forwarding checks and cleanup;
48
+ * abort on any failed send or premature socket close before calling finish.
49
+ */
50
+ function createLiveRecorder(options) {
51
+ const limits = require_live_fixture.normalizeLiveOptions(options.live);
52
+ const maxBytes = Math.min(limit(options.record.maxProxyBufferBytes, require_recorder.DEFAULT_MAX_PROXY_BUFFER_BYTES), require_recorder.PROXY_BUFFER_HARD_CEILING);
53
+ const maxFrames = limit(options.record.maxProxyBufferFrames, require_recorder.DEFAULT_MAX_PROXY_BUFFER_FRAMES);
54
+ const started = node_perf_hooks.performance.now();
55
+ const entries = [];
56
+ const bindings = [];
57
+ const identities = /* @__PURE__ */ new Map();
58
+ let configuration;
59
+ let bytes = 0, frames = 0, lastTime = 0, command = 0, audioBytes = 0;
60
+ const audioTotals = {
61
+ client: 0,
62
+ server: 0
63
+ };
64
+ let terminal = false;
65
+ let failure;
66
+ let result;
67
+ function clear() {
68
+ entries.length = 0;
69
+ bindings.length = 0;
70
+ identities.clear();
71
+ configuration = void 0;
72
+ }
73
+ function abort(category = "incomplete-capture") {
74
+ if (result) return;
75
+ failure ??= category;
76
+ clear();
77
+ }
78
+ function fail(category) {
79
+ abort(category);
80
+ throw new LiveRecorderError(failure ?? category);
81
+ }
82
+ function annotate(event, direction) {
83
+ const sites = [...require_live_fixture.bindingSites(event, direction)].sort((a, b) => Number(!a[1].define) - Number(!b[1].define) || Number(!a[1].imported) - Number(!b[1].imported));
84
+ for (const [pointer, site] of sites) {
85
+ const value = field(event, pointer);
86
+ const key = JSON.stringify([site.namespace, value]);
87
+ const known = identities.get(key);
88
+ if (known && known.owner !== site.owner) fail("protocol-divergence");
89
+ if (!known && !site.define && !site.imported) fail("protocol-divergence");
90
+ const name = known?.name ?? `${site.namespace}:${identities.size}`;
91
+ if (!known) identities.set(key, {
92
+ name,
93
+ owner: site.owner
94
+ });
95
+ if (!options.record.proxyOnly) bindings.push({
96
+ entry: entries.length,
97
+ pointer,
98
+ name,
99
+ owner: site.owner,
100
+ action: known ? "reference" : "define",
101
+ ...!known && !site.define && site.imported ? { origin: "imported-context" } : {}
102
+ });
103
+ }
104
+ }
105
+ function accept(direction, raw, atMs = Math.floor(node_perf_hooks.performance.now() - started)) {
106
+ if (result) throw new LiveRecorderError("incomplete-capture");
107
+ if (failure) throw new LiveRecorderError(failure);
108
+ if (terminal) fail("protocol-divergence");
109
+ if (!Number.isSafeInteger(atMs) || atMs < lastTime) fail("protocol-divergence");
110
+ if (atMs > limits.maxDurationMs) fail("timeout");
111
+ const length = Buffer.byteLength(raw);
112
+ if (length > limits.maxMessageBytes || length > maxBytes - bytes || frames >= maxFrames) fail("resource-limit");
113
+ let value;
114
+ try {
115
+ value = JSON.parse(raw);
116
+ } catch {
117
+ fail(direction === "client" ? "invalid-client" : "protocol-divergence");
118
+ }
119
+ if (!boundedJson(value) || !object(value) || typeof value.type !== "string") fail(direction === "client" ? "invalid-client" : "protocol-divergence");
120
+ const event = value;
121
+ if (frames === 0 && (direction !== "client" || event.type !== "session.start")) fail("invalid-client");
122
+ if (event.type === "session.start") {
123
+ if (frames !== 0 || direction !== "client" || !object(event.session)) fail("invalid-client");
124
+ configuration = event.session;
125
+ }
126
+ if (event.type === "error") fail("protocol-divergence");
127
+ if (event.type === "session.closed") {
128
+ if (direction !== "server" || !["close_requested", "remote_hangup"].includes(String(event.reason))) fail("incomplete-capture");
129
+ terminal = true;
130
+ }
131
+ let decoded = 0;
132
+ if (direction === "client" && event.type === "session.input_audio.append" || direction === "server" && event.type === "session.output_audio.delta") {
133
+ const pcm = event[direction === "client" ? "audio" : "delta"];
134
+ if (typeof pcm !== "string" || pcm.length % 4 || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(pcm)) fail(direction === "client" ? "invalid-client" : "protocol-divergence");
135
+ decoded = pcm.length / 4 * 3 - (pcm.endsWith("==") ? 2 : pcm.endsWith("=") ? 1 : 0);
136
+ if (decoded % 2) fail(direction === "client" ? "invalid-client" : "protocol-divergence");
137
+ if (decoded > limits.maxDecodedAudioBytes - audioTotals[direction]) fail("resource-limit");
138
+ if (Buffer.from(pcm, "base64").toString("base64") !== pcm) fail("protocol-divergence");
139
+ audioTotals[direction] += decoded;
140
+ }
141
+ if (direction === "client") try {
142
+ require_live_fixture.validateLiveClientEvent(event, limits);
143
+ } catch {
144
+ fail("invalid-client");
145
+ }
146
+ if (direction === "client") if (event.type === "session.input_audio.append") audioBytes += decoded;
147
+ else {
148
+ command++;
149
+ audioBytes = 0;
150
+ }
151
+ bytes += length;
152
+ frames++;
153
+ lastTime = atMs;
154
+ try {
155
+ annotate(event, direction);
156
+ } catch {
157
+ fail("protocol-divergence");
158
+ }
159
+ if (!options.record.proxyOnly) entries.push({
160
+ direction,
161
+ atMs,
162
+ event,
163
+ ...direction === "server" ? { barrier: {
164
+ command,
165
+ audioBytes
166
+ } } : {}
167
+ });
168
+ }
169
+ function finish() {
170
+ if (result) return result;
171
+ if (!terminal && !failure) abort("incomplete-capture");
172
+ if (failure) return result = {
173
+ kind: "failed",
174
+ category: failure,
175
+ error: `Live capture failed: ${failure}`
176
+ };
177
+ if (options.record.proxyOnly) {
178
+ clear();
179
+ return result = { kind: "skipped" };
180
+ }
181
+ if (!configuration || !object(configuration.delegation)) {
182
+ abort();
183
+ return finish();
184
+ }
185
+ const mode = configuration.delegation.type === "client" ? "client" : "managed";
186
+ let transcript;
187
+ try {
188
+ transcript = require_live_fixture.validateLiveTranscript({
189
+ version: 1,
190
+ model: "gpt-live-1",
191
+ mode,
192
+ audio: {
193
+ encoding: "pcm16le",
194
+ sampleRateHz: 24e3,
195
+ channels: 1
196
+ },
197
+ configuration,
198
+ entries,
199
+ bindings,
200
+ capture: {
201
+ source: "provider",
202
+ complete: true,
203
+ terminalEntry: entries.length - 1,
204
+ ...options.provenance ? { provenance: options.provenance } : {}
205
+ }
206
+ }, limits);
207
+ } catch {
208
+ abort("protocol-divergence");
209
+ return finish();
210
+ }
211
+ try {
212
+ transcript = require_live_sanitize.sanitizeLiveTranscript(transcript, [...limits.secretValues, ...options.secretValues ?? []], options.credentialFields, limits);
213
+ } catch {
214
+ abort("unsafe-export");
215
+ return finish();
216
+ }
217
+ const fixture = {
218
+ match: {
219
+ endpoint: "openai-live",
220
+ model: "gpt-live-1"
221
+ },
222
+ response: { live: transcript }
223
+ };
224
+ const persisted = require_recorder.persistFixture({
225
+ record: options.record,
226
+ providerKey: "openai",
227
+ filePrefix: "openai-live",
228
+ testId: options.testId ?? require_constants.DEFAULT_TEST_ID,
229
+ fixture,
230
+ fixtures: options.fixtures,
231
+ logger: new require_logger.Logger("silent")
232
+ });
233
+ clear();
234
+ if (persisted.kind === "failed") {
235
+ options.logger.warn("Live capture persistence failed");
236
+ return result = {
237
+ kind: "failed",
238
+ category: "incomplete-capture",
239
+ error: "Live capture persistence failed"
240
+ };
241
+ }
242
+ options.logger.info("Complete Live capture recorded");
243
+ return result = persisted;
244
+ }
245
+ return {
246
+ acceptClient: (raw, atMs) => accept("client", raw, atMs),
247
+ acceptServer: (raw, atMs) => accept("server", raw, atMs),
248
+ finish,
249
+ abort
250
+ };
251
+ }
252
+
253
+ //#endregion
254
+ exports.LiveRecorderError = LiveRecorderError;
255
+ exports.createLiveRecorder = createLiveRecorder;
256
+ //# sourceMappingURL=live-recorder.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-recorder.cjs","names":["normalizeLiveOptions","DEFAULT_MAX_PROXY_BUFFER_BYTES","PROXY_BUFFER_HARD_CEILING","DEFAULT_MAX_PROXY_BUFFER_FRAMES","performance","bindingSites","validateLiveTranscript","sanitizeLiveTranscript","persistFixture","DEFAULT_TEST_ID","Logger"],"sources":["../src/live-recorder.ts"],"sourcesContent":["import { performance } from \"node:perf_hooks\";\nimport {\n bindingSites,\n normalizeLiveOptions,\n validateLiveClientEvent,\n validateLiveTranscript,\n} from \"./live-fixture.js\";\nimport { sanitizeLiveTranscript, type LiveCredentialField } from \"./live-sanitize.js\";\nimport type {\n LiveBinding,\n LiveEntry,\n LiveFailureCategory,\n LiveJson,\n LiveObject,\n LiveOptions,\n LiveTranscript,\n} from \"./live-types.js\";\nimport type { Fixture, RecordConfig } from \"./types.js\";\nimport { Logger } from \"./logger.js\";\nimport { DEFAULT_TEST_ID } from \"./constants.js\";\nimport {\n DEFAULT_MAX_PROXY_BUFFER_BYTES,\n DEFAULT_MAX_PROXY_BUFFER_FRAMES,\n PROXY_BUFFER_HARD_CEILING,\n persistFixture,\n type PersistFixtureResult,\n} from \"./recorder.js\";\n\nexport interface LiveRecorderOptions {\n record: RecordConfig;\n fixtures: Fixture[];\n logger: Logger;\n testId?: string;\n live?: LiveOptions;\n /** Include the actual selected upstream credential as well as configured Live secrets. */\n secretValues?: readonly string[];\n credentialFields?: readonly LiveCredentialField[];\n provenance?: NonNullable<LiveTranscript[\"capture\"][\"provenance\"]>;\n}\nexport type LiveRecorderResult =\n | Exclude<PersistFixtureResult, { kind: \"failed\" }>\n | {\n kind: \"failed\";\n category: LiveFailureCategory;\n error: string;\n };\nexport class LiveRecorderError extends Error {\n constructor(readonly category: LiveFailureCategory) {\n super(`Live capture failed: ${category}`);\n }\n}\nfunction object(value: LiveJson | undefined): value is LiveObject {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction boundedJson(value: unknown, depth = 0): value is LiveJson {\n if (depth > 32) return false;\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (Array.isArray(value)) return value.every((v) => boundedJson(v, depth + 1));\n return (\n typeof value === \"object\" &&\n Object.entries(value).every(\n ([key, v]) =>\n ![\"__proto__\", \"prototype\", \"constructor\"].includes(key) && boundedJson(v, depth + 1),\n )\n );\n}\nfunction field(event: LiveObject, pointer: string): string {\n let value: LiveJson = event;\n for (const part of pointer.slice(1).split(\"/\")) {\n const key = part.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n if (!object(value)) throw new LiveRecorderError(\"protocol-divergence\");\n value = value[key];\n }\n if (typeof value !== \"string\") throw new LiveRecorderError(\"protocol-divergence\");\n return value;\n}\nfunction limit(value: number | undefined, fallback: number): number {\n const result = value ?? fallback;\n if (!Number.isSafeInteger(result) || result <= 0) throw new LiveRecorderError(\"resource-limit\");\n return result;\n}\n\n/** Capture at arrival/acceptance, before awaiting any downstream socket write.\n * Inputs are complete wire JSON strings, so byte caps apply before parse/copy.\n * The socket owner owns deadlines, mode/lifecycle forwarding checks and cleanup;\n * abort on any failed send or premature socket close before calling finish.\n */\nexport function createLiveRecorder(options: LiveRecorderOptions) {\n const limits = normalizeLiveOptions(options.live);\n const maxBytes = Math.min(\n limit(options.record.maxProxyBufferBytes, DEFAULT_MAX_PROXY_BUFFER_BYTES),\n PROXY_BUFFER_HARD_CEILING,\n );\n const maxFrames = limit(options.record.maxProxyBufferFrames, DEFAULT_MAX_PROXY_BUFFER_FRAMES);\n const started = performance.now();\n const entries: LiveEntry[] = [];\n const bindings: LiveBinding[] = [];\n const identities = new Map<string, { name: string; owner: \"client\" | \"server\" }>();\n let configuration: LiveObject | undefined;\n let bytes = 0,\n frames = 0,\n lastTime = 0,\n command = 0,\n audioBytes = 0;\n const audioTotals = { client: 0, server: 0 };\n let terminal = false;\n let failure: LiveFailureCategory | undefined;\n let result: LiveRecorderResult | undefined;\n function clear() {\n entries.length = 0;\n bindings.length = 0;\n identities.clear();\n configuration = undefined;\n }\n function abort(category: LiveFailureCategory = \"incomplete-capture\") {\n if (result) return;\n failure ??= category;\n clear();\n }\n function fail(category: LiveFailureCategory): never {\n abort(category);\n throw new LiveRecorderError(failure ?? category);\n }\n function annotate(event: LiveObject, direction: \"client\" | \"server\") {\n const sites = [...bindingSites(event, direction)].sort(\n (a, b) =>\n Number(!a[1].define) - Number(!b[1].define) ||\n Number(!a[1].imported) - Number(!b[1].imported),\n );\n for (const [pointer, site] of sites) {\n const value = field(event, pointer);\n const key = JSON.stringify([site.namespace, value]);\n const known = identities.get(key);\n if (known && known.owner !== site.owner) fail(\"protocol-divergence\");\n if (!known && !site.define && !site.imported) fail(\"protocol-divergence\");\n const name = known?.name ?? `${site.namespace}:${identities.size}`;\n if (!known) identities.set(key, { name, owner: site.owner });\n if (!options.record.proxyOnly)\n bindings.push({\n entry: entries.length,\n pointer,\n name,\n owner: site.owner,\n action: known ? \"reference\" : \"define\",\n ...(!known && !site.define && site.imported\n ? { origin: \"imported-context\" as const }\n : {}),\n });\n }\n }\n function accept(\n direction: \"client\" | \"server\",\n raw: string,\n atMs = Math.floor(performance.now() - started),\n ) {\n if (result) throw new LiveRecorderError(\"incomplete-capture\");\n if (failure) throw new LiveRecorderError(failure);\n if (terminal) fail(\"protocol-divergence\");\n if (!Number.isSafeInteger(atMs) || atMs < lastTime) fail(\"protocol-divergence\");\n if (atMs > limits.maxDurationMs) fail(\"timeout\");\n const length = Buffer.byteLength(raw);\n if (length > limits.maxMessageBytes || length > maxBytes - bytes || frames >= maxFrames)\n fail(\"resource-limit\");\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n fail(direction === \"client\" ? \"invalid-client\" : \"protocol-divergence\");\n }\n if (!boundedJson(value) || !object(value) || typeof value.type !== \"string\")\n fail(direction === \"client\" ? \"invalid-client\" : \"protocol-divergence\");\n const event = value;\n if (frames === 0 && (direction !== \"client\" || event.type !== \"session.start\"))\n fail(\"invalid-client\");\n if (event.type === \"session.start\") {\n if (frames !== 0 || direction !== \"client\" || !object(event.session)) fail(\"invalid-client\");\n configuration = event.session;\n }\n if (event.type === \"error\") fail(\"protocol-divergence\");\n if (event.type === \"session.closed\") {\n if (\n direction !== \"server\" ||\n ![\"close_requested\", \"remote_hangup\"].includes(String(event.reason))\n )\n fail(\"incomplete-capture\");\n terminal = true;\n }\n let decoded = 0;\n if (\n (direction === \"client\" && event.type === \"session.input_audio.append\") ||\n (direction === \"server\" && event.type === \"session.output_audio.delta\")\n ) {\n const pcm = event[direction === \"client\" ? \"audio\" : \"delta\"];\n if (\n typeof pcm !== \"string\" ||\n pcm.length % 4 ||\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(pcm)\n )\n fail(direction === \"client\" ? \"invalid-client\" : \"protocol-divergence\");\n decoded = (pcm.length / 4) * 3 - (pcm.endsWith(\"==\") ? 2 : pcm.endsWith(\"=\") ? 1 : 0);\n if (decoded % 2) fail(direction === \"client\" ? \"invalid-client\" : \"protocol-divergence\");\n if (decoded > limits.maxDecodedAudioBytes - audioTotals[direction]) fail(\"resource-limit\");\n if (Buffer.from(pcm, \"base64\").toString(\"base64\") !== pcm) fail(\"protocol-divergence\");\n audioTotals[direction] += decoded;\n }\n if (direction === \"client\") {\n try {\n validateLiveClientEvent(event, limits);\n } catch {\n fail(\"invalid-client\");\n }\n }\n if (direction === \"client\") {\n if (event.type === \"session.input_audio.append\") audioBytes += decoded;\n else {\n command++;\n audioBytes = 0;\n }\n }\n bytes += length;\n frames++;\n lastTime = atMs;\n try {\n annotate(event, direction);\n } catch {\n fail(\"protocol-divergence\");\n }\n if (!options.record.proxyOnly) {\n entries.push({\n direction,\n atMs,\n event,\n ...(direction === \"server\" ? { barrier: { command, audioBytes } } : {}),\n });\n }\n }\n function finish(): LiveRecorderResult {\n if (result) return result;\n if (!terminal && !failure) abort(\"incomplete-capture\");\n if (failure)\n return (result = {\n kind: \"failed\",\n category: failure,\n error: `Live capture failed: ${failure}`,\n });\n if (options.record.proxyOnly) {\n clear();\n return (result = { kind: \"skipped\" });\n }\n if (!configuration || !object(configuration.delegation)) {\n abort();\n return finish();\n }\n const mode = configuration.delegation.type === \"client\" ? \"client\" : \"managed\";\n let transcript: LiveTranscript;\n try {\n transcript = validateLiveTranscript(\n {\n version: 1,\n model: \"gpt-live-1\",\n mode,\n audio: { encoding: \"pcm16le\", sampleRateHz: 24000, channels: 1 },\n configuration,\n entries,\n bindings,\n capture: {\n source: \"provider\",\n complete: true,\n terminalEntry: entries.length - 1,\n ...(options.provenance ? { provenance: options.provenance } : {}),\n },\n },\n limits,\n );\n } catch {\n abort(\"protocol-divergence\");\n return finish();\n }\n try {\n transcript = sanitizeLiveTranscript(\n transcript,\n [...limits.secretValues, ...(options.secretValues ?? [])],\n options.credentialFields,\n limits,\n );\n } catch {\n abort(\"unsafe-export\");\n return finish();\n }\n const fixture: Fixture = {\n match: { endpoint: \"openai-live\", model: \"gpt-live-1\" },\n response: { live: transcript },\n };\n // Existing persistence diagnostics include configured paths. Do not expose those\n // through Live's safe journal/error surface; report only a category here.\n const persisted = persistFixture({\n record: options.record,\n providerKey: \"openai\",\n filePrefix: \"openai-live\",\n testId: options.testId ?? DEFAULT_TEST_ID,\n fixture,\n fixtures: options.fixtures,\n logger: new Logger(\"silent\"),\n });\n clear();\n if (persisted.kind === \"failed\") {\n options.logger.warn(\"Live capture persistence failed\");\n return (result = {\n kind: \"failed\",\n category: \"incomplete-capture\",\n error: \"Live capture persistence failed\",\n });\n }\n options.logger.info(\"Complete Live capture recorded\");\n return (result = persisted);\n }\n return {\n acceptClient: (raw: string, atMs?: number) => accept(\"client\", raw, atMs),\n acceptServer: (raw: string, atMs?: number) => accept(\"server\", raw, atMs),\n finish,\n abort,\n };\n}\n"],"mappings":"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"}