@recombine-ai/platform 0.8.1 → 0.10.0-dev-answer-detection.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 (289) hide show
  1. package/build/agent/index.d.ts +3 -3
  2. package/build/agent/index.d.ts.map +1 -1
  3. package/build/agent/index.js +1 -1
  4. package/build/agent/voice-agent.d.ts +6 -0
  5. package/build/agent/voice-agent.d.ts.map +1 -1
  6. package/build/agent/voice-route.d.ts +18 -0
  7. package/build/agent/voice-route.d.ts.map +1 -0
  8. package/build/agent/voice-route.js +3 -0
  9. package/build/bosun/interfaces/agent.d.ts +0 -1
  10. package/build/bosun/interfaces/agent.d.ts.map +1 -1
  11. package/build/bosun/interfaces/project.d.ts +0 -5
  12. package/build/bosun/interfaces/project.d.ts.map +1 -1
  13. package/build/bosun/std-mocks/call-control.d.ts.map +1 -1
  14. package/build/bosun/std-mocks/call-control.js +3 -0
  15. package/build/bosun-app/backend/server.js +60 -252
  16. package/build/bosun-app/backend/server.js.map +2 -2
  17. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-p1cwTU.js +1 -0
  18. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-p1cwTU.js.br +0 -0
  19. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-p1cwTU.js.gz +0 -0
  20. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B1MxGo6p.js → BBk8_Xpk.js} +1 -1
  21. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.br +0 -0
  22. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.gz +0 -0
  23. package/build/bosun-app/frontend/client/_app/immutable/chunks/{D9YsE4-8.js → BEdAvgYp.js} +1 -1
  24. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.br +0 -0
  25. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.gz +0 -0
  26. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CVZT6n14.js → C0rPkxmP.js} +1 -1
  27. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.br +0 -0
  28. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.gz +0 -0
  29. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CuwQtXBl.js → C3cROXCy.js} +1 -1
  30. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.br +0 -0
  31. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.gz +0 -0
  32. package/build/bosun-app/frontend/client/_app/immutable/chunks/{AmpxVxY6.js → CR5IRTqC.js} +1 -1
  33. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.br +0 -0
  34. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.gz +0 -0
  35. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CXS28GEZ.js → C_zIMhbm.js} +1 -1
  36. package/build/bosun-app/frontend/client/_app/immutable/chunks/C_zIMhbm.js.br +1 -0
  37. package/build/bosun-app/frontend/client/_app/immutable/chunks/C_zIMhbm.js.gz +0 -0
  38. package/build/bosun-app/frontend/client/_app/immutable/chunks/CfqUJNqt.js +1 -0
  39. package/build/bosun-app/frontend/client/_app/immutable/chunks/CfqUJNqt.js.br +0 -0
  40. package/build/bosun-app/frontend/client/_app/immutable/chunks/CfqUJNqt.js.gz +0 -0
  41. package/build/bosun-app/frontend/client/_app/immutable/chunks/{dL_jwANm.js → DJnDF3d9.js} +1 -1
  42. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.br +0 -0
  43. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.gz +0 -0
  44. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B-5g3xS8.js → DjDpMqch.js} +20 -20
  45. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.br +0 -0
  46. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.gz +0 -0
  47. package/build/bosun-app/frontend/client/_app/immutable/chunks/DmHyuAqI.js +1 -0
  48. package/build/bosun-app/frontend/client/_app/immutable/chunks/DmHyuAqI.js.br +0 -0
  49. package/build/bosun-app/frontend/client/_app/immutable/chunks/DmHyuAqI.js.gz +0 -0
  50. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BqH4VDQz.js → joiJcRPz.js} +1 -1
  51. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.br +0 -0
  52. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.gz +0 -0
  53. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CkstLsmI.js → ouMvMh56.js} +1 -1
  54. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.br +0 -0
  55. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.gz +0 -0
  56. package/build/bosun-app/frontend/client/_app/immutable/chunks/zstAn39K.js +3 -0
  57. package/build/bosun-app/frontend/client/_app/immutable/chunks/zstAn39K.js.br +0 -0
  58. package/build/bosun-app/frontend/client/_app/immutable/chunks/zstAn39K.js.gz +0 -0
  59. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DaDBScXg.js → app.0XwigMpp.js} +2 -2
  60. package/build/bosun-app/frontend/client/_app/immutable/entry/app.0XwigMpp.js.br +0 -0
  61. package/build/bosun-app/frontend/client/_app/immutable/entry/app.0XwigMpp.js.gz +0 -0
  62. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Cebm9mJg.js +1 -0
  63. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Cebm9mJg.js.br +0 -0
  64. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Cebm9mJg.js.gz +0 -0
  65. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0._S0yln6w.js → 0.5GDrTM6W.js} +1 -1
  66. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.5GDrTM6W.js.br +0 -0
  67. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.5GDrTM6W.js.gz +0 -0
  68. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.BSNKOkyF.js → 1.CzJ02d6S.js} +1 -1
  69. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CzJ02d6S.js.br +0 -0
  70. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CzJ02d6S.js.gz +0 -0
  71. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D_5hotxt.js +35 -0
  72. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D_5hotxt.js.br +0 -0
  73. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D_5hotxt.js.gz +0 -0
  74. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.Bn1yI4kt.js → 17.DQ2xmrE5.js} +3 -3
  75. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DQ2xmrE5.js.br +0 -0
  76. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DQ2xmrE5.js.gz +0 -0
  77. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DgcujFS2.js +11 -0
  78. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DgcujFS2.js.br +0 -0
  79. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DgcujFS2.js.gz +0 -0
  80. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DsrTn5LJ.js +35 -0
  81. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DsrTn5LJ.js.br +0 -0
  82. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DsrTn5LJ.js.gz +0 -0
  83. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Be0NNSYM.js +1 -0
  84. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Be0NNSYM.js.br +0 -0
  85. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Be0NNSYM.js.gz +0 -0
  86. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.3i9fJNn9.js → 4.Dg3hPphs.js} +1 -1
  87. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.Dg3hPphs.js.br +0 -0
  88. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.Dg3hPphs.js.gz +0 -0
  89. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.C2R3wdz0.js → 5.D699Wa9H.js} +1 -1
  90. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D699Wa9H.js.br +0 -0
  91. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D699Wa9H.js.gz +0 -0
  92. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.CarWVMPM.js → 6.pywS3Rx-.js} +1 -1
  93. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.pywS3Rx-.js.br +0 -0
  94. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.pywS3Rx-.js.gz +0 -0
  95. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.joumIYrl.js → 8.Cymivil4.js} +1 -1
  96. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.Cymivil4.js.br +0 -0
  97. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.Cymivil4.js.gz +0 -0
  98. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.C0gQdKQs.js +2 -0
  99. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.C0gQdKQs.js.br +0 -0
  100. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.C0gQdKQs.js.gz +0 -0
  101. package/build/bosun-app/frontend/client/_app/version.json +1 -1
  102. package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
  103. package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
  104. package/build/bosun-app/frontend/handler.js +4 -4
  105. package/build/bosun-app/frontend/index.js +4 -4
  106. package/build/bosun-app/frontend/server/chunks/chunks/{ChatStepTrace.js-BY0y3Vbb.js → ChatStepTrace.js-VTtwaKGp.js} +1 -3
  107. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-VTtwaKGp.js.map +1 -0
  108. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-ChM9druZ.js → internal.js-DE195mBB.js} +2 -2
  109. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-ChM9druZ.js.map → internal.js-DE195mBB.js.map} +1 -1
  110. package/build/bosun-app/frontend/server/chunks/chunks/{source-selection.js-DFpObbhz.js → source-selection.js-D5B8gfq2.js} +1 -3
  111. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-D5B8gfq2.js.map +1 -0
  112. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/{_layout.svelte.js-b9Q5TFEZ.js → _layout.svelte.js-B2wHKJV7.js} +24 -134
  113. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-B2wHKJV7.js.map +1 -0
  114. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/{_page.svelte.js-Chv8ybaj.js → _page.svelte.js-DDcIjgZD.js} +4 -10
  115. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-DDcIjgZD.js.map +1 -0
  116. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/{_page.svelte.js-Dkst1C_3.js → _page.svelte.js-UVUg89-t.js} +1 -3
  117. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-UVUg89-t.js.map +1 -0
  118. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-DFZznMhQ.js → _page.svelte.js-BRQvVMIt.js} +6 -4
  119. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/_page.svelte.js-BRQvVMIt.js.map +1 -0
  120. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/{_page.svelte.js-Bxdn8vG5.js → _page.svelte.js-DiZKDT2v.js} +3 -7
  121. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-DiZKDT2v.js.map +1 -0
  122. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/{_layout.svelte.js-UAHBCAaS.js → _layout.svelte.js-CfkCQ2Th.js} +10 -62
  123. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-CfkCQ2Th.js.map +1 -0
  124. package/build/bosun-app/frontend/server/chunks/{handler-KSixAuP8.js → handler-Chv2ZHQr.js} +3 -3
  125. package/build/bosun-app/frontend/server/chunks/{handler-KSixAuP8.js.map → handler-Chv2ZHQr.js.map} +1 -1
  126. package/build/bosun-app/frontend/server/chunks/{index.js-xzEg77OG.js → index.js-n38sorHD.js} +2 -2
  127. package/build/bosun-app/frontend/server/chunks/{index.js-xzEg77OG.js.map → index.js-n38sorHD.js.map} +1 -1
  128. package/build/bosun-app/frontend/server/chunks/{manifest.js-BW4X3pHs.js → manifest.js-CtJm1nRF.js} +14 -14
  129. package/build/bosun-app/frontend/server/chunks/{manifest.js-BW4X3pHs.js.map → manifest.js-CtJm1nRF.js.map} +1 -1
  130. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-B1rx1DOM.js → 0.js-By5dtmai.js} +2 -2
  131. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-B1rx1DOM.js.map → 0.js-By5dtmai.js.map} +1 -1
  132. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-h7GlMehw.js → 1.js-CXSC2Lox.js} +2 -2
  133. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-h7GlMehw.js.map → 1.js-CXSC2Lox.js.map} +1 -1
  134. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-C6xRYZtL.js → 10.js-BiBkiwOq.js} +3 -3
  135. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-C6xRYZtL.js.map → 10.js-BiBkiwOq.js.map} +1 -1
  136. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-CavP10f9.js → 17.js-BTH9o8Kf.js} +3 -3
  137. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-CavP10f9.js.map → 17.js-BTH9o8Kf.js.map} +1 -1
  138. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-DC7Bv1j_.js → 18.js-BO391342.js} +3 -3
  139. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-DC7Bv1j_.js.map → 18.js-BO391342.js.map} +1 -1
  140. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-BhiMP7Sz.js → 2.js-CVZ8CNS_.js} +3 -3
  141. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-BhiMP7Sz.js.map → 2.js-CVZ8CNS_.js.map} +1 -1
  142. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-C7zctWo-.js → 3.js-B9RYCT5N.js} +3 -3
  143. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-C7zctWo-.js.map → 3.js-B9RYCT5N.js.map} +1 -1
  144. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-5G8VLxJe.js → 4.js-CAe39ZgZ.js} +2 -2
  145. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-5G8VLxJe.js.map → 4.js-CAe39ZgZ.js.map} +1 -1
  146. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-HO1CExm6.js → 5.js-l2xF2iMi.js} +2 -2
  147. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-HO1CExm6.js.map → 5.js-l2xF2iMi.js.map} +1 -1
  148. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-CDW8tRHL.js → 6.js-BRW4t9ml.js} +2 -2
  149. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-CDW8tRHL.js.map → 6.js-BRW4t9ml.js.map} +1 -1
  150. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjO10Jpo.js → 8.js-honjdL3F.js} +2 -2
  151. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjO10Jpo.js.map → 8.js-honjdL3F.js.map} +1 -1
  152. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Csa_leV9.js → 9.js-BoUEyfMl.js} +3 -3
  153. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Csa_leV9.js.map → 9.js-BoUEyfMl.js.map} +1 -1
  154. package/build/call-control/call-control.d.ts +3 -1
  155. package/build/call-control/call-control.d.ts.map +1 -1
  156. package/build/call-control/call-control.js +8 -2
  157. package/build/call-control/index.d.ts +1 -1
  158. package/build/call-control/index.d.ts.map +1 -1
  159. package/build/call-control/port.d.ts +2 -1
  160. package/build/call-control/port.d.ts.map +1 -1
  161. package/build/call-control/sip.d.ts +1 -0
  162. package/build/call-control/sip.d.ts.map +1 -1
  163. package/build/call-control/sip.js +19 -18
  164. package/build/call-control/types.d.ts +8 -8
  165. package/build/call-control/types.d.ts.map +1 -1
  166. package/build/engine/interfaces/other.d.ts +1 -1
  167. package/build/engine/interfaces/other.d.ts.map +1 -1
  168. package/build/telescope/api.d.ts.map +1 -1
  169. package/build/telescope/api.js +1 -2
  170. package/build/telescope/interfaces/conversation.d.ts +0 -2
  171. package/build/telescope/interfaces/conversation.d.ts.map +1 -1
  172. package/build/telescope/interfaces/event-tracer.d.ts +0 -8
  173. package/build/telescope/interfaces/event-tracer.d.ts.map +1 -1
  174. package/build/telescope/interfaces/telescope.d.ts +0 -1
  175. package/build/telescope/interfaces/telescope.d.ts.map +1 -1
  176. package/build/telescope/latency-events.d.ts +1 -1
  177. package/build/telescope/latency-events.d.ts.map +1 -1
  178. package/build/telescope/latency-events.js +1 -0
  179. package/build/telescope/tracers/event-tracer.d.ts.map +1 -1
  180. package/build/telescope/tracers/event-tracer.js +0 -5
  181. package/build/text-agent-handlers/incoming-message.js +1 -1
  182. package/build/text-agent-handlers/index.d.ts +0 -1
  183. package/build/text-agent-handlers/index.d.ts.map +1 -1
  184. package/build/text-agent-handlers/index.js +0 -1
  185. package/build/text-agent-handlers/instrument.d.ts +0 -1
  186. package/build/text-agent-handlers/instrument.d.ts.map +1 -1
  187. package/build/text-agent-handlers/instrument.js +2 -6
  188. package/build/text-agent-handlers/jobs-handler.js +1 -1
  189. package/build/text-agent-handlers/jobs.d.ts +0 -1
  190. package/build/text-agent-handlers/jobs.d.ts.map +1 -1
  191. package/build/text-agent-handlers/message-acceptor.d.ts +0 -4
  192. package/build/text-agent-handlers/message-acceptor.d.ts.map +1 -1
  193. package/build/text-agent-handlers/message-acceptor.js +2 -11
  194. package/build/text-agent-handlers/ports.d.ts +1 -2
  195. package/build/text-agent-handlers/ports.d.ts.map +1 -1
  196. package/build/text-agent-handlers/ports.js +5 -6
  197. package/build/voice-agent-api/index.d.ts +3 -3
  198. package/build/voice-agent-api/index.d.ts.map +1 -1
  199. package/build/voice-agent-api/index.js +1 -1
  200. package/build/voice-agent-api/voice-http.d.ts +11 -14
  201. package/build/voice-agent-api/voice-http.d.ts.map +1 -1
  202. package/build/voice-agent-api/voice-http.js +85 -39
  203. package/build/voice-agent-api/voice-router.d.ts +21 -0
  204. package/build/voice-agent-api/voice-router.d.ts.map +1 -0
  205. package/build/voice-agent-api/voice-router.js +100 -0
  206. package/package.json +1 -1
  207. package/build/agent/experiment.d.ts +0 -21
  208. package/build/agent/experiment.d.ts.map +0 -1
  209. package/build/agent/experiment.js +0 -29
  210. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.br +0 -0
  211. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.gz +0 -0
  212. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.br +0 -0
  213. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.gz +0 -0
  214. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.br +0 -0
  215. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.gz +0 -0
  216. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js +0 -1
  217. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.br +0 -0
  218. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.gz +0 -0
  219. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.br +0 -0
  220. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.gz +0 -0
  221. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js +0 -1
  222. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.br +0 -0
  223. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.gz +0 -0
  224. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.br +0 -0
  225. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.gz +0 -0
  226. package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.br +0 -1
  227. package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.gz +0 -0
  228. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.br +0 -0
  229. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.gz +0 -0
  230. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.br +0 -0
  231. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.gz +0 -0
  232. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.br +0 -0
  233. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.gz +0 -0
  234. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js +0 -3
  235. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.br +0 -0
  236. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.gz +0 -0
  237. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js +0 -1
  238. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.br +0 -0
  239. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.gz +0 -0
  240. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.br +0 -0
  241. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.gz +0 -0
  242. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.br +0 -0
  243. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.gz +0 -0
  244. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js +0 -1
  245. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.br +0 -0
  246. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.gz +0 -0
  247. package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.br +0 -0
  248. package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.gz +0 -0
  249. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.br +0 -0
  250. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.gz +0 -0
  251. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js +0 -35
  252. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.br +0 -0
  253. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.gz +0 -0
  254. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.br +0 -0
  255. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.gz +0 -0
  256. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js +0 -11
  257. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.br +0 -0
  258. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.gz +0 -0
  259. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js +0 -35
  260. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.br +0 -0
  261. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.gz +0 -0
  262. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js +0 -1
  263. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.br +0 -0
  264. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.gz +0 -0
  265. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.br +0 -0
  266. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.gz +0 -0
  267. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.br +0 -0
  268. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.gz +0 -0
  269. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.br +0 -0
  270. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.gz +0 -0
  271. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.br +0 -0
  272. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.gz +0 -0
  273. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js +0 -2
  274. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.br +0 -0
  275. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.gz +0 -0
  276. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-BY0y3Vbb.js.map +0 -1
  277. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-DFpObbhz.js.map +0 -1
  278. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-b9Q5TFEZ.js.map +0 -1
  279. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-Chv8ybaj.js.map +0 -1
  280. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-Dkst1C_3.js.map +0 -1
  281. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/_page.svelte.js-DFZznMhQ.js.map +0 -1
  282. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-Bxdn8vG5.js.map +0 -1
  283. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-UAHBCAaS.js.map +0 -1
  284. package/build/text-agent-handlers/variant-scheduler.d.ts +0 -3
  285. package/build/text-agent-handlers/variant-scheduler.d.ts.map +0 -1
  286. package/build/text-agent-handlers/variant-scheduler.js +0 -9
  287. package/build/voice-agent-api/route-resolver.d.ts +0 -19
  288. package/build/voice-agent-api/route-resolver.d.ts.map +0 -1
  289. package/build/voice-agent-api/route-resolver.js +0 -57
@@ -1,7 +1,6 @@
1
- import { allocateVariant } from '../agent/experiment.js';
2
1
  import { handlerResponse } from './ports.js';
3
2
  export function createMessageAcceptor(options) {
4
- const { registry, resolveAgentId, experiments, eventTracer, invokeIncomingMessage, logger } = options;
3
+ const { registry, resolveAgentId, eventTracer, invokeIncomingMessage, logger } = options;
5
4
  return async function acceptMessage(event) {
6
5
  logger.debug('acceptMessage from conversation', {
7
6
  conversationId: event.conversationId,
@@ -9,21 +8,13 @@ export function createMessageAcceptor(options) {
9
8
  });
10
9
  let record = await registry.getAgent(event.conversationId);
11
10
  if (!record) {
12
- const agentId = resolveAgentId(event);
13
- const experiment = experiments?.[agentId];
14
- const variantId = experiment ? allocateVariant(experiment) : null;
15
- record = {
16
- conversationId: event.conversationId,
17
- agentId,
18
- ...(variantId ? { variantId } : {}),
19
- };
11
+ record = { conversationId: event.conversationId, agentId: resolveAgentId(event) };
20
12
  await registry.saveAgent(record);
21
13
  eventTracer.emit({
22
14
  event: 'text.chat.started',
23
15
  attributes: {
24
16
  conversationId: event.conversationId,
25
17
  agentId: record.agentId,
26
- variantId: record.variantId,
27
18
  channel: event.channel,
28
19
  region: typeof event.metadata.region === 'string'
29
20
  ? event.metadata.region
@@ -4,7 +4,6 @@ import type { JobInput } from './jobs.js';
4
4
  export interface AgentRecord {
5
5
  conversationId: string;
6
6
  agentId: string;
7
- variantId?: string;
8
7
  }
9
8
  export interface AgentRegistry {
10
9
  getAgent(conversationId: string): Promise<AgentRecord | null>;
@@ -26,7 +25,7 @@ export interface ChatLockStore {
26
25
  export interface JobRunner extends Scheduler {
27
26
  runJob(input: JobInput): Promise<unknown>;
28
27
  }
29
- export type GetTextAgent<TMeta> = (agentId: string, variantId?: string) => Promise<TextAgent<TMeta>>;
28
+ export type GetTextAgent<TMeta> = (agentId: string) => Promise<TextAgent<TMeta>>;
30
29
  export declare function cacheTextAgents<TMeta>(getTextAgent: GetTextAgent<TMeta>): GetTextAgent<TMeta>;
31
30
  export type HandlerResponse = {
32
31
  statusCode: number;
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAGD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAGD,MAAM,WAAW,QAAQ;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAE7D,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxD;AAGD,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5C;AAGD,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAGpG,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAY7F;AAGD,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,CAEjB"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAClB;AAGD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAGD,MAAM,WAAW,QAAQ;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAE7D,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxD;AAGD,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5C;AAGD,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAGhF,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAW7F;AAGD,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,CAEjB"}
@@ -1,12 +1,11 @@
1
1
  export function cacheTextAgents(getTextAgent) {
2
2
  const agents = new Map();
3
- return (agentId, variantId) => {
4
- const key = variantId ? `${agentId}#${variantId}` : agentId;
5
- let agent = agents.get(key);
3
+ return (agentId) => {
4
+ let agent = agents.get(agentId);
6
5
  if (!agent) {
7
- agent = getTextAgent(agentId, variantId);
8
- agents.set(key, agent);
9
- agent.catch(() => agents.delete(key));
6
+ agent = getTextAgent(agentId);
7
+ agents.set(agentId, agent);
8
+ agent.catch(() => agents.delete(agentId));
10
9
  }
11
10
  return agent;
12
11
  };
@@ -2,7 +2,7 @@ export { extractMessageContent, fail, isRecoverableError, mapFromOpenAiMessages,
2
2
  export type { ErrorCodes } from './http-helpers.js';
3
3
  export { llmCompletionHandler } from './llm-completion-handler.js';
4
4
  export { voiceHttpConnect } from './voice-http.js';
5
- export type { VoiceHttpBindings } from './voice-http.js';
6
- export { createVoiceRouteResolver } from './route-resolver.js';
7
- export type { ResolvedVoiceAgent, VoiceRouteResolverOptions } from './route-resolver.js';
5
+ export type { ConversationMeta, VoiceHttpBindings } from './voice-http.js';
6
+ export { createVoiceRouter } from './voice-router.js';
7
+ export type { VoiceRouter, VoiceRouterOptions } from './voice-router.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,IAAI,EACJ,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,GACf,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,IAAI,EACJ,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,GACf,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,4 +1,4 @@
1
1
  export { extractMessageContent, fail, isRecoverableError, mapFromOpenAiMessages, roleToSender, } from './http-helpers.js';
2
2
  export { llmCompletionHandler } from './llm-completion-handler.js';
3
3
  export { voiceHttpConnect } from './voice-http.js';
4
- export { createVoiceRouteResolver } from './route-resolver.js';
4
+ export { createVoiceRouter } from './voice-router.js';
@@ -1,9 +1,8 @@
1
1
  import { FastifyRequest } from 'fastify';
2
- import { VoiceRoute } from '../agent/index.js';
3
2
  import type CallControl from '../call-control/index.js';
4
- import type { ContextCache } from '../context-cache/index.js';
5
3
  import type { NotificationRouter } from '../notifications/index.js';
6
4
  import type { ITelescope } from '../telescope/index.js';
5
+ import { type VoiceRouter } from './voice-router.js';
7
6
  declare module 'fastify' {
8
7
  interface FastifyRequest {
9
8
  callId: string;
@@ -13,25 +12,23 @@ declare module 'fastify' {
13
12
  phoneNumber?: string;
14
13
  }
15
14
  }
15
+ export interface ConversationMeta<TMeta> {
16
+ meta: TMeta;
17
+ region?: string;
18
+ phoneNumber?: string;
19
+ externalConversationId?: string;
20
+ }
16
21
  export interface VoiceHttpBindings<TMeta> {
17
- getVoiceAgent: (agentName: string) => Promise<VoiceRoute<TMeta>>;
18
- allocations?: ContextCache<{
19
- variantId: string | null;
20
- }>;
22
+ router: VoiceRouter<TMeta>;
21
23
  telescope: ITelescope;
24
+ callControl: CallControl;
22
25
  onStart: () => Promise<void>;
23
26
  hostsToPrewarm: string[];
24
- headersToMeta: (headers: FastifyRequest['headers']) => TMeta;
25
- getConversationMeta: (headers: FastifyRequest['headers']) => {
26
- region?: string;
27
- phoneNumber?: string;
28
- };
29
- callControl: CallControl;
27
+ getConversationMeta: (headers: FastifyRequest['headers']) => ConversationMeta<TMeta>;
30
28
  notificationRouter?: NotificationRouter;
31
- getExternalConversationId?: (headers: FastifyRequest['headers']) => string | undefined;
32
29
  stickyCookieName?: string;
33
30
  }
34
- export declare function voiceHttpConnect<TMeta>({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
31
+ export declare function voiceHttpConnect<TMeta>({ router, telescope, callControl, onStart, hostsToPrewarm, getConversationMeta, notificationRouter, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
35
32
  start: () => Promise<void>;
36
33
  };
37
34
  //# sourceMappingURL=voice-http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"voice-http.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-http.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAA;AAG/D,OAAO,EAAY,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAA;AAY9E,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;CACJ;AAED,MAAM,WAAW,iBAAiB,CAAC,KAAK;IAEpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAKhE,WAAW,CAAC,EAAE,YAAY,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACxD,SAAS,EAAE,UAAU,CAAA;IAErB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,CAAA;IAE5D,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK;QACzD,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IAED,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;IAEtF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,EACpC,aAAa,EACb,WAAW,EACX,SAAS,EACT,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EA+b1B"}
1
+ {"version":3,"file":"voice-http.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-http.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAA;AAK/D,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAA;AAS9E,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG5E,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;CACJ;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK;IAEnC,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB,CAAC,KAAK;IAEpC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;IAC1B,SAAS,EAAE,UAAU,CAAA;IAErB,WAAW,EAAE,WAAW,CAAA;IAExB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IAExB,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACpF,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IAEvC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,EACpC,MAAM,EACN,SAAS,EACT,WAAW,EACX,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EAqe1B"}
@@ -1,13 +1,14 @@
1
1
  import * as dns from 'node:dns';
2
2
  import { promisify } from 'node:util';
3
3
  import Fastify from 'fastify';
4
+ import { isRandomizedVoiceRoute } from '../agent/index.js';
4
5
  import { loggerContext } from '../dockyard/index.js';
5
6
  import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES, } from '../telescope/index.js';
6
7
  import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers.js';
7
8
  import { llmCompletionHandler } from './llm-completion-handler.js';
8
9
  import { logger } from './logger.js';
9
- import { createVoiceRouteResolver } from './route-resolver.js';
10
- export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }) {
10
+ import { UnknownVoiceRouteError } from './voice-router.js';
11
+ export function voiceHttpConnect({ router, telescope, callControl, onStart, hostsToPrewarm, getConversationMeta, notificationRouter, stickyCookieName, }) {
11
12
  const activeRequests = new Set();
12
13
  let started = false;
13
14
  const app = Fastify({
@@ -41,11 +42,11 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
41
42
  if (!(error instanceof Error)) {
42
43
  throw new Error(String(error));
43
44
  }
44
- const { agent, variantId } = await getAgent(request);
45
+ const agent = await getAgent(request);
45
46
  if (!isRecoverableError(error)) {
46
47
  await agent.onFatalError(reqToCallInfo(request), error.message);
47
48
  }
48
- await createTelescopeConversation(request, variantId);
49
+ await createTelescopeConversation(request, agent.name);
49
50
  fail(reply, 500, error.message, error);
50
51
  });
51
52
  app.addHook('onRequest', async (req, res) => {
@@ -86,19 +87,25 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
86
87
  if (!req.agentName) {
87
88
  return fail(res, 400, 'Cannot start call without agent name');
88
89
  }
89
- const { agent, variantId } = await getAgent(req);
90
+ let agent;
91
+ try {
92
+ agent = await getAgent(req);
93
+ }
94
+ catch (err) {
95
+ return failToResolve(res, err);
96
+ }
90
97
  await telescope.runObservation(async () => {
91
98
  const response = await agent.onCallStart(reqToCallInfo(req));
92
99
  res.status(200);
93
100
  res.send(response);
94
- }, { conversationId: req.callId, agentId: agent.name, variantId });
101
+ }, { conversationId: req.callId, agentId: agent.name });
95
102
  });
96
103
  app.all('/on-call-ready', async (req, res) => {
97
104
  logger.setGlobalId(req.callId);
98
- const { agent, variantId } = await getAgent(req);
105
+ const agent = await getAgent(req);
99
106
  notificationRouter?.register({
100
107
  conversationId: req.callId,
101
- externalConversationId: getExternalConversationId?.(req.headers),
108
+ externalConversationId: getConversationMeta(req.headers).externalConversationId,
102
109
  }, agent);
103
110
  const { region, phoneNumber } = getConversationMeta(req.headers);
104
111
  telescope.getEventTracer().emit({
@@ -106,76 +113,94 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
106
113
  attributes: {
107
114
  callId: req.callId,
108
115
  agentId: agent.name,
109
- variantId,
110
116
  phoneNumber: phoneNumber ?? req.phoneNumber,
111
117
  region,
112
118
  },
113
119
  });
114
120
  await telescope.runObservation(async () => {
115
121
  await agent.onCallReady(reqToCallInfo(req));
116
- }, { conversationId: req.callId, agentId: agent.name, variantId });
122
+ }, { conversationId: req.callId, agentId: agent.name });
123
+ });
124
+ app.post('/on-phone-picked-up', async (req, res) => {
125
+ logger.setGlobalId(req.callId);
126
+ logger.debug('agent-service, on-phone-picked-up');
127
+ let agent;
128
+ try {
129
+ agent = await getAgent(req);
130
+ }
131
+ catch (err) {
132
+ return failToResolve(res, err);
133
+ }
134
+ if (!agent.onPhonePickedUp) {
135
+ res.status(200);
136
+ return;
137
+ }
138
+ const info = {
139
+ category: req.body?.category ?? 'unknown',
140
+ signal: req.body?.signal ?? null,
141
+ delayMs: req.body?.delayMs ?? 0,
142
+ };
143
+ await telescope.runObservation(async () => {
144
+ await agent.onPhonePickedUp(reqToCallInfo(req), info);
145
+ res.status(200);
146
+ }, { conversationId: req.callId, agentId: agent.name });
117
147
  });
118
148
  app.all('/on-call-end', async (req, res) => {
119
149
  logger.setGlobalId(req.callId);
120
150
  logger.debug('agent-service, on-call-end');
121
- let resolved;
151
+ let agent;
122
152
  try {
123
- resolved = await getAgent(req);
153
+ agent = await getAgent(req);
124
154
  }
125
- catch (e) {
126
- return fail(res, 400, String(e), e);
155
+ catch (err) {
156
+ return failToResolve(res, err);
127
157
  }
128
- const { agent, variantId } = resolved;
129
158
  notificationRouter?.unregister(req.callId);
130
159
  await telescope.runObservation(async () => {
131
160
  await agent.onCallEnd(reqToCallInfo(req));
132
- await createTelescopeConversation(req, variantId);
133
- await resolver.release(req.callId);
161
+ await createTelescopeConversation(req, agent.name);
162
+ await router.release(req.callId);
134
163
  res.status(200);
135
- }, { conversationId: req.callId, agentId: agent.name, variantId });
164
+ }, { conversationId: req.callId, agentId: agent.name });
136
165
  });
137
166
  app.post('/on-fatal-error', async (req, res) => {
138
167
  logger.setGlobalId(req.callId);
139
168
  logger.debug('agent-service, on-fatal-error');
140
- let resolved;
169
+ let agent;
141
170
  try {
142
- resolved = await getAgent(req);
171
+ agent = await getAgent(req);
143
172
  }
144
- catch (e) {
145
- return fail(res, 400, String(e), e);
173
+ catch (err) {
174
+ return failToResolve(res, err);
146
175
  }
147
- const { agent, variantId } = resolved;
148
176
  await telescope.runObservation(async () => {
149
177
  await agent.onFatalError(reqToCallInfo(req), req.body?.error ?? 'Fatal error');
150
178
  res.status(200);
151
- }, { conversationId: req.callId, agentId: agent.name, variantId });
179
+ }, { conversationId: req.callId, agentId: agent.name });
152
180
  });
153
181
  app.all('/chat/completions', async (req, res) => {
154
182
  logger.setGlobalId(req.callId);
155
183
  logger.debug('agent-service, /chat/completions');
156
- let resolved;
184
+ let agent;
157
185
  try {
158
- resolved = await getAgent(req);
186
+ agent = await getAgent(req);
159
187
  }
160
188
  catch (err) {
161
- return fail(res, 400, String(err), err);
189
+ return failToResolve(res, err);
162
190
  }
163
- const { agent, variantId } = resolved;
164
- return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), headersToMeta, req, res), {
191
+ return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), (headers) => getConversationMeta(headers).meta, req, res), {
165
192
  conversationId: req.callId,
166
193
  agentId: agent.name,
167
- variantId,
168
194
  });
169
195
  });
170
196
  app.post('/on-agent-speech-done', async (req, res) => {
171
197
  logger.setGlobalId(req.callId);
172
- const { agent, variantId } = await getAgent(req);
198
+ const agent = await getAgent(req);
173
199
  return telescope.runObservation(async () => {
174
200
  await agent.onAgentSpeechDone(mapFromOpenAiMessages(req.body.messages), reqToCallInfo(req));
175
201
  }, {
176
202
  conversationId: req.callId,
177
203
  agentId: agent.name,
178
- variantId,
179
204
  });
180
205
  });
181
206
  app.post('/latency-event', async (req, res) => {
@@ -250,7 +275,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
250
275
  const requests = [...activeRequests];
251
276
  activeRequests.clear();
252
277
  const notify = Promise.allSettled(requests.map(async (res) => {
253
- const { agent } = await getAgent(res.request);
278
+ const agent = await getAgent(res.request);
254
279
  await agent.onFatalError(reqToCallInfo(res.request), message);
255
280
  fail(res, 500, `${label}: ${message}`);
256
281
  }));
@@ -286,12 +311,22 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
286
311
  }
287
312
  }
288
313
  await onStart();
314
+ const routes = await router.start();
315
+ for (const route of routes) {
316
+ await callControl.setUpInboundSip(route.name, route.inbound);
317
+ }
318
+ for (const agent of agentsOf(routes)) {
319
+ await agent.onServiceStartup();
320
+ }
289
321
  started = true;
290
322
  await prewarmDNS();
291
323
  }
292
- const resolver = createVoiceRouteResolver({ getVoiceAgent, allocations, logger });
293
324
  function getAgent(req) {
294
- return resolver.resolve(req.agentName, req.callId);
325
+ return router.resolve(req.agentName, req.callId);
326
+ }
327
+ function failToResolve(res, err) {
328
+ const status = err instanceof UnknownVoiceRouteError ? 404 : 400;
329
+ return fail(res, status, String(err), err);
295
330
  }
296
331
  async function prewarmDNS() {
297
332
  const dnsLookup = promisify(dns.lookup);
@@ -305,7 +340,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
305
340
  }
306
341
  }
307
342
  }
308
- async function createTelescopeConversation(req, variantId) {
343
+ async function createTelescopeConversation(req, agentId) {
309
344
  const conversationId = req.callId;
310
345
  if (!conversationId) {
311
346
  logger.error('No call ID provided, cannot create Telescope conversation');
@@ -316,8 +351,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
316
351
  const conversation = {
317
352
  conversationId,
318
353
  medium: 'phone',
319
- agentId: req.agentName || undefined,
320
- variantId,
354
+ agentId,
321
355
  region,
322
356
  phoneNumber: phoneNumber ?? req.phoneNumber,
323
357
  createdAt: Date.now(),
@@ -337,7 +371,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
337
371
  return {
338
372
  callId: req.callId,
339
373
  phoneNumber: req.phoneNumber,
340
- meta: headersToMeta(req.headers),
374
+ meta: getConversationMeta(req.headers).meta,
341
375
  };
342
376
  }
343
377
  return {
@@ -345,6 +379,18 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
345
379
  };
346
380
  }
347
381
  const LATENCY_EVENT_TYPES_SET = new Set(LATENCY_EVENT_TYPES);
382
+ function agentsOf(routes) {
383
+ const agents = new Set();
384
+ for (const route of routes) {
385
+ if (isRandomizedVoiceRoute(route)) {
386
+ route.agents.forEach(({ agent }) => agents.add(agent));
387
+ }
388
+ else {
389
+ agents.add(route.agent);
390
+ }
391
+ }
392
+ return [...agents];
393
+ }
348
394
  function isObject(value) {
349
395
  return !!value && typeof value === 'object' && !Array.isArray(value);
350
396
  }
@@ -0,0 +1,21 @@
1
+ import type { VoiceAgent, VoiceRoute } from '../agent/index.js';
2
+ import type { ContextCache } from '../context-cache/index.js';
3
+ import type { Logger } from '../dockyard/index.js';
4
+ export interface VoiceRouterOptions<TMeta> {
5
+ getRoutes: () => Promise<readonly VoiceRoute<TMeta>[]>;
6
+ calls?: ContextCache<{
7
+ agentName: string;
8
+ }>;
9
+ logger: Logger;
10
+ random?: () => number;
11
+ }
12
+ export interface VoiceRouter<TMeta> {
13
+ start(): Promise<readonly VoiceRoute<TMeta>[]>;
14
+ resolve(routeName: string, callId: string): Promise<VoiceAgent<TMeta>>;
15
+ release(callId: string): Promise<void>;
16
+ }
17
+ export declare class UnknownVoiceRouteError extends Error {
18
+ constructor(routeName: string);
19
+ }
20
+ export declare function createVoiceRouter<TMeta>({ getRoutes, calls, logger, random, }: VoiceRouterOptions<TMeta>): VoiceRouter<TMeta>;
21
+ //# sourceMappingURL=voice-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-router.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,WAAW,kBAAkB,CAAC,KAAK;IAErC,SAAS,EAAE,MAAM,OAAO,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAKtD,KAAK,CAAC,EAAE,YAAY,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,KAAK;IAE9B,KAAK,IAAI,OAAO,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAE9C,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAEtE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACjC,SAAS,EAAE,MAAM;CAIhC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,EACrC,SAAS,EACT,KAA6B,EAC7B,MAAM,EACN,MAAoB,GACvB,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAwFhD"}
@@ -0,0 +1,100 @@
1
+ import { isRandomizedVoiceRoute } from '../agent/index.js';
2
+ import { createInMemoryCache } from '../context-cache/index.js';
3
+ export class UnknownVoiceRouteError extends Error {
4
+ constructor(routeName) {
5
+ super(`Unknown voice route: ${routeName}`);
6
+ this.name = 'UnknownVoiceRouteError';
7
+ }
8
+ }
9
+ export function createVoiceRouter({ getRoutes, calls = createInMemoryCache(), logger, random = Math.random, }) {
10
+ let byName;
11
+ let starting;
12
+ const picking = new Map();
13
+ function start() {
14
+ if (!starting) {
15
+ starting = build();
16
+ starting.catch(() => (starting = undefined));
17
+ }
18
+ return starting;
19
+ }
20
+ async function build() {
21
+ const routes = await getRoutes();
22
+ const index = new Map();
23
+ for (const route of routes) {
24
+ if (index.has(route.name)) {
25
+ throw new Error(`Duplicate voice route: ${route.name}`);
26
+ }
27
+ if (isRandomizedVoiceRoute(route)) {
28
+ validateRandomizedRoute(route);
29
+ }
30
+ index.set(route.name, route);
31
+ }
32
+ byName = index;
33
+ return routes;
34
+ }
35
+ async function resolve(routeName, callId) {
36
+ if (!byName) {
37
+ throw new Error('The voice router is not started');
38
+ }
39
+ const route = byName.get(routeName);
40
+ if (!route) {
41
+ throw new UnknownVoiceRouteError(routeName);
42
+ }
43
+ if (!isRandomizedVoiceRoute(route)) {
44
+ return route.agent;
45
+ }
46
+ let pending = picking.get(callId);
47
+ if (!pending) {
48
+ pending = keepOrPick(route, callId);
49
+ picking.set(callId, pending);
50
+ const done = () => picking.delete(callId);
51
+ pending.then(done, done);
52
+ }
53
+ return pending;
54
+ }
55
+ async function keepOrPick(route, callId) {
56
+ const kept = await calls.getContext(callId);
57
+ const keptAgent = kept && route.agents.find(({ agent }) => agent.name === kept.agentName);
58
+ if (keptAgent) {
59
+ return keptAgent.agent;
60
+ }
61
+ const agent = pick(route);
62
+ await calls.setContext(callId, { agentName: agent.name });
63
+ logger.log('Picked the agent of the call', {
64
+ routeName: route.name,
65
+ callId,
66
+ agentName: agent.name,
67
+ });
68
+ return agent;
69
+ }
70
+ function pick(route) {
71
+ const total = route.agents.reduce((sum, { weight }) => sum + weight, 0);
72
+ let selected = random() * total;
73
+ for (const { agent, weight } of route.agents) {
74
+ if (weight > 0 && selected < weight) {
75
+ return agent;
76
+ }
77
+ selected -= weight;
78
+ }
79
+ return route.agents.filter(({ weight }) => weight > 0).at(-1).agent;
80
+ }
81
+ function release(callId) {
82
+ return calls.clearContext(callId);
83
+ }
84
+ return { start, resolve, release };
85
+ }
86
+ function validateRandomizedRoute(route) {
87
+ const names = new Set();
88
+ for (const { agent, weight } of route.agents) {
89
+ if (!(weight >= 0)) {
90
+ throw new Error(`Route ${route.name}: the weight of ${agent.name} must be 0 or more`);
91
+ }
92
+ if (names.has(agent.name)) {
93
+ throw new Error(`Route ${route.name}: two agents are named ${agent.name}`);
94
+ }
95
+ names.add(agent.name);
96
+ }
97
+ if (!route.agents.some(({ weight }) => weight > 0)) {
98
+ throw new Error(`Route ${route.name}: no agent has a weight above 0`);
99
+ }
100
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@recombine-ai/platform",
3
3
  "type": "module",
4
- "version": "0.8.1",
4
+ "version": "0.10.0-dev-answer-detection.0",
5
5
  "description": "The Recombine platform: engine, telescope, dockyard, call control, the voice agent API, and the Bosun bindings in one package",
6
6
  "license": "EULA",
7
7
  "author": "recombine.ai",
@@ -1,21 +0,0 @@
1
- import type { VoiceAgent } from './voice-agent.js';
2
- export interface Experiment<TArm extends {
3
- weight: number;
4
- }> {
5
- default?: TArm;
6
- variants: Readonly<Record<string, TArm>>;
7
- }
8
- export declare function allocateVariant<TArm extends {
9
- weight: number;
10
- }>(experiment: Experiment<TArm>, random?: () => number): string | null;
11
- export interface VoiceAgentArm<TMeta> {
12
- agent: VoiceAgent<TMeta>;
13
- weight: number;
14
- }
15
- export interface VoiceAgentExperiment<TMeta> extends Experiment<VoiceAgentArm<TMeta>> {
16
- name: string;
17
- onServiceStartup: () => Promise<void>;
18
- }
19
- export type VoiceRoute<TMeta> = VoiceAgent<TMeta> | VoiceAgentExperiment<TMeta>;
20
- export declare function isVoiceAgentExperiment<TMeta>(route: VoiceRoute<TMeta>): route is VoiceAgentExperiment<TMeta>;
21
- //# sourceMappingURL=experiment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"experiment.d.ts","sourceRoot":"","sources":["../../src/agent/experiment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,UAAU,CAAC,IAAI,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;IAEvD,OAAO,CAAC,EAAE,IAAI,CAAA;IAEd,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;CAC3C;AAMD,wBAAgB,eAAe,CAAC,IAAI,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,EAC5B,MAAM,GAAE,MAAM,MAAoB,GACnC,MAAM,GAAG,IAAI,CA0Bf;AAED,MAAM,WAAW,aAAa,CAAC,KAAK;IAChC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;CACjB;AAGD,MAAM,WAAW,oBAAoB,CAAC,KAAK,CAAE,SAAQ,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjF,IAAI,EAAE,MAAM,CAAA;IAEZ,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACxC;AAED,MAAM,MAAM,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;AAE/E,wBAAgB,sBAAsB,CAAC,KAAK,EACxC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GACzB,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAEtC"}
@@ -1,29 +0,0 @@
1
- export function allocateVariant(experiment, random = Math.random) {
2
- const arms = Object.entries(experiment.variants).map(([id, arm]) => [
3
- id,
4
- arm.weight,
5
- ]);
6
- if (experiment.default) {
7
- arms.unshift([null, experiment.default.weight]);
8
- }
9
- for (const [id, weight] of arms) {
10
- if (!(weight >= 0)) {
11
- throw new Error(`The weight of the arm ${id ?? 'default'} must be 0 or more`);
12
- }
13
- }
14
- const total = arms.reduce((sum, [, weight]) => sum + weight, 0);
15
- if (total <= 0) {
16
- throw new Error('No experiment arm can win: the weights add up to 0');
17
- }
18
- let selected = random() * total;
19
- for (const [id, weight] of arms) {
20
- if (weight > 0 && selected < weight) {
21
- return id;
22
- }
23
- selected -= weight;
24
- }
25
- throw new Error('No experiment arm can win');
26
- }
27
- export function isVoiceAgentExperiment(route) {
28
- return 'variants' in route;
29
- }