@recombine-ai/platform 0.8.0-test.2 → 0.8.1

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 (287) 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/BTw6JswM.js +1 -0
  26. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.br +0 -0
  27. package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.gz +0 -0
  28. package/build/bosun-app/frontend/client/_app/immutable/chunks/{joiJcRPz.js → BqH4VDQz.js} +1 -1
  29. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.br +0 -0
  30. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.gz +0 -0
  31. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js +1 -0
  32. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.br +0 -0
  33. package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.gz +0 -0
  34. package/build/bosun-app/frontend/client/_app/immutable/chunks/{C0rPkxmP.js → CVZT6n14.js} +1 -1
  35. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.br +0 -0
  36. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.gz +0 -0
  37. package/build/bosun-app/frontend/client/_app/immutable/chunks/{Diqx_kju.js → CXS28GEZ.js} +1 -1
  38. package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.br +1 -0
  39. package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.gz +0 -0
  40. package/build/bosun-app/frontend/client/_app/immutable/chunks/{ouMvMh56.js → CkstLsmI.js} +1 -1
  41. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.br +0 -0
  42. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.gz +0 -0
  43. package/build/bosun-app/frontend/client/_app/immutable/chunks/{C3cROXCy.js → CuwQtXBl.js} +1 -1
  44. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.br +0 -0
  45. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.gz +0 -0
  46. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BEdAvgYp.js → D9YsE4-8.js} +1 -1
  47. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.br +0 -0
  48. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.gz +0 -0
  49. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js +3 -0
  50. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.br +0 -0
  51. package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.gz +0 -0
  52. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js +1 -0
  53. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.br +0 -0
  54. package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.gz +0 -0
  55. package/build/bosun-app/frontend/client/_app/immutable/chunks/{DJnDF3d9.js → dL_jwANm.js} +1 -1
  56. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.br +0 -0
  57. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.gz +0 -0
  58. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DYrvpbQq.js → app.DaDBScXg.js} +2 -2
  59. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.br +0 -0
  60. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.gz +0 -0
  61. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js +1 -0
  62. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.br +0 -0
  63. package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.gz +0 -0
  64. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.DXIuJQso.js → 0._S0yln6w.js} +1 -1
  65. package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.br +0 -0
  66. package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.gz +0 -0
  67. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.CsX5iplT.js → 1.BSNKOkyF.js} +1 -1
  68. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.br +0 -0
  69. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.gz +0 -0
  70. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js +35 -0
  71. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.br +0 -0
  72. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.gz +0 -0
  73. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.BIO8m3DR.js → 17.Bn1yI4kt.js} +1 -1
  74. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.br +0 -0
  75. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.gz +0 -0
  76. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js +11 -0
  77. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.br +0 -0
  78. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.gz +0 -0
  79. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js +35 -0
  80. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.br +0 -0
  81. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.gz +0 -0
  82. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js +1 -0
  83. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.br +0 -0
  84. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.gz +0 -0
  85. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.BzhaMuo5.js → 4.3i9fJNn9.js} +1 -1
  86. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.br +0 -0
  87. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.gz +0 -0
  88. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.BG8ylHWg.js → 5.C2R3wdz0.js} +1 -1
  89. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.br +0 -0
  90. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.gz +0 -0
  91. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.DkDEANSN.js → 6.CarWVMPM.js} +1 -1
  92. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.br +0 -0
  93. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.gz +0 -0
  94. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.3fEbISY6.js → 8.joumIYrl.js} +1 -1
  95. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.br +0 -0
  96. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.gz +0 -0
  97. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js +2 -0
  98. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.br +0 -0
  99. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.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-ChM9druZ.js} +2 -2
  108. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-B7oaNMJQ.js.map → internal.js-ChM9druZ.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-UAHBCAaS.js} +62 -10
  122. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-UAHBCAaS.js.map +1 -0
  123. package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js → handler-KSixAuP8.js} +3 -3
  124. package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js.map → handler-KSixAuP8.js.map} +1 -1
  125. package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js → index.js-xzEg77OG.js} +2 -2
  126. package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js.map → index.js-xzEg77OG.js.map} +1 -1
  127. package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js → manifest.js-BW4X3pHs.js} +14 -14
  128. package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js.map → manifest.js-BW4X3pHs.js.map} +1 -1
  129. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js → 0.js-B1rx1DOM.js} +2 -2
  130. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js.map → 0.js-B1rx1DOM.js.map} +1 -1
  131. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js → 1.js-h7GlMehw.js} +2 -2
  132. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js.map → 1.js-h7GlMehw.js.map} +1 -1
  133. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js → 10.js-C6xRYZtL.js} +3 -3
  134. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js.map → 10.js-C6xRYZtL.js.map} +1 -1
  135. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js → 17.js-CavP10f9.js} +3 -3
  136. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js.map → 17.js-CavP10f9.js.map} +1 -1
  137. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js → 18.js-DC7Bv1j_.js} +3 -3
  138. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js.map → 18.js-DC7Bv1j_.js.map} +1 -1
  139. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js → 2.js-BhiMP7Sz.js} +3 -3
  140. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js.map → 2.js-BhiMP7Sz.js.map} +1 -1
  141. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js → 3.js-C7zctWo-.js} +3 -3
  142. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js.map → 3.js-C7zctWo-.js.map} +1 -1
  143. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js → 4.js-5G8VLxJe.js} +2 -2
  144. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js.map → 4.js-5G8VLxJe.js.map} +1 -1
  145. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js → 5.js-HO1CExm6.js} +2 -2
  146. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js.map → 5.js-HO1CExm6.js.map} +1 -1
  147. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js → 6.js-CDW8tRHL.js} +2 -2
  148. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js.map → 6.js-CDW8tRHL.js.map} +1 -1
  149. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js → 8.js-BjO10Jpo.js} +2 -2
  150. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js.map → 8.js-BjO10Jpo.js.map} +1 -1
  151. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js → 9.js-Csa_leV9.js} +3 -3
  152. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js.map → 9.js-Csa_leV9.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 +0 -1
  213. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3N9vN4_.js.br +0 -0
  214. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3N9vN4_.js.gz +0 -0
  215. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.br +0 -0
  216. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.gz +0 -0
  217. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.br +0 -0
  218. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.gz +0 -0
  219. package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js +0 -3
  220. package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js.br +0 -0
  221. package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js.gz +0 -0
  222. package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js +0 -1
  223. package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js.br +0 -0
  224. package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js.gz +0 -0
  225. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.br +0 -0
  226. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.gz +0 -0
  227. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.br +0 -0
  228. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.gz +0 -0
  229. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.br +0 -0
  230. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.gz +0 -0
  231. package/build/bosun-app/frontend/client/_app/immutable/chunks/D89azUgT.js +0 -1
  232. package/build/bosun-app/frontend/client/_app/immutable/chunks/D89azUgT.js.br +0 -0
  233. package/build/bosun-app/frontend/client/_app/immutable/chunks/D89azUgT.js.gz +0 -0
  234. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.br +0 -0
  235. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.gz +0 -0
  236. package/build/bosun-app/frontend/client/_app/immutable/chunks/Diqx_kju.js.br +0 -1
  237. package/build/bosun-app/frontend/client/_app/immutable/chunks/Diqx_kju.js.gz +0 -0
  238. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.br +0 -0
  239. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.gz +0 -0
  240. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.br +0 -0
  241. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.gz +0 -0
  242. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.br +0 -0
  243. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.gz +0 -0
  244. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DYrvpbQq.js.br +0 -0
  245. package/build/bosun-app/frontend/client/_app/immutable/entry/app.DYrvpbQq.js.gz +0 -0
  246. package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js +0 -1
  247. package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js.br +0 -0
  248. package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js.gz +0 -0
  249. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DXIuJQso.js.br +0 -0
  250. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DXIuJQso.js.gz +0 -0
  251. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CsX5iplT.js.br +0 -0
  252. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CsX5iplT.js.gz +0 -0
  253. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js +0 -35
  254. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js.br +0 -0
  255. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js.gz +0 -0
  256. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BIO8m3DR.js.br +0 -0
  257. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BIO8m3DR.js.gz +0 -0
  258. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js +0 -11
  259. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js.br +0 -0
  260. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js.gz +0 -0
  261. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js +0 -35
  262. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js.br +0 -0
  263. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js.gz +0 -0
  264. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js +0 -1
  265. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js.br +0 -0
  266. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js.gz +0 -0
  267. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BzhaMuo5.js.br +0 -0
  268. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BzhaMuo5.js.gz +0 -0
  269. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BG8ylHWg.js.br +0 -0
  270. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BG8ylHWg.js.gz +0 -0
  271. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DkDEANSN.js.br +0 -0
  272. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DkDEANSN.js.gz +0 -0
  273. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.3fEbISY6.js.br +0 -0
  274. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.3fEbISY6.js.gz +0 -0
  275. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js +0 -2
  276. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js.br +0 -0
  277. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js.gz +0 -0
  278. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-VTtwaKGp.js.map +0 -1
  279. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-D5B8gfq2.js.map +0 -1
  280. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-B2wHKJV7.js.map +0 -1
  281. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-DDcIjgZD.js.map +0 -1
  282. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-UVUg89-t.js.map +0 -1
  283. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-DiZKDT2v.js.map +0 -1
  284. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-CfkCQ2Th.js.map +0 -1
  285. package/build/call-control/voice-agent-config.d.ts +0 -155
  286. package/build/call-control/voice-agent-config.d.ts.map +0 -1
  287. 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.1",
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 +0,0 @@
1
- import{T as tt,h as fe,bx as ue}from"./CR-uVjxM.js";import{w as de}from"./DNvczHUR.js";import{H as kt,S as St,R as xt}from"./-UyI9lYi.js";import{r as ft,o as Bt,H as j,N as F,n as T,i as Rt,b as L,s as $,a as wt,f as Vt,g as vt,c as et,d as mt,S as Lt,P as Yt,p as R,e as he,m as pe,h as me,u as zt,j as ge,k as Nt,l as B,q as _e,t as Gt,v as we,w as ve,x as Wt}from"./Bwiy-Sk7.js";import"./B0XwC4Ot.js";const ye=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,be=/^\/\((?:[^)]+)\)$/;function Ee(t){const n=[];return{pattern:t==="/"||be.test(t)?/^\/$/:new RegExp(`^${Se(t).map(o=>{const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(o);if(a)return n.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(o);if(s)return n.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!o)return;const r=o.split(/\[(.+?)\](?!\])/);return"/"+r.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return gt(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return gt(String.fromCharCode(...l.slice(2).split("-").map(f=>parseInt(f,16))));const u=ye.exec(l),[,p,_,d,m]=u;return n.push({name:d,matcher:m,optional:!!p,rest:!!_,chained:_?c===1&&r[0]==="":!1}),_?"([^]*?)":p?"([^/]*)?":"([^/]+?)"}return gt(l)}).join("")}).join("")}/?$`),params:n}}function ke(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function Se(t){return t.slice(1).split("/").filter(ke)}function xe(t,n,e){const o={},a=t.slice(1),s=a.filter(i=>i!==void 0);let r=0;for(let i=0;i<n.length;i+=1){const l=n[i];let c=a[i-r];if(l.chained&&l.rest&&r&&(c=a.slice(i-r,i+1).filter(u=>u).join("/"),r=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||e[l.matcher](c)){o[l.name]=c;const u=n[i+1],p=a[i+1];u&&!u.rest&&u.optional&&p&&l.chained&&(r=0),!u&&!p&&Object.keys(o).length===s.length&&(r=0);continue}if(l.optional&&l.chained){r++;continue}return}if(!r)return o}function gt(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Re({nodes:t,server_loads:n,dictionary:e,matchers:o}){const a=new Set(n);return Object.entries(e).map(([i,[l,c,u]])=>{const{pattern:p,params:_}=Ee(i),d={id:i,exec:m=>{const f=p.exec(m);if(f)return xe(f,_,o)},errors:[1,...u||[]].map(m=>t[m]),layouts:[0,...c||[]].map(r),leaf:s(l)};return d.errors.length=d.layouts.length=Math.max(d.errors.length,d.layouts.length),d});function s(i){const l=i<0;return l&&(i=~i),[l,t[i]]}function r(i){return i===void 0?i:[a.has(i),t[i]]}}function Jt(t,n=JSON.parse){try{return n(sessionStorage[t])}catch{}}function Dt(t,n,e=JSON.stringify){const o=e(n);try{sessionStorage[t]=o}catch{}}function Le(t){return t.filter(n=>n!=null)}function Q(t,n){return t+"/"+n}function Pt(t){return t instanceof kt||t instanceof St?t.status:500}function Pe(t){return t instanceof St?t.text:"Internal Error"}const qt={spanContext(){return Ae},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},Ae={traceId:"",spanId:"",traceFlags:0},Ue=fe??(t=>t()),Te=new Set(["icon","shortcut icon","apple-touch-icon"]);let V=null;const C=Jt(Wt)??{},G=Jt(Gt)??{},I={url:Nt({}),page:Nt({}),navigating:de(null),updated:ge()};function At(t){C[t]=$()}function Ie(t,n){let e=t+1;for(;C[e];)delete C[e],e+=1;for(e=n+1;G[e];)delete G[e],e+=1}function W(t,n=!1){return n?location.replace(t.href):location.href=t.href,new Promise(T)}async function Xt(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}let Ut,yt,nt,P,bt,b;const at=[],rt=[];let v=null;function ot(){var t;(t=v==null?void 0:v.fork)==null||t.then(n=>n==null?void 0:n.discard()),v=null,D={element:void 0,href:void 0}}const Z=new Map,Qt=new Set,Ce=new Set,z=new Set;let w={branch:[],error:null,url:null},Zt=!1,it=!1,Ft=!0,J=!1,Y=!1,te=!1,Tt=!1,It,E,x,U;const st=new Set,Ht=new Map,Kt=new Map;async function tn(t,n,e){var s,r,i,l;if(globalThis.__sveltekit_1vdanf5.data){const{q:c={},p:u={},l:p={},f:_={}}=globalThis.__sveltekit_1vdanf5.data;for(const d in c)c[d];for(const d in p)p[d];for(const d in _)_[d];for(const d in u)u[d]}document.URL!==location.href&&(location.href=location.href),b=t,await((r=(s=t.hooks).init)==null?void 0:r.call(s)),Ut=Re(t),P=document.documentElement,bt=n,yt=t.nodes[0],nt=t.nodes[1],yt(),nt(),E=(i=history.state)==null?void 0:i[j],x=(l=history.state)==null?void 0:l[F],E||(E=x=Date.now(),history.replaceState({...history.state,[j]:E,[F]:x},""));const o=C[E];function a(){o&&(history.scrollRestoration="manual",scrollTo(o.x,o.y))}e?(a(),await Ve(bt,e)):(await q({type:"enter",url:ft(b.hash?Ge(new URL(location.href)):location.href),replace_state:!0}),a()),Be()}function Oe(){at.length=0,Tt=!1}function ee(t){rt.some(n=>n==null?void 0:n.snapshot)&&(G[t]=rt.map(n=>{var e;return(e=n==null?void 0:n.snapshot)==null?void 0:e.capture()}))}function ne(t){var n;(n=G[t])==null||n.forEach((e,o)=>{var a,s;(s=(a=rt[o])==null?void 0:a.snapshot)==null||s.restore(e)})}function Mt(){At(E),Dt(Wt,C),ee(x),Dt(Gt,G)}async function ae(t,n,e,o){let a,s;n.invalidateAll&&ot(),await q({type:"goto",url:ft(t),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:e,nav_token:o,accept:()=>{var r;if(n.invalidateAll){Tt=!0,a=new Set;for(const[i,l]of Ht)for(const[c,u]of l)(r=u.resource)==null||r.reset(),a.add(Q(i,c));s=new Set;for(const[i,l]of Kt)for(const c of l.keys())s.add(Q(i,c))}n.invalidate&&n.invalidate.forEach(Me)}}),n.invalidateAll&&tt().then(tt).then(()=>{for(const[r,i]of Ht)for(const[l,{resource:c}]of i)a!=null&&a.has(Q(r,l))&&c.start();for(const[r,i]of Kt)for(const[l,{resource:c}]of i)s!=null&&s.has(Q(r,l))&&c.reconnect()})}async function je(t){if(t.id!==(v==null?void 0:v.id)){ot();const n={};st.add(n),v={id:t.id,token:n,promise:ie({...t,preload:n}).then(e=>(st.delete(n),e.type==="loaded"&&e.state.error&&ot(),e)),fork:null}}return v.promise}async function _t(t){var e;const n=(e=await ut(t,!1))==null?void 0:e.route;n&&await Promise.all([...n.layouts,n.leaf].filter(Boolean).map(o=>o[1]()))}async function re(t,n,e){var a;const o={params:w.params,route:{id:((a=w.route)==null?void 0:a.id)??null},url:new URL(location.href)};if(w={...t.state,nav:o},zt(t.props.page),It=new b.root({target:n,props:{...t.props,stores:I,components:rt},hydrate:e,sync:!1,transformError:void 0}),await Promise.resolve(),e){const s={from:null,to:{...o,scroll:C[E]??$()},willUnload:!1,type:"enter",complete:Promise.resolve()};z.forEach(r=>r(s))}ne(x),it=!0}async function lt({url:t,params:n,branch:e,errors:o,status:a,error:s,route:r,form:i}){let l="never";if(L&&(t.pathname===L||t.pathname===L+"/"))l="always";else for(const m of e)(m==null?void 0:m.slash)!==void 0&&(l=m.slash);t.pathname=me(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:n,branch:e,error:s,route:r},props:{constructors:Le(e).map(m=>m.node.component),page:dt(R)}};i!==void 0&&(c.props.form=i);let u={},p=!R,_=0;for(let m=0;m<Math.max(e.length,w.branch.length);m+=1){const f=e[m],h=w.branch[m];(f==null?void 0:f.data)!==(h==null?void 0:h.data)&&(p=!0),f&&(u={...u,...f.data},p&&(c.props[`data_${_}`]=u),_+=1)}return(!w.url||t.href!==w.url.href||w.error!==s||i!==void 0&&i!==R.form||p)&&(c.props.page={error:s,params:n,route:{id:(r==null?void 0:r.id)??null},state:{},status:a,url:new URL(t),form:i??null,data:p?u:R.data}),c}async function Ct({loader:t,parent:n,url:e,params:o,route:a,server_data_node:s}){var u,p,_;let r=null,i=!0;const l={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},c=await t();if((u=c.universal)!=null&&u.load){let d=function(...f){for(const h of f){const{href:g}=new URL(h,e);l.dependencies.add(g)}};const m={tracing:{enabled:!1,root:qt,current:qt},route:new Proxy(a,{get:(f,h)=>(i&&(l.route=!0),f[h])}),params:new Proxy(o,{get:(f,h)=>(i&&l.params.add(h),f[h])}),data:(s==null?void 0:s.data)??null,url:pe(e,()=>{i&&(l.url=!0)},f=>{i&&l.search_params.add(f)},b.hash),async fetch(f,h){f instanceof Request&&(h={body:f.method==="GET"||f.method==="HEAD"?void 0:await f.blob(),cache:f.cache,credentials:f.credentials,headers:[...f.headers].length>0?f==null?void 0:f.headers:void 0,integrity:f.integrity,keepalive:f.keepalive,method:f.method,mode:f.mode,redirect:f.redirect,referrer:f.referrer,referrerPolicy:f.referrerPolicy,signal:f.signal,...h});const{resolved:g,promise:y}=oe(f,h,e);return i&&d(g.href),y},setHeaders:T,depends:d,parent(){return i&&(l.parent=!0),n()},untrack(f){i=!1;try{return f()}finally{i=!0}}};r=await c.universal.load.call(null,m)??null}return{node:c,loader:t,server:s,universal:(p=c.universal)!=null&&p.load?{type:"data",data:r,uses:l}:null,data:r??(s==null?void 0:s.data)??null,slash:((_=c.universal)==null?void 0:_.trailingSlash)??(s==null?void 0:s.slash)}}function oe(t,n,e){let o=t instanceof Request?t.url:t;const a=new URL(o,e);a.origin===e.origin&&(o=a.href.slice(e.origin.length));const s=it?we(o,a.href,n):ve(o,n);return{resolved:a,promise:s}}function $e(t,n,e,o,a,s){if(Tt)return!0;if(!a)return!1;if(a.parent&&t||a.route&&n||a.url&&e)return!0;for(const r of a.search_params)if(o.has(r))return!0;for(const r of a.params)if(s[r]!==w.params[r])return!0;for(const r of a.dependencies)if(at.some(i=>i(new URL(r))))return!0;return!1}function Ot(t,n){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?n??null:null}function Ne(t,n){if(!t)return new Set(n.searchParams.keys());const e=new Set([...t.searchParams.keys(),...n.searchParams.keys()]);for(const o of e){const a=t.searchParams.getAll(o),s=n.searchParams.getAll(o);a.every(r=>s.includes(r))&&s.every(r=>a.includes(r))&&e.delete(o)}return e}function De({error:t,url:n,route:e,params:o}){return{type:"loaded",state:{error:t,url:n,route:e,params:o,branch:[]},props:{page:dt(R),constructors:[]}}}async function ie({id:t,invalidating:n,url:e,params:o,route:a,preload:s}){if((v==null?void 0:v.id)===t)return st.delete(v.token),v.promise;const{errors:r,layouts:i,leaf:l}=a,c=[...i,l];r.forEach(h=>h==null?void 0:h().catch(T)),c.forEach(h=>h==null?void 0:h[1]().catch(T));const u=w.url?t!==ct(w.url):!1,p=w.route?a.id!==w.route.id:!1,_=Ne(w.url,e);let d=!1;const m=c.map(async(h,g)=>{var A;if(!h)return;const y=w.branch[g];return h[1]===(y==null?void 0:y.loader)&&!$e(d,p,u,_,(A=y.universal)==null?void 0:A.uses,o)?y:(d=!0,Ct({loader:h[1],url:e,params:o,route:a,parent:async()=>{var X;const O={};for(let N=0;N<g;N+=1)Object.assign(O,(X=await m[N])==null?void 0:X.data);return O},server_data_node:Ot(h[0]?{type:"skip"}:null,h[0]?y==null?void 0:y.server:void 0)}))});for(const h of m)h.catch(T);const f=[];for(let h=0;h<c.length;h+=1)if(c[h])try{f.push(await m[h])}catch(g){if(g instanceof xt)return{type:"redirect",location:g.location};if(s&&st.has(s))return De({error:await H(g,{params:o,url:e,route:{id:a.id}}),url:e,params:o,route:a});let y=Pt(g),S;if(g instanceof kt)S=g.body;else{if(await I.updated.check())return await Xt(),await W(e);S=await H(g,{params:o,url:e,route:{id:a.id}})}const A=await qe(h,f,r);return A?lt({url:e,params:o,branch:f.slice(0,A.idx).concat(A.node),errors:r,status:y,error:S,route:a}):await le(e,{id:a.id},S,y)}else f.push(void 0);return lt({url:e,params:o,branch:f,errors:r,status:200,error:null,route:a,form:n?void 0:null})}async function qe(t,n,e){for(;t--;)if(e[t]){let o=t;for(;!n[o];)o-=1;try{return{idx:o+1,node:{node:await e[t](),loader:e[t],data:{},server:null,universal:null}}}catch{continue}}}async function jt({status:t,error:n,url:e,route:o}){const a={};let s=null;try{const r=await Ct({loader:yt,url:e,params:a,route:o,parent:()=>Promise.resolve({}),server_data_node:Ot(s)}),i={node:await nt(),loader:nt,universal:null,server:null,data:null};return lt({url:e,params:a,branch:[r,i],status:t,error:n,errors:[],route:null})}catch(r){if(r instanceof xt){await ae(new URL(r.location,location.href),{},0);return}const i=await b.get_error_template(),l=await H(r,{url:e,params:a,route:o}),c=String((l==null?void 0:l.message)??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),u=i({status:t,message:c}),p=new DOMParser().parseFromString(u,"text/html");throw document.documentElement.replaceChild(document.adoptNode(p.head),document.head),document.documentElement.replaceChild(document.adoptNode(p.body),document.body),r}}async function Fe(t){const n=t.href;if(Z.has(n))return Z.get(n);let e;try{const o=(async()=>{let a=await b.hooks.reroute({url:new URL(t),fetch:async(s,r)=>oe(s,r,t).promise})??t;if(typeof a=="string"){const s=new URL(t);b.hash?s.hash=a:s.pathname=a,a=s}return a})();Z.set(n,o),e=await o}catch{Z.delete(n);return}return e}async function ut(t,n){if(t&&!Rt(t,L,b.hash)){const e=await Fe(t);if(!e)return;const o=He(e);for(const a of Ut){const s=a.exec(o);if(s)return{id:ct(t),invalidating:n,route:a,params:he(s),url:t}}}}function He(t){return _e(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function ct(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function se({url:t,type:n,intent:e,delta:o,event:a,scroll:s}){let r=!1;const i=$t(w,e,t,n,s??null);o!==void 0&&(i.navigation.delta=o),a!==void 0&&(i.navigation.event=a);const l={...i.navigation,cancel:()=>{r=!0,i.reject(new Error("navigation cancelled"))}};return J||Qt.forEach(c=>c(l)),r?null:i}async function q({type:t,url:n,popped:e,keepfocus:o,noscroll:a,replace_state:s,state:r={},redirect_count:i=0,nav_token:l={},accept:c=T,block:u=T,event:p}){var N;const _=U;U=l;const d=await ut(n,!1),m=t==="enter"?$t(w,d,n,t):se({url:n,type:t,delta:e==null?void 0:e.delta,intent:d,scroll:e==null?void 0:e.scroll,event:p});if(!m){u(),U===l&&(U=_);return}const f=E,h=x;c(),J=!0,it&&m.navigation.type!=="enter"&&I.navigating.set(wt.current=m.navigation);let g=d&&await ie(d);if(!g){if(Rt(n,L,b.hash))return await W(n,s);g=await le(n,{id:null},await H(new St(404,"Not Found",`Not found: ${n.pathname}`),{url:n,params:{},route:{id:null}}),404,s)}if(n=(d==null?void 0:d.url)||n,U!==l){m.reject(new Error("navigation aborted"));return}if(!g)return;if(g.type==="redirect"){if(i<20){await q({type:t,url:new URL(g.location,n),popped:e,keepfocus:o,noscroll:a,replace_state:s,state:r,redirect_count:i+1,nav_token:l}),m.fulfil(void 0);return}if(g=await jt({status:500,error:await H(new Error("Redirect loop"),{url:n,params:{},route:{id:null}}),url:n,route:{id:null}}),!g)return}else if(g.props.page.status>=400&&await I.updated.check())return await Xt(),await W(n,s);if(Oe(),At(f),ee(h),g.props.page.url.pathname!==n.pathname&&(n.pathname=g.props.page.url.pathname),r=e?e.state:r,!e){const k=s?0:1,K={[j]:E+=k,[F]:x+=k,[Lt]:r};(s?history.replaceState:history.pushState).call(history,K,"",n),s||Ie(E,x)}const y=d&&(v==null?void 0:v.id)===d.id?v.fork:null;v!=null&&v.fork&&!y?ot():(v=null,D={element:void 0,href:void 0}),g.props.page.state=r;let S;if(it){const k=(await Promise.all(Array.from(Ce,M=>M(m.navigation)))).filter(M=>typeof M=="function");if(k.length>0){let M=function(){k.forEach(pt=>{z.delete(pt)})};k.push(M),k.forEach(pt=>{z.add(pt)})}const K=m.navigation.to;w={...g.state,nav:{params:K.params,route:K.route,url:K.url}},g.props.page&&(g.props.page.url=n),!o&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();const ht=y&&await y;ht?S=ht.commit():(V=null,It.$set(g.props),V&&Object.assign(g.props.page,V),zt(g.props.page),S=(N=ue)==null?void 0:N()),te=!0}else await re(g,bt,!1);const{activeElement:A}=document;if(await S,await tt(),await tt(),U!==l){m.reject(new Error("navigation aborted"));return}g.props.page&&V&&Object.assign(g.props.page,V);let O=null;if(Ft){const k=e?e.scroll:a?$():null;k?scrollTo(k.x,k.y):(O=n.hash&&document.getElementById(ce(n)))?O.scrollIntoView():scrollTo(0,0)}const X=document.activeElement!==A&&document.activeElement!==document.body;!o&&!X&&ze(n,!O),Ft=!0,J=!1,m.fulfil(void 0),m.navigation.to&&(m.navigation.to.scroll=$()),z.forEach(k=>k(m.navigation)),t==="popstate"&&ne(x),I.navigating.set(wt.current=null)}async function le(t,n,e,o,a){return t.origin===Bt&&t.pathname===location.pathname&&!Zt?await jt({status:o,error:e,url:t,route:n}):await W(t,a)}let D={element:void 0,href:void 0};function Ke(){let t,n;P.addEventListener("mousemove",r=>{const i=r.target;clearTimeout(t),t=setTimeout(()=>{a(i,B.hover)},20)});function e(r){r.defaultPrevented||a(r.composedPath()[0],B.tap)}P.addEventListener("mousedown",e),P.addEventListener("touchstart",e,{passive:!0});const o=new IntersectionObserver(r=>{for(const i of r)i.isIntersecting&&(_t(new URL(i.target.href)),o.unobserve(i.target))},{threshold:0});async function a(r,i){const l=Vt(r,P),c=l===D.element&&(l==null?void 0:l.href)===D.href&&i>=n;if(!l||c)return;const{url:u,external:p,download:_}=vt(l,L,b.hash);if(p||_)return;const d=et(l),m=u&&ct(w.url)===ct(u);if(!(d.reload||m))if(i<=d.preload_data){D={element:l,href:l.href},n=B.tap;const f=await ut(u,!1);if(!f)return;je(f)}else i<=d.preload_code&&(D={element:l,href:l.href},n=i,_t(u))}function s(){o.disconnect();for(const r of P.querySelectorAll("a")){const{url:i,external:l,download:c}=vt(r,L,b.hash);if(l||c)continue;const u=et(r);u.reload||(u.preload_code===B.viewport&&o.observe(r),u.preload_code===B.eager&&_t(i))}}z.add(s),s()}function H(t,n){if(t instanceof kt)return t.body;const e=Pt(t),o=Pe(t);return b.hooks.handleError({error:t,event:n,status:e,message:o})??{message:o}}function en(t,n={}){return t=new URL(ft(t)),t.origin!==Bt?Promise.reject(new Error("goto: invalid URL")):ae(t,n,0)}function Me(t){if(typeof t=="function")at.push(t);else{const{href:n}=new URL(t,location.href);at.push(e=>e.href===n)}}function nn(t,n){const e={[j]:E,[F]:x,[Yt]:R.url.href,[Lt]:n};history.replaceState(e,"",ft(t)),R.state=n,It.$set({page:Ue(()=>dt(R))})}function Be(){var n;history.scrollRestoration="manual",addEventListener("beforeunload",e=>{let o=!1;if(Mt(),!J){const a=$t(w,void 0,null,"leave"),s={...a.navigation,cancel:()=>{o=!0,a.reject(new Error("navigation cancelled"))}};Qt.forEach(r=>r(s))}o?(e.preventDefault(),e.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Mt()}),(n=navigator.connection)!=null&&n.saveData||Ke(),P.addEventListener("click",async e=>{if(e.button||e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.defaultPrevented)return;const o=Vt(e.composedPath()[0],P);if(!o)return;const{url:a,external:s,target:r,download:i}=vt(o,L,b.hash);if(!a)return;if(r==="_parent"||r==="_top"){if(window.parent!==window)return}else if(r&&r!=="_self")return;const l=et(o);if(!(o instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||i)return;const[u,p]=(b.hash?a.hash.replace(/^#/,""):a.href).split("#"),_=u===mt(location);if(s||l.reload&&(!_||!p)){se({url:a,type:"link",event:e})?J=!0:e.preventDefault();return}if(p!==void 0&&_){const[,d]=w.url.href.split("#");if(d===p){if(e.preventDefault(),p===""||p==="top"&&o.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const m=o.ownerDocument.getElementById(decodeURIComponent(p));m&&(m.scrollIntoView(),m.focus())}return}if(Y=!0,At(E),t(a),!l.replace_state)return;Y=!1}e.preventDefault(),await new Promise(d=>{requestAnimationFrame(()=>{setTimeout(d,0)}),setTimeout(d,100)}),await q({type:"link",url:a,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??a.href===location.href,event:e})}),P.addEventListener("submit",e=>{if(e.defaultPrevented)return;const o=HTMLFormElement.prototype.cloneNode.call(e.target),a=e.submitter;if(((a==null?void 0:a.formTarget)||o.target)==="_blank"||((a==null?void 0:a.formMethod)||o.method)!=="get")return;const i=new URL((a==null?void 0:a.hasAttribute("formaction"))&&(a==null?void 0:a.formAction)||o.action);if(Rt(i,L,!1))return;const l=e.target,c=et(l);if(c.reload)return;e.preventDefault(),e.stopPropagation();const u=new FormData(l,a);i.search=new URLSearchParams(u).toString(),q({type:"form",url:i,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??i.href===location.href,event:e})}),addEventListener("popstate",async e=>{var o;if(!Et){if((o=e.state)!=null&&o[j]){const a=e.state[j];if(U={},a===E)return;const s=C[a],r=e.state[Lt]??{},i=new URL(e.state[Yt]??location.href),l=e.state[F],c=w.url?mt(location)===mt(w.url):!1;if(l===x&&(te||c)){r!==R.state&&(R.state=r),t(i),C[E]=$(),s&&scrollTo(s.x,s.y),E=a;return}const p=a-E;await q({type:"popstate",url:i,popped:{state:r,scroll:s,delta:p},accept:()=>{E=a,x=l},block:()=>{history.go(-p)},nav_token:U,event:e})}else if(!Y){const a=new URL(location.href);t(a),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[j]:++E,[F]:x},"",location.href))});for(const e of document.querySelectorAll("link"))Te.has(e.rel)&&(e.href=e.href);addEventListener("pageshow",e=>{e.persisted&&I.navigating.set(wt.current=null)});function t(e){w.url=R.url=e,I.page.set(dt(R)),I.page.notify()}}async function Ve(t,{status:n=200,error:e,node_ids:o,params:a,route:s,server_route:r,data:i,form:l}){Zt=!0;const c=new URL(location.href);let u;({params:a={},route:s={id:null}}=await ut(c,!1)||{}),u=Ut.find(({id:d})=>d===s.id);let p,_=!0;try{const d=o.map(async(f,h)=>{const g=i[h];return g!=null&&g.uses&&(g.uses=Ye(g.uses)),Ct({loader:b.nodes[f],url:c,params:a,route:s,parent:async()=>{const y={};for(let S=0;S<h;S+=1)Object.assign(y,(await d[S]).data);return y},server_data_node:Ot(g)})}),m=await Promise.all(d);if(u){const f=u.layouts;for(let h=0;h<f.length;h++)f[h]||m.splice(h,0,void 0)}p=await lt({url:c,params:a,branch:m,status:n,error:e,errors:u==null?void 0:u.errors,form:l,route:u??null})}catch(d){if(d instanceof xt)return await W(new URL(d.location,location.href));p=await jt({status:Pt(d),error:await H(d,{url:c,params:a,route:s}),url:c,route:s}),t.textContent="",_=!1}p&&(p.props.page&&(p.props.page.state={}),await re(p,t,_))}function Ye(t){return{dependencies:new Set((t==null?void 0:t.dependencies)??[]),params:new Set((t==null?void 0:t.params)??[]),parent:!!(t!=null&&t.parent),route:!!(t!=null&&t.route),url:!!(t!=null&&t.url),search_params:new Set((t==null?void 0:t.search_params)??[])}}let Et=!1;function ze(t,n=!0){const e=document.querySelector("[autofocus]");if(e)e.focus();else{const o=ce(t);if(o&&document.getElementById(o)){const{x:s,y:r}=$();setTimeout(()=>{const i=history.state;Et=!0,location.replace(new URL(`#${o}`,location.href)),history.replaceState(i,"",t),n&&scrollTo(s,r),Et=!1})}else{const s=document.body,r=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),r!==null?s.setAttribute("tabindex",r):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let r=0;r<a.rangeCount;r+=1)s.push(a.getRangeAt(r));setTimeout(()=>{if(a.rangeCount===s.length){for(let r=0;r<a.rangeCount;r+=1){const i=s[r],l=a.getRangeAt(r);if(i.commonAncestorContainer!==l.commonAncestorContainer||i.startContainer!==l.startContainer||i.endContainer!==l.endContainer||i.startOffset!==l.startOffset||i.endOffset!==l.endOffset)return}a.removeAllRanges()}})}}}function $t(t,n,e,o,a=null){var c,u;let s,r;const i=new Promise((p,_)=>{s=p,r=_});return i.catch(T),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:$()},to:e&&{params:(n==null?void 0:n.params)??null,route:{id:((u=n==null?void 0:n.route)==null?void 0:u.id)??null},url:e,scroll:a},willUnload:!n,type:o,complete:i},fulfil:s,reject:r}}function dt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function Ge(t){const n=new URL(t);return n.hash=decodeURIComponent(t.hash),n}function ce(t){let n;if(b.hash){const[,,e]=t.hash.split("#",3);n=e??""}else n=t.hash.slice(1);return decodeURIComponent(n)}export{tn as a,en as g,nn as r,I as s};