@dylanpiercey/work 0.0.223 → 0.1.0
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 +2 -27
- package/bin/work.mjs +51 -105
- package/dist/{_CpANOzpd.js → _Bq7to522.js} +344 -139
- package/dist/_CkwTsHKB.js +2 -0
- package/dist/index.mjs +2222 -2341
- package/dist/public/assets/_1RHVsAcK.js +1 -0
- package/dist/public/assets/_4CShjaLP.js +1 -0
- package/dist/public/assets/_68JtNDO1.js +1 -0
- package/dist/public/assets/{_DoCtdMd2.js → _8G2Mv7jG.js} +1 -1
- package/dist/public/assets/_8G2Mv7jG.js.br +0 -0
- package/dist/public/assets/{_BL9QMk_P.js → _8dvK2NDJ.js} +1 -1
- package/dist/public/assets/_8dvK2NDJ.js.br +0 -0
- package/dist/public/assets/_94L2SIJF.js +1 -0
- package/dist/public/assets/_9AnDb3YH.js +1 -0
- package/dist/public/assets/{_DlpTErRA.js → _9kX9D09B.js} +1 -1
- package/dist/public/assets/_9kX9D09B.js.br +0 -0
- package/dist/public/assets/_9lErVegn.js +1 -0
- package/dist/public/assets/{_DtOzdwHm.js → _B0oyGUU5.js} +1 -1
- package/dist/public/assets/_B0oyGUU5.js.br +0 -0
- package/dist/public/assets/_B1mPnLlp.js +1 -0
- package/dist/public/assets/_B4fi2SSA.js +1 -0
- package/dist/public/assets/{_BUH04L5e.js → _B582D2rg.js} +1 -1
- package/dist/public/assets/{_CT3clsOQ.js → _B7GwDeKK.js} +1 -1
- package/dist/public/assets/_B7Qx25UP.js +1 -0
- package/dist/public/assets/_B7b8EVjA.js +1 -0
- package/dist/public/assets/{_BVp6r0fg.js → _BBWaxDkO.js} +1 -1
- package/dist/public/assets/_BBWaxDkO.js.br +0 -0
- package/dist/public/assets/{_DeCJ44Me.js → _BDa-iwuj.js} +1 -1
- package/dist/public/assets/_BDa-iwuj.js.br +0 -0
- package/dist/public/assets/_BEKHKNmM.js +1 -0
- package/dist/public/assets/{_DJ3UAR_s.js → _BE_Jyvqd.js} +1 -1
- package/dist/public/assets/_BE_Jyvqd.js.br +0 -0
- package/dist/public/assets/_BFU-kJkk.js +1 -0
- package/dist/public/assets/_BIJ2O2oU.js +1 -0
- package/dist/public/assets/_BJ59XAZ9.js +1 -0
- package/dist/public/assets/{_BnOOD6nr.js → _BKqRYfOI.js} +4 -4
- package/dist/public/assets/_BKqRYfOI.js.br +0 -0
- package/dist/public/assets/_BKr9Dzz1.js +1 -0
- package/dist/public/assets/_BN7xvxS_.js +1 -0
- package/dist/public/assets/_BNQTVBlH.js +1 -0
- package/dist/public/assets/{_D8u1YU9b.js → _BNW5Jiec.js} +1 -1
- package/dist/public/assets/_BNW5Jiec.js.br +0 -0
- package/dist/public/assets/{_CZGS4T08.js → _BOGkzMx9.js} +1 -1
- package/dist/public/assets/_BOGkzMx9.js.br +0 -0
- package/dist/public/assets/_BUEpqQ_m.js +1 -0
- package/dist/public/assets/{_B_zyAtSJ.js → _BUvqweu0.js} +1 -1
- package/dist/public/assets/_BUvqweu0.js.br +0 -0
- package/dist/public/assets/{_BsupnkWM.js → _BZKB4fhr.js} +1 -1
- package/dist/public/assets/_BZKB4fhr.js.br +0 -0
- package/dist/public/assets/_BZo9BjDF.js +1 -0
- package/dist/public/assets/{_BeE9qDu0.js → _BbbOvNRH.js} +1 -1
- package/dist/public/assets/_BbbOvNRH.js.br +0 -0
- package/dist/public/assets/_BdUNnSlC.js +1 -0
- package/dist/public/assets/{_Cw_8WbwF.js → _Bf8WYPfh.js} +1 -1
- package/dist/public/assets/_Bf8WYPfh.js.br +0 -0
- package/dist/public/assets/{_pP1W6w5v.js → _Bhx319Hi.js} +1 -1
- package/dist/public/assets/_Bhx319Hi.js.br +0 -0
- package/dist/public/assets/{_O70J1Mfv.js → _Bm4SHrNp.js} +1 -1
- package/dist/public/assets/_Bm4SHrNp.js.br +0 -0
- package/dist/public/assets/{_--tE4Gxz.js → _Bmrqq8Ro.js} +2 -2
- package/dist/public/assets/_Bmrqq8Ro.js.br +0 -0
- package/dist/public/assets/_BnHZ6Npj.js +1 -0
- package/dist/public/assets/{_CLDmR3jR.js → _BoDxRJLS.js} +1 -1
- package/dist/public/assets/_BoDxRJLS.js.br +0 -0
- package/dist/public/assets/_Bo_Ru664.js +1 -0
- package/dist/public/assets/{_BCZpExov.js → _Bp8-V8yl.js} +1 -1
- package/dist/public/assets/_Bp8-V8yl.js.br +0 -0
- package/dist/public/assets/{_CGLpCj_I.js → _BpoeUr5j.js} +1 -1
- package/dist/public/assets/_BpoeUr5j.js.br +0 -0
- package/dist/public/assets/_Bq2G_Tid.js +1 -0
- package/dist/public/assets/_BsyoLB_D.js +1 -0
- package/dist/public/assets/{_BAHrOydH.js → _Bv3e3rg8.js} +1 -1
- package/dist/public/assets/_Bv3e3rg8.js.br +0 -0
- package/dist/public/assets/{_C6i9NP5A.js → _Bv3qNE1b.js} +1 -1
- package/dist/public/assets/{_BXT2bXMi.js → _BvXp6HpX.js} +1 -1
- package/dist/public/assets/_BvXp6HpX.js.br +0 -0
- package/dist/public/assets/{_CX1wufuh.js → _BwP07uVS.js} +1 -1
- package/dist/public/assets/_BwP07uVS.js.br +0 -0
- package/dist/public/assets/{_ifUb4WX7.js → _Bx1CW-sF.js} +1 -1
- package/dist/public/assets/_Bx1CW-sF.js.br +0 -0
- package/dist/public/assets/{_BPcswKMK.js → _BywcP-As.js} +1 -1
- package/dist/public/assets/_BywcP-As.js.br +0 -0
- package/dist/public/assets/{_Bp_WT09q.js → _Bzgtwt3G.js} +1 -1
- package/dist/public/assets/_Bzgtwt3G.js.br +0 -0
- package/dist/public/assets/{_IWMmnVCy.js → _C0_s45qg.js} +1 -1
- package/dist/public/assets/_C0_s45qg.js.br +0 -0
- package/dist/public/assets/_C0ePgF6b.js +1 -0
- package/dist/public/assets/{_Da2Dmt_d.js → _C0oVtTqO.js} +1 -1
- package/dist/public/assets/_C0oVtTqO.js.br +0 -0
- package/dist/public/assets/{_CtyJUmXC.js → _C654p96Z.js} +1 -1
- package/dist/public/assets/_C654p96Z.js.br +0 -0
- package/dist/public/assets/{_2mnAZf6B.js → _C8_1Y2-z.js} +1 -1
- package/dist/public/assets/_C8_1Y2-z.js.br +0 -0
- package/dist/public/assets/_C8v1AZFP.js +1 -0
- package/dist/public/assets/{_BO0OB-rz.js → _CAkPJLeF.js} +1 -1
- package/dist/public/assets/_CAkPJLeF.js.br +0 -0
- package/dist/public/assets/_CB0D5cRH.js +1 -0
- package/dist/public/assets/_CD05JUTh.js +1 -0
- package/dist/public/assets/{_CJ9j8N5Z.js → _CEJUcePr.js} +1 -1
- package/dist/public/assets/_CEJUcePr.js.br +0 -0
- package/dist/public/assets/{_DuarImb7.js → _CEXHZd73.js} +1 -1
- package/dist/public/assets/_CEXHZd73.js.br +0 -0
- package/dist/public/assets/_CHcUMVR7.js +1 -0
- package/dist/public/assets/{_BnyLUTdO.js → _CHuLFr1f.js} +1 -1
- package/dist/public/assets/_CHuLFr1f.js.br +0 -0
- package/dist/public/assets/{_DwcoW-IU.js → _CIb7xw_1.js} +1 -1
- package/dist/public/assets/_CIb7xw_1.js.br +0 -0
- package/dist/public/assets/{_B1RldJ0S.js → _CMSBfO6u.js} +1 -1
- package/dist/public/assets/_CMSBfO6u.js.br +0 -0
- package/dist/public/assets/_CN7GPyBo.js +1 -0
- package/dist/public/assets/{_DI0QHEXB.js → _COcePo2y.js} +1 -1
- package/dist/public/assets/_COcePo2y.js.br +0 -0
- package/dist/public/assets/{_eQK3EZCc.js → _CTINBWaG.js} +1 -1
- package/dist/public/assets/_CTINBWaG.js.br +0 -0
- package/dist/public/assets/_CTWrnAbz.js +1 -0
- package/dist/public/assets/{_CLerZOx-.js → _CUXajOKj.js} +1 -1
- package/dist/public/assets/_CUXajOKj.js.br +0 -0
- package/dist/public/assets/{_ChpYg41R.js → _CVru3vzC.js} +1 -1
- package/dist/public/assets/{_BA8HFnO3.js → _CYjE__ml.js} +1 -1
- package/dist/public/assets/_CYjE__ml.js.br +0 -0
- package/dist/public/assets/{_dr95P55a.js → _CZ_OWtIT.js} +1 -1
- package/dist/public/assets/_CZ_OWtIT.js.br +0 -0
- package/dist/public/assets/{_BLTfQLdY.js → _C_37_B6u.js} +1 -1
- package/dist/public/assets/_C_37_B6u.js.br +0 -0
- package/dist/public/assets/{_xdrkfok5.js → _C_CIQL7J.js} +1 -1
- package/dist/public/assets/_C_CIQL7J.js.br +0 -0
- package/dist/public/assets/_C_WdpYbK.js +1 -0
- package/dist/public/assets/_CaiH3VN9.js +1 -0
- package/dist/public/assets/{_CCCQMLw5.js → _CamWDaoG.js} +1 -1
- package/dist/public/assets/_CamWDaoG.js.br +0 -0
- package/dist/public/assets/_CdDElA0V.js +1 -0
- package/dist/public/assets/_CfnsClzZ.js +1 -0
- package/dist/public/assets/{_SwbsOoi9.js → _Cgo1fRhJ.js} +1 -1
- package/dist/public/assets/_Cgo1fRhJ.js.br +0 -0
- package/dist/public/assets/_CjhGrlf3.js +1 -0
- package/dist/public/assets/_CjlbL4C_.js +1 -0
- package/dist/public/assets/_CjogTUXK.js +1 -0
- package/dist/public/assets/{_mnBdD4YN.js → _ClldMY37.js} +1 -1
- package/dist/public/assets/_ClldMY37.js.br +0 -0
- package/dist/public/assets/_CmFq6Gtp.js +1 -0
- package/dist/public/assets/_CoAPOKiP.js +1 -0
- package/dist/public/assets/_CoUUgh9P.js +1 -0
- package/dist/public/assets/{_s5Jez2mu.js → _CpjSCB1I.js} +1 -1
- package/dist/public/assets/_CpjSCB1I.js.br +0 -0
- package/dist/public/assets/{_DeN4EY8L.js → _Ct3RF80L.js} +1 -1
- package/dist/public/assets/_Ct3RF80L.js.br +0 -0
- package/dist/public/assets/_CtYy5eZs.js +1 -0
- package/dist/public/assets/{_BS4crAAm.js → _CxAPL49a.js} +1 -1
- package/dist/public/assets/_CxAPL49a.js.br +0 -0
- package/dist/public/assets/{_CwmzEsB4.js → _CyBCIknf.js} +1 -1
- package/dist/public/assets/_CyBCIknf.js.br +0 -0
- package/dist/public/assets/{_unfL8mz1.js → _Cz5BPBG8.js} +1 -1
- package/dist/public/assets/_Cz5BPBG8.js.br +0 -0
- package/dist/public/assets/_D-eEFXaI.js +1 -0
- package/dist/public/assets/{_gPFPzzPF.js → _D0aoEFRx.js} +1 -1
- package/dist/public/assets/_D0aoEFRx.js.br +0 -0
- package/dist/public/assets/{_CnKYioYw.js → _D1uRW1qz.js} +1 -1
- package/dist/public/assets/_D1uRW1qz.js.br +0 -0
- package/dist/public/assets/_D2oIr2T2.js +1 -0
- package/dist/public/assets/{_BBpX-M4b.js → _D2un443j.js} +1 -1
- package/dist/public/assets/_D2un443j.js.br +0 -0
- package/dist/public/assets/_D3MPx4-f.js +1 -0
- package/dist/public/assets/{_DzrtBP-L.js → _D4dJ2qEE.js} +1 -1
- package/dist/public/assets/{_Fzbz4zvE.js → _D4q8XSMI.js} +1 -1
- package/dist/public/assets/_D4q8XSMI.js.br +0 -0
- package/dist/public/assets/{_BxAl0m64.js → _D4quFMVQ.js} +1 -1
- package/dist/public/assets/_D4quFMVQ.js.br +0 -0
- package/dist/public/assets/{_pvS44-AC.js → _D4rOX-Fa.js} +1 -1
- package/dist/public/assets/_D4rOX-Fa.js.br +0 -0
- package/dist/public/assets/_D5edrSyA.js +1 -0
- package/dist/public/assets/{_DuXOUegE.js → _D6kktUFn.js} +1 -1
- package/dist/public/assets/_D6kktUFn.js.br +0 -0
- package/dist/public/assets/_D80-qtVY.js +1 -0
- package/dist/public/assets/_D9-3EVA4.js +1 -0
- package/dist/public/assets/{_CE5MhJWL.js → _D9sS4J_w.js} +1 -1
- package/dist/public/assets/_D9sS4J_w.js.br +0 -0
- package/dist/public/assets/_DBLpxTDi.js +1 -0
- package/dist/public/assets/{_CYNAhnRH.js → _DByHQ7nW.js} +6 -6
- package/dist/public/assets/_DByHQ7nW.js.br +0 -0
- package/dist/public/assets/{_D-hK5uFn.js → _DC-78WeM.js} +1 -1
- package/dist/public/assets/_DC-78WeM.js.br +0 -0
- package/dist/public/assets/{_DmDSLxrw.js → _DDl8KSWJ.js} +1 -1
- package/dist/public/assets/_DDl8KSWJ.js.br +0 -0
- package/dist/public/assets/{_C-6dImS5.js → _DFWOMF-B.js} +1 -1
- package/dist/public/assets/_DFWOMF-B.js.br +0 -0
- package/dist/public/assets/_DKb-rt9n.js +1 -0
- package/dist/public/assets/_DMnSJCF_.js +1 -0
- package/dist/public/assets/_DOOIlrPh.js +1 -0
- package/dist/public/assets/_DPW-0yKP.js +1 -0
- package/dist/public/assets/_DR3BmvWU.js +1 -0
- package/dist/public/assets/{_C9OdJcx4.js → _DSVLaMWS.js} +1 -1
- package/dist/public/assets/_DSVLaMWS.js.br +0 -0
- package/dist/public/assets/_DYNGNKLk.js +1 -0
- package/dist/public/assets/_DZnEgCbj.js +1 -0
- package/dist/public/assets/{_zKlxcAnQ.js → _DaMVRI8f.js} +1 -1
- package/dist/public/assets/_DaMVRI8f.js.br +0 -0
- package/dist/public/assets/{_DGTQBWy0.js → _DbvaGqOl.js} +1 -1
- package/dist/public/assets/_DbvaGqOl.js.br +0 -0
- package/dist/public/assets/{_DiqV5bDH.js → _DcMIlvz-.js} +1 -1
- package/dist/public/assets/_DcMIlvz-.js.br +0 -0
- package/dist/public/assets/{__Oa255vo.js → _Dd6X3e7w.js} +1 -1
- package/dist/public/assets/_Dd6X3e7w.js.br +0 -0
- package/dist/public/assets/{_BdvO5Lqa.js → _De7P3jUH.js} +1 -1
- package/dist/public/assets/_De7P3jUH.js.br +0 -0
- package/dist/public/assets/_DeiFEAar.js +1 -0
- package/dist/public/assets/{_vKQopDwG.js → _DfI982PI.js} +1 -1
- package/dist/public/assets/_DfI982PI.js.br +0 -0
- package/dist/public/assets/_DfZ6emcw.js +1 -0
- package/dist/public/assets/{_DxVt7Zuk.js → _Dj1lZ1pa.js} +4 -4
- package/dist/public/assets/_Dj1lZ1pa.js.br +0 -0
- package/dist/public/assets/{_DhEdzMUw.js → _DkCaEf_h.js} +1 -1
- package/dist/public/assets/_DkCaEf_h.js.br +0 -0
- package/dist/public/assets/_DonAis0J.js +1 -0
- package/dist/public/assets/{_BRG_DBcC.js → _Dp3IZdH8.js} +1 -1
- package/dist/public/assets/_Dp3IZdH8.js.br +0 -0
- package/dist/public/assets/{_unwtcXFQ.js → _DqYih4xk.js} +1 -1
- package/dist/public/assets/_DqYih4xk.js.br +0 -0
- package/dist/public/assets/{_BLRpf6Uw.js → _DqhphdU4.js} +1 -1
- package/dist/public/assets/_DqhphdU4.js.br +0 -0
- package/dist/public/assets/{_C87NBm9i.js → _DrIgZJzN.js} +1 -1
- package/dist/public/assets/_DrIgZJzN.js.br +0 -0
- package/dist/public/assets/_Dt4hHR05.js +1 -0
- package/dist/public/assets/_DtTbTraA.js +1 -0
- package/dist/public/assets/_DwMxAJKP.js +1 -0
- package/dist/public/assets/{_CttJbiei.js → _DxEm-Gwj.js} +1 -1
- package/dist/public/assets/_DxEm-Gwj.js.br +0 -0
- package/dist/public/assets/{_CdgAsi3s.js → _Dytf99zx.js} +1 -1
- package/dist/public/assets/_Dytf99zx.js.br +0 -0
- package/dist/public/assets/_EAgv5jR9.js +1 -0
- package/dist/public/assets/{_C9qO_dny.js → _Iecpd0kS.js} +1 -1
- package/dist/public/assets/_Iecpd0kS.js.br +0 -0
- package/dist/public/assets/{_DuGmU4h0.js → _MCwIJAuJ.js} +1 -1
- package/dist/public/assets/_MCwIJAuJ.js.br +0 -0
- package/dist/public/assets/{_BJRSndB4.js → _NM79Lu3L.js} +1 -1
- package/dist/public/assets/_NM79Lu3L.js.br +0 -0
- package/dist/public/assets/_QpNKKuS9.js +1 -0
- package/dist/public/assets/{_BbiACo0Y.js → _SGDxiwE1.js} +1 -1
- package/dist/public/assets/_SGDxiwE1.js.br +0 -0
- package/dist/public/assets/_TA8pE7z9.js +1 -0
- package/dist/public/assets/_bE4sNDeU.js +1 -0
- package/dist/public/assets/{_pUYwxsdF.js → _bcsuBP7T.js} +1 -1
- package/dist/public/assets/_bcsuBP7T.js.br +0 -0
- package/dist/public/assets/_cdcAU4yY.js +1 -0
- package/dist/public/assets/{_DhNuRs-V.js → _ch_yXAap.js} +1 -1
- package/dist/public/assets/_ch_yXAap.js.br +0 -0
- package/dist/public/assets/{_DaqT6m41.js → _d5u7EI97.js} +1 -1
- package/dist/public/assets/_d5u7EI97.js.br +0 -0
- package/dist/public/assets/{_C2ZpyiHV.js → _eoa1EOU-.js} +1 -1
- package/dist/public/assets/_eoa1EOU-.js.br +0 -0
- package/dist/public/assets/{_C1PmcEws.js → _j2tDSMvo.js} +1 -1
- package/dist/public/assets/_j2tDSMvo.js.br +0 -0
- package/dist/public/assets/_jNhIFgbc.js +1 -0
- package/dist/public/assets/_kDYiTaag.js +1 -0
- package/dist/public/assets/_lNMVVbUx.js +1 -0
- package/dist/public/assets/_nwJ7Hu3S.js +1 -0
- package/dist/public/assets/{_qJTL2ooe.js → _tmDtUACa.js} +1 -1
- package/dist/public/assets/_tmDtUACa.js.br +0 -0
- package/dist/public/assets/{_BewXp5Y_.js → _wXDh-Z2N.js} +1 -1
- package/dist/public/assets/_wXDh-Z2N.js.br +0 -0
- package/dist/public/assets/{_CB31bp-W.js → _wcshV0sZ.js} +1 -1
- package/dist/public/assets/_wcshV0sZ.js.br +0 -0
- package/dist/public/assets/_x-NwqgCn.js +1 -0
- package/dist/public/assets/{_BsimXDnm.js → _xyw_DS5P.js} +1 -1
- package/dist/public/assets/_xyw_DS5P.js.br +0 -0
- package/dist/public/assets/{_Aq9oGnRu.js → _zSAfqXcm.js} +1 -1
- package/dist/public/assets/_zSAfqXcm.js.br +0 -0
- package/dist/public/assets/{app-shell-CpPCwWPW.css → app-shell-ChQoVC5b.css} +1 -1
- package/dist/public/assets/app-shell-ChQoVC5b.css.br +0 -0
- package/dist/public/assets/files-view-CLtLp_BW.js +2 -0
- package/dist/public/assets/{files-view-DtI7JE-f.css → files-view-CNHQapdI.css} +1 -1
- package/dist/public/assets/files-view-CNHQapdI.css.br +0 -0
- package/dist/public/assets/group.css.ts-BG82htKb.css +1 -0
- package/dist/public/assets/group.css.ts-BG82htKb.css.br +0 -0
- package/dist/public/assets/icon-folder-DJOHuEpD.css +1 -0
- package/dist/public/assets/icon-folder-DJOHuEpD.css.br +0 -0
- package/dist/public/assets/{icon-search-DAtjHWFL.css → icon-search-DsJuFXUJ.css} +1 -1
- package/dist/public/assets/icon-search-DsJuFXUJ.css.br +0 -0
- package/dist/public/assets/manage-workspace-NBcFDyrB.js +2 -0
- package/dist/public/assets/manage-workspace-f_Np32TD.css +1 -0
- package/dist/public/assets/{modal-view-D0qnmuJE.css → modal-view-KVNBpNYi.css} +1 -1
- package/dist/public/assets/modal-view-KVNBpNYi.css.br +0 -0
- package/dist/public/assets/new-DHI77GvL.js +1 -0
- package/dist/public/assets/new-workspace-BFE-HpD_.css +1 -0
- package/dist/public/assets/new-workspace-BFE-HpD_.css.br +0 -0
- package/dist/public/assets/new-workspace-BRzimdd5.js +2 -0
- package/dist/public/assets/port-chip-CUUIDOVM.css +1 -0
- package/dist/public/assets/port-chip-CUUIDOVM.css.br +0 -0
- package/dist/public/assets/prompt-dialog-BGs6RXOV.css +1 -0
- package/dist/public/assets/prompt-dialog-BGs6RXOV.css.br +0 -0
- package/dist/public/assets/{quick-open-DVqzk3-g.css → quick-open-Gx4so1bl.css} +1 -1
- package/dist/public/assets/quick-open-Gx4so1bl.css.br +0 -0
- package/dist/public/assets/repo-picker-CUhd0vJN.css +1 -0
- package/dist/public/assets/repo-picker-CUhd0vJN.css.br +4 -0
- package/dist/public/assets/review-view-DFEK9VBa.js +2 -0
- package/dist/public/assets/{review-view-DqMrB4Ny.css → review-view-deUY3OE5.css} +1 -1
- package/dist/public/assets/review-view-deUY3OE5.css.br +0 -0
- package/dist/public/assets/section-CziSOSBR.css +1 -0
- package/dist/public/assets/section-CziSOSBR.css.br +0 -0
- package/dist/public/assets/settings-DHI77GvL.js +1 -0
- package/dist/public/assets/settings-page-OOtPOzIn.js +2 -0
- package/dist/public/assets/settings-page-wZhd7FLi.css +1 -0
- package/dist/public/assets/settings-page-wZhd7FLi.css.br +0 -0
- package/dist/public/assets/skill-row-BoCyFIXg.css +1 -0
- package/dist/public/assets/sso-auth-DV76tTpE.css +1 -0
- package/dist/public/assets/sso-auth-DV76tTpE.css.br +0 -0
- package/dist/public/assets/w-DHI77GvL.js +1 -0
- package/dist/public/assets/w._-DHI77GvL.js +1 -0
- package/dist/public/assets/w._-DsTgq3-C.js +1 -0
- package/dist/public/assets/w._-igEOSPR-.js +1 -0
- package/lib/review/markdown.mjs +5 -5
- package/lib/setup/bridge.d.mts +10 -0
- package/lib/setup/bridge.mjs +84 -0
- package/lib/setup/doctor.d.mts +5 -0
- package/lib/setup/doctor.mjs +45 -1
- package/lib/setup/install.d.mts +1 -0
- package/lib/setup/install.mjs +21 -1
- package/lib/setup/listen.mjs +2 -2
- package/lib/share/manifest.mjs +2 -1
- package/package.json +2 -3
- package/dist/_LF2Fo5WE.js +0 -2
- package/dist/public/assets/_--tE4Gxz.js.br +0 -0
- package/dist/public/assets/_1OL9vXM-.js +0 -1
- package/dist/public/assets/_2mnAZf6B.js.br +0 -0
- package/dist/public/assets/_5f9fMvWJ.js +0 -1
- package/dist/public/assets/_5y69OR6M.js +0 -1
- package/dist/public/assets/_Aq9oGnRu.js.br +0 -0
- package/dist/public/assets/_B0uJCjmk.js +0 -1
- package/dist/public/assets/_B1RldJ0S.js.br +0 -0
- package/dist/public/assets/_B5TpOQCZ.js +0 -1
- package/dist/public/assets/_B6UdulKa.js +0 -1
- package/dist/public/assets/_BA8HFnO3.js.br +0 -0
- package/dist/public/assets/_BAHrOydH.js.br +0 -0
- package/dist/public/assets/_BBpX-M4b.js.br +0 -0
- package/dist/public/assets/_BCZpExov.js.br +0 -0
- package/dist/public/assets/_BFZHNauV.js +0 -1
- package/dist/public/assets/_BJRSndB4.js.br +0 -0
- package/dist/public/assets/_BL9QMk_P.js.br +0 -0
- package/dist/public/assets/_BLNEzyb5.js +0 -1
- package/dist/public/assets/_BLRpf6Uw.js.br +0 -0
- package/dist/public/assets/_BLTfQLdY.js.br +0 -0
- package/dist/public/assets/_BO0OB-rz.js.br +0 -0
- package/dist/public/assets/_BPcswKMK.js.br +0 -0
- package/dist/public/assets/_BPhXWliU.js +0 -1
- package/dist/public/assets/_BQXTv9Cr.js +0 -1
- package/dist/public/assets/_BRG_DBcC.js.br +0 -0
- package/dist/public/assets/_BS4crAAm.js.br +0 -0
- package/dist/public/assets/_BVp6r0fg.js.br +0 -0
- package/dist/public/assets/_BXT2bXMi.js.br +0 -0
- package/dist/public/assets/_B_zyAtSJ.js.br +0 -0
- package/dist/public/assets/_BaXKdIeb.js +0 -1
- package/dist/public/assets/_BbiACo0Y.js.br +0 -0
- package/dist/public/assets/_BdvO5Lqa.js.br +0 -0
- package/dist/public/assets/_BeE9qDu0.js.br +0 -0
- package/dist/public/assets/_BewXp5Y_.js.br +0 -0
- package/dist/public/assets/_BfOOLKo5.js +0 -1
- package/dist/public/assets/_BhS8bTnr.js +0 -1
- package/dist/public/assets/_BhZ3ZoG0.js +0 -1
- package/dist/public/assets/_Bi3_ZsOQ.js +0 -1
- package/dist/public/assets/_Bj_Lfa8B.js +0 -1
- package/dist/public/assets/_BlN_x04q.js +0 -1
- package/dist/public/assets/_Bn5nsnie.js +0 -1
- package/dist/public/assets/_BnOOD6nr.js.br +0 -0
- package/dist/public/assets/_BnyLUTdO.js.br +0 -0
- package/dist/public/assets/_Bp_WT09q.js.br +0 -0
- package/dist/public/assets/_BsimXDnm.js.br +0 -0
- package/dist/public/assets/_BsupnkWM.js.br +0 -0
- package/dist/public/assets/_BxAl0m64.js.br +0 -0
- package/dist/public/assets/_C-6dImS5.js.br +0 -0
- package/dist/public/assets/_C18Torhh.js +0 -1
- package/dist/public/assets/_C1PmcEws.js.br +0 -0
- package/dist/public/assets/_C2ZpyiHV.js.br +0 -0
- package/dist/public/assets/_C3P1VHUI.js +0 -1
- package/dist/public/assets/_C6xwTKke.js +0 -1
- package/dist/public/assets/_C6yqlRfl.js +0 -1
- package/dist/public/assets/_C75D8bH2.js +0 -1
- package/dist/public/assets/_C87NBm9i.js.br +0 -0
- package/dist/public/assets/_C8Vc_vBH.js +0 -1
- package/dist/public/assets/_C9OdJcx4.js.br +0 -0
- package/dist/public/assets/_C9eoo0sE.js +0 -1
- package/dist/public/assets/_C9qO_dny.js.br +0 -0
- package/dist/public/assets/_CB31bp-W.js.br +0 -0
- package/dist/public/assets/_CCCQMLw5.js.br +0 -0
- package/dist/public/assets/_CCie36pi.js +0 -1
- package/dist/public/assets/_CDD9N34p.js +0 -1
- package/dist/public/assets/_CE5MhJWL.js.br +0 -0
- package/dist/public/assets/_CGLpCj_I.js.br +0 -0
- package/dist/public/assets/_CJ9j8N5Z.js.br +0 -0
- package/dist/public/assets/_CLDmR3jR.js.br +0 -0
- package/dist/public/assets/_CLerZOx-.js.br +0 -0
- package/dist/public/assets/_CM5GtJb2.js +0 -1
- package/dist/public/assets/_COECwOVb.js +0 -1
- package/dist/public/assets/_CSQE9nMN.js +0 -1
- package/dist/public/assets/_CSXMgHLQ.js +0 -1
- package/dist/public/assets/_CVRiByCT.js +0 -1
- package/dist/public/assets/_CVSrm4Pl.js +0 -1
- package/dist/public/assets/_CX1wufuh.js.br +0 -0
- package/dist/public/assets/_CYNAhnRH.js.br +0 -0
- package/dist/public/assets/_CZGS4T08.js.br +0 -0
- package/dist/public/assets/_C_L7l9Mg.js +0 -1
- package/dist/public/assets/_CaMrYy1W.js +0 -1
- package/dist/public/assets/_CdgAsi3s.js.br +0 -0
- package/dist/public/assets/_Ce-E7sJE.js +0 -1
- package/dist/public/assets/_Cg3S760D.js +0 -1
- package/dist/public/assets/_CicyY7KP.js +0 -1
- package/dist/public/assets/_Ck0YOw_7.js +0 -1
- package/dist/public/assets/_CmHlTZSs.js +0 -1
- package/dist/public/assets/_CnECYh66.js +0 -1
- package/dist/public/assets/_CnKYioYw.js.br +0 -0
- package/dist/public/assets/_CnUVvVPd.js +0 -1
- package/dist/public/assets/_CqSgGCGC.js +0 -1
- package/dist/public/assets/_CttJbiei.js.br +0 -0
- package/dist/public/assets/_CtyJUmXC.js.br +0 -0
- package/dist/public/assets/_Cw_8WbwF.js.br +0 -0
- package/dist/public/assets/_CwmzEsB4.js.br +0 -0
- package/dist/public/assets/_CzETFsJs.js +0 -1
- package/dist/public/assets/_D-S9H-tX.js +0 -1
- package/dist/public/assets/_D-hK5uFn.js.br +0 -0
- package/dist/public/assets/_D5fTwHXK.js +0 -1
- package/dist/public/assets/_D8u1YU9b.js.br +0 -0
- package/dist/public/assets/_DAH8evhA.js +0 -1
- package/dist/public/assets/_DAemmoHI.js +0 -1
- package/dist/public/assets/_DEMYxWZf.js +0 -1
- package/dist/public/assets/_DGTQBWy0.js.br +0 -0
- package/dist/public/assets/_DHhv0pCA.js +0 -1
- package/dist/public/assets/_DI0QHEXB.js.br +0 -0
- package/dist/public/assets/_DJ3UAR_s.js.br +0 -0
- package/dist/public/assets/_DKu6UxI7.js +0 -1
- package/dist/public/assets/_DNC-9RBN.js +0 -1
- package/dist/public/assets/_DP-Bu7ET.js +0 -1
- package/dist/public/assets/_DYmmPBcq.js +0 -1
- package/dist/public/assets/_Da2Dmt_d.js.br +0 -0
- package/dist/public/assets/_DaqT6m41.js.br +0 -0
- package/dist/public/assets/_DbVyutEZ.js +0 -1
- package/dist/public/assets/_DcBvO2Si.js +0 -1
- package/dist/public/assets/_DeCJ44Me.js.br +0 -0
- package/dist/public/assets/_DeN4EY8L.js.br +0 -0
- package/dist/public/assets/_DhEdzMUw.js.br +0 -0
- package/dist/public/assets/_DhNuRs-V.js.br +0 -0
- package/dist/public/assets/_DiqV5bDH.js.br +0 -0
- package/dist/public/assets/_Diqt_yCf.js +0 -1
- package/dist/public/assets/_DlpTErRA.js.br +0 -0
- package/dist/public/assets/_DmDSLxrw.js.br +0 -0
- package/dist/public/assets/_DoC0qbSD.js +0 -1
- package/dist/public/assets/_DoCtdMd2.js.br +0 -0
- package/dist/public/assets/_DpqWFkMg.js +0 -1
- package/dist/public/assets/_Dr0Bkgso.js +0 -1
- package/dist/public/assets/_Dt-n9FaQ.js +0 -1
- package/dist/public/assets/_DtOzdwHm.js.br +0 -0
- package/dist/public/assets/_DuGmU4h0.js.br +0 -0
- package/dist/public/assets/_DuXOUegE.js.br +0 -0
- package/dist/public/assets/_DuaocJd1.js +0 -1
- package/dist/public/assets/_DuarImb7.js.br +0 -0
- package/dist/public/assets/_DwcoW-IU.js.br +0 -0
- package/dist/public/assets/_DxVt7Zuk.js.br +0 -0
- package/dist/public/assets/_Fzbz4zvE.js.br +0 -0
- package/dist/public/assets/_I5oX-lGP.js +0 -1
- package/dist/public/assets/_IWMmnVCy.js.br +0 -0
- package/dist/public/assets/_O70J1Mfv.js.br +0 -0
- package/dist/public/assets/_SwbsOoi9.js.br +0 -0
- package/dist/public/assets/_Yy39CykK.js +0 -1
- package/dist/public/assets/__Oa255vo.js.br +0 -0
- package/dist/public/assets/_bPze7k1x.js +0 -1
- package/dist/public/assets/_bU1KcT1I.js +0 -1
- package/dist/public/assets/_dr95P55a.js.br +0 -0
- package/dist/public/assets/_eQK3EZCc.js.br +0 -0
- package/dist/public/assets/_gPFPzzPF.js.br +0 -0
- package/dist/public/assets/_hzpOPZUB.js +0 -1
- package/dist/public/assets/_ifUb4WX7.js.br +0 -0
- package/dist/public/assets/_kQ7LiSim.js +0 -1
- package/dist/public/assets/_lOAW1VLM.js +0 -1
- package/dist/public/assets/_mnBdD4YN.js.br +0 -0
- package/dist/public/assets/_odBcV1kc.js +0 -1
- package/dist/public/assets/_pP1W6w5v.js.br +0 -0
- package/dist/public/assets/_pUYwxsdF.js.br +0 -0
- package/dist/public/assets/_pvS44-AC.js.br +0 -0
- package/dist/public/assets/_qJTL2ooe.js.br +0 -0
- package/dist/public/assets/_s5Jez2mu.js.br +0 -0
- package/dist/public/assets/_unfL8mz1.js.br +0 -0
- package/dist/public/assets/_unwtcXFQ.js.br +0 -0
- package/dist/public/assets/_vKQopDwG.js.br +0 -0
- package/dist/public/assets/_w1aegGdT.js +0 -1
- package/dist/public/assets/_xdrkfok5.js.br +0 -0
- package/dist/public/assets/_y-lm36fI.js +0 -1
- package/dist/public/assets/_zKlxcAnQ.js.br +0 -0
- package/dist/public/assets/app-shell-CpPCwWPW.css.br +0 -0
- package/dist/public/assets/files-view-BfCdcfXX.js +0 -2
- package/dist/public/assets/files-view-DtI7JE-f.css.br +0 -0
- package/dist/public/assets/group.css.ts-SeaNz7WZ.css +0 -1
- package/dist/public/assets/group.css.ts-SeaNz7WZ.css.br +0 -0
- package/dist/public/assets/icon-folder-DHVc-REl.css +0 -1
- package/dist/public/assets/icon-folder-DHVc-REl.css.br +0 -0
- package/dist/public/assets/icon-search-DAtjHWFL.css.br +0 -0
- package/dist/public/assets/manage-workspace-6i6Zeai7.css +0 -1
- package/dist/public/assets/manage-workspace-CixeMkdt.js +0 -2
- package/dist/public/assets/modal-view-D0qnmuJE.css.br +0 -0
- package/dist/public/assets/new-DxhaKmbF.js +0 -1
- package/dist/public/assets/new-workspace-BXjDRbqF.css +0 -1
- package/dist/public/assets/new-workspace-BXjDRbqF.css.br +0 -0
- package/dist/public/assets/new-workspace-DG693v2S.js +0 -2
- package/dist/public/assets/port-chip-Lz3mVJWb.css +0 -1
- package/dist/public/assets/port-chip-Lz3mVJWb.css.br +0 -0
- package/dist/public/assets/prompt-dialog-vhnae1-x.css +0 -1
- package/dist/public/assets/prompt-dialog-vhnae1-x.css.br +0 -0
- package/dist/public/assets/quick-open-DVqzk3-g.css.br +0 -0
- package/dist/public/assets/repo-picker-K5RYsEge.css +0 -1
- package/dist/public/assets/repo-picker-K5RYsEge.css.br +0 -0
- package/dist/public/assets/review-view-DqMrB4Ny.css.br +0 -0
- package/dist/public/assets/review-view-TdLbCgEg.js +0 -2
- package/dist/public/assets/section-2MyJSq5D.css +0 -1
- package/dist/public/assets/section-2MyJSq5D.css.br +0 -0
- package/dist/public/assets/settings-DxhaKmbF.js +0 -1
- package/dist/public/assets/settings-page-BBAG94Vh.js +0 -2
- package/dist/public/assets/settings-page-DUefc32x.css +0 -1
- package/dist/public/assets/settings-page-DUefc32x.css.br +0 -0
- package/dist/public/assets/skill-row-BeOk8NK8.css +0 -1
- package/dist/public/assets/sso-auth-CU3fGJ4U.css +0 -1
- package/dist/public/assets/sso-auth-CU3fGJ4U.css.br +0 -0
- package/dist/public/assets/w-DxhaKmbF.js +0 -1
- package/dist/public/assets/w._-C6JVdFgi.js +0 -1
- package/dist/public/assets/w._-DxhaKmbF.js +0 -1
- package/dist/public/assets/w._-rfvcDGPk.js +0 -1
- package/scripts/migrate.mjs +0 -682
|
@@ -1,41 +1,15 @@
|
|
|
1
1
|
import { i as __require, o as __toESM, t as __commonJSMin } from "./_BMI-E3GI.js";
|
|
2
2
|
import { r as require_inherits, t as require_src$1 } from "./_xlrdOUsL.js";
|
|
3
3
|
import { t as require_safe_buffer } from "./_BmSjjJ2E.js";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
4
5
|
import fs from "node:fs";
|
|
5
6
|
import path from "node:path";
|
|
6
|
-
import { execFile, execFileSync } from "node:child_process";
|
|
7
|
+
import { execFile, execFileSync, spawnSync } from "node:child_process";
|
|
7
8
|
import fs$1 from "node:fs/promises";
|
|
8
9
|
import os from "node:os";
|
|
9
10
|
import { promisify } from "node:util";
|
|
10
11
|
import { DatabaseSync } from "node:sqlite";
|
|
11
12
|
import { createHash } from "node:crypto";
|
|
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
|
-
};
|
|
23
|
-
/** Error whose `status` the API error-boundary middleware uses for the response. */
|
|
24
|
-
function httpError(status, message) {
|
|
25
|
-
return Object.assign(new Error(message), { status });
|
|
26
|
-
}
|
|
27
|
-
/** The value of a Standard Schema `[value, issues]` pair, or a thrown 400
|
|
28
|
-
* built from the issues. */
|
|
29
|
-
function checked(result, what = "request") {
|
|
30
|
-
const [value, issues] = result;
|
|
31
|
-
if (issues) throw httpError(400, `invalid ${what}: ${issues.map((issue) => issue.message).join("; ")}`);
|
|
32
|
-
return value;
|
|
33
|
-
}
|
|
34
|
-
/** Validated request body, or a thrown 400 built from the valibot issues. */
|
|
35
|
-
async function readBody(ctx) {
|
|
36
|
-
return checked(await ctx.body, "request body");
|
|
37
|
-
}
|
|
38
|
-
//#endregion
|
|
39
13
|
//#region src/server/cache.ts
|
|
40
14
|
/** Keyed stale-while-revalidate cache: a cached value is served immediately
|
|
41
15
|
* (revalidating in the background when older than `ttlMs`); loads are deduped
|
|
@@ -312,11 +286,281 @@ function utf8Locale(env) {
|
|
|
312
286
|
for (const [key, value] of Object.entries(env)) if (value !== void 0) out[key] = value;
|
|
313
287
|
return forceUtf8Locale(out);
|
|
314
288
|
}
|
|
289
|
+
/** The release that brings a database to the baseline. WORK_BRIDGE_SPEC
|
|
290
|
+
* names another (an `npm pack` tarball of it) to try the bridge before it
|
|
291
|
+
* is published. */
|
|
292
|
+
function bridgeSpec() {
|
|
293
|
+
return process.env.WORK_BRIDGE_SPEC || "@dylanpiercey/work@0.0.223";
|
|
294
|
+
}
|
|
295
|
+
/** What to run by hand for the database in `dataDir`: its data dir named
|
|
296
|
+
* outright, since the shell running it may not have the service's. */
|
|
297
|
+
function bridgeCommands(dataDir) {
|
|
298
|
+
return [`WORK_DATA_DIR=${/^[\w@%+=:,./-]+$/.test(dataDir) ? dataDir : `'${dataDir.replace(/'/g, `'\\''`)}'`} npx -y -p ${bridgeSpec()} work migrate`, "work setup"];
|
|
299
|
+
}
|
|
300
|
+
/** Whether the database at `file` predates the baseline: it has tables and
|
|
301
|
+
* no version. A missing or empty one is simply new. node:sqlite is loaded
|
|
302
|
+
* here, not at the top: it warns on load under older node, and every other
|
|
303
|
+
* CLI command would say so. */
|
|
304
|
+
function needsBridge(file) {
|
|
305
|
+
if (!fs.existsSync(file)) return false;
|
|
306
|
+
const { DatabaseSync } = createRequire(import.meta.url)("node:sqlite");
|
|
307
|
+
const db = new DatabaseSync(file, { readOnly: true });
|
|
308
|
+
try {
|
|
309
|
+
const { user_version } = db.prepare("PRAGMA user_version").get();
|
|
310
|
+
const tables = db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table'").get();
|
|
311
|
+
return user_version < 1 && !!tables;
|
|
312
|
+
} finally {
|
|
313
|
+
db.close();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/** Bring the database in `dataDir` to the baseline when it predates it,
|
|
317
|
+
* with `env` (the service's) so the sweeps see the same data dir and
|
|
318
|
+
* workspaces root the server does. True when it is there (or never needed
|
|
319
|
+
* to be). The package's install scripts are skipped: `migrate` needs none,
|
|
320
|
+
* and a native build that fails would fail the bridge with it. */
|
|
321
|
+
function bridgeIfNeeded(dataDir, env, log = () => {}) {
|
|
322
|
+
const file = path.join(dataDir, "work.db");
|
|
323
|
+
if (!needsBridge(file)) return true;
|
|
324
|
+
log(`${file} predates 0.1: bringing it forward once with ${bridgeSpec()} (a one-time download)`);
|
|
325
|
+
const sibling = path.join(path.dirname(process.execPath), "npx");
|
|
326
|
+
const npx = fs.existsSync(sibling) ? sibling : "npx";
|
|
327
|
+
spawnSync(npx, [
|
|
328
|
+
"-y",
|
|
329
|
+
"-p",
|
|
330
|
+
bridgeSpec(),
|
|
331
|
+
"work",
|
|
332
|
+
"migrate"
|
|
333
|
+
], {
|
|
334
|
+
stdio: "inherit",
|
|
335
|
+
env: {
|
|
336
|
+
...env,
|
|
337
|
+
WORK_DATA_DIR: dataDir,
|
|
338
|
+
npm_config_ignore_scripts: "true"
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
return !needsBridge(file);
|
|
342
|
+
}
|
|
343
|
+
/** The server's bridge, for db.ts to hand the migrations: with the server's
|
|
344
|
+
* own environment, before the database is opened, once per start. */
|
|
345
|
+
function bridgeForServer(dataDir) {
|
|
346
|
+
return bridgeIfNeeded(dataDir, process.env, (line) => console.log(`[work] ${line}`));
|
|
347
|
+
}
|
|
348
|
+
//#endregion
|
|
349
|
+
//#region src/server/migrations.ts
|
|
350
|
+
var STEPS = [{
|
|
351
|
+
version: 1,
|
|
352
|
+
name: "baseline",
|
|
353
|
+
up(db) {
|
|
354
|
+
db.exec(`
|
|
355
|
+
CREATE TABLE workspaces (
|
|
356
|
+
id TEXT PRIMARY KEY,
|
|
357
|
+
name TEXT NOT NULL,
|
|
358
|
+
path TEXT NOT NULL UNIQUE,
|
|
359
|
+
branch TEXT NOT NULL,
|
|
360
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'archived')),
|
|
361
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
362
|
+
materialized INTEGER NOT NULL DEFAULT 1,
|
|
363
|
+
origin_branch TEXT,
|
|
364
|
+
imported_at TEXT
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
CREATE TABLE repos (
|
|
368
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
369
|
+
full_name TEXT NOT NULL,
|
|
370
|
+
worktree TEXT NOT NULL,
|
|
371
|
+
base_branch TEXT NOT NULL,
|
|
372
|
+
default_branch TEXT NOT NULL,
|
|
373
|
+
PRIMARY KEY (workspace_id, full_name)
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
CREATE TABLE sessions (
|
|
377
|
+
id TEXT PRIMARY KEY,
|
|
378
|
+
workspace_id TEXT REFERENCES workspaces(id) ON DELETE SET NULL,
|
|
379
|
+
agent TEXT NOT NULL,
|
|
380
|
+
title TEXT,
|
|
381
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
CREATE TABLE settings (
|
|
385
|
+
key TEXT PRIMARY KEY,
|
|
386
|
+
value TEXT NOT NULL
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
CREATE TABLE review_comments (
|
|
390
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
391
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
392
|
+
worktree TEXT NOT NULL,
|
|
393
|
+
path TEXT NOT NULL,
|
|
394
|
+
side TEXT NOT NULL DEFAULT 'additions',
|
|
395
|
+
line_start INTEGER NOT NULL,
|
|
396
|
+
line_end INTEGER NOT NULL,
|
|
397
|
+
text TEXT NOT NULL,
|
|
398
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
399
|
+
head TEXT,
|
|
400
|
+
snippet TEXT
|
|
401
|
+
);
|
|
402
|
+
|
|
403
|
+
CREATE TABLE push_subscriptions (
|
|
404
|
+
endpoint TEXT PRIMARY KEY,
|
|
405
|
+
data TEXT NOT NULL
|
|
406
|
+
);
|
|
407
|
+
|
|
408
|
+
CREATE TABLE dismissed_prs (
|
|
409
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
410
|
+
full_name TEXT NOT NULL,
|
|
411
|
+
number INTEGER NOT NULL,
|
|
412
|
+
PRIMARY KEY (workspace_id, full_name, number)
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
CREATE TABLE review_marks (
|
|
416
|
+
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
417
|
+
worktree TEXT NOT NULL,
|
|
418
|
+
branch TEXT NOT NULL,
|
|
419
|
+
path TEXT NOT NULL,
|
|
420
|
+
fingerprint TEXT NOT NULL,
|
|
421
|
+
PRIMARY KEY (workspace_id, worktree, branch, path)
|
|
422
|
+
);
|
|
423
|
+
`);
|
|
424
|
+
}
|
|
425
|
+
}, {
|
|
426
|
+
version: 2,
|
|
427
|
+
name: "drop what 0.0.x kept for its upgrades",
|
|
428
|
+
up(db) {
|
|
429
|
+
db.exec(`
|
|
430
|
+
DELETE FROM review_marks WHERE path = '';
|
|
431
|
+
DELETE FROM settings
|
|
432
|
+
WHERE key IN ('review-cleared-diff-v2', 'ui.diff-uncommitted', 'diff-uncommitted')
|
|
433
|
+
OR key GLOB 'review.seen:*';
|
|
434
|
+
`);
|
|
435
|
+
for (const name of [
|
|
436
|
+
"tab",
|
|
437
|
+
"diff-filter",
|
|
438
|
+
"diff-folded",
|
|
439
|
+
"diff-collapsed",
|
|
440
|
+
"diff-focus",
|
|
441
|
+
"diff-pos",
|
|
442
|
+
"files-recent"
|
|
443
|
+
]) {
|
|
444
|
+
const prefix = `ui.${name}:`;
|
|
445
|
+
db.prepare("DELETE FROM settings WHERE key GLOB ? AND substr(key, ?) NOT IN (SELECT id FROM workspaces)").run(`${prefix}*`, prefix.length + 1);
|
|
446
|
+
}
|
|
447
|
+
const pref = (key) => db.prepare("SELECT value FROM settings WHERE key = ?").get(key)?.value;
|
|
448
|
+
const parse = (text) => {
|
|
449
|
+
try {
|
|
450
|
+
return text === void 0 ? void 0 : JSON.parse(text);
|
|
451
|
+
} catch {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
const font = parse(pref("ui.term-font"));
|
|
456
|
+
if (font && typeof font === "object") {
|
|
457
|
+
for (const device of ["desktop", "touch"]) if (Number.isInteger(font[device])) db.prepare("INSERT OR IGNORE INTO settings (key, value) VALUES (?, ?)").run(`ui.term-font-${device}`, String(font[device]));
|
|
458
|
+
}
|
|
459
|
+
db.exec("DELETE FROM settings WHERE key = 'ui.term-font'");
|
|
460
|
+
const keys = parse(pref("ui.phone-keys"));
|
|
461
|
+
if (Array.isArray(keys)) db.prepare("UPDATE settings SET value = ? WHERE key = 'ui.phone-keys'").run(JSON.stringify({
|
|
462
|
+
base: [],
|
|
463
|
+
extra: keys
|
|
464
|
+
}));
|
|
465
|
+
}
|
|
466
|
+
}];
|
|
467
|
+
var LATEST = STEPS.at(-1).version;
|
|
468
|
+
/** The database at `file`, at the latest version: an empty one is built by
|
|
469
|
+
* every step, an existing one gets those it lacks — each in a transaction
|
|
470
|
+
* of its own with its version stamp inside it, after a copy of the whole
|
|
471
|
+
* file (`work.db.v<from>.bak` beside it, the newest two kept). One from
|
|
472
|
+
* before the baseline is handed to `bridge` first, when given (the
|
|
473
|
+
* server's: lib/setup/bridge.mjs). Throws, with what to do in its message,
|
|
474
|
+
* for a database this code cannot open: one still from before the
|
|
475
|
+
* baseline, one from a newer release, or one a step failed on (rolled back
|
|
476
|
+
* to the step before). */
|
|
477
|
+
function openDatabase(file, { bridge } = {}) {
|
|
478
|
+
if (bridge && needsBridge(file)) bridge(path.dirname(file));
|
|
479
|
+
const db = new DatabaseSync(file);
|
|
480
|
+
try {
|
|
481
|
+
db.exec("PRAGMA busy_timeout = 5000");
|
|
482
|
+
db.exec("PRAGMA journal_mode = WAL");
|
|
483
|
+
migrate(db, file);
|
|
484
|
+
db.exec("PRAGMA foreign_keys = ON");
|
|
485
|
+
return db;
|
|
486
|
+
} catch (err) {
|
|
487
|
+
db.close();
|
|
488
|
+
throw err;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
function versionOf(db) {
|
|
492
|
+
return db.prepare("PRAGMA user_version").get().user_version;
|
|
493
|
+
}
|
|
494
|
+
function migrate(db, file) {
|
|
495
|
+
const from = versionOf(db);
|
|
496
|
+
const empty = !db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table'").get();
|
|
497
|
+
if (from < 1 && !empty) throw new Error(`${file} predates 0.1 and has not been brought forward (once, with the network: \`work setup\`, or this server on its next start). By hand:\n ${bridgeCommands(path.dirname(file)).join("\n ")}`);
|
|
498
|
+
if (from > LATEST) {
|
|
499
|
+
const backup = newestBackup(file, LATEST);
|
|
500
|
+
throw new Error(`${file} is at schema version ${from}, and this work knows up to ${LATEST}: a newer release upgraded it. Update work (\`work update\`)${backup ? `, or restore ${backup}, the copy taken before it did` : ""}.`);
|
|
501
|
+
}
|
|
502
|
+
const pending = STEPS.filter((s) => s.version > from);
|
|
503
|
+
if (!pending.length) return;
|
|
504
|
+
const backup = empty ? null : snapshot(db, file, from);
|
|
505
|
+
for (const step of pending) {
|
|
506
|
+
db.exec("BEGIN IMMEDIATE");
|
|
507
|
+
try {
|
|
508
|
+
if (versionOf(db) >= step.version) {
|
|
509
|
+
db.exec("ROLLBACK");
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
step.up(db);
|
|
513
|
+
db.exec(`PRAGMA user_version = ${step.version}`);
|
|
514
|
+
db.exec("COMMIT");
|
|
515
|
+
} catch (err) {
|
|
516
|
+
try {
|
|
517
|
+
db.exec("ROLLBACK");
|
|
518
|
+
} catch {}
|
|
519
|
+
throw new Error(`${file}: step ${step.version} (${step.name}) failed and was rolled back, leaving the database at version ${versionOf(db)}: ${err.message}${backup ? `. The copy from before this upgrade is ${backup}` : ""}`);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
var backupName = (file, version) => `${path.basename(file)}.v${version}.bak`;
|
|
524
|
+
/** The file's backups, newest version first. */
|
|
525
|
+
function backups(file) {
|
|
526
|
+
const dir = path.dirname(file);
|
|
527
|
+
const re = new RegExp(`^${path.basename(file).replace(/\./g, "\\.")}\\.v(\\d+)\\.bak$`);
|
|
528
|
+
let names = [];
|
|
529
|
+
try {
|
|
530
|
+
names = fs.readdirSync(dir);
|
|
531
|
+
} catch {}
|
|
532
|
+
return names.map((name) => re.exec(name)).filter((m) => !!m).map((m) => ({
|
|
533
|
+
file: path.join(dir, m[0]),
|
|
534
|
+
version: Number(m[1])
|
|
535
|
+
})).sort((a, b) => b.version - a.version);
|
|
536
|
+
}
|
|
537
|
+
function newestBackup(file, atMost) {
|
|
538
|
+
return backups(file).find((b) => b.version <= atMost)?.file ?? null;
|
|
539
|
+
}
|
|
540
|
+
/** A copy of the whole database as it is before an upgrade from `version`,
|
|
541
|
+
* which a release that knows `version` can open. */
|
|
542
|
+
function snapshot(db, file, version) {
|
|
543
|
+
const dest = path.join(path.dirname(file), backupName(file, version));
|
|
544
|
+
fs.rmSync(dest, { force: true });
|
|
545
|
+
db.prepare("VACUUM INTO ?").run(dest);
|
|
546
|
+
for (const old of backups(file).slice(2)) fs.rmSync(old.file, { force: true });
|
|
547
|
+
return dest;
|
|
548
|
+
}
|
|
315
549
|
//#endregion
|
|
316
550
|
//#region src/server/db.ts
|
|
317
551
|
if (!path.isAbsolute(config.dataDir)) throw new Error(`data dir must be absolute, got "${config.dataDir}" — check WORK_DATA_DIR and $HOME`);
|
|
318
|
-
|
|
319
|
-
|
|
552
|
+
/** The app's database, at the latest schema version before anything reads
|
|
553
|
+
* it (server/migrations.ts), one from before 0.1 bridged first. One this
|
|
554
|
+
* release cannot open stops the server here, saying what to do: a stack
|
|
555
|
+
* trace would bury that under itself. */
|
|
556
|
+
var db = (() => {
|
|
557
|
+
try {
|
|
558
|
+
return openDatabase(path.join(config.dataDir, "work.db"), { bridge: bridgeForServer });
|
|
559
|
+
} catch (err) {
|
|
560
|
+
console.error(`[work] ${err.message}`);
|
|
561
|
+
process.exit(1);
|
|
562
|
+
}
|
|
563
|
+
})();
|
|
320
564
|
/** Prepared statements, kept by their SQL: preparing is most of a small
|
|
321
565
|
* query's cost (10 µs against 4), and a status build runs hundreds. The
|
|
322
566
|
* texts are the call sites' own, so the set is small; the cap covers any
|
|
@@ -340,91 +584,33 @@ function get(sql, ...params) {
|
|
|
340
584
|
function workspacePath(id) {
|
|
341
585
|
return get("SELECT path FROM workspaces WHERE id = ?", id)?.path;
|
|
342
586
|
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
agent TEXT NOT NULL,
|
|
371
|
-
title TEXT,
|
|
372
|
-
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
373
|
-
);
|
|
374
|
-
|
|
375
|
-
CREATE TABLE IF NOT EXISTS settings (
|
|
376
|
-
key TEXT PRIMARY KEY,
|
|
377
|
-
value TEXT NOT NULL
|
|
378
|
-
);
|
|
379
|
-
|
|
380
|
-
CREATE TABLE IF NOT EXISTS review_comments (
|
|
381
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
382
|
-
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
383
|
-
worktree TEXT NOT NULL,
|
|
384
|
-
path TEXT NOT NULL,
|
|
385
|
-
side TEXT NOT NULL DEFAULT 'additions',
|
|
386
|
-
line_start INTEGER NOT NULL,
|
|
387
|
-
line_end INTEGER NOT NULL,
|
|
388
|
-
text TEXT NOT NULL,
|
|
389
|
-
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
|
|
390
|
-
);
|
|
391
|
-
|
|
392
|
-
CREATE TABLE IF NOT EXISTS push_subscriptions (
|
|
393
|
-
endpoint TEXT PRIMARY KEY,
|
|
394
|
-
data TEXT NOT NULL
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
CREATE TABLE IF NOT EXISTS dismissed_prs (
|
|
398
|
-
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
399
|
-
full_name TEXT NOT NULL,
|
|
400
|
-
number INTEGER NOT NULL,
|
|
401
|
-
PRIMARY KEY (workspace_id, full_name, number)
|
|
402
|
-
);
|
|
403
|
-
|
|
404
|
-
-- Viewed marks (server/viewed.ts): a file of a branch, and its change
|
|
405
|
-
-- as it was when marked.
|
|
406
|
-
CREATE TABLE IF NOT EXISTS review_marks (
|
|
407
|
-
workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
408
|
-
worktree TEXT NOT NULL,
|
|
409
|
-
branch TEXT NOT NULL,
|
|
410
|
-
path TEXT NOT NULL,
|
|
411
|
-
fingerprint TEXT NOT NULL,
|
|
412
|
-
PRIMARY KEY (workspace_id, worktree, branch, path)
|
|
413
|
-
);
|
|
414
|
-
`);
|
|
415
|
-
if (freshReview) db.prepare("INSERT OR IGNORE INTO settings (key, value) VALUES ('review-cleared-diff-v2', '1')").run();
|
|
416
|
-
/** Additive schema changes: `CREATE TABLE IF NOT EXISTS` never revisits a
|
|
417
|
-
* table that already exists, so a column added after a release has to be
|
|
418
|
-
* bolted on here for databases created before it. */
|
|
419
|
-
function ensureColumn(table, column, decl) {
|
|
420
|
-
if (!db.prepare(`PRAGMA table_info(${table})`).all().some((c) => c.name === column)) db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${decl}`);
|
|
421
|
-
}
|
|
422
|
-
ensureColumn("review_comments", "head", "TEXT");
|
|
423
|
-
ensureColumn("review_comments", "snippet", "TEXT");
|
|
424
|
-
ensureColumn("workspaces", "materialized", "INTEGER NOT NULL DEFAULT 1");
|
|
425
|
-
ensureColumn("workspaces", "origin_branch", "TEXT");
|
|
426
|
-
ensureColumn("workspaces", "imported_at", "TEXT");
|
|
427
|
-
if (fresh) db.exec("PRAGMA user_version = 1");
|
|
587
|
+
//#endregion
|
|
588
|
+
//#region src/server/http.ts
|
|
589
|
+
/** Who may frame the app's own responses: the app alone (the review's PDF
|
|
590
|
+
* preview). A page elsewhere that frames it can dress a click on it as a
|
|
591
|
+
* click on something of its own. A route that sends a
|
|
592
|
+
* Content-Security-Policy of its own replaces this one, so it names
|
|
593
|
+
* `FRAME_ANCESTORS` too. */
|
|
594
|
+
var FRAME_ANCESTORS = "frame-ancestors 'self'";
|
|
595
|
+
var FRAME_HEADERS = {
|
|
596
|
+
"content-security-policy": FRAME_ANCESTORS,
|
|
597
|
+
"x-frame-options": "SAMEORIGIN"
|
|
598
|
+
};
|
|
599
|
+
/** Error whose `status` the API error-boundary middleware uses for the response. */
|
|
600
|
+
function httpError(status, message) {
|
|
601
|
+
return Object.assign(new Error(message), { status });
|
|
602
|
+
}
|
|
603
|
+
/** The value of a Standard Schema `[value, issues]` pair, or a thrown 400
|
|
604
|
+
* built from the issues. */
|
|
605
|
+
function checked(result, what = "request") {
|
|
606
|
+
const [value, issues] = result;
|
|
607
|
+
if (issues) throw httpError(400, `invalid ${what}: ${issues.map((issue) => issue.message).join("; ")}`);
|
|
608
|
+
return value;
|
|
609
|
+
}
|
|
610
|
+
/** Validated request body, or a thrown 400 built from the valibot issues. */
|
|
611
|
+
async function readBody(ctx) {
|
|
612
|
+
return checked(await ctx.body, "request body");
|
|
613
|
+
}
|
|
428
614
|
//#endregion
|
|
429
615
|
//#region src/client/pref-change.ts
|
|
430
616
|
/** The stored text after `change`, or null when nothing is left. A value
|
|
@@ -904,6 +1090,40 @@ async function readMiseInstalls() {
|
|
|
904
1090
|
} catch {}
|
|
905
1091
|
return out;
|
|
906
1092
|
}
|
|
1093
|
+
/** A path owned by one release of a version manager — mise/asdf
|
|
1094
|
+
* `installs`, homebrew's `Cellar`, nvm's `versions` — which that tool
|
|
1095
|
+
* deletes on its next update. */
|
|
1096
|
+
var VERSIONED_PATH = /\/(installs|Cellar|versions|toolchains)\//;
|
|
1097
|
+
/** The gh for git to run as a credential helper: the launcher on PATH
|
|
1098
|
+
* (mise's shim, /usr/bin/gh), when it is not itself one release's. Still an
|
|
1099
|
+
* absolute path, so it works for GUI clients and cron jobs that never
|
|
1100
|
+
* sourced a shell profile, but one that follows upgrades. */
|
|
1101
|
+
function stableGh() {
|
|
1102
|
+
const gh = which("gh");
|
|
1103
|
+
return gh && !VERSIONED_PATH.test(gh) ? gh : null;
|
|
1104
|
+
}
|
|
1105
|
+
/** Credential helpers in ~/.gitconfig that run a gh which is gone, by
|
|
1106
|
+
* config key. `gh auth setup-git` writes the absolute path of the gh that
|
|
1107
|
+
* ran it, and git runs that string literally: once a version manager's
|
|
1108
|
+
* upgrade deletes it, every https push fails with "could not read
|
|
1109
|
+
* Username" while `gh` itself still works. Listed only when there is a
|
|
1110
|
+
* stable gh to point them at, which `work setup` does. */
|
|
1111
|
+
async function staleGhHelpers() {
|
|
1112
|
+
if (!stableGh()) return [];
|
|
1113
|
+
const { stdout } = await run("git", [
|
|
1114
|
+
"config",
|
|
1115
|
+
"--global",
|
|
1116
|
+
"--get-regexp",
|
|
1117
|
+
String.raw`^credential\..*\.helper$`
|
|
1118
|
+
]);
|
|
1119
|
+
const keys = /* @__PURE__ */ new Set();
|
|
1120
|
+
for (const line of stdout.split("\n")) {
|
|
1121
|
+
const sp = line.indexOf(" ");
|
|
1122
|
+
const bin = /^!(\S+) auth git-credential$/.exec(line.slice(sp + 1))?.[1];
|
|
1123
|
+
if (sp > 0 && bin && !fs.existsSync(bin)) keys.add(line.slice(0, sp));
|
|
1124
|
+
}
|
|
1125
|
+
return [...keys];
|
|
1126
|
+
}
|
|
907
1127
|
/** Hosts `gh` knows about (~/.config/gh/hosts.yml top-level keys) — the
|
|
908
1128
|
* source of truth for "which GitHub hosts has this machine signed in to",
|
|
909
1129
|
* merged with whatever the caller has configured. */
|
|
@@ -1074,11 +1294,12 @@ async function doctor(opts = {}) {
|
|
|
1074
1294
|
...opts.hosts || [],
|
|
1075
1295
|
...ghKnownHosts()
|
|
1076
1296
|
]);
|
|
1077
|
-
const [versions, github, awake, extensions] = await Promise.all([
|
|
1297
|
+
const [versions, github, awake, extensions, helpers] = await Promise.all([
|
|
1078
1298
|
miseVersions(),
|
|
1079
1299
|
Promise.all([...hostSet].map(githubHostStatus)),
|
|
1080
1300
|
canStayAwake(),
|
|
1081
|
-
ghExtensions()
|
|
1301
|
+
ghExtensions(),
|
|
1302
|
+
staleGhHelpers()
|
|
1082
1303
|
]);
|
|
1083
1304
|
const tools = TOOLS.map((t) => {
|
|
1084
1305
|
if (t.ghExtension) {
|
|
@@ -1119,7 +1340,8 @@ async function doctor(opts = {}) {
|
|
|
1119
1340
|
tools,
|
|
1120
1341
|
agents,
|
|
1121
1342
|
github,
|
|
1122
|
-
awake
|
|
1343
|
+
awake,
|
|
1344
|
+
staleGhHelpers: helpers
|
|
1123
1345
|
};
|
|
1124
1346
|
}
|
|
1125
1347
|
//#endregion
|
|
@@ -1142,8 +1364,7 @@ var PREF_MAX = 4096;
|
|
|
1142
1364
|
/** The prefs kept per workspace, keyed `<name>:<workspace id>`. They ride
|
|
1143
1365
|
* every page's HTML, so they go with the workspace (`deleteWorkspacePrefs`)
|
|
1144
1366
|
* and /api/prefs refuses them for one that is gone; one missing here
|
|
1145
|
-
* outlives its workspace for good.
|
|
1146
|
-
* the same list. */
|
|
1367
|
+
* outlives its workspace for good. */
|
|
1147
1368
|
var WORKSPACE_PREFS = [
|
|
1148
1369
|
"tab",
|
|
1149
1370
|
"diff-filter",
|
|
@@ -7385,7 +7606,7 @@ function publishChange(sessionId) {
|
|
|
7385
7606
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
7386
7607
|
if (row?.workspace_id) {
|
|
7387
7608
|
const workspaceId = row.workspace_id;
|
|
7388
|
-
import("./
|
|
7609
|
+
import("./_CkwTsHKB.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
7389
7610
|
return;
|
|
7390
7611
|
}
|
|
7391
7612
|
publish("sessions.changed");
|
|
@@ -9616,28 +9837,12 @@ async function listPanesNow() {
|
|
|
9616
9837
|
};
|
|
9617
9838
|
return panes;
|
|
9618
9839
|
}
|
|
9619
|
-
/** Cleared once per process — boot already runs this, and a server we
|
|
9620
|
-
* create below never has PORT set, so re-running on every attach only
|
|
9621
|
-
* unsets something already unset. */
|
|
9622
|
-
var portCleared = false;
|
|
9623
9840
|
/** Start the tmux server in its own systemd user unit so it escapes this
|
|
9624
9841
|
* service's cgroup — otherwise `systemctl restart work` kills every
|
|
9625
9842
|
* session with it. A hidden "work-keeper" session pins the server alive
|
|
9626
9843
|
* (tmux exits when its last session closes). */
|
|
9627
9844
|
async function ensureTmuxServer() {
|
|
9628
|
-
if (await tmux(["has-session"]).then(() => true, () => false))
|
|
9629
|
-
if (!portCleared) {
|
|
9630
|
-
await tmux([
|
|
9631
|
-
"set-environment",
|
|
9632
|
-
"-g",
|
|
9633
|
-
"-u",
|
|
9634
|
-
"PORT"
|
|
9635
|
-
]).catch(() => {});
|
|
9636
|
-
portCleared = true;
|
|
9637
|
-
}
|
|
9638
|
-
return;
|
|
9639
|
-
}
|
|
9640
|
-
portCleared = true;
|
|
9845
|
+
if (await tmux(["has-session"]).then(() => true, () => false)) return;
|
|
9641
9846
|
await run$1("systemd-run", [
|
|
9642
9847
|
"--user",
|
|
9643
9848
|
`--unit=${TMUX_SOCKET === "work" ? "work-tmux" : `work-tmux-${TMUX_SOCKET.replace(/[^\w.:-]/g, "_")}`}`,
|
|
@@ -9910,4 +10115,4 @@ function sleep(ms) {
|
|
|
9910
10115
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
9911
10116
|
}
|
|
9912
10117
|
//#endregion
|
|
9913
|
-
export { saveSubscription as $,
|
|
10118
|
+
export { saveSubscription as $, swr as $t, clearAgentPhase as A, TOOLS as At, agentBadge as B, readBody as Bt, readHookPayload as C, miseVersions as Ct, realInsideSync as D, which as Dt, realInside as E, tilde as Et, onPhaseChange as F, applyPrefChange as Ft, ACCENT_RE as G, TMUX_SOCKET as Gt, agentFromCommand as H, db as Ht, setAgentPhase as I, FRAME_ANCESTORS as It, manifest as J, gitEnv as Jt, getInstance as K, gh as Kt, setScrapedPhase as L, FRAME_HEADERS as Lt, hookReportedAt as M, agentLabel$1 as Mt, noteBackground as N, catalogPin as Nt, blankRow as O, DEFAULT_GITHUB_HOST as Ot, noteUserAnswered as P, toolById as Pt, pushPublicKey as Q, shared as Qt, setSessionViewers as R, checked as Rt, AGENTS as S, miseInstalls as St, inside as T, stableGh as Tt, agentLabel as U, get as Ut, agentFamily as V, all as Vt, agentMeta as W, workspacePath as Wt, setInstance as X, tmux as Xt, normalizeAccent as Y, run$1 as Yt, deleteSubscription as Z, config 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, withLock as en, 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, agentById as jt, agentPhase as k, PROJECT_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, git 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, httpError as zt };
|