@recombine-ai/bosun 0.3.12 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/build/client/_app/immutable/assets/0.B5gApcUL.css +1 -0
  2. package/build/client/_app/immutable/assets/0.B5gApcUL.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.B5gApcUL.css.gz +0 -0
  4. package/build/client/_app/immutable/chunks/8B3OPwlB.js +1 -0
  5. package/build/client/_app/immutable/chunks/8B3OPwlB.js.br +2 -0
  6. package/build/client/_app/immutable/chunks/8B3OPwlB.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/B5-6Ezv3.js +1 -0
  8. package/build/client/_app/immutable/chunks/B5-6Ezv3.js.br +2 -0
  9. package/build/client/_app/immutable/chunks/B5-6Ezv3.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/BA8mqPb-.js +1 -0
  11. package/build/client/_app/immutable/chunks/BA8mqPb-.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/BA8mqPb-.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/BCG4zvjp.js +2 -0
  14. package/build/client/_app/immutable/chunks/BCG4zvjp.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BCG4zvjp.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{oeB0PCTX.js → BMYSavKM.js} +1 -1
  17. package/build/client/_app/immutable/chunks/BMYSavKM.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BMYSavKM.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{TO5ESkEd.js → BY8d35y9.js} +1 -1
  20. package/build/client/_app/immutable/chunks/BY8d35y9.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BY8d35y9.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{CFwu9ET3.js → BdZ7JhAm.js} +1 -1
  23. package/build/client/_app/immutable/chunks/BdZ7JhAm.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BdZ7JhAm.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{BWo2H__f.js → BmadykGs.js} +3 -3
  26. package/build/client/_app/immutable/chunks/BmadykGs.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BmadykGs.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/Bmb8cHfR.js +1 -0
  29. package/build/client/_app/immutable/chunks/Bmb8cHfR.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/Bmb8cHfR.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/Bx2X1niE.js +1 -0
  32. package/build/client/_app/immutable/chunks/Bx2X1niE.js.br +2 -0
  33. package/build/client/_app/immutable/chunks/Bx2X1niE.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/C-xhOnoy.js +1 -0
  35. package/build/client/_app/immutable/chunks/C-xhOnoy.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/C-xhOnoy.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/C1FmrZbK.js +1 -0
  38. package/build/client/_app/immutable/chunks/C1FmrZbK.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/C1FmrZbK.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/{Bdb5tyDH.js → C4mbwMvt.js} +1 -1
  41. package/build/client/_app/immutable/chunks/C4mbwMvt.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/C4mbwMvt.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{CdzpH-Ca.js → CAFoob5N.js} +1 -1
  44. package/build/client/_app/immutable/chunks/CAFoob5N.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/CAFoob5N.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/{Bk1rEq7o.js → CGinwM47.js} +1 -1
  47. package/build/client/_app/immutable/chunks/CGinwM47.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/CGinwM47.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/CI-reiW2.js +1 -0
  50. package/build/client/_app/immutable/chunks/CI-reiW2.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/CI-reiW2.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/CNPsxMFi.js +1 -0
  53. package/build/client/_app/immutable/chunks/CNPsxMFi.js.br +1 -0
  54. package/build/client/_app/immutable/chunks/CNPsxMFi.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/C_ZSt1CI.js +2 -0
  56. package/build/client/_app/immutable/chunks/C_ZSt1CI.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/C_ZSt1CI.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/{CVHvdSBf.js → CfbYRn5k.js} +1 -1
  59. package/build/client/_app/immutable/chunks/CfbYRn5k.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/{CVHvdSBf.js.gz → CfbYRn5k.js.gz} +0 -0
  61. package/build/client/_app/immutable/chunks/CqcOmWJt.js +1 -0
  62. package/build/client/_app/immutable/chunks/CqcOmWJt.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/CqcOmWJt.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/{CNMNmz2q.js → CrxwEwqu.js} +1 -1
  65. package/build/client/_app/immutable/chunks/CrxwEwqu.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/CrxwEwqu.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/CsYbWoTD.js +8 -0
  68. package/build/client/_app/immutable/chunks/CsYbWoTD.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/CsYbWoTD.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/{CIIE25ox.js → CwmAWymP.js} +1 -1
  71. package/build/client/_app/immutable/chunks/CwmAWymP.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/CwmAWymP.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/CxPv-oiS.js +1 -0
  74. package/build/client/_app/immutable/chunks/CxPv-oiS.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/CxPv-oiS.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/{DOatwnEt.js → DDMPVpvs.js} +1 -1
  77. package/build/client/_app/immutable/chunks/DDMPVpvs.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/DDMPVpvs.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/DGa-EyU2.js +1 -0
  80. package/build/client/_app/immutable/chunks/DGa-EyU2.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/DGa-EyU2.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/{BfHUxT3G.js → DLQqXQ6R.js} +7 -7
  83. package/build/client/_app/immutable/chunks/DLQqXQ6R.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/DLQqXQ6R.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/DQA6NP5y.js +2 -0
  86. package/build/client/_app/immutable/chunks/DQA6NP5y.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/DQA6NP5y.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/{HPBQctDD.js → DRIMs3uA.js} +1 -1
  89. package/build/client/_app/immutable/chunks/DRIMs3uA.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/DRIMs3uA.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/{ByQey8Oa.js → DUeN9t8P.js} +1 -1
  92. package/build/client/_app/immutable/chunks/DUeN9t8P.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/DUeN9t8P.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{KDW88ZZa.js → DWH0347h.js} +1 -1
  95. package/build/client/_app/immutable/chunks/DWH0347h.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/DWH0347h.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{BnxfhlSj.js → DZxMt77D.js} +1 -1
  98. package/build/client/_app/immutable/chunks/DZxMt77D.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/DZxMt77D.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/DaR1ExPh.js +1 -0
  101. package/build/client/_app/immutable/chunks/DaR1ExPh.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/DaR1ExPh.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/{rtsVMmSs.js → DjDhNM9l.js} +1 -1
  104. package/build/client/_app/immutable/chunks/DjDhNM9l.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/DjDhNM9l.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/Dl6q6wVH.js +1 -0
  107. package/build/client/_app/immutable/chunks/Dl6q6wVH.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/Dl6q6wVH.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/DptDdzMi.js +4 -0
  110. package/build/client/_app/immutable/chunks/DptDdzMi.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/DptDdzMi.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/JA_7cQFn.js +1 -0
  113. package/build/client/_app/immutable/chunks/JA_7cQFn.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/JA_7cQFn.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/{BqROrg0C.js → OMeqFb0I.js} +1 -1
  116. package/build/client/_app/immutable/chunks/OMeqFb0I.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/OMeqFb0I.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/{Ct9HfpvA.js → ZGfwyPNq.js} +1 -1
  119. package/build/client/_app/immutable/chunks/ZGfwyPNq.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/ZGfwyPNq.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/{DSfxalyG.js → bynEV6cE.js} +1 -1
  122. package/build/client/_app/immutable/chunks/bynEV6cE.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/bynEV6cE.js.gz +0 -0
  124. package/build/client/_app/immutable/chunks/i_HX2z3K.js +1 -0
  125. package/build/client/_app/immutable/chunks/i_HX2z3K.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/i_HX2z3K.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/{yWz0pZR0.js → wDFujNbC.js} +1 -1
  128. package/build/client/_app/immutable/chunks/wDFujNbC.js.br +0 -0
  129. package/build/client/_app/immutable/chunks/wDFujNbC.js.gz +0 -0
  130. package/build/client/_app/immutable/chunks/{CZPhtqrs.js → wtOMB7ao.js} +3 -3
  131. package/build/client/_app/immutable/chunks/wtOMB7ao.js.br +0 -0
  132. package/build/client/_app/immutable/chunks/wtOMB7ao.js.gz +0 -0
  133. package/build/client/_app/immutable/entry/app.DfqDSpBG.js +2 -0
  134. package/build/client/_app/immutable/entry/app.DfqDSpBG.js.br +0 -0
  135. package/build/client/_app/immutable/entry/app.DfqDSpBG.js.gz +0 -0
  136. package/build/client/_app/immutable/entry/start.Duif51BE.js +1 -0
  137. package/build/client/_app/immutable/entry/start.Duif51BE.js.br +2 -0
  138. package/build/client/_app/immutable/entry/start.Duif51BE.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/{0.CwdXLzyE.js → 0.Dub0qZPU.js} +1 -1
  140. package/build/client/_app/immutable/nodes/0.Dub0qZPU.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/0.Dub0qZPU.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/1.DsLuferm.js +1 -0
  143. package/build/client/_app/immutable/nodes/1.DsLuferm.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/1.DsLuferm.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/{13.DaAF9e8t.js → 14.zP-B7lEl.js} +1 -1
  146. package/build/client/_app/immutable/nodes/14.zP-B7lEl.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/14.zP-B7lEl.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/{14.BcXGBqPj.js → 15.D2YLTl3S.js} +3 -3
  149. package/build/client/_app/immutable/nodes/15.D2YLTl3S.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/15.D2YLTl3S.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/2.BbzjrdMu.js +35 -0
  152. package/build/client/_app/immutable/nodes/2.BbzjrdMu.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/2.BbzjrdMu.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/3.CS8k_54b.js +1 -0
  155. package/build/client/_app/immutable/nodes/3.CS8k_54b.js.br +0 -0
  156. package/build/client/_app/immutable/nodes/3.CS8k_54b.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/4.DBO0gLSr.js +1 -0
  158. package/build/client/_app/immutable/nodes/4.DBO0gLSr.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/4.DBO0gLSr.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/{5.CqUx8Ggk.js → 5.BpnPdti2.js} +1 -1
  161. package/build/client/_app/immutable/nodes/5.BpnPdti2.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/5.BpnPdti2.js.gz +0 -0
  163. package/build/client/_app/immutable/nodes/6.CkeP1yO3.js +1 -0
  164. package/build/client/_app/immutable/nodes/6.CkeP1yO3.js.br +0 -0
  165. package/build/client/_app/immutable/nodes/6.CkeP1yO3.js.gz +0 -0
  166. package/build/client/_app/immutable/nodes/7.CB2Z5SOz.js +2 -0
  167. package/build/client/_app/immutable/nodes/7.CB2Z5SOz.js.br +0 -0
  168. package/build/client/_app/immutable/nodes/7.CB2Z5SOz.js.gz +0 -0
  169. package/build/client/_app/immutable/nodes/{7.B6QVJ_di.js → 8.ARGsrw2j.js} +2 -2
  170. package/build/client/_app/immutable/nodes/8.ARGsrw2j.js.br +0 -0
  171. package/build/client/_app/immutable/nodes/8.ARGsrw2j.js.gz +0 -0
  172. package/build/client/_app/immutable/nodes/9.C3E_sxSn.js +5 -0
  173. package/build/client/_app/immutable/nodes/9.C3E_sxSn.js.br +0 -0
  174. package/build/client/_app/immutable/nodes/9.C3E_sxSn.js.gz +0 -0
  175. package/build/client/_app/version.json +1 -1
  176. package/build/client/_app/version.json.br +0 -0
  177. package/build/client/_app/version.json.gz +0 -0
  178. package/build/server/chunks/0-CbLBIQC7.js +9 -0
  179. package/build/server/chunks/0-CbLBIQC7.js.map +1 -0
  180. package/build/server/chunks/1-gh5xP1Bp.js +9 -0
  181. package/build/server/chunks/1-gh5xP1Bp.js.map +1 -0
  182. package/build/server/chunks/{9-W6XYayeK.js → 10-DZjMDIvS.js} +3 -3
  183. package/build/server/chunks/10-DZjMDIvS.js.map +1 -0
  184. package/build/server/chunks/{10-C7WLHR92.js → 11-D6F4I8KX.js} +3 -3
  185. package/build/server/chunks/{10-C7WLHR92.js.map → 11-D6F4I8KX.js.map} +1 -1
  186. package/build/server/chunks/{11-CPYwUx-7.js → 12-2vbUmx0n.js} +3 -3
  187. package/build/server/chunks/{11-CPYwUx-7.js.map → 12-2vbUmx0n.js.map} +1 -1
  188. package/build/server/chunks/{12-C5OSs5Op.js → 13-11CHqz2G.js} +3 -3
  189. package/build/server/chunks/{12-C5OSs5Op.js.map → 13-11CHqz2G.js.map} +1 -1
  190. package/build/server/chunks/{13-DPcsc1p-.js → 14-C4iOZL2L.js} +3 -3
  191. package/build/server/chunks/14-C4iOZL2L.js.map +1 -0
  192. package/build/server/chunks/15-kvHsGxjF.js +9 -0
  193. package/build/server/chunks/15-kvHsGxjF.js.map +1 -0
  194. package/build/server/chunks/2-C5u7WpBH.js +9 -0
  195. package/build/server/chunks/2-C5u7WpBH.js.map +1 -0
  196. package/build/server/chunks/3-BrobxxI7.js +9 -0
  197. package/build/server/chunks/3-BrobxxI7.js.map +1 -0
  198. package/build/server/chunks/4-ClIdwABM.js +9 -0
  199. package/build/server/chunks/4-ClIdwABM.js.map +1 -0
  200. package/build/server/chunks/5-ox8PkWxC.js +9 -0
  201. package/build/server/chunks/5-ox8PkWxC.js.map +1 -0
  202. package/build/server/chunks/{6-uS_X9B0s.js → 6-B6C38HXu.js} +7 -3
  203. package/build/server/chunks/6-B6C38HXu.js.map +1 -0
  204. package/build/server/chunks/7-BgYWIBj-.js +9 -0
  205. package/build/server/chunks/7-BgYWIBj-.js.map +1 -0
  206. package/build/server/chunks/8-CgCeoIqV.js +9 -0
  207. package/build/server/chunks/8-CgCeoIqV.js.map +1 -0
  208. package/build/server/chunks/9-CWM_WQXH.js +9 -0
  209. package/build/server/chunks/9-CWM_WQXH.js.map +1 -0
  210. package/build/server/chunks/{ChatStepTrace-B5HQ8Zv3.js → ChatStepTrace-BIghWRaw.js} +3 -59
  211. package/build/server/chunks/ChatStepTrace-BIghWRaw.js.map +1 -0
  212. package/build/server/chunks/Dropdown-Bz9eHilg.js +61 -0
  213. package/build/server/chunks/Dropdown-Bz9eHilg.js.map +1 -0
  214. package/build/server/chunks/{_layout.svelte-Svi5xbzP.js → _layout.svelte-B6NfHVfy.js} +2 -2
  215. package/build/server/chunks/{_layout.svelte-Svi5xbzP.js.map → _layout.svelte-B6NfHVfy.js.map} +1 -1
  216. package/build/server/chunks/{_layout.svelte-Fo2hGNeP.js → _layout.svelte-BKnunWZl.js} +129 -14
  217. package/build/server/chunks/_layout.svelte-BKnunWZl.js.map +1 -0
  218. package/build/server/chunks/{_layout.svelte-h89mGXIj.js → _layout.svelte-WXSvPGRU.js} +2 -2
  219. package/build/server/chunks/{_layout.svelte-h89mGXIj.js.map → _layout.svelte-WXSvPGRU.js.map} +1 -1
  220. package/build/server/chunks/{_page.svelte-CnjXZO9K.js → _page.svelte-CLBi-ypL.js} +2 -2
  221. package/build/server/chunks/{_page.svelte-CnjXZO9K.js.map → _page.svelte-CLBi-ypL.js.map} +1 -1
  222. package/build/server/chunks/{_page.svelte-Hg-ZSzf1.js → _page.svelte-CLiLwJTq.js} +4 -3
  223. package/build/server/chunks/_page.svelte-CLiLwJTq.js.map +1 -0
  224. package/build/server/chunks/{_page.svelte-CC26hDwf.js → _page.svelte-CdczF37D.js} +3 -2
  225. package/build/server/chunks/_page.svelte-CdczF37D.js.map +1 -0
  226. package/build/server/chunks/_page.svelte-Ck9Utnoc.js +60 -0
  227. package/build/server/chunks/_page.svelte-Ck9Utnoc.js.map +1 -0
  228. package/build/server/chunks/{_page.svelte-Dl3GoTy1.js → _page.svelte-DBrprjQP.js} +5 -4
  229. package/build/server/chunks/_page.svelte-DBrprjQP.js.map +1 -0
  230. package/build/server/chunks/{error.svelte-zyW9aOoU.js → error.svelte-DP2oBSvv.js} +2 -2
  231. package/build/server/chunks/{error.svelte-zyW9aOoU.js.map → error.svelte-DP2oBSvv.js.map} +1 -1
  232. package/build/server/chunks/{index3-DeV2OWZf.js → index3-CpMl6FwG.js} +7 -2
  233. package/build/server/chunks/index3-CpMl6FwG.js.map +1 -0
  234. package/build/server/index.js +1 -1
  235. package/build/server/index.js.map +1 -1
  236. package/build/server/manifest.js +32 -24
  237. package/build/server/manifest.js.map +1 -1
  238. package/package.json +1 -1
  239. package/src/backend/lib/get-agent-factories.ts +13 -2
  240. package/src/backend/lib/get-root-path.ts +30 -5
  241. package/src/backend/lib/import-nonce.ts +10 -0
  242. package/src/backend/region/router.ts +67 -0
  243. package/src/backend/roleplay/agents.ts +51 -11
  244. package/src/backend/roleplay/old-server.ts +4 -1
  245. package/src/backend/server.ts +3 -1
  246. package/src/backend/tests/academy.ts +106 -73
  247. package/src/backend/tests/emulate-agents.ts +20 -1
  248. package/src/backend/tests/router.ts +220 -38
  249. package/build/client/_app/immutable/assets/0.DsZUjxNX.css +0 -1
  250. package/build/client/_app/immutable/assets/0.DsZUjxNX.css.br +0 -0
  251. package/build/client/_app/immutable/assets/0.DsZUjxNX.css.gz +0 -0
  252. package/build/client/_app/immutable/chunks/BTlUd_Lo.js +0 -8
  253. package/build/client/_app/immutable/chunks/BTlUd_Lo.js.br +0 -0
  254. package/build/client/_app/immutable/chunks/BTlUd_Lo.js.gz +0 -0
  255. package/build/client/_app/immutable/chunks/BVDwc-2z.js +0 -1
  256. package/build/client/_app/immutable/chunks/BVDwc-2z.js.br +0 -0
  257. package/build/client/_app/immutable/chunks/BVDwc-2z.js.gz +0 -0
  258. package/build/client/_app/immutable/chunks/BWo2H__f.js.br +0 -0
  259. package/build/client/_app/immutable/chunks/BWo2H__f.js.gz +0 -0
  260. package/build/client/_app/immutable/chunks/BXkrt826.js +0 -1
  261. package/build/client/_app/immutable/chunks/BXkrt826.js.br +0 -0
  262. package/build/client/_app/immutable/chunks/BXkrt826.js.gz +0 -0
  263. package/build/client/_app/immutable/chunks/Bdb5tyDH.js.br +0 -0
  264. package/build/client/_app/immutable/chunks/Bdb5tyDH.js.gz +0 -0
  265. package/build/client/_app/immutable/chunks/BfHUxT3G.js.br +0 -0
  266. package/build/client/_app/immutable/chunks/BfHUxT3G.js.gz +0 -0
  267. package/build/client/_app/immutable/chunks/Bk1rEq7o.js.br +0 -0
  268. package/build/client/_app/immutable/chunks/Bk1rEq7o.js.gz +0 -0
  269. package/build/client/_app/immutable/chunks/BkclRFLx.js +0 -3
  270. package/build/client/_app/immutable/chunks/BkclRFLx.js.br +0 -0
  271. package/build/client/_app/immutable/chunks/BkclRFLx.js.gz +0 -0
  272. package/build/client/_app/immutable/chunks/BnxfhlSj.js.br +0 -0
  273. package/build/client/_app/immutable/chunks/BnxfhlSj.js.gz +0 -0
  274. package/build/client/_app/immutable/chunks/BqROrg0C.js.br +0 -0
  275. package/build/client/_app/immutable/chunks/BqROrg0C.js.gz +0 -0
  276. package/build/client/_app/immutable/chunks/ByQey8Oa.js.br +0 -0
  277. package/build/client/_app/immutable/chunks/ByQey8Oa.js.gz +0 -0
  278. package/build/client/_app/immutable/chunks/CFwu9ET3.js.br +0 -0
  279. package/build/client/_app/immutable/chunks/CFwu9ET3.js.gz +0 -0
  280. package/build/client/_app/immutable/chunks/CIIE25ox.js.br +0 -0
  281. package/build/client/_app/immutable/chunks/CIIE25ox.js.gz +0 -0
  282. package/build/client/_app/immutable/chunks/CNMNmz2q.js.br +0 -0
  283. package/build/client/_app/immutable/chunks/CNMNmz2q.js.gz +0 -0
  284. package/build/client/_app/immutable/chunks/CNvyTQrC.js +0 -1
  285. package/build/client/_app/immutable/chunks/CNvyTQrC.js.br +0 -2
  286. package/build/client/_app/immutable/chunks/CNvyTQrC.js.gz +0 -0
  287. package/build/client/_app/immutable/chunks/CVHvdSBf.js.br +0 -0
  288. package/build/client/_app/immutable/chunks/CYiRxJxs.js +0 -1
  289. package/build/client/_app/immutable/chunks/CYiRxJxs.js.br +0 -0
  290. package/build/client/_app/immutable/chunks/CYiRxJxs.js.gz +0 -0
  291. package/build/client/_app/immutable/chunks/CZPhtqrs.js.br +0 -0
  292. package/build/client/_app/immutable/chunks/CZPhtqrs.js.gz +0 -0
  293. package/build/client/_app/immutable/chunks/CdzpH-Ca.js.br +0 -0
  294. package/build/client/_app/immutable/chunks/CdzpH-Ca.js.gz +0 -0
  295. package/build/client/_app/immutable/chunks/Cf8q8_nj.js +0 -1
  296. package/build/client/_app/immutable/chunks/Cf8q8_nj.js.br +0 -0
  297. package/build/client/_app/immutable/chunks/Cf8q8_nj.js.gz +0 -0
  298. package/build/client/_app/immutable/chunks/Cg3F7Z11.js +0 -1
  299. package/build/client/_app/immutable/chunks/Cg3F7Z11.js.br +0 -0
  300. package/build/client/_app/immutable/chunks/Cg3F7Z11.js.gz +0 -0
  301. package/build/client/_app/immutable/chunks/CpSIcnXs.js +0 -1
  302. package/build/client/_app/immutable/chunks/CpSIcnXs.js.br +0 -0
  303. package/build/client/_app/immutable/chunks/CpSIcnXs.js.gz +0 -0
  304. package/build/client/_app/immutable/chunks/Ct9HfpvA.js.br +0 -0
  305. package/build/client/_app/immutable/chunks/Ct9HfpvA.js.gz +0 -0
  306. package/build/client/_app/immutable/chunks/D42t-LiJ.js +0 -4
  307. package/build/client/_app/immutable/chunks/D42t-LiJ.js.br +0 -0
  308. package/build/client/_app/immutable/chunks/D42t-LiJ.js.gz +0 -0
  309. package/build/client/_app/immutable/chunks/DJPBfZIx.js +0 -1
  310. package/build/client/_app/immutable/chunks/DJPBfZIx.js.br +0 -0
  311. package/build/client/_app/immutable/chunks/DJPBfZIx.js.gz +0 -0
  312. package/build/client/_app/immutable/chunks/DOatwnEt.js.br +0 -0
  313. package/build/client/_app/immutable/chunks/DOatwnEt.js.gz +0 -0
  314. package/build/client/_app/immutable/chunks/DQqJYxgt.js +0 -1
  315. package/build/client/_app/immutable/chunks/DQqJYxgt.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/DQqJYxgt.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/DSfxalyG.js.br +0 -0
  318. package/build/client/_app/immutable/chunks/DSfxalyG.js.gz +0 -0
  319. package/build/client/_app/immutable/chunks/DujX6kBV.js +0 -2
  320. package/build/client/_app/immutable/chunks/DujX6kBV.js.br +0 -0
  321. package/build/client/_app/immutable/chunks/DujX6kBV.js.gz +0 -0
  322. package/build/client/_app/immutable/chunks/HPBQctDD.js.br +0 -0
  323. package/build/client/_app/immutable/chunks/HPBQctDD.js.gz +0 -0
  324. package/build/client/_app/immutable/chunks/Jaf1TUfw.js +0 -1
  325. package/build/client/_app/immutable/chunks/Jaf1TUfw.js.br +0 -2
  326. package/build/client/_app/immutable/chunks/Jaf1TUfw.js.gz +0 -0
  327. package/build/client/_app/immutable/chunks/KDW88ZZa.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/KDW88ZZa.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/TO5ESkEd.js.br +0 -0
  330. package/build/client/_app/immutable/chunks/TO5ESkEd.js.gz +0 -0
  331. package/build/client/_app/immutable/chunks/ZH2wGpZM.js +0 -1
  332. package/build/client/_app/immutable/chunks/ZH2wGpZM.js.br +0 -0
  333. package/build/client/_app/immutable/chunks/ZH2wGpZM.js.gz +0 -0
  334. package/build/client/_app/immutable/chunks/axPa8Xqj.js +0 -1
  335. package/build/client/_app/immutable/chunks/axPa8Xqj.js.br +0 -0
  336. package/build/client/_app/immutable/chunks/axPa8Xqj.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/oeB0PCTX.js.br +0 -0
  338. package/build/client/_app/immutable/chunks/oeB0PCTX.js.gz +0 -0
  339. package/build/client/_app/immutable/chunks/rtsVMmSs.js.br +0 -0
  340. package/build/client/_app/immutable/chunks/rtsVMmSs.js.gz +0 -0
  341. package/build/client/_app/immutable/chunks/uS7H_Vea.js +0 -1
  342. package/build/client/_app/immutable/chunks/uS7H_Vea.js.br +0 -0
  343. package/build/client/_app/immutable/chunks/uS7H_Vea.js.gz +0 -0
  344. package/build/client/_app/immutable/chunks/yWz0pZR0.js.br +0 -0
  345. package/build/client/_app/immutable/chunks/yWz0pZR0.js.gz +0 -0
  346. package/build/client/_app/immutable/entry/app.yCT9HX-q.js +0 -2
  347. package/build/client/_app/immutable/entry/app.yCT9HX-q.js.br +0 -0
  348. package/build/client/_app/immutable/entry/app.yCT9HX-q.js.gz +0 -0
  349. package/build/client/_app/immutable/entry/start.FbJeJ8ru.js +0 -1
  350. package/build/client/_app/immutable/entry/start.FbJeJ8ru.js.br +0 -2
  351. package/build/client/_app/immutable/entry/start.FbJeJ8ru.js.gz +0 -0
  352. package/build/client/_app/immutable/nodes/0.CwdXLzyE.js.br +0 -0
  353. package/build/client/_app/immutable/nodes/0.CwdXLzyE.js.gz +0 -0
  354. package/build/client/_app/immutable/nodes/1.CJSJdR2U.js +0 -1
  355. package/build/client/_app/immutable/nodes/1.CJSJdR2U.js.br +0 -0
  356. package/build/client/_app/immutable/nodes/1.CJSJdR2U.js.gz +0 -0
  357. package/build/client/_app/immutable/nodes/13.DaAF9e8t.js.br +0 -0
  358. package/build/client/_app/immutable/nodes/13.DaAF9e8t.js.gz +0 -0
  359. package/build/client/_app/immutable/nodes/14.BcXGBqPj.js.br +0 -0
  360. package/build/client/_app/immutable/nodes/14.BcXGBqPj.js.gz +0 -0
  361. package/build/client/_app/immutable/nodes/2.DISE-c5q.js +0 -35
  362. package/build/client/_app/immutable/nodes/2.DISE-c5q.js.br +0 -0
  363. package/build/client/_app/immutable/nodes/2.DISE-c5q.js.gz +0 -0
  364. package/build/client/_app/immutable/nodes/3.BtAUfPNQ.js +0 -1
  365. package/build/client/_app/immutable/nodes/3.BtAUfPNQ.js.br +0 -0
  366. package/build/client/_app/immutable/nodes/3.BtAUfPNQ.js.gz +0 -0
  367. package/build/client/_app/immutable/nodes/4.DylMSvDw.js +0 -1
  368. package/build/client/_app/immutable/nodes/4.DylMSvDw.js.br +0 -0
  369. package/build/client/_app/immutable/nodes/4.DylMSvDw.js.gz +0 -0
  370. package/build/client/_app/immutable/nodes/5.CqUx8Ggk.js.br +0 -0
  371. package/build/client/_app/immutable/nodes/5.CqUx8Ggk.js.gz +0 -0
  372. package/build/client/_app/immutable/nodes/6.CPYhLc46.js +0 -1
  373. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.br +0 -4
  374. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.gz +0 -0
  375. package/build/client/_app/immutable/nodes/7.B6QVJ_di.js.br +0 -0
  376. package/build/client/_app/immutable/nodes/7.B6QVJ_di.js.gz +0 -0
  377. package/build/client/_app/immutable/nodes/8.DhQWMEsP.js +0 -6
  378. package/build/client/_app/immutable/nodes/8.DhQWMEsP.js.br +0 -0
  379. package/build/client/_app/immutable/nodes/8.DhQWMEsP.js.gz +0 -0
  380. package/build/server/chunks/0-DnZ1CmpH.js +0 -9
  381. package/build/server/chunks/0-DnZ1CmpH.js.map +0 -1
  382. package/build/server/chunks/1-BW2Kegam.js +0 -9
  383. package/build/server/chunks/1-BW2Kegam.js.map +0 -1
  384. package/build/server/chunks/13-DPcsc1p-.js.map +0 -1
  385. package/build/server/chunks/14-Ddk1gksy.js +0 -9
  386. package/build/server/chunks/14-Ddk1gksy.js.map +0 -1
  387. package/build/server/chunks/2-Co5sKQqN.js +0 -9
  388. package/build/server/chunks/2-Co5sKQqN.js.map +0 -1
  389. package/build/server/chunks/3-Czp3KEzr.js +0 -9
  390. package/build/server/chunks/3-Czp3KEzr.js.map +0 -1
  391. package/build/server/chunks/4-BML64sIA.js +0 -9
  392. package/build/server/chunks/4-BML64sIA.js.map +0 -1
  393. package/build/server/chunks/5-9yHXJzTj.js +0 -9
  394. package/build/server/chunks/5-9yHXJzTj.js.map +0 -1
  395. package/build/server/chunks/6-uS_X9B0s.js.map +0 -1
  396. package/build/server/chunks/7-CgqcRvLC.js +0 -9
  397. package/build/server/chunks/7-CgqcRvLC.js.map +0 -1
  398. package/build/server/chunks/8-CddjGDu2.js +0 -9
  399. package/build/server/chunks/8-CddjGDu2.js.map +0 -1
  400. package/build/server/chunks/9-W6XYayeK.js.map +0 -1
  401. package/build/server/chunks/ChatStepTrace-B5HQ8Zv3.js.map +0 -1
  402. package/build/server/chunks/_layout.svelte-Fo2hGNeP.js.map +0 -1
  403. package/build/server/chunks/_page.svelte-CC26hDwf.js.map +0 -1
  404. package/build/server/chunks/_page.svelte-Dl3GoTy1.js.map +0 -1
  405. package/build/server/chunks/_page.svelte-Hg-ZSzf1.js.map +0 -1
  406. package/build/server/chunks/index3-DeV2OWZf.js.map +0 -1
  407. /package/build/client/_app/immutable/assets/{14.C5apk4jm.css → 15.C5apk4jm.css} +0 -0
  408. /package/build/client/_app/immutable/assets/{14.C5apk4jm.css.br → 15.C5apk4jm.css.br} +0 -0
  409. /package/build/client/_app/immutable/assets/{14.C5apk4jm.css.gz → 15.C5apk4jm.css.gz} +0 -0
  410. /package/build/client/_app/immutable/assets/{7.DlSPCZj0.css → 8.DlSPCZj0.css} +0 -0
  411. /package/build/client/_app/immutable/assets/{7.DlSPCZj0.css.br → 8.DlSPCZj0.css.br} +0 -0
  412. /package/build/client/_app/immutable/assets/{7.DlSPCZj0.css.gz → 8.DlSPCZj0.css.gz} +0 -0
  413. /package/build/client/_app/immutable/assets/{8.BX46PfEJ.css → 9.BX46PfEJ.css} +0 -0
  414. /package/build/client/_app/immutable/assets/{8.BX46PfEJ.css.br → 9.BX46PfEJ.css.br} +0 -0
  415. /package/build/client/_app/immutable/assets/{8.BX46PfEJ.css.gz → 9.BX46PfEJ.css.gz} +0 -0
  416. /package/build/client/_app/immutable/assets/{bosun-theme.tn0RQdqM.css → Modal.tn0RQdqM.css} +0 -0
  417. /package/build/client/_app/immutable/assets/{bosun-theme.tn0RQdqM.css.br → Modal.tn0RQdqM.css.br} +0 -0
  418. /package/build/client/_app/immutable/assets/{bosun-theme.tn0RQdqM.css.gz → Modal.tn0RQdqM.css.gz} +0 -0
  419. /package/build/client/_app/immutable/assets/{ChatStepTrace.NFJFjHv0.css → chat-content.NFJFjHv0.css} +0 -0
  420. /package/build/client/_app/immutable/assets/{ChatStepTrace.NFJFjHv0.css.br → chat-content.NFJFjHv0.css.br} +0 -0
  421. /package/build/client/_app/immutable/assets/{ChatStepTrace.NFJFjHv0.css.gz → chat-content.NFJFjHv0.css.gz} +0 -0
  422. /package/build/client/_app/immutable/nodes/{9.BVI-eEdV.js → 10.BVI-eEdV.js} +0 -0
  423. /package/build/client/_app/immutable/nodes/{9.BVI-eEdV.js.br → 10.BVI-eEdV.js.br} +0 -0
  424. /package/build/client/_app/immutable/nodes/{9.BVI-eEdV.js.gz → 10.BVI-eEdV.js.gz} +0 -0
  425. /package/build/client/_app/immutable/nodes/{10.BHSGZYEC.js → 11.BHSGZYEC.js} +0 -0
  426. /package/build/client/_app/immutable/nodes/{10.BHSGZYEC.js.br → 11.BHSGZYEC.js.br} +0 -0
  427. /package/build/client/_app/immutable/nodes/{10.BHSGZYEC.js.gz → 11.BHSGZYEC.js.gz} +0 -0
  428. /package/build/client/_app/immutable/nodes/{11.CZ_7M4AF.js → 12.CZ_7M4AF.js} +0 -0
  429. /package/build/client/_app/immutable/nodes/{11.CZ_7M4AF.js.br → 12.CZ_7M4AF.js.br} +0 -0
  430. /package/build/client/_app/immutable/nodes/{11.CZ_7M4AF.js.gz → 12.CZ_7M4AF.js.gz} +0 -0
  431. /package/build/client/_app/immutable/nodes/{12.DRr2l3NZ.js → 13.DRr2l3NZ.js} +0 -0
  432. /package/build/client/_app/immutable/nodes/{12.DRr2l3NZ.js.br → 13.DRr2l3NZ.js.br} +0 -0
  433. /package/build/client/_app/immutable/nodes/{12.DRr2l3NZ.js.gz → 13.DRr2l3NZ.js.gz} +0 -0
@@ -85,28 +85,37 @@ type PromptTestsScope = 'all' | 'pinned'
85
85
 
86
86
  type PromptTestsSelection = { scope: PromptTestsScope } | { testId: string }
87
87
 
88
- const activeRunsByAgent = new Map<string, AbortController>()
88
+ const activeRunsBySuiteKey = new Map<string, AbortController>()
89
89
 
90
- export function cancelPromptTests(agent: string): boolean {
91
- const controller = activeRunsByAgent.get(agent)
90
+ export type SuiteSelection = {
91
+ // `suiteKey` is the filesystem/report key (e.g. `voiceSupport.en-gb`).
92
+ // `agentId` is the canonical factory key (workflow export key, e.g. `voiceSupport`).
93
+ // Keeping these separate avoids any parsing/guessing in the test runner.
94
+ suiteKey: string
95
+ agentId: string
96
+ region?: string
97
+ }
98
+
99
+ export function cancelPromptTests(suiteKey: string): boolean {
100
+ const controller = activeRunsBySuiteKey.get(suiteKey)
92
101
  if (!controller) return false
93
102
  controller.abort()
94
103
  return true
95
104
  }
96
105
 
97
106
  export async function runPromptTestsManaged(
98
- agent: string,
107
+ suite: SuiteSelection,
99
108
  selection: PromptTestsSelection = { scope: 'pinned' }
100
109
  ): Promise<WrittenRunReport> {
101
- if (activeRunsByAgent.has(agent)) {
110
+ if (activeRunsBySuiteKey.has(suite.suiteKey)) {
102
111
  throw new Error('Tests already running for this agent')
103
112
  }
104
113
  const controller = new AbortController()
105
- activeRunsByAgent.set(agent, controller)
114
+ activeRunsBySuiteKey.set(suite.suiteKey, controller)
106
115
  try {
107
- return await runPromptTests(agent, selection, { signal: controller.signal })
116
+ return await runPromptTests(suite, selection, { signal: controller.signal })
108
117
  } finally {
109
- activeRunsByAgent.delete(agent)
118
+ activeRunsBySuiteKey.delete(suite.suiteKey)
110
119
  }
111
120
  }
112
121
 
@@ -134,7 +143,8 @@ function parseConversationFromSheet(conversation: string | undefined | null): Co
134
143
  }
135
144
  }
136
145
 
137
- for (const line of lines) {
146
+ for (let i = 0; i < lines.length; i++) {
147
+ const line = lines[i] ?? ''
138
148
  const m = roleMatch(line)
139
149
  if (m) {
140
150
  // Starting a new role block; flush previous
@@ -146,8 +156,16 @@ function parseConversationFromSheet(conversation: string | undefined | null): Co
146
156
  // Continuation of the current role block (allow blank lines)
147
157
  buffer.push(line)
148
158
  } else {
149
- // Ignore lines until we encounter the first role marker
150
- continue
159
+ // No current role block yet.
160
+ // Previously we silently ignored preamble lines; that's almost always a test authoring mistake
161
+ // (e.g. a malformed "User:"/"Agent:" prefix like "?Agent:").
162
+ if (line.trim()) {
163
+ const snippet = line.length > 200 ? `${line.slice(0, 200)}…` : line
164
+ throw new Error(
165
+ `Unparsed conversation content before the first role block at line ${i + 1}: ${snippet}\n` +
166
+ `Start each block with "User:", "Agent:" (or "Assistant:"), or "System:".`
167
+ )
168
+ }
151
169
  }
152
170
  }
153
171
 
@@ -170,43 +188,55 @@ function toTestInputs(
170
188
  if ('testId' in selection) return String(r.id ?? '') === String(selection.testId)
171
189
  return selection.scope === 'all' ? true : r.pinned === 'TRUE'
172
190
  })
173
- .map((row) => ({
174
- id: row.id,
175
- scenario: row.scenario,
176
- conversation: parseConversationFromSheet(row.conversation),
177
- assertions: [
178
- {
179
- type: row.assertion_type as PFAssertion['type'],
180
- value: row.assertion_value
181
- },
182
- {
183
- type: 'similar' as 'similar',
184
- value: String(row.expected_output),
185
- threshold: Number(row.similarity_threshold) / 100
186
- }
187
- ],
188
- context: (() => {
189
- const testCtx = makeContext(row.context)
190
- return defaultContext ? mergeContexts(defaultContext, testCtx) : testCtx
191
- })(),
192
- timeoutSeconds: (() => {
193
- const rawValue = row.timeout
194
- if (rawValue === undefined || rawValue === null || String(rawValue).trim() === '') {
195
- throw new Error('Timeout value is required')
196
- }
197
- const raw = Number(rawValue)
198
- if (isNaN(raw)) {
199
- throw new Error(`Invalid timeout value: ${rawValue}`)
200
- }
201
- if (raw > 1000) {
202
- throw new Error(`Timeout value exceeds maximum of 1000: ${raw}`)
203
- }
204
- if (raw < 0) {
205
- throw new Error(`Timeout value must be non-negative: ${raw}`)
206
- }
207
- return raw
208
- })()
209
- }))
191
+ .map((row) => {
192
+ let conversation: Conversation = []
193
+ let conversationParseError: string | undefined
194
+ try {
195
+ conversation = parseConversationFromSheet(row.conversation)
196
+ } catch (err) {
197
+ conversation = []
198
+ conversationParseError = err instanceof Error ? err.message : String(err)
199
+ }
200
+
201
+ return {
202
+ id: row.id,
203
+ scenario: row.scenario,
204
+ conversation,
205
+ conversationParseError,
206
+ assertions: [
207
+ {
208
+ type: row.assertion_type as PFAssertion['type'],
209
+ value: row.assertion_value
210
+ },
211
+ {
212
+ type: 'similar' as 'similar',
213
+ value: String(row.expected_output),
214
+ threshold: Number(row.similarity_threshold) / 100
215
+ }
216
+ ],
217
+ context: (() => {
218
+ const testCtx = makeContext(row.context)
219
+ return defaultContext ? mergeContexts(defaultContext, testCtx) : testCtx
220
+ })(),
221
+ timeoutSeconds: (() => {
222
+ const rawValue = row.timeout
223
+ if (rawValue === undefined || rawValue === null || String(rawValue).trim() === '') {
224
+ throw new Error('Timeout value is required')
225
+ }
226
+ const raw = Number(rawValue)
227
+ if (isNaN(raw)) {
228
+ throw new Error(`Invalid timeout value: ${rawValue}`)
229
+ }
230
+ if (raw > 1000) {
231
+ throw new Error(`Timeout value exceeds maximum of 1000: ${raw}`)
232
+ }
233
+ if (raw < 0) {
234
+ throw new Error(`Timeout value must be non-negative: ${raw}`)
235
+ }
236
+ return raw
237
+ })()
238
+ }
239
+ })
210
240
  }
211
241
 
212
242
  export class RecombineAgentProvider implements ApiProvider {
@@ -230,12 +260,18 @@ export class RecombineAgentProvider implements ApiProvider {
230
260
  async callApi(_prompt: string, context?: CallApiContextParams): Promise<ProviderResponse> {
231
261
  const projectRoot = path.dirname(await getRootPath())
232
262
  const vars = (context?.vars || {}) as unknown as {
233
- agent: string
263
+ agentId: string
264
+ region?: string
234
265
  conversation: Conversation
266
+ conversationParseError?: string
235
267
  context: Context
236
268
  timeoutSeconds?: number
237
269
  }
238
270
 
271
+ if (typeof vars.conversationParseError === 'string' && vars.conversationParseError.trim()) {
272
+ return { output: '', error: vars.conversationParseError }
273
+ }
274
+
239
275
  let captured: string = ''
240
276
  const capturedLogs: string[] = []
241
277
  const capturedStepTraces: StepTrace[] = []
@@ -249,15 +285,6 @@ export class RecombineAgentProvider implements ApiProvider {
249
285
  const conv: Conversation = Array.isArray(vars.conversation)
250
286
  ? (vars.conversation as Conversation).map((m) => ({ ...m }))
251
287
  : []
252
- const lastUserIndex = (() => {
253
- for (let i = conv.length - 1; i >= 0; i--) {
254
- if (conv[i]?.sender === 'user') return i
255
- }
256
- return -1
257
- })()
258
- if (lastUserIndex < 0) {
259
- return { output: '', error: 'No user message found in conversation' }
260
- }
261
288
 
262
289
  // Prepare a streaming log writer so logs are written as they occur
263
290
  {
@@ -317,7 +344,8 @@ export class RecombineAgentProvider implements ApiProvider {
317
344
  try {
318
345
  // Run the agent via loadAgents using provided conversation
319
346
  await loadAgents({
320
- agentId: vars.agent,
347
+ agentId: vars.agentId,
348
+ region: vars.region,
321
349
  getMessages: () => conv,
322
350
  sendMessage: async (message: Message | string) => {
323
351
  const m = typeof message === 'string' ? { sender: 'agent', text: message } : message
@@ -513,20 +541,21 @@ function buildTableRows(
513
541
  }
514
542
 
515
543
  export async function runPromptTests(
516
- agent: string,
544
+ suite: SuiteSelection,
517
545
  selection: PromptTestsSelection = { scope: 'pinned' },
518
546
  opts?: { signal?: AbortSignal }
519
547
  ): Promise<WrittenRunReport> {
520
548
  const signal = opts?.signal
521
549
  const scope = 'scope' in selection ? selection.scope : 'pinned'
522
550
  const onlyTestId = 'testId' in selection ? selection.testId : undefined
523
- const suite = await readSuite(agent)
524
- const rows = suite.tests as unknown as CsvRow[]
525
- const cfg = (await tryReadConfig(agent)) || {}
551
+ const suiteKey = suite.suiteKey
552
+ const loadedSuite = await readSuite(suiteKey)
553
+ const rows = loadedSuite.tests as unknown as CsvRow[]
554
+ const cfg = (await tryReadConfig(suiteKey)) || {}
526
555
 
527
556
  const repeats = Number(cfg?.repeats ?? 1)
528
557
  const concurrency = Number(cfg?.concurrency ?? 1)
529
- const baseContext = suite?.meta?.defaultContext || {}
558
+ const baseContext = loadedSuite?.meta?.defaultContext || {}
530
559
 
531
560
  // Add an index field to each row for mapping
532
561
  const typedRows = rows as unknown as CsvRow[]
@@ -565,9 +594,13 @@ export async function runPromptTests(
565
594
  assert: test.assertions,
566
595
  model: 'not used!',
567
596
  vars: {
568
- agent,
597
+ agentId: suite.agentId,
598
+ ...(suite.region ? { region: suite.region } : {}),
569
599
  context: test.context,
570
600
  conversation: test.conversation,
601
+ ...(test.conversationParseError
602
+ ? { conversationParseError: test.conversationParseError }
603
+ : {}),
571
604
  timeoutSeconds: (test as any).timeoutSeconds
572
605
  }
573
606
  }
@@ -583,7 +616,7 @@ export async function runPromptTests(
583
616
  // Use full ISO timestamp and sanitize ':' for filesystem safety
584
617
  const iso = new Date().toISOString()
585
618
  const isoFile = iso.replace(/:/g, '-')
586
- const outPath = path.join(outDir, `${agent}.${isoFile}.report.json`)
619
+ const outPath = path.join(outDir, `${suiteKey}.${isoFile}.report.json`)
587
620
 
588
621
  async function writeReport(report: WrittenRunReport) {
589
622
  const dir = path.dirname(outPath)
@@ -614,7 +647,7 @@ export async function runPromptTests(
614
647
  }
615
648
 
616
649
  const body: WrittenRunReport = {
617
- agent,
650
+ agent: suiteKey,
618
651
  run_timestamp: iso,
619
652
  run_scope: scope,
620
653
  run_config: runConfig,
@@ -672,11 +705,11 @@ export async function runPromptTests(
672
705
  String((originalRow as any).pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
673
706
  const nextRow: WrittenRunReportRow = {
674
707
  ...(originalRow as any),
675
- prompts: `suite://${agent}?testId=${testId}`,
708
+ prompts: `suite://${suiteKey}?testId=${testId}`,
676
709
  success_rate_percent: 0,
677
710
  success_rate: '0/0',
678
711
  results: [],
679
- agent,
712
+ agent: suiteKey,
680
713
  test_id: testId,
681
714
  run_timestamp: iso,
682
715
  run_config: JSON.stringify(runConfig),
@@ -724,12 +757,12 @@ export async function runPromptTests(
724
757
  })
725
758
 
726
759
  if (originalRow && testId) {
727
- const rowToWrite = buildTableRows([ev], [originalRow], agent)[0]
760
+ const rowToWrite = buildTableRows([ev], [originalRow], suiteKey)[0]
728
761
  const pinned: 'TRUE' | 'FALSE' =
729
762
  (rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
730
763
  byTestId.set(testId, {
731
764
  ...rowToWrite,
732
- agent,
765
+ agent: suiteKey,
733
766
  test_id: testId,
734
767
  run_timestamp: iso,
735
768
  run_config: JSON.stringify(runConfig),
@@ -760,12 +793,12 @@ export async function runPromptTests(
760
793
 
761
794
  // Persist failure row immediately for real-time UI updates.
762
795
  if (originalRow && testId) {
763
- const rowToWrite = buildTableRows([ev], [originalRow], agent)[0]
796
+ const rowToWrite = buildTableRows([ev], [originalRow], suiteKey)[0]
764
797
  const pinned: 'TRUE' | 'FALSE' =
765
798
  (rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
766
799
  byTestId.set(testId, {
767
800
  ...rowToWrite,
768
- agent,
801
+ agent: suiteKey,
769
802
  test_id: testId,
770
803
  run_timestamp: iso,
771
804
  run_config: JSON.stringify(runConfig),
@@ -7,10 +7,12 @@ import {
7
7
  type TestVoiceAgent
8
8
  } from '@recombine-ai/engine'
9
9
  import { getAgentFactories } from '../lib/get-agent-factories'
10
+ import { getImportNonce } from '../lib/import-nonce'
10
11
  import { getRootPath } from '../lib/get-root-path'
11
12
 
12
13
  export async function loadAgents(props: {
13
14
  agentId: string
15
+ region?: string | null
14
16
  getMessages: () => Message[]
15
17
  sendMessage: (message: Message | string) => Promise<void>
16
18
  stepTracer: StepTracer
@@ -21,6 +23,7 @@ export async function loadAgents(props: {
21
23
  }): Promise<void> {
22
24
  const {
23
25
  agentId,
26
+ region,
24
27
  getMessages,
25
28
  sendMessage,
26
29
  stepTracer: stepTracer,
@@ -29,7 +32,8 @@ export async function loadAgents(props: {
29
32
  timeoutSeconds,
30
33
  abortSignal
31
34
  } = props
32
- const { factories } = await getAgentFactories(await getRootPath())
35
+ const importNonce = getImportNonce()
36
+ const { factories } = await getAgentFactories(await getRootPath(), importNonce)
33
37
  const factory = factories[agentId]
34
38
  if (!factory) throw new Error('Factory not found')
35
39
 
@@ -68,6 +72,13 @@ export async function loadAgents(props: {
68
72
  addStep: () => {}
69
73
  }
70
74
 
75
+ if (region) {
76
+ // The UI-selected region is stored in Bosun's runtime ctx and consumed by the project's workflows.
77
+ // Setting it before calling the factory ensures region-scoped config/strings are used for this run.
78
+ const current = (ctx.get() as Record<string, unknown> | null | undefined) || {}
79
+ ctx.set({ ...current, recombineRegion: region })
80
+ }
81
+
71
82
  const agent = await factory({
72
83
  stepTracer: stepTracer,
73
84
  stepRegistry,
@@ -123,6 +134,10 @@ export async function loadAgents(props: {
123
134
  }
124
135
 
125
136
  try {
137
+ if (hasStart(agent)) {
138
+ // Some project workflows (e.g. voice) persist required per-run state (like region) during `start()`.
139
+ await withAbort(Promise.resolve().then(() => agent.start()))
140
+ }
126
141
  if (isVoiceAgent(agent)) {
127
142
  await withAbort(agent.streamResponse())
128
143
  } else {
@@ -150,3 +165,7 @@ export async function loadAgents(props: {
150
165
  function isVoiceAgent(agent: TestAgent): agent is TestVoiceAgent {
151
166
  return 'streamResponse' in agent
152
167
  }
168
+
169
+ function hasStart(agent: TestAgent): agent is TestAgent & { start: () => Promise<void> | void } {
170
+ return typeof (agent as { start?: unknown }).start === 'function'
171
+ }