@recombine-ai/platform 0.8.0-test.1 → 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 (504) 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 +6 -4
  5. package/build/agent/index.d.ts.map +1 -1
  6. package/build/agent/index.js +3 -2
  7. package/build/agent/text-agent.d.ts +2 -2
  8. package/build/agent/text-agent.d.ts.map +1 -1
  9. package/build/agent/text-agent.js +2 -2
  10. package/build/agent/voice-agent.d.ts +2 -2
  11. package/build/agent/voice-agent.d.ts.map +1 -1
  12. package/build/agent/voice-agent.js +2 -2
  13. package/build/bosun/index.d.ts +11 -10
  14. package/build/bosun/index.d.ts.map +1 -1
  15. package/build/bosun/index.js +7 -7
  16. package/build/bosun/interfaces/agent.d.ts +6 -5
  17. package/build/bosun/interfaces/agent.d.ts.map +1 -1
  18. package/build/bosun/interfaces/project.d.ts +25 -0
  19. package/build/bosun/interfaces/project.d.ts.map +1 -0
  20. package/build/bosun/interfaces/project.js +1 -0
  21. package/build/bosun/mock.d.ts +1 -1
  22. package/build/bosun/mock.d.ts.map +1 -1
  23. package/build/bosun/std-mocks/call-control.d.ts +2 -2
  24. package/build/bosun/std-mocks/call-control.d.ts.map +1 -1
  25. package/build/bosun/std-mocks/platform.d.ts +2 -2
  26. package/build/bosun/std-mocks/platform.d.ts.map +1 -1
  27. package/build/bosun/std-mocks/platform.js +6 -6
  28. package/build/bosun/test-agent.d.ts +2 -2
  29. package/build/bosun/test-agent.d.ts.map +1 -1
  30. package/build/bosun/test-agent.js +1 -1
  31. package/build/bosun/test-step-registry.d.ts +1 -1
  32. package/build/bosun/test-step-registry.d.ts.map +1 -1
  33. package/build/bosun-app/backend/server.js +252 -60
  34. package/build/bosun-app/backend/server.js.map +2 -2
  35. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CR5IRTqC.js → AmpxVxY6.js} +1 -1
  36. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.br +0 -0
  37. package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.gz +0 -0
  38. package/build/bosun-app/frontend/client/_app/immutable/chunks/{DjDpMqch.js → B-5g3xS8.js} +20 -20
  39. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.br +0 -0
  40. package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.gz +0 -0
  41. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BBk8_Xpk.js → B1MxGo6p.js} +1 -1
  42. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.br +0 -0
  43. package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.gz +0 -0
  44. package/build/bosun-app/frontend/client/_app/immutable/chunks/{joiJcRPz.js → BqH4VDQz.js} +1 -1
  45. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.br +0 -0
  46. package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.gz +0 -0
  47. package/build/bosun-app/frontend/client/_app/immutable/chunks/{B3KppP__.js → CQvDMTjY.js} +1 -1
  48. package/build/bosun-app/frontend/client/_app/immutable/chunks/CQvDMTjY.js.br +0 -0
  49. package/build/bosun-app/frontend/client/_app/immutable/chunks/CQvDMTjY.js.gz +0 -0
  50. package/build/bosun-app/frontend/client/_app/immutable/chunks/{C0rPkxmP.js → CVZT6n14.js} +1 -1
  51. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.br +0 -0
  52. package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.gz +0 -0
  53. package/build/bosun-app/frontend/client/_app/immutable/chunks/{Csk7d6BP.js → CWPN78Jk.js} +1 -1
  54. package/build/bosun-app/frontend/client/_app/immutable/chunks/CWPN78Jk.js.br +0 -0
  55. package/build/bosun-app/frontend/client/_app/immutable/chunks/CWPN78Jk.js.gz +0 -0
  56. package/build/bosun-app/frontend/client/_app/immutable/chunks/{ouMvMh56.js → CkstLsmI.js} +1 -1
  57. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.br +0 -0
  58. package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.gz +0 -0
  59. package/build/bosun-app/frontend/client/_app/immutable/chunks/{C3cROXCy.js → CuwQtXBl.js} +1 -1
  60. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.br +0 -0
  61. package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.gz +0 -0
  62. package/build/bosun-app/frontend/client/_app/immutable/chunks/{BEdAvgYp.js → D9YsE4-8.js} +1 -1
  63. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.br +0 -0
  64. package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.gz +0 -0
  65. package/build/bosun-app/frontend/client/_app/immutable/chunks/{CFHTd1Rp.js → DK7_9Rr4.js} +1 -1
  66. package/build/bosun-app/frontend/client/_app/immutable/chunks/DK7_9Rr4.js.br +3 -0
  67. package/build/bosun-app/frontend/client/_app/immutable/chunks/DK7_9Rr4.js.gz +0 -0
  68. package/build/bosun-app/frontend/client/_app/immutable/chunks/{g-PBecQM.js → O3fJLrRA.js} +1 -1
  69. package/build/bosun-app/frontend/client/_app/immutable/chunks/O3fJLrRA.js.br +0 -0
  70. package/build/bosun-app/frontend/client/_app/immutable/chunks/O3fJLrRA.js.gz +0 -0
  71. package/build/bosun-app/frontend/client/_app/immutable/chunks/{DJnDF3d9.js → dL_jwANm.js} +1 -1
  72. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.br +0 -0
  73. package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.gz +0 -0
  74. package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js +3 -0
  75. package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js.br +0 -0
  76. package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js.gz +0 -0
  77. package/build/bosun-app/frontend/client/_app/immutable/entry/{app.Trw4ULuE.js → app.Bq7QRKSZ.js} +2 -2
  78. package/build/bosun-app/frontend/client/_app/immutable/entry/app.Bq7QRKSZ.js.br +0 -0
  79. package/build/bosun-app/frontend/client/_app/immutable/entry/app.Bq7QRKSZ.js.gz +0 -0
  80. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js +1 -0
  81. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js.br +0 -0
  82. package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js.gz +0 -0
  83. package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.D_60dBJ-.js → 0.CIBqOQKB.js} +1 -1
  84. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CIBqOQKB.js.br +0 -0
  85. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CIBqOQKB.js.gz +0 -0
  86. package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.Cb20jEGe.js → 1.Dv78wD0F.js} +1 -1
  87. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Dv78wD0F.js.br +0 -0
  88. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Dv78wD0F.js.gz +0 -0
  89. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js +35 -0
  90. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js.br +0 -0
  91. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js.gz +0 -0
  92. package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.Dn5eKe2Q.js → 17.DmVfus5a.js} +1 -1
  93. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DmVfus5a.js.br +0 -0
  94. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DmVfus5a.js.gz +0 -0
  95. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js +11 -0
  96. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js.br +0 -0
  97. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js.gz +0 -0
  98. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js +35 -0
  99. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js.br +0 -0
  100. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js.gz +0 -0
  101. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js +1 -0
  102. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js.br +0 -0
  103. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js.gz +0 -0
  104. package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.BhBj3Qad.js → 4.DKTRRObl.js} +1 -1
  105. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.DKTRRObl.js.br +0 -0
  106. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.DKTRRObl.js.gz +0 -0
  107. package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.CMK8bzwn.js → 5.D9SClLPX.js} +1 -1
  108. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D9SClLPX.js.br +0 -0
  109. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D9SClLPX.js.gz +0 -0
  110. package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.crW0u6fy.js → 6.DdAs7BvU.js} +1 -1
  111. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DdAs7BvU.js.br +0 -0
  112. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DdAs7BvU.js.gz +0 -0
  113. package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.CxQxpCTc.js → 8.DNEyJy0a.js} +1 -1
  114. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DNEyJy0a.js.br +0 -0
  115. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DNEyJy0a.js.gz +0 -0
  116. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js +2 -0
  117. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js.br +0 -0
  118. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js.gz +0 -0
  119. package/build/bosun-app/frontend/client/_app/version.json +1 -1
  120. package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
  121. package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
  122. package/build/bosun-app/frontend/handler.js +4 -4
  123. package/build/bosun-app/frontend/index.js +4 -4
  124. package/build/bosun-app/frontend/server/chunks/chunks/{ChatStepTrace.js-VTtwaKGp.js → ChatStepTrace.js-BY0y3Vbb.js} +3 -1
  125. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-BY0y3Vbb.js.map +1 -0
  126. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-BTDNvJ-c.js → internal.js-CTNBeiir.js} +2 -2
  127. package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-BTDNvJ-c.js.map → internal.js-CTNBeiir.js.map} +1 -1
  128. package/build/bosun-app/frontend/server/chunks/chunks/{source-selection.js-D5B8gfq2.js → source-selection.js-DFpObbhz.js} +3 -1
  129. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-DFpObbhz.js.map +1 -0
  130. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/{_layout.svelte.js-B2wHKJV7.js → _layout.svelte.js-b9Q5TFEZ.js} +134 -24
  131. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-b9Q5TFEZ.js.map +1 -0
  132. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/{_page.svelte.js-DDcIjgZD.js → _page.svelte.js-Chv8ybaj.js} +10 -4
  133. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-Chv8ybaj.js.map +1 -0
  134. 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
  135. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-Dkst1C_3.js.map +1 -0
  136. 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
  137. 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
  138. 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
  139. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-Bxdn8vG5.js.map +1 -0
  140. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/{_layout.svelte.js-CfkCQ2Th.js → _layout.svelte.js-DhdYiNVL.js} +61 -9
  141. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-DhdYiNVL.js.map +1 -0
  142. package/build/bosun-app/frontend/server/chunks/{handler-BXPSqa_7.js → handler-kZm9DU-v.js} +3 -3
  143. package/build/bosun-app/frontend/server/chunks/{handler-BXPSqa_7.js.map → handler-kZm9DU-v.js.map} +1 -1
  144. package/build/bosun-app/frontend/server/chunks/{index.js-BZbRqClk.js → index.js-BYV_PeV-.js} +2 -2
  145. package/build/bosun-app/frontend/server/chunks/{index.js-BZbRqClk.js.map → index.js-BYV_PeV-.js.map} +1 -1
  146. package/build/bosun-app/frontend/server/chunks/{manifest.js-p3UnZHmy.js → manifest.js-DknJwtFc.js} +14 -14
  147. package/build/bosun-app/frontend/server/chunks/{manifest.js-p3UnZHmy.js.map → manifest.js-DknJwtFc.js.map} +1 -1
  148. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-BQwWqY6O.js → 0.js-B947oA7Q.js} +2 -2
  149. package/build/bosun-app/frontend/server/chunks/nodes/{0.js-BQwWqY6O.js.map → 0.js-B947oA7Q.js.map} +1 -1
  150. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-DWMXqkHn.js → 1.js-D-bO8SBw.js} +2 -2
  151. package/build/bosun-app/frontend/server/chunks/nodes/{1.js-DWMXqkHn.js.map → 1.js-D-bO8SBw.js.map} +1 -1
  152. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-CB3GNMkF.js → 10.js-BPINRsAS.js} +3 -3
  153. package/build/bosun-app/frontend/server/chunks/nodes/{10.js-CB3GNMkF.js.map → 10.js-BPINRsAS.js.map} +1 -1
  154. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-DPvcLgLR.js → 17.js-BvBqWcLx.js} +3 -3
  155. package/build/bosun-app/frontend/server/chunks/nodes/{17.js-DPvcLgLR.js.map → 17.js-BvBqWcLx.js.map} +1 -1
  156. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-B_lhm3O6.js → 18.js-BEfVGplP.js} +3 -3
  157. package/build/bosun-app/frontend/server/chunks/nodes/{18.js-B_lhm3O6.js.map → 18.js-BEfVGplP.js.map} +1 -1
  158. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-Jm4bxpsW.js → 2.js-XaMsKwVG.js} +3 -3
  159. package/build/bosun-app/frontend/server/chunks/nodes/{2.js-Jm4bxpsW.js.map → 2.js-XaMsKwVG.js.map} +1 -1
  160. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-DQMKjGbU.js → 3.js-9Rmo9ovG.js} +3 -3
  161. package/build/bosun-app/frontend/server/chunks/nodes/{3.js-DQMKjGbU.js.map → 3.js-9Rmo9ovG.js.map} +1 -1
  162. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-BKjbVr3z.js → 4.js-DHzNp2kw.js} +2 -2
  163. package/build/bosun-app/frontend/server/chunks/nodes/{4.js-BKjbVr3z.js.map → 4.js-DHzNp2kw.js.map} +1 -1
  164. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-zoBBtYRJ.js → 5.js-BtTetd8U.js} +2 -2
  165. package/build/bosun-app/frontend/server/chunks/nodes/{5.js-zoBBtYRJ.js.map → 5.js-BtTetd8U.js.map} +1 -1
  166. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-x3TWBh2g.js → 6.js-dyYItn4O.js} +2 -2
  167. package/build/bosun-app/frontend/server/chunks/nodes/{6.js-x3TWBh2g.js.map → 6.js-dyYItn4O.js.map} +1 -1
  168. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-lsQ6rRax.js → 8.js-D5qfNA9r.js} +2 -2
  169. package/build/bosun-app/frontend/server/chunks/nodes/{8.js-lsQ6rRax.js.map → 8.js-D5qfNA9r.js.map} +1 -1
  170. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-MXqtxrRo.js → 9.js-CxI4tPnx.js} +3 -3
  171. package/build/bosun-app/frontend/server/chunks/nodes/{9.js-MXqtxrRo.js.map → 9.js-CxI4tPnx.js.map} +1 -1
  172. package/build/build/build.d.ts +1 -1
  173. package/build/build/build.d.ts.map +1 -1
  174. package/build/build/build.js +1 -1
  175. package/build/build/cli.js +2 -2
  176. package/build/build/index.d.ts +4 -4
  177. package/build/build/index.d.ts.map +1 -1
  178. package/build/build/index.js +3 -3
  179. package/build/call-control/call-control.d.ts +4 -4
  180. package/build/call-control/call-control.d.ts.map +1 -1
  181. package/build/call-control/call-control.js +4 -6
  182. package/build/call-control/call-details/index.d.ts +1 -1
  183. package/build/call-control/call-details/index.d.ts.map +1 -1
  184. package/build/call-control/call-details/index.js +1 -1
  185. package/build/call-control/call-details/noop-storage.d.ts +1 -1
  186. package/build/call-control/call-details/noop-storage.d.ts.map +1 -1
  187. package/build/call-control/index.d.ts +6 -7
  188. package/build/call-control/index.d.ts.map +1 -1
  189. package/build/call-control/index.js +4 -5
  190. package/build/call-control/port.d.ts +2 -2
  191. package/build/call-control/port.d.ts.map +1 -1
  192. package/build/call-control/schemas.generated.d.ts +2 -1
  193. package/build/call-control/schemas.generated.d.ts.map +1 -1
  194. package/build/call-control/schemas.generated.js +4 -4
  195. package/build/call-control/sip-setup-lock.d.ts +1 -1
  196. package/build/call-control/sip-setup-lock.d.ts.map +1 -1
  197. package/build/call-control/sip-setup-lock.js +1 -1
  198. package/build/call-control/sip.d.ts +2 -2
  199. package/build/call-control/sip.d.ts.map +1 -1
  200. package/build/call-control/sip.js +3 -3
  201. package/build/call-control/types.d.ts +160 -7
  202. package/build/call-control/types.d.ts.map +1 -1
  203. package/build/call-control/types.js +3 -3
  204. package/build/call-control/utils.d.ts +1 -1
  205. package/build/call-control/utils.d.ts.map +1 -1
  206. package/build/core/get-text-platform.d.ts +4 -4
  207. package/build/core/get-text-platform.d.ts.map +1 -1
  208. package/build/core/get-text-platform.js +4 -4
  209. package/build/core/get-voice-platform.d.ts +6 -6
  210. package/build/core/get-voice-platform.d.ts.map +1 -1
  211. package/build/core/get-voice-platform.js +5 -5
  212. package/build/core/index.d.ts +5 -5
  213. package/build/core/index.d.ts.map +1 -1
  214. package/build/core/index.js +2 -2
  215. package/build/core/platform.d.ts +6 -6
  216. package/build/core/platform.d.ts.map +1 -1
  217. package/build/dockyard/index.d.ts +3 -3
  218. package/build/dockyard/index.d.ts.map +1 -1
  219. package/build/dockyard/index.js +2 -2
  220. package/build/dockyard/logger/base.d.ts +1 -1
  221. package/build/dockyard/logger/base.d.ts.map +1 -1
  222. package/build/dockyard/logger/helpers.d.ts +1 -1
  223. package/build/dockyard/logger/helpers.d.ts.map +1 -1
  224. package/build/dockyard/logger/index.d.ts +3 -3
  225. package/build/dockyard/logger/index.d.ts.map +1 -1
  226. package/build/dockyard/logger/index.js +4 -4
  227. package/build/engine/bosun/agent.d.ts +6 -6
  228. package/build/engine/bosun/agent.d.ts.map +1 -1
  229. package/build/engine/bosun/api-call-tracer.d.ts +3 -3
  230. package/build/engine/bosun/api-call-tracer.d.ts.map +1 -1
  231. package/build/engine/bosun/conversational-tracer.d.ts +3 -3
  232. package/build/engine/bosun/conversational-tracer.d.ts.map +1 -1
  233. package/build/engine/bosun/index.d.ts +8 -8
  234. package/build/engine/bosun/index.d.ts.map +1 -1
  235. package/build/engine/bosun/index.js +7 -7
  236. package/build/engine/bosun/mock.d.ts +1 -1
  237. package/build/engine/bosun/mock.d.ts.map +1 -1
  238. package/build/engine/bosun/step-tracer.d.ts +3 -3
  239. package/build/engine/bosun/step-tracer.d.ts.map +1 -1
  240. package/build/engine/default-logger.d.ts +1 -1
  241. package/build/engine/default-logger.d.ts.map +1 -1
  242. package/build/engine/default-logger.js +1 -1
  243. package/build/engine/engine.d.ts +2 -2
  244. package/build/engine/engine.d.ts.map +1 -1
  245. package/build/engine/engine.js +4 -4
  246. package/build/engine/index.d.ts +14 -14
  247. package/build/engine/index.d.ts.map +1 -1
  248. package/build/engine/index.js +7 -7
  249. package/build/engine/interfaces/adapter.d.ts +1 -1
  250. package/build/engine/interfaces/adapter.d.ts.map +1 -1
  251. package/build/engine/interfaces/engine.d.ts +6 -6
  252. package/build/engine/interfaces/engine.d.ts.map +1 -1
  253. package/build/engine/interfaces/index.d.ts +7 -7
  254. package/build/engine/interfaces/index.d.ts.map +1 -1
  255. package/build/engine/interfaces/index.js +7 -7
  256. package/build/engine/interfaces/other.d.ts +2 -2
  257. package/build/engine/interfaces/other.d.ts.map +1 -1
  258. package/build/engine/interfaces/steps.d.ts +4 -4
  259. package/build/engine/interfaces/steps.d.ts.map +1 -1
  260. package/build/engine/interfaces/stream.d.ts +6 -6
  261. package/build/engine/interfaces/stream.d.ts.map +1 -1
  262. package/build/engine/interfaces/workflow.d.ts +2 -2
  263. package/build/engine/interfaces/workflow.d.ts.map +1 -1
  264. package/build/engine/llm-adapters/index.d.ts +4 -4
  265. package/build/engine/llm-adapters/index.d.ts.map +1 -1
  266. package/build/engine/llm-adapters/index.js +4 -4
  267. package/build/engine/llm-adapters/mock.d.ts +1 -1
  268. package/build/engine/llm-adapters/mock.d.ts.map +1 -1
  269. package/build/engine/llm-adapters/openai-stream.d.ts +1 -1
  270. package/build/engine/llm-adapters/openai-stream.d.ts.map +1 -1
  271. package/build/engine/llm-adapters/openai-stream.js +2 -2
  272. package/build/engine/llm-adapters/openai.d.ts +1 -1
  273. package/build/engine/llm-adapters/openai.d.ts.map +1 -1
  274. package/build/engine/llm-adapters/openai.js +2 -2
  275. package/build/engine/llm-adapters/provider.d.ts +1 -1
  276. package/build/engine/llm-adapters/provider.d.ts.map +1 -1
  277. package/build/engine/monitoring/index.d.ts +1 -1
  278. package/build/engine/monitoring/index.d.ts.map +1 -1
  279. package/build/engine/monitoring/index.js +1 -1
  280. package/build/engine/monitoring/provider-errors.d.ts +3 -3
  281. package/build/engine/monitoring/provider-errors.d.ts.map +1 -1
  282. package/build/engine/prompt-fs.d.ts +1 -1
  283. package/build/engine/prompt-fs.d.ts.map +1 -1
  284. package/build/engine/prompt-fs.js +1 -1
  285. package/build/engine/step-registry.d.ts +2 -2
  286. package/build/engine/step-registry.d.ts.map +1 -1
  287. package/build/engine/stream/engine.d.ts +1 -1
  288. package/build/engine/stream/engine.d.ts.map +1 -1
  289. package/build/engine/stream/engine.js +5 -5
  290. package/build/engine/stream/get-client.d.ts +1 -1
  291. package/build/engine/stream/get-client.d.ts.map +1 -1
  292. package/build/engine/stream/index.d.ts +3 -3
  293. package/build/engine/stream/index.d.ts.map +1 -1
  294. package/build/engine/stream/index.js +2 -2
  295. package/build/index.d.ts +2 -2
  296. package/build/index.d.ts.map +1 -1
  297. package/build/index.js +2 -2
  298. package/build/notifications/index.d.ts +4 -4
  299. package/build/notifications/index.d.ts.map +1 -1
  300. package/build/notifications/index.js +4 -4
  301. package/build/notifications/logger.d.ts +1 -1
  302. package/build/notifications/logger.d.ts.map +1 -1
  303. package/build/notifications/logger.js +1 -1
  304. package/build/notifications/publisher.d.ts +1 -1
  305. package/build/notifications/publisher.d.ts.map +1 -1
  306. package/build/notifications/publisher.js +2 -2
  307. package/build/notifications/router.d.ts +3 -3
  308. package/build/notifications/router.d.ts.map +1 -1
  309. package/build/notifications/router.js +2 -2
  310. package/build/notifications/transport.d.ts +1 -1
  311. package/build/notifications/transport.d.ts.map +1 -1
  312. package/build/notifications/transport.js +1 -1
  313. package/build/steps/helpers.d.ts +2 -2
  314. package/build/steps/helpers.d.ts.map +1 -1
  315. package/build/steps/index.d.ts +9 -9
  316. package/build/steps/index.d.ts.map +1 -1
  317. package/build/steps/index.js +5 -5
  318. package/build/steps/slot-booker/book-slot/step.d.ts +4 -4
  319. package/build/steps/slot-booker/book-slot/step.d.ts.map +1 -1
  320. package/build/steps/slot-booker/book-slot/step.js +2 -2
  321. package/build/steps/slot-booker/check-slots-for-match/step.d.ts +4 -4
  322. package/build/steps/slot-booker/check-slots-for-match/step.d.ts.map +1 -1
  323. package/build/steps/slot-booker/check-slots-for-match/step.js +1 -1
  324. package/build/steps/slot-booker/cleanup/step.d.ts +4 -4
  325. package/build/steps/slot-booker/cleanup/step.d.ts.map +1 -1
  326. package/build/steps/slot-booker/find-slots/step.d.ts +4 -4
  327. package/build/steps/slot-booker/find-slots/step.d.ts.map +1 -1
  328. package/build/steps/slot-booker/find-slots/step.js +2 -2
  329. package/build/steps/slot-booker/init/step.d.ts +4 -4
  330. package/build/steps/slot-booker/init/step.d.ts.map +1 -1
  331. package/build/steps/slot-booker/interfaces.d.ts +4 -4
  332. package/build/steps/slot-booker/interfaces.d.ts.map +1 -1
  333. package/build/steps/slot-booker/slot-booker.d.ts +7 -7
  334. package/build/steps/slot-booker/slot-booker.d.ts.map +1 -1
  335. package/build/steps/slot-booker/slot-booker.js +6 -6
  336. package/build/steps/slot-booker/util.d.ts +1 -1
  337. package/build/steps/slot-booker/util.d.ts.map +1 -1
  338. package/build/telescope/api.d.ts +1 -1
  339. package/build/telescope/api.d.ts.map +1 -1
  340. package/build/telescope/api.js +8 -2
  341. package/build/telescope/create-telescope.d.ts +3 -3
  342. package/build/telescope/create-telescope.d.ts.map +1 -1
  343. package/build/telescope/create-telescope.js +3 -3
  344. package/build/telescope/index.d.ts +21 -21
  345. package/build/telescope/index.d.ts.map +1 -1
  346. package/build/telescope/index.js +8 -8
  347. package/build/telescope/interfaces/conversation.d.ts +8 -0
  348. package/build/telescope/interfaces/conversation.d.ts.map +1 -1
  349. package/build/telescope/interfaces/event-tracer.d.ts +8 -0
  350. package/build/telescope/interfaces/event-tracer.d.ts.map +1 -1
  351. package/build/telescope/interfaces/storage.d.ts +3 -3
  352. package/build/telescope/interfaces/storage.d.ts.map +1 -1
  353. package/build/telescope/interfaces/telescope.d.ts +7 -6
  354. package/build/telescope/interfaces/telescope.d.ts.map +1 -1
  355. package/build/telescope/interfaces/traces.d.ts +1 -1
  356. package/build/telescope/interfaces/traces.d.ts.map +1 -1
  357. package/build/telescope/stub-storage.d.ts +5 -5
  358. package/build/telescope/stub-storage.d.ts.map +1 -1
  359. package/build/telescope/stub-storage.js +4 -9
  360. package/build/telescope/stub-telescope.d.ts +2 -2
  361. package/build/telescope/stub-telescope.d.ts.map +1 -1
  362. package/build/telescope/stub-telescope.js +1 -1
  363. package/build/telescope/stubs.d.ts +5 -5
  364. package/build/telescope/stubs.d.ts.map +1 -1
  365. package/build/telescope/telescope.d.ts +6 -6
  366. package/build/telescope/telescope.d.ts.map +1 -1
  367. package/build/telescope/telescope.js +1 -1
  368. package/build/telescope/trace-helpers.d.ts +3 -3
  369. package/build/telescope/trace-helpers.d.ts.map +1 -1
  370. package/build/telescope/tracers/api-call-tracer.d.ts +4 -4
  371. package/build/telescope/tracers/api-call-tracer.d.ts.map +1 -1
  372. package/build/telescope/tracers/conversational-tracer.d.ts +4 -4
  373. package/build/telescope/tracers/conversational-tracer.d.ts.map +1 -1
  374. package/build/telescope/tracers/event-tracer.d.ts +2 -2
  375. package/build/telescope/tracers/event-tracer.d.ts.map +1 -1
  376. package/build/telescope/tracers/event-tracer.js +5 -0
  377. package/build/telescope/tracers/index.d.ts +6 -6
  378. package/build/telescope/tracers/index.d.ts.map +1 -1
  379. package/build/telescope/tracers/index.js +5 -5
  380. package/build/telescope/tracers/latency-tracer.d.ts +4 -4
  381. package/build/telescope/tracers/latency-tracer.d.ts.map +1 -1
  382. package/build/telescope/tracers/step-tracer.d.ts +4 -4
  383. package/build/telescope/tracers/step-tracer.d.ts.map +1 -1
  384. package/build/text-agent-handlers/incoming-message.d.ts +3 -3
  385. package/build/text-agent-handlers/incoming-message.d.ts.map +1 -1
  386. package/build/text-agent-handlers/incoming-message.js +2 -2
  387. package/build/text-agent-handlers/index.d.ts +15 -14
  388. package/build/text-agent-handlers/index.d.ts.map +1 -1
  389. package/build/text-agent-handlers/index.js +7 -6
  390. package/build/text-agent-handlers/instrument.d.ts +4 -3
  391. package/build/text-agent-handlers/instrument.d.ts.map +1 -1
  392. package/build/text-agent-handlers/instrument.js +7 -3
  393. package/build/text-agent-handlers/jobs-handler.d.ts +3 -3
  394. package/build/text-agent-handlers/jobs-handler.d.ts.map +1 -1
  395. package/build/text-agent-handlers/jobs-handler.js +2 -2
  396. package/build/text-agent-handlers/jobs.d.ts +1 -0
  397. package/build/text-agent-handlers/jobs.d.ts.map +1 -1
  398. package/build/text-agent-handlers/message-acceptor.d.ts +8 -4
  399. package/build/text-agent-handlers/message-acceptor.d.ts.map +1 -1
  400. package/build/text-agent-handlers/message-acceptor.js +9 -3
  401. package/build/text-agent-handlers/notification-hook.d.ts +3 -3
  402. package/build/text-agent-handlers/notification-hook.d.ts.map +1 -1
  403. package/build/text-agent-handlers/notification-hook.js +2 -2
  404. package/build/text-agent-handlers/ports.d.ts +5 -4
  405. package/build/text-agent-handlers/ports.d.ts.map +1 -1
  406. package/build/text-agent-handlers/ports.js +6 -5
  407. package/build/text-agent-handlers/variant-scheduler.d.ts +3 -0
  408. package/build/text-agent-handlers/variant-scheduler.d.ts.map +1 -0
  409. package/build/text-agent-handlers/variant-scheduler.js +9 -0
  410. package/build/timeout-manager/index.d.ts +2 -2
  411. package/build/timeout-manager/index.d.ts.map +1 -1
  412. package/build/voice-agent-api/http-helpers.d.ts +1 -1
  413. package/build/voice-agent-api/http-helpers.d.ts.map +1 -1
  414. package/build/voice-agent-api/http-helpers.js +1 -1
  415. package/build/voice-agent-api/index.d.ts +7 -5
  416. package/build/voice-agent-api/index.d.ts.map +1 -1
  417. package/build/voice-agent-api/index.js +4 -3
  418. package/build/voice-agent-api/llm-completion-handler.d.ts +2 -2
  419. package/build/voice-agent-api/llm-completion-handler.d.ts.map +1 -1
  420. package/build/voice-agent-api/llm-completion-handler.js +3 -3
  421. package/build/voice-agent-api/logger.d.ts +2 -2
  422. package/build/voice-agent-api/logger.d.ts.map +1 -1
  423. package/build/voice-agent-api/logger.js +1 -1
  424. package/build/voice-agent-api/route-resolver.d.ts +19 -0
  425. package/build/voice-agent-api/route-resolver.d.ts.map +1 -0
  426. package/build/voice-agent-api/route-resolver.js +57 -0
  427. package/build/voice-agent-api/voice-http.d.ts +10 -6
  428. package/build/voice-agent-api/voice-http.d.ts.map +1 -1
  429. package/build/voice-agent-api/voice-http.js +36 -37
  430. package/package.json +3 -7
  431. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3KppP__.js.br +0 -0
  432. package/build/bosun-app/frontend/client/_app/immutable/chunks/B3KppP__.js.gz +0 -0
  433. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.br +0 -0
  434. package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.gz +0 -0
  435. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.br +0 -0
  436. package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.gz +0 -0
  437. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.br +0 -0
  438. package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.gz +0 -0
  439. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.br +0 -0
  440. package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.gz +0 -0
  441. package/build/bosun-app/frontend/client/_app/immutable/chunks/CFHTd1Rp.js.br +0 -2
  442. package/build/bosun-app/frontend/client/_app/immutable/chunks/CFHTd1Rp.js.gz +0 -0
  443. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.br +0 -0
  444. package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.gz +0 -0
  445. package/build/bosun-app/frontend/client/_app/immutable/chunks/Csk7d6BP.js.br +0 -0
  446. package/build/bosun-app/frontend/client/_app/immutable/chunks/Csk7d6BP.js.gz +0 -0
  447. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.br +0 -0
  448. package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.gz +0 -0
  449. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.br +0 -0
  450. package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.gz +0 -0
  451. package/build/bosun-app/frontend/client/_app/immutable/chunks/g-PBecQM.js.br +0 -0
  452. package/build/bosun-app/frontend/client/_app/immutable/chunks/g-PBecQM.js.gz +0 -0
  453. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.br +0 -0
  454. package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.gz +0 -0
  455. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.br +0 -0
  456. package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.gz +0 -0
  457. package/build/bosun-app/frontend/client/_app/immutable/chunks/zEK2_zeg.js +0 -3
  458. package/build/bosun-app/frontend/client/_app/immutable/chunks/zEK2_zeg.js.br +0 -0
  459. package/build/bosun-app/frontend/client/_app/immutable/chunks/zEK2_zeg.js.gz +0 -0
  460. package/build/bosun-app/frontend/client/_app/immutable/entry/app.Trw4ULuE.js.br +0 -0
  461. package/build/bosun-app/frontend/client/_app/immutable/entry/app.Trw4ULuE.js.gz +0 -0
  462. package/build/bosun-app/frontend/client/_app/immutable/entry/start.DAo7jQEf.js +0 -1
  463. package/build/bosun-app/frontend/client/_app/immutable/entry/start.DAo7jQEf.js.br +0 -0
  464. package/build/bosun-app/frontend/client/_app/immutable/entry/start.DAo7jQEf.js.gz +0 -0
  465. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.D_60dBJ-.js.br +0 -0
  466. package/build/bosun-app/frontend/client/_app/immutable/nodes/0.D_60dBJ-.js.gz +0 -0
  467. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Cb20jEGe.js.br +0 -0
  468. package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Cb20jEGe.js.gz +0 -0
  469. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.ihk_thZi.js +0 -35
  470. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.ihk_thZi.js.br +0 -0
  471. package/build/bosun-app/frontend/client/_app/immutable/nodes/10.ihk_thZi.js.gz +0 -0
  472. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Dn5eKe2Q.js.br +0 -0
  473. package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Dn5eKe2Q.js.gz +0 -0
  474. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.C0bK6rdq.js +0 -11
  475. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.C0bK6rdq.js.br +0 -0
  476. package/build/bosun-app/frontend/client/_app/immutable/nodes/18.C0bK6rdq.js.gz +0 -0
  477. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.C2UMBwkC.js +0 -35
  478. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.C2UMBwkC.js.br +0 -0
  479. package/build/bosun-app/frontend/client/_app/immutable/nodes/2.C2UMBwkC.js.gz +0 -0
  480. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.D35G6Br8.js +0 -1
  481. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.D35G6Br8.js.br +0 -0
  482. package/build/bosun-app/frontend/client/_app/immutable/nodes/3.D35G6Br8.js.gz +0 -0
  483. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BhBj3Qad.js.br +0 -0
  484. package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BhBj3Qad.js.gz +0 -0
  485. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.CMK8bzwn.js.br +0 -0
  486. package/build/bosun-app/frontend/client/_app/immutable/nodes/5.CMK8bzwn.js.gz +0 -0
  487. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.crW0u6fy.js.br +0 -0
  488. package/build/bosun-app/frontend/client/_app/immutable/nodes/6.crW0u6fy.js.gz +0 -0
  489. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.CxQxpCTc.js.br +0 -0
  490. package/build/bosun-app/frontend/client/_app/immutable/nodes/8.CxQxpCTc.js.gz +0 -0
  491. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BXh1IZwx.js +0 -2
  492. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BXh1IZwx.js.br +0 -0
  493. package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BXh1IZwx.js.gz +0 -0
  494. package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-VTtwaKGp.js.map +0 -1
  495. package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-D5B8gfq2.js.map +0 -1
  496. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-B2wHKJV7.js.map +0 -1
  497. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-DDcIjgZD.js.map +0 -1
  498. package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-UVUg89-t.js.map +0 -1
  499. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-DiZKDT2v.js.map +0 -1
  500. package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-CfkCQ2Th.js.map +0 -1
  501. package/build/call-control/voice-agent-config.d.ts +0 -155
  502. package/build/call-control/voice-agent-config.d.ts.map +0 -1
  503. package/build/call-control/voice-agent-config.js +0 -53
  504. package/build/call-control.runtime.js +0 -1057
@@ -1,5 +1,5 @@
1
1
  import { FastifyRequest, FastifyReply as Reply, FastifyRequest as Request } from 'fastify';
2
- import { VoiceAgent } from '../agent';
3
- import type { ConversationalTracer } from '../telescope';
2
+ import { VoiceAgent } from '../agent/index.js';
3
+ import type { ConversationalTracer } from '../telescope/index.js';
4
4
  export declare function llmCompletionHandler<TMeta>(agent: VoiceAgent<TMeta>, conversationalTracer: ConversationalTracer, headersToMeta: (headers: FastifyRequest['headers']) => TMeta, request: Request, reply: Reply): Promise<undefined>;
5
5
  //# sourceMappingURL=llm-completion-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-completion-handler.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/llm-completion-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,IAAI,KAAK,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,SAAS,CAAA;AAG1F,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAKxD,wBAAsB,oBAAoB,CAAC,KAAK,EAC5C,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,EAC5D,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,sBAsDf"}
1
+ {"version":3,"file":"llm-completion-handler.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/llm-completion-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,IAAI,KAAK,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,SAAS,CAAA;AAG1F,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAKjE,wBAAsB,oBAAoB,CAAC,KAAK,EAC5C,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,EAC5D,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,sBAsDf"}
@@ -1,6 +1,6 @@
1
- import { agentReplyTrace, emitConversationalTrace, userTurnTrace } from '../telescope';
2
- import { extractMessageContent, fail, roleToSender } from './http-helpers';
3
- import { logger } from './logger';
1
+ import { agentReplyTrace, emitConversationalTrace, userTurnTrace } from '../telescope/index.js';
2
+ import { extractMessageContent, fail, roleToSender } from './http-helpers.js';
3
+ import { logger } from './logger.js';
4
4
  export async function llmCompletionHandler(agent, conversationalTracer, headersToMeta, request, reply) {
5
5
  logger.debug('agent-llm-handler.support.llmCompletionHandler', request.body);
6
6
  if (!request.body) {
@@ -1,3 +1,3 @@
1
- export declare const logger: import("../dockyard").Logger;
2
- export declare const childLogger: (name: string, mergeObj?: object) => import("../dockyard").Logger;
1
+ export declare const logger: import("../dockyard/index.js").Logger;
2
+ export declare const childLogger: (name: string, mergeObj?: object) => import("../dockyard/index.js").Logger;
3
3
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,8BAAiB,CAAA;AACpC,eAAO,MAAM,WAAW,mEAA4B,CAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,uCAAiB,CAAA;AACpC,eAAO,MAAM,WAAW,4EAA4B,CAAA"}
@@ -1,3 +1,3 @@
1
- import createLogger, { childLoggerFabric } from '../dockyard';
1
+ import createLogger, { childLoggerFabric } from '../dockyard/index.js';
2
2
  export const logger = createLogger();
3
3
  export const childLogger = childLoggerFabric(logger);
@@ -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,8 +1,9 @@
1
1
  import { FastifyRequest } from 'fastify';
2
- import { VoiceAgent } from '../agent';
3
- import type CallControl from '../call-control';
4
- import type { NotificationRouter } from '../notifications';
5
- import type { ITelescope } from '../telescope';
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';
5
+ import type { NotificationRouter } from '../notifications/index.js';
6
+ import type { ITelescope } from '../telescope/index.js';
6
7
  declare module 'fastify' {
7
8
  interface FastifyRequest {
8
9
  callId: string;
@@ -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,UAAU,CAAA;AAE/C,OAAO,KAAK,WAAW,MAAM,iBAAiB,CAAA;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,cAAc,CAAA;AAOrE,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';
5
- import { loggerContext } from '../dockyard';
6
- import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES } from '../telescope';
7
- import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers';
8
- import { llmCompletionHandler } from './llm-completion-handler';
9
- import { logger } from './logger';
10
- export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }) {
4
+ import { loggerContext } from '../dockyard/index.js';
5
+ import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES, } from '../telescope/index.js';
6
+ import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers.js';
7
+ import { llmCompletionHandler } from './llm-completion-handler.js';
8
+ import { logger } from './logger.js';
9
+ import { createVoiceRouteResolver } from './route-resolver.js';
10
+ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }) {
11
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.1",
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",
@@ -27,11 +27,7 @@
27
27
  "./engine": "./build/engine/index.js",
28
28
  "./telescope": "./build/telescope/index.js",
29
29
  "./dockyard": "./build/dockyard/index.js",
30
- "./call-control": {
31
- "types": "./build/call-control/index.d.ts",
32
- "import": "./build/call-control.runtime.js",
33
- "default": "./build/call-control.runtime.js"
34
- },
30
+ "./call-control": "./build/call-control/index.js",
35
31
  "./context-cache": "./build/context-cache/index.js",
36
32
  "./token-storage": "./build/token-storage/index.js",
37
33
  "./timeout-manager": "./build/timeout-manager/index.js",
@@ -69,6 +65,6 @@
69
65
  "scripts": {
70
66
  "generate": "tsx scripts/generate-call-control-schemas.ts",
71
67
  "build:bosun-app": "tsx scripts/build-bosun-app.ts",
72
- "build:call-control-runtime": "esbuild src/call-control/index.ts --bundle --platform=node --format=esm --packages=external --target=node24 --outfile=build/call-control.runtime.js"
68
+ "test:package": "node scripts/smoke-test-package.mjs"
73
69
  }
74
70
  }
@@ -1,2 +0,0 @@
1
- 1@deN?��)B������g�CDe��_�ēكF���j�4���'���:����W4�E��ih
2
- cG�oc�Ȭ��{���P�]&�цt��� �����(��$��
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DLQqXQ6R.js","./C1FmrZbK.js","../assets/editor.BMIWPGx3.css"])))=>i.map(i=>d[i]);
2
- import{d as Dt,b as be,a as o,f as y,t as U}from"./CCYriF4C.js";import{a as Et,o as Vt}from"./DnMQeiTY.js";import{p as ht,f as Fe,c as i,j as e,s as d,r as s,t as J,y as a,a as pt,w as j,n as c,o as Z,d as Ct,x as Wt}from"./CR-uVjxM.js";import{s as H}from"./B0nqNj93.js";import{i as I}from"./BQIf5msi.js";import{s as We,c as Jt}from"./C9yBjdYI.js";import{M as vt,R as jt}from"./C3cROXCy.js";import{T as mt,a as Pe}from"./BEdAvgYp.js";import{B as rt}from"./joiJcRPz.js";import{I as Lt}from"./BBk8_Xpk.js";import{R as tt}from"./sKHuRf4Z.js";import{c as At}from"./CR5IRTqC.js";import{p as pe}from"./BcbX6huO.js";import{t as St}from"./Csk7d6BP.js";import{i as it}from"./DgGeUDDh.js";import{c as Gt}from"./ouMvMh56.js";import{_ as Xt}from"./C1FmrZbK.js";import{b as Yt}from"./ClLUwVGq.js";import{e as Kt,a as Qt}from"./BU7aeYn4.js";function Ot(f={}){const t=f.thresholdPx??4,N=f.dragCursor??"text";let D=0,T=0,p=!1,w=!1,v=null,k=null;function E(){w=!1,p=!1,v==null||v.style.removeProperty("cursor"),v=null,k==null||k.abort(),k=null}function B(M){if(typeof window>"u"||M.button!==0)return;k==null||k.abort(),k=null,v==null||v.style.removeProperty("cursor"),D=M.clientX,T=M.clientY,p=!1,w=!0,v=M.currentTarget instanceof HTMLElement?M.currentTarget:null;const _=new AbortController;k=_;const fe=ve=>{if(!w||p)return;const te=Math.abs(ve.clientX-D),Me=Math.abs(ve.clientY-T);te+Me<t||(p=!0,v==null||v.style.setProperty("cursor",N))},oe=()=>{w=!1,v==null||v.style.removeProperty("cursor"),v=null,_.abort(),k===_&&(k=null)};window.addEventListener("pointermove",fe,{signal:_.signal}),window.addEventListener("pointerup",oe,{signal:_.signal}),window.addEventListener("pointercancel",oe,{signal:_.signal})}function ee(M){return M.detail>0&&p}return{onPointerDown:B,shouldSuppressClick:ee,cleanup:E}}var Zt=y('<span class="text-[13px] leading-none text-rc-gray-400"> </span>'),$t=y('<div class="rounded-md border border-red-500 bg-red-950/40 p-3 font-mono text-sm text-red-200"> </div>'),er=y("<!> <!>",1),tr=y('<div class="flex flex-col gap-3"><!> <div class="flex flex-wrap items-center justify-between gap-2 text-sm text-rc-gray-200"><div class="flex flex-wrap items-center gap-x-4 gap-y-1"><div><span class="text-rc-gray-400">Timing:</span> </div> <div><span class="text-rc-gray-400">Response time:</span> </div> <div><span class="text-rc-gray-400">URL:</span> </div></div> <!></div> <div><!> <div class="mt-2 h-[55vh]"><!></div></div></div>'),rr=y('<button type="button" class="flex w-full cursor-pointer select-text items-baseline gap-2 truncate rounded-md bg-transparent px-2 py-1 text-left text-sm text-rc-gray-200 hover:bg-rc-gray-800/40"><!> <!> <span> </span></button> <!>',1);function gn(f,t){ht(t,!0);let N=j(!1),D=j("request");const T=Ot();Et(T.cleanup);function p(A){try{if(typeof A=="string"){const P=A.trim();if(!P)return"";const $=JSON.parse(P);return JSON.stringify($,null,2)}}catch{}try{return JSON.stringify(A??null,null,2)}catch{return String(A)}}function w(A){return new Date(A).toISOString()}function v(A){if(typeof A!="number"||!Number.isFinite(A))return null;const P=new Date(A);if(Number.isNaN(P.getTime()))return null;const $=String(P.getHours()).padStart(2,"0"),Ie=String(P.getMinutes()).padStart(2,"0"),ye=String(P.getSeconds()).padStart(2,"0");return`${$}:${Ie}:${ye}`}const k=c(()=>v(t.trace.createdAt)),E=c(()=>{if(t.trace.error!=null)return t.trace.error;if(!(t.trace.ok===!1||typeof t.trace.status=="number"&&t.trace.status>=400))return;const P=t.trace.response;return P&&typeof P=="object"&&"error"in P&&P.error!=null?P.error:{status:t.trace.status,ok:t.trace.ok}}),B=c(()=>e(E)!=null),ee=c(()=>`API: ${t.trace.operationName}`),M=c(()=>t.trace.operationName),_=c(()=>typeof t.trace.createdAt!="number"?"—":w(t.trace.createdAt));async function fe(){const A=p(t.trace);try{await navigator.clipboard.writeText(A)}catch(P){console.error("Failed to copy",P)}}const oe=c(()=>p({method:t.trace.method,path:t.trace.path,baseUrl:t.trace.baseUrl,request:t.trace.request})),ve=c(()=>p({status:t.trace.status,ok:t.trace.ok,response:t.trace.response,error:e(E)})),te=c(()=>e(E)!=null?p(e(E)):"");var Me=rr(),ge=Fe(Me),V=i(ge);{let A=c(()=>e(B)?"close":"checkmark"),P=c(()=>e(B)?"self-center text-red-400":"self-center text-rc-green-200");Lt(V,{get name(){return e(A)},width:18,height:18,get class(){return e(P)}})}var He=d(V,2);{var nt=A=>{var P=Zt(),$=i(P,!0);s(P),J(()=>H($,e(k))),o(A,P)};I(He,A=>{e(k)&&A(nt)})}var Le=d(He,2),qe=i(Le,!0);s(Le),s(ge);var ze=d(ge,2);{var Qe=A=>{vt(A,{get title(){return e(ee)},class:"!w-[85vw] !max-w-5xl",get open(){return e(N)},set open($){a(N,$,!0)},children:$=>{var Ie=tr(),ye=i(Ie);{var Ne=x=>{var L=$t(),O=i(L,!0);s(L),J(()=>H(O,e(te))),o(x,L)};I(ye,x=>{e(te)&&x(Ne)})}var De=d(ye,2),m=i(De),C=i(m),R=d(i(C));s(C);var K=d(C,2),xe=d(i(K));s(K);var Ce=d(K,2),Se=d(i(Ce));s(Ce),s(m);var Ue=d(m,2);rt(Ue,{variant:"secondary",size:"small",onclick:fe,children:(x,L)=>{Z();var O=U("Copy raw trace");o(x,O)},$$slots:{default:!0}}),s(De);var le=d(De,2),ce=i(le);mt(ce,{get value(){return e(D)},ariaLabel:"API trace tabs",onChange:({value:x})=>a(D,x,!0),children:(x,L)=>{var O=er(),W=Fe(O);Pe(W,{value:"request",class:"px-3",children:(Q,re)=>{Z();var ne=U("Request");o(Q,ne)},$$slots:{default:!0}});var ie=d(W,2);Pe(ie,{value:"response",class:"px-3",children:(Q,re)=>{Z();var ne=U("Response");o(Q,ne)},$$slots:{default:!0}}),o(x,O)},$$slots:{default:!0}});var Te=d(ce,2),Oe=i(Te);{var Be=x=>{tt(x,{get value(){return e(oe)},language:"json",class:"h-full"})},u=x=>{tt(x,{get value(){return e(ve)},language:"json",class:"h-full"})};I(Oe,x=>{e(D)==="request"?x(Be):x(u,-1)})}s(Te),s(le),s(Ie),J(x=>{H(R,` ${e(_)??""}`),H(xe,` ${x??""}`),H(Se,` ${t.trace.path??""}`)},[()=>typeof t.trace.durationMs=="number"?`${Math.round(t.trace.durationMs)}ms`:"—"]),o($,Ie)},$$slots:{default:!0}})};I(ze,A=>{e(N)&&A(Qe)})}J(()=>{We(Le,1,Jt(e(B)?"text-red-200":"")),H(qe,e(M))}),be("pointerdown",ge,function(...A){var P;(P=T.onPointerDown)==null||P.apply(this,A)}),be("click",ge,A=>{T.shouldSuppressClick(A)||a(N,!0)}),o(f,Me),pt()}Dt(["pointerdown","click"]);function nr(f){return xt(f)&&xt(f.context)?gt(f.context):gt(f)}function Ft(f){if(!(!xt(f)||!xt(f.mocks)))return gt(f.mocks)}function gt(f){return xt(f)?ar(f):{}}function xt(f){return!!f&&typeof f=="object"&&!Array.isArray(f)}function ar(f){try{return structuredClone(f)}catch{try{return JSON.parse(JSON.stringify(f))}catch{return f}}}function Ht(f){return!("operationName"in f)&&!("eventName"in f)}function or(f){return Ht(f)&&it(f.name)}function ir(f,t,N={}){if(t<0)return null;const D=T=>or(T)?N.requireRenderedPrompt?typeof T.renderedPrompt=="string"&&T.renderedPrompt.trim().length>0:!0:!1;return[...f.slice(0,t)].reverse().find(D)??f.slice(t+1).find(D)??null}function sr(f,t){return t<=0?null:[...f.slice(0,t)].reverse().map(N=>{var D;return Ht(N)?(D=N.stringifiedConversation)==null?void 0:D.trim():""}).find(Boolean)??null}function lr({entries:f,trace:t,sourceStep:N,fallbackRuntimeContext:D,requireReceivedContext:T=!1}){const p=f.indexOf(t);if(p===-1)throw new Error("Could not locate the response in its trace history");const w=N??ir(f,p);if(T&&typeof(w==null?void 0:w.receivedContext)>"u")throw new Error("The source step trace does not have receivedContext");const v=typeof(w==null?void 0:w.stringifiedConversation)=="string"&&w.stringifiedConversation.trim()?w.stringifiedConversation:sr(f,p)??"",k=(t.content??"").trim(),E=w&&typeof w.receivedContext<"u"?gt(w.receivedContext):nr(D),B=Ft(D);return{pinned:"TRUE",step:"main",evaluation_mode:"assertion",context_mode:"replace",assertion_type:"llm-rubric",assertion_value:"",conversation:v,expected_output:k,similarity_threshold:"60",timeout:"0",context:E,...typeof B<"u"?{mocks:B}:{}}}function cr(f,{fallbackConversation:t="",fallbackRuntimeContext:N}={}){var v;if(typeof f.receivedContext>"u")throw new Error("The source step trace does not have receivedContext");const D=(f.response??"").trim();if(!D)throw new Error("The source step trace does not have a response");const T=(v=f.stringifiedConversation)!=null&&v.trim()?f.stringifiedConversation:t??"",p=dr(D)?"json-deep-equal":"assertion",w=Ft(N);return{pinned:"TRUE",step:it(f.name)?"main":f.name,evaluation_mode:p,context_mode:"replace",assertion_type:"llm-rubric",assertion_value:"",conversation:T,expected_output:D,similarity_threshold:"60",timeout:"0",context:gt(f.receivedContext),...typeof w<"u"?{mocks:w}:{}}}function dr(f){try{const t=JSON.parse(f);return typeof t=="object"&&t!==null}catch{return!1}}var ur=y('<div><div class="h-full w-full"></div></div>');function Pt(f,t){ht(t,!0);let N=pe(t,"language",3,"plaintext"),D=pe(t,"class",3,""),T=j(null),p=null,w=null,v=null,k=null,E=j(!1);Vt(()=>{if(!e(T))return;Kt();let M=!1;return Xt(()=>import("./DLQqXQ6R.js").then(_=>_.e),__vite__mapDeps([0,1,2]),import.meta.url).then(_=>{if(M)return;Qt(_),w=_,p=_.editor.createDiffEditor(e(T),{theme:"bosun-dark",readOnly:!1,originalEditable:!1,automaticLayout:!0,lineNumbers:"on",renderSideBySide:!0,renderIndicators:!0,ignoreTrimWhitespace:!1,diffWordWrap:"on",diffAlgorithm:"advanced",maxComputationTime:2e4,renderMarginRevertIcon:!1,renderGutterMenu:!1,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:"on",overviewRulerBorder:!1,hideCursorInOverviewRuler:!0,matchBrackets:"never",bracketPairColorization:{enabled:!1},guides:{highlightActiveBracketPair:!1,bracketPairs:!1,bracketPairsHorizontal:!1},occurrencesHighlight:"off",selectionHighlight:!1,renderLineHighlight:"none"});const fe=_.editor.createModel(t.original??"",N()),oe=_.editor.createModel(t.modified??"",N());v={original:fe,modified:oe},p.setModel(v),k=oe.onDidChangeContent(()=>{var te;const ve=oe.getValue();ve!==t.modified&&((te=t.onChange)==null||te.call(t,ve))}),a(E,!0)}).catch(_=>{console.error("EditableMonacoDiff: failed to initialise",_)}),()=>{if(M=!0,k==null||k.dispose(),k=null,p){try{p.setModel(null)}catch{}p.dispose(),p=null}v==null||v.original.dispose(),v==null||v.modified.dispose(),v=null,w=null}}),Ct(()=>{if(!v||!e(E))return;const M=t.original??"",_=t.modified??"";v.original.getValue()!==M&&v.original.setValue(M),v.modified.getValue()!==_&&v.modified.setValue(_)}),Ct(()=>{if(!v||!e(E)||!w)return;const M=N()||"plaintext";v.original.getLanguageId()!==M&&w.editor.setModelLanguage(v.original,M),v.modified.getLanguageId()!==M&&w.editor.setModelLanguage(v.modified,M)});var B=ur(),ee=i(B);Yt(ee,M=>a(T,M),()=>e(T)),s(B),J(()=>We(B,1,`overflow-hidden rounded-md border border-rc-gray-700 ${D()}`)),o(f,B),pt()}var fr=y('<div class="flex flex-1 items-center justify-center text-rc-gray-200">Removing personal data...</div>'),vr=y('<div class="flex flex-1 flex-col items-center justify-center gap-4"><div class="max-w-2xl text-center text-red-300"> </div> <div class="flex flex-wrap justify-center gap-2"><!> <!></div></div>'),mr=y('<div class="text-xs text-rc-gray-500"> </div>'),gr=y('<div class="rounded-md border border-amber-600 bg-amber-950/30 px-3 py-2 text-sm text-amber-200"> </div>'),xr=y("<!> <!> <!> <!>",1),hr=y('<div class="flex flex-wrap items-center justify-between gap-2 text-sm"><div class="text-rc-gray-200"><!></div> <!></div> <!> <div class="flex min-h-0 flex-1 flex-col"><!> <div class="mt-2 min-h-0 flex-1"><!></div></div>',1),pr=y('<div class="flex h-[70vh] min-h-[32rem] flex-col gap-3"><!></div>'),_r=y("<!> <!>",1);function qt(f,t){ht(t,!0);let N=pe(t,"open",15,!1),D=pe(t,"region",3,null),T=j("idle"),p=j(""),w=j(""),v=j(!1),k=j("conversation"),E=j(""),B=j(null),ee=j(null),M=j(Wt([])),_=j(""),fe=j(""),oe=j(""),ve=j("{}"),te=j("{}"),Me=null,ge=0;const V=c(()=>{var m;return typeof((m=e(ee))==null?void 0:m.mocks)<"u"}),He=c(()=>e(M).reduce((m,C)=>m+C.paths.length,0)),nt=c(()=>{var m;return((m=e(B))==null?void 0:m.conversation)??""}),Le=c(()=>{var m;return((m=e(B))==null?void 0:m.expected_output)??""}),qe=c(()=>{var m;return Ne(((m=e(B))==null?void 0:m.context)??{})}),ze=c(()=>{var m;return Ne(((m=e(B))==null?void 0:m.mocks)??{})});Ct(()=>{const m=N(),C=t.seed;!m||!C||Me===C||(Me=C,Qe(C))}),Ct(()=>{N()||(ge+=1,a(T,"idle"),a(p,""),a(w,""),a(v,!1),Me=null,a(E,""),a(B,null),a(ee,null),a(M,[],!0),a(_,""),a(k,"conversation"))});async function Qe(m){const C=++ge;a(T,"preparing"),a(p,""),a(w,""),a(v,!1),a(B,m,!0),a(ee,null),a(E,""),a(M,[],!0);try{const R=await St.tests.createPiiSanitizedTestDraft.mutate({agent:t.agent,region:D(),seed:m});if(C!==ge)return;if(R.status==="sanitizer-error"){a(p,R.message,!0),a(w,R.aiResponse,!0),a(T,"error");return}P(R.draftId,R.seed,R.findings,R.model),a(T,"ready")}catch(R){if(C!==ge)return;console.error("Failed to prepare PII-sanitised test draft",R),a(p,De(R,"Could not prepare a PII-sanitised test draft."),!0),a(T,"error")}}async function A(){if(e(w))try{await navigator.clipboard.writeText(e(w)),a(v,!0)}catch(m){console.error("Failed to copy PII sanitiser AI response",m),a(p,"Could not copy the AI response to the clipboard.")}}function P(m,C,R,K=e(_)){a(E,m,!0),a(ee,C,!0),a(M,R,!0),a(_,K,!0),a(fe,C.conversation,!0),a(oe,C.expected_output,!0),a(ve,Ne(C.context),!0),a(te,Ne(C.mocks??{}),!0),e(k)==="mocks"&&typeof C.mocks>"u"&&a(k,"conversation")}async function $(){var C,R;if(!e(ee)||!e(E)||e(T)!=="ready")return;const m=window.open("about:blank","_blank");m&&(m.opener=null),a(T,"creating"),a(p,"");try{const K=Ie(),xe=await St.tests.createTestFromPiiSanitizedTestDraft.mutate({agent:t.agent,region:D(),draftId:e(E),reviewed:K}),Ce=new URLSearchParams({step:xe.test.step||e(ee).step||"main",test:xe.test.id});(C=D())!=null&&C.trim()&&Ce.set("region",D().trim());const Se=`/edit/${encodeURIComponent(t.agent)}/tests?${Ce.toString()}`;m?m.location.replace(Se):window.open(Se,"_blank","noopener"),N(!1),(R=t.onCreated)==null||R.call(t,xe.test)}catch(K){m==null||m.close(),console.error("Failed to create test from PII-sanitised draft",K),a(p,De(K,"Could not create the test."),!0),a(T,"ready")}}function Ie(){const m=ye(e(ve),"Context"),C=e(V)?ye(e(te),"Mocks"):void 0;return{conversation:e(fe),expected_output:e(oe),context:m,...typeof C>"u"?{}:{mocks:C}}}function ye(m,C){let R;try{R=JSON.parse(m)}catch{throw new Error(`${C} must be valid JSON.`)}if(!R||typeof R!="object"||Array.isArray(R))throw new Error(`${C} must be a JSON object.`);return R}function Ne(m){return JSON.stringify(m??{},null,2)}function De(m,C){return m instanceof Error&&m.message.trim()?m.message:C}vt(f,{title:"Review test before creating",class:"!w-[94vw] !max-w-[90rem]",get open(){return N()},set open(R){N(R)},children:R=>{var K=pr(),xe=i(K);{var Ce=le=>{var ce=fr();o(le,ce)},Se=le=>{var ce=vr(),Te=i(ce),Oe=i(Te,!0);s(Te);var Be=d(Te,2),u=i(Be);rt(u,{variant:"secondary",onclick:()=>t.seed&&Qe(t.seed),children:(O,W)=>{Z();var ie=U("Try again");o(O,ie)},$$slots:{default:!0}});var x=d(u,2);{var L=O=>{rt(O,{variant:"secondary",onclick:A,children:(W,ie)=>{Z();var Q=U();J(()=>H(Q,e(v)?"AI response copied":"Copy AI response")),o(W,Q)},$$slots:{default:!0}})};I(x,O=>{e(w)&&O(L)})}s(Be),s(ce),J(()=>H(Oe,e(p))),o(le,ce)},Ue=le=>{var ce=hr(),Te=Fe(ce),Oe=i(Te),Be=i(Oe);{var u=S=>{var F=U("No personal data replacements were proposed.");o(S,F)},x=S=>{var F=U();J(()=>H(F,`${e(He)??""} personal data ${e(He)===1?"replacement":"replacements"} proposed.`)),o(S,F)};I(Be,S=>{e(He)===0?S(u):S(x,-1)})}s(Oe);var L=d(Oe,2);{var O=S=>{var F=mr(),z=i(F);s(F),J(()=>H(z,`Model: ${e(_)??""}`)),o(S,F)};I(L,S=>{e(_)&&S(O)})}s(Te);var W=d(Te,2);{var ie=S=>{var F=gr(),z=i(F,!0);s(F),J(()=>H(z,e(p))),o(S,F)};I(W,S=>{e(p)&&S(ie)})}var Q=d(W,2),re=i(Q);mt(re,{get value(){return e(k)},ariaLabel:"PII-sanitised test draft fields",onChange:({value:S})=>a(k,S,!0),children:(S,F)=>{var z=xr(),b=Fe(z);Pe(b,{value:"conversation",class:"px-3",children:(he,Ve)=>{Z();var ke=U("Conversation");o(he,ke)},$$slots:{default:!0}});var X=d(b,2);Pe(X,{value:"expected_output",class:"px-3",children:(he,Ve)=>{Z();var ke=U("Expected output");o(he,ke)},$$slots:{default:!0}});var ae=d(X,2);Pe(ae,{value:"context",class:"px-3",children:(he,Ve)=>{Z();var ke=U("Context");o(he,ke)},$$slots:{default:!0}});var we=d(ae,2);{var Ye=he=>{Pe(he,{value:"mocks",class:"px-3",children:(Ve,ke)=>{Z();var at=U("Mocks");o(Ve,at)},$$slots:{default:!0}})};I(we,he=>{e(V)&&he(Ye)})}o(S,z)},$$slots:{default:!0}});var ne=d(re,2),G=i(ne);{var se=S=>{Pt(S,{get original(){return e(nt)},get modified(){return e(fe)},onChange:F=>a(fe,F,!0),language:"plaintext",class:"h-full"})},Ee=S=>{Pt(S,{get original(){return e(Le)},get modified(){return e(oe)},onChange:F=>a(oe,F,!0),language:"plaintext",class:"h-full"})},Ge=S=>{Pt(S,{get original(){return e(qe)},get modified(){return e(ve)},onChange:F=>a(ve,F,!0),language:"json",class:"h-full"})},Xe=S=>{Pt(S,{get original(){return e(ze)},get modified(){return e(te)},onChange:F=>a(te,F,!0),language:"json",class:"h-full"})};I(G,S=>{e(k)==="conversation"?S(se):e(k)==="expected_output"?S(Ee,1):e(k)==="context"?S(Ge,2):S(Xe,-1)})}s(ne),s(Q),o(le,ce)};I(xe,le=>{e(T)==="preparing"?le(Ce):e(T)==="error"&&!e(ee)?le(Se,1):e(ee)&&e(B)&&le(Ue,2)})}s(K),o(R,K)},footer:R=>{var K=_r(),xe=Fe(K);rt(xe,{variant:"secondary",onclick:()=>N(!1),children:(Se,Ue)=>{Z();var le=U("Cancel");o(Se,le)},$$slots:{default:!0}});var Ce=d(xe,2);{let Se=c(()=>!e(ee)||e(T)==="preparing"||e(T)==="creating");rt(Ce,{get disabled(){return e(Se)},onclick:$,children:(Ue,le)=>{Z();var ce=U();J(()=>H(ce,e(T)==="creating"?"Creating…":"Create test")),o(Ue,ce)},$$slots:{default:!0}})}o(R,K)},$$slots:{default:!0,footer:!0}}),pt()}var br=y('<span class="text-[13px] leading-none text-rc-gray-400"> </span>'),yr=y('<span><span class="cursor-pointer" title="Show prompt-cache calc"> </span></span>'),wr=y("<span> </span>"),kr=y('<div class="mb-2 ml-7 max-w-[83%]"><button type="button" class="block w-full cursor-pointer overflow-hidden rounded-lg border border-rc-gray-110 bg-rc-gray-800 p-3 text-left hover:bg-rc-gray-700"><pre class="truncate whitespace-pre font-mono text-sm text-rc-gray-100"> </pre></button> <div class="mt-1 flex items-center"><button type="button" class="inline-flex items-center rounded border-0 bg-transparent px-1 py-0.5 text-rc-gray-400 transition-colors hover:bg-rc-gray-900 hover:text-rc-gray-200 disabled:cursor-not-allowed disabled:opacity-50"> </button></div></div>'),Pr=y('<div class="rounded-md border border-red-500 bg-red-950/40 p-3 font-mono text-sm text-red-200"> </div>'),Cr=y("<!> <!> <!> <!> <!>",1),Sr=y('<div class="flex h-full flex-col gap-2"><div class="grid grid-cols-2 gap-2"><div class="flex items-center justify-start"><!></div> <div class="flex items-center justify-end"><!></div></div> <!></div>'),Tr=y('<div class="flex flex-col gap-3"><!> <div class="flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-rc-gray-200"><div><span class="text-rc-gray-400">Timing:</span> </div> <div><span class="text-rc-gray-400">Response time:</span> —</div> <div><span class="text-rc-gray-400">Model:</span> </div></div> <div><!> <div class="mt-2 h-[55vh]"><!></div></div></div>'),Mr=y("<!> <!>",1),Ir=y('<div class="flex h-[65vh] min-h-0 flex-col gap-2"><!> <div class="min-h-0 flex-1"><!></div></div>'),Nr=y('<div class="flex w-full select-text items-baseline gap-2 truncate rounded-md bg-transparent px-2 py-1 text-left text-sm text-rc-gray-200 hover:bg-rc-gray-800/40"><button type="button" class="flex min-w-0 cursor-pointer items-baseline gap-2 truncate bg-transparent p-0 text-left text-sm text-rc-gray-200"><!> <!> <span> </span></button> <!> <!></div> <!> <!> <!> <!>',1);function xn(f,t){ht(t,!0);let N=pe(t,"region",3,null),D=pe(t,"promptEditProposalId",3,null),T=pe(t,"fallbackConversation",3,null),p=j(!1),w=j(!1),v=j("diff"),k=j("response"),E=j("idle"),B=j(!1),ee=j(null);const M=Ot();Et(M.cleanup);function _(r){return r&&typeof r.renderedPrompt=="string"?r.renderedPrompt:null}function fe(r,n){if(r===n)return r.length;const l=Math.min(r.length,n.length);for(let g=0;g<l;g++)if(r.charCodeAt(g)!==n.charCodeAt(g))return g;return l}function oe(r,n){const l=Math.max(r.length,n.length);if(l===0)return 100;const g=fe(r,n);return Math.floor(g/l*100)}function ve(r,n){const l=r.length,g=n.length,h=fe(r,n),q=Math.max(l,g),ue=q===0?100:Math.floor(h/q*100);return{currentLength:l,baselineLength:g,commonPrefixLength:h,denom:q,similarityPct:ue}}function te(r,n){const h=r.slice(0,600),q=r.slice(Math.max(h.length,r.length-600)),ue=Math.max(0,r.length-h.length-q.length);return{length:r.length,head:h,tail:q,omittedChars:ue}}function Me(r){const n=r.llmUsage;return!n||typeof n.promptTokens!="number"||!Number.isFinite(n.promptTokens)||n.promptTokens<=0||typeof n.cachedPromptTokens!="number"||!Number.isFinite(n.cachedPromptTokens)||n.cachedPromptTokens<0?null:Math.max(0,Math.min(100,Math.floor(n.cachedPromptTokens/n.promptTokens*100)))}function ge(r){const n=new WeakSet;try{return JSON.stringify(r,(l,g)=>{if(typeof g=="bigint")return g.toString();if(g instanceof Error)return{name:g.name,message:g.message,stack:g.stack};if(typeof g=="object"&&g!==null){if(n.has(g))return"[Circular]";n.add(g)}return g},2)??""}catch{return String(r)}}function V(r){if(r==null)return"";if(typeof r=="string"){const n=r.trim();if(!n)return"";try{return JSON.stringify(JSON.parse(n),null,2)}catch{return r}}return ge(r)}function He(r){var Re,je,_e;const n=V(r),l=n.split(`
3
- `);if(l.length<=1)return n;const g=(Re=l[0])==null?void 0:Re.trim(),h=(je=l.slice(1).find(bt=>bt.trim()))==null?void 0:je.trim();if(!g||!h)return n;const q=g==="["?"]":"}";if(l.length===3&&((_e=l.at(-1))==null?void 0:_e.trim())===q)return`${g} ${h} ${q}`;const ue=h.endsWith("{")?" }":h.endsWith("[")?" ]":"";return`${g} ${h} …${ue} ${q}`}function nt(r){return new Date(r).toISOString()}function Le(r){if(typeof r!="number"||!Number.isFinite(r))return null;const n=new Date(r);if(Number.isNaN(n.getTime()))return null;const l=String(n.getHours()).padStart(2,"0"),g=String(n.getMinutes()).padStart(2,"0"),h=String(n.getSeconds()).padStart(2,"0");return`${l}:${g}:${h}`}const qe=c(()=>Le(t.trace.createdAt)),ze=c(()=>t.trace.error!=null),Qe=c(()=>`AI: ${t.trace.name}`),A=c(()=>t.trace.name),P=c(()=>{if(!it(t.trace.name))return null;const r=_(t.trace),n=_(t.compareTrace);return r==null||n==null?null:oe(r,n)}),$=c(()=>it(t.trace.name)?Me(t.trace):null),Ie=90,ye=90,Ne=/<break\b[^>]*\/?>/i,De='<break /> tag disables streaming and increases latency. If pauses are not large enough, use "..." instead.';function m(r){return typeof r=="string"&&Ne.test(r)}const C=c(()=>it(t.trace.name)?e($)!=null?e($)===0&&e(P)!=null&&e(P)>=ye?{text:"0% tokens cached. Cache miss",className:"text-red-200"}:e($)>=Ie?{text:`${e($)}% tokens cached`,className:"text-rc-gray-400"}:{text:`${e($)}% tokens cached - move dynamic parts of prompt to the bottom`,className:"text-red-200"}:e(P)!=null?e(P)>=Ie?{text:`${e(P)}%`,className:"text-rc-gray-400"}:{text:`${e(P)}% cached - move dynamic parts of prompt to the bottom`,className:"text-red-200"}:null:null),R=c(()=>m(t.trace.response)?{text:"LLM output has <break /> tags",className:"text-red-200"}:null),K=c(()=>{var Re;if(!it(t.trace.name))return null;const r=_(t.trace),n=_(t.compareTrace),l=r!=null&&n!=null?ve(r,n):null,g=t.trace.llmUsage??null,h=e($),q=h===0&&(l==null?void 0:l.similarityPct)!=null&&l.similarityPct>=ye;return{version:1,labelSource:h!=null?"llmUsage":e(P)!=null?"promptSimilarityFallback":"none",thresholds:{okPct:Ie,cacheMissSimilarityPct:ye},inputs:{llmUsage:g,currentRenderedPrompt:r!=null?te(r):null,baselineRenderedPrompt:n!=null?te(n):null},computed:{cachedTokensPct:h,promptSimilarityPct:(l==null?void 0:l.similarityPct)??null,promptSimilarity:l,cacheMiss:q},decision:{text:((Re=e(C))==null?void 0:Re.text)??null}}}),xe=c(()=>e(K)?ge(e(K)):"{}"),Ce=c(()=>_(t.compareTrace)??""),Se=c(()=>_(t.trace)??""),Ue=c(()=>V(t.trace.response)),le=c(()=>He(t.trace.response)),ce=c(()=>{if(typeof t.trace.response!="string"||!t.trace.response.trim())return!1;try{const r=JSON.parse(t.trace.response);return typeof r=="object"&&r!==null}catch{return!1}}),Te=c(()=>{const r=t.trace.response;if(typeof r!="string")return"json";try{return JSON.parse(r),"json"}catch{return"text"}}),Oe=c(()=>t.trace.stringifiedConversation??""),Be=c(()=>V(t.trace.renderedPrompt)),u=c(()=>V(t.trace.receivedPrompt)),x=c(()=>V(t.trace.receivedContext)),L=c(()=>V(t.trace.schema)),O=c(()=>t.trace.error?ge(t.trace.error):"");function W(r){return r==null?"":typeof r=="string"?r:ge(r)}const ie=c(()=>W(t.trace.receivedPrompt)),Q=c(()=>W(t.trace.renderedPrompt));let re=j(null),ne=j(null);async function G(r){try{const n=r==="raw"?e(ie):e(Q);await navigator.clipboard.writeText(n),a(re,r,!0),e(ne)&&clearTimeout(e(ne)),a(ne,window.setTimeout(()=>{a(re,null),a(ne,null)},2e3),!0)}catch(n){console.error("Failed to copy prompt",n)}}function se(r,n){var g;const l=new URLSearchParams({step:t.trace.name,test:n});return(g=N())!=null&&g.trim()&&l.set("region",N().trim()),D()&&l.set("promptEdit",D()),`/edit/${encodeURIComponent(r)}/tests?${l.toString()}`}async function Ee(){const r=(t.agentId||"").trim();if(!r||e(E)!=="idle")return;let n=null;try{const l=cr(t.trace,{fallbackConversation:T(),fallbackRuntimeContext:t.runtimeContext});if(t.testCreationMode==="pii-sanitized"){a(ee,l,!0),a(B,!0);return}n=window.open("about:blank","_blank"),n&&(n.opener=null),a(E,"adding");const g=await St.tests.addTest.mutate({agent:r,region:N(),seed:l}),h=se(r,g.id);n?n.location.replace(h):window.open(h,"_blank","noopener"),Ge()}catch(l){n==null||n.close(),console.error("Failed to add step test",l),a(E,"failed"),window.setTimeout(()=>a(E,"idle"),3e3)}}function Ge(){a(E,"added"),window.setTimeout(()=>a(E,"idle"),3e3)}var Xe=Nr(),S=Fe(Xe),F=i(S),z=i(F);{let r=c(()=>e(ze)?"close":"checkmark"),n=c(()=>e(ze)?"self-center text-red-400":"self-center text-rc-green-200");Lt(z,{get name(){return e(r)},width:18,height:18,get class(){return e(n)}})}var b=d(z,2);{var X=r=>{var n=br(),l=i(n,!0);s(n),J(()=>H(l,e(qe))),o(r,n)};I(b,r=>{e(qe)&&r(X)})}var ae=d(b,2),we=i(ae);s(ae),s(F);var Ye=d(F,2);{var he=r=>{var n=yr(),l=i(n),g=i(l,!0);s(l),s(n),J(()=>{We(n,1,`shrink-0 text-xs ${e(C).className}`),H(g,e(C).text)}),be("click",l,h=>{h.stopPropagation(),!M.shouldSuppressClick(h)&&e(K)&&(a(v,"diff"),a(w,!0))}),o(r,n)};I(Ye,r=>{e(C)!=null&&r(he)})}var Ve=d(Ye,2);{var ke=r=>{var n=wr();At(n,"title",De);var l=i(n,!0);s(n),J(()=>{We(n,1,`shrink-0 text-xs ${e(R).className}`),H(l,e(R).text)}),o(r,n)};I(Ve,r=>{e(R)!=null&&r(ke)})}s(S);var at=d(S,2);{var Tt=r=>{var n=kr(),l=i(n),g=i(l),h=i(g,!0);s(g),s(l);var q=d(l,2),ue=i(q),Re=i(ue,!0);s(ue),s(q),s(n),J(je=>{H(h,e(le)),ue.disabled=je,H(Re,e(E)==="adding"?"Adding…":e(E)==="added"?"Added":e(E)==="failed"?"Failed":"Add test")},[()=>{var je;return!((je=t.agentId)!=null&&je.trim())||typeof t.trace.receivedContext>"u"||e(E)!=="idle"||e(B)}]),be("click",l,()=>{a(k,"response"),a(p,!0)}),be("click",ue,Ee),o(r,n)};I(at,r=>{e(ce)&&r(Tt)})}var _t=d(at,2);{var Mt=r=>{{let n=c(()=>(t.agentId||"").trim());qt(r,{get agent(){return e(n)},get region(){return N()},get seed(){return e(ee)},onCreated:Ge,get open(){return e(B)},set open(l){a(B,l,!0)}})}};I(_t,r=>{e(ee)&&r(Mt)})}var me=d(_t,2);{var de=r=>{vt(r,{get title(){return e(Qe)},class:"!w-[85vw] !max-w-5xl",get open(){return e(p)},set open(l){a(p,l,!0)},children:l=>{var g=Tr(),h=i(g);{var q=Y=>{var Ze=Pr(),$e=i(Ze,!0);s(Ze),J(()=>H($e,e(O))),o(Y,Ze)};I(h,Y=>{e(O)&&Y(q)})}var ue=d(h,2),Re=i(ue),je=d(i(Re));s(Re);var _e=d(Re,4),bt=d(i(_e));s(_e),s(ue);var st=d(ue,2),lt=i(st);mt(lt,{get value(){return e(k)},ariaLabel:"Step trace tabs",onChange:({value:Y})=>a(k,Y,!0),children:(Y,Ze)=>{var $e=Cr(),ot=Fe($e);Pe(ot,{value:"response",class:"px-3",children:(Ae,et)=>{Z();var Je=U("Response");o(Ae,Je)},$$slots:{default:!0}});var wt=d(ot,2);Pe(wt,{value:"conversation",class:"px-3",children:(Ae,et)=>{Z();var Je=U("Conversation");o(Ae,Je)},$$slots:{default:!0}});var ut=d(wt,2);Pe(ut,{value:"prompt",class:"px-3",children:(Ae,et)=>{Z();var Je=U("Prompt");o(Ae,Je)},$$slots:{default:!0}});var kt=d(ut,2);Pe(kt,{value:"context",class:"px-3",children:(Ae,et)=>{Z();var Je=U("Context");o(Ae,Je)},$$slots:{default:!0}});var Rt=d(kt,2);Pe(Rt,{value:"schema",class:"px-3",children:(Ae,et)=>{Z();var Je=U("Schema");o(Ae,Je)},$$slots:{default:!0}}),o(Y,$e)},$$slots:{default:!0}});var yt=d(lt,2),ct=i(yt);{var Nt=Y=>{tt(Y,{get value(){return e(Ue)},get language(){return e(Te)},class:"h-full"})},dt=Y=>{tt(Y,{get value(){return e(Oe)},language:"text",class:"h-full"})},zt=Y=>{var Ze=Sr(),$e=i(Ze),ot=i($e),wt=i(ot);{let Ae=c(()=>!e(ie).trim());rt(wt,{variant:"secondary",size:"small",get disabled(){return e(Ae)},onclick:()=>G("raw"),children:(et,Je)=>{Z();var ft=U();J(()=>H(ft,e(re)==="raw"?"Copied raw prompt":"Copy raw prompt")),o(et,ft)},$$slots:{default:!0}})}s(ot);var ut=d(ot,2),kt=i(ut);{let Ae=c(()=>!e(Q).trim());rt(kt,{variant:"secondary",size:"small",get disabled(){return e(Ae)},onclick:()=>G("rendered"),children:(et,Je)=>{Z();var ft=U();J(()=>H(ft,e(re)==="rendered"?"Copied rendered prompt":"Copy rendered prompt")),o(et,ft)},$$slots:{default:!0}})}s(ut),s($e);var Rt=d($e,2);jt(Rt,{get original(){return e(u)},get modified(){return e(Be)},language:"markdown",class:"min-h-0 flex-1"}),s(Ze),o(Y,Ze)},Ut=Y=>{tt(Y,{get value(){return e(x)},language:"json",class:"h-full"})},Bt=Y=>{tt(Y,{get value(){return e(L)},language:"json",class:"h-full"})};I(ct,Y=>{e(k)==="response"?Y(Nt):e(k)==="conversation"?Y(dt,1):e(k)==="prompt"?Y(zt,2):e(k)==="context"?Y(Ut,3):Y(Bt,-1)})}s(yt),s(st),s(g),J(Y=>{H(je,` ${Y??""}`),H(bt,` ${t.trace.model??"—"??""}`)},[()=>typeof t.trace.createdAt=="number"?nt(t.trace.createdAt):"—"]),o(l,g)},$$slots:{default:!0}})};I(me,r=>{e(p)&&r(de)})}var Ke=d(me,2);{var It=r=>{vt(r,{title:"Prompt cache calc",class:"!w-[85vw] !max-w-5xl",get open(){return e(w)},set open(l){a(w,l,!0)},children:l=>{var g=Ir(),h=i(g);mt(h,{get value(){return e(v)},ariaLabel:"Prompt cache calc tabs",onChange:({value:_e})=>a(v,_e,!0),children:(_e,bt)=>{var st=Mr(),lt=Fe(st);Pe(lt,{value:"diff",class:"px-3",children:(ct,Nt)=>{Z();var dt=U("Diff");o(ct,dt)},$$slots:{default:!0}});var yt=d(lt,2);Pe(yt,{value:"raw",class:"px-3",children:(ct,Nt)=>{Z();var dt=U("Raw");o(ct,dt)},$$slots:{default:!0}}),o(_e,st)},$$slots:{default:!0}});var q=d(h,2),ue=i(q);{var Re=_e=>{jt(_e,{get original(){return e(Ce)},get modified(){return e(Se)},language:"markdown",class:"h-full"})},je=_e=>{tt(_e,{get value(){return e(xe)},language:"json",class:"h-full"})};I(ue,_e=>{e(v)==="diff"?_e(Re):_e(je,-1)})}s(q),s(g),o(l,g)},$$slots:{default:!0}})};I(Ke,r=>{e(w)&&r(It)})}J(()=>{We(ae,1,Jt(e(ze)?"text-red-200":"")),H(we,`AI: ${e(A)??""}`)}),be("pointerdown",F,function(...r){var n;(n=M.onPointerDown)==null||n.apply(this,r)}),be("click",F,r=>{M.shouldSuppressClick(r)||a(p,!0)}),o(f,Xe),pt()}Dt(["pointerdown","click"]);var Rr=y('<span class="text-[13px] leading-none text-rc-gray-400"> </span>'),Ar=y('<div class="min-w-0 break-words"> </div>'),Dr=y('<div class="min-w-0 break-words">Conversation hanged up.</div>'),Er=y('<div class="flex w-full justify-center"><div role="button" tabindex="0"><div class="flex flex-wrap items-baseline gap-x-2 gap-y-0"><!> <!></div></div></div>'),Lr=y('<div class="mr-2 mt-1 flex h-5 w-5 shrink-0 items-center justify-center rounded-sm bg-rc-green-700 text-sm uppercase text-rc-gray-100 backdrop-blur-md"> </div>'),Or=y('<button type="button" title="Edit this message" class="mr-2 mt-1 shrink-0 self-start rounded p-1 text-rc-gray-500 opacity-80 transition-colors hover:bg-rc-gray-900 hover:text-rc-gray-200 focus:outline-none focus-visible:outline-none"><!></button>'),jr=y('<div class="mt-1 text-right text-xs text-rc-gray-200/70"> </div>'),Jr=y('<button type="button"><!></button>'),Fr=y('<button type="button" class="inline-flex items-center text-nowrap rounded border-0 bg-transparent px-1 py-0.5 text-rc-gray-400 transition-colors hover:bg-rc-gray-900 hover:text-rc-gray-200 focus:outline-none focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent disabled:hover:text-rc-gray-400">Analyze</button>'),Hr=y('<button type="button" class="inline-flex items-center text-nowrap rounded border-0 bg-transparent px-1 py-0.5 text-rc-gray-400 transition-colors hover:bg-rc-gray-900 hover:text-rc-gray-200 focus:outline-none focus-visible:outline-none">Regenerate</button>'),qr=y('<button type="button" class="inline-flex items-center text-nowrap rounded border-0 bg-transparent px-1 py-0.5 text-rc-gray-400 transition-colors hover:bg-rc-gray-900 hover:text-rc-gray-200 focus:outline-none focus-visible:outline-none">See variants</button>'),zr=y('<div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1"><!> <!> <!> <!></div>'),Ur=y('<!> <!> <div><div role="button" tabindex="0" class="cursor-pointer select-text"><div><div> </div> <!></div></div> <!></div>',1),Br=y('<div class="rounded-md border border-red-500 bg-red-950/40 p-3 font-mono text-sm text-red-200"> </div>'),Vr=y("<!> <!>",1),Wr=y('<div class="whitespace-pre-wrap break-words rounded-md border border-rc-gray-650 bg-rc-gray-900/60 p-3 text-sm text-rc-gray-100"> </div>'),Gr=y('<div class="flex flex-col gap-3"><!> <div class="flex items-center justify-between gap-2 text-sm text-rc-gray-200"><div class="text-rc-gray-400"> </div> <!></div> <div><!> <div class="mt-2 h-[55vh] overflow-auto"><!></div></div></div>'),Xr=y("<div><!></div> <!> <!>",1);function hn(f,t){ht(t,!0);let N=pe(t,"region",3,null),D=pe(t,"promptEditProposalId",3,null),T=pe(t,"allowAddTest",3,!0),p=pe(t,"testSourceStep",3,void 0),w=pe(t,"testEntries",3,void 0),v=pe(t,"requireTestSourceStep",3,!1),k=pe(t,"analyzeDisabled",3,!1),E=pe(t,"showSeeVariants",3,!1),B=pe(t,"variantSelectionState",3,"none"),ee=pe(t,"suppressActionRow",3,!1),M=j(!1),_=j("idle"),fe=j("content"),oe=j(!1),ve=j(null);const te=Ot();Et(te.cleanup);function Me(u){return u?u.split("/").at(-1)??u:""}function ge(u){const x=Me(u).trim().charAt(0);return x?x.toUpperCase():"?"}const V=c(()=>{var u;return t.trace.eventName==="finished-main-streaming-step"||t.trace.eventName==="sent-message"?"agent":t.trace.role==="system"||((u=t.trace)==null?void 0:u.bosunInputMessageSender)==="system"?"system":(t.trace.role==="user","user")}),He=c(()=>e(V)==="agent"?"max-w-[83%]":e(V)==="user"?"max-w-[90%] sm:max-w-[80%] md:max-w-[70%]":e(V)==="system"?"max-w-[90%] sm:max-w-[85%] md:max-w-[75%]":""),nt=c(()=>{var u;return(e(V)==="user"||e(V)==="system")&&!!t.onRevert&&((u=t.trace)==null?void 0:u.bosunPrevStateId)!==void 0}),Le=c(()=>t.trace.error!=null),qe=c(()=>B()==="source");function ze(){a(M,!0),a(fe,"content")}function Qe(u){var x;if(!te.shouldSuppressClick(u)){if(e(qe)){(x=t.onSelectInVariantMode)==null||x.call(t,t.trace);return}ze()}}function A(u){if(typeof u!="number"||!Number.isFinite(u))return null;const x=new Date(u);if(Number.isNaN(x.getTime()))return null;const L=String(x.getHours()).padStart(2,"0"),O=String(x.getMinutes()).padStart(2,"0"),W=String(x.getSeconds()).padStart(2,"0");return`${L}:${O}:${W}`}const P=c(()=>{var u;return A((u=t.trace)==null?void 0:u.createdAt)});function $(u){try{return JSON.stringify(u??null,null,2)}catch{return String(u)}}async function Ie(){try{await navigator.clipboard.writeText($(t.trace))}catch(u){console.error("Failed to copy",u)}}function ye(){return T()&&e(V)==="agent"&&t.trace.eventName!=="transfer-requested"&&(t.trace.eventName==="finished-main-streaming-step"||t.trace.eventName==="sent-message")}function Ne(){return!ye()||!(t.agentId&&t.agentId.trim())?!1:v()?!!p()&&typeof p().receivedContext<"u":!0}function De(){return e(V)==="agent"&&t.trace.eventName!=="transfer-requested"&&!!(t.agentId&&t.agentId.trim())&&(t.trace.eventName==="finished-main-streaming-step"||t.trace.eventName==="sent-message")}function m(){return De()}async function C(){var x;let u=null;try{a(_,"idle");const L=(t.agentId||"").trim();if(!L)throw new Error("Agent id is not available; cannot add test");const O=lr({entries:w()??Gt,trace:t.trace,sourceStep:p(),fallbackRuntimeContext:t.context});if(t.testCreationMode==="pii-sanitized"){a(ve,O,!0),a(oe,!0);return}u=window.open("about:blank","_blank"),u&&(u.opener=null);const W=await St.tests.addTest.mutate({agent:L,region:N(),seed:O}),ie=new URLSearchParams({step:O.step||"main",test:W.id});(x=N())!=null&&x.trim()&&ie.set("region",N().trim()),D()&&ie.set("promptEdit",D());const Q=`/edit/${encodeURIComponent(L)}/tests?${ie.toString()}`;u?u.location.replace(Q):window.open(Q,"_blank","noopener"),R()}catch(L){u==null||u.close(),console.error("Failed to add test",L),a(_,"error"),setTimeout(()=>a(_,"idle"),4e3)}}function R(){a(_,"ok"),setTimeout(()=>a(_,"idle"),3e3)}var K=Xr(),xe=Fe(K);let Ce;var Se=i(xe);{var Ue=u=>{var x=Er(),L=i(x),O=i(L),W=i(O);{var ie=G=>{var se=Rr(),Ee=i(se,!0);s(se),J(()=>H(Ee,e(P))),o(G,se)};I(W,G=>{e(P)&&G(ie)})}var Q=d(W,2);{var re=G=>{var se=Ar(),Ee=i(se);s(se),J(()=>H(Ee,`Transfer requested: ${t.trace.content??""}`)),o(G,se)},ne=G=>{var se=Dr();o(G,se)};I(Q,G=>{t.trace.eventName==="transfer-requested"?G(re):G(ne,-1)})}s(O),s(L),s(x),J(()=>We(L,1,`cursor-pointer select-text rounded-full border border-rc-gray-650 bg-rc-gray-800/40 px-4 py-2 text-sm text-rc-gray-100 ${e(Le)?"border-red-500 bg-red-950/30 text-red-200":""}`)),be("pointerdown",L,function(...G){var se;(se=te.onPointerDown)==null||se.apply(this,G)}),be("click",L,G=>{te.shouldSuppressClick(G)||ze()}),o(u,x)},le=u=>{var x=Ur(),L=Fe(x);{var O=z=>{var b=Lr(),X=i(b,!0);s(b),J((ae,we)=>{At(b,"title",ae),H(X,we)},[()=>Me(t.agentId),()=>ge(t.agentId)]),o(z,b)};I(L,z=>{e(V)==="agent"&&t.agentId&&z(O)})}var W=d(L,2);{var ie=z=>{var b=Or(),X=i(b);Lt(X,{name:"undo",width:16,height:16}),s(b),be("click",b,ae=>{var we;ae.stopPropagation(),(we=t.onRevert)==null||we.call(t,t.trace)}),o(z,b)};I(W,z=>{e(nt)&&z(ie)})}var Q=d(W,2),re=i(Q),ne=i(re),G=i(ne),se=i(G,!0);s(G);var Ee=d(G,2);{var Ge=z=>{var b=jr(),X=i(b,!0);s(b),J(()=>H(X,e(P))),o(z,b)};I(Ee,z=>{e(P)&&z(Ge)})}s(ne),s(re);var Xe=d(re,2);{var S=z=>{var b=zr(),X=i(b);{var ae=me=>{var de=Jr(),Ke=i(de);{var It=h=>{var q=U("Added");o(h,q)},r=h=>{var q=U("Failed");o(h,q)},n=h=>{var q=U("Select agent to add test");o(h,q)},l=c(()=>!Ne()),g=h=>{var q=U("Add test");o(h,q)};I(Ke,h=>{e(_)==="ok"?h(It):e(_)==="error"?h(r,1):e(l)?h(n,2):h(g,-1)})}s(de),J((h,q,ue)=>{de.disabled=h,At(de,"title",q),We(de,1,`inline-flex items-center text-nowrap rounded border-0 bg-transparent px-1 py-0.5 transition-colors focus:outline-none focus-visible:outline-none ${ue??""}`)},[()=>!Ne()||e(_)!=="idle"||e(oe),()=>Ne()?void 0:"Select an agent in the sidebar before adding a test",()=>e(_)!=="idle"||!Ne()?"cursor-default text-rc-gray-400":"cursor-pointer text-rc-gray-400 hover:bg-rc-gray-900 hover:text-rc-gray-200"]),be("click",de,h=>{h.stopPropagation(),C()}),o(me,de)},we=c(()=>ye());I(X,me=>{e(we)&&me(ae)})}var Ye=d(X,2);{var he=me=>{var de=Fr();J(()=>de.disabled=k()),be("click",de,Ke=>{Ke.stopPropagation(),t.onAnalyze(t.trace)}),o(me,de)},Ve=c(()=>De()&&t.onAnalyze);I(Ye,me=>{e(Ve)&&me(he)})}var ke=d(Ye,2);{var at=me=>{var de=Hr();be("click",de,Ke=>{Ke.stopPropagation(),t.onRegenerate(t.trace)}),o(me,de)},Tt=c(()=>m()&&t.onRegenerate);I(ke,me=>{e(Tt)&&me(at)})}var _t=d(ke,2);{var Mt=me=>{var de=qr();be("click",de,Ke=>{Ke.stopPropagation(),t.onSeeVariants(t.trace)}),o(me,de)};I(_t,me=>{E()&&t.onSeeVariants&&me(Mt)})}s(b),o(z,b)},F=c(()=>!ee()&&(De()||ye()||m()&&t.onRegenerate||E()));I(Xe,z=>{e(F)&&z(S)})}s(Q),J(()=>{We(Q,1,`min-w-0 ${e(He)??""}`),We(ne,1,`rounded-lg ${e(V)==="system"?"justify-between whitespace-pre-line break-words border border-emerald-500 text-emerald-500":e(qe)?"w-full whitespace-pre-line break-words border border-rc-green-450 bg-transparent backdrop-blur-md hover:bg-rc-green-700":e(V)!=="user"?"w-full whitespace-pre-line break-words bg-rc-green-700 backdrop-blur-md":"whitespace-pre-line break-words bg-rc-gray-700"} ${e(V)==="system"||e(qe)?"":"border-thin border-rc-gray-110"} p-2 pt-1 text-rc-gray-100 ${e(Le)?"border-red-500 bg-red-950/30 text-red-200":""}`),H(se,t.trace.content)}),be("pointerdown",re,function(...z){var b;(b=te.onPointerDown)==null||b.apply(this,z)}),be("click",re,Qe),o(u,x)};I(Se,u=>{t.trace.eventName==="transfer-requested"||t.trace.eventName==="hangup-requested"?u(Ue):u(le,-1)})}s(xe);var ce=d(xe,2);{var Te=u=>{{const x=O=>{var W=Gr(),ie=i(W);{var Q=b=>{var X=Br(),ae=i(X,!0);s(X),J(we=>H(ae,we),[()=>$(t.trace.error)]),o(b,X)};I(ie,b=>{e(Le)&&b(Q)})}var re=d(ie,2),ne=i(re),G=i(ne);s(ne);var se=d(ne,2);rt(se,{variant:"secondary",size:"small",onclick:Ie,children:(b,X)=>{Z();var ae=U("Copy raw trace");o(b,ae)},$$slots:{default:!0}}),s(re);var Ee=d(re,2),Ge=i(Ee);mt(Ge,{get value(){return e(fe)},ariaLabel:"Conversational trace tabs",onChange:({value:b})=>a(fe,b,!0),children:(b,X)=>{var ae=Vr(),we=Fe(ae);Pe(we,{value:"content",class:"px-3",children:(he,Ve)=>{Z();var ke=U("Content");o(he,ke)},$$slots:{default:!0}});var Ye=d(we,2);Pe(Ye,{value:"raw",class:"px-3",children:(he,Ve)=>{Z();var ke=U("Raw");o(he,ke)},$$slots:{default:!0}}),o(b,ae)},$$slots:{default:!0}});var Xe=d(Ge,2),S=i(Xe);{var F=b=>{var X=Wr(),ae=i(X,!0);s(X),J(()=>H(ae,t.trace.content)),o(b,X)},z=b=>{{let X=c(()=>$(t.trace));tt(b,{get value(){return e(X)},language:"json",class:"h-full"})}};I(S,b=>{e(fe)==="content"?b(F):b(z,-1)})}s(Xe),s(Ee),s(W),J(()=>H(G,`${t.trace.role??""} • ${t.trace.medium??""}`)),o(O,W)};let L=c(()=>`Conversation: ${t.trace.eventName}`);vt(u,{get title(){return e(L)},class:"!w-[80vw] !max-w-4xl",get open(){return e(M)},set open(O){a(M,O,!0)},children:x,$$slots:{default:!0}})}};I(ce,u=>{e(M)&&u(Te)})}var Oe=d(ce,2);{var Be=u=>{{let x=c(()=>(t.agentId||"").trim());qt(u,{get agent(){return e(x)},get region(){return N()},get seed(){return e(ve)},onCreated:R,get open(){return e(oe)},set open(L){a(oe,L,!0)}})}};I(Oe,u=>{e(ve)&&u(Be)})}J(()=>Ce=We(xe,1,"group mb-2 flex w-full items-start",null,Ce,{"justify-end":e(V)==="user"||e(V)==="system"})),o(f,K),pt()}Dt(["pointerdown","click"]);export{gn as C,xn as a,hn as b,ir as c,gt as d,nr as e,sr as f,Ft as m};
@@ -1 +0,0 @@
1
- import{a as r}from"../chunks/B3KppP__.js";import{y as t}from"../chunks/g-PBecQM.js";export{t as load_css,r as start};