@recombine-ai/bosun 0.16.1 → 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.Bc0Sf3YD.css +1 -0
- 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/assets/ReadOnlyMonacoDiff.iiWNRlR-.css +1 -0
- package/build/client/_app/immutable/assets/ReadOnlyMonacoDiff.iiWNRlR-.css.br +0 -0
- package/build/client/_app/immutable/assets/ReadOnlyMonacoDiff.iiWNRlR-.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{BI42X8h_.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/{Bw7xm6iT.js → B-dTD_wm.js} +1 -1
- 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/{Bj8jfBTi.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/{CJYOmGlC.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/{BJTwdUYr.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/{CVlsAO8k.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/{CX0Ekq8t.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/C4UC6AgE.js +1 -0
- package/build/client/_app/immutable/chunks/C4UC6AgE.js.br +0 -0
- package/build/client/_app/immutable/chunks/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/{C39ai1md.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/{Ca197UDq.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/{iAhzu4tv.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/{BLu86SbA.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/{nYD9wsyN.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/{CPXdAKdv.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/{uLGP0py1.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/{D-B5X35l.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/{Buo-57fF.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/{Ce9aG7vY.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/{BPNEONy5.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/{CaHl3dME.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/{07xNIa59.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/{Cyai3SOj.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/{DJriQKD9.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.BFy4oAT6.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.C5HDYxuE.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.BRZRzqKl.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-p4jSVKu9.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-BRw8wtLp.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-C--dGIV5.js → AgentSidebar-BEbSdZdN.js} +4 -4
- package/build/server/chunks/{AgentSidebar-C--dGIV5.js.map → AgentSidebar-BEbSdZdN.js.map} +1 -1
- package/build/server/chunks/{Button-oIUr2LUP.js → Button-Dc9CR4Wh.js} +2 -2
- package/build/server/chunks/{Button-oIUr2LUP.js.map → Button-Dc9CR4Wh.js.map} +1 -1
- package/build/server/chunks/{ChatStepTrace-CX2Zolmp.js → ChatStepTrace-OM96X4g8.js} +20 -7
- package/build/server/chunks/ChatStepTrace-OM96X4g8.js.map +1 -0
- package/build/server/chunks/{Dropdown-DfCyYHqi.js → Dropdown-Cgd7pG-k.js} +2 -2
- package/build/server/chunks/{Dropdown-DfCyYHqi.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-DadJPtVP.js → Icon-Bogvl2n9.js} +2 -2
- package/build/server/chunks/{Icon-DadJPtVP.js.map → Icon-Bogvl2n9.js.map} +1 -1
- package/build/server/chunks/{Input-R74u4cO5.js → Input-7hpw1WLW.js} +2 -2
- package/build/server/chunks/{Input-R74u4cO5.js.map → Input-7hpw1WLW.js.map} +1 -1
- package/build/server/chunks/{Modal-CAzVFw5x.js → Modal-7IIIfFEG.js} +21 -9
- package/build/server/chunks/{Modal-CAzVFw5x.js.map → Modal-7IIIfFEG.js.map} +1 -1
- package/build/server/chunks/{Panel-D0IY1AzO.js → Panel-Cj1mXx9-.js} +2 -2
- package/build/server/chunks/{Panel-D0IY1AzO.js.map → Panel-Cj1mXx9-.js.map} +1 -1
- package/build/server/chunks/{Tab-D13L_Up5.js → Tab-bf4ZDs5y.js} +4 -4
- package/build/server/chunks/{Tab-D13L_Up5.js.map → Tab-bf4ZDs5y.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-Dk-9LkfL.js → _layout.svelte-C71luIwv.js} +10 -10
- package/build/server/chunks/{_layout.svelte-Dk-9LkfL.js.map → _layout.svelte-C71luIwv.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-BIMexfnk.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-D6rhwm98.js +2168 -0
- package/build/server/chunks/_layout.svelte-D6rhwm98.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CoCBnE2l.js → _page.svelte-BBvDMiTV.js} +25 -21
- package/build/server/chunks/_page.svelte-BBvDMiTV.js.map +1 -0
- package/build/server/chunks/{_page.svelte-YoDx7gDL.js → _page.svelte-BQs9dEuq.js} +8 -7
- package/build/server/chunks/{_page.svelte-YoDx7gDL.js.map → _page.svelte-BQs9dEuq.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-xf-0yXQM.js → _page.svelte-BoO2LWVX.js} +45 -23
- package/build/server/chunks/_page.svelte-BoO2LWVX.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CeO_ScC8.js → _page.svelte-DUCTSdv-.js} +2 -2
- package/build/server/chunks/{_page.svelte-CeO_ScC8.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-DZvcjON6.js → _page.svelte-KA1hqKj2.js} +20 -107
- package/build/server/chunks/_page.svelte-KA1hqKj2.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CY0Be19a.js → _page.svelte-y8CZFL8a.js} +210 -106
- package/build/server/chunks/_page.svelte-y8CZFL8a.js.map +1 -0
- package/build/server/chunks/{_page.svelte-D5S0QjlI.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-w03Lz_6n.js → agents-context-owgusUPR.js} +2 -2
- package/build/server/chunks/{agents-context-w03Lz_6n.js.map → agents-context-owgusUPR.js.map} +1 -1
- package/build/server/chunks/{client-WFEvX_be.js → client-P-7bDULt.js} +4 -4
- package/build/server/chunks/{client-WFEvX_be.js.map → client-P-7bDULt.js.map} +1 -1
- package/build/server/chunks/{conversation-view-memory-B0PllWRL.js → conversation-view-memory-SdpdqTR7.js} +2 -2
- package/build/server/chunks/{conversation-view-memory-B0PllWRL.js.map → conversation-view-memory-SdpdqTR7.js.map} +1 -1
- package/build/server/chunks/{edit-workspace-context-biaZqjOf.js → edit-workspace-context-hanFnXR3.js} +2 -2
- package/build/server/chunks/{edit-workspace-context-biaZqjOf.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-BjIDhioc.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-rHCWxLFZ.js → index-DGtbUu8Y.js} +2 -2
- package/build/server/chunks/{index-rHCWxLFZ.js.map → index-DGtbUu8Y.js.map} +1 -1
- package/build/server/chunks/{index-server-BMxlf3ZC.js → index-server-l8-WsVn4.js} +2 -2
- package/build/server/chunks/{index-server-BMxlf3ZC.js.map → index-server-l8-WsVn4.js.map} +1 -1
- package/build/server/chunks/{index2-DdOgqE2_.js → index2-CtgLiJVO.js} +3 -3
- package/build/server/chunks/{index2-DdOgqE2_.js.map → index2-CtgLiJVO.js.map} +1 -1
- package/build/server/chunks/{index3-DC4GTqD1.js → index3-4hbbCqW0.js} +2 -2
- package/build/server/chunks/{index3-DC4GTqD1.js.map → index3-4hbbCqW0.js.map} +1 -1
- package/build/server/chunks/{root-UeqiktJA.js → root-sWPnlpi3.js} +2 -2
- package/build/server/chunks/{root-UeqiktJA.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-CLOYXiU6.js → state.svelte-BkvaElc6.js} +3 -3
- package/build/server/chunks/{state.svelte-CLOYXiU6.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/apply-v4a-diff.spec.ts +45 -0
- package/src/backend/lib/apply-v4a-diff.ts +167 -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/agents.ts +16 -2
- package/src/backend/roleplay/old-server.ts +115 -51
- package/src/backend/roleplay/prompt-edit-progress.ts +36 -0
- package/src/backend/roleplay/prompt-edit-proposals.ts +72 -0
- package/src/backend/roleplay/prompt-file.ts +59 -0
- package/src/backend/roleplay/router.spec.ts +75 -0
- package/src/backend/roleplay/router.ts +174 -72
- package/src/backend/roleplay/step-registry.spec.ts +20 -0
- package/src/backend/roleplay/step-registry.ts +13 -2
- package/src/backend/roleplay/suggest-file-edit.ts +160 -0
- package/src/backend/roleplay/suggest-prompt-edit.ts +34 -0
- 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/roleplay/variants.ts +8 -4
- package/src/backend/server.ts +116 -13
- package/src/backend/tests/academy.ts +23 -3
- package/src/backend/tests/data.spec.ts +81 -2
- package/src/backend/tests/data.ts +74 -4
- package/src/backend/tests/emulate-agents.spec.ts +106 -0
- package/src/backend/tests/emulate-agents.ts +42 -4
- package/src/backend/tests/router.ts +109 -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 +42 -13
- package/src/lib/components/Textarea.svelte +41 -0
- package/src/lib/edit/edit-workspace-context.ts +45 -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 +31 -0
- package/build/client/_app/immutable/assets/0.FwR3B_mV.css +0 -1
- package/build/client/_app/immutable/assets/0.FwR3B_mV.css.br +0 -0
- package/build/client/_app/immutable/assets/0.FwR3B_mV.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.DxwYfh1z.css +0 -1
- package/build/client/_app/immutable/assets/2.DxwYfh1z.css.br +0 -0
- package/build/client/_app/immutable/assets/2.DxwYfh1z.css.gz +0 -0
- package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css +0 -0
- package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css.br +0 -1
- package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css.gz +0 -0
- package/build/client/_app/immutable/chunks/07xNIa59.js.br +0 -0
- package/build/client/_app/immutable/chunks/07xNIa59.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDl2QuyN.js +0 -1
- package/build/client/_app/immutable/chunks/BDl2QuyN.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDl2QuyN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BI42X8h_.js.br +0 -0
- package/build/client/_app/immutable/chunks/BI42X8h_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJTwdUYr.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJTwdUYr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BLu86SbA.js.br +0 -0
- package/build/client/_app/immutable/chunks/BLu86SbA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BNifnXkO.js +0 -1
- package/build/client/_app/immutable/chunks/BNifnXkO.js.br +0 -2
- package/build/client/_app/immutable/chunks/BNifnXkO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BPNEONy5.js.br +0 -0
- package/build/client/_app/immutable/chunks/BPNEONy5.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/B_K7D6rX.js +0 -2
- package/build/client/_app/immutable/chunks/B_K7D6rX.js.br +0 -0
- package/build/client/_app/immutable/chunks/B_K7D6rX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BbBuNuSi.js +0 -3
- package/build/client/_app/immutable/chunks/BbBuNuSi.js.br +0 -0
- package/build/client/_app/immutable/chunks/BbBuNuSi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bj8jfBTi.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bj8jfBTi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BsDZe4N6.js +0 -1
- package/build/client/_app/immutable/chunks/BsDZe4N6.js.br +0 -0
- package/build/client/_app/immutable/chunks/BsDZe4N6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Buo-57fF.js.br +0 -0
- package/build/client/_app/immutable/chunks/Buo-57fF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bw7xm6iT.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bw7xm6iT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C39ai1md.js.br +0 -0
- package/build/client/_app/immutable/chunks/C39ai1md.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C7he4XPB.js +0 -1
- package/build/client/_app/immutable/chunks/C7he4XPB.js.br +0 -0
- package/build/client/_app/immutable/chunks/C7he4XPB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CAjPRvNs.js +0 -2
- package/build/client/_app/immutable/chunks/CAjPRvNs.js.br +0 -0
- package/build/client/_app/immutable/chunks/CAjPRvNs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CJYOmGlC.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJYOmGlC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CPXdAKdv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CPXdAKdv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CVlsAO8k.js.br +0 -0
- package/build/client/_app/immutable/chunks/CVlsAO8k.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CX0Ekq8t.js.br +0 -0
- package/build/client/_app/immutable/chunks/CX0Ekq8t.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ca197UDq.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ca197UDq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CaHl3dME.js.br +0 -0
- package/build/client/_app/immutable/chunks/CaHl3dME.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ce9aG7vY.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ce9aG7vY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cql_e8Of.js +0 -1
- package/build/client/_app/immutable/chunks/Cql_e8Of.js.br +0 -2
- package/build/client/_app/immutable/chunks/Cql_e8Of.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CxLomzuE.js +0 -1
- package/build/client/_app/immutable/chunks/CxLomzuE.js.br +0 -0
- package/build/client/_app/immutable/chunks/CxLomzuE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cyai3SOj.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cyai3SOj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CyvQWZoe.js +0 -8
- package/build/client/_app/immutable/chunks/CyvQWZoe.js.br +0 -0
- package/build/client/_app/immutable/chunks/CyvQWZoe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CzXNWL4m.js +0 -1
- package/build/client/_app/immutable/chunks/CzXNWL4m.js.br +0 -1
- package/build/client/_app/immutable/chunks/CzXNWL4m.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D-B5X35l.js.br +0 -0
- package/build/client/_app/immutable/chunks/D-B5X35l.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJriQKD9.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJriQKD9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DpBxGfau.js +0 -1
- package/build/client/_app/immutable/chunks/DpBxGfau.js.br +0 -0
- package/build/client/_app/immutable/chunks/DpBxGfau.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dslf9OwW.js +0 -33
- package/build/client/_app/immutable/chunks/Dslf9OwW.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dslf9OwW.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/QpaC6J6s.js +0 -1
- package/build/client/_app/immutable/chunks/QpaC6J6s.js.br +0 -0
- package/build/client/_app/immutable/chunks/QpaC6J6s.js.gz +0 -0
- package/build/client/_app/immutable/chunks/iAhzu4tv.js.br +0 -0
- package/build/client/_app/immutable/chunks/iAhzu4tv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/nYD9wsyN.js.br +0 -0
- package/build/client/_app/immutable/chunks/nYD9wsyN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/uLGP0py1.js.br +0 -0
- package/build/client/_app/immutable/chunks/uLGP0py1.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Ghwm_QxJ.js +0 -2
- package/build/client/_app/immutable/entry/app.Ghwm_QxJ.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Ghwm_QxJ.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.SqT6xQ-7.js +0 -1
- package/build/client/_app/immutable/entry/start.SqT6xQ-7.js.br +0 -2
- package/build/client/_app/immutable/entry/start.SqT6xQ-7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.LR7iEcCa.js +0 -3
- package/build/client/_app/immutable/nodes/0.LR7iEcCa.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.LR7iEcCa.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CWSas7JK.js +0 -1
- package/build/client/_app/immutable/nodes/1.CWSas7JK.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.CWSas7JK.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.BoxFN5Nv.js +0 -13
- package/build/client/_app/immutable/nodes/10.BoxFN5Nv.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.BoxFN5Nv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/15.BFy4oAT6.js.br +0 -0
- package/build/client/_app/immutable/nodes/15.BFy4oAT6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/17.C6M3Ukek.js +0 -3
- package/build/client/_app/immutable/nodes/17.C6M3Ukek.js.br +0 -0
- package/build/client/_app/immutable/nodes/17.C6M3Ukek.js.gz +0 -0
- package/build/client/_app/immutable/nodes/18.C7Jynwaf.js +0 -11
- package/build/client/_app/immutable/nodes/18.C7Jynwaf.js.br +0 -0
- package/build/client/_app/immutable/nodes/18.C7Jynwaf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.C9LJ_7n5.js +0 -35
- package/build/client/_app/immutable/nodes/2.C9LJ_7n5.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.C9LJ_7n5.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.Cldr3PEw.js +0 -1
- package/build/client/_app/immutable/nodes/3.Cldr3PEw.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.Cldr3PEw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.C5HDYxuE.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.C5HDYxuE.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.BRZRzqKl.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.BRZRzqKl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BEjGUOuB.js +0 -1
- package/build/client/_app/immutable/nodes/6.BEjGUOuB.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BEjGUOuB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.wHpoUA6X.js +0 -2
- package/build/client/_app/immutable/nodes/8.wHpoUA6X.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.wHpoUA6X.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.CpmcUS87.js +0 -2
- package/build/client/_app/immutable/nodes/9.CpmcUS87.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.CpmcUS87.js.gz +0 -0
- package/build/server/chunks/0-CesYJG8k.js +0 -9
- package/build/server/chunks/0-CesYJG8k.js.map +0 -1
- package/build/server/chunks/1-p4jSVKu9.js +0 -9
- package/build/server/chunks/10-BVCIK_-n.js +0 -9
- package/build/server/chunks/10-BVCIK_-n.js.map +0 -1
- package/build/server/chunks/15-BRw8wtLp.js +0 -9
- package/build/server/chunks/17-DRS7q3gb.js +0 -9
- package/build/server/chunks/17-DRS7q3gb.js.map +0 -1
- package/build/server/chunks/18-CPOL7uEZ.js +0 -9
- package/build/server/chunks/18-CPOL7uEZ.js.map +0 -1
- package/build/server/chunks/2-Cd22UmxM.js +0 -9
- package/build/server/chunks/2-Cd22UmxM.js.map +0 -1
- package/build/server/chunks/3-mcDvhjv6.js +0 -9
- package/build/server/chunks/3-mcDvhjv6.js.map +0 -1
- package/build/server/chunks/4-D0D66uQr.js +0 -9
- package/build/server/chunks/4-D0D66uQr.js.map +0 -1
- package/build/server/chunks/5-D1bI9E9O.js +0 -9
- package/build/server/chunks/5-D1bI9E9O.js.map +0 -1
- package/build/server/chunks/6-BJxJFeJN.js +0 -9
- package/build/server/chunks/6-BJxJFeJN.js.map +0 -1
- package/build/server/chunks/8-DBNRpB4j.js +0 -9
- package/build/server/chunks/8-DBNRpB4j.js.map +0 -1
- package/build/server/chunks/9-Dr21aceD.js +0 -9
- package/build/server/chunks/9-Dr21aceD.js.map +0 -1
- package/build/server/chunks/ChatStepTrace-CX2Zolmp.js.map +0 -1
- package/build/server/chunks/_layout.svelte-BIMexfnk.js.map +0 -1
- package/build/server/chunks/_layout.svelte-Blfto3jh.js +0 -1143
- package/build/server/chunks/_layout.svelte-Blfto3jh.js.map +0 -1
- package/build/server/chunks/_layout.svelte-D4EOIHJJ.js +0 -45
- package/build/server/chunks/_layout.svelte-D4EOIHJJ.js.map +0 -1
- package/build/server/chunks/_page.svelte-B1erTzoN.js +0 -61
- package/build/server/chunks/_page.svelte-B1erTzoN.js.map +0 -1
- package/build/server/chunks/_page.svelte-CY0Be19a.js.map +0 -1
- package/build/server/chunks/_page.svelte-CoCBnE2l.js.map +0 -1
- package/build/server/chunks/_page.svelte-D5S0QjlI.js.map +0 -1
- package/build/server/chunks/_page.svelte-DZvcjON6.js.map +0 -1
- package/build/server/chunks/_page.svelte-xf-0yXQM.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-BjIDhioc.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
|
+
}
|