@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
package/README.md
CHANGED
|
@@ -26,6 +26,30 @@ In your Recombine Agent folder
|
|
|
26
26
|
|
|
27
27
|
Bosun automatically chooses free local ports when the default ports are already in use, so you can run it from multiple agent repos at the same time.
|
|
28
28
|
|
|
29
|
+
## Git mode (optional)
|
|
30
|
+
|
|
31
|
+
Git mode keeps a personal branch up to date with a release branch. It adds **Discard**, **Save**, and **Prepare for release** controls. It can pull, merge, commit, stash, and push project changes.
|
|
32
|
+
|
|
33
|
+
Add these settings to the project `.env` where you run `bosun`:
|
|
34
|
+
|
|
35
|
+
```dotenv
|
|
36
|
+
BOSUN_GIT_MODE=true
|
|
37
|
+
BOSUN_CURRENT_BRANCH=next-release
|
|
38
|
+
BOSUN_PERSONAL_BRANCH=your-name/next-release
|
|
39
|
+
# Optional; the default is 10.
|
|
40
|
+
BOSUN_GIT_ACTIVATION_IDLE_MINUTES=10
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Before you start Bosun:
|
|
44
|
+
|
|
45
|
+
- Use macOS, Linux, or WSL. Native Windows is not supported.
|
|
46
|
+
- Run `bosun` from the root of the primary Git checkout, with the personal branch checked out.
|
|
47
|
+
- Create both branches locally. They must track different branches on the same remote. The remote must use one URL for both fetch and push.
|
|
48
|
+
- Do not use a linked worktree or a repository with submodules. The release branch must not be open in another worktree.
|
|
49
|
+
- Finish or abort any merge or rebase.
|
|
50
|
+
|
|
51
|
+
The first Bosun page that you open after startup refreshes the repository. **Save** commits all project changes to the personal branch and pushes them. **Discard** moves tracked and non-ignored untracked changes to the Git stash. **Prepare for release** publishes the result to both upstream branches in one atomic push. If pulled files change, Bosun installs locked dependencies without project scripts, restarts, and reloads its pages.
|
|
52
|
+
|
|
29
53
|
## Roleplay context and variants
|
|
30
54
|
|
|
31
55
|
Bosun keeps roleplay conversation state separately from agent context:
|
package/bin/bosun.js
CHANGED
|
@@ -6,6 +6,14 @@ import { existsSync, readFileSync } from 'fs'
|
|
|
6
6
|
import { createServer } from 'net'
|
|
7
7
|
import { resolve, dirname } from 'path'
|
|
8
8
|
import { fileURLToPath } from 'url'
|
|
9
|
+
import {
|
|
10
|
+
cleanupGitModeRuntime,
|
|
11
|
+
createBosunChildEnvironment,
|
|
12
|
+
GIT_ACTIVATION_RESTART_EXIT_CODE,
|
|
13
|
+
prepareGitModeRuntime,
|
|
14
|
+
registerGitModeChildProcess,
|
|
15
|
+
unregisterGitModeChildProcess
|
|
16
|
+
} from './git-mode.js'
|
|
9
17
|
|
|
10
18
|
const __filename = fileURLToPath(import.meta.url)
|
|
11
19
|
const __dirname = dirname(__filename)
|
|
@@ -29,6 +37,11 @@ let backendProcess = null
|
|
|
29
37
|
let frontendProcess = null
|
|
30
38
|
|
|
31
39
|
let isShuttingDown = false
|
|
40
|
+
/** @type {Promise<void> | null} */
|
|
41
|
+
let shutdownPromise = null
|
|
42
|
+
|
|
43
|
+
/** @type {WeakMap<ChildProcess, Promise<{ code: number | null, signal: NodeJS.Signals | null }>>} */
|
|
44
|
+
const childExitPromises = new WeakMap()
|
|
32
45
|
|
|
33
46
|
const BACKEND_RESTART_EXIT_CODE = 75
|
|
34
47
|
|
|
@@ -36,10 +49,13 @@ const envPath = resolve(process.cwd(), '.env')
|
|
|
36
49
|
const envConfig = existsSync(envPath) ? dotenv.parse(readFileSync(envPath)) : {}
|
|
37
50
|
const baseEnv = { ...process.env, ...envConfig }
|
|
38
51
|
|
|
52
|
+
/** @type {import('./git-mode.js').GitModeRuntime | null} */
|
|
53
|
+
let gitModeRuntime = null
|
|
54
|
+
|
|
39
55
|
/** @type {{ frontend: number, ws: number, trpc: number } | null} */
|
|
40
56
|
let ports = null
|
|
41
57
|
|
|
42
|
-
main()
|
|
58
|
+
void main()
|
|
43
59
|
|
|
44
60
|
/* ========= Implementation =========== */
|
|
45
61
|
|
|
@@ -47,6 +63,7 @@ async function main() {
|
|
|
47
63
|
// Initial start
|
|
48
64
|
try {
|
|
49
65
|
checkBosunLibVersionMatch()
|
|
66
|
+
gitModeRuntime = prepareGitModeRuntime({ cwd: process.cwd(), projectEnv: envConfig })
|
|
50
67
|
ports = await selectPorts()
|
|
51
68
|
|
|
52
69
|
// Start backend
|
|
@@ -63,25 +80,31 @@ async function main() {
|
|
|
63
80
|
console.log(`WebSocket: ws://localhost:${ports.ws}`)
|
|
64
81
|
console.log(`tRPC: http://localhost:${ports.trpc}`)
|
|
65
82
|
} catch (error) {
|
|
66
|
-
console.error(
|
|
67
|
-
|
|
83
|
+
console.error(
|
|
84
|
+
'❌ Bosun could not start:',
|
|
85
|
+
error instanceof Error ? error.message : String(error)
|
|
86
|
+
)
|
|
87
|
+
await shutdown(1)
|
|
68
88
|
}
|
|
69
89
|
}
|
|
70
90
|
|
|
71
91
|
function startBackend() {
|
|
72
92
|
if (!ports) throw new Error('Ports were not selected before starting the backend.')
|
|
73
93
|
|
|
74
|
-
const tsxBin = process.platform === 'win32' ? 'tsx.cmd' : 'tsx'
|
|
75
|
-
const tsxPath = resolve(rootDir, 'node_modules', '.bin', tsxBin)
|
|
76
94
|
const serverPath = resolve(rootDir, 'src', 'backend', 'server.ts')
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
95
|
+
// The tsx CLI launches the actual TypeScript program in a grandchild. Run its loader in this
|
|
96
|
+
// child instead so SIGTERM reaches the server that owns the write/command drains.
|
|
97
|
+
const tsxLoaderUrl = import.meta.resolve('tsx')
|
|
98
|
+
const childEnv = createBosunChildEnvironment(
|
|
99
|
+
baseEnv,
|
|
100
|
+
gitModeRuntime,
|
|
101
|
+
`http://localhost:${ports.frontend}`
|
|
102
|
+
)
|
|
103
|
+
const child = spawn(process.execPath, ['--import', tsxLoaderUrl, serverPath], {
|
|
81
104
|
cwd: process.cwd(),
|
|
82
105
|
stdio: 'inherit',
|
|
83
106
|
env: {
|
|
84
|
-
...
|
|
107
|
+
...childEnv,
|
|
85
108
|
BOSUN_WS_PORT: String(ports.ws),
|
|
86
109
|
BOSUN_TRPC_PORT: String(ports.trpc),
|
|
87
110
|
PUBLIC_WS_HOST: `ws://localhost:${ports.ws}`,
|
|
@@ -90,8 +113,9 @@ function startBackend() {
|
|
|
90
113
|
PUBLIC_TRPC_PORT: String(ports.trpc),
|
|
91
114
|
BOSUN_NPX_RUN: 'true'
|
|
92
115
|
},
|
|
93
|
-
shell:
|
|
116
|
+
shell: false
|
|
94
117
|
})
|
|
118
|
+
registerChildOrStop(child, 'backend')
|
|
95
119
|
watchChild(child, 'backend')
|
|
96
120
|
return child
|
|
97
121
|
}
|
|
@@ -101,12 +125,17 @@ function startFrontend() {
|
|
|
101
125
|
|
|
102
126
|
const frontPath = resolve(rootDir, 'build', 'index.js')
|
|
103
127
|
const bodySizeLimit = baseEnv.BODY_SIZE_LIMIT || 'Infinity'
|
|
128
|
+
const childEnv = createBosunChildEnvironment(
|
|
129
|
+
baseEnv,
|
|
130
|
+
gitModeRuntime,
|
|
131
|
+
`http://localhost:${ports.frontend}`
|
|
132
|
+
)
|
|
104
133
|
|
|
105
134
|
const child = spawn(process.execPath, [frontPath], {
|
|
106
135
|
cwd: process.cwd(),
|
|
107
136
|
stdio: 'inherit',
|
|
108
137
|
env: {
|
|
109
|
-
...
|
|
138
|
+
...childEnv,
|
|
110
139
|
HOST: 'localhost',
|
|
111
140
|
PORT: String(ports.frontend),
|
|
112
141
|
PUBLIC_WS_HOST: `ws://localhost:${ports.ws}`,
|
|
@@ -118,8 +147,9 @@ function startFrontend() {
|
|
|
118
147
|
// Latency recordings are uploaded as WAV files and can be large.
|
|
119
148
|
BODY_SIZE_LIMIT: bodySizeLimit
|
|
120
149
|
},
|
|
121
|
-
shell:
|
|
150
|
+
shell: false
|
|
122
151
|
})
|
|
152
|
+
registerChildOrStop(child, 'frontend')
|
|
123
153
|
watchChild(child, 'frontend')
|
|
124
154
|
return child
|
|
125
155
|
}
|
|
@@ -253,40 +283,143 @@ function isUnsupportedIpv6Error(error) {
|
|
|
253
283
|
* @param {string} name
|
|
254
284
|
*/
|
|
255
285
|
function watchChild(child, name) {
|
|
286
|
+
/** @type {(outcome: { code: number | null, signal: NodeJS.Signals | null }) => void} */
|
|
287
|
+
let resolveExit = () => {}
|
|
288
|
+
const exitPromise = new Promise((resolvePromise) => {
|
|
289
|
+
resolveExit = resolvePromise
|
|
290
|
+
})
|
|
291
|
+
childExitPromises.set(child, exitPromise)
|
|
292
|
+
|
|
256
293
|
child.on('error', (error) => {
|
|
257
294
|
if (isShuttingDown) return
|
|
258
295
|
console.error(`❌ Bosun ${name} failed to start:`, error.message)
|
|
259
|
-
shutdown(1)
|
|
296
|
+
void shutdown(1)
|
|
260
297
|
})
|
|
261
298
|
|
|
262
|
-
child.on('
|
|
299
|
+
child.on('close', (code, signal) => {
|
|
300
|
+
try {
|
|
301
|
+
unregisterGitModeChildProcess(gitModeRuntime, child.pid)
|
|
302
|
+
} catch (error) {
|
|
303
|
+
console.error(`❌ Bosun could not update ${name} process state:`, error)
|
|
304
|
+
}
|
|
305
|
+
resolveExit({ code, signal })
|
|
263
306
|
if (isShuttingDown) return
|
|
264
307
|
if (name === 'backend' && code === BACKEND_RESTART_EXIT_CODE && !signal) {
|
|
265
308
|
console.log('🔄 Bosun backend restarting to load project changes')
|
|
266
309
|
backendProcess = startBackend()
|
|
267
310
|
return
|
|
268
311
|
}
|
|
312
|
+
if (name === 'backend' && code === GIT_ACTIVATION_RESTART_EXIT_CODE && !signal) {
|
|
313
|
+
console.log('🔄 Bosun backend restarting after Git refresh')
|
|
314
|
+
backendProcess = startBackend()
|
|
315
|
+
return
|
|
316
|
+
}
|
|
269
317
|
|
|
270
318
|
const reason = signal ? `signal ${signal}` : `exit code ${code ?? 1}`
|
|
271
319
|
console.error(`❌ Bosun ${name} stopped unexpectedly (${reason}).`)
|
|
272
|
-
shutdown(code ?? 1)
|
|
320
|
+
void shutdown(code ?? 1)
|
|
273
321
|
})
|
|
274
322
|
}
|
|
275
323
|
|
|
324
|
+
/** @param {ChildProcess} child @param {string} name */
|
|
325
|
+
function registerChildOrStop(child, name) {
|
|
326
|
+
try {
|
|
327
|
+
registerGitModeChildProcess(gitModeRuntime, child.pid, name)
|
|
328
|
+
} catch (error) {
|
|
329
|
+
try {
|
|
330
|
+
child.kill('SIGKILL')
|
|
331
|
+
} catch {}
|
|
332
|
+
throw error
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
276
336
|
// Handle cleanup
|
|
277
|
-
process.on('SIGINT', () => shutdown(0))
|
|
278
|
-
process.on('SIGTERM', () => shutdown(0))
|
|
337
|
+
process.on('SIGINT', () => void shutdown(0))
|
|
338
|
+
process.on('SIGTERM', () => void shutdown(0))
|
|
279
339
|
|
|
280
340
|
/**
|
|
281
341
|
* @param {number} code
|
|
282
342
|
*/
|
|
283
343
|
function shutdown(code) {
|
|
344
|
+
if (shutdownPromise) return shutdownPromise
|
|
284
345
|
isShuttingDown = true
|
|
285
|
-
|
|
286
|
-
|
|
346
|
+
shutdownPromise = performShutdown(code)
|
|
347
|
+
return shutdownPromise
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/** @param {number} code */
|
|
351
|
+
async function performShutdown(code) {
|
|
352
|
+
const backendAtShutdown = backendProcess
|
|
353
|
+
const frontendAtShutdown = frontendProcess
|
|
354
|
+
// The backend first closes the cross-process write gate and drains any frontend file operation
|
|
355
|
+
// admitted before that lock. Keep the frontend alive for that drain, then stop it.
|
|
356
|
+
const backendStopped = await stopChild(backendAtShutdown, 'backend')
|
|
357
|
+
const frontendStopped = await stopChild(frontendAtShutdown, 'frontend')
|
|
358
|
+
const childrenStopped = backendStopped && frontendStopped
|
|
359
|
+
|
|
360
|
+
if (gitModeRuntime) {
|
|
361
|
+
if (childrenStopped) {
|
|
362
|
+
try {
|
|
363
|
+
cleanupGitModeRuntime(gitModeRuntime)
|
|
364
|
+
} catch (error) {
|
|
365
|
+
code = 1
|
|
366
|
+
console.error(
|
|
367
|
+
'❌ Bosun retained the repository lease because shutdown cleanup could not be verified:',
|
|
368
|
+
error instanceof Error ? error.message : String(error)
|
|
369
|
+
)
|
|
370
|
+
}
|
|
371
|
+
} else {
|
|
372
|
+
code = 1
|
|
373
|
+
console.error(
|
|
374
|
+
'❌ Bosun could not confirm that all child processes stopped. Restart Bosun after they exit.'
|
|
375
|
+
)
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
287
379
|
process.exit(code)
|
|
288
380
|
}
|
|
289
381
|
|
|
382
|
+
/**
|
|
383
|
+
* @param {ChildProcess | null} child
|
|
384
|
+
* @param {string} name
|
|
385
|
+
* @returns {Promise<boolean>}
|
|
386
|
+
*/
|
|
387
|
+
async function stopChild(child, name) {
|
|
388
|
+
if (!child) return true
|
|
389
|
+
const exit = childExitPromises.get(child)
|
|
390
|
+
if (!exit) {
|
|
391
|
+
return child.exitCode !== null || child.signalCode !== null
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
395
|
+
try {
|
|
396
|
+
child.kill('SIGTERM')
|
|
397
|
+
} catch (error) {
|
|
398
|
+
console.error(`❌ Bosun could not ask the ${name} process to stop:`, error)
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const gracefulOutcome = await settleWithin(exit, 12_000)
|
|
403
|
+
if (gracefulOutcome) return true
|
|
404
|
+
|
|
405
|
+
console.error(`❌ Bosun ${name} did not stop gracefully; forcing it to exit.`)
|
|
406
|
+
try {
|
|
407
|
+
child.kill('SIGKILL')
|
|
408
|
+
} catch (error) {
|
|
409
|
+
console.error(`❌ Bosun could not force the ${name} process to stop:`, error)
|
|
410
|
+
}
|
|
411
|
+
const forcedOutcome = await settleWithin(exit, 3_000)
|
|
412
|
+
return forcedOutcome !== null
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/** @template T @param {Promise<T>} promise @param {number} timeoutMs */
|
|
416
|
+
function settleWithin(promise, timeoutMs) {
|
|
417
|
+
return Promise.race([
|
|
418
|
+
promise.then((value) => ({ settled: true, value })),
|
|
419
|
+
sleep(timeoutMs).then(() => ({ settled: false, value: null }))
|
|
420
|
+
]).then((result) => (result.settled ? result.value : null))
|
|
421
|
+
}
|
|
422
|
+
|
|
290
423
|
function isLinked() {
|
|
291
424
|
return !__filename.includes('node_modules/@recombine-ai/bosun')
|
|
292
425
|
}
|