@dylanpiercey/work 0.2.53 → 0.2.55
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 +153 -18
- package/bin/work.mjs +2 -32
- package/dist/{_tAkj84_m.js → _CKxRXoHK.js} +75 -75
- package/dist/_CVNGN2QO.js +2 -0
- package/dist/{_CWO9RtPZ.js → _CZ4mgOdb.js} +203 -44
- package/dist/{_ByxSq8zO.js → _Cb_JPQ7K.js} +371 -59
- package/dist/_hjIYs3Gy.js +2 -0
- package/dist/index.mjs +1352 -1200
- package/dist/public/assets/{_BWhs553r.js → _0YT2d3LY.js} +1 -1
- package/dist/public/assets/_0YT2d3LY.js.br +0 -0
- package/dist/public/assets/{_DVbq8rez.js → _0rKvhqMi.js} +1 -1
- package/dist/public/assets/_0rKvhqMi.js.br +0 -0
- package/dist/public/assets/_5PI2fZS8.js +1 -0
- package/dist/public/assets/_72zzTyhJ.js +1 -0
- package/dist/public/assets/_91-k5tQx.js +1 -0
- package/dist/public/assets/{_DjIcKKrW.js → _AIdFuyL9.js} +1 -1
- package/dist/public/assets/_AIdFuyL9.js.br +0 -0
- package/dist/public/assets/{_D_qMHeyF.js → _AtwdfMkh.js} +1 -1
- package/dist/public/assets/_AtwdfMkh.js.br +0 -0
- package/dist/public/assets/_B1qplI2K.js +1 -0
- package/dist/public/assets/_B29W737t.js +1 -0
- package/dist/public/assets/{_UM6RqjfN.js → _B56DMc1H.js} +1 -1
- package/dist/public/assets/_B56DMc1H.js.br +0 -0
- package/dist/public/assets/_B8Bw484t.js +1 -0
- package/dist/public/assets/{_CT3v6Oze.js → _BA2Lowt-.js} +1 -1
- package/dist/public/assets/_BA2Lowt-.js.br +0 -0
- package/dist/public/assets/_BBF2mdRO.js +1 -0
- package/dist/public/assets/{_DFjGajU7.js → _BDCDGYHw.js} +1 -1
- package/dist/public/assets/_BDR1eJ6l.js +1 -0
- package/dist/public/assets/_BDppKLVj.js +1 -0
- package/dist/public/assets/{_Cn8rkyXq.js → _BFAY4fG9.js} +1 -1
- package/dist/public/assets/_BFAY4fG9.js.br +0 -0
- package/dist/public/assets/{_CeSQyrMz.js → _BGn8HXYq.js} +1 -1
- package/dist/public/assets/_BGn8HXYq.js.br +0 -0
- package/dist/public/assets/{_CfPha1FH.js → _BJ3_jYoD.js} +1 -1
- package/dist/public/assets/_BJ3_jYoD.js.br +0 -0
- package/dist/public/assets/_BJqpx-Y1.js +1 -0
- package/dist/public/assets/{_CnWm9a_o.js → _BOQ3PwKZ.js} +1 -1
- package/dist/public/assets/_BOQ3PwKZ.js.br +0 -0
- package/dist/public/assets/{_dZl98lyu.js → _BOXau4gS.js} +1 -1
- package/dist/public/assets/_BOXau4gS.js.br +0 -0
- package/dist/public/assets/{_Dho8D73M.js → _BPbX8cFz.js} +1 -1
- package/dist/public/assets/_BPbX8cFz.js.br +0 -0
- package/dist/public/assets/{_YIEXDh5T.js → _BT2Sj_YW.js} +4 -4
- package/dist/public/assets/_BT2Sj_YW.js.br +0 -0
- package/dist/public/assets/_BUvcY7QT.js +1 -0
- package/dist/public/assets/_BVeS3UXr.js +1 -0
- package/dist/public/assets/{_Er1jCr0y.js → _BYO4bphw.js} +1 -1
- package/dist/public/assets/_BYO4bphw.js.br +0 -0
- package/dist/public/assets/_BYYFg9LD.js +1 -0
- package/dist/public/assets/{_SNGXdx8T.js → _BZmB54mR.js} +1 -1
- package/dist/public/assets/_BZmB54mR.js.br +0 -0
- package/dist/public/assets/{_DVuEGjB6.js → _B_WzjbZc.js} +1 -1
- package/dist/public/assets/_B_WzjbZc.js.br +0 -0
- package/dist/public/assets/{_DahEvrx7.js → _B_mZh-m9.js} +1 -1
- package/dist/public/assets/_B_mZh-m9.js.br +0 -0
- package/dist/public/assets/_Bawb2dbh.js +1 -0
- package/dist/public/assets/{_CZyU6zlW.js → _BcWvsmRe.js} +4 -4
- package/dist/public/assets/_BcWvsmRe.js.br +0 -0
- package/dist/public/assets/{_D4yHrw0x.js → _BeA1nKaN.js} +1 -1
- package/dist/public/assets/_BeA1nKaN.js.br +0 -0
- package/dist/public/assets/{_Z8XAsbav.js → _BeZ7pjQV.js} +1 -1
- package/dist/public/assets/_BeZ7pjQV.js.br +0 -0
- package/dist/public/assets/{_CoVyqWOC.js → _BgV7K2cf.js} +1 -1
- package/dist/public/assets/_BgV7K2cf.js.br +0 -0
- package/dist/public/assets/{_B23iifIa.js → _BgtzrIGU.js} +1 -1
- package/dist/public/assets/_BgtzrIGU.js.br +0 -0
- package/dist/public/assets/{_CCuLPWZW.js → _BiNobkT0.js} +1 -1
- package/dist/public/assets/_BiNobkT0.js.br +0 -0
- package/dist/public/assets/_BihgYQ-n.js +1 -0
- package/dist/public/assets/{_53vvCtB9.js → _BjTM0FyT.js} +1 -1
- package/dist/public/assets/_BjTM0FyT.js.br +0 -0
- package/dist/public/assets/{_DWn9Bk4p.js → _Bjib9M1A.js} +1 -1
- package/dist/public/assets/_Bjib9M1A.js.br +0 -0
- package/dist/public/assets/_BkhLTI27.js +1 -0
- package/dist/public/assets/{_BJxnfQcd.js → _BmaXli3m.js} +1 -1
- package/dist/public/assets/_BmaXli3m.js.br +0 -0
- package/dist/public/assets/{_Dtj0n4Ea.js → _BmwvMhWC.js} +1 -1
- package/dist/public/assets/_BmwvMhWC.js.br +0 -0
- package/dist/public/assets/{_I-rWUgTm.js → _Bo0K9EaI.js} +1 -1
- package/dist/public/assets/_Bo0K9EaI.js.br +0 -0
- package/dist/public/assets/{_BZDlyKDT.js → _BqTF3ARG.js} +1 -1
- package/dist/public/assets/_BqTF3ARG.js.br +0 -0
- package/dist/public/assets/_BrMbTp16.js +1 -0
- package/dist/public/assets/{_BqPqaeUo.js → _BsaOdWyz.js} +1 -1
- package/dist/public/assets/_BsaOdWyz.js.br +0 -0
- package/dist/public/assets/_Bt-nevYL.js +1 -0
- package/dist/public/assets/{_dhxtcjZT.js → _BtCTUxzJ.js} +1 -1
- package/dist/public/assets/_BtCTUxzJ.js.br +0 -0
- package/dist/public/assets/{_DdpvFyoD.js → _BvtRBlS4.js} +1 -1
- package/dist/public/assets/_BvtRBlS4.js.br +0 -0
- package/dist/public/assets/_C0OkE91l.js +1 -0
- package/dist/public/assets/{_B7RTaeWh.js → _C0Qul9-A.js} +5 -5
- package/dist/public/assets/_C0Qul9-A.js.br +0 -0
- package/dist/public/assets/_C0rT0pkF.js +1 -0
- package/dist/public/assets/_C3CmAkGd.js +1 -0
- package/dist/public/assets/{_DgFgoB4_.js → _C3CvDqAU.js} +1 -1
- package/dist/public/assets/_C3CvDqAU.js.br +0 -0
- package/dist/public/assets/{_BndAJZwW.js → _C3JqzX6h.js} +1 -1
- package/dist/public/assets/_C3JqzX6h.js.br +0 -0
- package/dist/public/assets/{_3IZOU36R.js → _C4ANqjUO.js} +1 -1
- package/dist/public/assets/_C4ANqjUO.js.br +0 -0
- package/dist/public/assets/_C5DH9oOf.js +1 -0
- package/dist/public/assets/_C5sFdYe9.js +1 -0
- package/dist/public/assets/{_ahnzi6Vi.js → _C74hoXSg.js} +1 -1
- package/dist/public/assets/_C74hoXSg.js.br +0 -0
- package/dist/public/assets/_CCTo-C_5.js +1 -0
- package/dist/public/assets/_CDcdmiKC.js +1 -0
- package/dist/public/assets/_CDqJPzG_.js +1 -0
- package/dist/public/assets/{_I1G0J8iR.js → _CH4FVzly.js} +1 -1
- package/dist/public/assets/_CH4FVzly.js.br +0 -0
- package/dist/public/assets/_CHRtfQm8.js +1 -0
- package/dist/public/assets/_CHnN1OUE.js +1 -0
- package/dist/public/assets/_CKLCZ7qS.js +1 -0
- package/dist/public/assets/{_ezrIBxd5.js → _CMZsgNPc.js} +1 -1
- package/dist/public/assets/_CMZsgNPc.js.br +0 -0
- package/dist/public/assets/_CNbdL75e.js +1 -0
- package/dist/public/assets/_CQsxBQYp.js +1 -0
- package/dist/public/assets/{_BqZMlemw.js → _CSSUf_cF.js} +1 -1
- package/dist/public/assets/_CSSUf_cF.js.br +0 -0
- package/dist/public/assets/_CV0JELaI.js +1 -0
- package/dist/public/assets/_CVcEXbq2.js +1 -0
- package/dist/public/assets/_CY7yLV4X.js +1 -0
- package/dist/public/assets/{_Bu5hgjmu.js → _CYtI3ZUO.js} +1 -1
- package/dist/public/assets/_CYtI3ZUO.js.br +0 -0
- package/dist/public/assets/_CZ0oEQzb.js +1 -0
- package/dist/public/assets/_CZeCHesq.js +1 -0
- package/dist/public/assets/_CZei_-4z.js +1 -0
- package/dist/public/assets/{_Dzml7-SO.js → _CcWLzdOn.js} +1 -1
- package/dist/public/assets/_CcWLzdOn.js.br +0 -0
- package/dist/public/assets/{_Bsdn_9V_.js → _Ccwh6_69.js} +9 -9
- package/dist/public/assets/_Ccwh6_69.js.br +0 -0
- package/dist/public/assets/{_D-7MOklF.js → _CdmLszaF.js} +1 -1
- package/dist/public/assets/_CdmLszaF.js.br +0 -0
- package/dist/public/assets/_CdvRIoSW.js +1 -0
- package/dist/public/assets/{_CeKaED0O.js → _CeWEms2G.js} +1 -1
- package/dist/public/assets/{_Cyqw1SYV.js → _CkYsst7o.js} +1 -1
- package/dist/public/assets/_CkYsst7o.js.br +0 -0
- package/dist/public/assets/{_bgVS_jjB.js → _ClTXG9so.js} +1 -1
- package/dist/public/assets/_ClUpRbMG.js +1 -0
- package/dist/public/assets/{_CJBfnXPc.js → _ClapXxZl.js} +1 -1
- package/dist/public/assets/_ClapXxZl.js.br +0 -0
- package/dist/public/assets/{_B704FqW-.js → _CoaJtMCC.js} +1 -1
- package/dist/public/assets/_CoaJtMCC.js.br +0 -0
- package/dist/public/assets/_Coqwh06x.js +1 -0
- package/dist/public/assets/{_BAcvIhfz.js → _CqCLnBE3.js} +1 -1
- package/dist/public/assets/_CqCLnBE3.js.br +0 -0
- package/dist/public/assets/{_C_hw80DQ.js → _Crf1JP7F.js} +1 -1
- package/dist/public/assets/_Crf1JP7F.js.br +0 -0
- package/dist/public/assets/{_CuKCWxtd.js → _CruGUeWu.js} +1 -1
- package/dist/public/assets/_CruGUeWu.js.br +0 -0
- package/dist/public/assets/_CvBNrX9c.js +1 -0
- package/dist/public/assets/{_CnkmJKZH.js → _CvpfgyZE.js} +1 -1
- package/dist/public/assets/_CvpfgyZE.js.br +0 -0
- package/dist/public/assets/{_Do-dGY2X.js → _CxgPcY1B.js} +1 -1
- package/dist/public/assets/_CxgPcY1B.js.br +0 -0
- package/dist/public/assets/{_CB811mfH.js → _D-oIq8BZ.js} +1 -1
- package/dist/public/assets/_D-oIq8BZ.js.br +0 -0
- package/dist/public/assets/_D0H5I5m4.js +1 -0
- package/dist/public/assets/{_z-BjZNm3.js → _D0HnI6ug.js} +1 -1
- package/dist/public/assets/_D0HnI6ug.js.br +0 -0
- package/dist/public/assets/_D3TaXLz8.js +1 -0
- package/dist/public/assets/_D3TqQSka.js +1 -0
- package/dist/public/assets/_D4ZY_O8p.js +1 -0
- package/dist/public/assets/{_DJmXTsXM.js → _D4icZZux.js} +1 -1
- package/dist/public/assets/_D4icZZux.js.br +0 -0
- package/dist/public/assets/{_CqJdpoBK.js → _D4tgqiIB.js} +1 -1
- package/dist/public/assets/_D4tgqiIB.js.br +0 -0
- package/dist/public/assets/{_Idah-Wno.js → _D6OAuof8.js} +1 -1
- package/dist/public/assets/_D7IayTpp.js +1 -0
- package/dist/public/assets/{_CiCC4SAB.js → _D7UV9Wir.js} +1 -1
- package/dist/public/assets/_D7UV9Wir.js.br +0 -0
- package/dist/public/assets/{_D3dAzn-U.js → _D7siXaWH.js} +1 -1
- package/dist/public/assets/_D7siXaWH.js.br +0 -0
- package/dist/public/assets/{_DrTiWDUU.js → _D8e-tVLG.js} +1 -1
- package/dist/public/assets/_D8e-tVLG.js.br +0 -0
- package/dist/public/assets/{_Bxgu50JS.js → _D9zKRLBR.js} +1 -1
- package/dist/public/assets/_D9zKRLBR.js.br +0 -0
- package/dist/public/assets/{_DvgVDKmX.js → _DBcnZRAl.js} +1 -1
- package/dist/public/assets/_DBcnZRAl.js.br +0 -0
- package/dist/public/assets/{_C6vrNkj_.js → _DBv6A4ZA.js} +1 -1
- package/dist/public/assets/_DBv6A4ZA.js.br +0 -0
- package/dist/public/assets/{_BuQ2ay9z.js → _DChdFXSz.js} +1 -1
- package/dist/public/assets/_DChdFXSz.js.br +0 -0
- package/dist/public/assets/{_DPDpLf-R.js → _DEOJwc9o.js} +1 -1
- package/dist/public/assets/_DEOJwc9o.js.br +0 -0
- package/dist/public/assets/_DEUO3A77.js +1 -0
- package/dist/public/assets/_DEto2yAG.js +1 -0
- package/dist/public/assets/_DF4cXNDT.js +1 -0
- package/dist/public/assets/{_DChbhtm7.js → _DHhfMQv0.js} +1 -1
- package/dist/public/assets/_DHhfMQv0.js.br +0 -0
- package/dist/public/assets/{_DtiK3IDe.js → _DJWtiudl.js} +1 -1
- package/dist/public/assets/_DJWtiudl.js.br +0 -0
- package/dist/public/assets/{_NCVKEfbF.js → _DK7tFAuR.js} +1 -1
- package/dist/public/assets/_DK7tFAuR.js.br +0 -0
- package/dist/public/assets/_DLLxBxXt.js +1 -0
- package/dist/public/assets/_DLw2Ql6h.js +1 -0
- package/dist/public/assets/_DMAM82ur.js +1 -0
- package/dist/public/assets/_DMRQxpWh.js +1 -0
- package/dist/public/assets/{_BwsgtEeq.js → _DN8cYyMA.js} +1 -1
- package/dist/public/assets/_DN8cYyMA.js.br +0 -0
- package/dist/public/assets/_DPXtZlgx.js +1 -0
- package/dist/public/assets/{_mcdXVs94.js → _DRe6yj8o.js} +1 -1
- package/dist/public/assets/_DRe6yj8o.js.br +0 -0
- package/dist/public/assets/_DTRwgUDz.js +1 -0
- package/dist/public/assets/_DXKf95xT.js +1 -0
- package/dist/public/assets/{_CpqmQUsa.js → _DXTQvf2X.js} +1 -1
- package/dist/public/assets/_DYLeu8Yn.js +1 -0
- package/dist/public/assets/{_ByDMN1SH.js → _DYcJRv1v.js} +1 -1
- package/dist/public/assets/_DYcJRv1v.js.br +0 -0
- package/dist/public/assets/{_BHTNZeRn.js → _D_0P73tR.js} +1 -1
- package/dist/public/assets/_D_0P73tR.js.br +0 -0
- package/dist/public/assets/{_Cu-SfhdL.js → _Da4ArfnL.js} +1 -1
- package/dist/public/assets/_Da4ArfnL.js.br +0 -0
- package/dist/public/assets/_Da6uZcpe.js +1 -0
- package/dist/public/assets/_Dd0Ly8u1.js +1 -0
- package/dist/public/assets/_DdUtrYLB.js +1 -0
- package/dist/public/assets/_DeEl87FQ.js +1 -0
- package/dist/public/assets/{_BIt6tvPi.js → _DeSxIIXB.js} +1 -1
- package/dist/public/assets/_DeSxIIXB.js.br +0 -0
- package/dist/public/assets/_DewfgUtc.js +1 -0
- package/dist/public/assets/_DexEfCG6.js +1 -0
- package/dist/public/assets/{_BChbCwWm.js → _Df2TxuvS.js} +1 -1
- package/dist/public/assets/_Df2TxuvS.js.br +0 -0
- package/dist/public/assets/{_Luj-nE2Q.js → _DjOV2LK6.js} +2 -2
- package/dist/public/assets/_DjOV2LK6.js.br +0 -0
- package/dist/public/assets/{_BH15mqpr.js → _DkyXsbiQ.js} +2 -2
- package/dist/public/assets/_DkyXsbiQ.js.br +0 -0
- package/dist/public/assets/_DlOMVv-w.js +1 -0
- package/dist/public/assets/_DmFwT38J.js +1 -0
- package/dist/public/assets/{_B9QxmB8p.js → _DmpEhYLB.js} +1 -1
- package/dist/public/assets/_DmpEhYLB.js.br +0 -0
- package/dist/public/assets/{_DWYNR6FP.js → _Dq3-ZF2Z.js} +1 -1
- package/dist/public/assets/_Dq3-ZF2Z.js.br +0 -0
- package/dist/public/assets/_DqqEHIEx.js +1 -0
- package/dist/public/assets/{_B-VYcrqc.js → _Duitagee.js} +1 -1
- package/dist/public/assets/_Duitagee.js.br +0 -0
- package/dist/public/assets/_DvYVra8w.js +1 -0
- package/dist/public/assets/_DwEFyNc7.js +1 -0
- package/dist/public/assets/{_B5w-PFzL.js → _Dwea1Mf0.js} +1 -1
- package/dist/public/assets/_Dwea1Mf0.js.br +0 -0
- package/dist/public/assets/{_BKuPpEpl.js → _F19-LHbi.js} +1 -1
- package/dist/public/assets/_F19-LHbi.js.br +0 -0
- package/dist/public/assets/_Fkix9A0t.js +1 -0
- package/dist/public/assets/{_BBDxD-rC.js → _I_2m9jez.js} +1 -1
- package/dist/public/assets/_I_2m9jez.js.br +0 -0
- package/dist/public/assets/{_D3zgkNcZ.js → _JPzuLvxx.js} +1 -1
- package/dist/public/assets/_JPzuLvxx.js.br +0 -0
- package/dist/public/assets/_MEOVRTxh.js +1 -0
- package/dist/public/assets/{_C-iQnfOW.js → _NCyU2X3g.js} +1 -1
- package/dist/public/assets/_NCyU2X3g.js.br +0 -0
- package/dist/public/assets/_OXZnsLN0.js +1 -0
- package/dist/public/assets/_Tjc2w7pG.js +1 -0
- package/dist/public/assets/_Un6ZS8VK.js +1 -0
- package/dist/public/assets/{_-tIChhHp.js → _VlEKRWlm.js} +1 -1
- package/dist/public/assets/_VlEKRWlm.js.br +0 -0
- package/dist/public/assets/{_Bm-EJ483.js → _YShYV2y4.js} +1 -1
- package/dist/public/assets/_YShYV2y4.js.br +0 -0
- package/dist/public/assets/_ZKijEvNU.js +1 -0
- package/dist/public/assets/_ZWkymwZ8.js +1 -0
- package/dist/public/assets/_bnPm10fX.js +1 -0
- package/dist/public/assets/{_C3E0m_xC.js → _cH--Ry2T.js} +1 -1
- package/dist/public/assets/_cH--Ry2T.js.br +0 -0
- package/dist/public/assets/_dULwd-83.js +1 -0
- package/dist/public/assets/{_EFF0RahO.js → _fb-cSkNg.js} +1 -1
- package/dist/public/assets/_fb-cSkNg.js.br +0 -0
- package/dist/public/assets/{_Bltf0lwj.js → _gjXKiPz2.js} +1 -1
- package/dist/public/assets/_gjXKiPz2.js.br +0 -0
- package/dist/public/assets/_hZISiIh0.js +1 -0
- package/dist/public/assets/_j0MbYrcw.js +1 -0
- package/dist/public/assets/{_Bj18Vxoa.js → _mg_8sHU7.js} +1 -1
- package/dist/public/assets/_mg_8sHU7.js.br +0 -0
- package/dist/public/assets/{_BE3izGMt.js → _nif0UYC1.js} +1 -1
- package/dist/public/assets/_nif0UYC1.js.br +0 -0
- package/dist/public/assets/{_wRxJgfi3.js → _ocpKhGmH.js} +1 -1
- package/dist/public/assets/_ocpKhGmH.js.br +0 -0
- package/dist/public/assets/{_CYyCK3gr.js → _qthymfEm.js} +1 -1
- package/dist/public/assets/{__1CwTtq-.js → _rlSb3jYt.js} +2 -2
- package/dist/public/assets/_rlSb3jYt.js.br +0 -0
- package/dist/public/assets/{_C0yBoXDm.js → _thTd3DoV.js} +1 -1
- package/dist/public/assets/_thTd3DoV.js.br +0 -0
- package/dist/public/assets/_yTQokBA3.js +1 -0
- package/dist/public/assets/{_CzDl06G7.js → _yvNxTzJ_.js} +1 -1
- package/dist/public/assets/_yvNxTzJ_.js.br +0 -0
- package/dist/public/assets/files-view-CWdlTJZL.js +2 -0
- package/dist/public/assets/manage-workspace-BvB-DIwQ.js +2 -0
- package/dist/public/assets/new-bAfr06Ym.js +1 -0
- package/dist/public/assets/new-workspace-BGNyC8BU.js +2 -0
- package/dist/public/assets/review-view-Cnv9wu31.js +2 -0
- package/dist/public/assets/settings-bAfr06Ym.js +1 -0
- package/dist/public/assets/settings-page-DpFc3exI.js +2 -0
- package/dist/public/assets/{styles-rsoFYnOm.css → styles-DAX6ERBR.css} +1 -1
- package/dist/public/assets/styles-DAX6ERBR.css.br +0 -0
- package/dist/public/assets/w-bAfr06Ym.js +1 -0
- package/dist/public/assets/w._-B0qk5BkH.js +1 -0
- package/dist/public/assets/w._-B2U79M4Z.js +1 -0
- package/dist/public/assets/w._-bAfr06Ym.js +1 -0
- package/lib/setup/doctor.mjs +19 -2
- package/lib/setup/shims.mjs +62 -0
- package/package.json +1 -1
- package/dist/_DMIGXpem.js +0 -2
- package/dist/_Dbtwc-4J.js +0 -2
- package/dist/public/assets/_-tIChhHp.js.br +0 -0
- package/dist/public/assets/_3IZOU36R.js.br +0 -0
- package/dist/public/assets/_3LigOO1r.js +0 -1
- package/dist/public/assets/_53vvCtB9.js.br +0 -0
- package/dist/public/assets/_8F1hZg30.js +0 -1
- package/dist/public/assets/_8GJ-PBB-.js +0 -1
- package/dist/public/assets/_AF2pgiJE.js +0 -1
- package/dist/public/assets/_B-VYcrqc.js.br +0 -0
- package/dist/public/assets/_B-wjov_Z.js +0 -1
- package/dist/public/assets/_B23iifIa.js.br +0 -0
- package/dist/public/assets/_B2gvN5eE.js +0 -1
- package/dist/public/assets/_B31SsJ2H.js +0 -1
- package/dist/public/assets/_B3ioypfU.js +0 -1
- package/dist/public/assets/_B3zvGVOr.js +0 -1
- package/dist/public/assets/_B4KBgFQJ.js +0 -1
- package/dist/public/assets/_B4UPSzSe.js +0 -1
- package/dist/public/assets/_B5w-PFzL.js.br +0 -0
- package/dist/public/assets/_B704FqW-.js.br +0 -0
- package/dist/public/assets/_B7RTaeWh.js.br +0 -0
- package/dist/public/assets/_B8WsOiDp.js +0 -1
- package/dist/public/assets/_B9QxmB8p.js.br +0 -0
- package/dist/public/assets/_B9l6-SS5.js +0 -1
- package/dist/public/assets/_BAcvIhfz.js.br +0 -0
- package/dist/public/assets/_BBDxD-rC.js.br +0 -0
- package/dist/public/assets/_BChbCwWm.js.br +0 -0
- package/dist/public/assets/_BDnmZTGe.js +0 -1
- package/dist/public/assets/_BE3izGMt.js.br +0 -0
- package/dist/public/assets/_BH15mqpr.js.br +0 -0
- package/dist/public/assets/_BHTNZeRn.js.br +0 -0
- package/dist/public/assets/_BIt6tvPi.js.br +0 -0
- package/dist/public/assets/_BJxnfQcd.js.br +0 -0
- package/dist/public/assets/_BKuPpEpl.js.br +0 -0
- package/dist/public/assets/_BN3pboD3.js +0 -1
- package/dist/public/assets/_BQ9vuNgN.js +0 -1
- package/dist/public/assets/_BWhs553r.js.br +0 -0
- package/dist/public/assets/_BY2Fd-ai.js +0 -1
- package/dist/public/assets/_BZ5WB2jH.js +0 -1
- package/dist/public/assets/_BZDlyKDT.js.br +0 -0
- package/dist/public/assets/_B_6D3GJa.js +0 -1
- package/dist/public/assets/_BdZ9i3Bd.js +0 -1
- package/dist/public/assets/_Bffx--rk.js +0 -1
- package/dist/public/assets/_BiA2OZOl.js +0 -1
- package/dist/public/assets/_Bj18Vxoa.js.br +0 -0
- package/dist/public/assets/_BjrAjvOn.js +0 -1
- package/dist/public/assets/_BkQCadEV.js +0 -1
- package/dist/public/assets/_Bltf0lwj.js.br +0 -0
- package/dist/public/assets/_Bm-EJ483.js.br +0 -0
- package/dist/public/assets/_BndAJZwW.js.br +0 -0
- package/dist/public/assets/_Bq2kj2t3.js +0 -1
- package/dist/public/assets/_BqPqaeUo.js.br +0 -0
- package/dist/public/assets/_BqZMlemw.js.br +0 -0
- package/dist/public/assets/_Bsdn_9V_.js.br +0 -0
- package/dist/public/assets/_Bu5hgjmu.js.br +0 -0
- package/dist/public/assets/_BuGkNNaL.js +0 -1
- package/dist/public/assets/_BuQ2ay9z.js.br +0 -0
- package/dist/public/assets/_BwsgtEeq.js.br +0 -0
- package/dist/public/assets/_Bxgu50JS.js.br +0 -0
- package/dist/public/assets/_ByANtHYy.js +0 -1
- package/dist/public/assets/_ByDMN1SH.js.br +0 -0
- package/dist/public/assets/_BzRks6mQ.js +0 -1
- package/dist/public/assets/_Bzd4BveK.js +0 -1
- package/dist/public/assets/_C-iQnfOW.js.br +0 -0
- package/dist/public/assets/_C0yBoXDm.js.br +0 -0
- package/dist/public/assets/_C2zk28wV.js +0 -1
- package/dist/public/assets/_C3E0m_xC.js.br +0 -0
- package/dist/public/assets/_C6vrNkj_.js.br +0 -0
- package/dist/public/assets/_C9C-3hXG.js +0 -1
- package/dist/public/assets/_CB811mfH.js.br +0 -0
- package/dist/public/assets/_CCuLPWZW.js.br +0 -0
- package/dist/public/assets/_CGSqFdZV.js +0 -1
- package/dist/public/assets/_CGbnwvi6.js +0 -1
- package/dist/public/assets/_CJBfnXPc.js.br +0 -0
- package/dist/public/assets/_CKFNF1bt.js +0 -1
- package/dist/public/assets/_CL7o_nRC.js +0 -1
- package/dist/public/assets/_CO7GkttO.js +0 -1
- package/dist/public/assets/_CSqMt_yB.js +0 -1
- package/dist/public/assets/_CT3v6Oze.js.br +0 -0
- package/dist/public/assets/_CV1g9tqF.js +0 -1
- package/dist/public/assets/_CYMRiGMt.js +0 -1
- package/dist/public/assets/_CZLvdLqX.js +0 -1
- package/dist/public/assets/_CZyU6zlW.js.br +0 -0
- package/dist/public/assets/_C_hw80DQ.js.br +0 -0
- package/dist/public/assets/_CeSQyrMz.js.br +0 -0
- package/dist/public/assets/_CfPha1FH.js.br +0 -0
- package/dist/public/assets/_CfpvYRrS.js +0 -1
- package/dist/public/assets/_Che6-ZVy.js +0 -1
- package/dist/public/assets/_CiCC4SAB.js.br +0 -0
- package/dist/public/assets/_Cn8rkyXq.js.br +0 -0
- package/dist/public/assets/_CnWm9a_o.js.br +0 -0
- package/dist/public/assets/_Cnb9K9XY.js +0 -1
- package/dist/public/assets/_CnkmJKZH.js.br +0 -0
- package/dist/public/assets/_CoVyqWOC.js.br +0 -0
- package/dist/public/assets/_CqJdpoBK.js.br +0 -0
- package/dist/public/assets/_Cu-SfhdL.js.br +0 -0
- package/dist/public/assets/_CuKCWxtd.js.br +0 -0
- package/dist/public/assets/_CvbIq7kc.js +0 -1
- package/dist/public/assets/_CxPGS3y4.js +0 -1
- package/dist/public/assets/_Cyqw1SYV.js.br +0 -0
- package/dist/public/assets/_CyyVMlPp.js +0 -1
- package/dist/public/assets/_CzDUXeLr.js +0 -1
- package/dist/public/assets/_CzDl06G7.js.br +0 -0
- package/dist/public/assets/_D-7MOklF.js.br +0 -0
- package/dist/public/assets/_D-MrkdQv.js +0 -1
- package/dist/public/assets/_D3dAzn-U.js.br +0 -0
- package/dist/public/assets/_D3zgkNcZ.js.br +0 -0
- package/dist/public/assets/_D4yHrw0x.js.br +0 -0
- package/dist/public/assets/_DAGoF4RD.js +0 -1
- package/dist/public/assets/_DBUH1PtY.js +0 -1
- package/dist/public/assets/_DChbhtm7.js.br +0 -0
- package/dist/public/assets/_DDDEt2Cn.js +0 -1
- package/dist/public/assets/_DEVUMpy9.js +0 -1
- package/dist/public/assets/_DI2YhTfn.js +0 -1
- package/dist/public/assets/_DJmXTsXM.js.br +0 -0
- package/dist/public/assets/_DLNSQLre.js +0 -1
- package/dist/public/assets/_DPDpLf-R.js.br +0 -0
- package/dist/public/assets/_DVbq8rez.js.br +0 -0
- package/dist/public/assets/_DVuEGjB6.js.br +0 -0
- package/dist/public/assets/_DWYNR6FP.js.br +0 -0
- package/dist/public/assets/_DWn9Bk4p.js.br +0 -0
- package/dist/public/assets/_D_qMHeyF.js.br +0 -0
- package/dist/public/assets/_D_vDaILt.js +0 -1
- package/dist/public/assets/_DahEvrx7.js.br +0 -0
- package/dist/public/assets/_DdpvFyoD.js.br +0 -0
- package/dist/public/assets/_DgFgoB4_.js.br +0 -0
- package/dist/public/assets/_Dho8D73M.js.br +0 -0
- package/dist/public/assets/_DiUYcYna.js +0 -1
- package/dist/public/assets/_DjIcKKrW.js.br +0 -0
- package/dist/public/assets/_DkZVAXow.js +0 -1
- package/dist/public/assets/_Do-dGY2X.js.br +0 -0
- package/dist/public/assets/_DrTiWDUU.js.br +0 -0
- package/dist/public/assets/_DtBP9JxD.js +0 -1
- package/dist/public/assets/_DtiK3IDe.js.br +0 -0
- package/dist/public/assets/_Dtj0n4Ea.js.br +0 -0
- package/dist/public/assets/_Dv4QXsaq.js +0 -1
- package/dist/public/assets/_DvgVDKmX.js.br +0 -0
- package/dist/public/assets/_DxArLWxr.js +0 -1
- package/dist/public/assets/_DzasBNTs.js +0 -1
- package/dist/public/assets/_Dzml7-SO.js.br +0 -0
- package/dist/public/assets/_EFF0RahO.js.br +0 -0
- package/dist/public/assets/_Er1jCr0y.js.br +0 -0
- package/dist/public/assets/_I-rWUgTm.js.br +0 -0
- package/dist/public/assets/_I1G0J8iR.js.br +0 -0
- package/dist/public/assets/_Luj-nE2Q.js.br +0 -0
- package/dist/public/assets/_MTzS-gYR.js +0 -1
- package/dist/public/assets/_NCVKEfbF.js.br +0 -0
- package/dist/public/assets/_Nt06UfoF.js +0 -1
- package/dist/public/assets/_SNGXdx8T.js.br +0 -0
- package/dist/public/assets/_U-ItOyuk.js +0 -1
- package/dist/public/assets/_UM6RqjfN.js.br +0 -0
- package/dist/public/assets/_XM_G2_E8.js +0 -1
- package/dist/public/assets/_YIEXDh5T.js.br +0 -0
- package/dist/public/assets/_Z8XAsbav.js.br +0 -0
- package/dist/public/assets/__1CwTtq-.js.br +0 -0
- package/dist/public/assets/__UZfk21C.js +0 -1
- package/dist/public/assets/_ahnzi6Vi.js.br +0 -0
- package/dist/public/assets/_b8vSuisY.js +0 -1
- package/dist/public/assets/_cAFV8cvO.js +0 -1
- package/dist/public/assets/_dZl98lyu.js.br +0 -0
- package/dist/public/assets/_dbwi0e20.js +0 -1
- package/dist/public/assets/_dfb9VWND.js +0 -1
- package/dist/public/assets/_dhxtcjZT.js.br +0 -0
- package/dist/public/assets/_ezrIBxd5.js.br +0 -0
- package/dist/public/assets/_l6WNhzBy.js +0 -1
- package/dist/public/assets/_mcdXVs94.js.br +0 -0
- package/dist/public/assets/_r3IeTPfk.js +0 -1
- package/dist/public/assets/_sctMXY82.js +0 -1
- package/dist/public/assets/_ukc-Ezd5.js +0 -1
- package/dist/public/assets/_wRxJgfi3.js.br +0 -0
- package/dist/public/assets/_wk1rSbkR.js +0 -1
- package/dist/public/assets/_xAWxeLFd.js +0 -1
- package/dist/public/assets/_xOecD2Ye.js +0 -1
- package/dist/public/assets/_xqGqu7PK.js +0 -1
- package/dist/public/assets/_z-BjZNm3.js.br +0 -0
- package/dist/public/assets/_z2ZJ8cb5.js +0 -1
- package/dist/public/assets/_zCVRc38b.js +0 -1
- package/dist/public/assets/files-view-DvsrAin-.js +0 -2
- package/dist/public/assets/manage-workspace-DpiGdfaH.js +0 -2
- package/dist/public/assets/new-B9cFSdMl.js +0 -1
- package/dist/public/assets/new-workspace-DOoDlvjo.js +0 -2
- package/dist/public/assets/review-view-C4Iv_eUU.js +0 -2
- package/dist/public/assets/settings-B9cFSdMl.js +0 -1
- package/dist/public/assets/settings-page-CIKTh5Y6.js +0 -2
- package/dist/public/assets/styles-rsoFYnOm.css.br +0 -0
- package/dist/public/assets/w-B9cFSdMl.js +0 -1
- package/dist/public/assets/w._-B9cFSdMl.js +0 -1
- package/dist/public/assets/w._-BSzTwkWw.js +0 -1
- package/dist/public/assets/w._-BWgHxva-.js +0 -1
|
@@ -758,6 +758,67 @@ var STEPS = [
|
|
|
758
758
|
db.exec(`
|
|
759
759
|
ALTER TABLE session_messages ADD COLUMN follows TEXT;
|
|
760
760
|
ALTER TABLE session_messages ADD COLUMN held TEXT;
|
|
761
|
+
`);
|
|
762
|
+
}
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
version: 13,
|
|
766
|
+
name: "closes kept, and notices",
|
|
767
|
+
up(db) {
|
|
768
|
+
db.exec(`
|
|
769
|
+
ALTER TABLE closed_sessions ADD COLUMN how TEXT NOT NULL DEFAULT 'done';
|
|
770
|
+
|
|
771
|
+
CREATE TABLE session_messages_new (
|
|
772
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
773
|
+
to_session TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
774
|
+
from_session TEXT,
|
|
775
|
+
from_label TEXT,
|
|
776
|
+
kind TEXT NOT NULL CHECK (kind IN ('message', 'reply', 'closed', 'notice')),
|
|
777
|
+
body TEXT NOT NULL,
|
|
778
|
+
wants_reply INTEGER NOT NULL DEFAULT 0,
|
|
779
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
780
|
+
delivered_at TEXT,
|
|
781
|
+
group_id TEXT REFERENCES session_groups(id) ON DELETE SET NULL,
|
|
782
|
+
answers TEXT,
|
|
783
|
+
urgent INTEGER NOT NULL DEFAULT 0,
|
|
784
|
+
by_send INTEGER NOT NULL DEFAULT 0,
|
|
785
|
+
follows TEXT,
|
|
786
|
+
held TEXT
|
|
787
|
+
);
|
|
788
|
+
INSERT INTO session_messages_new (id, to_session, from_session, from_label, kind, body, wants_reply, created_at, delivered_at, group_id, answers, urgent, by_send, follows, held)
|
|
789
|
+
SELECT id, to_session, from_session, from_label, kind, body, wants_reply, created_at, delivered_at, group_id, answers, urgent, by_send, follows, held FROM session_messages;
|
|
790
|
+
DROP TABLE session_messages;
|
|
791
|
+
ALTER TABLE session_messages_new RENAME TO session_messages;
|
|
792
|
+
CREATE INDEX session_messages_to ON session_messages(to_session);
|
|
793
|
+
CREATE INDEX session_messages_from ON session_messages(from_session);
|
|
794
|
+
`);
|
|
795
|
+
}
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
version: 14,
|
|
799
|
+
name: "message log",
|
|
800
|
+
up(db) {
|
|
801
|
+
db.exec(`
|
|
802
|
+
CREATE TABLE message_log (
|
|
803
|
+
id INTEGER PRIMARY KEY,
|
|
804
|
+
workspace_id TEXT,
|
|
805
|
+
to_session TEXT NOT NULL,
|
|
806
|
+
to_label TEXT,
|
|
807
|
+
from_session TEXT,
|
|
808
|
+
from_label TEXT,
|
|
809
|
+
kind TEXT NOT NULL,
|
|
810
|
+
body TEXT NOT NULL,
|
|
811
|
+
wants_reply INTEGER NOT NULL DEFAULT 0,
|
|
812
|
+
urgent INTEGER NOT NULL DEFAULT 0,
|
|
813
|
+
created_at TEXT NOT NULL,
|
|
814
|
+
delivered_at TEXT,
|
|
815
|
+
delivered TEXT,
|
|
816
|
+
done_at TEXT,
|
|
817
|
+
outcome TEXT
|
|
818
|
+
);
|
|
819
|
+
CREATE INDEX message_log_to ON message_log(to_session);
|
|
820
|
+
CREATE INDEX message_log_from ON message_log(from_session);
|
|
821
|
+
CREATE INDEX message_log_workspace ON message_log(workspace_id, created_at);
|
|
761
822
|
`);
|
|
762
823
|
}
|
|
763
824
|
}
|
|
@@ -2027,6 +2088,61 @@ function unreachableText(host, why) {
|
|
|
2027
2088
|
return `Can't reach ${host} (${why}): connect to its network or VPN`;
|
|
2028
2089
|
}
|
|
2029
2090
|
//#endregion
|
|
2091
|
+
//#region lib/setup/shims.mjs
|
|
2092
|
+
/** Version managers whose shims stand in for a tool. A shim is the
|
|
2093
|
+
* manager's own binary (mise links every shim to itself) or a script that
|
|
2094
|
+
* hands off to it, so neither its path nor its target is the install: the
|
|
2095
|
+
* manager's `which` names that. A tool removed from its manager leaves the
|
|
2096
|
+
* shim until a reshim. `installs` and `reshim` are a node global's, which
|
|
2097
|
+
* is what work's own install is. */
|
|
2098
|
+
function versionManagers() {
|
|
2099
|
+
return [
|
|
2100
|
+
{
|
|
2101
|
+
id: "mise",
|
|
2102
|
+
shim: (file, real) => path.basename(real) === "mise",
|
|
2103
|
+
which: (real, name) => [real, ["which", name]],
|
|
2104
|
+
installs: /\/mise\/installs\/node\//,
|
|
2105
|
+
reshim: "mise reshim"
|
|
2106
|
+
},
|
|
2107
|
+
{
|
|
2108
|
+
id: "asdf",
|
|
2109
|
+
shim: (file) => /\/\.asdf\/shims$/.test(path.dirname(file)),
|
|
2110
|
+
which: (real, name) => ["asdf", ["which", name]],
|
|
2111
|
+
installs: /\/\.asdf\/installs\/nodejs\//,
|
|
2112
|
+
reshim: "asdf reshim nodejs"
|
|
2113
|
+
},
|
|
2114
|
+
{
|
|
2115
|
+
id: "nodenv",
|
|
2116
|
+
shim: (file) => /\/\.nodenv\/shims$/.test(path.dirname(file)),
|
|
2117
|
+
which: (real, name) => ["nodenv", ["which", name]],
|
|
2118
|
+
installs: /\/\.nodenv\/versions\//,
|
|
2119
|
+
reshim: "nodenv rehash"
|
|
2120
|
+
}
|
|
2121
|
+
];
|
|
2122
|
+
}
|
|
2123
|
+
/** What the shim at `file` runs: the path its manager names; null when it
|
|
2124
|
+
* names none (the tool is gone, or no version of it is set), so the shim
|
|
2125
|
+
* runs nothing; undefined when `file` is no shim, or its manager could not
|
|
2126
|
+
* be asked (missing, hung), since unknown is not gone. Asked from the home
|
|
2127
|
+
* folder: the answer for a folder with no config of its own, wherever this
|
|
2128
|
+
* process was started. */
|
|
2129
|
+
function shimTarget(file, name = path.basename(file)) {
|
|
2130
|
+
let real = file;
|
|
2131
|
+
try {
|
|
2132
|
+
real = fs.realpathSync(file);
|
|
2133
|
+
} catch {}
|
|
2134
|
+
const manager = versionManagers().find((m) => m.shim(file, real));
|
|
2135
|
+
if (!manager) return void 0;
|
|
2136
|
+
const [bin, argv] = manager.which(real, name);
|
|
2137
|
+
const out = spawnSync(bin, argv, {
|
|
2138
|
+
encoding: "utf8",
|
|
2139
|
+
timeout: 2e3,
|
|
2140
|
+
cwd: os.homedir()
|
|
2141
|
+
});
|
|
2142
|
+
if (out.error || out.status === null) return void 0;
|
|
2143
|
+
return out.status === 0 && out.stdout.trim() || null;
|
|
2144
|
+
}
|
|
2145
|
+
//#endregion
|
|
2030
2146
|
//#region lib/setup/doctor.mjs
|
|
2031
2147
|
var home$1 = os.homedir();
|
|
2032
2148
|
/** Agent CLI install dirs from meta (`~` → home). Same list the service and
|
|
@@ -2211,14 +2327,29 @@ function discoverAgents(fresh = false) {
|
|
|
2211
2327
|
}
|
|
2212
2328
|
return agentsMemo.value;
|
|
2213
2329
|
}
|
|
2214
|
-
const value = scanAgents();
|
|
2330
|
+
const value = scanAgents(fresh);
|
|
2215
2331
|
agentsMemo = {
|
|
2216
2332
|
at: Date.now(),
|
|
2217
2333
|
value
|
|
2218
2334
|
};
|
|
2219
2335
|
return value;
|
|
2220
2336
|
}
|
|
2221
|
-
|
|
2337
|
+
/** Whether each shim found had nothing behind it, by path. Asking its
|
|
2338
|
+
* manager is a process (about 30 ms) inside a synchronous scan, so an
|
|
2339
|
+
* answer serves five minutes of them; a `fresh` scan asks again. */
|
|
2340
|
+
var SHIM_MEMO_MS = 3e5;
|
|
2341
|
+
var shimMemo = /* @__PURE__ */ new Map();
|
|
2342
|
+
function deadShim(file, name, fresh) {
|
|
2343
|
+
const kept = shimMemo.get(file);
|
|
2344
|
+
if (!fresh && kept && Date.now() - kept.at < SHIM_MEMO_MS) return kept.dead;
|
|
2345
|
+
const dead = shimTarget(file, name) === null;
|
|
2346
|
+
shimMemo.set(file, {
|
|
2347
|
+
at: Date.now(),
|
|
2348
|
+
dead
|
|
2349
|
+
});
|
|
2350
|
+
return dead;
|
|
2351
|
+
}
|
|
2352
|
+
function scanAgents(fresh = false) {
|
|
2222
2353
|
const dirs = setupDirs();
|
|
2223
2354
|
const seenDirs = /* @__PURE__ */ new Set();
|
|
2224
2355
|
const seen = /* @__PURE__ */ new Map();
|
|
@@ -2246,6 +2377,7 @@ function scanAgents() {
|
|
|
2246
2377
|
} catch {
|
|
2247
2378
|
continue;
|
|
2248
2379
|
}
|
|
2380
|
+
if (deadShim(full, name, fresh)) continue;
|
|
2249
2381
|
const bin = hit.bins.find((b) => name.startsWith(b));
|
|
2250
2382
|
seen.set(name, {
|
|
2251
2383
|
family: hit,
|
|
@@ -9277,6 +9409,17 @@ function noteBackground(sessionId, work) {
|
|
|
9277
9409
|
function onTurnEnd(fn) {
|
|
9278
9410
|
turnEndListeners.add(fn);
|
|
9279
9411
|
}
|
|
9412
|
+
/** Told of a turn that ended failing (rate limited, signed out), with
|
|
9413
|
+
* why (`onTurnFailed`). */
|
|
9414
|
+
var failedListeners = /* @__PURE__ */ new Set();
|
|
9415
|
+
/** A session's turn ended failing, as its hook said (`HookRead.failed`):
|
|
9416
|
+
* it sits at its prompt until someone carries it on. */
|
|
9417
|
+
function onTurnFailed(fn) {
|
|
9418
|
+
failedListeners.add(fn);
|
|
9419
|
+
}
|
|
9420
|
+
function noteTurnFailed(sessionId, why) {
|
|
9421
|
+
for (const fn of failedListeners) fn(sessionId, why);
|
|
9422
|
+
}
|
|
9280
9423
|
function endTurn(sessionId) {
|
|
9281
9424
|
const earlier = foldedMessages.get(sessionId) ?? [];
|
|
9282
9425
|
foldedMessages.delete(sessionId);
|
|
@@ -9488,7 +9631,7 @@ function publishChange(sessionId) {
|
|
|
9488
9631
|
const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
|
|
9489
9632
|
if (row?.workspace_id) {
|
|
9490
9633
|
const workspaceId = row.workspace_id;
|
|
9491
|
-
import("./
|
|
9634
|
+
import("./_CVNGN2QO.js").then((m) => m.notifySessionsChanged(workspaceId));
|
|
9492
9635
|
return;
|
|
9493
9636
|
}
|
|
9494
9637
|
publish("sessions.changed");
|
|
@@ -10219,9 +10362,12 @@ function readHook$6(p, reported, _state) {
|
|
|
10219
10362
|
if (event === "StopFailure") {
|
|
10220
10363
|
const label = FAILURES[str$1(p.error)] ?? "The turn failed";
|
|
10221
10364
|
const details = str$1(p.error_details);
|
|
10365
|
+
const summary = cleanSummary(details ? `${label}: ${details}` : label);
|
|
10222
10366
|
return {
|
|
10223
10367
|
reason: "attention",
|
|
10224
|
-
summary
|
|
10368
|
+
summary,
|
|
10369
|
+
failed: str$1(p.agent_id) ? void 0 : summary,
|
|
10370
|
+
conversation: str$1(p.session_id) || void 0
|
|
10225
10371
|
};
|
|
10226
10372
|
}
|
|
10227
10373
|
const read = readClaudeStyle(p, reported);
|
|
@@ -10237,8 +10383,8 @@ function readHook$6(p, reported, _state) {
|
|
|
10237
10383
|
} else if (event === "Stop") {
|
|
10238
10384
|
const running = backgroundWork(p);
|
|
10239
10385
|
if (running) read.background = { running };
|
|
10240
|
-
read.conversation = str$1(p.session_id) || void 0;
|
|
10241
10386
|
}
|
|
10387
|
+
if (event === "Stop" || event === "UserPromptSubmit") read.conversation = str$1(p.session_id) || void 0;
|
|
10242
10388
|
return read;
|
|
10243
10389
|
}
|
|
10244
10390
|
/** The kinds of `background_tasks` entry Claude wakes up for as they end
|
|
@@ -10318,6 +10464,8 @@ var claude = {
|
|
|
10318
10464
|
headless: (args) => hasArg(args, "-p", "--print"),
|
|
10319
10465
|
resumeFlags: (id) => ["--resume", id],
|
|
10320
10466
|
steerKeys: ["Enter"],
|
|
10467
|
+
submitsBehindPaste: true,
|
|
10468
|
+
quotesPastes: true,
|
|
10321
10469
|
interruptKeys: ["Escape"],
|
|
10322
10470
|
envPrefixes: ["CLAUDE", "AI_AGENT"],
|
|
10323
10471
|
startupQuestions: [{
|
|
@@ -10545,6 +10693,7 @@ var codex = {
|
|
|
10545
10693
|
launchFlags,
|
|
10546
10694
|
resumeFlags: (id) => ["resume", id],
|
|
10547
10695
|
steerKeys: ["Enter"],
|
|
10696
|
+
submitsBehindPaste: true,
|
|
10548
10697
|
interruptKeys: ["Escape"],
|
|
10549
10698
|
reportsWorking: () => true,
|
|
10550
10699
|
headless: (args) => hasArg(args, "exec", "e", "review"),
|
|
@@ -10812,6 +10961,7 @@ var copilot = {
|
|
|
10812
10961
|
}],
|
|
10813
10962
|
reportsWorking: () => true,
|
|
10814
10963
|
steerKeys: ["Enter"],
|
|
10964
|
+
submitsBehindPaste: true,
|
|
10815
10965
|
interruptKeys: ["C-c"],
|
|
10816
10966
|
headless: (args) => hasArg(args, "-p", "--prompt"),
|
|
10817
10967
|
envPrefixes: ["COPILOT_"],
|
|
@@ -11291,6 +11441,7 @@ var grok = {
|
|
|
11291
11441
|
},
|
|
11292
11442
|
reportsWorking: registered,
|
|
11293
11443
|
promptAsArgv: true,
|
|
11444
|
+
submitsBehindPaste: true,
|
|
11294
11445
|
interruptKeys: ["C-c"],
|
|
11295
11446
|
headless: (args) => hasArg(args, "-p", "--single", "--prompt-file", "--prompt-json", "agent"),
|
|
11296
11447
|
envPrefixes: ["GROK_"],
|
|
@@ -11469,6 +11620,7 @@ var opencode = {
|
|
|
11469
11620
|
launchEnv: () => ({ OPENCODE_CONFIG_CONTENT: pluginConfig() }),
|
|
11470
11621
|
reportsWorking: installed$1,
|
|
11471
11622
|
steerKeys: ["Enter"],
|
|
11623
|
+
submitsBehindPaste: true,
|
|
11472
11624
|
interruptKeys: ["Escape", "Escape"],
|
|
11473
11625
|
headless: (args) => hasArg(args, "run"),
|
|
11474
11626
|
envPrefixes: ["OPENCODE_"],
|
|
@@ -11485,7 +11637,10 @@ var meta = meta_default;
|
|
|
11485
11637
|
* prompt, the one way Pi stops on the user. A Pi older than
|
|
11486
11638
|
* `agent_settled` (0.80.4) never sends it, so a run's end waits a moment
|
|
11487
11639
|
* for one and reports itself when none comes. The extension posts its own
|
|
11488
|
-
* reports, as opencode's plugin does; `readHook` only unwraps them.
|
|
11640
|
+
* reports, as opencode's plugin does; `readHook` only unwraps them. It
|
|
11641
|
+
* also answers Pi's folder-trust question (`project_trust`, which only a
|
|
11642
|
+
* user's or a command-line extension is asked): a flag would do
|
|
11643
|
+
* (`--approve`), but a Pi from before the question exits on it. */
|
|
11489
11644
|
var EXTENSION = (host, appPort) => `// Generated by work. Reports this
|
|
11490
11645
|
// session's working / needs-input / done state to the app; edits are
|
|
11491
11646
|
// overwritten. Port and session id come from the env tmux gave the pane.
|
|
@@ -11544,6 +11699,10 @@ export default function (pi) {
|
|
|
11544
11699
|
if (ctx?.isIdle && !ctx.isIdle()) return;
|
|
11545
11700
|
return settle();
|
|
11546
11701
|
});
|
|
11702
|
+
// A workspace is the user's own folder, made to run agents in: trusted
|
|
11703
|
+
// for this run, never remembered. Left to ask, Pi opens on a menu that
|
|
11704
|
+
// takes a first prompt's paste, whose Enter then picks its answer.
|
|
11705
|
+
pi.on("project_trust", () => ({ trusted: "yes" }));
|
|
11547
11706
|
pi.on("ui_prompt_start", (event) =>
|
|
11548
11707
|
post("waiting", "attention", event?.title || "Waiting for input"),
|
|
11549
11708
|
);
|
|
@@ -11592,6 +11751,7 @@ var AGENTS = [
|
|
|
11592
11751
|
launchFlags: () => ["-e", extensionFile()],
|
|
11593
11752
|
reportsWorking: installed,
|
|
11594
11753
|
steerKeys: ["Enter"],
|
|
11754
|
+
submitsBehindPaste: true,
|
|
11595
11755
|
interruptKeys: ["Escape"],
|
|
11596
11756
|
headless: (args) => hasArg(args, "-p", "--print", "--mode"),
|
|
11597
11757
|
envPrefixes: ["PI_"],
|
|
@@ -11654,6 +11814,14 @@ function interruptKeys(id) {
|
|
|
11654
11814
|
function promptAsArgv(id) {
|
|
11655
11815
|
return agentFor(id)?.promptAsArgv ?? false;
|
|
11656
11816
|
}
|
|
11817
|
+
/** The keys that send a paste may go with it (`submitsBehindPaste`). */
|
|
11818
|
+
function submitsBehindPaste(id) {
|
|
11819
|
+
return agentFor(id)?.submitsBehindPaste ?? false;
|
|
11820
|
+
}
|
|
11821
|
+
/** A message's head is typed ahead of its paste (`quotesPastes`). */
|
|
11822
|
+
function quotesPastes(id) {
|
|
11823
|
+
return agentFor(id)?.quotesPastes ?? false;
|
|
11824
|
+
}
|
|
11657
11825
|
/** Whether an instance's CLI, run with these arguments, is a one-shot
|
|
11658
11826
|
* job rather than a session (`headless`). */
|
|
11659
11827
|
function runsHeadless(id, args) {
|
|
@@ -17423,79 +17591,159 @@ function renameSession(id, title) {
|
|
|
17423
17591
|
}
|
|
17424
17592
|
/** Close a session, and with it every session it started and theirs
|
|
17425
17593
|
* (`parent_id`), unless `keepChildren`: those then stand on their own.
|
|
17426
|
-
*
|
|
17427
|
-
|
|
17594
|
+
* Each that can be resumed is kept as it was (`keepClosed`): the session
|
|
17595
|
+
* itself as `how` says, the ones it started as closed with it, so a lead
|
|
17596
|
+
* the user closes, or one whose account ran out, does not take its
|
|
17597
|
+
* team's conversations with it. Returns the ids closed. */
|
|
17598
|
+
async function killSession(id, keepChildren = false, how = "closed") {
|
|
17428
17599
|
const session = getSession(id);
|
|
17429
17600
|
if (!session) return [];
|
|
17430
17601
|
const family = keepChildren ? [id] : [id, ...descendantsOf(id)];
|
|
17431
|
-
|
|
17602
|
+
db.prepare(`DELETE FROM closed_sessions WHERE closed_at < strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '${REOPEN_WITHIN}')`).run();
|
|
17603
|
+
for (const member of family) {
|
|
17604
|
+
keepClosed(member, member === id ? how : "closed");
|
|
17605
|
+
await disposeSession(member);
|
|
17606
|
+
}
|
|
17432
17607
|
notifySessionsChanged(session.workspace_id);
|
|
17433
17608
|
return family;
|
|
17434
17609
|
}
|
|
17435
|
-
/** How long a
|
|
17436
|
-
*
|
|
17610
|
+
/** How long a closed session can be started again: a lead's follow-ups
|
|
17611
|
+
* come as the user reviews its result, the same day or so. */
|
|
17437
17612
|
var REOPEN_WITHIN = "-7 days";
|
|
17438
17613
|
/** A turn's end reported the conversation it ran in. */
|
|
17439
17614
|
function noteConversation(id, conversation) {
|
|
17440
17615
|
db.prepare("UPDATE sessions SET conversation = ? WHERE id = ? AND conversation IS NOT ?").run(conversation, id, conversation);
|
|
17441
17616
|
}
|
|
17442
|
-
/** A
|
|
17617
|
+
/** A closed session that can still be started again (`reopenSession`). */
|
|
17443
17618
|
function closedSession(id) {
|
|
17444
17619
|
return get(`SELECT * FROM closed_sessions WHERE id = ?
|
|
17445
17620
|
AND closed_at >= strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '${REOPEN_WITHIN}')`, id);
|
|
17446
17621
|
}
|
|
17447
|
-
/** Whether a
|
|
17448
|
-
*
|
|
17622
|
+
/** Whether a session can be started again on its conversation: its CLI
|
|
17623
|
+
* can resume one, and said which it was in. */
|
|
17449
17624
|
function reopenable(s) {
|
|
17450
17625
|
return !!s.conversation && canResume(s.agent);
|
|
17451
17626
|
}
|
|
17627
|
+
/** Keep `id` as it is in closed_sessions, about to close. One closed for
|
|
17628
|
+
* being done is kept whatever it is, so a message to it can say why it
|
|
17629
|
+
* does not reopen; any other only if it can be started again. */
|
|
17630
|
+
function keepClosed(id, how) {
|
|
17631
|
+
const s = getSession(id);
|
|
17632
|
+
if (!s?.workspace_id || how === "closed" && !reopenable(s)) return;
|
|
17633
|
+
db.prepare(`INSERT OR REPLACE INTO closed_sessions (id, workspace_id, agent, title, parent_id, launch_dir, launch_mode, summary, conversation, created_at, how)
|
|
17634
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(s.id, s.workspace_id, s.agent, s.title, s.parent_id, s.launch_dir, s.launch_mode, s.summary, s.conversation, s.created_at, how);
|
|
17635
|
+
}
|
|
17452
17636
|
/** Close a session work is done with (server/team), keeping what starts
|
|
17453
17637
|
* it again on its own conversation (`reopenSession`): the lead that
|
|
17454
17638
|
* started it may yet follow up, once the user has read its result. The
|
|
17455
17639
|
* sessions it started go with it, as with any close. */
|
|
17456
|
-
|
|
17457
|
-
|
|
17458
|
-
|
|
17459
|
-
|
|
17460
|
-
|
|
17461
|
-
|
|
17462
|
-
|
|
17463
|
-
|
|
17464
|
-
|
|
17465
|
-
|
|
17466
|
-
|
|
17467
|
-
|
|
17468
|
-
|
|
17469
|
-
*
|
|
17470
|
-
* is
|
|
17471
|
-
|
|
17640
|
+
function retireSession(id) {
|
|
17641
|
+
return killSession(id, false, "done");
|
|
17642
|
+
}
|
|
17643
|
+
var START_AGAIN = `start a new session (\`work session new\`) and brief it; \`--keep\` keeps one open for follow-ups`;
|
|
17644
|
+
/** The instance a session starts again as: its own, or `agent`, another
|
|
17645
|
+
* instance of the same CLI (claude2 for claude: another account), whose
|
|
17646
|
+
* resume takes the same conversation where that is shared. */
|
|
17647
|
+
function resumeAs(id, current, agent) {
|
|
17648
|
+
if (!agent || agent === current) return current;
|
|
17649
|
+
if (!isKnownAgent(agent) || agentFamily(agent) !== agentFamily(current)) throw httpError(409, `${id} ran ${agentLabel(current)}: it resumes only on another instance of the same CLI (\`work agent\` lists them), not ${agent}`);
|
|
17650
|
+
return agent;
|
|
17651
|
+
}
|
|
17652
|
+
/** Start a closed session again on the conversation it had: its row as it
|
|
17653
|
+
* was, as `agent` if given (`resumeAs`), under the session that started
|
|
17654
|
+
* it while that is here, else under `adopt` (the session reopening it, of
|
|
17655
|
+
* the same workspace), and its CLI on that conversation (`resumeFlags`),
|
|
17656
|
+
* ready for a message before this returns. Refuses, saying what to do
|
|
17657
|
+
* instead, one that cannot be: its CLI cannot resume, work never learned
|
|
17658
|
+
* its conversation, or the folder it ran in (a topic's worktree) is gone
|
|
17659
|
+
* — a conversation is its folder's to Claude. */
|
|
17660
|
+
async function reopenSession(id, opts = {}) {
|
|
17472
17661
|
const closed = closedSession(id);
|
|
17473
17662
|
if (!closed) throw httpError(404, `no session ${id}`);
|
|
17474
|
-
|
|
17475
|
-
|
|
17663
|
+
if (!reopenable(closed)) throw httpError(409, `${id} closed once it was done with, and ${canResume(closed.agent) ? "work never learned its conversation" : `${agentLabel(closed.agent)} cannot be reopened on its conversation`}: ${START_AGAIN}`);
|
|
17664
|
+
const agent = resumeAs(id, closed.agent, opts.agent);
|
|
17476
17665
|
const ws = get("SELECT path, status FROM workspaces WHERE id = ?", closed.workspace_id);
|
|
17477
17666
|
if (!ws || ws.status !== "active") throw httpError(409, `${id}'s workspace is archived`);
|
|
17478
|
-
if (closed.launch_dir && launchDir(closed, ws.path) === ws.path) throw httpError(409, `${id} ran in ${closed.launch_dir}, which is gone, and its conversation with it: ${
|
|
17479
|
-
const parent = closed.parent_id ? getSession(
|
|
17667
|
+
if (closed.launch_dir && launchDir(closed, ws.path) === ws.path) throw httpError(409, `${id} ran in ${closed.launch_dir}, which is gone, and its conversation with it: ${START_AGAIN}`);
|
|
17668
|
+
const parent = [closed.parent_id, opts.adopt].map((p) => p && p !== id ? getSession(p) : void 0).find((p) => p?.workspace_id === closed.workspace_id);
|
|
17480
17669
|
db.prepare(`INSERT INTO sessions (id, workspace_id, agent, title, created_at, parent_id, launch_dir, launch_mode, summary, conversation)
|
|
17481
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(closed.id, closed.workspace_id,
|
|
17670
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(closed.id, closed.workspace_id, agent, closed.title, closed.created_at, parent?.id ?? null, closed.launch_dir, closed.launch_mode, closed.summary, closed.conversation);
|
|
17482
17671
|
const session = getSession(id);
|
|
17483
17672
|
const env = cleanEnv();
|
|
17484
17673
|
await ensureTmuxServer();
|
|
17485
17674
|
clearAgentPhase(id);
|
|
17486
17675
|
await launchDetached(session, ws.path, env, { resume: closed.conversation });
|
|
17487
|
-
if (!await
|
|
17488
|
-
|
|
17489
|
-
"
|
|
17490
|
-
tmuxName(id)
|
|
17491
|
-
], env).then(() => true, () => false)) {
|
|
17492
|
-
await killSession(id);
|
|
17493
|
-
throw httpError(409, `${id}'s ${agentLabel(closed.agent)} could not reopen its conversation (${closed.conversation}): ${instead}`);
|
|
17676
|
+
if (!await paneAlive(id, env)) {
|
|
17677
|
+
await disposeSession(id);
|
|
17678
|
+
throw httpError(409, `${id}'s ${agentLabel(agent)} could not reopen its conversation (${closed.conversation})${agent === closed.agent ? "" : `: ${agent} may keep its conversations apart from ${closed.agent}'s`}. ${START_AGAIN.replace(/^./, (c) => c.toUpperCase())}`);
|
|
17494
17679
|
}
|
|
17495
17680
|
db.prepare("DELETE FROM closed_sessions WHERE id = ?").run(id);
|
|
17496
17681
|
notifySessionsChanged(closed.workspace_id);
|
|
17497
17682
|
return session;
|
|
17498
17683
|
}
|
|
17684
|
+
/** Start a running session's CLI again on its own conversation, as
|
|
17685
|
+
* `agent` if given (`resumeAs`): one stuck at its prompt because its
|
|
17686
|
+
* account hit a limit goes on as another account's. Its row, what is
|
|
17687
|
+
* queued for it and what it owes stay (server/messages keeps them). */
|
|
17688
|
+
async function restartSession(id, agent) {
|
|
17689
|
+
const s = getSession(id);
|
|
17690
|
+
if (!s) throw httpError(404, `no session ${id}`);
|
|
17691
|
+
if (!reopenable(s)) throw httpError(409, `${id} cannot start again on its conversation: ${canResume(s.agent) ? "work has not learned it yet (it comes with the first prompt's hook)" : `${agentLabel(s.agent)} cannot resume one`}`);
|
|
17692
|
+
const next = resumeAs(id, s.agent, agent);
|
|
17693
|
+
const wsPath = workspacePath(s.workspace_id);
|
|
17694
|
+
if (!wsPath) throw httpError(409, `${id}'s workspace is gone`);
|
|
17695
|
+
if (s.launch_dir && launchDir(s, wsPath) === wsPath) throw httpError(409, `${id} ran in ${s.launch_dir}, which is gone, and its conversation with it: ${START_AGAIN}`);
|
|
17696
|
+
const env = cleanEnv();
|
|
17697
|
+
await tmux([
|
|
17698
|
+
"kill-session",
|
|
17699
|
+
"-t",
|
|
17700
|
+
tmuxName(id)
|
|
17701
|
+
], env).catch(() => {});
|
|
17702
|
+
forgetPanes();
|
|
17703
|
+
clearTmuxStarted(id);
|
|
17704
|
+
clearAgentPhase(id);
|
|
17705
|
+
db.prepare("UPDATE sessions SET agent = ? WHERE id = ?").run(next, id);
|
|
17706
|
+
const session = getSession(id);
|
|
17707
|
+
await ensureTmuxServer();
|
|
17708
|
+
await launchDetached(session, wsPath, env, { resume: s.conversation });
|
|
17709
|
+
if (!await paneAlive(id, env)) {
|
|
17710
|
+
db.prepare("UPDATE sessions SET agent = ? WHERE id = ?").run(s.agent, id);
|
|
17711
|
+
notifySessionsChanged(s.workspace_id);
|
|
17712
|
+
throw httpError(409, `${id}'s ${agentLabel(next)} could not resume its conversation (${s.conversation})${next === s.agent ? "" : `: ${next} may keep its conversations apart from ${s.agent}'s`}, and its pane has closed: \`work session reopen ${id}\` tries again`);
|
|
17713
|
+
}
|
|
17714
|
+
notifySessionsChanged(s.workspace_id);
|
|
17715
|
+
return session;
|
|
17716
|
+
}
|
|
17717
|
+
/** What a session is, open or closed (`work session list <id>`, `log`):
|
|
17718
|
+
* undefined for one work does not know, or no longer keeps. */
|
|
17719
|
+
function sessionInfo(id) {
|
|
17720
|
+
const live = getSession(id);
|
|
17721
|
+
const closed = live ? void 0 : closedSession(id);
|
|
17722
|
+
const s = live ?? closed;
|
|
17723
|
+
if (!s) return;
|
|
17724
|
+
return {
|
|
17725
|
+
id: s.id,
|
|
17726
|
+
agent: s.agent,
|
|
17727
|
+
title: s.title,
|
|
17728
|
+
workspace: s.workspace_id,
|
|
17729
|
+
parent: s.parent_id,
|
|
17730
|
+
summary: s.summary,
|
|
17731
|
+
/** How and when it closed; null while open. */
|
|
17732
|
+
closed: closed ? {
|
|
17733
|
+
how: closed.how,
|
|
17734
|
+
at: closed.closed_at
|
|
17735
|
+
} : null,
|
|
17736
|
+
/** It can start again on its conversation (`work session reopen`). */
|
|
17737
|
+
reopenable: reopenable(s)
|
|
17738
|
+
};
|
|
17739
|
+
}
|
|
17740
|
+
function paneAlive(id, env) {
|
|
17741
|
+
return tmux([
|
|
17742
|
+
"has-session",
|
|
17743
|
+
"-t",
|
|
17744
|
+
tmuxName(id)
|
|
17745
|
+
], env).then(() => true, () => false);
|
|
17746
|
+
}
|
|
17499
17747
|
/** Every session `id` started, and theirs, nearest first. */
|
|
17500
17748
|
function descendantsOf(id) {
|
|
17501
17749
|
return all(`WITH RECURSIVE kids(id, depth) AS (
|
|
@@ -17591,7 +17839,7 @@ function notifySessionsChanged(workspaceId) {
|
|
|
17591
17839
|
async function emitSessionsChanged(workspaceId) {
|
|
17592
17840
|
try {
|
|
17593
17841
|
const states = await sessionStates();
|
|
17594
|
-
const { teamsOf } = await import("./
|
|
17842
|
+
const { teamsOf } = await import("./_hjIYs3Gy.js");
|
|
17595
17843
|
publish("sessions.changed", {
|
|
17596
17844
|
workspaceId,
|
|
17597
17845
|
sessions: listSessions(workspaceId).map((s) => ({
|
|
@@ -17613,7 +17861,37 @@ async function killWorkspaceSessions(workspaceId) {
|
|
|
17613
17861
|
* that passes one through, typing the rest into the pane as keys. */
|
|
17614
17862
|
var PASTE_UNSAFE = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g;
|
|
17615
17863
|
/** Type text into a session's tmux (bracketed paste + Enter), creating it if needed. */
|
|
17616
|
-
async function sendToSession(
|
|
17864
|
+
async function sendToSession(...args) {
|
|
17865
|
+
const { sent } = await pasteToSession(...args);
|
|
17866
|
+
await sent;
|
|
17867
|
+
}
|
|
17868
|
+
/** Each session's send under way. One at a time: a paste landing ahead of
|
|
17869
|
+
* the last one's keys joins its prompt, and its own keys then press Enter
|
|
17870
|
+
* on whatever that prompt set off. */
|
|
17871
|
+
var sendTail = /* @__PURE__ */ new Map();
|
|
17872
|
+
/** `sendToSession` for a caller that waits only for the text to be in the
|
|
17873
|
+
* pane: `sent` settles once the keys that send it have followed, which
|
|
17874
|
+
* for most CLIs waits out the paste being drawn (`pressSubmit`). */
|
|
17875
|
+
async function pasteToSession(id, raw, size, submit = ["Enter"], lead) {
|
|
17876
|
+
const last = sendTail.get(id);
|
|
17877
|
+
let free = () => {};
|
|
17878
|
+
const mine = new Promise((resolve) => free = resolve);
|
|
17879
|
+
sendTail.set(id, mine);
|
|
17880
|
+
await last;
|
|
17881
|
+
const end = () => {
|
|
17882
|
+
if (sendTail.get(id) === mine) sendTail.delete(id);
|
|
17883
|
+
free();
|
|
17884
|
+
};
|
|
17885
|
+
try {
|
|
17886
|
+
const { sent } = await pasteNow(id, raw, size, submit, lead);
|
|
17887
|
+
return { sent: sent.finally(end) };
|
|
17888
|
+
} catch (err) {
|
|
17889
|
+
end();
|
|
17890
|
+
throw err;
|
|
17891
|
+
}
|
|
17892
|
+
}
|
|
17893
|
+
async function pasteNow(id, raw, size, submit, lead) {
|
|
17894
|
+
const typed = lead?.replace(PASTE_UNSAFE, "").replace(/\s*[\r\n]+\s*/g, " ").trim().replace(/;$/, "; ");
|
|
17617
17895
|
const text = raw.replace(PASTE_UNSAFE, "");
|
|
17618
17896
|
const session = getSession(id);
|
|
17619
17897
|
if (!session) throw new Error("unknown session");
|
|
@@ -17630,8 +17908,9 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
|
|
|
17630
17908
|
await ensureTmuxServer();
|
|
17631
17909
|
clearAgentPhase(id);
|
|
17632
17910
|
if (promptAsArgv(session.agent)) {
|
|
17911
|
+
const prompt = typed ? `${typed}\n\n${text}` : text;
|
|
17633
17912
|
const file = path.join(os.tmpdir(), `work-prompt-${id}-${Math.random().toString(36).slice(2, 10)}`);
|
|
17634
|
-
fs.writeFileSync(file,
|
|
17913
|
+
fs.writeFileSync(file, prompt, {
|
|
17635
17914
|
mode: 384,
|
|
17636
17915
|
flag: "wx"
|
|
17637
17916
|
});
|
|
@@ -17639,7 +17918,7 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
|
|
|
17639
17918
|
await tmux(newSessionArgs(session, wsPath, "-d", {
|
|
17640
17919
|
prompt: {
|
|
17641
17920
|
file,
|
|
17642
|
-
text
|
|
17921
|
+
text: prompt
|
|
17643
17922
|
},
|
|
17644
17923
|
size
|
|
17645
17924
|
}), env);
|
|
@@ -17648,7 +17927,7 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
|
|
|
17648
17927
|
throw err;
|
|
17649
17928
|
}
|
|
17650
17929
|
markTmuxStarted(id);
|
|
17651
|
-
return;
|
|
17930
|
+
return { sent: Promise.resolve() };
|
|
17652
17931
|
}
|
|
17653
17932
|
await launchDetached(session, wsPath, env, { size });
|
|
17654
17933
|
}
|
|
@@ -17663,13 +17942,7 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
|
|
|
17663
17942
|
if (asking) throw httpError(409, `${asking}: answer it in the terminal, then send again`);
|
|
17664
17943
|
}
|
|
17665
17944
|
const buffer = `work-send-${Math.random().toString(36).slice(2, 8)}`;
|
|
17666
|
-
|
|
17667
|
-
"load-buffer",
|
|
17668
|
-
"-b",
|
|
17669
|
-
buffer,
|
|
17670
|
-
"-"
|
|
17671
|
-
], env, { stdin: text });
|
|
17672
|
-
await tmux([
|
|
17945
|
+
const pasted = [
|
|
17673
17946
|
"paste-buffer",
|
|
17674
17947
|
"-p",
|
|
17675
17948
|
"-d",
|
|
@@ -17677,9 +17950,42 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
|
|
|
17677
17950
|
buffer,
|
|
17678
17951
|
"-t",
|
|
17679
17952
|
name
|
|
17680
|
-
]
|
|
17681
|
-
|
|
17953
|
+
];
|
|
17954
|
+
const keys = typed ? [
|
|
17955
|
+
"send-keys",
|
|
17956
|
+
"-t",
|
|
17957
|
+
name,
|
|
17958
|
+
"-l",
|
|
17959
|
+
typed
|
|
17960
|
+
] : [];
|
|
17961
|
+
if (text || !typed) await tmux([
|
|
17962
|
+
"load-buffer",
|
|
17963
|
+
"-b",
|
|
17964
|
+
buffer,
|
|
17965
|
+
"-"
|
|
17966
|
+
], env, { stdin: text });
|
|
17967
|
+
const paste = !typed ? pasted : text ? [
|
|
17968
|
+
...keys,
|
|
17969
|
+
";",
|
|
17970
|
+
...pasted
|
|
17971
|
+
] : keys;
|
|
17972
|
+
const behind = submitsBehindPaste(session.agent) && submit.length ? 1 : 0;
|
|
17973
|
+
await tmux(behind ? [
|
|
17974
|
+
...paste,
|
|
17975
|
+
";",
|
|
17976
|
+
"send-keys",
|
|
17977
|
+
"-t",
|
|
17978
|
+
name,
|
|
17979
|
+
submit[0]
|
|
17980
|
+
] : paste, env);
|
|
17981
|
+
return { sent: pressSubmit(name, env, submit, behind) };
|
|
17982
|
+
}
|
|
17983
|
+
/** The keys that send what was just pasted into `name`, past the
|
|
17984
|
+
* `pressed` that went with the paste. */
|
|
17985
|
+
async function pressSubmit(name, env, submit, pressed) {
|
|
17986
|
+
if (!pressed) await waitStill(name, env, PASTE_SETTLE_MS);
|
|
17682
17987
|
for (const [i, key] of submit.entries()) {
|
|
17988
|
+
if (i < pressed) continue;
|
|
17683
17989
|
if (i) await sleep(KEY_GAP_MS);
|
|
17684
17990
|
await tmux([
|
|
17685
17991
|
"send-keys",
|
|
@@ -19247,13 +19553,19 @@ ${repoLines}
|
|
|
19247
19553
|
every result since they last wrote, not just the newest, and what is
|
|
19248
19554
|
still due. A message waits for the turn under way to end,
|
|
19249
19555
|
which can take hours: a correction or a stop goes with \`--now\` (into
|
|
19250
|
-
that turn, at its next step) or \`--interrupt\` (stops it first)
|
|
19556
|
+
that turn, at its next step) or \`--interrupt\` (stops it first), as
|
|
19557
|
+
one with \`--no-reply\` does by itself; one already queued goes so with
|
|
19558
|
+
\`send <id> --now\` and no text, never sent twice. \`work session fanout --agent <id>… --prompt "<task {}>" <item>…\`
|
|
19251
19559
|
starts a group, a few at a time, whose replies come back as one prompt
|
|
19252
19560
|
(\`work session team\` shows how far they are). \`--topic <name>\` gives each a
|
|
19253
19561
|
topic branch of its own; send paths, not pasted files. They close once
|
|
19254
19562
|
answered and done with, as each reply says (\`--keep\`, or
|
|
19255
19563
|
\`work session keep <id>\` later, keeps one), and a message to a closed
|
|
19256
|
-
Claude or Codex one reopens it on its own conversation
|
|
19564
|
+
Claude or Codex one reopens it on its own conversation; one closed
|
|
19565
|
+
otherwise (with its lead, by the user), or stuck on its account's limit,
|
|
19566
|
+
\`work session reopen <id> [--agent <another instance>]\` starts again
|
|
19567
|
+
on it, and \`work session log [<id>]\` shows what went to and from
|
|
19568
|
+
one and how each message went. For a quick
|
|
19257
19569
|
sweep in your own CLI, its own subagents are cheaper. All of this is
|
|
19258
19570
|
this workspace's only; an agent in another can be messaged when the user
|
|
19259
19571
|
asks, and only while it runs (\`work workspaces\` lists them, \`work session list <workspace>\`
|
|
@@ -19271,4 +19583,4 @@ ${repoLines}
|
|
|
19271
19583
|
`;
|
|
19272
19584
|
}
|
|
19273
19585
|
//#endregion
|
|
19274
|
-
export {
|
|
19586
|
+
export { renameSession as $, agentMeta as $n, toolById as $r, sectionFor as $t, closedSession as A, notePermissionMode as An, deleteSetting as Ar, serverList as At, killWorkspaceSessions as B, setAgentPhase as Bn, doctor as Br, runStreaming as Bt, workspaceBranches as C, hookPhase as Cn, removeHost as Cr, forgetCustomServer as Ct, beginCreation as D, noteActivity$1 as Dn, agentChoices as Dr, lspEnabled as Dt, agentCaller as E, lastTypedAt as En, WORKSPACE_PREFS as Er, installServer as Et, ensureTmuxServer as F, onFinished as Fn, preferredAgent as Fr, installMise as Ft, markTmuxStarted as G, summaryOf as Gn, bornOut as Gr, reviewWaiting as Gt, listPanes as H, setScrapedPhase as Hn, miseInstalls as Hr, fileChanges as Ht, forgetPanes as I, onPhaseChange as In, setDisabledAgents as Ir, installTool as It, notifySessionsChanged as J, turnSince as Jn, TOOLS as Jr, setPoints as Jt, newSessionArgs as K, turnPhase as Kn, firewallProbe as Kr, workspaceDiff as Kt, getSession as L, onTurnEnd as Ln, setPref as Lr, logoutGithub as Lt, creationOf as M, noteTyped as Mn, enabledAgents as Mr, whileInstalling as Mt, descendantsOf as N, noteUserAnswered as Nn, getSetting as Nr, authGithub as Nt, cleanEnv as O, noteBackground as On, allPrefs as Or, removeServer as Ot, disposeSessions as P, notifyEventOn as Pn, isKnownAgent as Pr, installAgent as Pt, pasteToSession as Q, agentLabel as Qn, parseAgentId as Qr, markBranch as Qt, interruptSession as R, onTurnFailed as Rn, setSetting as Rr, refreshGithub as Rt, withProgressOp as S, clearAgentPhase as Sn, normalizeHost as Sr, allServers as St, hookToken as T, interruptedSinceReport as Tn, PREF_MAX as Tr, installKey as Tt, listPanesWithin as U, setSessionViewers as Un, miseVersions as Ur, readBlobAt as Ut, launchDir as V, setExpecting as Vn, ghKnownHosts as Vr, updateTool as Vt, listSessions as W, settleQuietWorking as Wn, which as Wr, readFileAt as Wt, ownWorkspaceOnly as X, agentFamily as Xn, agentLabel$1 as Xr, diffStamp as Xt, onSessionDispose as Y, agentBadge as Yn, agentById as Yr, startSnapSweep as Yt, panePids as Z, agentFromCommand as Zn, catalogPin as Zr, commentFolder as Zt, retryMaterialize as _, git as _i, cleanSummary as _n, addHost as _r, lspWarm as _t, ensureUntrackedCache as a, readBody as ai, workspacePrs as an, setInstance as ar, sessionInfo as at, sweepTrash as b, swr as bi, activityOf as bn, forgetToken as br, stopServers as bt, insertPendingWorkspace as c, subscribe as ci, interruptKeys as cn, saveSubscription as cr, tmuxWasStarted as ct, progress as d, db as di, reportsWorking as dn, headOid as dr, workspaceProcs as dt, applyPrefChange as ei, dismissPr as en, ACCENT_RE as er, reopenSession as et, progressSince as f, get as fi, steerKeys as fn, pendingSsoOrgs as fr, killServers as ft, resumePendingWorkspaces as g, TMUX_SOCKET as gi, writeCache as gn, DEFAULT_HOST as gr, lspUses as gt, removeRepo as h, ensureAllCacheConfig as hi, readCache as hn, repoDefaultBranch as hr, lspQueryOf as ht, deleteWorkspace as i, httpError as ii, withoutDismissed as in, normalizeAccent as ir, sendToSession as it, createSession as j, noteTurnFailed as jn, disabledAgents as jr, sharing as jt, clearTmuxStarted as k, noteInterrupt as kn, changePref as kr, serverById as kt, listWorkspaces as l, subscriberCount as li, quotesPastes as ln, sendPush as lr, killWorkspaceProc as lt, queueMaterialize as m, ownsBranchOf as mi, credentialStamp as mn, repoCatalog as mr, lspQuery as mt, barePath as n, FRAME_HEADERS as ni, notePushActivity as nn, iconSvg as nr, restartSession as nt, gcBares as o, publish as oi, noteActivity as on, deleteSubscription as or, sessionStates as ot, pruneLaneBranch as p, workspacePath as pi, blankRow as pn, repoBranches as pr, lspDiagnostics as pt, noteConversation as q, turnSettling as qn, PROJECT_TOOLS as qr, workspaceSections as qt, createWorkspace as r, checked as ri, refreshPrsBatch as rn, manifest as rr, retireSession as rt, getWorkspace as s, publishJson as si, AGENTS as sn, pushPublicKey as sr, tmuxName as st, addRepo as t, FRAME_ANCESTORS as ti, hotBatchMinMs as tn, getInstance as tr, reopenable as tt, otherWorkspaceBranches as u, all as ui, readHookPayload as un, validSubscription as ur, portsByWorkspace as ut, revParse as v, tmux as vi, inside as vn, configuredHosts as vr, runningServers as vt, ensureAllPushHooks as w, hookReportedAt as wn, unreachableRepos as wr, forgetProbes as wt, syncAgentsMd as x, withLock as xi, agentPhase as xn, isValidHost as xr, addCustomServer as xt, setWorkspaceStatus as y, config as yi, realInside as yn, ensureGitCredentials as yr, stopAllServers as yt, killSession as z, sessionWatched as zn, discoverAgents as zr, removeTool as zt };
|