@recombine-ai/bosun 0.3.7 → 0.3.9

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 (453) hide show
  1. package/build/client/_app/immutable/assets/0.XjKA4GPF.css +1 -0
  2. package/build/client/_app/immutable/assets/0.XjKA4GPF.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.XjKA4GPF.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/2.DOE0DQ6H.css +1 -0
  5. package/build/client/_app/immutable/assets/2.DOE0DQ6H.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.DOE0DQ6H.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/7.DlSPCZj0.css +1 -0
  8. package/build/client/_app/immutable/assets/7.DlSPCZj0.css.br +0 -0
  9. package/build/client/_app/immutable/assets/7.DlSPCZj0.css.gz +0 -0
  10. package/build/client/_app/immutable/assets/8.DoLA3Mkm.css +1 -0
  11. package/build/client/_app/immutable/assets/8.DoLA3Mkm.css.br +0 -0
  12. package/build/client/_app/immutable/assets/8.DoLA3Mkm.css.gz +0 -0
  13. package/build/client/_app/immutable/assets/{Tab.BxaGw9IG.css → Tab.jOjMVh6j.css} +1 -1
  14. package/build/client/_app/immutable/assets/Tab.jOjMVh6j.css.br +0 -0
  15. package/build/client/_app/immutable/assets/Tab.jOjMVh6j.css.gz +0 -0
  16. package/build/client/_app/immutable/chunks/7wcu2ga1.js +1 -0
  17. package/build/client/_app/immutable/chunks/7wcu2ga1.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/7wcu2ga1.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/B3K88SyC.js +1 -0
  20. package/build/client/_app/immutable/chunks/B3K88SyC.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/B3K88SyC.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{D5fGPlBk.js → BGEE3mf3.js} +1 -1
  23. package/build/client/_app/immutable/chunks/BGEE3mf3.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BGEE3mf3.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{BOQMymse.js → BH7VBnJ7.js} +1 -1
  26. package/build/client/_app/immutable/chunks/BH7VBnJ7.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BH7VBnJ7.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/BHkx8tAH.js +1 -0
  29. package/build/client/_app/immutable/chunks/BHkx8tAH.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BHkx8tAH.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/BMwJcaLS.js +1 -0
  32. package/build/client/_app/immutable/chunks/BMwJcaLS.js.br +2 -0
  33. package/build/client/_app/immutable/chunks/BMwJcaLS.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/{CfKHaDCm.js → BOrnwyTp.js} +1 -1
  35. package/build/client/_app/immutable/chunks/BOrnwyTp.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/BOrnwyTp.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/BbaH2eDw.js +1 -0
  38. package/build/client/_app/immutable/chunks/BbaH2eDw.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/BbaH2eDw.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/{C769zFCl.js → Bub2VLj9.js} +1 -1
  41. package/build/client/_app/immutable/chunks/Bub2VLj9.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/Bub2VLj9.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{yOR3vtRx.js → ByppsbS-.js} +1 -1
  44. package/build/client/_app/immutable/chunks/ByppsbS-.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/ByppsbS-.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/C0mQlu7J.js +1 -0
  47. package/build/client/_app/immutable/chunks/C0mQlu7J.js.br +1 -0
  48. package/build/client/_app/immutable/chunks/C0mQlu7J.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/C0pV4x1v.js +1 -0
  50. package/build/client/_app/immutable/chunks/C0pV4x1v.js.br +2 -0
  51. package/build/client/_app/immutable/chunks/C0pV4x1v.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/C0sQKHpE.js +1 -0
  53. package/build/client/_app/immutable/chunks/C0sQKHpE.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/C0sQKHpE.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/{CRlLKhPr.js → CFcfsVkY.js} +1 -1
  56. package/build/client/_app/immutable/chunks/CFcfsVkY.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/CFcfsVkY.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/{BHL1bMOV.js → CYkx2jgw.js} +1 -1
  59. package/build/client/_app/immutable/chunks/CYkx2jgw.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/CYkx2jgw.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/CZ6iREyA.js +8 -0
  62. package/build/client/_app/immutable/chunks/CZ6iREyA.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/CZ6iREyA.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/CbCJfhin.js +1 -0
  65. package/build/client/_app/immutable/chunks/CbCJfhin.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/CbCJfhin.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/{DaRvw8c-.js → CdTjAjKm.js} +7 -7
  68. package/build/client/_app/immutable/chunks/CdTjAjKm.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/CdTjAjKm.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/{4PztAao_.js → CmPVG-ki.js} +1 -1
  71. package/build/client/_app/immutable/chunks/CmPVG-ki.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/CmPVG-ki.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/{DJ_lsF0V.js → Cnr0cZA4.js} +1 -1
  74. package/build/client/_app/immutable/chunks/Cnr0cZA4.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/Cnr0cZA4.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/CojkI8AD.js +33 -0
  77. package/build/client/_app/immutable/chunks/CojkI8AD.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/CojkI8AD.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/Cp_hX0eh.js +1 -0
  80. package/build/client/_app/immutable/chunks/Cp_hX0eh.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/Cp_hX0eh.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/Cv6CwVfk.js +3 -0
  83. package/build/client/_app/immutable/chunks/Cv6CwVfk.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/Cv6CwVfk.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/{DAfsp-82.js → D8qEOlWC.js} +1 -1
  86. package/build/client/_app/immutable/chunks/D8qEOlWC.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/D8qEOlWC.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/{Bf1oCG9-.js → DOMF1VtZ.js} +1 -1
  89. package/build/client/_app/immutable/chunks/DOMF1VtZ.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/DOMF1VtZ.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/{Bd7SZbXQ.js → DRaGXt8e.js} +1 -1
  92. package/build/client/_app/immutable/chunks/DRaGXt8e.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/DRaGXt8e.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{Bw2f0Pmg.js → DU-D8S0B.js} +1 -1
  95. package/build/client/_app/immutable/chunks/DU-D8S0B.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/DU-D8S0B.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{Culo9hD6.js → DadWvtYR.js} +1 -1
  98. package/build/client/_app/immutable/chunks/DadWvtYR.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/DadWvtYR.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/{Cx_xzGPa.js → DbYdNz4J.js} +1 -1
  101. package/build/client/_app/immutable/chunks/DbYdNz4J.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/DbYdNz4J.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/DiFAgw_s.js +1 -0
  104. package/build/client/_app/immutable/chunks/DiFAgw_s.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/DiFAgw_s.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/DrMdBz9b.js +1 -0
  107. package/build/client/_app/immutable/chunks/DrMdBz9b.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/DrMdBz9b.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/{qXu78w_4.js → DsvX5v5e.js} +1 -1
  110. package/build/client/_app/immutable/chunks/DsvX5v5e.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/DsvX5v5e.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/Y0ymTIHd.js +1 -0
  113. package/build/client/_app/immutable/chunks/Y0ymTIHd.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/Y0ymTIHd.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/_HWrJCgx.js +1 -0
  116. package/build/client/_app/immutable/chunks/_HWrJCgx.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/_HWrJCgx.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/{CRTtd6by.js → qPgPowuc.js} +1 -1
  119. package/build/client/_app/immutable/chunks/qPgPowuc.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/qPgPowuc.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/ri5tqg4N.js +1 -0
  122. package/build/client/_app/immutable/chunks/ri5tqg4N.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/ri5tqg4N.js.gz +0 -0
  124. package/build/client/_app/immutable/chunks/{Codln_pl.js → sdLD1XcR.js} +1 -1
  125. package/build/client/_app/immutable/chunks/sdLD1XcR.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/sdLD1XcR.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/t1v2-usS.js +4 -0
  128. package/build/client/_app/immutable/chunks/t1v2-usS.js.br +0 -0
  129. package/build/client/_app/immutable/chunks/t1v2-usS.js.gz +0 -0
  130. package/build/client/_app/immutable/chunks/tLFXBP7P.js +2 -0
  131. package/build/client/_app/immutable/chunks/tLFXBP7P.js.br +0 -0
  132. package/build/client/_app/immutable/chunks/tLFXBP7P.js.gz +0 -0
  133. package/build/client/_app/immutable/entry/app.jP0Pyfdy.js +2 -0
  134. package/build/client/_app/immutable/entry/app.jP0Pyfdy.js.br +0 -0
  135. package/build/client/_app/immutable/entry/app.jP0Pyfdy.js.gz +0 -0
  136. package/build/client/_app/immutable/entry/start.KD1JZMOT.js +1 -0
  137. package/build/client/_app/immutable/entry/start.KD1JZMOT.js.br +2 -0
  138. package/build/client/_app/immutable/entry/start.KD1JZMOT.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/0.ByrdmeSo.js +3 -0
  140. package/build/client/_app/immutable/nodes/0.ByrdmeSo.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/0.ByrdmeSo.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/1.VLeq38lN.js +1 -0
  143. package/build/client/_app/immutable/nodes/1.VLeq38lN.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/1.VLeq38lN.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/10.BHSGZYEC.js +1 -0
  146. package/build/client/_app/immutable/nodes/10.BHSGZYEC.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/10.BHSGZYEC.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js +1 -0
  149. package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js +1 -0
  152. package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js.br +2 -0
  153. package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/13.DetV1tDO.js +1 -0
  155. package/build/client/_app/immutable/nodes/13.DetV1tDO.js.br +0 -0
  156. package/build/client/_app/immutable/nodes/13.DetV1tDO.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/14.I-eiMWQu.js +11 -0
  158. package/build/client/_app/immutable/nodes/14.I-eiMWQu.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/14.I-eiMWQu.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/2.DX9U9zLg.js +35 -0
  161. package/build/client/_app/immutable/nodes/2.DX9U9zLg.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/2.DX9U9zLg.js.gz +0 -0
  163. package/build/client/_app/immutable/nodes/3.Bh8il5iy.js +1 -0
  164. package/build/client/_app/immutable/nodes/3.Bh8il5iy.js.br +0 -0
  165. package/build/client/_app/immutable/nodes/3.Bh8il5iy.js.gz +0 -0
  166. package/build/client/_app/immutable/nodes/{3.C-B1sGi_.js → 4.CtzHYc6x.js} +1 -1
  167. package/build/client/_app/immutable/nodes/4.CtzHYc6x.js.br +0 -0
  168. package/build/client/_app/immutable/nodes/4.CtzHYc6x.js.gz +0 -0
  169. package/build/client/_app/immutable/nodes/5.B4dlomkV.js +1 -0
  170. package/build/client/_app/immutable/nodes/5.B4dlomkV.js.br +0 -0
  171. package/build/client/_app/immutable/nodes/5.B4dlomkV.js.gz +0 -0
  172. package/build/client/_app/immutable/nodes/6.CPYhLc46.js +1 -0
  173. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.br +4 -0
  174. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.gz +0 -0
  175. package/build/client/_app/immutable/nodes/7.CBPrYfFp.js +2 -0
  176. package/build/client/_app/immutable/nodes/7.CBPrYfFp.js.br +0 -0
  177. package/build/client/_app/immutable/nodes/7.CBPrYfFp.js.gz +0 -0
  178. package/build/client/_app/immutable/nodes/8.4NTWYv4c.js +6 -0
  179. package/build/client/_app/immutable/nodes/8.4NTWYv4c.js.br +0 -0
  180. package/build/client/_app/immutable/nodes/8.4NTWYv4c.js.gz +0 -0
  181. package/build/client/_app/immutable/nodes/9.BVI-eEdV.js +1 -0
  182. package/build/client/_app/immutable/nodes/9.BVI-eEdV.js.br +0 -0
  183. package/build/client/_app/immutable/nodes/9.BVI-eEdV.js.gz +0 -0
  184. package/build/client/_app/version.json +1 -1
  185. package/build/client/_app/version.json.br +0 -0
  186. package/build/client/_app/version.json.gz +0 -0
  187. package/build/server/chunks/0-CjpeDbMt.js +9 -0
  188. package/build/server/chunks/{0-CqdHgLFy.js.map → 0-CjpeDbMt.js.map} +1 -1
  189. package/build/server/chunks/1-M0YzuUQM.js +9 -0
  190. package/build/server/chunks/{1-CptSbbsC.js.map → 1-M0YzuUQM.js.map} +1 -1
  191. package/build/server/chunks/{7-soEaW5k5.js → 10-C7WLHR92.js} +5 -5
  192. package/build/server/chunks/10-C7WLHR92.js.map +1 -0
  193. package/build/server/chunks/11-CPYwUx-7.js +21 -0
  194. package/build/server/chunks/11-CPYwUx-7.js.map +1 -0
  195. package/build/server/chunks/12-C5OSs5Op.js +20 -0
  196. package/build/server/chunks/12-C5OSs5Op.js.map +1 -0
  197. package/build/server/chunks/13-BQ9R_Ex-.js +9 -0
  198. package/build/server/chunks/13-BQ9R_Ex-.js.map +1 -0
  199. package/build/server/chunks/14-BFsI6u_W.js +9 -0
  200. package/build/server/chunks/14-BFsI6u_W.js.map +1 -0
  201. package/build/server/chunks/2-Cjh0UTU6.js +9 -0
  202. package/build/server/chunks/2-Cjh0UTU6.js.map +1 -0
  203. package/build/server/chunks/3-VrGFs76T.js +9 -0
  204. package/build/server/chunks/3-VrGFs76T.js.map +1 -0
  205. package/build/server/chunks/4-CSgrzh2F.js +9 -0
  206. package/build/server/chunks/4-CSgrzh2F.js.map +1 -0
  207. package/build/server/chunks/5-zKehYil3.js +9 -0
  208. package/build/server/chunks/5-zKehYil3.js.map +1 -0
  209. package/build/server/chunks/6-uS_X9B0s.js +21 -0
  210. package/build/server/chunks/6-uS_X9B0s.js.map +1 -0
  211. package/build/server/chunks/7-DewREBAN.js +9 -0
  212. package/build/server/chunks/7-DewREBAN.js.map +1 -0
  213. package/build/server/chunks/8-Dk3ms3jm.js +9 -0
  214. package/build/server/chunks/8-Dk3ms3jm.js.map +1 -0
  215. package/build/server/chunks/9-W6XYayeK.js +25 -0
  216. package/build/server/chunks/9-W6XYayeK.js.map +1 -0
  217. package/build/server/chunks/{AgentSidebar-BIVt78i3.js → AgentSidebar-BB_yQ9s0.js} +4 -4
  218. package/build/server/chunks/AgentSidebar-BB_yQ9s0.js.map +1 -0
  219. package/build/server/chunks/{Button-ZjVPI4zo.js → Button-Cd4Yzpdy.js} +4 -4
  220. package/build/server/chunks/Button-Cd4Yzpdy.js.map +1 -0
  221. package/build/server/chunks/{CopyTracesDropdown-B8MjGOwT.js → ChatStepTrace-cq26gF4B.js} +162 -145
  222. package/build/server/chunks/ChatStepTrace-cq26gF4B.js.map +1 -0
  223. package/build/server/chunks/ContextEditor-CfjBPLpI.js +67 -0
  224. package/build/server/chunks/ContextEditor-CfjBPLpI.js.map +1 -0
  225. package/build/server/chunks/{Icon-Csjrnozq.js → Icon-BgknHaZs.js} +2 -2
  226. package/build/server/chunks/{Icon-Csjrnozq.js.map → Icon-BgknHaZs.js.map} +1 -1
  227. package/build/server/chunks/{Input-BCU2QEQ2.js → Input-BJW36iKz.js} +2 -2
  228. package/build/server/chunks/{Input-BCU2QEQ2.js.map → Input-BJW36iKz.js.map} +1 -1
  229. package/build/server/chunks/{Modal-bmttP-F1.js → Modal-D4tx0Bdo.js} +3 -3
  230. package/build/server/chunks/Modal-D4tx0Bdo.js.map +1 -0
  231. package/build/server/chunks/{Tab-Jw_OwV7Q.js → Tab-DheAG-QC.js} +3 -3
  232. package/build/server/chunks/Tab-DheAG-QC.js.map +1 -0
  233. package/build/server/chunks/{_layout.svelte-GwcIlDHC.js → _layout.svelte-BL8XnK1E.js} +23 -28
  234. package/build/server/chunks/_layout.svelte-BL8XnK1E.js.map +1 -0
  235. package/build/server/chunks/_layout.svelte-DHgaGTP_.js +844 -0
  236. package/build/server/chunks/_layout.svelte-DHgaGTP_.js.map +1 -0
  237. package/build/server/chunks/{_layout.svelte-CrT993Da.js → _layout.svelte-Svi5xbzP.js} +1 -14
  238. package/build/server/chunks/_layout.svelte-Svi5xbzP.js.map +1 -0
  239. package/build/server/chunks/{_page.svelte-CVO2CdmB.js → _page.svelte-39hvC6-Q.js} +4 -4
  240. package/build/server/chunks/{_page.svelte-CVO2CdmB.js.map → _page.svelte-39hvC6-Q.js.map} +1 -1
  241. package/build/server/chunks/{_page.svelte-D8d07zd0.js → _page.svelte-BpnUXzfh.js} +25 -10
  242. package/build/server/chunks/_page.svelte-BpnUXzfh.js.map +1 -0
  243. package/build/server/chunks/{_page.svelte--l_LvFv_.js → _page.svelte-C1YaC_Qg.js} +498 -496
  244. package/build/server/chunks/_page.svelte-C1YaC_Qg.js.map +1 -0
  245. package/build/server/chunks/{_page.svelte-BAi74pJ3.js → _page.svelte-CbqAsz26.js} +3 -3
  246. package/build/server/chunks/_page.svelte-CbqAsz26.js.map +1 -0
  247. package/build/server/chunks/{_page.svelte-BOzS_rqK.js → _page.svelte-CmsDxzfh.js} +19 -27
  248. package/build/server/chunks/_page.svelte-CmsDxzfh.js.map +1 -0
  249. package/build/server/chunks/{_page.svelte-d8hJxmZl.js → _page.svelte-DCP-PSh0.js} +243 -379
  250. package/build/server/chunks/_page.svelte-DCP-PSh0.js.map +1 -0
  251. package/build/server/chunks/edit-workspace-context-OTOIRCI0.js +13 -0
  252. package/build/server/chunks/edit-workspace-context-OTOIRCI0.js.map +1 -0
  253. package/build/server/chunks/hooks-BJphIAi-.js +8 -0
  254. package/build/server/chunks/hooks-BJphIAi-.js.map +1 -0
  255. package/build/server/chunks/{Tab.svelte_svelte_type_style_lang-ByZ0KVzO.js → index-server-CefdgakO.js} +2 -2
  256. package/build/server/chunks/index-server-CefdgakO.js.map +1 -0
  257. package/build/server/chunks/{index2-C572SQM_.js → index2-BuOY2QE4.js} +2 -2
  258. package/build/server/chunks/{index2-C572SQM_.js.map → index2-BuOY2QE4.js.map} +1 -1
  259. package/build/server/chunks/log-content.svelte-B3ZvaoLs.js +20 -0
  260. package/build/server/chunks/log-content.svelte-B3ZvaoLs.js.map +1 -0
  261. package/build/server/index.js +3 -2
  262. package/build/server/index.js.map +1 -1
  263. package/build/server/manifest.js +51 -18
  264. package/build/server/manifest.js.map +1 -1
  265. package/package.json +3 -1
  266. package/src/backend/lib/decode-html-entities.spec.ts +29 -0
  267. package/src/backend/lib/decode-html-entities.ts +25 -0
  268. package/src/backend/roleplay/router.ts +31 -0
  269. package/src/backend/tests/academy.ts +353 -115
  270. package/src/backend/tests/analyze.ts +357 -0
  271. package/src/backend/tests/data.ts +48 -12
  272. package/src/backend/tests/emulate-agents.ts +39 -4
  273. package/src/backend/tests/prompt-issues.ts +204 -0
  274. package/src/backend/tests/router.ts +51 -4
  275. package/build/client/_app/immutable/assets/0.BPqDeVAI.css +0 -1
  276. package/build/client/_app/immutable/assets/0.BPqDeVAI.css.br +0 -0
  277. package/build/client/_app/immutable/assets/0.BPqDeVAI.css.gz +0 -0
  278. package/build/client/_app/immutable/assets/4.BIrSikaZ.css +0 -1
  279. package/build/client/_app/immutable/assets/4.BIrSikaZ.css.br +0 -0
  280. package/build/client/_app/immutable/assets/4.BIrSikaZ.css.gz +0 -0
  281. package/build/client/_app/immutable/assets/6.C4C8vBUW.css +0 -1
  282. package/build/client/_app/immutable/assets/6.C4C8vBUW.css.br +0 -0
  283. package/build/client/_app/immutable/assets/6.C4C8vBUW.css.gz +0 -0
  284. package/build/client/_app/immutable/assets/Tab.BxaGw9IG.css.br +0 -0
  285. package/build/client/_app/immutable/assets/Tab.BxaGw9IG.css.gz +0 -0
  286. package/build/client/_app/immutable/chunks/4PztAao_.js.br +0 -0
  287. package/build/client/_app/immutable/chunks/4PztAao_.js.gz +0 -0
  288. package/build/client/_app/immutable/chunks/B2gGEZTS.js +0 -1
  289. package/build/client/_app/immutable/chunks/B2gGEZTS.js.br +0 -2
  290. package/build/client/_app/immutable/chunks/B2gGEZTS.js.gz +0 -0
  291. package/build/client/_app/immutable/chunks/BHL1bMOV.js.br +0 -0
  292. package/build/client/_app/immutable/chunks/BHL1bMOV.js.gz +0 -0
  293. package/build/client/_app/immutable/chunks/BOQMymse.js.br +0 -0
  294. package/build/client/_app/immutable/chunks/BOQMymse.js.gz +0 -0
  295. package/build/client/_app/immutable/chunks/Bd7SZbXQ.js.br +0 -0
  296. package/build/client/_app/immutable/chunks/Bd7SZbXQ.js.gz +0 -0
  297. package/build/client/_app/immutable/chunks/Bf1oCG9-.js.br +0 -0
  298. package/build/client/_app/immutable/chunks/Bf1oCG9-.js.gz +0 -0
  299. package/build/client/_app/immutable/chunks/BgaIh2D4.js +0 -1
  300. package/build/client/_app/immutable/chunks/BgaIh2D4.js.br +0 -0
  301. package/build/client/_app/immutable/chunks/BgaIh2D4.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/BrDK8TTs.js +0 -2
  303. package/build/client/_app/immutable/chunks/BrDK8TTs.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/BrDK8TTs.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/BsKQRAyX.js +0 -1
  306. package/build/client/_app/immutable/chunks/BsKQRAyX.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/BsKQRAyX.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/Bw2f0Pmg.js.br +0 -0
  309. package/build/client/_app/immutable/chunks/Bw2f0Pmg.js.gz +0 -0
  310. package/build/client/_app/immutable/chunks/BzAx_Qn3.js +0 -1
  311. package/build/client/_app/immutable/chunks/BzAx_Qn3.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/BzAx_Qn3.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/C-dTPkQy.js +0 -1
  314. package/build/client/_app/immutable/chunks/C-dTPkQy.js.br +0 -0
  315. package/build/client/_app/immutable/chunks/C-dTPkQy.js.gz +0 -0
  316. package/build/client/_app/immutable/chunks/C769zFCl.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/C769zFCl.js.gz +0 -0
  318. package/build/client/_app/immutable/chunks/C7FjDhij.js +0 -4
  319. package/build/client/_app/immutable/chunks/C7FjDhij.js.br +0 -0
  320. package/build/client/_app/immutable/chunks/C7FjDhij.js.gz +0 -0
  321. package/build/client/_app/immutable/chunks/CInh9KnU.js +0 -1
  322. package/build/client/_app/immutable/chunks/CInh9KnU.js.br +0 -2
  323. package/build/client/_app/immutable/chunks/CInh9KnU.js.gz +0 -0
  324. package/build/client/_app/immutable/chunks/CRTtd6by.js.br +0 -0
  325. package/build/client/_app/immutable/chunks/CRTtd6by.js.gz +0 -0
  326. package/build/client/_app/immutable/chunks/CRlLKhPr.js.br +0 -0
  327. package/build/client/_app/immutable/chunks/CRlLKhPr.js.gz +0 -0
  328. package/build/client/_app/immutable/chunks/CUfDVPpW.js +0 -1
  329. package/build/client/_app/immutable/chunks/CUfDVPpW.js.br +0 -0
  330. package/build/client/_app/immutable/chunks/CUfDVPpW.js.gz +0 -0
  331. package/build/client/_app/immutable/chunks/CfKHaDCm.js.br +0 -0
  332. package/build/client/_app/immutable/chunks/CfKHaDCm.js.gz +0 -0
  333. package/build/client/_app/immutable/chunks/Codln_pl.js.br +0 -0
  334. package/build/client/_app/immutable/chunks/Codln_pl.js.gz +0 -0
  335. package/build/client/_app/immutable/chunks/Culo9hD6.js.br +0 -0
  336. package/build/client/_app/immutable/chunks/Culo9hD6.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/CxDLEL1d.js +0 -8
  338. package/build/client/_app/immutable/chunks/CxDLEL1d.js.br +0 -0
  339. package/build/client/_app/immutable/chunks/CxDLEL1d.js.gz +0 -0
  340. package/build/client/_app/immutable/chunks/Cx_xzGPa.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/Cx_xzGPa.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/D-51TRqM.js +0 -33
  343. package/build/client/_app/immutable/chunks/D-51TRqM.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/D-51TRqM.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/D5fGPlBk.js.br +0 -0
  346. package/build/client/_app/immutable/chunks/D5fGPlBk.js.gz +0 -0
  347. package/build/client/_app/immutable/chunks/D9h7-Y-f.js +0 -1
  348. package/build/client/_app/immutable/chunks/D9h7-Y-f.js.br +0 -0
  349. package/build/client/_app/immutable/chunks/D9h7-Y-f.js.gz +0 -0
  350. package/build/client/_app/immutable/chunks/DAfsp-82.js.br +0 -0
  351. package/build/client/_app/immutable/chunks/DAfsp-82.js.gz +0 -0
  352. package/build/client/_app/immutable/chunks/DJ_lsF0V.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/DJ_lsF0V.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/DaRvw8c-.js.br +0 -0
  355. package/build/client/_app/immutable/chunks/DaRvw8c-.js.gz +0 -0
  356. package/build/client/_app/immutable/chunks/FawE95CY.js +0 -1
  357. package/build/client/_app/immutable/chunks/FawE95CY.js.br +0 -0
  358. package/build/client/_app/immutable/chunks/FawE95CY.js.gz +0 -0
  359. package/build/client/_app/immutable/chunks/HBgR5qMR.js +0 -3
  360. package/build/client/_app/immutable/chunks/HBgR5qMR.js.br +0 -0
  361. package/build/client/_app/immutable/chunks/HBgR5qMR.js.gz +0 -0
  362. package/build/client/_app/immutable/chunks/I-mny6CH.js +0 -1
  363. package/build/client/_app/immutable/chunks/I-mny6CH.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/I-mny6CH.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/aeuWzujc.js +0 -1
  366. package/build/client/_app/immutable/chunks/aeuWzujc.js.br +0 -2
  367. package/build/client/_app/immutable/chunks/aeuWzujc.js.gz +0 -0
  368. package/build/client/_app/immutable/chunks/qXu78w_4.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/qXu78w_4.js.gz +0 -0
  370. package/build/client/_app/immutable/chunks/yOR3vtRx.js.br +0 -0
  371. package/build/client/_app/immutable/chunks/yOR3vtRx.js.gz +0 -0
  372. package/build/client/_app/immutable/entry/app.Dd7V5oBZ.js +0 -2
  373. package/build/client/_app/immutable/entry/app.Dd7V5oBZ.js.br +0 -0
  374. package/build/client/_app/immutable/entry/app.Dd7V5oBZ.js.gz +0 -0
  375. package/build/client/_app/immutable/entry/start.I6276KWl.js +0 -1
  376. package/build/client/_app/immutable/entry/start.I6276KWl.js.br +0 -2
  377. package/build/client/_app/immutable/entry/start.I6276KWl.js.gz +0 -0
  378. package/build/client/_app/immutable/nodes/0.DgVTcUxG.js +0 -3
  379. package/build/client/_app/immutable/nodes/0.DgVTcUxG.js.br +0 -0
  380. package/build/client/_app/immutable/nodes/0.DgVTcUxG.js.gz +0 -0
  381. package/build/client/_app/immutable/nodes/1._3H1cdWd.js +0 -1
  382. package/build/client/_app/immutable/nodes/1._3H1cdWd.js.br +0 -0
  383. package/build/client/_app/immutable/nodes/1._3H1cdWd.js.gz +0 -0
  384. package/build/client/_app/immutable/nodes/2.BO0WBJz3.js +0 -1
  385. package/build/client/_app/immutable/nodes/2.BO0WBJz3.js.br +0 -0
  386. package/build/client/_app/immutable/nodes/2.BO0WBJz3.js.gz +0 -0
  387. package/build/client/_app/immutable/nodes/3.C-B1sGi_.js.br +0 -0
  388. package/build/client/_app/immutable/nodes/3.C-B1sGi_.js.gz +0 -0
  389. package/build/client/_app/immutable/nodes/4.SsrvuMXV.js +0 -35
  390. package/build/client/_app/immutable/nodes/4.SsrvuMXV.js.br +0 -0
  391. package/build/client/_app/immutable/nodes/4.SsrvuMXV.js.gz +0 -0
  392. package/build/client/_app/immutable/nodes/5.DM_0dw43.js +0 -1
  393. package/build/client/_app/immutable/nodes/5.DM_0dw43.js.br +0 -0
  394. package/build/client/_app/immutable/nodes/5.DM_0dw43.js.gz +0 -0
  395. package/build/client/_app/immutable/nodes/6.BLcf1-sM.js +0 -5
  396. package/build/client/_app/immutable/nodes/6.BLcf1-sM.js.br +0 -0
  397. package/build/client/_app/immutable/nodes/6.BLcf1-sM.js.gz +0 -0
  398. package/build/client/_app/immutable/nodes/7.BLozkJCY.js +0 -1
  399. package/build/client/_app/immutable/nodes/7.BLozkJCY.js.br +0 -0
  400. package/build/client/_app/immutable/nodes/7.BLozkJCY.js.gz +0 -0
  401. package/build/client/_app/immutable/nodes/8.BeHRzquW.js +0 -1
  402. package/build/client/_app/immutable/nodes/8.BeHRzquW.js.br +0 -0
  403. package/build/client/_app/immutable/nodes/8.BeHRzquW.js.gz +0 -0
  404. package/build/client/_app/immutable/nodes/9.B1qNbiqD.js +0 -11
  405. package/build/client/_app/immutable/nodes/9.B1qNbiqD.js.br +0 -0
  406. package/build/client/_app/immutable/nodes/9.B1qNbiqD.js.gz +0 -0
  407. package/build/server/chunks/0-CqdHgLFy.js +0 -9
  408. package/build/server/chunks/1-CptSbbsC.js +0 -9
  409. package/build/server/chunks/2-CVrU1q5e.js +0 -9
  410. package/build/server/chunks/2-CVrU1q5e.js.map +0 -1
  411. package/build/server/chunks/3-Bi3FZgxy.js +0 -9
  412. package/build/server/chunks/3-Bi3FZgxy.js.map +0 -1
  413. package/build/server/chunks/4-Cg81z1QT.js +0 -9
  414. package/build/server/chunks/4-Cg81z1QT.js.map +0 -1
  415. package/build/server/chunks/5-BDZ8fU2l.js +0 -9
  416. package/build/server/chunks/5-BDZ8fU2l.js.map +0 -1
  417. package/build/server/chunks/6-_jdLZ_Lr.js +0 -33
  418. package/build/server/chunks/6-_jdLZ_Lr.js.map +0 -1
  419. package/build/server/chunks/7-soEaW5k5.js.map +0 -1
  420. package/build/server/chunks/8-Yp_dUmRS.js +0 -9
  421. package/build/server/chunks/8-Yp_dUmRS.js.map +0 -1
  422. package/build/server/chunks/9-Cb4lmLGK.js +0 -9
  423. package/build/server/chunks/9-Cb4lmLGK.js.map +0 -1
  424. package/build/server/chunks/AgentSidebar-BIVt78i3.js.map +0 -1
  425. package/build/server/chunks/Button-ZjVPI4zo.js.map +0 -1
  426. package/build/server/chunks/ContextEditor-Dgs8Ax9B.js +0 -45
  427. package/build/server/chunks/ContextEditor-Dgs8Ax9B.js.map +0 -1
  428. package/build/server/chunks/CopyTracesDropdown-B8MjGOwT.js.map +0 -1
  429. package/build/server/chunks/Modal-bmttP-F1.js.map +0 -1
  430. package/build/server/chunks/Tab-Jw_OwV7Q.js.map +0 -1
  431. package/build/server/chunks/Tab.svelte_svelte_type_style_lang-ByZ0KVzO.js.map +0 -1
  432. package/build/server/chunks/_layout.svelte-CrT993Da.js.map +0 -1
  433. package/build/server/chunks/_layout.svelte-GwcIlDHC.js.map +0 -1
  434. package/build/server/chunks/_page.svelte--l_LvFv_.js.map +0 -1
  435. package/build/server/chunks/_page.svelte-BAi74pJ3.js.map +0 -1
  436. package/build/server/chunks/_page.svelte-BOzS_rqK.js.map +0 -1
  437. package/build/server/chunks/_page.svelte-D8d07zd0.js.map +0 -1
  438. package/build/server/chunks/_page.svelte-d8hJxmZl.js.map +0 -1
  439. /package/build/client/_app/immutable/assets/{9.C5apk4jm.css → 14.C5apk4jm.css} +0 -0
  440. /package/build/client/_app/immutable/assets/{9.C5apk4jm.css.br → 14.C5apk4jm.css.br} +0 -0
  441. /package/build/client/_app/immutable/assets/{9.C5apk4jm.css.gz → 14.C5apk4jm.css.gz} +0 -0
  442. /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css → 3.Dzh7_Q8n.css} +0 -0
  443. /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css.br → 3.Dzh7_Q8n.css.br} +0 -0
  444. /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css.gz → 3.Dzh7_Q8n.css.gz} +0 -0
  445. /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css → 4.CZVw96CJ.css} +0 -0
  446. /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css.br → 4.CZVw96CJ.css.br} +0 -0
  447. /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css.gz → 4.CZVw96CJ.css.gz} +0 -0
  448. /package/build/client/_app/immutable/assets/{CopyTracesDropdown.NFJFjHv0.css → ChatStepTrace.NFJFjHv0.css} +0 -0
  449. /package/build/client/_app/immutable/assets/{CopyTracesDropdown.NFJFjHv0.css.br → ChatStepTrace.NFJFjHv0.css.br} +0 -0
  450. /package/build/client/_app/immutable/assets/{CopyTracesDropdown.NFJFjHv0.css.gz → ChatStepTrace.NFJFjHv0.css.gz} +0 -0
  451. /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css → bosun-theme.tn0RQdqM.css} +0 -0
  452. /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css.br → bosun-theme.tn0RQdqM.css.br} +0 -0
  453. /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css.gz → bosun-theme.tn0RQdqM.css.gz} +0 -0
@@ -0,0 +1,357 @@
1
+ import OpenAI from 'openai'
2
+ import type { StepTrace } from '@recombine-ai/engine'
3
+
4
+ import { getRunResultEntry } from './data'
5
+ import { decodeHtmlEntities } from '../lib/decode-html-entities'
6
+
7
+ const DEFAULT_ANALYZE_SYSTEM_MESSAGE =
8
+ 'Stop roleplay. Analyze the last response. Respond with a JSON array of direct quotes from the system prompt that you used to generate it'
9
+
10
+ export interface QuoteCount {
11
+ quote: string
12
+ count: number
13
+ }
14
+
15
+ export interface AnalyzeRunResult {
16
+ quotes: QuoteCount[]
17
+ renderedPrompt: string
18
+ stringifiedConversation: string
19
+ raw: Record<string, unknown>
20
+ }
21
+
22
+ export async function analyzeTraceQuotes(input: {
23
+ model: string | undefined
24
+ renderedPrompt: string
25
+ stringifiedConversation: string
26
+ response: string
27
+ stepTrace?: StepTrace
28
+ rawInput?: Record<string, unknown>
29
+ }): Promise<AnalyzeRunResult> {
30
+ const apiKey = process.env.OPENAI_API_KEY
31
+ if (!apiKey) {
32
+ throw new Error('OPENAI_API_KEY is not set')
33
+ }
34
+
35
+ const analyzeSystemMessage = envTextOrDefault(
36
+ 'BOSUN_ANALYZE_SYSTEM_MESSAGE',
37
+ DEFAULT_ANALYZE_SYSTEM_MESSAGE,
38
+ )
39
+
40
+ const renderedPrompt = decodeHtmlEntities(String(input.renderedPrompt ?? ''))
41
+ if (!renderedPrompt) {
42
+ throw new Error('Missing rendered prompt')
43
+ }
44
+
45
+ const conversation = decodeHtmlEntities(String(input.stringifiedConversation ?? ''))
46
+ if (!conversation) {
47
+ throw new Error('Missing conversation')
48
+ }
49
+
50
+ const resolvedModel = resolveModel(input.model)
51
+ if (!resolvedModel) {
52
+ throw new Error('Missing model')
53
+ }
54
+
55
+ const agentLabel = inferAgentLabel(conversation)
56
+ const decodedResponse = decodeHtmlEntities(String(input.response ?? ''))
57
+ const conversationWithResponse = appendResponseToConversation(conversation, decodedResponse, agentLabel)
58
+
59
+ const client = new OpenAI({ apiKey })
60
+ const calls = Array.from({ length: 10 }, () =>
61
+ analyzeOnce(client, resolvedModel, renderedPrompt, conversationWithResponse, analyzeSystemMessage),
62
+ )
63
+
64
+ const settled = await Promise.allSettled(calls)
65
+ const attemptDetails: Array<Record<string, unknown>> = []
66
+ const counts = new Map<string, number>()
67
+ let succeeded = 0
68
+ let failed = 0
69
+ for (let i = 0; i < settled.length; i++) {
70
+ const res = settled[i]
71
+ if (res.status === 'fulfilled') {
72
+ succeeded += 1
73
+ const uniqueQuotesThisAttempt = [
74
+ ...new Set(res.value.map((q) => normalizeQuote(String(q))).filter((q) => q.length > 0))
75
+ ]
76
+ attemptDetails.push({ attempt: i + 1, status: 'ok', quotes: uniqueQuotesThisAttempt })
77
+ for (const quote of uniqueQuotesThisAttempt) {
78
+ counts.set(quote, (counts.get(quote) || 0) + 1)
79
+ }
80
+ continue
81
+ }
82
+ failed += 1
83
+ attemptDetails.push({ attempt: i + 1, status: 'error', error: toErrorString(res.reason) })
84
+ }
85
+
86
+ if (succeeded === 0) {
87
+ throw new Error('All analysis calls failed')
88
+ }
89
+
90
+ const quotes = [...counts.entries()]
91
+ .map(([quote, count]) => ({ quote, count }))
92
+ .sort((a, b) => b.count - a.count || a.quote.localeCompare(b.quote))
93
+
94
+ const sanitizedStepTrace = input.stepTrace ? sanitizeAnalyzedStepTrace(input.stepTrace) : null
95
+
96
+ return {
97
+ quotes,
98
+ renderedPrompt,
99
+ stringifiedConversation: conversation,
100
+ raw: {
101
+ input: input.rawInput ?? null,
102
+ calls: {
103
+ requested: 10,
104
+ succeeded,
105
+ failed
106
+ },
107
+ stepTrace: sanitizedStepTrace,
108
+ analysis: {
109
+ parallelCalls: 10,
110
+ systemMessage: analyzeSystemMessage,
111
+ userMessage: {
112
+ conversationChars: conversation.length,
113
+ appendedAgentLabel: agentLabel,
114
+ appendedResponseChars: String(input.response ?? '').length,
115
+ finalConversationChars: conversationWithResponse.length
116
+ },
117
+ systemPrompt: {
118
+ renderedPromptChars: renderedPrompt.length
119
+ }
120
+ },
121
+ attempts: attemptDetails
122
+ }
123
+ }
124
+ }
125
+
126
+ export async function analyzeRunQuotes(input: {
127
+ agent: string
128
+ testId: string
129
+ index: number
130
+ timestamp?: string
131
+ }): Promise<AnalyzeRunResult> {
132
+ const run = await getRunResultEntry(input.agent, input.testId, input.index, input.timestamp)
133
+
134
+ const decodedRenderedPrompt = decodeHtmlEntities(String(run.rendered_prompt ?? ''))
135
+ if (!decodedRenderedPrompt || decodedRenderedPrompt.startsWith('NO RENDERED PROMPT')) {
136
+ throw new Error('Missing main step rendered prompt for this run')
137
+ }
138
+
139
+ const decodedConversation = decodeHtmlEntities(String(run.stringified_conversation ?? ''))
140
+ if (!decodedConversation || decodedConversation.startsWith('NO STRINGIFIED CONVERSATION')) {
141
+ throw new Error('Missing main step conversation for this run')
142
+ }
143
+
144
+ const mainTrace = findMainTrace(run.traces)
145
+ if (!mainTrace) {
146
+ throw new Error('Main step trace not found for this run')
147
+ }
148
+
149
+ const resolvedModel = resolveModel(mainTrace.model)
150
+ if (!resolvedModel) {
151
+ throw new Error('Missing main step model for this run')
152
+ }
153
+
154
+ return analyzeTraceQuotes({
155
+ model: resolvedModel,
156
+ renderedPrompt: decodedRenderedPrompt,
157
+ stringifiedConversation: decodedConversation,
158
+ response: String(run.result || ''),
159
+ stepTrace: mainTrace,
160
+ rawInput: {
161
+ agent: input.agent,
162
+ testId: input.testId,
163
+ index: input.index,
164
+ timestamp: input.timestamp ?? null
165
+ }
166
+ })
167
+ }
168
+
169
+ async function analyzeOnce(
170
+ client: OpenAI,
171
+ model: string,
172
+ renderedPrompt: string,
173
+ conversationWithResponse: string,
174
+ analyzeSystemMessage: string,
175
+ ): Promise<string[]> {
176
+ const completion = await client.chat.completions.create({
177
+ model,
178
+ messages: [
179
+ { role: 'system', content: renderedPrompt },
180
+ { role: 'user', content: conversationWithResponse },
181
+ { role: 'system', content: analyzeSystemMessage },
182
+ ],
183
+ })
184
+ const content = completion.choices?.[0]?.message?.content
185
+ if (!content) throw new Error('No analysis response from the LLM')
186
+ return parseJsonArrayOfStrings(content)
187
+ }
188
+
189
+ function normalizeQuote(raw: string): string {
190
+ let q = decodeHtmlEntities(raw).trim()
191
+ q = trimWrappingQuotes(q)
192
+ return q.trim()
193
+ }
194
+
195
+ function sanitizeAnalyzedStepTrace(trace: StepTrace): Record<string, unknown> {
196
+ let clone: any
197
+ try {
198
+ clone = JSON.parse(JSON.stringify(trace))
199
+ } catch {
200
+ clone = { ...(trace as any) }
201
+ }
202
+ if (clone && typeof clone === 'object') {
203
+ if ('renderedPrompt' in clone) delete clone.renderedPrompt
204
+ if ('receivedPrompt' in clone) delete clone.receivedPrompt
205
+ }
206
+ return clone as Record<string, unknown>
207
+ }
208
+
209
+ function toErrorString(err: unknown): string {
210
+ if (err instanceof Error) return `${err.name}: ${err.message}`
211
+ try {
212
+ return JSON.stringify(err)
213
+ } catch {
214
+ return String(err)
215
+ }
216
+ }
217
+
218
+ function trimWrappingQuotes(text: string): string {
219
+ const quotePairs: Array<[string, string]> = [
220
+ ['"', '"'],
221
+ ["'", "'"],
222
+ ['“', '”'],
223
+ ['‘', '’'],
224
+ ['«', '»'],
225
+ ['„', '“']
226
+ ]
227
+
228
+ let out = text
229
+ for (let i = 0; i < 5; i++) {
230
+ const trimmed = out.trim()
231
+ let changed = false
232
+ for (const [open, close] of quotePairs) {
233
+ if (trimmed.startsWith(open) && trimmed.endsWith(close)) {
234
+ const next = trimmed.slice(open.length, trimmed.length - close.length)
235
+ if (next === trimmed) continue
236
+ out = next
237
+ changed = true
238
+ break
239
+ }
240
+ }
241
+ if (!changed) {
242
+ out = trimmed
243
+ break
244
+ }
245
+ }
246
+ return out
247
+ }
248
+
249
+ function findMainTrace(traces: StepTrace[] | undefined): StepTrace | undefined {
250
+ if (!Array.isArray(traces) || traces.length === 0) return undefined
251
+ for (let i = traces.length - 1; i >= 0; i--) {
252
+ const t = traces[i]
253
+ if (!t) continue
254
+ if (t.name === 'main' || t.name === 'mainReply') return t
255
+ }
256
+ return undefined
257
+ }
258
+
259
+ function resolveModel(model: string | undefined): string | null {
260
+ if (!model) return null
261
+ if (model === 'default') return 'gpt-4o-2024-08-06'
262
+
263
+ // Some traces stringify adapter options instead of a bare model name.
264
+ const trimmed = model.trim()
265
+ if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
266
+ try {
267
+ const parsed = JSON.parse(trimmed) as unknown
268
+ if (parsed && typeof parsed === 'object' && 'model' in parsed) {
269
+ const m = (parsed as any).model
270
+ if (typeof m === 'string' && m.trim().length > 0) return m.trim()
271
+ }
272
+ } catch {
273
+ // ignore
274
+ }
275
+ }
276
+
277
+ return trimmed.length > 0 ? trimmed : null
278
+ }
279
+
280
+ function appendResponseToConversation(conversation: string, response: string, agentLabel: string): string {
281
+ const base = conversation.trimEnd()
282
+ const prefix = base.length > 0 ? base + '\n' : ''
283
+ return `${prefix}${agentLabel}: ${response}`
284
+ }
285
+
286
+ function inferAgentLabel(conversation: string): string {
287
+ const lines = conversation.split(/\r?\n/)
288
+ const counts = new Map<string, number>()
289
+ const seen: string[] = []
290
+
291
+ for (const line of lines) {
292
+ const m = line.match(/^([^:\n]{1,50}):\s/)
293
+ if (!m) continue
294
+ const label = m[1]
295
+ seen.push(label)
296
+ counts.set(label, (counts.get(label) || 0) + 1)
297
+ }
298
+
299
+ const userLabel = counts.has('User') ? 'User' : seen[0]
300
+ const sorted = [...counts.entries()].sort((a, b) => b[1] - a[1])
301
+ for (const [label] of sorted) {
302
+ if (!label) continue
303
+ if (label === userLabel) continue
304
+ if (label.toLowerCase() === 'system') continue
305
+ if (label.toLowerCase().startsWith('proposed')) continue
306
+ return label
307
+ }
308
+
309
+ return 'Agent'
310
+ }
311
+
312
+ function parseJsonArrayOfStrings(raw: string): string[] {
313
+ const text = stripCodeFences(raw).trim()
314
+
315
+ const parsed = tryParseJson(text) ?? tryParseJson(extractJsonArray(text))
316
+ if (!parsed) {
317
+ throw new Error('Failed to parse analysis response as JSON array')
318
+ }
319
+
320
+ if (Array.isArray(parsed)) {
321
+ return parsed.map((v) => String(v))
322
+ }
323
+
324
+ if (parsed && typeof parsed === 'object') {
325
+ const quotes = (parsed as any).quotes
326
+ if (Array.isArray(quotes)) return quotes.map((v: unknown) => String(v))
327
+ }
328
+
329
+ throw new Error('Analysis response was not a JSON array')
330
+ }
331
+
332
+ function stripCodeFences(text: string): string {
333
+ const trimmed = text.trim()
334
+ const m = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i)
335
+ return m ? m[1] : trimmed
336
+ }
337
+
338
+ function tryParseJson(text: string): unknown | null {
339
+ try {
340
+ return JSON.parse(text)
341
+ } catch {
342
+ return null
343
+ }
344
+ }
345
+
346
+ function extractJsonArray(text: string): string {
347
+ const start = text.indexOf('[')
348
+ const end = text.lastIndexOf(']')
349
+ if (start === -1 || end === -1 || end < start) return text
350
+ return text.slice(start, end + 1)
351
+ }
352
+
353
+ function envTextOrDefault(key: string, defaultValue: string): string {
354
+ const raw = (process.env[key] ?? '').trim()
355
+ if (!raw) return defaultValue
356
+ return raw.replace(/\\n/g, '\n')
357
+ }
@@ -39,6 +39,12 @@ export interface RunResult {
39
39
  logs: string[]
40
40
  }
41
41
 
42
+ export interface PreviousTestResultSummary {
43
+ success_count: number
44
+ total_runs: number
45
+ report_timestamp: string // ISO
46
+ }
47
+
42
48
  export interface TestResult {
43
49
  test_id: string
44
50
  success_rate_percent?: number
@@ -46,6 +52,7 @@ export interface TestResult {
46
52
  results: RunResult[]
47
53
  report_timestamp: string // ISO
48
54
  is_old: boolean
55
+ previous?: PreviousTestResultSummary
49
56
  }
50
57
  export interface TestTable {
51
58
  rows: TestRow[]
@@ -89,6 +96,7 @@ export async function loadTests(agent: string): Promise<TestTable> {
89
96
  'id',
90
97
  'pinned',
91
98
  'scenario',
99
+ 'step',
92
100
  'author',
93
101
  'category',
94
102
  'assertion_type',
@@ -273,7 +281,8 @@ export async function loadLatestResultsByTest(agent: string): Promise<Record<str
273
281
  .replace(/-/g, ':')
274
282
 
275
283
  const results: Record<string, TestResult> = {}
276
- for (const name of files) {
284
+ for (let i = files.length - 1; i >= 0; i--) {
285
+ const name = files[i]
277
286
  const full = path.join(outDir, name)
278
287
  const raw = await readFile(full, 'utf8')
279
288
  const parsed = JSON.parse(raw) as any
@@ -288,18 +297,28 @@ export async function loadLatestResultsByTest(agent: string): Promise<Record<str
288
297
  }
289
298
  const par = String((r as any).pinned_at_run ?? 'TRUE').toUpperCase()
290
299
  if (par === 'FALSE') continue
291
- // Always prefer newer timestamp
292
- const prev = results[test_id]
293
- const rec: TestResult = {
294
- test_id,
295
- success_rate_percent: (r as any).success_rate_percent,
296
- success_rate: (r as any).success_rate,
297
- results: Array.isArray((r as any).results) ? ((r as any).results as RunResult[]) : [],
298
- report_timestamp: ts,
299
- is_old: ts < latestTs
300
+
301
+ const runResults: RunResult[] = Array.isArray((r as any).results) ? ((r as any).results as RunResult[]) : []
302
+ const summary: PreviousTestResultSummary = {
303
+ success_count: runResults.reduce((acc, rr) => acc + (rr?.success ? 1 : 0), 0),
304
+ total_runs: runResults.length,
305
+ report_timestamp: ts
306
+ }
307
+
308
+ const current = results[test_id]
309
+ if (!current) {
310
+ results[test_id] = {
311
+ test_id,
312
+ success_rate_percent: (r as any).success_rate_percent,
313
+ success_rate: (r as any).success_rate,
314
+ results: runResults,
315
+ report_timestamp: ts,
316
+ is_old: ts < latestTs
317
+ }
318
+ continue
300
319
  }
301
- if (!prev || prev.report_timestamp < ts) {
302
- results[test_id] = rec
320
+ if (!current.previous && ts < current.report_timestamp) {
321
+ current.previous = summary
303
322
  }
304
323
  }
305
324
  }
@@ -338,6 +357,23 @@ async function getRun(agent: string, ts?: string) {
338
357
 
339
358
  type ResultKey = keyof Omit<ResultEntry, 'success'>
340
359
 
360
+ export async function getRunResultEntry(
361
+ agent: string,
362
+ testId: string,
363
+ index = 0,
364
+ ts?: string
365
+ ): Promise<ResultEntry> {
366
+ const result = await getRun(agent, ts)
367
+
368
+ const row = result.rows.find((r) => r.test_id === testId)
369
+ if (!row) throw new Error('Row not found in report')
370
+
371
+ const run = row.results[index]
372
+ if (!run) throw new Error(`Run not found for test ${testId}, index: ${index}`)
373
+
374
+ return run
375
+ }
376
+
341
377
  export async function getResultEntry(
342
378
  agent: string,
343
379
  testId: string,
@@ -17,6 +17,7 @@ export async function loadAgents(props: {
17
17
  logger?: Logger
18
18
  context?: Record<string, any>
19
19
  timeoutSeconds: number
20
+ abortSignal?: AbortSignal
20
21
  }): Promise<void> {
21
22
  const {
22
23
  agentId,
@@ -25,7 +26,8 @@ export async function loadAgents(props: {
25
26
  stepTracer: stepTracer,
26
27
  logger: providedLogger,
27
28
  context,
28
- timeoutSeconds
29
+ timeoutSeconds,
30
+ abortSignal
29
31
  } = props
30
32
  const { factories } = await getAgentFactories(await getRootPath())
31
33
  const factory = factories[agentId]
@@ -87,13 +89,46 @@ export async function loadAgents(props: {
87
89
  console.error('UNHANDLED', r)
88
90
  })
89
91
 
92
+ const withAbort = async <T>(p: Promise<T>): Promise<T> => {
93
+ if (!abortSignal) return p
94
+ if (abortSignal.aborted) throw new Error('Operation cancelled')
95
+ return await new Promise<T>((resolve, reject) => {
96
+ const onAbort = () => {
97
+ cleanup()
98
+ reject(new Error('Operation cancelled'))
99
+ }
100
+ const cleanup = () => {
101
+ try {
102
+ abortSignal.removeEventListener('abort', onAbort)
103
+ } catch {
104
+ /* noop */
105
+ }
106
+ }
107
+ try {
108
+ abortSignal.addEventListener('abort', onAbort, { once: true })
109
+ } catch {
110
+ /* noop */
111
+ }
112
+ p.then(
113
+ (v) => {
114
+ cleanup()
115
+ resolve(v)
116
+ },
117
+ (e) => {
118
+ cleanup()
119
+ reject(e)
120
+ }
121
+ )
122
+ })
123
+ }
124
+
90
125
  try {
91
126
  if (isVoiceAgent(agent)) {
92
- await agent.streamResponse()
127
+ await withAbort(agent.streamResponse())
93
128
  } else {
94
- await agent.respondToMessage()
129
+ await withAbort(agent.respondToMessage())
95
130
  }
96
- await new Promise((resolve) => setTimeout(resolve, timeoutSeconds * 1000))
131
+ await withAbort(new Promise((resolve) => setTimeout(resolve, timeoutSeconds * 1000)))
97
132
  } catch (err) {
98
133
  const msg = err instanceof Error ? `${err.name}: ${err.message}` : String(err)
99
134
  const stack = err instanceof Error ? err.stack : undefined