@recombine-ai/bosun 0.3.6 → 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 (468) 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/ChatStepTrace.NFJFjHv0.css +1 -0
  14. package/build/client/_app/immutable/assets/ChatStepTrace.NFJFjHv0.css.br +0 -0
  15. package/build/client/_app/immutable/assets/ChatStepTrace.NFJFjHv0.css.gz +0 -0
  16. package/build/client/_app/immutable/assets/{Tab.BxaGw9IG.css → Tab.jOjMVh6j.css} +1 -1
  17. package/build/client/_app/immutable/assets/Tab.jOjMVh6j.css.br +0 -0
  18. package/build/client/_app/immutable/assets/Tab.jOjMVh6j.css.gz +0 -0
  19. package/build/client/_app/immutable/chunks/7wcu2ga1.js +1 -0
  20. package/build/client/_app/immutable/chunks/7wcu2ga1.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/7wcu2ga1.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/B3K88SyC.js +1 -0
  23. package/build/client/_app/immutable/chunks/B3K88SyC.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/B3K88SyC.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{D5fGPlBk.js → BGEE3mf3.js} +1 -1
  26. package/build/client/_app/immutable/chunks/BGEE3mf3.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BGEE3mf3.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/{BOQMymse.js → BH7VBnJ7.js} +1 -1
  29. package/build/client/_app/immutable/chunks/BH7VBnJ7.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BH7VBnJ7.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/BHkx8tAH.js +1 -0
  32. package/build/client/_app/immutable/chunks/BHkx8tAH.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/BHkx8tAH.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/BMwJcaLS.js +1 -0
  35. package/build/client/_app/immutable/chunks/BMwJcaLS.js.br +2 -0
  36. package/build/client/_app/immutable/chunks/BMwJcaLS.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/{CfKHaDCm.js → BOrnwyTp.js} +1 -1
  38. package/build/client/_app/immutable/chunks/BOrnwyTp.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/BOrnwyTp.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/BbaH2eDw.js +1 -0
  41. package/build/client/_app/immutable/chunks/BbaH2eDw.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/BbaH2eDw.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{C769zFCl.js → Bub2VLj9.js} +1 -1
  44. package/build/client/_app/immutable/chunks/Bub2VLj9.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/Bub2VLj9.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/{yOR3vtRx.js → ByppsbS-.js} +1 -1
  47. package/build/client/_app/immutable/chunks/ByppsbS-.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/ByppsbS-.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/C0mQlu7J.js +1 -0
  50. package/build/client/_app/immutable/chunks/C0mQlu7J.js.br +1 -0
  51. package/build/client/_app/immutable/chunks/C0mQlu7J.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/C0pV4x1v.js +1 -0
  53. package/build/client/_app/immutable/chunks/C0pV4x1v.js.br +2 -0
  54. package/build/client/_app/immutable/chunks/C0pV4x1v.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/C0sQKHpE.js +1 -0
  56. package/build/client/_app/immutable/chunks/C0sQKHpE.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/C0sQKHpE.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/{CRlLKhPr.js → CFcfsVkY.js} +1 -1
  59. package/build/client/_app/immutable/chunks/CFcfsVkY.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/CFcfsVkY.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/{CZJlygAJ.js → CYkx2jgw.js} +1 -1
  62. package/build/client/_app/immutable/chunks/CYkx2jgw.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/CYkx2jgw.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/CZ6iREyA.js +8 -0
  65. package/build/client/_app/immutable/chunks/CZ6iREyA.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/CZ6iREyA.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/CbCJfhin.js +1 -0
  68. package/build/client/_app/immutable/chunks/CbCJfhin.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/CbCJfhin.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/{DaRvw8c-.js → CdTjAjKm.js} +7 -7
  71. package/build/client/_app/immutable/chunks/CdTjAjKm.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/CdTjAjKm.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/{4PztAao_.js → CmPVG-ki.js} +1 -1
  74. package/build/client/_app/immutable/chunks/CmPVG-ki.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/CmPVG-ki.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/{DJ_lsF0V.js → Cnr0cZA4.js} +1 -1
  77. package/build/client/_app/immutable/chunks/Cnr0cZA4.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/Cnr0cZA4.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/CojkI8AD.js +33 -0
  80. package/build/client/_app/immutable/chunks/CojkI8AD.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/CojkI8AD.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/Cp_hX0eh.js +1 -0
  83. package/build/client/_app/immutable/chunks/Cp_hX0eh.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/Cp_hX0eh.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/Cv6CwVfk.js +3 -0
  86. package/build/client/_app/immutable/chunks/Cv6CwVfk.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/Cv6CwVfk.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/{DAfsp-82.js → D8qEOlWC.js} +1 -1
  89. package/build/client/_app/immutable/chunks/D8qEOlWC.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/D8qEOlWC.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/{Bf1oCG9-.js → DOMF1VtZ.js} +1 -1
  92. package/build/client/_app/immutable/chunks/DOMF1VtZ.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/DOMF1VtZ.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{Bd7SZbXQ.js → DRaGXt8e.js} +1 -1
  95. package/build/client/_app/immutable/chunks/DRaGXt8e.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/DRaGXt8e.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{Bw2f0Pmg.js → DU-D8S0B.js} +1 -1
  98. package/build/client/_app/immutable/chunks/DU-D8S0B.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/DU-D8S0B.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/{Culo9hD6.js → DadWvtYR.js} +1 -1
  101. package/build/client/_app/immutable/chunks/DadWvtYR.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/DadWvtYR.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/{Cx_xzGPa.js → DbYdNz4J.js} +1 -1
  104. package/build/client/_app/immutable/chunks/DbYdNz4J.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/DbYdNz4J.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/DiFAgw_s.js +1 -0
  107. package/build/client/_app/immutable/chunks/DiFAgw_s.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/DiFAgw_s.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/DrMdBz9b.js +1 -0
  110. package/build/client/_app/immutable/chunks/DrMdBz9b.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/DrMdBz9b.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/{qXu78w_4.js → DsvX5v5e.js} +1 -1
  113. package/build/client/_app/immutable/chunks/DsvX5v5e.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/DsvX5v5e.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/Y0ymTIHd.js +1 -0
  116. package/build/client/_app/immutable/chunks/Y0ymTIHd.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/Y0ymTIHd.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/_HWrJCgx.js +1 -0
  119. package/build/client/_app/immutable/chunks/_HWrJCgx.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/_HWrJCgx.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/{CRTtd6by.js → qPgPowuc.js} +1 -1
  122. package/build/client/_app/immutable/chunks/qPgPowuc.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/qPgPowuc.js.gz +0 -0
  124. package/build/client/_app/immutable/chunks/ri5tqg4N.js +1 -0
  125. package/build/client/_app/immutable/chunks/ri5tqg4N.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/ri5tqg4N.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/{Codln_pl.js → sdLD1XcR.js} +1 -1
  128. package/build/client/_app/immutable/chunks/sdLD1XcR.js.br +0 -0
  129. package/build/client/_app/immutable/chunks/sdLD1XcR.js.gz +0 -0
  130. package/build/client/_app/immutable/chunks/t1v2-usS.js +4 -0
  131. package/build/client/_app/immutable/chunks/t1v2-usS.js.br +0 -0
  132. package/build/client/_app/immutable/chunks/t1v2-usS.js.gz +0 -0
  133. package/build/client/_app/immutable/chunks/tLFXBP7P.js +2 -0
  134. package/build/client/_app/immutable/chunks/tLFXBP7P.js.br +0 -0
  135. package/build/client/_app/immutable/chunks/tLFXBP7P.js.gz +0 -0
  136. package/build/client/_app/immutable/entry/app.jP0Pyfdy.js +2 -0
  137. package/build/client/_app/immutable/entry/app.jP0Pyfdy.js.br +0 -0
  138. package/build/client/_app/immutable/entry/app.jP0Pyfdy.js.gz +0 -0
  139. package/build/client/_app/immutable/entry/start.KD1JZMOT.js +1 -0
  140. package/build/client/_app/immutable/entry/start.KD1JZMOT.js.br +2 -0
  141. package/build/client/_app/immutable/entry/start.KD1JZMOT.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/0.ByrdmeSo.js +3 -0
  143. package/build/client/_app/immutable/nodes/0.ByrdmeSo.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/0.ByrdmeSo.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/1.VLeq38lN.js +1 -0
  146. package/build/client/_app/immutable/nodes/1.VLeq38lN.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/1.VLeq38lN.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/10.BHSGZYEC.js +1 -0
  149. package/build/client/_app/immutable/nodes/10.BHSGZYEC.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/10.BHSGZYEC.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js +1 -0
  152. package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js +1 -0
  155. package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js.br +2 -0
  156. package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/13.DetV1tDO.js +1 -0
  158. package/build/client/_app/immutable/nodes/13.DetV1tDO.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/13.DetV1tDO.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/14.I-eiMWQu.js +11 -0
  161. package/build/client/_app/immutable/nodes/14.I-eiMWQu.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/14.I-eiMWQu.js.gz +0 -0
  163. package/build/client/_app/immutable/nodes/2.DX9U9zLg.js +35 -0
  164. package/build/client/_app/immutable/nodes/2.DX9U9zLg.js.br +0 -0
  165. package/build/client/_app/immutable/nodes/2.DX9U9zLg.js.gz +0 -0
  166. package/build/client/_app/immutable/nodes/3.Bh8il5iy.js +1 -0
  167. package/build/client/_app/immutable/nodes/3.Bh8il5iy.js.br +0 -0
  168. package/build/client/_app/immutable/nodes/3.Bh8il5iy.js.gz +0 -0
  169. package/build/client/_app/immutable/nodes/{3.C-B1sGi_.js → 4.CtzHYc6x.js} +1 -1
  170. package/build/client/_app/immutable/nodes/4.CtzHYc6x.js.br +0 -0
  171. package/build/client/_app/immutable/nodes/4.CtzHYc6x.js.gz +0 -0
  172. package/build/client/_app/immutable/nodes/5.B4dlomkV.js +1 -0
  173. package/build/client/_app/immutable/nodes/5.B4dlomkV.js.br +0 -0
  174. package/build/client/_app/immutable/nodes/5.B4dlomkV.js.gz +0 -0
  175. package/build/client/_app/immutable/nodes/6.CPYhLc46.js +1 -0
  176. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.br +4 -0
  177. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.gz +0 -0
  178. package/build/client/_app/immutable/nodes/7.CBPrYfFp.js +2 -0
  179. package/build/client/_app/immutable/nodes/7.CBPrYfFp.js.br +0 -0
  180. package/build/client/_app/immutable/nodes/7.CBPrYfFp.js.gz +0 -0
  181. package/build/client/_app/immutable/nodes/8.4NTWYv4c.js +6 -0
  182. package/build/client/_app/immutable/nodes/8.4NTWYv4c.js.br +0 -0
  183. package/build/client/_app/immutable/nodes/8.4NTWYv4c.js.gz +0 -0
  184. package/build/client/_app/immutable/nodes/9.BVI-eEdV.js +1 -0
  185. package/build/client/_app/immutable/nodes/9.BVI-eEdV.js.br +0 -0
  186. package/build/client/_app/immutable/nodes/9.BVI-eEdV.js.gz +0 -0
  187. package/build/client/_app/immutable/workers/css.worker-BRIrhzkG.js +84 -0
  188. package/build/client/_app/immutable/workers/css.worker-BRIrhzkG.js.br +0 -0
  189. package/build/client/_app/immutable/workers/css.worker-BRIrhzkG.js.gz +0 -0
  190. package/build/client/_app/immutable/workers/editor.worker-DX6ApQqM.js +12 -0
  191. package/build/client/_app/immutable/workers/editor.worker-DX6ApQqM.js.br +0 -0
  192. package/build/client/_app/immutable/workers/editor.worker-DX6ApQqM.js.gz +0 -0
  193. package/build/client/_app/immutable/workers/html.worker-CBI4EQBP.js +461 -0
  194. package/build/client/_app/immutable/workers/html.worker-CBI4EQBP.js.br +0 -0
  195. package/build/client/_app/immutable/workers/html.worker-CBI4EQBP.js.gz +0 -0
  196. package/build/client/_app/immutable/workers/json.worker-CIZWV9vN.js +49 -0
  197. package/build/client/_app/immutable/workers/json.worker-CIZWV9vN.js.br +0 -0
  198. package/build/client/_app/immutable/workers/json.worker-CIZWV9vN.js.gz +0 -0
  199. package/build/client/_app/immutable/workers/ts.worker-Ds4I2Msu.js +51334 -0
  200. package/build/client/_app/immutable/workers/ts.worker-Ds4I2Msu.js.br +0 -0
  201. package/build/client/_app/immutable/workers/ts.worker-Ds4I2Msu.js.gz +0 -0
  202. package/build/client/_app/version.json +1 -1
  203. package/build/client/_app/version.json.br +0 -0
  204. package/build/client/_app/version.json.gz +0 -0
  205. package/build/server/chunks/0-CjpeDbMt.js +9 -0
  206. package/build/server/chunks/{0-BjExyGhw.js.map → 0-CjpeDbMt.js.map} +1 -1
  207. package/build/server/chunks/1-M0YzuUQM.js +9 -0
  208. package/build/server/chunks/{1-BwvZ1byr.js.map → 1-M0YzuUQM.js.map} +1 -1
  209. package/build/server/chunks/{7-soEaW5k5.js → 10-C7WLHR92.js} +5 -5
  210. package/build/server/chunks/10-C7WLHR92.js.map +1 -0
  211. package/build/server/chunks/11-CPYwUx-7.js +21 -0
  212. package/build/server/chunks/11-CPYwUx-7.js.map +1 -0
  213. package/build/server/chunks/12-C5OSs5Op.js +20 -0
  214. package/build/server/chunks/12-C5OSs5Op.js.map +1 -0
  215. package/build/server/chunks/13-BQ9R_Ex-.js +9 -0
  216. package/build/server/chunks/13-BQ9R_Ex-.js.map +1 -0
  217. package/build/server/chunks/14-BFsI6u_W.js +9 -0
  218. package/build/server/chunks/14-BFsI6u_W.js.map +1 -0
  219. package/build/server/chunks/2-Cjh0UTU6.js +9 -0
  220. package/build/server/chunks/2-Cjh0UTU6.js.map +1 -0
  221. package/build/server/chunks/3-VrGFs76T.js +9 -0
  222. package/build/server/chunks/3-VrGFs76T.js.map +1 -0
  223. package/build/server/chunks/4-CSgrzh2F.js +9 -0
  224. package/build/server/chunks/4-CSgrzh2F.js.map +1 -0
  225. package/build/server/chunks/5-zKehYil3.js +9 -0
  226. package/build/server/chunks/5-zKehYil3.js.map +1 -0
  227. package/build/server/chunks/6-uS_X9B0s.js +21 -0
  228. package/build/server/chunks/6-uS_X9B0s.js.map +1 -0
  229. package/build/server/chunks/7-DewREBAN.js +9 -0
  230. package/build/server/chunks/7-DewREBAN.js.map +1 -0
  231. package/build/server/chunks/8-Dk3ms3jm.js +9 -0
  232. package/build/server/chunks/8-Dk3ms3jm.js.map +1 -0
  233. package/build/server/chunks/9-W6XYayeK.js +25 -0
  234. package/build/server/chunks/9-W6XYayeK.js.map +1 -0
  235. package/build/server/chunks/{AgentSidebar-C4H-7WxT.js → AgentSidebar-BB_yQ9s0.js} +4 -4
  236. package/build/server/chunks/AgentSidebar-BB_yQ9s0.js.map +1 -0
  237. package/build/server/chunks/{Button-D3mqAVvu.js → Button-Cd4Yzpdy.js} +4 -4
  238. package/build/server/chunks/Button-Cd4Yzpdy.js.map +1 -0
  239. package/build/server/chunks/{ChatStepTrace-dfzN1KEN.js → ChatStepTrace-cq26gF4B.js} +229 -14
  240. package/build/server/chunks/ChatStepTrace-cq26gF4B.js.map +1 -0
  241. package/build/server/chunks/ContextEditor-CfjBPLpI.js +67 -0
  242. package/build/server/chunks/ContextEditor-CfjBPLpI.js.map +1 -0
  243. package/build/server/chunks/{Icon-D0R0X6Hr.js → Icon-BgknHaZs.js} +2 -2
  244. package/build/server/chunks/{Icon-D0R0X6Hr.js.map → Icon-BgknHaZs.js.map} +1 -1
  245. package/build/server/chunks/{Input-C_H479QL.js → Input-BJW36iKz.js} +2 -2
  246. package/build/server/chunks/{Input-C_H479QL.js.map → Input-BJW36iKz.js.map} +1 -1
  247. package/build/server/chunks/{Modal-NTInCBwo.js → Modal-D4tx0Bdo.js} +3 -3
  248. package/build/server/chunks/Modal-D4tx0Bdo.js.map +1 -0
  249. package/build/server/chunks/{Tab-DAuTmew0.js → Tab-DheAG-QC.js} +3 -3
  250. package/build/server/chunks/Tab-DheAG-QC.js.map +1 -0
  251. package/build/server/chunks/{_layout.svelte-DFDvSokt.js → _layout.svelte-BL8XnK1E.js} +23 -28
  252. package/build/server/chunks/_layout.svelte-BL8XnK1E.js.map +1 -0
  253. package/build/server/chunks/_layout.svelte-DHgaGTP_.js +844 -0
  254. package/build/server/chunks/_layout.svelte-DHgaGTP_.js.map +1 -0
  255. package/build/server/chunks/{_layout.svelte-CrT993Da.js → _layout.svelte-Svi5xbzP.js} +1 -14
  256. package/build/server/chunks/_layout.svelte-Svi5xbzP.js.map +1 -0
  257. package/build/server/chunks/{_page.svelte-B3Lu_xzt.js → _page.svelte-39hvC6-Q.js} +4 -4
  258. package/build/server/chunks/{_page.svelte-B3Lu_xzt.js.map → _page.svelte-39hvC6-Q.js.map} +1 -1
  259. package/build/server/chunks/{_page.svelte-5O44TlMG.js → _page.svelte-BpnUXzfh.js} +40 -25
  260. package/build/server/chunks/_page.svelte-BpnUXzfh.js.map +1 -0
  261. package/build/server/chunks/{_page.svelte-N6xQwQzn.js → _page.svelte-C1YaC_Qg.js} +498 -496
  262. package/build/server/chunks/_page.svelte-C1YaC_Qg.js.map +1 -0
  263. package/build/server/chunks/{_page.svelte-D9kg5-lo.js → _page.svelte-CbqAsz26.js} +3 -3
  264. package/build/server/chunks/_page.svelte-CbqAsz26.js.map +1 -0
  265. package/build/server/chunks/{_page.svelte-ClesenAz.js → _page.svelte-CmsDxzfh.js} +19 -27
  266. package/build/server/chunks/_page.svelte-CmsDxzfh.js.map +1 -0
  267. package/build/server/chunks/{_page.svelte-DimeWJh5.js → _page.svelte-DCP-PSh0.js} +293 -433
  268. package/build/server/chunks/_page.svelte-DCP-PSh0.js.map +1 -0
  269. package/build/server/chunks/edit-workspace-context-OTOIRCI0.js +13 -0
  270. package/build/server/chunks/edit-workspace-context-OTOIRCI0.js.map +1 -0
  271. package/build/server/chunks/hooks-BJphIAi-.js +8 -0
  272. package/build/server/chunks/hooks-BJphIAi-.js.map +1 -0
  273. package/build/server/chunks/{Tab.svelte_svelte_type_style_lang-Bmdqxv-M.js → index-server-CefdgakO.js} +2 -2
  274. package/build/server/chunks/index-server-CefdgakO.js.map +1 -0
  275. package/build/server/chunks/{index2-CHZ7ZFLZ.js → index2-BuOY2QE4.js} +2 -2
  276. package/build/server/chunks/{index2-CHZ7ZFLZ.js.map → index2-BuOY2QE4.js.map} +1 -1
  277. package/build/server/chunks/log-content.svelte-B3ZvaoLs.js +20 -0
  278. package/build/server/chunks/log-content.svelte-B3ZvaoLs.js.map +1 -0
  279. package/build/server/index.js +3 -2
  280. package/build/server/index.js.map +1 -1
  281. package/build/server/manifest.js +51 -18
  282. package/build/server/manifest.js.map +1 -1
  283. package/package.json +3 -1
  284. package/src/backend/lib/decode-html-entities.spec.ts +29 -0
  285. package/src/backend/lib/decode-html-entities.ts +25 -0
  286. package/src/backend/roleplay/router.ts +31 -0
  287. package/src/backend/tests/academy.ts +353 -115
  288. package/src/backend/tests/analyze.ts +357 -0
  289. package/src/backend/tests/data.ts +48 -12
  290. package/src/backend/tests/emulate-agents.ts +39 -4
  291. package/src/backend/tests/prompt-issues.ts +204 -0
  292. package/src/backend/tests/router.ts +51 -4
  293. package/build/client/_app/immutable/assets/0.D_OBtTqU.css +0 -1
  294. package/build/client/_app/immutable/assets/0.D_OBtTqU.css.br +0 -0
  295. package/build/client/_app/immutable/assets/0.D_OBtTqU.css.gz +0 -0
  296. package/build/client/_app/immutable/assets/4.sP9PzBp7.css +0 -1
  297. package/build/client/_app/immutable/assets/4.sP9PzBp7.css.br +0 -0
  298. package/build/client/_app/immutable/assets/4.sP9PzBp7.css.gz +0 -0
  299. package/build/client/_app/immutable/assets/6.C4C8vBUW.css +0 -1
  300. package/build/client/_app/immutable/assets/6.C4C8vBUW.css.br +0 -0
  301. package/build/client/_app/immutable/assets/6.C4C8vBUW.css.gz +0 -0
  302. package/build/client/_app/immutable/assets/Tab.BxaGw9IG.css.br +0 -0
  303. package/build/client/_app/immutable/assets/Tab.BxaGw9IG.css.gz +0 -0
  304. package/build/client/_app/immutable/chunks/4PztAao_.js.br +0 -0
  305. package/build/client/_app/immutable/chunks/4PztAao_.js.gz +0 -0
  306. package/build/client/_app/immutable/chunks/B2gGEZTS.js +0 -1
  307. package/build/client/_app/immutable/chunks/B2gGEZTS.js.br +0 -2
  308. package/build/client/_app/immutable/chunks/B2gGEZTS.js.gz +0 -0
  309. package/build/client/_app/immutable/chunks/BFOPpRqC.js +0 -8
  310. package/build/client/_app/immutable/chunks/BFOPpRqC.js.br +0 -0
  311. package/build/client/_app/immutable/chunks/BFOPpRqC.js.gz +0 -0
  312. package/build/client/_app/immutable/chunks/BOQMymse.js.br +0 -0
  313. package/build/client/_app/immutable/chunks/BOQMymse.js.gz +0 -0
  314. package/build/client/_app/immutable/chunks/Bd7SZbXQ.js.br +0 -0
  315. package/build/client/_app/immutable/chunks/Bd7SZbXQ.js.gz +0 -0
  316. package/build/client/_app/immutable/chunks/Bf1oCG9-.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/Bf1oCG9-.js.gz +0 -0
  318. package/build/client/_app/immutable/chunks/BgaIh2D4.js +0 -1
  319. package/build/client/_app/immutable/chunks/BgaIh2D4.js.br +0 -0
  320. package/build/client/_app/immutable/chunks/BgaIh2D4.js.gz +0 -0
  321. package/build/client/_app/immutable/chunks/BrDK8TTs.js +0 -2
  322. package/build/client/_app/immutable/chunks/BrDK8TTs.js.br +0 -0
  323. package/build/client/_app/immutable/chunks/BrDK8TTs.js.gz +0 -0
  324. package/build/client/_app/immutable/chunks/BsKQRAyX.js +0 -1
  325. package/build/client/_app/immutable/chunks/BsKQRAyX.js.br +0 -0
  326. package/build/client/_app/immutable/chunks/BsKQRAyX.js.gz +0 -0
  327. package/build/client/_app/immutable/chunks/Bw2f0Pmg.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/Bw2f0Pmg.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/C-dTPkQy.js +0 -1
  330. package/build/client/_app/immutable/chunks/C-dTPkQy.js.br +0 -0
  331. package/build/client/_app/immutable/chunks/C-dTPkQy.js.gz +0 -0
  332. package/build/client/_app/immutable/chunks/C769zFCl.js.br +0 -0
  333. package/build/client/_app/immutable/chunks/C769zFCl.js.gz +0 -0
  334. package/build/client/_app/immutable/chunks/CInh9KnU.js +0 -1
  335. package/build/client/_app/immutable/chunks/CInh9KnU.js.br +0 -2
  336. package/build/client/_app/immutable/chunks/CInh9KnU.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/CRTtd6by.js.br +0 -0
  338. package/build/client/_app/immutable/chunks/CRTtd6by.js.gz +0 -0
  339. package/build/client/_app/immutable/chunks/CRlLKhPr.js.br +0 -0
  340. package/build/client/_app/immutable/chunks/CRlLKhPr.js.gz +0 -0
  341. package/build/client/_app/immutable/chunks/CUfDVPpW.js +0 -1
  342. package/build/client/_app/immutable/chunks/CUfDVPpW.js.br +0 -0
  343. package/build/client/_app/immutable/chunks/CUfDVPpW.js.gz +0 -0
  344. package/build/client/_app/immutable/chunks/CZJlygAJ.js.br +0 -0
  345. package/build/client/_app/immutable/chunks/CZJlygAJ.js.gz +0 -0
  346. package/build/client/_app/immutable/chunks/CfKHaDCm.js.br +0 -0
  347. package/build/client/_app/immutable/chunks/CfKHaDCm.js.gz +0 -0
  348. package/build/client/_app/immutable/chunks/Codln_pl.js.br +0 -0
  349. package/build/client/_app/immutable/chunks/Codln_pl.js.gz +0 -0
  350. package/build/client/_app/immutable/chunks/Culo9hD6.js.br +0 -0
  351. package/build/client/_app/immutable/chunks/Culo9hD6.js.gz +0 -0
  352. package/build/client/_app/immutable/chunks/Cx_xzGPa.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/Cx_xzGPa.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/D5fGPlBk.js.br +0 -0
  355. package/build/client/_app/immutable/chunks/D5fGPlBk.js.gz +0 -0
  356. package/build/client/_app/immutable/chunks/D8e5qIiS.js +0 -33
  357. package/build/client/_app/immutable/chunks/D8e5qIiS.js.br +0 -0
  358. package/build/client/_app/immutable/chunks/D8e5qIiS.js.gz +0 -0
  359. package/build/client/_app/immutable/chunks/D9h7-Y-f.js +0 -1
  360. package/build/client/_app/immutable/chunks/D9h7-Y-f.js.br +0 -0
  361. package/build/client/_app/immutable/chunks/D9h7-Y-f.js.gz +0 -0
  362. package/build/client/_app/immutable/chunks/DAfsp-82.js.br +0 -0
  363. package/build/client/_app/immutable/chunks/DAfsp-82.js.gz +0 -0
  364. package/build/client/_app/immutable/chunks/DJ_lsF0V.js.br +0 -0
  365. package/build/client/_app/immutable/chunks/DJ_lsF0V.js.gz +0 -0
  366. package/build/client/_app/immutable/chunks/DaRvw8c-.js.br +0 -0
  367. package/build/client/_app/immutable/chunks/DaRvw8c-.js.gz +0 -0
  368. package/build/client/_app/immutable/chunks/Dxv8gtYg.js +0 -1
  369. package/build/client/_app/immutable/chunks/Dxv8gtYg.js.br +0 -0
  370. package/build/client/_app/immutable/chunks/Dxv8gtYg.js.gz +0 -0
  371. package/build/client/_app/immutable/chunks/FawE95CY.js +0 -1
  372. package/build/client/_app/immutable/chunks/FawE95CY.js.br +0 -0
  373. package/build/client/_app/immutable/chunks/FawE95CY.js.gz +0 -0
  374. package/build/client/_app/immutable/chunks/HBgR5qMR.js +0 -3
  375. package/build/client/_app/immutable/chunks/HBgR5qMR.js.br +0 -0
  376. package/build/client/_app/immutable/chunks/HBgR5qMR.js.gz +0 -0
  377. package/build/client/_app/immutable/chunks/I-mny6CH.js +0 -1
  378. package/build/client/_app/immutable/chunks/I-mny6CH.js.br +0 -0
  379. package/build/client/_app/immutable/chunks/I-mny6CH.js.gz +0 -0
  380. package/build/client/_app/immutable/chunks/WkRHaFaq.js +0 -4
  381. package/build/client/_app/immutable/chunks/WkRHaFaq.js.br +0 -0
  382. package/build/client/_app/immutable/chunks/WkRHaFaq.js.gz +0 -0
  383. package/build/client/_app/immutable/chunks/aeuWzujc.js +0 -1
  384. package/build/client/_app/immutable/chunks/aeuWzujc.js.br +0 -2
  385. package/build/client/_app/immutable/chunks/aeuWzujc.js.gz +0 -0
  386. package/build/client/_app/immutable/chunks/qXu78w_4.js.br +0 -0
  387. package/build/client/_app/immutable/chunks/qXu78w_4.js.gz +0 -0
  388. package/build/client/_app/immutable/chunks/yOR3vtRx.js.br +0 -0
  389. package/build/client/_app/immutable/chunks/yOR3vtRx.js.gz +0 -0
  390. package/build/client/_app/immutable/entry/app.Bo6pBzFD.js +0 -2
  391. package/build/client/_app/immutable/entry/app.Bo6pBzFD.js.br +0 -0
  392. package/build/client/_app/immutable/entry/app.Bo6pBzFD.js.gz +0 -0
  393. package/build/client/_app/immutable/entry/start.DvDUBfDS.js +0 -1
  394. package/build/client/_app/immutable/entry/start.DvDUBfDS.js.br +0 -0
  395. package/build/client/_app/immutable/entry/start.DvDUBfDS.js.gz +0 -0
  396. package/build/client/_app/immutable/nodes/0.zcQ-QMcb.js +0 -3
  397. package/build/client/_app/immutable/nodes/0.zcQ-QMcb.js.br +0 -0
  398. package/build/client/_app/immutable/nodes/0.zcQ-QMcb.js.gz +0 -0
  399. package/build/client/_app/immutable/nodes/1.BX821K1d.js +0 -1
  400. package/build/client/_app/immutable/nodes/1.BX821K1d.js.br +0 -0
  401. package/build/client/_app/immutable/nodes/1.BX821K1d.js.gz +0 -0
  402. package/build/client/_app/immutable/nodes/2.4IvNSQft.js +0 -1
  403. package/build/client/_app/immutable/nodes/2.4IvNSQft.js.br +0 -0
  404. package/build/client/_app/immutable/nodes/2.4IvNSQft.js.gz +0 -0
  405. package/build/client/_app/immutable/nodes/3.C-B1sGi_.js.br +0 -0
  406. package/build/client/_app/immutable/nodes/3.C-B1sGi_.js.gz +0 -0
  407. package/build/client/_app/immutable/nodes/4.C6l0CiJD.js +0 -35
  408. package/build/client/_app/immutable/nodes/4.C6l0CiJD.js.br +0 -0
  409. package/build/client/_app/immutable/nodes/4.C6l0CiJD.js.gz +0 -0
  410. package/build/client/_app/immutable/nodes/5.RovJmk8R.js +0 -1
  411. package/build/client/_app/immutable/nodes/5.RovJmk8R.js.br +0 -0
  412. package/build/client/_app/immutable/nodes/5.RovJmk8R.js.gz +0 -0
  413. package/build/client/_app/immutable/nodes/6.vrBdmqTE.js +0 -5
  414. package/build/client/_app/immutable/nodes/6.vrBdmqTE.js.br +0 -0
  415. package/build/client/_app/immutable/nodes/6.vrBdmqTE.js.gz +0 -0
  416. package/build/client/_app/immutable/nodes/7.BLozkJCY.js +0 -1
  417. package/build/client/_app/immutable/nodes/7.BLozkJCY.js.br +0 -0
  418. package/build/client/_app/immutable/nodes/7.BLozkJCY.js.gz +0 -0
  419. package/build/client/_app/immutable/nodes/8.BeHRzquW.js +0 -1
  420. package/build/client/_app/immutable/nodes/8.BeHRzquW.js.br +0 -0
  421. package/build/client/_app/immutable/nodes/8.BeHRzquW.js.gz +0 -0
  422. package/build/client/_app/immutable/nodes/9.tDZ3CQE6.js +0 -11
  423. package/build/client/_app/immutable/nodes/9.tDZ3CQE6.js.br +0 -0
  424. package/build/client/_app/immutable/nodes/9.tDZ3CQE6.js.gz +0 -0
  425. package/build/server/chunks/0-BjExyGhw.js +0 -9
  426. package/build/server/chunks/1-BwvZ1byr.js +0 -9
  427. package/build/server/chunks/2-DLWqn5zk.js +0 -9
  428. package/build/server/chunks/2-DLWqn5zk.js.map +0 -1
  429. package/build/server/chunks/3-Be4gJSbJ.js +0 -9
  430. package/build/server/chunks/3-Be4gJSbJ.js.map +0 -1
  431. package/build/server/chunks/4-BQq4QAnS.js +0 -9
  432. package/build/server/chunks/4-BQq4QAnS.js.map +0 -1
  433. package/build/server/chunks/5-DM_iNIlm.js +0 -9
  434. package/build/server/chunks/5-DM_iNIlm.js.map +0 -1
  435. package/build/server/chunks/6-eSsWX3tm.js +0 -33
  436. package/build/server/chunks/6-eSsWX3tm.js.map +0 -1
  437. package/build/server/chunks/7-soEaW5k5.js.map +0 -1
  438. package/build/server/chunks/8-CA7E96iK.js +0 -9
  439. package/build/server/chunks/8-CA7E96iK.js.map +0 -1
  440. package/build/server/chunks/9-D2SkYOhZ.js +0 -9
  441. package/build/server/chunks/9-D2SkYOhZ.js.map +0 -1
  442. package/build/server/chunks/AgentSidebar-C4H-7WxT.js.map +0 -1
  443. package/build/server/chunks/Button-D3mqAVvu.js.map +0 -1
  444. package/build/server/chunks/ChatStepTrace-dfzN1KEN.js.map +0 -1
  445. package/build/server/chunks/ContextEditor-ySHjHE1w.js +0 -45
  446. package/build/server/chunks/ContextEditor-ySHjHE1w.js.map +0 -1
  447. package/build/server/chunks/Modal-NTInCBwo.js.map +0 -1
  448. package/build/server/chunks/Tab-DAuTmew0.js.map +0 -1
  449. package/build/server/chunks/Tab.svelte_svelte_type_style_lang-Bmdqxv-M.js.map +0 -1
  450. package/build/server/chunks/_layout.svelte-CrT993Da.js.map +0 -1
  451. package/build/server/chunks/_layout.svelte-DFDvSokt.js.map +0 -1
  452. package/build/server/chunks/_page.svelte-5O44TlMG.js.map +0 -1
  453. package/build/server/chunks/_page.svelte-ClesenAz.js.map +0 -1
  454. package/build/server/chunks/_page.svelte-D9kg5-lo.js.map +0 -1
  455. package/build/server/chunks/_page.svelte-DimeWJh5.js.map +0 -1
  456. package/build/server/chunks/_page.svelte-N6xQwQzn.js.map +0 -1
  457. /package/build/client/_app/immutable/assets/{9.C5apk4jm.css → 14.C5apk4jm.css} +0 -0
  458. /package/build/client/_app/immutable/assets/{9.C5apk4jm.css.br → 14.C5apk4jm.css.br} +0 -0
  459. /package/build/client/_app/immutable/assets/{9.C5apk4jm.css.gz → 14.C5apk4jm.css.gz} +0 -0
  460. /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css → 3.Dzh7_Q8n.css} +0 -0
  461. /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css.br → 3.Dzh7_Q8n.css.br} +0 -0
  462. /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css.gz → 3.Dzh7_Q8n.css.gz} +0 -0
  463. /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css → 4.CZVw96CJ.css} +0 -0
  464. /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css.br → 4.CZVw96CJ.css.br} +0 -0
  465. /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css.gz → 4.CZVw96CJ.css.gz} +0 -0
  466. /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css → bosun-theme.tn0RQdqM.css} +0 -0
  467. /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css.br → bosun-theme.tn0RQdqM.css.br} +0 -0
  468. /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css.gz → bosun-theme.tn0RQdqM.css.gz} +0 -0
@@ -1,47 +1,17 @@
1
- import { h as head, c as attr_style, a as attr_class, b as attr, s as stringify, e as ensure_array_like, g as attributes } from './index2-CHZ7ZFLZ.js';
2
- import { P as Panel, C as ContextEditor } from './ContextEditor-ySHjHE1w.js';
3
- import { B as Button } from './Button-D3mqAVvu.js';
4
- import { M as Modal } from './Modal-NTInCBwo.js';
5
- import { o as onDestroy } from './Tab.svelte_svelte_type_style_lang-Bmdqxv-M.js';
6
- import { p as page, g as goto } from './index3-DeV2OWZf.js';
7
- import { I as Icon$1, h as html } from './Icon-D0R0X6Hr.js';
8
- import { T as Tabs, a as Tab } from './Tab-DAuTmew0.js';
9
- import { g as getAgentsContext } from './agents-context-BrlIlkOW.js';
10
- import { A as AgentSidebar } from './AgentSidebar-C4H-7WxT.js';
11
- import { I as Input } from './Input-C_H479QL.js';
1
+ import { h as head, b as attr_class, a as attr, s as stringify, e as ensure_array_like, c as attr_style, j as attributes } from './index2-BuOY2QE4.js';
2
+ import { g as getEditWorkspaceContext, P as Panel } from './edit-workspace-context-OTOIRCI0.js';
3
+ import { B as Button } from './Button-Cd4Yzpdy.js';
4
+ import { M as Modal } from './Modal-D4tx0Bdo.js';
5
+ import { C as ContextEditor, P as PopoverModal } from './ContextEditor-CfjBPLpI.js';
6
+ import { I as Input } from './Input-BJW36iKz.js';
7
+ import { o as onDestroy } from './index-server-CefdgakO.js';
8
+ import { I as Icon$1, h as html } from './Icon-BgknHaZs.js';
12
9
  import { t as trpc } from './trpc-client-Bucti7HD.js';
13
10
  import { X as escape_html } from './context-zH5kvtGY.js';
14
- import 'js-yaml';
15
11
  import './events-M0vvlm3M.js';
16
- import './state.svelte-DtOGaiYC.js';
17
- import './utils-KcIDVAAe.js';
18
- import './index-DxaLoiKh.js';
12
+ import 'js-yaml';
19
13
  import '@trpc/client';
20
14
 
21
- function _defineProperty(obj, key, value) {
22
- if (key in obj) {
23
- Object.defineProperty(obj, key, {
24
- value,
25
- enumerable: true,
26
- configurable: true,
27
- writable: true
28
- });
29
- } else {
30
- obj[key] = value;
31
- }
32
- return obj;
33
- }
34
- var FEATURE_FLAG_NAMES = Object.freeze({
35
- // This flag exists as a workaround for issue 454 (basically a browser bug) - seems like these rect values take time to update when in grid layout. Setting it to true can cause strange behaviour in the REPL for non-grid zones, see issue 470
36
- USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT: "USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT"
37
- });
38
- _defineProperty({}, FEATURE_FLAG_NAMES.USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT, false);
39
- var _ID_TO_INSTRUCTION;
40
- var INSTRUCTION_IDs$1 = {
41
- DND_ZONE_ACTIVE: "dnd-zone-active",
42
- DND_ZONE_DRAG_DISABLED: "dnd-zone-drag-disabled"
43
- };
44
- _ID_TO_INSTRUCTION = {}, _defineProperty(_ID_TO_INSTRUCTION, INSTRUCTION_IDs$1.DND_ZONE_ACTIVE, "Tab to one the items and press space-bar or enter to start dragging it"), _defineProperty(_ID_TO_INSTRUCTION, INSTRUCTION_IDs$1.DND_ZONE_DRAG_DISABLED, "This is a disabled drag and drop list");
45
15
  const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
46
16
  const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
47
17
  const colonSeparated = value.split(":");
@@ -1410,19 +1380,44 @@ function Icon($$renderer, $$props) {
1410
1380
  function MiniEditor($$renderer, $$props) {
1411
1381
  $$renderer.component(($$renderer2) => {
1412
1382
  let editor = null;
1383
+ let model = null;
1384
+ let disposables = [];
1385
+ let editorElement;
1413
1386
  let {
1414
- value,
1415
- onChange,
1416
- onBlur,
1417
- language = "plaintext",
1418
1387
  height = 120
1419
1388
  } = $$props;
1389
+ function handleWheelCapture(e) {
1390
+ e.stopPropagation();
1391
+ }
1420
1392
  onDestroy(() => {
1421
1393
  try {
1422
- editor?.dispose();
1394
+ editorElement.removeEventListener("wheel", handleWheelCapture, { capture: true });
1395
+ } catch {
1396
+ }
1397
+ for (const d of disposables) {
1398
+ try {
1399
+ d.dispose();
1400
+ } catch {
1401
+ }
1402
+ }
1403
+ disposables = [];
1404
+ const toDisposeModel = model;
1405
+ model = null;
1406
+ try {
1407
+ if (editor) {
1408
+ try {
1409
+ editor.setModel(null);
1410
+ } catch {
1411
+ }
1412
+ editor.dispose();
1413
+ }
1423
1414
  } finally {
1424
1415
  editor = null;
1425
1416
  }
1417
+ try {
1418
+ toDisposeModel?.dispose();
1419
+ } catch {
1420
+ }
1426
1421
  });
1427
1422
  $$renderer2.push(`<div class="w-full"${attr_style(
1428
1423
  // Update language when prop changes without recreating the editor
@@ -1433,27 +1428,12 @@ function MiniEditor($$renderer, $$props) {
1433
1428
  }
1434
1429
  function _page($$renderer, $$props) {
1435
1430
  $$renderer.component(($$renderer2) => {
1436
- const { onAgentSelect } = getAgentsContext();
1437
- let { params } = $$props;
1438
- let agents = [];
1439
- const agent = params.agent;
1440
- let repeats = 1;
1441
- let concurrency = 1;
1442
- let defaultContext = {};
1443
- let defaultContextDraft = {};
1444
- let showDefaultContextModal = false;
1445
- let showViewerModal = false;
1446
- let viewerTitle = "";
1447
- let viewerContent = null;
1448
- let viewerLoading = false;
1449
- let viewerError = null;
1450
- let showTestContextModal = false;
1451
- let activeContextTestId = null;
1452
- let testContextDraft = "";
1431
+ const { state: workspace, actions } = getEditWorkspaceContext();
1432
+ const agent = workspace.agentId;
1453
1433
  function safeClone(v) {
1454
1434
  try {
1455
1435
  return structuredClone(v);
1456
- } catch (e) {
1436
+ } catch {
1457
1437
  try {
1458
1438
  return JSON.parse(JSON.stringify(v));
1459
1439
  } catch {
@@ -1461,36 +1441,20 @@ function _page($$renderer, $$props) {
1461
1441
  }
1462
1442
  }
1463
1443
  }
1464
- async function openViewer(title, params2) {
1465
- viewerTitle = title;
1466
- viewerContent = null;
1467
- viewerError = null;
1468
- viewerLoading = true;
1469
- showViewerModal = true;
1470
- try {
1471
- const text = await trpc.tests.resultEntry.query({
1472
- agent: params2.agent,
1473
- testId: params2.id,
1474
- resultKey: params2.key,
1475
- timestamp: params2.timestamp,
1476
- index: params2.run
1477
- });
1478
- let formatted = text;
1479
- try {
1480
- const json = JSON.parse(text);
1481
- formatted = JSON.stringify(json, null, 2);
1482
- } catch {
1483
- }
1484
- viewerContent = formatted;
1485
- } catch (e) {
1486
- console.error(e);
1487
- viewerError = "Failed to load content";
1488
- } finally {
1489
- viewerLoading = false;
1490
- }
1444
+ function clamp(n, min, max) {
1445
+ return Math.max(min, Math.min(max, n));
1491
1446
  }
1447
+ let repeats = 1;
1448
+ let concurrency = 1;
1449
+ let defaultContext = {};
1450
+ let defaultContextDraft = {};
1451
+ let showDefaultContextModal = false;
1452
+ let testContextPopoverTestId = null;
1453
+ let testContextDraft = {};
1454
+ let showViewerModal = false;
1455
+ let viewerTitle = "";
1456
+ let analyzeRunning = false;
1492
1457
  const baseAssertionTypes = [
1493
- // Non-deterministic / model-graded
1494
1458
  { value: "llm-rubric", label: "LLM" },
1495
1459
  { value: "answer-relevance", label: "Answer Relevance (LLM)" },
1496
1460
  {
@@ -1515,7 +1479,6 @@ function _page($$renderer, $$props) {
1515
1479
  value: "conversation-relevance",
1516
1480
  label: "Conversation Relevance"
1517
1481
  },
1518
- // Deterministic string/content checks
1519
1482
  { value: "equals", label: "Equals" },
1520
1483
  { value: "contains", label: "Contains" },
1521
1484
  { value: "icontains", label: "Contains (case-insensitive)" },
@@ -1527,7 +1490,6 @@ function _page($$renderer, $$props) {
1527
1490
  { value: "regex", label: "Regex" },
1528
1491
  { value: "levenshtein", label: "Levenshtein Distance" },
1529
1492
  { value: "is-refusal", label: "Is Refusal" },
1530
- // Content type assertions
1531
1493
  { value: "is-html", label: "Is HTML" },
1532
1494
  { value: "contains-html", label: "Contains HTML" },
1533
1495
  { value: "is-json", label: "Is JSON" },
@@ -1536,7 +1498,6 @@ function _page($$renderer, $$props) {
1536
1498
  { value: "contains-xml", label: "Contains XML" },
1537
1499
  { value: "is-sql", label: "Is SQL" },
1538
1500
  { value: "contains-sql", label: "Contains SQL" },
1539
- // Metrics
1540
1501
  { value: "similar", label: "Semantic Similarity" },
1541
1502
  { value: "rouge-n", label: "ROUGE-N" },
1542
1503
  { value: "bleu", label: "BLEU" },
@@ -1544,14 +1505,12 @@ function _page($$renderer, $$props) {
1544
1505
  { value: "meteor", label: "METEOR" },
1545
1506
  { value: "perplexity", label: "Perplexity" },
1546
1507
  { value: "perplexity-score", label: "Perplexity Score" },
1547
- // Performance/trace
1548
1508
  { value: "latency", label: "Latency" },
1549
1509
  { value: "cost", label: "Cost" },
1550
1510
  { value: "finish-reason", label: "Finish Reason" },
1551
1511
  { value: "trace-error-spans", label: "Trace Error Spans" },
1552
1512
  { value: "trace-span-count", label: "Trace Span Count" },
1553
1513
  { value: "trace-span-duration", label: "Trace Span Duration" },
1554
- // Tools/validators
1555
1514
  {
1556
1515
  value: "is-valid-function-call",
1557
1516
  label: "Is Valid Function Call"
@@ -1565,7 +1524,6 @@ function _page($$renderer, $$props) {
1565
1524
  label: "Is Valid OpenAI Tools Call"
1566
1525
  },
1567
1526
  { value: "guardrails", label: "Guardrails" },
1568
- // Custom hooks
1569
1527
  { value: "javascript", label: "JavaScript (custom)" },
1570
1528
  { value: "python", label: "Python (custom)" },
1571
1529
  { value: "webhook", label: "Webhook (custom)" },
@@ -1577,9 +1535,13 @@ function _page($$renderer, $$props) {
1577
1535
  ];
1578
1536
  let tests = [];
1579
1537
  let running = false;
1538
+ let canceling = false;
1539
+ let cancelRequested = false;
1580
1540
  let runScope = null;
1541
+ let runSingleTestId = null;
1581
1542
  let runDone = 0;
1582
1543
  let runTotal = 0;
1544
+ let runExpectedRuns = 1;
1583
1545
  let pollInFlight = false;
1584
1546
  let pollTimer = null;
1585
1547
  let runToken = 0;
@@ -1597,31 +1559,40 @@ function _page($$renderer, $$props) {
1597
1559
  return p;
1598
1560
  }
1599
1561
  function makeResult(id, rr) {
1562
+ const rawRuns = Array.isArray(rr.results) ? rr.results : [];
1563
+ const successCount = rawRuns.reduce((acc, run2) => acc + (run2?.success ? 1 : 0), 0);
1600
1564
  return {
1601
1565
  success_rate: rr.success_rate,
1602
- total_runs: Array.isArray(rr.results) ? rr.results.length : 0,
1566
+ successes: successCount,
1567
+ total_runs: rawRuns.length,
1603
1568
  isOld: !!rr.is_old,
1604
- runs: (Array.isArray(rr.results) ? rr.results : []).map((run2, idx) => {
1569
+ previous: rr.previous && typeof rr.previous === "object" ? {
1570
+ success_count: Number(rr.previous.success_count ?? 0),
1571
+ total_runs: Number(rr.previous.total_runs ?? 0),
1572
+ report_timestamp: String(rr.previous.report_timestamp ?? "")
1573
+ } : void 0,
1574
+ runs: rawRuns.map((run2, idx) => {
1605
1575
  const timestamp = rr.report_timestamp;
1606
- const params2 = { agent, id, timestamp, run: idx };
1576
+ const params = { agent, id, timestamp, run: idx };
1607
1577
  return {
1608
1578
  index: idx + 1,
1609
1579
  success: !!run2.success,
1610
1580
  text: String(run2.result || ""),
1611
1581
  evaluation: String(run2.evaluation || ""),
1612
1582
  links: {
1613
- renderedPrompt: { ...params2, key: "rendered_prompt" },
1614
- receivedPrompt: { ...params2, key: "received_prompt" },
1615
- conversation: { ...params2, key: "stringified_conversation" },
1616
- context: { ...params2, key: "received_context" },
1617
- logs: { ...params2, key: "logs" },
1618
- traces: { ...params2, key: "traces" }
1583
+ renderedPrompt: { ...params, key: "rendered_prompt" },
1584
+ receivedPrompt: { ...params, key: "received_prompt" },
1585
+ conversation: { ...params, key: "stringified_conversation" },
1586
+ context: { ...params, key: "received_context" },
1587
+ logs: { ...params, key: "logs" },
1588
+ traces: { ...params, key: "traces" }
1619
1589
  }
1620
1590
  };
1621
- })
1591
+ }).reverse()
1622
1592
  };
1623
1593
  }
1624
1594
  async function refresh() {
1595
+ if (!agent) return;
1625
1596
  try {
1626
1597
  const [{ rows }, config, results] = await Promise.all([
1627
1598
  trpc.tests.list.query({ agent }),
@@ -1638,18 +1609,21 @@ function _page($$renderer, $$props) {
1638
1609
  id,
1639
1610
  pinned: String(r.pinned).toUpperCase() === "TRUE",
1640
1611
  scenario: r.scenario || "",
1612
+ step: String(r.step ?? ""),
1641
1613
  author: r.author || "",
1642
1614
  assertion_type: r.assertion_type || "llm-rubric",
1643
1615
  assertion_value: r.assertion_value || "",
1644
1616
  conversation: r.conversation || "",
1645
1617
  expected_output: r.expected_output || "",
1618
+ conversation_ui: buildConversationEditorValue(r.conversation || "", r.expected_output || ""),
1646
1619
  timeout: Number(r.timeout ?? 0),
1647
1620
  similarity_threshold: Number(r.similarity_threshold ?? 60),
1648
1621
  context: JSON.stringify(r.context),
1649
1622
  result: rr ? makeResult(id, rr) : void 0
1650
1623
  };
1651
1624
  });
1652
- } catch {
1625
+ } catch (e) {
1626
+ console.error(e);
1653
1627
  tests = [];
1654
1628
  repeats = 1;
1655
1629
  concurrency = 1;
@@ -1670,10 +1644,12 @@ function _page($$renderer, $$props) {
1670
1644
  });
1671
1645
  tests = nextTests;
1672
1646
  const scope = runScope;
1647
+ const expectedRuns = Math.max(1, Number(runExpectedRuns) || 1);
1673
1648
  const done = nextTests.reduce(
1674
1649
  (acc, t) => {
1650
+ if (scope === "single" && t.id !== runSingleTestId) return acc;
1675
1651
  if (scope === "pinned" && !t.pinned) return acc;
1676
- return t.result && !t.result.isOld ? acc + 1 : acc;
1652
+ return t.result && !t.result.isOld && t.result.total_runs >= expectedRuns ? acc + 1 : acc;
1677
1653
  },
1678
1654
  0
1679
1655
  );
@@ -1686,9 +1662,12 @@ function _page($$renderer, $$props) {
1686
1662
  }
1687
1663
  async function run(scope) {
1688
1664
  running = true;
1665
+ cancelRequested = false;
1689
1666
  runScope = scope;
1667
+ runSingleTestId = null;
1690
1668
  runTotal = scope === "all" ? tests.length : tests.filter((t) => t.pinned).length;
1691
1669
  runDone = 0;
1670
+ runExpectedRuns = Math.max(1, Number(repeats) || 1);
1692
1671
  runToken += 1;
1693
1672
  const activeToken = runToken;
1694
1673
  await Promise.all([...pendingSaves]);
@@ -1708,10 +1687,50 @@ function _page($$renderer, $$props) {
1708
1687
  }
1709
1688
  }
1710
1689
  }
1690
+ async function runSingle(testId) {
1691
+ if (!agent) return;
1692
+ running = true;
1693
+ cancelRequested = false;
1694
+ runScope = "single";
1695
+ runSingleTestId = testId;
1696
+ runTotal = 1;
1697
+ runDone = 0;
1698
+ runExpectedRuns = Math.max(1, Number(repeats) || 1);
1699
+ runToken += 1;
1700
+ const activeToken = runToken;
1701
+ await Promise.all([...pendingSaves]);
1702
+ if (pollTimer) clearInterval(pollTimer);
1703
+ pollTimer = setInterval(() => pollLatestResults(activeToken), 800);
1704
+ void pollLatestResults(activeToken);
1705
+ try {
1706
+ await trpc.tests.runTests.mutate({ agent, testId });
1707
+ } finally {
1708
+ if (pollTimer) clearInterval(pollTimer);
1709
+ pollTimer = null;
1710
+ try {
1711
+ await refresh();
1712
+ } finally {
1713
+ running = false;
1714
+ runScope = null;
1715
+ runSingleTestId = null;
1716
+ }
1717
+ }
1718
+ }
1719
+ async function cancelCurrentRun() {
1720
+ if (!running || canceling || cancelRequested) return;
1721
+ canceling = true;
1722
+ try {
1723
+ const ok = await trpc.tests.cancelRun.mutate({ agent });
1724
+ if (ok) cancelRequested = true;
1725
+ } catch (e) {
1726
+ console.error(e);
1727
+ } finally {
1728
+ canceling = false;
1729
+ }
1730
+ }
1711
1731
  const pinnedCount = tests.filter((t) => t.pinned).length;
1712
1732
  const hasPinned = pinnedCount > 0;
1713
- const allPinned = tests.length > 0 && pinnedCount === tests.length;
1714
- const somePinned = pinnedCount > 0 && !allPinned;
1733
+ tests.length > 0 && pinnedCount === tests.length;
1715
1734
  async function addTest() {
1716
1735
  const res = await trpc.tests.addTest.mutate({ agent, seed: {}, mergeContexts: true });
1717
1736
  tests = [parseTest(res), ...tests];
@@ -1719,15 +1738,14 @@ function _page($$renderer, $$props) {
1719
1738
  function parseTest(res) {
1720
1739
  return {
1721
1740
  ...res,
1741
+ step: String(res.step ?? ""),
1722
1742
  pinned: res.pinned === "TRUE",
1723
1743
  timeout: Number(res.timeout),
1724
1744
  similarity_threshold: Number(res.similarity_threshold),
1725
- context: JSON.stringify(res.context)
1745
+ context: JSON.stringify(res.context),
1746
+ conversation_ui: buildConversationEditorValue(res.conversation || "", res.expected_output || "")
1726
1747
  };
1727
1748
  }
1728
- function clamp(n, min, max) {
1729
- return Math.max(min, Math.min(max, n));
1730
- }
1731
1749
  function formatEvaluation(ev) {
1732
1750
  if (!ev) return "";
1733
1751
  try {
@@ -1743,58 +1761,138 @@ function _page($$renderer, $$props) {
1743
1761
  return {};
1744
1762
  }
1745
1763
  }
1746
- const saveTimers = /* @__PURE__ */ new Map();
1747
- function saveRowDebounced(id, patch, delay = 600) {
1748
- const key = `${id}:context`;
1749
- const prev = saveTimers.get(key);
1750
- if (prev) clearTimeout(prev);
1751
- const t = setTimeout(
1752
- () => {
1753
- trackSave(saveRow(id, patch));
1754
- saveTimers.delete(key);
1755
- },
1756
- delay
1757
- );
1758
- saveTimers.set(key, t);
1764
+ const roleMatch = (line) => line.match(/^\s*(agent|assistant|user|system)\s*:\s*(.*)$/i);
1765
+ function formatExpectedAsAgentBlock(expected) {
1766
+ const trimmed = String(expected ?? "").trimEnd();
1767
+ if (!trimmed) return "";
1768
+ if (/^\s*(agent|assistant)\s*:/i.test(trimmed)) return trimmed;
1769
+ return `Agent: ${trimmed}`;
1770
+ }
1771
+ function buildConversationEditorValue(conversation, expected) {
1772
+ const conv = String(conversation ?? "").trimEnd();
1773
+ const expectedBlock = formatExpectedAsAgentBlock(expected);
1774
+ if (!expectedBlock) return conv;
1775
+ if (!conv) return expectedBlock;
1776
+ return `${conv}
1777
+ ${expectedBlock}`;
1778
+ }
1779
+ function parseExpectedFromConversationEditor(text) {
1780
+ const raw = String(text ?? "");
1781
+ const lines = raw.split(/\r?\n/);
1782
+ const blocks = [];
1783
+ let current = null;
1784
+ for (let i = 0; i < lines.length; i++) {
1785
+ const m2 = roleMatch(lines[i]);
1786
+ if (!m2) continue;
1787
+ if (current) {
1788
+ blocks.push({ ...current, endLine: i });
1789
+ }
1790
+ const roleRaw = String(m2[1] ?? "").toLowerCase();
1791
+ const role = roleRaw === "assistant" ? "agent" : roleRaw;
1792
+ current = { role, startLine: i + 1 };
1793
+ }
1794
+ if (current) blocks.push({ ...current, endLine: lines.length });
1795
+ const expectedBlock = blocks.at(-1);
1796
+ const promptBlock = blocks.length >= 2 ? blocks.at(-2) : null;
1797
+ const canExtractExpected = expectedBlock?.role === "agent";
1798
+ const valid = canExtractExpected && promptBlock?.role === "user";
1799
+ if (!canExtractExpected || !expectedBlock) {
1800
+ return { valid: false, expected: "", conversation: raw.trimEnd() };
1801
+ }
1802
+ const expectedLines = lines.slice(expectedBlock.startLine - 1, expectedBlock.endLine);
1803
+ const first = expectedLines[0] ?? "";
1804
+ const m = roleMatch(first);
1805
+ const firstContent = m ? m[2] ?? "" : "";
1806
+ const expected = [firstContent, ...expectedLines.slice(1)].join("\n").trimEnd();
1807
+ const conversation = lines.slice(0, expectedBlock.startLine - 1).join("\n").trimEnd();
1808
+ return {
1809
+ valid,
1810
+ expected,
1811
+ conversation,
1812
+ highlight: {
1813
+ startLine: expectedBlock.startLine,
1814
+ endLine: expectedBlock.endLine
1815
+ }
1816
+ };
1817
+ }
1818
+ function erf(x) {
1819
+ const sign = x < 0 ? -1 : 1;
1820
+ const ax = Math.abs(x);
1821
+ const a1 = 0.254829592;
1822
+ const a2 = -0.284496736;
1823
+ const a3 = 1.421413741;
1824
+ const a4 = -1.453152027;
1825
+ const a5 = 1.061405429;
1826
+ const p = 0.3275911;
1827
+ const t = 1 / (1 + p * ax);
1828
+ const y = 1 - ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t * Math.exp(-ax * ax);
1829
+ return sign * y;
1830
+ }
1831
+ function normalCdf(x) {
1832
+ return 0.5 * (1 + erf(x / Math.SQRT2));
1833
+ }
1834
+ function twoProportionZTestPValue(x1, n1, x2, n2) {
1835
+ if (!Number.isFinite(x1) || !Number.isFinite(n1) || !Number.isFinite(x2) || !Number.isFinite(n2)) return null;
1836
+ if (n1 <= 0 || n2 <= 0) return null;
1837
+ const p1 = x1 / n1;
1838
+ const p2 = x2 / n2;
1839
+ const pooled = (x1 + x2) / (n1 + n2);
1840
+ const denom = Math.sqrt(pooled * (1 - pooled) * (1 / n1 + 1 / n2));
1841
+ if (!Number.isFinite(denom) || denom <= 0) return null;
1842
+ const z = (p2 - p1) / denom;
1843
+ const p = 2 * (1 - normalCdf(Math.abs(z)));
1844
+ return Math.max(0, Math.min(1, p));
1845
+ }
1846
+ function getExpectedTrend(result, expectedRuns) {
1847
+ if (!result || result.isOld) return null;
1848
+ const doneRuns = result.total_runs;
1849
+ if (doneRuns <= 0) return null;
1850
+ const prev = result.previous;
1851
+ const prevRate = prev && prev.total_runs > 0 ? prev.success_count / prev.total_runs : null;
1852
+ const currRate = result.successes / doneRuns;
1853
+ const direction = prevRate === null ? "higher" : currRate >= prevRate ? "higher" : "lower";
1854
+ const significant = (() => {
1855
+ if (doneRuns <= 5 || !prev || prev.total_runs <= 0) return false;
1856
+ const pValue = twoProportionZTestPValue(prev.success_count, prev.total_runs, result.successes, doneRuns);
1857
+ return pValue !== null && pValue < 0.05;
1858
+ })();
1859
+ const showExpected = Number.isFinite(expectedRuns) && expectedRuns > 0 && doneRuns < expectedRuns;
1860
+ if (!showExpected && !significant) return null;
1861
+ const expectedSuccesses = showExpected ? Math.round(result.successes / doneRuns * expectedRuns) : void 0;
1862
+ return {
1863
+ showExpected,
1864
+ expectedSuccesses,
1865
+ expectedRuns,
1866
+ significant,
1867
+ direction
1868
+ };
1759
1869
  }
1760
1870
  async function saveRow(id, patch) {
1761
1871
  await trpc.tests.patchTest.mutate({ agent, id, patch });
1762
1872
  }
1763
- async function saveConfigPatch(patch) {
1764
- trpc.tests.updateConfig.mutate({ agent: params.agent, cfg: patch });
1873
+ function openTestContext(row) {
1874
+ if (!agent) return;
1875
+ testContextPopoverTestId = row.id;
1876
+ testContextDraft = safeClone(parseJson(row.context));
1765
1877
  }
1766
- const dec = (s) => {
1767
- try {
1768
- return s ? decodeURIComponent(s) : "";
1769
- } catch {
1770
- return s || "";
1771
- }
1772
- };
1773
- const currentAgentNorm = (() => {
1774
- return dec(agent).trim().replace(/^\/+|\/+$/g, "");
1775
- })();
1776
- const activeTopTab = (() => page.url.pathname.split("/")[1])();
1777
- function handleTabChange({ value }) {
1778
- if (value === activeTopTab) return;
1779
- page.url.searchParams.get("step");
1780
- if (value === "roleplay") {
1781
- goto();
1782
- return;
1783
- }
1784
- if (value === "tests") {
1785
- goto();
1878
+ async function closeTestContextPopover() {
1879
+ const id = testContextPopoverTestId;
1880
+ if (!id || !agent) {
1881
+ testContextPopoverTestId = null;
1786
1882
  return;
1787
1883
  }
1788
- if (value === "traces") {
1789
- goto();
1790
- return;
1884
+ const draft = safeClone(testContextDraft);
1885
+ testContextPopoverTestId = null;
1886
+ tests = tests.map((t) => t.id === id ? { ...t, context: JSON.stringify(draft) } : t);
1887
+ try {
1888
+ await trackSave(saveRow(id, { context: draft }));
1889
+ } catch (e) {
1890
+ console.error(e);
1891
+ await refresh();
1791
1892
  }
1792
- goto();
1793
1893
  }
1794
- function handleAgentClick(agentId) {
1795
- onAgentSelect(agentId);
1796
- const [proj, ag] = (agentId || "").split("/");
1797
- if (proj && ag) goto();
1894
+ async function saveConfigPatch(patch) {
1895
+ await trpc.tests.updateConfig.mutate({ agent, cfg: patch });
1798
1896
  }
1799
1897
  onDestroy(() => {
1800
1898
  if (pollTimer) clearInterval(pollTimer);
@@ -1803,149 +1901,8 @@ function _page($$renderer, $$props) {
1803
1901
  let $$inner_renderer;
1804
1902
  function $$render_inner($$renderer3) {
1805
1903
  head($$renderer3, ($$renderer4) => {
1806
- $$renderer4.title(($$renderer5) => {
1807
- $$renderer5.push(`<title>Recombine: Tests</title>`);
1808
- });
1809
1904
  $$renderer4.push(`<link rel="preload" href="/ui/arrow_tests.svg" as="image"/>`);
1810
1905
  });
1811
- $$renderer3.push(`<div class="flex h-screen">`);
1812
- AgentSidebar($$renderer3, {
1813
- className: "flex-none",
1814
- agents,
1815
- currentAgent: currentAgentNorm,
1816
- onAgentClick: handleAgentClick
1817
- });
1818
- $$renderer3.push(`<!----> <div class="flex h-full min-w-0 flex-1 flex-col bg-rc-gray-980 pb-3 pr-4 pt-2"><nav class="mb-3 flex h-14 flex-none items-center justify-between bg-rc-gray-980"><div class="flex items-center">`);
1819
- Tabs($$renderer3, {
1820
- value: activeTopTab,
1821
- ariaLabel: "Top tabs",
1822
- onChange: handleTabChange,
1823
- children: ($$renderer4) => {
1824
- Tab($$renderer4, {
1825
- value: "roleplay",
1826
- children: ($$renderer5) => {
1827
- $$renderer5.push(`<!---->Roleplay`);
1828
- }
1829
- });
1830
- $$renderer4.push(`<!----> `);
1831
- Tab($$renderer4, {
1832
- value: "tests",
1833
- children: ($$renderer5) => {
1834
- $$renderer5.push(`<!---->Tests`);
1835
- }
1836
- });
1837
- $$renderer4.push(`<!----> `);
1838
- Tab($$renderer4, {
1839
- value: "traces",
1840
- children: ($$renderer5) => {
1841
- $$renderer5.push(`<!---->Traces`);
1842
- }
1843
- });
1844
- $$renderer4.push(`<!---->`);
1845
- },
1846
- $$slots: { default: true }
1847
- });
1848
- $$renderer3.push(`<!----></div> `);
1849
- Panel($$renderer3, {
1850
- class: "!rounded-none p-3 pr-0",
1851
- children: ($$renderer4) => {
1852
- $$renderer4.push(`<div class="flex items-center gap-16"><div class="flex items-center">`);
1853
- Button($$renderer4, {
1854
- variant: "ghost",
1855
- class: "text-sm font-semibold text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:text-rc-gray-200",
1856
- onclick: () => {
1857
- defaultContextDraft = safeClone(defaultContext);
1858
- showDefaultContextModal = true;
1859
- },
1860
- children: ($$renderer5) => {
1861
- $$renderer5.push(`<!---->Default context`);
1862
- },
1863
- $$slots: { default: true }
1864
- });
1865
- $$renderer4.push(`<!----> <div class="relative inline-flex items-center">`);
1866
- Button($$renderer4, {
1867
- variant: "secondary",
1868
- onclick: addTest,
1869
- children: ($$renderer5) => {
1870
- $$renderer5.push(`<!---->New test`);
1871
- },
1872
- $$slots: { default: true }
1873
- });
1874
- $$renderer4.push(`<!----> `);
1875
- if (hasFetchedTests && tests.length === 0) {
1876
- $$renderer4.push("<!--[-->");
1877
- $$renderer4.push(`<div class="pointer-events-none absolute -left-28 top-full mt-4 inline-flex -translate-x-1/2 flex-col items-center"><div class="relative w-50vw max-w-2xl"><img src="/ui/arrow_tests.svg" alt="Arrow" class="block h-auto w-full object-contain"/> <span class="absolute inset-0 mt-48 flex items-center justify-center text-center text-4xl font-extrabold text-rc-gray-200">No tests yet.<br/>Add the first one</span></div></div>`);
1878
- } else {
1879
- $$renderer4.push("<!--[!-->");
1880
- }
1881
- $$renderer4.push(`<!--]--></div></div> <div class="flex flex-wrap items-center gap-3">`);
1882
- if (running) {
1883
- $$renderer4.push("<!--[-->");
1884
- $$renderer4.push(`<div class="mr-3 flex items-center gap-3"><span class="animate-pulse rounded bg-rc-green-200 px-2 py-1 text-xs text-white">Running… ${escape_html(runDone)}/${escape_html(runTotal)}</span></div>`);
1885
- } else {
1886
- $$renderer4.push("<!--[!-->");
1887
- }
1888
- $$renderer4.push(`<!--]--> <div class="flex items-center gap-2"><label class="font-semibold text-rc-gray-300">Repeats</label> `);
1889
- Input($$renderer4, {
1890
- type: "number",
1891
- min: "0",
1892
- max: "500",
1893
- class: "w-16",
1894
- onchange: () => {
1895
- repeats = clamp(+repeats || 0, 0, 500);
1896
- trackSave(saveConfigPatch({ repeats }));
1897
- },
1898
- get value() {
1899
- return repeats;
1900
- },
1901
- set value($$value) {
1902
- repeats = $$value;
1903
- $$settled = false;
1904
- }
1905
- });
1906
- $$renderer4.push(`<!----></div> <div class="flex items-center gap-2"><label class="font-semibold text-rc-gray-300">Concurrency</label> `);
1907
- Input($$renderer4, {
1908
- type: "number",
1909
- min: "0",
1910
- max: "20",
1911
- class: "w-16",
1912
- onchange: () => {
1913
- concurrency = clamp(+concurrency || 0, 0, 20);
1914
- trackSave(saveConfigPatch({ concurrency }));
1915
- },
1916
- get value() {
1917
- return concurrency;
1918
- },
1919
- set value($$value) {
1920
- concurrency = $$value;
1921
- $$settled = false;
1922
- }
1923
- });
1924
- $$renderer4.push(`<!----></div> `);
1925
- Button($$renderer4, {
1926
- variant: "secondary",
1927
- class: "disabled:cursor-not-allowed disabled:opacity-50",
1928
- disabled: !hasPinned || running || isSaving,
1929
- onclick: () => run("pinned"),
1930
- children: ($$renderer5) => {
1931
- $$renderer5.push(`<!---->Run pinned`);
1932
- },
1933
- $$slots: { default: true }
1934
- });
1935
- $$renderer4.push(`<!----> `);
1936
- Button($$renderer4, {
1937
- class: "disabled:cursor-not-allowed disabled:opacity-50",
1938
- disabled: running || isSaving || tests.length === 0,
1939
- onclick: () => run("all"),
1940
- children: ($$renderer5) => {
1941
- $$renderer5.push(`<!---->Run all`);
1942
- },
1943
- $$slots: { default: true }
1944
- });
1945
- $$renderer4.push(`<!----></div></div>`);
1946
- }
1947
- });
1948
- $$renderer3.push(`<!----></nav> `);
1949
1906
  {
1950
1907
  let children = function($$renderer4) {
1951
1908
  ContextEditor($$renderer4, {
@@ -1960,9 +1917,7 @@ function _page($$renderer, $$props) {
1960
1917
  Button($$renderer4, {
1961
1918
  variant: "outlined",
1962
1919
  size: "small",
1963
- onclick: () => {
1964
- showDefaultContextModal = false;
1965
- },
1920
+ onclick: () => showDefaultContextModal = false,
1966
1921
  children: ($$renderer5) => {
1967
1922
  $$renderer5.push(`<!---->Cancel`);
1968
1923
  },
@@ -2000,51 +1955,34 @@ function _page($$renderer, $$props) {
2000
1955
  $$renderer3.push(`<!----> `);
2001
1956
  {
2002
1957
  let children = function($$renderer4) {
2003
- MiniEditor($$renderer4, {
2004
- value: testContextDraft,
2005
- onChange: (v) => testContextDraft = v,
2006
- language: "json",
2007
- height: 360
2008
- });
1958
+ {
1959
+ $$renderer4.push("<!--[!-->");
1960
+ {
1961
+ $$renderer4.push("<!--[!-->");
1962
+ $$renderer4.push(`<pre class="whitespace-pre-wrap font-mono text-gray-200">${escape_html("—")}</pre>`);
1963
+ }
1964
+ $$renderer4.push(`<!--]-->`);
1965
+ }
1966
+ $$renderer4.push(`<!--]-->`);
2009
1967
  }, footer = function($$renderer4) {
2010
1968
  Button($$renderer4, {
2011
1969
  variant: "outlined",
2012
1970
  size: "small",
2013
- onclick: () => {
2014
- showTestContextModal = false;
2015
- activeContextTestId = null;
2016
- },
2017
- children: ($$renderer5) => {
2018
- $$renderer5.push(`<!---->Cancel`);
2019
- },
2020
- $$slots: { default: true }
2021
- });
2022
- $$renderer4.push(`<!----> `);
2023
- Button($$renderer4, {
2024
- size: "small",
2025
- onclick: async () => {
2026
- const row = tests.find((r) => r.id === activeContextTestId);
2027
- if (row) {
2028
- row.context = testContextDraft;
2029
- await trackSave(saveRow(row.id, { context: JSON.parse(row.context) }));
2030
- }
2031
- showTestContextModal = false;
2032
- activeContextTestId = null;
2033
- },
1971
+ onclick: () => showViewerModal = false,
2034
1972
  children: ($$renderer5) => {
2035
- $$renderer5.push(`<!---->Save`);
1973
+ $$renderer5.push(`<!---->Close`);
2036
1974
  },
2037
1975
  $$slots: { default: true }
2038
1976
  });
2039
- $$renderer4.push(`<!---->`);
2040
1977
  };
2041
1978
  Modal($$renderer3, {
2042
- title: "Edit Test Context",
1979
+ title: viewerTitle,
1980
+ class: "!w-[80vw] !max-w-5xl",
2043
1981
  get open() {
2044
- return showTestContextModal;
1982
+ return showViewerModal;
2045
1983
  },
2046
1984
  set open($$value) {
2047
- showTestContextModal = $$value;
1985
+ showViewerModal = $$value;
2048
1986
  $$settled = false;
2049
1987
  },
2050
1988
  children,
@@ -2052,69 +1990,152 @@ function _page($$renderer, $$props) {
2052
1990
  $$slots: { default: true, footer: true }
2053
1991
  });
2054
1992
  }
1993
+ $$renderer3.push(`<!----> <div class="flex h-full min-h-0 flex-col"><div class="flex flex-none items-center justify-between gap-3 border-b border-rc-gray-700 p-2"><div class="flex items-center gap-3">`);
1994
+ Button($$renderer3, {
1995
+ variant: "secondary",
1996
+ disabled: running || isSaving || !agent,
1997
+ onclick: () => {
1998
+ defaultContextDraft = safeClone(defaultContext);
1999
+ showDefaultContextModal = true;
2000
+ },
2001
+ children: ($$renderer4) => {
2002
+ $$renderer4.push(`<!---->Edit default context`);
2003
+ },
2004
+ $$slots: { default: true }
2005
+ });
2006
+ $$renderer3.push(`<!----> <div class="relative inline-flex items-center">`);
2007
+ Button($$renderer3, {
2008
+ variant: "secondary",
2009
+ onclick: addTest,
2010
+ disabled: isSaving || running || !agent,
2011
+ children: ($$renderer4) => {
2012
+ $$renderer4.push(`<!---->New test`);
2013
+ },
2014
+ $$slots: { default: true }
2015
+ });
2055
2016
  $$renderer3.push(`<!----> `);
2056
- {
2057
- let children = function($$renderer4) {
2058
- if (viewerLoading) {
2017
+ if (hasFetchedTests && tests.length === 0) {
2018
+ $$renderer3.push("<!--[-->");
2019
+ $$renderer3.push(`<div class="pointer-events-none absolute -left-28 top-full mt-4 inline-flex -translate-x-1/2 flex-col items-center"><div class="relative w-50vw max-w-2xl"><img src="/ui/arrow_tests.svg" alt="Arrow" class="block h-auto w-full object-contain"/> <span class="absolute inset-0 mt-48 flex items-center justify-center text-center text-4xl font-extrabold text-rc-gray-200">No tests yet.<br/>Add the first one</span></div></div>`);
2020
+ } else {
2021
+ $$renderer3.push("<!--[!-->");
2022
+ }
2023
+ $$renderer3.push(`<!--]--></div></div> <div class="flex flex-wrap items-center gap-3">`);
2024
+ if (running) {
2025
+ $$renderer3.push("<!--[-->");
2026
+ $$renderer3.push(`<div class="mr-3 flex items-center gap-3"><span class="animate-pulse rounded bg-rc-green-200 px-3 py-1 text-white">Running… ${escape_html(runDone)}/${escape_html(runTotal)}</span> `);
2027
+ Button($$renderer3, {
2028
+ variant: "secondary",
2029
+ disabled: canceling || cancelRequested,
2030
+ onclick: cancelCurrentRun,
2031
+ children: ($$renderer4) => {
2032
+ $$renderer4.push(`<!---->${escape_html(cancelRequested ? "Cancel requested…" : canceling ? "Canceling…" : "Cancel")}`);
2033
+ },
2034
+ $$slots: { default: true }
2035
+ });
2036
+ $$renderer3.push(`<!----></div>`);
2037
+ } else {
2038
+ $$renderer3.push("<!--[!-->");
2039
+ }
2040
+ $$renderer3.push(`<!--]--> <div class="flex items-center gap-2"><label class="text-rc-gray-300">Repeats</label> `);
2041
+ Input($$renderer3, {
2042
+ type: "number",
2043
+ min: "0",
2044
+ max: "500",
2045
+ class: "w-16",
2046
+ onchange: () => {
2047
+ repeats = clamp(+repeats || 0, 0, 500);
2048
+ trackSave(saveConfigPatch({ repeats }));
2049
+ },
2050
+ get value() {
2051
+ return repeats;
2052
+ },
2053
+ set value($$value) {
2054
+ repeats = $$value;
2055
+ $$settled = false;
2056
+ }
2057
+ });
2058
+ $$renderer3.push(`<!----></div> <div class="flex items-center gap-2"><label class="text-rc-gray-300">Concurrency</label> `);
2059
+ Input($$renderer3, {
2060
+ type: "number",
2061
+ min: "0",
2062
+ max: "20",
2063
+ class: "w-16",
2064
+ onchange: () => {
2065
+ concurrency = clamp(+concurrency || 0, 0, 20);
2066
+ trackSave(saveConfigPatch({ concurrency }));
2067
+ },
2068
+ get value() {
2069
+ return concurrency;
2070
+ },
2071
+ set value($$value) {
2072
+ concurrency = $$value;
2073
+ $$settled = false;
2074
+ }
2075
+ });
2076
+ $$renderer3.push(`<!----></div> `);
2077
+ Button($$renderer3, {
2078
+ class: "disabled:cursor-not-allowed disabled:opacity-50",
2079
+ disabled: running || isSaving || tests.length === 0 || hasPinned && pinnedCount === 0,
2080
+ onclick: () => run(hasPinned ? "pinned" : "all"),
2081
+ children: ($$renderer4) => {
2082
+ $$renderer4.push(`<!---->▶ ${escape_html(hasPinned ? "Run pinned" : "Run all")}`);
2083
+ },
2084
+ $$slots: { default: true }
2085
+ });
2086
+ $$renderer3.push(`<!----></div></div> <div class="min-h-0 flex-1 overflow-hidden p-2">`);
2087
+ Panel($$renderer3, {
2088
+ class: "relative flex h-full min-w-0 flex-col overflow-hidden !rounded-none p-0",
2089
+ children: ($$renderer4) => {
2090
+ $$renderer4.push(`<div class="rc-scroll min-h-0 flex-1 overflow-auto"><div class="grid grid-cols-[2.25rem,1fr] items-center gap-2 border-b border-rc-gray-700 p-2"><button${attr_class(
2091
+ `icon-btn justify-self-center ${stringify(hasPinned ? "text-rc-green-350 hover:text-rc-green-250" : "text-gray-300 hover:text-gray-100")}`,
2092
+ "svelte-rdft55"
2093
+ )} aria-label="Pin/unpin all" title="Pin/unpin all"${attr("disabled", running || isSaving || tests.length === 0, true)}>`);
2094
+ Icon($$renderer4, {
2095
+ class: "block",
2096
+ icon: hasPinned ? "mdi:pin" : "mdi:pin-outline",
2097
+ width: 18,
2098
+ height: 18
2099
+ });
2100
+ $$renderer4.push(`<!----></button> <span class="text-left text-rc-gray-300">Pinned: ${escape_html(pinnedCount)}/${escape_html(tests.length)}</span></div> `);
2101
+ if (!hasFetchedTests) {
2059
2102
  $$renderer4.push("<!--[-->");
2060
- $$renderer4.push(`<div class="text-sm text-gray-300">Loading…</div>`);
2103
+ $$renderer4.push(`<div class="p-3 text-gray-400">Loading tests…</div>`);
2061
2104
  } else {
2062
2105
  $$renderer4.push("<!--[!-->");
2063
- if (viewerError) {
2106
+ if (tests.length === 0) {
2064
2107
  $$renderer4.push("<!--[-->");
2065
- $$renderer4.push(`<div class="text-sm text-red-400">${escape_html(viewerError)}</div>`);
2108
+ $$renderer4.push(`<div class="p-3 text-gray-400">—</div>`);
2066
2109
  } else {
2067
2110
  $$renderer4.push("<!--[!-->");
2068
- $$renderer4.push(`<pre class="whitespace-pre-wrap font-mono text-sm text-gray-200">${escape_html(viewerContent)}</pre>`);
2069
- }
2070
- $$renderer4.push(`<!--]-->`);
2071
- }
2072
- $$renderer4.push(`<!--]-->`);
2073
- };
2074
- Modal($$renderer3, {
2075
- title: viewerTitle,
2076
- class: "w-fit min-w-[560px]",
2077
- get open() {
2078
- return showViewerModal;
2079
- },
2080
- set open($$value) {
2081
- showViewerModal = $$value;
2082
- $$settled = false;
2083
- },
2084
- children,
2085
- $$slots: { default: true }
2086
- });
2087
- }
2088
- $$renderer3.push(`<!----> <div class="rc-scroll h-[calc(100vh-3.5rem)] overflow-auto p-0">`);
2089
- if (!hasFetchedTests) {
2090
- $$renderer3.push("<!--[-->");
2091
- $$renderer3.push(`<div class="flex h-full items-center justify-center text-sm text-gray-400">Loading tests…</div>`);
2092
- } else {
2093
- $$renderer3.push("<!--[!-->");
2094
- if (tests.length > 0) {
2095
- $$renderer3.push("<!--[-->");
2096
- Panel($$renderer3, {
2097
- class: "overflow-hidden !rounded-none p-0",
2098
- children: ($$renderer4) => {
2099
- $$renderer4.push(`<div class="overflow-auto"><table class="min-w-full text-sm"><thead><tr class="align-top"><th class="w-20 p-0 text-center"><div class="flex items-center justify-end pr-2"><span class="font-normal">Pin all</span> <button${attr_class(`inline-flex h-8 w-8 items-center justify-center rounded disabled:cursor-not-allowed disabled:opacity-50 ${stringify(allPinned || somePinned ? "text-rc-green-400 hover:text-rc-green-300" : "text-gray-400 hover:text-gray-200")}`)} aria-label="Pin/unpin all" title="Pin/unpin all"${attr("disabled", running || isSaving || tests.length === 0, true)}>`);
2100
- Icon($$renderer4, {
2101
- icon: allPinned ? "mdi:pin" : "mdi:pin-outline",
2102
- width: 18,
2103
- height: 18,
2104
- class: "relative top-[1px]"
2105
- });
2106
- $$renderer4.push(`<!----></button></div></th><th class="p-0"><div class="p-2"><div class="grid grid-cols-1 gap-3 md:grid-cols-12"><div class="flex items-center justify-between md:col-span-4"><span class="text-left font-semibold text-rc-gray-300">Pinned: ${escape_html(pinnedCount)}/${escape_html(tests.length)}</span> <span class="mr-3 text-right font-semibold uppercase tracking-wide text-gray-300">Test</span></div> <div class="ml-3 text-left font-semibold uppercase tracking-wide text-gray-300 md:col-span-8">Result</div></div></div></th></tr></thead><tbody><!--[-->`);
2111
+ $$renderer4.push(`<div class="flex flex-col space-y-5"><!--[-->`);
2107
2112
  const each_array = ensure_array_like(tests);
2108
2113
  for (let i = 0, $$length = each_array.length; i < $$length; i++) {
2109
2114
  let t = each_array[i];
2110
- $$renderer4.push(`<tr class="align-top"><td class="w-20 p-0 text-center align-top"><div class="p-2"><div class="flex items-center justify-center gap-1"><span class="inline-flex h-8 w-8 cursor-grab select-none items-center justify-center rounded text-xl leading-none text-gray-400 hover:text-gray-200 active:cursor-grabbing" title="Drag row" aria-label="Drag row">⠿</span> <button${attr_class(`inline-flex h-8 w-8 items-center justify-center rounded disabled:cursor-not-allowed disabled:opacity-50 ${stringify(t.pinned ? "text-rc-green-400 hover:text-rc-green-300" : "text-gray-400 hover:text-gray-200")}`)}${attr("aria-label", t.pinned ? "Unpin" : "Pin")}${attr("title", t.pinned ? "Unpin" : "Pin")}${attr("disabled", running || isSaving, true)}>`);
2115
+ const expectedInfo = parseExpectedFromConversationEditor(t.conversation_ui);
2116
+ $$renderer4.push(`<div class="border-b border-rc-gray-700 p-2"${attr("data-id", t.id)}><div class="grid grid-cols-[2.25rem,1fr] gap-2"><div class="flex flex-col items-center gap-1"><button${attr_class(
2117
+ `icon-btn ${stringify(t.pinned ? "text-rc-green-350 hover:text-rc-green-250" : "text-gray-300 hover:text-gray-100")}`,
2118
+ "svelte-rdft55"
2119
+ )}${attr("aria-label", t.pinned ? "Unpin" : "Pin")}${attr("title", t.pinned ? "Unpin" : "Pin")}${attr("disabled", running || isSaving, true)}>`);
2111
2120
  Icon($$renderer4, {
2121
+ class: "block",
2112
2122
  icon: t.pinned ? "mdi:pin" : "mdi:pin-outline",
2113
2123
  width: 18,
2114
- height: 18,
2115
- class: "relative top-[1px]"
2124
+ height: 18
2116
2125
  });
2117
- $$renderer4.push(`<!----></button></div></div></td><td class="p-0"><div class="border-b border-rc-gray-700 p-2"><div class="mt-2 grid grid-cols-1 gap-3 md:grid-cols-12"><div class="self-start md:col-span-4"><div class="left-details-bg flex flex-col gap-2 rounded border border-rc-gray-700 p-2 svelte-f5z0gs"><div class="mb-1 flex justify-between"><div><input class="card-input-title svelte-f5z0gs" type="text" placeholder="Scenario"${attr("value", t.scenario)}/> <input class="card-input-subtle mt-1 svelte-f5z0gs" type="text" placeholder="Author"${attr("value", t.author)}/></div> <button title="Delete" class="m-2 inline-flex shrink-0 text-xl text-rc-gray-200 hover:text-rc-gray-100">🗑</button></div> <div class="flex items-center gap-2">`);
2126
+ $$renderer4.push(`<!----></button> <button title="Duplicate" class="icon-btn text-gray-300 hover:text-gray-100 disabled:cursor-not-allowed disabled:opacity-50 svelte-rdft55"${attr("disabled", running || isSaving, true)}>`);
2127
+ Icon($$renderer4, { icon: "mdi:content-copy", width: 18, height: 18 });
2128
+ $$renderer4.push(`<!----></button> <button title="Delete" class="icon-btn text-gray-300 hover:text-gray-100 disabled:cursor-not-allowed disabled:opacity-50 svelte-rdft55"${attr("disabled", running || isSaving, true)}>`);
2129
+ Icon($$renderer4, { icon: "mdi:trash-can-outline", width: 18, height: 18 });
2130
+ $$renderer4.push(`<!----></button></div> <div class="min-w-0"><div${attr_class(`left-details-bg flex flex-col rounded border ${expectedInfo.valid ? "border-rc-gray-700" : "border-rc-red-600"}`, "svelte-rdft55")}><div class="left-details-bg sticky top-0 z-10 rounded-t border-b border-rc-gray-700 px-2 pb-1 pt-2 svelte-rdft55"><input class="card-input-title svelte-rdft55" type="text" placeholder="Scenario"${attr("value", t.scenario)}/></div> <div class="flex flex-col gap-2 p-2">`);
2131
+ if (!expectedInfo.valid) {
2132
+ $$renderer4.push("<!--[-->");
2133
+ $$renderer4.push(`<div class="text-rc-red-600">Invalid test: expected must be the last block (“Agent: …”), with a prompt
2134
+ “User: …” block right above it</div>`);
2135
+ } else {
2136
+ $$renderer4.push("<!--[!-->");
2137
+ }
2138
+ $$renderer4.push(`<!--]--> <input class="card-input-subtle svelte-rdft55" type="text" placeholder="Author"${attr("value", t.author)}/> <div class="flex items-center gap-2">`);
2118
2139
  $$renderer4.select(
2119
2140
  {
2120
2141
  class: "rc-scroll rc-input w-36",
@@ -2133,65 +2154,86 @@ function _page($$renderer, $$props) {
2133
2154
  }
2134
2155
  $$renderer5.push(`<!--]-->`);
2135
2156
  },
2136
- "svelte-f5z0gs"
2157
+ "svelte-rdft55"
2137
2158
  );
2138
- $$renderer4.push(` <input class="rc-input min-w-0 flex-1 svelte-f5z0gs" type="text"${attr("value", t.assertion_value)} placeholder="Assertion value"/> <button title="Duplicate" class="mr-2 shrink-0 text-gray-300 hover:text-gray-100 disabled:cursor-not-allowed disabled:opacity-50"${attr("disabled", running || isSaving, true)}>`);
2139
- Icon($$renderer4, { icon: "mdi:content-copy", width: 18, height: 18 });
2140
- $$renderer4.push(`<!----></button></div> <div class="flex items-center gap-3"><div class="flex items-center gap-1"><span class="text-xs uppercase tracking-wide text-gray-400">Timeout</span> <input class="rc-input no-spin w-16 svelte-f5z0gs" type="number" min="0" max="999"${attr("value", t.timeout)} placeholder="Timeout"/> <span class="text-xs text-gray-400">sec</span></div> <div class="flex items-center gap-1"><span class="text-xs uppercase tracking-wide text-gray-400">Similarity</span> <input class="rc-input no-spin w-16 svelte-f5z0gs" type="number" min="0" max="100"${attr("value", t.similarity_threshold)} placeholder="Similarity (%)"/> <span class="text-xs text-gray-400">%</span></div></div> <div class="text-xs uppercase tracking-wide text-gray-400">Test context</div> `);
2141
- ContextEditor($$renderer4, {
2142
- class: "h-24",
2143
- context: parseJson(t.context),
2144
- suppressErrors: true,
2145
- defaultFormat: "yaml",
2146
- hideHeader: true,
2147
- onContextChanged: (ctx) => {
2148
- try {
2149
- const str = JSON.stringify(ctx);
2150
- t.context = str;
2151
- saveRowDebounced(t.id, { context: ctx });
2152
- } catch {
2153
- }
2154
- }
2159
+ $$renderer4.push(` <input class="rc-input min-w-0 flex-1 svelte-rdft55" type="text"${attr("value", t.assertion_value)} placeholder="Assertion value"/></div> <div class="flex flex-wrap items-center gap-3"><div class="flex items-center gap-2"><span class="text-rc-gray-300">Timeout (s)</span> <input class="rc-input no-spin w-16 svelte-rdft55" type="number" min="0" max="999"${attr("value", t.timeout)} placeholder="Timeout"/></div> <div class="flex items-center gap-2"><span class="text-rc-gray-300">Similarity (%)</span> <input class="rc-input no-spin w-16 svelte-rdft55" type="number" min="0" max="100"${attr("value", t.similarity_threshold)} placeholder="Similarity (%)"/></div> `);
2160
+ Button($$renderer4, {
2161
+ variant: "secondary",
2162
+ size: "small",
2163
+ disabled: running || isSaving,
2164
+ onclick: () => openTestContext(t),
2165
+ children: ($$renderer5) => {
2166
+ $$renderer5.push(`<!---->Edit context`);
2167
+ },
2168
+ $$slots: { default: true }
2155
2169
  });
2156
- $$renderer4.push(`<!----> <div class="text-xs uppercase tracking-wide text-gray-400">Conversation</div> `);
2170
+ $$renderer4.push(`<!----></div> `);
2157
2171
  MiniEditor($$renderer4, {
2158
- value: t.conversation,
2159
- onChange: (v) => t.conversation = v,
2160
- onBlur: () => saveRow(t.id, { conversation: t.conversation }),
2161
- language: "markdown",
2162
- height: 140
2172
+ value: t.conversation_ui,
2173
+ highlights: expectedInfo.highlight ? [
2174
+ {
2175
+ startLine: expectedInfo.highlight.startLine,
2176
+ endLine: expectedInfo.highlight.endLine,
2177
+ className: "test-expected-output"
2178
+ }
2179
+ ] : void 0,
2180
+ height: 220
2163
2181
  });
2164
- $$renderer4.push(`<!----> <div class="text-xs uppercase tracking-wide text-gray-400">Expected</div> `);
2165
- MiniEditor($$renderer4, {
2166
- value: t.expected_output,
2167
- onChange: (v) => t.expected_output = v,
2168
- onBlur: () => saveRow(t.id, { expected_output: t.expected_output }),
2169
- language: "markdown",
2170
- height: 120
2182
+ $$renderer4.push(`<!----></div> <div class="rounded-b border-t border-rc-gray-700 bg-rc-gray-980 p-2"><div class="flex flex-wrap items-center gap-3">`);
2183
+ Button($$renderer4, {
2184
+ size: "small",
2185
+ disabled: running || isSaving || !expectedInfo.valid,
2186
+ title: !expectedInfo.valid ? "Expected must be the last block (“Agent: …”) and there must be a prompt “User: …” block right above it" : "Run",
2187
+ onclick: () => runSingle(t.id),
2188
+ children: ($$renderer5) => {
2189
+ $$renderer5.push(`<!---->▶ Run`);
2190
+ },
2191
+ $$slots: { default: true }
2171
2192
  });
2172
- $$renderer4.push(`<!----></div></div> <div class="md:col-span-8"><div class="mb-2 ml-3 text-sm">`);
2193
+ $$renderer4.push(`<!----> `);
2173
2194
  if (t.result) {
2174
2195
  $$renderer4.push("<!--[-->");
2175
- $$renderer4.push(`<div class="text-lg font-extrabold"><span class="text-rc-gray-200">${escape_html(t.result.runs.filter((r) => r.success).length)}/${escape_html(t.result.total_runs)}</span> `);
2196
+ const trend = getExpectedTrend(t.result, runExpectedRuns);
2197
+ $$renderer4.push(`<div class="text-lg font-extrabold"><span class="text-rc-gray-200">${escape_html(t.result.successes)}/${escape_html(t.result.total_runs)}</span> `);
2198
+ if (trend?.showExpected) {
2199
+ $$renderer4.push("<!--[-->");
2200
+ $$renderer4.push(`<span class="ml-2 text-rc-gray-400">(${escape_html(trend.expectedSuccesses)}/${escape_html(trend.expectedRuns)} expected)</span>`);
2201
+ } else {
2202
+ $$renderer4.push("<!--[!-->");
2203
+ }
2204
+ $$renderer4.push(`<!--]--> `);
2205
+ if (trend?.significant) {
2206
+ $$renderer4.push("<!--[-->");
2207
+ $$renderer4.push(`<span${attr_class(`ml-2 whitespace-nowrap font-semibold ${trend.direction === "higher" ? "text-rc-green-200" : "text-rc-red-600"}`, "svelte-rdft55")}>`);
2208
+ Icon$1($$renderer4, {
2209
+ name: trend.direction === "higher" ? "chevron-up" : "chevron-down",
2210
+ width: 18,
2211
+ height: 18,
2212
+ class: "inline-block align-text-bottom"
2213
+ });
2214
+ $$renderer4.push(`<!----><span class="ml-1">significant</span></span>`);
2215
+ } else {
2216
+ $$renderer4.push("<!--[!-->");
2217
+ }
2218
+ $$renderer4.push(`<!--]--> `);
2176
2219
  if (t.result.isOld) {
2177
2220
  $$renderer4.push("<!--[-->");
2178
2221
  $$renderer4.push(`<span class="text-rc-gray-400">(old)</span>`);
2179
2222
  } else {
2180
2223
  $$renderer4.push("<!--[!-->");
2181
2224
  }
2182
- $$renderer4.push(`<!--]--></div> <span class="block font-medium text-rc-gray-400">Success:</span>`);
2225
+ $$renderer4.push(`<!--]--></div>`);
2183
2226
  } else {
2184
2227
  $$renderer4.push("<!--[!-->");
2185
- $$renderer4.push(`<span class="ml-3 text-gray-500">—</span>`);
2186
2228
  }
2187
2229
  $$renderer4.push(`<!--]--></div> `);
2188
2230
  if (t.result) {
2189
2231
  $$renderer4.push("<!--[-->");
2190
- $$renderer4.push(`<div class="flex flex-col gap-3"><!--[-->`);
2232
+ $$renderer4.push(`<div class="mt-3 flex flex-col gap-4"><!--[-->`);
2191
2233
  const each_array_2 = ensure_array_like(t.result.runs);
2192
2234
  for (let $$index_1 = 0, $$length2 = each_array_2.length; $$index_1 < $$length2; $$index_1++) {
2193
2235
  let run2 = each_array_2[$$index_1];
2194
- $$renderer4.push(`<div class="max-w-3xl rounded-md border border-rc-gray-700 bg-rc-gray-800/40 px-3 py-2"><div${attr_class(`w-full whitespace-pre-wrap break-words rounded-lg px-3 py-2 text-rc-gray-100 ${run2.success ? "bg-rc-green-700 backdrop-blur-md" : ""}`, "svelte-f5z0gs")}${attr_style(!run2.success ? "background-color: rgb(156 80 80)" : "")}>${escape_html(run2.text || "—")}</div> <div${attr_class(`mt-2 flex w-full flex-col gap-x-4 whitespace-pre-wrap break-words text-sm ${run2.success ? "text-rc-green-200" : "text-rc-red-800"}`, "svelte-f5z0gs")}><div class="flex items-center gap-0">`);
2236
+ $$renderer4.push(`<div class="flex flex-col gap-2"><div${attr_class(`w-full whitespace-pre-wrap break-words rounded-lg px-3 py-2 text-rc-gray-100 ${run2.success ? "bg-rc-green-700 backdrop-blur-md" : ""}`, "svelte-rdft55")}${attr_style(!run2.success ? "background-color: rgb(156 80 80)" : "")}>${escape_html(run2.text || "—")}</div> <div${attr_class(`flex w-full flex-col gap-x-4 whitespace-pre-wrap break-words ${run2.success ? "text-rc-green-200" : "text-rc-red-800"}`, "svelte-rdft55")}><div class="flex items-center gap-0">`);
2195
2237
  if (run2.success) {
2196
2238
  $$renderer4.push("<!--[-->");
2197
2239
  Icon$1($$renderer4, {
@@ -2209,90 +2251,50 @@ function _page($$renderer, $$props) {
2209
2251
  class: "shrink-0 scale-110 self-start"
2210
2252
  });
2211
2253
  }
2212
- $$renderer4.push(`<!--]--> <span>${escape_html(run2.success ? "Pass" : formatEvaluation(run2.evaluation) || "Fail")}</span></div> <div class="mt-1 flex flex-wrap items-center gap-x-4">`);
2213
- Button($$renderer4, {
2214
- variant: "outlined",
2215
- size: "small",
2216
- class: "border-none !px-0 text-sm text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:bg-transparent hover:text-rc-gray-200",
2217
- onclick: () => openViewer("Rendered Prompt", run2.links.renderedPrompt),
2218
- children: ($$renderer5) => {
2219
- $$renderer5.push(`<!---->Rendered prompt`);
2220
- },
2221
- $$slots: { default: true }
2222
- });
2223
- $$renderer4.push(`<!----> `);
2224
- Button($$renderer4, {
2225
- variant: "outlined",
2226
- size: "small",
2227
- class: "border-none !px-0 text-sm text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:bg-transparent hover:text-rc-gray-200",
2228
- onclick: () => openViewer("Received Prompt", run2.links.receivedPrompt),
2229
- children: ($$renderer5) => {
2230
- $$renderer5.push(`<!---->Received prompt`);
2231
- },
2232
- $$slots: { default: true }
2233
- });
2234
- $$renderer4.push(`<!----> `);
2235
- Button($$renderer4, {
2236
- variant: "outlined",
2237
- size: "small",
2238
- class: "border-none !px-0 text-sm text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:bg-transparent hover:text-rc-gray-200",
2239
- onclick: () => openViewer("Conversation", run2.links.conversation),
2240
- children: ($$renderer5) => {
2241
- $$renderer5.push(`<!---->Conversation`);
2242
- },
2243
- $$slots: { default: true }
2244
- });
2245
- $$renderer4.push(`<!----> `);
2246
- Button($$renderer4, {
2247
- variant: "outlined",
2248
- size: "small",
2249
- class: "border-none !px-0 text-sm text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:bg-transparent hover:text-rc-gray-200",
2250
- onclick: () => openViewer("Context", run2.links.context),
2251
- children: ($$renderer5) => {
2252
- $$renderer5.push(`<!---->Context`);
2253
- },
2254
- $$slots: { default: true }
2255
- });
2256
- $$renderer4.push(`<!----> `);
2257
- Button($$renderer4, {
2258
- variant: "outlined",
2259
- size: "small",
2260
- class: "border-none !px-0 text-sm text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:bg-transparent hover:text-rc-gray-200",
2261
- onclick: () => openViewer("Logs", run2.links.logs),
2262
- children: ($$renderer5) => {
2263
- $$renderer5.push(`<!---->Logs`);
2264
- },
2265
- $$slots: { default: true }
2266
- });
2267
- $$renderer4.push(`<!----> `);
2268
- Button($$renderer4, {
2269
- variant: "outlined",
2270
- size: "small",
2271
- class: "border-none !px-0 text-sm text-rc-gray-400 underline decoration-dashed underline-offset-4 hover:bg-transparent hover:text-rc-gray-200",
2272
- onclick: () => openViewer("Traces", run2.links.traces),
2273
- children: ($$renderer5) => {
2274
- $$renderer5.push(`<!---->Traces`);
2275
- },
2276
- $$slots: { default: true }
2277
- });
2278
- $$renderer4.push(`<!----></div></div></div>`);
2254
+ $$renderer4.push(`<!--]--> <span>${escape_html(run2.success ? "Pass" : formatEvaluation(run2.evaluation) || "Fail")}</span></div> <div class="mt-1 flex flex-wrap items-center gap-x-4"><button type="button" class="pseudolink svelte-rdft55">Rendered prompt</button> <button type="button" class="pseudolink svelte-rdft55">Received prompt</button> <button type="button" class="pseudolink svelte-rdft55">Conversation</button> <button type="button" class="pseudolink svelte-rdft55">Context</button> <button type="button" class="pseudolink svelte-rdft55">Logs</button> <button type="button" class="pseudolink svelte-rdft55">Traces</button> <button type="button" class="pseudolink svelte-rdft55"${attr("disabled", analyzeRunning, true)}>Analyze</button></div></div></div>`);
2279
2255
  }
2280
2256
  $$renderer4.push(`<!--]--></div>`);
2281
2257
  } else {
2282
2258
  $$renderer4.push("<!--[!-->");
2283
- $$renderer4.push(`<span class="ml-6 text-gray-500">—</span>`);
2284
2259
  }
2285
- $$renderer4.push(`<!--]--></div></div></div></td></tr>`);
2260
+ $$renderer4.push(`<!--]--></div></div></div></div></div>`);
2286
2261
  }
2287
- $$renderer4.push(`<!--]--></tbody></table></div>`);
2262
+ $$renderer4.push(`<!--]--></div>`);
2288
2263
  }
2289
- });
2290
- } else {
2291
- $$renderer3.push("<!--[!-->");
2264
+ $$renderer4.push(`<!--]-->`);
2265
+ }
2266
+ $$renderer4.push(`<!--]--></div> `);
2267
+ if (testContextPopoverTestId) {
2268
+ $$renderer4.push("<!--[-->");
2269
+ const row = tests.find((t) => t.id === testContextPopoverTestId);
2270
+ {
2271
+ let children = function($$renderer5) {
2272
+ $$renderer5.push(`<div class="min-h-0 flex-1 overflow-hidden p-3"><!---->`);
2273
+ {
2274
+ ContextEditor($$renderer5, {
2275
+ class: "h-full min-h-0 border-thin border-rc-gray-650 shadow-inner-white-soft backdrop-blur-3xl",
2276
+ context: testContextDraft,
2277
+ suppressErrors: true,
2278
+ defaultFormat: "yaml",
2279
+ hideHeader: true,
2280
+ onContextChanged: (ctx) => testContextDraft = ctx
2281
+ });
2282
+ }
2283
+ $$renderer5.push(`<!----></div>`);
2284
+ };
2285
+ PopoverModal($$renderer4, {
2286
+ title: `Test context — ${row?.scenario || "Test"}`,
2287
+ onClose: () => void closeTestContextPopover(),
2288
+ children
2289
+ });
2290
+ }
2291
+ } else {
2292
+ $$renderer4.push("<!--[!-->");
2293
+ }
2294
+ $$renderer4.push(`<!--]-->`);
2292
2295
  }
2293
- $$renderer3.push(`<!--]-->`);
2294
- }
2295
- $$renderer3.push(`<!--]--></div></div></div>`);
2296
+ });
2297
+ $$renderer3.push(`<!----></div></div>`);
2296
2298
  }
2297
2299
  do {
2298
2300
  $$settled = true;
@@ -2304,4 +2306,4 @@ function _page($$renderer, $$props) {
2304
2306
  }
2305
2307
 
2306
2308
  export { _page as default };
2307
- //# sourceMappingURL=_page.svelte-N6xQwQzn.js.map
2309
+ //# sourceMappingURL=_page.svelte-C1YaC_Qg.js.map