@dylanpiercey/work 0.2.60 → 0.2.61
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/cli/session.mjs +200 -14
- package/dist/{_D2Un1mYs.js → _B9Ht5uEb.js} +73 -73
- package/dist/{_xM2b0RL4.js → _BL9uMFqY.js} +114 -5
- package/dist/_BOUuiLtz.js +2 -0
- package/dist/_C-c452mk.js +2 -0
- package/dist/{_B5_rwv2K.js → _C_xIwbCY.js} +197 -34
- package/dist/index.mjs +1419 -1291
- package/dist/public/assets/{_BNkBAy5A.js → _1M9MHpr1.js} +4 -4
- package/dist/public/assets/_1M9MHpr1.js.br +0 -0
- package/dist/public/assets/{_CjvUwJV3.js → _1iHjriqb.js} +1 -1
- package/dist/public/assets/_1iHjriqb.js.br +0 -0
- package/dist/public/assets/_1qBtkRvx.js +1 -0
- package/dist/public/assets/_2nQe3LjC.js +1 -0
- package/dist/public/assets/_4ewvphym.js +1 -0
- package/dist/public/assets/{_1mxz_fw8.js → _5He5o5t7.js} +1 -1
- package/dist/public/assets/_5He5o5t7.js.br +0 -0
- package/dist/public/assets/{_C8RN45Ay.js → _6ewv3mA5.js} +1 -1
- package/dist/public/assets/_6ewv3mA5.js.br +0 -0
- package/dist/public/assets/{_CYpdFsNd.js → _6rWYgbg6.js} +1 -1
- package/dist/public/assets/_6rWYgbg6.js.br +0 -0
- package/dist/public/assets/_7t7yKWpa.js +1 -0
- package/dist/public/assets/{_DYi5YY3I.js → _B-3-Kwot.js} +1 -1
- package/dist/public/assets/_B-3-Kwot.js.br +0 -0
- package/dist/public/assets/{_DGQlaxcF.js → _B0HNJv7u.js} +1 -1
- package/dist/public/assets/_B0HNJv7u.js.br +0 -0
- package/dist/public/assets/{_6JNHubX8.js → _B6PUN-tp.js} +1 -1
- package/dist/public/assets/_B6PUN-tp.js.br +0 -0
- package/dist/public/assets/{_Bqi4KjfY.js → _B6VYaIpc.js} +1 -1
- package/dist/public/assets/_B6VYaIpc.js.br +0 -0
- package/dist/public/assets/_B6ceJBbO.js +1 -0
- package/dist/public/assets/_B7NviIFq.js +1 -0
- package/dist/public/assets/_B8gE8WA6.js +86 -0
- package/dist/public/assets/_B8gE8WA6.js.br +0 -0
- package/dist/public/assets/_B9ws5F2C.js +1 -0
- package/dist/public/assets/{_BPyRGDdd.js → _BDnGUv95.js} +1 -1
- package/dist/public/assets/{_Rm81HrZo.js → _BEtdOczI.js} +1 -1
- package/dist/public/assets/_BEtdOczI.js.br +0 -0
- package/dist/public/assets/{_Snm0yKaj.js → _BGRrgyaE.js} +2 -2
- package/dist/public/assets/_BGRrgyaE.js.br +0 -0
- package/dist/public/assets/{_C4YyHuhB.js → _BGxqjHZb.js} +1 -1
- package/dist/public/assets/_BGxqjHZb.js.br +0 -0
- package/dist/public/assets/_BHygu0_A.js +1 -0
- package/dist/public/assets/_BHypB4VD.js +1 -0
- package/dist/public/assets/{_rFLxxyKo.js → _BIKcay8j.js} +1 -1
- package/dist/public/assets/_BIKcay8j.js.br +0 -0
- package/dist/public/assets/{_fJWjSk9f.js → _BJx3EMC_.js} +1 -1
- package/dist/public/assets/_BJx3EMC_.js.br +0 -0
- package/dist/public/assets/_BM3KTUUE.js +1 -0
- package/dist/public/assets/{_CYWrzltT.js → _BPWsZBZv.js} +1 -1
- package/dist/public/assets/_BPWsZBZv.js.br +0 -0
- package/dist/public/assets/_BQbkNtg1.js +1 -0
- package/dist/public/assets/_BWcnWDQk.js +1 -0
- package/dist/public/assets/{_BG-zRRiX.js → _BY7cv0ys.js} +1 -1
- package/dist/public/assets/_BY7cv0ys.js.br +0 -0
- package/dist/public/assets/{_kZt7n5RY.js → _BYvxQm8J.js} +1 -1
- package/dist/public/assets/_BYvxQm8J.js.br +0 -0
- package/dist/public/assets/{_D-K2gNHz.js → _BaD4WyB1.js} +1 -1
- package/dist/public/assets/_BaD4WyB1.js.br +0 -0
- package/dist/public/assets/_BcG7z1_1.js +1 -0
- package/dist/public/assets/{_kc4p4uHI.js → _BdHPe50y.js} +1 -1
- package/dist/public/assets/_BdHPe50y.js.br +0 -0
- package/dist/public/assets/{_DfkI0VMD.js → _BddCrZGZ.js} +1 -1
- package/dist/public/assets/_BddCrZGZ.js.br +0 -0
- package/dist/public/assets/_BdeatKVZ.js +1 -0
- package/dist/public/assets/{_D66U5RHc.js → _BebRyIKd.js} +1 -1
- package/dist/public/assets/_BebRyIKd.js.br +0 -0
- package/dist/public/assets/{_DdvVmpgX.js → _BhQ7Emig.js} +1 -1
- package/dist/public/assets/_BhQ7Emig.js.br +0 -0
- package/dist/public/assets/_BhcB0Jvd.js +1 -0
- package/dist/public/assets/_Bis2U6ul.js +1 -0
- package/dist/public/assets/_BnKs6Y7b.js +1 -0
- package/dist/public/assets/{_Bs3qB-Cr.js → _BtkYehYU.js} +1 -1
- package/dist/public/assets/_Btl8aL-I.js +1 -0
- package/dist/public/assets/{_CsIiSuNi.js → _BtlULsgn.js} +1 -1
- package/dist/public/assets/_BtlULsgn.js.br +0 -0
- package/dist/public/assets/_BvDuaiKP.js +1 -0
- package/dist/public/assets/{_CJlGZ_RW.js → _Bxjcg3sg.js} +1 -1
- package/dist/public/assets/_Bxjcg3sg.js.br +0 -0
- package/dist/public/assets/_Byy6u2e7.js +1 -0
- package/dist/public/assets/{_D68dPn0w.js → _C0HZTgdl.js} +1 -1
- package/dist/public/assets/_C0HZTgdl.js.br +0 -0
- package/dist/public/assets/_C0Jef_3I.js +1 -0
- package/dist/public/assets/_C1mN-2aV.js +1 -0
- package/dist/public/assets/{_sXLFin3G.js → _C7K8numy.js} +1 -1
- package/dist/public/assets/_C7afA5Pq.js +1 -0
- package/dist/public/assets/_C9ZuXn8H.js +1 -0
- package/dist/public/assets/_C9cXYWeE.js +1 -0
- package/dist/public/assets/_C9ozBH6U.js +1 -0
- package/dist/public/assets/_CAVEnS_f.js +1 -0
- package/dist/public/assets/_CBUTWKoU.js +1 -0
- package/dist/public/assets/_CC2BARPD.js +1 -0
- package/dist/public/assets/{_kD85MWJq.js → _CC6W1hMq.js} +1 -1
- package/dist/public/assets/_CC6W1hMq.js.br +0 -0
- package/dist/public/assets/{_hMziBcP-.js → _CCf6C_ZP.js} +1 -1
- package/dist/public/assets/_CCf6C_ZP.js.br +0 -0
- package/dist/public/assets/_CCfbCJD0.js +1 -0
- package/dist/public/assets/{_CKeIFx0z.js → _CGGq6g--.js} +1 -1
- package/dist/public/assets/{_CKeIFx0z.js.br → _CGGq6g--.js.br} +0 -0
- package/dist/public/assets/_CGNUX808.js +1 -0
- package/dist/public/assets/{_DUAuUft5.js → _CGfEXDbf.js} +1 -1
- package/dist/public/assets/_CGfEXDbf.js.br +0 -0
- package/dist/public/assets/{_BownQpIP.js → _CHAVfXDI.js} +1 -1
- package/dist/public/assets/{_BownQpIP.js.br → _CHAVfXDI.js.br} +0 -0
- package/dist/public/assets/_CHlWQtx9.js +1 -0
- package/dist/public/assets/{_XqOjFD-V.js → _CIgPn4df.js} +1 -1
- package/dist/public/assets/_CIgPn4df.js.br +0 -0
- package/dist/public/assets/_CImHsBRX.js +1 -0
- package/dist/public/assets/{_CgyDQNWM.js → _CJ4GrTCz.js} +1 -1
- package/dist/public/assets/_CJ4GrTCz.js.br +0 -0
- package/dist/public/assets/{_B0Kz6DRP.js → _CJC5kn96.js} +1 -1
- package/dist/public/assets/_CJC5kn96.js.br +0 -0
- package/dist/public/assets/{_BFxxHHlG.js → _CKBJswt8.js} +1 -1
- package/dist/public/assets/_CKBJswt8.js.br +0 -0
- package/dist/public/assets/{_DDZv_pCc.js → _CM4a5-CR.js} +1 -1
- package/dist/public/assets/_CM4a5-CR.js.br +0 -0
- package/dist/public/assets/{_LWgmax5s.js → _CN7EjN94.js} +1 -1
- package/dist/public/assets/_CN7EjN94.js.br +0 -0
- package/dist/public/assets/_CUL-wOvV.js +1 -0
- package/dist/public/assets/{_CW6i23WO.js → _CVjgxkQ9.js} +1 -1
- package/dist/public/assets/_CVjgxkQ9.js.br +0 -0
- package/dist/public/assets/{_D0MMtje0.js → _CWUlXPKy.js} +1 -1
- package/dist/public/assets/_CWUlXPKy.js.br +0 -0
- package/dist/public/assets/_CYckbz_f.js +1 -0
- package/dist/public/assets/{_DgwgtBl-.js → _CbsneFgz.js} +1 -1
- package/dist/public/assets/_CbsneFgz.js.br +0 -0
- package/dist/public/assets/{_C246C-83.js → _Cc9MzNxF.js} +1 -1
- package/dist/public/assets/_Cc9MzNxF.js.br +0 -0
- package/dist/public/assets/{_CmQerv0f.js → _Cdni-eWy.js} +1 -1
- package/dist/public/assets/{_dFodER3o.js → _CeMhDOSt.js} +2 -2
- package/dist/public/assets/_CeMhDOSt.js.br +0 -0
- package/dist/public/assets/_ChBDbmf7.js +1 -0
- package/dist/public/assets/_ChGQj9eR.js +1 -0
- package/dist/public/assets/_Chf8ZoVS.js +1 -0
- package/dist/public/assets/{_JbTe9y6j.js → _Ck08fiPA.js} +1 -1
- package/dist/public/assets/_Ck08fiPA.js.br +0 -0
- package/dist/public/assets/_CkN9E0Xp.js +1 -0
- package/dist/public/assets/_Cl_zImN1.js +1 -0
- package/dist/public/assets/{_OcFuZvAI.js → _Cn7clqxy.js} +1 -1
- package/dist/public/assets/_Cn7clqxy.js.br +0 -0
- package/dist/public/assets/_CnIPZvpz.js +1 -0
- package/dist/public/assets/_Cp25PjdE.js +1 -0
- package/dist/public/assets/{_KK2KF52X.js → _CpuLnwfk.js} +1 -1
- package/dist/public/assets/_CpuLnwfk.js.br +0 -0
- package/dist/public/assets/{_P2hfcmq2.js → _CqNUcaPa.js} +1 -1
- package/dist/public/assets/_CqNUcaPa.js.br +0 -0
- package/dist/public/assets/{_DSyaHlgp.js → _Cs0MriF4.js} +1 -1
- package/dist/public/assets/_Cs0MriF4.js.br +0 -0
- package/dist/public/assets/_Cu45JMqZ.js +1 -0
- package/dist/public/assets/{_CexMUoXX.js → _CuKWFVdv.js} +1 -1
- package/dist/public/assets/_CuKWFVdv.js.br +0 -0
- package/dist/public/assets/{_DKxPCb7m.js → _Cvxy6Mq1.js} +1 -1
- package/dist/public/assets/_Cvxy6Mq1.js.br +0 -0
- package/dist/public/assets/{_DsOKce00.js → _CwrlFqhW.js} +1 -1
- package/dist/public/assets/_CwrlFqhW.js.br +0 -0
- package/dist/public/assets/_CxI0pSsi.js +1 -0
- package/dist/public/assets/_Cz0f9sHm.js +1 -0
- package/dist/public/assets/{_wCgLIMkx.js → _D-VgQdXB.js} +5 -5
- package/dist/public/assets/_D-VgQdXB.js.br +0 -0
- package/dist/public/assets/{_ByBX1AAI.js → _D1dV1Q6j.js} +2 -2
- package/dist/public/assets/_D1dV1Q6j.js.br +0 -0
- package/dist/public/assets/_D1iAtMBs.js +1 -0
- package/dist/public/assets/{_MT3fiPYA.js → _D43dLMCh.js} +1 -1
- package/dist/public/assets/{_CedBoWcu.js → _D4lINOjT.js} +1 -1
- package/dist/public/assets/_D4lINOjT.js.br +0 -0
- package/dist/public/assets/_D4ueecmJ.js +1 -0
- package/dist/public/assets/_D5h6fRep.js +1 -0
- package/dist/public/assets/_D6IvPBfb.js +1 -0
- package/dist/public/assets/_D9ScGzNM.js +1 -0
- package/dist/public/assets/_D9u0Cq08.js +1 -0
- package/dist/public/assets/_DAh9xj4z.js +1 -0
- package/dist/public/assets/{_BbWeELba.js → _DCeEZcpj.js} +1 -1
- package/dist/public/assets/{_CmB1kfhT.js → _DCyBrQiT.js} +1 -1
- package/dist/public/assets/_DCyBrQiT.js.br +0 -0
- package/dist/public/assets/{_C_LsIBgT.js → _DDJ3dt8-.js} +1 -1
- package/dist/public/assets/_DDJ3dt8-.js.br +0 -0
- package/dist/public/assets/{_BT7IZUlM.js → _DEMvMjoa.js} +1 -1
- package/dist/public/assets/_DEMvMjoa.js.br +0 -0
- package/dist/public/assets/{_CNvP7-_g.js → _DFhL3EEm.js} +1 -1
- package/dist/public/assets/_DFhL3EEm.js.br +0 -0
- package/dist/public/assets/_DGUxMgko.js +1 -0
- package/dist/public/assets/{_CsrDw2HV.js → _DHCrm5ed.js} +1 -1
- package/dist/public/assets/_DHCrm5ed.js.br +0 -0
- package/dist/public/assets/_DHUWNOjf.js +1 -0
- package/dist/public/assets/{_CEnGHCTE.js → _DHZP-s4_.js} +1 -1
- package/dist/public/assets/_DHZP-s4_.js.br +0 -0
- package/dist/public/assets/{_BT6HfYe8.js → _DHqkwtr1.js} +1 -1
- package/dist/public/assets/_DHqkwtr1.js.br +0 -0
- package/dist/public/assets/{_B3M5E-Om.js → _DIXlAgAo.js} +1 -1
- package/dist/public/assets/_DIXlAgAo.js.br +0 -0
- package/dist/public/assets/_DMVf4w58.js +1 -0
- package/dist/public/assets/{_BA3sDawp.js → _DMe9PjW_.js} +1 -1
- package/dist/public/assets/_DMe9PjW_.js.br +0 -0
- package/dist/public/assets/{_HHcjPPQg.js → _DN99neYY.js} +1 -1
- package/dist/public/assets/_DN99neYY.js.br +0 -0
- package/dist/public/assets/_DNInqNFa.js +1 -0
- package/dist/public/assets/_DNbAWwA5.js +1 -0
- package/dist/public/assets/{_Bej9uABx.js → _DNe5bCXT.js} +1 -1
- package/dist/public/assets/_DNe5bCXT.js.br +0 -0
- package/dist/public/assets/{_DqG7LJE3.js → _DNvhs-9s.js} +1 -1
- package/dist/public/assets/_DNvhs-9s.js.br +0 -0
- package/dist/public/assets/{_ClQ_uypw.js → _DOz8rbsD.js} +1 -1
- package/dist/public/assets/_DOz8rbsD.js.br +0 -0
- package/dist/public/assets/{_DL18-mb9.js → _DUt5QxFc.js} +1 -1
- package/dist/public/assets/_DUt5QxFc.js.br +0 -0
- package/dist/public/assets/_DXMQSCF1.js +1 -0
- package/dist/public/assets/_DXNlyOmS.js +1 -0
- package/dist/public/assets/{_DZGhFAI6.js → _DZAbjGP5.js} +1 -1
- package/dist/public/assets/_DZAbjGP5.js.br +0 -0
- package/dist/public/assets/{_CElcQNRx.js → _D_Yn427h.js} +1 -1
- package/dist/public/assets/_D_Yn427h.js.br +0 -0
- package/dist/public/assets/_D_deUIjY.js +1 -0
- package/dist/public/assets/_D_f11l7s.js +1 -0
- package/dist/public/assets/_Da0PYXht.js +1 -0
- package/dist/public/assets/_DaAdED3q.js +1 -0
- package/dist/public/assets/{_BZox64kw.js → _DbBSulnh.js} +1 -1
- package/dist/public/assets/_DbBSulnh.js.br +0 -0
- package/dist/public/assets/{_C5rKz3O1.js → _DdI3WOOu.js} +1 -1
- package/dist/public/assets/_DdI3WOOu.js.br +0 -0
- package/dist/public/assets/{_CtYeoHds.js → _DgHYvonX.js} +1 -1
- package/dist/public/assets/_DgHYvonX.js.br +0 -0
- package/dist/public/assets/_DhN7o6Ne.js +1 -0
- package/dist/public/assets/{_D0LoYy3P.js → _DmZ5cT_v.js} +1 -1
- package/dist/public/assets/_DmZ5cT_v.js.br +0 -0
- package/dist/public/assets/{_C2qWHQF6.js → _DnNiNorU.js} +1 -1
- package/dist/public/assets/_DnNiNorU.js.br +0 -0
- package/dist/public/assets/_DpN3KO3M.js +1 -0
- package/dist/public/assets/{_CeTSn3Od.js → _Dr_Skm22.js} +1 -1
- package/dist/public/assets/_Dr_Skm22.js.br +0 -0
- package/dist/public/assets/_Ds9CTiBL.js +1 -0
- package/dist/public/assets/{_BVEoZ0DQ.js → _DuYh7Arh.js} +1 -1
- package/dist/public/assets/_DuYh7Arh.js.br +0 -0
- package/dist/public/assets/{_BzNb_fHh.js → _DwsU8vHs.js} +1 -1
- package/dist/public/assets/_DwsU8vHs.js.br +0 -0
- package/dist/public/assets/_HFLU3Kbz.js +1 -0
- package/dist/public/assets/{_CA1oqi-5.js → _HulXSFpf.js} +1 -1
- package/dist/public/assets/_HulXSFpf.js.br +0 -0
- package/dist/public/assets/{_DShsNCa4.js → _J4nOuw2W.js} +1 -1
- package/dist/public/assets/_J4nOuw2W.js.br +0 -0
- package/dist/public/assets/{_CCxaMhJi.js → _MRXD6ehk.js} +1 -1
- package/dist/public/assets/_MRXD6ehk.js.br +0 -0
- package/dist/public/assets/{_Dbe9iebB.js → _MUa3gMNv.js} +1 -1
- package/dist/public/assets/_MUa3gMNv.js.br +0 -0
- package/dist/public/assets/_O-SYF5Nk.js +1 -0
- package/dist/public/assets/{_I3lY44aU.js → _RFrpb9Ha.js} +1 -1
- package/dist/public/assets/_RFrpb9Ha.js.br +0 -0
- package/dist/public/assets/_RMebfppo.js +1 -0
- package/dist/public/assets/{_DRlVO8QP.js → _Swxzqlit.js} +1 -1
- package/dist/public/assets/_Swxzqlit.js.br +0 -0
- package/dist/public/assets/{_Or5LYSbi.js → _UDmUoKIC.js} +1 -1
- package/dist/public/assets/_UDmUoKIC.js.br +0 -0
- package/dist/public/assets/_UxzHQvNT.js +1 -0
- package/dist/public/assets/{_CE0EY_Im.js → _WgfFq_Do.js} +1 -1
- package/dist/public/assets/_WgfFq_Do.js.br +0 -0
- package/dist/public/assets/_XcAI8-9B.js +1 -0
- package/dist/public/assets/_YGydnIyp.js +1 -0
- package/dist/public/assets/_b_CH4bu2.js +1 -0
- package/dist/public/assets/{_53BxL5eV.js → _c7zRIjHP.js} +1 -1
- package/dist/public/assets/_c7zRIjHP.js.br +0 -0
- package/dist/public/assets/_fU0PViTg.js +1 -0
- package/dist/public/assets/{_DahJWFLJ.js → _hHqgYaxa.js} +1 -1
- package/dist/public/assets/_hHqgYaxa.js.br +0 -0
- package/dist/public/assets/_itjOM1FD.js +1 -0
- package/dist/public/assets/{_DeRYTpbW.js → _kIYW-eJI.js} +1 -1
- package/dist/public/assets/_kIYW-eJI.js.br +0 -0
- package/dist/public/assets/{_BUmmoPn7.js → _kehetK1Y.js} +1 -1
- package/dist/public/assets/_kehetK1Y.js.br +0 -0
- package/dist/public/assets/_n32vwmPP.js +1 -0
- package/dist/public/assets/_nu5sxOiC.js +1 -0
- package/dist/public/assets/{_CRE2rTXU.js → _nx6SRfAG.js} +1 -1
- package/dist/public/assets/_nx6SRfAG.js.br +0 -0
- package/dist/public/assets/_rzQNPp63.js +1 -0
- package/dist/public/assets/{_AYM7pfPo.js → _s108OSTO.js} +9 -9
- package/dist/public/assets/_s108OSTO.js.br +0 -0
- package/dist/public/assets/{_DWjO1Fu_.js → _s8oTLaz7.js} +1 -1
- package/dist/public/assets/_s8oTLaz7.js.br +0 -0
- package/dist/public/assets/_sGh2cRNa.js +1 -0
- package/dist/public/assets/{_DYeFvJQu.js → _tEcZZwlO.js} +1 -1
- package/dist/public/assets/_tEcZZwlO.js.br +0 -0
- package/dist/public/assets/_tlbar1jD.js +1 -0
- package/dist/public/assets/{_BS-RHEk-.js → _wxIhRCmz.js} +1 -1
- package/dist/public/assets/_wxIhRCmz.js.br +0 -0
- package/dist/public/assets/{_B1aMR3_0.js → _zJAnptdJ.js} +1 -1
- package/dist/public/assets/_zJAnptdJ.js.br +0 -0
- package/dist/public/assets/files-view-Dg57HlHF.js +2 -0
- package/dist/public/assets/manage-workspace-BazG09dP.js +2 -0
- package/dist/public/assets/new-t0MBwonM.js +1 -0
- package/dist/public/assets/new-workspace-DWbeKl9K.js +2 -0
- package/dist/public/assets/review-view-DQKlW8dy.js +2 -0
- package/dist/public/assets/settings-page-BfuiuiBv.js +2 -0
- package/dist/public/assets/settings-t0MBwonM.js +1 -0
- package/dist/public/assets/{styles-B57UQpsl.css → styles-28seHTNr.css} +1 -1
- package/dist/public/assets/styles-28seHTNr.css.br +0 -0
- package/dist/public/assets/w-t0MBwonM.js +1 -0
- package/dist/public/assets/w._-B51oFPgz.js +1 -0
- package/dist/public/assets/w._-DaZM3c5u.js +1 -0
- package/dist/public/assets/w._-t0MBwonM.js +1 -0
- package/package.json +1 -1
- package/dist/_BA6kJ94f.js +0 -2
- package/dist/_T5K2qs5u.js +0 -2
- package/dist/public/assets/_1k8H5Us1.js +0 -1
- package/dist/public/assets/_1mxz_fw8.js.br +0 -0
- package/dist/public/assets/_3vnvc5Ld.js +0 -1
- package/dist/public/assets/_4VEn8isc.js +0 -1
- package/dist/public/assets/_52UKdAZX.js +0 -1
- package/dist/public/assets/_53BxL5eV.js.br +0 -0
- package/dist/public/assets/_6JNHubX8.js.br +0 -0
- package/dist/public/assets/_7vo1ZYPl.js +0 -1
- package/dist/public/assets/_AYM7pfPo.js.br +0 -0
- package/dist/public/assets/_B0Kz6DRP.js.br +0 -0
- package/dist/public/assets/_B1UZEzRw.js +0 -1
- package/dist/public/assets/_B1aMR3_0.js.br +0 -0
- package/dist/public/assets/_B1wtZ2Dg.js +0 -1
- package/dist/public/assets/_B2VhAnZH.js +0 -1
- package/dist/public/assets/_B2cfZpA1.js +0 -1
- package/dist/public/assets/_B3M5E-Om.js.br +0 -0
- package/dist/public/assets/_B4IW83Ps.js +0 -1
- package/dist/public/assets/_BA3sDawp.js.br +0 -0
- package/dist/public/assets/_BEXx4s6i.js +0 -1
- package/dist/public/assets/_BFxxHHlG.js.br +0 -0
- package/dist/public/assets/_BG-zRRiX.js.br +0 -0
- package/dist/public/assets/_BJYjTcOn.js +0 -1
- package/dist/public/assets/_BKX1SZz8.js +0 -1
- package/dist/public/assets/_BNkBAy5A.js.br +0 -0
- package/dist/public/assets/_BPl5t09U.js +0 -1
- package/dist/public/assets/_BPl6OxeP.js +0 -1
- package/dist/public/assets/_BQIvO4j0.js +0 -1
- package/dist/public/assets/_BRJmnd-_.js +0 -1
- package/dist/public/assets/_BS-RHEk-.js.br +0 -0
- package/dist/public/assets/_BT6HfYe8.js.br +0 -0
- package/dist/public/assets/_BT7IZUlM.js.br +0 -0
- package/dist/public/assets/_BUmmoPn7.js.br +0 -0
- package/dist/public/assets/_BVEoZ0DQ.js.br +0 -0
- package/dist/public/assets/_BW8sn7HC.js +0 -1
- package/dist/public/assets/_BZox64kw.js.br +0 -0
- package/dist/public/assets/_Bej9uABx.js.br +0 -0
- package/dist/public/assets/_Bf18_byh.js +0 -1
- package/dist/public/assets/_BiJNEt7p.js +0 -1
- package/dist/public/assets/_BlPDQkFl.js +0 -1
- package/dist/public/assets/_Bqi4KjfY.js.br +0 -0
- package/dist/public/assets/_BxyRJpZq.js +0 -1
- package/dist/public/assets/_ByBX1AAI.js.br +0 -0
- package/dist/public/assets/_BzNb_fHh.js.br +0 -0
- package/dist/public/assets/_C-31-_h4.js +0 -1
- package/dist/public/assets/_C0gp-Ms1.js +0 -1
- package/dist/public/assets/_C246C-83.js.br +0 -0
- package/dist/public/assets/_C2qWHQF6.js.br +0 -0
- package/dist/public/assets/_C4YyHuhB.js.br +0 -0
- package/dist/public/assets/_C5rKz3O1.js.br +0 -0
- package/dist/public/assets/_C8RN45Ay.js.br +0 -0
- package/dist/public/assets/_CA1oqi-5.js.br +0 -0
- package/dist/public/assets/_CCxaMhJi.js.br +0 -0
- package/dist/public/assets/_CE0EY_Im.js.br +0 -0
- package/dist/public/assets/_CElcQNRx.js.br +0 -0
- package/dist/public/assets/_CEnGHCTE.js.br +0 -0
- package/dist/public/assets/_CErPZpEJ.js +0 -1
- package/dist/public/assets/_CISMrPzZ.js +0 -1
- package/dist/public/assets/_CIp3AlsK.js +0 -1
- package/dist/public/assets/_CJlGZ_RW.js.br +0 -0
- package/dist/public/assets/_CNvP7-_g.js.br +0 -0
- package/dist/public/assets/_COaNVEzh.js +0 -1
- package/dist/public/assets/_CPXELW8A.js +0 -1
- package/dist/public/assets/_CQWSkJch.js +0 -1
- package/dist/public/assets/_CR8ysLim.js +0 -1
- package/dist/public/assets/_CRE2rTXU.js.br +0 -0
- package/dist/public/assets/_CW6i23WO.js.br +0 -0
- package/dist/public/assets/_CYWrzltT.js.br +0 -0
- package/dist/public/assets/_CYpdFsNd.js.br +0 -0
- package/dist/public/assets/_CZ30482G.js +0 -1
- package/dist/public/assets/_CZFNAK1G.js +0 -1
- package/dist/public/assets/_C_LsIBgT.js.br +0 -0
- package/dist/public/assets/_CdgU7fKH.js +0 -1
- package/dist/public/assets/_CeTSn3Od.js.br +0 -0
- package/dist/public/assets/_CedBoWcu.js.br +0 -0
- package/dist/public/assets/_CexMUoXX.js.br +0 -0
- package/dist/public/assets/_CfVGaBxr.js +0 -1
- package/dist/public/assets/_CfmVOY2H.js +0 -1
- package/dist/public/assets/_CgyDQNWM.js.br +0 -0
- package/dist/public/assets/_CjXKquH6.js +0 -1
- package/dist/public/assets/_CjvUwJV3.js.br +0 -0
- package/dist/public/assets/_ClQ_uypw.js.br +0 -0
- package/dist/public/assets/_CmB1kfhT.js.br +0 -0
- package/dist/public/assets/_Cnzpe3wm.js +0 -1
- package/dist/public/assets/_Cp25eGYo.js +0 -1
- package/dist/public/assets/_CqrPm1E1.js +0 -1
- package/dist/public/assets/_CsIiSuNi.js.br +0 -0
- package/dist/public/assets/_Cs_w9qrX.js +0 -1
- package/dist/public/assets/_Csct3qtA.js +0 -1
- package/dist/public/assets/_Csn-AGUO.js +0 -1
- package/dist/public/assets/_CsrDw2HV.js.br +0 -0
- package/dist/public/assets/_Ct49jor3.js +0 -1
- package/dist/public/assets/_CtYeoHds.js.br +0 -0
- package/dist/public/assets/_CtxFZ9vo.js +0 -1
- package/dist/public/assets/_Cz8Dsulr.js +0 -1
- package/dist/public/assets/_CzMLQ8gd.js +0 -1
- package/dist/public/assets/_Czw8PbiN.js +0 -1
- package/dist/public/assets/_D-K2gNHz.js.br +0 -0
- package/dist/public/assets/_D0LoYy3P.js.br +0 -0
- package/dist/public/assets/_D0MMtje0.js.br +0 -0
- package/dist/public/assets/_D1C5H689.js +0 -1
- package/dist/public/assets/_D2Fh5qVI.js +0 -1
- package/dist/public/assets/_D66U5RHc.js.br +0 -0
- package/dist/public/assets/_D68dPn0w.js.br +0 -0
- package/dist/public/assets/_DBQl8ZAL.js +0 -1
- package/dist/public/assets/_DCB8yv60.js +0 -1
- package/dist/public/assets/_DDZv_pCc.js.br +0 -0
- package/dist/public/assets/_DDaSBxJI.js +0 -1
- package/dist/public/assets/_DEHvdTTN.js +0 -1
- package/dist/public/assets/_DFydy0W7.js +0 -86
- package/dist/public/assets/_DFydy0W7.js.br +0 -0
- package/dist/public/assets/_DGQlaxcF.js.br +0 -0
- package/dist/public/assets/_DI6-_YSC.js +0 -1
- package/dist/public/assets/_DKVp-5hj.js +0 -1
- package/dist/public/assets/_DKxPCb7m.js.br +0 -0
- package/dist/public/assets/_DL18-mb9.js.br +0 -0
- package/dist/public/assets/_DLJrYXXF.js +0 -1
- package/dist/public/assets/_DLtbnANA.js +0 -1
- package/dist/public/assets/_DROxwR_p.js +0 -1
- package/dist/public/assets/_DRlVO8QP.js.br +0 -0
- package/dist/public/assets/_DShsNCa4.js.br +0 -0
- package/dist/public/assets/_DSyaHlgp.js.br +0 -0
- package/dist/public/assets/_DUAuUft5.js.br +0 -0
- package/dist/public/assets/_DWEHoZNj.js +0 -1
- package/dist/public/assets/_DWjO1Fu_.js.br +0 -0
- package/dist/public/assets/_DYSjcaPz.js +0 -1
- package/dist/public/assets/_DYeFvJQu.js.br +0 -0
- package/dist/public/assets/_DYi5YY3I.js.br +0 -0
- package/dist/public/assets/_DZGhFAI6.js.br +0 -0
- package/dist/public/assets/_DZXvujeN.js +0 -1
- package/dist/public/assets/_D_sVikfy.js +0 -1
- package/dist/public/assets/_DahJWFLJ.js.br +0 -0
- package/dist/public/assets/_DbSFDbVw.js +0 -1
- package/dist/public/assets/_Dbe9iebB.js.br +0 -0
- package/dist/public/assets/_DdvVmpgX.js.br +0 -0
- package/dist/public/assets/_DeRYTpbW.js.br +0 -0
- package/dist/public/assets/_DfkI0VMD.js.br +0 -0
- package/dist/public/assets/_DgwgtBl-.js.br +0 -0
- package/dist/public/assets/_DjAS2fco.js +0 -1
- package/dist/public/assets/_Dm_qoiyI.js +0 -1
- package/dist/public/assets/_DnKKZmmC.js +0 -1
- package/dist/public/assets/_DoCnLlmF.js +0 -1
- package/dist/public/assets/_DqG7LJE3.js.br +0 -0
- package/dist/public/assets/_DrE6WT-8.js +0 -1
- package/dist/public/assets/_DsOKce00.js.br +0 -0
- package/dist/public/assets/_Dve5bwmV.js +0 -1
- package/dist/public/assets/_EI0KfGqk.js +0 -1
- package/dist/public/assets/_ER2-2r1k.js +0 -1
- package/dist/public/assets/_HHcjPPQg.js.br +0 -0
- package/dist/public/assets/_I3lY44aU.js.br +0 -0
- package/dist/public/assets/_JbTe9y6j.js.br +0 -0
- package/dist/public/assets/_KK2KF52X.js.br +0 -0
- package/dist/public/assets/_LWgmax5s.js.br +0 -0
- package/dist/public/assets/_OcFuZvAI.js.br +0 -0
- package/dist/public/assets/_Or5LYSbi.js.br +0 -0
- package/dist/public/assets/_P2hfcmq2.js.br +0 -0
- package/dist/public/assets/_Rm81HrZo.js.br +0 -0
- package/dist/public/assets/_Snm0yKaj.js.br +0 -0
- package/dist/public/assets/_XqOjFD-V.js.br +0 -0
- package/dist/public/assets/_aAxCIB1-.js +0 -1
- package/dist/public/assets/_cfb9-FKi.js +0 -1
- package/dist/public/assets/_dFodER3o.js.br +0 -0
- package/dist/public/assets/_fJWjSk9f.js.br +0 -0
- package/dist/public/assets/_gzb30I1D.js +0 -1
- package/dist/public/assets/_hMziBcP-.js.br +0 -0
- package/dist/public/assets/_iPM5HFrU.js +0 -1
- package/dist/public/assets/_kD85MWJq.js.br +0 -0
- package/dist/public/assets/_kZt7n5RY.js.br +0 -0
- package/dist/public/assets/_kc4p4uHI.js.br +0 -0
- package/dist/public/assets/_m6TXzIsC.js +0 -1
- package/dist/public/assets/_pSbDHXOq.js +0 -1
- package/dist/public/assets/_rFLxxyKo.js.br +0 -0
- package/dist/public/assets/_v20P7tN_.js +0 -1
- package/dist/public/assets/_wCgLIMkx.js.br +0 -0
- package/dist/public/assets/_y0XHaRBP.js +0 -1
- package/dist/public/assets/files-view-MM5bc8fv.js +0 -2
- package/dist/public/assets/manage-workspace-CyTEJrWl.js +0 -2
- package/dist/public/assets/new-cMqYbBWV.js +0 -1
- package/dist/public/assets/new-workspace-CZniyAMN.js +0 -2
- package/dist/public/assets/review-view-tPZAOTAi.js +0 -2
- package/dist/public/assets/settings-cMqYbBWV.js +0 -1
- package/dist/public/assets/settings-page-C6ALfL-2.js +0 -2
- package/dist/public/assets/styles-B57UQpsl.css.br +0 -0
- package/dist/public/assets/w-cMqYbBWV.js +0 -1
- package/dist/public/assets/w._-BXl9mjaf.js +0 -1
- package/dist/public/assets/w._-cMqYbBWV.js +0 -1
- package/dist/public/assets/w._-y5AzhfwG.js +0 -1
|
@@ -819,6 +819,16 @@ var STEPS = [
|
|
|
819
819
|
CREATE INDEX message_log_to ON message_log(to_session);
|
|
820
820
|
CREATE INDEX message_log_from ON message_log(from_session);
|
|
821
821
|
CREATE INDEX message_log_workspace ON message_log(workspace_id, created_at);
|
|
822
|
+
`);
|
|
823
|
+
}
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
version: 15,
|
|
827
|
+
name: "retiring sessions, typing kept",
|
|
828
|
+
up(db) {
|
|
829
|
+
db.exec(`
|
|
830
|
+
ALTER TABLE sessions ADD COLUMN retire_at TEXT;
|
|
831
|
+
ALTER TABLE sessions ADD COLUMN typed_at INTEGER;
|
|
822
832
|
`);
|
|
823
833
|
}
|
|
824
834
|
}
|
|
@@ -9479,8 +9489,12 @@ function activityOf(sessionId) {
|
|
|
9479
9489
|
}
|
|
9480
9490
|
/** Someone typed into the session's pane from a page. */
|
|
9481
9491
|
function noteTyped(sessionId) {
|
|
9482
|
-
|
|
9492
|
+
const now = Date.now();
|
|
9493
|
+
const last = typedAt.get(sessionId) ?? 0;
|
|
9494
|
+
typedAt.set(sessionId, now);
|
|
9495
|
+
if (now - last >= TYPED_KEEP_MS) db.prepare("UPDATE sessions SET typed_at = ? WHERE id = ?").run(now, sessionId);
|
|
9483
9496
|
}
|
|
9497
|
+
var TYPED_KEEP_MS = 1e3;
|
|
9484
9498
|
/** When someone last typed into the session's pane (0: not this run). */
|
|
9485
9499
|
function lastTypedAt(sessionId) {
|
|
9486
9500
|
return typedAt.get(sessionId) ?? 0;
|
|
@@ -9644,7 +9658,7 @@ function publishChange(sessionId) {
|
|
|
9644
9658
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
9645
9659
|
if (row?.workspace_id) {
|
|
9646
9660
|
const workspaceId = row.workspace_id;
|
|
9647
|
-
import("./
|
|
9661
|
+
import("./_BOUuiLtz.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
9648
9662
|
return;
|
|
9649
9663
|
}
|
|
9650
9664
|
publish("sessions.changed");
|
|
@@ -17378,6 +17392,61 @@ async function foregroundRun(panePid, command) {
|
|
|
17378
17392
|
if (!argv?.length) return false;
|
|
17379
17393
|
return !!await headlessRun(job, argv[0].split("/").pop() || argv[0], argv.slice(1), table?.get(job)?.tty);
|
|
17380
17394
|
}
|
|
17395
|
+
/** Shells an agent CLI runs its commands in: Claude's Bash tool, Codex's
|
|
17396
|
+
* exec. A CLI's other children (stdio MCP servers, language servers) live
|
|
17397
|
+
* as long as it does and are none of its jobs. */
|
|
17398
|
+
var SHELLS = /* @__PURE__ */ new Set([
|
|
17399
|
+
"bash",
|
|
17400
|
+
"sh",
|
|
17401
|
+
"zsh",
|
|
17402
|
+
"fish",
|
|
17403
|
+
"dash",
|
|
17404
|
+
"ksh"
|
|
17405
|
+
]);
|
|
17406
|
+
var baseName = (arg) => (arg.split("/").pop() || arg).replace(/^-/, "");
|
|
17407
|
+
/** What a CLI at `panePid` still runs in shells of its own — a background
|
|
17408
|
+
* job, a dev server, a test run left going — each named by what its
|
|
17409
|
+
* shell runs (`pnpm test`), else the shell. Closing or restarting the CLI
|
|
17410
|
+
* ends them all with its tmux session, so a close that loses nothing
|
|
17411
|
+
* waits for none (server/team `closeBlockers`). */
|
|
17412
|
+
async function shellJobs(panePid) {
|
|
17413
|
+
if (darwin) {
|
|
17414
|
+
const table = await processArgs();
|
|
17415
|
+
const kids = (pid) => [...table].filter(([, row]) => row.ppid === pid);
|
|
17416
|
+
return kids(panePid).filter(([, row]) => SHELLS.has(baseName(row.argv[0] ?? ""))).map(([pid, row]) => jobName(kids(pid)[0]?.[1].argv ?? row.argv));
|
|
17417
|
+
}
|
|
17418
|
+
const jobs = [];
|
|
17419
|
+
for (const pid of await childPids(panePid)) {
|
|
17420
|
+
const stat = await procStat(pid);
|
|
17421
|
+
if (!stat.length || stat[0] === "Z") continue;
|
|
17422
|
+
const argv = await procArgs(pid);
|
|
17423
|
+
if (!SHELLS.has(baseName(argv[0] ?? ""))) continue;
|
|
17424
|
+
const [first] = await childPids(pid);
|
|
17425
|
+
jobs.push(jobName(first ? await procArgs(first) : argv));
|
|
17426
|
+
}
|
|
17427
|
+
return jobs;
|
|
17428
|
+
}
|
|
17429
|
+
/** A job as a line: its command and arguments, paths by their names. */
|
|
17430
|
+
function jobName(argv) {
|
|
17431
|
+
const line = argv.map((arg) => arg.startsWith("/") ? baseName(arg) : arg).join(" ");
|
|
17432
|
+
return line.length > 60 ? `${line.slice(0, 59)}…` : line;
|
|
17433
|
+
}
|
|
17434
|
+
/** A process's children on Linux, every thread's (a Node CLI forks from
|
|
17435
|
+
* its worker threads too). */
|
|
17436
|
+
async function childPids(pid) {
|
|
17437
|
+
let tasks;
|
|
17438
|
+
try {
|
|
17439
|
+
tasks = await fs$1.readdir(`/proc/${pid}/task`);
|
|
17440
|
+
} catch {
|
|
17441
|
+
return [];
|
|
17442
|
+
}
|
|
17443
|
+
const kids = /* @__PURE__ */ new Set();
|
|
17444
|
+
for (const task of tasks) try {
|
|
17445
|
+
const list = await fs$1.readFile(`/proc/${pid}/task/${task}/children`, "utf8");
|
|
17446
|
+
for (const kid of list.split(" ")) if (kid.trim()) kids.add(Number(kid));
|
|
17447
|
+
} catch {}
|
|
17448
|
+
return [...kids];
|
|
17449
|
+
}
|
|
17381
17450
|
/** Whether a process reads a terminal: its stdin on Linux; on macOS,
|
|
17382
17451
|
* where a look at one pid's descriptors costs a spawn, whether it has a
|
|
17383
17452
|
* controlling terminal at all (`ps`'s `??`). Unknown counts as one. */
|
|
@@ -17789,6 +17858,10 @@ function sessionInfo(id) {
|
|
|
17789
17858
|
workspace: s.workspace_id,
|
|
17790
17859
|
parent: s.parent_id,
|
|
17791
17860
|
summary: s.summary,
|
|
17861
|
+
/** Never closed for being done (`work session keep`). */
|
|
17862
|
+
kept: !!live?.keep,
|
|
17863
|
+
/** Since when it is to close once nothing is lost by it (`retire`). */
|
|
17864
|
+
retiring: live?.retire_at ?? null,
|
|
17792
17865
|
/** How and when it closed; null while open. */
|
|
17793
17866
|
closed: closed ? {
|
|
17794
17867
|
how: closed.how,
|
|
@@ -17805,6 +17878,37 @@ function paneAlive(id, env) {
|
|
|
17805
17878
|
tmuxName(id)
|
|
17806
17879
|
], env).then(() => true, () => false);
|
|
17807
17880
|
}
|
|
17881
|
+
/** What the session's CLI still runs in shells of its own (procs
|
|
17882
|
+
* `shellJobs`): its tmux session's close or a restart ends them. */
|
|
17883
|
+
async function paneJobs(id) {
|
|
17884
|
+
const pane = (await listPanes())?.find((p) => p.id === id);
|
|
17885
|
+
return pane ? shellJobs(pane.pid) : [];
|
|
17886
|
+
}
|
|
17887
|
+
/** Put a running session under `parent` (`work session adopt`), or on its
|
|
17888
|
+
* own with null (`release`), as `new` would have started it: nothing
|
|
17889
|
+
* restarts, and what is queued for it or owed keeps how it is answered
|
|
17890
|
+
* (a row's `by_send`). Adopted, it is kept from closing for being done
|
|
17891
|
+
* unless `closeDone`, which counts only answers to come: it may have
|
|
17892
|
+
* answered someone long ago. Moving one from another lead takes `from`
|
|
17893
|
+
* naming that lead. */
|
|
17894
|
+
function moveSession(id, parent, opts = {}) {
|
|
17895
|
+
const s = getSession(id);
|
|
17896
|
+
if (!s) throw httpError(404, `no session ${id}`);
|
|
17897
|
+
if (parent === null) {
|
|
17898
|
+
if (s.parent_id) db.prepare("UPDATE sessions SET parent_id = NULL WHERE id = ?").run(id);
|
|
17899
|
+
} else {
|
|
17900
|
+
const lead = getSession(parent);
|
|
17901
|
+
if (!lead) throw httpError(404, `no session ${parent}`);
|
|
17902
|
+
if (lead.workspace_id !== s.workspace_id) throw httpError(409, `${parent} is in another workspace than ${id}`);
|
|
17903
|
+
if (lead.agent === "shell") throw httpError(409, `${parent} is a shell: only an agent leads`);
|
|
17904
|
+
if (parent === id) throw httpError(409, `${id} cannot be under itself`);
|
|
17905
|
+
if (descendantsOf(id).includes(parent)) throw httpError(409, `${parent} is under ${id} already: ${id} cannot also be under it (\`work session release ${parent}\` first)`);
|
|
17906
|
+
if (s.parent_id && s.parent_id !== parent && opts.from !== s.parent_id) throw httpError(409, `${id} is under ${s.parent_id}: pass --from ${s.parent_id} to move it`);
|
|
17907
|
+
db.prepare(`UPDATE sessions SET parent_id = ?, keep = ?${opts.closeDone ? ", answered_at = NULL" : ""} WHERE id = ?`).run(parent, opts.closeDone ? 0 : 1, id);
|
|
17908
|
+
}
|
|
17909
|
+
notifySessionsChanged(s.workspace_id);
|
|
17910
|
+
return getSession(id);
|
|
17911
|
+
}
|
|
17808
17912
|
/** Every session `id` started, and theirs, nearest first. */
|
|
17809
17913
|
function descendantsOf(id) {
|
|
17810
17914
|
return all(`WITH RECURSIVE kids(id, depth) AS (
|
|
@@ -17900,7 +18004,7 @@ function notifySessionsChanged(workspaceId) {
|
|
|
17900
18004
|
async function emitSessionsChanged(workspaceId) {
|
|
17901
18005
|
try {
|
|
17902
18006
|
const states = await sessionStates();
|
|
17903
|
-
const { teamsOf } = await import("./
|
|
18007
|
+
const { teamsOf } = await import("./_C-c452mk.js");
|
|
17904
18008
|
publish("sessions.changed", {
|
|
17905
18009
|
workspaceId,
|
|
17906
18010
|
sessions: listSessions(workspaceId).map((s) => ({
|
|
@@ -19627,7 +19731,12 @@ ${repoLines}
|
|
|
19627
19731
|
otherwise (with its lead, by the user), or stuck on its account's limit,
|
|
19628
19732
|
\`work session reopen <id> [--agent <another instance>]\` starts again
|
|
19629
19733
|
on it, and \`work session log [<id>]\` shows what went to and from
|
|
19630
|
-
one and how each message went.
|
|
19734
|
+
one and how each message went. \`kill\` and \`skip\` end the turn under
|
|
19735
|
+
way and what its pane runs; to lose nothing, \`forget <id>\` stops
|
|
19736
|
+
waiting on a reply, \`unsend <id>\` takes back a message not yet typed
|
|
19737
|
+
in, \`retire <id>\` closes one once it is idle, and \`adopt <id>\` /
|
|
19738
|
+
\`release <id>\` move one under you or off (the user's own only when
|
|
19739
|
+
they ask, with \`--yes\`). For a quick
|
|
19631
19740
|
sweep in your own CLI, its own subagents are cheaper. All of this is
|
|
19632
19741
|
this workspace's only; an agent in another can be messaged when the user
|
|
19633
19742
|
asks, and only while it runs (\`work workspaces\` lists them, \`work session list <workspace>\`
|
|
@@ -19645,4 +19754,4 @@ ${repoLines}
|
|
|
19645
19754
|
`;
|
|
19646
19755
|
}
|
|
19647
19756
|
//#endregion
|
|
19648
|
-
export {
|
|
19757
|
+
export { panePids as $, agentBadge as $n, agentById as $r, startSnapSweep as $t, closedSession as A, lastTypedAt as An, WORKSPACE_PREFS as Ar, removeServer as At, killWorkspaceSessions as B, onPhaseChange as Bn, setDisabledAgents as Br, refreshGithub as Bt, workspaceBranches as C, config as Ci, realInside as Cn, ensureGitCredentials as Cr, addCustomServer as Ct, beginCreation as D, hookPhase as Dn, removeHost as Dr, installKey as Dt, agentCaller as E, clearAgentPhase as En, normalizeHost as Er, forgetProbes as Et, ensureTmuxServer as F, noteTurnFailed as Fn, disabledAgents as Fr, authGithub as Ft, markTmuxStarted as G, setExpecting as Gn, ghKnownHosts as Gr, patchIn as Gt, listPanes as H, onTurnFailed as Hn, setSetting as Hr, runStreaming as Ht, forgetPanes as I, noteTyped as In, enabledAgents as Ir, installAgent as It, noteConversation as J, settleQuietWorking as Jn, which as Jr, reviewWaiting as Jt, moveSession as K, setScrapedPhase as Kn, miseInstalls as Kr, readBlobAt as Kt, getSession as L, noteUserAnswered as Ln, getSetting as Lr, installMise as Lt, creationOf as M, noteBackground as Mn, allPrefs as Mr, serverList as Mt, descendantsOf as N, noteInterrupt as Nn, changePref as Nr, sharing as Nt, cleanEnv as O, hookReportedAt as On, unreachableRepos as Or, installServer as Ot, disposeSessions as P, notePermissionMode as Pn, deleteSetting as Pr, whileInstalling as Pt, paneJobs as Q, turnSince as Qn, TOOLS as Qr, setPoints as Qt, interruptSession as R, notifyEventOn as Rn, isKnownAgent as Rr, installTool as Rt, withProgressOp as S, tmux as Si, inside as Sn, configuredHosts as Sr, stopServers as St, hookToken as T, withLock as Ti, agentPhase as Tn, isValidHost as Tr, forgetCustomServer as Tt, listPanesWithin as U, sessionWatched as Un, discoverAgents as Ur, updateTool as Ut, launchDir as V, onTurnEnd as Vn, setPref as Vr, removeTool as Vt, listSessions as W, setAgentPhase as Wn, doctor as Wr, fileChanges as Wt, onSessionDispose as X, turnPhase as Xn, firewallProbe as Xr, workspaceDiff as Xt, notifySessionsChanged as Y, summaryOf as Yn, bornOut as Yr, withinBudget as Yt, ownWorkspaceOnly as Z, turnSettling as Zn, PROJECT_TOOLS as Zr, workspaceSections as Zt, retryMaterialize as _, workspacePath as _i, blankRow as _n, repoBranches as _r, lspQueryOf as _t, ensureUntrackedCache as a, FRAME_ANCESTORS as ai, hotBatchMinMs as an, getInstance as ar, retireSession as at, sweepTrash as b, TMUX_SOCKET as bi, writeCache as bn, DEFAULT_HOST as br, runningServers as bt, insertPendingWorkspace as c, httpError as ci, withoutDismissed as cn, normalizeAccent as cr, sessionStates as ct, progress as d, publishJson as di, AGENTS as dn, pushPublicKey as dr, killWorkspaceProc as dt, agentLabel$1 as ei, diffStamp as en, agentFamily as er, pasteToSession as et, progressSince as f, subscribe as fi, interruptKeys as fn, saveSubscription as fr, portsByWorkspace as ft, resumePendingWorkspaces as g, get as gi, steerKeys as gn, pendingSsoOrgs as gr, lspQuery as gt, removeRepo as h, db as hi, reportsWorking as hn, headOid as hr, lspDiagnostics as ht, deleteWorkspace as i, applyPrefChange as ii, dismissPr as in, ACCENT_RE as ir, restartSession as it, createSession as j, noteActivity$1 as jn, agentChoices as jr, serverById as jt, clearTmuxStarted as k, interruptedSinceReport as kn, PREF_MAX as kr, lspEnabled as kt, listWorkspaces as l, readBody as li, workspacePrs as ln, setInstance as lr, tmuxName as lt, queueMaterialize as m, all as mi, readHookPayload as mn, validSubscription as mr, killServers as mt, barePath as n, parseAgentId as ni, markBranch as nn, agentLabel as nr, reopenSession as nt, gcBares as o, FRAME_HEADERS as oi, notePushActivity as on, iconSvg as or, sendToSession as ot, pruneLaneBranch as p, subscriberCount as pi, quotesPastes as pn, sendPush as pr, workspaceProcs as pt, newSessionArgs as q, setSessionViewers as qn, miseVersions as qr, readFileAt as qt, createWorkspace as r, toolById as ri, sectionFor as rn, agentMeta as rr, reopenable as rt, getWorkspace as s, checked as si, refreshPrsBatch as sn, manifest as sr, sessionInfo as st, addRepo as t, catalogPin as ti, commentFolder as tn, agentFromCommand as tr, renameSession as tt, otherWorkspaceBranches as u, publish as ui, noteActivity as un, deleteSubscription as ur, tmuxWasStarted as ut, revParse as v, ownsBranchOf as vi, credentialStamp as vn, repoCatalog as vr, lspUses as vt, ensureAllPushHooks as w, swr as wi, activityOf as wn, forgetToken as wr, allServers as wt, syncAgentsMd as x, git as xi, cleanSummary as xn, addHost as xr, stopAllServers as xt, setWorkspaceStatus as y, ensureAllCacheConfig as yi, readCache as yn, repoDefaultBranch as yr, lspWarm as yt, killSession as z, onFinished as zn, preferredAgent as zr, logoutGithub as zt };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as closedSession, An as lastTypedAt, Bn as onPhaseChange, E as agentCaller, Gn as setExpecting, Hn as onTurnFailed, L as getSession, Lr as getSetting, On as hookReportedAt, Q as paneJobs, Qn as turnSince, R as interruptSession, Rr as isKnownAgent, Tn as agentPhase, U as listPanesWithin, Un as sessionWatched, Vn as onTurnEnd, X as onSessionDispose, Xn as turnPhase, Y as notifySessionsChanged, Yn as summaryOf, Zn as turnSettling, at as retireSession, ci as httpError, er as agentFamily, fn as interruptKeys, gi as get, gn as steerKeys, hi as db, it as restartSession, j as createSession, jr as agentChoices, mi as all, nr as agentLabel, nt as reopenSession, ot as sendToSession, pn as quotesPastes, rt as reopenable, tt as renameSession, wn as activityOf, xn as cleanSummary, z as killSession, zn as onFinished } from "./_BL9uMFqY.js";
|
|
2
2
|
//#region src/server/messages.ts
|
|
3
3
|
var team = {
|
|
4
4
|
memberGroup: () => null,
|
|
@@ -518,6 +518,13 @@ async function sendMessage(to, text, opts = {}) {
|
|
|
518
518
|
* message starts there to answer. Its row is back before its CLI is: a
|
|
519
519
|
* send meanwhile queues behind this rather than starting the CLI afresh. */
|
|
520
520
|
async function reopen(id, opts = {}) {
|
|
521
|
+
if (delivering.has(id)) throw httpError(409, `${id} is being started or typed into: try again`);
|
|
522
|
+
if (getSession(id) && !opts.now) {
|
|
523
|
+
const phase = turnPhase(id);
|
|
524
|
+
const jobs = await paneJobs(id);
|
|
525
|
+
const busy = [phase === "waiting" ? "it waits on the user" : (phase || turnSettling(id)) && "its turn is under way", jobs.length && `its pane still runs ${jobs.join("; ")}`].filter(Boolean);
|
|
526
|
+
if (busy.length) throw httpError(409, `${id} is busy: ${busy.join(", and ")}. Restarting its CLI would end that: reopen it once it is idle, or pass --now to restart it anyway`);
|
|
527
|
+
}
|
|
521
528
|
if (delivering.has(id)) throw httpError(409, `${id} is being started or typed into: try again`);
|
|
522
529
|
delivering.add(id);
|
|
523
530
|
try {
|
|
@@ -541,6 +548,41 @@ async function reopen(id, opts = {}) {
|
|
|
541
548
|
kick();
|
|
542
549
|
}
|
|
543
550
|
}
|
|
551
|
+
/** `asker` no longer wants what `to` owes it (`work session forget`): its
|
|
552
|
+
* messages in `to`'s turn stop wanting a reply, so that turn's end answers
|
|
553
|
+
* nobody, and its messages still queued go in wanting none. A reply `to`
|
|
554
|
+
* sent already still comes; `to` is told nothing and works on. Returns how
|
|
555
|
+
* many it forgot. */
|
|
556
|
+
function forgetReplies(asker, to) {
|
|
557
|
+
const rows = all("SELECT * FROM session_messages WHERE to_session = ? AND from_session = ? AND wants_reply = 1", to, asker);
|
|
558
|
+
if (!rows.length) return 0;
|
|
559
|
+
deleteIds(rows.filter((r) => r.delivered_at).map((r) => r.id), "forgotten by its asker");
|
|
560
|
+
const queued = rows.filter((r) => !r.delivered_at).map((r) => r.id);
|
|
561
|
+
if (queued.length) {
|
|
562
|
+
db.prepare(`UPDATE session_messages SET wants_reply = 0, by_send = 0 WHERE id IN ${inIds(queued)}`).run(...queued);
|
|
563
|
+
db.prepare(`UPDATE message_log SET wants_reply = 0 WHERE id IN ${inIds(queued)}`).run(...queued);
|
|
564
|
+
}
|
|
565
|
+
answered.get(to)?.askers.delete(asker);
|
|
566
|
+
heldTold.get(to)?.delete(asker);
|
|
567
|
+
recompute();
|
|
568
|
+
kick();
|
|
569
|
+
return rows.length;
|
|
570
|
+
}
|
|
571
|
+
/** Take back what `asker` queued for `to` that is not typed in yet (`work
|
|
572
|
+
* session unsend`): what went in stays. Not all a fan-out member was
|
|
573
|
+
* asked, which its group would wait on for nothing: that is a skip or a
|
|
574
|
+
* forget. Returns how many went. */
|
|
575
|
+
function withdraw(asker, to) {
|
|
576
|
+
if (delivering.has(to)) throw httpError(409, `${to} is being typed into: try again`);
|
|
577
|
+
const rows = all("SELECT * FROM session_messages WHERE to_session = ? AND from_session = ? AND kind = 'message' AND delivered_at IS NULL", to, asker);
|
|
578
|
+
if (!rows.length) throw httpError(409, `nothing of this session's is queued for ${to} (one typed in already stays in its turn)`);
|
|
579
|
+
const ids = rows.map((r) => r.id);
|
|
580
|
+
if (team.memberGroup(to) && !get(`SELECT 1 FROM session_messages WHERE to_session = ? AND from_session = ? AND wants_reply = 1 AND id NOT IN ${inIds(ids)}`, to, asker, ...ids)) throw httpError(409, `that is all ${to} was asked as a member of its group, which would then wait on it for nothing: \`work session forget\` or \`skip\` it instead`);
|
|
581
|
+
deleteIds(ids, "withdrawn by its sender");
|
|
582
|
+
recompute();
|
|
583
|
+
kick();
|
|
584
|
+
return ids.length;
|
|
585
|
+
}
|
|
544
586
|
/** `id`'s turn ended failing (rate limited, signed out) while it owes
|
|
545
587
|
* replies: it sits at its prompt until someone carries it on, and whoever
|
|
546
588
|
* waits on it would wait on, unknowing. Each is told why and what it can
|
|
@@ -880,6 +922,17 @@ function memberBySession(sessionId) {
|
|
|
880
922
|
function changed(workspaceId) {
|
|
881
923
|
if (workspaceId) notifySessionsChanged(workspaceId);
|
|
882
924
|
}
|
|
925
|
+
/** The groups of `owner` with members still to answer. */
|
|
926
|
+
function openGroupsOf(owner) {
|
|
927
|
+
return all(`SELECT DISTINCT g.id, g.title FROM session_groups g JOIN group_members m ON m.group_id = g.id
|
|
928
|
+
WHERE g.owner = ? AND m.state IN ('queued', 'running')`, owner);
|
|
929
|
+
}
|
|
930
|
+
/** Whether someone typed into `s` after `at`, as this server saw it or as
|
|
931
|
+
* kept from before it started (`typed_at`). */
|
|
932
|
+
function typedSince(s, at) {
|
|
933
|
+
if (!at) return false;
|
|
934
|
+
return Math.max(lastTypedAt(s.id), s.typed_at ?? 0) > Date.parse(at);
|
|
935
|
+
}
|
|
883
936
|
/** Whether a group still has members to answer. */
|
|
884
937
|
function open(groupId) {
|
|
885
938
|
return !!get("SELECT 1 AS x FROM group_members WHERE group_id = ? AND state IN ('queued', 'running')", groupId);
|
|
@@ -965,22 +1018,80 @@ async function skipMember(memberId) {
|
|
|
965
1018
|
}
|
|
966
1019
|
changed(g.workspace_id);
|
|
967
1020
|
}
|
|
1021
|
+
/** Stop waiting on what `target` owes `asker` without stopping it (`work
|
|
1022
|
+
* session forget`): a session's replies, or a member's — a queued member
|
|
1023
|
+
* never starts, as a skip; a running one's session carries on under its
|
|
1024
|
+
* lead, no longer a member its group waits on. Says what it forgot. */
|
|
1025
|
+
function forget(asker, target) {
|
|
1026
|
+
const m = get("SELECT * FROM group_members WHERE id = ?", target) ?? (() => {
|
|
1027
|
+
const row = memberBySession(target);
|
|
1028
|
+
return row?.state === "running" ? row : void 0;
|
|
1029
|
+
})();
|
|
1030
|
+
const g = m && groupOf(m.group_id);
|
|
1031
|
+
if (!m || !g) {
|
|
1032
|
+
const n = forgetReplies(asker, target);
|
|
1033
|
+
if (!n) throw httpError(409, `${target} owes this session nothing to forget`);
|
|
1034
|
+
return { replies: n };
|
|
1035
|
+
}
|
|
1036
|
+
if (g.owner !== asker) throw httpError(409, `${m.title} is ${g.owner}'s member, not this one's`);
|
|
1037
|
+
if (m.state !== "queued" && m.state !== "running") throw httpError(409, `${m.title} is ${m.state}: its group waits on nothing`);
|
|
1038
|
+
db.prepare("UPDATE group_members SET state = 'closed', note = 'forgotten', done_at = ?, session_id = NULL WHERE id = ?").run(now(), m.id);
|
|
1039
|
+
if (m.session_id) forgetReplies(asker, m.session_id);
|
|
1040
|
+
released(g);
|
|
1041
|
+
changed(g.workspace_id);
|
|
1042
|
+
return {
|
|
1043
|
+
member: m.id,
|
|
1044
|
+
session: m.session_id
|
|
1045
|
+
};
|
|
1046
|
+
}
|
|
1047
|
+
/** What closing `s` now would lose, as reasons to wait (`retire`, the
|
|
1048
|
+
* reaper, Close done), none when nothing: a turn under way, what is
|
|
1049
|
+
* queued for it or owed by or to it, sessions it leads, its pane's jobs
|
|
1050
|
+
* (a background run, a dev server) that its tmux session's close ends,
|
|
1051
|
+
* and — unless the user asked for this close (`watched: false`) — its
|
|
1052
|
+
* being on their screen. */
|
|
1053
|
+
async function closeBlockers(s, opts = {}) {
|
|
1054
|
+
const why = [];
|
|
1055
|
+
const phase = turnPhase(s.id);
|
|
1056
|
+
if (phase === "waiting") why.push("it waits on the user");
|
|
1057
|
+
else if (phase || turnSettling(s.id)) why.push("its turn is under way");
|
|
1058
|
+
const queued = get("SELECT COUNT(*) AS n FROM session_messages WHERE to_session = ? AND delivered_at IS NULL", s.id)?.n ?? 0;
|
|
1059
|
+
if (queued) why.push(`${queued} ${queued === 1 ? "message is" : "messages are"} queued for it`);
|
|
1060
|
+
const owes = all("SELECT DISTINCT from_session AS id FROM session_messages WHERE to_session = ? AND wants_reply = 1 AND delivered_at IS NOT NULL AND from_session IS NOT NULL", s.id).map((r) => r.id);
|
|
1061
|
+
if (owes.length) why.push(`it owes ${owes.join(", ")} a reply`);
|
|
1062
|
+
const waits = [...all("SELECT DISTINCT to_session AS id FROM session_messages WHERE from_session = ? AND wants_reply = 1", s.id).map((r) => r.id), ...openGroupsOf(s.id).map((o) => `group "${o.title}"`)];
|
|
1063
|
+
if (waits.length) why.push(`it waits on replies from ${waits.join(", ")}`);
|
|
1064
|
+
const leads = all("SELECT id FROM sessions WHERE parent_id = ?", s.id).map((r) => r.id);
|
|
1065
|
+
if (leads.length) why.push(`it leads ${leads.join(", ")}, still open`);
|
|
1066
|
+
if (opts.watched !== false && sessionWatched(s.id)) why.push("it is on the user's screen");
|
|
1067
|
+
const jobs = await paneJobs(s.id);
|
|
1068
|
+
if (jobs.length) why.push(`its pane still runs ${jobs.join("; ")}`);
|
|
1069
|
+
return why;
|
|
1070
|
+
}
|
|
968
1071
|
/** Close the sessions of a group's members that have answered: their
|
|
969
1072
|
* results are kept, their CLIs no longer hold memory, and a message to
|
|
970
|
-
* one reopens it.
|
|
1073
|
+
* one reopens it. Not one the user kept or took over, nor one closing
|
|
1074
|
+
* would lose something of (`closeBlockers`). */
|
|
971
1075
|
async function closeDone(groupId) {
|
|
972
1076
|
const g = groupOf(groupId);
|
|
973
1077
|
if (!g) throw httpError(404, `no group ${groupId}`);
|
|
974
1078
|
const done = membersOf(groupId).filter((m) => m.state === "done" && m.session_id);
|
|
975
|
-
|
|
1079
|
+
let closed = 0;
|
|
1080
|
+
for (const m of done) {
|
|
1081
|
+
const s = getSession(m.session_id);
|
|
1082
|
+
if (!s || s.keep || typedSince(s, s.answered_at)) continue;
|
|
1083
|
+
if ((await closeBlockers(s, { watched: false })).length) continue;
|
|
1084
|
+
await retireSession(s.id);
|
|
1085
|
+
closed++;
|
|
1086
|
+
}
|
|
976
1087
|
changed(g.workspace_id);
|
|
977
|
-
return
|
|
1088
|
+
return closed;
|
|
978
1089
|
}
|
|
979
1090
|
/** Forget a finished group (its members' sessions closed with it). */
|
|
980
1091
|
async function clearGroup(groupId) {
|
|
981
1092
|
const g = groupOf(groupId);
|
|
982
1093
|
if (!g) throw httpError(404, `no group ${groupId}`);
|
|
983
|
-
if (open(groupId)) throw httpError(409, `"${g.title}" still has members working: skip them first`);
|
|
1094
|
+
if (open(groupId)) throw httpError(409, `"${g.title}" still has members working: skip or forget them first`);
|
|
984
1095
|
await closeDone(groupId);
|
|
985
1096
|
db.prepare("DELETE FROM session_groups WHERE id = ?").run(groupId);
|
|
986
1097
|
changed(g.workspace_id);
|
|
@@ -1089,16 +1200,13 @@ setTeamHooks({
|
|
|
1089
1200
|
return all(`SELECT DISTINCT g.owner FROM session_groups g JOIN group_members m ON m.group_id = g.id
|
|
1090
1201
|
WHERE m.state IN ('queued', 'running')`).map((r) => r.owner);
|
|
1091
1202
|
},
|
|
1092
|
-
openGroups
|
|
1093
|
-
return all(`SELECT DISTINCT g.id, g.title FROM session_groups g JOIN group_members m ON m.group_id = g.id
|
|
1094
|
-
WHERE g.owner = ? AND m.state IN ('queued', 'running')`, owner);
|
|
1095
|
-
},
|
|
1203
|
+
openGroups: openGroupsOf,
|
|
1096
1204
|
memberAnswered(sessionId, message) {
|
|
1097
1205
|
const m = memberBySession(sessionId);
|
|
1098
1206
|
if (!m || m.state !== "running") return;
|
|
1099
1207
|
db.prepare("UPDATE group_members SET state = 'done', summary = ?, note = NULL, done_at = ? WHERE id = ?").run(message ? cleanSummary(message) ?? null : null, now(), m.id);
|
|
1100
1208
|
const g = groupOf(m.group_id);
|
|
1101
|
-
if (g.close_done) setTimeout(() => void
|
|
1209
|
+
if (g.close_done) setTimeout(() => void closeAnswered(sessionId).catch((err) => console.error(`[work] team: ${err.message}`)), 0);
|
|
1102
1210
|
released(g);
|
|
1103
1211
|
changed(g.workspace_id);
|
|
1104
1212
|
},
|
|
@@ -1188,34 +1296,89 @@ async function teamOf(owner) {
|
|
|
1188
1296
|
* coming back to it, and each is a whole CLI's memory. */
|
|
1189
1297
|
var REAP_IDLE_MS = 6e5;
|
|
1190
1298
|
var REAP_EVERY_MS = 6e4;
|
|
1191
|
-
/** Whether a session
|
|
1192
|
-
*
|
|
1193
|
-
*
|
|
1194
|
-
*
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
if (
|
|
1200
|
-
if (
|
|
1201
|
-
|
|
1202
|
-
|
|
1299
|
+
/** Whether a session is done with: one an agent started that has
|
|
1300
|
+
* answered, and that the user has not taken over (typed into since it
|
|
1301
|
+
* answered, which keeps it for good); or one asked to close once nothing
|
|
1302
|
+
* is lost by it (`retire_at`), not typed into since, which takes the ask
|
|
1303
|
+
* back. Either way only once closing it loses nothing (`closeBlockers`).
|
|
1304
|
+
* Read afresh: a keep, adopt or release can land while another closes. */
|
|
1305
|
+
async function doneWith(id) {
|
|
1306
|
+
const s = getSession(id);
|
|
1307
|
+
if (!s) return null;
|
|
1308
|
+
if (s.retire_at) {
|
|
1309
|
+
if (typedSince(s, s.retire_at)) {
|
|
1310
|
+
db.prepare("UPDATE sessions SET retire_at = NULL WHERE id = ?").run(id);
|
|
1311
|
+
return null;
|
|
1312
|
+
}
|
|
1313
|
+
} else {
|
|
1314
|
+
if (!s.parent_id || s.keep || !s.answered_at) return null;
|
|
1315
|
+
if (typedSince(s, s.answered_at)) {
|
|
1316
|
+
db.prepare("UPDATE sessions SET keep = 1 WHERE id = ?").run(id);
|
|
1317
|
+
return null;
|
|
1318
|
+
}
|
|
1203
1319
|
}
|
|
1204
|
-
return
|
|
1205
|
-
}
|
|
1206
|
-
/** Close the sessions
|
|
1207
|
-
*
|
|
1208
|
-
*
|
|
1209
|
-
*
|
|
1320
|
+
return closeBlockers(s);
|
|
1321
|
+
}
|
|
1322
|
+
/** Close the sessions that are done with (`doneWith`): `parent`'s once
|
|
1323
|
+
* its job is done (or asked: `work session kill --done`), and it too if
|
|
1324
|
+
* it was asked to retire; else any idle past `REAP_IDLE_MS`, and any
|
|
1325
|
+
* asked to retire. A fan-out member's result stays in its group, and a
|
|
1326
|
+
* message to one reopens it (sessions.ts `retireSession`). Says how many
|
|
1327
|
+
* closed, and why each done with but left open was. */
|
|
1210
1328
|
async function closeFinished(parent) {
|
|
1211
|
-
const rows = parent ? all("SELECT
|
|
1329
|
+
const rows = parent ? all("SELECT id FROM sessions WHERE parent_id = ? OR (id = ? AND retire_at IS NOT NULL) ORDER BY id = ?", parent, parent, parent) : all("SELECT id FROM sessions WHERE (parent_id IS NOT NULL AND answered_at IS NOT NULL AND answered_at < ?) OR retire_at IS NOT NULL", (/* @__PURE__ */ new Date(Date.now() - REAP_IDLE_MS)).toISOString());
|
|
1212
1330
|
let closed = 0;
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
await
|
|
1331
|
+
const left = [];
|
|
1332
|
+
for (const { id } of rows) {
|
|
1333
|
+
const why = await doneWith(id);
|
|
1334
|
+
if (!why) continue;
|
|
1335
|
+
if (why.length) {
|
|
1336
|
+
if (id !== parent) left.push({
|
|
1337
|
+
id,
|
|
1338
|
+
why
|
|
1339
|
+
});
|
|
1340
|
+
continue;
|
|
1341
|
+
}
|
|
1342
|
+
await retireSession(id);
|
|
1216
1343
|
closed++;
|
|
1217
1344
|
}
|
|
1218
|
-
return
|
|
1345
|
+
return {
|
|
1346
|
+
closed,
|
|
1347
|
+
left
|
|
1348
|
+
};
|
|
1349
|
+
}
|
|
1350
|
+
/** A `--close-done` member that answered: closed now, unless the user
|
|
1351
|
+
* has it or closing would lose something (`closeBlockers`), which leaves
|
|
1352
|
+
* it to the reaper. */
|
|
1353
|
+
async function closeAnswered(id) {
|
|
1354
|
+
const s = getSession(id);
|
|
1355
|
+
if (!s || s.keep || typedSince(s, s.answered_at)) return;
|
|
1356
|
+
if ((await closeBlockers(s)).length) return;
|
|
1357
|
+
await retireSession(id);
|
|
1358
|
+
}
|
|
1359
|
+
/** Close `id` once closing it loses nothing (`work session retire`): at
|
|
1360
|
+
* once if that is now, else at the first sweep after — its turn's end, a
|
|
1361
|
+
* job's, its last message answered — unless someone types into it first.
|
|
1362
|
+
* Says whether it closed, or what it waits on. A message reopens it. */
|
|
1363
|
+
async function retire(id) {
|
|
1364
|
+
const s = getSession(id);
|
|
1365
|
+
if (!s) throw closedSession(id) ? httpError(409, `${id} has closed already`) : httpError(404, `no session ${id}`);
|
|
1366
|
+
db.prepare("UPDATE sessions SET retire_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = ?").run(id);
|
|
1367
|
+
const waits = await closeBlockers(getSession(id));
|
|
1368
|
+
if (!waits.length) {
|
|
1369
|
+
await retireSession(id);
|
|
1370
|
+
const closed = closedSession(id);
|
|
1371
|
+
return {
|
|
1372
|
+
closed: true,
|
|
1373
|
+
reopens: !!closed && reopenable(closed),
|
|
1374
|
+
waits
|
|
1375
|
+
};
|
|
1376
|
+
}
|
|
1377
|
+
notifySessionsChanged(s.workspace_id);
|
|
1378
|
+
return {
|
|
1379
|
+
closed: false,
|
|
1380
|
+
waits
|
|
1381
|
+
};
|
|
1219
1382
|
}
|
|
1220
1383
|
/** Never close `id` for being done, as `--keep` would have started it
|
|
1221
1384
|
* (`work session keep`): its lead has follow-ups for it. */
|
|
@@ -1284,4 +1447,4 @@ function startTeam() {
|
|
|
1284
1447
|
kickPool();
|
|
1285
1448
|
}
|
|
1286
1449
|
//#endregion
|
|
1287
|
-
export {
|
|
1450
|
+
export { takeReplies as C, startMessages as S, messageLog as _, createGroup as a, sendMessage as b, kickPool as c, retryMember as d, skipMember as f, holdReply as g, teamsOf as h, closeFinished as i, memberWorkspace as l, teamOf as m, closeBlockers as n, forget as o, startTeam as p, closeDone as r, keepSession as s, clearGroup as t, retire as u, messageStates as v, withdraw as w, sessionGone as x, reopen as y };
|