@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,88 +1,5 @@
1
1
  import type * as Monaco from 'monaco-editor'
2
2
 
3
- export interface PromptDecorations {
4
- update: () => void
5
- dispose: () => void
6
- }
7
-
8
- export function createPromptDecorations(
9
- monaco: typeof Monaco,
10
- editor: Monaco.editor.IStandaloneCodeEditor
11
- ) {
12
- const collection = editor.createDecorationsCollection()
13
-
14
- function update() {
15
- const model = editor.getModel()
16
- if (!model) return
17
-
18
- const decorations: Monaco.editor.IModelDeltaDecoration[] = []
19
- const lineCount = model.getLineCount()
20
-
21
- for (let lineNumber = 1; lineNumber <= lineCount; lineNumber++) {
22
- const lineText = model.getLineContent(lineNumber)
23
-
24
- // Headings
25
- const match = /^(#+)\s/.exec(lineText)
26
- if (match) {
27
- const level = match[1].length
28
- let cls = 'prompt-heading-3'
29
-
30
- if (level === 1) {
31
- cls = 'prompt-heading-1'
32
- } else if (level === 2) {
33
- cls = 'prompt-heading-2'
34
- }
35
-
36
- decorations.push({
37
- range: new monaco.Range(lineNumber, 1, lineNumber, lineText.length + 1),
38
- options: {
39
- isWholeLine: true,
40
- inlineClassName: cls
41
- }
42
- })
43
- }
44
-
45
- // Symbols '#' and '*'
46
- for (let column = 1; column <= lineText.length; column++) {
47
- const ch = lineText[column - 1]
48
- if (ch === '#' || ch === '*') {
49
- decorations.push({
50
- range: new monaco.Range(lineNumber, column, lineNumber, column + 1),
51
- options: {
52
- inlineClassName: 'prompt-symbol'
53
- }
54
- })
55
- }
56
- }
57
-
58
- // Subnumbers
59
- const subMatch = lineText.match(/^(\s+)(\d+(?:\.\d+)+\.?)(?=[\s)]|$)/)
60
- if (subMatch) {
61
- const leading = subMatch[1]
62
- const numberText = subMatch[2]
63
-
64
- const startColumn = leading.length + 1
65
- const endColumn = startColumn + numberText.length
66
-
67
- decorations.push({
68
- range: new monaco.Range(lineNumber, startColumn, lineNumber, endColumn),
69
- options: {
70
- inlineClassName: 'prompt-subnumber'
71
- }
72
- })
73
- }
74
- }
75
-
76
- collection.set(decorations)
77
- }
78
-
79
- function dispose() {
80
- collection.clear()
81
- }
82
-
83
- return { update, dispose }
84
- }
85
-
86
3
  export const bosunDarkTheme: Monaco.editor.IStandaloneThemeData = {
87
4
  base: 'vs-dark',
88
5
  inherit: true,
@@ -110,6 +27,12 @@ export const bosunDarkTheme: Monaco.editor.IStandaloneThemeData = {
110
27
  'editor.inactiveSelectionBackground': '#4B5563A0',
111
28
  'editor.lineHighlightBackground': '#FFFFFF08',
112
29
  'editorLineNumber.background': '#1D1D1D',
30
+ 'diffEditor.insertedTextBackground': '#00B58A33',
31
+ 'diffEditor.insertedLineBackground': '#00B58A1A',
32
+ 'diffEditor.removedTextBackground': '#FF666633',
33
+ 'diffEditor.removedLineBackground': '#FF66661A',
34
+ 'diffEditor.border': '#373737',
35
+ 'diffEditor.diagonalFill': '#76767633',
113
36
 
114
37
  // Nunjucks tag highlight (DocumentHighlightProvider)
115
38
  'editor.wordHighlightBackground': '#ff480159'
@@ -0,0 +1,84 @@
1
+ import type * as Monaco from 'monaco-editor'
2
+ import { afterEach, describe, expect, it, vi } from 'vitest'
3
+ import {
4
+ EDITOR_FONT_FAMILY,
5
+ EDITOR_FONT_SIZE,
6
+ createPromptWrapController,
7
+ getEditorAppearanceOptions
8
+ } from './editor-appearance'
9
+
10
+ describe('getEditorAppearanceOptions', () => {
11
+ it('keeps prompt appearance in one preset', () => {
12
+ expect(getEditorAppearanceOptions('prompt', { bottomPadding: 56 })).toMatchObject({
13
+ theme: 'bosun-dark',
14
+ fontSize: EDITOR_FONT_SIZE,
15
+ fontFamily: EDITOR_FONT_FAMILY,
16
+ wordWrap: 'bounded',
17
+ wordWrapColumn: 120,
18
+ wrappingStrategy: 'advanced',
19
+ bracketPairColorization: { enabled: true },
20
+ padding: { top: 32, bottom: 56 }
21
+ })
22
+ })
23
+
24
+ it('keeps test-history appearance in one preset', () => {
25
+ expect(getEditorAppearanceOptions('test-history')).toMatchObject({
26
+ fontSize: EDITOR_FONT_SIZE,
27
+ fontFamily: EDITOR_FONT_FAMILY,
28
+ wordWrap: 'bounded',
29
+ wordWrapColumn: 75,
30
+ wrappingStrategy: 'advanced',
31
+ scrollbar: { vertical: 'hidden', horizontal: 'hidden' },
32
+ padding: { top: 4, bottom: 4 }
33
+ })
34
+ expect(getEditorAppearanceOptions('test-history', { bottomPadding: 56 }).padding).toEqual({
35
+ top: 4,
36
+ bottom: 56
37
+ })
38
+ })
39
+
40
+ it('preserves Monaco font defaults for generic diffs', () => {
41
+ const options = getEditorAppearanceOptions('generic')
42
+ expect(options).not.toHaveProperty('fontSize')
43
+ expect(options).not.toHaveProperty('fontFamily')
44
+ })
45
+ })
46
+
47
+ describe('createPromptWrapController', () => {
48
+ afterEach(() => vi.unstubAllGlobals())
49
+
50
+ it('updates and disposes responsive wrapping', () => {
51
+ let frame!: FrameRequestCallback
52
+ let layoutListener!: () => void
53
+ const cancelAnimationFrame = vi.fn()
54
+ vi.stubGlobal('requestAnimationFrame', (callback: FrameRequestCallback) => {
55
+ frame = callback
56
+ return 7
57
+ })
58
+ vi.stubGlobal('cancelAnimationFrame', cancelAnimationFrame)
59
+
60
+ const updateOptions = vi.fn()
61
+ const disposeLayoutListener = vi.fn()
62
+ const editor = {
63
+ getLayoutInfo: () => ({ contentWidth: 724 }),
64
+ getOption: () => ({ typicalHalfwidthCharacterWidth: 7 }),
65
+ updateOptions,
66
+ onDidLayoutChange: (listener: () => void) => {
67
+ layoutListener = listener
68
+ return { dispose: disposeLayoutListener }
69
+ }
70
+ } as unknown as Monaco.editor.IStandaloneCodeEditor
71
+ const monaco = {
72
+ editor: { EditorOption: { fontInfo: 0 } }
73
+ } as unknown as typeof Monaco
74
+
75
+ const controller = createPromptWrapController(editor, monaco)
76
+ expect(frame).toBeTypeOf('function')
77
+ frame(0)
78
+ expect(updateOptions).toHaveBeenCalledWith({ wordWrap: 'bounded', wordWrapColumn: 100 })
79
+ layoutListener()
80
+ controller.dispose()
81
+ expect(disposeLayoutListener).toHaveBeenCalledOnce()
82
+ expect(cancelAnimationFrame).toHaveBeenCalledWith(7)
83
+ })
84
+ })
@@ -0,0 +1,154 @@
1
+ import type * as Monaco from 'monaco-editor'
2
+
3
+ export type EditorAppearance = 'generic' | 'prompt' | 'test-history'
4
+
5
+ export const EDITOR_FONT_SIZE = 14
6
+ export const EDITOR_FONT_FAMILY =
7
+ 'ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'
8
+
9
+ interface EditorAppearanceOptions {
10
+ bottomPadding?: number
11
+ }
12
+
13
+ export function getEditorAppearanceOptions(
14
+ appearance: EditorAppearance,
15
+ options: EditorAppearanceOptions = {}
16
+ ): Monaco.editor.IStandaloneEditorConstructionOptions {
17
+ const common: Monaco.editor.IStandaloneEditorConstructionOptions = {
18
+ theme: 'bosun-dark',
19
+ lineNumbers: 'off',
20
+ automaticLayout: true,
21
+ minimap: { enabled: false }
22
+ }
23
+
24
+ if (appearance === 'prompt') {
25
+ return {
26
+ ...common,
27
+ fontSize: EDITOR_FONT_SIZE,
28
+ fontFamily: EDITOR_FONT_FAMILY,
29
+ wordBasedSuggestions: 'off',
30
+ wordWrap: 'bounded',
31
+ wordWrapColumn: 120,
32
+ wrappingStrategy: 'advanced',
33
+ matchBrackets: 'never',
34
+ bracketPairColorization: { enabled: true },
35
+ guides: {
36
+ highlightActiveBracketPair: false,
37
+ bracketPairs: false,
38
+ bracketPairsHorizontal: false
39
+ },
40
+ selectionHighlight: false,
41
+ unicodeHighlight: {
42
+ ambiguousCharacters: false,
43
+ nonBasicASCII: false,
44
+ invisibleCharacters: false,
45
+ includeStrings: false,
46
+ includeComments: false
47
+ },
48
+ autoClosingQuotes: 'never',
49
+ padding: { top: 32, bottom: options.bottomPadding ?? 0 }
50
+ }
51
+ }
52
+
53
+ if (appearance === 'test-history') {
54
+ return {
55
+ ...common,
56
+ fontSize: EDITOR_FONT_SIZE,
57
+ fontFamily: EDITOR_FONT_FAMILY,
58
+ wordBasedSuggestions: 'off',
59
+ wordWrap: 'bounded',
60
+ wordWrapColumn: 75,
61
+ wrappingStrategy: 'advanced',
62
+ scrollbar: { vertical: 'hidden', horizontal: 'hidden' },
63
+ overviewRulerLanes: 0,
64
+ renderLineHighlight: 'none',
65
+ folding: false,
66
+ renderWhitespace: 'none',
67
+ padding: { top: 4, bottom: options.bottomPadding ?? 4 },
68
+ matchBrackets: 'never',
69
+ bracketPairColorization: { enabled: false },
70
+ guides: {
71
+ highlightActiveBracketPair: false,
72
+ bracketPairs: false,
73
+ bracketPairsHorizontal: false
74
+ },
75
+ occurrencesHighlight: 'off',
76
+ selectionHighlight: false,
77
+ unicodeHighlight: {
78
+ ambiguousCharacters: false,
79
+ nonBasicASCII: false,
80
+ invisibleCharacters: false,
81
+ includeStrings: false,
82
+ includeComments: false
83
+ },
84
+ autoClosingQuotes: 'never'
85
+ }
86
+ }
87
+
88
+ return {
89
+ ...common,
90
+ scrollBeyondLastLine: false,
91
+ wordWrap: 'on',
92
+ padding: { bottom: options.bottomPadding ?? 0 },
93
+ overviewRulerBorder: false,
94
+ hideCursorInOverviewRuler: true,
95
+ matchBrackets: 'never',
96
+ bracketPairColorization: { enabled: false },
97
+ guides: {
98
+ highlightActiveBracketPair: false,
99
+ bracketPairs: false,
100
+ bracketPairsHorizontal: false
101
+ },
102
+ occurrencesHighlight: 'off',
103
+ selectionHighlight: false,
104
+ renderLineHighlight: 'none'
105
+ }
106
+ }
107
+
108
+ export function createPromptWrapController(
109
+ editor: Monaco.editor.IStandaloneCodeEditor,
110
+ monaco: typeof Monaco
111
+ ): Monaco.IDisposable {
112
+ let updateFrame: number | null = null
113
+ let lastWrapColumn = 0
114
+ let disposed = false
115
+
116
+ function scheduleUpdate() {
117
+ if (disposed || updateFrame !== null) return
118
+ updateFrame = requestAnimationFrame(() => {
119
+ updateFrame = null
120
+ if (disposed) return
121
+
122
+ const layout = editor.getLayoutInfo()
123
+ const contentWidth = Number(layout?.contentWidth ?? 0)
124
+ const fontInfo = editor.getOption(monaco.editor.EditorOption.fontInfo) as any
125
+ const charWidth =
126
+ Number(fontInfo?.typicalHalfwidthCharacterWidth) ||
127
+ Number(fontInfo?.typicalFullwidthCharacterWidth) ||
128
+ 7
129
+ const wrapColumn =
130
+ Number.isFinite(contentWidth) &&
131
+ contentWidth > 0 &&
132
+ Number.isFinite(charWidth) &&
133
+ charWidth > 0
134
+ ? Math.max(20, Math.floor((contentWidth - 24) / charWidth))
135
+ : 80
136
+
137
+ if (wrapColumn === lastWrapColumn) return
138
+ lastWrapColumn = wrapColumn
139
+ editor.updateOptions({ wordWrap: 'bounded', wordWrapColumn: wrapColumn })
140
+ })
141
+ }
142
+
143
+ const layoutDisposable = editor.onDidLayoutChange(scheduleUpdate)
144
+ scheduleUpdate()
145
+
146
+ return {
147
+ dispose() {
148
+ disposed = true
149
+ layoutDisposable.dispose()
150
+ if (updateFrame !== null) cancelAnimationFrame(updateFrame)
151
+ updateFrame = null
152
+ }
153
+ }
154
+ }
@@ -0,0 +1,91 @@
1
+ import type * as Monaco from 'monaco-editor'
2
+ import { describe, expect, it, vi } from 'vitest'
3
+ import { createPromptDecorations, createTestEditorDecorations } from './editor-decorations'
4
+
5
+ class FakeRange {
6
+ constructor(
7
+ readonly startLineNumber: number,
8
+ readonly startColumn: number,
9
+ readonly endLineNumber: number,
10
+ readonly endColumn: number
11
+ ) {}
12
+ }
13
+
14
+ function createFixture(initialLines: string[]) {
15
+ let lines = initialLines
16
+ let hasModel = true
17
+ const set = vi.fn()
18
+ const clear = vi.fn()
19
+ const model = {
20
+ getLineCount: () => lines.length,
21
+ getLineContent: (lineNumber: number) => lines[lineNumber - 1],
22
+ getLineMaxColumn: (lineNumber: number) => lines[lineNumber - 1].length + 1
23
+ }
24
+ const editor = {
25
+ createDecorationsCollection: () => ({ set, clear }),
26
+ getModel: () => (hasModel ? model : null)
27
+ } as unknown as Monaco.editor.IStandaloneCodeEditor
28
+ const monaco = { Range: FakeRange } as unknown as typeof Monaco
29
+
30
+ return {
31
+ monaco,
32
+ editor,
33
+ set,
34
+ clear,
35
+ setLines: (nextLines: string[]) => (lines = nextLines),
36
+ removeModel: () => (hasModel = false)
37
+ }
38
+ }
39
+
40
+ describe('createPromptDecorations', () => {
41
+ it('styles headings, symbols, and subnumbers from either prompt editor', () => {
42
+ const fixture = createFixture(['# Title', ' 1.2) Detail', '**Important**'])
43
+ const decorations = createPromptDecorations(fixture.monaco, fixture.editor)
44
+
45
+ decorations.update()
46
+ const applied = fixture.set.mock.calls[0][0] as Monaco.editor.IModelDeltaDecoration[]
47
+ expect(applied.map((decoration) => decoration.options.inlineClassName)).toEqual(
48
+ expect.arrayContaining(['prompt-heading-1', 'prompt-symbol', 'prompt-subnumber'])
49
+ )
50
+
51
+ fixture.setLines(['## Changed'])
52
+ decorations.update()
53
+ const updated = fixture.set.mock.calls[1][0] as Monaco.editor.IModelDeltaDecoration[]
54
+ expect(updated.map((decoration) => decoration.options.inlineClassName)).toContain(
55
+ 'prompt-heading-2'
56
+ )
57
+
58
+ decorations.dispose()
59
+ expect(fixture.clear).toHaveBeenCalledOnce()
60
+ })
61
+ })
62
+
63
+ describe('createTestEditorDecorations', () => {
64
+ it('styles expected output and nested tags from either history editor', () => {
65
+ const fixture = createFixture(['User: hello', 'Agent: <answer>yes</answer>'])
66
+ const decorations = createTestEditorDecorations(fixture.monaco, fixture.editor)
67
+
68
+ decorations.update([{ startLine: 2, endLine: 2, className: 'test-expected-output' }])
69
+ const applied = fixture.set.mock.calls[0][0] as Monaco.editor.IModelDeltaDecoration[]
70
+ expect(applied.map((decoration) => decoration.options.inlineClassName)).toEqual([
71
+ 'test-expected-output',
72
+ 'test-expected-output-tag',
73
+ 'test-expected-output-tag'
74
+ ])
75
+ })
76
+
77
+ it('replaces stale ranges and clears when the model is removed', () => {
78
+ const fixture = createFixture(['Agent: old'])
79
+ const decorations = createTestEditorDecorations(fixture.monaco, fixture.editor)
80
+
81
+ decorations.update([{ startLine: 1, endLine: 1, className: 'test-expected-output' }])
82
+ fixture.setLines(['User: new', 'Agent: new'])
83
+ decorations.update([{ startLine: 2, endLine: 2, className: 'test-expected-output' }])
84
+ const updated = fixture.set.mock.calls[1][0] as Monaco.editor.IModelDeltaDecoration[]
85
+ expect((updated[0].range as FakeRange).startLineNumber).toBe(2)
86
+
87
+ fixture.removeModel()
88
+ decorations.update([])
89
+ expect(fixture.clear).toHaveBeenCalledOnce()
90
+ })
91
+ })
@@ -0,0 +1,133 @@
1
+ import type * as Monaco from 'monaco-editor'
2
+
3
+ export interface EditorHighlight {
4
+ startLine: number
5
+ endLine: number
6
+ className: string
7
+ }
8
+
9
+ export interface PromptDecorations {
10
+ update: () => void
11
+ dispose: () => void
12
+ }
13
+
14
+ export interface TestEditorDecorations {
15
+ update: (highlights: readonly EditorHighlight[]) => void
16
+ dispose: () => void
17
+ }
18
+
19
+ export function createPromptDecorations(
20
+ monaco: typeof Monaco,
21
+ editor: Monaco.editor.IStandaloneCodeEditor
22
+ ): PromptDecorations {
23
+ const collection = editor.createDecorationsCollection()
24
+
25
+ function update() {
26
+ const model = editor.getModel()
27
+ if (!model) {
28
+ collection.clear()
29
+ return
30
+ }
31
+
32
+ const decorations: Monaco.editor.IModelDeltaDecoration[] = []
33
+ const lineCount = model.getLineCount()
34
+
35
+ for (let lineNumber = 1; lineNumber <= lineCount; lineNumber++) {
36
+ const lineText = model.getLineContent(lineNumber)
37
+ const heading = /^(#+)\s/.exec(lineText)
38
+ if (heading) {
39
+ const level = heading[1].length
40
+ const className =
41
+ level === 1 ? 'prompt-heading-1' : level === 2 ? 'prompt-heading-2' : 'prompt-heading-3'
42
+ decorations.push({
43
+ range: new monaco.Range(lineNumber, 1, lineNumber, lineText.length + 1),
44
+ options: { isWholeLine: true, inlineClassName: className }
45
+ })
46
+ }
47
+
48
+ for (let column = 1; column <= lineText.length; column++) {
49
+ const character = lineText[column - 1]
50
+ if (character !== '#' && character !== '*') continue
51
+ decorations.push({
52
+ range: new monaco.Range(lineNumber, column, lineNumber, column + 1),
53
+ options: { inlineClassName: 'prompt-symbol' }
54
+ })
55
+ }
56
+
57
+ const subnumber = lineText.match(/^(\s+)(\d+(?:\.\d+)+\.?)(?=[\s)]|$)/)
58
+ if (!subnumber) continue
59
+ const startColumn = subnumber[1].length + 1
60
+ decorations.push({
61
+ range: new monaco.Range(
62
+ lineNumber,
63
+ startColumn,
64
+ lineNumber,
65
+ startColumn + subnumber[2].length
66
+ ),
67
+ options: { inlineClassName: 'prompt-subnumber' }
68
+ })
69
+ }
70
+
71
+ collection.set(decorations)
72
+ }
73
+
74
+ return {
75
+ update,
76
+ dispose: () => collection.clear()
77
+ }
78
+ }
79
+
80
+ export function createTestEditorDecorations(
81
+ monaco: typeof Monaco,
82
+ editor: Monaco.editor.IStandaloneCodeEditor
83
+ ): TestEditorDecorations {
84
+ const collection = editor.createDecorationsCollection()
85
+
86
+ function update(highlights: readonly EditorHighlight[]) {
87
+ const model = editor.getModel()
88
+ if (!model) {
89
+ collection.clear()
90
+ return
91
+ }
92
+
93
+ const decorations: Monaco.editor.IModelDeltaDecoration[] = []
94
+ const lineCount = model.getLineCount()
95
+ for (const highlight of highlights) {
96
+ const startLine = Math.max(1, Math.min(lineCount, Number(highlight.startLine) || 1))
97
+ const endLine = Math.max(
98
+ startLine,
99
+ Math.min(lineCount, Number(highlight.endLine) || startLine)
100
+ )
101
+ decorations.push({
102
+ range: new monaco.Range(startLine, 1, endLine, model.getLineMaxColumn(endLine)),
103
+ options: { inlineClassName: highlight.className }
104
+ })
105
+
106
+ if (highlight.className !== 'test-expected-output') continue
107
+ for (let lineNumber = startLine; lineNumber <= endLine; lineNumber++) {
108
+ const lineText = model.getLineContent(lineNumber)
109
+ const tagPattern = /<\/?[A-Za-z][^>]*?>/g
110
+ let match: RegExpExecArray | null
111
+ while ((match = tagPattern.exec(lineText))) {
112
+ const startColumn = match.index + 1
113
+ const endColumn = Math.min(
114
+ model.getLineMaxColumn(lineNumber),
115
+ startColumn + match[0].length
116
+ )
117
+ if (endColumn <= startColumn) continue
118
+ decorations.push({
119
+ range: new monaco.Range(lineNumber, startColumn, lineNumber, endColumn),
120
+ options: { inlineClassName: 'test-expected-output-tag' }
121
+ })
122
+ }
123
+ }
124
+ }
125
+
126
+ collection.set(decorations)
127
+ }
128
+
129
+ return {
130
+ update,
131
+ dispose: () => collection.clear()
132
+ }
133
+ }
@@ -0,0 +1,74 @@
1
+ export type AssertionOption = { value: string; label: string }
2
+
3
+ const baseAssertionTypes: AssertionOption[] = [
4
+ { value: 'llm-rubric', label: 'LLM' },
5
+ { value: 'answer-relevance', label: 'Answer Relevance (LLM)' },
6
+ { value: 'context-faithfulness', label: 'Context Faithfulness (LLM)' },
7
+ { value: 'context-recall', label: 'Context Recall (LLM)' },
8
+ { value: 'context-relevance', label: 'Context Relevance (LLM)' },
9
+ { value: 'model-graded-closedqa', label: 'Model-Graded Closed QA' },
10
+ { value: 'model-graded-factuality', label: 'Model-Graded Factuality' },
11
+ { value: 'moderation', label: 'Moderation' },
12
+ { value: 'classifier', label: 'Classifier' },
13
+ { value: 'g-eval', label: 'G-Eval' },
14
+ { value: 'factuality', label: 'Factuality' },
15
+ { value: 'conversation-relevance', label: 'Conversation Relevance' },
16
+
17
+ { value: 'equals', label: 'Equals' },
18
+ { value: 'contains', label: 'Contains' },
19
+ { value: 'icontains', label: 'Contains (case-insensitive)' },
20
+ { value: 'contains-all', label: 'Contains All' },
21
+ { value: 'contains-any', label: 'Contains Any' },
22
+ { value: 'icontains-all', label: 'Contains All (iCase)' },
23
+ { value: 'icontains-any', label: 'Contains Any (iCase)' },
24
+ { value: 'starts-with', label: 'Starts With' },
25
+ { value: 'regex', label: 'Regex' },
26
+ { value: 'levenshtein', label: 'Levenshtein Distance' },
27
+ { value: 'is-refusal', label: 'Is Refusal' },
28
+
29
+ { value: 'is-html', label: 'Is HTML' },
30
+ { value: 'contains-html', label: 'Contains HTML' },
31
+ { value: 'is-json', label: 'Is JSON' },
32
+ { value: 'contains-json', label: 'Contains JSON' },
33
+ { value: 'is-xml', label: 'Is XML' },
34
+ { value: 'contains-xml', label: 'Contains XML' },
35
+ { value: 'is-sql', label: 'Is SQL' },
36
+ { value: 'contains-sql', label: 'Contains SQL' },
37
+
38
+ { value: 'similar', label: 'Semantic Similarity' },
39
+ { value: 'rouge-n', label: 'ROUGE-N' },
40
+ { value: 'bleu', label: 'BLEU' },
41
+ { value: 'gleu', label: 'GLEU' },
42
+ { value: 'meteor', label: 'METEOR' },
43
+ { value: 'perplexity', label: 'Perplexity' },
44
+ { value: 'perplexity-score', label: 'Perplexity Score' },
45
+
46
+ { value: 'latency', label: 'Latency' },
47
+ { value: 'cost', label: 'Cost' },
48
+ { value: 'finish-reason', label: 'Finish Reason' },
49
+ { value: 'trace-error-spans', label: 'Trace Error Spans' },
50
+ { value: 'trace-span-count', label: 'Trace Span Count' },
51
+ { value: 'trace-span-duration', label: 'Trace Span Duration' },
52
+
53
+ { value: 'is-valid-function-call', label: 'Is Valid Function Call' },
54
+ { value: 'is-valid-openai-function-call', label: 'Is Valid OpenAI Function Call' },
55
+ { value: 'is-valid-openai-tools-call', label: 'Is Valid OpenAI Tools Call' },
56
+ { value: 'guardrails', label: 'Guardrails' },
57
+
58
+ { value: 'javascript', label: 'JavaScript (custom)' },
59
+ { value: 'python', label: 'Python (custom)' },
60
+ { value: 'webhook', label: 'Webhook (custom)' },
61
+ { value: 'pi', label: 'Pi Scorer' }
62
+ ]
63
+
64
+ export const assertionTypes: AssertionOption[] = [
65
+ ...baseAssertionTypes,
66
+ ...baseAssertionTypes.map((option) => ({
67
+ value: `not-${option.value}`,
68
+ label: `Not ${option.label}`
69
+ }))
70
+ ]
71
+
72
+ export function assertionLabel(value: string): string {
73
+ return assertionTypes.find((option) => option.value === value)?.label ?? value
74
+ }
@@ -1,16 +1,30 @@
1
1
  import { env } from '$env/dynamic/public'
2
2
  import { createTRPCClient, httpLink } from '@trpc/client'
3
3
  import type { AppRouter } from '../backend/server'
4
+ import { repositoryAdmissionLink, repositoryClientAdmission } from './git-mode/client-admission'
4
5
 
5
- const trpcUrl =
6
+ export const trpcUrl =
6
7
  env.PUBLIC_TRPC_URL ??
7
8
  `http://${env.PUBLIC_TRPC_HOSTNAME ?? 'localhost'}:${env.PUBLIC_TRPC_PORT ?? '2022'}`
8
9
 
9
10
  // ref: https://github.com/trpc/trpc/blob/main/examples/standalone-server/src/client.ts
10
11
  export const trpc = createTRPCClient<AppRouter>({
11
12
  links: [
13
+ repositoryAdmissionLink<AppRouter>(repositoryClientAdmission),
12
14
  httpLink({
13
15
  url: trpcUrl
14
16
  })
15
17
  ]
16
18
  })
19
+
20
+ export function unregisterGitModeTab(tabId: string): Promise<void> {
21
+ if (!tabId || typeof window === 'undefined') return Promise.resolve()
22
+ return fetch(`${trpcUrl}/gitMode.unregister`, {
23
+ method: 'POST',
24
+ headers: { 'content-type': 'application/json' },
25
+ body: JSON.stringify({ tabId }),
26
+ keepalive: true
27
+ })
28
+ .then(() => undefined)
29
+ .catch(() => undefined)
30
+ }