@dylanpiercey/work 0.0.221 → 0.0.223
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 +7 -4
- package/bin/work.mjs +70 -17
- package/dist/{_-MXZhaOD.js → _CpANOzpd.js} +313 -173
- package/dist/_LF2Fo5WE.js +2 -0
- package/dist/index.mjs +1572 -1804
- package/dist/public/assets/_--tE4Gxz.js +2 -0
- package/dist/public/assets/_--tE4Gxz.js.br +0 -0
- package/dist/public/assets/_1OL9vXM-.js +1 -0
- package/dist/public/assets/_2mnAZf6B.js +1 -0
- package/dist/public/assets/_2mnAZf6B.js.br +0 -0
- package/dist/public/assets/_5f9fMvWJ.js +1 -0
- package/dist/public/assets/_5y69OR6M.js +1 -0
- package/dist/public/assets/{_Cto7UR6x.js → _Aq9oGnRu.js} +1 -1
- package/dist/public/assets/_Aq9oGnRu.js.br +0 -0
- package/dist/public/assets/_B0uJCjmk.js +1 -0
- package/dist/public/assets/{_DzCAv2Gl.js → _B1RldJ0S.js} +1 -1
- package/dist/public/assets/_B1RldJ0S.js.br +0 -0
- package/dist/public/assets/_B5TpOQCZ.js +1 -0
- package/dist/public/assets/_B6UdulKa.js +1 -0
- package/dist/public/assets/{_Bgbe-7aj.js → _BA8HFnO3.js} +1 -1
- package/dist/public/assets/_BA8HFnO3.js.br +0 -0
- package/dist/public/assets/{_B59uDfC7.js → _BAHrOydH.js} +1 -1
- package/dist/public/assets/_BAHrOydH.js.br +0 -0
- package/dist/public/assets/{_DJa--qOX.js → _BBpX-M4b.js} +1 -1
- package/dist/public/assets/_BBpX-M4b.js.br +0 -0
- package/dist/public/assets/{_B8ypf2w7.js → _BCZpExov.js} +1 -1
- package/dist/public/assets/_BCZpExov.js.br +0 -0
- package/dist/public/assets/_BFZHNauV.js +1 -0
- package/dist/public/assets/_BGCK5I_O.js +1 -0
- package/dist/public/assets/_BGCK5I_O.js.br +0 -0
- package/dist/public/assets/_BJRSndB4.js +6 -0
- package/dist/public/assets/_BJRSndB4.js.br +0 -0
- package/dist/public/assets/{_IJOifsPN.js → _BL9QMk_P.js} +1 -1
- package/dist/public/assets/_BL9QMk_P.js.br +0 -0
- package/dist/public/assets/_BLNEzyb5.js +1 -0
- package/dist/public/assets/{_CiZ8pHbe.js → _BLRpf6Uw.js} +1 -1
- package/dist/public/assets/_BLRpf6Uw.js.br +0 -0
- package/dist/public/assets/{_CGLnSBxx.js → _BLTfQLdY.js} +1 -1
- package/dist/public/assets/_BLTfQLdY.js.br +0 -0
- package/dist/public/assets/{_ImG6Q5u4.js → _BO0OB-rz.js} +1 -1
- package/dist/public/assets/_BO0OB-rz.js.br +0 -0
- package/dist/public/assets/{_CW_p-nUL.js → _BPcswKMK.js} +1 -1
- package/dist/public/assets/_BPcswKMK.js.br +0 -0
- package/dist/public/assets/_BPhXWliU.js +1 -0
- package/dist/public/assets/_BQXTv9Cr.js +1 -0
- package/dist/public/assets/{_Cvh-VNIk.js → _BRG_DBcC.js} +1 -1
- package/dist/public/assets/_BRG_DBcC.js.br +0 -0
- package/dist/public/assets/{_DuQRbl1J.js → _BS4crAAm.js} +1 -1
- package/dist/public/assets/_BS4crAAm.js.br +0 -0
- package/dist/public/assets/{_B7FEL7wR.js → _BUH04L5e.js} +1 -1
- package/dist/public/assets/{_DXhRdKW7.js → _BVp6r0fg.js} +1 -1
- package/dist/public/assets/_BVp6r0fg.js.br +0 -0
- package/dist/public/assets/{_udAEKVMs.js → _BXT2bXMi.js} +1 -1
- package/dist/public/assets/_BXT2bXMi.js.br +0 -0
- package/dist/public/assets/{_CIs24vxl.js → _B_zyAtSJ.js} +1 -1
- package/dist/public/assets/_B_zyAtSJ.js.br +0 -0
- package/dist/public/assets/_BaXKdIeb.js +1 -0
- package/dist/public/assets/{_2L-OI8uX.js → _BbiACo0Y.js} +1 -1
- package/dist/public/assets/_BbiACo0Y.js.br +0 -0
- package/dist/public/assets/{_C86ZHeAp.js → _BdvO5Lqa.js} +1 -1
- package/dist/public/assets/_BdvO5Lqa.js.br +0 -0
- package/dist/public/assets/{_7PkH8MR2.js → _BeE9qDu0.js} +1 -1
- package/dist/public/assets/_BeE9qDu0.js.br +0 -0
- package/dist/public/assets/_BewXp5Y_.js +1 -0
- package/dist/public/assets/_BewXp5Y_.js.br +0 -0
- package/dist/public/assets/_BfOOLKo5.js +1 -0
- package/dist/public/assets/_BhS8bTnr.js +1 -0
- package/dist/public/assets/_BhZ3ZoG0.js +1 -0
- package/dist/public/assets/_Bi3_ZsOQ.js +1 -0
- package/dist/public/assets/_Bj_Lfa8B.js +1 -0
- package/dist/public/assets/_BlN_x04q.js +1 -0
- package/dist/public/assets/_Bn5nsnie.js +1 -0
- package/dist/public/assets/_BnOOD6nr.js +15 -0
- package/dist/public/assets/_BnOOD6nr.js.br +0 -0
- package/dist/public/assets/{_DccrUV-t.js → _BnyLUTdO.js} +1 -1
- package/dist/public/assets/_BnyLUTdO.js.br +0 -0
- package/dist/public/assets/_Bp_WT09q.js +1 -0
- package/dist/public/assets/_Bp_WT09q.js.br +0 -0
- package/dist/public/assets/{_CNyZnrbq.js → _BsimXDnm.js} +1 -1
- package/dist/public/assets/_BsimXDnm.js.br +0 -0
- package/dist/public/assets/_BsupnkWM.js +1 -0
- package/dist/public/assets/_BsupnkWM.js.br +0 -0
- package/dist/public/assets/{_BkmyKCts.js → _BxAl0m64.js} +1 -1
- package/dist/public/assets/_BxAl0m64.js.br +0 -0
- package/dist/public/assets/{_l5fDrx0F.js → _C-6dImS5.js} +1 -1
- package/dist/public/assets/_C-6dImS5.js.br +0 -0
- package/dist/public/assets/_C18Torhh.js +1 -0
- package/dist/public/assets/{_DNZFctlv.js → _C1PmcEws.js} +1 -1
- package/dist/public/assets/_C1PmcEws.js.br +0 -0
- package/dist/public/assets/{_C8fTPM4x.js → _C2ZpyiHV.js} +1 -1
- package/dist/public/assets/_C2ZpyiHV.js.br +0 -0
- package/dist/public/assets/_C3P1VHUI.js +1 -0
- package/dist/public/assets/{_CKiOrTnh.js → _C6i9NP5A.js} +1 -1
- package/dist/public/assets/_C6xwTKke.js +1 -0
- package/dist/public/assets/_C6yqlRfl.js +1 -0
- package/dist/public/assets/_C75D8bH2.js +1 -0
- package/dist/public/assets/{_CN5dKT5U.js → _C87NBm9i.js} +1 -1
- package/dist/public/assets/_C87NBm9i.js.br +0 -0
- package/dist/public/assets/_C8Vc_vBH.js +1 -0
- package/dist/public/assets/{_B8QLRTNE.js → _C9OdJcx4.js} +1 -1
- package/dist/public/assets/_C9OdJcx4.js.br +0 -0
- package/dist/public/assets/_C9eoo0sE.js +1 -0
- package/dist/public/assets/_C9qO_dny.js +1 -0
- package/dist/public/assets/_C9qO_dny.js.br +0 -0
- package/dist/public/assets/{_CtrIYddo.js → _CB31bp-W.js} +1 -1
- package/dist/public/assets/_CB31bp-W.js.br +0 -0
- package/dist/public/assets/{_DTRYzVXy.js → _CCCQMLw5.js} +1 -1
- package/dist/public/assets/_CCCQMLw5.js.br +0 -0
- package/dist/public/assets/_CCie36pi.js +1 -0
- package/dist/public/assets/_CDD9N34p.js +1 -0
- package/dist/public/assets/{_DlOIFmP5.js → _CE5MhJWL.js} +1 -1
- package/dist/public/assets/_CE5MhJWL.js.br +0 -0
- package/dist/public/assets/{_IYKAiNbQ.js → _CGLpCj_I.js} +1 -1
- package/dist/public/assets/_CGLpCj_I.js.br +0 -0
- package/dist/public/assets/{_4zMj-KgY.js → _CJ9j8N5Z.js} +1 -1
- package/dist/public/assets/_CJ9j8N5Z.js.br +0 -0
- package/dist/public/assets/{_B7aQVpV3.js → _CLDmR3jR.js} +1 -1
- package/dist/public/assets/_CLDmR3jR.js.br +0 -0
- package/dist/public/assets/{_DMuuYm9C.js → _CLerZOx-.js} +1 -1
- package/dist/public/assets/_CLerZOx-.js.br +0 -0
- package/dist/public/assets/_CM5GtJb2.js +1 -0
- package/dist/public/assets/_COECwOVb.js +1 -0
- package/dist/public/assets/_CSQE9nMN.js +1 -0
- package/dist/public/assets/_CSXMgHLQ.js +1 -0
- package/dist/public/assets/{_DgZrpFgz.js → _CT3clsOQ.js} +1 -1
- package/dist/public/assets/_CVRiByCT.js +1 -0
- package/dist/public/assets/_CVSrm4Pl.js +1 -0
- package/dist/public/assets/{_DLOPvUZY.js → _CX1wufuh.js} +1 -1
- package/dist/public/assets/_CX1wufuh.js.br +0 -0
- package/dist/public/assets/{_CPCx9DM-.js → _CYNAhnRH.js} +117 -117
- package/dist/public/assets/_CYNAhnRH.js.br +0 -0
- package/dist/public/assets/{_CZ62PUna.js → _CZGS4T08.js} +1 -1
- package/dist/public/assets/_CZGS4T08.js.br +0 -0
- package/dist/public/assets/_C_L7l9Mg.js +1 -0
- package/dist/public/assets/_CaMrYy1W.js +1 -0
- package/dist/public/assets/{_CA7oQPMX.js → _CdgAsi3s.js} +1 -1
- package/dist/public/assets/_CdgAsi3s.js.br +0 -0
- package/dist/public/assets/_Ce-E7sJE.js +1 -0
- package/dist/public/assets/_Cg3S760D.js +1 -0
- package/dist/public/assets/{_BDoav0oh.js → _ChpYg41R.js} +1 -1
- package/dist/public/assets/_CicyY7KP.js +1 -0
- package/dist/public/assets/_Ck0YOw_7.js +1 -0
- package/dist/public/assets/_CmHlTZSs.js +1 -0
- package/dist/public/assets/_CnECYh66.js +1 -0
- package/dist/public/assets/{_BA7jNaHU.js → _CnKYioYw.js} +1 -1
- package/dist/public/assets/_CnKYioYw.js.br +0 -0
- package/dist/public/assets/_CnUVvVPd.js +1 -0
- package/dist/public/assets/_CqSgGCGC.js +1 -0
- package/dist/public/assets/{_8jPfRR-S.js → _CttJbiei.js} +1 -1
- package/dist/public/assets/_CttJbiei.js.br +0 -0
- package/dist/public/assets/{_Cx8F-gsJ.js → _CtyJUmXC.js} +1 -1
- package/dist/public/assets/_CtyJUmXC.js.br +0 -0
- package/dist/public/assets/{_DxwuLWwv.js → _Cw_8WbwF.js} +1 -1
- package/dist/public/assets/_Cw_8WbwF.js.br +0 -0
- package/dist/public/assets/{_BZgSH_zH.js → _CwmzEsB4.js} +1 -1
- package/dist/public/assets/_CwmzEsB4.js.br +0 -0
- package/dist/public/assets/_CzETFsJs.js +1 -0
- package/dist/public/assets/_D-S9H-tX.js +1 -0
- package/dist/public/assets/{_C4dOkocS.js → _D-hK5uFn.js} +1 -1
- package/dist/public/assets/_D-hK5uFn.js.br +0 -0
- package/dist/public/assets/_D5fTwHXK.js +1 -0
- package/dist/public/assets/{_5iLDlaH-.js → _D8u1YU9b.js} +1 -1
- package/dist/public/assets/_D8u1YU9b.js.br +0 -0
- package/dist/public/assets/_DAH8evhA.js +1 -0
- package/dist/public/assets/_DAemmoHI.js +1 -0
- package/dist/public/assets/_DEMYxWZf.js +1 -0
- package/dist/public/assets/_DGTQBWy0.js +1 -0
- package/dist/public/assets/_DGTQBWy0.js.br +0 -0
- package/dist/public/assets/_DHhv0pCA.js +1 -0
- package/dist/public/assets/{_LSddbYPg.js → _DI0QHEXB.js} +1 -1
- package/dist/public/assets/_DI0QHEXB.js.br +0 -0
- package/dist/public/assets/{_B4jQnWBQ.js → _DJ3UAR_s.js} +1 -1
- package/dist/public/assets/_DJ3UAR_s.js.br +0 -0
- package/dist/public/assets/_DKu6UxI7.js +1 -0
- package/dist/public/assets/_DNC-9RBN.js +1 -0
- package/dist/public/assets/_DP-Bu7ET.js +1 -0
- package/dist/public/assets/_DYmmPBcq.js +1 -0
- package/dist/public/assets/_Da2Dmt_d.js +1 -0
- package/dist/public/assets/_Da2Dmt_d.js.br +0 -0
- package/dist/public/assets/{_D4Ta82Ad.js → _DaqT6m41.js} +1 -1
- package/dist/public/assets/_DaqT6m41.js.br +0 -0
- package/dist/public/assets/_DbVyutEZ.js +1 -0
- package/dist/public/assets/_DcBvO2Si.js +1 -0
- package/dist/public/assets/{_B0VKtqZ9.js → _DeCJ44Me.js} +1 -1
- package/dist/public/assets/_DeCJ44Me.js.br +0 -0
- package/dist/public/assets/{_CVYE0HUe.js → _DeN4EY8L.js} +1 -1
- package/dist/public/assets/_DeN4EY8L.js.br +0 -0
- package/dist/public/assets/{_DBpSHwsH.js → _DhEdzMUw.js} +1 -1
- package/dist/public/assets/_DhEdzMUw.js.br +0 -0
- package/dist/public/assets/{_DX2UfSkV.js → _DhNuRs-V.js} +1 -1
- package/dist/public/assets/_DhNuRs-V.js.br +0 -0
- package/dist/public/assets/{_BscapHlE.js → _DiqV5bDH.js} +1 -1
- package/dist/public/assets/_DiqV5bDH.js.br +0 -0
- package/dist/public/assets/_Diqt_yCf.js +1 -0
- package/dist/public/assets/{_CT-gn1Q3.js → _DlpTErRA.js} +1 -1
- package/dist/public/assets/_DlpTErRA.js.br +0 -0
- package/dist/public/assets/{_B9H0wf6g.js → _DmDSLxrw.js} +1 -1
- package/dist/public/assets/_DmDSLxrw.js.br +0 -0
- package/dist/public/assets/_DoC0qbSD.js +1 -0
- package/dist/public/assets/{_CBdbNtLm.js → _DoCtdMd2.js} +1 -1
- package/dist/public/assets/_DoCtdMd2.js.br +0 -0
- package/dist/public/assets/_DpqWFkMg.js +1 -0
- package/dist/public/assets/_Dr0Bkgso.js +1 -0
- package/dist/public/assets/_Dt-n9FaQ.js +1 -0
- package/dist/public/assets/_DtOzdwHm.js +1 -0
- package/dist/public/assets/_DtOzdwHm.js.br +0 -0
- package/dist/public/assets/{_CVimy4Le.js → _DuGmU4h0.js} +1 -1
- package/dist/public/assets/_DuGmU4h0.js.br +0 -0
- package/dist/public/assets/{_khh1x77_.js → _DuXOUegE.js} +1 -1
- package/dist/public/assets/_DuXOUegE.js.br +0 -0
- package/dist/public/assets/_DuaocJd1.js +1 -0
- package/dist/public/assets/{_Cdr1LImQ.js → _DuarImb7.js} +1 -1
- package/dist/public/assets/_DuarImb7.js.br +0 -0
- package/dist/public/assets/{_d0O4aA0L.js → _DwcoW-IU.js} +1 -1
- package/dist/public/assets/_DwcoW-IU.js.br +0 -0
- package/dist/public/assets/{_Mrawm4gM.js → _DxVt7Zuk.js} +12 -12
- package/dist/public/assets/_DxVt7Zuk.js.br +0 -0
- package/dist/public/assets/{_D7eFF5Zh.js → _DzrtBP-L.js} +1 -1
- package/dist/public/assets/{_BgvkMEDS.js → _Fzbz4zvE.js} +1 -1
- package/dist/public/assets/_Fzbz4zvE.js.br +0 -0
- package/dist/public/assets/_I5oX-lGP.js +1 -0
- package/dist/public/assets/{_DlpWFr6R.js → _IWMmnVCy.js} +1 -1
- package/dist/public/assets/_IWMmnVCy.js.br +0 -0
- package/dist/public/assets/{_DE_Y-0-h.js → _O70J1Mfv.js} +1 -1
- package/dist/public/assets/_O70J1Mfv.js.br +0 -0
- package/dist/public/assets/_SwbsOoi9.js +1 -0
- package/dist/public/assets/_SwbsOoi9.js.br +0 -0
- package/dist/public/assets/_Yy39CykK.js +1 -0
- package/dist/public/assets/{_BD5g3CBa.js → __Oa255vo.js} +1 -1
- package/dist/public/assets/__Oa255vo.js.br +0 -0
- package/dist/public/assets/_bPze7k1x.js +1 -0
- package/dist/public/assets/_bU1KcT1I.js +1 -0
- package/dist/public/assets/{_CP0AloMu.js → _dr95P55a.js} +1 -1
- package/dist/public/assets/_dr95P55a.js.br +0 -0
- package/dist/public/assets/{_vXrbhKaS.js → _eQK3EZCc.js} +1 -1
- package/dist/public/assets/_eQK3EZCc.js.br +0 -0
- package/dist/public/assets/{_BgPQq_uu.js → _gPFPzzPF.js} +1 -1
- package/dist/public/assets/_gPFPzzPF.js.br +0 -0
- package/dist/public/assets/_hzpOPZUB.js +1 -0
- package/dist/public/assets/{_C1TYaRDe.js → _ifUb4WX7.js} +1 -1
- package/dist/public/assets/_ifUb4WX7.js.br +0 -0
- package/dist/public/assets/_kQ7LiSim.js +1 -0
- package/dist/public/assets/_lOAW1VLM.js +1 -0
- package/dist/public/assets/{_DRTW5fd9.js → _mnBdD4YN.js} +1 -1
- package/dist/public/assets/_mnBdD4YN.js.br +0 -0
- package/dist/public/assets/_odBcV1kc.js +1 -0
- package/dist/public/assets/{_XFhH3dP0.js → _pP1W6w5v.js} +1 -1
- package/dist/public/assets/_pP1W6w5v.js.br +0 -0
- package/dist/public/assets/{_CzvJRV9T.js → _pUYwxsdF.js} +1 -1
- package/dist/public/assets/_pUYwxsdF.js.br +0 -0
- package/dist/public/assets/{_Hd-PFNkS.js → _pvS44-AC.js} +1 -1
- package/dist/public/assets/_pvS44-AC.js.br +0 -0
- package/dist/public/assets/_qJTL2ooe.js +1 -0
- package/dist/public/assets/_qJTL2ooe.js.br +0 -0
- package/dist/public/assets/{_8cXksh59.js → _s5Jez2mu.js} +1 -1
- package/dist/public/assets/_s5Jez2mu.js.br +0 -0
- package/dist/public/assets/{_nIuAA97l.js → _unfL8mz1.js} +1 -1
- package/dist/public/assets/_unfL8mz1.js.br +0 -0
- package/dist/public/assets/_unwtcXFQ.js +1 -0
- package/dist/public/assets/_unwtcXFQ.js.br +0 -0
- package/dist/public/assets/{_DILlGU4L.js → _vKQopDwG.js} +1 -1
- package/dist/public/assets/_vKQopDwG.js.br +0 -0
- package/dist/public/assets/_w1aegGdT.js +1 -0
- package/dist/public/assets/_xdrkfok5.js +1 -0
- package/dist/public/assets/_xdrkfok5.js.br +0 -0
- package/dist/public/assets/_y-lm36fI.js +1 -0
- package/dist/public/assets/{_Q3J62UbV.js → _zKlxcAnQ.js} +1 -1
- package/dist/public/assets/_zKlxcAnQ.js.br +0 -0
- package/dist/public/assets/app-shell-CpPCwWPW.css +1 -0
- package/dist/public/assets/app-shell-CpPCwWPW.css.br +0 -0
- package/dist/public/assets/files-view-BfCdcfXX.js +2 -0
- package/dist/public/assets/files-view-DtI7JE-f.css +1 -0
- package/dist/public/assets/files-view-DtI7JE-f.css.br +0 -0
- package/dist/public/assets/group.css.ts-SeaNz7WZ.css +1 -0
- package/dist/public/assets/group.css.ts-SeaNz7WZ.css.br +0 -0
- package/dist/public/assets/icon-folder-DHVc-REl.css +1 -0
- package/dist/public/assets/icon-folder-DHVc-REl.css.br +0 -0
- package/dist/public/assets/{icon-search-CQX_Oqgo.css → icon-search-DAtjHWFL.css} +1 -1
- package/dist/public/assets/icon-search-DAtjHWFL.css.br +0 -0
- package/dist/public/assets/manage-workspace-6i6Zeai7.css +1 -0
- package/dist/public/assets/manage-workspace-CixeMkdt.js +2 -0
- package/dist/public/assets/{modal-view-BY2E8mw2.css → modal-view-D0qnmuJE.css} +1 -1
- package/dist/public/assets/modal-view-D0qnmuJE.css.br +0 -0
- package/dist/public/assets/new-DxhaKmbF.js +1 -0
- package/dist/public/assets/new-workspace-BXjDRbqF.css +1 -0
- package/dist/public/assets/new-workspace-BXjDRbqF.css.br +0 -0
- package/dist/public/assets/new-workspace-DG693v2S.js +2 -0
- package/dist/public/assets/port-chip-Lz3mVJWb.css +1 -0
- package/dist/public/assets/{port-chip-9ONt0A-X.css.br → port-chip-Lz3mVJWb.css.br} +0 -0
- package/dist/public/assets/prompt-dialog-vhnae1-x.css +1 -0
- package/dist/public/assets/prompt-dialog-vhnae1-x.css.br +0 -0
- package/dist/public/assets/quick-open-DVqzk3-g.css +1 -0
- package/dist/public/assets/quick-open-DVqzk3-g.css.br +0 -0
- package/dist/public/assets/repo-picker-K5RYsEge.css +1 -0
- package/dist/public/assets/repo-picker-K5RYsEge.css.br +0 -0
- package/dist/public/assets/review-view-DqMrB4Ny.css +1 -0
- package/dist/public/assets/review-view-DqMrB4Ny.css.br +0 -0
- package/dist/public/assets/review-view-TdLbCgEg.js +2 -0
- package/dist/public/assets/section-2MyJSq5D.css +1 -0
- package/dist/public/assets/section-2MyJSq5D.css.br +0 -0
- package/dist/public/assets/settings-DxhaKmbF.js +1 -0
- package/dist/public/assets/settings-page-BBAG94Vh.js +2 -0
- package/dist/public/assets/settings-page-DUefc32x.css +1 -0
- package/dist/public/assets/settings-page-DUefc32x.css.br +0 -0
- package/dist/public/assets/skill-row-BeOk8NK8.css +1 -0
- package/dist/public/assets/sso-auth-CU3fGJ4U.css +1 -0
- package/dist/public/assets/sso-auth-CU3fGJ4U.css.br +0 -0
- package/dist/public/assets/w-DxhaKmbF.js +1 -0
- package/dist/public/assets/w._-C6JVdFgi.js +1 -0
- package/dist/public/assets/w._-DxhaKmbF.js +1 -0
- package/dist/public/assets/w._-rfvcDGPk.js +1 -0
- package/install.sh +1 -1
- package/lib/setup/catalog.d.mts +13 -0
- package/lib/setup/catalog.mjs +107 -14
- package/lib/setup/doctor.d.mts +1 -0
- package/lib/setup/doctor.mjs +5 -4
- package/lib/share/manifest.mjs +1 -1
- package/package.json +3 -3
- package/scripts/migrate.mjs +119 -261
- package/dist/_BkCP7ACo.js +0 -2
- package/dist/public/assets/_0EfQU-nm.js +0 -1
- package/dist/public/assets/_2L-OI8uX.js.br +0 -0
- package/dist/public/assets/_3dcgIhy4.js +0 -1
- package/dist/public/assets/_4lkLC-N6.js +0 -1
- package/dist/public/assets/_4lkLC-N6.js.br +0 -0
- package/dist/public/assets/_4zMj-KgY.js.br +0 -0
- package/dist/public/assets/_5iLDlaH-.js.br +0 -0
- package/dist/public/assets/_7PkH8MR2.js.br +0 -0
- package/dist/public/assets/_7pZFw9YH.js +0 -1
- package/dist/public/assets/_81trVXGv.js +0 -1
- package/dist/public/assets/_81trVXGv.js.br +0 -0
- package/dist/public/assets/_8cXksh59.js.br +0 -0
- package/dist/public/assets/_8jPfRR-S.js.br +0 -0
- package/dist/public/assets/_B-VEZaw2.js +0 -1
- package/dist/public/assets/_B0VKtqZ9.js.br +0 -0
- package/dist/public/assets/_B1n6UKwc.js +0 -1
- package/dist/public/assets/_B4jQnWBQ.js.br +0 -0
- package/dist/public/assets/_B59uDfC7.js.br +0 -0
- package/dist/public/assets/_B7aQVpV3.js.br +0 -0
- package/dist/public/assets/_B8QLRTNE.js.br +0 -0
- package/dist/public/assets/_B8ypf2w7.js.br +0 -0
- package/dist/public/assets/_B9H0wf6g.js.br +0 -0
- package/dist/public/assets/_BA7jNaHU.js.br +0 -0
- package/dist/public/assets/_BATBuapN.js +0 -1
- package/dist/public/assets/_BC-o0Ofo.js +0 -1
- package/dist/public/assets/_BD5g3CBa.js.br +0 -0
- package/dist/public/assets/_BGKOdZ60.js +0 -1
- package/dist/public/assets/_BGKOdZ60.js.br +0 -0
- package/dist/public/assets/_BI7rb-iV.js +0 -1
- package/dist/public/assets/_BNxiob9l.js +0 -1
- package/dist/public/assets/_BOIo-Rws.js +0 -1
- package/dist/public/assets/_BP-cH3Ls.js +0 -1
- package/dist/public/assets/_BP4aeWpk.js +0 -1
- package/dist/public/assets/_BQ_wB80D.js +0 -1
- package/dist/public/assets/_BSR1BCIl.js +0 -15
- package/dist/public/assets/_BSR1BCIl.js.br +0 -0
- package/dist/public/assets/_BUVzSij7.js +0 -1
- package/dist/public/assets/_BV5hAHrd.js +0 -1
- package/dist/public/assets/_BZgSH_zH.js.br +0 -0
- package/dist/public/assets/_BbdX33R5.js +0 -1
- package/dist/public/assets/_BbjPIfv2.js +0 -1
- package/dist/public/assets/_BebbIngd.js +0 -2
- package/dist/public/assets/_BebbIngd.js.br +0 -0
- package/dist/public/assets/_BfUMBq7F.js +0 -1
- package/dist/public/assets/_BgPQq_uu.js.br +0 -0
- package/dist/public/assets/_Bgbe-7aj.js.br +0 -0
- package/dist/public/assets/_BgvkMEDS.js.br +0 -0
- package/dist/public/assets/_BklmY-WW.js +0 -1
- package/dist/public/assets/_BkmyKCts.js.br +0 -0
- package/dist/public/assets/_BnKAavAk.js +0 -1
- package/dist/public/assets/_BotvnYbJ.js +0 -1
- package/dist/public/assets/_BotvnYbJ.js.br +0 -0
- package/dist/public/assets/_BscapHlE.js.br +0 -0
- package/dist/public/assets/_Bt4fKX2z.js +0 -1
- package/dist/public/assets/_BvcmHt9j.js +0 -1
- package/dist/public/assets/_C1TYaRDe.js.br +0 -0
- package/dist/public/assets/_C45o01H4.js +0 -1
- package/dist/public/assets/_C4dOkocS.js.br +0 -0
- package/dist/public/assets/_C7rA9hcV.js +0 -1
- package/dist/public/assets/_C86ZHeAp.js.br +0 -0
- package/dist/public/assets/_C8fTPM4x.js.br +0 -0
- package/dist/public/assets/_CA7oQPMX.js.br +0 -0
- package/dist/public/assets/_CAMTVZ5S.js +0 -1
- package/dist/public/assets/_CAMTVZ5S.js.br +0 -0
- package/dist/public/assets/_CBdbNtLm.js.br +0 -0
- package/dist/public/assets/_CENgKlig.js +0 -1
- package/dist/public/assets/_CGLnSBxx.js.br +0 -0
- package/dist/public/assets/_CIAIGE-e.js +0 -1
- package/dist/public/assets/_CIs24vxl.js.br +0 -0
- package/dist/public/assets/_CJ2EZdoV.js +0 -1
- package/dist/public/assets/_CJlqVV8j.js +0 -6
- package/dist/public/assets/_CJlqVV8j.js.br +0 -0
- package/dist/public/assets/_CKIVOffF.js +0 -1
- package/dist/public/assets/_CLdKQrZk.js +0 -1
- package/dist/public/assets/_CN5dKT5U.js.br +0 -0
- package/dist/public/assets/_CNyZnrbq.js.br +0 -0
- package/dist/public/assets/_CP0AloMu.js.br +0 -0
- package/dist/public/assets/_CPCx9DM-.js.br +0 -0
- package/dist/public/assets/_CPz2zCZW.js +0 -1
- package/dist/public/assets/_CT-gn1Q3.js.br +0 -0
- package/dist/public/assets/_CTbiX1kY.js +0 -1
- package/dist/public/assets/_CVYE0HUe.js.br +0 -0
- package/dist/public/assets/_CVimy4Le.js.br +0 -0
- package/dist/public/assets/_CW_p-nUL.js.br +0 -0
- package/dist/public/assets/_CZ62PUna.js.br +0 -0
- package/dist/public/assets/_CcCzrg9K.js +0 -1
- package/dist/public/assets/_Cdr1LImQ.js.br +0 -0
- package/dist/public/assets/_CgXIOrOV.js +0 -1
- package/dist/public/assets/_Ci01sxM0.js +0 -1
- package/dist/public/assets/_CiZ8pHbe.js.br +0 -0
- package/dist/public/assets/_CpIC1zJN.js +0 -1
- package/dist/public/assets/_CpSmZ2fW.js +0 -1
- package/dist/public/assets/_CpzhHQ3e.js +0 -1
- package/dist/public/assets/_CrThDEqs.js +0 -1
- package/dist/public/assets/_CrThDEqs.js.br +0 -0
- package/dist/public/assets/_CrzUyUH2.js +0 -1
- package/dist/public/assets/_Csdgg-p8.js +0 -1
- package/dist/public/assets/_Csdgg-p8.js.br +0 -0
- package/dist/public/assets/_CtWH28kh.js +0 -1
- package/dist/public/assets/_Cto7UR6x.js.br +0 -0
- package/dist/public/assets/_CtrIYddo.js.br +0 -0
- package/dist/public/assets/_CvDzPXmv.js +0 -1
- package/dist/public/assets/_Cvh-VNIk.js.br +0 -0
- package/dist/public/assets/_Cx8F-gsJ.js.br +0 -0
- package/dist/public/assets/_CxbcobyM.js +0 -1
- package/dist/public/assets/_Cy7hJYIs.js +0 -1
- package/dist/public/assets/_CzvJRV9T.js.br +0 -0
- package/dist/public/assets/_D-902IrK.js +0 -1
- package/dist/public/assets/_D-902IrK.js.br +0 -0
- package/dist/public/assets/_D1Bmsn3j.js +0 -1
- package/dist/public/assets/_D4Ta82Ad.js.br +0 -0
- package/dist/public/assets/_D8EMVgMd.js +0 -1
- package/dist/public/assets/_DBpSHwsH.js.br +0 -0
- package/dist/public/assets/_DDwytJDF.js +0 -1
- package/dist/public/assets/_DDwytJDF.js.br +0 -0
- package/dist/public/assets/_DE_Y-0-h.js.br +0 -0
- package/dist/public/assets/_DHw-LiNs.js +0 -1
- package/dist/public/assets/_DILlGU4L.js.br +0 -0
- package/dist/public/assets/_DJa--qOX.js.br +0 -0
- package/dist/public/assets/_DKmUkNb1.js +0 -1
- package/dist/public/assets/_DKuBKDhM.js +0 -1
- package/dist/public/assets/_DLOPvUZY.js.br +0 -0
- package/dist/public/assets/_DMBjdP4M.js +0 -1
- package/dist/public/assets/_DMgMXzil.js +0 -1
- package/dist/public/assets/_DMuuYm9C.js.br +0 -0
- package/dist/public/assets/_DNZFctlv.js.br +0 -0
- package/dist/public/assets/_DPq7Yp4u.js +0 -1
- package/dist/public/assets/_DRTW5fd9.js.br +0 -0
- package/dist/public/assets/_DRx0cYWy.js +0 -1
- package/dist/public/assets/_DSqeeGaZ.js +0 -1
- package/dist/public/assets/_DTRYzVXy.js.br +0 -0
- package/dist/public/assets/_DTebU1L2.js +0 -1
- package/dist/public/assets/_DWO9qYdD.js +0 -1
- package/dist/public/assets/_DWnXmngO.js +0 -1
- package/dist/public/assets/_DX2UfSkV.js.br +0 -0
- package/dist/public/assets/_DXhRdKW7.js.br +0 -0
- package/dist/public/assets/_D_JNOhlM.js +0 -1
- package/dist/public/assets/_Dc1Lc51O.js +0 -1
- package/dist/public/assets/_Dc1Lc51O.js.br +0 -0
- package/dist/public/assets/_DccrUV-t.js.br +0 -0
- package/dist/public/assets/_DfMtdFhk.js +0 -1
- package/dist/public/assets/_DlOIFmP5.js.br +0 -0
- package/dist/public/assets/_DlpWFr6R.js.br +0 -0
- package/dist/public/assets/_DmzK_VpH.js +0 -1
- package/dist/public/assets/_Dn-53uYD.js +0 -1
- package/dist/public/assets/_Dprfg2XO.js +0 -1
- package/dist/public/assets/_DqSs-qWW.js +0 -1
- package/dist/public/assets/_Dt47AQIi.js +0 -1
- package/dist/public/assets/_DtVh1tC2.js +0 -1
- package/dist/public/assets/_DuBYI8Df.js +0 -1
- package/dist/public/assets/_DuQRbl1J.js.br +0 -0
- package/dist/public/assets/_DxwuLWwv.js.br +0 -0
- package/dist/public/assets/_Dy4AHyMD.js +0 -1
- package/dist/public/assets/_DzCAv2Gl.js.br +0 -0
- package/dist/public/assets/_Hd-PFNkS.js.br +0 -0
- package/dist/public/assets/_IJOifsPN.js.br +0 -0
- package/dist/public/assets/_IYKAiNbQ.js.br +0 -0
- package/dist/public/assets/_ImG6Q5u4.js.br +0 -0
- package/dist/public/assets/_K_yqvP79.js +0 -1
- package/dist/public/assets/_K_yqvP79.js.br +0 -0
- package/dist/public/assets/_LSddbYPg.js.br +0 -0
- package/dist/public/assets/_Mrawm4gM.js.br +0 -0
- package/dist/public/assets/_N6UM3iEC.js +0 -1
- package/dist/public/assets/_OCdp7nNx.js +0 -1
- package/dist/public/assets/_OCdp7nNx.js.br +0 -0
- package/dist/public/assets/_P4Q76273.js +0 -1
- package/dist/public/assets/_Q3J62UbV.js.br +0 -0
- package/dist/public/assets/_V7boHS_a.js +0 -1
- package/dist/public/assets/_V7boHS_a.js.br +0 -0
- package/dist/public/assets/_VUoWEzVN.js +0 -1
- package/dist/public/assets/_XFhH3dP0.js.br +0 -0
- package/dist/public/assets/_aD-zCciQ.js +0 -1
- package/dist/public/assets/_d0O4aA0L.js.br +0 -0
- package/dist/public/assets/_dVPo9v4u.js +0 -1
- package/dist/public/assets/_egwsGA2z.js +0 -1
- package/dist/public/assets/_hIGDKE3G.js +0 -1
- package/dist/public/assets/_khh1x77_.js.br +0 -0
- package/dist/public/assets/_l5fDrx0F.js.br +0 -0
- package/dist/public/assets/_nIuAA97l.js.br +0 -0
- package/dist/public/assets/_udAEKVMs.js.br +0 -0
- package/dist/public/assets/_vXrbhKaS.js.br +0 -0
- package/dist/public/assets/app-shell-B0OO79vS.css +0 -1
- package/dist/public/assets/app-shell-B0OO79vS.css.br +0 -0
- package/dist/public/assets/files-view-8U0RvfCW.css +0 -1
- package/dist/public/assets/files-view-8U0RvfCW.css.br +0 -0
- package/dist/public/assets/files-view-Cen1Ehm2.js +0 -2
- package/dist/public/assets/group.css.ts-BXYS6DEA.css +0 -1
- package/dist/public/assets/group.css.ts-BXYS6DEA.css.br +0 -0
- package/dist/public/assets/icon-folder-BfrS749u.css +0 -1
- package/dist/public/assets/icon-folder-BfrS749u.css.br +0 -0
- package/dist/public/assets/icon-search-CQX_Oqgo.css.br +0 -0
- package/dist/public/assets/manage-workspace-CCJ4ta9y.js +0 -2
- package/dist/public/assets/manage-workspace-D_Q7iFJx.css +0 -1
- package/dist/public/assets/modal-view-BY2E8mw2.css.br +0 -0
- package/dist/public/assets/new-B_V1ilQW.js +0 -1
- package/dist/public/assets/new-workspace-DbYcKEc1.js +0 -2
- package/dist/public/assets/new-workspace-DxkmgnmD.css +0 -1
- package/dist/public/assets/new-workspace-DxkmgnmD.css.br +0 -0
- package/dist/public/assets/port-chip-9ONt0A-X.css +0 -1
- package/dist/public/assets/prompt-dialog-FlNGIEVH.css +0 -1
- package/dist/public/assets/prompt-dialog-FlNGIEVH.css.br +0 -0
- package/dist/public/assets/quick-open-DGZd2O_C.css +0 -1
- package/dist/public/assets/quick-open-DGZd2O_C.css.br +0 -0
- package/dist/public/assets/repo-picker-cm3fnbTq.css +0 -1
- package/dist/public/assets/repo-picker-cm3fnbTq.css.br +0 -3
- package/dist/public/assets/review-view-B2Nz9ybY.js +0 -2
- package/dist/public/assets/review-view-CcATNzWo.css +0 -1
- package/dist/public/assets/review-view-CcATNzWo.css.br +0 -0
- package/dist/public/assets/section-CzWFTcJC.css +0 -1
- package/dist/public/assets/section-CzWFTcJC.css.br +0 -0
- package/dist/public/assets/settings-B_V1ilQW.js +0 -1
- package/dist/public/assets/settings-page-CMLmEhnN.js +0 -2
- package/dist/public/assets/settings-page-DUX8B1oE.css +0 -1
- package/dist/public/assets/settings-page-DUX8B1oE.css.br +0 -0
- package/dist/public/assets/skill-row-DqAUuSBd.css +0 -1
- package/dist/public/assets/sso-auth-B6eZLZCG.css +0 -1
- package/dist/public/assets/sso-auth-B6eZLZCG.css.br +0 -0
- package/dist/public/assets/w-B_V1ilQW.js +0 -1
- package/dist/public/assets/w._-B0e-KW5y.js +0 -1
- package/dist/public/assets/w._-B_V1ilQW.js +0 -1
- package/dist/public/assets/w._-DQBTonBF.js +0 -1
|
@@ -4,11 +4,22 @@ import { t as require_safe_buffer } from "./_BmSjjJ2E.js";
|
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { execFile, execFileSync } from "node:child_process";
|
|
7
|
+
import fs$1 from "node:fs/promises";
|
|
7
8
|
import os from "node:os";
|
|
8
9
|
import { promisify } from "node:util";
|
|
9
10
|
import { DatabaseSync } from "node:sqlite";
|
|
10
11
|
import { createHash } from "node:crypto";
|
|
11
12
|
//#region src/server/http.ts
|
|
13
|
+
/** Who may frame the app's own responses: the app alone (the review's PDF
|
|
14
|
+
* preview). A page elsewhere that frames it can dress a click on it as a
|
|
15
|
+
* click on something of its own. A route that sends a
|
|
16
|
+
* Content-Security-Policy of its own replaces this one, so it names
|
|
17
|
+
* `FRAME_ANCESTORS` too. */
|
|
18
|
+
var FRAME_ANCESTORS = "frame-ancestors 'self'";
|
|
19
|
+
var FRAME_HEADERS = {
|
|
20
|
+
"content-security-policy": FRAME_ANCESTORS,
|
|
21
|
+
"x-frame-options": "SAMEORIGIN"
|
|
22
|
+
};
|
|
12
23
|
/** Error whose `status` the API error-boundary middleware uses for the response. */
|
|
13
24
|
function httpError(status, message) {
|
|
14
25
|
return Object.assign(new Error(message), { status });
|
|
@@ -25,6 +36,96 @@ async function readBody(ctx) {
|
|
|
25
36
|
return checked(await ctx.body, "request body");
|
|
26
37
|
}
|
|
27
38
|
//#endregion
|
|
39
|
+
//#region src/server/cache.ts
|
|
40
|
+
/** Keyed stale-while-revalidate cache: a cached value is served immediately
|
|
41
|
+
* (revalidating in the background when older than `ttlMs`); loads are deduped
|
|
42
|
+
* per key, and `refresh` bypasses both the cache and any in-flight load. */
|
|
43
|
+
function swr(ttlMs, load, seed) {
|
|
44
|
+
const cache = /* @__PURE__ */ new Map();
|
|
45
|
+
const inflight = /* @__PURE__ */ new Map();
|
|
46
|
+
function start(key, refresh) {
|
|
47
|
+
const startedAt = Date.now();
|
|
48
|
+
const promise = load(key, refresh).then((value) => {
|
|
49
|
+
const existing = cache.get(key);
|
|
50
|
+
if (!existing || existing.at <= startedAt) cache.set(key, {
|
|
51
|
+
at: Date.now(),
|
|
52
|
+
value
|
|
53
|
+
});
|
|
54
|
+
return value;
|
|
55
|
+
}).finally(() => {
|
|
56
|
+
if (inflight.get(key)?.promise === promise) inflight.delete(key);
|
|
57
|
+
});
|
|
58
|
+
inflight.set(key, {
|
|
59
|
+
promise,
|
|
60
|
+
refresh
|
|
61
|
+
});
|
|
62
|
+
return promise;
|
|
63
|
+
}
|
|
64
|
+
const read = (key, refresh = false) => {
|
|
65
|
+
if (refresh) {
|
|
66
|
+
const current = inflight.get(key);
|
|
67
|
+
return current?.refresh ? current.promise : start(key, true);
|
|
68
|
+
}
|
|
69
|
+
let cached = cache.get(key);
|
|
70
|
+
if (!cached && seed) {
|
|
71
|
+
cached = seed(key);
|
|
72
|
+
if (cached) cache.set(key, cached);
|
|
73
|
+
}
|
|
74
|
+
if (cached) {
|
|
75
|
+
if (Date.now() - cached.at >= ttlMs && !inflight.has(key)) start(key, false).catch(() => {});
|
|
76
|
+
return Promise.resolve(cached.value);
|
|
77
|
+
}
|
|
78
|
+
return inflight.get(key)?.promise ?? start(key, false);
|
|
79
|
+
};
|
|
80
|
+
/** Inject an externally fetched value (e.g. from a batched load). */
|
|
81
|
+
read.set = (key, value) => {
|
|
82
|
+
cache.set(key, {
|
|
83
|
+
at: Date.now(),
|
|
84
|
+
value
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
/** Current cached value, if any — used when a batch update must merge
|
|
88
|
+
* with a richer per-key load rather than replace it. */
|
|
89
|
+
read.get = (key) => cache.get(key)?.value;
|
|
90
|
+
return read;
|
|
91
|
+
}
|
|
92
|
+
/** Serialize async work per key: calls for one key run in submission order,
|
|
93
|
+
* each starting only after the previous settled. The stored tail is the
|
|
94
|
+
* all-settled form, so a rejection neither blocks the next caller nor leaves
|
|
95
|
+
* the entry behind — the map holds only keys with work still in flight. */
|
|
96
|
+
var locks = /* @__PURE__ */ new Map();
|
|
97
|
+
function withLock(key, fn) {
|
|
98
|
+
const run = (locks.get(key) ?? Promise.resolve()).then(fn);
|
|
99
|
+
const tail = run.then(() => {}, () => {});
|
|
100
|
+
locks.set(key, tail);
|
|
101
|
+
tail.then(() => {
|
|
102
|
+
if (locks.get(key) === tail) locks.delete(key);
|
|
103
|
+
});
|
|
104
|
+
return run;
|
|
105
|
+
}
|
|
106
|
+
/** One load at a time, and a short reuse window: callers join the in-flight
|
|
107
|
+
* load, and a result younger than `ttlMs` is served without one. For an
|
|
108
|
+
* expensive process sweep (lsof, ps, list-panes) whose answer does not
|
|
109
|
+
* change within the window — `ttlMs` of 0 still collapses concurrent
|
|
110
|
+
* callers onto a single spawn. */
|
|
111
|
+
function shared(fn, ttlMs) {
|
|
112
|
+
let inflight = null;
|
|
113
|
+
let last = null;
|
|
114
|
+
return () => {
|
|
115
|
+
if (last && Date.now() - last.at < ttlMs) return Promise.resolve(last.value);
|
|
116
|
+
if (!inflight) inflight = fn().then((value) => {
|
|
117
|
+
last = {
|
|
118
|
+
at: Date.now(),
|
|
119
|
+
value
|
|
120
|
+
};
|
|
121
|
+
return value;
|
|
122
|
+
}).finally(() => {
|
|
123
|
+
inflight = null;
|
|
124
|
+
});
|
|
125
|
+
return inflight;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
28
129
|
//#region lib/setup/listen.mjs
|
|
29
130
|
/** Addresses that mean every interface. */
|
|
30
131
|
var EVERY = /* @__PURE__ */ new Set([
|
|
@@ -66,8 +167,9 @@ var config = {
|
|
|
66
167
|
appPort: Number(process.env.WORK_APP_PORT || 7171),
|
|
67
168
|
/** How a workspace port is named in a hostname the app proxies
|
|
68
169
|
* (server/port-proxy.ts): `sub` is `3000.work.example.com`, `dash` is
|
|
69
|
-
* `3000-work.example.com`. The
|
|
70
|
-
*
|
|
170
|
+
* `3000-work.example.com`. The port chips link to this one; the server
|
|
171
|
+
* takes `sub` either way, and `dash` only when it is picked
|
|
172
|
+
* (server/access.ts `dashPortName`). `dash` stays one label under the
|
|
71
173
|
* zone, which is what a free Cloudflare certificate covers. */
|
|
72
174
|
portHosts: process.env.WORK_PORT_HOSTS === "dash" ? "dash" : "sub",
|
|
73
175
|
/** The address the server listens on: this machine only, unless set
|
|
@@ -92,6 +194,11 @@ function list(value) {
|
|
|
92
194
|
return (value || "").split(",").map((s) => s.trim()).filter(Boolean);
|
|
93
195
|
}
|
|
94
196
|
fs.mkdirSync(config.dataDir, { recursive: true });
|
|
197
|
+
try {
|
|
198
|
+
fs.chmodSync(config.dataDir, 448);
|
|
199
|
+
} catch (err) {
|
|
200
|
+
console.warn(`[work] could not make ${config.dataDir} private: ${err.message}`);
|
|
201
|
+
}
|
|
95
202
|
//#endregion
|
|
96
203
|
//#region src/server/exec.ts
|
|
97
204
|
/** Dedicated tmux server so we never touch another multiplexer's or the
|
|
@@ -131,21 +238,25 @@ var GIT_NETWORK_MS = {
|
|
|
131
238
|
push: 3e5,
|
|
132
239
|
"ls-remote": 6e4
|
|
133
240
|
};
|
|
134
|
-
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
241
|
+
/** What every git process work starts runs with, `extra` on top: `git`
|
|
242
|
+
* below, and the diff's streaming reads, which spawn their own. Never let
|
|
243
|
+
* git wait on a terminal it doesn't have — a missing credential fails with
|
|
244
|
+
* a message instead of hanging the clone forever. Optional locks are off
|
|
245
|
+
* because most of what runs here is a background probe (the review's
|
|
246
|
+
* stamp poll, Files, the language servers' change feed): a `git status`
|
|
247
|
+
* refreshing the index holds `index.lock`, and an agent's `git commit` or
|
|
248
|
+
* rebase step landing in that moment fails on it. */
|
|
249
|
+
var gitEnv = (extra) => ({
|
|
250
|
+
...process.env,
|
|
251
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
252
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
253
|
+
...extra
|
|
254
|
+
});
|
|
140
255
|
var git = async (args, cwd) => {
|
|
141
256
|
const verb = args.find((a) => !a.startsWith("-")) ?? "";
|
|
142
257
|
const timeoutMs = GIT_NETWORK_MS[verb];
|
|
143
258
|
try {
|
|
144
|
-
return await run$1("git", args, cwd, {
|
|
145
|
-
...process.env,
|
|
146
|
-
GIT_TERMINAL_PROMPT: "0",
|
|
147
|
-
GIT_OPTIONAL_LOCKS: "0"
|
|
148
|
-
}, timeoutMs ? { timeoutMs } : void 0);
|
|
259
|
+
return await run$1("git", args, cwd, gitEnv(), timeoutMs ? { timeoutMs } : void 0);
|
|
149
260
|
} catch (err) {
|
|
150
261
|
if (timeoutMs && err.killed) throw new Error(`git ${verb} timed out after ${Math.round(timeoutMs / 1e3)}s`);
|
|
151
262
|
throw err;
|
|
@@ -229,6 +340,7 @@ function get(sql, ...params) {
|
|
|
229
340
|
function workspacePath(id) {
|
|
230
341
|
return get("SELECT path FROM workspaces WHERE id = ?", id)?.path;
|
|
231
342
|
}
|
|
343
|
+
var fresh = !db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table'").get();
|
|
232
344
|
var freshReview = !db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get();
|
|
233
345
|
db.exec(`
|
|
234
346
|
PRAGMA journal_mode = WAL;
|
|
@@ -290,8 +402,7 @@ db.exec(`
|
|
|
290
402
|
);
|
|
291
403
|
|
|
292
404
|
-- Viewed marks (server/viewed.ts): a file of a branch, and its change
|
|
293
|
-
-- as it was when marked.
|
|
294
|
-
-- creates it too.
|
|
405
|
+
-- as it was when marked.
|
|
295
406
|
CREATE TABLE IF NOT EXISTS review_marks (
|
|
296
407
|
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
297
408
|
worktree TEXT NOT NULL,
|
|
@@ -313,6 +424,7 @@ ensureColumn("review_comments", "snippet", "TEXT");
|
|
|
313
424
|
ensureColumn("workspaces", "materialized", "INTEGER NOT NULL DEFAULT 1");
|
|
314
425
|
ensureColumn("workspaces", "origin_branch", "TEXT");
|
|
315
426
|
ensureColumn("workspaces", "imported_at", "TEXT");
|
|
427
|
+
if (fresh) db.exec("PRAGMA user_version = 1");
|
|
316
428
|
//#endregion
|
|
317
429
|
//#region src/client/pref-change.ts
|
|
318
430
|
/** The stored text after `change`, or null when nothing is left. A value
|
|
@@ -476,10 +588,13 @@ var agents_default = [
|
|
|
476
588
|
];
|
|
477
589
|
//#endregion
|
|
478
590
|
//#region lib/setup/catalog.mjs
|
|
479
|
-
/** Machine tools. `required` ones gate readiness; the rest are
|
|
480
|
-
*
|
|
481
|
-
*
|
|
482
|
-
*
|
|
591
|
+
/** Machine tools. `required` ones gate readiness; the rest are what agents
|
|
592
|
+
* reach for on any project, and what work's own features run on — measured
|
|
593
|
+
* over agents' shell commands, `rg` is a fifth of Codex's (Claude Code
|
|
594
|
+
* bundles its own) and `jq` common to both, where the terminal niceties
|
|
595
|
+
* once listed here (fd, delta, fzf, bottom, hyperfine, ast-grep) went all
|
|
596
|
+
* but unused. `work setup` installs every one. Static binaries via mise,
|
|
597
|
+
* except the system packages the installer provides (git, tmux). */
|
|
483
598
|
var TOOLS = [
|
|
484
599
|
{
|
|
485
600
|
id: "git",
|
|
@@ -521,12 +636,6 @@ var TOOLS = [
|
|
|
521
636
|
bin: "rg",
|
|
522
637
|
mise: "ripgrep"
|
|
523
638
|
},
|
|
524
|
-
{
|
|
525
|
-
id: "fd",
|
|
526
|
-
label: "fd",
|
|
527
|
-
bin: "fd",
|
|
528
|
-
mise: "fd"
|
|
529
|
-
},
|
|
530
639
|
{
|
|
531
640
|
id: "jq",
|
|
532
641
|
label: "jq",
|
|
@@ -534,46 +643,104 @@ var TOOLS = [
|
|
|
534
643
|
mise: "jq"
|
|
535
644
|
},
|
|
536
645
|
{
|
|
537
|
-
id: "
|
|
538
|
-
label: "
|
|
539
|
-
bin: "
|
|
540
|
-
mise: "
|
|
646
|
+
id: "skills",
|
|
647
|
+
label: "skills CLI",
|
|
648
|
+
bin: "skills",
|
|
649
|
+
mise: "npm:skills"
|
|
650
|
+
}
|
|
651
|
+
];
|
|
652
|
+
/** A project's own tools: recommended only where a workspace's repo says it
|
|
653
|
+
* uses one — a file at its root (`files`), or package.json's
|
|
654
|
+
* `packageManager` naming it — and never installed by `work setup`, which
|
|
655
|
+
* cannot know the projects (Settings offers them, as Languages offers a
|
|
656
|
+
* language's server). A tool every project of a kind needs, not one that
|
|
657
|
+
* project happens to use: the rest belong to the repo's own `mise.toml`. */
|
|
658
|
+
var PROJECT_TOOLS = [
|
|
659
|
+
{
|
|
660
|
+
id: "pnpm",
|
|
661
|
+
label: "pnpm",
|
|
662
|
+
bin: "pnpm",
|
|
663
|
+
mise: "pnpm",
|
|
664
|
+
files: ["pnpm-lock.yaml", "pnpm-workspace.yaml"],
|
|
665
|
+
packageManager: "pnpm"
|
|
541
666
|
},
|
|
542
667
|
{
|
|
543
|
-
id: "
|
|
544
|
-
label: "
|
|
545
|
-
bin: "
|
|
546
|
-
mise: "
|
|
668
|
+
id: "yarn",
|
|
669
|
+
label: "Yarn",
|
|
670
|
+
bin: "yarn",
|
|
671
|
+
mise: "yarn",
|
|
672
|
+
files: ["yarn.lock", ".yarnrc.yml"],
|
|
673
|
+
packageManager: "yarn"
|
|
547
674
|
},
|
|
548
675
|
{
|
|
549
|
-
id: "
|
|
550
|
-
label: "
|
|
551
|
-
bin: "
|
|
552
|
-
mise: "
|
|
676
|
+
id: "bun",
|
|
677
|
+
label: "Bun",
|
|
678
|
+
bin: "bun",
|
|
679
|
+
mise: "bun",
|
|
680
|
+
files: [
|
|
681
|
+
"bun.lock",
|
|
682
|
+
"bun.lockb",
|
|
683
|
+
"bunfig.toml"
|
|
684
|
+
],
|
|
685
|
+
packageManager: "bun"
|
|
553
686
|
},
|
|
554
687
|
{
|
|
555
|
-
id: "
|
|
556
|
-
label: "
|
|
557
|
-
bin: "
|
|
558
|
-
mise: "
|
|
688
|
+
id: "deno",
|
|
689
|
+
label: "Deno",
|
|
690
|
+
bin: "deno",
|
|
691
|
+
mise: "deno",
|
|
692
|
+
files: [
|
|
693
|
+
"deno.json",
|
|
694
|
+
"deno.jsonc",
|
|
695
|
+
"deno.lock"
|
|
696
|
+
]
|
|
559
697
|
},
|
|
560
698
|
{
|
|
561
|
-
id: "
|
|
562
|
-
label: "
|
|
563
|
-
bin: "
|
|
564
|
-
mise: "
|
|
699
|
+
id: "uv",
|
|
700
|
+
label: "uv",
|
|
701
|
+
bin: "uv",
|
|
702
|
+
mise: "uv",
|
|
703
|
+
files: [
|
|
704
|
+
"uv.lock",
|
|
705
|
+
"pyproject.toml",
|
|
706
|
+
"requirements.txt"
|
|
707
|
+
]
|
|
565
708
|
},
|
|
566
709
|
{
|
|
567
|
-
id: "
|
|
568
|
-
label: "
|
|
569
|
-
bin: "
|
|
570
|
-
mise: "
|
|
710
|
+
id: "go",
|
|
711
|
+
label: "Go",
|
|
712
|
+
bin: "go",
|
|
713
|
+
mise: "go",
|
|
714
|
+
files: ["go.mod", "go.work"]
|
|
571
715
|
},
|
|
572
716
|
{
|
|
573
|
-
id: "
|
|
574
|
-
label: "
|
|
575
|
-
bin: "
|
|
576
|
-
mise: "
|
|
717
|
+
id: "rust",
|
|
718
|
+
label: "Rust",
|
|
719
|
+
bin: "cargo",
|
|
720
|
+
mise: "rust",
|
|
721
|
+
files: [
|
|
722
|
+
"Cargo.toml",
|
|
723
|
+
"rust-toolchain.toml",
|
|
724
|
+
"rust-toolchain"
|
|
725
|
+
]
|
|
726
|
+
},
|
|
727
|
+
{
|
|
728
|
+
id: "just",
|
|
729
|
+
label: "just",
|
|
730
|
+
bin: "just",
|
|
731
|
+
mise: "just",
|
|
732
|
+
files: [
|
|
733
|
+
"justfile",
|
|
734
|
+
"Justfile",
|
|
735
|
+
".justfile"
|
|
736
|
+
]
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
id: "task",
|
|
740
|
+
label: "Task",
|
|
741
|
+
bin: "task",
|
|
742
|
+
mise: "task",
|
|
743
|
+
files: ["Taskfile.yml", "Taskfile.yaml"]
|
|
577
744
|
}
|
|
578
745
|
];
|
|
579
746
|
/** Coding agent CLIs — one folder each under src/agents/, whose meta.json is
|
|
@@ -585,7 +752,19 @@ var TOOLS = [
|
|
|
585
752
|
var AGENTS$1 = agents_default;
|
|
586
753
|
var DEFAULT_GITHUB_HOST = "github.com";
|
|
587
754
|
function toolById(id) {
|
|
588
|
-
return TOOLS.find((t) => t.id === id) || null;
|
|
755
|
+
return TOOLS.find((t) => t.id === id) || PROJECT_TOOLS.find((t) => t.id === id) || null;
|
|
756
|
+
}
|
|
757
|
+
/** A version that is only a version (`latest`, `lts`, `22`, `1.2.3-rc.1`),
|
|
758
|
+
* not one of mise's forms that build from a git ref or point at a path
|
|
759
|
+
* (`ref:`, `path:`, `prefix:`). */
|
|
760
|
+
var PLAIN_VERSION = /^(?!-)[\w.+-]+$/;
|
|
761
|
+
/** Whether a mise pin is one of the tools above, as they install, at a
|
|
762
|
+
* plain version: what a restore takes without asking. Any other name —
|
|
763
|
+
* a registry tool the catalog does not list, a backend (`npm:`, `ubi:`,
|
|
764
|
+
* `github:`, `cargo:`, `go:`, `pipx:` …), a URL — installs and runs
|
|
765
|
+
* whatever it names, so a restore takes it only when it is named. */
|
|
766
|
+
function catalogPin(name, version) {
|
|
767
|
+
return [...TOOLS, ...PROJECT_TOOLS].some((t) => t.mise === name) && PLAIN_VERSION.test(version);
|
|
589
768
|
}
|
|
590
769
|
function agentById(id) {
|
|
591
770
|
return AGENTS$1.find((a) => a.id === id) || null;
|
|
@@ -656,8 +835,9 @@ function setupDirs() {
|
|
|
656
835
|
};
|
|
657
836
|
return dirsFor.dirs;
|
|
658
837
|
}
|
|
659
|
-
/** `~/…` for anything under the home directory — every path
|
|
660
|
-
* display (Settings rows, `work doctor
|
|
838
|
+
/** `~/…` for anything under the home directory — every path given it is
|
|
839
|
+
* for display (Settings rows, `work doctor`, a language server's
|
|
840
|
+
* definition outside every checkout), never re-used to exec. */
|
|
661
841
|
function tilde(p) {
|
|
662
842
|
if (!p) return p;
|
|
663
843
|
return p === home ? "~" : p.startsWith(home + path.sep) ? "~" + p.slice(home.length) : p;
|
|
@@ -1051,96 +1231,6 @@ function preferredAgent(enabled = enabledAgents()) {
|
|
|
1051
1231
|
return enabled[0] || "shell";
|
|
1052
1232
|
}
|
|
1053
1233
|
//#endregion
|
|
1054
|
-
//#region src/server/cache.ts
|
|
1055
|
-
/** Keyed stale-while-revalidate cache: a cached value is served immediately
|
|
1056
|
-
* (revalidating in the background when older than `ttlMs`); loads are deduped
|
|
1057
|
-
* per key, and `refresh` bypasses both the cache and any in-flight load. */
|
|
1058
|
-
function swr(ttlMs, load, seed) {
|
|
1059
|
-
const cache = /* @__PURE__ */ new Map();
|
|
1060
|
-
const inflight = /* @__PURE__ */ new Map();
|
|
1061
|
-
function start(key, refresh) {
|
|
1062
|
-
const startedAt = Date.now();
|
|
1063
|
-
const promise = load(key, refresh).then((value) => {
|
|
1064
|
-
const existing = cache.get(key);
|
|
1065
|
-
if (!existing || existing.at <= startedAt) cache.set(key, {
|
|
1066
|
-
at: Date.now(),
|
|
1067
|
-
value
|
|
1068
|
-
});
|
|
1069
|
-
return value;
|
|
1070
|
-
}).finally(() => {
|
|
1071
|
-
if (inflight.get(key)?.promise === promise) inflight.delete(key);
|
|
1072
|
-
});
|
|
1073
|
-
inflight.set(key, {
|
|
1074
|
-
promise,
|
|
1075
|
-
refresh
|
|
1076
|
-
});
|
|
1077
|
-
return promise;
|
|
1078
|
-
}
|
|
1079
|
-
const read = (key, refresh = false) => {
|
|
1080
|
-
if (refresh) {
|
|
1081
|
-
const current = inflight.get(key);
|
|
1082
|
-
return current?.refresh ? current.promise : start(key, true);
|
|
1083
|
-
}
|
|
1084
|
-
let cached = cache.get(key);
|
|
1085
|
-
if (!cached && seed) {
|
|
1086
|
-
cached = seed(key);
|
|
1087
|
-
if (cached) cache.set(key, cached);
|
|
1088
|
-
}
|
|
1089
|
-
if (cached) {
|
|
1090
|
-
if (Date.now() - cached.at >= ttlMs && !inflight.has(key)) start(key, false).catch(() => {});
|
|
1091
|
-
return Promise.resolve(cached.value);
|
|
1092
|
-
}
|
|
1093
|
-
return inflight.get(key)?.promise ?? start(key, false);
|
|
1094
|
-
};
|
|
1095
|
-
/** Inject an externally fetched value (e.g. from a batched load). */
|
|
1096
|
-
read.set = (key, value) => {
|
|
1097
|
-
cache.set(key, {
|
|
1098
|
-
at: Date.now(),
|
|
1099
|
-
value
|
|
1100
|
-
});
|
|
1101
|
-
};
|
|
1102
|
-
/** Current cached value, if any — used when a batch update must merge
|
|
1103
|
-
* with a richer per-key load rather than replace it. */
|
|
1104
|
-
read.get = (key) => cache.get(key)?.value;
|
|
1105
|
-
return read;
|
|
1106
|
-
}
|
|
1107
|
-
/** Serialize async work per key: calls for one key run in submission order,
|
|
1108
|
-
* each starting only after the previous settled. The stored tail is the
|
|
1109
|
-
* all-settled form, so a rejection neither blocks the next caller nor leaves
|
|
1110
|
-
* the entry behind — the map holds only keys with work still in flight. */
|
|
1111
|
-
var locks = /* @__PURE__ */ new Map();
|
|
1112
|
-
function withLock(key, fn) {
|
|
1113
|
-
const run = (locks.get(key) ?? Promise.resolve()).then(fn);
|
|
1114
|
-
const tail = run.then(() => {}, () => {});
|
|
1115
|
-
locks.set(key, tail);
|
|
1116
|
-
tail.then(() => {
|
|
1117
|
-
if (locks.get(key) === tail) locks.delete(key);
|
|
1118
|
-
});
|
|
1119
|
-
return run;
|
|
1120
|
-
}
|
|
1121
|
-
/** One load at a time, and a short reuse window: callers join the in-flight
|
|
1122
|
-
* load, and a result younger than `ttlMs` is served without one. For an
|
|
1123
|
-
* expensive process sweep (lsof, ps, list-panes) whose answer does not
|
|
1124
|
-
* change within the window — `ttlMs` of 0 still collapses concurrent
|
|
1125
|
-
* callers onto a single spawn. */
|
|
1126
|
-
function shared(fn, ttlMs) {
|
|
1127
|
-
let inflight = null;
|
|
1128
|
-
let last = null;
|
|
1129
|
-
return () => {
|
|
1130
|
-
if (last && Date.now() - last.at < ttlMs) return Promise.resolve(last.value);
|
|
1131
|
-
if (!inflight) inflight = fn().then((value) => {
|
|
1132
|
-
last = {
|
|
1133
|
-
at: Date.now(),
|
|
1134
|
-
value
|
|
1135
|
-
};
|
|
1136
|
-
return value;
|
|
1137
|
-
}).finally(() => {
|
|
1138
|
-
inflight = null;
|
|
1139
|
-
});
|
|
1140
|
-
return inflight;
|
|
1141
|
-
};
|
|
1142
|
-
}
|
|
1143
|
-
//#endregion
|
|
1144
1234
|
//#region src/server/events.ts
|
|
1145
1235
|
var listeners$1 = /* @__PURE__ */ new Set();
|
|
1146
1236
|
function publish(type, data) {
|
|
@@ -1164,7 +1254,7 @@ function subscribe(listener) {
|
|
|
1164
1254
|
listeners$1.add(listener);
|
|
1165
1255
|
return () => listeners$1.delete(listener);
|
|
1166
1256
|
}
|
|
1167
|
-
/** Connected
|
|
1257
|
+
/** Connected events-bus clients — lets background watchers idle when no one
|
|
1168
1258
|
* is listening. */
|
|
1169
1259
|
function subscriberCount() {
|
|
1170
1260
|
return listeners$1.size;
|
|
@@ -7122,7 +7212,7 @@ var background = /* @__PURE__ */ new Map();
|
|
|
7122
7212
|
/** A turn's end is pushed once it has stayed ended this long. Stop fires
|
|
7123
7213
|
* again each time something sends the agent back to work (a stop hook
|
|
7124
7214
|
* that continues it, a goal loop, background subagents reporting in), and
|
|
7125
|
-
* each of those ends
|
|
7215
|
+
* each of those ends would be a "Finished" on the phone while it carries on. */
|
|
7126
7216
|
var DONE_SETTLE_MS = 3e3;
|
|
7127
7217
|
var listeners = /* @__PURE__ */ new Set();
|
|
7128
7218
|
/** Called on every phase transition (the status snapshot drops itself). */
|
|
@@ -7295,7 +7385,7 @@ function publishChange(sessionId) {
|
|
|
7295
7385
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
7296
7386
|
if (row?.workspace_id) {
|
|
7297
7387
|
const workspaceId = row.workspace_id;
|
|
7298
|
-
import("./
|
|
7388
|
+
import("./_LF2Fo5WE.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
7299
7389
|
return;
|
|
7300
7390
|
}
|
|
7301
7391
|
publish("sessions.changed");
|
|
@@ -7705,10 +7795,10 @@ async function fetchUsage$3(account) {
|
|
|
7705
7795
|
var PROFILE_TTL_MS = 36e5;
|
|
7706
7796
|
var profiles = /* @__PURE__ */ new Map();
|
|
7707
7797
|
/** The account's plan as Anthropic has it now. `.claude.json` holds what
|
|
7708
|
-
* Claude Code saw at sign-in, and it only asks again on a new login, so
|
|
7709
|
-
* upgrade (Max 5x → 20x)
|
|
7710
|
-
* with the same token as the usage; the cached plan stands in
|
|
7711
|
-
* cannot be. */
|
|
7798
|
+
* Claude Code saw at sign-in, and it only asks again on a new login, so
|
|
7799
|
+
* from it alone an upgrade (Max 5x → 20x) reads as the old plan until
|
|
7800
|
+
* then. Asked with the same token as the usage; the cached plan stands in
|
|
7801
|
+
* when it cannot be. */
|
|
7712
7802
|
async function livePlan(account) {
|
|
7713
7803
|
const hit = profiles.get(account.dir);
|
|
7714
7804
|
if (hit && Date.now() - hit.at < PROFILE_TTL_MS) return hit.plan;
|
|
@@ -8609,6 +8699,47 @@ var cursor = {
|
|
|
8609
8699
|
usage: () => cursorRow().then((row) => [row])
|
|
8610
8700
|
};
|
|
8611
8701
|
//#endregion
|
|
8702
|
+
//#region src/server/paths.ts
|
|
8703
|
+
/** Whether `target` is `root` or somewhere under it, by name alone. Both
|
|
8704
|
+
* are normalised first, so `..` and a trailing slash count as the
|
|
8705
|
+
* filesystem would count them, and the separator after `root` is the
|
|
8706
|
+
* whole point: a sibling `…/work-2` is not in `…/work`. A relative
|
|
8707
|
+
* `target` is in nothing — an empty one is a process cwd that could not
|
|
8708
|
+
* be read, not the root. A symlink under `root` can still lead out: what
|
|
8709
|
+
* is read through one wants `realInside`. */
|
|
8710
|
+
function inside(target, root) {
|
|
8711
|
+
if (!path.isAbsolute(target)) return false;
|
|
8712
|
+
const top = path.resolve(root);
|
|
8713
|
+
const full = path.resolve(target);
|
|
8714
|
+
return full === top || full.startsWith(top.endsWith(path.sep) ? top : top + path.sep);
|
|
8715
|
+
}
|
|
8716
|
+
/** Where `file` — named from `root`, as git and the pages name a
|
|
8717
|
+
* checkout's files, or absolute — really leads through every symlink,
|
|
8718
|
+
* when that is still `root` or under it; null when it leads out or is not
|
|
8719
|
+
* there. The check by name alone lets a symlink in a repo, which a branch
|
|
8720
|
+
* can add, point a read at any file on the machine. */
|
|
8721
|
+
async function realInside(file, root) {
|
|
8722
|
+
const full = path.resolve(root, file);
|
|
8723
|
+
if (!inside(full, root)) return null;
|
|
8724
|
+
try {
|
|
8725
|
+
const [top, real] = await Promise.all([fs$1.realpath(root), fs$1.realpath(full)]);
|
|
8726
|
+
return inside(real, top) ? real : null;
|
|
8727
|
+
} catch {
|
|
8728
|
+
return null;
|
|
8729
|
+
}
|
|
8730
|
+
}
|
|
8731
|
+
/** `realInside` for a caller that cannot wait. */
|
|
8732
|
+
function realInsideSync(file, root) {
|
|
8733
|
+
const full = path.resolve(root, file);
|
|
8734
|
+
if (!inside(full, root)) return null;
|
|
8735
|
+
try {
|
|
8736
|
+
const real = fs.realpathSync(full);
|
|
8737
|
+
return inside(real, fs.realpathSync(root)) ? real : null;
|
|
8738
|
+
} catch {
|
|
8739
|
+
return null;
|
|
8740
|
+
}
|
|
8741
|
+
}
|
|
8742
|
+
//#endregion
|
|
8612
8743
|
//#region src/agents/grok/usage.ts
|
|
8613
8744
|
var AUTH = path.join(HOME, ".grok", "auth.json");
|
|
8614
8745
|
var LOG = path.join(HOME, ".grok", "logs", "unified.jsonl");
|
|
@@ -8781,7 +8912,7 @@ function scratch() {
|
|
|
8781
8912
|
return os.tmpdir();
|
|
8782
8913
|
}
|
|
8783
8914
|
})();
|
|
8784
|
-
return hookFile()
|
|
8915
|
+
return inside(hookFile(), tmp);
|
|
8785
8916
|
}
|
|
8786
8917
|
/** Whether Grok's hook registry names work's hook file — without it Grok
|
|
8787
8918
|
* reports nothing and the screen has to speak for it. Read from disk, not
|
|
@@ -9309,10 +9440,10 @@ function tmuxWasStarted(id) {
|
|
|
9309
9440
|
function clearTmuxStarted(id) {
|
|
9310
9441
|
tmuxStarted.delete(id);
|
|
9311
9442
|
}
|
|
9312
|
-
/**
|
|
9313
|
-
* Coalesced per workspace: a turn boundary lands as a burst
|
|
9314
|
-
* transitions (hook, then scrape), and each one cost a list-panes
|
|
9315
|
-
* and a broadcast for a list that came out the same. */
|
|
9443
|
+
/** Events-bus payload: session rows + live tmux/hook state so clients
|
|
9444
|
+
* don't refetch. Coalesced per workspace: a turn boundary lands as a burst
|
|
9445
|
+
* of phase transitions (hook, then scrape), and each one cost a list-panes
|
|
9446
|
+
* spawn and a broadcast for a list that came out the same. */
|
|
9316
9447
|
var EMIT_DEBOUNCE_MS = 50;
|
|
9317
9448
|
var pendingEmits = /* @__PURE__ */ new Map();
|
|
9318
9449
|
function notifySessionsChanged(workspaceId) {
|
|
@@ -9339,8 +9470,14 @@ async function emitSessionsChanged(workspaceId) {
|
|
|
9339
9470
|
async function killWorkspaceSessions(workspaceId) {
|
|
9340
9471
|
for (const session of listSessions(workspaceId)) await killSession(session.id);
|
|
9341
9472
|
}
|
|
9473
|
+
/** Control characters a paste never means: C0 but tab and line breaks,
|
|
9474
|
+
* ESC, DEL and C1. The text can quote a reviewed file, which is repo
|
|
9475
|
+
* content, and an ESC in it can end the bracketed paste early on a tmux
|
|
9476
|
+
* that passes one through, typing the rest into the pane as keys. */
|
|
9477
|
+
var PASTE_UNSAFE = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g;
|
|
9342
9478
|
/** Type text into a session's tmux (bracketed paste + Enter), creating it if needed. */
|
|
9343
|
-
async function sendToSession(id,
|
|
9479
|
+
async function sendToSession(id, raw, size) {
|
|
9480
|
+
const text = raw.replace(PASTE_UNSAFE, "");
|
|
9344
9481
|
const session = getSession(id);
|
|
9345
9482
|
if (!session) throw new Error("unknown session");
|
|
9346
9483
|
const wsPath = workspacePath(session.workspace_id);
|
|
@@ -9518,68 +9655,71 @@ async function ensureTmuxServer() {
|
|
|
9518
9655
|
], os.homedir()).catch(() => {});
|
|
9519
9656
|
}
|
|
9520
9657
|
/** Full tmux command (options + new-session) for creating/attaching a
|
|
9521
|
-
* session's tmux; `mode` is "-d" (create detached) or "-A" (attach-or-create).
|
|
9658
|
+
* session's tmux; `mode` is "-d" (create detached) or "-A" (attach-or-create).
|
|
9659
|
+
* Every `set-option` is `-q`: one failed command drops the rest of a `;`
|
|
9660
|
+
* chain, new-session included, and a tmux older than an option
|
|
9661
|
+
* (`fill-character`, `extended-keys-format`) rejects its name. */
|
|
9522
9662
|
function newSessionArgs(session, wsPath, mode, initialPrompt, size) {
|
|
9523
9663
|
return [
|
|
9524
9664
|
"start-server",
|
|
9525
9665
|
";",
|
|
9526
9666
|
"set-option",
|
|
9527
|
-
"-
|
|
9667
|
+
"-gq",
|
|
9528
9668
|
"status",
|
|
9529
9669
|
"off",
|
|
9530
9670
|
";",
|
|
9531
9671
|
"set-option",
|
|
9532
|
-
"-
|
|
9672
|
+
"-gq",
|
|
9533
9673
|
"mouse",
|
|
9534
9674
|
"on",
|
|
9535
9675
|
";",
|
|
9536
9676
|
"set-option",
|
|
9537
|
-
"-
|
|
9677
|
+
"-gq",
|
|
9538
9678
|
"history-limit",
|
|
9539
9679
|
"5000",
|
|
9540
9680
|
";",
|
|
9541
9681
|
"set-option",
|
|
9542
|
-
"-
|
|
9682
|
+
"-gq",
|
|
9543
9683
|
"fill-character",
|
|
9544
9684
|
" ",
|
|
9545
9685
|
";",
|
|
9546
9686
|
"set-option",
|
|
9547
|
-
"-
|
|
9687
|
+
"-sq",
|
|
9548
9688
|
"set-clipboard",
|
|
9549
9689
|
"on",
|
|
9550
9690
|
";",
|
|
9551
9691
|
"set-option",
|
|
9552
|
-
"-
|
|
9692
|
+
"-gq",
|
|
9553
9693
|
"focus-events",
|
|
9554
9694
|
"on",
|
|
9555
9695
|
";",
|
|
9556
9696
|
"set-option",
|
|
9557
|
-
"-
|
|
9697
|
+
"-sq",
|
|
9558
9698
|
"extended-keys",
|
|
9559
9699
|
"on",
|
|
9560
9700
|
";",
|
|
9561
9701
|
"set-option",
|
|
9562
|
-
"-
|
|
9702
|
+
"-sq",
|
|
9563
9703
|
"extended-keys-format",
|
|
9564
9704
|
"csi-u",
|
|
9565
9705
|
";",
|
|
9566
9706
|
"set-option",
|
|
9567
|
-
"-
|
|
9707
|
+
"-sq",
|
|
9568
9708
|
"terminal-features[100]",
|
|
9569
9709
|
"*:hyperlinks",
|
|
9570
9710
|
";",
|
|
9571
9711
|
"set-option",
|
|
9572
|
-
"-
|
|
9712
|
+
"-sq",
|
|
9573
9713
|
"terminal-features[101]",
|
|
9574
9714
|
"*:clipboard",
|
|
9575
9715
|
";",
|
|
9576
9716
|
"set-option",
|
|
9577
|
-
"-
|
|
9717
|
+
"-sq",
|
|
9578
9718
|
"terminal-features[102]",
|
|
9579
9719
|
"*:sync:RGB",
|
|
9580
9720
|
";",
|
|
9581
9721
|
"set-option",
|
|
9582
|
-
"-
|
|
9722
|
+
"-sq",
|
|
9583
9723
|
"terminal-features[103]",
|
|
9584
9724
|
"*:sixel",
|
|
9585
9725
|
";",
|
|
@@ -9770,4 +9910,4 @@ function sleep(ms) {
|
|
|
9770
9910
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
9771
9911
|
}
|
|
9772
9912
|
//#endregion
|
|
9773
|
-
export {
|
|
9913
|
+
export { saveSubscription as $, readBody as $t, clearAgentPhase as A, agentById as At, agentBadge as B, gh as Bt, readHookPayload as C, miseVersions as Ct, realInsideSync as D, DEFAULT_GITHUB_HOST as Dt, realInside as E, which as Et, onPhaseChange as F, all as Ft, ACCENT_RE as G, config as Gt, agentFromCommand as H, gitEnv as Ht, setAgentPhase as I, db as It, manifest as J, withLock as Jt, getInstance as K, shared as Kt, setScrapedPhase as L, get as Lt, hookReportedAt as M, catalogPin as Mt, noteBackground as N, toolById as Nt, blankRow as O, PROJECT_TOOLS as Ot, noteUserAnswered as P, applyPrefChange as Pt, pushPublicKey as Q, httpError as Qt, setSessionViewers as R, workspacePath as Rt, AGENTS as S, miseInstalls as St, inside as T, tilde as Tt, agentLabel as U, run$1 as Ut, agentFamily as V, git as Vt, agentMeta as W, tmux as Wt, setInstance as X, FRAME_HEADERS as Xt, normalizeAccent as Y, FRAME_ANCESTORS as Yt, deleteSubscription as Z, checked as Zt, renameSession as _, setPref as _t, ensureTmuxServer as a, subscriberCount as at, tmuxName as b, doctor as bt, killSession as c, agentChoices as ct, listPanesWithin as d, deleteWorkspacePrefs as dt, sendPush as et, listSessions as f, disabledAgents as ft, panePids as g, setDisabledAgents as gt, notifySessionsChanged as h, preferredAgent as ht, disposeSessions as i, subscribe as it, hookPhase as j, agentLabel$1 as jt, agentPhase as k, TOOLS as kt, killWorkspaceSessions as l, allPrefs as lt, newSessionArgs as m, getSetting as mt, clearTmuxStarted as n, publish as nt, forgetPanes as o, PREF_MAX as ot, markTmuxStarted as p, enabledAgents as pt, iconSvg as q, swr as qt, createSession as r, publishJson as rt, getSession as s, WORKSPACE_PREFS as st, cleanEnv as t, validSubscription as tt, listPanes as u, changePref as ut, sendToSession as v, setSetting as vt, reportsWorking as w, setupPath as wt, tmuxWasStarted as x, ghKnownHosts as xt, sessionStates as y, discoverAgents as yt, settleQuietWorking as z, TMUX_SOCKET as zt };
|