@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.
- package/README.md +24 -0
- package/bin/bosun.js +153 -20
- package/bin/git-mode.js +1139 -0
- package/build/client/_app/immutable/assets/0.D9HpHezk.css +1 -0
- package/build/client/_app/immutable/assets/0.D9HpHezk.css.br +0 -0
- package/build/client/_app/immutable/assets/0.D9HpHezk.css.gz +0 -0
- package/build/client/_app/immutable/assets/{2.DtxQDOXx.css → 2.Bc0Sf3YD.css} +1 -1
- package/build/client/_app/immutable/assets/2.Bc0Sf3YD.css.br +0 -0
- package/build/client/_app/immutable/assets/2.Bc0Sf3YD.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{DneQQ7D5.js → -3ZOIHDA.js} +1 -1
- package/build/client/_app/immutable/chunks/-3ZOIHDA.js.br +0 -0
- package/build/client/_app/immutable/chunks/-3ZOIHDA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/7hV1SZxK.js +1 -0
- package/build/client/_app/immutable/chunks/7hV1SZxK.js.br +2 -0
- package/build/client/_app/immutable/chunks/7hV1SZxK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B-dTD_wm.js +1 -0
- package/build/client/_app/immutable/chunks/B-dTD_wm.js.br +0 -0
- package/build/client/_app/immutable/chunks/B-dTD_wm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{UqjCSZmA.js → B-iasAJv.js} +1 -1
- package/build/client/_app/immutable/chunks/B-iasAJv.js.br +0 -0
- package/build/client/_app/immutable/chunks/B-iasAJv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDijIo6D.js +33 -0
- package/build/client/_app/immutable/chunks/BDijIo6D.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDijIo6D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BHB0Pj1h.js +2 -0
- package/build/client/_app/immutable/chunks/BHB0Pj1h.js.br +0 -0
- package/build/client/_app/immutable/chunks/BHB0Pj1h.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bog028VR.js → BKfmN1Rj.js} +1 -1
- package/build/client/_app/immutable/chunks/BKfmN1Rj.js.br +0 -0
- package/build/client/_app/immutable/chunks/BKfmN1Rj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{pPpIn6tB.js → BlFOg-Sd.js} +1 -1
- package/build/client/_app/immutable/chunks/BlFOg-Sd.js.br +0 -0
- package/build/client/_app/immutable/chunks/BlFOg-Sd.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CJcZ2GVC.js → Byg3jr1u.js} +1 -1
- package/build/client/_app/immutable/chunks/Byg3jr1u.js.br +0 -0
- package/build/client/_app/immutable/chunks/Byg3jr1u.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bmd5zhWC.js → BzxxLgHi.js} +1 -1
- package/build/client/_app/immutable/chunks/BzxxLgHi.js.br +0 -0
- package/build/client/_app/immutable/chunks/BzxxLgHi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CEHsomMo.js → C4UC6AgE.js} +1 -1
- package/build/client/_app/immutable/chunks/C4UC6AgE.js.br +0 -0
- package/build/client/_app/immutable/chunks/{CEHsomMo.js.gz → C4UC6AgE.js.gz} +0 -0
- package/build/client/_app/immutable/chunks/C60AG6QQ.js +1 -0
- package/build/client/_app/immutable/chunks/C60AG6QQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/C60AG6QQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CAIfVN23.js +1 -0
- package/build/client/_app/immutable/chunks/CAIfVN23.js.br +0 -0
- package/build/client/_app/immutable/chunks/CAIfVN23.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{JcG4w2gF.js → CB9iDxwI.js} +1 -1
- package/build/client/_app/immutable/chunks/CB9iDxwI.js.br +0 -0
- package/build/client/_app/immutable/chunks/CB9iDxwI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DoD3q5w5.js → CD_KdWs9.js} +1 -1
- package/build/client/_app/immutable/chunks/CD_KdWs9.js.br +0 -0
- package/build/client/_app/immutable/chunks/CD_KdWs9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CDy1LBR5.js +1 -0
- package/build/client/_app/immutable/chunks/CDy1LBR5.js.br +0 -0
- package/build/client/_app/immutable/chunks/CDy1LBR5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DCXjBDmY.js → CMFNmSvo.js} +1 -1
- package/build/client/_app/immutable/chunks/CMFNmSvo.js.br +0 -0
- package/build/client/_app/immutable/chunks/CMFNmSvo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bv1mNXs0.js → CNIn4L55.js} +1 -1
- package/build/client/_app/immutable/chunks/CNIn4L55.js.br +0 -0
- package/build/client/_app/immutable/chunks/CNIn4L55.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUKoVL36.js +1 -0
- package/build/client/_app/immutable/chunks/CUKoVL36.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUKoVL36.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CYGbCr1i.js +3 -0
- package/build/client/_app/immutable/chunks/CYGbCr1i.js.br +0 -0
- package/build/client/_app/immutable/chunks/CYGbCr1i.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CYr0FGgn.js +1 -0
- package/build/client/_app/immutable/chunks/CYr0FGgn.js.br +0 -0
- package/build/client/_app/immutable/chunks/CYr0FGgn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DtXXy94i.js → Ce6a22qU.js} +1 -1
- package/build/client/_app/immutable/chunks/Ce6a22qU.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ce6a22qU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DfcDjAv-.js → CeoQ-OhK.js} +1 -1
- package/build/client/_app/immutable/chunks/CeoQ-OhK.js.br +0 -0
- package/build/client/_app/immutable/chunks/CeoQ-OhK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D8mA-uZ4.js → CupXtwVS.js} +1 -1
- package/build/client/_app/immutable/chunks/CupXtwVS.js.br +0 -0
- package/build/client/_app/immutable/chunks/CupXtwVS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B5zf3x62.js → Cy2Uze-c.js} +1 -1
- package/build/client/_app/immutable/chunks/Cy2Uze-c.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cy2Uze-c.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Dg0A8wPA.js → D8Lmn3S5.js} +1 -1
- package/build/client/_app/immutable/chunks/D8Lmn3S5.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8Lmn3S5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8doM1Y6.js +1 -0
- package/build/client/_app/immutable/chunks/D8doM1Y6.js.br +2 -0
- package/build/client/_app/immutable/chunks/D8doM1Y6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BHHfrjbV.js → D9BWOD7V.js} +1 -1
- package/build/client/_app/immutable/chunks/D9BWOD7V.js.br +3 -0
- package/build/client/_app/immutable/chunks/D9BWOD7V.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Cp_st-64.js → DBB88ZB7.js} +1 -1
- package/build/client/_app/immutable/chunks/DBB88ZB7.js.br +2 -0
- package/build/client/_app/immutable/chunks/DBB88ZB7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Dm49pcMm.js → DC7lPrn4.js} +1 -1
- package/build/client/_app/immutable/chunks/DC7lPrn4.js.br +0 -0
- package/build/client/_app/immutable/chunks/DC7lPrn4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DCwWNTpf.js +9 -0
- package/build/client/_app/immutable/chunks/DCwWNTpf.js.br +0 -0
- package/build/client/_app/immutable/chunks/DCwWNTpf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{wcTQUnZO.js → DEnUeQNt.js} +1 -1
- package/build/client/_app/immutable/chunks/DEnUeQNt.js.br +0 -0
- package/build/client/_app/immutable/chunks/DEnUeQNt.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D_laxq3h.js +1 -0
- package/build/client/_app/immutable/chunks/D_laxq3h.js.br +0 -0
- package/build/client/_app/immutable/chunks/D_laxq3h.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Ddv5LgEc.js → DfkYlKBk.js} +1 -1
- package/build/client/_app/immutable/chunks/DfkYlKBk.js.br +0 -0
- package/build/client/_app/immutable/chunks/DfkYlKBk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DnMS2X6M.js +2 -0
- package/build/client/_app/immutable/chunks/DnMS2X6M.js.br +0 -0
- package/build/client/_app/immutable/chunks/DnMS2X6M.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B1HdnQRQ.js → DrE1ro9S.js} +1 -1
- package/build/client/_app/immutable/chunks/DrE1ro9S.js.br +0 -0
- package/build/client/_app/immutable/chunks/DrE1ro9S.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DzY_RPb9.js +1 -0
- package/build/client/_app/immutable/chunks/DzY_RPb9.js.br +0 -0
- package/build/client/_app/immutable/chunks/DzY_RPb9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/PrCSpCPg.js +1 -0
- package/build/client/_app/immutable/chunks/PrCSpCPg.js.br +0 -0
- package/build/client/_app/immutable/chunks/PrCSpCPg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CN555stc.js → eMofpOrR.js} +1 -1
- package/build/client/_app/immutable/chunks/eMofpOrR.js.br +0 -0
- package/build/client/_app/immutable/chunks/eMofpOrR.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.BQUuHkSR.js +2 -0
- package/build/client/_app/immutable/entry/app.BQUuHkSR.js.br +0 -0
- package/build/client/_app/immutable/entry/app.BQUuHkSR.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DoeTycdu.js +1 -0
- package/build/client/_app/immutable/entry/start.DoeTycdu.js.br +2 -0
- package/build/client/_app/immutable/entry/start.DoeTycdu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DBnFpwRM.js +4 -0
- package/build/client/_app/immutable/nodes/0.DBnFpwRM.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DBnFpwRM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.D-kI-fLd.js +1 -0
- package/build/client/_app/immutable/nodes/1.D-kI-fLd.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.D-kI-fLd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.DWb5H7vX.js +28 -0
- package/build/client/_app/immutable/nodes/10.DWb5H7vX.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.DWb5H7vX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{15.D2I0y3ys.js → 15.CGc3_07c.js} +1 -1
- package/build/client/_app/immutable/nodes/15.CGc3_07c.js.br +3 -0
- package/build/client/_app/immutable/nodes/15.CGc3_07c.js.gz +0 -0
- package/build/client/_app/immutable/nodes/17.BIba62hW.js +3 -0
- package/build/client/_app/immutable/nodes/17.BIba62hW.js.br +0 -0
- package/build/client/_app/immutable/nodes/17.BIba62hW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/18.Clxr6FwI.js +11 -0
- package/build/client/_app/immutable/nodes/18.Clxr6FwI.js.br +0 -0
- package/build/client/_app/immutable/nodes/18.Clxr6FwI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.cbpnR8be.js +35 -0
- package/build/client/_app/immutable/nodes/2.cbpnR8be.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.cbpnR8be.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DsP759xk.js +1 -0
- package/build/client/_app/immutable/nodes/3.DsP759xk.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DsP759xk.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{4.C8VxVbVn.js → 4.BIGLAIDe.js} +1 -1
- package/build/client/_app/immutable/nodes/4.BIGLAIDe.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BIGLAIDe.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.BjrnKYaA.js → 5.zMHOyhDv.js} +1 -1
- package/build/client/_app/immutable/nodes/5.zMHOyhDv.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.zMHOyhDv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DFQ1IZsQ.js +1 -0
- package/build/client/_app/immutable/nodes/6.DFQ1IZsQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DFQ1IZsQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.CTgEdr7L.js +2 -0
- package/build/client/_app/immutable/nodes/8.CTgEdr7L.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.CTgEdr7L.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.BidF5Uvq.js +2 -0
- package/build/client/_app/immutable/nodes/9.BidF5Uvq.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.BidF5Uvq.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/0-BZOFUIfF.js +9 -0
- package/build/server/chunks/0-BZOFUIfF.js.map +1 -0
- package/build/server/chunks/1-XwGU5VVN.js +9 -0
- package/build/server/chunks/{1-C0HdTvXW.js.map → 1-XwGU5VVN.js.map} +1 -1
- package/build/server/chunks/10-BgFSx4ib.js +9 -0
- package/build/server/chunks/10-BgFSx4ib.js.map +1 -0
- package/build/server/chunks/15-BjTTC1jf.js +9 -0
- package/build/server/chunks/{15-BQcb9C_y.js.map → 15-BjTTC1jf.js.map} +1 -1
- package/build/server/chunks/17-BEkWCfzc.js +9 -0
- package/build/server/chunks/17-BEkWCfzc.js.map +1 -0
- package/build/server/chunks/18-C-S0wKdp.js +9 -0
- package/build/server/chunks/18-C-S0wKdp.js.map +1 -0
- package/build/server/chunks/2-o-cIkIjs.js +9 -0
- package/build/server/chunks/2-o-cIkIjs.js.map +1 -0
- package/build/server/chunks/3-B-ABlyFO.js +9 -0
- package/build/server/chunks/3-B-ABlyFO.js.map +1 -0
- package/build/server/chunks/4-joAFA_Y8.js +9 -0
- package/build/server/chunks/4-joAFA_Y8.js.map +1 -0
- package/build/server/chunks/5-DIhC9k4l.js +9 -0
- package/build/server/chunks/5-DIhC9k4l.js.map +1 -0
- package/build/server/chunks/6-CMuAQIcW.js +9 -0
- package/build/server/chunks/6-CMuAQIcW.js.map +1 -0
- package/build/server/chunks/8-CbETTVRG.js +9 -0
- package/build/server/chunks/8-CbETTVRG.js.map +1 -0
- package/build/server/chunks/9-nMV90uVU.js +9 -0
- package/build/server/chunks/9-nMV90uVU.js.map +1 -0
- package/build/server/chunks/{AgentSidebar-BWBnqHnV.js → AgentSidebar-BEbSdZdN.js} +4 -4
- package/build/server/chunks/{AgentSidebar-BWBnqHnV.js.map → AgentSidebar-BEbSdZdN.js.map} +1 -1
- package/build/server/chunks/{Button-DH7gdU0s.js → Button-Dc9CR4Wh.js} +2 -2
- package/build/server/chunks/{Button-DH7gdU0s.js.map → Button-Dc9CR4Wh.js.map} +1 -1
- package/build/server/chunks/{ChatStepTrace-BivoNYOY.js → ChatStepTrace-OM96X4g8.js} +18 -7
- package/build/server/chunks/ChatStepTrace-OM96X4g8.js.map +1 -0
- package/build/server/chunks/{Dropdown-DnARl86Q.js → Dropdown-Cgd7pG-k.js} +2 -2
- package/build/server/chunks/{Dropdown-DnARl86Q.js.map → Dropdown-Cgd7pG-k.js.map} +1 -1
- package/build/server/chunks/GitControlsButton-BLcNzrDt.js +81 -0
- package/build/server/chunks/GitControlsButton-BLcNzrDt.js.map +1 -0
- package/build/server/chunks/{Icon-DP1YKCRV.js → Icon-Bogvl2n9.js} +2 -2
- package/build/server/chunks/{Icon-DP1YKCRV.js.map → Icon-Bogvl2n9.js.map} +1 -1
- package/build/server/chunks/{Input-CUJ9Cg7b.js → Input-7hpw1WLW.js} +2 -2
- package/build/server/chunks/{Input-CUJ9Cg7b.js.map → Input-7hpw1WLW.js.map} +1 -1
- package/build/server/chunks/{Modal-CGJuNpZ0.js → Modal-7IIIfFEG.js} +5 -5
- package/build/server/chunks/{Modal-CGJuNpZ0.js.map → Modal-7IIIfFEG.js.map} +1 -1
- package/build/server/chunks/{Panel-zvjxe036.js → Panel-Cj1mXx9-.js} +2 -2
- package/build/server/chunks/{Panel-zvjxe036.js.map → Panel-Cj1mXx9-.js.map} +1 -1
- package/build/server/chunks/{Tab-CUkyLqbN.js → Tab-bf4ZDs5y.js} +4 -4
- package/build/server/chunks/{Tab-CUkyLqbN.js.map → Tab-bf4ZDs5y.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-BnrWYuLv.js → _layout.svelte-C71luIwv.js} +10 -10
- package/build/server/chunks/{_layout.svelte-BnrWYuLv.js.map → _layout.svelte-C71luIwv.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-wi6o5Ecu.js → _layout.svelte-CFhHgXI_.js} +24 -18
- package/build/server/chunks/_layout.svelte-CFhHgXI_.js.map +1 -0
- package/build/server/chunks/_layout.svelte-CJd_pmkx.js +431 -0
- package/build/server/chunks/_layout.svelte-CJd_pmkx.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-B88WMyk0.js → _layout.svelte-D6rhwm98.js} +445 -70
- package/build/server/chunks/_layout.svelte-D6rhwm98.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CeS_21Ho.js → _page.svelte-BBvDMiTV.js} +25 -21
- package/build/server/chunks/_page.svelte-BBvDMiTV.js.map +1 -0
- package/build/server/chunks/{_page.svelte-h_J4lNT9.js → _page.svelte-BQs9dEuq.js} +8 -7
- package/build/server/chunks/{_page.svelte-h_J4lNT9.js.map → _page.svelte-BQs9dEuq.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-DhFNFMnl.js → _page.svelte-BoO2LWVX.js} +34 -14
- package/build/server/chunks/_page.svelte-BoO2LWVX.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CHgQjBQj.js → _page.svelte-DUCTSdv-.js} +2 -2
- package/build/server/chunks/{_page.svelte-CHgQjBQj.js.map → _page.svelte-DUCTSdv-.js.map} +1 -1
- package/build/server/chunks/_page.svelte-FXYLKyMw.js +110 -0
- package/build/server/chunks/_page.svelte-FXYLKyMw.js.map +1 -0
- package/build/server/chunks/{_page.svelte-57pyhszV.js → _page.svelte-KA1hqKj2.js} +20 -107
- package/build/server/chunks/_page.svelte-KA1hqKj2.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BSVJ2d2G.js → _page.svelte-y8CZFL8a.js} +210 -106
- package/build/server/chunks/_page.svelte-y8CZFL8a.js.map +1 -0
- package/build/server/chunks/{_page.svelte-DHSYVLoj.js → _page.svelte-yIHSIEW6.js} +21 -15
- package/build/server/chunks/_page.svelte-yIHSIEW6.js.map +1 -0
- package/build/server/chunks/_server.ts-Cp9DgLcE.js +336 -0
- package/build/server/chunks/_server.ts-Cp9DgLcE.js.map +1 -0
- package/build/server/chunks/{agents-context-CbFsZmi5.js → agents-context-owgusUPR.js} +2 -2
- package/build/server/chunks/{agents-context-CbFsZmi5.js.map → agents-context-owgusUPR.js.map} +1 -1
- package/build/server/chunks/{client-DO-hqMbT.js → client-P-7bDULt.js} +4 -4
- package/build/server/chunks/{client-DO-hqMbT.js.map → client-P-7bDULt.js.map} +1 -1
- package/build/server/chunks/{conversation-view-memory-CtbUZd_L.js → conversation-view-memory-SdpdqTR7.js} +2 -2
- package/build/server/chunks/{conversation-view-memory-CtbUZd_L.js.map → conversation-view-memory-SdpdqTR7.js.map} +1 -1
- package/build/server/chunks/{edit-workspace-context-tyHBPujC.js → edit-workspace-context-hanFnXR3.js} +2 -2
- package/build/server/chunks/{edit-workspace-context-tyHBPujC.js.map → edit-workspace-context-hanFnXR3.js.map} +1 -1
- package/build/server/chunks/error.svelte-yI9RS6H4.js +15 -0
- package/build/server/chunks/{error.svelte-DmKKN1RU.js.map → error.svelte-yI9RS6H4.js.map} +1 -1
- package/build/server/chunks/git-mode-context-BpNsAUGF.js +18 -0
- package/build/server/chunks/git-mode-context-BpNsAUGF.js.map +1 -0
- package/build/server/chunks/{index-LMsd1ih2.js → index-DGtbUu8Y.js} +2 -2
- package/build/server/chunks/{index-LMsd1ih2.js.map → index-DGtbUu8Y.js.map} +1 -1
- package/build/server/chunks/{index-server-BRr5mZEq.js → index-server-l8-WsVn4.js} +2 -2
- package/build/server/chunks/{index-server-BRr5mZEq.js.map → index-server-l8-WsVn4.js.map} +1 -1
- package/build/server/chunks/{index2-ClgfzZ89.js → index2-CtgLiJVO.js} +3 -3
- package/build/server/chunks/{index2-ClgfzZ89.js.map → index2-CtgLiJVO.js.map} +1 -1
- package/build/server/chunks/{index3-BdRUAffj.js → index3-4hbbCqW0.js} +2 -2
- package/build/server/chunks/{index3-BdRUAffj.js.map → index3-4hbbCqW0.js.map} +1 -1
- package/build/server/chunks/{root-4q2Pr7ck.js → root-sWPnlpi3.js} +2 -2
- package/build/server/chunks/{root-4q2Pr7ck.js.map → root-sWPnlpi3.js.map} +1 -1
- package/build/server/chunks/{source-selection-CcN1cgXc.js → source-selection-DSkaPGfZ.js} +7 -2
- package/build/server/chunks/source-selection-DSkaPGfZ.js.map +1 -0
- package/build/server/chunks/{state.svelte-Bd1i-u49.js → state.svelte-BkvaElc6.js} +3 -3
- package/build/server/chunks/{state.svelte-Bd1i-u49.js.map → state.svelte-BkvaElc6.js.map} +1 -1
- package/build/server/chunks/trpc-client-Cr8RJ4UO.js +260 -0
- package/build/server/chunks/trpc-client-Cr8RJ4UO.js.map +1 -0
- package/build/server/index.js +4 -4
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +15 -15
- package/build/server/manifest.js.map +1 -1
- package/package.json +1 -1
- package/src/backend/git-mode/command.spec.ts +172 -0
- package/src/backend/git-mode/command.ts +405 -0
- package/src/backend/git-mode/config.spec.ts +45 -0
- package/src/backend/git-mode/config.ts +90 -0
- package/src/backend/git-mode/index.ts +20 -0
- package/src/backend/git-mode/repository-write-gate.spec.ts +116 -0
- package/src/backend/git-mode/repository-write-gate.ts +260 -0
- package/src/backend/git-mode/router.ts +59 -0
- package/src/backend/git-mode/service.spec.ts +1653 -0
- package/src/backend/git-mode/service.ts +2183 -0
- package/src/backend/git-mode/types.ts +82 -0
- package/src/backend/git-mode/write-tracker.spec.ts +46 -0
- package/src/backend/git-mode/write-tracker.ts +39 -0
- package/src/backend/lib/backend-restart.spec.ts +27 -0
- package/src/backend/lib/backend-restart.ts +16 -2
- package/src/backend/lib/middleware/cors.spec.ts +67 -0
- package/src/backend/lib/middleware/cors.ts +40 -12
- package/src/backend/roleplay/agent-loader.ts +49 -0
- package/src/backend/roleplay/old-server.ts +106 -56
- package/src/backend/roleplay/prompt-edit-proposals.ts +38 -4
- package/src/backend/roleplay/prompt-file.ts +59 -0
- package/src/backend/roleplay/router.spec.ts +75 -0
- package/src/backend/roleplay/router.ts +123 -69
- package/src/backend/roleplay/suggest-file-edit.ts +160 -0
- package/src/backend/roleplay/suggest-prompt-edit.ts +9 -138
- package/src/backend/roleplay/suggest-test-fix.spec.ts +50 -0
- package/src/backend/roleplay/suggest-test-fix.ts +65 -0
- package/src/backend/roleplay/test-fix-proposal-acceptance.spec.ts +253 -0
- package/src/backend/server.ts +116 -13
- package/src/backend/tests/academy.ts +17 -3
- package/src/backend/tests/data.spec.ts +81 -2
- package/src/backend/tests/data.ts +74 -4
- package/src/backend/tests/router.ts +101 -36
- package/src/backend/tests/suggest-test-history-edit.spec.ts +20 -0
- package/src/backend/tests/suggest-test-history-edit.ts +52 -0
- package/src/backend/tests/test-edit-source.spec.ts +61 -0
- package/src/backend/tests/test-edit-source.ts +34 -0
- package/src/backend/tests/test-history-edit-proposals.ts +69 -0
- package/src/backend/tests/test-history-overrides.spec.ts +24 -0
- package/src/backend/tests/test-selection.ts +27 -0
- package/src/lib/api-telescope/source-selection.spec.ts +44 -0
- package/src/lib/api-telescope/source-selection.ts +28 -0
- package/src/lib/components/Modal.svelte +1 -1
- package/src/lib/edit/edit-workspace-context.ts +33 -3
- package/src/lib/edit/test-ai-edit.spec.ts +31 -0
- package/src/lib/edit/test-ai-edit.ts +52 -0
- package/src/lib/git-mode/BlockingGitDialog.svelte +118 -0
- package/src/lib/git-mode/GitControlsButton.svelte +96 -0
- package/src/lib/git-mode/client-admission.spec.ts +304 -0
- package/src/lib/git-mode/client-admission.ts +343 -0
- package/src/lib/git-mode/errors.ts +2 -0
- package/src/lib/git-mode/git-mode-context.ts +70 -0
- package/src/lib/git-mode/refresh-policy.spec.ts +95 -0
- package/src/lib/git-mode/refresh-policy.ts +39 -0
- package/src/lib/git-mode/status-recovery.spec.ts +86 -0
- package/src/lib/git-mode/status-recovery.ts +33 -0
- package/src/lib/monaco/bosun-theme.ts +6 -83
- package/src/lib/monaco/editor-appearance.spec.ts +84 -0
- package/src/lib/monaco/editor-appearance.ts +154 -0
- package/src/lib/monaco/editor-decorations.spec.ts +91 -0
- package/src/lib/monaco/editor-decorations.ts +133 -0
- package/src/lib/tests/assertion-types.ts +74 -0
- package/src/lib/trpc-client.ts +15 -1
- package/src/lib/ws-client.spec.ts +208 -0
- package/src/lib/ws-client.ts +196 -14
- package/src/lib/ws-message.ts +24 -0
- package/build/client/_app/immutable/assets/0.Rrc0O--C.css +0 -1
- package/build/client/_app/immutable/assets/0.Rrc0O--C.css.br +0 -0
- package/build/client/_app/immutable/assets/0.Rrc0O--C.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.DtxQDOXx.css.br +0 -0
- package/build/client/_app/immutable/assets/2.DtxQDOXx.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B1HdnQRQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/B1HdnQRQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5zf3x62.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5zf3x62.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BHHfrjbV.js.br +0 -2
- package/build/client/_app/immutable/chunks/BHHfrjbV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BU7aeYn4.js +0 -1
- package/build/client/_app/immutable/chunks/BU7aeYn4.js.br +0 -0
- package/build/client/_app/immutable/chunks/BU7aeYn4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BbGYcfPY.js +0 -3
- package/build/client/_app/immutable/chunks/BbGYcfPY.js.br +0 -0
- package/build/client/_app/immutable/chunks/BbGYcfPY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bmd5zhWC.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bmd5zhWC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BnqH7p3U.js +0 -33
- package/build/client/_app/immutable/chunks/BnqH7p3U.js.br +0 -0
- package/build/client/_app/immutable/chunks/BnqH7p3U.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bog028VR.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bog028VR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bv1mNXs0.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bv1mNXs0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BvjXTrOz.js +0 -1
- package/build/client/_app/immutable/chunks/BvjXTrOz.js.br +0 -0
- package/build/client/_app/immutable/chunks/BvjXTrOz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C1R-s4aD.js +0 -1
- package/build/client/_app/immutable/chunks/C1R-s4aD.js.br +0 -0
- package/build/client/_app/immutable/chunks/C1R-s4aD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CC1OcqhR.js +0 -1
- package/build/client/_app/immutable/chunks/CC1OcqhR.js.br +0 -0
- package/build/client/_app/immutable/chunks/CC1OcqhR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CEHsomMo.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJcZ2GVC.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJcZ2GVC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CN555stc.js.br +0 -0
- package/build/client/_app/immutable/chunks/CN555stc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQg2Mme0.js +0 -9
- package/build/client/_app/immutable/chunks/CQg2Mme0.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQg2Mme0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cp_st-64.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cp_st-64.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8mA-uZ4.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8mA-uZ4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DCXjBDmY.js.br +0 -0
- package/build/client/_app/immutable/chunks/DCXjBDmY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DSLyVE1P.js +0 -1
- package/build/client/_app/immutable/chunks/DSLyVE1P.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSLyVE1P.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ddv5LgEc.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ddv5LgEc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DfcDjAv-.js.br +0 -0
- package/build/client/_app/immutable/chunks/DfcDjAv-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dg0A8wPA.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dg0A8wPA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dm49pcMm.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dm49pcMm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DneQQ7D5.js.br +0 -0
- package/build/client/_app/immutable/chunks/DneQQ7D5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DoD3q5w5.js.br +0 -0
- package/build/client/_app/immutable/chunks/DoD3q5w5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DtXXy94i.js.br +0 -0
- package/build/client/_app/immutable/chunks/DtXXy94i.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dy2CFyD6.js +0 -2
- package/build/client/_app/immutable/chunks/Dy2CFyD6.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dy2CFyD6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DyBwTDJp.js +0 -2
- package/build/client/_app/immutable/chunks/DyBwTDJp.js.br +0 -0
- package/build/client/_app/immutable/chunks/DyBwTDJp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ILTCveYH.js +0 -1
- package/build/client/_app/immutable/chunks/ILTCveYH.js.br +0 -0
- package/build/client/_app/immutable/chunks/ILTCveYH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/JcG4w2gF.js.br +0 -0
- package/build/client/_app/immutable/chunks/JcG4w2gF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UqjCSZmA.js.br +0 -0
- package/build/client/_app/immutable/chunks/UqjCSZmA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/_YcrHZ6P.js +0 -1
- package/build/client/_app/immutable/chunks/_YcrHZ6P.js.br +0 -2
- package/build/client/_app/immutable/chunks/_YcrHZ6P.js.gz +0 -0
- package/build/client/_app/immutable/chunks/i6ygh6h8.js +0 -1
- package/build/client/_app/immutable/chunks/i6ygh6h8.js.br +0 -2
- package/build/client/_app/immutable/chunks/i6ygh6h8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/oRi68ch3.js +0 -1
- package/build/client/_app/immutable/chunks/oRi68ch3.js.br +0 -0
- package/build/client/_app/immutable/chunks/oRi68ch3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pPpIn6tB.js.br +0 -0
- package/build/client/_app/immutable/chunks/pPpIn6tB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/r0sHOWrM.js +0 -1
- package/build/client/_app/immutable/chunks/r0sHOWrM.js.br +0 -0
- package/build/client/_app/immutable/chunks/r0sHOWrM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wcTQUnZO.js.br +0 -0
- package/build/client/_app/immutable/chunks/wcTQUnZO.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DdO0gkPg.js +0 -2
- package/build/client/_app/immutable/entry/app.DdO0gkPg.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DdO0gkPg.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.eAjDq0c9.js +0 -1
- package/build/client/_app/immutable/entry/start.eAjDq0c9.js.br +0 -2
- package/build/client/_app/immutable/entry/start.eAjDq0c9.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.nG3DdvIX.js +0 -3
- package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js +0 -1
- package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.dm2dgy31.js +0 -13
- package/build/client/_app/immutable/nodes/10.dm2dgy31.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.dm2dgy31.js.gz +0 -0
- package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.br +0 -0
- package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.gz +0 -0
- package/build/client/_app/immutable/nodes/17.CKxGp0E7.js +0 -3
- package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.br +0 -0
- package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/18.DHJxyQpw.js +0 -11
- package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.br +0 -0
- package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DesR2keg.js +0 -35
- package/build/client/_app/immutable/nodes/2.DesR2keg.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DesR2keg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BUKrXGR_.js +0 -1
- package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.C_hEzPrU.js +0 -1
- package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.BTYaOiDC.js +0 -2
- package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DVspuDYY.js +0 -2
- package/build/client/_app/immutable/nodes/9.DVspuDYY.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DVspuDYY.js.gz +0 -0
- package/build/server/chunks/0-D_duQDWy.js +0 -9
- package/build/server/chunks/0-D_duQDWy.js.map +0 -1
- package/build/server/chunks/1-C0HdTvXW.js +0 -9
- package/build/server/chunks/10-DcfhCR4R.js +0 -9
- package/build/server/chunks/10-DcfhCR4R.js.map +0 -1
- package/build/server/chunks/15-BQcb9C_y.js +0 -9
- package/build/server/chunks/17-DuVCTioj.js +0 -9
- package/build/server/chunks/17-DuVCTioj.js.map +0 -1
- package/build/server/chunks/18-CT0VFW_p.js +0 -9
- package/build/server/chunks/18-CT0VFW_p.js.map +0 -1
- package/build/server/chunks/2-DgTzKQAP.js +0 -9
- package/build/server/chunks/2-DgTzKQAP.js.map +0 -1
- package/build/server/chunks/3-eQMSMzXP.js +0 -9
- package/build/server/chunks/3-eQMSMzXP.js.map +0 -1
- package/build/server/chunks/4-OaAJtDqP.js +0 -9
- package/build/server/chunks/4-OaAJtDqP.js.map +0 -1
- package/build/server/chunks/5-CBdMutbv.js +0 -9
- package/build/server/chunks/5-CBdMutbv.js.map +0 -1
- package/build/server/chunks/6-FoEi7ggm.js +0 -9
- package/build/server/chunks/6-FoEi7ggm.js.map +0 -1
- package/build/server/chunks/8-B44yRkfX.js +0 -9
- package/build/server/chunks/8-B44yRkfX.js.map +0 -1
- package/build/server/chunks/9-eUjFpHzI.js +0 -9
- package/build/server/chunks/9-eUjFpHzI.js.map +0 -1
- package/build/server/chunks/ChatStepTrace-BivoNYOY.js.map +0 -1
- package/build/server/chunks/_layout.svelte-B-0DHjLB.js +0 -45
- package/build/server/chunks/_layout.svelte-B-0DHjLB.js.map +0 -1
- package/build/server/chunks/_layout.svelte-B88WMyk0.js.map +0 -1
- package/build/server/chunks/_layout.svelte-wi6o5Ecu.js.map +0 -1
- package/build/server/chunks/_page.svelte-57pyhszV.js.map +0 -1
- package/build/server/chunks/_page.svelte-BSVJ2d2G.js.map +0 -1
- package/build/server/chunks/_page.svelte-BoHt2cpr.js +0 -61
- package/build/server/chunks/_page.svelte-BoHt2cpr.js.map +0 -1
- package/build/server/chunks/_page.svelte-CeS_21Ho.js.map +0 -1
- package/build/server/chunks/_page.svelte-DHSYVLoj.js.map +0 -1
- package/build/server/chunks/_page.svelte-DhFNFMnl.js.map +0 -1
- package/build/server/chunks/_server.ts-D_eo_OAK.js +0 -139
- package/build/server/chunks/_server.ts-D_eo_OAK.js.map +0 -1
- package/build/server/chunks/error.svelte-DmKKN1RU.js +0 -15
- package/build/server/chunks/source-selection-CcN1cgXc.js.map +0 -1
- package/build/server/chunks/trpc-client-D8L6vWf4.js +0 -14
- 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
|
+
}
|
package/src/lib/trpc-client.ts
CHANGED
|
@@ -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
|
+
}
|