@recombine-ai/bosun 0.10.0 → 0.11.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 (517) hide show
  1. package/README.md +14 -0
  2. package/bin/bosun.js +188 -43
  3. package/build/client/_app/immutable/assets/0.Dz9hcoGY.css +1 -0
  4. package/build/client/_app/immutable/assets/0.Dz9hcoGY.css.br +0 -0
  5. package/build/client/_app/immutable/assets/0.Dz9hcoGY.css.gz +0 -0
  6. package/build/client/_app/immutable/assets/10.BX46PfEJ.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/18.C5apk4jm.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/2.DxwYfh1z.css.gz +0 -0
  9. package/build/client/_app/immutable/assets/3.Dzh7_Q8n.css.gz +0 -0
  10. package/build/client/_app/immutable/assets/5.CZVw96CJ.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/9.DlSPCZj0.css.gz +0 -0
  12. package/build/client/_app/immutable/assets/AgentSidebar.BL1i3rB_.css.gz +0 -0
  13. package/build/client/_app/immutable/assets/Input.CJ8KyccG.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css.gz +0 -0
  15. package/build/client/_app/immutable/assets/Popper.CLTyHc88.css.gz +0 -0
  16. package/build/client/_app/immutable/assets/Tab.DlCfjMY1.css.gz +0 -0
  17. package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css.gz +0 -0
  18. package/build/client/_app/immutable/assets/editor.BMIWPGx3.css.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{BbgtW0nn.js → -g1l5aoS.js} +3 -3
  20. package/build/client/_app/immutable/chunks/-g1l5aoS.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/-g1l5aoS.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/0cvrggvQ.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/25W9uPmb.js.gz +0 -0
  24. package/build/client/_app/immutable/chunks/4Ik7cdeQ.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/5Rap-vPy.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{BhoEG2uc.js → 7E8m6dwk.js} +1 -1
  27. package/build/client/_app/immutable/chunks/7E8m6dwk.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/7E8m6dwk.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/7qRqthsa.js +1 -0
  30. package/build/client/_app/immutable/chunks/7qRqthsa.js.br +2 -0
  31. package/build/client/_app/immutable/chunks/7qRqthsa.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/{M-7sJE5g.js → AocOovHL.js} +2 -2
  33. package/build/client/_app/immutable/chunks/AocOovHL.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/AocOovHL.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/B03wrqEc.js.gz +0 -0
  36. package/build/client/_app/immutable/chunks/B0iEglSe.js +1 -0
  37. package/build/client/_app/immutable/chunks/B0iEglSe.js.br +0 -0
  38. package/build/client/_app/immutable/chunks/B0iEglSe.js.gz +0 -0
  39. package/build/client/_app/immutable/chunks/B5zXfXm9.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/B9Xyijhd.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/BFG1Mk7z.js.gz +0 -0
  42. package/build/client/_app/immutable/chunks/{CByqsLTI.js → BIpSIzUr.js} +1 -1
  43. package/build/client/_app/immutable/chunks/BIpSIzUr.js.br +0 -0
  44. package/build/client/_app/immutable/chunks/BIpSIzUr.js.gz +0 -0
  45. package/build/client/_app/immutable/chunks/BIv9DU6q.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/BKlk5iyT.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/BL8rPcmP.js +1 -0
  48. package/build/client/_app/immutable/chunks/BL8rPcmP.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/BL8rPcmP.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/BM0jKynj.js +1 -0
  51. package/build/client/_app/immutable/chunks/BM0jKynj.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/BM0jKynj.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/BMYSavKM.js.gz +0 -0
  54. package/build/client/_app/immutable/chunks/{CIXWWiNs.js → BR5f5i_E.js} +1 -1
  55. package/build/client/_app/immutable/chunks/BR5f5i_E.js.br +0 -0
  56. package/build/client/_app/immutable/chunks/BR5f5i_E.js.gz +0 -0
  57. package/build/client/_app/immutable/chunks/BSkB5QuD.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/BTvePR6r.js +1 -0
  59. package/build/client/_app/immutable/chunks/BTvePR6r.js.br +2 -0
  60. package/build/client/_app/immutable/chunks/BTvePR6r.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/BU7aeYn4.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/BY8d35y9.js.gz +0 -0
  63. package/build/client/_app/immutable/chunks/B_c3zf-v.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/B_fMsGYe.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/BaJupSGV.js.gz +0 -0
  66. package/build/client/_app/immutable/chunks/BaLxmfj-.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/Bc-ZgV77.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/{CjrpbQ5G.js → Bcu62lFq.js} +1 -1
  69. package/build/client/_app/immutable/chunks/Bcu62lFq.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/Bcu62lFq.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/BfEKNvv3.js.gz +0 -0
  72. package/build/client/_app/immutable/chunks/Bhzvs7bI.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/Bio4gycK.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/BoFRg7Ot.js.gz +0 -0
  75. package/build/client/_app/immutable/chunks/Bqgm2twL.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/BrgZPUOV.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/BsTHnhdd.js.gz +0 -0
  78. package/build/client/_app/immutable/chunks/C-whEtKd.js +1 -0
  79. package/build/client/_app/immutable/chunks/C-whEtKd.js.br +2 -0
  80. package/build/client/_app/immutable/chunks/C-whEtKd.js.gz +0 -0
  81. package/build/client/_app/immutable/chunks/C1FmrZbK.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/C1WqE8CP.js +1 -0
  83. package/build/client/_app/immutable/chunks/C1WqE8CP.js.br +2 -0
  84. package/build/client/_app/immutable/chunks/C1WqE8CP.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/{18TZju1H.js → C4SnSfql.js} +1 -1
  86. package/build/client/_app/immutable/chunks/C4SnSfql.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/C4SnSfql.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/C4mbwMvt.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/C5WLch3f.js.gz +0 -0
  90. package/build/client/_app/immutable/chunks/CAFoob5N.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/CCSDG5nI.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/CDGzqUPQ.js.gz +0 -0
  93. package/build/client/_app/immutable/chunks/CDntyWJ8.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/CFKIUWau.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/CFOPXBzS.js.gz +0 -0
  96. package/build/client/_app/immutable/chunks/CGinwM47.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/CLLBncYj.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/COyEY5Pt.js.gz +0 -0
  99. package/build/client/_app/immutable/chunks/CPajHgWi.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/CSv1VDXg.js +1 -0
  101. package/build/client/_app/immutable/chunks/CSv1VDXg.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/CSv1VDXg.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/CVwtpugi.js.gz +0 -0
  104. package/build/client/_app/immutable/chunks/CX-rkNHf.js.gz +0 -0
  105. package/build/client/_app/immutable/chunks/CXOwvkN_.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/{C3xZmy9H.js → CXo2BVs0.js} +1 -1
  107. package/build/client/_app/immutable/chunks/CXo2BVs0.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/CXo2BVs0.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/{8AHOieX7.js → CZLNSMhF.js} +17 -17
  110. package/build/client/_app/immutable/chunks/CZLNSMhF.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/CZLNSMhF.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/CdQndTaG.js.gz +0 -0
  113. package/build/client/_app/immutable/chunks/Ce3n6wWz.js.gz +0 -0
  114. package/build/client/_app/immutable/chunks/Cg7bfA9N.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/Cosugfe8.js +1 -0
  116. package/build/client/_app/immutable/chunks/Cosugfe8.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/Cosugfe8.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/Cp1zYvxS.js.gz +0 -0
  119. package/build/client/_app/immutable/chunks/CpIb_Oan.js.gz +0 -0
  120. package/build/client/_app/immutable/chunks/Cpb6xl2v.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/Cphgjts3.js.gz +0 -0
  122. package/build/client/_app/immutable/chunks/CqxCTxvJ.js +1 -0
  123. package/build/client/_app/immutable/chunks/CqxCTxvJ.js.br +0 -0
  124. package/build/client/_app/immutable/chunks/CqxCTxvJ.js.gz +0 -0
  125. package/build/client/_app/immutable/chunks/CrxwEwqu.js.gz +0 -0
  126. package/build/client/_app/immutable/chunks/CwNk8-XU.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/CwmAWymP.js.gz +0 -0
  128. package/build/client/_app/immutable/chunks/{BoYwKlhd.js → CxLG58rb.js} +1 -1
  129. package/build/client/_app/immutable/chunks/CxLG58rb.js.br +0 -0
  130. package/build/client/_app/immutable/chunks/CxLG58rb.js.gz +0 -0
  131. package/build/client/_app/immutable/chunks/CzKuDChf.js.gz +0 -0
  132. package/build/client/_app/immutable/chunks/D-MeaMDU.js.gz +0 -0
  133. package/build/client/_app/immutable/chunks/{BFZvm_aX.js → D-puyTnN.js} +1 -1
  134. package/build/client/_app/immutable/chunks/D-puyTnN.js.br +0 -0
  135. package/build/client/_app/immutable/chunks/D-puyTnN.js.gz +0 -0
  136. package/build/client/_app/immutable/chunks/D3h14YRZ.js.gz +0 -0
  137. package/build/client/_app/immutable/chunks/D4obUD_s.js +1 -0
  138. package/build/client/_app/immutable/chunks/D4obUD_s.js.br +0 -0
  139. package/build/client/_app/immutable/chunks/D4obUD_s.js.gz +0 -0
  140. package/build/client/_app/immutable/chunks/D5C2fndG.js.gz +0 -0
  141. package/build/client/_app/immutable/chunks/{BjbsXXMP.js → D8e7SQh9.js} +1 -1
  142. package/build/client/_app/immutable/chunks/D8e7SQh9.js.br +0 -0
  143. package/build/client/_app/immutable/chunks/D8e7SQh9.js.gz +0 -0
  144. package/build/client/_app/immutable/chunks/DDMPVpvs.js.gz +0 -0
  145. package/build/client/_app/immutable/chunks/DDwshQtU.js.gz +0 -0
  146. package/build/client/_app/immutable/chunks/DHaeiCBh.js.gz +0 -0
  147. package/build/client/_app/immutable/chunks/DLQqXQ6R.js.gz +0 -0
  148. package/build/client/_app/immutable/chunks/{CHE9OFXA.js → DNLcpWO_.js} +1 -1
  149. package/build/client/_app/immutable/chunks/DNLcpWO_.js.br +0 -0
  150. package/build/client/_app/immutable/chunks/DNLcpWO_.js.gz +0 -0
  151. package/build/client/_app/immutable/chunks/DRIMs3uA.js.gz +0 -0
  152. package/build/client/_app/immutable/chunks/DSZPf7rp.js.gz +0 -0
  153. package/build/client/_app/immutable/chunks/DTECt2xU.js.gz +0 -0
  154. package/build/client/_app/immutable/chunks/DTlGvFHe.js +11 -0
  155. package/build/client/_app/immutable/chunks/DTlGvFHe.js.br +0 -0
  156. package/build/client/_app/immutable/chunks/DTlGvFHe.js.gz +0 -0
  157. package/build/client/_app/immutable/chunks/DUeN9t8P.js.gz +0 -0
  158. package/build/client/_app/immutable/chunks/DWH0347h.js.gz +0 -0
  159. package/build/client/_app/immutable/chunks/DXyYeYxl.js.gz +0 -0
  160. package/build/client/_app/immutable/chunks/{hS1PAb5I.js → DYhTBLDc.js} +1 -1
  161. package/build/client/_app/immutable/chunks/DYhTBLDc.js.br +0 -0
  162. package/build/client/_app/immutable/chunks/DYhTBLDc.js.gz +0 -0
  163. package/build/client/_app/immutable/chunks/DZxMt77D.js.gz +0 -0
  164. package/build/client/_app/immutable/chunks/Dd3NCNK9.js.gz +0 -0
  165. package/build/client/_app/immutable/chunks/DfzH4Xui.js.gz +0 -0
  166. package/build/client/_app/immutable/chunks/DgyLZaXg.js.gz +0 -0
  167. package/build/client/_app/immutable/chunks/DjDhNM9l.js.gz +0 -0
  168. package/build/client/_app/immutable/chunks/DlZKMmqG.js +4 -0
  169. package/build/client/_app/immutable/chunks/DlZKMmqG.js.br +0 -0
  170. package/build/client/_app/immutable/chunks/DlZKMmqG.js.gz +0 -0
  171. package/build/client/_app/immutable/chunks/DnHyzjbg.js.gz +0 -0
  172. package/build/client/_app/immutable/chunks/DrQuvNYM.js.gz +0 -0
  173. package/build/client/_app/immutable/chunks/Drc7WvVn.js.gz +0 -0
  174. package/build/client/_app/immutable/chunks/Dv0gjm25.js +1 -0
  175. package/build/client/_app/immutable/chunks/Dv0gjm25.js.br +0 -0
  176. package/build/client/_app/immutable/chunks/Dv0gjm25.js.gz +0 -0
  177. package/build/client/_app/immutable/chunks/{d-TWvvCu.js → Dv8m1cTI.js} +1 -1
  178. package/build/client/_app/immutable/chunks/Dv8m1cTI.js.br +0 -0
  179. package/build/client/_app/immutable/chunks/{d-TWvvCu.js.gz → Dv8m1cTI.js.gz} +0 -0
  180. package/build/client/_app/immutable/chunks/DwJ7jVG9.js.gz +0 -0
  181. package/build/client/_app/immutable/chunks/DyP6w7ZV.js.gz +0 -0
  182. package/build/client/_app/immutable/chunks/{0a4GbU-O.js → HJHYLHDn.js} +1 -1
  183. package/build/client/_app/immutable/chunks/HJHYLHDn.js.br +0 -0
  184. package/build/client/_app/immutable/chunks/HJHYLHDn.js.gz +0 -0
  185. package/build/client/_app/immutable/chunks/{DkeWvyEi.js → HXxIsSOO.js} +1 -1
  186. package/build/client/_app/immutable/chunks/HXxIsSOO.js.br +0 -0
  187. package/build/client/_app/immutable/chunks/HXxIsSOO.js.gz +0 -0
  188. package/build/client/_app/immutable/chunks/JcG4w2gF.js.gz +0 -0
  189. package/build/client/_app/immutable/chunks/OA8UcISh.js.gz +0 -0
  190. package/build/client/_app/immutable/chunks/T0seCQS_.js +1 -0
  191. package/build/client/_app/immutable/chunks/T0seCQS_.js.br +0 -0
  192. package/build/client/_app/immutable/chunks/T0seCQS_.js.gz +0 -0
  193. package/build/client/_app/immutable/chunks/Tw7wswEv.js.gz +0 -0
  194. package/build/client/_app/immutable/chunks/{CAOT34jI.js → UiXQyKcj.js} +1 -1
  195. package/build/client/_app/immutable/chunks/UiXQyKcj.js.br +0 -0
  196. package/build/client/_app/immutable/chunks/UiXQyKcj.js.gz +0 -0
  197. package/build/client/_app/immutable/chunks/YWi4-JPR.js.gz +0 -0
  198. package/build/client/_app/immutable/chunks/ZGfwyPNq.js.gz +0 -0
  199. package/build/client/_app/immutable/chunks/Zznr-cwX.js.gz +0 -0
  200. package/build/client/_app/immutable/chunks/{CynZnIyI.js → _yZg6Sf-.js} +2 -2
  201. package/build/client/_app/immutable/chunks/_yZg6Sf-.js.br +0 -0
  202. package/build/client/_app/immutable/chunks/_yZg6Sf-.js.gz +0 -0
  203. package/build/client/_app/immutable/chunks/bynEV6cE.js.gz +0 -0
  204. package/build/client/_app/immutable/chunks/dUCx_-0o.js.gz +0 -0
  205. package/build/client/_app/immutable/chunks/ddC1NP9R.js.gz +0 -0
  206. package/build/client/_app/immutable/chunks/deUWdS0T.js.gz +0 -0
  207. package/build/client/_app/immutable/chunks/gULlE0tz.js.gz +0 -0
  208. package/build/client/_app/immutable/chunks/i9-g7ZhI.js.gz +0 -0
  209. package/build/client/_app/immutable/chunks/ks45gSgq.js +1 -0
  210. package/build/client/_app/immutable/chunks/ks45gSgq.js.br +0 -0
  211. package/build/client/_app/immutable/chunks/ks45gSgq.js.gz +0 -0
  212. package/build/client/_app/immutable/chunks/nf6ki56Z.js.gz +0 -0
  213. package/build/client/_app/immutable/chunks/pnP8ivHi.js.gz +0 -0
  214. package/build/client/_app/immutable/chunks/rUNN04Wq.js.gz +0 -0
  215. package/build/client/_app/immutable/chunks/tGk8EFnU.js.gz +0 -0
  216. package/build/client/_app/immutable/chunks/xC2C8d09.js.gz +0 -0
  217. package/build/client/_app/immutable/entry/app.qxHHRD2v.js +2 -0
  218. package/build/client/_app/immutable/entry/app.qxHHRD2v.js.br +0 -0
  219. package/build/client/_app/immutable/entry/app.qxHHRD2v.js.gz +0 -0
  220. package/build/client/_app/immutable/entry/start.CSxD7zE8.js +1 -0
  221. package/build/client/_app/immutable/entry/start.CSxD7zE8.js.br +2 -0
  222. package/build/client/_app/immutable/entry/start.CSxD7zE8.js.gz +0 -0
  223. package/build/client/_app/immutable/nodes/{0.DXz9KfRr.js → 0.BiYgQci8.js} +2 -2
  224. package/build/client/_app/immutable/nodes/0.BiYgQci8.js.br +0 -0
  225. package/build/client/_app/immutable/nodes/0.BiYgQci8.js.gz +0 -0
  226. package/build/client/_app/immutable/nodes/1.CShtqUFK.js +1 -0
  227. package/build/client/_app/immutable/nodes/1.CShtqUFK.js.br +0 -0
  228. package/build/client/_app/immutable/nodes/1.CShtqUFK.js.gz +0 -0
  229. package/build/client/_app/immutable/nodes/10.dE-XOJgk.js +7 -0
  230. package/build/client/_app/immutable/nodes/10.dE-XOJgk.js.br +0 -0
  231. package/build/client/_app/immutable/nodes/10.dE-XOJgk.js.gz +0 -0
  232. package/build/client/_app/immutable/nodes/11.CsTD16Gn.js.gz +0 -0
  233. package/build/client/_app/immutable/nodes/12.DYXd_leK.js.gz +0 -0
  234. package/build/client/_app/immutable/nodes/13.DQMjAUKq.js.gz +0 -0
  235. package/build/client/_app/immutable/nodes/14.C59tyoG0.js.gz +0 -0
  236. package/build/client/_app/immutable/nodes/{15.yHpdn4IC.js → 15.Wmhj7gOy.js} +1 -1
  237. package/build/client/_app/immutable/nodes/15.Wmhj7gOy.js.br +0 -0
  238. package/build/client/_app/immutable/nodes/15.Wmhj7gOy.js.gz +0 -0
  239. package/build/client/_app/immutable/nodes/16.DRwcAQjb.js.gz +0 -0
  240. package/build/client/_app/immutable/nodes/17.BwzZwCD0.js +3 -0
  241. package/build/client/_app/immutable/nodes/17.BwzZwCD0.js.br +0 -0
  242. package/build/client/_app/immutable/nodes/17.BwzZwCD0.js.gz +0 -0
  243. package/build/client/_app/immutable/nodes/18.BUMDuaQF.js +11 -0
  244. package/build/client/_app/immutable/nodes/18.BUMDuaQF.js.br +0 -0
  245. package/build/client/_app/immutable/nodes/18.BUMDuaQF.js.gz +0 -0
  246. package/build/client/_app/immutable/nodes/{2.DC1Zz78t.js → 2.DniQTiGZ.js} +3 -3
  247. package/build/client/_app/immutable/nodes/2.DniQTiGZ.js.br +0 -0
  248. package/build/client/_app/immutable/nodes/2.DniQTiGZ.js.gz +0 -0
  249. package/build/client/_app/immutable/nodes/3.BIO1e-qq.js +1 -0
  250. package/build/client/_app/immutable/nodes/3.BIO1e-qq.js.br +0 -0
  251. package/build/client/_app/immutable/nodes/3.BIO1e-qq.js.gz +0 -0
  252. package/build/client/_app/immutable/nodes/{4.C3SmjDhF.js → 4.BwfVTawo.js} +1 -1
  253. package/build/client/_app/immutable/nodes/4.BwfVTawo.js.br +0 -0
  254. package/build/client/_app/immutable/nodes/4.BwfVTawo.js.gz +0 -0
  255. package/build/client/_app/immutable/nodes/5.DdodCQcX.js +1 -0
  256. package/build/client/_app/immutable/nodes/5.DdodCQcX.js.br +0 -0
  257. package/build/client/_app/immutable/nodes/5.DdodCQcX.js.gz +0 -0
  258. package/build/client/_app/immutable/nodes/6.EIjYVI_W.js +1 -0
  259. package/build/client/_app/immutable/nodes/6.EIjYVI_W.js.br +0 -0
  260. package/build/client/_app/immutable/nodes/6.EIjYVI_W.js.gz +0 -0
  261. package/build/client/_app/immutable/nodes/7.7N4iPidV.js.gz +0 -0
  262. package/build/client/_app/immutable/nodes/{8.lyH0lIKf.js → 8.2oZsfzo8.js} +1 -1
  263. package/build/client/_app/immutable/nodes/8.2oZsfzo8.js.br +0 -0
  264. package/build/client/_app/immutable/nodes/8.2oZsfzo8.js.gz +0 -0
  265. package/build/client/_app/immutable/nodes/9.CjWG6Ha9.js +2 -0
  266. package/build/client/_app/immutable/nodes/9.CjWG6Ha9.js.br +0 -0
  267. package/build/client/_app/immutable/nodes/9.CjWG6Ha9.js.gz +0 -0
  268. package/build/client/_app/immutable/workers/css.worker-BRIrhzkG.js.gz +0 -0
  269. package/build/client/_app/immutable/workers/editor.worker-DX6ApQqM.js.gz +0 -0
  270. package/build/client/_app/immutable/workers/html.worker-CBI4EQBP.js.gz +0 -0
  271. package/build/client/_app/immutable/workers/json.worker-CIZWV9vN.js.gz +0 -0
  272. package/build/client/_app/immutable/workers/ts.worker-Ds4I2Msu.js.gz +0 -0
  273. package/build/client/_app/version.json +1 -1
  274. package/build/client/_app/version.json.br +0 -0
  275. package/build/client/_app/version.json.gz +0 -0
  276. package/build/client/fonts.css.gz +0 -0
  277. package/build/client/recombine.svg.gz +0 -0
  278. package/build/client/telescope-icon.svg.gz +0 -0
  279. package/build/client/ui/arrow_tests.svg.gz +0 -0
  280. package/build/client/ui/paperclip.svg.gz +0 -0
  281. package/build/client/ui/send.svg.gz +0 -0
  282. package/build/server/chunks/0-S8VzkGgQ.js +9 -0
  283. package/build/server/chunks/0-S8VzkGgQ.js.map +1 -0
  284. package/build/server/chunks/1-BQkMpHdq.js +9 -0
  285. package/build/server/chunks/{1-DHJzzXji.js.map → 1-BQkMpHdq.js.map} +1 -1
  286. package/build/server/chunks/10-D1k3_nkw.js +9 -0
  287. package/build/server/chunks/10-D1k3_nkw.js.map +1 -0
  288. package/build/server/chunks/{15-ICdGKEie.js → 15-CZBxPMAc.js} +2 -2
  289. package/build/server/chunks/{15-ICdGKEie.js.map → 15-CZBxPMAc.js.map} +1 -1
  290. package/build/server/chunks/17-B72NO3Iu.js +9 -0
  291. package/build/server/chunks/17-B72NO3Iu.js.map +1 -0
  292. package/build/server/chunks/18-4kgQqgz-.js +9 -0
  293. package/build/server/chunks/18-4kgQqgz-.js.map +1 -0
  294. package/build/server/chunks/2-DO8jW3Pl.js +9 -0
  295. package/build/server/chunks/2-DO8jW3Pl.js.map +1 -0
  296. package/build/server/chunks/3-0_f3eZZi.js +9 -0
  297. package/build/server/chunks/3-0_f3eZZi.js.map +1 -0
  298. package/build/server/chunks/4-UxjRsyDW.js +9 -0
  299. package/build/server/chunks/4-UxjRsyDW.js.map +1 -0
  300. package/build/server/chunks/5-C7KuaSU9.js +9 -0
  301. package/build/server/chunks/{5-CwrZ3RpM.js.map → 5-C7KuaSU9.js.map} +1 -1
  302. package/build/server/chunks/6-C6EG0SXo.js +9 -0
  303. package/build/server/chunks/{6-BtuvKB8a.js.map → 6-C6EG0SXo.js.map} +1 -1
  304. package/build/server/chunks/8-BTSvDZhI.js +9 -0
  305. package/build/server/chunks/8-BTSvDZhI.js.map +1 -0
  306. package/build/server/chunks/9-CepnUatA.js +9 -0
  307. package/build/server/chunks/9-CepnUatA.js.map +1 -0
  308. package/build/server/chunks/AgentSidebar-XdGj1sqT.js.map +1 -1
  309. package/build/server/chunks/{Button-Dsy3QY7B.js → Button-BLigKkGG.js} +2 -2
  310. package/build/server/chunks/Button-BLigKkGG.js.map +1 -0
  311. package/build/server/chunks/{ChatStepTrace-ZynTuQTL.js → ChatStepTrace-DnvGtFpb.js} +30 -9
  312. package/build/server/chunks/ChatStepTrace-DnvGtFpb.js.map +1 -0
  313. package/build/server/chunks/{Input-CHFlfduw.js → Input-OdQKNdS6.js} +1 -2
  314. package/build/server/chunks/Input-OdQKNdS6.js.map +1 -0
  315. package/build/server/chunks/Modal-DtVsRmmO.js.map +1 -1
  316. package/build/server/chunks/{_layout.svelte-2zFP7RWi.js → _layout.svelte-C5Y9nSXi.js} +5 -4
  317. package/build/server/chunks/{_layout.svelte-2zFP7RWi.js.map → _layout.svelte-C5Y9nSXi.js.map} +1 -1
  318. package/build/server/chunks/{_layout.svelte-Cgnhhd3c.js → _layout.svelte-_oqm8kmr.js} +5 -5
  319. package/build/server/chunks/_layout.svelte-_oqm8kmr.js.map +1 -0
  320. package/build/server/chunks/{_page.svelte-C9wKPt_S.js → _page.svelte-BYVcy49A.js} +3 -2
  321. package/build/server/chunks/{_page.svelte-C9wKPt_S.js.map → _page.svelte-BYVcy49A.js.map} +1 -1
  322. package/build/server/chunks/{_page.svelte-Cwut2PVb.js → _page.svelte-BpRksNEG.js} +3 -2
  323. package/build/server/chunks/{_page.svelte-Cwut2PVb.js.map → _page.svelte-BpRksNEG.js.map} +1 -1
  324. package/build/server/chunks/_page.svelte-CEhhEdMi.js +2100 -0
  325. package/build/server/chunks/_page.svelte-CEhhEdMi.js.map +1 -0
  326. package/build/server/chunks/{_page.svelte-BsIw3yWt.js → _page.svelte-DDpBtd3X.js} +3 -2
  327. package/build/server/chunks/{_page.svelte-BsIw3yWt.js.map → _page.svelte-DDpBtd3X.js.map} +1 -1
  328. package/build/server/chunks/{_page.svelte-CY4SZM-i.js → _page.svelte-DOhPbizt.js} +137 -97
  329. package/build/server/chunks/_page.svelte-DOhPbizt.js.map +1 -0
  330. package/build/server/chunks/{_page.svelte-DdmEn1df.js → _page.svelte-QlYvVgTj.js} +71 -5
  331. package/build/server/chunks/_page.svelte-QlYvVgTj.js.map +1 -0
  332. package/build/server/chunks/{_page.svelte-BhU1G2ip.js → _page.svelte-bkzbqII3.js} +470 -100
  333. package/build/server/chunks/_page.svelte-bkzbqII3.js.map +1 -0
  334. package/build/server/chunks/agents-context-rV2narXG.js.map +1 -1
  335. package/build/server/chunks/edit-workspace-context-B1nYQ5hD.js.map +1 -1
  336. package/build/server/chunks/index-CSpGrMM2.js.map +1 -1
  337. package/build/server/chunks/latency--f3JYIRg.js +157 -0
  338. package/build/server/chunks/latency--f3JYIRg.js.map +1 -0
  339. package/build/server/chunks/log-content.svelte-CfQzj-v_.js.map +1 -1
  340. package/build/server/chunks/trpc-client-D8L6vWf4.js +14 -0
  341. package/build/server/chunks/trpc-client-D8L6vWf4.js.map +1 -0
  342. package/build/server/index.js +1 -1
  343. package/build/server/index.js.map +1 -1
  344. package/build/server/manifest.js +14 -14
  345. package/build/server/manifest.js.map +1 -1
  346. package/package.json +6 -2
  347. package/src/backend/lib/voice-agent-lifecycle.test.ts +27 -0
  348. package/src/backend/lib/voice-agent-lifecycle.ts +15 -0
  349. package/src/backend/roleplay/agents.ts +172 -70
  350. package/src/backend/roleplay/message-dispatcher.ts +0 -7
  351. package/src/backend/roleplay/router.ts +6 -14
  352. package/src/backend/roleplay/trace-serialization.spec.ts +35 -0
  353. package/src/backend/roleplay/trace-serialization.ts +57 -0
  354. package/src/backend/roleplay/variants.ts +33 -49
  355. package/src/backend/server.ts +22 -3
  356. package/src/backend/tests/academy.ts +55 -11
  357. package/src/backend/tests/data.ts +167 -14
  358. package/src/backend/tests/emulate-agents.ts +19 -3
  359. package/src/backend/tests/router.ts +21 -1
  360. package/src/backend/tests/suite.ts +13 -4
  361. package/build/client/_app/immutable/assets/0.DsHRdhUK.css +0 -1
  362. package/build/client/_app/immutable/assets/0.DsHRdhUK.css.br +0 -0
  363. package/build/client/_app/immutable/assets/0.DsHRdhUK.css.gz +0 -0
  364. package/build/client/_app/immutable/chunks/0a4GbU-O.js.br +0 -0
  365. package/build/client/_app/immutable/chunks/0a4GbU-O.js.gz +0 -0
  366. package/build/client/_app/immutable/chunks/18TZju1H.js.br +0 -0
  367. package/build/client/_app/immutable/chunks/18TZju1H.js.gz +0 -0
  368. package/build/client/_app/immutable/chunks/5qVV3FOd.js +0 -1
  369. package/build/client/_app/immutable/chunks/5qVV3FOd.js.br +0 -0
  370. package/build/client/_app/immutable/chunks/5qVV3FOd.js.gz +0 -0
  371. package/build/client/_app/immutable/chunks/8AHOieX7.js.br +0 -0
  372. package/build/client/_app/immutable/chunks/8AHOieX7.js.gz +0 -0
  373. package/build/client/_app/immutable/chunks/B2CB3tIy.js +0 -1
  374. package/build/client/_app/immutable/chunks/B2CB3tIy.js.br +0 -0
  375. package/build/client/_app/immutable/chunks/B2CB3tIy.js.gz +0 -0
  376. package/build/client/_app/immutable/chunks/BFZvm_aX.js.br +0 -0
  377. package/build/client/_app/immutable/chunks/BFZvm_aX.js.gz +0 -0
  378. package/build/client/_app/immutable/chunks/BQorBhFb.js +0 -1
  379. package/build/client/_app/immutable/chunks/BQorBhFb.js.br +0 -0
  380. package/build/client/_app/immutable/chunks/BQorBhFb.js.gz +0 -0
  381. package/build/client/_app/immutable/chunks/Bas80-m6.js +0 -1
  382. package/build/client/_app/immutable/chunks/Bas80-m6.js.br +0 -0
  383. package/build/client/_app/immutable/chunks/Bas80-m6.js.gz +0 -0
  384. package/build/client/_app/immutable/chunks/BbgtW0nn.js.br +0 -0
  385. package/build/client/_app/immutable/chunks/BbgtW0nn.js.gz +0 -0
  386. package/build/client/_app/immutable/chunks/BhoEG2uc.js.br +0 -0
  387. package/build/client/_app/immutable/chunks/BhoEG2uc.js.gz +0 -0
  388. package/build/client/_app/immutable/chunks/BjbsXXMP.js.br +0 -0
  389. package/build/client/_app/immutable/chunks/BjbsXXMP.js.gz +0 -0
  390. package/build/client/_app/immutable/chunks/BoYwKlhd.js.br +0 -0
  391. package/build/client/_app/immutable/chunks/BoYwKlhd.js.gz +0 -0
  392. package/build/client/_app/immutable/chunks/C3xZmy9H.js.br +0 -0
  393. package/build/client/_app/immutable/chunks/C3xZmy9H.js.gz +0 -0
  394. package/build/client/_app/immutable/chunks/CAOT34jI.js.br +0 -0
  395. package/build/client/_app/immutable/chunks/CAOT34jI.js.gz +0 -0
  396. package/build/client/_app/immutable/chunks/CByqsLTI.js.br +0 -0
  397. package/build/client/_app/immutable/chunks/CByqsLTI.js.gz +0 -0
  398. package/build/client/_app/immutable/chunks/CGS76TsG.js +0 -1
  399. package/build/client/_app/immutable/chunks/CGS76TsG.js.br +0 -2
  400. package/build/client/_app/immutable/chunks/CGS76TsG.js.gz +0 -0
  401. package/build/client/_app/immutable/chunks/CHE9OFXA.js.br +0 -0
  402. package/build/client/_app/immutable/chunks/CHE9OFXA.js.gz +0 -0
  403. package/build/client/_app/immutable/chunks/CIXWWiNs.js.br +0 -0
  404. package/build/client/_app/immutable/chunks/CIXWWiNs.js.gz +0 -0
  405. package/build/client/_app/immutable/chunks/CQd8uuj9.js +0 -1
  406. package/build/client/_app/immutable/chunks/CQd8uuj9.js.br +0 -2
  407. package/build/client/_app/immutable/chunks/CQd8uuj9.js.gz +0 -0
  408. package/build/client/_app/immutable/chunks/CV_MnPl-.js +0 -1
  409. package/build/client/_app/immutable/chunks/CV_MnPl-.js.br +0 -0
  410. package/build/client/_app/immutable/chunks/CV_MnPl-.js.gz +0 -0
  411. package/build/client/_app/immutable/chunks/CaligHlp.js +0 -1
  412. package/build/client/_app/immutable/chunks/CaligHlp.js.br +0 -0
  413. package/build/client/_app/immutable/chunks/CaligHlp.js.gz +0 -0
  414. package/build/client/_app/immutable/chunks/CbvL5X4R.js +0 -4
  415. package/build/client/_app/immutable/chunks/CbvL5X4R.js.br +0 -0
  416. package/build/client/_app/immutable/chunks/CbvL5X4R.js.gz +0 -0
  417. package/build/client/_app/immutable/chunks/CjrpbQ5G.js.br +0 -0
  418. package/build/client/_app/immutable/chunks/CjrpbQ5G.js.gz +0 -0
  419. package/build/client/_app/immutable/chunks/Cx0HrUMB.js +0 -11
  420. package/build/client/_app/immutable/chunks/Cx0HrUMB.js.br +0 -0
  421. package/build/client/_app/immutable/chunks/Cx0HrUMB.js.gz +0 -0
  422. package/build/client/_app/immutable/chunks/CynZnIyI.js.br +0 -0
  423. package/build/client/_app/immutable/chunks/CynZnIyI.js.gz +0 -0
  424. package/build/client/_app/immutable/chunks/DHHC89bH.js +0 -1
  425. package/build/client/_app/immutable/chunks/DHHC89bH.js.br +0 -2
  426. package/build/client/_app/immutable/chunks/DHHC89bH.js.gz +0 -0
  427. package/build/client/_app/immutable/chunks/DVqtH_YB.js +0 -1
  428. package/build/client/_app/immutable/chunks/DVqtH_YB.js.br +0 -0
  429. package/build/client/_app/immutable/chunks/DVqtH_YB.js.gz +0 -0
  430. package/build/client/_app/immutable/chunks/DaV9XiwS.js +0 -1
  431. package/build/client/_app/immutable/chunks/DaV9XiwS.js.br +0 -0
  432. package/build/client/_app/immutable/chunks/DaV9XiwS.js.gz +0 -0
  433. package/build/client/_app/immutable/chunks/DkeWvyEi.js.br +0 -0
  434. package/build/client/_app/immutable/chunks/DkeWvyEi.js.gz +0 -0
  435. package/build/client/_app/immutable/chunks/M-7sJE5g.js.br +0 -0
  436. package/build/client/_app/immutable/chunks/M-7sJE5g.js.gz +0 -0
  437. package/build/client/_app/immutable/chunks/Ps08lWnD.js +0 -1
  438. package/build/client/_app/immutable/chunks/Ps08lWnD.js.br +0 -0
  439. package/build/client/_app/immutable/chunks/Ps08lWnD.js.gz +0 -0
  440. package/build/client/_app/immutable/chunks/d-TWvvCu.js.br +0 -0
  441. package/build/client/_app/immutable/chunks/hS1PAb5I.js.br +0 -0
  442. package/build/client/_app/immutable/chunks/hS1PAb5I.js.gz +0 -0
  443. package/build/client/_app/immutable/chunks/wZR3OpgZ.js +0 -1
  444. package/build/client/_app/immutable/chunks/wZR3OpgZ.js.br +0 -2
  445. package/build/client/_app/immutable/chunks/wZR3OpgZ.js.gz +0 -0
  446. package/build/client/_app/immutable/entry/app.4nlNBoFO.js +0 -2
  447. package/build/client/_app/immutable/entry/app.4nlNBoFO.js.br +0 -0
  448. package/build/client/_app/immutable/entry/app.4nlNBoFO.js.gz +0 -0
  449. package/build/client/_app/immutable/entry/start.Du6iPGlG.js +0 -1
  450. package/build/client/_app/immutable/entry/start.Du6iPGlG.js.br +0 -2
  451. package/build/client/_app/immutable/entry/start.Du6iPGlG.js.gz +0 -0
  452. package/build/client/_app/immutable/nodes/0.DXz9KfRr.js.br +0 -0
  453. package/build/client/_app/immutable/nodes/0.DXz9KfRr.js.gz +0 -0
  454. package/build/client/_app/immutable/nodes/1.C14tFTfE.js +0 -1
  455. package/build/client/_app/immutable/nodes/1.C14tFTfE.js.br +0 -0
  456. package/build/client/_app/immutable/nodes/1.C14tFTfE.js.gz +0 -0
  457. package/build/client/_app/immutable/nodes/10.D2pJamM_.js +0 -5
  458. package/build/client/_app/immutable/nodes/10.D2pJamM_.js.br +0 -0
  459. package/build/client/_app/immutable/nodes/10.D2pJamM_.js.gz +0 -0
  460. package/build/client/_app/immutable/nodes/15.yHpdn4IC.js.br +0 -0
  461. package/build/client/_app/immutable/nodes/15.yHpdn4IC.js.gz +0 -0
  462. package/build/client/_app/immutable/nodes/17.tRxMrZSc.js +0 -4
  463. package/build/client/_app/immutable/nodes/17.tRxMrZSc.js.br +0 -0
  464. package/build/client/_app/immutable/nodes/17.tRxMrZSc.js.gz +0 -0
  465. package/build/client/_app/immutable/nodes/18.h3m2E_FB.js +0 -11
  466. package/build/client/_app/immutable/nodes/18.h3m2E_FB.js.br +0 -0
  467. package/build/client/_app/immutable/nodes/18.h3m2E_FB.js.gz +0 -0
  468. package/build/client/_app/immutable/nodes/2.DC1Zz78t.js.br +0 -0
  469. package/build/client/_app/immutable/nodes/2.DC1Zz78t.js.gz +0 -0
  470. package/build/client/_app/immutable/nodes/3.CwOiRWmo.js +0 -1
  471. package/build/client/_app/immutable/nodes/3.CwOiRWmo.js.br +0 -0
  472. package/build/client/_app/immutable/nodes/3.CwOiRWmo.js.gz +0 -0
  473. package/build/client/_app/immutable/nodes/4.C3SmjDhF.js.br +0 -0
  474. package/build/client/_app/immutable/nodes/4.C3SmjDhF.js.gz +0 -0
  475. package/build/client/_app/immutable/nodes/5.26wwTN6d.js +0 -1
  476. package/build/client/_app/immutable/nodes/5.26wwTN6d.js.br +0 -0
  477. package/build/client/_app/immutable/nodes/5.26wwTN6d.js.gz +0 -0
  478. package/build/client/_app/immutable/nodes/6.DYzKzkhv.js +0 -1
  479. package/build/client/_app/immutable/nodes/6.DYzKzkhv.js.br +0 -0
  480. package/build/client/_app/immutable/nodes/6.DYzKzkhv.js.gz +0 -0
  481. package/build/client/_app/immutable/nodes/8.lyH0lIKf.js.br +0 -0
  482. package/build/client/_app/immutable/nodes/8.lyH0lIKf.js.gz +0 -0
  483. package/build/client/_app/immutable/nodes/9.UnSjcLjn.js +0 -2
  484. package/build/client/_app/immutable/nodes/9.UnSjcLjn.js.br +0 -0
  485. package/build/client/_app/immutable/nodes/9.UnSjcLjn.js.gz +0 -0
  486. package/build/server/chunks/0-D0-90TbM.js +0 -9
  487. package/build/server/chunks/0-D0-90TbM.js.map +0 -1
  488. package/build/server/chunks/1-DHJzzXji.js +0 -9
  489. package/build/server/chunks/10-3jjzakty.js +0 -9
  490. package/build/server/chunks/10-3jjzakty.js.map +0 -1
  491. package/build/server/chunks/17-Bozc5IJF.js +0 -9
  492. package/build/server/chunks/17-Bozc5IJF.js.map +0 -1
  493. package/build/server/chunks/18-DoqpHfoi.js +0 -9
  494. package/build/server/chunks/18-DoqpHfoi.js.map +0 -1
  495. package/build/server/chunks/2-DhghCZp5.js +0 -9
  496. package/build/server/chunks/2-DhghCZp5.js.map +0 -1
  497. package/build/server/chunks/3-Cx4tDHgq.js +0 -9
  498. package/build/server/chunks/3-Cx4tDHgq.js.map +0 -1
  499. package/build/server/chunks/4-DCqFV5Ug.js +0 -9
  500. package/build/server/chunks/4-DCqFV5Ug.js.map +0 -1
  501. package/build/server/chunks/5-CwrZ3RpM.js +0 -9
  502. package/build/server/chunks/6-BtuvKB8a.js +0 -9
  503. package/build/server/chunks/8-Di6Wb0mD.js +0 -9
  504. package/build/server/chunks/8-Di6Wb0mD.js.map +0 -1
  505. package/build/server/chunks/9-CXT-H9KT.js +0 -9
  506. package/build/server/chunks/9-CXT-H9KT.js.map +0 -1
  507. package/build/server/chunks/Button-Dsy3QY7B.js.map +0 -1
  508. package/build/server/chunks/ChatStepTrace-ZynTuQTL.js.map +0 -1
  509. package/build/server/chunks/Input-CHFlfduw.js.map +0 -1
  510. package/build/server/chunks/_layout.svelte-Cgnhhd3c.js.map +0 -1
  511. package/build/server/chunks/_page.svelte-BhU1G2ip.js.map +0 -1
  512. package/build/server/chunks/_page.svelte-CY4SZM-i.js.map +0 -1
  513. package/build/server/chunks/_page.svelte-DdmEn1df.js.map +0 -1
  514. package/build/server/chunks/_page.svelte-DiI_KSHV.js +0 -670
  515. package/build/server/chunks/_page.svelte-DiI_KSHV.js.map +0 -1
  516. package/build/server/chunks/trpc-client-Bucti7HD.js +0 -13
  517. package/build/server/chunks/trpc-client-Bucti7HD.js.map +0 -1
@@ -104,7 +104,7 @@ export function createRolePlayRouter(t: TRPCRootObject<TrpcContext, any, any>) {
104
104
  if (entry.type !== 'message') continue
105
105
  const payload = entry.payload
106
106
  if (!payload || typeof payload !== 'object') continue
107
- if (payload.sender !== 'user') continue
107
+ if (payload.sender !== 'user' && payload.sender !== 'system') continue
108
108
 
109
109
  const rawText = payload.text
110
110
  if (typeof rawText !== 'string') continue
@@ -130,8 +130,6 @@ export function createRolePlayRouter(t: TRPCRootObject<TrpcContext, any, any>) {
130
130
  z.object({
131
131
  agentId: AgentIdSchema,
132
132
  region: z.string().trim().min(1).max(128).nullable().optional(),
133
- prevStateId: z.string().trim().min(1).max(2048).nullable(),
134
- rawUserMessage: z.string().trim().min(1).max(100_000),
135
133
  context: z.record(z.string(), z.unknown()).nullable().optional(),
136
134
  promptUpdate: z
137
135
  .object({
@@ -155,16 +153,13 @@ export function createRolePlayRouter(t: TRPCRootObject<TrpcContext, any, any>) {
155
153
  const rawStates = await fsStatePersistence.load(stateKey)
156
154
  const states = Array.isArray(rawStates) ? rawStates : []
157
155
  const context =
158
- input.context && typeof input.context === 'object'
159
- ? input.context
160
- : ((await fsContextPersistence.load('default')) as Record<string, any>) || {}
156
+ input.context ??
157
+ (((await fsContextPersistence.load('default')) as Record<string, any> | null) || {})
161
158
 
162
159
  const variants = await generateReplyVariants({
163
160
  agentId: input.agentId,
164
161
  region: input.region ?? null,
165
162
  states,
166
- prevStateId: input.prevStateId ?? null,
167
- rawUserMessage: input.rawUserMessage,
168
163
  count: input.count,
169
164
  context
170
165
  })
@@ -183,7 +178,6 @@ export function createRolePlayRouter(t: TRPCRootObject<TrpcContext, any, any>) {
183
178
  z.object({
184
179
  agentId: AgentIdSchema,
185
180
  region: z.string().trim().min(1).max(128).nullable().optional(),
186
- targetStateId: z.string().trim().min(1).max(2048),
187
181
  state: z.object({
188
182
  history: z.unknown(),
189
183
  schedule: z.unknown()
@@ -194,12 +188,10 @@ export function createRolePlayRouter(t: TRPCRootObject<TrpcContext, any, any>) {
194
188
  const stateKey = resolveAgentStateKey(input.agentId, input.region ?? null)
195
189
  const rawStates = await fsStatePersistence.load(stateKey)
196
190
  const states = Array.isArray(rawStates) ? rawStates : []
197
- if (!states.length) throw new Error('No saved roleplay states found for this agent')
198
- if (states[states.length - 1]?.id !== input.targetStateId) {
199
- throw new Error('Variants can only be applied to the latest saved reply')
200
- }
191
+ const latestState = states.at(-1)
192
+ if (!latestState) throw new Error('No saved roleplay states found for this agent')
201
193
 
202
- const nextStates = replaceSavedState(states, input.targetStateId, {
194
+ const nextStates = replaceSavedState(states, latestState.id, {
203
195
  history: input.state.history as AgentState['history'],
204
196
  schedule: input.state.schedule as AgentState['schedule']
205
197
  })
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { normalizeTracePayload } from './trace-serialization'
3
+
4
+ describe('normalizeTracePayload', () => {
5
+ it('keeps error details when trace payloads are JSON serialized', () => {
6
+ const cause = new Error('schema expected array')
7
+ const error = new Error('Response parsing error') as Error & {
8
+ cause?: unknown
9
+ operation?: string
10
+ }
11
+ error.cause = cause
12
+ error.operation = 'fetchCustomerDetails'
13
+
14
+ const normalized = normalizeTracePayload({
15
+ name: 'request-customer-details',
16
+ error
17
+ })
18
+
19
+ expect(normalized.error).toMatchObject({
20
+ name: 'Error',
21
+ message: 'Response parsing error',
22
+ operation: 'fetchCustomerDetails',
23
+ cause: {
24
+ name: 'Error',
25
+ message: 'schema expected array'
26
+ }
27
+ })
28
+ expect(JSON.parse(JSON.stringify(normalized)).error).toMatchObject({
29
+ message: 'Response parsing error',
30
+ cause: {
31
+ message: 'schema expected array'
32
+ }
33
+ })
34
+ })
35
+ })
@@ -0,0 +1,57 @@
1
+ export function normalizeTracePayload<T>(value: T): T {
2
+ return normalizeValue(value, new WeakMap<object, unknown>()) as T
3
+ }
4
+
5
+ function normalizeValue(value: unknown, seen: WeakMap<object, unknown>): unknown {
6
+ if (value == null) return value
7
+ if (typeof value === 'bigint') return value.toString()
8
+ if (typeof value !== 'object') return value
9
+ if (value instanceof Error) return normalizeError(value, seen)
10
+ if (value instanceof Date) return value.toISOString()
11
+
12
+ const existing = seen.get(value)
13
+ if (existing) return '[Circular]'
14
+
15
+ if (Array.isArray(value)) {
16
+ const next: unknown[] = []
17
+ seen.set(value, next)
18
+ for (const item of value) {
19
+ const normalized = normalizeValue(item, seen)
20
+ next.push(normalized === undefined ? null : normalized)
21
+ }
22
+ return next
23
+ }
24
+
25
+ const next: Record<string, unknown> = {}
26
+ seen.set(value, next)
27
+ for (const [key, item] of Object.entries(value)) {
28
+ next[key] = normalizeValue(item, seen)
29
+ }
30
+ return next
31
+ }
32
+
33
+ function normalizeError(error: Error, seen: WeakMap<object, unknown>): Record<string, unknown> {
34
+ const existing = seen.get(error)
35
+ if (existing) return { name: error.name || 'Error', message: '[Circular]' }
36
+
37
+ const next: Record<string, unknown> = {
38
+ name: error.name || 'Error',
39
+ message: error.message || String(error)
40
+ }
41
+ seen.set(error, next)
42
+
43
+ if (typeof error.stack === 'string' && error.stack) {
44
+ next.stack = error.stack
45
+ }
46
+
47
+ if ('cause' in error) {
48
+ next.cause = normalizeValue((error as Error & { cause?: unknown }).cause, seen)
49
+ }
50
+
51
+ for (const key of Object.getOwnPropertyNames(error)) {
52
+ if (key in next) continue
53
+ next[key] = normalizeValue((error as unknown as Record<string, unknown>)[key], seen)
54
+ }
55
+
56
+ return next
57
+ }
@@ -28,28 +28,30 @@ export async function generateReplyVariants(props: {
28
28
  agentId: string
29
29
  region?: string | null
30
30
  states: AgentState[]
31
- prevStateId: string | null
32
- rawUserMessage: string
33
31
  count: number
34
32
  context: Record<string, any>
35
33
  }): Promise<GeneratedVariant[]> {
36
- const { agentId, region, states, prevStateId, rawUserMessage, count, context } = props
34
+ const { agentId, region, states, count, context } = props
37
35
  if (!Number.isFinite(count) || count <= 0) return []
36
+ const targetState = states.at(-1)
37
+ if (!targetState) throw new Error('No saved roleplay state found for variants')
38
38
 
39
39
  const rootPath = await getRootPath()
40
40
  const { factories } = await getAgentFactories(rootPath, getImportNonce())
41
41
  const factory = factories[agentId]
42
42
  if (!factory) throw new Error(`Cannot find agent ${agentId}`)
43
43
 
44
- const statesById = new Map<string, AgentState>()
45
- for (const state of states) statesById.set(state.id, clone(state))
44
+ const statesById = new Map(states.map((state) => [state.id, clone(state)]))
46
45
 
46
+ const prevStateId = targetState.prev
47
47
  const prevState = prevStateId ? (statesById.get(prevStateId) ?? null) : null
48
48
  if (prevStateId && !prevState) {
49
49
  throw new Error('Could not find the previous roleplay state for this reply')
50
50
  }
51
51
 
52
- const message = parseRawUserMessage(rawUserMessage)
52
+ const message = latestInputMessage(targetState)
53
+ if (!message) throw new Error('Could not reconstruct the input message for variants')
54
+
53
55
  return Promise.all(
54
56
  Array.from({ length: count }, (_, index) =>
55
57
  generateSingleReplyVariant({
@@ -59,7 +61,6 @@ export async function generateReplyVariants(props: {
59
61
  context,
60
62
  prevState,
61
63
  statesById,
62
- rawUserMessage,
63
64
  message
64
65
  })
65
66
  )
@@ -84,20 +85,6 @@ export function replaceSavedState(
84
85
  return next
85
86
  }
86
87
 
87
- function parseRawUserMessage(raw: string): Message {
88
- const trimmed = String(raw ?? '').trim()
89
- if (!trimmed) throw new Error('Could not reconstruct the user message for variants')
90
-
91
- const imageMatch = /^\[image\]\s+(.+)$/u.exec(trimmed)
92
- if (imageMatch) {
93
- const imageUrl = (imageMatch[1] ?? '').trim()
94
- if (!imageUrl) throw new Error('Image variant message is missing its URL')
95
- return { sender: 'user', text: '', imageUrl }
96
- }
97
-
98
- return { sender: 'user', text: trimmed }
99
- }
100
-
101
88
  function collectMessagesUpToState(
102
89
  statesById: Map<string, AgentState>,
103
90
  stateId: string | null
@@ -124,30 +111,32 @@ function collectMessagesUpToState(
124
111
  }
125
112
 
126
113
  function collectMessagesFromHistory(history: AgentState['history']): Message[] {
127
- const messages: Message[] = []
128
- for (const entry of history) {
129
- if (entry.type !== 'message') continue
130
- messages.push(entry.payload as Message)
131
- }
132
- return messages
114
+ return history.filter((entry) => entry.type === 'message').map((entry) => entry.payload)
115
+ }
116
+
117
+ function latestInputMessage(state: AgentState): Message | null {
118
+ const entry = [...state.history]
119
+ .reverse()
120
+ .find(
121
+ (entry) =>
122
+ entry.type === 'message' &&
123
+ (entry.payload.sender === 'user' || entry.payload.sender === 'system')
124
+ )
125
+ return entry ? clone(entry.payload as Message) : null
133
126
  }
134
127
 
135
128
  function extractVariantText(state: AgentState): string {
136
- for (let index = state.history.length - 1; index >= 0; index--) {
137
- const entry = state.history[index]
138
- if (entry.type !== 'conversational-trace') continue
139
- const trace = entry.payload as ConversationalTrace
140
- if (trace.eventName === 'finished-main-streaming-step' || trace.eventName === 'sent-message') {
141
- return String(trace.content ?? '')
142
- }
143
- }
129
+ const traceEntry = [...state.history].reverse().find((entry) => {
130
+ if (entry.type !== 'conversational-trace') return false
131
+ const trace = entry.payload
132
+ return trace.eventName === 'finished-main-streaming-step' || trace.eventName === 'sent-message'
133
+ })
134
+ if (traceEntry) return String((traceEntry.payload as ConversationalTrace).content ?? '')
144
135
 
145
- for (let index = state.history.length - 1; index >= 0; index--) {
146
- const entry = state.history[index]
147
- if (entry.type !== 'message') continue
148
- const payload = entry.payload as Message
149
- if (payload.sender === 'agent') return String(payload.text ?? '')
150
- }
136
+ const messageEntry = [...state.history]
137
+ .reverse()
138
+ .find((entry) => entry.type === 'message' && entry.payload.sender === 'agent')
139
+ if (messageEntry) return String((messageEntry.payload as Message).text ?? '')
151
140
 
152
141
  return ''
153
142
  }
@@ -171,10 +160,9 @@ async function generateSingleReplyVariant(props: {
171
160
  context: Record<string, any>
172
161
  prevState: AgentState | null
173
162
  statesById: Map<string, AgentState>
174
- rawUserMessage: string
175
163
  message: Message
176
164
  }): Promise<GeneratedVariant> {
177
- const { index, factory, region, context, prevState, statesById, rawUserMessage, message } = props
165
+ const { index, factory, region, context, prevState, statesById, message } = props
178
166
 
179
167
  const state = createVariantState(prevState?.id ?? null, index)
180
168
  const scheduleSeed = clone(prevState?.schedule ?? {})
@@ -212,9 +200,6 @@ async function generateSingleReplyVariant(props: {
212
200
  }
213
201
  const conversationalTracer: ConversationalTracer = {
214
202
  addConversationalTrace: (trace: ConversationalTrace) => {
215
- ;(trace as any).bosunStateId = state.id
216
- ;(trace as any).bosunPrevStateId = state.prev
217
- ;(trace as any).bosunUserMessage = rawUserMessage
218
203
  state.history.push({
219
204
  type: 'conversational-trace',
220
205
  payload: trace
@@ -228,9 +213,6 @@ async function generateSingleReplyVariant(props: {
228
213
  const current = (ctx.get() as Record<string, unknown> | null | undefined) || {}
229
214
  ctx.set({ ...current, recombineRegion: region })
230
215
  }
231
- if (context && typeof context === 'object') {
232
- ctx.swap(region ? { ...context, recombineRegion: region } : context)
233
- }
234
216
 
235
217
  const getMessages = () => [
236
218
  ...collectMessagesUpToState(statesById, state.prev),
@@ -263,6 +245,8 @@ async function generateSingleReplyVariant(props: {
263
245
  }
264
246
  })
265
247
 
248
+ ctx.swap(region ? { ...context, recombineRegion: region } : context)
249
+
266
250
  scheduler.setState(scheduleSeed)
267
251
 
268
252
  if (!state.prev && hasStart(agent)) {
@@ -9,12 +9,16 @@ import { createRegionConfigRouter } from './region/router'
9
9
  import { createContext, type TrpcContext } from './lib/trpc-context'
10
10
  import { cors } from './lib/middleware/cors'
11
11
 
12
- const WS_PORT = 8080
13
- const HTTP_PORT = 2022
12
+ const WS_PORT = readPort(['BOSUN_WS_PORT', 'PUBLIC_WS_PORT'], 8080)
13
+ const HTTP_PORT = readPort(['BOSUN_TRPC_PORT', 'PUBLIC_TRPC_PORT'], 2022)
14
14
 
15
15
  const wss = new WebSocketServer({ port: WS_PORT })
16
16
 
17
- wss.on('connection', oldServer)
17
+ wss.on('connection', (ws) => {
18
+ void oldServer(ws).catch((error: unknown) => {
19
+ console.error(error)
20
+ })
21
+ })
18
22
 
19
23
  console.log(`WebSocket server started on ws://localhost:${WS_PORT}`)
20
24
 
@@ -49,3 +53,18 @@ function shutdown() {
49
53
  server.close()
50
54
  wss.close()
51
55
  }
56
+
57
+ function readPort(names: string[], fallback: number): number {
58
+ for (const name of names) {
59
+ const value = process.env[name]
60
+ if (!value) continue
61
+
62
+ const port = Number(value)
63
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
64
+ throw new Error(`Invalid port for ${name}: ${value}`)
65
+ }
66
+ return port
67
+ }
68
+
69
+ return fallback
70
+ }
@@ -8,7 +8,7 @@ import { type Assertion as PFAssertion } from 'promptfoo'
8
8
  import { tryReadConfig } from './config'
9
9
  import { mkdir, rename, unlink, writeFile } from 'node:fs/promises'
10
10
  import path from 'node:path'
11
- import { readSuite } from './suite'
11
+ import { readSuite, type TestRow as SuiteTestRow } from './suite'
12
12
  // Use types derived from promptfoo exports instead of incorrect default type imports
13
13
 
14
14
  import type { ApiProvider, CallApiContextParams, ProviderResponse } from 'promptfoo'
@@ -30,9 +30,13 @@ interface CsvRow {
30
30
  expected_output: string
31
31
  similarity_threshold: number | string
32
32
  pinned: 'TRUE' | 'FALSE'
33
- context: string
33
+ context: string | Record<string, unknown>
34
+ mocks?: string | Record<string, unknown>
34
35
  timeout: string
36
+ capture_mode?: string
35
37
  scenario?: string
38
+ step?: string
39
+ author?: string
36
40
  }
37
41
 
38
42
  export interface ResultEntry {
@@ -65,6 +69,7 @@ export interface WrittenRunReportConfig {
65
69
  }
66
70
 
67
71
  export interface WrittenRunReportRow extends TableRow {
72
+ test: SuiteTestRow
68
73
  agent: string
69
74
  test_id: string
70
75
  run_timestamp: string
@@ -84,6 +89,7 @@ export interface WrittenRunReport {
84
89
  type PromptTestsScope = 'all' | 'pinned'
85
90
 
86
91
  type PromptTestsSelection = { scope: PromptTestsScope } | { testId: string }
92
+ type CaptureMode = 'immediate' | 'final'
87
93
 
88
94
  const activeRunsBySuiteKey = new Map<string, AbortController>()
89
95
 
@@ -209,7 +215,7 @@ function toTestInputs(
209
215
  value: row.assertion_value
210
216
  },
211
217
  {
212
- type: 'similar' as 'similar',
218
+ type: 'similar' as const,
213
219
  value: String(row.expected_output),
214
220
  threshold: Number(row.similarity_threshold) / 100
215
221
  }
@@ -217,7 +223,9 @@ function toTestInputs(
217
223
  context: (() => {
218
224
  const testCtx = makeContext(row.context)
219
225
  return defaultContext ? mergeContexts(defaultContext, testCtx) : testCtx
220
- })()
226
+ })(),
227
+ captureMode: row.capture_mode === 'final' ? 'final' : 'immediate',
228
+ mocks: typeof row.mocks === 'undefined' ? undefined : makeContext(row.mocks)
221
229
  }
222
230
  })
223
231
  }
@@ -248,13 +256,18 @@ export class RecombineAgentProvider implements ApiProvider {
248
256
  conversation: Conversation
249
257
  conversationParseError?: string
250
258
  context: Context
259
+ mocks?: Context
260
+ captureMode?: CaptureMode | string
251
261
  }
252
262
 
253
263
  if (typeof vars.conversationParseError === 'string' && vars.conversationParseError.trim()) {
254
264
  return { output: '', error: vars.conversationParseError }
255
265
  }
256
266
 
267
+ const captureMode: CaptureMode = vars.captureMode === 'final' ? 'final' : 'immediate'
257
268
  let captured: string = ''
269
+ let captureEnabled = false
270
+ const finalCaptureErrors: string[] = []
258
271
  const capturedLogs: string[] = []
259
272
  const capturedStepTraces: StepTrace[] = []
260
273
 
@@ -265,7 +278,7 @@ export class RecombineAgentProvider implements ApiProvider {
265
278
  // Clone the conversation so parallel runs don't share the same array reference.
266
279
  // Shallow-clone each message; messages are simple { sender, text } objects in this flow.
267
280
  const conv: Conversation = Array.isArray(vars.conversation)
268
- ? (vars.conversation as Conversation).map((m) => ({ ...m }))
281
+ ? vars.conversation.map((m) => ({ ...m }))
269
282
  : []
270
283
 
271
284
  // Prepare a streaming log writer so logs are written as they occur
@@ -307,6 +320,9 @@ export class RecombineAgentProvider implements ApiProvider {
307
320
  line = line.slice(0, 5000) + '... [TRUNCATED]'
308
321
  }
309
322
  capturedLogs.push(line)
323
+ if (captureMode === 'final' && captureEnabled && level === 'error') {
324
+ finalCaptureErrors.push(line)
325
+ }
310
326
  try {
311
327
  logStream.write(line + '\n')
312
328
  } catch {
@@ -331,14 +347,24 @@ export class RecombineAgentProvider implements ApiProvider {
331
347
  getMessages: () => conv,
332
348
  sendMessage: async (message: Message | string) => {
333
349
  const m = typeof message === 'string' ? { sender: 'agent', text: message } : message
334
- if (m.sender === 'agent') {
335
- captured = typeof m.text === 'string' ? m.text : JSON.stringify(m)
336
- logger.log('Agent message captured:', captured)
350
+ if (captureEnabled && m.sender === 'agent') {
351
+ const text = typeof m.text === 'string' ? m.text : JSON.stringify(m)
352
+ if (captureMode === 'final' || !captured) {
353
+ captured = text
354
+ logger.log('Agent message captured:', captured)
355
+ } else {
356
+ logger.log('Agent message ignored after immediate capture:', text)
357
+ }
337
358
  }
338
359
  },
360
+ onBeforeTestResponse: () => {
361
+ captured = ''
362
+ captureEnabled = true
363
+ },
339
364
  stepTracer,
340
365
  logger,
341
366
  context: vars.context || {},
367
+ mocks: vars.mocks,
342
368
  abortSignal: this.abortSignal
343
369
  })
344
370
 
@@ -378,6 +404,19 @@ export class RecombineAgentProvider implements ApiProvider {
378
404
  ? capturedStepTraces.map(sanitizeTrace)
379
405
  : []
380
406
 
407
+ if (captureMode === 'final' && finalCaptureErrors.length > 0) {
408
+ const detail = finalCaptureErrors.at(-1) ?? 'Unknown final capture error'
409
+ return {
410
+ output: captured,
411
+ error: `Final capture failed because a subsequent step emitted an error: ${detail}`,
412
+ metadata: {
413
+ logs: capturedLogs,
414
+ stepTraces: sanitizedStepTraces,
415
+ rawStepTraces: capturedStepTraces
416
+ }
417
+ }
418
+ }
419
+
381
420
  if (captured && captured.trim()) {
382
421
  return {
383
422
  output: captured,
@@ -531,7 +570,7 @@ export async function runPromptTests(
531
570
  const onlyTestId = 'testId' in selection ? selection.testId : undefined
532
571
  const suiteKey = suite.suiteKey
533
572
  const loadedSuite = await readSuite(suiteKey)
534
- const rows = loadedSuite.tests as unknown as CsvRow[]
573
+ const rows = loadedSuite.tests
535
574
  const cfg = (await tryReadConfig(suiteKey)) || {}
536
575
 
537
576
  const repeats = Number(cfg?.repeats ?? 1)
@@ -539,7 +578,7 @@ export async function runPromptTests(
539
578
  const baseContext = loadedSuite?.meta?.defaultContext || {}
540
579
 
541
580
  // Add an index field to each row for mapping
542
- const typedRows = rows as unknown as CsvRow[]
581
+ const typedRows = rows
543
582
  const indexedRows = typedRows.map((row, index) => ({ ...row, index }))
544
583
 
545
584
  if (onlyTestId && !indexedRows.some((row) => String(row.id ?? '') === String(onlyTestId))) {
@@ -578,6 +617,8 @@ export async function runPromptTests(
578
617
  agentId: suite.agentId,
579
618
  ...(suite.region ? { region: suite.region } : {}),
580
619
  context: test.context,
620
+ ...(typeof test.mocks !== 'undefined' ? { mocks: test.mocks } : {}),
621
+ captureMode: test.captureMode,
581
622
  conversation: test.conversation,
582
623
  ...(test.conversationParseError
583
624
  ? { conversationParseError: test.conversationParseError }
@@ -639,7 +680,7 @@ export async function runPromptTests(
639
680
 
640
681
  const byTestId = new Map<string, WrittenRunReportRow>()
641
682
 
642
- const originalRowById = new Map<string, CsvRow>()
683
+ const originalRowById = new Map<string, SuiteTestRow>()
643
684
  for (const r of typedRows) {
644
685
  const id = String((r as any)?.id ?? '').trim()
645
686
  if (id) originalRowById.set(id, r)
@@ -685,6 +726,7 @@ export async function runPromptTests(
685
726
  String((originalRow as any).pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
686
727
  const nextRow: WrittenRunReportRow = {
687
728
  ...(originalRow as any),
729
+ test: originalRow,
688
730
  prompts: `suite://${suiteKey}?testId=${testId}`,
689
731
  success_rate_percent: 0,
690
732
  success_rate: '0/0',
@@ -742,6 +784,7 @@ export async function runPromptTests(
742
784
  (rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
743
785
  byTestId.set(testId, {
744
786
  ...rowToWrite,
787
+ test: originalRow,
745
788
  agent: suiteKey,
746
789
  test_id: testId,
747
790
  run_timestamp: iso,
@@ -778,6 +821,7 @@ export async function runPromptTests(
778
821
  (rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
779
822
  byTestId.set(testId, {
780
823
  ...rowToWrite,
824
+ test: originalRow,
781
825
  agent: suiteKey,
782
826
  test_id: testId,
783
827
  run_timestamp: iso,