@recombine-ai/bosun 0.16.2 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/build/client/_app/immutable/assets/0.B4Hv80zl.css +1 -0
  2. package/build/client/_app/immutable/assets/0.B4Hv80zl.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.B4Hv80zl.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/{2.DtxQDOXx.css → 2.Bc0Sf3YD.css} +1 -1
  5. package/build/client/_app/immutable/assets/2.Bc0Sf3YD.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.Bc0Sf3YD.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/A4HgFSOM.js +1 -0
  8. package/build/client/_app/immutable/chunks/A4HgFSOM.js.br +2 -0
  9. package/build/client/_app/immutable/chunks/A4HgFSOM.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{DoD3q5w5.js → B00B3Gwh.js} +1 -1
  11. package/build/client/_app/immutable/chunks/B00B3Gwh.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/B00B3Gwh.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/B43-lfXY.js +1 -0
  14. package/build/client/_app/immutable/chunks/B43-lfXY.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/B43-lfXY.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/B4tOnDzM.js +1 -0
  17. package/build/client/_app/immutable/chunks/B4tOnDzM.js.br +2 -0
  18. package/build/client/_app/immutable/chunks/B4tOnDzM.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{Bv1mNXs0.js → BDY0xZsU.js} +1 -1
  20. package/build/client/_app/immutable/chunks/BDY0xZsU.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BDY0xZsU.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{UqjCSZmA.js → BIxSqfKT.js} +1 -1
  23. package/build/client/_app/immutable/chunks/BIxSqfKT.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BIxSqfKT.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{r0sHOWrM.js → BQJs3N6E.js} +1 -1
  26. package/build/client/_app/immutable/chunks/BQJs3N6E.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BQJs3N6E.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/{BHHfrjbV.js → BXh99ZNk.js} +1 -1
  29. package/build/client/_app/immutable/chunks/BXh99ZNk.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BXh99ZNk.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/B_RIpUuZ.js +1 -0
  32. package/build/client/_app/immutable/chunks/B_RIpUuZ.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/B_RIpUuZ.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/{CEHsomMo.js → Bd-a6hgR.js} +1 -1
  35. package/build/client/_app/immutable/chunks/Bd-a6hgR.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/{CEHsomMo.js.gz → Bd-a6hgR.js.gz} +0 -0
  37. package/build/client/_app/immutable/chunks/{Dm49pcMm.js → BftRRaUE.js} +1 -1
  38. package/build/client/_app/immutable/chunks/BftRRaUE.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/BftRRaUE.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/Bm4FdRXc.js +1 -0
  41. package/build/client/_app/immutable/chunks/Bm4FdRXc.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/Bm4FdRXc.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{Ddv5LgEc.js → BmdpEiKy.js} +2 -2
  44. package/build/client/_app/immutable/chunks/BmdpEiKy.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/BmdpEiKy.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/{B5zf3x62.js → BxZ1WgZm.js} +1 -1
  47. package/build/client/_app/immutable/chunks/BxZ1WgZm.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/BxZ1WgZm.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/{Cp_st-64.js → C9LBPFJH.js} +1 -1
  50. package/build/client/_app/immutable/chunks/C9LBPFJH.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/C9LBPFJH.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/{JcG4w2gF.js → CH3XJDoO.js} +1 -1
  53. package/build/client/_app/immutable/chunks/CH3XJDoO.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/CH3XJDoO.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/CWVkeRMt.js +3 -0
  56. package/build/client/_app/immutable/chunks/CWVkeRMt.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/CWVkeRMt.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/CXfw8fai.js +1 -0
  59. package/build/client/_app/immutable/chunks/CXfw8fai.js.br +2 -0
  60. package/build/client/_app/immutable/chunks/CXfw8fai.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/{DfcDjAv-.js → Clfp4Zf_.js} +1 -1
  62. package/build/client/_app/immutable/chunks/Clfp4Zf_.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/Clfp4Zf_.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/{DneQQ7D5.js → Cr5XqyuF.js} +1 -1
  65. package/build/client/_app/immutable/chunks/Cr5XqyuF.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/Cr5XqyuF.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/{Bmd5zhWC.js → CxzD8Edk.js} +1 -1
  68. package/build/client/_app/immutable/chunks/CxzD8Edk.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/CxzD8Edk.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/D6iBTJD_.js +1 -0
  71. package/build/client/_app/immutable/chunks/D6iBTJD_.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/D6iBTJD_.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/{CJcZ2GVC.js → DB-s6wHX.js} +1 -1
  74. package/build/client/_app/immutable/chunks/DB-s6wHX.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/DB-s6wHX.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/D_LCsjN0.js +1 -0
  77. package/build/client/_app/immutable/chunks/D_LCsjN0.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/D_LCsjN0.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/Dd-8KgV2.js +2 -0
  80. package/build/client/_app/immutable/chunks/Dd-8KgV2.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/Dd-8KgV2.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/{pPpIn6tB.js → DdmShlNz.js} +1 -1
  83. package/build/client/_app/immutable/chunks/DdmShlNz.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/DdmShlNz.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/Df5gZp_x.js +1 -0
  86. package/build/client/_app/immutable/chunks/Df5gZp_x.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/Df5gZp_x.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/{wcTQUnZO.js → Dfg-7N3Z.js} +1 -1
  89. package/build/client/_app/immutable/chunks/Dfg-7N3Z.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/Dfg-7N3Z.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/{BnqH7p3U.js → DnsnkygW.js} +2 -2
  92. package/build/client/_app/immutable/chunks/DnsnkygW.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/DnsnkygW.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{D8mA-uZ4.js → Do-VHn0U.js} +1 -1
  95. package/build/client/_app/immutable/chunks/Do-VHn0U.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/Do-VHn0U.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{DyBwTDJp.js → DtC6KNFZ.js} +1 -1
  98. package/build/client/_app/immutable/chunks/DtC6KNFZ.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/DtC6KNFZ.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/{DtXXy94i.js → LEDvCGy2.js} +1 -1
  101. package/build/client/_app/immutable/chunks/LEDvCGy2.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/LEDvCGy2.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/PrCSpCPg.js +1 -0
  104. package/build/client/_app/immutable/chunks/PrCSpCPg.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/PrCSpCPg.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/Si6VyCMt.js +8 -0
  107. package/build/client/_app/immutable/chunks/Si6VyCMt.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/Si6VyCMt.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/{Dy2CFyD6.js → W2LAs4ks.js} +1 -1
  110. package/build/client/_app/immutable/chunks/W2LAs4ks.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/W2LAs4ks.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/{DCXjBDmY.js → cxBf7mxj.js} +1 -1
  113. package/build/client/_app/immutable/chunks/cxBf7mxj.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/cxBf7mxj.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/g6pAcE-g.js +1 -0
  116. package/build/client/_app/immutable/chunks/g6pAcE-g.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/g6pAcE-g.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/nt0OWMrn.js +2 -0
  119. package/build/client/_app/immutable/chunks/nt0OWMrn.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/nt0OWMrn.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/r0jEdDRH.js +1 -0
  122. package/build/client/_app/immutable/chunks/r0jEdDRH.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/r0jEdDRH.js.gz +0 -0
  124. package/build/client/_app/immutable/entry/app.C6BwoHPB.js +2 -0
  125. package/build/client/_app/immutable/entry/app.C6BwoHPB.js.br +0 -0
  126. package/build/client/_app/immutable/entry/app.C6BwoHPB.js.gz +0 -0
  127. package/build/client/_app/immutable/entry/start.DtdsXA4D.js +1 -0
  128. package/build/client/_app/immutable/entry/start.DtdsXA4D.js.br +2 -0
  129. package/build/client/_app/immutable/entry/start.DtdsXA4D.js.gz +0 -0
  130. package/build/client/_app/immutable/nodes/{0.nG3DdvIX.js → 0.Be4zhwyU.js} +1 -1
  131. package/build/client/_app/immutable/nodes/0.Be4zhwyU.js.br +0 -0
  132. package/build/client/_app/immutable/nodes/0.Be4zhwyU.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/1.DU-ZnWjM.js +1 -0
  134. package/build/client/_app/immutable/nodes/1.DU-ZnWjM.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/1.DU-ZnWjM.js.gz +0 -0
  136. package/build/client/_app/immutable/nodes/10.CnYak_rj.js +28 -0
  137. package/build/client/_app/immutable/nodes/10.CnYak_rj.js.br +0 -0
  138. package/build/client/_app/immutable/nodes/10.CnYak_rj.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/{15.D2I0y3ys.js → 15.DZxmOvq_.js} +1 -1
  140. package/build/client/_app/immutable/nodes/15.DZxmOvq_.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/15.DZxmOvq_.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/17.6u3BMaGP.js +3 -0
  143. package/build/client/_app/immutable/nodes/17.6u3BMaGP.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/17.6u3BMaGP.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/18.B74hqK3k.js +11 -0
  146. package/build/client/_app/immutable/nodes/18.B74hqK3k.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/18.B74hqK3k.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/2.tsu7vFWw.js +35 -0
  149. package/build/client/_app/immutable/nodes/2.tsu7vFWw.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/2.tsu7vFWw.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/3.uagy_HG1.js +1 -0
  152. package/build/client/_app/immutable/nodes/3.uagy_HG1.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/3.uagy_HG1.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/{4.C8VxVbVn.js → 4.DMbfNKYL.js} +1 -1
  155. package/build/client/_app/immutable/nodes/4.DMbfNKYL.js.br +0 -0
  156. package/build/client/_app/immutable/nodes/4.DMbfNKYL.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/{5.BjrnKYaA.js → 5.DpWrPX3L.js} +1 -1
  158. package/build/client/_app/immutable/nodes/5.DpWrPX3L.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/5.DpWrPX3L.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/{6.C_hEzPrU.js → 6.D7wtfdve.js} +1 -1
  161. package/build/client/_app/immutable/nodes/6.D7wtfdve.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/6.D7wtfdve.js.gz +0 -0
  163. package/build/client/_app/immutable/nodes/8.Bo50UIdy.js +2 -0
  164. package/build/client/_app/immutable/nodes/8.Bo50UIdy.js.br +0 -0
  165. package/build/client/_app/immutable/nodes/8.Bo50UIdy.js.gz +0 -0
  166. package/build/client/_app/immutable/nodes/{9.DVspuDYY.js → 9.B2xXyeYp.js} +1 -1
  167. package/build/client/_app/immutable/nodes/9.B2xXyeYp.js.br +0 -0
  168. package/build/client/_app/immutable/nodes/9.B2xXyeYp.js.gz +0 -0
  169. package/build/client/_app/version.json +1 -1
  170. package/build/client/_app/version.json.br +0 -0
  171. package/build/client/_app/version.json.gz +0 -0
  172. package/build/server/chunks/0-BFGwTpfy.js +9 -0
  173. package/build/server/chunks/0-BFGwTpfy.js.map +1 -0
  174. package/build/server/chunks/1-B_bvJcKE.js +9 -0
  175. package/build/server/chunks/{1-C0HdTvXW.js.map → 1-B_bvJcKE.js.map} +1 -1
  176. package/build/server/chunks/10-CVT4oo13.js +9 -0
  177. package/build/server/chunks/10-CVT4oo13.js.map +1 -0
  178. package/build/server/chunks/15-B6cgfT20.js +9 -0
  179. package/build/server/chunks/{15-BQcb9C_y.js.map → 15-B6cgfT20.js.map} +1 -1
  180. package/build/server/chunks/17-fi2rlX_T.js +9 -0
  181. package/build/server/chunks/17-fi2rlX_T.js.map +1 -0
  182. package/build/server/chunks/18-CdypjWwX.js +9 -0
  183. package/build/server/chunks/18-CdypjWwX.js.map +1 -0
  184. package/build/server/chunks/2-CkwyQ1U4.js +9 -0
  185. package/build/server/chunks/2-CkwyQ1U4.js.map +1 -0
  186. package/build/server/chunks/3-BXLsvzRq.js +9 -0
  187. package/build/server/chunks/3-BXLsvzRq.js.map +1 -0
  188. package/build/server/chunks/4-C3Me7zq3.js +9 -0
  189. package/build/server/chunks/4-C3Me7zq3.js.map +1 -0
  190. package/build/server/chunks/5-DYS5LmK2.js +9 -0
  191. package/build/server/chunks/{5-CBdMutbv.js.map → 5-DYS5LmK2.js.map} +1 -1
  192. package/build/server/chunks/6-Cp6GA1FS.js +9 -0
  193. package/build/server/chunks/{6-FoEi7ggm.js.map → 6-Cp6GA1FS.js.map} +1 -1
  194. package/build/server/chunks/8-Csly_0ub.js +9 -0
  195. package/build/server/chunks/8-Csly_0ub.js.map +1 -0
  196. package/build/server/chunks/9-C1UZfJDT.js +9 -0
  197. package/build/server/chunks/9-C1UZfJDT.js.map +1 -0
  198. package/build/server/chunks/{AgentSidebar-BWBnqHnV.js → AgentSidebar-BqqgUCT2.js} +4 -4
  199. package/build/server/chunks/{AgentSidebar-BWBnqHnV.js.map → AgentSidebar-BqqgUCT2.js.map} +1 -1
  200. package/build/server/chunks/{Button-DH7gdU0s.js → Button-Huqrc2wY.js} +2 -2
  201. package/build/server/chunks/{Button-DH7gdU0s.js.map → Button-Huqrc2wY.js.map} +1 -1
  202. package/build/server/chunks/{ChatStepTrace-BivoNYOY.js → ChatStepTrace-CmyR6NOL.js} +21 -7
  203. package/build/server/chunks/ChatStepTrace-CmyR6NOL.js.map +1 -0
  204. package/build/server/chunks/{Icon-DP1YKCRV.js → Icon-BJfQMgGu.js} +2 -2
  205. package/build/server/chunks/{Icon-DP1YKCRV.js.map → Icon-BJfQMgGu.js.map} +1 -1
  206. package/build/server/chunks/{Input-CUJ9Cg7b.js → Input-D-uxKbuX.js} +2 -2
  207. package/build/server/chunks/{Input-CUJ9Cg7b.js.map → Input-D-uxKbuX.js.map} +1 -1
  208. package/build/server/chunks/{Modal-CGJuNpZ0.js → Modal-B_fVcSLK.js} +5 -5
  209. package/build/server/chunks/{Modal-CGJuNpZ0.js.map → Modal-B_fVcSLK.js.map} +1 -1
  210. package/build/server/chunks/{Panel-zvjxe036.js → Panel-mV52rK4D.js} +2 -2
  211. package/build/server/chunks/{Panel-zvjxe036.js.map → Panel-mV52rK4D.js.map} +1 -1
  212. package/build/server/chunks/{Tab-CUkyLqbN.js → Tab-tFWS4zzn.js} +8 -11
  213. package/build/server/chunks/Tab-tFWS4zzn.js.map +1 -0
  214. package/build/server/chunks/{_layout.svelte-B-0DHjLB.js → _layout.svelte-BjBXlTt-.js} +8 -8
  215. package/build/server/chunks/{_layout.svelte-B-0DHjLB.js.map → _layout.svelte-BjBXlTt-.js.map} +1 -1
  216. package/build/server/chunks/{_layout.svelte-BnrWYuLv.js → _layout.svelte-Bv87ouh2.js} +9 -10
  217. package/build/server/chunks/{_layout.svelte-BnrWYuLv.js.map → _layout.svelte-Bv87ouh2.js.map} +1 -1
  218. package/build/server/chunks/{_layout.svelte-B88WMyk0.js → _layout.svelte-CHJ_Q00I.js} +130 -37
  219. package/build/server/chunks/_layout.svelte-CHJ_Q00I.js.map +1 -0
  220. package/build/server/chunks/{_layout.svelte-wi6o5Ecu.js → _layout.svelte-DPP4TE7p.js} +305 -46
  221. package/build/server/chunks/_layout.svelte-DPP4TE7p.js.map +1 -0
  222. package/build/server/chunks/{_page.svelte-DhFNFMnl.js → _page.svelte-CDGPJuVG.js} +11 -11
  223. package/build/server/chunks/_page.svelte-CDGPJuVG.js.map +1 -0
  224. package/build/server/chunks/{_page.svelte-CeS_21Ho.js → _page.svelte-CXjHZqjR.js} +22 -20
  225. package/build/server/chunks/_page.svelte-CXjHZqjR.js.map +1 -0
  226. package/build/server/chunks/{_page.svelte-BoHt2cpr.js → _page.svelte-CZXVTrWJ.js} +5 -5
  227. package/build/server/chunks/{_page.svelte-BoHt2cpr.js.map → _page.svelte-CZXVTrWJ.js.map} +1 -1
  228. package/build/server/chunks/{_page.svelte-h_J4lNT9.js → _page.svelte-CvPyTgqp.js} +6 -6
  229. package/build/server/chunks/{_page.svelte-h_J4lNT9.js.map → _page.svelte-CvPyTgqp.js.map} +1 -1
  230. package/build/server/chunks/{_page.svelte-DHSYVLoj.js → _page.svelte-DHE9UaxV.js} +11 -12
  231. package/build/server/chunks/{_page.svelte-DHSYVLoj.js.map → _page.svelte-DHE9UaxV.js.map} +1 -1
  232. package/build/server/chunks/{_page.svelte-CHgQjBQj.js → _page.svelte-DSLYtPvs.js} +2 -2
  233. package/build/server/chunks/{_page.svelte-CHgQjBQj.js.map → _page.svelte-DSLYtPvs.js.map} +1 -1
  234. package/build/server/chunks/{_page.svelte-57pyhszV.js → _page.svelte-Yjru58jZ.js} +20 -107
  235. package/build/server/chunks/_page.svelte-Yjru58jZ.js.map +1 -0
  236. package/build/server/chunks/{_page.svelte-BSVJ2d2G.js → _page.svelte-nQ_thh1S.js} +186 -104
  237. package/build/server/chunks/_page.svelte-nQ_thh1S.js.map +1 -0
  238. package/build/server/chunks/{agents-context-CbFsZmi5.js → agents-context-BdX2j9DI.js} +2 -2
  239. package/build/server/chunks/{agents-context-CbFsZmi5.js.map → agents-context-BdX2j9DI.js.map} +1 -1
  240. package/build/server/chunks/{Dropdown-DnARl86Q.js → chat-content.svelte-x4GXVNwU.js} +16 -4
  241. package/build/server/chunks/chat-content.svelte-x4GXVNwU.js.map +1 -0
  242. package/build/server/chunks/{client-DO-hqMbT.js → client-D1Y2ZQJN.js} +4 -4
  243. package/build/server/chunks/{client-DO-hqMbT.js.map → client-D1Y2ZQJN.js.map} +1 -1
  244. package/build/server/chunks/{conversation-view-memory-CtbUZd_L.js → conversation-view-memory-CMgSQUdu.js} +2 -2
  245. package/build/server/chunks/{conversation-view-memory-CtbUZd_L.js.map → conversation-view-memory-CMgSQUdu.js.map} +1 -1
  246. package/build/server/chunks/{edit-workspace-context-tyHBPujC.js → edit-workspace-context-ClnqepZ4.js} +2 -2
  247. package/build/server/chunks/{edit-workspace-context-tyHBPujC.js.map → edit-workspace-context-ClnqepZ4.js.map} +1 -1
  248. package/build/server/chunks/error.svelte-B5VtiMGd.js +15 -0
  249. package/build/server/chunks/{error.svelte-DmKKN1RU.js.map → error.svelte-B5VtiMGd.js.map} +1 -1
  250. package/build/server/chunks/{index-LMsd1ih2.js → index-Do08hKbr.js} +8 -5
  251. package/build/server/chunks/index-Do08hKbr.js.map +1 -0
  252. package/build/server/chunks/{index-server-BRr5mZEq.js → index-server-CHFC9Apw.js} +2 -2
  253. package/build/server/chunks/index-server-CHFC9Apw.js.map +1 -0
  254. package/build/server/chunks/{index2-ClgfzZ89.js → index2-B_Xf0ugP.js} +3 -3
  255. package/build/server/chunks/{index2-ClgfzZ89.js.map → index2-B_Xf0ugP.js.map} +1 -1
  256. package/build/server/chunks/{index3-BdRUAffj.js → index3-C9gC86lU.js} +2 -2
  257. package/build/server/chunks/{index3-BdRUAffj.js.map → index3-C9gC86lU.js.map} +1 -1
  258. package/build/server/chunks/log-content.svelte-D5gN0L7Q.js +7 -0
  259. package/build/server/chunks/log-content.svelte-D5gN0L7Q.js.map +1 -0
  260. package/build/server/chunks/{root-4q2Pr7ck.js → root-DoSdrdfw.js} +2 -2
  261. package/build/server/chunks/root-DoSdrdfw.js.map +1 -0
  262. package/build/server/chunks/{source-selection-CcN1cgXc.js → source-selection-1aBuBpkL.js} +45 -2
  263. package/build/server/chunks/source-selection-1aBuBpkL.js.map +1 -0
  264. package/build/server/chunks/{state.svelte-Bd1i-u49.js → state.svelte-B2OaeWMp.js} +3 -3
  265. package/build/server/chunks/{state.svelte-Bd1i-u49.js.map → state.svelte-B2OaeWMp.js.map} +1 -1
  266. package/build/server/index.js +4 -4
  267. package/build/server/index.js.map +1 -1
  268. package/build/server/manifest.js +14 -14
  269. package/build/server/manifest.js.map +1 -1
  270. package/package.json +1 -5
  271. package/src/backend/roleplay/agent-loader.ts +49 -0
  272. package/src/backend/roleplay/prompt-edit-proposals.ts +38 -4
  273. package/src/backend/roleplay/prompt-file.ts +59 -0
  274. package/src/backend/roleplay/router.spec.ts +75 -0
  275. package/src/backend/roleplay/router.ts +123 -69
  276. package/src/backend/roleplay/suggest-file-edit.ts +160 -0
  277. package/src/backend/roleplay/suggest-prompt-edit.ts +9 -138
  278. package/src/backend/roleplay/suggest-test-fix.spec.ts +50 -0
  279. package/src/backend/roleplay/suggest-test-fix.ts +65 -0
  280. package/src/backend/roleplay/test-fix-proposal-acceptance.spec.ts +253 -0
  281. package/src/backend/tests/academy.ts +16 -2
  282. package/src/backend/tests/data.spec.ts +81 -2
  283. package/src/backend/tests/data.ts +74 -4
  284. package/src/backend/tests/router.ts +101 -36
  285. package/src/backend/tests/suggest-test-history-edit.spec.ts +20 -0
  286. package/src/backend/tests/suggest-test-history-edit.ts +52 -0
  287. package/src/backend/tests/test-edit-source.spec.ts +61 -0
  288. package/src/backend/tests/test-edit-source.ts +34 -0
  289. package/src/backend/tests/test-history-edit-proposals.ts +69 -0
  290. package/src/backend/tests/test-history-overrides.spec.ts +24 -0
  291. package/src/backend/tests/test-selection.ts +27 -0
  292. package/src/lib/api-telescope/client.ts +25 -0
  293. package/src/lib/api-telescope/source-selection.spec.ts +44 -0
  294. package/src/lib/api-telescope/source-selection.ts +28 -0
  295. package/src/lib/api-telescope/types.ts +28 -0
  296. package/src/lib/components/Modal.svelte +1 -1
  297. package/src/lib/components/Tab.svelte +10 -12
  298. package/src/lib/edit/edit-workspace-context.ts +29 -0
  299. package/src/lib/edit/test-ai-edit.spec.ts +31 -0
  300. package/src/lib/edit/test-ai-edit.ts +52 -0
  301. package/src/lib/monaco/bosun-theme.ts +6 -83
  302. package/src/lib/monaco/editor-appearance.spec.ts +84 -0
  303. package/src/lib/monaco/editor-appearance.ts +154 -0
  304. package/src/lib/monaco/editor-decorations.spec.ts +91 -0
  305. package/src/lib/monaco/editor-decorations.ts +133 -0
  306. package/src/lib/tests/assertion-types.ts +74 -0
  307. package/build/client/_app/immutable/assets/0.Rrc0O--C.css +0 -1
  308. package/build/client/_app/immutable/assets/0.Rrc0O--C.css.br +0 -0
  309. package/build/client/_app/immutable/assets/0.Rrc0O--C.css.gz +0 -0
  310. package/build/client/_app/immutable/assets/2.DtxQDOXx.css.br +0 -0
  311. package/build/client/_app/immutable/assets/2.DtxQDOXx.css.gz +0 -0
  312. package/build/client/_app/immutable/chunks/B1HdnQRQ.js +0 -1
  313. package/build/client/_app/immutable/chunks/B1HdnQRQ.js.br +0 -0
  314. package/build/client/_app/immutable/chunks/B1HdnQRQ.js.gz +0 -0
  315. package/build/client/_app/immutable/chunks/B5zf3x62.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/B5zf3x62.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/BHHfrjbV.js.br +0 -2
  318. package/build/client/_app/immutable/chunks/BHHfrjbV.js.gz +0 -0
  319. package/build/client/_app/immutable/chunks/BU7aeYn4.js +0 -1
  320. package/build/client/_app/immutable/chunks/BU7aeYn4.js.br +0 -0
  321. package/build/client/_app/immutable/chunks/BU7aeYn4.js.gz +0 -0
  322. package/build/client/_app/immutable/chunks/BbGYcfPY.js +0 -3
  323. package/build/client/_app/immutable/chunks/BbGYcfPY.js.br +0 -0
  324. package/build/client/_app/immutable/chunks/BbGYcfPY.js.gz +0 -0
  325. package/build/client/_app/immutable/chunks/Bmd5zhWC.js.br +0 -0
  326. package/build/client/_app/immutable/chunks/Bmd5zhWC.js.gz +0 -0
  327. package/build/client/_app/immutable/chunks/BnqH7p3U.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/BnqH7p3U.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/Bog028VR.js +0 -1
  330. package/build/client/_app/immutable/chunks/Bog028VR.js.br +0 -0
  331. package/build/client/_app/immutable/chunks/Bog028VR.js.gz +0 -0
  332. package/build/client/_app/immutable/chunks/Bv1mNXs0.js.br +0 -0
  333. package/build/client/_app/immutable/chunks/Bv1mNXs0.js.gz +0 -0
  334. package/build/client/_app/immutable/chunks/BvjXTrOz.js +0 -1
  335. package/build/client/_app/immutable/chunks/BvjXTrOz.js.br +0 -0
  336. package/build/client/_app/immutable/chunks/BvjXTrOz.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/C1R-s4aD.js +0 -1
  338. package/build/client/_app/immutable/chunks/C1R-s4aD.js.br +0 -0
  339. package/build/client/_app/immutable/chunks/C1R-s4aD.js.gz +0 -0
  340. package/build/client/_app/immutable/chunks/CC1OcqhR.js +0 -1
  341. package/build/client/_app/immutable/chunks/CC1OcqhR.js.br +0 -0
  342. package/build/client/_app/immutable/chunks/CC1OcqhR.js.gz +0 -0
  343. package/build/client/_app/immutable/chunks/CEHsomMo.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/CJcZ2GVC.js.br +0 -0
  345. package/build/client/_app/immutable/chunks/CJcZ2GVC.js.gz +0 -0
  346. package/build/client/_app/immutable/chunks/CN555stc.js +0 -2
  347. package/build/client/_app/immutable/chunks/CN555stc.js.br +0 -0
  348. package/build/client/_app/immutable/chunks/CN555stc.js.gz +0 -0
  349. package/build/client/_app/immutable/chunks/CQg2Mme0.js +0 -9
  350. package/build/client/_app/immutable/chunks/CQg2Mme0.js.br +0 -0
  351. package/build/client/_app/immutable/chunks/CQg2Mme0.js.gz +0 -0
  352. package/build/client/_app/immutable/chunks/Cp_st-64.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/Cp_st-64.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/D8mA-uZ4.js.br +0 -0
  355. package/build/client/_app/immutable/chunks/D8mA-uZ4.js.gz +0 -0
  356. package/build/client/_app/immutable/chunks/DCXjBDmY.js.br +0 -0
  357. package/build/client/_app/immutable/chunks/DCXjBDmY.js.gz +0 -0
  358. package/build/client/_app/immutable/chunks/DSLyVE1P.js +0 -1
  359. package/build/client/_app/immutable/chunks/DSLyVE1P.js.br +0 -0
  360. package/build/client/_app/immutable/chunks/DSLyVE1P.js.gz +0 -0
  361. package/build/client/_app/immutable/chunks/Ddv5LgEc.js.br +0 -0
  362. package/build/client/_app/immutable/chunks/Ddv5LgEc.js.gz +0 -0
  363. package/build/client/_app/immutable/chunks/DfcDjAv-.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/DfcDjAv-.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/Dg0A8wPA.js +0 -1
  366. package/build/client/_app/immutable/chunks/Dg0A8wPA.js.br +0 -0
  367. package/build/client/_app/immutable/chunks/Dg0A8wPA.js.gz +0 -0
  368. package/build/client/_app/immutable/chunks/Dm49pcMm.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/Dm49pcMm.js.gz +0 -0
  370. package/build/client/_app/immutable/chunks/DneQQ7D5.js.br +0 -0
  371. package/build/client/_app/immutable/chunks/DneQQ7D5.js.gz +0 -0
  372. package/build/client/_app/immutable/chunks/DoD3q5w5.js.br +0 -0
  373. package/build/client/_app/immutable/chunks/DoD3q5w5.js.gz +0 -0
  374. package/build/client/_app/immutable/chunks/DtXXy94i.js.br +0 -0
  375. package/build/client/_app/immutable/chunks/DtXXy94i.js.gz +0 -0
  376. package/build/client/_app/immutable/chunks/Dy2CFyD6.js.br +0 -0
  377. package/build/client/_app/immutable/chunks/Dy2CFyD6.js.gz +0 -0
  378. package/build/client/_app/immutable/chunks/DyBwTDJp.js.br +0 -0
  379. package/build/client/_app/immutable/chunks/DyBwTDJp.js.gz +0 -0
  380. package/build/client/_app/immutable/chunks/ILTCveYH.js +0 -1
  381. package/build/client/_app/immutable/chunks/ILTCveYH.js.br +0 -0
  382. package/build/client/_app/immutable/chunks/ILTCveYH.js.gz +0 -0
  383. package/build/client/_app/immutable/chunks/JcG4w2gF.js.br +0 -0
  384. package/build/client/_app/immutable/chunks/JcG4w2gF.js.gz +0 -0
  385. package/build/client/_app/immutable/chunks/UqjCSZmA.js.br +0 -0
  386. package/build/client/_app/immutable/chunks/UqjCSZmA.js.gz +0 -0
  387. package/build/client/_app/immutable/chunks/_YcrHZ6P.js +0 -1
  388. package/build/client/_app/immutable/chunks/_YcrHZ6P.js.br +0 -2
  389. package/build/client/_app/immutable/chunks/_YcrHZ6P.js.gz +0 -0
  390. package/build/client/_app/immutable/chunks/i6ygh6h8.js +0 -1
  391. package/build/client/_app/immutable/chunks/i6ygh6h8.js.br +0 -2
  392. package/build/client/_app/immutable/chunks/i6ygh6h8.js.gz +0 -0
  393. package/build/client/_app/immutable/chunks/oRi68ch3.js +0 -1
  394. package/build/client/_app/immutable/chunks/oRi68ch3.js.br +0 -0
  395. package/build/client/_app/immutable/chunks/oRi68ch3.js.gz +0 -0
  396. package/build/client/_app/immutable/chunks/pPpIn6tB.js.br +0 -0
  397. package/build/client/_app/immutable/chunks/pPpIn6tB.js.gz +0 -0
  398. package/build/client/_app/immutable/chunks/r0sHOWrM.js.br +0 -0
  399. package/build/client/_app/immutable/chunks/r0sHOWrM.js.gz +0 -0
  400. package/build/client/_app/immutable/chunks/wcTQUnZO.js.br +0 -0
  401. package/build/client/_app/immutable/chunks/wcTQUnZO.js.gz +0 -0
  402. package/build/client/_app/immutable/entry/app.DdO0gkPg.js +0 -2
  403. package/build/client/_app/immutable/entry/app.DdO0gkPg.js.br +0 -0
  404. package/build/client/_app/immutable/entry/app.DdO0gkPg.js.gz +0 -0
  405. package/build/client/_app/immutable/entry/start.eAjDq0c9.js +0 -1
  406. package/build/client/_app/immutable/entry/start.eAjDq0c9.js.br +0 -2
  407. package/build/client/_app/immutable/entry/start.eAjDq0c9.js.gz +0 -0
  408. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.br +0 -0
  409. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.gz +0 -0
  410. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js +0 -1
  411. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.br +0 -0
  412. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.gz +0 -0
  413. package/build/client/_app/immutable/nodes/10.dm2dgy31.js +0 -13
  414. package/build/client/_app/immutable/nodes/10.dm2dgy31.js.br +0 -0
  415. package/build/client/_app/immutable/nodes/10.dm2dgy31.js.gz +0 -0
  416. package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.br +0 -0
  417. package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.gz +0 -0
  418. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js +0 -3
  419. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.br +0 -0
  420. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.gz +0 -0
  421. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js +0 -11
  422. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.br +0 -0
  423. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.gz +0 -0
  424. package/build/client/_app/immutable/nodes/2.DesR2keg.js +0 -35
  425. package/build/client/_app/immutable/nodes/2.DesR2keg.js.br +0 -0
  426. package/build/client/_app/immutable/nodes/2.DesR2keg.js.gz +0 -0
  427. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js +0 -1
  428. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.br +0 -0
  429. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.gz +0 -0
  430. package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.br +0 -0
  431. package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.gz +0 -0
  432. package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.br +0 -0
  433. package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.gz +0 -0
  434. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.br +0 -0
  435. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.gz +0 -0
  436. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js +0 -2
  437. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.br +0 -0
  438. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.gz +0 -0
  439. package/build/client/_app/immutable/nodes/9.DVspuDYY.js.br +0 -0
  440. package/build/client/_app/immutable/nodes/9.DVspuDYY.js.gz +0 -0
  441. package/build/server/chunks/0-D_duQDWy.js +0 -9
  442. package/build/server/chunks/0-D_duQDWy.js.map +0 -1
  443. package/build/server/chunks/1-C0HdTvXW.js +0 -9
  444. package/build/server/chunks/10-DcfhCR4R.js +0 -9
  445. package/build/server/chunks/10-DcfhCR4R.js.map +0 -1
  446. package/build/server/chunks/15-BQcb9C_y.js +0 -9
  447. package/build/server/chunks/17-DuVCTioj.js +0 -9
  448. package/build/server/chunks/17-DuVCTioj.js.map +0 -1
  449. package/build/server/chunks/18-CT0VFW_p.js +0 -9
  450. package/build/server/chunks/18-CT0VFW_p.js.map +0 -1
  451. package/build/server/chunks/2-DgTzKQAP.js +0 -9
  452. package/build/server/chunks/2-DgTzKQAP.js.map +0 -1
  453. package/build/server/chunks/3-eQMSMzXP.js +0 -9
  454. package/build/server/chunks/3-eQMSMzXP.js.map +0 -1
  455. package/build/server/chunks/4-OaAJtDqP.js +0 -9
  456. package/build/server/chunks/4-OaAJtDqP.js.map +0 -1
  457. package/build/server/chunks/5-CBdMutbv.js +0 -9
  458. package/build/server/chunks/6-FoEi7ggm.js +0 -9
  459. package/build/server/chunks/8-B44yRkfX.js +0 -9
  460. package/build/server/chunks/8-B44yRkfX.js.map +0 -1
  461. package/build/server/chunks/9-eUjFpHzI.js +0 -9
  462. package/build/server/chunks/9-eUjFpHzI.js.map +0 -1
  463. package/build/server/chunks/ChatStepTrace-BivoNYOY.js.map +0 -1
  464. package/build/server/chunks/Dropdown-DnARl86Q.js.map +0 -1
  465. package/build/server/chunks/Tab-CUkyLqbN.js.map +0 -1
  466. package/build/server/chunks/_layout.svelte-B88WMyk0.js.map +0 -1
  467. package/build/server/chunks/_layout.svelte-wi6o5Ecu.js.map +0 -1
  468. package/build/server/chunks/_page.svelte-57pyhszV.js.map +0 -1
  469. package/build/server/chunks/_page.svelte-BSVJ2d2G.js.map +0 -1
  470. package/build/server/chunks/_page.svelte-CeS_21Ho.js.map +0 -1
  471. package/build/server/chunks/_page.svelte-DhFNFMnl.js.map +0 -1
  472. package/build/server/chunks/error.svelte-DmKKN1RU.js +0 -15
  473. package/build/server/chunks/index-LMsd1ih2.js.map +0 -1
  474. package/build/server/chunks/index-server-BRr5mZEq.js.map +0 -1
  475. package/build/server/chunks/log-content.svelte-CfQzj-v_.js +0 -20
  476. package/build/server/chunks/log-content.svelte-CfQzj-v_.js.map +0 -1
  477. package/build/server/chunks/root-4q2Pr7ck.js.map +0 -1
  478. package/build/server/chunks/source-selection-CcN1cgXc.js.map +0 -1
  479. /package/build/client/_app/immutable/assets/{ReadOnlyMonacoDiff.iiWNRlR-.css → Modal.iiWNRlR-.css} +0 -0
  480. /package/build/client/_app/immutable/assets/{ReadOnlyMonacoDiff.iiWNRlR-.css.br → Modal.iiWNRlR-.css.br} +0 -0
  481. /package/build/client/_app/immutable/assets/{ReadOnlyMonacoDiff.iiWNRlR-.css.gz → Modal.iiWNRlR-.css.gz} +0 -0
@@ -0,0 +1,69 @@
1
+ import { randomUUID } from 'node:crypto'
2
+
3
+ export interface TestHistoryEditProposal {
4
+ id: string
5
+ agentId: string
6
+ region: string | null
7
+ testId: string
8
+ step: string
9
+ originalConversation: string
10
+ suggestedConversation: string
11
+ expectedOutput: string
12
+ createdAt: number
13
+ }
14
+
15
+ export interface TestHistoryEditSourceGuard {
16
+ suiteKey: string
17
+ allowedTestFingerprints: string[]
18
+ allowedPromptContents: string[]
19
+ }
20
+
21
+ type StoredTestHistoryEditProposal = TestHistoryEditProposal & {
22
+ sourceGuard: TestHistoryEditSourceGuard
23
+ }
24
+
25
+ const proposals = new Map<string, StoredTestHistoryEditProposal>()
26
+ const PROPOSAL_TTL_MS = 12 * 60 * 60 * 1000
27
+
28
+ export function createTestHistoryEditProposal(
29
+ proposal: Omit<TestHistoryEditProposal, 'id' | 'createdAt'> & {
30
+ sourceGuard: TestHistoryEditSourceGuard
31
+ }
32
+ ): TestHistoryEditProposal {
33
+ removeExpiredTestHistoryEditProposals()
34
+ const stored = { ...proposal, id: randomUUID(), createdAt: Date.now() }
35
+ proposals.set(stored.id, stored)
36
+ return publicProposal(stored)
37
+ }
38
+
39
+ export function getTestHistoryEditProposalForAcceptance(
40
+ id: string
41
+ ): StoredTestHistoryEditProposal | null {
42
+ removeExpiredTestHistoryEditProposals()
43
+ const proposal = proposals.get(id)
44
+ return proposal
45
+ ? {
46
+ ...proposal,
47
+ sourceGuard: {
48
+ suiteKey: proposal.sourceGuard.suiteKey,
49
+ allowedTestFingerprints: [...proposal.sourceGuard.allowedTestFingerprints],
50
+ allowedPromptContents: [...proposal.sourceGuard.allowedPromptContents]
51
+ }
52
+ }
53
+ : null
54
+ }
55
+
56
+ export function deleteTestHistoryEditProposal(id: string): boolean {
57
+ return proposals.delete(id)
58
+ }
59
+
60
+ function removeExpiredTestHistoryEditProposals(now = Date.now()) {
61
+ for (const [id, proposal] of proposals) {
62
+ if (proposal.createdAt + PROPOSAL_TTL_MS <= now) proposals.delete(id)
63
+ }
64
+ }
65
+
66
+ function publicProposal(proposal: StoredTestHistoryEditProposal): TestHistoryEditProposal {
67
+ const { sourceGuard: _sourceGuard, ...result } = proposal
68
+ return { ...result }
69
+ }
@@ -0,0 +1,24 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { applyTestHistoryOverrides } from './academy'
4
+
5
+ describe('applyTestHistoryOverrides', () => {
6
+ it('changes only the targeted test in memory', () => {
7
+ const first = { id: 'first', conversation: 'User: old', expected_output: 'Expected one' }
8
+ const second = {
9
+ id: 'second',
10
+ conversation: 'User: untouched',
11
+ expected_output: 'Expected two'
12
+ }
13
+
14
+ const result = applyTestHistoryOverrides([first, second], {
15
+ first: { conversation: 'User: proposed' }
16
+ })
17
+
18
+ expect(result).toEqual([
19
+ { id: 'first', conversation: 'User: proposed', expected_output: 'Expected one' },
20
+ second
21
+ ])
22
+ expect(first.conversation).toBe('User: old')
23
+ })
24
+ })
@@ -0,0 +1,27 @@
1
+ import { getProjectBosunApi } from '../lib/project-api'
2
+
3
+ export interface SuiteSelection {
4
+ suiteKey: string
5
+ agentId: string
6
+ region?: string
7
+ }
8
+
9
+ export async function resolveSuiteSelection(
10
+ agentId: string,
11
+ region?: string | null
12
+ ): Promise<SuiteSelection> {
13
+ const bosunApi = await getProjectBosunApi()
14
+ const meta = bosunApi ? await bosunApi.getAgentMeta(agentId) : null
15
+ if (meta?.testScope !== 'region') return { suiteKey: agentId, agentId }
16
+
17
+ if (!bosunApi) {
18
+ throw new Error(`Project does not export bosunApi, cannot resolve suite for '${agentId}'.`)
19
+ }
20
+
21
+ const resolved = await bosunApi.resolveTestSuite({ agentId, region })
22
+ return {
23
+ suiteKey: resolved.suiteKey,
24
+ agentId,
25
+ region: resolved.resolvedRegion ?? undefined
26
+ }
27
+ }
@@ -80,6 +80,19 @@ export class TelescopeClient {
80
80
  searchParams.append('lastConversationId', params.lastConversationId)
81
81
  if (params.phoneNumber) searchParams.append('phoneNumber', params.phoneNumber)
82
82
  if (params.agentId) searchParams.append('agentId', params.agentId)
83
+ if (params.analyticsFilters?.length) {
84
+ searchParams.append(
85
+ 'filters',
86
+ JSON.stringify(
87
+ params.analyticsFilters.map((filter) => ({
88
+ key: filter.key,
89
+ type: filter.type,
90
+ operator: 'in',
91
+ values: filter.values
92
+ }))
93
+ )
94
+ )
95
+ }
83
96
 
84
97
  const res = await this.fetch('GET', `/conversations?${searchParams.toString()}`)
85
98
  if (!res.ok) {
@@ -100,6 +113,18 @@ export class TelescopeClient {
100
113
  return types.PaginatedConversationsResponseSchema.parse(json)
101
114
  }
102
115
 
116
+ public async getAnalyticsFields(agentId?: string): Promise<types.AnalyticsFieldsResponse> {
117
+ const searchParams = new URLSearchParams()
118
+ if (agentId) searchParams.set('agentId', agentId)
119
+ const query = searchParams.toString()
120
+
121
+ return this.fetch(
122
+ 'GET',
123
+ `/analytics/fields${query ? `?${query}` : ''}`,
124
+ types.AnalyticsFieldsResponseSchema
125
+ )
126
+ }
127
+
103
128
  /**
104
129
  * Get a single conversation by ID
105
130
  * @param conversationId the conversation ID
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import {
3
+ getTelescopeSourceIdFromUrl,
4
+ resolveTelescopeSourceId,
5
+ withTelescopeSourceId
6
+ } from './source-selection'
7
+
8
+ const sources = [{ id: 'prod' }, { id: 'staging' }]
9
+
10
+ describe('Telescope source URLs', () => {
11
+ it('uses a valid source from the URL before the persisted source', () => {
12
+ expect(resolveTelescopeSourceId(sources, 'staging', 'prod')).toBe('staging')
13
+ })
14
+
15
+ it('keeps links without a source on the persisted source', () => {
16
+ expect(resolveTelescopeSourceId(sources, null, 'staging')).toBe('staging')
17
+ })
18
+
19
+ it('uses the first source when a link and persisted source have no valid source', () => {
20
+ expect(resolveTelescopeSourceId(sources, null, null)).toBe('prod')
21
+ expect(resolveTelescopeSourceId(sources, 'unknown', 'missing')).toBe('prod')
22
+ })
23
+
24
+ it('reads only non-empty source IDs from URLs', () => {
25
+ expect(getTelescopeSourceIdFromUrl(new URL('http://localhost/view?source=staging'))).toBe(
26
+ 'staging'
27
+ )
28
+ expect(getTelescopeSourceIdFromUrl(new URL('http://localhost/view?source=%20'))).toBeNull()
29
+ })
30
+
31
+ it('adds the source without changing the trace path or other query parameters', () => {
32
+ const original = new URL(
33
+ 'http://localhost/view/conversations/call-1/traces?agent=booking&region=uk'
34
+ )
35
+ const result = withTelescopeSourceId(original, 'staging/eu')
36
+
37
+ expect(result.pathname).toBe('/view/conversations/call-1/traces')
38
+ expect(result.searchParams.get('agent')).toBe('booking')
39
+ expect(result.searchParams.get('region')).toBe('uk')
40
+ expect(result.searchParams.get('source')).toBe('staging/eu')
41
+ expect(result.search).toContain('source=staging%2Feu')
42
+ expect(original.searchParams.has('source')).toBe(false)
43
+ })
44
+ })
@@ -1,4 +1,32 @@
1
1
  export const TELESCOPE_SOURCE_STORAGE_KEY = 'bosun.traces.telescopeSourceId'
2
+ export const TELESCOPE_SOURCE_QUERY_PARAM = 'source'
3
+
4
+ type TelescopeSource = { id: string }
5
+
6
+ export function getTelescopeSourceIdFromUrl(url: URL): string | null {
7
+ const sourceId = url.searchParams.get(TELESCOPE_SOURCE_QUERY_PARAM)?.trim()
8
+ return sourceId || null
9
+ }
10
+
11
+ export function resolveTelescopeSourceId(
12
+ sources: readonly TelescopeSource[],
13
+ requestedSourceId: string | null,
14
+ persistedSourceId: string | null
15
+ ): string | null {
16
+ const requested = requestedSourceId?.trim()
17
+ if (requested && sources.some((source) => source.id === requested)) return requested
18
+
19
+ const persisted = persistedSourceId?.trim()
20
+ if (persisted && sources.some((source) => source.id === persisted)) return persisted
21
+
22
+ return sources[0]?.id ?? null
23
+ }
24
+
25
+ export function withTelescopeSourceId(url: URL, sourceId: string): URL {
26
+ const nextUrl = new URL(url)
27
+ nextUrl.searchParams.set(TELESCOPE_SOURCE_QUERY_PARAM, sourceId)
28
+ return nextUrl
29
+ }
2
30
 
3
31
  export function getPersistedTelescopeSourceId(): string | null {
4
32
  if (typeof window === 'undefined') return null
@@ -30,9 +30,37 @@ export const PaginatedConversationsResponseSchema = z.object({
30
30
 
31
31
  export type PaginatedConversationsResponse = z.infer<typeof PaginatedConversationsResponseSchema>
32
32
 
33
+ export const AnalyticsScalarSchema = z.union([z.boolean(), z.number(), z.string()])
34
+ export type AnalyticsScalar = z.infer<typeof AnalyticsScalarSchema>
35
+
36
+ export const AnalyticsFieldSchema = z.object({
37
+ key: z.string(),
38
+ type: z.enum(['boolean', 'number', 'string']),
39
+ variantCount: z.number(),
40
+ values: z.array(
41
+ z.object({
42
+ value: AnalyticsScalarSchema,
43
+ count: z.number()
44
+ })
45
+ )
46
+ })
47
+ export type AnalyticsField = z.infer<typeof AnalyticsFieldSchema>
48
+
49
+ export const AnalyticsFieldsResponseSchema = z.object({
50
+ items: z.array(AnalyticsFieldSchema)
51
+ })
52
+ export type AnalyticsFieldsResponse = z.infer<typeof AnalyticsFieldsResponseSchema>
53
+
54
+ export type AnalyticsConversationFilter = {
55
+ key: string
56
+ type: AnalyticsField['type']
57
+ values: AnalyticsScalar[]
58
+ }
59
+
33
60
  export type GetConversationsRequest = {
34
61
  phoneNumber?: string
35
62
  agentId?: string
63
+ analyticsFilters?: AnalyticsConversationFilter[]
36
64
  limit?: number
37
65
  lastConversationId?: string
38
66
  }
@@ -47,7 +47,7 @@
47
47
  </div>
48
48
  {#if underlayOpen && underlay}
49
49
  <div
50
- class="modal-underlay absolute left-0 right-0 top-full -z-10 overflow-hidden rounded-b-lg border border-t-0 border-rc-gray-600 bg-rc-gray-800 px-4 py-2.5 shadow-xl"
50
+ class="modal-underlay absolute left-0 right-0 top-full -z-10 -mt-2 overflow-hidden rounded-b-lg border border-t-0 border-rc-gray-600 bg-rc-gray-800 px-4 pb-1 pt-3 shadow-xl"
51
51
  >
52
52
  {@render underlay()}
53
53
  </div>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { getContext, onMount, onDestroy } from 'svelte'
2
+ import { getContext, onMount } from 'svelte'
3
3
  import type { Snippet } from 'svelte'
4
4
  import type { Readable } from 'svelte/store'
5
5
 
@@ -22,8 +22,8 @@
22
22
  }: Props = $props()
23
23
 
24
24
  const uid = Math.random().toString(36).slice(2, 8)
25
- if (!id) id = `tab-${uid}`
26
- if (!value) value = id
25
+ const tabId = $derived(id || `tab-${uid}`)
26
+ const tabValue = $derived(value || tabId)
27
27
 
28
28
  let btnEl: HTMLButtonElement | null = $state(null)
29
29
 
@@ -35,19 +35,17 @@
35
35
  }>('rc-tabs')
36
36
 
37
37
  const valueStore = tabs.value
38
- let selected = $derived($valueStore === value)
38
+ let selected = $derived($valueStore === tabValue)
39
39
 
40
40
  onMount(() => {
41
- tabs?.register({ id, value, getEl: () => btnEl })
42
- })
43
-
44
- onDestroy(() => {
45
- tabs?.unregister(id)
41
+ const registeredId = tabId
42
+ tabs?.register({ id: registeredId, value: tabValue, getEl: () => btnEl })
43
+ return () => tabs?.unregister(registeredId)
46
44
  })
47
45
 
48
46
  function handleClick(e: MouseEvent) {
49
47
  if (disabled) return
50
- tabs?.requestSelect(value)
48
+ tabs?.requestSelect(tabValue)
51
49
  onclick?.(e)
52
50
  }
53
51
  </script>
@@ -59,9 +57,9 @@
59
57
  class:active={selected}
60
58
  {disabled}
61
59
  role="tab"
62
- {id}
60
+ id={tabId}
63
61
  aria-selected={selected}
64
- aria-controls={`panel-${value}`}
62
+ aria-controls={`panel-${tabValue}`}
65
63
  tabindex={selected ? 0 : -1}
66
64
  onclick={handleClick}
67
65
  >
@@ -13,6 +13,32 @@ export interface PendingPromptEdit {
13
13
  createdAt: number
14
14
  }
15
15
 
16
+ export interface PendingTestHistoryEdit {
17
+ id: string
18
+ agentId: string
19
+ region: string | null
20
+ testId: string
21
+ step: string
22
+ originalConversation: string
23
+ suggestedConversation: string
24
+ expectedOutput: string
25
+ createdAt: number
26
+ }
27
+
28
+ export interface TestAiEditTarget {
29
+ kind: 'test-history' | 'test-fix'
30
+ testId: string
31
+ step: string
32
+ prompt: string
33
+ basePrompt: string
34
+ conversation: string
35
+ expectedOutput: string
36
+ context: string
37
+ assertionLabel: string
38
+ assertionValue: string
39
+ currentIncorrectOutcome?: string
40
+ }
41
+
16
42
  export interface EditWorkspaceState {
17
43
  agentId: string
18
44
  region: string | null
@@ -26,6 +52,7 @@ export interface EditWorkspaceState {
26
52
  currentStep: StepDef | null
27
53
  promptDrafts: Record<string, string>
28
54
  promptEdits: Record<string, PendingPromptEdit>
55
+ testHistoryEdits: Record<string, PendingTestHistoryEdit>
29
56
  context: Record<string, any> | null
30
57
  promptContext: Record<string, any> | null
31
58
  agentStates: AgentSateHeader[]
@@ -48,6 +75,7 @@ export interface EditWorkspaceActions {
48
75
  openContextPopover: () => void
49
76
  closeContextPopover: () => void
50
77
  toggleContextPopover: () => void
78
+ openAiEdit: (request: string, target?: TestAiEditTarget) => void
51
79
 
52
80
  // WS actions
53
81
  sendAppEvent: (event: AppEvent) => void
@@ -55,6 +83,7 @@ export interface EditWorkspaceActions {
55
83
  selectState: (stateId: string | null) => void
56
84
  flushPromptSave: () => Promise<void>
57
85
  getPromptOverrides: () => Record<string, string>
86
+ getTestHistoryOverrides: () => Record<string, { conversation: string }>
58
87
  getActivePromptEditId: () => string | null
59
88
  hangup: () => void
60
89
  }
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { buildPromptFixRequest, buildTestFixRequest } from './test-ai-edit'
4
+
5
+ const input = {
6
+ context: '{}',
7
+ conversation: 'User: corrected',
8
+ expectedOutput: 'Agent: expected',
9
+ assertionLabel: 'LLM',
10
+ assertionValue: 'Matches the expected behaviour',
11
+ currentIncorrectOutcome: 'Agent: wrong'
12
+ }
13
+
14
+ describe('buildPromptFixRequest', () => {
15
+ it('rebuilds the standard request with the corrected conversation', () => {
16
+ const entered = buildTestFixRequest({ ...input, conversation: 'User: original' })
17
+
18
+ const result = buildPromptFixRequest(entered, input, 'User: original')
19
+
20
+ expect(result).toContain('Conversation:\nUser: corrected')
21
+ expect(result).not.toContain('Conversation:\nUser: original')
22
+ })
23
+
24
+ it('retains a customized request and appends the authoritative corrected test', () => {
25
+ const result = buildPromptFixRequest('Keep this custom instruction.', input, 'User: original')
26
+
27
+ expect(result).toContain('Keep this custom instruction.')
28
+ expect(result).toContain('Use the following test case as authoritative')
29
+ expect(result).toContain('Conversation:\nUser: corrected')
30
+ })
31
+ })
@@ -0,0 +1,52 @@
1
+ export interface TestFixRequestInput {
2
+ context: string
3
+ conversation: string
4
+ expectedOutput: string
5
+ assertionLabel: string
6
+ assertionValue: string
7
+ currentIncorrectOutcome: string
8
+ }
9
+
10
+ export const UPDATE_HISTORY_REQUEST = `Update the conversation history so it reflects behaviour that is valid under the current prompt. Preserve the test's intent and expected outcome, and make only the smallest necessary changes. Possible roles: "Agent", "User", "System"`
11
+
12
+ export function formatTestFixAssertion(label: string, value: string): string {
13
+ const normalizedLabel = label.trim() === 'LLM' ? '' : label.trim()
14
+ return [normalizedLabel, value.trim()].filter(Boolean).join(' ')
15
+ }
16
+
17
+ export function buildTestFixRequest(input: TestFixRequestInput): string {
18
+ const assertion = formatTestFixAssertion(input.assertionLabel, input.assertionValue)
19
+
20
+ return `You will be given the context, the conversation and the desired output and assertion about it. First, find why the prompt is not producing the correct result. It's usually one concrete instruction within the relevant section, or a contradiction. Then, change the prompt minimally so this will work, but keeping the prompt clean and comprehensive is more important. Try to provide as general solution as possible. Try to change just one part of the prompt, not multiple parts. Avoid adding exceptions and overrides. Avoid duplicating information that already exists in the prompt.
21
+
22
+ Context:
23
+ ${input.context.trim()}
24
+
25
+ Conversation:
26
+ ${input.conversation.trim()}
27
+
28
+ Desired outcome:
29
+ ${input.expectedOutput.trim()}
30
+
31
+ Assertion about outcome:
32
+ ${assertion}
33
+
34
+ Current incorrect outcome:
35
+ ${input.currentIncorrectOutcome.trim()}`
36
+ }
37
+
38
+ export function buildPromptFixRequest(
39
+ enteredRequest: string,
40
+ input: TestFixRequestInput,
41
+ originalConversation: string
42
+ ): string {
43
+ const canonicalOriginal = buildTestFixRequest({ ...input, conversation: originalConversation })
44
+ const canonicalCorrected = buildTestFixRequest(input)
45
+ if (enteredRequest.trim() === canonicalOriginal.trim()) return canonicalCorrected
46
+
47
+ return `${enteredRequest.trim()}
48
+
49
+ The conversation history has now been checked and may have been corrected. Use the following test case as authoritative instead of any earlier version included above:
50
+
51
+ ${canonicalCorrected}`
52
+ }
@@ -1,88 +1,5 @@
1
1
  import type * as Monaco from 'monaco-editor'
2
2
 
3
- export interface PromptDecorations {
4
- update: () => void
5
- dispose: () => void
6
- }
7
-
8
- export function createPromptDecorations(
9
- monaco: typeof Monaco,
10
- editor: Monaco.editor.IStandaloneCodeEditor
11
- ) {
12
- const collection = editor.createDecorationsCollection()
13
-
14
- function update() {
15
- const model = editor.getModel()
16
- if (!model) return
17
-
18
- const decorations: Monaco.editor.IModelDeltaDecoration[] = []
19
- const lineCount = model.getLineCount()
20
-
21
- for (let lineNumber = 1; lineNumber <= lineCount; lineNumber++) {
22
- const lineText = model.getLineContent(lineNumber)
23
-
24
- // Headings
25
- const match = /^(#+)\s/.exec(lineText)
26
- if (match) {
27
- const level = match[1].length
28
- let cls = 'prompt-heading-3'
29
-
30
- if (level === 1) {
31
- cls = 'prompt-heading-1'
32
- } else if (level === 2) {
33
- cls = 'prompt-heading-2'
34
- }
35
-
36
- decorations.push({
37
- range: new monaco.Range(lineNumber, 1, lineNumber, lineText.length + 1),
38
- options: {
39
- isWholeLine: true,
40
- inlineClassName: cls
41
- }
42
- })
43
- }
44
-
45
- // Symbols '#' and '*'
46
- for (let column = 1; column <= lineText.length; column++) {
47
- const ch = lineText[column - 1]
48
- if (ch === '#' || ch === '*') {
49
- decorations.push({
50
- range: new monaco.Range(lineNumber, column, lineNumber, column + 1),
51
- options: {
52
- inlineClassName: 'prompt-symbol'
53
- }
54
- })
55
- }
56
- }
57
-
58
- // Subnumbers
59
- const subMatch = lineText.match(/^(\s+)(\d+(?:\.\d+)+\.?)(?=[\s)]|$)/)
60
- if (subMatch) {
61
- const leading = subMatch[1]
62
- const numberText = subMatch[2]
63
-
64
- const startColumn = leading.length + 1
65
- const endColumn = startColumn + numberText.length
66
-
67
- decorations.push({
68
- range: new monaco.Range(lineNumber, startColumn, lineNumber, endColumn),
69
- options: {
70
- inlineClassName: 'prompt-subnumber'
71
- }
72
- })
73
- }
74
- }
75
-
76
- collection.set(decorations)
77
- }
78
-
79
- function dispose() {
80
- collection.clear()
81
- }
82
-
83
- return { update, dispose }
84
- }
85
-
86
3
  export const bosunDarkTheme: Monaco.editor.IStandaloneThemeData = {
87
4
  base: 'vs-dark',
88
5
  inherit: true,
@@ -110,6 +27,12 @@ export const bosunDarkTheme: Monaco.editor.IStandaloneThemeData = {
110
27
  'editor.inactiveSelectionBackground': '#4B5563A0',
111
28
  'editor.lineHighlightBackground': '#FFFFFF08',
112
29
  'editorLineNumber.background': '#1D1D1D',
30
+ 'diffEditor.insertedTextBackground': '#00B58A33',
31
+ 'diffEditor.insertedLineBackground': '#00B58A1A',
32
+ 'diffEditor.removedTextBackground': '#FF666633',
33
+ 'diffEditor.removedLineBackground': '#FF66661A',
34
+ 'diffEditor.border': '#373737',
35
+ 'diffEditor.diagonalFill': '#76767633',
113
36
 
114
37
  // Nunjucks tag highlight (DocumentHighlightProvider)
115
38
  'editor.wordHighlightBackground': '#ff480159'
@@ -0,0 +1,84 @@
1
+ import type * as Monaco from 'monaco-editor'
2
+ import { afterEach, describe, expect, it, vi } from 'vitest'
3
+ import {
4
+ EDITOR_FONT_FAMILY,
5
+ EDITOR_FONT_SIZE,
6
+ createPromptWrapController,
7
+ getEditorAppearanceOptions
8
+ } from './editor-appearance'
9
+
10
+ describe('getEditorAppearanceOptions', () => {
11
+ it('keeps prompt appearance in one preset', () => {
12
+ expect(getEditorAppearanceOptions('prompt', { bottomPadding: 56 })).toMatchObject({
13
+ theme: 'bosun-dark',
14
+ fontSize: EDITOR_FONT_SIZE,
15
+ fontFamily: EDITOR_FONT_FAMILY,
16
+ wordWrap: 'bounded',
17
+ wordWrapColumn: 120,
18
+ wrappingStrategy: 'advanced',
19
+ bracketPairColorization: { enabled: true },
20
+ padding: { top: 32, bottom: 56 }
21
+ })
22
+ })
23
+
24
+ it('keeps test-history appearance in one preset', () => {
25
+ expect(getEditorAppearanceOptions('test-history')).toMatchObject({
26
+ fontSize: EDITOR_FONT_SIZE,
27
+ fontFamily: EDITOR_FONT_FAMILY,
28
+ wordWrap: 'bounded',
29
+ wordWrapColumn: 75,
30
+ wrappingStrategy: 'advanced',
31
+ scrollbar: { vertical: 'hidden', horizontal: 'hidden' },
32
+ padding: { top: 4, bottom: 4 }
33
+ })
34
+ expect(getEditorAppearanceOptions('test-history', { bottomPadding: 56 }).padding).toEqual({
35
+ top: 4,
36
+ bottom: 56
37
+ })
38
+ })
39
+
40
+ it('preserves Monaco font defaults for generic diffs', () => {
41
+ const options = getEditorAppearanceOptions('generic')
42
+ expect(options).not.toHaveProperty('fontSize')
43
+ expect(options).not.toHaveProperty('fontFamily')
44
+ })
45
+ })
46
+
47
+ describe('createPromptWrapController', () => {
48
+ afterEach(() => vi.unstubAllGlobals())
49
+
50
+ it('updates and disposes responsive wrapping', () => {
51
+ let frame!: FrameRequestCallback
52
+ let layoutListener!: () => void
53
+ const cancelAnimationFrame = vi.fn()
54
+ vi.stubGlobal('requestAnimationFrame', (callback: FrameRequestCallback) => {
55
+ frame = callback
56
+ return 7
57
+ })
58
+ vi.stubGlobal('cancelAnimationFrame', cancelAnimationFrame)
59
+
60
+ const updateOptions = vi.fn()
61
+ const disposeLayoutListener = vi.fn()
62
+ const editor = {
63
+ getLayoutInfo: () => ({ contentWidth: 724 }),
64
+ getOption: () => ({ typicalHalfwidthCharacterWidth: 7 }),
65
+ updateOptions,
66
+ onDidLayoutChange: (listener: () => void) => {
67
+ layoutListener = listener
68
+ return { dispose: disposeLayoutListener }
69
+ }
70
+ } as unknown as Monaco.editor.IStandaloneCodeEditor
71
+ const monaco = {
72
+ editor: { EditorOption: { fontInfo: 0 } }
73
+ } as unknown as typeof Monaco
74
+
75
+ const controller = createPromptWrapController(editor, monaco)
76
+ expect(frame).toBeTypeOf('function')
77
+ frame(0)
78
+ expect(updateOptions).toHaveBeenCalledWith({ wordWrap: 'bounded', wordWrapColumn: 100 })
79
+ layoutListener()
80
+ controller.dispose()
81
+ expect(disposeLayoutListener).toHaveBeenCalledOnce()
82
+ expect(cancelAnimationFrame).toHaveBeenCalledWith(7)
83
+ })
84
+ })