@livekit/agents 1.0.47 → 1.1.0-dev.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 (444) hide show
  1. package/dist/beta/index.cjs +29 -0
  2. package/dist/beta/index.cjs.map +1 -0
  3. package/dist/beta/index.d.cts +2 -0
  4. package/dist/beta/index.d.ts +2 -0
  5. package/dist/beta/index.d.ts.map +1 -0
  6. package/dist/beta/index.js +7 -0
  7. package/dist/beta/index.js.map +1 -0
  8. package/dist/beta/workflows/index.cjs +29 -0
  9. package/dist/beta/workflows/index.cjs.map +1 -0
  10. package/dist/beta/workflows/index.d.cts +2 -0
  11. package/dist/beta/workflows/index.d.ts +2 -0
  12. package/dist/beta/workflows/index.d.ts.map +1 -0
  13. package/dist/beta/workflows/index.js +7 -0
  14. package/dist/beta/workflows/index.js.map +1 -0
  15. package/dist/beta/workflows/task_group.cjs +162 -0
  16. package/dist/beta/workflows/task_group.cjs.map +1 -0
  17. package/dist/beta/workflows/task_group.d.cts +32 -0
  18. package/dist/beta/workflows/task_group.d.ts +32 -0
  19. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  20. package/dist/beta/workflows/task_group.js +138 -0
  21. package/dist/beta/workflows/task_group.js.map +1 -0
  22. package/dist/constants.cjs +27 -0
  23. package/dist/constants.cjs.map +1 -1
  24. package/dist/constants.d.cts +9 -0
  25. package/dist/constants.d.ts +9 -0
  26. package/dist/constants.d.ts.map +1 -1
  27. package/dist/constants.js +18 -0
  28. package/dist/constants.js.map +1 -1
  29. package/dist/index.cjs +3 -0
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +2 -1
  32. package/dist/index.d.ts +2 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/inference/api_protos.d.cts +12 -12
  37. package/dist/inference/api_protos.d.ts +12 -12
  38. package/dist/inference/interruption/defaults.cjs +81 -0
  39. package/dist/inference/interruption/defaults.cjs.map +1 -0
  40. package/dist/inference/interruption/defaults.d.cts +19 -0
  41. package/dist/inference/interruption/defaults.d.ts +19 -0
  42. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  43. package/dist/inference/interruption/defaults.js +46 -0
  44. package/dist/inference/interruption/defaults.js.map +1 -0
  45. package/dist/inference/interruption/errors.cjs +44 -0
  46. package/dist/inference/interruption/errors.cjs.map +1 -0
  47. package/dist/inference/interruption/errors.d.cts +12 -0
  48. package/dist/inference/interruption/errors.d.ts +12 -0
  49. package/dist/inference/interruption/errors.d.ts.map +1 -0
  50. package/dist/inference/interruption/errors.js +20 -0
  51. package/dist/inference/interruption/errors.js.map +1 -0
  52. package/dist/inference/interruption/http_transport.cjs +147 -0
  53. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  54. package/dist/inference/interruption/http_transport.d.cts +63 -0
  55. package/dist/inference/interruption/http_transport.d.ts +63 -0
  56. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  57. package/dist/inference/interruption/http_transport.js +121 -0
  58. package/dist/inference/interruption/http_transport.js.map +1 -0
  59. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  60. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  61. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  62. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  63. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  64. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  65. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  66. package/dist/inference/interruption/interruption_detector.cjs +181 -0
  67. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  68. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  69. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  70. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  71. package/dist/inference/interruption/interruption_detector.js +147 -0
  72. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  73. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  74. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  75. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  76. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  77. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  78. package/dist/inference/interruption/interruption_stream.js +344 -0
  79. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  80. package/dist/inference/interruption/types.cjs +17 -0
  81. package/dist/inference/interruption/types.cjs.map +1 -0
  82. package/dist/inference/interruption/types.d.cts +66 -0
  83. package/dist/inference/interruption/types.d.ts +66 -0
  84. package/dist/inference/interruption/types.d.ts.map +1 -0
  85. package/dist/inference/interruption/types.js +1 -0
  86. package/dist/inference/interruption/types.js.map +1 -0
  87. package/dist/inference/interruption/utils.cjs +130 -0
  88. package/dist/inference/interruption/utils.cjs.map +1 -0
  89. package/dist/inference/interruption/utils.d.cts +41 -0
  90. package/dist/inference/interruption/utils.d.ts +41 -0
  91. package/dist/inference/interruption/utils.d.ts.map +1 -0
  92. package/dist/inference/interruption/utils.js +105 -0
  93. package/dist/inference/interruption/utils.js.map +1 -0
  94. package/dist/inference/interruption/utils.test.cjs +105 -0
  95. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  96. package/dist/inference/interruption/utils.test.js +104 -0
  97. package/dist/inference/interruption/utils.test.js.map +1 -0
  98. package/dist/inference/interruption/ws_transport.cjs +329 -0
  99. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  100. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  101. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  102. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  103. package/dist/inference/interruption/ws_transport.js +295 -0
  104. package/dist/inference/interruption/ws_transport.js.map +1 -0
  105. package/dist/inference/llm.cjs +14 -10
  106. package/dist/inference/llm.cjs.map +1 -1
  107. package/dist/inference/llm.d.cts +2 -1
  108. package/dist/inference/llm.d.ts +2 -1
  109. package/dist/inference/llm.d.ts.map +1 -1
  110. package/dist/inference/llm.js +8 -10
  111. package/dist/inference/llm.js.map +1 -1
  112. package/dist/inference/stt.cjs +7 -2
  113. package/dist/inference/stt.cjs.map +1 -1
  114. package/dist/inference/stt.d.cts +2 -0
  115. package/dist/inference/stt.d.ts +2 -0
  116. package/dist/inference/stt.d.ts.map +1 -1
  117. package/dist/inference/stt.js +8 -3
  118. package/dist/inference/stt.js.map +1 -1
  119. package/dist/inference/tts.cjs +7 -2
  120. package/dist/inference/tts.cjs.map +1 -1
  121. package/dist/inference/tts.d.cts +2 -0
  122. package/dist/inference/tts.d.ts +2 -0
  123. package/dist/inference/tts.d.ts.map +1 -1
  124. package/dist/inference/tts.js +8 -3
  125. package/dist/inference/tts.js.map +1 -1
  126. package/dist/inference/utils.cjs +26 -7
  127. package/dist/inference/utils.cjs.map +1 -1
  128. package/dist/inference/utils.d.cts +13 -0
  129. package/dist/inference/utils.d.ts +13 -0
  130. package/dist/inference/utils.d.ts.map +1 -1
  131. package/dist/inference/utils.js +18 -2
  132. package/dist/inference/utils.js.map +1 -1
  133. package/dist/llm/chat_context.cjs +108 -2
  134. package/dist/llm/chat_context.cjs.map +1 -1
  135. package/dist/llm/chat_context.d.cts +28 -1
  136. package/dist/llm/chat_context.d.ts +28 -1
  137. package/dist/llm/chat_context.d.ts.map +1 -1
  138. package/dist/llm/chat_context.js +108 -2
  139. package/dist/llm/chat_context.js.map +1 -1
  140. package/dist/llm/chat_context.test.cjs +43 -0
  141. package/dist/llm/chat_context.test.cjs.map +1 -1
  142. package/dist/llm/chat_context.test.js +43 -0
  143. package/dist/llm/chat_context.test.js.map +1 -1
  144. package/dist/llm/index.cjs +2 -0
  145. package/dist/llm/index.cjs.map +1 -1
  146. package/dist/llm/index.d.cts +2 -2
  147. package/dist/llm/index.d.ts +2 -2
  148. package/dist/llm/index.d.ts.map +1 -1
  149. package/dist/llm/index.js +3 -1
  150. package/dist/llm/index.js.map +1 -1
  151. package/dist/llm/llm.cjs +16 -1
  152. package/dist/llm/llm.cjs.map +1 -1
  153. package/dist/llm/llm.d.cts +9 -0
  154. package/dist/llm/llm.d.ts +9 -0
  155. package/dist/llm/llm.d.ts.map +1 -1
  156. package/dist/llm/llm.js +16 -1
  157. package/dist/llm/llm.js.map +1 -1
  158. package/dist/llm/provider_format/index.d.cts +1 -1
  159. package/dist/llm/provider_format/index.d.ts +1 -1
  160. package/dist/llm/realtime.cjs +3 -0
  161. package/dist/llm/realtime.cjs.map +1 -1
  162. package/dist/llm/realtime.d.cts +1 -0
  163. package/dist/llm/realtime.d.ts +1 -0
  164. package/dist/llm/realtime.d.ts.map +1 -1
  165. package/dist/llm/realtime.js +3 -0
  166. package/dist/llm/realtime.js.map +1 -1
  167. package/dist/llm/tool_context.cjs +7 -0
  168. package/dist/llm/tool_context.cjs.map +1 -1
  169. package/dist/llm/tool_context.d.cts +10 -2
  170. package/dist/llm/tool_context.d.ts +10 -2
  171. package/dist/llm/tool_context.d.ts.map +1 -1
  172. package/dist/llm/tool_context.js +6 -0
  173. package/dist/llm/tool_context.js.map +1 -1
  174. package/dist/metrics/base.cjs.map +1 -1
  175. package/dist/metrics/base.d.cts +45 -1
  176. package/dist/metrics/base.d.ts +45 -1
  177. package/dist/metrics/base.d.ts.map +1 -1
  178. package/dist/metrics/index.cjs +5 -0
  179. package/dist/metrics/index.cjs.map +1 -1
  180. package/dist/metrics/index.d.cts +2 -1
  181. package/dist/metrics/index.d.ts +2 -1
  182. package/dist/metrics/index.d.ts.map +1 -1
  183. package/dist/metrics/index.js +6 -0
  184. package/dist/metrics/index.js.map +1 -1
  185. package/dist/metrics/model_usage.cjs +189 -0
  186. package/dist/metrics/model_usage.cjs.map +1 -0
  187. package/dist/metrics/model_usage.d.cts +92 -0
  188. package/dist/metrics/model_usage.d.ts +92 -0
  189. package/dist/metrics/model_usage.d.ts.map +1 -0
  190. package/dist/metrics/model_usage.js +164 -0
  191. package/dist/metrics/model_usage.js.map +1 -0
  192. package/dist/metrics/model_usage.test.cjs +474 -0
  193. package/dist/metrics/model_usage.test.cjs.map +1 -0
  194. package/dist/metrics/model_usage.test.js +476 -0
  195. package/dist/metrics/model_usage.test.js.map +1 -0
  196. package/dist/metrics/usage_collector.cjs +3 -0
  197. package/dist/metrics/usage_collector.cjs.map +1 -1
  198. package/dist/metrics/usage_collector.d.cts +9 -0
  199. package/dist/metrics/usage_collector.d.ts +9 -0
  200. package/dist/metrics/usage_collector.d.ts.map +1 -1
  201. package/dist/metrics/usage_collector.js +3 -0
  202. package/dist/metrics/usage_collector.js.map +1 -1
  203. package/dist/metrics/utils.cjs +9 -0
  204. package/dist/metrics/utils.cjs.map +1 -1
  205. package/dist/metrics/utils.d.ts.map +1 -1
  206. package/dist/metrics/utils.js +9 -0
  207. package/dist/metrics/utils.js.map +1 -1
  208. package/dist/stream/multi_input_stream.test.cjs +4 -0
  209. package/dist/stream/multi_input_stream.test.cjs.map +1 -1
  210. package/dist/stream/multi_input_stream.test.js +5 -1
  211. package/dist/stream/multi_input_stream.test.js.map +1 -1
  212. package/dist/stream/stream_channel.cjs +31 -0
  213. package/dist/stream/stream_channel.cjs.map +1 -1
  214. package/dist/stream/stream_channel.d.cts +4 -2
  215. package/dist/stream/stream_channel.d.ts +4 -2
  216. package/dist/stream/stream_channel.d.ts.map +1 -1
  217. package/dist/stream/stream_channel.js +31 -0
  218. package/dist/stream/stream_channel.js.map +1 -1
  219. package/dist/stt/stt.cjs +34 -2
  220. package/dist/stt/stt.cjs.map +1 -1
  221. package/dist/stt/stt.d.cts +22 -0
  222. package/dist/stt/stt.d.ts +22 -0
  223. package/dist/stt/stt.d.ts.map +1 -1
  224. package/dist/stt/stt.js +34 -2
  225. package/dist/stt/stt.js.map +1 -1
  226. package/dist/telemetry/otel_http_exporter.cjs +24 -5
  227. package/dist/telemetry/otel_http_exporter.cjs.map +1 -1
  228. package/dist/telemetry/otel_http_exporter.d.cts +1 -0
  229. package/dist/telemetry/otel_http_exporter.d.ts +1 -0
  230. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -1
  231. package/dist/telemetry/otel_http_exporter.js +24 -5
  232. package/dist/telemetry/otel_http_exporter.js.map +1 -1
  233. package/dist/telemetry/trace_types.cjs +5 -5
  234. package/dist/telemetry/trace_types.cjs.map +1 -1
  235. package/dist/telemetry/trace_types.d.cts +9 -5
  236. package/dist/telemetry/trace_types.d.ts +9 -5
  237. package/dist/telemetry/trace_types.d.ts.map +1 -1
  238. package/dist/telemetry/trace_types.js +5 -5
  239. package/dist/telemetry/trace_types.js.map +1 -1
  240. package/dist/telemetry/traces.cjs +47 -8
  241. package/dist/telemetry/traces.cjs.map +1 -1
  242. package/dist/telemetry/traces.d.ts.map +1 -1
  243. package/dist/telemetry/traces.js +47 -8
  244. package/dist/telemetry/traces.js.map +1 -1
  245. package/dist/tts/tts.cjs +64 -2
  246. package/dist/tts/tts.cjs.map +1 -1
  247. package/dist/tts/tts.d.cts +34 -0
  248. package/dist/tts/tts.d.ts +34 -0
  249. package/dist/tts/tts.d.ts.map +1 -1
  250. package/dist/tts/tts.js +64 -2
  251. package/dist/tts/tts.js.map +1 -1
  252. package/dist/utils.cjs +1 -0
  253. package/dist/utils.cjs.map +1 -1
  254. package/dist/utils.d.ts.map +1 -1
  255. package/dist/utils.js +1 -0
  256. package/dist/utils.js.map +1 -1
  257. package/dist/version.cjs +1 -1
  258. package/dist/version.js +1 -1
  259. package/dist/voice/agent.cjs +34 -4
  260. package/dist/voice/agent.cjs.map +1 -1
  261. package/dist/voice/agent.d.cts +11 -2
  262. package/dist/voice/agent.d.ts +11 -2
  263. package/dist/voice/agent.d.ts.map +1 -1
  264. package/dist/voice/agent.js +34 -4
  265. package/dist/voice/agent.js.map +1 -1
  266. package/dist/voice/agent_activity.cjs +292 -44
  267. package/dist/voice/agent_activity.cjs.map +1 -1
  268. package/dist/voice/agent_activity.d.cts +27 -6
  269. package/dist/voice/agent_activity.d.ts +27 -6
  270. package/dist/voice/agent_activity.d.ts.map +1 -1
  271. package/dist/voice/agent_activity.js +293 -45
  272. package/dist/voice/agent_activity.js.map +1 -1
  273. package/dist/voice/agent_session.cjs +105 -48
  274. package/dist/voice/agent_session.cjs.map +1 -1
  275. package/dist/voice/agent_session.d.cts +90 -20
  276. package/dist/voice/agent_session.d.ts +90 -20
  277. package/dist/voice/agent_session.d.ts.map +1 -1
  278. package/dist/voice/agent_session.js +105 -46
  279. package/dist/voice/agent_session.js.map +1 -1
  280. package/dist/voice/audio_recognition.cjs +287 -6
  281. package/dist/voice/audio_recognition.cjs.map +1 -1
  282. package/dist/voice/audio_recognition.d.cts +42 -3
  283. package/dist/voice/audio_recognition.d.ts +42 -3
  284. package/dist/voice/audio_recognition.d.ts.map +1 -1
  285. package/dist/voice/audio_recognition.js +289 -7
  286. package/dist/voice/audio_recognition.js.map +1 -1
  287. package/dist/voice/client_events.cjs +554 -0
  288. package/dist/voice/client_events.cjs.map +1 -0
  289. package/dist/voice/client_events.d.cts +195 -0
  290. package/dist/voice/client_events.d.ts +195 -0
  291. package/dist/voice/client_events.d.ts.map +1 -0
  292. package/dist/voice/client_events.js +548 -0
  293. package/dist/voice/client_events.js.map +1 -0
  294. package/dist/voice/events.cjs +1 -0
  295. package/dist/voice/events.cjs.map +1 -1
  296. package/dist/voice/events.d.cts +8 -5
  297. package/dist/voice/events.d.ts +8 -5
  298. package/dist/voice/events.d.ts.map +1 -1
  299. package/dist/voice/events.js +1 -0
  300. package/dist/voice/events.js.map +1 -1
  301. package/dist/voice/generation.cjs +43 -8
  302. package/dist/voice/generation.cjs.map +1 -1
  303. package/dist/voice/generation.d.cts +3 -3
  304. package/dist/voice/generation.d.ts +3 -3
  305. package/dist/voice/generation.d.ts.map +1 -1
  306. package/dist/voice/generation.js +43 -8
  307. package/dist/voice/generation.js.map +1 -1
  308. package/dist/voice/index.cjs +1 -0
  309. package/dist/voice/index.cjs.map +1 -1
  310. package/dist/voice/index.d.cts +1 -0
  311. package/dist/voice/index.d.ts +1 -0
  312. package/dist/voice/index.d.ts.map +1 -1
  313. package/dist/voice/index.js +1 -0
  314. package/dist/voice/index.js.map +1 -1
  315. package/dist/voice/report.cjs +20 -8
  316. package/dist/voice/report.cjs.map +1 -1
  317. package/dist/voice/report.d.cts +5 -0
  318. package/dist/voice/report.d.ts +5 -0
  319. package/dist/voice/report.d.ts.map +1 -1
  320. package/dist/voice/report.js +20 -8
  321. package/dist/voice/report.js.map +1 -1
  322. package/dist/voice/report.test.cjs +106 -0
  323. package/dist/voice/report.test.cjs.map +1 -0
  324. package/dist/voice/report.test.js +105 -0
  325. package/dist/voice/report.test.js.map +1 -0
  326. package/dist/voice/room_io/room_io.cjs +16 -41
  327. package/dist/voice/room_io/room_io.cjs.map +1 -1
  328. package/dist/voice/room_io/room_io.d.cts +4 -9
  329. package/dist/voice/room_io/room_io.d.ts +4 -9
  330. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  331. package/dist/voice/room_io/room_io.js +17 -43
  332. package/dist/voice/room_io/room_io.js.map +1 -1
  333. package/dist/voice/testing/fake_llm.cjs +127 -0
  334. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  335. package/dist/voice/testing/fake_llm.d.cts +30 -0
  336. package/dist/voice/testing/fake_llm.d.ts +30 -0
  337. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  338. package/dist/voice/testing/fake_llm.js +103 -0
  339. package/dist/voice/testing/fake_llm.js.map +1 -0
  340. package/dist/voice/testing/index.cjs +3 -0
  341. package/dist/voice/testing/index.cjs.map +1 -1
  342. package/dist/voice/testing/index.d.cts +1 -0
  343. package/dist/voice/testing/index.d.ts +1 -0
  344. package/dist/voice/testing/index.d.ts.map +1 -1
  345. package/dist/voice/testing/index.js +2 -0
  346. package/dist/voice/testing/index.js.map +1 -1
  347. package/dist/voice/turn_config/endpointing.cjs +33 -0
  348. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  349. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  350. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  351. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  352. package/dist/voice/turn_config/endpointing.js +9 -0
  353. package/dist/voice/turn_config/endpointing.js.map +1 -0
  354. package/dist/voice/turn_config/interruption.cjs +37 -0
  355. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  356. package/dist/voice/turn_config/interruption.d.cts +53 -0
  357. package/dist/voice/turn_config/interruption.d.ts +53 -0
  358. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  359. package/dist/voice/turn_config/interruption.js +13 -0
  360. package/dist/voice/turn_config/interruption.js.map +1 -0
  361. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  362. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  363. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  364. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  365. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  366. package/dist/voice/turn_config/turn_handling.js +11 -0
  367. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  368. package/dist/voice/turn_config/utils.cjs +97 -0
  369. package/dist/voice/turn_config/utils.cjs.map +1 -0
  370. package/dist/voice/turn_config/utils.d.cts +25 -0
  371. package/dist/voice/turn_config/utils.d.ts +25 -0
  372. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  373. package/dist/voice/turn_config/utils.js +73 -0
  374. package/dist/voice/turn_config/utils.js.map +1 -0
  375. package/dist/voice/turn_config/utils.test.cjs +86 -0
  376. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  377. package/dist/voice/turn_config/utils.test.js +85 -0
  378. package/dist/voice/turn_config/utils.test.js.map +1 -0
  379. package/dist/voice/wire_format.cjs +798 -0
  380. package/dist/voice/wire_format.cjs.map +1 -0
  381. package/dist/voice/wire_format.d.cts +5503 -0
  382. package/dist/voice/wire_format.d.ts +5503 -0
  383. package/dist/voice/wire_format.d.ts.map +1 -0
  384. package/dist/voice/wire_format.js +728 -0
  385. package/dist/voice/wire_format.js.map +1 -0
  386. package/package.json +2 -1
  387. package/src/beta/index.ts +9 -0
  388. package/src/beta/workflows/index.ts +9 -0
  389. package/src/beta/workflows/task_group.ts +194 -0
  390. package/src/constants.ts +13 -0
  391. package/src/index.ts +2 -1
  392. package/src/inference/interruption/defaults.ts +51 -0
  393. package/src/inference/interruption/errors.ts +25 -0
  394. package/src/inference/interruption/http_transport.ts +187 -0
  395. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  396. package/src/inference/interruption/interruption_detector.ts +188 -0
  397. package/src/inference/interruption/interruption_stream.ts +467 -0
  398. package/src/inference/interruption/types.ts +84 -0
  399. package/src/inference/interruption/utils.test.ts +132 -0
  400. package/src/inference/interruption/utils.ts +137 -0
  401. package/src/inference/interruption/ws_transport.ts +402 -0
  402. package/src/inference/llm.ts +9 -12
  403. package/src/inference/stt.ts +10 -3
  404. package/src/inference/tts.ts +10 -3
  405. package/src/inference/utils.ts +29 -1
  406. package/src/llm/chat_context.test.ts +48 -0
  407. package/src/llm/chat_context.ts +161 -0
  408. package/src/llm/index.ts +2 -0
  409. package/src/llm/llm.ts +16 -0
  410. package/src/llm/realtime.ts +4 -0
  411. package/src/llm/tool_context.ts +14 -0
  412. package/src/metrics/base.ts +48 -1
  413. package/src/metrics/index.ts +11 -0
  414. package/src/metrics/model_usage.test.ts +545 -0
  415. package/src/metrics/model_usage.ts +262 -0
  416. package/src/metrics/usage_collector.ts +11 -0
  417. package/src/metrics/utils.ts +11 -0
  418. package/src/stream/multi_input_stream.test.ts +6 -1
  419. package/src/stream/stream_channel.ts +34 -2
  420. package/src/stt/stt.ts +38 -0
  421. package/src/telemetry/otel_http_exporter.ts +28 -5
  422. package/src/telemetry/trace_types.ts +11 -8
  423. package/src/telemetry/traces.ts +111 -54
  424. package/src/tts/tts.ts +69 -1
  425. package/src/utils.ts +5 -0
  426. package/src/voice/agent.ts +41 -3
  427. package/src/voice/agent_activity.ts +371 -34
  428. package/src/voice/agent_session.ts +207 -59
  429. package/src/voice/audio_recognition.ts +385 -9
  430. package/src/voice/client_events.ts +838 -0
  431. package/src/voice/events.ts +14 -4
  432. package/src/voice/generation.ts +52 -9
  433. package/src/voice/index.ts +1 -0
  434. package/src/voice/report.test.ts +117 -0
  435. package/src/voice/report.ts +29 -6
  436. package/src/voice/room_io/room_io.ts +21 -64
  437. package/src/voice/testing/fake_llm.ts +138 -0
  438. package/src/voice/testing/index.ts +2 -0
  439. package/src/voice/turn_config/endpointing.ts +33 -0
  440. package/src/voice/turn_config/interruption.ts +56 -0
  441. package/src/voice/turn_config/turn_handling.ts +45 -0
  442. package/src/voice/turn_config/utils.test.ts +100 -0
  443. package/src/voice/turn_config/utils.ts +103 -0
  444. package/src/voice/wire_format.ts +827 -0
@@ -0,0 +1,73 @@
1
+ import { log } from "../../log.js";
2
+ import {
3
+ defaultSessionOptions
4
+ } from "../agent_session.js";
5
+ import { defaultEndpointingOptions } from "./endpointing.js";
6
+ import { defaultInterruptionOptions } from "./interruption.js";
7
+ import { defaultTurnHandlingOptions } from "./turn_handling.js";
8
+ function migrateLegacyOptions(legacyOptions) {
9
+ var _a, _b;
10
+ const logger = log();
11
+ const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;
12
+ if (voiceOptions !== void 0 && sessionOptions !== void 0) {
13
+ logger.warn(
14
+ "Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence"
15
+ );
16
+ }
17
+ const originalTurnDetection = ((_a = sessionOptions == null ? void 0 : sessionOptions.turnHandling) == null ? void 0 : _a.turnDetection) ?? ((_b = voiceOptions == null ? void 0 : voiceOptions.turnHandling) == null ? void 0 : _b.turnDetection) ?? turnDetection;
18
+ const cloneableVoiceOptions = voiceOptions ? {
19
+ ...voiceOptions,
20
+ turnHandling: voiceOptions.turnHandling ? { ...voiceOptions.turnHandling, turnDetection: void 0 } : voiceOptions.turnHandling
21
+ } : voiceOptions;
22
+ const cloneableSessionOptions = sessionOptions ? {
23
+ ...sessionOptions,
24
+ turnHandling: sessionOptions.turnHandling ? { ...sessionOptions.turnHandling, turnDetection: void 0 } : sessionOptions.turnHandling
25
+ } : sessionOptions;
26
+ const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });
27
+ const turnHandling = {
28
+ interruption: {
29
+ discardAudioIfUninterruptible: mergedOptions == null ? void 0 : mergedOptions.discardAudioIfUninterruptible,
30
+ minDuration: mergedOptions == null ? void 0 : mergedOptions.minInterruptionDuration,
31
+ minWords: mergedOptions == null ? void 0 : mergedOptions.minInterruptionWords
32
+ },
33
+ endpointing: {
34
+ minDelay: mergedOptions == null ? void 0 : mergedOptions.minEndpointingDelay,
35
+ maxDelay: mergedOptions == null ? void 0 : mergedOptions.maxEndpointingDelay
36
+ },
37
+ ...mergedOptions.turnHandling,
38
+ // Restore original turnDetection after spread to preserve class instance with methods
39
+ // (structuredClone converts class instances to plain objects, losing prototype methods)
40
+ turnDetection: originalTurnDetection
41
+ };
42
+ if ((mergedOptions == null ? void 0 : mergedOptions.allowInterruptions) === false) {
43
+ turnHandling.interruption.enabled = false;
44
+ }
45
+ const optionsWithDefaults = {
46
+ ...defaultSessionOptions,
47
+ ...mergedOptions,
48
+ turnHandling: mergeWithDefaults(turnHandling)
49
+ };
50
+ const newAgentSessionOptions = {
51
+ ...rest,
52
+ options: optionsWithDefaults,
53
+ voiceOptions: optionsWithDefaults,
54
+ turnDetection: turnHandling.turnDetection
55
+ };
56
+ return newAgentSessionOptions;
57
+ }
58
+ function stripUndefined(obj) {
59
+ return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== void 0));
60
+ }
61
+ function mergeWithDefaults(config) {
62
+ return {
63
+ turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,
64
+ endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },
65
+ interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) }
66
+ };
67
+ }
68
+ export {
69
+ mergeWithDefaults,
70
+ migrateLegacyOptions,
71
+ stripUndefined
72
+ };
73
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/voice/turn_config/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { log } from '../../log.js';\nimport {\n type AgentSessionOptions,\n type InternalSessionOptions,\n defaultSessionOptions,\n} from '../agent_session.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { type TurnHandlingOptions, defaultTurnHandlingOptions } from './turn_handling.js';\n\nexport function migrateLegacyOptions<UserData>(\n legacyOptions: AgentSessionOptions<UserData>,\n): AgentSessionOptions<UserData> & { options: InternalSessionOptions } {\n const logger = log();\n const { voiceOptions, turnDetection, options: sessionOptions, ...rest } = legacyOptions;\n\n if (voiceOptions !== undefined && sessionOptions !== undefined) {\n logger.warn(\n 'Both voiceOptions and options have been supplied as part of the AgentSessionOptions, voiceOptions will be merged with options taking precedence',\n );\n }\n\n // Preserve turnDetection before cloning since structuredClone converts class instances to plain objects\n const originalTurnDetection =\n sessionOptions?.turnHandling?.turnDetection ??\n voiceOptions?.turnHandling?.turnDetection ??\n turnDetection;\n\n // Exclude potentially non-cloneable turnDetection objects before structuredClone.\n // They are restored from originalTurnDetection below.\n const cloneableVoiceOptions = voiceOptions\n ? {\n ...voiceOptions,\n turnHandling: voiceOptions.turnHandling\n ? { ...voiceOptions.turnHandling, turnDetection: undefined }\n : voiceOptions.turnHandling,\n }\n : voiceOptions;\n const cloneableSessionOptions = sessionOptions\n ? {\n ...sessionOptions,\n turnHandling: sessionOptions.turnHandling\n ? { ...sessionOptions.turnHandling, turnDetection: undefined }\n : sessionOptions.turnHandling,\n }\n : sessionOptions;\n\n const mergedOptions = structuredClone({ ...cloneableVoiceOptions, ...cloneableSessionOptions });\n\n const turnHandling: TurnHandlingOptions = {\n interruption: {\n discardAudioIfUninterruptible: mergedOptions?.discardAudioIfUninterruptible,\n minDuration: mergedOptions?.minInterruptionDuration,\n minWords: mergedOptions?.minInterruptionWords,\n },\n endpointing: {\n minDelay: mergedOptions?.minEndpointingDelay,\n maxDelay: mergedOptions?.maxEndpointingDelay,\n },\n\n ...mergedOptions.turnHandling,\n // Restore original turnDetection after spread to preserve class instance with methods\n // (structuredClone converts class instances to plain objects, losing prototype methods)\n turnDetection: originalTurnDetection,\n } as const;\n\n if (mergedOptions?.allowInterruptions === false) {\n turnHandling.interruption.enabled = false;\n }\n\n const optionsWithDefaults = {\n ...defaultSessionOptions,\n ...mergedOptions,\n turnHandling: mergeWithDefaults(turnHandling),\n };\n\n const newAgentSessionOptions: AgentSessionOptions<UserData> & {\n options: InternalSessionOptions;\n } = {\n ...rest,\n options: optionsWithDefaults,\n voiceOptions: optionsWithDefaults,\n turnDetection: turnHandling.turnDetection,\n };\n\n return newAgentSessionOptions;\n}\n\n/** Remove keys whose value is `undefined` so they don't shadow defaults when spread. */\nexport function stripUndefined<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nexport function mergeWithDefaults(config: TurnHandlingOptions) {\n return {\n turnDetection: config.turnDetection ?? defaultTurnHandlingOptions.turnDetection,\n endpointing: { ...defaultEndpointingOptions, ...stripUndefined(config.endpointing) },\n interruption: { ...defaultInterruptionOptions, ...stripUndefined(config.interruption) },\n } as const;\n}\n"],"mappings":"AAGA,SAAS,WAAW;AACpB;AAAA,EAGE;AAAA,OACK;AACP,SAAS,iCAAiC;AAC1C,SAAS,kCAAkC;AAC3C,SAAmC,kCAAkC;AAE9D,SAAS,qBACd,eACqE;AAfvE;AAgBE,QAAM,SAAS,IAAI;AACnB,QAAM,EAAE,cAAc,eAAe,SAAS,gBAAgB,GAAG,KAAK,IAAI;AAE1E,MAAI,iBAAiB,UAAa,mBAAmB,QAAW;AAC9D,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,QAAM,0BACJ,sDAAgB,iBAAhB,mBAA8B,oBAC9B,kDAAc,iBAAd,mBAA4B,kBAC5B;AAIF,QAAM,wBAAwB,eAC1B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,aAAa,eACvB,EAAE,GAAG,aAAa,cAAc,eAAe,OAAU,IACzD,aAAa;AAAA,EACnB,IACA;AACJ,QAAM,0BAA0B,iBAC5B;AAAA,IACE,GAAG;AAAA,IACH,cAAc,eAAe,eACzB,EAAE,GAAG,eAAe,cAAc,eAAe,OAAU,IAC3D,eAAe;AAAA,EACrB,IACA;AAEJ,QAAM,gBAAgB,gBAAgB,EAAE,GAAG,uBAAuB,GAAG,wBAAwB,CAAC;AAE9F,QAAM,eAAoC;AAAA,IACxC,cAAc;AAAA,MACZ,+BAA+B,+CAAe;AAAA,MAC9C,aAAa,+CAAe;AAAA,MAC5B,UAAU,+CAAe;AAAA,IAC3B;AAAA,IACA,aAAa;AAAA,MACX,UAAU,+CAAe;AAAA,MACzB,UAAU,+CAAe;AAAA,IAC3B;AAAA,IAEA,GAAG,cAAc;AAAA;AAAA;AAAA,IAGjB,eAAe;AAAA,EACjB;AAEA,OAAI,+CAAe,wBAAuB,OAAO;AAC/C,iBAAa,aAAa,UAAU;AAAA,EACtC;AAEA,QAAM,sBAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,cAAc,kBAAkB,YAAY;AAAA,EAC9C;AAEA,QAAM,yBAEF;AAAA,IACF,GAAG;AAAA,IACH,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe,aAAa;AAAA,EAC9B;AAEA,SAAO;AACT;AAGO,SAAS,eAAiC,KAAoB;AACnE,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC;AAClF;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,SAAO;AAAA,IACL,eAAe,OAAO,iBAAiB,2BAA2B;AAAA,IAClE,aAAa,EAAE,GAAG,2BAA2B,GAAG,eAAe,OAAO,WAAW,EAAE;AAAA,IACnF,cAAc,EAAE,GAAG,4BAA4B,GAAG,eAAe,OAAO,YAAY,EAAE;AAAA,EACxF;AACF;","names":[]}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_log = require("../../log.cjs");
4
+ var import_endpointing = require("./endpointing.cjs");
5
+ var import_interruption = require("./interruption.cjs");
6
+ var import_turn_handling = require("./turn_handling.cjs");
7
+ var import_utils = require("./utils.cjs");
8
+ (0, import_vitest.beforeAll)(() => {
9
+ (0, import_log.initializeLogger)({ pretty: true, level: "info" });
10
+ });
11
+ (0, import_vitest.describe)("migrateLegacyOptions", () => {
12
+ (0, import_vitest.it)("should return all defaults when no options are provided", () => {
13
+ const result = (0, import_utils.migrateLegacyOptions)({});
14
+ (0, import_vitest.expect)(result.options.turnHandling).toEqual({
15
+ turnDetection: import_turn_handling.defaultTurnHandlingOptions.turnDetection,
16
+ endpointing: import_endpointing.defaultEndpointingOptions,
17
+ interruption: import_interruption.defaultInterruptionOptions
18
+ });
19
+ (0, import_vitest.expect)(result.options.maxToolSteps).toBe(3);
20
+ (0, import_vitest.expect)(result.options.preemptiveGeneration).toBe(false);
21
+ (0, import_vitest.expect)(result.options.userAwayTimeout).toBe(15);
22
+ });
23
+ (0, import_vitest.it)("should migrate legacy flat fields into nested turnHandling config", () => {
24
+ const result = (0, import_utils.migrateLegacyOptions)({
25
+ voiceOptions: {
26
+ minInterruptionDuration: 1e3,
27
+ minInterruptionWords: 3,
28
+ discardAudioIfUninterruptible: false,
29
+ minEndpointingDelay: 800,
30
+ maxEndpointingDelay: 5e3
31
+ }
32
+ });
33
+ (0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(1e3);
34
+ (0, import_vitest.expect)(result.options.turnHandling.interruption.minWords).toBe(3);
35
+ (0, import_vitest.expect)(result.options.turnHandling.interruption.discardAudioIfUninterruptible).toBe(false);
36
+ (0, import_vitest.expect)(result.options.turnHandling.endpointing.minDelay).toBe(800);
37
+ (0, import_vitest.expect)(result.options.turnHandling.endpointing.maxDelay).toBe(5e3);
38
+ });
39
+ (0, import_vitest.it)("should set interruption.enabled to false when allowInterruptions is false", () => {
40
+ const result = (0, import_utils.migrateLegacyOptions)({
41
+ options: {
42
+ allowInterruptions: false
43
+ }
44
+ });
45
+ (0, import_vitest.expect)(result.options.turnHandling.interruption.enabled).toBe(false);
46
+ });
47
+ (0, import_vitest.it)("should give options precedence over voiceOptions when both are provided", () => {
48
+ const result = (0, import_utils.migrateLegacyOptions)({
49
+ voiceOptions: {
50
+ minInterruptionDuration: 1e3,
51
+ maxEndpointingDelay: 5e3,
52
+ maxToolSteps: 10
53
+ },
54
+ options: {
55
+ minInterruptionDuration: 2e3,
56
+ maxEndpointingDelay: 8e3,
57
+ maxToolSteps: 5
58
+ }
59
+ });
60
+ (0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(2e3);
61
+ (0, import_vitest.expect)(result.options.turnHandling.endpointing.maxDelay).toBe(8e3);
62
+ (0, import_vitest.expect)(result.options.maxToolSteps).toBe(5);
63
+ });
64
+ (0, import_vitest.it)("should let explicit turnHandling override legacy flat fields", () => {
65
+ const result = (0, import_utils.migrateLegacyOptions)({
66
+ options: {
67
+ minInterruptionDuration: 1e3,
68
+ minEndpointingDelay: 800,
69
+ turnHandling: {
70
+ interruption: { minDuration: 3e3 },
71
+ endpointing: { minDelay: 2e3 }
72
+ }
73
+ }
74
+ });
75
+ (0, import_vitest.expect)(result.options.turnHandling.interruption.minDuration).toBe(3e3);
76
+ (0, import_vitest.expect)(result.options.turnHandling.endpointing.minDelay).toBe(2e3);
77
+ });
78
+ (0, import_vitest.it)("should preserve top-level turnDetection in the result", () => {
79
+ const result = (0, import_utils.migrateLegacyOptions)({
80
+ turnDetection: "vad"
81
+ });
82
+ (0, import_vitest.expect)(result.turnDetection).toBe("vad");
83
+ (0, import_vitest.expect)(result.options.turnHandling.turnDetection).toBe("vad");
84
+ });
85
+ });
86
+ //# sourceMappingURL=utils.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/voice/turn_config/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../../log.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { defaultTurnHandlingOptions } from './turn_handling.js';\nimport { migrateLegacyOptions } from './utils.js';\n\nbeforeAll(() => {\n initializeLogger({ pretty: true, level: 'info' });\n});\n\ndescribe('migrateLegacyOptions', () => {\n it('should return all defaults when no options are provided', () => {\n const result = migrateLegacyOptions({});\n\n expect(result.options.turnHandling).toEqual({\n turnDetection: defaultTurnHandlingOptions.turnDetection,\n endpointing: defaultEndpointingOptions,\n interruption: defaultInterruptionOptions,\n });\n expect(result.options.maxToolSteps).toBe(3);\n expect(result.options.preemptiveGeneration).toBe(false);\n expect(result.options.userAwayTimeout).toBe(15.0);\n });\n\n it('should migrate legacy flat fields into nested turnHandling config', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n minInterruptionWords: 3,\n discardAudioIfUninterruptible: false,\n minEndpointingDelay: 800,\n maxEndpointingDelay: 5000,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(1000);\n expect(result.options.turnHandling.interruption!.minWords).toBe(3);\n expect(result.options.turnHandling.interruption!.discardAudioIfUninterruptible).toBe(false);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(800);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(5000);\n });\n\n it('should set interruption.enabled to false when allowInterruptions is false', () => {\n const result = migrateLegacyOptions({\n options: {\n allowInterruptions: false,\n },\n });\n\n expect(result.options.turnHandling.interruption!.enabled).toBe(false);\n });\n\n it('should give options precedence over voiceOptions when both are provided', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n maxEndpointingDelay: 5000,\n maxToolSteps: 10,\n },\n options: {\n minInterruptionDuration: 2000,\n maxEndpointingDelay: 8000,\n maxToolSteps: 5,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(2000);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(8000);\n expect(result.options.maxToolSteps).toBe(5);\n });\n\n it('should let explicit turnHandling override legacy flat fields', () => {\n const result = migrateLegacyOptions({\n options: {\n minInterruptionDuration: 1000,\n minEndpointingDelay: 800,\n turnHandling: {\n interruption: { minDuration: 3000 },\n endpointing: { minDelay: 2000 },\n },\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(3000);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(2000);\n });\n\n it('should preserve top-level turnDetection in the result', () => {\n const result = migrateLegacyOptions({\n turnDetection: 'vad',\n });\n\n expect(result.turnDetection).toBe('vad');\n expect(result.options.turnHandling.turnDetection).toBe('vad');\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,85 @@
1
+ import { beforeAll, describe, expect, it } from "vitest";
2
+ import { initializeLogger } from "../../log.js";
3
+ import { defaultEndpointingOptions } from "./endpointing.js";
4
+ import { defaultInterruptionOptions } from "./interruption.js";
5
+ import { defaultTurnHandlingOptions } from "./turn_handling.js";
6
+ import { migrateLegacyOptions } from "./utils.js";
7
+ beforeAll(() => {
8
+ initializeLogger({ pretty: true, level: "info" });
9
+ });
10
+ describe("migrateLegacyOptions", () => {
11
+ it("should return all defaults when no options are provided", () => {
12
+ const result = migrateLegacyOptions({});
13
+ expect(result.options.turnHandling).toEqual({
14
+ turnDetection: defaultTurnHandlingOptions.turnDetection,
15
+ endpointing: defaultEndpointingOptions,
16
+ interruption: defaultInterruptionOptions
17
+ });
18
+ expect(result.options.maxToolSteps).toBe(3);
19
+ expect(result.options.preemptiveGeneration).toBe(false);
20
+ expect(result.options.userAwayTimeout).toBe(15);
21
+ });
22
+ it("should migrate legacy flat fields into nested turnHandling config", () => {
23
+ const result = migrateLegacyOptions({
24
+ voiceOptions: {
25
+ minInterruptionDuration: 1e3,
26
+ minInterruptionWords: 3,
27
+ discardAudioIfUninterruptible: false,
28
+ minEndpointingDelay: 800,
29
+ maxEndpointingDelay: 5e3
30
+ }
31
+ });
32
+ expect(result.options.turnHandling.interruption.minDuration).toBe(1e3);
33
+ expect(result.options.turnHandling.interruption.minWords).toBe(3);
34
+ expect(result.options.turnHandling.interruption.discardAudioIfUninterruptible).toBe(false);
35
+ expect(result.options.turnHandling.endpointing.minDelay).toBe(800);
36
+ expect(result.options.turnHandling.endpointing.maxDelay).toBe(5e3);
37
+ });
38
+ it("should set interruption.enabled to false when allowInterruptions is false", () => {
39
+ const result = migrateLegacyOptions({
40
+ options: {
41
+ allowInterruptions: false
42
+ }
43
+ });
44
+ expect(result.options.turnHandling.interruption.enabled).toBe(false);
45
+ });
46
+ it("should give options precedence over voiceOptions when both are provided", () => {
47
+ const result = migrateLegacyOptions({
48
+ voiceOptions: {
49
+ minInterruptionDuration: 1e3,
50
+ maxEndpointingDelay: 5e3,
51
+ maxToolSteps: 10
52
+ },
53
+ options: {
54
+ minInterruptionDuration: 2e3,
55
+ maxEndpointingDelay: 8e3,
56
+ maxToolSteps: 5
57
+ }
58
+ });
59
+ expect(result.options.turnHandling.interruption.minDuration).toBe(2e3);
60
+ expect(result.options.turnHandling.endpointing.maxDelay).toBe(8e3);
61
+ expect(result.options.maxToolSteps).toBe(5);
62
+ });
63
+ it("should let explicit turnHandling override legacy flat fields", () => {
64
+ const result = migrateLegacyOptions({
65
+ options: {
66
+ minInterruptionDuration: 1e3,
67
+ minEndpointingDelay: 800,
68
+ turnHandling: {
69
+ interruption: { minDuration: 3e3 },
70
+ endpointing: { minDelay: 2e3 }
71
+ }
72
+ }
73
+ });
74
+ expect(result.options.turnHandling.interruption.minDuration).toBe(3e3);
75
+ expect(result.options.turnHandling.endpointing.minDelay).toBe(2e3);
76
+ });
77
+ it("should preserve top-level turnDetection in the result", () => {
78
+ const result = migrateLegacyOptions({
79
+ turnDetection: "vad"
80
+ });
81
+ expect(result.turnDetection).toBe("vad");
82
+ expect(result.options.turnHandling.turnDetection).toBe("vad");
83
+ });
84
+ });
85
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/voice/turn_config/utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../../log.js';\nimport { defaultEndpointingOptions } from './endpointing.js';\nimport { defaultInterruptionOptions } from './interruption.js';\nimport { defaultTurnHandlingOptions } from './turn_handling.js';\nimport { migrateLegacyOptions } from './utils.js';\n\nbeforeAll(() => {\n initializeLogger({ pretty: true, level: 'info' });\n});\n\ndescribe('migrateLegacyOptions', () => {\n it('should return all defaults when no options are provided', () => {\n const result = migrateLegacyOptions({});\n\n expect(result.options.turnHandling).toEqual({\n turnDetection: defaultTurnHandlingOptions.turnDetection,\n endpointing: defaultEndpointingOptions,\n interruption: defaultInterruptionOptions,\n });\n expect(result.options.maxToolSteps).toBe(3);\n expect(result.options.preemptiveGeneration).toBe(false);\n expect(result.options.userAwayTimeout).toBe(15.0);\n });\n\n it('should migrate legacy flat fields into nested turnHandling config', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n minInterruptionWords: 3,\n discardAudioIfUninterruptible: false,\n minEndpointingDelay: 800,\n maxEndpointingDelay: 5000,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(1000);\n expect(result.options.turnHandling.interruption!.minWords).toBe(3);\n expect(result.options.turnHandling.interruption!.discardAudioIfUninterruptible).toBe(false);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(800);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(5000);\n });\n\n it('should set interruption.enabled to false when allowInterruptions is false', () => {\n const result = migrateLegacyOptions({\n options: {\n allowInterruptions: false,\n },\n });\n\n expect(result.options.turnHandling.interruption!.enabled).toBe(false);\n });\n\n it('should give options precedence over voiceOptions when both are provided', () => {\n const result = migrateLegacyOptions({\n voiceOptions: {\n minInterruptionDuration: 1000,\n maxEndpointingDelay: 5000,\n maxToolSteps: 10,\n },\n options: {\n minInterruptionDuration: 2000,\n maxEndpointingDelay: 8000,\n maxToolSteps: 5,\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(2000);\n expect(result.options.turnHandling.endpointing!.maxDelay).toBe(8000);\n expect(result.options.maxToolSteps).toBe(5);\n });\n\n it('should let explicit turnHandling override legacy flat fields', () => {\n const result = migrateLegacyOptions({\n options: {\n minInterruptionDuration: 1000,\n minEndpointingDelay: 800,\n turnHandling: {\n interruption: { minDuration: 3000 },\n endpointing: { minDelay: 2000 },\n },\n },\n });\n\n expect(result.options.turnHandling.interruption!.minDuration).toBe(3000);\n expect(result.options.turnHandling.endpointing!.minDelay).toBe(2000);\n });\n\n it('should preserve top-level turnDetection in the result', () => {\n const result = migrateLegacyOptions({\n turnDetection: 'vad',\n });\n\n expect(result.turnDetection).toBe('vad');\n expect(result.options.turnHandling.turnDetection).toBe('vad');\n });\n});\n"],"mappings":"AAGA,SAAS,WAAW,UAAU,QAAQ,UAAU;AAChD,SAAS,wBAAwB;AACjC,SAAS,iCAAiC;AAC1C,SAAS,kCAAkC;AAC3C,SAAS,kCAAkC;AAC3C,SAAS,4BAA4B;AAErC,UAAU,MAAM;AACd,mBAAiB,EAAE,QAAQ,MAAM,OAAO,OAAO,CAAC;AAClD,CAAC;AAED,SAAS,wBAAwB,MAAM;AACrC,KAAG,2DAA2D,MAAM;AAClE,UAAM,SAAS,qBAAqB,CAAC,CAAC;AAEtC,WAAO,OAAO,QAAQ,YAAY,EAAE,QAAQ;AAAA,MAC1C,eAAe,2BAA2B;AAAA,MAC1C,aAAa;AAAA,MACb,cAAc;AAAA,IAChB,CAAC;AACD,WAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,CAAC;AAC1C,WAAO,OAAO,QAAQ,oBAAoB,EAAE,KAAK,KAAK;AACtD,WAAO,OAAO,QAAQ,eAAe,EAAE,KAAK,EAAI;AAAA,EAClD,CAAC;AAED,KAAG,qEAAqE,MAAM;AAC5E,UAAM,SAAS,qBAAqB;AAAA,MAClC,cAAc;AAAA,QACZ,yBAAyB;AAAA,QACzB,sBAAsB;AAAA,QACtB,+BAA+B;AAAA,QAC/B,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,MACvB;AAAA,IACF,CAAC;AAED,WAAO,OAAO,QAAQ,aAAa,aAAc,WAAW,EAAE,KAAK,GAAI;AACvE,WAAO,OAAO,QAAQ,aAAa,aAAc,QAAQ,EAAE,KAAK,CAAC;AACjE,WAAO,OAAO,QAAQ,aAAa,aAAc,6BAA6B,EAAE,KAAK,KAAK;AAC1F,WAAO,OAAO,QAAQ,aAAa,YAAa,QAAQ,EAAE,KAAK,GAAG;AAClE,WAAO,OAAO,QAAQ,aAAa,YAAa,QAAQ,EAAE,KAAK,GAAI;AAAA,EACrE,CAAC;AAED,KAAG,6EAA6E,MAAM;AACpF,UAAM,SAAS,qBAAqB;AAAA,MAClC,SAAS;AAAA,QACP,oBAAoB;AAAA,MACtB;AAAA,IACF,CAAC;AAED,WAAO,OAAO,QAAQ,aAAa,aAAc,OAAO,EAAE,KAAK,KAAK;AAAA,EACtE,CAAC;AAED,KAAG,2EAA2E,MAAM;AAClF,UAAM,SAAS,qBAAqB;AAAA,MAClC,cAAc;AAAA,QACZ,yBAAyB;AAAA,QACzB,qBAAqB;AAAA,QACrB,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACP,yBAAyB;AAAA,QACzB,qBAAqB;AAAA,QACrB,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAED,WAAO,OAAO,QAAQ,aAAa,aAAc,WAAW,EAAE,KAAK,GAAI;AACvE,WAAO,OAAO,QAAQ,aAAa,YAAa,QAAQ,EAAE,KAAK,GAAI;AACnE,WAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,CAAC;AAAA,EAC5C,CAAC;AAED,KAAG,gEAAgE,MAAM;AACvE,UAAM,SAAS,qBAAqB;AAAA,MAClC,SAAS;AAAA,QACP,yBAAyB;AAAA,QACzB,qBAAqB;AAAA,QACrB,cAAc;AAAA,UACZ,cAAc,EAAE,aAAa,IAAK;AAAA,UAClC,aAAa,EAAE,UAAU,IAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,OAAO,QAAQ,aAAa,aAAc,WAAW,EAAE,KAAK,GAAI;AACvE,WAAO,OAAO,QAAQ,aAAa,YAAa,QAAQ,EAAE,KAAK,GAAI;AAAA,EACrE,CAAC;AAED,KAAG,yDAAyD,MAAM;AAChE,UAAM,SAAS,qBAAqB;AAAA,MAClC,eAAe;AAAA,IACjB,CAAC;AAED,WAAO,OAAO,aAAa,EAAE,KAAK,KAAK;AACvC,WAAO,OAAO,QAAQ,aAAa,aAAa,EAAE,KAAK,KAAK;AAAA,EAC9D,CAAC;AACH,CAAC;","names":[]}