@dylanpiercey/work 0.0.203 → 0.0.205
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/bin/work.mjs +220 -63
- package/dist/_CWyeRc54.js +2 -0
- package/dist/{_B9FeLAO5.js → _C_-lYJlp.js} +394 -114
- package/dist/index.mjs +15157 -13688
- package/dist/public/assets/_-OlchSkR.js +1 -0
- package/dist/public/assets/_2V7v-g6H.js +1 -0
- package/dist/public/assets/_5FuvVnQD.js +1 -0
- package/dist/public/assets/_5izm_sOI.js +1 -0
- package/dist/public/assets/_5izm_sOI.js.br +0 -0
- package/dist/public/assets/_6AplNi7Z.js +1 -0
- package/dist/public/assets/_6AplNi7Z.js.br +0 -0
- package/dist/public/assets/_8YGIApOo.js +1 -0
- package/dist/public/assets/{_DITz3wmu.js → _AHFaCvQU.js} +1 -1
- package/dist/public/assets/_AHFaCvQU.js.br +0 -0
- package/dist/public/assets/_B0mn17Dk.js +1 -0
- package/dist/public/assets/_B0roVhqi.js +1 -0
- package/dist/public/assets/{_Brbaz_V-.js → _B16QFqgy.js} +1 -1
- package/dist/public/assets/_B16QFqgy.js.br +0 -0
- package/dist/public/assets/{_D8WMh6gu.js → _B2f-LxUk.js} +1 -1
- package/dist/public/assets/_B2f-LxUk.js.br +0 -0
- package/dist/public/assets/_B7rzA4Vo.js +1 -0
- package/dist/public/assets/_B7rzA4Vo.js.br +0 -0
- package/dist/public/assets/_B9EmUOCA.js +1 -0
- package/dist/public/assets/_B9EmUOCA.js.br +0 -0
- package/dist/public/assets/_BD9gP_kw.js +1 -0
- package/dist/public/assets/_BD9gP_kw.js.br +0 -0
- package/dist/public/assets/_BDHG8Nmi.js +9 -0
- package/dist/public/assets/_BDHG8Nmi.js.br +0 -0
- package/dist/public/assets/{_Cl7KlO12.js → _BDWKc_9X.js} +1 -1
- package/dist/public/assets/_BDWKc_9X.js.br +0 -0
- package/dist/public/assets/{_BeVk3dbG.js → _BE8KQ5PW.js} +1 -1
- package/dist/public/assets/_BE8KQ5PW.js.br +0 -0
- package/dist/public/assets/{_DCg8UEc3.js → _BFgV8m7c.js} +1 -1
- package/dist/public/assets/_BFgV8m7c.js.br +0 -0
- package/dist/public/assets/_BHZ-Cv2U.js +1 -0
- package/dist/public/assets/{_Do95KzEK.js → _BHcaNOzL.js} +1 -1
- package/dist/public/assets/_BHcaNOzL.js.br +0 -0
- package/dist/public/assets/_BKM2-z0e.js +1 -0
- package/dist/public/assets/_BN0AE2HC.js +1 -0
- package/dist/public/assets/_BNORURCQ.js +1 -0
- package/dist/public/assets/_BNORURCQ.js.br +0 -0
- package/dist/public/assets/_BNm4Ae9_.js +1 -0
- package/dist/public/assets/_BNm4Ae9_.js.br +0 -0
- package/dist/public/assets/_BOm1SpkD.js +1 -0
- package/dist/public/assets/{_C3M50_zF.js → _BPhE-idg.js} +1 -1
- package/dist/public/assets/_BPhE-idg.js.br +0 -0
- package/dist/public/assets/{_Bx5kmADX.js → _BPtQ2PEh.js} +1 -1
- package/dist/public/assets/_BPtQ2PEh.js.br +0 -0
- package/dist/public/assets/_BRGmqkNr.js +1 -0
- package/dist/public/assets/_BRnslEKE.js +1 -0
- package/dist/public/assets/{_B9kU6sMh.js → _BSSQw7B1.js} +1 -1
- package/dist/public/assets/_BSSQw7B1.js.br +0 -0
- package/dist/public/assets/{_CPH47jXm.js → _BUfLoUyd.js} +56 -56
- package/dist/public/assets/_BUfLoUyd.js.br +0 -0
- package/dist/public/assets/{_CRZGR7so.js → _BVLWii1t.js} +1 -1
- package/dist/public/assets/_BVLWii1t.js.br +0 -0
- package/dist/public/assets/{_DEf8mUHj.js → _BWAs5afd.js} +1 -1
- package/dist/public/assets/_BWAs5afd.js.br +0 -0
- package/dist/public/assets/_BYdCKt3O.js +1 -0
- package/dist/public/assets/_B_JOtc1M.js +1 -0
- package/dist/public/assets/_BcXiRBkz.js +1 -0
- package/dist/public/assets/_BgKdTCD6.js +1 -0
- package/dist/public/assets/{_TcqYUNNo.js → _BixjwCO8.js} +1 -1
- package/dist/public/assets/_BixjwCO8.js.br +0 -0
- package/dist/public/assets/_BkQF1UOD.js +1 -0
- package/dist/public/assets/_BkQF1UOD.js.br +0 -0
- package/dist/public/assets/_BpGTzAYy.js +1 -0
- package/dist/public/assets/{_DqAamLSj.js → _Bpf0k8uS.js} +1 -1
- package/dist/public/assets/_Bpf0k8uS.js.br +0 -0
- package/dist/public/assets/{_CljaR6t8.js → _BqizK7cx.js} +1 -1
- package/dist/public/assets/_BqizK7cx.js.br +0 -0
- package/dist/public/assets/{_CArazMIS.js → _BrWsQx9M.js} +1 -1
- package/dist/public/assets/_BrWsQx9M.js.br +0 -0
- package/dist/public/assets/_BrbA4biE.js +1 -0
- package/dist/public/assets/{_CoZYY0F5.js → _Bs2HUAxm.js} +1 -1
- package/dist/public/assets/_Bs2HUAxm.js.br +0 -0
- package/dist/public/assets/_BsWogZkr.js +1 -0
- package/dist/public/assets/_BthptJ6a.js +1 -0
- package/dist/public/assets/_BthptJ6a.js.br +0 -0
- package/dist/public/assets/_BuxlUghc.js +1 -0
- package/dist/public/assets/{_BaiQtGR9.js → _Bv-wpAaO.js} +1 -1
- package/dist/public/assets/_Bv-wpAaO.js.br +0 -0
- package/dist/public/assets/_BvK6PQ1z.js +1 -0
- package/dist/public/assets/{_-K2pkpBq.js → _BytWZ6R5.js} +1 -1
- package/dist/public/assets/_BytWZ6R5.js.br +0 -0
- package/dist/public/assets/_C-OUSTHo.js +1 -0
- package/dist/public/assets/{_C_Lr0eFb.js → _C0Hfu_Ho.js} +1 -1
- package/dist/public/assets/_C0Hfu_Ho.js.br +0 -0
- package/dist/public/assets/_C0ztthm_.js +1 -0
- package/dist/public/assets/{_Dq-Jad5X.js → _C2DkGqn5.js} +1 -1
- package/dist/public/assets/_C2DkGqn5.js.br +0 -0
- package/dist/public/assets/{_DFjp3R_E.js → _C33cmCxX.js} +1 -1
- package/dist/public/assets/_C33cmCxX.js.br +0 -0
- package/dist/public/assets/{_B80CP8fn.js → _C3ShTfoQ.js} +1 -1
- package/dist/public/assets/_C3ShTfoQ.js.br +0 -0
- package/dist/public/assets/_C3tVbCBH.js +1 -0
- package/dist/public/assets/_C6M1hDWV.js +1 -0
- package/dist/public/assets/_C6P-6sWK.js +1 -0
- package/dist/public/assets/_C78RESm0.js +1 -0
- package/dist/public/assets/_C7z3JBX0.js +1 -0
- package/dist/public/assets/_C8-cikmx.js +1 -0
- package/dist/public/assets/_C9thRVyr.js +1 -0
- package/dist/public/assets/{_GnLkrWZM.js → _CBBTd56s.js} +1 -1
- package/dist/public/assets/_CBBTd56s.js.br +0 -0
- package/dist/public/assets/_CEGHO2aQ.js +1 -0
- package/dist/public/assets/{_BZ3C3l3R.js → _CFF1bIG3.js} +1 -1
- package/dist/public/assets/_CFF1bIG3.js.br +0 -0
- package/dist/public/assets/{_vunrMsGK.js → _CGmOePAM.js} +1 -1
- package/dist/public/assets/_CGmOePAM.js.br +0 -0
- package/dist/public/assets/_CHOAR75o.js +1 -0
- package/dist/public/assets/_CIK0aYGO.js +1422 -0
- package/dist/public/assets/_CIK0aYGO.js.br +0 -0
- package/dist/public/assets/_CIM_QKij.js +1 -0
- package/dist/public/assets/_CJzM23DW.js +2 -0
- package/dist/public/assets/_CJzM23DW.js.br +0 -0
- package/dist/public/assets/_CK5CtA9f.js +1 -0
- package/dist/public/assets/_CLVYQ-74.js +1 -0
- package/dist/public/assets/_CLVYQ-74.js.br +0 -0
- package/dist/public/assets/{_up7lLRgA.js → _CLeF1FF3.js} +1 -1
- package/dist/public/assets/_CPm0qMfS.js +1 -0
- package/dist/public/assets/_CQWTMS1P.js +1 -0
- package/dist/public/assets/_CQWTMS1P.js.br +0 -0
- package/dist/public/assets/_CQgVf_hl.js +1 -0
- package/dist/public/assets/_CRzep8vQ.js +1 -0
- package/dist/public/assets/_CVY_H9pO.js +1 -0
- package/dist/public/assets/_CVlglWWP.js +1 -0
- package/dist/public/assets/_CYtOhTGb.js +1 -0
- package/dist/public/assets/_CZP-vnK2.js +1 -0
- package/dist/public/assets/_CZP-vnK2.js.br +0 -0
- package/dist/public/assets/_C_aWNVgg.js +1 -0
- package/dist/public/assets/_C_fU39wg.js +1 -0
- package/dist/public/assets/{_CSmKiIv8.js → _CaWlTbQM.js} +1 -1
- package/dist/public/assets/_Ca_UkEY3.js +1 -0
- package/dist/public/assets/_Ca_UkEY3.js.br +8 -0
- package/dist/public/assets/_CbKQ4tM7.js +1 -0
- package/dist/public/assets/_CbndvCa9.js +1 -0
- package/dist/public/assets/_CdgFbcw6.js +1 -0
- package/dist/public/assets/_Cf0kh0ya.js +1 -0
- package/dist/public/assets/_Cf0kh0ya.js.br +0 -0
- package/dist/public/assets/_CffIUDL_.js +1 -0
- package/dist/public/assets/_CffIUDL_.js.br +0 -0
- package/dist/public/assets/_CfrSfMqj.js +1 -0
- package/dist/public/assets/_CfrSfMqj.js.br +0 -0
- package/dist/public/assets/_CoHLhCNH.js +1 -0
- package/dist/public/assets/{_D07_FXWo.js → _CpK94htG.js} +1 -1
- package/dist/public/assets/_CqrXDSP9.js +1 -0
- package/dist/public/assets/_Csdgg-p8.js +1 -0
- package/dist/public/assets/_Csdgg-p8.js.br +0 -0
- package/dist/public/assets/{_C0K-WRJD.js → _Csvc0jmZ.js} +1 -1
- package/dist/public/assets/_Csvc0jmZ.js.br +0 -0
- package/dist/public/assets/_CtdLytfI.js +1 -0
- package/dist/public/assets/{_S99TppFt.js → _CtxNwohv.js} +1 -1
- package/dist/public/assets/_CtxNwohv.js.br +0 -0
- package/dist/public/assets/_CuApWap_.js +86 -0
- package/dist/public/assets/_CuApWap_.js.br +0 -0
- package/dist/public/assets/_CvBjVI0v.js +1 -0
- package/dist/public/assets/_CwZRDJQ2.js +1 -0
- package/dist/public/assets/_CwZRDJQ2.js.br +0 -0
- package/dist/public/assets/_CxyFAuJT.js +1 -0
- package/dist/public/assets/_CxyFAuJT.js.br +0 -0
- package/dist/public/assets/_D00q6XFi.js +1 -0
- package/dist/public/assets/_D00q6XFi.js.br +0 -0
- package/dist/public/assets/{_8Q9P2uHp.js → _D0rv_4FK.js} +1 -1
- package/dist/public/assets/_D0rv_4FK.js.br +0 -0
- package/dist/public/assets/{_CJoG6S3-.js → _D478nKDM.js} +1 -1
- package/dist/public/assets/_D478nKDM.js.br +0 -0
- package/dist/public/assets/{_CXBw8HMs.js → _D5W5ntHo.js} +1 -1
- package/dist/public/assets/_D5W5ntHo.js.br +0 -0
- package/dist/public/assets/_D5guyfCP.js +1 -0
- package/dist/public/assets/{_3ewKhZLc.js → _D7FiuTy-.js} +1 -1
- package/dist/public/assets/_D7FiuTy-.js.br +0 -0
- package/dist/public/assets/_DA1hU7GY.js +1 -0
- package/dist/public/assets/_DAGUL1Vl.js +6 -0
- package/dist/public/assets/_DAGUL1Vl.js.br +0 -0
- package/dist/public/assets/{_gkUCl--6.js → _DCaVKBqt.js} +1 -1
- package/dist/public/assets/_DCaVKBqt.js.br +0 -0
- package/dist/public/assets/_DFRZGT2q.js +1 -0
- package/dist/public/assets/_DFRZGT2q.js.br +0 -0
- package/dist/public/assets/_DGDoR_gX.js +1 -0
- package/dist/public/assets/_DGDoR_gX.js.br +0 -0
- package/dist/public/assets/_DJl1sf70.js +1 -0
- package/dist/public/assets/_DMGdwfSr.js +1 -0
- package/dist/public/assets/_DMGdwfSr.js.br +0 -0
- package/dist/public/assets/{_CrONT8um.js → _DMdBg_GK.js} +1 -1
- package/dist/public/assets/_DMdBg_GK.js.br +0 -0
- package/dist/public/assets/{_DVs9_2EC.js → _DPOlYZjX.js} +1 -1
- package/dist/public/assets/_DPOlYZjX.js.br +0 -0
- package/dist/public/assets/{_DH7j4yfd.js → _DSCUag9O.js} +1 -1
- package/dist/public/assets/_DSCUag9O.js.br +0 -0
- package/dist/public/assets/_DUzx5eZR.js +1 -0
- package/dist/public/assets/_DUzx5eZR.js.br +0 -0
- package/dist/public/assets/{_BDdtj9Cq.js → _DV0W2yTo.js} +1 -1
- package/dist/public/assets/_DV0W2yTo.js.br +0 -0
- package/dist/public/assets/_DW6rnS22.js +1 -0
- package/dist/public/assets/_DW6rnS22.js.br +0 -0
- package/dist/public/assets/_DY6s_kAl.js +1 -0
- package/dist/public/assets/{_rHKeW7zh.js → _Da0Zcyhl.js} +1 -1
- package/dist/public/assets/_Dbyzv-e6.js +1 -0
- package/dist/public/assets/_Dbyzv-e6.js.br +0 -0
- package/dist/public/assets/{_B66w2fqU.js → _DcFRlTYB.js} +1 -1
- package/dist/public/assets/_DcFRlTYB.js.br +0 -0
- package/dist/public/assets/_DiThv-ws.js +1 -0
- package/dist/public/assets/_Djho-FAH.js +1 -0
- package/dist/public/assets/_Djho-FAH.js.br +0 -0
- package/dist/public/assets/_DkfyvJLz.js +1 -0
- package/dist/public/assets/_DmdewGjf.js +1 -0
- package/dist/public/assets/{_DY6PUWO1.js → _DnhVTHg1.js} +1 -1
- package/dist/public/assets/_DnhVTHg1.js.br +0 -0
- package/dist/public/assets/_Dq4Lv0Cs.js +1 -0
- package/dist/public/assets/_Dq4Lv0Cs.js.br +0 -0
- package/dist/public/assets/_DqxOu378.js +1 -0
- package/dist/public/assets/{_BmZVM8Ww.js → _DrpXP57c.js} +1 -1
- package/dist/public/assets/_DrpXP57c.js.br +0 -0
- package/dist/public/assets/{_DmGawoV0.js → _DsAV3t8S.js} +1 -1
- package/dist/public/assets/_DsAV3t8S.js.br +0 -0
- package/dist/public/assets/{_q4Q8wf1-.js → _DvNEiAgs.js} +1 -1
- package/dist/public/assets/_DvNEiAgs.js.br +0 -0
- package/dist/public/assets/{_e-EoIF14.js → _Dvu8aO9d.js} +1 -1
- package/dist/public/assets/_Dvu8aO9d.js.br +0 -0
- package/dist/public/assets/_DyUJCQsE.js +1 -0
- package/dist/public/assets/_DyUJCQsE.js.br +0 -0
- package/dist/public/assets/_DzJPXetd.js +1 -0
- package/dist/public/assets/_DzJPXetd.js.br +0 -0
- package/dist/public/assets/{_CkwMzG0u.js → _DzOgre70.js} +1 -1
- package/dist/public/assets/_DzOgre70.js.br +0 -0
- package/dist/public/assets/_FXPfeF9Q.js +1 -0
- package/dist/public/assets/{_CKO6VeWe.js → _G6zi9_6i.js} +1 -1
- package/dist/public/assets/_G6zi9_6i.js.br +0 -0
- package/dist/public/assets/_I2leMoLk.js +1 -0
- package/dist/public/assets/_IWsH3JbM.js +1 -0
- package/dist/public/assets/{_DhHO6Tuz.js → _Jsehj7rl.js} +1 -1
- package/dist/public/assets/_Jsehj7rl.js.br +0 -0
- package/dist/public/assets/_NGMwjBBG.js +1 -0
- package/dist/public/assets/{_Bwo88m9W.js → _QljbgS5l.js} +1 -1
- package/dist/public/assets/_QljbgS5l.js.br +0 -0
- package/dist/public/assets/{_CgLkQJNG.js → _Z8l8zhFZ.js} +1 -1
- package/dist/public/assets/_Z8l8zhFZ.js.br +0 -0
- package/dist/public/assets/__GnUfSxE.js +1 -0
- package/dist/public/assets/__GnUfSxE.js.br +0 -0
- package/dist/public/assets/_cD7JRpZk.js +1 -0
- package/dist/public/assets/_dP2ZLG1O.js +1 -0
- package/dist/public/assets/_dP2ZLG1O.js.br +0 -0
- package/dist/public/assets/_fQTAXQ2A.js +1 -0
- package/dist/public/assets/_fQTAXQ2A.js.br +0 -0
- package/dist/public/assets/_gIJHrFck.js +1 -0
- package/dist/public/assets/_gIJHrFck.js.br +0 -0
- package/dist/public/assets/{_BERyw-_I.js → _iqlUPvpu.js} +1 -1
- package/dist/public/assets/_iqlUPvpu.js.br +0 -0
- package/dist/public/assets/_m2OvafhN.js +1 -0
- package/dist/public/assets/_mNtBBYrx.js +1 -0
- package/dist/public/assets/_o4vB6uaf.js +1 -0
- package/dist/public/assets/{_DSn_einI.js → _pTRVL6_Z.js} +1 -1
- package/dist/public/assets/_pTRVL6_Z.js.br +0 -0
- package/dist/public/assets/_sayhcKVq.js +1 -0
- package/dist/public/assets/_sdf2KG0s.js +1 -0
- package/dist/public/assets/_sdf2KG0s.js.br +0 -0
- package/dist/public/assets/_tsg5j2Lv.js +1 -0
- package/dist/public/assets/_uTzPJzX0.js +1 -0
- package/dist/public/assets/_vIGuFBIb.js +1 -0
- package/dist/public/assets/_vIGuFBIb.js.br +0 -0
- package/dist/public/assets/_yJE0vu9j.js +1 -0
- package/dist/public/assets/_yJE0vu9j.js.br +0 -0
- package/dist/public/assets/_z9XIIgTI.js +1 -0
- package/dist/public/assets/{app-page-a-M15PMY.css → app-shell-8Pd1rc7u.css} +1 -1
- package/dist/public/assets/app-shell-8Pd1rc7u.css.br +0 -0
- package/dist/public/assets/command-palette-B4o6jF8Z.css +1 -0
- package/dist/public/assets/command-palette-B4o6jF8Z.css.br +0 -0
- package/dist/public/assets/files-view-BnN1VOCi.css +1 -0
- package/dist/public/assets/files-view-BnN1VOCi.css.br +0 -0
- package/dist/public/assets/files-view-cAPnyoQZ.js +2 -0
- package/dist/public/assets/group.css.ts-CXNej9ok.css +1 -0
- package/dist/public/assets/group.css.ts-CXNej9ok.css.br +0 -0
- package/dist/public/assets/{icon-search-CiIAr7NA.css → icon-search-DcAn99Uv.css} +1 -1
- package/dist/public/assets/icon-search-DcAn99Uv.css.br +0 -0
- package/dist/public/assets/manage-workspace-BMzLgYX3.css +1 -0
- package/dist/public/assets/manage-workspace-DhLNff0-.js +2 -0
- package/dist/public/assets/new-BqXHbQlu.js +1 -0
- package/dist/public/assets/new-workspace-B3ylje_g.css +1 -0
- package/dist/public/assets/new-workspace-B3ylje_g.css.br +0 -0
- package/dist/public/assets/new-workspace-RR8h-qIh.js +2 -0
- package/dist/public/assets/port-chip-Bt0w2MzG.css +1 -0
- package/dist/public/assets/port-chip-Bt0w2MzG.css.br +0 -0
- package/dist/public/assets/prompt-dialog-B_qzbXMZ.css +1 -0
- package/dist/public/assets/prompt-dialog-B_qzbXMZ.css.br +0 -0
- package/dist/public/assets/quick-open-CXyrWkbA.css +1 -0
- package/dist/public/assets/quick-open-CXyrWkbA.css.br +0 -0
- package/dist/public/assets/repo-picker-CpKpWL1n.css +1 -0
- package/dist/public/assets/repo-picker-CpKpWL1n.css.br +0 -0
- package/dist/public/assets/review-view-CTtdvipj.js +2 -0
- package/dist/public/assets/review-view-tq2OyY98.css +1 -0
- package/dist/public/assets/review-view-tq2OyY98.css.br +0 -0
- package/dist/public/assets/section-D7RUq5Cz.css +1 -0
- package/dist/public/assets/section-D7RUq5Cz.css.br +0 -0
- package/dist/public/assets/settings-BqXHbQlu.js +1 -0
- package/dist/public/assets/settings-page-Btvx32iZ.js +2 -0
- package/dist/public/assets/settings-page-Cnmgnr_0.css +1 -0
- package/dist/public/assets/settings-page-Cnmgnr_0.css.br +0 -0
- package/dist/public/assets/skill-row-CyviHufk.css +1 -0
- package/dist/public/assets/sso-auth-BRNOE7tU.css +1 -0
- package/dist/public/assets/sso-auth-BRNOE7tU.css.br +0 -0
- package/dist/public/assets/w-BqXHbQlu.js +1 -0
- package/dist/public/assets/w._-BqXHbQlu.js +1 -0
- package/dist/public/assets/w._-Nf-ixmkH.js +1 -0
- package/dist/public/assets/w._-cjUl7ond.js +1 -0
- package/dist/public/assets/worker-hkE5tvP8.js +164 -0
- package/dist/public/assets/worker-hkE5tvP8.js.br +0 -0
- package/lib/review/markdown.mjs +23 -11
- package/lib/setup/doctor.d.mts +5 -0
- package/lib/setup/doctor.mjs +31 -1
- package/lib/setup/install.mjs +68 -9
- package/lib/setup/listen.d.mts +5 -0
- package/lib/setup/listen.mjs +23 -0
- package/lib/share/manifest.mjs +8 -3
- package/package.json +7 -7
- package/scripts/migrate.mjs +169 -89
- package/dist/_7W8iLTql.js +0 -2
- package/dist/public/assets/_-K2pkpBq.js.br +0 -0
- package/dist/public/assets/_-O6dm4G6.js +0 -1
- package/dist/public/assets/_-tNsWCRW.js +0 -1
- package/dist/public/assets/_3aic_W0y.js +0 -1
- package/dist/public/assets/_3ewKhZLc.js.br +0 -0
- package/dist/public/assets/_3xHfzmVK.js +0 -1
- package/dist/public/assets/_3xHfzmVK.js.br +0 -0
- package/dist/public/assets/_772AjyQx.js +0 -1
- package/dist/public/assets/_772AjyQx.js.br +0 -0
- package/dist/public/assets/_8Q9P2uHp.js.br +0 -0
- package/dist/public/assets/_AoYqPW6v.js +0 -1
- package/dist/public/assets/_AoYqPW6v.js.br +0 -0
- package/dist/public/assets/_B1q5pQla.js +0 -1
- package/dist/public/assets/_B1q5pQla.js.br +0 -0
- package/dist/public/assets/_B66w2fqU.js.br +0 -0
- package/dist/public/assets/_B80CP8fn.js.br +0 -0
- package/dist/public/assets/_B9FnTf4h.js +0 -1
- package/dist/public/assets/_B9kU6sMh.js.br +0 -0
- package/dist/public/assets/_BADK8qnN.js +0 -1
- package/dist/public/assets/_BADK8qnN.js.br +0 -0
- package/dist/public/assets/_BD2qsrlz.js +0 -1
- package/dist/public/assets/_BDdtj9Cq.js.br +0 -0
- package/dist/public/assets/_BERyw-_I.js.br +0 -0
- package/dist/public/assets/_BH5mQvfn.js +0 -1
- package/dist/public/assets/_BK0E9Er2.js +0 -1
- package/dist/public/assets/_BK0E9Er2.js.br +0 -0
- package/dist/public/assets/_BKkFTJtI.js +0 -1
- package/dist/public/assets/_BKkFTJtI.js.br +0 -0
- package/dist/public/assets/_BOBHk1-a.js +0 -1
- package/dist/public/assets/_BOk1AEgN.js +0 -1
- package/dist/public/assets/_BZ3C3l3R.js.br +0 -0
- package/dist/public/assets/_BaiQtGR9.js.br +0 -0
- package/dist/public/assets/_BdUIic1U.js +0 -1
- package/dist/public/assets/_BdUIic1U.js.br +0 -0
- package/dist/public/assets/_BeVk3dbG.js.br +0 -0
- package/dist/public/assets/_Bedi1JZC.js +0 -1
- package/dist/public/assets/_BgCpq5St.js +0 -1
- package/dist/public/assets/_BjXiH2oW.js +0 -1
- package/dist/public/assets/_BjXiH2oW.js.br +0 -0
- package/dist/public/assets/_Bk31AYSk.js +0 -1
- package/dist/public/assets/_Bk31AYSk.js.br +0 -0
- package/dist/public/assets/_BmZVM8Ww.js.br +0 -0
- package/dist/public/assets/_BqgMkZ3f.js +0 -1
- package/dist/public/assets/_Brbaz_V-.js.br +0 -0
- package/dist/public/assets/_Bs9HVA9T.js +0 -1
- package/dist/public/assets/_Bwo88m9W.js.br +0 -0
- package/dist/public/assets/_Bx5kmADX.js.br +0 -0
- package/dist/public/assets/_BzU-RPev.js +0 -1
- package/dist/public/assets/_BzVRtEsz.js +0 -1
- package/dist/public/assets/_C0K-WRJD.js.br +0 -0
- package/dist/public/assets/_C3M50_zF.js.br +0 -0
- package/dist/public/assets/_C5l9z0N5.js +0 -1
- package/dist/public/assets/_CArazMIS.js.br +0 -0
- package/dist/public/assets/_CBZB5Yxv.js +0 -1
- package/dist/public/assets/_CBZB5Yxv.js.br +0 -0
- package/dist/public/assets/_CCDOu5-k.js +0 -1
- package/dist/public/assets/_CCDOu5-k.js.br +0 -0
- package/dist/public/assets/_CCnHpcK_.js +0 -1
- package/dist/public/assets/_CDMh_Czk.js +0 -1
- package/dist/public/assets/_CE_CwnMm.js +0 -1
- package/dist/public/assets/_CG4M2EXP.js +0 -1
- package/dist/public/assets/_CHEpaVmI.js +0 -1
- package/dist/public/assets/_CHEpaVmI.js.br +0 -0
- package/dist/public/assets/_CHxSYsqp.js +0 -1
- package/dist/public/assets/_CJMlU8h-.js +0 -1
- package/dist/public/assets/_CJoG6S3-.js.br +0 -0
- package/dist/public/assets/_CKO6VeWe.js.br +0 -0
- package/dist/public/assets/_COzp254y.js +0 -1
- package/dist/public/assets/_CPH47jXm.js.br +0 -0
- package/dist/public/assets/_CRZGR7so.js.br +0 -0
- package/dist/public/assets/_CTPBS0LC.js +0 -1
- package/dist/public/assets/_CTPBS0LC.js.br +0 -0
- package/dist/public/assets/_CThA4lbu.js +0 -1
- package/dist/public/assets/_CThA4lbu.js.br +0 -0
- package/dist/public/assets/_CXBw8HMs.js.br +0 -0
- package/dist/public/assets/_CXzJ6bil.js +0 -1
- package/dist/public/assets/_CYUNskmo.js +0 -1
- package/dist/public/assets/_CYUNskmo.js.br +0 -0
- package/dist/public/assets/_C_Lr0eFb.js.br +0 -0
- package/dist/public/assets/_CbnW4odW.js +0 -1
- package/dist/public/assets/_Cfuem2T_.js +0 -1
- package/dist/public/assets/_Cg-uvNvy.js +0 -1
- package/dist/public/assets/_Cg-uvNvy.js.br +0 -0
- package/dist/public/assets/_CgLkQJNG.js.br +0 -0
- package/dist/public/assets/_CkwMzG0u.js.br +0 -0
- package/dist/public/assets/_Cl7KlO12.js.br +0 -0
- package/dist/public/assets/_ClSzF1-k.js +0 -1
- package/dist/public/assets/_CljaR6t8.js.br +0 -0
- package/dist/public/assets/_CoZYY0F5.js.br +0 -0
- package/dist/public/assets/_CpposQLo.js +0 -1
- package/dist/public/assets/_CpposQLo.js.br +0 -0
- package/dist/public/assets/_CrONT8um.js.br +0 -0
- package/dist/public/assets/_Cu1guAvn.js +0 -1
- package/dist/public/assets/_CygSeSG1.js +0 -1
- package/dist/public/assets/_CygSeSG1.js.br +0 -0
- package/dist/public/assets/_Czf21qbL.js +0 -1
- package/dist/public/assets/_D-2kyUyG.js +0 -9
- package/dist/public/assets/_D-2kyUyG.js.br +0 -0
- package/dist/public/assets/_D3Je7YVw.js +0 -1
- package/dist/public/assets/_D4xPo0HZ.js +0 -1
- package/dist/public/assets/_D605QHvK.js +0 -1
- package/dist/public/assets/_D8WMh6gu.js.br +0 -0
- package/dist/public/assets/_D8ve50C6.js +0 -1
- package/dist/public/assets/_D8ve50C6.js.br +0 -0
- package/dist/public/assets/_D9b8PlSh.js +0 -2640
- package/dist/public/assets/_D9b8PlSh.js.br +0 -0
- package/dist/public/assets/_D9cUlE3a.js +0 -1
- package/dist/public/assets/_D9cUlE3a.js.br +0 -0
- package/dist/public/assets/_DCg8UEc3.js.br +0 -0
- package/dist/public/assets/_DEf8mUHj.js.br +0 -0
- package/dist/public/assets/_DFjp3R_E.js.br +0 -0
- package/dist/public/assets/_DGLS_XIM.js +0 -1
- package/dist/public/assets/_DH7j4yfd.js.br +0 -0
- package/dist/public/assets/_DITz3wmu.js.br +0 -0
- package/dist/public/assets/_DIbtkkt7.js +0 -1
- package/dist/public/assets/_DIhhsT9E.js +0 -1
- package/dist/public/assets/_DJ16po4M.js +0 -1
- package/dist/public/assets/_DKPOXVYN.js +0 -1
- package/dist/public/assets/_DKPOXVYN.js.br +0 -0
- package/dist/public/assets/_DMVwpwke.js +0 -1
- package/dist/public/assets/_DMVwpwke.js.br +0 -0
- package/dist/public/assets/_DMWaKaIG.js +0 -1
- package/dist/public/assets/_DOXCLF1P.js +0 -1
- package/dist/public/assets/_DQYtsGep.js +0 -1
- package/dist/public/assets/_DRNYHvLK.js +0 -86
- package/dist/public/assets/_DRNYHvLK.js.br +0 -0
- package/dist/public/assets/_DSn_einI.js.br +0 -0
- package/dist/public/assets/_DVs9_2EC.js.br +0 -0
- package/dist/public/assets/_DY6PUWO1.js.br +0 -0
- package/dist/public/assets/_DYq5I1a_.js +0 -1
- package/dist/public/assets/_DZaWjeov.js +0 -1
- package/dist/public/assets/_DZaWjeov.js.br +0 -0
- package/dist/public/assets/_D_zYO-l8.js +0 -1
- package/dist/public/assets/_D_zYO-l8.js.br +0 -0
- package/dist/public/assets/_Db15f2uj.js +0 -1
- package/dist/public/assets/_DcyKrmeq.js +0 -1
- package/dist/public/assets/_DdfXpdn_.js +0 -1
- package/dist/public/assets/_DdfXpdn_.js.br +0 -0
- package/dist/public/assets/_DevPwgsp.js +0 -1
- package/dist/public/assets/_DgwVeEsD.js +0 -6
- package/dist/public/assets/_DgwVeEsD.js.br +0 -0
- package/dist/public/assets/_DhHO6Tuz.js.br +0 -0
- package/dist/public/assets/_DkSuDAhs.js +0 -1
- package/dist/public/assets/_DmGawoV0.js.br +0 -0
- package/dist/public/assets/_DnlCrUDV.js +0 -2
- package/dist/public/assets/_DnlCrUDV.js.br +0 -0
- package/dist/public/assets/_Do95KzEK.js.br +0 -0
- package/dist/public/assets/_Dob_Fmbm.js +0 -1
- package/dist/public/assets/_Dq-Jad5X.js.br +0 -0
- package/dist/public/assets/_DqAamLSj.js.br +0 -0
- package/dist/public/assets/_DsT0GWgJ.js +0 -1
- package/dist/public/assets/_Ds_ya4mr.js +0 -1
- package/dist/public/assets/_Dsv1qAjm.js +0 -1
- package/dist/public/assets/_Dsv1qAjm.js.br +0 -0
- package/dist/public/assets/_DuR6ueoD.js +0 -1
- package/dist/public/assets/_Dy4QBSz2.js +0 -1
- package/dist/public/assets/_GHV_3jJp.js +0 -1
- package/dist/public/assets/_GN2ORfhz.js +0 -1
- package/dist/public/assets/_GnLkrWZM.js.br +0 -0
- package/dist/public/assets/_IsgXwMDs.js +0 -1
- package/dist/public/assets/_ItxI9nk3.js +0 -1
- package/dist/public/assets/_ItxI9nk3.js.br +0 -0
- package/dist/public/assets/_IzVuLVN1.js +0 -1
- package/dist/public/assets/_JekmkJTS.js +0 -1
- package/dist/public/assets/_JekmkJTS.js.br +0 -0
- package/dist/public/assets/_KiUN85cI.js +0 -1
- package/dist/public/assets/_NeT1bfJI.js +0 -1
- package/dist/public/assets/_QWPZ0V06.js +0 -1
- package/dist/public/assets/_Qs4Lwkwv.js +0 -1
- package/dist/public/assets/_Qs4Lwkwv.js.br +0 -0
- package/dist/public/assets/_RNDgNS1c.js +0 -1
- package/dist/public/assets/_RVKQdbGj.js +0 -1
- package/dist/public/assets/_RwgpF7LC.js +0 -1
- package/dist/public/assets/_RwgpF7LC.js.br +0 -0
- package/dist/public/assets/_S99TppFt.js.br +0 -0
- package/dist/public/assets/_S_seG_by.js +0 -1
- package/dist/public/assets/_TcqYUNNo.js.br +0 -0
- package/dist/public/assets/_WkU7AijT.js +0 -1
- package/dist/public/assets/__bV-79mJ.js +0 -1
- package/dist/public/assets/_e-EoIF14.js.br +0 -0
- package/dist/public/assets/_eutX35zw.js +0 -1
- package/dist/public/assets/_eutX35zw.js.br +0 -0
- package/dist/public/assets/_gkUCl--6.js.br +0 -0
- package/dist/public/assets/_kmXANkGr.js +0 -1
- package/dist/public/assets/_kmXANkGr.js.br +0 -0
- package/dist/public/assets/_kqic6B_q.js +0 -1
- package/dist/public/assets/_kqic6B_q.js.br +0 -0
- package/dist/public/assets/_oXuFhEmo.js +0 -1
- package/dist/public/assets/_q4Q8wf1-.js.br +0 -0
- package/dist/public/assets/_ryYtmLmM.js +0 -1
- package/dist/public/assets/_tHa-ZHkQ.js +0 -1
- package/dist/public/assets/_vunrMsGK.js.br +0 -0
- package/dist/public/assets/_wjT9tLjb.js +0 -1
- package/dist/public/assets/_wjT9tLjb.js.br +0 -0
- package/dist/public/assets/_xw7rRdJa.js +0 -1
- package/dist/public/assets/_y1uwlPvR.js +0 -1
- package/dist/public/assets/_z3bkSqoV.js +0 -1
- package/dist/public/assets/_z3bkSqoV.js.br +0 -0
- package/dist/public/assets/app-page-a-M15PMY.css.br +0 -0
- package/dist/public/assets/command-palette-DnTWF_r2.css +0 -1
- package/dist/public/assets/command-palette-DnTWF_r2.css.br +0 -0
- package/dist/public/assets/files-view-C_Ak1o_u.css +0 -1
- package/dist/public/assets/files-view-C_Ak1o_u.css.br +0 -0
- package/dist/public/assets/files-view-D29gwNTU.js +0 -2
- package/dist/public/assets/group.css.ts-bSDNRl7w.css +0 -1
- package/dist/public/assets/group.css.ts-bSDNRl7w.css.br +0 -0
- package/dist/public/assets/icon-search-CiIAr7NA.css.br +0 -0
- package/dist/public/assets/key-bar.css.ts-Bku3uER9.css +0 -1
- package/dist/public/assets/key-bar.css.ts-Bku3uER9.css.br +0 -0
- package/dist/public/assets/manage-workspace-FNt9673q.css +0 -1
- package/dist/public/assets/manage-workspace-LPUu3-Rp.js +0 -2
- package/dist/public/assets/new-pJJ6ZABY.js +0 -1
- package/dist/public/assets/new-workspace-Bj3jwBnp.css +0 -1
- package/dist/public/assets/new-workspace-Bj3jwBnp.css.br +0 -0
- package/dist/public/assets/new-workspace-Cukm9rzJ.js +0 -2
- package/dist/public/assets/port-chip-B2VAUY_i.css +0 -1
- package/dist/public/assets/port-chip-B2VAUY_i.css.br +0 -0
- package/dist/public/assets/prompt-dialog-CtmcwmFw.css +0 -1
- package/dist/public/assets/prompt-dialog-CtmcwmFw.css.br +0 -0
- package/dist/public/assets/quick-open-CuR4WzpL.css +0 -1
- package/dist/public/assets/quick-open-CuR4WzpL.css.br +0 -0
- package/dist/public/assets/repo-picker-DFTPYkNQ.css +0 -1
- package/dist/public/assets/repo-picker-DFTPYkNQ.css.br +0 -2
- package/dist/public/assets/review-view-B6bsrcls.css +0 -1
- package/dist/public/assets/review-view-B6bsrcls.css.br +0 -0
- package/dist/public/assets/review-view-BNyQ646Y.js +0 -2
- package/dist/public/assets/section-aiv_79hg.css +0 -1
- package/dist/public/assets/section-aiv_79hg.css.br +0 -0
- package/dist/public/assets/settings-pJJ6ZABY.js +0 -1
- package/dist/public/assets/settings-page-DAwtsEQ9.css +0 -1
- package/dist/public/assets/settings-page-DAwtsEQ9.css.br +0 -0
- package/dist/public/assets/settings-page-DsbRNeSq.js +0 -2
- package/dist/public/assets/skill-row-bJ0ycL8_.css +0 -1
- package/dist/public/assets/sso-auth-JILClN0h.css +0 -1
- package/dist/public/assets/sso-auth-JILClN0h.css.br +0 -0
- package/dist/public/assets/w-pJJ6ZABY.js +0 -1
- package/dist/public/assets/w._-C4FeaeOO.js +0 -1
- package/dist/public/assets/w._-DChqn_ll.js +0 -1
- package/dist/public/assets/w._-pJJ6ZABY.js +0 -1
- package/dist/public/assets/worker-BK3lyuKh.js +0 -164
- package/dist/public/assets/worker-BK3lyuKh.js.br +0 -0
|
@@ -3,11 +3,44 @@ 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
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import os from "node:os";
|
|
7
6
|
import { execFile, execFileSync } from "node:child_process";
|
|
7
|
+
import os from "node:os";
|
|
8
8
|
import { promisify } from "node:util";
|
|
9
9
|
import { DatabaseSync } from "node:sqlite";
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
11
|
+
//#region src/server/http.ts
|
|
12
|
+
/** Error whose `status` the API error-boundary middleware uses for the response. */
|
|
13
|
+
function httpError(status, message) {
|
|
14
|
+
return Object.assign(new Error(message), { status });
|
|
15
|
+
}
|
|
16
|
+
/** The value of a Standard Schema `[value, issues]` pair, or a thrown 400
|
|
17
|
+
* built from the issues. */
|
|
18
|
+
function checked(result, what = "request") {
|
|
19
|
+
const [value, issues] = result;
|
|
20
|
+
if (issues) throw httpError(400, `invalid ${what}: ${issues.map((issue) => issue.message).join("; ")}`);
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
/** Validated request body, or a thrown 400 built from the valibot issues. */
|
|
24
|
+
async function readBody(ctx) {
|
|
25
|
+
return checked(await ctx.body, "request body");
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region lib/setup/listen.mjs
|
|
29
|
+
/** Addresses that mean every interface. */
|
|
30
|
+
var EVERY = /* @__PURE__ */ new Set([
|
|
31
|
+
"0.0.0.0",
|
|
32
|
+
"::",
|
|
33
|
+
"*"
|
|
34
|
+
]);
|
|
35
|
+
/** The host to dial the server at, for WORK_LISTEN: loopback when it
|
|
36
|
+
* listens on every interface or is unset, else the one address it listens
|
|
37
|
+
* on (a server bound to `::1` or a LAN address refuses 127.0.0.1), bracketed
|
|
38
|
+
* when IPv6 so it can go in a URL. */
|
|
39
|
+
function dialHost(listen) {
|
|
40
|
+
if (!listen || EVERY.has(listen)) return "127.0.0.1";
|
|
41
|
+
return listen.includes(":") ? `[${listen}]` : listen;
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
11
44
|
//#region src/server/config.ts
|
|
12
45
|
var rawHome = os.homedir();
|
|
13
46
|
var home$1 = rawHome && rawHome !== "undefined" && rawHome !== "null" ? rawHome : "";
|
|
@@ -42,6 +75,12 @@ var config = {
|
|
|
42
75
|
* from elsewhere is an auth wrapper's job (server/access.ts). Under
|
|
43
76
|
* systemd the socket unit binds, and `work setup` writes this into it. */
|
|
44
77
|
listen: process.env.WORK_LISTEN || "127.0.0.1",
|
|
78
|
+
/** The host this machine dials the server at, for what calls back into
|
|
79
|
+
* it (agent hooks, the push hook): loopback unless it listens on one
|
|
80
|
+
* address only. */
|
|
81
|
+
get dialHost() {
|
|
82
|
+
return dialHost(this.listen);
|
|
83
|
+
},
|
|
45
84
|
/** The auth wrapper's addresses when it runs on another machine (IPs or
|
|
46
85
|
* CIDRs, or `*`): the only peers besides this machine work answers. */
|
|
47
86
|
trustedProxies: list(process.env.WORK_TRUSTED_PROXIES),
|
|
@@ -72,7 +111,10 @@ async function run$1(cmd, args, cwd, env, opts = {}) {
|
|
|
72
111
|
killSignal: "SIGKILL"
|
|
73
112
|
}
|
|
74
113
|
});
|
|
75
|
-
if (opts.stdin !== void 0)
|
|
114
|
+
if (opts.stdin !== void 0) {
|
|
115
|
+
child.child.stdin?.on("error", () => {});
|
|
116
|
+
child.child.stdin?.end(opts.stdin);
|
|
117
|
+
}
|
|
76
118
|
const { stdout } = await child;
|
|
77
119
|
return stdout.trim();
|
|
78
120
|
}
|
|
@@ -90,25 +132,46 @@ var GIT_NETWORK_MS = {
|
|
|
90
132
|
"ls-remote": 6e4
|
|
91
133
|
};
|
|
92
134
|
/** Never let git wait on a terminal it doesn't have — a missing credential
|
|
93
|
-
* fails with a message instead of hanging the clone forever.
|
|
135
|
+
* fails with a message instead of hanging the clone forever. Optional
|
|
136
|
+
* locks are off because most of what runs here is a background probe (the
|
|
137
|
+
* review's stamp poll, Files, the language servers' change feed): a
|
|
138
|
+
* `git status` refreshing the index holds `index.lock`, and an agent's
|
|
139
|
+
* `git commit` or rebase step landing in that moment fails on it. */
|
|
94
140
|
var git = async (args, cwd) => {
|
|
95
141
|
const verb = args.find((a) => !a.startsWith("-")) ?? "";
|
|
96
142
|
const timeoutMs = GIT_NETWORK_MS[verb];
|
|
97
143
|
try {
|
|
98
144
|
return await run$1("git", args, cwd, {
|
|
99
145
|
...process.env,
|
|
100
|
-
GIT_TERMINAL_PROMPT: "0"
|
|
146
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
147
|
+
GIT_OPTIONAL_LOCKS: "0"
|
|
101
148
|
}, timeoutMs ? { timeoutMs } : void 0);
|
|
102
149
|
} catch (err) {
|
|
103
150
|
if (timeoutMs && err.killed) throw new Error(`git ${verb} timed out after ${Math.round(timeoutMs / 1e3)}s`);
|
|
104
151
|
throw err;
|
|
105
152
|
}
|
|
106
153
|
};
|
|
154
|
+
/** Ceilings for `gh`, for the reason git's network verbs have them: a
|
|
155
|
+
* stalled call never settles, and the cached loaders behind it (the repo
|
|
156
|
+
* catalog, repo metadata) hand that one promise to every later caller.
|
|
157
|
+
* `repo list` pages through up to 500 repos; everything else is one API
|
|
158
|
+
* call. */
|
|
159
|
+
var GH_MS = { repo: 18e4 };
|
|
160
|
+
var GH_DEFAULT_MS = 6e4;
|
|
107
161
|
/** `gh` against one GitHub host — `GH_HOST` picks the stored credential. */
|
|
108
|
-
var gh = (args, host) =>
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
162
|
+
var gh = async (args, host) => {
|
|
163
|
+
const verb = args[0] ?? "";
|
|
164
|
+
const timeoutMs = GH_MS[verb] ?? GH_DEFAULT_MS;
|
|
165
|
+
try {
|
|
166
|
+
return await run$1("gh", args, void 0, host ? {
|
|
167
|
+
...process.env,
|
|
168
|
+
GH_HOST: host
|
|
169
|
+
} : void 0, { timeoutMs });
|
|
170
|
+
} catch (err) {
|
|
171
|
+
if (err.killed) throw new Error(`gh ${verb} timed out after ${Math.round(timeoutMs / 1e3)}s`);
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
112
175
|
var tmux = (args, env, opts) => run$1("tmux", [
|
|
113
176
|
"-L",
|
|
114
177
|
TMUX_SOCKET,
|
|
@@ -166,6 +229,7 @@ function get(sql, ...params) {
|
|
|
166
229
|
function workspacePath(id) {
|
|
167
230
|
return get("SELECT path FROM workspaces WHERE id = ?", id)?.path;
|
|
168
231
|
}
|
|
232
|
+
var freshReview = !db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get();
|
|
169
233
|
db.exec(`
|
|
170
234
|
PRAGMA journal_mode = WAL;
|
|
171
235
|
PRAGMA foreign_keys = ON;
|
|
@@ -231,6 +295,7 @@ db.exec(`
|
|
|
231
295
|
PRIMARY KEY (workspace_id, key)
|
|
232
296
|
);
|
|
233
297
|
`);
|
|
298
|
+
if (freshReview) db.prepare("INSERT OR IGNORE INTO settings (key, value) VALUES ('review-cleared-diff-v2', '1')").run();
|
|
234
299
|
/** Additive schema changes: `CREATE TABLE IF NOT EXISTS` never revisits a
|
|
235
300
|
* table that already exists, so a column added after a release has to be
|
|
236
301
|
* bolted on here for databases created before it. */
|
|
@@ -243,6 +308,83 @@ ensureColumn("workspaces", "materialized", "INTEGER NOT NULL DEFAULT 1");
|
|
|
243
308
|
ensureColumn("workspaces", "origin_branch", "TEXT");
|
|
244
309
|
ensureColumn("workspaces", "imported_at", "TEXT");
|
|
245
310
|
//#endregion
|
|
311
|
+
//#region src/client/pref-change.ts
|
|
312
|
+
/** The stored text after `change`, or null when nothing is left. A value
|
|
313
|
+
* of another shape (unreadable, or another build's) counts as empty, as
|
|
314
|
+
* client/prefs' readers treat it. */
|
|
315
|
+
function applyPrefChange(raw, change) {
|
|
316
|
+
let value;
|
|
317
|
+
try {
|
|
318
|
+
value = raw == null ? void 0 : JSON.parse(raw);
|
|
319
|
+
} catch {}
|
|
320
|
+
const kept = compact(change.op === "set" ? within(value, change.at, () => change.value ?? void 0) : within(value, change.at ?? [], (list) => listChange(asList(list), change)));
|
|
321
|
+
return kept === void 0 ? null : JSON.stringify(kept);
|
|
322
|
+
}
|
|
323
|
+
function listChange(list, change) {
|
|
324
|
+
const { item } = change;
|
|
325
|
+
const other = (x) => !same(x, item);
|
|
326
|
+
if (change.op === "remove") return list.filter(other);
|
|
327
|
+
if (change.op === "push") return [item, ...list.filter(other)].slice(0, change.cap);
|
|
328
|
+
const at = change.over === void 0 ? -1 : list.findIndex((x) => same(x, change.over));
|
|
329
|
+
if (at >= 0) return list.map((x, i) => i === at ? item : x).filter((x, i) => i === at || other(x));
|
|
330
|
+
if (!list.every(other)) return list;
|
|
331
|
+
return change.cap != null && list.length >= change.cap ? list : [...list, item];
|
|
332
|
+
}
|
|
333
|
+
/** `node` with `fn` applied at `path`, copied along the way. Undefined
|
|
334
|
+
* from `fn` drops an object field, or clears a list slot. Objects have no
|
|
335
|
+
* prototype, so a field named `__proto__` is only a field. */
|
|
336
|
+
function within(node, path, fn) {
|
|
337
|
+
if (!path.length) return fn(node);
|
|
338
|
+
const [step, ...rest] = path;
|
|
339
|
+
if (typeof step === "number") {
|
|
340
|
+
const list = asList(node).slice();
|
|
341
|
+
while (list.length < step) list.push(null);
|
|
342
|
+
list[step] = within(list[step], rest, fn) ?? null;
|
|
343
|
+
return list;
|
|
344
|
+
}
|
|
345
|
+
const obj = asObj(node);
|
|
346
|
+
const v = within(obj[step], rest, fn);
|
|
347
|
+
if (v === void 0) delete obj[step];
|
|
348
|
+
else obj[step] = v;
|
|
349
|
+
return obj;
|
|
350
|
+
}
|
|
351
|
+
function asList(node) {
|
|
352
|
+
return Array.isArray(node) ? node : [];
|
|
353
|
+
}
|
|
354
|
+
function asObj(node) {
|
|
355
|
+
const obj = Object.create(null);
|
|
356
|
+
if (node && typeof node === "object" && !Array.isArray(node)) Object.assign(obj, node);
|
|
357
|
+
return obj;
|
|
358
|
+
}
|
|
359
|
+
/** Null, `[]` and `{}` read as nothing, so none is stored: a list's
|
|
360
|
+
* trailing empty slots go, and a value left empty removes the row. */
|
|
361
|
+
function compact(v) {
|
|
362
|
+
if (Array.isArray(v)) {
|
|
363
|
+
const list = v.map((x) => compact(x) ?? null);
|
|
364
|
+
while (list.length && list[list.length - 1] === null) list.pop();
|
|
365
|
+
return list.length ? list : void 0;
|
|
366
|
+
}
|
|
367
|
+
if (v && typeof v === "object") {
|
|
368
|
+
const obj = Object.create(null);
|
|
369
|
+
for (const [k, x] of Object.entries(v)) {
|
|
370
|
+
const c = compact(x);
|
|
371
|
+
if (c !== void 0) obj[k] = c;
|
|
372
|
+
}
|
|
373
|
+
return Object.keys(obj).length ? obj : void 0;
|
|
374
|
+
}
|
|
375
|
+
return v ?? void 0;
|
|
376
|
+
}
|
|
377
|
+
/** Equal as JSON: a field holding undefined is no field (a page's own
|
|
378
|
+
* copy has those; what the server parsed never does). */
|
|
379
|
+
function same(a, b) {
|
|
380
|
+
if (a === b) return true;
|
|
381
|
+
if (!a || !b || typeof a !== "object" || typeof b !== "object") return false;
|
|
382
|
+
if (Array.isArray(a) !== Array.isArray(b)) return false;
|
|
383
|
+
const keys = (o) => Object.keys(o).filter((k) => o[k] !== void 0);
|
|
384
|
+
const ka = keys(a);
|
|
385
|
+
return ka.length === keys(b).length && ka.every((k) => same(a[k], b[k]));
|
|
386
|
+
}
|
|
387
|
+
//#endregion
|
|
246
388
|
//#region lib/setup/agents.json
|
|
247
389
|
var agents_default = [
|
|
248
390
|
{
|
|
@@ -700,6 +842,22 @@ async function githubHostStatus(host) {
|
|
|
700
842
|
error: /not logged in/i.test(text) ? void 0 : text.trim().split("\n").pop()
|
|
701
843
|
};
|
|
702
844
|
}
|
|
845
|
+
/** Whether the server can keep this Linux host awake (src/server/awake.ts
|
|
846
|
+
* holds the lock itself). Its last resort, an `idle` lock, is one polkit
|
|
847
|
+
* grants anyone, so failing that means nothing holds the host while work
|
|
848
|
+
* runs, and a suspend looks like the network dropping. Null off Linux, where
|
|
849
|
+
* caffeinate asks no one. */
|
|
850
|
+
async function canStayAwake() {
|
|
851
|
+
if (process.platform !== "linux") return null;
|
|
852
|
+
const { ok } = await run("systemd-inhibit", [
|
|
853
|
+
"--what=idle",
|
|
854
|
+
"--mode=block",
|
|
855
|
+
"--who=work",
|
|
856
|
+
"--why=work doctor probe",
|
|
857
|
+
"true"
|
|
858
|
+
], { timeout: 5e3 });
|
|
859
|
+
return ok;
|
|
860
|
+
}
|
|
703
861
|
/**
|
|
704
862
|
* Full readiness snapshot.
|
|
705
863
|
*
|
|
@@ -712,7 +870,11 @@ async function doctor(opts = {}) {
|
|
|
712
870
|
...opts.hosts || [],
|
|
713
871
|
...ghKnownHosts()
|
|
714
872
|
]);
|
|
715
|
-
const [versions, github] = await Promise.all([
|
|
873
|
+
const [versions, github, awake] = await Promise.all([
|
|
874
|
+
miseVersions(),
|
|
875
|
+
Promise.all([...hostSet].map(githubHostStatus)),
|
|
876
|
+
canStayAwake()
|
|
877
|
+
]);
|
|
716
878
|
const tools = TOOLS.map((t) => {
|
|
717
879
|
const found = which(t.bin);
|
|
718
880
|
return {
|
|
@@ -740,7 +902,8 @@ async function doctor(opts = {}) {
|
|
|
740
902
|
},
|
|
741
903
|
tools,
|
|
742
904
|
agents,
|
|
743
|
-
github
|
|
905
|
+
github,
|
|
906
|
+
awake
|
|
744
907
|
};
|
|
745
908
|
}
|
|
746
909
|
//#endregion
|
|
@@ -758,10 +921,44 @@ function allPrefs() {
|
|
|
758
921
|
const rows = db.prepare("SELECT key, value FROM settings WHERE key LIKE 'ui.%'").all();
|
|
759
922
|
return Object.fromEntries(rows.map((r) => [r.key.slice(3), r.value]));
|
|
760
923
|
}
|
|
924
|
+
/** The most a pref may hold: every one rides each page's HTML. */
|
|
925
|
+
var PREF_MAX = 4096;
|
|
926
|
+
/** The prefs kept per workspace, keyed `<name>:<workspace id>`. They ride
|
|
927
|
+
* every page's HTML, so they go with the workspace (`deleteWorkspacePrefs`)
|
|
928
|
+
* and /api/prefs refuses them for one that is gone; one missing here
|
|
929
|
+
* outlives its workspace for good. `scripts/migrate.mjs` prunes orphans of
|
|
930
|
+
* the same list. */
|
|
931
|
+
var WORKSPACE_PREFS = [
|
|
932
|
+
"tab",
|
|
933
|
+
"diff-filter",
|
|
934
|
+
"diff-folded",
|
|
935
|
+
"diff-focus",
|
|
936
|
+
"diff-pos",
|
|
937
|
+
"files-recent"
|
|
938
|
+
];
|
|
939
|
+
function deleteWorkspacePrefs(id) {
|
|
940
|
+
const keys = WORKSPACE_PREFS.map((name) => `ui.${name}:${id}`);
|
|
941
|
+
db.prepare(`DELETE FROM settings WHERE key IN (${keys.map(() => "?").join(", ")})`).run(...keys);
|
|
942
|
+
}
|
|
761
943
|
function setPref(key, value) {
|
|
762
944
|
if (value === null) db.prepare("DELETE FROM settings WHERE key = ?").run(`ui.${key}`);
|
|
763
945
|
else setSetting(`ui.${key}`, value);
|
|
764
946
|
}
|
|
947
|
+
/** Apply one change to a list or object pref as it is stored now — not
|
|
948
|
+
* as the page that sent it last read it — and return the result. */
|
|
949
|
+
function changePref(key, change) {
|
|
950
|
+
db.exec("BEGIN IMMEDIATE");
|
|
951
|
+
try {
|
|
952
|
+
const next = applyPrefChange(getSetting(`ui.${key}`) ?? null, change);
|
|
953
|
+
if (next !== null && next.length > 4096) throw httpError(413, `pref ${key} would be over ${PREF_MAX} characters`);
|
|
954
|
+
setPref(key, next);
|
|
955
|
+
db.exec("COMMIT");
|
|
956
|
+
return next;
|
|
957
|
+
} catch (err) {
|
|
958
|
+
db.exec("ROLLBACK");
|
|
959
|
+
throw err;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
765
962
|
/** Instance ids the user switched off in Settings (still installed). */
|
|
766
963
|
function disabledAgents() {
|
|
767
964
|
try {
|
|
@@ -6867,6 +7064,7 @@ function agentFromCommand(command) {
|
|
|
6867
7064
|
}
|
|
6868
7065
|
//#endregion
|
|
6869
7066
|
//#region src/server/agent-state.ts
|
|
7067
|
+
/** What the turn is doing, as its hooks said. */
|
|
6870
7068
|
var phases = /* @__PURE__ */ new Map();
|
|
6871
7069
|
var scraped = /* @__PURE__ */ new Map();
|
|
6872
7070
|
var reasons = /* @__PURE__ */ new Map();
|
|
@@ -6878,6 +7076,12 @@ var pendingDone = /* @__PURE__ */ new Map();
|
|
|
6878
7076
|
* a session whose hooks never report (not loaded, not trusted, turned
|
|
6879
7077
|
* off) is left to the pane scraper rather than to silence. */
|
|
6880
7078
|
var reportedAt = /* @__PURE__ */ new Map();
|
|
7079
|
+
/** Work each session runs apart from its turn and wakes up for as it
|
|
7080
|
+
* ends (Claude's background subagents and workflows), by id; only
|
|
7081
|
+
* sessions with some. A turn that ends while any runs has handed off, not
|
|
7082
|
+
* finished: the session is working until a turn ends with none left, and
|
|
7083
|
+
* that end is the one pushed. */
|
|
7084
|
+
var background = /* @__PURE__ */ new Map();
|
|
6881
7085
|
/** A turn's end is pushed once it has stayed ended this long. Stop fires
|
|
6882
7086
|
* again each time something sends the agent back to work (a stop hook
|
|
6883
7087
|
* that continues it, a goal loop, background subagents reporting in), and
|
|
@@ -6899,7 +7103,7 @@ function setAgentPhase(sessionId, phase, reason, summary) {
|
|
|
6899
7103
|
const failed = phases.get(sessionId) === "waiting" && reasons.get(sessionId) === "attention";
|
|
6900
7104
|
if (summary) summaries.set(sessionId, summary);
|
|
6901
7105
|
if (phases.has(sessionId)) applyChange(sessionId, () => dropHook(sessionId));
|
|
6902
|
-
if (!failed) pendingDone.set(sessionId, setTimeout(() => {
|
|
7106
|
+
if (!failed && !background.has(sessionId)) pendingDone.set(sessionId, setTimeout(() => {
|
|
6903
7107
|
pendingDone.delete(sessionId);
|
|
6904
7108
|
notify(sessionId, "done");
|
|
6905
7109
|
}, DONE_SETTLE_MS));
|
|
@@ -6921,15 +7125,31 @@ function dropHook(sessionId) {
|
|
|
6921
7125
|
phases.delete(sessionId);
|
|
6922
7126
|
reasons.delete(sessionId);
|
|
6923
7127
|
}
|
|
7128
|
+
/** A hook's word on the session's background work: the CLI's own list of
|
|
7129
|
+
* what runs, or one piece starting or ending. It says nothing of the turn,
|
|
7130
|
+
* whose phase is left as it was (a subagent starting beside a question on
|
|
7131
|
+
* screen leaves the question). */
|
|
7132
|
+
function noteBackground(sessionId, work) {
|
|
7133
|
+
reportedAt.set(sessionId, Date.now());
|
|
7134
|
+
const ids = new Set(work.running ?? background.get(sessionId));
|
|
7135
|
+
if (work.started) ids.add(work.started);
|
|
7136
|
+
if (work.stopped) ids.delete(work.stopped);
|
|
7137
|
+
if (ids.size) cancelDone(sessionId);
|
|
7138
|
+
applyChange(sessionId, () => {
|
|
7139
|
+
if (ids.size) background.set(sessionId, ids);
|
|
7140
|
+
else background.delete(sessionId);
|
|
7141
|
+
});
|
|
7142
|
+
}
|
|
6924
7143
|
function cancelDone(sessionId) {
|
|
6925
7144
|
const timer = pendingDone.get(sessionId);
|
|
6926
7145
|
if (!timer) return;
|
|
6927
7146
|
clearTimeout(timer);
|
|
6928
7147
|
pendingDone.delete(sessionId);
|
|
6929
7148
|
}
|
|
6930
|
-
/** What the session's hooks last said, apart from the scraper
|
|
7149
|
+
/** What the session's hooks last said, apart from the scraper: the
|
|
7150
|
+
* turn's phase, else working while its background work runs. */
|
|
6931
7151
|
function hookPhase(sessionId) {
|
|
6932
|
-
return phases.get(sessionId);
|
|
7152
|
+
return phases.get(sessionId) ?? (background.has(sessionId) ? "working" : void 0);
|
|
6933
7153
|
}
|
|
6934
7154
|
/** When the session's hooks last reported (undefined: never, this run). */
|
|
6935
7155
|
function hookReportedAt(sessionId) {
|
|
@@ -6937,10 +7157,16 @@ function hookReportedAt(sessionId) {
|
|
|
6937
7157
|
}
|
|
6938
7158
|
/** A hook's "working" whose pane has gone still: the turn ended without
|
|
6939
7159
|
* a hook saying so (an interrupt, a failure the CLI reports no hook for),
|
|
6940
|
-
*
|
|
7160
|
+
* or its background work did (an end whose hook was lost, a turn it should
|
|
7161
|
+
* have woken that never came), since every agent's screen animates while
|
|
7162
|
+
* it works — Claude's ticks a line for background work every second.
|
|
7163
|
+
* Idle, no push. */
|
|
6941
7164
|
function settleQuietWorking(sessionId) {
|
|
6942
|
-
if (
|
|
6943
|
-
applyChange(sessionId, () =>
|
|
7165
|
+
if (hookPhase(sessionId) !== "working") return;
|
|
7166
|
+
applyChange(sessionId, () => {
|
|
7167
|
+
dropHook(sessionId);
|
|
7168
|
+
background.delete(sessionId);
|
|
7169
|
+
});
|
|
6944
7170
|
}
|
|
6945
7171
|
/** The user answered at the terminal while the session was stopped on
|
|
6946
7172
|
* them (approved, denied, picked, interrupted): no longer waiting on
|
|
@@ -7003,17 +7229,18 @@ function clearAgentPhase(sessionId) {
|
|
|
7003
7229
|
cancelDone(sessionId);
|
|
7004
7230
|
summaries.delete(sessionId);
|
|
7005
7231
|
reportedAt.delete(sessionId);
|
|
7006
|
-
if (!phases.has(sessionId) && !scraped.has(sessionId)) return;
|
|
7232
|
+
if (!phases.has(sessionId) && !scraped.has(sessionId) && !background.has(sessionId)) return;
|
|
7007
7233
|
applyChange(sessionId, () => {
|
|
7008
7234
|
phases.delete(sessionId);
|
|
7009
7235
|
scraped.delete(sessionId);
|
|
7010
7236
|
reasons.delete(sessionId);
|
|
7237
|
+
background.delete(sessionId);
|
|
7011
7238
|
});
|
|
7012
7239
|
}
|
|
7013
7240
|
/** What a session is doing. The hook wins where there is one: it reports
|
|
7014
7241
|
* the turn itself, where tmux only sees the pane still moving after it. */
|
|
7015
7242
|
function agentPhase(sessionId) {
|
|
7016
|
-
return
|
|
7243
|
+
return hookPhase(sessionId) ?? scraped.get(sessionId);
|
|
7017
7244
|
}
|
|
7018
7245
|
/** Apply a mutation and broadcast when it moved the session's phase (or,
|
|
7019
7246
|
* `force`, its reason: finished and blocked draw differently). Only a
|
|
@@ -7031,7 +7258,7 @@ function publishChange(sessionId) {
|
|
|
7031
7258
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
7032
7259
|
if (row?.workspace_id) {
|
|
7033
7260
|
const workspaceId = row.workspace_id;
|
|
7034
|
-
import("./
|
|
7261
|
+
import("./_CWyeRc54.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
7035
7262
|
return;
|
|
7036
7263
|
}
|
|
7037
7264
|
publish("sessions.changed");
|
|
@@ -7046,7 +7273,7 @@ function publishChange(sessionId) {
|
|
|
7046
7273
|
* does not report as that session's agent. */
|
|
7047
7274
|
function stateCurl(family, state, reason) {
|
|
7048
7275
|
const qs = `session=$WORK_SESSION_ID&agent=${family}&state=${state}` + (reason ? `&reason=${reason}` : "");
|
|
7049
|
-
return `[ -n "$WORK_SESSION_ID" ] && curl -sf --connect-timeout 1 -m 2 -X POST "http
|
|
7276
|
+
return `[ -n "$WORK_SESSION_ID" ] && curl -sf --connect-timeout 1 -m 2 -X POST "http://${config.dialHost}:\${WORK_APP_PORT:-${config.appPort}}/api/agent-state?${qs}" -H 'content-type: application/json' --data-binary @- >/dev/null 2>&1; exit 0`;
|
|
7050
7277
|
}
|
|
7051
7278
|
/** Claude-format hook groups (`{matcher?, hooks:[{type:"command",command}]}`)
|
|
7052
7279
|
* for a hook map — the JSON shape Claude, Copilot plugins and Grok all read. */
|
|
@@ -7351,29 +7578,40 @@ function numberedDirs() {
|
|
|
7351
7578
|
}
|
|
7352
7579
|
}
|
|
7353
7580
|
/** OAuth credentials: `.credentials.json` in the config dir on Linux; on
|
|
7354
|
-
* macOS Claude Code keeps them in the login keychain instead
|
|
7355
|
-
*
|
|
7356
|
-
*
|
|
7357
|
-
*
|
|
7358
|
-
*
|
|
7359
|
-
* refresh lists the accounts afresh. */
|
|
7581
|
+
* macOS Claude Code keeps them in the login keychain instead, which
|
|
7582
|
+
* `security` reads back as the same JSON. The keychain read is cached for
|
|
7583
|
+
* 30 s per account — it forks a process. Read once per account per
|
|
7584
|
+
* refresh: a row asks for them half a dozen times, and every refresh lists
|
|
7585
|
+
* the accounts afresh. */
|
|
7360
7586
|
var credentialsRead = /* @__PURE__ */ new WeakMap();
|
|
7361
7587
|
var credentials = (account) => {
|
|
7362
7588
|
if (credentialsRead.has(account)) return credentialsRead.get(account);
|
|
7363
7589
|
let cred = readJson(path.join(account.dir, ".credentials.json"));
|
|
7364
|
-
if (!cred && process.platform === "darwin"
|
|
7590
|
+
if (!cred && process.platform === "darwin") cred = keychainCredentials(keychainService(account));
|
|
7365
7591
|
credentialsRead.set(account, cred);
|
|
7366
7592
|
return cred;
|
|
7367
7593
|
};
|
|
7368
|
-
|
|
7369
|
-
|
|
7370
|
-
|
|
7594
|
+
/** The keychain item Claude Code keeps an account under: "Claude
|
|
7595
|
+
* Code-credentials" for the stock install, and for one run with
|
|
7596
|
+
* `CLAUDE_CONFIG_DIR` that name plus the first 8 hex digits of the
|
|
7597
|
+
* SHA-256 of the dir as the variable gives it (NFC). A numbered account's
|
|
7598
|
+
* dir is `$HOME/.claude-<n>`, which is what `CLAUDE_CONFIG_DIR` holds. */
|
|
7599
|
+
function keychainService(account) {
|
|
7600
|
+
const base = "Claude Code-credentials";
|
|
7601
|
+
if (!account.suffix) return base;
|
|
7602
|
+
const dir = account.dir.normalize("NFC");
|
|
7603
|
+
return `${base}-${createHash("sha256").update(dir).digest("hex").slice(0, 8)}`;
|
|
7604
|
+
}
|
|
7605
|
+
var keychain = /* @__PURE__ */ new Map();
|
|
7606
|
+
function keychainCredentials(service) {
|
|
7607
|
+
const cached = keychain.get(service);
|
|
7608
|
+
if (cached && Date.now() - cached.at < 3e4) return cached.value;
|
|
7371
7609
|
let value = null;
|
|
7372
7610
|
try {
|
|
7373
7611
|
const raw = execFileSync("security", [
|
|
7374
7612
|
"find-generic-password",
|
|
7375
7613
|
"-s",
|
|
7376
|
-
|
|
7614
|
+
service,
|
|
7377
7615
|
"-w"
|
|
7378
7616
|
], {
|
|
7379
7617
|
encoding: "utf8",
|
|
@@ -7387,10 +7625,10 @@ function keychainCredentials() {
|
|
|
7387
7625
|
const parsed = JSON.parse(raw.trim());
|
|
7388
7626
|
value = parsed && typeof parsed === "object" ? parsed : null;
|
|
7389
7627
|
} catch {}
|
|
7390
|
-
keychain
|
|
7628
|
+
keychain.set(service, {
|
|
7391
7629
|
at: Date.now(),
|
|
7392
7630
|
value
|
|
7393
|
-
};
|
|
7631
|
+
});
|
|
7394
7632
|
return value;
|
|
7395
7633
|
}
|
|
7396
7634
|
/** Why an account has no live data — an expired token is the common case
|
|
@@ -7567,14 +7805,33 @@ var FAILURES = {
|
|
|
7567
7805
|
max_output_tokens: "Hit the output limit",
|
|
7568
7806
|
cloud_credential_error: "Cloud credentials failed"
|
|
7569
7807
|
};
|
|
7570
|
-
/** Claude's dialect: subagents' tool calls left out,
|
|
7571
|
-
*
|
|
7572
|
-
*
|
|
7573
|
-
*
|
|
7808
|
+
/** Claude's dialect: subagents' tool calls left out, their starts and
|
|
7809
|
+
* stops and a Stop's list of what still runs read as background work (a
|
|
7810
|
+
* Stop with some running has handed off, not finished: agent-state), the
|
|
7811
|
+
* question tool's prompt, the command awaiting approval and a failed
|
|
7812
|
+
* turn's error as the summary. */
|
|
7574
7813
|
function readHook$6(p, reported, _state) {
|
|
7575
7814
|
const event = p.hook_event_name;
|
|
7815
|
+
if (event === "SubagentStart") {
|
|
7816
|
+
const id = str$1(p.agent_id);
|
|
7817
|
+
return id ? {
|
|
7818
|
+
ignore: true,
|
|
7819
|
+
background: { started: id }
|
|
7820
|
+
} : { ignore: true };
|
|
7821
|
+
}
|
|
7822
|
+
if (event === "SubagentStop") {
|
|
7823
|
+
const running = backgroundWork(p);
|
|
7824
|
+
const id = str$1(p.agent_id);
|
|
7825
|
+
if (running) return {
|
|
7826
|
+
ignore: true,
|
|
7827
|
+
background: { running }
|
|
7828
|
+
};
|
|
7829
|
+
return id ? {
|
|
7830
|
+
ignore: true,
|
|
7831
|
+
background: { stopped: id }
|
|
7832
|
+
} : { ignore: true };
|
|
7833
|
+
}
|
|
7576
7834
|
if ((event === "PreToolUse" || event === "PostToolUse" || event === "PostToolUseFailure") && str$1(p.agent_id)) return { ignore: true };
|
|
7577
|
-
if (event === "Stop" && runningSubagents(p)) return { ignore: true };
|
|
7578
7835
|
if (event === "PostToolUseFailure" && p.is_interrupt === true) return { state: "idle" };
|
|
7579
7836
|
if (notificationType(p) === WORKER_PERMISSION) return {
|
|
7580
7837
|
reason: "attention",
|
|
@@ -7598,15 +7855,28 @@ function readHook$6(p, reported, _state) {
|
|
|
7598
7855
|
const input = p.tool_input;
|
|
7599
7856
|
const what = str$1(input?.description) || str$1(input?.command) || str$1(p.tool_name);
|
|
7600
7857
|
read.summary = what ? cleanSummary(`Approve: ${what}`) : "Waiting for permission";
|
|
7858
|
+
} else if (event === "Stop") {
|
|
7859
|
+
const running = backgroundWork(p);
|
|
7860
|
+
if (running) read.background = { running };
|
|
7601
7861
|
}
|
|
7602
7862
|
return read;
|
|
7603
7863
|
}
|
|
7604
|
-
/**
|
|
7605
|
-
*
|
|
7606
|
-
* may never
|
|
7607
|
-
|
|
7864
|
+
/** The kinds of `background_tasks` entry Claude wakes up for as they end
|
|
7865
|
+
* and waits on itself: subagents and workflows. A background shell (a dev
|
|
7866
|
+
* server) may never end, a monitor fires for as long as it runs and a
|
|
7867
|
+
* teammate idles between tasks, so none of those is work in progress. */
|
|
7868
|
+
var WAKES = /* @__PURE__ */ new Set(["subagent", "workflow"]);
|
|
7869
|
+
/** The ids of the work that wakes the session among a Stop's or
|
|
7870
|
+
* SubagentStop's `background_tasks` (running or pending), or undefined
|
|
7871
|
+
* for a payload without the list. */
|
|
7872
|
+
function backgroundWork(p) {
|
|
7608
7873
|
const tasks = p.background_tasks;
|
|
7609
|
-
|
|
7874
|
+
if (!Array.isArray(tasks)) return void 0;
|
|
7875
|
+
return tasks.flatMap((t) => {
|
|
7876
|
+
const task = t ?? {};
|
|
7877
|
+
const id = str$1(task.id);
|
|
7878
|
+
return id && WAKES.has(str$1(task.type)) ? [id] : [];
|
|
7879
|
+
});
|
|
7610
7880
|
}
|
|
7611
7881
|
/** Claude Code takes its settings inline (`--settings` accepts a JSON
|
|
7612
7882
|
* string), so the hooks travel in argv and nothing is written anywhere.
|
|
@@ -7615,7 +7885,12 @@ function runningSubagents(p) {
|
|
|
7615
7885
|
* while (each keystroke defers it), but it is the one that covers a
|
|
7616
7886
|
* sandbox's network prompt. A turn that fails (rate limit, signed out)
|
|
7617
7887
|
* ends with StopFailure rather than Stop; an interrupt ends with no hook
|
|
7618
|
-
* at all, which the pane going still catches (scraper.ts).
|
|
7888
|
+
* at all, which the pane going still catches (scraper.ts). Subagents
|
|
7889
|
+
* report starting and stopping (SubagentStart / SubagentStop, with their
|
|
7890
|
+
* `agent_id`), a background one and a workflow's among them, and Stop and
|
|
7891
|
+
* SubagentStop carry `background_tasks`, Claude's own list of what still
|
|
7892
|
+
* runs: together, what keeps a session working past a turn that handed
|
|
7893
|
+
* its work to them. */
|
|
7619
7894
|
var claude = {
|
|
7620
7895
|
meta: meta$6,
|
|
7621
7896
|
launchFlags: () => ["--settings", JSON.stringify({ hooks: claudeStyleHooks("claude", [
|
|
@@ -7649,6 +7924,8 @@ var claude = {
|
|
|
7649
7924
|
"waiting",
|
|
7650
7925
|
"attention"
|
|
7651
7926
|
],
|
|
7927
|
+
["SubagentStart", "background"],
|
|
7928
|
+
["SubagentStop", "background"],
|
|
7652
7929
|
[
|
|
7653
7930
|
"Notification",
|
|
7654
7931
|
"waiting",
|
|
@@ -7658,7 +7935,10 @@ var claude = {
|
|
|
7658
7935
|
]) })],
|
|
7659
7936
|
reportsWorking: () => true,
|
|
7660
7937
|
envPrefixes: ["CLAUDE", "AI_AGENT"],
|
|
7661
|
-
|
|
7938
|
+
startupQuestions: [{
|
|
7939
|
+
screen: /Is this a project you created or one you trust/,
|
|
7940
|
+
asks: "whether to trust this folder"
|
|
7941
|
+
}],
|
|
7662
7942
|
readHook: readHook$6,
|
|
7663
7943
|
usage: () => Promise.all(claudeAccounts().map((account) => claudeRow(account)))
|
|
7664
7944
|
};
|
|
@@ -8105,19 +8385,16 @@ function lastMessageFromTranscript(p) {
|
|
|
8105
8385
|
}
|
|
8106
8386
|
} catch {}
|
|
8107
8387
|
}
|
|
8108
|
-
/** Two menus Copilot can draw before its input box, both of which would
|
|
8109
|
-
* swallow a pasted first prompt. A session work ends is killed with its
|
|
8110
|
-
* tmux pane, so Copilot's own registry still lists it as open and every
|
|
8111
|
-
* later launch offers to restore it (Esc starts fresh). A workspace it has
|
|
8112
|
-
* not seen gets the folder-trust prompt, with Yes preselected. */
|
|
8113
|
-
function startupPrompt(screen) {
|
|
8114
|
-
if (/Restore interrupted sessions/.test(screen)) return ["Escape"];
|
|
8115
|
-
if (/remember this folder for future sessions/.test(screen)) return ["Enter"];
|
|
8116
|
-
}
|
|
8117
8388
|
var copilot = {
|
|
8118
8389
|
meta: meta$4,
|
|
8119
8390
|
launchFlags: () => ["--plugin-dir", pluginDir$1()],
|
|
8120
|
-
|
|
8391
|
+
startupQuestions: [{
|
|
8392
|
+
screen: /remember this folder for future sessions/,
|
|
8393
|
+
asks: "whether to trust this folder"
|
|
8394
|
+
}, {
|
|
8395
|
+
screen: /Restore interrupted sessions/,
|
|
8396
|
+
asks: "which sessions to restore"
|
|
8397
|
+
}],
|
|
8121
8398
|
reportsWorking: () => true,
|
|
8122
8399
|
envPrefixes: ["COPILOT_"],
|
|
8123
8400
|
readHook: readHook$4,
|
|
@@ -8593,7 +8870,7 @@ var meta$1 = meta_default$1;
|
|
|
8593
8870
|
* subscribed to the same event bus its TUI renders from. The plugin posts
|
|
8594
8871
|
* the reports itself rather than shelling out to curl, so this is the one
|
|
8595
8872
|
* family whose payload work wrote — `readHook` only has to unwrap it. */
|
|
8596
|
-
var PLUGIN = (appPort) => `// Generated by work. Reports this
|
|
8873
|
+
var PLUGIN = (host, appPort) => `// Generated by work. Reports this
|
|
8597
8874
|
// session's working / needs-input / done state to the app; edits are
|
|
8598
8875
|
// overwritten. Port and session id come from the env tmux gave the pane.
|
|
8599
8876
|
const post = async (state, reason, summary) => {
|
|
@@ -8604,7 +8881,7 @@ const post = async (state, reason, summary) => {
|
|
|
8604
8881
|
\`session=\${encodeURIComponent(session)}&agent=opencode&state=\${state}\` +
|
|
8605
8882
|
(reason ? \`&reason=\${reason}\` : "");
|
|
8606
8883
|
try {
|
|
8607
|
-
await fetch(\`http
|
|
8884
|
+
await fetch(\`http://${host}:\${port}/api/agent-state?\${qs}\`, {
|
|
8608
8885
|
method: "POST",
|
|
8609
8886
|
headers: { "content-type": "application/json" },
|
|
8610
8887
|
body: JSON.stringify({ summary }),
|
|
@@ -8739,7 +9016,7 @@ function installed$1() {
|
|
|
8739
9016
|
function pluginConfig() {
|
|
8740
9017
|
const file = PLUGIN_FILE();
|
|
8741
9018
|
try {
|
|
8742
|
-
writeIfChanged(file, PLUGIN(config.appPort));
|
|
9019
|
+
writeIfChanged(file, PLUGIN(config.dialHost, config.appPort));
|
|
8743
9020
|
} catch {}
|
|
8744
9021
|
return JSON.stringify({ plugin: [file] });
|
|
8745
9022
|
}
|
|
@@ -8770,7 +9047,7 @@ var meta = meta_default;
|
|
|
8770
9047
|
* `agent_settled` (0.80.4) never sends it, so a run's end waits a moment
|
|
8771
9048
|
* for one and reports itself when none comes. The extension posts its own
|
|
8772
9049
|
* reports, as opencode's plugin does; `readHook` only unwraps them. */
|
|
8773
|
-
var EXTENSION = (appPort) => `// Generated by work. Reports this
|
|
9050
|
+
var EXTENSION = (host, appPort) => `// Generated by work. Reports this
|
|
8774
9051
|
// session's working / needs-input / done state to the app; edits are
|
|
8775
9052
|
// overwritten. Port and session id come from the env tmux gave the pane.
|
|
8776
9053
|
const post = async (state, reason, summary) => {
|
|
@@ -8781,7 +9058,7 @@ const post = async (state, reason, summary) => {
|
|
|
8781
9058
|
\`session=\${encodeURIComponent(session)}&agent=pi&state=\${state}\` +
|
|
8782
9059
|
(reason ? \`&reason=\${reason}\` : "");
|
|
8783
9060
|
try {
|
|
8784
|
-
await fetch(\`http
|
|
9061
|
+
await fetch(\`http://${host}:\${port}/api/agent-state?\${qs}\`, {
|
|
8785
9062
|
method: "POST",
|
|
8786
9063
|
headers: { "content-type": "application/json" },
|
|
8787
9064
|
body: JSON.stringify({ summary }),
|
|
@@ -8847,7 +9124,7 @@ function installed() {
|
|
|
8847
9124
|
function extensionFile() {
|
|
8848
9125
|
const file = EXTENSION_FILE();
|
|
8849
9126
|
try {
|
|
8850
|
-
writeIfChanged(file, EXTENSION(config.appPort));
|
|
9127
|
+
writeIfChanged(file, EXTENSION(config.dialHost, config.appPort));
|
|
8851
9128
|
} catch {}
|
|
8852
9129
|
return file;
|
|
8853
9130
|
}
|
|
@@ -8898,17 +9175,12 @@ function agentLaunchEnv(id, ctx) {
|
|
|
8898
9175
|
function reportsWorking(id) {
|
|
8899
9176
|
return agentFor(id)?.reportsWorking?.() ?? false;
|
|
8900
9177
|
}
|
|
8901
|
-
/**
|
|
8902
|
-
|
|
8903
|
-
|
|
8904
|
-
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
return !!agentFor(id)?.startupPrompt;
|
|
8908
|
-
}
|
|
8909
|
-
/** Keys that answer whatever startup prompt the CLI is showing, if any. */
|
|
8910
|
-
function startupPromptKeys(id, screen) {
|
|
8911
|
-
return agentFor(id)?.startupPrompt?.(screen);
|
|
9178
|
+
/** What the CLI is asking the user on this screen before its input box
|
|
9179
|
+
* ("Claude is asking whether to trust this folder"), if anything. */
|
|
9180
|
+
function startupQuestion(id, screen) {
|
|
9181
|
+
const agent = agentFor(id);
|
|
9182
|
+
const question = agent?.startupQuestions?.find((q) => q.screen.test(screen));
|
|
9183
|
+
return agent && question ? `${agent.meta.label} is asking ${question.asks}` : void 0;
|
|
8912
9184
|
}
|
|
8913
9185
|
/** The input-box marker for CLIs whose splash looks settled early. */
|
|
8914
9186
|
function readyScreen(id) {
|
|
@@ -8943,8 +9215,16 @@ function listSessions(workspaceId) {
|
|
|
8943
9215
|
function getSession(id) {
|
|
8944
9216
|
return get("SELECT * FROM sessions WHERE id = ?", id);
|
|
8945
9217
|
}
|
|
8946
|
-
|
|
9218
|
+
/** `ifEmpty` is a first open's auto-create: two pages mounting one empty
|
|
9219
|
+
* workspace at once (restored tabs, a phone and a desktop) both list no
|
|
9220
|
+
* sessions before either POST lands. The check and the insert run in one
|
|
9221
|
+
* synchronous step, so the second gets the first one's session. */
|
|
9222
|
+
function createSession(workspaceId, agent, ifEmpty = false) {
|
|
8947
9223
|
if (!isKnownAgent(agent)) throw new Error(`unknown session kind: ${agent}`);
|
|
9224
|
+
if (ifEmpty) {
|
|
9225
|
+
const first = listSessions(workspaceId)[0];
|
|
9226
|
+
if (first) return first;
|
|
9227
|
+
}
|
|
8948
9228
|
const id = Math.random().toString(36).slice(2, 10);
|
|
8949
9229
|
db.prepare("INSERT INTO sessions (id, workspace_id, agent) VALUES (?, ?, ?)").run(id, workspaceId, agent);
|
|
8950
9230
|
notifySessionsChanged(workspaceId);
|
|
@@ -9030,14 +9310,29 @@ async function sendToSession(id, text, size) {
|
|
|
9030
9310
|
if (!wsPath) throw new Error("unknown workspace");
|
|
9031
9311
|
const name = tmuxName(id);
|
|
9032
9312
|
const env = cleanEnv();
|
|
9033
|
-
|
|
9313
|
+
const alive = await tmux([
|
|
9034
9314
|
"has-session",
|
|
9035
9315
|
"-t",
|
|
9036
9316
|
name
|
|
9037
|
-
], env).then(() => true, () => false)
|
|
9317
|
+
], env).then(() => true, () => false);
|
|
9318
|
+
if (!alive) {
|
|
9038
9319
|
await ensureTmuxServer();
|
|
9320
|
+
clearAgentPhase(id);
|
|
9039
9321
|
if (promptAsArgv(session.agent)) {
|
|
9040
|
-
|
|
9322
|
+
const file = path.join(os.tmpdir(), `work-prompt-${id}-${Math.random().toString(36).slice(2, 10)}`);
|
|
9323
|
+
fs.writeFileSync(file, text, {
|
|
9324
|
+
mode: 384,
|
|
9325
|
+
flag: "wx"
|
|
9326
|
+
});
|
|
9327
|
+
try {
|
|
9328
|
+
await tmux(newSessionArgs(session, wsPath, "-d", {
|
|
9329
|
+
file,
|
|
9330
|
+
text
|
|
9331
|
+
}, size), env);
|
|
9332
|
+
} catch (err) {
|
|
9333
|
+
fs.rmSync(file, { force: true });
|
|
9334
|
+
throw err;
|
|
9335
|
+
}
|
|
9041
9336
|
markTmuxStarted(id);
|
|
9042
9337
|
return;
|
|
9043
9338
|
}
|
|
@@ -9045,6 +9340,16 @@ async function sendToSession(id, text, size) {
|
|
|
9045
9340
|
markTmuxStarted(id);
|
|
9046
9341
|
await waitForAgent(name, env, session.agent);
|
|
9047
9342
|
}
|
|
9343
|
+
if (!alive || hookReportedAt(id) === void 0) {
|
|
9344
|
+
const screen = await tmux([
|
|
9345
|
+
"capture-pane",
|
|
9346
|
+
"-p",
|
|
9347
|
+
"-t",
|
|
9348
|
+
name
|
|
9349
|
+
], env).catch(() => "");
|
|
9350
|
+
const asking = startupQuestion(session.agent, screen);
|
|
9351
|
+
if (asking) throw httpError(409, `${asking}: answer it in the terminal, then send again`);
|
|
9352
|
+
}
|
|
9048
9353
|
const buffer = `work-send-${Math.random().toString(36).slice(2, 8)}`;
|
|
9049
9354
|
await tmux([
|
|
9050
9355
|
"load-buffer",
|
|
@@ -9117,19 +9422,18 @@ async function listPanesNow() {
|
|
|
9117
9422
|
"list-panes",
|
|
9118
9423
|
"-a",
|
|
9119
9424
|
"-F",
|
|
9120
|
-
"#{session_name} #{pane_current_command} #{pane_pid} #{window_activity}
|
|
9425
|
+
"#{session_name} #{pane_current_command} #{pane_pid} #{window_activity}"
|
|
9121
9426
|
]).catch(() => null);
|
|
9122
9427
|
if (out === null) return null;
|
|
9123
9428
|
const panes = [];
|
|
9124
9429
|
for (const line of out.split("\n")) {
|
|
9125
9430
|
if (!line) continue;
|
|
9126
|
-
const [name, command, pid, stamp
|
|
9431
|
+
const [name, command, pid, stamp] = line.split(" ");
|
|
9127
9432
|
panes.push({
|
|
9128
9433
|
id: name?.startsWith("wk-") ? name.slice(3) : void 0,
|
|
9129
9434
|
command: command || "",
|
|
9130
9435
|
pid: Number(pid),
|
|
9131
|
-
activityAt: Number(stamp) * 1e3
|
|
9132
|
-
title: title.join(" ")
|
|
9436
|
+
activityAt: Number(stamp) * 1e3
|
|
9133
9437
|
});
|
|
9134
9438
|
}
|
|
9135
9439
|
lastPanes = {
|
|
@@ -9162,7 +9466,7 @@ async function ensureTmuxServer() {
|
|
|
9162
9466
|
portCleared = true;
|
|
9163
9467
|
await run$1("systemd-run", [
|
|
9164
9468
|
"--user",
|
|
9165
|
-
"
|
|
9469
|
+
`--unit=${TMUX_SOCKET === "work" ? "work-tmux" : `work-tmux-${TMUX_SOCKET.replace(/[^\w.:-]/g, "_")}`}`,
|
|
9166
9470
|
"--service-type=forking",
|
|
9167
9471
|
"--collect",
|
|
9168
9472
|
"tmux",
|
|
@@ -9296,15 +9600,16 @@ function newSessionArgs(session, wsPath, mode, initialPrompt, size) {
|
|
|
9296
9600
|
function loginShellCommand(agent, cwd, initialPrompt) {
|
|
9297
9601
|
const words = sessionCommand(agent);
|
|
9298
9602
|
if (!words.length) return [];
|
|
9299
|
-
const line = [
|
|
9300
|
-
|
|
9301
|
-
|
|
9302
|
-
|
|
9303
|
-
|
|
9603
|
+
const line = [...words, ...agentLaunchFlags(agent, { cwd })].map(shellQuote);
|
|
9604
|
+
if (initialPrompt) {
|
|
9605
|
+
const file = shellQuote(initialPrompt.file);
|
|
9606
|
+
if (initialPrompt.text.startsWith("-")) line.push("--");
|
|
9607
|
+
line.push(`"$(cat ${file}; rm -f ${file})"`);
|
|
9608
|
+
}
|
|
9304
9609
|
return [
|
|
9305
9610
|
process.env.SHELL || "bash",
|
|
9306
9611
|
"-lc",
|
|
9307
|
-
`exec ${line}`
|
|
9612
|
+
`exec ${line.join(" ")}`
|
|
9308
9613
|
];
|
|
9309
9614
|
}
|
|
9310
9615
|
function shellQuote(word) {
|
|
@@ -9328,14 +9633,6 @@ function cleanEnv() {
|
|
|
9328
9633
|
env.PATH = [...parts, ...bins.filter((bin) => !parts.includes(bin))].join(":");
|
|
9329
9634
|
return forceUtf8Locale(env);
|
|
9330
9635
|
}
|
|
9331
|
-
/** Answer the menus a CLI draws before its input box (a folder-trust
|
|
9332
|
-
* question) on a pane an attach just created, as sending a first prompt
|
|
9333
|
-
* does — so a session opened with nothing to send is not left on one. */
|
|
9334
|
-
async function settleStartup(id) {
|
|
9335
|
-
const session = getSession(id);
|
|
9336
|
-
if (!session || !hasStartupPrompt(session.agent)) return;
|
|
9337
|
-
await waitForAgent(tmuxName(id), cleanEnv(), session.agent).catch(() => {});
|
|
9338
|
-
}
|
|
9339
9636
|
/** Upper bound on waiting for an agent to be ready for input; past it
|
|
9340
9637
|
* the paste goes in regardless (a TUI with a boot animation never settles). */
|
|
9341
9638
|
var AGENT_BOOT_MS = 8e3;
|
|
@@ -9357,24 +9654,7 @@ async function waitForAgent(name, env, agent) {
|
|
|
9357
9654
|
if (c && !/^(bash|zsh|sh|fish|login|-?\w*sh)$/.test(c)) break;
|
|
9358
9655
|
await sleep(150);
|
|
9359
9656
|
}
|
|
9360
|
-
|
|
9361
|
-
for (let i = 0; i < 3; i++) {
|
|
9362
|
-
await waitStill(name, env, until - Date.now(), ready);
|
|
9363
|
-
const keys = startupPromptKeys(agent, await tmux([
|
|
9364
|
-
"capture-pane",
|
|
9365
|
-
"-p",
|
|
9366
|
-
"-t",
|
|
9367
|
-
name
|
|
9368
|
-
], env).catch(() => ""));
|
|
9369
|
-
if (!keys?.length) return;
|
|
9370
|
-
await tmux([
|
|
9371
|
-
"send-keys",
|
|
9372
|
-
"-t",
|
|
9373
|
-
name,
|
|
9374
|
-
...keys
|
|
9375
|
-
], env);
|
|
9376
|
-
await sleep(300);
|
|
9377
|
-
}
|
|
9657
|
+
await waitStill(name, env, until - Date.now(), readyScreen(agent));
|
|
9378
9658
|
}
|
|
9379
9659
|
/** Resolve once the pane has drawn something and then held still for
|
|
9380
9660
|
* SCREEN_STILL_MS, or after `maxMs` (a TUI with an animation never
|
|
@@ -9441,4 +9721,4 @@ function sleep(ms) {
|
|
|
9441
9721
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
9442
9722
|
}
|
|
9443
9723
|
//#endregion
|
|
9444
|
-
export {
|
|
9724
|
+
export { publish as $, noteBackground as A, toolById as At, agentLabel as B, tmux as Bt, readHookPayload as C, miseVersions as Ct, clearAgentPhase as D, TOOLS as Dt, agentPhase as E, DEFAULT_GITHUB_HOST as Et, setSessionViewers as F, workspacePath as Ft, manifest as G, ACCENT_RE as H, checked as Ht, settleQuietWorking as I, TMUX_SOCKET as It, deleteSubscription as J, normalizeAccent as K, agentBadge as L, gh as Lt, onPhaseChange as M, all as Mt, setAgentPhase as N, db as Nt, hookPhase as O, agentById as Ot, setScrapedPhase as P, get as Pt, validSubscription as Q, agentFamily as R, git as Rt, AGENTS as S, miseInstalls as St, blankRow as T, which as Tt, getInstance as U, httpError as Ut, agentMeta as V, config as Vt, iconSvg as W, readBody as Wt, saveSubscription as X, pushPublicKey as Y, sendPush as Z, renameSession as _, setPref as _t, ensureTmuxServer as a, withLock as at, tmuxName as b, doctor as bt, killSession as c, agentChoices as ct, listPanesWithin as d, deleteWorkspacePrefs as dt, publishJson as et, listSessions as f, disabledAgents as ft, panePids as g, setDisabledAgents as gt, notifySessionsChanged as h, preferredAgent as ht, disposeSessions as i, swr as it, noteUserAnswered as j, applyPrefChange as jt, hookReportedAt as k, agentLabel$1 as kt, killWorkspaceSessions as l, allPrefs as lt, newSessionArgs as m, getSetting as mt, clearTmuxStarted as n, subscriberCount as nt, forgetPanes as o, PREF_MAX as ot, markTmuxStarted as p, enabledAgents as pt, setInstance as q, createSession as r, shared as rt, getSession as s, WORKSPACE_PREFS as st, cleanEnv as t, subscribe 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, agentFromCommand as z, run$1 as zt };
|