@dylanpiercey/work 0.2.17 → 0.2.19
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 +16 -0
- package/bin/cli/README.md +34 -0
- package/bin/cli/_progress.mjs +68 -0
- package/bin/cli/_repo.mjs +32 -0
- package/bin/cli/_target.mjs +49 -0
- package/bin/cli/agent.mjs +153 -0
- package/bin/cli/branches.mjs +79 -0
- package/bin/cli/config.mjs +175 -0
- package/bin/cli/host.mjs +142 -0
- package/bin/cli/lsp.mjs +117 -0
- package/bin/cli/notify.mjs +53 -0
- package/bin/cli/open.mjs +37 -0
- package/bin/cli/repo.mjs +98 -0
- package/bin/cli/session.mjs +296 -0
- package/bin/cli/skill.mjs +99 -0
- package/bin/cli/stack.mjs +51 -0
- package/bin/cli/status.mjs +86 -0
- package/bin/cli/topic.mjs +585 -0
- package/bin/cli/workspace.mjs +184 -0
- package/bin/work.mjs +411 -80
- package/dist/{_Bj-WwfnW.js → _CsokArOR.js} +183 -59
- package/dist/_L2HNAA_8.js +2 -0
- package/dist/__TCdgPY5.js +173 -0
- package/dist/index.mjs +3917 -2606
- package/dist/public/assets/{_C9jR1P3s.js → _-7Amnss4.js} +1 -1
- package/dist/public/assets/_-7Amnss4.js.br +0 -0
- package/dist/public/assets/_0XXNUttq.js +1 -0
- package/dist/public/assets/{_CIrZGxEf.js → _0sTkxfPx.js} +1 -1
- package/dist/public/assets/_0sTkxfPx.js.br +0 -0
- package/dist/public/assets/_0zzYbK0A.js +1 -0
- package/dist/public/assets/{_CJgqLdsx.js → _1M3oZPSf.js} +1 -1
- package/dist/public/assets/_1M3oZPSf.js.br +0 -0
- package/dist/public/assets/_2O5HnHht.js +1 -0
- package/dist/public/assets/_7WlUaJPH.js +1 -0
- package/dist/public/assets/_8Tr7ByPg.js +1 -0
- package/dist/public/assets/_9AXMmQSO.js +1 -0
- package/dist/public/assets/_B1VqbV-X.js +1 -0
- package/dist/public/assets/{_BxS3xvmE.js → _B9I2AEux.js} +1 -1
- package/dist/public/assets/_B9I2AEux.js.br +0 -0
- package/dist/public/assets/{_DO_4_u2Q.js → _B9qGqvit.js} +1 -1
- package/dist/public/assets/{_CIWiehYG.js → _B9xuaMHt.js} +1 -1
- package/dist/public/assets/_B9xuaMHt.js.br +0 -0
- package/dist/public/assets/{_BqWlTTxo.js → _BAWjkhA8.js} +1 -1
- package/dist/public/assets/_BAWjkhA8.js.br +0 -0
- package/dist/public/assets/{_CNUs2Gqk.js → _BBCzcNZY.js} +1 -1
- package/dist/public/assets/_BBCzcNZY.js.br +0 -0
- package/dist/public/assets/_BBW2szHh.js +1 -0
- package/dist/public/assets/_BCP2Njnu.js +1 -0
- package/dist/public/assets/{_A-jpjc8j.js → _BClUYs-k.js} +1 -1
- package/dist/public/assets/_BClUYs-k.js.br +0 -0
- package/dist/public/assets/{_B5JxE4Sx.js → _BDdZkZRc.js} +1 -1
- package/dist/public/assets/_BDdZkZRc.js.br +0 -0
- package/dist/public/assets/_BEDmGSgS.js +1 -0
- package/dist/public/assets/_BEDmGSgS.js.br +0 -0
- package/dist/public/assets/_BH9BIky6.js +1 -0
- package/dist/public/assets/_BH9BIky6.js.br +0 -0
- package/dist/public/assets/_BLdi8Ee5.js +1 -0
- package/dist/public/assets/{_C449plW0.js → _BPDSQUbl.js} +1 -1
- package/dist/public/assets/_BPDSQUbl.js.br +0 -0
- package/dist/public/assets/{_B19mS3yM.js → _BQW1kIop.js} +1 -1
- package/dist/public/assets/_BQW1kIop.js.br +0 -0
- package/dist/public/assets/_BQeoUfFw.js +1 -0
- package/dist/public/assets/_BRzroLbh.js +1 -0
- package/dist/public/assets/_BSXsTYSe.js +1 -0
- package/dist/public/assets/_BTXDT3Na.js +1 -0
- package/dist/public/assets/_BXm4xeFI.js +1 -0
- package/dist/public/assets/_BY8UeogK.js +1 -0
- package/dist/public/assets/_BYpyhp64.js +1 -0
- package/dist/public/assets/_BYpyhp64.js.br +0 -0
- package/dist/public/assets/_B_Kz7LnY.js +1 -0
- package/dist/public/assets/{_DqGOYRpi.js → _Bcc0Xs64.js} +1 -1
- package/dist/public/assets/_Bcc0Xs64.js.br +0 -0
- package/dist/public/assets/{_Do6b-nfX.js → _BdSsUhCi.js} +1 -1
- package/dist/public/assets/_BdSsUhCi.js.br +0 -0
- package/dist/public/assets/_BdaWssEH.js +1 -0
- package/dist/public/assets/{_BHyWcuOR.js → _BhecGD7y.js} +1 -1
- package/dist/public/assets/_BhecGD7y.js.br +0 -0
- package/dist/public/assets/_Bj9dpPhN.js +1 -0
- package/dist/public/assets/{_DorQTaAa.js → _BjZqS7za.js} +1 -1
- package/dist/public/assets/_BjZqS7za.js.br +0 -0
- package/dist/public/assets/_BkSUiyHK.js +1 -0
- package/dist/public/assets/_BlshXH2Y.js +16 -0
- package/dist/public/assets/_BlshXH2Y.js.br +0 -0
- package/dist/public/assets/_BmX-VP7w.js +1 -0
- package/dist/public/assets/{_v3HPnNBs.js → _BmpOmFbo.js} +1 -1
- package/dist/public/assets/_BmpOmFbo.js.br +0 -0
- package/dist/public/assets/_Bo6YntUl.js +1 -0
- package/dist/public/assets/_BprZx4vg.js +2 -0
- package/dist/public/assets/_BprZx4vg.js.br +0 -0
- package/dist/public/assets/_Bqm7OnIV.js +1 -0
- package/dist/public/assets/_BquBGUNK.js +1 -0
- package/dist/public/assets/_BquBGUNK.js.br +0 -0
- package/dist/public/assets/_BrB66aRZ.js +1 -0
- package/dist/public/assets/{_BA-MNdjL.js → _Bt03HU8S.js} +1 -1
- package/dist/public/assets/{_BTWfPOi-.js → _BtedGrGs.js} +1 -1
- package/dist/public/assets/_BtedGrGs.js.br +0 -0
- package/dist/public/assets/{_DUdEYxV0.js → _C-BYkx5h.js} +1 -1
- package/dist/public/assets/_C-BYkx5h.js.br +0 -0
- package/dist/public/assets/{_BUW_V5kN.js → _C-DhXiEm.js} +1 -1
- package/dist/public/assets/_C-DhXiEm.js.br +0 -0
- package/dist/public/assets/_C-NBFnST.js +1 -0
- package/dist/public/assets/{_BoTzWlXR.js → _C1RigMYD.js} +1 -1
- package/dist/public/assets/_C1RigMYD.js.br +0 -0
- package/dist/public/assets/_C2vRS-ES.js +1 -0
- package/dist/public/assets/{_CrlNjDih.js → _C3fslTAD.js} +1 -1
- package/dist/public/assets/_C3fslTAD.js.br +0 -0
- package/dist/public/assets/{_BuMTHEPk.js → _C4EYjWGn.js} +1 -1
- package/dist/public/assets/_C4EYjWGn.js.br +0 -0
- package/dist/public/assets/{_yp48NYOW.js → _C6Yt6h_R.js} +1 -1
- package/dist/public/assets/_C6Yt6h_R.js.br +0 -0
- package/dist/public/assets/{_cyorvuL1.js → _C7Y4xApK.js} +1 -1
- package/dist/public/assets/_C7Y4xApK.js.br +0 -0
- package/dist/public/assets/{_D4CkNo0r.js → _CB52LkYt.js} +1 -1
- package/dist/public/assets/_CB52LkYt.js.br +0 -0
- package/dist/public/assets/{_CxgPm_xy.js → _CBEKHwUV.js} +1 -1
- package/dist/public/assets/_CBEKHwUV.js.br +0 -0
- package/dist/public/assets/_CBSLBYQF.js +1 -0
- package/dist/public/assets/_CBgzBB_k.js +1 -0
- package/dist/public/assets/_CBgzBB_k.js.br +0 -0
- package/dist/public/assets/{_CCONYsJT.js → _CCoTlnvb.js} +1 -1
- package/dist/public/assets/_CCoTlnvb.js.br +0 -0
- package/dist/public/assets/_CD26To-f.js +1 -0
- package/dist/public/assets/_CDyWgQ0v.js +6 -0
- package/dist/public/assets/_CDyWgQ0v.js.br +0 -0
- package/dist/public/assets/{_vX9d6g5Y.js → _CEC5O89D.js} +1 -1
- package/dist/public/assets/_CEC5O89D.js.br +0 -0
- package/dist/public/assets/_CF2kEAU7.js +1 -0
- package/dist/public/assets/_CFURqbmO.js +1 -0
- package/dist/public/assets/{_Cwtn28hL.js → _CG383oZY.js} +1 -1
- package/dist/public/assets/_CG383oZY.js.br +0 -0
- package/dist/public/assets/_CHNJosg3.js +1 -0
- package/dist/public/assets/{_Cc_GUPR4.js → _CHmEM8Sm.js} +1 -1
- package/dist/public/assets/_CHmEM8Sm.js.br +0 -0
- package/dist/public/assets/_CIfCdAzS.js +1 -0
- package/dist/public/assets/_CKyzH0fl.js +1 -0
- package/dist/public/assets/{_BCB8LQS3.js → _CL8DzBla.js} +1 -1
- package/dist/public/assets/_CL8DzBla.js.br +0 -0
- package/dist/public/assets/_CNYS94C5.js +1 -0
- package/dist/public/assets/_CNhypHJN.js +1 -0
- package/dist/public/assets/_CO-FkxlA.js +1 -0
- package/dist/public/assets/_COiGBSpO.js +1 -0
- package/dist/public/assets/_COvolvRQ.js +1 -0
- package/dist/public/assets/{_Di78jTI-.js → _CPaMvBMG.js} +1 -1
- package/dist/public/assets/_CPaMvBMG.js.br +0 -0
- package/dist/public/assets/{_C7bHTlG1.js → _CPj_VL66.js} +1 -1
- package/dist/public/assets/_CPj_VL66.js.br +0 -0
- package/dist/public/assets/_CQJC8Vx4.js +1 -0
- package/dist/public/assets/_CRHNlzBC.js +1 -0
- package/dist/public/assets/{_C1-Nli75.js → _CToqok6Q.js} +1 -1
- package/dist/public/assets/_CToqok6Q.js.br +0 -0
- package/dist/public/assets/_CUFKkl0B.js +1 -0
- package/dist/public/assets/_CZsOUa-q.js +1 -0
- package/dist/public/assets/{_D8uBvHXU.js → _C_D5TPb7.js} +1 -1
- package/dist/public/assets/_C_D5TPb7.js.br +0 -0
- package/dist/public/assets/_CdHI48v6.js +1 -0
- package/dist/public/assets/{_BfQeZPXW.js → _CdpmkkzR.js} +1 -1
- package/dist/public/assets/_CdpmkkzR.js.br +0 -0
- package/dist/public/assets/{_6klEiBhY.js → _CdtjIoUd.js} +1 -1
- package/dist/public/assets/_CdtjIoUd.js.br +0 -0
- package/dist/public/assets/_Ce9Tv01m.js +1 -0
- package/dist/public/assets/_CeC7Lv10.js +1 -0
- package/dist/public/assets/{_CYhJ6ae-.js → _CfP0f0PU.js} +1 -1
- package/dist/public/assets/_CfP0f0PU.js.br +0 -0
- package/dist/public/assets/_Cg7DH3xk.js +1 -0
- package/dist/public/assets/_Cg7DH3xk.js.br +0 -0
- package/dist/public/assets/_CikNq0z8.js +1 -0
- package/dist/public/assets/{_DK-MOyi_.js → _Cl7LTITm.js} +1 -1
- package/dist/public/assets/_Cl7LTITm.js.br +0 -0
- package/dist/public/assets/{_BT7DMail.js → _Cmtl59QM.js} +1 -1
- package/dist/public/assets/_Cmtl59QM.js.br +0 -0
- package/dist/public/assets/_CshYq_Dp.js +1 -0
- package/dist/public/assets/{_Dj5RDA5P.js → _CspPbDoP.js} +1 -1
- package/dist/public/assets/_CspPbDoP.js.br +0 -0
- package/dist/public/assets/{_Ca2DTddL.js → _Ctjz3BD9.js} +1 -1
- package/dist/public/assets/_Ctjz3BD9.js.br +0 -0
- package/dist/public/assets/{_C5c3o9N3.js → _CuglAToi.js} +1 -1
- package/dist/public/assets/_CuglAToi.js.br +0 -0
- package/dist/public/assets/_CwSoAVRN.js +1 -0
- package/dist/public/assets/_D0XQV-Hm.js +1 -0
- package/dist/public/assets/{_D_GeNCls.js → _D36PnqCD.js} +1 -1
- package/dist/public/assets/_D36PnqCD.js.br +0 -0
- package/dist/public/assets/{_DYqx8g78.js → _D3IviZbJ.js} +1 -1
- package/dist/public/assets/_D3IviZbJ.js.br +0 -0
- package/dist/public/assets/_D6rgUB9O.js +1 -0
- package/dist/public/assets/{_Dwe1TUjY.js → _D7qWWxdI.js} +1 -1
- package/dist/public/assets/_D7qWWxdI.js.br +0 -0
- package/dist/public/assets/{_CPbClwhX.js → _D8ac72_O.js} +1 -1
- package/dist/public/assets/_D8ac72_O.js.br +0 -0
- package/dist/public/assets/_D9WWxrQR.js +1 -0
- package/dist/public/assets/_D9hI5dSA.js +1 -0
- package/dist/public/assets/{_DzlXwaiG.js → _DCrPsldZ.js} +1 -1
- package/dist/public/assets/_DCrPsldZ.js.br +0 -0
- package/dist/public/assets/{_ChPy2IX4.js → _DDcVFyaQ.js} +1 -1
- package/dist/public/assets/_DDcVFyaQ.js.br +0 -0
- package/dist/public/assets/_DDhkKo8Q.js +1 -0
- package/dist/public/assets/{_CY_Z-kV5.js → _DJBR8Qwq.js} +1 -1
- package/dist/public/assets/_DJBR8Qwq.js.br +0 -0
- package/dist/public/assets/{_CxHuLHdz.js → _DLpa6VYT.js} +1 -1
- package/dist/public/assets/_DMqe6rR-.js +1 -0
- package/dist/public/assets/{_DbLQjG4R.js → _DN7pTn2g.js} +1 -1
- package/dist/public/assets/_DN7pTn2g.js.br +0 -0
- package/dist/public/assets/_DP8UuFuJ.js +1 -0
- package/dist/public/assets/_DQedUaqM.js +1 -0
- package/dist/public/assets/{_DPiemRX1.js → _DSCqWPO0.js} +1 -1
- package/dist/public/assets/_DSCqWPO0.js.br +0 -0
- package/dist/public/assets/{_BoEcMQmX.js → _DSeQngGR.js} +1 -1
- package/dist/public/assets/_DSeQngGR.js.br +0 -0
- package/dist/public/assets/{_D-0pUYXq.js → _DTNiWZFr.js} +1 -1
- package/dist/public/assets/_DTNiWZFr.js.br +0 -0
- package/dist/public/assets/_DThlusXY.js +1 -0
- package/dist/public/assets/_DUK16H19.js +1 -0
- package/dist/public/assets/_DUZ13t3U.js +1 -0
- package/dist/public/assets/{_BHgwN0LC.js → _DWb03VKf.js} +1 -1
- package/dist/public/assets/_DWb03VKf.js.br +0 -0
- package/dist/public/assets/_DWsyhfgn.js +1 -0
- package/dist/public/assets/_DXuzYhW6.js +1 -0
- package/dist/public/assets/_DXyOzA2b.js +1 -0
- package/dist/public/assets/{_BXcMBVCY.js → _DYUFCi44.js} +1 -1
- package/dist/public/assets/_DYUFCi44.js.br +0 -0
- package/dist/public/assets/{_BwSXxzqy.js → _DYhs8iJg.js} +12 -12
- package/dist/public/assets/_DYhs8iJg.js.br +0 -0
- package/dist/public/assets/{_Dhn3A3KJ.js → _D__ojGam.js} +1 -1
- package/dist/public/assets/_D__ojGam.js.br +0 -0
- package/dist/public/assets/_DaFI_W5D.js +1 -0
- package/dist/public/assets/{_BiY8chB-.js → _DbT6uo7W.js} +1 -1
- package/dist/public/assets/_DbT6uo7W.js.br +0 -0
- package/dist/public/assets/_DhnT0cCE.js +1 -0
- package/dist/public/assets/_Dm9OGn2q.js +1 -0
- package/dist/public/assets/_DmkeGFoM.js +1 -0
- package/dist/public/assets/{_DVLNzEkW.js → _DmoI4cIl.js} +1 -1
- package/dist/public/assets/_DmoI4cIl.js.br +0 -0
- package/dist/public/assets/{_zcAaK79d.js → _DpbHp8yR.js} +1 -1
- package/dist/public/assets/_DpbHp8yR.js.br +0 -0
- package/dist/public/assets/_Dqz_HBE1.js +1 -0
- package/dist/public/assets/{_DOKecL0e.js → _DsehEuMD.js} +1 -1
- package/dist/public/assets/_DsehEuMD.js.br +0 -0
- package/dist/public/assets/{_D-pUpBL1.js → _Dtx52FYB.js} +1 -1
- package/dist/public/assets/_DuEyirL6.js +1 -0
- package/dist/public/assets/_DuuloSIi.js +1 -0
- package/dist/public/assets/{_Ch-UiovX.js → _DuyCZnNC.js} +1 -1
- package/dist/public/assets/_DuyCZnNC.js.br +0 -0
- package/dist/public/assets/{_BQEpu56f.js → _Dw1P6xZJ.js} +1 -1
- package/dist/public/assets/_Dw1P6xZJ.js.br +0 -0
- package/dist/public/assets/{_C-lB_p3U.js → _DzNFlI0M.js} +1 -1
- package/dist/public/assets/_DzNFlI0M.js.br +0 -0
- package/dist/public/assets/{_CYQ4srZb.js → _EcMqP1xI.js} +1 -1
- package/dist/public/assets/_EcMqP1xI.js.br +0 -0
- package/dist/public/assets/{_0KruTMn9.js → _G1BLeMns.js} +1 -1
- package/dist/public/assets/_G1BLeMns.js.br +0 -0
- package/dist/public/assets/{_FwFz43m8.js → _G8KNSVdM.js} +1 -1
- package/dist/public/assets/_G8KNSVdM.js.br +0 -0
- package/dist/public/assets/{_3fvr5bU1.js → _J1v2clxU.js} +1 -1
- package/dist/public/assets/_J1v2clxU.js.br +0 -0
- package/dist/public/assets/{_Depr5Jps.js → _J3wdy6bJ.js} +1 -1
- package/dist/public/assets/_J3wdy6bJ.js.br +0 -0
- package/dist/public/assets/{_-ycNE92Z.js → _MHZgY1AQ.js} +1 -1
- package/dist/public/assets/_MHZgY1AQ.js.br +0 -0
- package/dist/public/assets/_NHTZitq1.js +2 -0
- package/dist/public/assets/_NHTZitq1.js.br +0 -0
- package/dist/public/assets/{_Cw-dmwPJ.js → _PsuNqRL9.js} +20 -20
- package/dist/public/assets/_PsuNqRL9.js.br +0 -0
- package/dist/public/assets/{_CXVkXsw1.js → _T5HFHZgl.js} +1 -1
- package/dist/public/assets/_T5HFHZgl.js.br +0 -0
- package/dist/public/assets/{_4_sKOYsy.js → _UZAFx6D8.js} +1 -1
- package/dist/public/assets/_UZAFx6D8.js.br +0 -0
- package/dist/public/assets/_XA8_RQXF.js +1 -0
- package/dist/public/assets/{_BTh4v5Tr.js → _XsB9KmcW.js} +1 -1
- package/dist/public/assets/_XsB9KmcW.js.br +0 -0
- package/dist/public/assets/{_i4iteLF8.js → _YoXk_8Bl.js} +1 -1
- package/dist/public/assets/_YoXk_8Bl.js.br +0 -0
- package/dist/public/assets/_YubCdy3Z.js +1 -0
- package/dist/public/assets/{_Q5s6o5H4.js → _bDI-pCZR.js} +1 -1
- package/dist/public/assets/_bDI-pCZR.js.br +0 -0
- package/dist/public/assets/{_TynjiShF.js → _bHL-NcWS.js} +1 -1
- package/dist/public/assets/_bHL-NcWS.js.br +0 -0
- package/dist/public/assets/_bqRzDYc8.js +1 -0
- package/dist/public/assets/{_OpbuiQ7h.js → _briyaWgK.js} +1 -1
- package/dist/public/assets/_briyaWgK.js.br +0 -0
- package/dist/public/assets/{_pEUCjhqm.js → _dVHSDgPC.js} +1 -1
- package/dist/public/assets/_dVHSDgPC.js.br +0 -0
- package/dist/public/assets/_gkZjZ9I4.js +1 -0
- package/dist/public/assets/_plyCYAnN.js +1 -0
- package/dist/public/assets/_q0Z44mWJ.js +1 -0
- package/dist/public/assets/_q0Z44mWJ.js.br +0 -0
- package/dist/public/assets/{_BPNSknLT.js → _qAsGEOt5.js} +1 -1
- package/dist/public/assets/_qAsGEOt5.js.br +0 -0
- package/dist/public/assets/{_Dks8YY2K.js → _qxffRpjc.js} +1 -1
- package/dist/public/assets/{_BOBYB-cj.js → _uCKs5N6Q.js} +1 -1
- package/dist/public/assets/_uCKs5N6Q.js.br +0 -0
- package/dist/public/assets/_utWnC80Q.js +1 -0
- package/dist/public/assets/_utvzcBHT.js +1 -0
- package/dist/public/assets/_v8WbCPI8.js +1 -0
- package/dist/public/assets/_yK4b_Bl5.js +1 -0
- package/dist/public/assets/_yoQW4BY5.js +1 -0
- package/dist/public/assets/_zB6USXHX.js +1 -0
- package/dist/public/assets/{_Quh6tl1u.js → _zN8SypHW.js} +1 -1
- package/dist/public/assets/_zN8SypHW.js.br +0 -0
- package/dist/public/assets/files-view-Fl0rU3Ns.js +2 -0
- package/dist/public/assets/manage-workspace-DggRcsXf.js +2 -0
- package/dist/public/assets/new-C7NxTJAT.js +1 -0
- package/dist/public/assets/new-workspace-C0pw5Iz1.js +2 -0
- package/dist/public/assets/review-view-C4YQ0J-X.js +2 -0
- package/dist/public/assets/settings-C7NxTJAT.js +1 -0
- package/dist/public/assets/settings-page-Cl_1tWCv.js +2 -0
- package/dist/public/assets/styles-Vcsj4CA7.css +1 -0
- package/dist/public/assets/styles-Vcsj4CA7.css.br +0 -0
- package/dist/public/assets/w-C7NxTJAT.js +1 -0
- package/dist/public/assets/w._-BbFH2lR-.js +1 -0
- package/dist/public/assets/w._-C7NxTJAT.js +1 -0
- package/dist/public/assets/w._-YIzLOiyZ.js +1 -0
- package/dist/public/sw.js +11 -4
- package/dist/public/sw.js.br +0 -0
- package/lib/ports/url.d.mts +20 -0
- package/lib/ports/url.mjs +80 -0
- package/lib/preview/media.d.mts +1 -1
- package/lib/preview/media.mjs +15 -2
- package/package.json +1 -1
- package/dist/_CLoLdV87.js +0 -2
- package/dist/_DPpY3UqO.js +0 -167
- package/dist/public/assets/_-ycNE92Z.js.br +0 -0
- package/dist/public/assets/_0KruTMn9.js.br +0 -0
- package/dist/public/assets/_0NH5yJMx.js +0 -1
- package/dist/public/assets/_1CAp-NbR.js +0 -1
- package/dist/public/assets/_3fvr5bU1.js.br +0 -0
- package/dist/public/assets/_4Dkmi0BI.js +0 -1
- package/dist/public/assets/_4_sKOYsy.js.br +0 -0
- package/dist/public/assets/_6klEiBhY.js.br +0 -0
- package/dist/public/assets/_7_64OpLh.js +0 -1
- package/dist/public/assets/_7p-zxUs0.js +0 -1
- package/dist/public/assets/_8RAv3gFP.js +0 -1
- package/dist/public/assets/_9PDxaMA9.js +0 -1
- package/dist/public/assets/_9PDxaMA9.js.br +0 -0
- package/dist/public/assets/_9mbDrbe7.js +0 -1
- package/dist/public/assets/_A-jpjc8j.js.br +0 -0
- package/dist/public/assets/_B0JwTeu6.js +0 -1
- package/dist/public/assets/_B19mS3yM.js.br +0 -0
- package/dist/public/assets/_B1Sfrnda.js +0 -1
- package/dist/public/assets/_B3i0wS_I.js +0 -1
- package/dist/public/assets/_B5JxE4Sx.js.br +0 -0
- package/dist/public/assets/_B9RLcC8I.js +0 -1
- package/dist/public/assets/_BCB8LQS3.js.br +0 -0
- package/dist/public/assets/_BE7UYyYb.js +0 -1
- package/dist/public/assets/_BHgwN0LC.js.br +0 -0
- package/dist/public/assets/_BHyWcuOR.js.br +0 -0
- package/dist/public/assets/_BIpUDgQH.js +0 -16
- package/dist/public/assets/_BIpUDgQH.js.br +0 -0
- package/dist/public/assets/_BMlgaRlM.js +0 -1
- package/dist/public/assets/_BOBYB-cj.js.br +0 -0
- package/dist/public/assets/_BPNSknLT.js.br +0 -0
- package/dist/public/assets/_BQEpu56f.js.br +0 -0
- package/dist/public/assets/_BT7DMail.js.br +0 -0
- package/dist/public/assets/_BTJHQNIz.js +0 -1
- package/dist/public/assets/_BTWfPOi-.js.br +0 -0
- package/dist/public/assets/_BTh4v5Tr.js.br +0 -0
- package/dist/public/assets/_BUW_V5kN.js.br +0 -0
- package/dist/public/assets/_BXcMBVCY.js.br +0 -0
- package/dist/public/assets/_B_MtJKnj.js +0 -1
- package/dist/public/assets/_Bay3D1io.js +0 -1
- package/dist/public/assets/_BfQeZPXW.js.br +0 -0
- package/dist/public/assets/_BgKjJWz_.js +0 -1
- package/dist/public/assets/_BiY8chB-.js.br +0 -0
- package/dist/public/assets/_Bk5THQZb.js +0 -1
- package/dist/public/assets/_BmeQRnXS.js +0 -1
- package/dist/public/assets/_BoEcMQmX.js.br +0 -0
- package/dist/public/assets/_BoTzWlXR.js.br +0 -0
- package/dist/public/assets/_BqWlTTxo.js.br +0 -0
- package/dist/public/assets/_BuMTHEPk.js.br +0 -0
- package/dist/public/assets/_BubhcEjq.js +0 -1
- package/dist/public/assets/_BwSXxzqy.js.br +0 -0
- package/dist/public/assets/_BxS3xvmE.js.br +0 -0
- package/dist/public/assets/_ByvA6zJz.js +0 -1
- package/dist/public/assets/_Bz2Sejcy.js +0 -1
- package/dist/public/assets/_C-lB_p3U.js.br +0 -0
- package/dist/public/assets/_C1-Nli75.js.br +0 -0
- package/dist/public/assets/_C3mw4T_r.js +0 -1
- package/dist/public/assets/_C449plW0.js.br +0 -0
- package/dist/public/assets/_C5c3o9N3.js.br +0 -0
- package/dist/public/assets/_C7bHTlG1.js.br +0 -0
- package/dist/public/assets/_C8mt6nRC.js +0 -1
- package/dist/public/assets/_C9jR1P3s.js.br +0 -0
- package/dist/public/assets/_CCONYsJT.js.br +0 -0
- package/dist/public/assets/_CCZAROAW.js +0 -1
- package/dist/public/assets/_CCZAROAW.js.br +0 -0
- package/dist/public/assets/_CG3s9pE5.js +0 -1
- package/dist/public/assets/_CIWiehYG.js.br +0 -0
- package/dist/public/assets/_CIrZGxEf.js.br +0 -0
- package/dist/public/assets/_CIurl9jC.js +0 -1
- package/dist/public/assets/_CJgqLdsx.js.br +0 -0
- package/dist/public/assets/_CMbVHIgP.js +0 -1
- package/dist/public/assets/_CNUs2Gqk.js.br +0 -0
- package/dist/public/assets/_CPbClwhX.js.br +0 -0
- package/dist/public/assets/_CQUlxerJ.js +0 -1
- package/dist/public/assets/_CTDYlYHi.js +0 -1
- package/dist/public/assets/_CXVkXsw1.js.br +0 -0
- package/dist/public/assets/_CY5EBxZ6.js +0 -1
- package/dist/public/assets/_CYQ4srZb.js.br +0 -0
- package/dist/public/assets/_CY_Z-kV5.js.br +0 -0
- package/dist/public/assets/_CYhJ6ae-.js.br +0 -0
- package/dist/public/assets/_CZbVK94d.js +0 -1
- package/dist/public/assets/_C_A97h_2.js +0 -1
- package/dist/public/assets/_C_A97h_2.js.br +0 -0
- package/dist/public/assets/_C_Y5Dwzy.js +0 -1
- package/dist/public/assets/_Ca2DTddL.js.br +0 -0
- package/dist/public/assets/_Cc2nu3_5.js +0 -1
- package/dist/public/assets/_Cc_GUPR4.js.br +0 -0
- package/dist/public/assets/_CgFUs0bE.js +0 -1
- package/dist/public/assets/_Ch-UiovX.js.br +0 -0
- package/dist/public/assets/_ChDp0-FJ.js +0 -1
- package/dist/public/assets/_ChPy2IX4.js.br +0 -0
- package/dist/public/assets/_Chsgo2e1.js +0 -1
- package/dist/public/assets/_CjECwrWB.js +0 -1
- package/dist/public/assets/_CmW74dH7.js +0 -1
- package/dist/public/assets/_CmhAUlqu.js +0 -1
- package/dist/public/assets/_CrlNjDih.js.br +0 -0
- package/dist/public/assets/_CvzTEaQq.js +0 -1
- package/dist/public/assets/_Cw-dmwPJ.js.br +0 -0
- package/dist/public/assets/_Cwtn28hL.js.br +0 -0
- package/dist/public/assets/_CxgPm_xy.js.br +0 -0
- package/dist/public/assets/_D-0pUYXq.js.br +0 -0
- package/dist/public/assets/_D-rV-z_T.js +0 -1
- package/dist/public/assets/_D4CkNo0r.js.br +0 -0
- package/dist/public/assets/_D4fP_viq.js +0 -1
- package/dist/public/assets/_D570Sd6p.js +0 -1
- package/dist/public/assets/_D6Gudpw8.js +0 -1
- package/dist/public/assets/_D8ZTP1ck.js +0 -1
- package/dist/public/assets/_D8uBvHXU.js.br +0 -0
- package/dist/public/assets/_D8xGEGlm.js +0 -1
- package/dist/public/assets/_D9GZHKow.js +0 -1
- package/dist/public/assets/_DE0eZjad.js +0 -1
- package/dist/public/assets/_DElIEG9n.js +0 -1
- package/dist/public/assets/_DF0n9xzn.js +0 -2
- package/dist/public/assets/_DF0n9xzn.js.br +0 -0
- package/dist/public/assets/_DFX_tXcw.js +0 -1
- package/dist/public/assets/_DJ2gfhU_.js +0 -1
- package/dist/public/assets/_DK-MOyi_.js.br +0 -0
- package/dist/public/assets/_DOKecL0e.js.br +0 -0
- package/dist/public/assets/_DPXXIOLX.js +0 -1
- package/dist/public/assets/_DPb3t58B.js +0 -1
- package/dist/public/assets/_DPiemRX1.js.br +0 -0
- package/dist/public/assets/_DPpbgqBC.js +0 -1
- package/dist/public/assets/_DRVSLjxA.js +0 -1
- package/dist/public/assets/_DTHWnu6M.js +0 -1
- package/dist/public/assets/_DUdEYxV0.js.br +0 -0
- package/dist/public/assets/_DVLNzEkW.js.br +0 -0
- package/dist/public/assets/_DWpx2Uof.js +0 -1
- package/dist/public/assets/_DXYEUAmC.js +0 -1
- package/dist/public/assets/_DYTVambU.js +0 -1
- package/dist/public/assets/_DYqx8g78.js.br +0 -0
- package/dist/public/assets/_DZanHI_X.js +0 -1
- package/dist/public/assets/_DZanHI_X.js.br +0 -0
- package/dist/public/assets/_D_GeNCls.js.br +0 -0
- package/dist/public/assets/_DbLQjG4R.js.br +0 -0
- package/dist/public/assets/_DbmusecK.js +0 -1
- package/dist/public/assets/_DbmusecK.js.br +0 -0
- package/dist/public/assets/_DemN-D5U.js +0 -1
- package/dist/public/assets/_Depr5Jps.js.br +0 -0
- package/dist/public/assets/_DhJfHI4f.js +0 -1
- package/dist/public/assets/_Dhn3A3KJ.js.br +0 -0
- package/dist/public/assets/_Di78jTI-.js.br +0 -0
- package/dist/public/assets/_DiBTtPlu.js +0 -1
- package/dist/public/assets/_Dj5RDA5P.js.br +0 -0
- package/dist/public/assets/_DkjKARSS.js +0 -1
- package/dist/public/assets/_Do6b-nfX.js.br +0 -0
- package/dist/public/assets/_DorQTaAa.js.br +0 -0
- package/dist/public/assets/_DpxVmwni.js +0 -1
- package/dist/public/assets/_DqGOYRpi.js.br +0 -0
- package/dist/public/assets/_DsbxQ1i8.js +0 -1
- package/dist/public/assets/_Dt_P7K1V.js +0 -6
- package/dist/public/assets/_Dt_P7K1V.js.br +0 -0
- package/dist/public/assets/_Dwe1TUjY.js.br +0 -0
- package/dist/public/assets/_DyROQKS8.js +0 -1
- package/dist/public/assets/_DzEUPsq0.js +0 -1
- package/dist/public/assets/_DzlXwaiG.js.br +0 -0
- package/dist/public/assets/_FwFz43m8.js.br +0 -0
- package/dist/public/assets/_OpbuiQ7h.js.br +0 -0
- package/dist/public/assets/_Q5s6o5H4.js.br +0 -0
- package/dist/public/assets/_Quh6tl1u.js.br +0 -0
- package/dist/public/assets/_Rh99sjDe.js +0 -1
- package/dist/public/assets/_SEE1XtID.js +0 -1
- package/dist/public/assets/_SZjr1kid.js +0 -1
- package/dist/public/assets/_T7rMqM5P.js +0 -1
- package/dist/public/assets/_TynjiShF.js.br +0 -0
- package/dist/public/assets/_UENAEFcY.js +0 -1
- package/dist/public/assets/_UwTOb1gP.js +0 -1
- package/dist/public/assets/_WrxtT1Ok.js +0 -1
- package/dist/public/assets/_WrxtT1Ok.js.br +0 -0
- package/dist/public/assets/_bcvRRCkB.js +0 -1
- package/dist/public/assets/_cyorvuL1.js.br +0 -0
- package/dist/public/assets/_gi--JOq8.js +0 -1
- package/dist/public/assets/_i4iteLF8.js.br +0 -0
- package/dist/public/assets/_i7vMugBN.js +0 -1
- package/dist/public/assets/_j7jPRUEQ.js +0 -2
- package/dist/public/assets/_j7jPRUEQ.js.br +0 -0
- package/dist/public/assets/_pEUCjhqm.js.br +0 -0
- package/dist/public/assets/_qkJuNTl-.js +0 -1
- package/dist/public/assets/_uuZJDLIV.js +0 -1
- package/dist/public/assets/_v3HPnNBs.js.br +0 -0
- package/dist/public/assets/_vX9d6g5Y.js.br +0 -0
- package/dist/public/assets/_vhysM7gk.js +0 -1
- package/dist/public/assets/_vjwPQHk_.js +0 -1
- package/dist/public/assets/_yp48NYOW.js.br +0 -0
- package/dist/public/assets/_zcAaK79d.js.br +0 -0
- package/dist/public/assets/_zwPrEKxN.js +0 -1
- package/dist/public/assets/_zwPrEKxN.js.br +0 -0
- package/dist/public/assets/files-view-CzRAql9-.js +0 -2
- package/dist/public/assets/manage-workspace-C-c1R4pP.js +0 -2
- package/dist/public/assets/new-DWfNwssk.js +0 -1
- package/dist/public/assets/new-workspace-B8XAfkIH.js +0 -2
- package/dist/public/assets/review-view-DivHZNBf.js +0 -2
- package/dist/public/assets/settings-DWfNwssk.js +0 -1
- package/dist/public/assets/settings-page-BN9Hj1ui.js +0 -2
- package/dist/public/assets/styles-NmwxQh5L.css +0 -1
- package/dist/public/assets/styles-NmwxQh5L.css.br +0 -0
- package/dist/public/assets/w-DWfNwssk.js +0 -1
- package/dist/public/assets/w._-C9dj1aZ0.js +0 -1
- package/dist/public/assets/w._-D7_D4HlM.js +0 -1
- package/dist/public/assets/w._-DWfNwssk.js +0 -1
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// `work session`: which session this is (an agent's own pane, by
|
|
2
|
+
// WORK_SESSION_ID), its name in the session list, and the workspace's
|
|
3
|
+
// other sessions — starting one, messaging it and waiting on its reply,
|
|
4
|
+
// closing it (server/messages.ts).
|
|
5
|
+
|
|
6
|
+
/** More sessions than this in one workspace is an agent starting them in
|
|
7
|
+
* a loop, not a plan: past it, `new` wants --force. */
|
|
8
|
+
const SESSION_CAP = 8;
|
|
9
|
+
|
|
10
|
+
/** The session a command means: --session's, else this pane's own. */
|
|
11
|
+
function sessionId(ctx) {
|
|
12
|
+
const id = ctx.flag("--session") || process.env.WORK_SESSION_ID;
|
|
13
|
+
if (!id)
|
|
14
|
+
ctx.die(
|
|
15
|
+
"not in a work session (WORK_SESSION_ID is unset): pass --session <id>",
|
|
16
|
+
);
|
|
17
|
+
return id;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** How long `wait` waits by default: inside an agent's own tool limit
|
|
21
|
+
* (ten minutes for most), so it ends saying who is still working rather
|
|
22
|
+
* than being killed. */
|
|
23
|
+
const WAIT_S = 540;
|
|
24
|
+
const POLL_MS = 1500;
|
|
25
|
+
|
|
26
|
+
/** The workspace's sessions with their state, this pane's marked, each
|
|
27
|
+
* after the session that started it (as the sidebar lists them). */
|
|
28
|
+
async function sessionsOf(ctx, wsId) {
|
|
29
|
+
const me = process.env.WORK_SESSION_ID;
|
|
30
|
+
const list = await ctx.api.get(`/api/workspaces/${wsId}/sessions`);
|
|
31
|
+
const rows = list.map((s) => ({
|
|
32
|
+
id: s.id,
|
|
33
|
+
agent: s.agent,
|
|
34
|
+
title: s.title || null,
|
|
35
|
+
phase: s.state?.phase || (s.state?.alive ? "idle" : "off"),
|
|
36
|
+
parent: s.parent_id || null,
|
|
37
|
+
waitingOn: s.messages?.waitingOn ?? [],
|
|
38
|
+
queued: s.messages?.queued ?? 0,
|
|
39
|
+
self: s.id === me,
|
|
40
|
+
}));
|
|
41
|
+
const ids = new Set(rows.map((s) => s.id));
|
|
42
|
+
const out = [];
|
|
43
|
+
const walk = (s, depth) => {
|
|
44
|
+
if (out.some((o) => o.id === s.id)) return;
|
|
45
|
+
out.push({ ...s, depth });
|
|
46
|
+
for (const c of rows) if (c.parent === s.id) walk(c, depth + 1);
|
|
47
|
+
};
|
|
48
|
+
for (const s of rows) if (!s.parent || !ids.has(s.parent)) walk(s, 0);
|
|
49
|
+
for (const s of rows) walk(s, 0);
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function sessionLine(ctx, s) {
|
|
54
|
+
const notes = [
|
|
55
|
+
s.waitingOn.length && `waiting on ${s.waitingOn.join(", ")}`,
|
|
56
|
+
s.queued && `${s.queued} queued for it`,
|
|
57
|
+
s.self && "this session",
|
|
58
|
+
].filter(Boolean);
|
|
59
|
+
return `${" ".repeat(s.depth ?? 0)}${ctx.pad(s.id, 9)} ${ctx.pad(s.agent, 10)} ${ctx.pad(s.phase, 8)} ${s.title || ""}${notes.length ? ` (${notes.join("; ")})` : ""}`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** A flag's value, "-" (stdin) included, which ctx.flag takes for a
|
|
63
|
+
* flag of its own. */
|
|
64
|
+
function valueOf(ctx, flag) {
|
|
65
|
+
const i = ctx.args.indexOf(flag);
|
|
66
|
+
if (i >= 0 && ctx.args[i + 1] === "-") return "-";
|
|
67
|
+
return ctx.flag(flag);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The text itself, or stdin's for "-": a heredoc carries a long prompt
|
|
71
|
+
* with quotes in it, which an argument mangles. */
|
|
72
|
+
async function textOf(value) {
|
|
73
|
+
if (value !== "-") return value;
|
|
74
|
+
const chunks = [];
|
|
75
|
+
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
76
|
+
return Buffer.concat(chunks).toString("utf8").replace(/\n$/, "");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** What became of a message, for the sender. */
|
|
80
|
+
function sentText(id, r) {
|
|
81
|
+
const lines = [
|
|
82
|
+
r.delivered
|
|
83
|
+
? `sent to ${id}`
|
|
84
|
+
: `queued for ${id} (${r.queued}): typed in once it is at its prompt`,
|
|
85
|
+
];
|
|
86
|
+
if (r.wantsReply)
|
|
87
|
+
lines.push(
|
|
88
|
+
`Its last message, as that turn ends, comes back to you as a prompt: end your turn to wait for it, or run \`work session wait ${id}\`.`,
|
|
89
|
+
);
|
|
90
|
+
return lines.join("\n");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function printReply(r) {
|
|
94
|
+
const head =
|
|
95
|
+
r.kind === "reply" ? `${r.label} replied:` : `${r.label}: ${r.text}`;
|
|
96
|
+
console.log(head);
|
|
97
|
+
if (r.kind === "reply") console.log(`${r.text}\n`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const commands = [
|
|
101
|
+
{
|
|
102
|
+
name: "session",
|
|
103
|
+
summary: "this session and the workspace's others: title, new, send, kill",
|
|
104
|
+
help: `work session [--json]
|
|
105
|
+
This session (WORK_SESSION_ID): its id, agent, name, state, and the
|
|
106
|
+
workspace it is in (id, name, path) — what a link names (/w/<id>/…).
|
|
107
|
+
work session list [id|name] [--json]
|
|
108
|
+
The workspace's sessions, this one marked.
|
|
109
|
+
work session title "<name>" [--session <id>]
|
|
110
|
+
Name a session in the session list (empty clears it).
|
|
111
|
+
work session new [--agent <id>] [--title "<name>"] [--prompt "<text>"|-] [--no-reply] [--workspace <id|name>] [--force]
|
|
112
|
+
Start a session (the default agent unless --agent, any vendor's; "shell"
|
|
113
|
+
for a terminal) in a tab of its own, where the user watches it, name it,
|
|
114
|
+
and hand it a first prompt ("-": read it from stdin). Started from
|
|
115
|
+
another session it is listed under that one, and the prompt is a
|
|
116
|
+
message from it (below). Past ${SESSION_CAP} sessions in the workspace it wants --force.
|
|
117
|
+
work session send <id> "<text>"|- [--no-reply]
|
|
118
|
+
Message an agent session: typed in, headed with who it is from, once
|
|
119
|
+
it is at its prompt — never into a turn under way, a question it asks,
|
|
120
|
+
or a draft someone is typing. From an agent's session it wants a reply
|
|
121
|
+
unless --no-reply: the recipient's last message as that turn ends,
|
|
122
|
+
typed into this session as a prompt of its own. End your turn to wait
|
|
123
|
+
for it. A file's path says more than its text pasted in.
|
|
124
|
+
work session wait [<id>...] [--timeout <seconds>]
|
|
125
|
+
Wait for the replies owed to this session (by those sessions, else by
|
|
126
|
+
any), printing each as it comes; a reply printed here is not typed in
|
|
127
|
+
too. Exits 124 if some are still working after --timeout (${WAIT_S} s).
|
|
128
|
+
work session kill <id> --yes
|
|
129
|
+
Close a session and the process in it (whoever waits on its reply is
|
|
130
|
+
told).`,
|
|
131
|
+
async run(ctx) {
|
|
132
|
+
const [verb, ...rest] = ctx.parse([
|
|
133
|
+
"--agent",
|
|
134
|
+
"--title",
|
|
135
|
+
"--prompt",
|
|
136
|
+
"--workspace",
|
|
137
|
+
"--session",
|
|
138
|
+
"--timeout",
|
|
139
|
+
]);
|
|
140
|
+
switch (verb) {
|
|
141
|
+
case undefined: {
|
|
142
|
+
const id = sessionId(ctx);
|
|
143
|
+
const { ws } = await ctx.resolveWorkspace();
|
|
144
|
+
const me = (await sessionsOf(ctx, ws.id)).find((s) => s.id === id);
|
|
145
|
+
if (!me) ctx.die(`no session ${id} in ${ws.name}`);
|
|
146
|
+
const out = {
|
|
147
|
+
...me,
|
|
148
|
+
depth: undefined,
|
|
149
|
+
workspace: {
|
|
150
|
+
id: ws.id,
|
|
151
|
+
name: ws.name,
|
|
152
|
+
path: ws.path,
|
|
153
|
+
branch: ws.branch,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
return ctx.out(out, (s) => {
|
|
157
|
+
console.log(
|
|
158
|
+
`${s.id} ${s.agent} ${s.phase}${s.title ? ` "${s.title}"` : ""}${s.waitingOn.length ? ` (waiting on ${s.waitingOn.join(", ")})` : ""}`,
|
|
159
|
+
);
|
|
160
|
+
console.log(
|
|
161
|
+
`workspace ${s.workspace.name} (${s.workspace.id}) ${s.workspace.path}`,
|
|
162
|
+
);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
case "list": {
|
|
166
|
+
const { ws } = await ctx.resolveWorkspace(rest[0]);
|
|
167
|
+
const list = await sessionsOf(ctx, ws.id);
|
|
168
|
+
return ctx.out(list, (l) => {
|
|
169
|
+
if (!l.length) return console.log("no sessions");
|
|
170
|
+
for (const s of l) console.log(sessionLine(ctx, s));
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
case "title": {
|
|
174
|
+
const id = sessionId(ctx);
|
|
175
|
+
const title = rest.join(" ");
|
|
176
|
+
await ctx.api.patch(`/api/sessions/${id}`, { title });
|
|
177
|
+
return ctx.out({ id, title: title || null }, () =>
|
|
178
|
+
console.log(
|
|
179
|
+
title ? `named ${id} "${title}"` : `cleared ${id}'s name`,
|
|
180
|
+
),
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
case "new": {
|
|
184
|
+
const { ws } = await ctx.resolveWorkspace(ctx.flag("--workspace"));
|
|
185
|
+
const existing = await sessionsOf(ctx, ws.id);
|
|
186
|
+
if (existing.length >= SESSION_CAP && !ctx.has("--force"))
|
|
187
|
+
ctx.die(
|
|
188
|
+
`${ws.name} already has ${existing.length} sessions: pass --force to start another`,
|
|
189
|
+
);
|
|
190
|
+
const agent = ctx.flag("--agent");
|
|
191
|
+
const me = process.env.WORK_SESSION_ID;
|
|
192
|
+
const prompt = await textOf(valueOf(ctx, "--prompt"));
|
|
193
|
+
const created = await ctx.api.post(
|
|
194
|
+
`/api/workspaces/${ws.id}/sessions`,
|
|
195
|
+
{ ...(agent ? { agent } : {}), ...(me ? { parent: me } : {}) },
|
|
196
|
+
);
|
|
197
|
+
const title = ctx.flag("--title");
|
|
198
|
+
if (title)
|
|
199
|
+
await ctx.api.patch(`/api/sessions/${created.id}`, { title });
|
|
200
|
+
// Sent, the session starts (detached) with it as its first
|
|
201
|
+
// prompt; otherwise it starts when someone opens it.
|
|
202
|
+
const sent = prompt
|
|
203
|
+
? await ctx.api.post(`/api/sessions/${created.id}/messages`, {
|
|
204
|
+
text: prompt,
|
|
205
|
+
...(me ? { from: me } : {}),
|
|
206
|
+
reply: !ctx.has("--no-reply"),
|
|
207
|
+
})
|
|
208
|
+
: null;
|
|
209
|
+
const out = {
|
|
210
|
+
id: created.id,
|
|
211
|
+
agent: created.agent,
|
|
212
|
+
title: title || null,
|
|
213
|
+
workspace: ws.id,
|
|
214
|
+
parent: created.parent_id ?? null,
|
|
215
|
+
prompted: !!sent?.delivered,
|
|
216
|
+
queued: sent?.queued ?? null,
|
|
217
|
+
wantsReply: !!sent?.wantsReply,
|
|
218
|
+
href: `/w/${ws.id}?s=${created.id}`,
|
|
219
|
+
};
|
|
220
|
+
return ctx.out(out, (s) => {
|
|
221
|
+
console.log(
|
|
222
|
+
`started ${s.id} (${s.agent})${s.prompted ? " with its prompt" : ""}: [${s.title || s.agent}](${s.href})`,
|
|
223
|
+
);
|
|
224
|
+
if (s.queued)
|
|
225
|
+
console.log(`its prompt waits to be typed in: ${s.queued}`);
|
|
226
|
+
if (s.wantsReply)
|
|
227
|
+
console.log(
|
|
228
|
+
`Its last message, as that turn ends, comes back to you as a prompt: end your turn to wait for it, or run \`work session wait ${s.id}\`.`,
|
|
229
|
+
);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
case "send": {
|
|
233
|
+
const [id, ...words] = rest;
|
|
234
|
+
const text = await textOf(words.join(" "));
|
|
235
|
+
if (!id || !text)
|
|
236
|
+
ctx.die('usage: work session send <id> "<text>"|- [--no-reply]');
|
|
237
|
+
const me = process.env.WORK_SESSION_ID;
|
|
238
|
+
const r = await ctx.api.post(`/api/sessions/${id}/messages`, {
|
|
239
|
+
text,
|
|
240
|
+
...(me ? { from: me } : {}),
|
|
241
|
+
reply: !ctx.has("--no-reply"),
|
|
242
|
+
});
|
|
243
|
+
return ctx.out({ id, ...r }, (r) => console.log(sentText(id, r)));
|
|
244
|
+
}
|
|
245
|
+
case "wait": {
|
|
246
|
+
const me = sessionId(ctx);
|
|
247
|
+
const raw = ctx.flag("--timeout");
|
|
248
|
+
const seconds = raw === undefined ? WAIT_S : Number(raw);
|
|
249
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
250
|
+
ctx.die("--timeout is a number of seconds");
|
|
251
|
+
const until = Date.now() + seconds * 1000;
|
|
252
|
+
const body = rest.length ? { from: rest } : {};
|
|
253
|
+
const replies = [];
|
|
254
|
+
let owing = [];
|
|
255
|
+
for (;;) {
|
|
256
|
+
const r = await ctx.api.post(`/api/sessions/${me}/replies`, body);
|
|
257
|
+
replies.push(...r.replies);
|
|
258
|
+
if (!ctx.json) r.replies.forEach(printReply);
|
|
259
|
+
owing = r.owing;
|
|
260
|
+
if (!owing.length || Date.now() >= until) break;
|
|
261
|
+
await new Promise((res) => setTimeout(res, POLL_MS));
|
|
262
|
+
}
|
|
263
|
+
if (ctx.json)
|
|
264
|
+
console.log(JSON.stringify({ replies, owing }, null, 2));
|
|
265
|
+
else if (!replies.length && !owing.length)
|
|
266
|
+
console.log(
|
|
267
|
+
rest.length
|
|
268
|
+
? `nothing owed by ${rest.join(", ")}: a reply already typed in is in your prompt`
|
|
269
|
+
: "no session owes this one a reply",
|
|
270
|
+
);
|
|
271
|
+
if (owing.length) {
|
|
272
|
+
ctx.warn(
|
|
273
|
+
`still working: ${owing.map((o) => o.label).join(", ")} (wait again, or end your turn: the reply comes as a prompt)`,
|
|
274
|
+
);
|
|
275
|
+
process.exitCode = 124;
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
case "kill": {
|
|
280
|
+
const [id] = rest;
|
|
281
|
+
if (!id) ctx.die("usage: work session kill <id> --yes");
|
|
282
|
+
if (!ctx.yes)
|
|
283
|
+
ctx.die(
|
|
284
|
+
`closing ${id} ends the process in it${id === process.env.WORK_SESSION_ID ? " — this session, the one running this command" : ""}: pass --yes`,
|
|
285
|
+
);
|
|
286
|
+
await ctx.api.del(`/api/sessions/${id}`);
|
|
287
|
+
return ctx.out({ id, killed: true }, () =>
|
|
288
|
+
console.log(`closed ${id}`),
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
default:
|
|
292
|
+
ctx.die(`no \`work session ${verb}\` (see: work help session)`);
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
];
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// `work skill`: the machine's skills — what every agent CLI here can see —
|
|
2
|
+
// as Settings → Skills lists, adds, updates and removes them.
|
|
3
|
+
import { follow } from "./_progress.mjs";
|
|
4
|
+
|
|
5
|
+
function printList(snap) {
|
|
6
|
+
const rows = snap.global || [];
|
|
7
|
+
if (!snap.available)
|
|
8
|
+
console.log(
|
|
9
|
+
"the skills CLI is not installed, so skills can be listed but not added (work setup installs it)",
|
|
10
|
+
);
|
|
11
|
+
if (!rows.length) return console.log("no skills installed");
|
|
12
|
+
const w = Math.max(4, ...rows.map((s) => s.id.length));
|
|
13
|
+
for (const s of rows) {
|
|
14
|
+
const from = s.source ? ` ${s.source}` : "";
|
|
15
|
+
const broken = s.broken ? " (broken link)" : "";
|
|
16
|
+
console.log(`${s.id.padEnd(w)}${from}${broken}`);
|
|
17
|
+
if (s.description) console.log(`${"".padEnd(w)} ${s.description}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** One skill action through the route Settings uses, its progress (the
|
|
22
|
+
* skills CLI's own output) on stderr; the machine's skills after it. */
|
|
23
|
+
function act(ctx, body, op) {
|
|
24
|
+
return follow(ctx, op, () => ctx.api.post("/api/skills", body));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** @type {Array<{name: string, summary: string, help: string, run: (ctx: any) => Promise<void>}>} */
|
|
28
|
+
export const commands = [
|
|
29
|
+
{
|
|
30
|
+
name: "skill",
|
|
31
|
+
summary: "machine skills: list | add | rm | update",
|
|
32
|
+
help: `work skill [list]
|
|
33
|
+
The skills every agent CLI on this machine can see (Settings → Skills):
|
|
34
|
+
each one's id, where it came from, and what it does.
|
|
35
|
+
work skill add <source> [--skill <name>]
|
|
36
|
+
Add skills from a source the skills CLI understands (owner/repo, a git
|
|
37
|
+
URL, a path): every skill it ships, or the one --skill names.
|
|
38
|
+
work skill rm <id>
|
|
39
|
+
Remove an installed skill.
|
|
40
|
+
work skill update [<id>]
|
|
41
|
+
Update one skill from its source, or every skill that has one.`,
|
|
42
|
+
async run(ctx) {
|
|
43
|
+
const [verb = "list", arg] = ctx.parse(["--skill"]);
|
|
44
|
+
if (verb === "list") {
|
|
45
|
+
const snap = await ctx.api.get("/api/skills");
|
|
46
|
+
return ctx.out(snap.global || [], () => printList(snap));
|
|
47
|
+
}
|
|
48
|
+
if (verb === "add") {
|
|
49
|
+
if (!arg) ctx.die("name the source: work skill add <owner/repo|url>");
|
|
50
|
+
const skill = ctx.args.includes("--skill")
|
|
51
|
+
? ctx.flag("--skill")
|
|
52
|
+
: undefined;
|
|
53
|
+
const snap = await act(
|
|
54
|
+
ctx,
|
|
55
|
+
{ action: "add", source: arg, skill },
|
|
56
|
+
`skills:${skill ? `${arg}#${skill}` : arg}`,
|
|
57
|
+
);
|
|
58
|
+
return ctx.out(snap.global || [], () =>
|
|
59
|
+
console.log(
|
|
60
|
+
`added ${skill ?? "the skills of"} ${skill ? "from " : ""}${arg}`,
|
|
61
|
+
),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
if (verb === "rm" || verb === "remove") {
|
|
65
|
+
if (!arg) ctx.die("name the skill: work skill rm <id>");
|
|
66
|
+
const snap = await act(
|
|
67
|
+
ctx,
|
|
68
|
+
{ action: "remove", id: arg },
|
|
69
|
+
`skills:${arg}`,
|
|
70
|
+
);
|
|
71
|
+
return ctx.out(snap.global || [], () => console.log(`removed ${arg}`));
|
|
72
|
+
}
|
|
73
|
+
if (verb === "update") {
|
|
74
|
+
let ids = arg ? [arg] : [];
|
|
75
|
+
if (!arg) {
|
|
76
|
+
const snap = await ctx.api.get("/api/skills");
|
|
77
|
+
ids = (snap.global || [])
|
|
78
|
+
.filter((s) => s.source && s.source !== "local")
|
|
79
|
+
.map((s) => s.id);
|
|
80
|
+
if (!ids.length) {
|
|
81
|
+
ctx.out([], () =>
|
|
82
|
+
console.log("no skill has a source to update from"),
|
|
83
|
+
);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
let snap = null;
|
|
88
|
+
for (const id of ids) {
|
|
89
|
+
process.stderr.write(` updating ${id}\n`);
|
|
90
|
+
snap = await act(ctx, { action: "update", id }, `skills:${id}`);
|
|
91
|
+
}
|
|
92
|
+
return ctx.out(snap?.global || [], () =>
|
|
93
|
+
console.log(`updated ${ids.join(", ")}`),
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
ctx.die(`no skill verb ${verb} (list, add, rm, update)`);
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// `work stack`: how to stack branches here, with this workspace's branch
|
|
2
|
+
// in place. Kept out of the workspace AGENTS.md, which every session reads
|
|
3
|
+
// whole: stacking is for when the user asks, and the recipe was a quarter
|
|
4
|
+
// of that file.
|
|
5
|
+
|
|
6
|
+
function recipe(branch) {
|
|
7
|
+
return `Stacking ${branch}
|
|
8
|
+
|
|
9
|
+
Stack only when the user asks, or when a change of several hundred lines
|
|
10
|
+
splits into parts each worth merging alone; never a layer per commit.
|
|
11
|
+
|
|
12
|
+
- The working branch (${branch}) stays the top; cut layers below it, bottom
|
|
13
|
+
first, as ${branch}-<layer>:
|
|
14
|
+
gh stack init --base <base> <layers…> ${branch}
|
|
15
|
+
(after \`gh stack unstack --local\` if a stack exists).
|
|
16
|
+
- Never check a layer out. Edit one by \`git commit --fixup <sha>\` on the
|
|
17
|
+
top, then:
|
|
18
|
+
GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash --update-refs origin/<base>
|
|
19
|
+
- \`gh stack sync\` / \`gh stack rebase\` switch branches: run them in topic
|
|
20
|
+
worktrees only. Leave the local <base> gh-stack keeps as trunk.
|
|
21
|
+
- Merge a layer with \`gh stack merge <pr> --squash\` or on the web
|
|
22
|
+
(\`gh pr merge\` refuses it), then, on the top:
|
|
23
|
+
old=$(git rev-parse origin/${branch})
|
|
24
|
+
git fetch
|
|
25
|
+
git branch -f <layer> origin/<layer> # for each remaining layer
|
|
26
|
+
git branch -D <merged-layer>
|
|
27
|
+
git rebase --onto origin/${branch} $old
|
|
28
|
+
- Once the top merges: \`gh stack unstack --local\`.
|
|
29
|
+
- Link a layer for review as [<layer>](/w/<id>/review?section=<repo>@<layer>);
|
|
30
|
+
\`work branches\` lists every layer with its link.`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const commands = [
|
|
34
|
+
{
|
|
35
|
+
name: "stack",
|
|
36
|
+
summary: "how to stack branches in this workspace (prints the recipe)",
|
|
37
|
+
help: `work stack [id|name]
|
|
38
|
+
Prints how to stack branches with gh-stack here, with the workspace's
|
|
39
|
+
branch filled in: when to, cutting layers, editing one without checking
|
|
40
|
+
it out, merging a layer and rebasing the rest.`,
|
|
41
|
+
async run(ctx) {
|
|
42
|
+
let branch = "<workspace-branch>";
|
|
43
|
+
try {
|
|
44
|
+
if (ctx.positional[0] || process.env.WORK_SESSION_ID) {
|
|
45
|
+
branch = (await ctx.resolveWorkspace(ctx.positional[0])).ws.branch;
|
|
46
|
+
}
|
|
47
|
+
} catch {}
|
|
48
|
+
ctx.out({ branch, recipe: recipe(branch) }, (d) => console.log(d.recipe));
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
];
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// `work status`: the machine and the service in one look — how the server
|
|
2
|
+
// runs (its own config, not the unit file's), the agents, language servers
|
|
3
|
+
// and skills, what `work doctor` would say is missing, and the settings
|
|
4
|
+
// changed from their defaults. One request each, side by side.
|
|
5
|
+
import { shown } from "./config.mjs";
|
|
6
|
+
|
|
7
|
+
export const commands = [
|
|
8
|
+
{
|
|
9
|
+
name: "status",
|
|
10
|
+
summary: "the service, agents, languages, skills and changed settings",
|
|
11
|
+
help: `work status [--json]
|
|
12
|
+
one snapshot of this machine's work: version, address and names it
|
|
13
|
+
answers to, direct connections, data and work root, agents (installed,
|
|
14
|
+
switched off, the default), language servers, skills, what is missing
|
|
15
|
+
(work doctor), and the settings changed from their defaults`,
|
|
16
|
+
async run(ctx) {
|
|
17
|
+
const [server, settings, agents, lsp, skills, setup] = await Promise.all([
|
|
18
|
+
ctx.api.get("/api/config"),
|
|
19
|
+
ctx.api.get("/api/settings/values"),
|
|
20
|
+
ctx.api.get("/api/settings"),
|
|
21
|
+
ctx.api.get("/api/lsp"),
|
|
22
|
+
ctx.api.get("/api/skills"),
|
|
23
|
+
ctx.api.get("/api/setup"),
|
|
24
|
+
]);
|
|
25
|
+
const snapshot = {
|
|
26
|
+
version: server.version,
|
|
27
|
+
server,
|
|
28
|
+
agents: {
|
|
29
|
+
default: agents.preferredAgent,
|
|
30
|
+
enabled: agents.agents,
|
|
31
|
+
disabled: agents.disabledAgents,
|
|
32
|
+
installable: (setup.agents || [])
|
|
33
|
+
.filter((a) => !a.installed)
|
|
34
|
+
.map((a) => a.id),
|
|
35
|
+
},
|
|
36
|
+
languages: {
|
|
37
|
+
on: lsp.on,
|
|
38
|
+
installed: lsp.servers.filter((s) => s.installed).map((s) => s.id),
|
|
39
|
+
off: lsp.servers.filter((s) => !s.enabled).map((s) => s.id),
|
|
40
|
+
},
|
|
41
|
+
skills: [...(skills.global || [])].map((s) => s.id ?? s.name ?? s),
|
|
42
|
+
doctor: { ready: setup.ready, missing: setup.missing },
|
|
43
|
+
settings: settings.filter((e) => !e.isDefault),
|
|
44
|
+
};
|
|
45
|
+
ctx.out(snapshot, (s) => {
|
|
46
|
+
const sv = s.server;
|
|
47
|
+
const list = (xs) => (xs.length ? xs.join(", ") : "none");
|
|
48
|
+
const rows = [
|
|
49
|
+
["work", `${s.version} on ${sv.listen}:${sv.port}`],
|
|
50
|
+
[
|
|
51
|
+
"names",
|
|
52
|
+
sv.allowedHosts.length
|
|
53
|
+
? `${sv.allowedHosts.join(", ")} (ports as ${sv.portHosts === "dash" ? "<port>-<name>" : "<port>.<name>"})`
|
|
54
|
+
: "this machine's own",
|
|
55
|
+
],
|
|
56
|
+
["proxies", list(sv.trustedProxies)],
|
|
57
|
+
["direct", sv.rtc.on ? `on, UDP ${sv.rtc.port}` : "off"],
|
|
58
|
+
["root", sv.workRoot],
|
|
59
|
+
["data", sv.dataDir],
|
|
60
|
+
[
|
|
61
|
+
"agents",
|
|
62
|
+
`${list(s.agents.enabled)}; default ${s.agents.default}${s.agents.disabled.length ? `; off: ${s.agents.disabled.join(", ")}` : ""}`,
|
|
63
|
+
],
|
|
64
|
+
[
|
|
65
|
+
"languages",
|
|
66
|
+
`${s.languages.on ? "on" : "off"}; installed: ${list(s.languages.installed)}${s.languages.off.length ? `; off: ${s.languages.off.join(", ")}` : ""}`,
|
|
67
|
+
],
|
|
68
|
+
["skills", list(s.skills)],
|
|
69
|
+
[
|
|
70
|
+
"machine",
|
|
71
|
+
s.doctor.ready
|
|
72
|
+
? "ready"
|
|
73
|
+
: `not ready: ${list(s.doctor.missing)} (work doctor)`,
|
|
74
|
+
],
|
|
75
|
+
[
|
|
76
|
+
"settings",
|
|
77
|
+
s.settings.length
|
|
78
|
+
? s.settings.map((e) => `${e.key}=${shown(e.value)}`).join(", ")
|
|
79
|
+
: "all at their defaults (work config list)",
|
|
80
|
+
],
|
|
81
|
+
];
|
|
82
|
+
for (const [k, v] of rows) console.log(`${ctx.pad(k, 10)} ${v}`);
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
];
|