@recombine-ai/platform 0.8.1 → 0.9.1-test.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 (295) 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 +2 -1
  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/7py9MbgR.js +3 -0
  18. package/build/bosun-app/frontend/client/_app/immutable/chunks/7py9MbgR.js.br +0 -0
  19. package/build/bosun-app/frontend/client/_app/immutable/chunks/7py9MbgR.js.gz +0 -0
  20. package/build/bosun-app/frontend/client/_app/immutable/chunks/{Xf8YUGwh.js → B6DLXdp3.js} +1 -1
  21. package/build/bosun-app/frontend/client/_app/immutable/chunks/B6DLXdp3.js.br +0 -0
  22. package/build/bosun-app/frontend/client/_app/immutable/chunks/B6DLXdp3.js.gz +0 -0
  23. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B1MxGo6p.js → BBk8_Xpk.js} +1 -1
  24. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.br +0 -0
  25. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.gz +0 -0
  26. package/build/bosun-app/frontend/client/_app/immutable/chunks/{D9YsE4-8.js → BEdAvgYp.js} +1 -1
  27. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.br +0 -0
  28. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.gz +0 -0
  29. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BTw6JswM.js → ByRLqhAV.js} +1 -1
  30. package/build/bosun-app/frontend/client/_app/immutable/chunks/ByRLqhAV.js.br +0 -0
  31. package/build/bosun-app/frontend/client/_app/immutable/chunks/ByRLqhAV.js.gz +0 -0
  32. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CVZT6n14.js → C0rPkxmP.js} +1 -1
  33. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.br +0 -0
  34. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.gz +0 -0
  35. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CuwQtXBl.js → C3cROXCy.js} +1 -1
  36. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.br +0 -0
  37. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.gz +0 -0
  38. package/build/bosun-app/frontend/client/_app/immutable/chunks/{AmpxVxY6.js → CR5IRTqC.js} +1 -1
  39. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.br +0 -0
  40. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.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/{CBW06aCF.js → DdpjwoIh.js} +1 -1
  45. package/build/bosun-app/frontend/client/_app/immutable/chunks/DdpjwoIh.js.br +0 -0
  46. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CBW06aCF.js.gz → DdpjwoIh.js.gz} +0 -0
  47. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B-5g3xS8.js → DjDpMqch.js} +20 -20
  48. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.br +0 -0
  49. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.gz +0 -0
  50. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CXS28GEZ.js → YE72mAzG.js} +1 -1
  51. package/build/bosun-app/frontend/client/_app/immutable/chunks/YE72mAzG.js.br +1 -0
  52. package/build/bosun-app/frontend/client/_app/immutable/chunks/YE72mAzG.js.gz +0 -0
  53. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BqH4VDQz.js → joiJcRPz.js} +1 -1
  54. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.br +0 -0
  55. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.gz +0 -0
  56. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CkstLsmI.js → ouMvMh56.js} +1 -1
  57. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.br +0 -0
  58. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.gz +0 -0
  59. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DaDBScXg.js → app.B0WyhTXQ.js} +2 -2
  60. package/build/bosun-app/frontend/client/_app/immutable/entry/app.B0WyhTXQ.js.br +0 -0
  61. package/build/bosun-app/frontend/client/_app/immutable/entry/app.B0WyhTXQ.js.gz +0 -0
  62. package/build/bosun-app/frontend/client/_app/immutable/entry/start.BPxqLgPa.js +1 -0
  63. package/build/bosun-app/frontend/client/_app/immutable/entry/start.BPxqLgPa.js.br +0 -0
  64. package/build/bosun-app/frontend/client/_app/immutable/entry/start.BPxqLgPa.js.gz +0 -0
  65. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0._S0yln6w.js → 0.B-xccOtn.js} +1 -1
  66. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.B-xccOtn.js.br +0 -0
  67. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.B-xccOtn.js.gz +0 -0
  68. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.BSNKOkyF.js → 1.D3-4ehn_.js} +1 -1
  69. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.D3-4ehn_.js.br +0 -0
  70. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.D3-4ehn_.js.gz +0 -0
  71. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.DWK1AGJD.js +35 -0
  72. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.DWK1AGJD.js.br +0 -0
  73. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.DWK1AGJD.js.gz +0 -0
  74. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.Bn1yI4kt.js → 17.Bs51j1UA.js} +1 -1
  75. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bs51j1UA.js.br +0 -0
  76. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bs51j1UA.js.gz +0 -0
  77. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.Bjr8I-7a.js +11 -0
  78. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.Bjr8I-7a.js.br +0 -0
  79. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.Bjr8I-7a.js.gz +0 -0
  80. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BDwIMjum.js +35 -0
  81. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BDwIMjum.js.br +0 -0
  82. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BDwIMjum.js.gz +0 -0
  83. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BX2jDq0d.js +1 -0
  84. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BX2jDq0d.js.br +0 -0
  85. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BX2jDq0d.js.gz +0 -0
  86. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.3i9fJNn9.js → 4.B0PTNAkY.js} +1 -1
  87. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.B0PTNAkY.js.br +0 -0
  88. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.B0PTNAkY.js.gz +0 -0
  89. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.C2R3wdz0.js → 5.DtXjhQi9.js} +1 -1
  90. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DtXjhQi9.js.br +0 -0
  91. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DtXjhQi9.js.gz +0 -0
  92. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.CarWVMPM.js → 6.CIpO8gDQ.js} +1 -1
  93. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CIpO8gDQ.js.br +0 -0
  94. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CIpO8gDQ.js.gz +0 -0
  95. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.joumIYrl.js → 8.Dljnutoy.js} +1 -1
  96. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.Dljnutoy.js.br +0 -0
  97. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.Dljnutoy.js.gz +0 -0
  98. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BQUquGeo.js +2 -0
  99. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BQUquGeo.js.br +0 -0
  100. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BQUquGeo.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-BzUEmxtM.js} +2 -2
  109. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-ChM9druZ.js.map → internal.js-BzUEmxtM.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-SjAtxtA0.js} +2 -2
  119. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-DFZznMhQ.js.map → _page.svelte.js-SjAtxtA0.js.map} +1 -1
  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-CFjEFb1h.js} +3 -3
  125. package/build/bosun-app/frontend/server/chunks/{handler-KSixAuP8.js.map → handler-CFjEFb1h.js.map} +1 -1
  126. package/build/bosun-app/frontend/server/chunks/{index.js-xzEg77OG.js → index.js-CxSWZHu3.js} +2 -2
  127. package/build/bosun-app/frontend/server/chunks/{index.js-xzEg77OG.js.map → index.js-CxSWZHu3.js.map} +1 -1
  128. package/build/bosun-app/frontend/server/chunks/{manifest.js-BW4X3pHs.js → manifest.js-B77RWxaX.js} +14 -14
  129. package/build/bosun-app/frontend/server/chunks/{manifest.js-BW4X3pHs.js.map → manifest.js-B77RWxaX.js.map} +1 -1
  130. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-B1rx1DOM.js → 0.js-B7wbeJFl.js} +2 -2
  131. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-B1rx1DOM.js.map → 0.js-B7wbeJFl.js.map} +1 -1
  132. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-h7GlMehw.js → 1.js-CNTEs79R.js} +2 -2
  133. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-h7GlMehw.js.map → 1.js-CNTEs79R.js.map} +1 -1
  134. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-C6xRYZtL.js → 10.js-3vQy72mr.js} +3 -3
  135. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-C6xRYZtL.js.map → 10.js-3vQy72mr.js.map} +1 -1
  136. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-CavP10f9.js → 17.js-BQznQUjn.js} +3 -3
  137. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-CavP10f9.js.map → 17.js-BQznQUjn.js.map} +1 -1
  138. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-DC7Bv1j_.js → 18.js-Bo2MexI0.js} +3 -3
  139. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-DC7Bv1j_.js.map → 18.js-Bo2MexI0.js.map} +1 -1
  140. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-BhiMP7Sz.js → 2.js-BosH410E.js} +3 -3
  141. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-BhiMP7Sz.js.map → 2.js-BosH410E.js.map} +1 -1
  142. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-C7zctWo-.js → 3.js-mn0WrcAG.js} +3 -3
  143. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-C7zctWo-.js.map → 3.js-mn0WrcAG.js.map} +1 -1
  144. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-5G8VLxJe.js → 4.js-B8BFcPBH.js} +2 -2
  145. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-5G8VLxJe.js.map → 4.js-B8BFcPBH.js.map} +1 -1
  146. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-HO1CExm6.js → 5.js-C7XaU1e9.js} +2 -2
  147. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-HO1CExm6.js.map → 5.js-C7XaU1e9.js.map} +1 -1
  148. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-CDW8tRHL.js → 6.js-BeGnlxE4.js} +2 -2
  149. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-CDW8tRHL.js.map → 6.js-BeGnlxE4.js.map} +1 -1
  150. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjO10Jpo.js → 8.js-DFxb3iv1.js} +2 -2
  151. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjO10Jpo.js.map → 8.js-DFxb3iv1.js.map} +1 -1
  152. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Csa_leV9.js → 9.js-DjLvoBf2.js} +3 -3
  153. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Csa_leV9.js.map → 9.js-DjLvoBf2.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 +15 -3
  157. package/build/call-control/index.d.ts +3 -1
  158. package/build/call-control/index.d.ts.map +1 -1
  159. package/build/call-control/index.js +2 -0
  160. package/build/call-control/port.d.ts +2 -1
  161. package/build/call-control/port.d.ts.map +1 -1
  162. package/build/call-control/schemas.generated.d.ts +3 -2
  163. package/build/call-control/schemas.generated.d.ts.map +1 -1
  164. package/build/call-control/schemas.generated.js +9 -4
  165. package/build/call-control/sip.d.ts +1 -0
  166. package/build/call-control/sip.d.ts.map +1 -1
  167. package/build/call-control/sip.js +19 -18
  168. package/build/call-control/types.d.ts +20 -167
  169. package/build/call-control/types.d.ts.map +1 -1
  170. package/build/call-control/types.js +3 -3
  171. package/build/call-control/user-message-scope.d.ts +4 -0
  172. package/build/call-control/user-message-scope.d.ts.map +1 -0
  173. package/build/call-control/user-message-scope.js +11 -0
  174. package/build/call-control/voice-agent-config.d.ts +157 -0
  175. package/build/call-control/voice-agent-config.d.ts.map +1 -0
  176. package/build/call-control/voice-agent-config.js +53 -0
  177. package/build/engine/interfaces/other.d.ts +1 -1
  178. package/build/engine/interfaces/other.d.ts.map +1 -1
  179. package/build/telescope/api.d.ts.map +1 -1
  180. package/build/telescope/api.js +1 -2
  181. package/build/telescope/interfaces/conversation.d.ts +0 -2
  182. package/build/telescope/interfaces/conversation.d.ts.map +1 -1
  183. package/build/telescope/interfaces/event-tracer.d.ts +0 -8
  184. package/build/telescope/interfaces/event-tracer.d.ts.map +1 -1
  185. package/build/telescope/interfaces/telescope.d.ts +0 -1
  186. package/build/telescope/interfaces/telescope.d.ts.map +1 -1
  187. package/build/telescope/latency-events.d.ts +1 -1
  188. package/build/telescope/latency-events.d.ts.map +1 -1
  189. package/build/telescope/latency-events.js +5 -0
  190. package/build/telescope/tracers/event-tracer.d.ts.map +1 -1
  191. package/build/telescope/tracers/event-tracer.js +0 -5
  192. package/build/text-agent-handlers/incoming-message.js +1 -1
  193. package/build/text-agent-handlers/index.d.ts +0 -1
  194. package/build/text-agent-handlers/index.d.ts.map +1 -1
  195. package/build/text-agent-handlers/index.js +0 -1
  196. package/build/text-agent-handlers/instrument.d.ts +0 -1
  197. package/build/text-agent-handlers/instrument.d.ts.map +1 -1
  198. package/build/text-agent-handlers/instrument.js +2 -6
  199. package/build/text-agent-handlers/jobs-handler.js +1 -1
  200. package/build/text-agent-handlers/jobs.d.ts +0 -1
  201. package/build/text-agent-handlers/jobs.d.ts.map +1 -1
  202. package/build/text-agent-handlers/message-acceptor.d.ts +0 -4
  203. package/build/text-agent-handlers/message-acceptor.d.ts.map +1 -1
  204. package/build/text-agent-handlers/message-acceptor.js +2 -11
  205. package/build/text-agent-handlers/ports.d.ts +1 -2
  206. package/build/text-agent-handlers/ports.d.ts.map +1 -1
  207. package/build/text-agent-handlers/ports.js +5 -6
  208. package/build/voice-agent-api/index.d.ts +3 -3
  209. package/build/voice-agent-api/index.d.ts.map +1 -1
  210. package/build/voice-agent-api/index.js +1 -1
  211. package/build/voice-agent-api/voice-http.d.ts +11 -14
  212. package/build/voice-agent-api/voice-http.d.ts.map +1 -1
  213. package/build/voice-agent-api/voice-http.js +67 -41
  214. package/build/voice-agent-api/voice-router.d.ts +21 -0
  215. package/build/voice-agent-api/voice-router.d.ts.map +1 -0
  216. package/build/voice-agent-api/voice-router.js +100 -0
  217. package/package.json +1 -1
  218. package/build/agent/experiment.d.ts +0 -21
  219. package/build/agent/experiment.d.ts.map +0 -1
  220. package/build/agent/experiment.js +0 -29
  221. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.br +0 -0
  222. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.gz +0 -0
  223. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.br +0 -0
  224. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.gz +0 -0
  225. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.br +0 -0
  226. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.gz +0 -0
  227. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.br +0 -0
  228. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.gz +0 -0
  229. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.br +0 -0
  230. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.gz +0 -0
  231. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.br +0 -0
  232. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.br +0 -0
  233. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.gz +0 -0
  234. package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.br +0 -1
  235. package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.gz +0 -0
  236. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.br +0 -0
  237. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.gz +0 -0
  238. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.br +0 -0
  239. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.gz +0 -0
  240. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.br +0 -0
  241. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.gz +0 -0
  242. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js +0 -3
  243. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.br +0 -0
  244. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.gz +0 -0
  245. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.br +0 -0
  246. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.gz +0 -0
  247. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.br +0 -0
  248. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.gz +0 -0
  249. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.br +0 -0
  250. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.gz +0 -0
  251. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js +0 -1
  252. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.br +0 -0
  253. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.gz +0 -0
  254. package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.br +0 -0
  255. package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.gz +0 -0
  256. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.br +0 -0
  257. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.gz +0 -0
  258. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js +0 -35
  259. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.br +0 -0
  260. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.gz +0 -0
  261. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.br +0 -0
  262. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.gz +0 -0
  263. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js +0 -11
  264. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.br +0 -0
  265. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.gz +0 -0
  266. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js +0 -35
  267. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.br +0 -0
  268. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.gz +0 -0
  269. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js +0 -1
  270. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.br +0 -0
  271. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.gz +0 -0
  272. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.br +0 -0
  273. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.gz +0 -0
  274. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.br +0 -0
  275. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.gz +0 -0
  276. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.br +0 -0
  277. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.gz +0 -0
  278. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.br +0 -0
  279. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.gz +0 -0
  280. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js +0 -2
  281. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.br +0 -0
  282. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.gz +0 -0
  283. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-BY0y3Vbb.js.map +0 -1
  284. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-DFpObbhz.js.map +0 -1
  285. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-b9Q5TFEZ.js.map +0 -1
  286. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-Chv8ybaj.js.map +0 -1
  287. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-Dkst1C_3.js.map +0 -1
  288. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-Bxdn8vG5.js.map +0 -1
  289. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-UAHBCAaS.js.map +0 -1
  290. package/build/text-agent-handlers/variant-scheduler.d.ts +0 -3
  291. package/build/text-agent-handlers/variant-scheduler.d.ts.map +0 -1
  292. package/build/text-agent-handlers/variant-scheduler.js +0 -9
  293. package/build/voice-agent-api/route-resolver.d.ts +0 -19
  294. package/build/voice-agent-api/route-resolver.d.ts.map +0 -1
  295. package/build/voice-agent-api/route-resolver.js +0 -57
@@ -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;AAMvD,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;;EAid1B"}
@@ -1,13 +1,15 @@
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';
5
+ import { runWithUserMessageId, validateVoiceAgentTurnDetectionSettings, } from '../call-control/index.js';
4
6
  import { loggerContext } from '../dockyard/index.js';
5
7
  import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES, } from '../telescope/index.js';
6
8
  import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers.js';
7
9
  import { llmCompletionHandler } from './llm-completion-handler.js';
8
10
  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, }) {
11
+ import { UnknownVoiceRouteError } from './voice-router.js';
12
+ export function voiceHttpConnect({ router, telescope, callControl, onStart, hostsToPrewarm, getConversationMeta, notificationRouter, stickyCookieName, }) {
11
13
  const activeRequests = new Set();
12
14
  let started = false;
13
15
  const app = Fastify({
@@ -41,11 +43,11 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
41
43
  if (!(error instanceof Error)) {
42
44
  throw new Error(String(error));
43
45
  }
44
- const { agent, variantId } = await getAgent(request);
46
+ const agent = await getAgent(request);
45
47
  if (!isRecoverableError(error)) {
46
48
  await agent.onFatalError(reqToCallInfo(request), error.message);
47
49
  }
48
- await createTelescopeConversation(request, variantId);
50
+ await createTelescopeConversation(request, agent.name);
49
51
  fail(reply, 500, error.message, error);
50
52
  });
51
53
  app.addHook('onRequest', async (req, res) => {
@@ -86,19 +88,28 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
86
88
  if (!req.agentName) {
87
89
  return fail(res, 400, 'Cannot start call without agent name');
88
90
  }
89
- const { agent, variantId } = await getAgent(req);
91
+ let agent;
92
+ try {
93
+ agent = await getAgent(req);
94
+ }
95
+ catch (err) {
96
+ return failToResolve(res, err);
97
+ }
90
98
  await telescope.runObservation(async () => {
91
99
  const response = await agent.onCallStart(reqToCallInfo(req));
100
+ if (response.initialSettings) {
101
+ validateVoiceAgentTurnDetectionSettings(response.initialSettings);
102
+ }
92
103
  res.status(200);
93
104
  res.send(response);
94
- }, { conversationId: req.callId, agentId: agent.name, variantId });
105
+ }, { conversationId: req.callId, agentId: agent.name });
95
106
  });
96
107
  app.all('/on-call-ready', async (req, res) => {
97
108
  logger.setGlobalId(req.callId);
98
- const { agent, variantId } = await getAgent(req);
109
+ const agent = await getAgent(req);
99
110
  notificationRouter?.register({
100
111
  conversationId: req.callId,
101
- externalConversationId: getExternalConversationId?.(req.headers),
112
+ externalConversationId: getConversationMeta(req.headers).externalConversationId,
102
113
  }, agent);
103
114
  const { region, phoneNumber } = getConversationMeta(req.headers);
104
115
  telescope.getEventTracer().emit({
@@ -106,77 +117,71 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
106
117
  attributes: {
107
118
  callId: req.callId,
108
119
  agentId: agent.name,
109
- variantId,
110
120
  phoneNumber: phoneNumber ?? req.phoneNumber,
111
121
  region,
112
122
  },
113
123
  });
114
124
  await telescope.runObservation(async () => {
115
125
  await agent.onCallReady(reqToCallInfo(req));
116
- }, { conversationId: req.callId, agentId: agent.name, variantId });
126
+ }, { conversationId: req.callId, agentId: agent.name });
117
127
  });
118
128
  app.all('/on-call-end', async (req, res) => {
119
129
  logger.setGlobalId(req.callId);
120
130
  logger.debug('agent-service, on-call-end');
121
- let resolved;
131
+ let agent;
122
132
  try {
123
- resolved = await getAgent(req);
133
+ agent = await getAgent(req);
124
134
  }
125
- catch (e) {
126
- return fail(res, 400, String(e), e);
135
+ catch (err) {
136
+ return failToResolve(res, err);
127
137
  }
128
- const { agent, variantId } = resolved;
129
138
  notificationRouter?.unregister(req.callId);
130
139
  await telescope.runObservation(async () => {
131
140
  await agent.onCallEnd(reqToCallInfo(req));
132
- await createTelescopeConversation(req, variantId);
133
- await resolver.release(req.callId);
141
+ await createTelescopeConversation(req, agent.name);
142
+ await router.release(req.callId);
134
143
  res.status(200);
135
- }, { conversationId: req.callId, agentId: agent.name, variantId });
144
+ }, { conversationId: req.callId, agentId: agent.name });
136
145
  });
137
146
  app.post('/on-fatal-error', async (req, res) => {
138
147
  logger.setGlobalId(req.callId);
139
148
  logger.debug('agent-service, on-fatal-error');
140
- let resolved;
149
+ let agent;
141
150
  try {
142
- resolved = await getAgent(req);
151
+ agent = await getAgent(req);
143
152
  }
144
- catch (e) {
145
- return fail(res, 400, String(e), e);
153
+ catch (err) {
154
+ return failToResolve(res, err);
146
155
  }
147
- const { agent, variantId } = resolved;
148
156
  await telescope.runObservation(async () => {
149
157
  await agent.onFatalError(reqToCallInfo(req), req.body?.error ?? 'Fatal error');
150
158
  res.status(200);
151
- }, { conversationId: req.callId, agentId: agent.name, variantId });
159
+ }, { conversationId: req.callId, agentId: agent.name });
152
160
  });
153
161
  app.all('/chat/completions', async (req, res) => {
154
162
  logger.setGlobalId(req.callId);
155
163
  logger.debug('agent-service, /chat/completions');
156
- let resolved;
164
+ let agent;
157
165
  try {
158
- resolved = await getAgent(req);
166
+ agent = await getAgent(req);
159
167
  }
160
168
  catch (err) {
161
- return fail(res, 400, String(err), err);
169
+ return failToResolve(res, err);
162
170
  }
163
- const { agent, variantId } = resolved;
164
- return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), headersToMeta, req, res), {
171
+ return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), (headers) => getConversationMeta(headers).meta, req, res), {
165
172
  conversationId: req.callId,
166
173
  agentId: agent.name,
167
- variantId,
168
174
  });
169
175
  });
170
176
  app.post('/on-agent-speech-done', async (req, res) => {
171
177
  logger.setGlobalId(req.callId);
172
- const { agent, variantId } = await getAgent(req);
173
- return telescope.runObservation(async () => {
178
+ const agent = await getAgent(req);
179
+ return runWithUserMessageId(req.body.userMessageId, () => telescope.runObservation(async () => {
174
180
  await agent.onAgentSpeechDone(mapFromOpenAiMessages(req.body.messages), reqToCallInfo(req));
175
181
  }, {
176
182
  conversationId: req.callId,
177
183
  agentId: agent.name,
178
- variantId,
179
- });
184
+ }));
180
185
  });
181
186
  app.post('/latency-event', async (req, res) => {
182
187
  logger.setGlobalId(req.callId);
@@ -250,7 +255,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
250
255
  const requests = [...activeRequests];
251
256
  activeRequests.clear();
252
257
  const notify = Promise.allSettled(requests.map(async (res) => {
253
- const { agent } = await getAgent(res.request);
258
+ const agent = await getAgent(res.request);
254
259
  await agent.onFatalError(reqToCallInfo(res.request), message);
255
260
  fail(res, 500, `${label}: ${message}`);
256
261
  }));
@@ -286,12 +291,22 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
286
291
  }
287
292
  }
288
293
  await onStart();
294
+ const routes = await router.start();
295
+ for (const route of routes) {
296
+ await callControl.setUpInboundSip(route.name, route.inbound);
297
+ }
298
+ for (const agent of agentsOf(routes)) {
299
+ await agent.onServiceStartup();
300
+ }
289
301
  started = true;
290
302
  await prewarmDNS();
291
303
  }
292
- const resolver = createVoiceRouteResolver({ getVoiceAgent, allocations, logger });
293
304
  function getAgent(req) {
294
- return resolver.resolve(req.agentName, req.callId);
305
+ return router.resolve(req.agentName, req.callId);
306
+ }
307
+ function failToResolve(res, err) {
308
+ const status = err instanceof UnknownVoiceRouteError ? 404 : 400;
309
+ return fail(res, status, String(err), err);
295
310
  }
296
311
  async function prewarmDNS() {
297
312
  const dnsLookup = promisify(dns.lookup);
@@ -305,7 +320,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
305
320
  }
306
321
  }
307
322
  }
308
- async function createTelescopeConversation(req, variantId) {
323
+ async function createTelescopeConversation(req, agentId) {
309
324
  const conversationId = req.callId;
310
325
  if (!conversationId) {
311
326
  logger.error('No call ID provided, cannot create Telescope conversation');
@@ -316,8 +331,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
316
331
  const conversation = {
317
332
  conversationId,
318
333
  medium: 'phone',
319
- agentId: req.agentName || undefined,
320
- variantId,
334
+ agentId,
321
335
  region,
322
336
  phoneNumber: phoneNumber ?? req.phoneNumber,
323
337
  createdAt: Date.now(),
@@ -337,7 +351,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
337
351
  return {
338
352
  callId: req.callId,
339
353
  phoneNumber: req.phoneNumber,
340
- meta: headersToMeta(req.headers),
354
+ meta: getConversationMeta(req.headers).meta,
341
355
  };
342
356
  }
343
357
  return {
@@ -345,6 +359,18 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
345
359
  };
346
360
  }
347
361
  const LATENCY_EVENT_TYPES_SET = new Set(LATENCY_EVENT_TYPES);
362
+ function agentsOf(routes) {
363
+ const agents = new Set();
364
+ for (const route of routes) {
365
+ if (isRandomizedVoiceRoute(route)) {
366
+ route.agents.forEach(({ agent }) => agents.add(agent));
367
+ }
368
+ else {
369
+ agents.add(route.agent);
370
+ }
371
+ }
372
+ return [...agents];
373
+ }
348
374
  function isObject(value) {
349
375
  return !!value && typeof value === 'object' && !Array.isArray(value);
350
376
  }
@@ -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.9.1-test.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
- }
@@ -1 +0,0 @@
1
- 1@�Ś�K�>�Ȭ�Tu`s��Œʬ�_�ēكF���j�4���'���f�ׯh���3��e�QL�8���Y�:��3O@�w�"mH�o�