@recombine-ai/platform 0.8.0-test.2 → 0.8.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 (284) hide show
  1. package/build/agent/experiment.d.ts +21 -0
  2. package/build/agent/experiment.d.ts.map +1 -0
  3. package/build/agent/experiment.js +29 -0
  4. package/build/agent/index.d.ts +2 -0
  5. package/build/agent/index.d.ts.map +1 -1
  6. package/build/agent/index.js +1 -0
  7. package/build/bosun/index.d.ts +1 -0
  8. package/build/bosun/index.d.ts.map +1 -1
  9. package/build/bosun/interfaces/agent.d.ts +1 -0
  10. package/build/bosun/interfaces/agent.d.ts.map +1 -1
  11. package/build/bosun/interfaces/project.d.ts +25 -0
  12. package/build/bosun/interfaces/project.d.ts.map +1 -0
  13. package/build/bosun/interfaces/project.js +1 -0
  14. package/build/bosun-app/backend/server.js +252 -60
  15. package/build/bosun-app/backend/server.js.map +2 -2
  16. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CR5IRTqC.js → AmpxVxY6.js} +1 -1
  17. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.br +0 -0
  18. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.gz +0 -0
  19. package/build/bosun-app/frontend/client/_app/immutable/chunks/{DjDpMqch.js → B-5g3xS8.js} +20 -20
  20. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.br +0 -0
  21. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.gz +0 -0
  22. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BBk8_Xpk.js → B1MxGo6p.js} +1 -1
  23. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.br +0 -0
  24. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.gz +0 -0
  25. package/build/bosun-app/frontend/client/_app/immutable/chunks/{joiJcRPz.js → BqH4VDQz.js} +1 -1
  26. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.br +0 -0
  27. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.gz +0 -0
  28. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B3N9vN4_.js → CQvDMTjY.js} +1 -1
  29. package/build/bosun-app/frontend/client/_app/immutable/chunks/CQvDMTjY.js.br +0 -0
  30. package/build/bosun-app/frontend/client/_app/immutable/chunks/CQvDMTjY.js.gz +0 -0
  31. package/build/bosun-app/frontend/client/_app/immutable/chunks/{C0rPkxmP.js → CVZT6n14.js} +1 -1
  32. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.br +0 -0
  33. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.gz +0 -0
  34. package/build/bosun-app/frontend/client/_app/immutable/chunks/{D89azUgT.js → CWPN78Jk.js} +1 -1
  35. package/build/bosun-app/frontend/client/_app/immutable/chunks/CWPN78Jk.js.br +0 -0
  36. package/build/bosun-app/frontend/client/_app/immutable/chunks/CWPN78Jk.js.gz +0 -0
  37. package/build/bosun-app/frontend/client/_app/immutable/chunks/{ouMvMh56.js → CkstLsmI.js} +1 -1
  38. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.br +0 -0
  39. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.gz +0 -0
  40. package/build/bosun-app/frontend/client/_app/immutable/chunks/{C3cROXCy.js → CuwQtXBl.js} +1 -1
  41. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.br +0 -0
  42. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.gz +0 -0
  43. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BEdAvgYp.js → D9YsE4-8.js} +1 -1
  44. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.br +0 -0
  45. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.gz +0 -0
  46. package/build/bosun-app/frontend/client/_app/immutable/chunks/{Diqx_kju.js → DK7_9Rr4.js} +1 -1
  47. package/build/bosun-app/frontend/client/_app/immutable/chunks/DK7_9Rr4.js.br +3 -0
  48. package/build/bosun-app/frontend/client/_app/immutable/chunks/DK7_9Rr4.js.gz +0 -0
  49. package/build/bosun-app/frontend/client/_app/immutable/chunks/{Bwiy-Sk7.js → O3fJLrRA.js} +1 -1
  50. package/build/bosun-app/frontend/client/_app/immutable/chunks/O3fJLrRA.js.br +0 -0
  51. package/build/bosun-app/frontend/client/_app/immutable/chunks/O3fJLrRA.js.gz +0 -0
  52. package/build/bosun-app/frontend/client/_app/immutable/chunks/{DJnDF3d9.js → dL_jwANm.js} +1 -1
  53. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.br +0 -0
  54. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.gz +0 -0
  55. package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js +3 -0
  56. package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js.br +0 -0
  57. package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js.gz +0 -0
  58. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DYrvpbQq.js → app.Bq7QRKSZ.js} +2 -2
  59. package/build/bosun-app/frontend/client/_app/immutable/entry/app.Bq7QRKSZ.js.br +0 -0
  60. package/build/bosun-app/frontend/client/_app/immutable/entry/app.Bq7QRKSZ.js.gz +0 -0
  61. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js +1 -0
  62. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js.br +0 -0
  63. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js.gz +0 -0
  64. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.DXIuJQso.js → 0.CIBqOQKB.js} +1 -1
  65. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CIBqOQKB.js.br +0 -0
  66. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CIBqOQKB.js.gz +0 -0
  67. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.CsX5iplT.js → 1.Dv78wD0F.js} +1 -1
  68. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Dv78wD0F.js.br +0 -0
  69. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Dv78wD0F.js.gz +0 -0
  70. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js +35 -0
  71. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js.br +0 -0
  72. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js.gz +0 -0
  73. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.BIO8m3DR.js → 17.DmVfus5a.js} +1 -1
  74. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DmVfus5a.js.br +0 -0
  75. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DmVfus5a.js.gz +0 -0
  76. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js +11 -0
  77. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js.br +0 -0
  78. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js.gz +0 -0
  79. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js +35 -0
  80. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js.br +0 -0
  81. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js.gz +0 -0
  82. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js +1 -0
  83. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js.br +0 -0
  84. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js.gz +0 -0
  85. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.BzhaMuo5.js → 4.DKTRRObl.js} +1 -1
  86. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.DKTRRObl.js.br +0 -0
  87. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.DKTRRObl.js.gz +0 -0
  88. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.BG8ylHWg.js → 5.D9SClLPX.js} +1 -1
  89. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D9SClLPX.js.br +0 -0
  90. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D9SClLPX.js.gz +0 -0
  91. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.DkDEANSN.js → 6.DdAs7BvU.js} +1 -1
  92. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DdAs7BvU.js.br +0 -0
  93. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DdAs7BvU.js.gz +0 -0
  94. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.3fEbISY6.js → 8.DNEyJy0a.js} +1 -1
  95. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DNEyJy0a.js.br +0 -0
  96. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DNEyJy0a.js.gz +0 -0
  97. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js +2 -0
  98. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js.br +0 -0
  99. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js.gz +0 -0
  100. package/build/bosun-app/frontend/client/_app/version.json +1 -1
  101. package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
  102. package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
  103. package/build/bosun-app/frontend/handler.js +4 -4
  104. package/build/bosun-app/frontend/index.js +4 -4
  105. package/build/bosun-app/frontend/server/chunks/chunks/{ChatStepTrace.js-VTtwaKGp.js → ChatStepTrace.js-BY0y3Vbb.js} +3 -1
  106. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-BY0y3Vbb.js.map +1 -0
  107. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-B7oaNMJQ.js → internal.js-CTNBeiir.js} +2 -2
  108. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-B7oaNMJQ.js.map → internal.js-CTNBeiir.js.map} +1 -1
  109. package/build/bosun-app/frontend/server/chunks/chunks/{source-selection.js-D5B8gfq2.js → source-selection.js-DFpObbhz.js} +3 -1
  110. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-DFpObbhz.js.map +1 -0
  111. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/{_layout.svelte.js-B2wHKJV7.js → _layout.svelte.js-b9Q5TFEZ.js} +134 -24
  112. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-b9Q5TFEZ.js.map +1 -0
  113. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/{_page.svelte.js-DDcIjgZD.js → _page.svelte.js-Chv8ybaj.js} +10 -4
  114. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-Chv8ybaj.js.map +1 -0
  115. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/{_page.svelte.js-UVUg89-t.js → _page.svelte.js-Dkst1C_3.js} +3 -1
  116. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-Dkst1C_3.js.map +1 -0
  117. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-SjAtxtA0.js → _page.svelte.js-DFZznMhQ.js} +2 -2
  118. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-SjAtxtA0.js.map → _page.svelte.js-DFZznMhQ.js.map} +1 -1
  119. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/{_page.svelte.js-DiZKDT2v.js → _page.svelte.js-Bxdn8vG5.js} +7 -3
  120. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-Bxdn8vG5.js.map +1 -0
  121. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/{_layout.svelte.js-CfkCQ2Th.js → _layout.svelte.js-DhdYiNVL.js} +61 -9
  122. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-DhdYiNVL.js.map +1 -0
  123. package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js → handler-kZm9DU-v.js} +3 -3
  124. package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js.map → handler-kZm9DU-v.js.map} +1 -1
  125. package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js → index.js-BYV_PeV-.js} +2 -2
  126. package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js.map → index.js-BYV_PeV-.js.map} +1 -1
  127. package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js → manifest.js-DknJwtFc.js} +14 -14
  128. package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js.map → manifest.js-DknJwtFc.js.map} +1 -1
  129. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js → 0.js-B947oA7Q.js} +2 -2
  130. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js.map → 0.js-B947oA7Q.js.map} +1 -1
  131. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js → 1.js-D-bO8SBw.js} +2 -2
  132. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js.map → 1.js-D-bO8SBw.js.map} +1 -1
  133. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js → 10.js-BPINRsAS.js} +3 -3
  134. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js.map → 10.js-BPINRsAS.js.map} +1 -1
  135. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js → 17.js-BvBqWcLx.js} +3 -3
  136. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js.map → 17.js-BvBqWcLx.js.map} +1 -1
  137. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js → 18.js-BEfVGplP.js} +3 -3
  138. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js.map → 18.js-BEfVGplP.js.map} +1 -1
  139. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js → 2.js-XaMsKwVG.js} +3 -3
  140. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js.map → 2.js-XaMsKwVG.js.map} +1 -1
  141. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js → 3.js-9Rmo9ovG.js} +3 -3
  142. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js.map → 3.js-9Rmo9ovG.js.map} +1 -1
  143. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js → 4.js-DHzNp2kw.js} +2 -2
  144. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js.map → 4.js-DHzNp2kw.js.map} +1 -1
  145. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js → 5.js-BtTetd8U.js} +2 -2
  146. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js.map → 5.js-BtTetd8U.js.map} +1 -1
  147. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js → 6.js-dyYItn4O.js} +2 -2
  148. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js.map → 6.js-dyYItn4O.js.map} +1 -1
  149. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js → 8.js-D5qfNA9r.js} +2 -2
  150. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js.map → 8.js-D5qfNA9r.js.map} +1 -1
  151. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js → 9.js-CxI4tPnx.js} +3 -3
  152. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js.map → 9.js-CxI4tPnx.js.map} +1 -1
  153. package/build/call-control/call-control.d.ts.map +1 -1
  154. package/build/call-control/call-control.js +0 -2
  155. package/build/call-control/index.d.ts +0 -1
  156. package/build/call-control/index.d.ts.map +1 -1
  157. package/build/call-control/index.js +0 -1
  158. package/build/call-control/schemas.generated.d.ts +2 -1
  159. package/build/call-control/schemas.generated.d.ts.map +1 -1
  160. package/build/call-control/schemas.generated.js +4 -4
  161. package/build/call-control/types.d.ts +156 -3
  162. package/build/call-control/types.d.ts.map +1 -1
  163. package/build/call-control/types.js +3 -3
  164. package/build/engine/interfaces/other.d.ts +1 -1
  165. package/build/engine/interfaces/other.d.ts.map +1 -1
  166. package/build/telescope/api.d.ts.map +1 -1
  167. package/build/telescope/api.js +8 -2
  168. package/build/telescope/index.d.ts +1 -1
  169. package/build/telescope/index.d.ts.map +1 -1
  170. package/build/telescope/interfaces/conversation.d.ts +8 -0
  171. package/build/telescope/interfaces/conversation.d.ts.map +1 -1
  172. package/build/telescope/interfaces/event-tracer.d.ts +8 -0
  173. package/build/telescope/interfaces/event-tracer.d.ts.map +1 -1
  174. package/build/telescope/interfaces/storage.d.ts +2 -2
  175. package/build/telescope/interfaces/storage.d.ts.map +1 -1
  176. package/build/telescope/interfaces/telescope.d.ts +1 -0
  177. package/build/telescope/interfaces/telescope.d.ts.map +1 -1
  178. package/build/telescope/stub-storage.d.ts +2 -2
  179. package/build/telescope/stub-storage.d.ts.map +1 -1
  180. package/build/telescope/stub-storage.js +3 -8
  181. package/build/telescope/tracers/event-tracer.d.ts.map +1 -1
  182. package/build/telescope/tracers/event-tracer.js +5 -0
  183. package/build/text-agent-handlers/incoming-message.js +1 -1
  184. package/build/text-agent-handlers/index.d.ts +1 -0
  185. package/build/text-agent-handlers/index.d.ts.map +1 -1
  186. package/build/text-agent-handlers/index.js +1 -0
  187. package/build/text-agent-handlers/instrument.d.ts +1 -0
  188. package/build/text-agent-handlers/instrument.d.ts.map +1 -1
  189. package/build/text-agent-handlers/instrument.js +6 -2
  190. package/build/text-agent-handlers/jobs-handler.js +1 -1
  191. package/build/text-agent-handlers/jobs.d.ts +1 -0
  192. package/build/text-agent-handlers/jobs.d.ts.map +1 -1
  193. package/build/text-agent-handlers/message-acceptor.d.ts +4 -0
  194. package/build/text-agent-handlers/message-acceptor.d.ts.map +1 -1
  195. package/build/text-agent-handlers/message-acceptor.js +8 -2
  196. package/build/text-agent-handlers/ports.d.ts +2 -1
  197. package/build/text-agent-handlers/ports.d.ts.map +1 -1
  198. package/build/text-agent-handlers/ports.js +6 -5
  199. package/build/text-agent-handlers/variant-scheduler.d.ts +3 -0
  200. package/build/text-agent-handlers/variant-scheduler.d.ts.map +1 -0
  201. package/build/text-agent-handlers/variant-scheduler.js +9 -0
  202. package/build/voice-agent-api/index.d.ts +2 -0
  203. package/build/voice-agent-api/index.d.ts.map +1 -1
  204. package/build/voice-agent-api/index.js +1 -0
  205. package/build/voice-agent-api/route-resolver.d.ts +19 -0
  206. package/build/voice-agent-api/route-resolver.d.ts.map +1 -0
  207. package/build/voice-agent-api/route-resolver.js +57 -0
  208. package/build/voice-agent-api/voice-http.d.ts +8 -4
  209. package/build/voice-agent-api/voice-http.d.ts.map +1 -1
  210. package/build/voice-agent-api/voice-http.js +31 -32
  211. package/package.json +1 -1
  212. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3N9vN4_.js.br +0 -0
  213. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3N9vN4_.js.gz +0 -0
  214. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.br +0 -0
  215. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.gz +0 -0
  216. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.br +0 -0
  217. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.gz +0 -0
  218. package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js +0 -3
  219. package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js.br +0 -0
  220. package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js.gz +0 -0
  221. package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js.br +0 -0
  222. package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js.gz +0 -0
  223. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.br +0 -0
  224. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.gz +0 -0
  225. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.br +0 -0
  226. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.gz +0 -0
  227. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.br +0 -0
  228. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.gz +0 -0
  229. package/build/bosun-app/frontend/client/_app/immutable/chunks/D89azUgT.js.br +0 -0
  230. package/build/bosun-app/frontend/client/_app/immutable/chunks/D89azUgT.js.gz +0 -0
  231. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.br +0 -0
  232. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.gz +0 -0
  233. package/build/bosun-app/frontend/client/_app/immutable/chunks/Diqx_kju.js.br +0 -1
  234. package/build/bosun-app/frontend/client/_app/immutable/chunks/Diqx_kju.js.gz +0 -0
  235. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.br +0 -0
  236. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.gz +0 -0
  237. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.br +0 -0
  238. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.gz +0 -0
  239. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.br +0 -0
  240. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.gz +0 -0
  241. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DYrvpbQq.js.br +0 -0
  242. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DYrvpbQq.js.gz +0 -0
  243. package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js +0 -1
  244. package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js.br +0 -0
  245. package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js.gz +0 -0
  246. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DXIuJQso.js.br +0 -0
  247. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DXIuJQso.js.gz +0 -0
  248. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CsX5iplT.js.br +0 -0
  249. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CsX5iplT.js.gz +0 -0
  250. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js +0 -35
  251. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js.br +0 -0
  252. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js.gz +0 -0
  253. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BIO8m3DR.js.br +0 -0
  254. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BIO8m3DR.js.gz +0 -0
  255. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js +0 -11
  256. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js.br +0 -0
  257. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js.gz +0 -0
  258. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js +0 -35
  259. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js.br +0 -0
  260. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js.gz +0 -0
  261. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js +0 -1
  262. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js.br +0 -0
  263. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js.gz +0 -0
  264. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BzhaMuo5.js.br +0 -0
  265. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BzhaMuo5.js.gz +0 -0
  266. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BG8ylHWg.js.br +0 -0
  267. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BG8ylHWg.js.gz +0 -0
  268. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DkDEANSN.js.br +0 -0
  269. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DkDEANSN.js.gz +0 -0
  270. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.3fEbISY6.js.br +0 -0
  271. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.3fEbISY6.js.gz +0 -0
  272. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js +0 -2
  273. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js.br +0 -0
  274. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js.gz +0 -0
  275. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-VTtwaKGp.js.map +0 -1
  276. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-D5B8gfq2.js.map +0 -1
  277. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-B2wHKJV7.js.map +0 -1
  278. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-DDcIjgZD.js.map +0 -1
  279. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-UVUg89-t.js.map +0 -1
  280. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-DiZKDT2v.js.map +0 -1
  281. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-CfkCQ2Th.js.map +0 -1
  282. package/build/call-control/voice-agent-config.d.ts +0 -155
  283. package/build/call-control/voice-agent-config.d.ts.map +0 -1
  284. package/build/call-control/voice-agent-config.js +0 -53
@@ -19,7 +19,7 @@ export function createIncomingMessageHandler(options) {
19
19
  if (!agentRecord) {
20
20
  throw new Error(`incoming-message, agent not found for ${conversationId}`);
21
21
  }
22
- const agent = await getTextAgent(agentRecord.agentId);
22
+ const agent = await getTextAgent(agentRecord.agentId, agentRecord.variantId);
23
23
  return { agent, agentRecord };
24
24
  }
25
25
  async function handleChatMessage(event) {
@@ -11,5 +11,6 @@ export type { MessageAcceptorOptions } from './message-acceptor.js';
11
11
  export { createNotificationHookHandler } from './notification-hook.js';
12
12
  export type { NotificationHookOptions, NotificationHookRequest } from './notification-hook.js';
13
13
  export { instrumentTextAgent } from './instrument.js';
14
+ export { scopeSchedulerToVariant } from './variant-scheduler.js';
14
15
  export type { InstrumentTextAgentOptions } from './instrument.js';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACpD,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC/D,YAAY,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACtE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACpD,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC/D,YAAY,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACtE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA"}
@@ -4,3 +4,4 @@ export { createJobsHandler } from './jobs-handler.js';
4
4
  export { createMessageAcceptor } from './message-acceptor.js';
5
5
  export { createNotificationHookHandler } from './notification-hook.js';
6
6
  export { instrumentTextAgent } from './instrument.js';
7
+ export { scopeSchedulerToVariant } from './variant-scheduler.js';
@@ -6,6 +6,7 @@ export interface InstrumentTextAgentOptions<TMeta> {
6
6
  agent: TextAgent<TMeta>;
7
7
  messagingProvider?: MonitoringProvider;
8
8
  onEvent?: (event: Event<TMeta>) => Promise<void>;
9
+ variantId?: string;
9
10
  }
10
11
  export declare function instrumentTextAgent<TMeta>(options: InstrumentTextAgentOptions<TMeta>): TextAgent<TMeta>;
11
12
  //# sourceMappingURL=instrument.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC7C,SAAS,EAAE,UAAU,CAAA;IACrB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAEvB,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACnD;AAaD,wBAAgB,mBAAmB,CAAC,KAAK,EACrC,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC,GAC3C,SAAS,CAAC,KAAK,CAAC,CAoClB"}
1
+ {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC7C,SAAS,EAAE,UAAU,CAAA;IACrB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAEvB,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhD,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAaD,wBAAgB,mBAAmB,CAAC,KAAK,EACrC,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC,GAC3C,SAAS,CAAC,KAAK,CAAC,CAwClB"}
@@ -1,7 +1,11 @@
1
1
  import { emitConversationalTrace, textEventTrace } from '../telescope/index.js';
2
2
  export function instrumentTextAgent(options) {
3
- const { telescope, agent, messagingProvider, onEvent } = options;
4
- const observation = (conversationId) => ({ conversationId, messagingProvider });
3
+ const { telescope, agent, messagingProvider, onEvent, variantId } = options;
4
+ const observation = (conversationId) => ({
5
+ conversationId,
6
+ messagingProvider,
7
+ variantId,
8
+ });
5
9
  async function traceReceivedMessage(event) {
6
10
  if (event.kind !== 'message')
7
11
  return;
@@ -5,7 +5,7 @@ export function createJobsHandler(options) {
5
5
  return async function handleJob(input) {
6
6
  let agent;
7
7
  try {
8
- agent = await getTextAgent(input.agentId);
8
+ agent = await getTextAgent(input.agentId, input.variantId);
9
9
  }
10
10
  catch (err) {
11
11
  logger.error('jobs, unknown agentId', { agentId: input.agentId, err });
@@ -6,6 +6,7 @@ export interface Job {
6
6
  export interface JobInput {
7
7
  jobId: string;
8
8
  agentId: string;
9
+ variantId?: string;
9
10
  conversationId: string;
10
11
  handlerId: string;
11
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB;AAKD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,uBAAuB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;CACtE"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB;AAKD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,uBAAuB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;CACtE"}
@@ -1,3 +1,4 @@
1
+ import { type Experiment } from '../agent/experiment.js';
1
2
  import type { Logger } from '../dockyard/index.js';
2
3
  import type { EventTracer } from '../telescope/index.js';
3
4
  import type { Event } from './event.js';
@@ -5,6 +6,9 @@ import type { AgentRegistry, HandlerResponse } from './ports.js';
5
6
  export interface MessageAcceptorOptions {
6
7
  registry: AgentRegistry;
7
8
  resolveAgentId: (event: Event) => string;
9
+ experiments?: Readonly<Record<string, Experiment<{
10
+ weight: number;
11
+ }>>>;
8
12
  eventTracer: EventTracer;
9
13
  invokeIncomingMessage: (event: Event) => Promise<void>;
10
14
  logger: Logger;
@@ -1 +1 @@
1
- {"version":3,"file":"message-acceptor.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/message-acceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGhE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,aAAa,CAAA;IAEvB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IACxC,WAAW,EAAE,WAAW,CAAA;IAExB,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,IAG7B,OAAO,KAAK,KAAG,OAAO,CAAC,eAAe,CAAC,CAqC9E"}
1
+ {"version":3,"file":"message-acceptor.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/message-acceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,wBAAwB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGhE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,aAAa,CAAA;IAEvB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IAExC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAAA;IACtE,WAAW,EAAE,WAAW,CAAA;IAExB,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,IAI7B,OAAO,KAAK,KAAG,OAAO,CAAC,eAAe,CAAC,CA0C9E"}
@@ -1,6 +1,7 @@
1
+ import { allocateVariant } from '../agent/experiment.js';
1
2
  import { handlerResponse } from './ports.js';
2
3
  export function createMessageAcceptor(options) {
3
- const { registry, resolveAgentId, eventTracer, invokeIncomingMessage, logger } = options;
4
+ const { registry, resolveAgentId, experiments, eventTracer, invokeIncomingMessage, logger } = options;
4
5
  return async function acceptMessage(event) {
5
6
  logger.debug('acceptMessage from conversation', {
6
7
  conversationId: event.conversationId,
@@ -8,9 +9,13 @@ export function createMessageAcceptor(options) {
8
9
  });
9
10
  let record = await registry.getAgent(event.conversationId);
10
11
  if (!record) {
12
+ const agentId = resolveAgentId(event);
13
+ const experiment = experiments?.[agentId];
14
+ const variantId = experiment ? allocateVariant(experiment) : null;
11
15
  record = {
12
16
  conversationId: event.conversationId,
13
- agentId: resolveAgentId(event),
17
+ agentId,
18
+ ...(variantId ? { variantId } : {}),
14
19
  };
15
20
  await registry.saveAgent(record);
16
21
  eventTracer.emit({
@@ -18,6 +23,7 @@ export function createMessageAcceptor(options) {
18
23
  attributes: {
19
24
  conversationId: event.conversationId,
20
25
  agentId: record.agentId,
26
+ variantId: record.variantId,
21
27
  channel: event.channel,
22
28
  region: typeof event.metadata.region === 'string'
23
29
  ? event.metadata.region
@@ -4,6 +4,7 @@ import type { JobInput } from './jobs.js';
4
4
  export interface AgentRecord {
5
5
  conversationId: string;
6
6
  agentId: string;
7
+ variantId?: string;
7
8
  }
8
9
  export interface AgentRegistry {
9
10
  getAgent(conversationId: string): Promise<AgentRecord | null>;
@@ -25,7 +26,7 @@ export interface ChatLockStore {
25
26
  export interface JobRunner extends Scheduler {
26
27
  runJob(input: JobInput): Promise<unknown>;
27
28
  }
28
- export type GetTextAgent<TMeta> = (agentId: string) => Promise<TextAgent<TMeta>>;
29
+ export type GetTextAgent<TMeta> = (agentId: string, variantId?: string) => Promise<TextAgent<TMeta>>;
29
30
  export declare function cacheTextAgents<TMeta>(getTextAgent: GetTextAgent<TMeta>): GetTextAgent<TMeta>;
30
31
  export type HandlerResponse = {
31
32
  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;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
+ {"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,11 +1,12 @@
1
1
  export function cacheTextAgents(getTextAgent) {
2
2
  const agents = new Map();
3
- return (agentId) => {
4
- let agent = agents.get(agentId);
3
+ return (agentId, variantId) => {
4
+ const key = variantId ? `${agentId}#${variantId}` : agentId;
5
+ let agent = agents.get(key);
5
6
  if (!agent) {
6
- agent = getTextAgent(agentId);
7
- agents.set(agentId, agent);
8
- agent.catch(() => agents.delete(agentId));
7
+ agent = getTextAgent(agentId, variantId);
8
+ agents.set(key, agent);
9
+ agent.catch(() => agents.delete(key));
9
10
  }
10
11
  return agent;
11
12
  };
@@ -0,0 +1,3 @@
1
+ import type { Scheduler } from '../engine/index.js';
2
+ export declare function scopeSchedulerToVariant(scheduler: Scheduler, variantId: string | undefined): Scheduler;
3
+ //# sourceMappingURL=variant-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant-scheduler.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/variant-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAMnD,wBAAgB,uBAAuB,CACnC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,CAUX"}
@@ -0,0 +1,9 @@
1
+ export function scopeSchedulerToVariant(scheduler, variantId) {
2
+ if (!variantId) {
3
+ return scheduler;
4
+ }
5
+ return {
6
+ registerAction: (agentId, actionName, action) => scheduler.registerAction(agentId, actionName, action, variantId),
7
+ clearAllPendingActions: (conversationId) => scheduler.clearAllPendingActions(conversationId),
8
+ };
9
+ }
@@ -3,4 +3,6 @@ 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
5
  export type { VoiceHttpBindings } from './voice-http.js';
6
+ export { createVoiceRouteResolver } from './route-resolver.js';
7
+ export type { ResolvedVoiceAgent, VoiceRouteResolverOptions } from './route-resolver.js';
6
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"}
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,3 +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';
@@ -0,0 +1,19 @@
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 ResolvedVoiceAgent<TMeta> {
5
+ agent: VoiceAgent<TMeta>;
6
+ variantId?: string;
7
+ }
8
+ export interface VoiceRouteResolverOptions<TMeta> {
9
+ getVoiceAgent: (agentName: string) => Promise<VoiceRoute<TMeta>>;
10
+ allocations?: ContextCache<{
11
+ variantId: string | null;
12
+ }>;
13
+ logger: Logger;
14
+ }
15
+ export declare function createVoiceRouteResolver<TMeta>({ getVoiceAgent, allocations, logger, }: VoiceRouteResolverOptions<TMeta>): {
16
+ resolve: (agentName: string, callId: string) => Promise<ResolvedVoiceAgent<TMeta>>;
17
+ release: (callId: string) => Promise<void>;
18
+ };
19
+ //# sourceMappingURL=route-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-resolver.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/route-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAwB,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;IACrC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IAExB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,yBAAyB,CAAC,KAAK;IAC5C,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAEhE,WAAW,CAAC,EAAE,YAAY,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACxD,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,EAC5C,aAAa,EACb,WAAmC,EACnC,MAAM,GACT,EAAE,yBAAyB,CAAC,KAAK,CAAC;yBAiBG,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;sBAuCpE,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAKlD"}
@@ -0,0 +1,57 @@
1
+ import { allocateVariant, isVoiceAgentExperiment } from '../agent/index.js';
2
+ import { createInMemoryCache } from '../context-cache/index.js';
3
+ export function createVoiceRouteResolver({ getVoiceAgent, allocations = createInMemoryCache(), logger, }) {
4
+ const routes = new Map();
5
+ const allocating = new Map();
6
+ function getRoute(agentName) {
7
+ let route = routes.get(agentName);
8
+ if (!route) {
9
+ logger.debug('Loading agent', { agentName });
10
+ route = getVoiceAgent(agentName);
11
+ routes.set(agentName, route);
12
+ route.catch(() => routes.delete(agentName));
13
+ }
14
+ return route;
15
+ }
16
+ async function resolve(agentName, callId) {
17
+ const route = await getRoute(agentName);
18
+ if (!isVoiceAgentExperiment(route)) {
19
+ return { agent: route };
20
+ }
21
+ const variantId = await allocate(route, callId);
22
+ const arm = variantId === null ? route.default : route.variants[variantId];
23
+ if (!arm) {
24
+ throw new Error(`Route ${agentName} has no arm ${variantId ?? 'default'}`);
25
+ }
26
+ return { agent: arm.agent, variantId: variantId ?? undefined };
27
+ }
28
+ function allocate(route, callId) {
29
+ let pending = allocating.get(callId);
30
+ if (!pending) {
31
+ pending = keepOrAllocate(route, callId);
32
+ allocating.set(callId, pending);
33
+ const done = () => allocating.delete(callId);
34
+ pending.then(done, done);
35
+ }
36
+ return pending;
37
+ }
38
+ async function keepOrAllocate(route, callId) {
39
+ const kept = await allocations.getContext(callId);
40
+ if (kept && hasArm(route, kept.variantId)) {
41
+ return kept.variantId;
42
+ }
43
+ const variantId = allocateVariant(route);
44
+ await allocations.setContext(callId, { variantId });
45
+ logger.log('Allocated experiment arm', { agentName: route.name, callId, variantId });
46
+ return variantId;
47
+ }
48
+ function release(callId) {
49
+ return allocations.clearContext(callId);
50
+ }
51
+ return { resolve, release };
52
+ }
53
+ function hasArm(route, variantId) {
54
+ return variantId === null
55
+ ? route.default !== undefined
56
+ : Object.prototype.hasOwnProperty.call(route.variants, variantId);
57
+ }
@@ -1,6 +1,7 @@
1
1
  import { FastifyRequest } from 'fastify';
2
- import { VoiceAgent } from '../agent/index.js';
3
- import CallControl from '../call-control/index.js';
2
+ import { VoiceRoute } from '../agent/index.js';
3
+ import type CallControl from '../call-control/index.js';
4
+ import type { ContextCache } from '../context-cache/index.js';
4
5
  import type { NotificationRouter } from '../notifications/index.js';
5
6
  import type { ITelescope } from '../telescope/index.js';
6
7
  declare module 'fastify' {
@@ -13,7 +14,10 @@ declare module 'fastify' {
13
14
  }
14
15
  }
15
16
  export interface VoiceHttpBindings<TMeta> {
16
- getVoiceAgent: (agentName: string) => Promise<VoiceAgent<TMeta>>;
17
+ getVoiceAgent: (agentName: string) => Promise<VoiceRoute<TMeta>>;
18
+ allocations?: ContextCache<{
19
+ variantId: string | null;
20
+ }>;
17
21
  telescope: ITelescope;
18
22
  onStart: () => Promise<void>;
19
23
  hostsToPrewarm: string[];
@@ -27,7 +31,7 @@ export interface VoiceHttpBindings<TMeta> {
27
31
  getExternalConversationId?: (headers: FastifyRequest['headers']) => string | undefined;
28
32
  stickyCookieName?: string;
29
33
  }
30
- export declare function voiceHttpConnect<TMeta>({ getVoiceAgent, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
34
+ export declare function voiceHttpConnect<TMeta>({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
31
35
  start: () => Promise<void>;
32
36
  };
33
37
  //# 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,WAAwD,MAAM,0BAA0B,CAAA;AAE/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAA;AAW9E,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;IACpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,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,SAAS,EACT,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EAic1B"}
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,13 +1,13 @@
1
1
  import * as dns from 'node:dns';
2
2
  import { promisify } from 'node:util';
3
3
  import Fastify from 'fastify';
4
- import { validateVoiceAgentTurnDetectionSettings } from '../call-control/index.js';
5
4
  import { loggerContext } from '../dockyard/index.js';
6
5
  import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES, } from '../telescope/index.js';
7
6
  import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers.js';
8
7
  import { llmCompletionHandler } from './llm-completion-handler.js';
9
8
  import { logger } from './logger.js';
10
- export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }) {
9
+ import { createVoiceRouteResolver } from './route-resolver.js';
10
+ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }) {
11
11
  const activeRequests = new Set();
12
12
  let started = false;
13
13
  const app = Fastify({
@@ -41,10 +41,11 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
41
41
  if (!(error instanceof Error)) {
42
42
  throw new Error(String(error));
43
43
  }
44
+ const { agent, variantId } = await getAgent(request);
44
45
  if (!isRecoverableError(error)) {
45
- await (await getAgent(request)).onFatalError(reqToCallInfo(request), error.message);
46
+ await agent.onFatalError(reqToCallInfo(request), error.message);
46
47
  }
47
- await createTelescopeConversation(request);
48
+ await createTelescopeConversation(request, variantId);
48
49
  fail(reply, 500, error.message, error);
49
50
  });
50
51
  app.addHook('onRequest', async (req, res) => {
@@ -85,19 +86,16 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
85
86
  if (!req.agentName) {
86
87
  return fail(res, 400, 'Cannot start call without agent name');
87
88
  }
88
- const agent = await getAgent(req);
89
+ const { agent, variantId } = await getAgent(req);
89
90
  await telescope.runObservation(async () => {
90
91
  const response = await agent.onCallStart(reqToCallInfo(req));
91
- if (response.initialSettings) {
92
- validateVoiceAgentTurnDetectionSettings(response.initialSettings);
93
- }
94
92
  res.status(200);
95
93
  res.send(response);
96
- }, { conversationId: req.callId, agentId: agent.name });
94
+ }, { conversationId: req.callId, agentId: agent.name, variantId });
97
95
  });
98
96
  app.all('/on-call-ready', async (req, res) => {
99
97
  logger.setGlobalId(req.callId);
100
- const agent = await getAgent(req);
98
+ const { agent, variantId } = await getAgent(req);
101
99
  notificationRouter?.register({
102
100
  conversationId: req.callId,
103
101
  externalConversationId: getExternalConversationId?.(req.headers),
@@ -108,69 +106,76 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
108
106
  attributes: {
109
107
  callId: req.callId,
110
108
  agentId: agent.name,
109
+ variantId,
111
110
  phoneNumber: phoneNumber ?? req.phoneNumber,
112
111
  region,
113
112
  },
114
113
  });
115
114
  await telescope.runObservation(async () => {
116
115
  await agent.onCallReady(reqToCallInfo(req));
117
- }, { conversationId: req.callId, agentId: agent.name });
116
+ }, { conversationId: req.callId, agentId: agent.name, variantId });
118
117
  });
119
118
  app.all('/on-call-end', async (req, res) => {
120
119
  logger.setGlobalId(req.callId);
121
120
  logger.debug('agent-service, on-call-end');
122
- let agent;
121
+ let resolved;
123
122
  try {
124
- agent = await getAgent(req);
123
+ resolved = await getAgent(req);
125
124
  }
126
125
  catch (e) {
127
126
  return fail(res, 400, String(e), e);
128
127
  }
128
+ const { agent, variantId } = resolved;
129
129
  notificationRouter?.unregister(req.callId);
130
130
  await telescope.runObservation(async () => {
131
131
  await agent.onCallEnd(reqToCallInfo(req));
132
- await createTelescopeConversation(req);
132
+ await createTelescopeConversation(req, variantId);
133
+ await resolver.release(req.callId);
133
134
  res.status(200);
134
- }, { conversationId: req.callId, agentId: agent.name });
135
+ }, { conversationId: req.callId, agentId: agent.name, variantId });
135
136
  });
136
137
  app.post('/on-fatal-error', async (req, res) => {
137
138
  logger.setGlobalId(req.callId);
138
139
  logger.debug('agent-service, on-fatal-error');
139
- let agent;
140
+ let resolved;
140
141
  try {
141
- agent = await getAgent(req);
142
+ resolved = await getAgent(req);
142
143
  }
143
144
  catch (e) {
144
145
  return fail(res, 400, String(e), e);
145
146
  }
147
+ const { agent, variantId } = resolved;
146
148
  await telescope.runObservation(async () => {
147
149
  await agent.onFatalError(reqToCallInfo(req), req.body?.error ?? 'Fatal error');
148
150
  res.status(200);
149
- }, { conversationId: req.callId, agentId: agent.name });
151
+ }, { conversationId: req.callId, agentId: agent.name, variantId });
150
152
  });
151
153
  app.all('/chat/completions', async (req, res) => {
152
154
  logger.setGlobalId(req.callId);
153
155
  logger.debug('agent-service, /chat/completions');
154
- let agent;
156
+ let resolved;
155
157
  try {
156
- agent = await getAgent(req);
158
+ resolved = await getAgent(req);
157
159
  }
158
160
  catch (err) {
159
161
  return fail(res, 400, String(err), err);
160
162
  }
163
+ const { agent, variantId } = resolved;
161
164
  return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), headersToMeta, req, res), {
162
165
  conversationId: req.callId,
163
166
  agentId: agent.name,
167
+ variantId,
164
168
  });
165
169
  });
166
170
  app.post('/on-agent-speech-done', async (req, res) => {
167
171
  logger.setGlobalId(req.callId);
168
- const agent = await getAgent(req);
172
+ const { agent, variantId } = await getAgent(req);
169
173
  return telescope.runObservation(async () => {
170
174
  await agent.onAgentSpeechDone(mapFromOpenAiMessages(req.body.messages), reqToCallInfo(req));
171
175
  }, {
172
176
  conversationId: req.callId,
173
177
  agentId: agent.name,
178
+ variantId,
174
179
  });
175
180
  });
176
181
  app.post('/latency-event', async (req, res) => {
@@ -245,7 +250,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
245
250
  const requests = [...activeRequests];
246
251
  activeRequests.clear();
247
252
  const notify = Promise.allSettled(requests.map(async (res) => {
248
- const agent = await getAgent(res.request);
253
+ const { agent } = await getAgent(res.request);
249
254
  await agent.onFatalError(reqToCallInfo(res.request), message);
250
255
  fail(res, 500, `${label}: ${message}`);
251
256
  }));
@@ -284,16 +289,9 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
284
289
  started = true;
285
290
  await prewarmDNS();
286
291
  }
287
- const agents = new Map();
292
+ const resolver = createVoiceRouteResolver({ getVoiceAgent, allocations, logger });
288
293
  function getAgent(req) {
289
- let agent = agents.get(req.agentName);
290
- if (!agent) {
291
- logger.debug('Loading agent', { agentName: req.agentName });
292
- agent = getVoiceAgent(req.agentName);
293
- agents.set(req.agentName, agent);
294
- agent.catch(() => agents.delete(req.agentName));
295
- }
296
- return agent;
294
+ return resolver.resolve(req.agentName, req.callId);
297
295
  }
298
296
  async function prewarmDNS() {
299
297
  const dnsLookup = promisify(dns.lookup);
@@ -307,7 +305,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
307
305
  }
308
306
  }
309
307
  }
310
- async function createTelescopeConversation(req) {
308
+ async function createTelescopeConversation(req, variantId) {
311
309
  const conversationId = req.callId;
312
310
  if (!conversationId) {
313
311
  logger.error('No call ID provided, cannot create Telescope conversation');
@@ -319,6 +317,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
319
317
  conversationId,
320
318
  medium: 'phone',
321
319
  agentId: req.agentName || undefined,
320
+ variantId,
322
321
  region,
323
322
  phoneNumber: phoneNumber ?? req.phoneNumber,
324
323
  createdAt: Date.now(),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@recombine-ai/platform",
3
3
  "type": "module",
4
- "version": "0.8.0-test.2",
4
+ "version": "0.8.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",