@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,25 +1,28 @@
1
- import { l as derived, k as escape_html, m as attr, n as stringify, o as attr_class, p as ensure_array_like, q as attributes, r as clsx, t as bind_props } from './index-LMsd1ih2.js';
2
- import { P as Panel } from './Panel-zvjxe036.js';
3
- import { B as Button } from './Button-DH7gdU0s.js';
4
- import { D as Dropdown } from './Dropdown-DnARl86Q.js';
5
- import { I as Icon } from './Icon-DP1YKCRV.js';
6
- import { T as Tabs, a as Tab } from './Tab-CUkyLqbN.js';
7
- import { M as Modal } from './Modal-CGJuNpZ0.js';
8
- import { o as onDestroy, t as tick } from './index-server-BRr5mZEq.js';
9
- import { g as goto, r as replaceState } from './client-DO-hqMbT.js';
10
- import { p as page } from './index2-ClgfzZ89.js';
1
+ import { n as derived, k as escape_html, l as attr, o as stringify, m as attr_class, p as ensure_array_like, q as attributes, r as clsx, t as bind_props } from './index-DGtbUu8Y.js';
2
+ import { P as Panel } from './Panel-Cj1mXx9-.js';
3
+ import { B as Button } from './Button-Dc9CR4Wh.js';
4
+ import { D as Dropdown } from './Dropdown-Cgd7pG-k.js';
5
+ import { I as Icon } from './Icon-Bogvl2n9.js';
6
+ import { T as Tabs, a as Tab } from './Tab-bf4ZDs5y.js';
7
+ import { M as Modal } from './Modal-7IIIfFEG.js';
8
+ import { o as onDestroy, t as tick } from './index-server-l8-WsVn4.js';
9
+ import { g as goto, r as replaceState } from './client-P-7bDULt.js';
10
+ import { p as page } from './index2-CtgLiJVO.js';
11
11
  import { p as public_env } from './shared-server-DaWdgxVh.js';
12
- import { t as trpc } from './trpc-client-D8L6vWf4.js';
12
+ import { r as repositoryClientAdmission, t as trpc, g as gitFlushRequestOptions, i as isGitModeMutationBlockedError } from './trpc-client-Cr8RJ4UO.js';
13
+ import { g as getGitModeContext } from './git-mode-context-BpNsAUGF.js';
13
14
  import nunjucks from 'nunjucks';
14
- import { A as AgentSidebar } from './AgentSidebar-BWBnqHnV.js';
15
- import { g as getAgentsContext } from './agents-context-CbFsZmi5.js';
16
- import { s as setEditWorkspaceContext, g as getEditWorkspaceContext } from './edit-workspace-context-tyHBPujC.js';
15
+ import { A as AgentSidebar } from './AgentSidebar-BEbSdZdN.js';
16
+ import { g as getAgentsContext } from './agents-context-owgusUPR.js';
17
+ import { s as setEditWorkspaceContext, g as getEditWorkspaceContext } from './edit-workspace-context-hanFnXR3.js';
17
18
  import 'js-yaml';
18
19
  import { c as clearChatContent, a as clearLogs } from './log-content.svelte-CfQzj-v_.js';
19
- import './index3-BdRUAffj.js';
20
- import './root-4q2Pr7ck.js';
21
- import './state.svelte-Bd1i-u49.js';
20
+ import { G as GitControlsButton } from './GitControlsButton-BLcNzrDt.js';
21
+ import './index3-4hbbCqW0.js';
22
+ import './root-sWPnlpi3.js';
23
+ import './state.svelte-BkvaElc6.js';
22
24
  import '@trpc/client';
25
+ import '@trpc/server/observable';
23
26
 
24
27
  function Textarea($$renderer, $$props) {
25
28
  $$renderer.component(($$renderer2) => {
@@ -48,9 +51,38 @@ function PopoverModal($$renderer, $$props) {
48
51
  children($$renderer);
49
52
  $$renderer.push(`<!----></div></div>`);
50
53
  }
54
+ function assertNever(value) {
55
+ throw new Error(`Unhandled client WebSocket message: ${JSON.stringify(value)}`);
56
+ }
57
+ function clientWsMessageDisposition(message) {
58
+ if (message.channel === "chat") return "block";
59
+ switch (message.event.type) {
60
+ case "select-agent":
61
+ case "reload-project":
62
+ case "step-selected":
63
+ case "prompt-overrides-updated":
64
+ return "defer";
65
+ case "context-updated":
66
+ case "prompt-updated":
67
+ case "trigger-action":
68
+ case "hangup":
69
+ return "block";
70
+ default:
71
+ return assertNever(message.event);
72
+ }
73
+ }
74
+ function deferredMessageKey(message) {
75
+ return message.channel === "chat" ? "chat" : message.event.type;
76
+ }
51
77
  class WebSocketClient {
52
- constructor(wsUrl) {
78
+ constructor(wsUrl, admission = repositoryClientAdmission) {
53
79
  this.wsUrl = wsUrl;
80
+ this.admission = admission;
81
+ this.unregisterAdmissionListener = this.admission.onStateChange((state) => {
82
+ if (state.mode !== "open") return;
83
+ if (this.wantsConnection) this.init();
84
+ this.flushDeferredMessages();
85
+ });
54
86
  }
55
87
  ws = null;
56
88
  openHandler = null;
@@ -62,23 +94,33 @@ class WebSocketClient {
62
94
  retryDelay = 500;
63
95
  retryTimeout = null;
64
96
  isOpen = false;
97
+ isConnecting = false;
65
98
  isDestroyed = false;
99
+ wantsConnection = false;
66
100
  agentsLoaded = false;
101
+ deferredMessages = /* @__PURE__ */ new Map();
102
+ pendingGitSyncs = /* @__PURE__ */ new Map();
103
+ unregisterAdmissionListener;
67
104
  init = () => {
68
- if (this.isOpen) {
69
- return;
70
- }
105
+ this.wantsConnection = true;
106
+ if (!this.admission.isOpen() || this.isOpen || this.isConnecting) return;
71
107
  this.agentsLoaded = false;
72
108
  console.log(`Initializing websocket connection with [${this.wsUrl}]`);
73
109
  try {
110
+ this.isConnecting = true;
74
111
  this.ws = new WebSocket(this.wsUrl);
75
112
  } catch {
113
+ this.isConnecting = false;
76
114
  this.retryConnect();
77
115
  return;
78
116
  }
79
117
  this.isDestroyed = false;
80
118
  this.ws.onmessage = (event) => {
81
119
  const message = JSON.parse(event.data);
120
+ if (message.channel === "app-events" && message.event.type === "git-sync-complete") {
121
+ this.resolveGitSync(message.event.requestId);
122
+ return;
123
+ }
82
124
  if (message.channel === "error") {
83
125
  this.errorHandler?.(message.message);
84
126
  } else if (message.channel === "app-events") {
@@ -108,25 +150,41 @@ class WebSocketClient {
108
150
  this.ws.onerror = (error) => {
109
151
  console.error("Websocket error:", error);
110
152
  this.ws?.close();
111
- this.retryConnect();
112
153
  };
113
154
  this.ws.onclose = () => {
114
155
  console.log("Websocket closed");
115
156
  this.isOpen = false;
157
+ this.isConnecting = false;
158
+ this.rejectPendingGitSyncs("The roleplay connection closed before pending writes finished.");
159
+ this.closeHandler?.();
116
160
  this.retryConnect();
117
161
  };
118
162
  this.ws.onopen = () => {
163
+ this.isConnecting = false;
164
+ if (this.isDestroyed || !this.admission.isOpen()) {
165
+ this.ws?.close();
166
+ return;
167
+ }
119
168
  this.retries = 0;
120
169
  this.isOpen = true;
121
170
  if (this.retryTimeout) {
122
171
  clearTimeout(this.retryTimeout);
172
+ this.retryTimeout = null;
123
173
  }
124
174
  this.openHandler?.();
175
+ this.flushDeferredMessages();
125
176
  console.log("Websocket connected");
126
177
  };
127
178
  };
128
179
  destroy = () => {
180
+ this.wantsConnection = false;
129
181
  this.isDestroyed = true;
182
+ this.clearDeferredMessages();
183
+ this.rejectPendingGitSyncs("The roleplay connection closed before pending writes finished.");
184
+ if (this.retryTimeout) {
185
+ clearTimeout(this.retryTimeout);
186
+ this.retryTimeout = null;
187
+ }
130
188
  this.ws?.close();
131
189
  };
132
190
  onOpen = (handler) => {
@@ -147,22 +205,113 @@ class WebSocketClient {
147
205
  onMessage = (handler) => {
148
206
  this.messageHandler = handler;
149
207
  };
150
- sendMessage = (message) => {
208
+ sendMessage = (message, options) => {
151
209
  if (message.channel === "app-events") ;
152
- this.ws?.send(JSON.stringify(message));
210
+ const flushAuthorized = this.admission.isFlushAuthorized(options?.gitFlushOperationId);
211
+ const state = this.admission.getState();
212
+ const disposition = clientWsMessageDisposition(message);
213
+ if (!flushAuthorized && state.mode !== "open") {
214
+ if (disposition === "defer") {
215
+ this.deferMessage(message);
216
+ return "deferred";
217
+ }
218
+ this.admission.blockMutation(
219
+ message.channel === "chat" ? "websocket.chat" : `websocket.${message.event.type}`
220
+ );
221
+ return "blocked";
222
+ }
223
+ if (!this.isOpen || !this.ws) {
224
+ if (disposition === "defer") {
225
+ this.deferMessage(message);
226
+ this.init();
227
+ return "deferred";
228
+ }
229
+ this.errorHandler?.("The roleplay connection is not ready. Wait for it to reconnect.");
230
+ return "not-ready";
231
+ }
232
+ this.ws.send(JSON.stringify(message));
233
+ return "sent";
234
+ };
235
+ sendGitSyncRequest = (requestId, operationId) => {
236
+ if (!this.admission.isFlushAuthorized(operationId)) {
237
+ return Promise.reject(
238
+ new Error("The Git WebSocket barrier is not authorized for the active refresh.")
239
+ );
240
+ }
241
+ if (!this.isOpen || !this.ws) {
242
+ return Promise.reject(
243
+ new Error("The roleplay connection closed before pending writes finished.")
244
+ );
245
+ }
246
+ return new Promise((resolve, reject) => {
247
+ const timer = setTimeout(() => {
248
+ this.pendingGitSyncs.delete(requestId);
249
+ reject(new Error("Timed out while waiting for pending roleplay writes to finish."));
250
+ }, 5e3);
251
+ this.pendingGitSyncs.set(requestId, { resolve, reject, timer });
252
+ try {
253
+ this.ws?.send(
254
+ JSON.stringify({
255
+ channel: "app-events",
256
+ event: { type: "git-sync-request", requestId }
257
+ })
258
+ );
259
+ } catch (error) {
260
+ clearTimeout(timer);
261
+ this.pendingGitSyncs.delete(requestId);
262
+ reject(error instanceof Error ? error : new Error(String(error)));
263
+ }
264
+ });
265
+ };
266
+ clearDeferredMessages = () => {
267
+ this.deferredMessages.clear();
153
268
  };
154
269
  isReady = () => this.isOpen && this.agentsLoaded;
155
270
  retryConnect = () => {
156
271
  if (this.isDestroyed) return;
157
- if (!this.isOpen && this.retries < this.maxRetries) {
158
- this.retries++;
159
- this.init();
160
- this.retryTimeout = setTimeout(this.retryConnect, this.retryDelay);
161
- } else {
272
+ if (!this.admission.isOpen()) return;
273
+ if (this.isOpen || this.isConnecting || this.retryTimeout) return;
274
+ if (this.retries >= this.maxRetries) {
162
275
  this.errorHandler?.("WebSocket Error, please reload the browser");
163
276
  this.closeHandler?.();
277
+ return;
164
278
  }
279
+ this.retryTimeout = setTimeout(() => {
280
+ this.retryTimeout = null;
281
+ if (this.isDestroyed || !this.admission.isOpen() || this.isOpen || this.isConnecting) return;
282
+ this.retries++;
283
+ this.init();
284
+ }, this.retryDelay);
165
285
  };
286
+ deferMessage(message) {
287
+ const key = deferredMessageKey(message);
288
+ if (message.channel === "app-events" && message.event.type === "select-agent") {
289
+ this.deferredMessages.delete("step-selected");
290
+ this.deferredMessages.delete("prompt-overrides-updated");
291
+ }
292
+ this.deferredMessages.delete(key);
293
+ this.deferredMessages.set(key, message);
294
+ }
295
+ flushDeferredMessages() {
296
+ if (!this.admission.isOpen() || !this.isOpen || !this.ws) return;
297
+ const messages = [...this.deferredMessages.values()];
298
+ this.deferredMessages.clear();
299
+ for (const message of messages) this.ws.send(JSON.stringify(message));
300
+ }
301
+ resolveGitSync(requestId) {
302
+ const pending = this.pendingGitSyncs.get(requestId);
303
+ if (!pending) return;
304
+ clearTimeout(pending.timer);
305
+ this.pendingGitSyncs.delete(requestId);
306
+ pending.resolve();
307
+ }
308
+ rejectPendingGitSyncs(message) {
309
+ for (const pending of this.pendingGitSyncs.values()) {
310
+ clearTimeout(pending.timer);
311
+ pending.reject(new Error(message));
312
+ }
313
+ this.pendingGitSyncs.clear();
314
+ }
166
315
  }
167
316
  const wsHost = public_env.PUBLIC_WS_HOST ?? `ws://${public_env.PUBLIC_WS_HOSTNAME ?? "localhost"}:${public_env.PUBLIC_WS_PORT ?? "8080"}`;
168
317
  const wsClient = new WebSocketClient(wsHost);
@@ -171,6 +320,7 @@ function SchemaEditor($$renderer, $$props) {
171
320
  let editor = null;
172
321
  let model = null;
173
322
  let disposables = [];
323
+ getGitModeContext();
174
324
  let { class: className } = $$props;
175
325
  onDestroy(() => {
176
326
  for (const d of disposables) {
@@ -242,12 +392,13 @@ function PromptEditor($$renderer, $$props) {
242
392
  showPreviewToggle = true,
243
393
  preview = null,
244
394
  onPreviewChange,
245
- onEditorReady
395
+ onEditorReady,
396
+ onReadOnlyEditAttempt
246
397
  } = $$props;
247
398
  let internalPreview = false;
248
399
  const effectivePreview = derived(() => preview !== null ? preview : internalPreview);
249
400
  Panel($$renderer2, {
250
- class: `relative overflow-hidden ${stringify(className)}`,
401
+ class: `prompt-editor-frame relative overflow-hidden ${stringify(className)}`,
251
402
  children: ($$renderer3) => {
252
403
  $$renderer3.push(`<div class="prompt-editor flex h-full flex-col"><div class="relative flex-1"><div class="h-full w-full"></div> `);
253
404
  if (showPreviewToggle && !readOnly) {
@@ -283,7 +434,8 @@ function ReadOnlyMonacoDiff($$renderer, $$props) {
283
434
  let {
284
435
  class: className = ""
285
436
  } = $$props;
286
- $$renderer2.push(`<div${attr_class(`overflow-hidden rounded-md border border-rc-gray-700 ${className}`)}><div class="h-full w-full"></div></div>`);
437
+ const frameClass = derived(() => "prompt-editor prompt-editor-frame");
438
+ $$renderer2.push(`<div${attr_class(`overflow-hidden ${frameClass()} ${className}`)}><div class="h-full w-full"></div></div>`);
287
439
  });
288
440
  }
289
441
  function ModeAsyncPopoverContent($$renderer, $$props) {
@@ -421,6 +573,7 @@ function ContextEditor($$renderer, $$props) {
421
573
  let model = null;
422
574
  let editorDisposables = [];
423
575
  let persistViewStateTimeout = null;
576
+ getGitModeContext();
424
577
  let {
425
578
  class: className,
426
579
  editorStateKey = "editorState/context/default"
@@ -459,6 +612,7 @@ function ContextEditor($$renderer, $$props) {
459
612
  });
460
613
  Panel($$renderer2, {
461
614
  class: `min-h-0 overflow-hidden ${stringify(
615
+ // Keep model language in sync without recreating the editor
462
616
  // Keep model language in sync without recreating the editor
463
617
  // Update value only when actual text differs to avoid caret jumps
464
618
  // If the next canonical text equals the last user-emitted serialization,
@@ -474,6 +628,9 @@ function ModeContextPopoverContent($$renderer, $$props) {
474
628
  $$renderer.component(($$renderer2) => {
475
629
  const tmp = getEditWorkspaceContext(), workspace = tmp.state;
476
630
  tmp.actions;
631
+ const gitMode = getGitModeContext();
632
+ const unregisterGitBlocker = gitMode.registerBlocker("roleplay-context-draft", () => "The roleplay context editor is open.");
633
+ onDestroy(unregisterGitBlocker);
477
634
  $$renderer2.push(`<div class="min-h-0 flex-1 overflow-hidden p-3">`);
478
635
  ContextEditor($$renderer2, {
479
636
  class: "h-full min-h-0 border-thin border-rc-gray-650 shadow-inner-white-soft backdrop-blur-3xl focus:outline-none focus:ring-0",
@@ -773,6 +930,7 @@ function _layout($$renderer, $$props) {
773
930
  $$renderer.component(($$renderer2) => {
774
931
  let { params, children } = $$props;
775
932
  const { onError } = getAgentsContext();
933
+ const gitMode = getGitModeContext();
776
934
  let agents = [];
777
935
  const dec = (s) => {
778
936
  try {
@@ -797,6 +955,7 @@ function _layout($$renderer, $$props) {
797
955
  currentStep: null,
798
956
  promptDrafts: {},
799
957
  promptEdits: {},
958
+ testHistoryEdits: {},
800
959
  context: null,
801
960
  promptContext: null,
802
961
  agentStates: [],
@@ -814,11 +973,17 @@ function _layout($$renderer, $$props) {
814
973
  else url.searchParams.set(key, value);
815
974
  replaceState(url.toString());
816
975
  }
817
- function sendAppEvent(event) {
818
- wsClient.sendMessage({ channel: "app-events", event });
976
+ function sendAppEvent(event, options) {
977
+ wsClient.sendMessage({ channel: "app-events", event }, options);
978
+ }
979
+ function flushWebSocketWrites(context) {
980
+ if (!wsClient.isReady()) return Promise.resolve();
981
+ return wsClient.sendGitSyncRequest(crypto.randomUUID(), context.operationId);
819
982
  }
983
+ gitMode.registerFlusher("edit-websocket-writes", flushWebSocketWrites, { final: true });
820
984
  const activeStepName = derived(() => workspace.currentStep?.name ?? null);
821
985
  const promptEditKey = (agentId, stepName) => `${agentId}\0${stepName}`;
986
+ const testHistoryEditKey = (agentId, region, testId) => `${agentId}\0${region ?? ""}\0${testId}`;
822
987
  const activePromptEdit = derived(() => {
823
988
  const stepName = activeStepName();
824
989
  if (!stepName) return null;
@@ -831,6 +996,7 @@ function _layout($$renderer, $$props) {
831
996
  return typeof draft === "string" ? draft : "";
832
997
  });
833
998
  const activeRuntimePrompt = derived(() => activePromptEdit()?.suggestedPrompt ?? activePromptDraft());
999
+ const promptWritesPaused = derived(() => gitMode.isWritePaused());
834
1000
  function getPromptOverrides(agentId = workspace.agentId) {
835
1001
  const overrides = {};
836
1002
  for (const proposal of Object.values(workspace.promptEdits)) {
@@ -838,6 +1004,15 @@ function _layout($$renderer, $$props) {
838
1004
  }
839
1005
  return overrides;
840
1006
  }
1007
+ function getTestHistoryOverrides(agentId = workspace.agentId, region = workspace.region) {
1008
+ const overrides = {};
1009
+ for (const proposal of Object.values(workspace.testHistoryEdits)) {
1010
+ if (proposal.agentId === agentId && proposal.region === region) {
1011
+ overrides[proposal.testId] = { conversation: proposal.suggestedConversation };
1012
+ }
1013
+ }
1014
+ return overrides;
1015
+ }
841
1016
  function syncRuntimePromptOverrides() {
842
1017
  if (!workspace.wsLoaded) return;
843
1018
  sendAppEvent({
@@ -851,16 +1026,23 @@ function _layout($$renderer, $$props) {
851
1026
  }
852
1027
  let promptSaveTimer = null;
853
1028
  let pendingPromptSave = null;
1029
+ let acceptedPromptSaveToSkip = null;
854
1030
  let promptSaveQueue = Promise.resolve();
1031
+ let promptSaveInFlight = 0;
855
1032
  const PROMPT_SAVE_DEBOUNCE_MS = 800;
856
1033
  function clearPromptSaveTimer() {
857
1034
  if (!promptSaveTimer) return;
858
1035
  clearTimeout(promptSaveTimer);
859
1036
  promptSaveTimer = null;
860
1037
  }
861
- async function persistPromptSave(agentId, stepName, prompt) {
1038
+ async function persistPromptSave(agentId, stepName, prompt, flushContext) {
1039
+ promptSaveInFlight += 1;
862
1040
  try {
863
- await trpc.agents.savePrompt.mutate({ agentId, step: stepName, prompt });
1041
+ await trpc.agents.savePrompt.mutate({ agentId, step: stepName, prompt }, flushContext ? gitFlushRequestOptions(flushContext.operationId) : void 0);
1042
+ if (workspace.agentId === agentId) {
1043
+ workspace.steps = workspace.steps.map((step) => step.name === stepName ? { ...step, prompt } : step);
1044
+ workspace.currentStep = workspace.steps.find((step) => step.name === activeStepName()) ?? workspace.currentStep;
1045
+ }
864
1046
  } catch (error) {
865
1047
  console.error("Failed to save prompt", error);
866
1048
  const currentDraft = workspace.promptDrafts[stepName];
@@ -868,23 +1050,29 @@ function _layout($$renderer, $$props) {
868
1050
  pendingPromptSave = { stepName, prompt };
869
1051
  }
870
1052
  throw error;
1053
+ } finally {
1054
+ promptSaveInFlight -= 1;
871
1055
  }
872
1056
  }
873
- function queuePromptSave(agentId, stepName, prompt) {
1057
+ function queuePromptSave(agentId, stepName, prompt, flushContext) {
874
1058
  const op = promptSaveQueue.catch(() => {
875
- }).then(() => persistPromptSave(agentId, stepName, prompt));
1059
+ }).then(() => persistPromptSave(agentId, stepName, prompt, flushContext));
876
1060
  promptSaveQueue = op.catch(() => {
877
1061
  });
878
1062
  return op;
879
1063
  }
880
- async function flushPromptSave() {
881
- if (!pendingPromptSave) return;
882
- const agentId = workspace.agentId.trim();
883
- if (!agentId) return;
884
- const { stepName, prompt } = pendingPromptSave;
885
- clearPromptSaveTimer();
886
- pendingPromptSave = null;
887
- await queuePromptSave(agentId, stepName, prompt);
1064
+ async function flushPromptSave(force = false, flushContext) {
1065
+ if (!force && gitMode.isWritePaused()) return;
1066
+ await promptSaveQueue;
1067
+ while (pendingPromptSave) {
1068
+ const agentId = workspace.agentId.trim();
1069
+ if (!agentId) return;
1070
+ const { stepName, prompt } = pendingPromptSave;
1071
+ clearPromptSaveTimer();
1072
+ pendingPromptSave = null;
1073
+ await queuePromptSave(agentId, stepName, prompt, flushContext);
1074
+ await promptSaveQueue;
1075
+ }
888
1076
  }
889
1077
  function schedulePromptSave(stepName, prompt) {
890
1078
  pendingPromptSave = { stepName, prompt };
@@ -892,19 +1080,33 @@ function _layout($$renderer, $$props) {
892
1080
  promptSaveTimer = setTimeout(
893
1081
  () => {
894
1082
  promptSaveTimer = null;
1083
+ if (gitMode.isWritePaused()) return;
895
1084
  void flushPromptSave();
896
1085
  },
897
1086
  PROMPT_SAVE_DEBOUNCE_MS
898
1087
  );
899
1088
  }
1089
+ const unregisterGitPromptFlusher = gitMode.registerFlusher("edit-prompt", (context) => flushPromptSave(true, context));
1090
+ const unregisterGitPromptBlocker = gitMode.registerBlocker("edit-prompt-save", () => {
1091
+ if (promptSaveTimer || pendingPromptSave || promptSaveInFlight > 0) {
1092
+ return "A prompt edit is still being saved.";
1093
+ }
1094
+ return null;
1095
+ });
900
1096
  function handlePromptChanged(newPrompt) {
901
1097
  const stepName = activeStepName();
902
1098
  if (!stepName) return;
903
1099
  workspace.promptDrafts[stepName] = newPrompt;
1100
+ if (acceptedPromptSaveToSkip?.stepName === stepName && acceptedPromptSaveToSkip.prompt === newPrompt) {
1101
+ acceptedPromptSaveToSkip = null;
1102
+ return;
1103
+ }
1104
+ acceptedPromptSaveToSkip = null;
904
1105
  schedulePromptSave(stepName, newPrompt);
905
1106
  }
906
1107
  let aiEditModalOpen = false;
907
1108
  let aiEditRequest = "";
1109
+ let aiEditTarget = null;
908
1110
  let aiEditGenerating = false;
909
1111
  let aiEditProgress = null;
910
1112
  function formatAiEditStatus(summary) {
@@ -916,10 +1118,37 @@ function _layout($$renderer, $$props) {
916
1118
  let aiEditResolutionError = null;
917
1119
  let aiEditResolving = false;
918
1120
  let noChangesModalOpen = false;
1121
+ let aiEditGenerationInFlight = 0;
919
1122
  let aiEditRequestId = 0;
920
- function openAiEditModal() {
921
- if (!workspace.currentStep || activePromptEdit()) return;
922
- aiEditRequest = "";
1123
+ let editShellDestroyed = false;
1124
+ const unregisterGitAiEditBlocker = gitMode.registerBlocker("ai-prompt-edit", () => {
1125
+ if (aiEditGenerationInFlight > 0 || aiEditGenerating) {
1126
+ return "An AI edit is still being generated.";
1127
+ }
1128
+ if (aiEditResolving) return "An AI edit is still being accepted.";
1129
+ if (Object.keys(workspace.promptEdits).length > 0) {
1130
+ return "Accept or reject the pending AI prompt edit before refreshing.";
1131
+ }
1132
+ if (Object.keys(workspace.testHistoryEdits).length > 0) {
1133
+ return "Accept or reject the pending AI test history edit before refreshing.";
1134
+ }
1135
+ if (aiEditModalOpen && aiEditRequest.trim()) {
1136
+ return "Finish or cancel the open AI edit before refreshing.";
1137
+ }
1138
+ return null;
1139
+ });
1140
+ function aiEditStartIsBlocked() {
1141
+ if (!gitMode.isWritePaused() && !gitMode.isActivationStarting()) return false;
1142
+ gitMode.requestBlockedOperationNotice();
1143
+ return true;
1144
+ }
1145
+ function openAiEditModal(request = "", target) {
1146
+ if (!workspace.currentStep) return;
1147
+ const targetPromptEdit = target ? activePromptEditFor(workspace.agentId, target.step) : activePromptEdit();
1148
+ if ((!target || target.kind === "test-fix") && targetPromptEdit) return;
1149
+ if (aiEditStartIsBlocked()) return;
1150
+ aiEditRequest = request;
1151
+ aiEditTarget = target ?? null;
923
1152
  aiEditError = null;
924
1153
  noChangesModalOpen = false;
925
1154
  aiEditModalOpen = true;
@@ -928,6 +1157,7 @@ function _layout($$renderer, $$props) {
928
1157
  aiEditRequestId += 1;
929
1158
  aiEditGenerating = false;
930
1159
  aiEditModalOpen = false;
1160
+ aiEditTarget = null;
931
1161
  noChangesModalOpen = false;
932
1162
  }
933
1163
  async function pollAiEditProgress(progressId, requestId) {
@@ -952,34 +1182,88 @@ function _layout($$renderer, $$props) {
952
1182
  }
953
1183
  async function requestAiEdit() {
954
1184
  const request = aiEditRequest.trim();
955
- const stepName = activeStepName();
1185
+ const target = aiEditTarget;
1186
+ const stepName = target?.step ?? activeStepName();
956
1187
  const agentId = workspace.agentId.trim();
957
1188
  if (!request || !stepName || !agentId || aiEditGenerating) return;
1189
+ if (aiEditStartIsBlocked()) return;
958
1190
  const requestId = ++aiEditRequestId;
959
1191
  const progressId = crypto.randomUUID();
960
1192
  aiEditGenerating = true;
1193
+ aiEditGenerationInFlight += 1;
961
1194
  aiEditProgress = null;
962
1195
  aiEditError = null;
963
1196
  void pollAiEditProgress(progressId, requestId);
964
1197
  try {
965
- await flushPromptSave();
966
- const result = await trpc.agents.suggestPromptEdit.mutate({ agentId, step: stepName, request, progressId });
1198
+ if (!target) {
1199
+ await flushPromptSave();
1200
+ if (editShellDestroyed || requestId !== aiEditRequestId) return;
1201
+ if (gitMode.isWritePaused()) {
1202
+ gitMode.requestBlockedOperationNotice();
1203
+ return;
1204
+ }
1205
+ }
1206
+ let historyProposal = null;
1207
+ let historyResult = null;
1208
+ let result = null;
1209
+ if (target?.kind === "test-fix") {
1210
+ const fixResult = await trpc.agents.suggestTestFix.mutate({
1211
+ agentId,
1212
+ region: workspace.region,
1213
+ testId: target.testId,
1214
+ step: stepName,
1215
+ request,
1216
+ prompt: target.prompt,
1217
+ basePrompt: target.basePrompt,
1218
+ currentIncorrectOutcome: target.currentIncorrectOutcome ?? "",
1219
+ progressId
1220
+ });
1221
+ historyResult = fixResult.history;
1222
+ result = fixResult.prompt;
1223
+ } else if (target) {
1224
+ historyResult = await trpc.tests.suggestHistoryEdit.mutate({
1225
+ agent: agentId,
1226
+ region: workspace.region,
1227
+ testId: target.testId,
1228
+ step: stepName,
1229
+ request,
1230
+ prompt: target.prompt,
1231
+ basePrompt: target.basePrompt,
1232
+ progressId
1233
+ });
1234
+ } else {
1235
+ result = await trpc.agents.suggestPromptEdit.mutate({ agentId, step: stepName, request, progressId });
1236
+ }
967
1237
  if (requestId !== aiEditRequestId) return;
968
- if (result.status === "unchanged") {
1238
+ if (target && historyResult?.status === "changed") {
1239
+ historyProposal = historyResult.proposal;
1240
+ }
1241
+ if (!historyProposal && (!result || result.status === "unchanged")) {
969
1242
  noChangesModalOpen = true;
970
1243
  return;
971
1244
  }
972
- const proposal = result.proposal;
973
- workspace.promptEdits[promptEditKey(proposal.agentId, proposal.step)] = proposal;
974
- setQueryParam("promptEdit", proposal.id);
1245
+ if (historyProposal) {
1246
+ workspace.testHistoryEdits[testHistoryEditKey(historyProposal.agentId, historyProposal.region, historyProposal.testId)] = historyProposal;
1247
+ }
1248
+ if (result?.status === "changed") {
1249
+ const proposal = result.proposal;
1250
+ workspace.promptEdits[promptEditKey(proposal.agentId, proposal.step)] = proposal;
1251
+ setQueryParam("promptEdit", proposal.id);
1252
+ previewEnabled = false;
1253
+ syncRuntimePromptOverrides();
1254
+ }
975
1255
  aiEditModalOpen = false;
976
- previewEnabled = false;
977
- syncRuntimePromptOverrides();
1256
+ aiEditTarget = null;
978
1257
  } catch (error) {
979
1258
  if (requestId !== aiEditRequestId) return;
1259
+ if (isGitModeMutationBlockedError(error)) {
1260
+ gitMode.requestBlockedOperationNotice();
1261
+ return;
1262
+ }
980
1263
  console.error("Failed to suggest prompt edits", error);
981
1264
  aiEditError = error instanceof Error ? error.message : "Failed to suggest edits";
982
1265
  } finally {
1266
+ aiEditGenerationInFlight -= 1;
983
1267
  if (requestId === aiEditRequestId) {
984
1268
  aiEditGenerating = false;
985
1269
  aiEditProgress = null;
@@ -992,9 +1276,39 @@ function _layout($$renderer, $$props) {
992
1276
  }
993
1277
  if (page.url.searchParams.get("promptEdit") === proposalId) setQueryParam("promptEdit", null);
994
1278
  }
1279
+ function captureAiEditScroll() {
1280
+ const editor = inspectionPromptEditor ?? pendingDiffModifiedEditor;
1281
+ const viewState = editor?.saveViewState() ?? null;
1282
+ if (!editor || !viewState) return null;
1283
+ const topLine = editor.getVisibleRanges()[0]?.startLineNumber ?? null;
1284
+ return {
1285
+ viewState,
1286
+ topLine,
1287
+ topLineOffset: topLine ? editor.getTopForLineNumber(topLine) - editor.getScrollTop() : 0
1288
+ };
1289
+ }
1290
+ function restoreAiEditScroll(snapshot) {
1291
+ if (!snapshot || !basePromptEditor) return;
1292
+ const editor = basePromptEditor;
1293
+ const apply = () => {
1294
+ if (basePromptEditor !== editor) return;
1295
+ try {
1296
+ editor.restoreViewState(snapshot.viewState);
1297
+ if (snapshot.topLine) {
1298
+ editor.setScrollTop(editor.getTopForLineNumber(snapshot.topLine) - snapshot.topLineOffset);
1299
+ }
1300
+ } catch (error) {
1301
+ console.warn("Failed to preserve prompt scroll position", error);
1302
+ }
1303
+ };
1304
+ apply();
1305
+ requestAnimationFrame(apply);
1306
+ }
995
1307
  function rejectAiEdit() {
996
1308
  const proposal = activePromptEdit();
997
1309
  if (!proposal || aiEditResolving) return;
1310
+ const scrollSnapshot = captureAiEditScroll();
1311
+ restoreAiEditScroll(scrollSnapshot);
998
1312
  closeModePopover();
999
1313
  aiEditResolutionError = null;
1000
1314
  removePromptEditFromWorkspace(proposal.id);
@@ -1003,21 +1317,55 @@ function _layout($$renderer, $$props) {
1003
1317
  console.error("Failed to release rejected prompt edit", error);
1004
1318
  });
1005
1319
  }
1320
+ function applyAcceptedPromptToUndoHistory(stepName, prompt) {
1321
+ if (activeStepName() !== stepName || !basePromptEditor) return false;
1322
+ const model = basePromptEditor.getModel();
1323
+ if (!model) return false;
1324
+ if (model.getValue() === prompt) return true;
1325
+ try {
1326
+ acceptedPromptSaveToSkip = { stepName, prompt };
1327
+ model.pushStackElement();
1328
+ model.pushEditOperations(
1329
+ basePromptEditor.getSelections(),
1330
+ [
1331
+ {
1332
+ range: model.getFullModelRange(),
1333
+ text: prompt,
1334
+ forceMoveMarkers: true
1335
+ }
1336
+ ],
1337
+ () => null
1338
+ );
1339
+ model.pushStackElement();
1340
+ return model.getValue() === prompt;
1341
+ } catch (error) {
1342
+ console.warn("Failed to add the accepted prompt edit to Monaco undo history", error);
1343
+ return false;
1344
+ } finally {
1345
+ acceptedPromptSaveToSkip = null;
1346
+ }
1347
+ }
1006
1348
  async function acceptAiEdit() {
1007
1349
  const proposal = activePromptEdit();
1008
1350
  if (!proposal || aiEditResolving) return;
1351
+ const scrollSnapshot = captureAiEditScroll();
1009
1352
  closeModePopover();
1010
1353
  aiEditResolving = true;
1011
1354
  aiEditResolutionError = null;
1012
1355
  try {
1013
1356
  const result = await trpc.agents.acceptPromptEdit.mutate({ id: proposal.id });
1357
+ if (editShellDestroyed) return;
1358
+ applyAcceptedPromptToUndoHistory(proposal.step, result.prompt);
1014
1359
  workspace.promptDrafts[proposal.step] = result.prompt;
1015
1360
  workspace.steps = workspace.steps.map((step) => step.name === proposal.step ? { ...step, prompt: result.prompt } : step);
1016
1361
  workspace.currentStep = workspace.steps.find((step) => step.name === activeStepName()) ?? workspace.currentStep;
1017
1362
  await tick();
1363
+ if (editShellDestroyed) return;
1364
+ restoreAiEditScroll(scrollSnapshot);
1018
1365
  removePromptEditFromWorkspace(proposal.id);
1019
1366
  syncRuntimePromptOverrides();
1020
1367
  } catch (error) {
1368
+ if (editShellDestroyed) return;
1021
1369
  console.error("Failed to accept prompt edit", error);
1022
1370
  aiEditResolutionError = error instanceof Error ? error.message : "Failed to save prompt";
1023
1371
  } finally {
@@ -1032,6 +1380,11 @@ function _layout($$renderer, $$props) {
1032
1380
  let schemaSaveError = null;
1033
1381
  let schemaSaveNotice = null;
1034
1382
  const schemaDirty = derived(() => schemaDraft !== (schemaValue() ?? ""));
1383
+ const unregisterGitSchemaBlocker = gitMode.registerBlocker("schema-draft", () => {
1384
+ if (schemaSaving) return "The schema is still being saved.";
1385
+ if (schemaModalOpen && schemaDirty()) return "An unsaved schema draft is open.";
1386
+ return null;
1387
+ });
1035
1388
  function openSchemaModal() {
1036
1389
  if (!schemaValue()) return;
1037
1390
  schemaDraft = schemaValue();
@@ -1133,6 +1486,9 @@ function _layout($$renderer, $$props) {
1133
1486
  }
1134
1487
  let basePromptHighlighter = null;
1135
1488
  let inspectionPromptHighlighter = null;
1489
+ let basePromptEditor = null;
1490
+ let inspectionPromptEditor = null;
1491
+ let pendingDiffModifiedEditor = null;
1136
1492
  let previewEnabled = false;
1137
1493
  function renderPromptPreview(prompt) {
1138
1494
  try {
@@ -1154,11 +1510,13 @@ function _layout($$renderer, $$props) {
1154
1510
  return previewEnabled ? renderPromptPreview(proposal.suggestedPrompt) : proposal.suggestedPrompt;
1155
1511
  });
1156
1512
  function handleBasePromptEditorReady(editor, monaco) {
1513
+ basePromptEditor = editor;
1157
1514
  basePromptHighlighter?.dispose();
1158
1515
  basePromptHighlighter = createPromptHighlighter(editor, monaco);
1159
1516
  basePromptHighlighter.setHighlights(workspace.edit.highlights);
1160
1517
  }
1161
1518
  function handleInspectionPromptEditorReady(editor, monaco) {
1519
+ inspectionPromptEditor = editor;
1162
1520
  inspectionPromptHighlighter?.dispose();
1163
1521
  inspectionPromptHighlighter = createPromptHighlighter(editor, monaco);
1164
1522
  inspectionPromptHighlighter.setHighlights(workspace.edit.highlights);
@@ -1252,17 +1610,19 @@ function _layout($$renderer, $$props) {
1252
1610
  openContextPopover,
1253
1611
  closeContextPopover,
1254
1612
  toggleContextPopover,
1613
+ openAiEdit: (request, target) => openAiEditModal(request, target),
1255
1614
  sendAppEvent,
1256
1615
  sendChatMessage: (message) => {
1257
1616
  if (!workspace.wsLoaded || !workspace.chatReady) {
1258
1617
  console.warn("[roleplay] Ignoring chat message while websocket session is reconnecting");
1259
- return;
1618
+ return false;
1260
1619
  }
1261
1620
  syncRuntimePromptOverrides();
1262
- wsClient.sendMessage({ channel: "chat", message });
1621
+ return wsClient.sendMessage({ channel: "chat", message }) === "sent";
1263
1622
  },
1264
1623
  flushPromptSave,
1265
1624
  getPromptOverrides: () => getPromptOverrides(),
1625
+ getTestHistoryOverrides: () => getTestHistoryOverrides(),
1266
1626
  getActivePromptEditId: () => activePromptEdit()?.id ?? null,
1267
1627
  selectState: (stateId) => {
1268
1628
  void flushPromptSave();
@@ -1288,12 +1648,23 @@ function _layout($$renderer, $$props) {
1288
1648
  }
1289
1649
  });
1290
1650
  onDestroy(() => {
1651
+ editShellDestroyed = true;
1652
+ aiEditRequestId += 1;
1653
+ aiEditGenerating = false;
1654
+ unregisterGitPromptFlusher();
1655
+ unregisterGitPromptBlocker();
1656
+ unregisterGitAiEditBlocker();
1657
+ unregisterGitSchemaBlocker();
1658
+ wsClient.clearDeferredMessages();
1291
1659
  void flushPromptSave();
1292
1660
  clearPromptSaveTimer();
1293
1661
  basePromptHighlighter?.dispose();
1294
1662
  basePromptHighlighter = null;
1663
+ basePromptEditor = null;
1295
1664
  inspectionPromptHighlighter?.dispose();
1296
1665
  inspectionPromptHighlighter = null;
1666
+ inspectionPromptEditor = null;
1667
+ pendingDiffModifiedEditor = null;
1297
1668
  });
1298
1669
  let $$settled = true;
1299
1670
  let $$inner_renderer;
@@ -1400,7 +1771,9 @@ function _layout($$renderer, $$props) {
1400
1771
  } else {
1401
1772
  $$renderer3.push("<!--[-1-->");
1402
1773
  }
1403
- $$renderer3.push(`<!--]--></div></nav> <div class="flex-1 overflow-hidden"><div class="grid h-full w-full grid-cols-[minmax(140px,2fr)_minmax(0,10fr)_minmax(0,11fr)]">`);
1774
+ $$renderer3.push(`<!--]--> `);
1775
+ GitControlsButton($$renderer3);
1776
+ $$renderer3.push(`<!----></div></nav> <div class="flex-1 overflow-hidden"><div class="grid h-full w-full grid-cols-[minmax(140px,2fr)_minmax(0,10fr)_minmax(0,11fr)]">`);
1404
1777
  Panel($$renderer3, {
1405
1778
  class: "flex h-full min-w-0 flex-col !rounded-none p-0",
1406
1779
  children: ($$renderer4) => {
@@ -1438,7 +1811,7 @@ function _layout($$renderer, $$props) {
1438
1811
  Button($$renderer3, {
1439
1812
  variant: "secondary",
1440
1813
  disabled: !workspace.currentStep || !!activePromptEdit() || aiEditGenerating,
1441
- onclick: openAiEditModal,
1814
+ onclick: () => openAiEditModal(),
1442
1815
  children: ($$renderer4) => {
1443
1816
  $$renderer4.push(`<!---->Edit with AI`);
1444
1817
  },
@@ -1450,18 +1823,19 @@ function _layout($$renderer, $$props) {
1450
1823
  $$renderer3.push(`<div class="relative h-full min-w-0"><!---->`);
1451
1824
  {
1452
1825
  PromptEditor($$renderer3, {
1453
- class: "h-full min-w-0 border-thin border-rc-gray-650 bg-rc-gray-800 shadow-inner-white-soft backdrop-blur-3xl focus:outline-none focus:ring-0",
1826
+ class: "h-full min-w-0 focus:outline-none focus:ring-0",
1454
1827
  initialPrompt: activePromptDraft(),
1455
1828
  agentId: workspace.agentId,
1456
1829
  stepName: workspace.currentStep.name,
1457
1830
  onPromptChanged: handlePromptChanged,
1458
1831
  showSchemaButton: hasSchema() && !activePromptEdit(),
1459
1832
  onSchemaClick: openSchemaModal,
1460
- readOnly: !!activePromptEdit(),
1461
- readOnlyMessage: activePromptEdit() ? "Accept or reject the AI suggestion before editing." : "",
1833
+ readOnly: !!activePromptEdit() || promptWritesPaused(),
1834
+ readOnlyMessage: activePromptEdit() ? "Accept or reject the AI suggestion before editing." : promptWritesPaused() ? "Bosun is refreshing the project." : "",
1462
1835
  showPreviewToggle: false,
1463
1836
  preview: activePromptEdit() ? false : previewEnabled,
1464
- onEditorReady: handleBasePromptEditorReady
1837
+ onEditorReady: handleBasePromptEditorReady,
1838
+ onReadOnlyEditAttempt: gitMode.requestBlockedOperationNotice
1465
1839
  });
1466
1840
  }
1467
1841
  $$renderer3.push(`<!----> `);
@@ -1471,7 +1845,7 @@ function _layout($$renderer, $$props) {
1471
1845
  if (workspace.edit.popover) {
1472
1846
  $$renderer3.push("<!--[0-->");
1473
1847
  PromptEditor($$renderer3, {
1474
- class: "h-full min-w-0 border-thin border-rc-gray-650 bg-rc-gray-800 shadow-inner-white-soft backdrop-blur-3xl focus:outline-none focus:ring-0",
1848
+ class: "h-full min-w-0 focus:outline-none focus:ring-0",
1475
1849
  initialPrompt: activePromptEdit().suggestedPrompt,
1476
1850
  agentId: workspace.agentId,
1477
1851
  stepName: workspace.currentStep.name,
@@ -1482,12 +1856,13 @@ function _layout($$renderer, $$props) {
1482
1856
  readOnlyMessage: "Accept or reject the AI suggestion before editing.",
1483
1857
  bottomPadding: 56,
1484
1858
  showPreviewToggle: false,
1485
- onEditorReady: handleInspectionPromptEditorReady
1859
+ onEditorReady: handleInspectionPromptEditorReady,
1860
+ onReadOnlyEditAttempt: gitMode.requestBlockedOperationNotice
1486
1861
  });
1487
1862
  } else {
1488
1863
  $$renderer3.push("<!--[-1-->");
1489
1864
  ReadOnlyMonacoDiff($$renderer3, {
1490
- class: "h-full min-w-0 !rounded-none",
1865
+ class: "h-full min-w-0",
1491
1866
  original: pendingDiffOriginal(),
1492
1867
  modified: pendingDiffModified()
1493
1868
  });
@@ -1790,4 +2165,4 @@ function _layout($$renderer, $$props) {
1790
2165
  }
1791
2166
 
1792
2167
  export { _layout as default };
1793
- //# sourceMappingURL=_layout.svelte-B88WMyk0.js.map
2168
+ //# sourceMappingURL=_layout.svelte-D6rhwm98.js.map