termdock 1.4.295 → 1.4.296
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/dist/client/assets/App-BiLjlrk-.js +171 -0
- package/dist/client/assets/App-BiLjlrk-.js.br +0 -0
- package/dist/client/assets/App-BiLjlrk-.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-Dv5XRtRh.js → ChangeWalkthroughPanel-DXprT-7m.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-mq69dKyr.js → DagPlayground-DZcUunT5.js} +1 -1
- package/dist/client/assets/DagPlayground-DZcUunT5.js.br +0 -0
- package/dist/client/assets/DagPlayground-DZcUunT5.js.gz +0 -0
- package/dist/client/assets/{DiffLab-BqdHYGi5.js → DiffLab-Brv4DCTb.js} +1 -1
- package/dist/client/assets/DiffLab-Brv4DCTb.js.br +0 -0
- package/dist/client/assets/DiffLab-Brv4DCTb.js.gz +0 -0
- package/dist/client/assets/{DiffReview-BvzGxpuc.js → DiffReview-BuLu1qCi.js} +1 -1
- package/dist/client/assets/DiffReview-BuLu1qCi.js.br +0 -0
- package/dist/client/assets/DiffReview-BuLu1qCi.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-DrfddB7x.js → DiffReviewLab-DSGamuAD.js} +1 -1
- package/dist/client/assets/DiffReviewLab-DSGamuAD.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DSGamuAD.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-3bJV_A5s.js → DiffViewer-BUCYxg27.js} +1 -1
- package/dist/client/assets/DiffViewer-BUCYxg27.js.br +0 -0
- package/dist/client/assets/DiffViewer-BUCYxg27.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-CX7VtoJB.js → ModelPreview-Bnlo-oVE.js} +1 -1
- package/dist/client/assets/ModelPreview-Bnlo-oVE.js.br +0 -0
- package/dist/client/assets/ModelPreview-Bnlo-oVE.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-BK6vWNw3.js → RightSidebar-r_3Lk5Rp.js} +45 -45
- package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.br +0 -0
- package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-PJwhLTPH.js → abnfDiagram-VCTEODGH-K6Ppkrbt.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.gz +0 -0
- package/dist/client/assets/{app-C7pXMvSE.js → app-CATnTUZF.js} +8 -8
- package/dist/client/assets/app-CATnTUZF.js.br +0 -0
- package/dist/client/assets/app-CATnTUZF.js.gz +0 -0
- package/dist/client/assets/{arc-l3FXjCEl.js → arc-Co2OQqtH.js} +1 -1
- package/dist/client/assets/arc-Co2OQqtH.js.br +0 -0
- package/dist/client/assets/arc-Co2OQqtH.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DdNbKi-4.js → architectureDiagram-5GKGNRK7-BQnl7tVF.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-Cu63oaxR.js → blockDiagram-I7D4REHJ-Bm5D5-qq.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-DQiV_yk6.js → c4Diagram-7LVT6UL2-B9oPpey8.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.gz +0 -0
- package/dist/client/assets/channel-Czv2W4qA.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-COKJ79Ld.js → chunk-2Q5K7J3B-TMaWHH0U.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BfV-m7oa.js → chunk-5VM5RSS4-CH7XpknV.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-sLDCEnU8.js → chunk-F27PBJKO-CJ1rotBe.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-DYu5qS7g.js → chunk-IMKFNOWR-UYKZ5uOG.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-DixkILcl.js → chunk-JWPE2WC7-BYL8aXjQ.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CfW5Vm_-.js → chunk-POPQ4Y6H-C3E8yfU2.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-nJnbUFzs.js → chunk-SVP7TREG-DCTDYa1E.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-BwyiSQgx.js → chunk-TICWLB2K-wHiaOsBh.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-TCk4c2XN.js → chunk-XXDRQBXY-D_d479hK.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BdvOOL9k.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdvOOL9k.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-rroo-EOb.js → cose-bilkent-JH36ORCC-DnhlPBLr.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CkFeV85k.js → cynefin-OW5HDTMX-BsjzNqJZ.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-hBwpU_bW.js → cynefinDiagram-5FMLGOSQ-sVUb0zY5.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-B321-hdp.js → dagre-GXQ25YYZ-YErk8S-c.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-bY87_ptA.js → diagram-S7CK7UJ4-BaHbV5ho.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN--cez0H_o.js → diagram-UQ7AKVKN-BocCYx3V.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BupH_VRK.js → diagram-VSXAHHWV-ZMTYwWOQ.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DewqaxvF.js → diagram-VX7I27RA-xmk_EY1h.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-wDumcTuR.js → diagram-Z3DM3KII-DKDY_cG6.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-C0OY91We.js → ebnfDiagram-PWID7BFC-C_0z-Jx9.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Cw9aNqvJ.js → erDiagram-RLTQ6QDP-DHUaG7mt.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BC7XUXeI.js → flowDiagram-HODETNUW-BMNsdMBD.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DovhJIz5.js → ganttDiagram-EL5Y4UJY-BH1AiKuF.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-wjVok2Lg.js → gestureArbiter-DvupkPra.js} +1 -1
- package/dist/client/assets/gestureArbiter-DvupkPra.js.br +0 -0
- package/dist/client/assets/gestureArbiter-DvupkPra.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BmrbbyW1.js → gitGraphDiagram-WWUBYQGX-DAgV0MV-.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.gz +0 -0
- package/dist/client/assets/{index-BeD4iJ6L.css → index-Bi9A6QUP.css} +1 -1
- package/dist/client/assets/index-Bi9A6QUP.css.br +0 -0
- package/dist/client/assets/index-Bi9A6QUP.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CQEu4Jwy.js → infoDiagram-27XIBGKW-C7iSg0cB.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BPqibqsm.js → ishikawaDiagram-5VMMS53U-BpZwsQvw.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-DIkhubnf.js → journeyDiagram-3NMN7TZE-DXEeFLvw.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-CBT0DIUR.js → kanban-definition-UXKFOSKX-CV9ivL5u.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.gz +0 -0
- package/dist/client/assets/{layout-C1CMlOIU.js → layout-DsKKsJKX.js} +1 -1
- package/dist/client/assets/layout-DsKKsJKX.js.br +0 -0
- package/dist/client/assets/layout-DsKKsJKX.js.gz +0 -0
- package/dist/client/assets/{linear-C4gyqor0.js → linear-Dl9MDNV3.js} +1 -1
- package/dist/client/assets/linear-Dl9MDNV3.js.br +0 -0
- package/dist/client/assets/linear-Dl9MDNV3.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-CMfa4ncd.js → mermaid.core-CxZFe3as.js} +5 -5
- package/dist/client/assets/mermaid.core-CxZFe3as.js.br +0 -0
- package/dist/client/assets/mermaid.core-CxZFe3as.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-C-JmgKOI.js → mindmap-definition-YA3MSWOX-C3ormYdL.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-BmUG2IwA.js → passwordBootstrap-a8z6jJNY.js} +2 -2
- package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-IY-AEKQa.js → pegDiagram-XKGWAZYB-CG0wNylH.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-9Qq43qED.js → pieDiagram-E7YTZNPT-D2-ydqyX.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BjQncx5i.js → quadrantDiagram-AXDQQJYC-CK3fRC18.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-Cr1rL0wZ.js → railroadDiagram-O6MQD6OU-V4EFlydu.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-ConC5-ym.js → referenceLongPress-BjmYd1vB.js} +1 -1
- package/dist/client/assets/referenceLongPress-BjmYd1vB.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BjmYd1vB.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-DU2q_iZg.js → requirementDiagram-BXWQKSXE-Di1_tyAX.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-BYlx9kXC.js → sankeyDiagram-P5KCCOFB-D-qpWNza.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D_uAKme-.js → sequenceDiagram-WJ2MYXX4-DmIxafrB.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-H_uqscf4.js → sizeCapture-INFHLROL-4MTh3tTt.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.gz +0 -0
- package/dist/client/assets/{sparkles-D2z4Ue6G.js → sparkles-Dk93lHg0.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-BvsQjIIW.js → stateDiagram-D77RDMKH-CgYgneIv.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CvPf0fxf.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-LmUJag-p.js → swimlanes-42K2YHIH-OWA9HFVf.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CZ_OauyW.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-DZ5n0Pim.js → timeline-definition-24CTP7MA-BAzx5DyO.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-Ct6iIBmv.js → triangle-alert-CUIBOwqW.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-BkTA_Ciz.js → vennDiagram-4TSXK5OY-CBZ-PhTQ.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.gz +0 -0
- package/dist/client/assets/{videoCompression-VZIoFnyJ.js → videoCompression-BCnqCkRK.js} +1 -1
- package/dist/client/assets/videoCompression-BCnqCkRK.js.br +0 -0
- package/dist/client/assets/videoCompression-BCnqCkRK.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-7hzU176j.js → wardleyDiagram-VM6X3IG4-DbWzC6l5.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Bx4P96Bb.js → xychartDiagram-S5SC5T6Z-BmApnTWE.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/collaborationCli.js +45 -4
- package/dist/server/agent/collaborationDeliveryWorker.js +1 -1
- package/dist/server/agent/collaborationPeerTransport.js +8 -2
- package/dist/server/agent/collaborationRoutes.js +18 -2
- package/dist/server/agent/collaborationService.js +43 -1
- package/dist/server/agent/collaborationTaskBundles.js +121 -0
- package/dist/server/agent/collaborationTaskCli.js +54 -0
- package/dist/server/agent/collaborationTaskRoutes.js +58 -0
- package/dist/server/agent/collaborationTaskService.js +355 -0
- package/dist/server/agent/collaborationTaskStore.js +773 -0
- package/dist/server/agent/collaborationTaskTypes.js +1 -0
- package/dist/server/agent/collaborationTaskWorkspace.js +100 -0
- package/dist/server/entry.js +11 -1
- package/dist/server/federation/runtime.js +6 -1
- package/dist/server/routes/terminal.js +66 -2
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-D-cerXsD.js +0 -158
- package/dist/client/assets/App-D-cerXsD.js.br +0 -0
- package/dist/client/assets/App-D-cerXsD.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Dv5XRtRh.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Dv5XRtRh.js.gz +0 -0
- package/dist/client/assets/DagPlayground-mq69dKyr.js.br +0 -0
- package/dist/client/assets/DagPlayground-mq69dKyr.js.gz +0 -0
- package/dist/client/assets/DiffLab-BqdHYGi5.js.br +0 -0
- package/dist/client/assets/DiffLab-BqdHYGi5.js.gz +0 -0
- package/dist/client/assets/DiffReview-BvzGxpuc.js.br +0 -0
- package/dist/client/assets/DiffReview-BvzGxpuc.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-DrfddB7x.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DrfddB7x.js.gz +0 -0
- package/dist/client/assets/DiffViewer-3bJV_A5s.js.br +0 -0
- package/dist/client/assets/DiffViewer-3bJV_A5s.js.gz +0 -0
- package/dist/client/assets/ModelPreview-CX7VtoJB.js.br +0 -0
- package/dist/client/assets/ModelPreview-CX7VtoJB.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BK6vWNw3.js.br +0 -0
- package/dist/client/assets/RightSidebar-BK6vWNw3.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-PJwhLTPH.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-PJwhLTPH.js.gz +0 -0
- package/dist/client/assets/app-C7pXMvSE.js.br +0 -0
- package/dist/client/assets/app-C7pXMvSE.js.gz +0 -0
- package/dist/client/assets/arc-l3FXjCEl.js.br +0 -0
- package/dist/client/assets/arc-l3FXjCEl.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DdNbKi-4.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DdNbKi-4.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Cu63oaxR.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Cu63oaxR.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DQiV_yk6.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DQiV_yk6.js.gz +0 -0
- package/dist/client/assets/channel-CwC957gi.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-sLDCEnU8.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-sLDCEnU8.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DYu5qS7g.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DYu5qS7g.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-nJnbUFzs.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-nJnbUFzs.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BwyiSQgx.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BwyiSQgx.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-CmoJ7-rE.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CmoJ7-rE.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-rroo-EOb.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-rroo-EOb.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CkFeV85k.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CkFeV85k.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-hBwpU_bW.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-hBwpU_bW.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B321-hdp.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B321-hdp.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-bY87_ptA.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-bY87_ptA.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN--cez0H_o.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN--cez0H_o.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BupH_VRK.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BupH_VRK.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DewqaxvF.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DewqaxvF.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-wDumcTuR.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-wDumcTuR.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C0OY91We.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C0OY91We.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Cw9aNqvJ.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Cw9aNqvJ.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BC7XUXeI.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BC7XUXeI.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DovhJIz5.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DovhJIz5.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-wjVok2Lg.js.br +0 -0
- package/dist/client/assets/gestureArbiter-wjVok2Lg.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BmrbbyW1.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BmrbbyW1.js.gz +0 -0
- package/dist/client/assets/index-BeD4iJ6L.css.br +0 -0
- package/dist/client/assets/index-BeD4iJ6L.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPqibqsm.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BPqibqsm.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DIkhubnf.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DIkhubnf.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CBT0DIUR.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CBT0DIUR.js.gz +0 -0
- package/dist/client/assets/layout-C1CMlOIU.js.br +0 -0
- package/dist/client/assets/layout-C1CMlOIU.js.gz +0 -0
- package/dist/client/assets/linear-C4gyqor0.js.br +0 -0
- package/dist/client/assets/linear-C4gyqor0.js.gz +0 -0
- package/dist/client/assets/mermaid.core-CMfa4ncd.js.br +0 -0
- package/dist/client/assets/mermaid.core-CMfa4ncd.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C-JmgKOI.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C-JmgKOI.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-BmUG2IwA.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-BmUG2IwA.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-IY-AEKQa.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-IY-AEKQa.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-9Qq43qED.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-9Qq43qED.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BjQncx5i.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BjQncx5i.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Cr1rL0wZ.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Cr1rL0wZ.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-ConC5-ym.js.br +0 -0
- package/dist/client/assets/referenceLongPress-ConC5-ym.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DU2q_iZg.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DU2q_iZg.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYlx9kXC.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYlx9kXC.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D_uAKme-.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D_uAKme-.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-H_uqscf4.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-H_uqscf4.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BvsQjIIW.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BvsQjIIW.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DNgoExtD.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-LmUJag-p.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-LmUJag-p.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BRuArMR5.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-DZ5n0Pim.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DZ5n0Pim.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BkTA_Ciz.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BkTA_Ciz.js.gz +0 -0
- package/dist/client/assets/videoCompression-VZIoFnyJ.js.br +0 -0
- package/dist/client/assets/videoCompression-VZIoFnyJ.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-7hzU176j.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-7hzU176j.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Bx4P96Bb.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Bx4P96Bb.js.gz +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function taskMemberKey(member) { return `${member.serviceId}:${member.sessionId}`; }
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { mkdir, readFile, writeFile, rename, realpath } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
const exec = promisify(execFile);
|
|
7
|
+
const git = async (cwd, args) => (await exec('git', ['-C', cwd, ...args], {
|
|
8
|
+
timeout: 30_000, maxBuffer: 2 * 1024 * 1024,
|
|
9
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0', GIT_MERGE_AUTOEDIT: 'no' },
|
|
10
|
+
})).stdout.trim();
|
|
11
|
+
const home = path.join(os.homedir(), '.termdock', 'task-workspaces');
|
|
12
|
+
/** Only committed code enters task worktrees; the user's checkout is never reset, cleaned or merged. */
|
|
13
|
+
export async function prepareTaskWorkspace(task, sourceCwd, dependencies, importCommit) {
|
|
14
|
+
if (!/^[a-f0-9]{32}$/.test(task.id))
|
|
15
|
+
throw new Error('任务标识无效');
|
|
16
|
+
const generation = task.events.filter(e => e.kind === 'scheduled').at(-1)?.id;
|
|
17
|
+
if (!generation || !/^[a-f0-9]{32}$/.test(generation))
|
|
18
|
+
throw new Error('缺少执行目录准备记录');
|
|
19
|
+
const repository = await git(sourceCwd, ['rev-parse', '--show-toplevel']);
|
|
20
|
+
const rootId = task.workflow?.rootTaskId ?? task.id;
|
|
21
|
+
const goalDir = path.join(home, rootId);
|
|
22
|
+
await mkdir(goalDir, { recursive: true, mode: 0o700 });
|
|
23
|
+
// Pin a base per repository and goal. A moved user HEAD cannot change later tasks' starting point.
|
|
24
|
+
const { createHash } = await import('node:crypto');
|
|
25
|
+
const common = await realpath(path.resolve(repository, await git(repository, ['rev-parse', '--git-common-dir'])));
|
|
26
|
+
const baseFile = path.join(goalDir, `${createHash('sha256').update(common).digest('hex').slice(0, 16)}.base`);
|
|
27
|
+
let base;
|
|
28
|
+
try {
|
|
29
|
+
base = (await readFile(baseFile, 'utf8')).trim();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error.code !== 'ENOENT')
|
|
33
|
+
throw error;
|
|
34
|
+
base = await git(repository, ['rev-parse', 'HEAD']);
|
|
35
|
+
try {
|
|
36
|
+
await writeFile(baseFile, base, { flag: 'wx', mode: 0o600 });
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.code !== 'EEXIST')
|
|
40
|
+
throw error;
|
|
41
|
+
base = (await readFile(baseFile, 'utf8')).trim();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!/^[a-f0-9]{40,64}$/.test(base))
|
|
45
|
+
throw new Error('目标基线无效');
|
|
46
|
+
const cwd = path.join(goalDir, `${task.id}-${generation.slice(0, 8)}`);
|
|
47
|
+
const branch = `termdock/task/${task.id}-${generation.slice(0, 8)}`;
|
|
48
|
+
try {
|
|
49
|
+
await readFile(path.join(cwd, '.git'), 'utf8');
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error.code !== 'ENOENT')
|
|
53
|
+
throw error;
|
|
54
|
+
await git(repository, ['worktree', 'add', '-b', branch, cwd, base]);
|
|
55
|
+
}
|
|
56
|
+
if (await git(cwd, ['rev-parse', '--show-toplevel']) !== cwd || await git(cwd, ['branch', '--show-current']) !== branch)
|
|
57
|
+
throw new Error('独立目录与任务分支不匹配,保留现场等待处理');
|
|
58
|
+
const readyFile = path.join(goalDir, `${task.id}-${generation.slice(0, 8)}.ready`);
|
|
59
|
+
let ready = false;
|
|
60
|
+
try {
|
|
61
|
+
ready = (await readFile(readyFile, 'utf8')) === generation;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error.code !== 'ENOENT')
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
if (!ready) {
|
|
68
|
+
// A failed merge is deliberately left in this task's worktree for a member to resolve.
|
|
69
|
+
if (await git(cwd, ['status', '--porcelain']))
|
|
70
|
+
throw new Error(`依赖集成需要处理,现场保留在 ${cwd};请协调者安排解决冲突后继续`);
|
|
71
|
+
for (const dependency of dependencies) {
|
|
72
|
+
const artifact = dependency.artifacts.find(a => a.id === dependency.acceptedArtifactId);
|
|
73
|
+
const commit = artifact?.evidence?.commit;
|
|
74
|
+
if (!commit || !/^[a-f0-9]{40,64}$/.test(commit))
|
|
75
|
+
throw new Error(`依赖「${dependency.title}」缺少已评审提交,请补充交付`);
|
|
76
|
+
try {
|
|
77
|
+
await git(cwd, ['cat-file', '-e', `${commit}^{commit}`]);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
if (!importCommit)
|
|
81
|
+
throw new Error(`依赖「${dependency.title}」的提交在此仓库不可用,请协调者先同步提交`);
|
|
82
|
+
await importCommit(dependency, cwd);
|
|
83
|
+
await git(cwd, ['cat-file', '-e', `${commit}^{commit}`]);
|
|
84
|
+
}
|
|
85
|
+
await git(cwd, ['-c', 'user.name=Termdock', '-c', 'user.email=tasks@termdock.local', 'merge', '--no-edit', commit]);
|
|
86
|
+
}
|
|
87
|
+
const temp = `${readyFile}.${process.pid}.tmp`;
|
|
88
|
+
await writeFile(temp, generation, { mode: 0o600 });
|
|
89
|
+
await rename(temp, readyFile);
|
|
90
|
+
}
|
|
91
|
+
return { cwd, repository, branch, base };
|
|
92
|
+
}
|
|
93
|
+
export async function captureTaskCommit(workspace) {
|
|
94
|
+
if (!(await realpath(workspace.cwd)).startsWith(`${await realpath(home)}${path.sep}`) || await git(workspace.cwd, ['branch', '--show-current']) !== workspace.branch)
|
|
95
|
+
throw new Error('交付目录与任务分支不匹配');
|
|
96
|
+
if (await git(workspace.cwd, ['status', '--porcelain']))
|
|
97
|
+
throw new Error('独立目录还有未提交改动,请先提交再报告完成;不会自动暂存或提交');
|
|
98
|
+
const commit = await git(workspace.cwd, ['rev-parse', 'HEAD']);
|
|
99
|
+
return { commit, branch: workspace.branch, cwd: workspace.cwd, base: workspace.base };
|
|
100
|
+
}
|
package/dist/server/entry.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { CollaborationService } from './agent/collaborationService.js';
|
|
2
2
|
import { X509Certificate } from 'node:crypto';
|
|
3
3
|
import { CollaborationPeerTransport, connectCollaborationRpc } from './agent/collaborationPeerTransport.js';
|
|
4
|
-
import { collaborationStore, deliverPeerCollaboration, collaborationLocalActivity, collaborationDirectorySessions } from './routes/terminal.js';
|
|
4
|
+
import { collaborationStore, collaborationTaskStore, deliverPeerCollaboration, collaborationLocalActivity, collaborationDirectorySessions, prepareCollaborationTaskWorker } from './routes/terminal.js';
|
|
5
|
+
import { CollaborationTaskService } from './agent/collaborationTaskService.js';
|
|
5
6
|
import { setPushTargetPeerId } from './notifications/pushService.js';
|
|
6
7
|
import { desktopDirectTargets } from './federation/desktopTargets.js';
|
|
7
8
|
import { createOpenAccessRouter } from './federation/openAccess.js';
|
|
@@ -616,11 +617,20 @@ export function startServer(options = {}) {
|
|
|
616
617
|
collaborationService = new CollaborationService({ file: path.join(homedir(), '.termdock', 'federation', 'collaboration-services.json'),
|
|
617
618
|
store: collaborationStore, transport: collaborationTransport, node: () => app.locals.collaborationNode,
|
|
618
619
|
sessions: collaborationDirectorySessions, reverse: reverseCollaboration, connect: connectPeer,
|
|
620
|
+
tasks: {
|
|
621
|
+
receive: (peer, packet) => app.locals.collaborationTasks.receive(peer, packet),
|
|
622
|
+
heads: ids => app.locals.collaborationTasks?.heads(ids) ?? [],
|
|
623
|
+
sync: (peer, heads) => app.locals.collaborationTasks.sync(peer, heads),
|
|
624
|
+
},
|
|
619
625
|
deviceScope: device => runtime.store.listEffective({ subjectId: device, serviceId: runtime.serviceId })
|
|
620
626
|
.filter(grant => grant.scope.kind === 'sessions' && grant.actions.includes('session.input'))
|
|
621
627
|
.flatMap(grant => grant.scope.kind === 'sessions' ? grant.scope.sessionIds : []),
|
|
622
628
|
pairConnect: peer => connectCollaborationRpc(runtime.identity, peer) });
|
|
623
629
|
app.locals.collaborationService = collaborationService;
|
|
630
|
+
const collaborationTasks = new CollaborationTaskService(collaborationTaskStore, collaborationStore, collaborationService, deliverPeerCollaboration, (task, template, dependencies) => prepareCollaborationTaskWorker(task, template, dependencies, collaborationService, (taskId, dependencyId, offset) => collaborationTasks.dependencyChunk(taskId, dependencyId, offset)));
|
|
631
|
+
app.locals.collaborationTasks = collaborationTasks;
|
|
632
|
+
collaborationTasks.start();
|
|
633
|
+
server.once('close', () => collaborationTasks.close());
|
|
624
634
|
collaborationService.start();
|
|
625
635
|
server.once('close', () => collaborationService?.close());
|
|
626
636
|
collaborationTransport.start();
|
|
@@ -297,7 +297,12 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
297
297
|
else if (packet.type === 'collaboration-service') {
|
|
298
298
|
if (!options.collaborationService)
|
|
299
299
|
throw new Error('COLLABORATION_UPGRADE_REQUIRED');
|
|
300
|
-
|
|
300
|
+
// Task preparation may use the same channel for a directory request; do not block its reader.
|
|
301
|
+
void Promise.resolve(options.collaborationService(subjectId, packet)).then(result => send({ type: 'result', id: packet.id, ...result }))
|
|
302
|
+
.catch(error => { try {
|
|
303
|
+
send({ type: 'error', id: packet.id, error: error instanceof Error ? error.message : 'REQUEST_FAILED' });
|
|
304
|
+
}
|
|
305
|
+
catch { /* Connection closed. */ } });
|
|
301
306
|
}
|
|
302
307
|
else if (packet.type === 'collaboration-scoped-peer') {
|
|
303
308
|
if (!options.registerScopedCollaborationPeer)
|
|
@@ -69,10 +69,15 @@ import { TermdockAutoUpdateManager } from '../utils/autoUpdate.js';
|
|
|
69
69
|
import { AUTO_TITLE_LONG_RUNNING_DELAY_MS, AUTO_TITLE_MIN_CONTEXT_CHARS, cleanTerminalContext, generateAgentTitle, hasSubstantiveAutoTitleContext, isLongRunningAutoTitleTurnEligible, isNewAgentSessionId, isAutoTitleReevaluationDue, shouldReplaceAutoTitle, } from '../agent/autoTitle.js';
|
|
70
70
|
import { getTitleNamerCatalog, invalidateTitleNamerCatalog, probePluginTitleNamer } from '../agent/titleNamerCatalog.js';
|
|
71
71
|
import { RenderedTerminalContext } from '../agent/renderedTerminalContext.js';
|
|
72
|
+
import { CollaborationTaskStore } from '../agent/collaborationTaskStore.js';
|
|
73
|
+
import { collaborationTaskRoutes } from '../agent/collaborationTaskRoutes.js';
|
|
74
|
+
import { prepareTaskWorkspace } from '../agent/collaborationTaskWorkspace.js';
|
|
75
|
+
import { importTaskDependency } from '../agent/collaborationTaskBundles.js';
|
|
72
76
|
const router = express.Router();
|
|
73
77
|
const execFileAsync = promisify(execFile);
|
|
74
78
|
const TERMDOCK_DIR = `${os.homedir()}/.termdock`;
|
|
75
79
|
const automationStore = new AutomationStore(`${TERMDOCK_DIR}/automations.json`);
|
|
80
|
+
export const collaborationTaskStore = new CollaborationTaskStore(`${TERMDOCK_DIR}/collaboration-tasks.json`);
|
|
76
81
|
export const collaborationStore = new CollaborationStore(`${TERMDOCK_DIR}/collaboration-groups.json`);
|
|
77
82
|
const collaborationRouting = new CollaborationRoutingStore(`${TERMDOCK_DIR}/collaboration-routing.json`);
|
|
78
83
|
const collaborationDeliveryWorker = new CollaborationDeliveryWorker({
|
|
@@ -1387,10 +1392,13 @@ function orchestrationSessionSnapshot(record) {
|
|
|
1387
1392
|
const backendId = binding?.backendSessionId ?? record.backendSessionId;
|
|
1388
1393
|
const backend = backendId ? terminalSessions.get(backendId) : null;
|
|
1389
1394
|
const route = collaborationDeliveryWorker.state(record.sessionId);
|
|
1395
|
+
// A live terminal backend is observable even before the delivery worker has
|
|
1396
|
+
// inspected this session. It does not prove a pinned Agent target is writable.
|
|
1397
|
+
const terminalConnected = Boolean(backend);
|
|
1390
1398
|
const slug = binding?.pane?.agentSlug ?? binding?.agentSlug ?? record.agentResume?.slug;
|
|
1391
1399
|
const agent = slug ? agentBySlug(slug) : backend?.agent;
|
|
1392
1400
|
return {
|
|
1393
|
-
...collaborationStore.sessionFacts(record.sessionId, route.state === 'ready'),
|
|
1401
|
+
...collaborationStore.sessionFacts(record.sessionId, terminalConnected || route.state === 'ready' || route.state === 'shell'),
|
|
1394
1402
|
last_terminal_output_at: backend?.lastOutputAt || null,
|
|
1395
1403
|
activity_observed_at: backend ? Date.now() : null,
|
|
1396
1404
|
activity_source: backend ? 'terminal_output' : 'unavailable',
|
|
@@ -1404,7 +1412,7 @@ function orchestrationSessionSnapshot(record) {
|
|
|
1404
1412
|
name: record.name,
|
|
1405
1413
|
cwd: backend?.cwd ?? record.cwd ?? '',
|
|
1406
1414
|
agent: agent ? { slug: agent.slug, displayName: agent.displayName } : null,
|
|
1407
|
-
status: route.state,
|
|
1415
|
+
status: route.state === 'unchecked' && terminalConnected ? 'terminal-connected' : route.state,
|
|
1408
1416
|
capability: agent
|
|
1409
1417
|
? [agent.displayName, ...(agent.capabilities ?? []), backend?.activeProgram?.command || record.activeProgram || 'Agent 会话'].join(' · ')
|
|
1410
1418
|
: (backend?.activeProgram?.command || record.activeProgram || 'Shell 终端'),
|
|
@@ -1779,6 +1787,60 @@ async function spawnCollaborationAgentSession(req, group, sourceSessionId, input
|
|
|
1779
1787
|
}, 300).unref?.();
|
|
1780
1788
|
return { group: updatedGroup, session: orchestrationSessionSnapshot(globalSessionState.sessions.find((candidate) => candidate.sessionId === frontendSessionId)) };
|
|
1781
1789
|
}
|
|
1790
|
+
const preparingTaskWorkers = new Map();
|
|
1791
|
+
/** Dedicated persistent terminals leave existing member sessions and the user's checkout untouched. */
|
|
1792
|
+
export function prepareCollaborationTaskWorker(task, template, dependencies, service, readDependency) {
|
|
1793
|
+
const key = `${task.id}:${task.events.filter(e => e.kind === 'scheduled').at(-1)?.id}`;
|
|
1794
|
+
const pending = preparingTaskWorkers.get(key);
|
|
1795
|
+
if (pending)
|
|
1796
|
+
return pending;
|
|
1797
|
+
const operation = (async () => {
|
|
1798
|
+
const source = globalSessionState.sessions.find(s => s.sessionId === template.sessionId);
|
|
1799
|
+
if (!source || template.serviceId !== service.descriptor().serviceId)
|
|
1800
|
+
throw new Error('执行成员当前不可用,请协调者重新分派');
|
|
1801
|
+
const snapshot = orchestrationSessionSnapshot(source);
|
|
1802
|
+
const slug = snapshot.agent?.slug ?? source.agentResume?.slug;
|
|
1803
|
+
const launcher = (await listDetectedAgentLaunchers()).find(a => a.slug === slug);
|
|
1804
|
+
if (!launcher || !source.cwd)
|
|
1805
|
+
throw new Error('独立代码任务需要有项目目录的 Agent 成员,请选择可用成员');
|
|
1806
|
+
const workspace = await prepareTaskWorkspace(task, source.cwd, dependencies, (dependency, repository) => importTaskDependency(task, dependency, repository, service, readDependency));
|
|
1807
|
+
await pathValidator.allowSessionCwd(workspace.cwd);
|
|
1808
|
+
const existing = globalSessionState.sessions.find(s => s.cwd === workspace.cwd);
|
|
1809
|
+
const req = {};
|
|
1810
|
+
const opened = await openInventorySession(req, { preferredFrontendSessionId: existing?.sessionId,
|
|
1811
|
+
name: `执行 ${task.title.slice(0, 70)}`, customName: true, mode: 'tmux', cwd: workspace.cwd });
|
|
1812
|
+
const record = globalSessionState.sessions.find(s => s.sessionId === opened.session.sessionId);
|
|
1813
|
+
const backend = terminalSessions.get(opened.terminalSession.sessionId);
|
|
1814
|
+
if (!backend)
|
|
1815
|
+
throw new Error('独立执行终端创建失败,目录已保留');
|
|
1816
|
+
const currentAgent = orchestrationSessionSnapshot(record).agent;
|
|
1817
|
+
const launchFile = path.join(path.dirname(workspace.cwd), `${path.basename(workspace.cwd)}.worker.json`);
|
|
1818
|
+
let launch = null;
|
|
1819
|
+
try {
|
|
1820
|
+
launch = JSON.parse(await fs.promises.readFile(launchFile, 'utf8'));
|
|
1821
|
+
}
|
|
1822
|
+
catch (error) {
|
|
1823
|
+
if (error.code !== 'ENOENT')
|
|
1824
|
+
throw error;
|
|
1825
|
+
}
|
|
1826
|
+
if (!currentAgent && (!launch || launch.backendId !== opened.terminalSession.sessionId)) {
|
|
1827
|
+
// Persist before typing: a retry must never type the launcher into a newly booted Agent's prompt.
|
|
1828
|
+
const temporary = `${launchFile}.${process.pid}.tmp`;
|
|
1829
|
+
await fs.promises.writeFile(temporary, JSON.stringify({ sessionId: record.sessionId, backendId: opened.terminalSession.sessionId }), { mode: 0o600 });
|
|
1830
|
+
await fs.promises.rename(temporary, launchFile);
|
|
1831
|
+
writeTerminalInput(backend, `${buildCollaborationSpawnCommand({ slug: launcher.slug, command: launcher.command })}\r`);
|
|
1832
|
+
}
|
|
1833
|
+
const group = collaborationStore.getGroup(task.groupId);
|
|
1834
|
+
if (!group || group.deleted)
|
|
1835
|
+
throw new Error('协作组已删除,执行目录已保留');
|
|
1836
|
+
if (!group.sessionIds.includes(record.sessionId))
|
|
1837
|
+
await service.save({ id: group.id, name: group.name,
|
|
1838
|
+
sessionIds: [...group.sessionIds, record.sessionId], expectedUpdatedAt: group.updatedAt });
|
|
1839
|
+
return { sessionId: record.sessionId, workspace };
|
|
1840
|
+
})().finally(() => preparingTaskWorkers.delete(key));
|
|
1841
|
+
preparingTaskWorkers.set(key, operation);
|
|
1842
|
+
return operation;
|
|
1843
|
+
}
|
|
1782
1844
|
function getTmuxBinary() {
|
|
1783
1845
|
if (process.env.TMUX_BIN)
|
|
1784
1846
|
return process.env.TMUX_BIN;
|
|
@@ -5631,6 +5693,8 @@ export function collaborationLocalActivity() {
|
|
|
5631
5693
|
});
|
|
5632
5694
|
}
|
|
5633
5695
|
export function deliverPeerCollaboration(sessionId) { void tryDeliverCollaborationInbox(sessionId); }
|
|
5696
|
+
router.use('/operations/collaboration-tasks', collaborationTaskRoutes({ agent: false, store: collaborationStore, resolveSession: resolveFrontendSessionId }));
|
|
5697
|
+
router.use('/operations/orchestration/tasks', collaborationTaskRoutes({ agent: true, store: collaborationStore, resolveSession: resolveFrontendSessionId }));
|
|
5634
5698
|
router.use('/operations', collaborationGroupRoutes({ store: collaborationStore,
|
|
5635
5699
|
sessions: () => globalSessionState.sessions.map(orchestrationSessionSnapshot),
|
|
5636
5700
|
save: (req, input) => {
|
package/package.json
CHANGED
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.296",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-+FK03eSUIISxxpGNQTlYLuAcpuytFuT+tiLAMYVhwl4=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-Pey0kqNnGCviQazz2xMk+31zDfktp4wJFI/DN3CSzlc=",
|
|
10
|
+
"clientBundleHash": "sha256-xcl62Qc4opdlNYlyLKM+cu84NJTYyVxT/ezTJbkE9Ic=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|