@recombine-ai/bosun 0.16.2 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/README.md +24 -0
  2. package/bin/bosun.js +153 -20
  3. package/bin/git-mode.js +1139 -0
  4. package/build/client/_app/immutable/assets/0.D9HpHezk.css +1 -0
  5. package/build/client/_app/immutable/assets/0.D9HpHezk.css.br +0 -0
  6. package/build/client/_app/immutable/assets/0.D9HpHezk.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/{2.DtxQDOXx.css → 2.Bc0Sf3YD.css} +1 -1
  8. package/build/client/_app/immutable/assets/2.Bc0Sf3YD.css.br +0 -0
  9. package/build/client/_app/immutable/assets/2.Bc0Sf3YD.css.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{DneQQ7D5.js → -3ZOIHDA.js} +1 -1
  11. package/build/client/_app/immutable/chunks/-3ZOIHDA.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/-3ZOIHDA.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/7hV1SZxK.js +1 -0
  14. package/build/client/_app/immutable/chunks/7hV1SZxK.js.br +2 -0
  15. package/build/client/_app/immutable/chunks/7hV1SZxK.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/B-dTD_wm.js +1 -0
  17. package/build/client/_app/immutable/chunks/B-dTD_wm.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/B-dTD_wm.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{UqjCSZmA.js → B-iasAJv.js} +1 -1
  20. package/build/client/_app/immutable/chunks/B-iasAJv.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/B-iasAJv.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BDijIo6D.js +33 -0
  23. package/build/client/_app/immutable/chunks/BDijIo6D.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BDijIo6D.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/BHB0Pj1h.js +2 -0
  26. package/build/client/_app/immutable/chunks/BHB0Pj1h.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BHB0Pj1h.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/{Bog028VR.js → BKfmN1Rj.js} +1 -1
  29. package/build/client/_app/immutable/chunks/BKfmN1Rj.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BKfmN1Rj.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/{pPpIn6tB.js → BlFOg-Sd.js} +1 -1
  32. package/build/client/_app/immutable/chunks/BlFOg-Sd.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/BlFOg-Sd.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/{CJcZ2GVC.js → Byg3jr1u.js} +1 -1
  35. package/build/client/_app/immutable/chunks/Byg3jr1u.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/Byg3jr1u.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/{Bmd5zhWC.js → BzxxLgHi.js} +1 -1
  38. package/build/client/_app/immutable/chunks/BzxxLgHi.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/BzxxLgHi.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/{CEHsomMo.js → C4UC6AgE.js} +1 -1
  41. package/build/client/_app/immutable/chunks/C4UC6AgE.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/{CEHsomMo.js.gz → C4UC6AgE.js.gz} +0 -0
  43. package/build/client/_app/immutable/chunks/C60AG6QQ.js +1 -0
  44. package/build/client/_app/immutable/chunks/C60AG6QQ.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/C60AG6QQ.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/CAIfVN23.js +1 -0
  47. package/build/client/_app/immutable/chunks/CAIfVN23.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/CAIfVN23.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/{JcG4w2gF.js → CB9iDxwI.js} +1 -1
  50. package/build/client/_app/immutable/chunks/CB9iDxwI.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/CB9iDxwI.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/{DoD3q5w5.js → CD_KdWs9.js} +1 -1
  53. package/build/client/_app/immutable/chunks/CD_KdWs9.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/CD_KdWs9.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/CDy1LBR5.js +1 -0
  56. package/build/client/_app/immutable/chunks/CDy1LBR5.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/CDy1LBR5.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/{DCXjBDmY.js → CMFNmSvo.js} +1 -1
  59. package/build/client/_app/immutable/chunks/CMFNmSvo.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/CMFNmSvo.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/{Bv1mNXs0.js → CNIn4L55.js} +1 -1
  62. package/build/client/_app/immutable/chunks/CNIn4L55.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/CNIn4L55.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/CUKoVL36.js +1 -0
  65. package/build/client/_app/immutable/chunks/CUKoVL36.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/CUKoVL36.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/CYGbCr1i.js +3 -0
  68. package/build/client/_app/immutable/chunks/CYGbCr1i.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/CYGbCr1i.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/CYr0FGgn.js +1 -0
  71. package/build/client/_app/immutable/chunks/CYr0FGgn.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/CYr0FGgn.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/{DtXXy94i.js → Ce6a22qU.js} +1 -1
  74. package/build/client/_app/immutable/chunks/Ce6a22qU.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/Ce6a22qU.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/{DfcDjAv-.js → CeoQ-OhK.js} +1 -1
  77. package/build/client/_app/immutable/chunks/CeoQ-OhK.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/CeoQ-OhK.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/{D8mA-uZ4.js → CupXtwVS.js} +1 -1
  80. package/build/client/_app/immutable/chunks/CupXtwVS.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/CupXtwVS.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/{B5zf3x62.js → Cy2Uze-c.js} +1 -1
  83. package/build/client/_app/immutable/chunks/Cy2Uze-c.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/Cy2Uze-c.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/{Dg0A8wPA.js → D8Lmn3S5.js} +1 -1
  86. package/build/client/_app/immutable/chunks/D8Lmn3S5.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/D8Lmn3S5.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/D8doM1Y6.js +1 -0
  89. package/build/client/_app/immutable/chunks/D8doM1Y6.js.br +2 -0
  90. package/build/client/_app/immutable/chunks/D8doM1Y6.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/{BHHfrjbV.js → D9BWOD7V.js} +1 -1
  92. package/build/client/_app/immutable/chunks/D9BWOD7V.js.br +3 -0
  93. package/build/client/_app/immutable/chunks/D9BWOD7V.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{Cp_st-64.js → DBB88ZB7.js} +1 -1
  95. package/build/client/_app/immutable/chunks/DBB88ZB7.js.br +2 -0
  96. package/build/client/_app/immutable/chunks/DBB88ZB7.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{Dm49pcMm.js → DC7lPrn4.js} +1 -1
  98. package/build/client/_app/immutable/chunks/DC7lPrn4.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/DC7lPrn4.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/DCwWNTpf.js +9 -0
  101. package/build/client/_app/immutable/chunks/DCwWNTpf.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/DCwWNTpf.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/{wcTQUnZO.js → DEnUeQNt.js} +1 -1
  104. package/build/client/_app/immutable/chunks/DEnUeQNt.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/DEnUeQNt.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/D_laxq3h.js +1 -0
  107. package/build/client/_app/immutable/chunks/D_laxq3h.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/D_laxq3h.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/{Ddv5LgEc.js → DfkYlKBk.js} +1 -1
  110. package/build/client/_app/immutable/chunks/DfkYlKBk.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/DfkYlKBk.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/DnMS2X6M.js +2 -0
  113. package/build/client/_app/immutable/chunks/DnMS2X6M.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/DnMS2X6M.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/{B1HdnQRQ.js → DrE1ro9S.js} +1 -1
  116. package/build/client/_app/immutable/chunks/DrE1ro9S.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/DrE1ro9S.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/DzY_RPb9.js +1 -0
  119. package/build/client/_app/immutable/chunks/DzY_RPb9.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/DzY_RPb9.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/PrCSpCPg.js +1 -0
  122. package/build/client/_app/immutable/chunks/PrCSpCPg.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/PrCSpCPg.js.gz +0 -0
  124. package/build/client/_app/immutable/chunks/{CN555stc.js → eMofpOrR.js} +1 -1
  125. package/build/client/_app/immutable/chunks/eMofpOrR.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/eMofpOrR.js.gz +0 -0
  127. package/build/client/_app/immutable/entry/app.BQUuHkSR.js +2 -0
  128. package/build/client/_app/immutable/entry/app.BQUuHkSR.js.br +0 -0
  129. package/build/client/_app/immutable/entry/app.BQUuHkSR.js.gz +0 -0
  130. package/build/client/_app/immutable/entry/start.DoeTycdu.js +1 -0
  131. package/build/client/_app/immutable/entry/start.DoeTycdu.js.br +2 -0
  132. package/build/client/_app/immutable/entry/start.DoeTycdu.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/0.DBnFpwRM.js +4 -0
  134. package/build/client/_app/immutable/nodes/0.DBnFpwRM.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/0.DBnFpwRM.js.gz +0 -0
  136. package/build/client/_app/immutable/nodes/1.D-kI-fLd.js +1 -0
  137. package/build/client/_app/immutable/nodes/1.D-kI-fLd.js.br +0 -0
  138. package/build/client/_app/immutable/nodes/1.D-kI-fLd.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/10.DWb5H7vX.js +28 -0
  140. package/build/client/_app/immutable/nodes/10.DWb5H7vX.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/10.DWb5H7vX.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/{15.D2I0y3ys.js → 15.CGc3_07c.js} +1 -1
  143. package/build/client/_app/immutable/nodes/15.CGc3_07c.js.br +3 -0
  144. package/build/client/_app/immutable/nodes/15.CGc3_07c.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/17.BIba62hW.js +3 -0
  146. package/build/client/_app/immutable/nodes/17.BIba62hW.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/17.BIba62hW.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/18.Clxr6FwI.js +11 -0
  149. package/build/client/_app/immutable/nodes/18.Clxr6FwI.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/18.Clxr6FwI.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/2.cbpnR8be.js +35 -0
  152. package/build/client/_app/immutable/nodes/2.cbpnR8be.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/2.cbpnR8be.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/3.DsP759xk.js +1 -0
  155. package/build/client/_app/immutable/nodes/3.DsP759xk.js.br +0 -0
  156. package/build/client/_app/immutable/nodes/3.DsP759xk.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/{4.C8VxVbVn.js → 4.BIGLAIDe.js} +1 -1
  158. package/build/client/_app/immutable/nodes/4.BIGLAIDe.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/4.BIGLAIDe.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/{5.BjrnKYaA.js → 5.zMHOyhDv.js} +1 -1
  161. package/build/client/_app/immutable/nodes/5.zMHOyhDv.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/5.zMHOyhDv.js.gz +0 -0
  163. package/build/client/_app/immutable/nodes/6.DFQ1IZsQ.js +1 -0
  164. package/build/client/_app/immutable/nodes/6.DFQ1IZsQ.js.br +0 -0
  165. package/build/client/_app/immutable/nodes/6.DFQ1IZsQ.js.gz +0 -0
  166. package/build/client/_app/immutable/nodes/8.CTgEdr7L.js +2 -0
  167. package/build/client/_app/immutable/nodes/8.CTgEdr7L.js.br +0 -0
  168. package/build/client/_app/immutable/nodes/8.CTgEdr7L.js.gz +0 -0
  169. package/build/client/_app/immutable/nodes/9.BidF5Uvq.js +2 -0
  170. package/build/client/_app/immutable/nodes/9.BidF5Uvq.js.br +0 -0
  171. package/build/client/_app/immutable/nodes/9.BidF5Uvq.js.gz +0 -0
  172. package/build/client/_app/version.json +1 -1
  173. package/build/client/_app/version.json.br +0 -0
  174. package/build/client/_app/version.json.gz +0 -0
  175. package/build/server/chunks/0-BZOFUIfF.js +9 -0
  176. package/build/server/chunks/0-BZOFUIfF.js.map +1 -0
  177. package/build/server/chunks/1-XwGU5VVN.js +9 -0
  178. package/build/server/chunks/{1-C0HdTvXW.js.map → 1-XwGU5VVN.js.map} +1 -1
  179. package/build/server/chunks/10-BgFSx4ib.js +9 -0
  180. package/build/server/chunks/10-BgFSx4ib.js.map +1 -0
  181. package/build/server/chunks/15-BjTTC1jf.js +9 -0
  182. package/build/server/chunks/{15-BQcb9C_y.js.map → 15-BjTTC1jf.js.map} +1 -1
  183. package/build/server/chunks/17-BEkWCfzc.js +9 -0
  184. package/build/server/chunks/17-BEkWCfzc.js.map +1 -0
  185. package/build/server/chunks/18-C-S0wKdp.js +9 -0
  186. package/build/server/chunks/18-C-S0wKdp.js.map +1 -0
  187. package/build/server/chunks/2-o-cIkIjs.js +9 -0
  188. package/build/server/chunks/2-o-cIkIjs.js.map +1 -0
  189. package/build/server/chunks/3-B-ABlyFO.js +9 -0
  190. package/build/server/chunks/3-B-ABlyFO.js.map +1 -0
  191. package/build/server/chunks/4-joAFA_Y8.js +9 -0
  192. package/build/server/chunks/4-joAFA_Y8.js.map +1 -0
  193. package/build/server/chunks/5-DIhC9k4l.js +9 -0
  194. package/build/server/chunks/5-DIhC9k4l.js.map +1 -0
  195. package/build/server/chunks/6-CMuAQIcW.js +9 -0
  196. package/build/server/chunks/6-CMuAQIcW.js.map +1 -0
  197. package/build/server/chunks/8-CbETTVRG.js +9 -0
  198. package/build/server/chunks/8-CbETTVRG.js.map +1 -0
  199. package/build/server/chunks/9-nMV90uVU.js +9 -0
  200. package/build/server/chunks/9-nMV90uVU.js.map +1 -0
  201. package/build/server/chunks/{AgentSidebar-BWBnqHnV.js → AgentSidebar-BEbSdZdN.js} +4 -4
  202. package/build/server/chunks/{AgentSidebar-BWBnqHnV.js.map → AgentSidebar-BEbSdZdN.js.map} +1 -1
  203. package/build/server/chunks/{Button-DH7gdU0s.js → Button-Dc9CR4Wh.js} +2 -2
  204. package/build/server/chunks/{Button-DH7gdU0s.js.map → Button-Dc9CR4Wh.js.map} +1 -1
  205. package/build/server/chunks/{ChatStepTrace-BivoNYOY.js → ChatStepTrace-OM96X4g8.js} +18 -7
  206. package/build/server/chunks/ChatStepTrace-OM96X4g8.js.map +1 -0
  207. package/build/server/chunks/{Dropdown-DnARl86Q.js → Dropdown-Cgd7pG-k.js} +2 -2
  208. package/build/server/chunks/{Dropdown-DnARl86Q.js.map → Dropdown-Cgd7pG-k.js.map} +1 -1
  209. package/build/server/chunks/GitControlsButton-BLcNzrDt.js +81 -0
  210. package/build/server/chunks/GitControlsButton-BLcNzrDt.js.map +1 -0
  211. package/build/server/chunks/{Icon-DP1YKCRV.js → Icon-Bogvl2n9.js} +2 -2
  212. package/build/server/chunks/{Icon-DP1YKCRV.js.map → Icon-Bogvl2n9.js.map} +1 -1
  213. package/build/server/chunks/{Input-CUJ9Cg7b.js → Input-7hpw1WLW.js} +2 -2
  214. package/build/server/chunks/{Input-CUJ9Cg7b.js.map → Input-7hpw1WLW.js.map} +1 -1
  215. package/build/server/chunks/{Modal-CGJuNpZ0.js → Modal-7IIIfFEG.js} +5 -5
  216. package/build/server/chunks/{Modal-CGJuNpZ0.js.map → Modal-7IIIfFEG.js.map} +1 -1
  217. package/build/server/chunks/{Panel-zvjxe036.js → Panel-Cj1mXx9-.js} +2 -2
  218. package/build/server/chunks/{Panel-zvjxe036.js.map → Panel-Cj1mXx9-.js.map} +1 -1
  219. package/build/server/chunks/{Tab-CUkyLqbN.js → Tab-bf4ZDs5y.js} +4 -4
  220. package/build/server/chunks/{Tab-CUkyLqbN.js.map → Tab-bf4ZDs5y.js.map} +1 -1
  221. package/build/server/chunks/{_layout.svelte-BnrWYuLv.js → _layout.svelte-C71luIwv.js} +10 -10
  222. package/build/server/chunks/{_layout.svelte-BnrWYuLv.js.map → _layout.svelte-C71luIwv.js.map} +1 -1
  223. package/build/server/chunks/{_layout.svelte-wi6o5Ecu.js → _layout.svelte-CFhHgXI_.js} +24 -18
  224. package/build/server/chunks/_layout.svelte-CFhHgXI_.js.map +1 -0
  225. package/build/server/chunks/_layout.svelte-CJd_pmkx.js +431 -0
  226. package/build/server/chunks/_layout.svelte-CJd_pmkx.js.map +1 -0
  227. package/build/server/chunks/{_layout.svelte-B88WMyk0.js → _layout.svelte-D6rhwm98.js} +445 -70
  228. package/build/server/chunks/_layout.svelte-D6rhwm98.js.map +1 -0
  229. package/build/server/chunks/{_page.svelte-CeS_21Ho.js → _page.svelte-BBvDMiTV.js} +25 -21
  230. package/build/server/chunks/_page.svelte-BBvDMiTV.js.map +1 -0
  231. package/build/server/chunks/{_page.svelte-h_J4lNT9.js → _page.svelte-BQs9dEuq.js} +8 -7
  232. package/build/server/chunks/{_page.svelte-h_J4lNT9.js.map → _page.svelte-BQs9dEuq.js.map} +1 -1
  233. package/build/server/chunks/{_page.svelte-DhFNFMnl.js → _page.svelte-BoO2LWVX.js} +34 -14
  234. package/build/server/chunks/_page.svelte-BoO2LWVX.js.map +1 -0
  235. package/build/server/chunks/{_page.svelte-CHgQjBQj.js → _page.svelte-DUCTSdv-.js} +2 -2
  236. package/build/server/chunks/{_page.svelte-CHgQjBQj.js.map → _page.svelte-DUCTSdv-.js.map} +1 -1
  237. package/build/server/chunks/_page.svelte-FXYLKyMw.js +110 -0
  238. package/build/server/chunks/_page.svelte-FXYLKyMw.js.map +1 -0
  239. package/build/server/chunks/{_page.svelte-57pyhszV.js → _page.svelte-KA1hqKj2.js} +20 -107
  240. package/build/server/chunks/_page.svelte-KA1hqKj2.js.map +1 -0
  241. package/build/server/chunks/{_page.svelte-BSVJ2d2G.js → _page.svelte-y8CZFL8a.js} +210 -106
  242. package/build/server/chunks/_page.svelte-y8CZFL8a.js.map +1 -0
  243. package/build/server/chunks/{_page.svelte-DHSYVLoj.js → _page.svelte-yIHSIEW6.js} +21 -15
  244. package/build/server/chunks/_page.svelte-yIHSIEW6.js.map +1 -0
  245. package/build/server/chunks/_server.ts-Cp9DgLcE.js +336 -0
  246. package/build/server/chunks/_server.ts-Cp9DgLcE.js.map +1 -0
  247. package/build/server/chunks/{agents-context-CbFsZmi5.js → agents-context-owgusUPR.js} +2 -2
  248. package/build/server/chunks/{agents-context-CbFsZmi5.js.map → agents-context-owgusUPR.js.map} +1 -1
  249. package/build/server/chunks/{client-DO-hqMbT.js → client-P-7bDULt.js} +4 -4
  250. package/build/server/chunks/{client-DO-hqMbT.js.map → client-P-7bDULt.js.map} +1 -1
  251. package/build/server/chunks/{conversation-view-memory-CtbUZd_L.js → conversation-view-memory-SdpdqTR7.js} +2 -2
  252. package/build/server/chunks/{conversation-view-memory-CtbUZd_L.js.map → conversation-view-memory-SdpdqTR7.js.map} +1 -1
  253. package/build/server/chunks/{edit-workspace-context-tyHBPujC.js → edit-workspace-context-hanFnXR3.js} +2 -2
  254. package/build/server/chunks/{edit-workspace-context-tyHBPujC.js.map → edit-workspace-context-hanFnXR3.js.map} +1 -1
  255. package/build/server/chunks/error.svelte-yI9RS6H4.js +15 -0
  256. package/build/server/chunks/{error.svelte-DmKKN1RU.js.map → error.svelte-yI9RS6H4.js.map} +1 -1
  257. package/build/server/chunks/git-mode-context-BpNsAUGF.js +18 -0
  258. package/build/server/chunks/git-mode-context-BpNsAUGF.js.map +1 -0
  259. package/build/server/chunks/{index-LMsd1ih2.js → index-DGtbUu8Y.js} +2 -2
  260. package/build/server/chunks/{index-LMsd1ih2.js.map → index-DGtbUu8Y.js.map} +1 -1
  261. package/build/server/chunks/{index-server-BRr5mZEq.js → index-server-l8-WsVn4.js} +2 -2
  262. package/build/server/chunks/{index-server-BRr5mZEq.js.map → index-server-l8-WsVn4.js.map} +1 -1
  263. package/build/server/chunks/{index2-ClgfzZ89.js → index2-CtgLiJVO.js} +3 -3
  264. package/build/server/chunks/{index2-ClgfzZ89.js.map → index2-CtgLiJVO.js.map} +1 -1
  265. package/build/server/chunks/{index3-BdRUAffj.js → index3-4hbbCqW0.js} +2 -2
  266. package/build/server/chunks/{index3-BdRUAffj.js.map → index3-4hbbCqW0.js.map} +1 -1
  267. package/build/server/chunks/{root-4q2Pr7ck.js → root-sWPnlpi3.js} +2 -2
  268. package/build/server/chunks/{root-4q2Pr7ck.js.map → root-sWPnlpi3.js.map} +1 -1
  269. package/build/server/chunks/{source-selection-CcN1cgXc.js → source-selection-DSkaPGfZ.js} +7 -2
  270. package/build/server/chunks/source-selection-DSkaPGfZ.js.map +1 -0
  271. package/build/server/chunks/{state.svelte-Bd1i-u49.js → state.svelte-BkvaElc6.js} +3 -3
  272. package/build/server/chunks/{state.svelte-Bd1i-u49.js.map → state.svelte-BkvaElc6.js.map} +1 -1
  273. package/build/server/chunks/trpc-client-Cr8RJ4UO.js +260 -0
  274. package/build/server/chunks/trpc-client-Cr8RJ4UO.js.map +1 -0
  275. package/build/server/index.js +4 -4
  276. package/build/server/index.js.map +1 -1
  277. package/build/server/manifest.js +15 -15
  278. package/build/server/manifest.js.map +1 -1
  279. package/package.json +1 -1
  280. package/src/backend/git-mode/command.spec.ts +172 -0
  281. package/src/backend/git-mode/command.ts +405 -0
  282. package/src/backend/git-mode/config.spec.ts +45 -0
  283. package/src/backend/git-mode/config.ts +90 -0
  284. package/src/backend/git-mode/index.ts +20 -0
  285. package/src/backend/git-mode/repository-write-gate.spec.ts +116 -0
  286. package/src/backend/git-mode/repository-write-gate.ts +260 -0
  287. package/src/backend/git-mode/router.ts +59 -0
  288. package/src/backend/git-mode/service.spec.ts +1653 -0
  289. package/src/backend/git-mode/service.ts +2183 -0
  290. package/src/backend/git-mode/types.ts +82 -0
  291. package/src/backend/git-mode/write-tracker.spec.ts +46 -0
  292. package/src/backend/git-mode/write-tracker.ts +39 -0
  293. package/src/backend/lib/backend-restart.spec.ts +27 -0
  294. package/src/backend/lib/backend-restart.ts +16 -2
  295. package/src/backend/lib/middleware/cors.spec.ts +67 -0
  296. package/src/backend/lib/middleware/cors.ts +40 -12
  297. package/src/backend/roleplay/agent-loader.ts +49 -0
  298. package/src/backend/roleplay/old-server.ts +106 -56
  299. package/src/backend/roleplay/prompt-edit-proposals.ts +38 -4
  300. package/src/backend/roleplay/prompt-file.ts +59 -0
  301. package/src/backend/roleplay/router.spec.ts +75 -0
  302. package/src/backend/roleplay/router.ts +123 -69
  303. package/src/backend/roleplay/suggest-file-edit.ts +160 -0
  304. package/src/backend/roleplay/suggest-prompt-edit.ts +9 -138
  305. package/src/backend/roleplay/suggest-test-fix.spec.ts +50 -0
  306. package/src/backend/roleplay/suggest-test-fix.ts +65 -0
  307. package/src/backend/roleplay/test-fix-proposal-acceptance.spec.ts +253 -0
  308. package/src/backend/server.ts +116 -13
  309. package/src/backend/tests/academy.ts +17 -3
  310. package/src/backend/tests/data.spec.ts +81 -2
  311. package/src/backend/tests/data.ts +74 -4
  312. package/src/backend/tests/router.ts +101 -36
  313. package/src/backend/tests/suggest-test-history-edit.spec.ts +20 -0
  314. package/src/backend/tests/suggest-test-history-edit.ts +52 -0
  315. package/src/backend/tests/test-edit-source.spec.ts +61 -0
  316. package/src/backend/tests/test-edit-source.ts +34 -0
  317. package/src/backend/tests/test-history-edit-proposals.ts +69 -0
  318. package/src/backend/tests/test-history-overrides.spec.ts +24 -0
  319. package/src/backend/tests/test-selection.ts +27 -0
  320. package/src/lib/api-telescope/source-selection.spec.ts +44 -0
  321. package/src/lib/api-telescope/source-selection.ts +28 -0
  322. package/src/lib/components/Modal.svelte +1 -1
  323. package/src/lib/edit/edit-workspace-context.ts +33 -3
  324. package/src/lib/edit/test-ai-edit.spec.ts +31 -0
  325. package/src/lib/edit/test-ai-edit.ts +52 -0
  326. package/src/lib/git-mode/BlockingGitDialog.svelte +118 -0
  327. package/src/lib/git-mode/GitControlsButton.svelte +96 -0
  328. package/src/lib/git-mode/client-admission.spec.ts +304 -0
  329. package/src/lib/git-mode/client-admission.ts +343 -0
  330. package/src/lib/git-mode/errors.ts +2 -0
  331. package/src/lib/git-mode/git-mode-context.ts +70 -0
  332. package/src/lib/git-mode/refresh-policy.spec.ts +95 -0
  333. package/src/lib/git-mode/refresh-policy.ts +39 -0
  334. package/src/lib/git-mode/status-recovery.spec.ts +86 -0
  335. package/src/lib/git-mode/status-recovery.ts +33 -0
  336. package/src/lib/monaco/bosun-theme.ts +6 -83
  337. package/src/lib/monaco/editor-appearance.spec.ts +84 -0
  338. package/src/lib/monaco/editor-appearance.ts +154 -0
  339. package/src/lib/monaco/editor-decorations.spec.ts +91 -0
  340. package/src/lib/monaco/editor-decorations.ts +133 -0
  341. package/src/lib/tests/assertion-types.ts +74 -0
  342. package/src/lib/trpc-client.ts +15 -1
  343. package/src/lib/ws-client.spec.ts +208 -0
  344. package/src/lib/ws-client.ts +196 -14
  345. package/src/lib/ws-message.ts +24 -0
  346. package/build/client/_app/immutable/assets/0.Rrc0O--C.css +0 -1
  347. package/build/client/_app/immutable/assets/0.Rrc0O--C.css.br +0 -0
  348. package/build/client/_app/immutable/assets/0.Rrc0O--C.css.gz +0 -0
  349. package/build/client/_app/immutable/assets/2.DtxQDOXx.css.br +0 -0
  350. package/build/client/_app/immutable/assets/2.DtxQDOXx.css.gz +0 -0
  351. package/build/client/_app/immutable/chunks/B1HdnQRQ.js.br +0 -0
  352. package/build/client/_app/immutable/chunks/B1HdnQRQ.js.gz +0 -0
  353. package/build/client/_app/immutable/chunks/B5zf3x62.js.br +0 -0
  354. package/build/client/_app/immutable/chunks/B5zf3x62.js.gz +0 -0
  355. package/build/client/_app/immutable/chunks/BHHfrjbV.js.br +0 -2
  356. package/build/client/_app/immutable/chunks/BHHfrjbV.js.gz +0 -0
  357. package/build/client/_app/immutable/chunks/BU7aeYn4.js +0 -1
  358. package/build/client/_app/immutable/chunks/BU7aeYn4.js.br +0 -0
  359. package/build/client/_app/immutable/chunks/BU7aeYn4.js.gz +0 -0
  360. package/build/client/_app/immutable/chunks/BbGYcfPY.js +0 -3
  361. package/build/client/_app/immutable/chunks/BbGYcfPY.js.br +0 -0
  362. package/build/client/_app/immutable/chunks/BbGYcfPY.js.gz +0 -0
  363. package/build/client/_app/immutable/chunks/Bmd5zhWC.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/Bmd5zhWC.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/BnqH7p3U.js +0 -33
  366. package/build/client/_app/immutable/chunks/BnqH7p3U.js.br +0 -0
  367. package/build/client/_app/immutable/chunks/BnqH7p3U.js.gz +0 -0
  368. package/build/client/_app/immutable/chunks/Bog028VR.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/Bog028VR.js.gz +0 -0
  370. package/build/client/_app/immutable/chunks/Bv1mNXs0.js.br +0 -0
  371. package/build/client/_app/immutable/chunks/Bv1mNXs0.js.gz +0 -0
  372. package/build/client/_app/immutable/chunks/BvjXTrOz.js +0 -1
  373. package/build/client/_app/immutable/chunks/BvjXTrOz.js.br +0 -0
  374. package/build/client/_app/immutable/chunks/BvjXTrOz.js.gz +0 -0
  375. package/build/client/_app/immutable/chunks/C1R-s4aD.js +0 -1
  376. package/build/client/_app/immutable/chunks/C1R-s4aD.js.br +0 -0
  377. package/build/client/_app/immutable/chunks/C1R-s4aD.js.gz +0 -0
  378. package/build/client/_app/immutable/chunks/CC1OcqhR.js +0 -1
  379. package/build/client/_app/immutable/chunks/CC1OcqhR.js.br +0 -0
  380. package/build/client/_app/immutable/chunks/CC1OcqhR.js.gz +0 -0
  381. package/build/client/_app/immutable/chunks/CEHsomMo.js.br +0 -0
  382. package/build/client/_app/immutable/chunks/CJcZ2GVC.js.br +0 -0
  383. package/build/client/_app/immutable/chunks/CJcZ2GVC.js.gz +0 -0
  384. package/build/client/_app/immutable/chunks/CN555stc.js.br +0 -0
  385. package/build/client/_app/immutable/chunks/CN555stc.js.gz +0 -0
  386. package/build/client/_app/immutable/chunks/CQg2Mme0.js +0 -9
  387. package/build/client/_app/immutable/chunks/CQg2Mme0.js.br +0 -0
  388. package/build/client/_app/immutable/chunks/CQg2Mme0.js.gz +0 -0
  389. package/build/client/_app/immutable/chunks/Cp_st-64.js.br +0 -0
  390. package/build/client/_app/immutable/chunks/Cp_st-64.js.gz +0 -0
  391. package/build/client/_app/immutable/chunks/D8mA-uZ4.js.br +0 -0
  392. package/build/client/_app/immutable/chunks/D8mA-uZ4.js.gz +0 -0
  393. package/build/client/_app/immutable/chunks/DCXjBDmY.js.br +0 -0
  394. package/build/client/_app/immutable/chunks/DCXjBDmY.js.gz +0 -0
  395. package/build/client/_app/immutable/chunks/DSLyVE1P.js +0 -1
  396. package/build/client/_app/immutable/chunks/DSLyVE1P.js.br +0 -0
  397. package/build/client/_app/immutable/chunks/DSLyVE1P.js.gz +0 -0
  398. package/build/client/_app/immutable/chunks/Ddv5LgEc.js.br +0 -0
  399. package/build/client/_app/immutable/chunks/Ddv5LgEc.js.gz +0 -0
  400. package/build/client/_app/immutable/chunks/DfcDjAv-.js.br +0 -0
  401. package/build/client/_app/immutable/chunks/DfcDjAv-.js.gz +0 -0
  402. package/build/client/_app/immutable/chunks/Dg0A8wPA.js.br +0 -0
  403. package/build/client/_app/immutable/chunks/Dg0A8wPA.js.gz +0 -0
  404. package/build/client/_app/immutable/chunks/Dm49pcMm.js.br +0 -0
  405. package/build/client/_app/immutable/chunks/Dm49pcMm.js.gz +0 -0
  406. package/build/client/_app/immutable/chunks/DneQQ7D5.js.br +0 -0
  407. package/build/client/_app/immutable/chunks/DneQQ7D5.js.gz +0 -0
  408. package/build/client/_app/immutable/chunks/DoD3q5w5.js.br +0 -0
  409. package/build/client/_app/immutable/chunks/DoD3q5w5.js.gz +0 -0
  410. package/build/client/_app/immutable/chunks/DtXXy94i.js.br +0 -0
  411. package/build/client/_app/immutable/chunks/DtXXy94i.js.gz +0 -0
  412. package/build/client/_app/immutable/chunks/Dy2CFyD6.js +0 -2
  413. package/build/client/_app/immutable/chunks/Dy2CFyD6.js.br +0 -0
  414. package/build/client/_app/immutable/chunks/Dy2CFyD6.js.gz +0 -0
  415. package/build/client/_app/immutable/chunks/DyBwTDJp.js +0 -2
  416. package/build/client/_app/immutable/chunks/DyBwTDJp.js.br +0 -0
  417. package/build/client/_app/immutable/chunks/DyBwTDJp.js.gz +0 -0
  418. package/build/client/_app/immutable/chunks/ILTCveYH.js +0 -1
  419. package/build/client/_app/immutable/chunks/ILTCveYH.js.br +0 -0
  420. package/build/client/_app/immutable/chunks/ILTCveYH.js.gz +0 -0
  421. package/build/client/_app/immutable/chunks/JcG4w2gF.js.br +0 -0
  422. package/build/client/_app/immutable/chunks/JcG4w2gF.js.gz +0 -0
  423. package/build/client/_app/immutable/chunks/UqjCSZmA.js.br +0 -0
  424. package/build/client/_app/immutable/chunks/UqjCSZmA.js.gz +0 -0
  425. package/build/client/_app/immutable/chunks/_YcrHZ6P.js +0 -1
  426. package/build/client/_app/immutable/chunks/_YcrHZ6P.js.br +0 -2
  427. package/build/client/_app/immutable/chunks/_YcrHZ6P.js.gz +0 -0
  428. package/build/client/_app/immutable/chunks/i6ygh6h8.js +0 -1
  429. package/build/client/_app/immutable/chunks/i6ygh6h8.js.br +0 -2
  430. package/build/client/_app/immutable/chunks/i6ygh6h8.js.gz +0 -0
  431. package/build/client/_app/immutable/chunks/oRi68ch3.js +0 -1
  432. package/build/client/_app/immutable/chunks/oRi68ch3.js.br +0 -0
  433. package/build/client/_app/immutable/chunks/oRi68ch3.js.gz +0 -0
  434. package/build/client/_app/immutable/chunks/pPpIn6tB.js.br +0 -0
  435. package/build/client/_app/immutable/chunks/pPpIn6tB.js.gz +0 -0
  436. package/build/client/_app/immutable/chunks/r0sHOWrM.js +0 -1
  437. package/build/client/_app/immutable/chunks/r0sHOWrM.js.br +0 -0
  438. package/build/client/_app/immutable/chunks/r0sHOWrM.js.gz +0 -0
  439. package/build/client/_app/immutable/chunks/wcTQUnZO.js.br +0 -0
  440. package/build/client/_app/immutable/chunks/wcTQUnZO.js.gz +0 -0
  441. package/build/client/_app/immutable/entry/app.DdO0gkPg.js +0 -2
  442. package/build/client/_app/immutable/entry/app.DdO0gkPg.js.br +0 -0
  443. package/build/client/_app/immutable/entry/app.DdO0gkPg.js.gz +0 -0
  444. package/build/client/_app/immutable/entry/start.eAjDq0c9.js +0 -1
  445. package/build/client/_app/immutable/entry/start.eAjDq0c9.js.br +0 -2
  446. package/build/client/_app/immutable/entry/start.eAjDq0c9.js.gz +0 -0
  447. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js +0 -3
  448. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.br +0 -0
  449. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.gz +0 -0
  450. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js +0 -1
  451. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.br +0 -0
  452. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.gz +0 -0
  453. package/build/client/_app/immutable/nodes/10.dm2dgy31.js +0 -13
  454. package/build/client/_app/immutable/nodes/10.dm2dgy31.js.br +0 -0
  455. package/build/client/_app/immutable/nodes/10.dm2dgy31.js.gz +0 -0
  456. package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.br +0 -0
  457. package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.gz +0 -0
  458. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js +0 -3
  459. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.br +0 -0
  460. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.gz +0 -0
  461. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js +0 -11
  462. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.br +0 -0
  463. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.gz +0 -0
  464. package/build/client/_app/immutable/nodes/2.DesR2keg.js +0 -35
  465. package/build/client/_app/immutable/nodes/2.DesR2keg.js.br +0 -0
  466. package/build/client/_app/immutable/nodes/2.DesR2keg.js.gz +0 -0
  467. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js +0 -1
  468. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.br +0 -0
  469. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.gz +0 -0
  470. package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.br +0 -0
  471. package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.gz +0 -0
  472. package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.br +0 -0
  473. package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.gz +0 -0
  474. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js +0 -1
  475. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.br +0 -0
  476. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.gz +0 -0
  477. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js +0 -2
  478. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.br +0 -0
  479. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.gz +0 -0
  480. package/build/client/_app/immutable/nodes/9.DVspuDYY.js +0 -2
  481. package/build/client/_app/immutable/nodes/9.DVspuDYY.js.br +0 -0
  482. package/build/client/_app/immutable/nodes/9.DVspuDYY.js.gz +0 -0
  483. package/build/server/chunks/0-D_duQDWy.js +0 -9
  484. package/build/server/chunks/0-D_duQDWy.js.map +0 -1
  485. package/build/server/chunks/1-C0HdTvXW.js +0 -9
  486. package/build/server/chunks/10-DcfhCR4R.js +0 -9
  487. package/build/server/chunks/10-DcfhCR4R.js.map +0 -1
  488. package/build/server/chunks/15-BQcb9C_y.js +0 -9
  489. package/build/server/chunks/17-DuVCTioj.js +0 -9
  490. package/build/server/chunks/17-DuVCTioj.js.map +0 -1
  491. package/build/server/chunks/18-CT0VFW_p.js +0 -9
  492. package/build/server/chunks/18-CT0VFW_p.js.map +0 -1
  493. package/build/server/chunks/2-DgTzKQAP.js +0 -9
  494. package/build/server/chunks/2-DgTzKQAP.js.map +0 -1
  495. package/build/server/chunks/3-eQMSMzXP.js +0 -9
  496. package/build/server/chunks/3-eQMSMzXP.js.map +0 -1
  497. package/build/server/chunks/4-OaAJtDqP.js +0 -9
  498. package/build/server/chunks/4-OaAJtDqP.js.map +0 -1
  499. package/build/server/chunks/5-CBdMutbv.js +0 -9
  500. package/build/server/chunks/5-CBdMutbv.js.map +0 -1
  501. package/build/server/chunks/6-FoEi7ggm.js +0 -9
  502. package/build/server/chunks/6-FoEi7ggm.js.map +0 -1
  503. package/build/server/chunks/8-B44yRkfX.js +0 -9
  504. package/build/server/chunks/8-B44yRkfX.js.map +0 -1
  505. package/build/server/chunks/9-eUjFpHzI.js +0 -9
  506. package/build/server/chunks/9-eUjFpHzI.js.map +0 -1
  507. package/build/server/chunks/ChatStepTrace-BivoNYOY.js.map +0 -1
  508. package/build/server/chunks/_layout.svelte-B-0DHjLB.js +0 -45
  509. package/build/server/chunks/_layout.svelte-B-0DHjLB.js.map +0 -1
  510. package/build/server/chunks/_layout.svelte-B88WMyk0.js.map +0 -1
  511. package/build/server/chunks/_layout.svelte-wi6o5Ecu.js.map +0 -1
  512. package/build/server/chunks/_page.svelte-57pyhszV.js.map +0 -1
  513. package/build/server/chunks/_page.svelte-BSVJ2d2G.js.map +0 -1
  514. package/build/server/chunks/_page.svelte-BoHt2cpr.js +0 -61
  515. package/build/server/chunks/_page.svelte-BoHt2cpr.js.map +0 -1
  516. package/build/server/chunks/_page.svelte-CeS_21Ho.js.map +0 -1
  517. package/build/server/chunks/_page.svelte-DHSYVLoj.js.map +0 -1
  518. package/build/server/chunks/_page.svelte-DhFNFMnl.js.map +0 -1
  519. package/build/server/chunks/_server.ts-D_eo_OAK.js +0 -139
  520. package/build/server/chunks/_server.ts-D_eo_OAK.js.map +0 -1
  521. package/build/server/chunks/error.svelte-DmKKN1RU.js +0 -15
  522. package/build/server/chunks/source-selection-CcN1cgXc.js.map +0 -1
  523. package/build/server/chunks/trpc-client-D8L6vWf4.js +0 -14
  524. package/build/server/chunks/trpc-client-D8L6vWf4.js.map +0 -1
@@ -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
+ }