@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,160 @@
1
+ import OpenAI from 'openai'
2
+
3
+ import { applyV4ADiff } from '../lib/apply-v4a-diff'
4
+ import type { PromptEditProgressPhase } from './prompt-edit-progress'
5
+
6
+ const MODEL = 'gpt-5.4'
7
+ const MAX_PATCH_ROUNDS = 8
8
+
9
+ type ApplyPatchCall = {
10
+ type: 'apply_patch_call'
11
+ call_id: string
12
+ operation: {
13
+ type: 'create_file' | 'update_file' | 'delete_file'
14
+ path: string
15
+ diff?: string
16
+ }
17
+ }
18
+
19
+ export async function suggestFileEdit(input: {
20
+ request: string
21
+ originalContent: string
22
+ virtualPath: string
23
+ instructions: string
24
+ onProgress?: (progress: {
25
+ phase: PromptEditProgressPhase
26
+ activity: number
27
+ summary: string
28
+ }) => void
29
+ }): Promise<string> {
30
+ const apiKey = process.env.OPENAI_API_KEY
31
+ if (!apiKey) throw new Error('OPENAI_API_KEY is not set')
32
+
33
+ const client = new OpenAI({ apiKey })
34
+ let virtualContent = input.originalContent
35
+ let activity = 0
36
+ let modelRound = 0
37
+ let reasoningSummary = ''
38
+ const handleEvent = (event: any) => {
39
+ activity += 1
40
+ if (
41
+ event?.type === 'response.reasoning_summary_text.delta' &&
42
+ typeof event.delta === 'string'
43
+ ) {
44
+ reasoningSummary += event.delta
45
+ }
46
+ input.onProgress?.({
47
+ phase: progressPhase(event, modelRound),
48
+ activity,
49
+ summary: reasoningSummary.trim()
50
+ })
51
+ }
52
+ let response = await createResponse(client, {
53
+ input: input.request,
54
+ instructions: input.instructions,
55
+ onEvent: handleEvent
56
+ })
57
+
58
+ for (let patchRound = 0; patchRound < MAX_PATCH_ROUNDS; patchRound += 1) {
59
+ const patchCalls = (response.output as unknown as ApplyPatchCall[]).filter(
60
+ (item) => item?.type === 'apply_patch_call'
61
+ )
62
+ if (!patchCalls.length) return virtualContent
63
+
64
+ const outputs = patchCalls.map((call) => {
65
+ try {
66
+ virtualContent = applyFileOperation(virtualContent, input.virtualPath, call.operation)
67
+ return {
68
+ type: 'apply_patch_call_output',
69
+ call_id: call.call_id,
70
+ status: 'completed',
71
+ output: `Updated ${input.virtualPath} in memory`
72
+ }
73
+ } catch (error) {
74
+ return {
75
+ type: 'apply_patch_call_output',
76
+ call_id: call.call_id,
77
+ status: 'failed',
78
+ output: error instanceof Error ? error.message : String(error)
79
+ }
80
+ }
81
+ })
82
+
83
+ reasoningSummary = ''
84
+ input.onProgress?.({ phase: 'reviewing', activity, summary: '' })
85
+ modelRound += 1
86
+ response = await createResponse(client, {
87
+ previousResponseId: response.id,
88
+ input: outputs,
89
+ instructions: input.instructions,
90
+ onEvent: handleEvent
91
+ })
92
+ }
93
+
94
+ throw new Error(`The model did not finish editing ${input.virtualPath}`)
95
+ }
96
+
97
+ async function createResponse(
98
+ client: OpenAI,
99
+ input: {
100
+ input: unknown
101
+ instructions: string
102
+ previousResponseId?: string
103
+ onEvent: (event: any) => void
104
+ }
105
+ ): Promise<any> {
106
+ const stream = await (client.responses.create as any)({
107
+ model: MODEL,
108
+ instructions: input.instructions,
109
+ input: input.input,
110
+ ...(input.previousResponseId ? { previous_response_id: input.previousResponseId } : {}),
111
+ tools: [{ type: 'apply_patch' }],
112
+ reasoning: { effort: 'high', summary: 'auto' },
113
+ text: { verbosity: 'low' },
114
+ stream: true
115
+ })
116
+
117
+ let completedResponse: any = null
118
+ for await (const event of stream as AsyncIterable<any>) {
119
+ input.onEvent(event)
120
+ if (event?.type === 'response.completed') completedResponse = event.response
121
+ if (event?.type === 'response.failed') {
122
+ throw new Error(event.response?.error?.message || 'OpenAI failed to suggest edits')
123
+ }
124
+ if (event?.type === 'response.incomplete') {
125
+ throw new Error('OpenAI returned an incomplete edit')
126
+ }
127
+ if (event?.type === 'error') throw new Error(event.message || 'OpenAI streaming failed')
128
+ }
129
+
130
+ if (!completedResponse) throw new Error('OpenAI stream ended before the edit completed')
131
+ return completedResponse
132
+ }
133
+
134
+ function progressPhase(event: any, round: number): PromptEditProgressPhase {
135
+ const eventType = String(event?.type || '')
136
+ const itemType = String(event?.item?.type || '')
137
+ if (eventType.includes('apply_patch') || itemType === 'apply_patch_call') return 'drafting'
138
+ return round > 0 ? 'reviewing' : 'thinking'
139
+ }
140
+
141
+ function applyFileOperation(
142
+ currentContent: string,
143
+ virtualPath: string,
144
+ operation: ApplyPatchCall['operation']
145
+ ): string {
146
+ const normalizedPath = String(operation.path || '')
147
+ .replace(/\\/g, '/')
148
+ .replace(/^\.\//, '')
149
+ .replace(/^\//, '')
150
+ if (normalizedPath !== virtualPath) {
151
+ throw new Error(`Only ${virtualPath} may be edited`)
152
+ }
153
+ if (operation.type !== 'update_file') {
154
+ throw new Error(`${virtualPath} already exists and may only be updated`)
155
+ }
156
+ if (typeof operation.diff !== 'string' || !operation.diff.trim()) {
157
+ throw new Error('Apply Patch returned an empty diff')
158
+ }
159
+ return applyV4ADiff(currentContent, operation.diff)
160
+ }
@@ -1,21 +1,7 @@
1
- import OpenAI from 'openai'
2
-
3
- import { applyV4ADiff } from '../lib/apply-v4a-diff'
4
1
  import type { PromptEditProgressPhase } from './prompt-edit-progress'
2
+ import { suggestFileEdit } from './suggest-file-edit'
5
3
 
6
- const MODEL = 'gpt-5.4'
7
4
  const VIRTUAL_PROMPT_PATH = 'prompt.md'
8
- const MAX_PATCH_ROUNDS = 8
9
-
10
- type ApplyPatchCall = {
11
- type: 'apply_patch_call'
12
- call_id: string
13
- operation: {
14
- type: 'create_file' | 'update_file' | 'delete_file'
15
- path: string
16
- diff?: string
17
- }
18
- }
19
5
 
20
6
  export async function suggestPromptEdit(input: {
21
7
  request: string
@@ -26,73 +12,18 @@ export async function suggestPromptEdit(input: {
26
12
  summary: string
27
13
  }) => void
28
14
  }): Promise<string> {
29
- const apiKey = process.env.OPENAI_API_KEY
30
- if (!apiKey) throw new Error('OPENAI_API_KEY is not set')
31
-
32
- const client = new OpenAI({ apiKey })
33
- let virtualPrompt = input.originalPrompt
34
- let activity = 0
35
- let modelRound = 0
36
- let reasoningSummary = ''
37
- const handleEvent = (event: any) => {
38
- activity += 1
39
- if (
40
- event?.type === 'response.reasoning_summary_text.delta' &&
41
- typeof event.delta === 'string'
42
- ) {
43
- reasoningSummary += event.delta
44
- }
45
- input.onProgress?.({
46
- phase: progressPhase(event, modelRound),
47
- activity,
48
- summary: reasoningSummary.trim()
49
- })
50
- }
51
- let response = await createResponse(client, {
52
- input: buildPrompt(input.request, input.originalPrompt),
53
- onEvent: handleEvent
15
+ return suggestFileEdit({
16
+ request: buildPrompt(input.request, input.originalPrompt),
17
+ originalContent: input.originalPrompt,
18
+ virtualPath: VIRTUAL_PROMPT_PATH,
19
+ instructions:
20
+ 'The original prompt is the existing virtual file prompt.md. Use the Apply Patch tool to make the requested edit to that file. Do not create, delete, or modify any other file.',
21
+ onProgress: input.onProgress
54
22
  })
55
-
56
- for (let patchRound = 0; patchRound < MAX_PATCH_ROUNDS; patchRound += 1) {
57
- const patchCalls = (response.output as unknown as ApplyPatchCall[]).filter(
58
- (item) => item?.type === 'apply_patch_call'
59
- )
60
- if (!patchCalls.length) return virtualPrompt
61
-
62
- const outputs = patchCalls.map((call) => {
63
- try {
64
- virtualPrompt = applyPromptOperation(virtualPrompt, call.operation)
65
- return {
66
- type: 'apply_patch_call_output',
67
- call_id: call.call_id,
68
- status: 'completed',
69
- output: `Updated ${VIRTUAL_PROMPT_PATH} in memory`
70
- }
71
- } catch (error) {
72
- return {
73
- type: 'apply_patch_call_output',
74
- call_id: call.call_id,
75
- status: 'failed',
76
- output: error instanceof Error ? error.message : String(error)
77
- }
78
- }
79
- })
80
-
81
- reasoningSummary = ''
82
- input.onProgress?.({ phase: 'reviewing', activity, summary: '' })
83
- modelRound += 1
84
- response = await createResponse(client, {
85
- previousResponseId: response.id,
86
- input: outputs,
87
- onEvent: handleEvent
88
- })
89
- }
90
-
91
- throw new Error('The model did not finish editing the prompt')
92
23
  }
93
24
 
94
25
  function buildPrompt(request: string, originalPrompt: string): string {
95
- return `The user is asking you to modify an LLM prompt given below. Try and make minimal changes. You are not allowed to change the shape of variables, their names or their set - this is set outside.
26
+ return `The user is asking you to modify an LLM prompt given below. Try and make minimal changes. You are not allowed to change the shape of variables, their names or their set - this is set outside. Note that this is a Nunjucks template and it will be rendered according to context. You can change/append the template logic if necessary.
96
27
 
97
28
  This is their request:
98
29
  ${request}
@@ -101,63 +32,3 @@ This is the original prompt:
101
32
  ${originalPrompt}
102
33
  `
103
34
  }
104
-
105
- async function createResponse(
106
- client: OpenAI,
107
- input: { input: unknown; previousResponseId?: string; onEvent: (event: any) => void }
108
- ): Promise<any> {
109
- const stream = await (client.responses.create as any)({
110
- model: MODEL,
111
- instructions:
112
- 'The original prompt is the existing virtual file prompt.md. Use the Apply Patch tool to make the requested edit to that file. Do not create, delete, or modify any other file.',
113
- input: input.input,
114
- ...(input.previousResponseId ? { previous_response_id: input.previousResponseId } : {}),
115
- tools: [{ type: 'apply_patch' }],
116
- reasoning: { effort: 'xhigh', summary: 'auto' },
117
- text: { verbosity: 'low' },
118
- stream: true
119
- })
120
-
121
- let completedResponse: any = null
122
- for await (const event of stream as AsyncIterable<any>) {
123
- input.onEvent(event)
124
- if (event?.type === 'response.completed') completedResponse = event.response
125
- if (event?.type === 'response.failed') {
126
- throw new Error(event.response?.error?.message || 'OpenAI failed to suggest prompt edits')
127
- }
128
- if (event?.type === 'response.incomplete') {
129
- throw new Error('OpenAI returned an incomplete prompt edit')
130
- }
131
- if (event?.type === 'error') throw new Error(event.message || 'OpenAI streaming failed')
132
- }
133
-
134
- if (!completedResponse) throw new Error('OpenAI stream ended before the prompt edit completed')
135
- return completedResponse
136
- }
137
-
138
- function progressPhase(event: any, round: number): PromptEditProgressPhase {
139
- const eventType = String(event?.type || '')
140
- const itemType = String(event?.item?.type || '')
141
- if (eventType.includes('apply_patch') || itemType === 'apply_patch_call') return 'drafting'
142
- return round > 0 ? 'reviewing' : 'thinking'
143
- }
144
-
145
- function applyPromptOperation(
146
- currentPrompt: string,
147
- operation: ApplyPatchCall['operation']
148
- ): string {
149
- const normalizedPath = String(operation.path || '')
150
- .replace(/\\/g, '/')
151
- .replace(/^\.\//, '')
152
- .replace(/^\//, '')
153
- if (normalizedPath !== VIRTUAL_PROMPT_PATH) {
154
- throw new Error(`Only ${VIRTUAL_PROMPT_PATH} may be edited`)
155
- }
156
- if (operation.type !== 'update_file') {
157
- throw new Error(`${VIRTUAL_PROMPT_PATH} already exists and may only be updated`)
158
- }
159
- if (typeof operation.diff !== 'string' || !operation.diff.trim()) {
160
- throw new Error('Apply Patch returned an empty diff')
161
- }
162
- return applyV4ADiff(currentPrompt, operation.diff)
163
- }
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+
3
+ import { buildTestFixRequest } from '../../lib/edit/test-ai-edit'
4
+ import { suggestTestFix } from './suggest-test-fix'
5
+
6
+ describe('suggestTestFix', () => {
7
+ it('uses the corrected history before suggesting a prompt edit', async () => {
8
+ const originalConversation = 'User: original'
9
+ const correctedConversation = 'User: corrected'
10
+ let finishHistory!: (conversation: string) => void
11
+ const historyResult = new Promise<string>((resolve) => {
12
+ finishHistory = resolve
13
+ })
14
+ const suggestHistory = vi.fn(() => historyResult)
15
+ const suggestPrompt = vi.fn(
16
+ async (_input: { request: string; originalPrompt: string }) => 'Updated prompt'
17
+ )
18
+ const requestInput = {
19
+ context: '{}',
20
+ conversation: originalConversation,
21
+ expectedOutput: 'Agent: expected',
22
+ assertionLabel: 'LLM',
23
+ assertionValue: 'Matches the expected behaviour',
24
+ currentIncorrectOutcome: 'Agent: wrong'
25
+ }
26
+
27
+ const pending = suggestTestFix(
28
+ {
29
+ ...requestInput,
30
+ request: buildTestFixRequest(requestInput),
31
+ originalPrompt: 'Original prompt'
32
+ },
33
+ { suggestHistory, suggestPrompt }
34
+ )
35
+
36
+ expect(suggestHistory).toHaveBeenCalledOnce()
37
+ expect(suggestPrompt).not.toHaveBeenCalled()
38
+
39
+ finishHistory(correctedConversation)
40
+ await expect(pending).resolves.toEqual({
41
+ suggestedConversation: correctedConversation,
42
+ suggestedPrompt: 'Updated prompt'
43
+ })
44
+
45
+ expect(suggestPrompt).toHaveBeenCalledOnce()
46
+ const promptInput = suggestPrompt.mock.calls[0][0]
47
+ expect(promptInput.request).toContain(`Conversation:\n${correctedConversation}`)
48
+ expect(promptInput.request).not.toContain(`Conversation:\n${originalConversation}`)
49
+ })
50
+ })
@@ -0,0 +1,65 @@
1
+ import { buildPromptFixRequest } from '../../lib/edit/test-ai-edit'
2
+ import { suggestTestHistoryEdit } from '../tests/suggest-test-history-edit'
3
+ import type { PromptEditProgressPhase } from './prompt-edit-progress'
4
+ import { suggestPromptEdit } from './suggest-prompt-edit'
5
+
6
+ type Progress = {
7
+ phase: PromptEditProgressPhase
8
+ activity: number
9
+ summary: string
10
+ }
11
+
12
+ interface SuggestTestFixInput {
13
+ request: string
14
+ originalPrompt: string
15
+ context: string
16
+ conversation: string
17
+ expectedOutput: string
18
+ assertionLabel: string
19
+ assertionValue: string
20
+ currentIncorrectOutcome: string
21
+ onProgress?: (progress: Progress) => void
22
+ }
23
+
24
+ interface SuggestTestFixDependencies {
25
+ suggestHistory: typeof suggestTestHistoryEdit
26
+ suggestPrompt: typeof suggestPromptEdit
27
+ }
28
+
29
+ const defaultDependencies: SuggestTestFixDependencies = {
30
+ suggestHistory: suggestTestHistoryEdit,
31
+ suggestPrompt: suggestPromptEdit
32
+ }
33
+
34
+ export async function suggestTestFix(
35
+ input: SuggestTestFixInput,
36
+ dependencies: SuggestTestFixDependencies = defaultDependencies
37
+ ) {
38
+ const suggestedConversation = await dependencies.suggestHistory({
39
+ request: input.request,
40
+ prompt: input.originalPrompt,
41
+ context: input.context,
42
+ conversation: input.conversation,
43
+ expectedOutput: input.expectedOutput,
44
+ onProgress: input.onProgress
45
+ })
46
+ const promptRequest = buildPromptFixRequest(
47
+ input.request,
48
+ {
49
+ context: input.context,
50
+ conversation: suggestedConversation,
51
+ expectedOutput: input.expectedOutput,
52
+ assertionLabel: input.assertionLabel,
53
+ assertionValue: input.assertionValue,
54
+ currentIncorrectOutcome: input.currentIncorrectOutcome
55
+ },
56
+ input.conversation
57
+ )
58
+ const suggestedPrompt = await dependencies.suggestPrompt({
59
+ request: promptRequest,
60
+ originalPrompt: input.originalPrompt,
61
+ onProgress: input.onProgress
62
+ })
63
+
64
+ return { suggestedConversation, suggestedPrompt }
65
+ }
@@ -0,0 +1,253 @@
1
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'
2
+ import os from 'node:os'
3
+ import path from 'node:path'
4
+ import { initTRPC } from '@trpc/server'
5
+ import { afterEach, describe, expect, it, vi } from 'vitest'
6
+
7
+ const environment = vi.hoisted(() => ({
8
+ projectBasePath: '',
9
+ getAgentFactories: vi.fn(),
10
+ suggestTestFix: vi.fn()
11
+ }))
12
+
13
+ vi.mock('../lib/get-root-path', () => ({
14
+ getRootPath: async () => '/project/workflows.ts'
15
+ }))
16
+
17
+ vi.mock('../lib/get-agent-factories', () => ({
18
+ getAgentCatalog: vi.fn(),
19
+ getAgentFactories: environment.getAgentFactories
20
+ }))
21
+
22
+ vi.mock('../lib/project-api', () => ({
23
+ getProjectBasePath: async () => environment.projectBasePath,
24
+ getProjectBosunApi: async () => null
25
+ }))
26
+
27
+ vi.mock('./suggest-test-fix', () => ({
28
+ suggestTestFix: environment.suggestTestFix
29
+ }))
30
+
31
+ import type { TrpcContext } from '../lib/trpc-context'
32
+ import { buildTestFixRequest } from '../../lib/edit/test-ai-edit'
33
+ import { assertionLabel } from '../../lib/tests/assertion-types'
34
+ import { createPromptEditProposal, deletePromptEditProposal } from './prompt-edit-proposals'
35
+ import { createRolePlayRouter } from './router'
36
+ import { patchTest } from '../tests/data'
37
+ import { readSuite, writeSuite, type TestRow } from '../tests/suite'
38
+ import { testEditSourceFingerprint } from '../tests/test-edit-source'
39
+ import {
40
+ createTestHistoryEditProposal,
41
+ deleteTestHistoryEditProposal
42
+ } from '../tests/test-history-edit-proposals'
43
+ import { createTestsRouter } from '../tests/router'
44
+
45
+ const temporaryDirectories: string[] = []
46
+ const promptProposalIds: string[] = []
47
+ const historyProposalIds: string[] = []
48
+
49
+ afterEach(async () => {
50
+ for (const id of promptProposalIds.splice(0)) deletePromptEditProposal(id)
51
+ for (const id of historyProposalIds.splice(0)) deleteTestHistoryEditProposal(id)
52
+ await Promise.all(
53
+ temporaryDirectories
54
+ .splice(0)
55
+ .map((directory) => rm(directory, { recursive: true, force: true }))
56
+ )
57
+ environment.getAgentFactories.mockReset()
58
+ environment.suggestTestFix.mockReset()
59
+ })
60
+
61
+ describe('test Fix proposal acceptance', () => {
62
+ it.each(['history first', 'prompt first'] as const)(
63
+ 'accepts the paired changes with %s',
64
+ async (order) => {
65
+ const fixture = await createFixture()
66
+ const proposals = createPairedProposals(fixture.test)
67
+
68
+ if (order === 'history first') {
69
+ await fixture.tests.acceptHistoryEdit({ id: proposals.historyId })
70
+ await fixture.agents.acceptPromptEdit({ id: proposals.promptId })
71
+ } else {
72
+ await fixture.agents.acceptPromptEdit({ id: proposals.promptId })
73
+ await fixture.tests.acceptHistoryEdit({ id: proposals.historyId })
74
+ }
75
+
76
+ expect(await readFile(fixture.promptPath, 'utf8')).toBe('suggested prompt')
77
+ expect((await readSuite('agent')).tests[0].conversation).toBe('User: corrected')
78
+ }
79
+ )
80
+
81
+ it('rejects both paired changes after another test source field changes', async () => {
82
+ const fixture = await createFixture()
83
+ const proposals = createPairedProposals(fixture.test)
84
+ await patchTest('agent', fixture.test.id, { expected_output: 'Agent: changed' })
85
+
86
+ await expect(fixture.agents.acceptPromptEdit({ id: proposals.promptId })).rejects.toThrow(
87
+ 'This test changed while the suggestion was open'
88
+ )
89
+ await expect(fixture.tests.acceptHistoryEdit({ id: proposals.historyId })).rejects.toThrow(
90
+ 'This test changed while the suggestion was open'
91
+ )
92
+
93
+ expect(await readFile(fixture.promptPath, 'utf8')).toBe('original prompt')
94
+ const current = (await readSuite('agent')).tests[0]
95
+ expect(current.conversation).toBe('User: original')
96
+ expect(current.expected_output).toBe('Agent: changed')
97
+ })
98
+
99
+ it('saves a pending prompt and sends the same canonical test source as the browser', async () => {
100
+ const fixture = await createFixture()
101
+ const currentIncorrectOutcome = 'Agent: wrong'
102
+ const requestInput = {
103
+ context: JSON.stringify(fixture.test.context),
104
+ conversation: fixture.test.conversation,
105
+ expectedOutput: fixture.test.expected_output,
106
+ assertionLabel: assertionLabel(fixture.test.assertion_type),
107
+ assertionValue: fixture.test.assertion_value,
108
+ currentIncorrectOutcome
109
+ }
110
+ environment.suggestTestFix.mockResolvedValue({
111
+ suggestedConversation: fixture.test.conversation,
112
+ suggestedPrompt: 'draft prompt'
113
+ })
114
+
115
+ await fixture.agents.suggestTestFix({
116
+ agentId: 'agent',
117
+ region: null,
118
+ testId: fixture.test.id,
119
+ step: 'main',
120
+ request: buildTestFixRequest(requestInput),
121
+ prompt: 'draft prompt',
122
+ basePrompt: 'original prompt',
123
+ currentIncorrectOutcome,
124
+ progressId: '00000000-0000-4000-8000-000000000000'
125
+ })
126
+
127
+ expect(await readFile(fixture.promptPath, 'utf8')).toBe('draft prompt')
128
+ expect(environment.suggestTestFix).toHaveBeenCalledWith(
129
+ expect.objectContaining({
130
+ ...requestInput,
131
+ originalPrompt: 'draft prompt',
132
+ request: buildTestFixRequest(requestInput)
133
+ })
134
+ )
135
+ })
136
+
137
+ it('does not replace a prompt that differs from both submitted snapshots', async () => {
138
+ const fixture = await createFixture()
139
+ await writeFile(fixture.promptPath, 'newer prompt', 'utf8')
140
+
141
+ await expect(
142
+ fixture.agents.suggestTestFix({
143
+ agentId: 'agent',
144
+ region: null,
145
+ testId: fixture.test.id,
146
+ step: 'main',
147
+ request: 'Fix this test',
148
+ prompt: 'draft prompt',
149
+ basePrompt: 'original prompt',
150
+ currentIncorrectOutcome: 'Agent: wrong',
151
+ progressId: '00000000-0000-4000-8000-000000000000'
152
+ })
153
+ ).rejects.toThrow('The prompt changed before Bosun could start this Fix')
154
+
155
+ expect(environment.suggestTestFix).not.toHaveBeenCalled()
156
+ expect(await readFile(fixture.promptPath, 'utf8')).toBe('newer prompt')
157
+ })
158
+ })
159
+
160
+ async function createFixture() {
161
+ const root = await mkdtemp(path.join(os.tmpdir(), 'bosun-test-fix-acceptance-'))
162
+ temporaryDirectories.push(root)
163
+ environment.projectBasePath = path.join(root, 'agents')
164
+ const suiteDirectory = path.join(environment.projectBasePath, 'support', 'bosun-tests', 'agent')
165
+ await mkdir(suiteDirectory, { recursive: true })
166
+ await writeSuite('agent', { tests: [testRow()] })
167
+ const test = (await readSuite('agent')).tests[0]
168
+
169
+ const promptBasePath = path.join(root, 'prompts')
170
+ await mkdir(promptBasePath, { recursive: true })
171
+ const promptPath = path.join(promptBasePath, 'prompt.md')
172
+ await writeFile(promptPath, 'original prompt', 'utf8')
173
+ environment.getAgentFactories.mockResolvedValue({
174
+ basePath: promptBasePath,
175
+ factories: {
176
+ agent: async ({ stepRegistry }: any) => {
177
+ stepRegistry.addStep({
178
+ name: 'main',
179
+ prompt: {
180
+ type: 'file',
181
+ path: 'prompt.md',
182
+ content: () => readFile(promptPath, 'utf8')
183
+ }
184
+ })
185
+ }
186
+ }
187
+ })
188
+
189
+ const t = initTRPC.context<TrpcContext>().create()
190
+ return {
191
+ test,
192
+ promptPath,
193
+ agents: createRolePlayRouter(t).createCaller({}),
194
+ tests: createTestsRouter(t).createCaller({})
195
+ }
196
+ }
197
+
198
+ function createPairedProposals(test: TestRow) {
199
+ const originalFingerprint = testEditSourceFingerprint(test)
200
+ const historyFingerprint = testEditSourceFingerprint(test, {
201
+ conversation: 'User: corrected'
202
+ })
203
+ const history = createTestHistoryEditProposal({
204
+ agentId: 'agent',
205
+ region: null,
206
+ testId: test.id,
207
+ step: 'main',
208
+ originalConversation: test.conversation,
209
+ suggestedConversation: 'User: corrected',
210
+ expectedOutput: test.expected_output,
211
+ sourceGuard: {
212
+ suiteKey: 'agent',
213
+ allowedTestFingerprints: [originalFingerprint],
214
+ allowedPromptContents: ['original prompt', 'suggested prompt']
215
+ }
216
+ })
217
+ const prompt = createPromptEditProposal({
218
+ agentId: 'agent',
219
+ step: 'main',
220
+ originalPrompt: 'original prompt',
221
+ suggestedPrompt: 'suggested prompt',
222
+ testSourceGuard: {
223
+ suiteKey: 'agent',
224
+ testId: test.id,
225
+ allowedFingerprints: [originalFingerprint, historyFingerprint]
226
+ }
227
+ })
228
+ historyProposalIds.push(history.id)
229
+ promptProposalIds.push(prompt.id)
230
+ return { historyId: history.id, promptId: prompt.id }
231
+ }
232
+
233
+ function testRow(): TestRow {
234
+ return {
235
+ id: 'test-1',
236
+ order: 0,
237
+ pinned: 'TRUE',
238
+ scenario: 'Scenario',
239
+ step: 'main',
240
+ author: '',
241
+ category: '',
242
+ assertion_type: 'llm-rubric',
243
+ assertion_value: 'Be correct',
244
+ conversation: 'User: original',
245
+ expected_output: 'Agent: expected',
246
+ evaluation_mode: 'assertion',
247
+ context_mode: 'merge',
248
+ timeout: '0',
249
+ similarity_threshold: '50',
250
+ context: { customer: 'Sam' },
251
+ mocks: { booking: { id: '123' } }
252
+ }
253
+ }