termdock 1.4.317 → 1.4.319
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-9yy2aYiT.js +186 -0
- package/dist/client/assets/App-9yy2aYiT.js.br +0 -0
- package/dist/client/assets/App-9yy2aYiT.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-CdgUQsVD.js → ArchitecturePanel-CHMjbrPM.js} +2 -2
- package/dist/client/assets/ArchitecturePanel-CHMjbrPM.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CHMjbrPM.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DHp5r1k9.js → ChangeWalkthroughPanel-B0JYVVwB.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-B0JYVVwB.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-B0JYVVwB.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-P_jXjsT-.js → CollaborationMainWorkspace-BJzMdyZc.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-BJzMdyZc.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BJzMdyZc.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-BwHxwcOP.js +2 -0
- package/dist/client/assets/{ComputerControlView-B5Yng8Dt.js → ComputerControlView-CdMNRZsH.js} +2 -2
- package/dist/client/assets/ComputerControlView-CdMNRZsH.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CdMNRZsH.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-rZE40fcL.js → DagPlayground-C1xEyYVK.js} +1 -1
- package/dist/client/assets/DagPlayground-C1xEyYVK.js.br +0 -0
- package/dist/client/assets/DagPlayground-C1xEyYVK.js.gz +0 -0
- package/dist/client/assets/{DiffLab-3sIn0W3p.js → DiffLab-DcCKWB7G.js} +1 -1
- package/dist/client/assets/DiffLab-DcCKWB7G.js.br +0 -0
- package/dist/client/assets/DiffLab-DcCKWB7G.js.gz +0 -0
- package/dist/client/assets/{DiffReview-CBf8-Tli.js → DiffReview-C1TyvrA9.js} +1 -1
- package/dist/client/assets/DiffReview-C1TyvrA9.js.br +0 -0
- package/dist/client/assets/DiffReview-C1TyvrA9.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-BXhskTlx.js → DiffReviewLab-D784yT2y.js} +1 -1
- package/dist/client/assets/DiffReviewLab-D784yT2y.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-D784yT2y.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-DZfgjOBh.js → DiffViewer-ByAlz2NG.js} +1 -1
- package/dist/client/assets/DiffViewer-ByAlz2NG.js.br +0 -0
- package/dist/client/assets/DiffViewer-ByAlz2NG.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-Bzdi_sPh.js → ModelPreview-DxMcmJZy.js} +1 -1
- package/dist/client/assets/ModelPreview-DxMcmJZy.js.br +0 -0
- package/dist/client/assets/ModelPreview-DxMcmJZy.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-DaRdlJzn.js → RightSidebar-CXykcIPb.js} +3 -3
- package/dist/client/assets/RightSidebar-CXykcIPb.js.br +0 -0
- package/dist/client/assets/RightSidebar-CXykcIPb.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CarKrfAf.js → abnfDiagram-VCTEODGH-DZZIayJV.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-DZZIayJV.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DZZIayJV.js.gz +0 -0
- package/dist/client/assets/{app-BCTEfclM.js → app-CI3Oh-41.js} +3 -3
- package/dist/client/assets/app-CI3Oh-41.js.br +0 -0
- package/dist/client/assets/app-CI3Oh-41.js.gz +0 -0
- package/dist/client/assets/{arc-B6Qdq2Vw.js → arc-CjpEX_Ug.js} +1 -1
- package/dist/client/assets/arc-CjpEX_Ug.js.br +0 -0
- package/dist/client/assets/arc-CjpEX_Ug.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DgPJ0l9i.js → architectureDiagram-5GKGNRK7-DUx2_xyE.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DUx2_xyE.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DUx2_xyE.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-BsorvNo4.js → blockDiagram-I7D4REHJ-DP-lXaM3.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-DP-lXaM3.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DP-lXaM3.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-Bbpi62ab.js → c4Diagram-7LVT6UL2-DomY5VR-.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-DomY5VR-.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DomY5VR-.js.gz +0 -0
- package/dist/client/assets/channel-DIO7oiN5.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Cm7mDz66.js → chunk-2Q5K7J3B-BPtKxDa8.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BMERXU_m.js → chunk-5VM5RSS4-CRCqW368.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-fe9Yw7OI.js → chunk-F27PBJKO-Bs1ITIOZ.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-Bs1ITIOZ.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-Bs1ITIOZ.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-QquKV9k-.js → chunk-IMKFNOWR-Cw7kOnvo.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-Cw7kOnvo.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Cw7kOnvo.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-CVe8_YO4.js → chunk-JWPE2WC7-DBNaGHE2.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-DT8PalJ4.js → chunk-POPQ4Y6H-B_OEr0FR.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BUQulipE.js → chunk-SVP7TREG-Ct25uRBl.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-Ct25uRBl.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Ct25uRBl.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-fubKwUCg.js → chunk-TICWLB2K-BVxQwSUB.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-BVxQwSUB.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BVxQwSUB.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-CdwTi82y.js → chunk-XXDRQBXY-B6PLILau.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DukHh254.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DukHh254.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-DmEDc2ee.js → cose-bilkent-JH36ORCC-Df23Xlgg.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Df23Xlgg.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Df23Xlgg.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-C-mfarRX.js → cynefin-OW5HDTMX-Dxy4auKS.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-Dxy4auKS.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-Dxy4auKS.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CgVmp8od.js → cynefinDiagram-5FMLGOSQ-CRypsJyP.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CRypsJyP.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CRypsJyP.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-WU_d2fSU.js → dagre-GXQ25YYZ-B2XmJ6IF.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-B2XmJ6IF.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B2XmJ6IF.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-Dtikk80Z.js → diagram-S7CK7UJ4-BQcwNDWz.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-BQcwNDWz.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BQcwNDWz.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-DuTCB36P.js → diagram-UQ7AKVKN-B6LD6n6P.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-B6LD6n6P.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-B6LD6n6P.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-DSLAcWi6.js → diagram-VSXAHHWV-DDI4SMid.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-DDI4SMid.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DDI4SMid.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DyQOu10m.js → diagram-VX7I27RA-CRq35BVZ.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-CRq35BVZ.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CRq35BVZ.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-CuMI1k1t.js → diagram-Z3DM3KII-Br2tE-aw.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-Br2tE-aw.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-Br2tE-aw.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-Di8RxhNL.js → ebnfDiagram-PWID7BFC-CLERVjPA.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CLERVjPA.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CLERVjPA.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-C1wPuBtH.js → erDiagram-RLTQ6QDP-CdjRSsSD.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-CdjRSsSD.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CdjRSsSD.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-D0SIEpUy.js → flowDiagram-HODETNUW-CJcQ479Z.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-CJcQ479Z.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CJcQ479Z.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DgeD2fKd.js → ganttDiagram-EL5Y4UJY-CdDCSJ3h.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CdDCSJ3h.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CdDCSJ3h.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-Xl7awIrX.js → gestureArbiter-D6uN_O0i.js} +1 -1
- package/dist/client/assets/gestureArbiter-D6uN_O0i.js.br +0 -0
- package/dist/client/assets/gestureArbiter-D6uN_O0i.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CzFKSKK_.js → gitGraphDiagram-WWUBYQGX-tcLWvosg.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-tcLWvosg.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-tcLWvosg.js.gz +0 -0
- package/dist/client/assets/index-_7yzQpVq.css +1 -0
- package/dist/client/assets/index-_7yzQpVq.css.br +0 -0
- package/dist/client/assets/{index-BObjbh2R.css.gz → index-_7yzQpVq.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-C9mmJGhv.js → infoDiagram-27XIBGKW-D7ze39D4.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-D9uVb4Og.js → ishikawaDiagram-5VMMS53U-BmvDG55X.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BmvDG55X.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BmvDG55X.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-BMKNUyUx.js → journeyDiagram-3NMN7TZE-Ba2oQRdr.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Ba2oQRdr.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Ba2oQRdr.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-8i7nyqix.js → kanban-definition-UXKFOSKX-BGrEtfSU.js} +1 -1
- package/dist/client/assets/{kanban-definition-UXKFOSKX-8i7nyqix.js.br → kanban-definition-UXKFOSKX-BGrEtfSU.js.br} +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BGrEtfSU.js.gz +0 -0
- package/dist/client/assets/{layout-BS5SCHbc.js → layout-Df_WxQ7_.js} +1 -1
- package/dist/client/assets/layout-Df_WxQ7_.js.br +0 -0
- package/dist/client/assets/layout-Df_WxQ7_.js.gz +0 -0
- package/dist/client/assets/{linear-fo2zkK6T.js → linear-yjCZ1UPt.js} +1 -1
- package/dist/client/assets/{linear-fo2zkK6T.js.br → linear-yjCZ1UPt.js.br} +0 -0
- package/dist/client/assets/linear-yjCZ1UPt.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-B8k3pAmc.js → mermaid.core-wqB76PXA.js} +5 -5
- package/dist/client/assets/mermaid.core-wqB76PXA.js.br +0 -0
- package/dist/client/assets/mermaid.core-wqB76PXA.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-BwgQTj2Q.js → mindmap-definition-YA3MSWOX-BvFfuDI9.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BvFfuDI9.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BvFfuDI9.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-DvQk0qYt.js → passwordBootstrap-CeMHRTET.js} +1 -1
- package/dist/client/assets/passwordBootstrap-CeMHRTET.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-CeMHRTET.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-CumSoxLr.js → pegDiagram-XKGWAZYB-GFNFRFcn.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-GFNFRFcn.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-GFNFRFcn.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-Dc3txkBL.js → pieDiagram-E7YTZNPT-i_OnIQ5S.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-i_OnIQ5S.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-i_OnIQ5S.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-D92mwZnT.js → quadrantDiagram-AXDQQJYC-DgclfhW2.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DgclfhW2.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DgclfhW2.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-O1UOZ30Y.js → railroadDiagram-O6MQD6OU-Bta7NOF1.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Bta7NOF1.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Bta7NOF1.js.gz +0 -0
- package/dist/client/assets/{rdpSession-Dr_tPwzx.js → rdpSession-CVTDBhDb.js} +1 -1
- package/dist/client/assets/rdpSession-CVTDBhDb.js.br +0 -0
- package/dist/client/assets/rdpSession-CVTDBhDb.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-YuGU-PYw.js → referenceLongPress-C91ZK5h8.js} +1 -1
- package/dist/client/assets/referenceLongPress-C91ZK5h8.js.br +0 -0
- package/dist/client/assets/referenceLongPress-C91ZK5h8.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-uD1cgrxA.js → requirementDiagram-BXWQKSXE-CjVvykFZ.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CjVvykFZ.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CjVvykFZ.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CIJE4-pc.js → sankeyDiagram-P5KCCOFB-DkRiE5xj.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DkRiE5xj.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DkRiE5xj.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BT6LG37W.js → sequenceDiagram-WJ2MYXX4-BW-TiTTz.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BW-TiTTz.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BW-TiTTz.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-DoYY94Rj.js → sizeCapture-INFHLROL-CknYHWYz.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-CknYHWYz.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CknYHWYz.js.gz +0 -0
- package/dist/client/assets/{sparkles-DFYGpezN.js → sparkles-BhmNaa1u.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-C4xmgR_-.js → stateDiagram-D77RDMKH-do6p3u1y.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-do6p3u1y.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-do6p3u1y.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CBBKJJkB.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-mRdmZmAA.js → swimlanes-42K2YHIH-BloliwwH.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BloliwwH.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BloliwwH.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N--bexkZyM.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-BFFrD5kR.js → timeline-definition-24CTP7MA-DelADR0N.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DelADR0N.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DelADR0N.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-BwJ6Q_Y0.js → triangle-alert-B5d_l343.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-Dy59OxIM.js → vennDiagram-4TSXK5OY-BJhlRAwF.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-Dy59OxIM.js.br → vennDiagram-4TSXK5OY-BJhlRAwF.js.br} +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BJhlRAwF.js.gz +0 -0
- package/dist/client/assets/{videoCompression-DrQ47oZA.js → videoCompression-CuDMhYU3.js} +1 -1
- package/dist/client/assets/videoCompression-CuDMhYU3.js.br +0 -0
- package/dist/client/assets/videoCompression-CuDMhYU3.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-B-BKlX7o.js → wardleyDiagram-VM6X3IG4-3MDCa0Rt.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-3MDCa0Rt.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-3MDCa0Rt.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-79qktI_4.js → xychartDiagram-S5SC5T6Z-LWuDetCo.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-LWuDetCo.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-LWuDetCo.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/collaborationStore.js +83 -7
- package/dist/server/agent/collaborationTeam.js +11 -4
- package/dist/server/agent/integrationCli.js +49 -4
- package/dist/server/agent/integrationServer.js +14 -2
- package/dist/server/routes/terminal.js +12 -6
- package/docs/integrations.md +80 -4
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-BF_s1-_u.js +0 -186
- package/dist/client/assets/App-BF_s1-_u.js.br +0 -0
- package/dist/client/assets/App-BF_s1-_u.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-CdgUQsVD.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CdgUQsVD.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DHp5r1k9.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DHp5r1k9.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-P_jXjsT-.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-P_jXjsT-.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-DSkxOlKQ.js +0 -2
- package/dist/client/assets/ComputerControlView-B5Yng8Dt.js.br +0 -0
- package/dist/client/assets/ComputerControlView-B5Yng8Dt.js.gz +0 -0
- package/dist/client/assets/DagPlayground-rZE40fcL.js.br +0 -0
- package/dist/client/assets/DagPlayground-rZE40fcL.js.gz +0 -0
- package/dist/client/assets/DiffLab-3sIn0W3p.js.br +0 -0
- package/dist/client/assets/DiffLab-3sIn0W3p.js.gz +0 -0
- package/dist/client/assets/DiffReview-CBf8-Tli.js.br +0 -0
- package/dist/client/assets/DiffReview-CBf8-Tli.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-BXhskTlx.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BXhskTlx.js.gz +0 -0
- package/dist/client/assets/DiffViewer-DZfgjOBh.js.br +0 -0
- package/dist/client/assets/DiffViewer-DZfgjOBh.js.gz +0 -0
- package/dist/client/assets/ModelPreview-Bzdi_sPh.js.br +0 -0
- package/dist/client/assets/ModelPreview-Bzdi_sPh.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DaRdlJzn.js.br +0 -0
- package/dist/client/assets/RightSidebar-DaRdlJzn.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CarKrfAf.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CarKrfAf.js.gz +0 -0
- package/dist/client/assets/app-BCTEfclM.js.br +0 -0
- package/dist/client/assets/app-BCTEfclM.js.gz +0 -0
- package/dist/client/assets/arc-B6Qdq2Vw.js.br +0 -0
- package/dist/client/assets/arc-B6Qdq2Vw.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DgPJ0l9i.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DgPJ0l9i.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BsorvNo4.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BsorvNo4.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Bbpi62ab.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Bbpi62ab.js.gz +0 -0
- package/dist/client/assets/channel-uZtI4GD8.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-fe9Yw7OI.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-fe9Yw7OI.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-QquKV9k-.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-QquKV9k-.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BUQulipE.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BUQulipE.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-fubKwUCg.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-fubKwUCg.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-CgJJ1J4J.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CgJJ1J4J.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-DmEDc2ee.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DmEDc2ee.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C-mfarRX.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C-mfarRX.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CgVmp8od.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CgVmp8od.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-WU_d2fSU.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-WU_d2fSU.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-Dtikk80Z.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-Dtikk80Z.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DuTCB36P.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DuTCB36P.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DSLAcWi6.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DSLAcWi6.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DyQOu10m.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DyQOu10m.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CuMI1k1t.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CuMI1k1t.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Di8RxhNL.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Di8RxhNL.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-C1wPuBtH.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-C1wPuBtH.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-D0SIEpUy.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-D0SIEpUy.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DgeD2fKd.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DgeD2fKd.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-Xl7awIrX.js.br +0 -0
- package/dist/client/assets/gestureArbiter-Xl7awIrX.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CzFKSKK_.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CzFKSKK_.js.gz +0 -0
- package/dist/client/assets/index-BObjbh2R.css +0 -1
- package/dist/client/assets/index-BObjbh2R.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-D9uVb4Og.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-D9uVb4Og.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BMKNUyUx.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BMKNUyUx.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-8i7nyqix.js.gz +0 -0
- package/dist/client/assets/layout-BS5SCHbc.js.br +0 -0
- package/dist/client/assets/layout-BS5SCHbc.js.gz +0 -0
- package/dist/client/assets/linear-fo2zkK6T.js.gz +0 -0
- package/dist/client/assets/mermaid.core-B8k3pAmc.js.br +0 -0
- package/dist/client/assets/mermaid.core-B8k3pAmc.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BwgQTj2Q.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BwgQTj2Q.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-DvQk0qYt.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-DvQk0qYt.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CumSoxLr.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CumSoxLr.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dc3txkBL.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dc3txkBL.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D92mwZnT.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D92mwZnT.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-O1UOZ30Y.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-O1UOZ30Y.js.gz +0 -0
- package/dist/client/assets/rdpSession-Dr_tPwzx.js.br +0 -0
- package/dist/client/assets/rdpSession-Dr_tPwzx.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-YuGU-PYw.js.br +0 -0
- package/dist/client/assets/referenceLongPress-YuGU-PYw.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-uD1cgrxA.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-uD1cgrxA.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CIJE4-pc.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CIJE4-pc.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BT6LG37W.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BT6LG37W.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DoYY94Rj.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DoYY94Rj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-C4xmgR_-.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-C4xmgR_-.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BLHH60cg.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-mRdmZmAA.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-mRdmZmAA.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-D-lNPW5d.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-BFFrD5kR.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BFFrD5kR.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-Dy59OxIM.js.gz +0 -0
- package/dist/client/assets/videoCompression-DrQ47oZA.js.br +0 -0
- package/dist/client/assets/videoCompression-DrQ47oZA.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B-BKlX7o.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B-BKlX7o.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-79qktI_4.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-79qktI_4.js.gz +0 -0
|
@@ -3,14 +3,21 @@
|
|
|
3
3
|
export async function ensureTeam(options) {
|
|
4
4
|
const ids = [];
|
|
5
5
|
const labels = [`自动协调者 (${options.agentSlug})`, `自动执行与评审 (${options.agentSlug})`];
|
|
6
|
-
|
|
6
|
+
if (typeof options.coordinatorSessionId === 'string') {
|
|
7
|
+
const coordinator = options.members().find(member => member.id === options.coordinatorSessionId && member.agentSlug);
|
|
8
|
+
if (!coordinator)
|
|
9
|
+
throw new Error('所选协调者已离组或未运行 Agent,请重新选择');
|
|
10
|
+
ids.push(coordinator.id);
|
|
11
|
+
}
|
|
12
|
+
for (const role of labels.slice(ids.length)) {
|
|
7
13
|
const members = options.members();
|
|
8
|
-
const
|
|
14
|
+
const forceNew = ids.length === 0 && options.coordinatorSessionId === null;
|
|
15
|
+
const reserved = members.find(member => !ids.includes(member.id) && (forceNew && options.coordinatorCreationKey ? member.creationKey === options.coordinatorCreationKey : member.role?.startsWith(role.split(' (')[0])));
|
|
9
16
|
if (reserved && (reserved.role !== role || reserved.cwd !== options.cwd || (reserved.launchProfileKey ?? '') !== (options.launchProfileKey ?? ''))) {
|
|
10
17
|
throw new Error('本组已有自动配置的成员,请使用原 Agent、启动方案和目录,或在成员设置中移出后重新配置');
|
|
11
18
|
}
|
|
12
|
-
const existing = reserved ?? members.find(member => !ids.includes(member.id) && member.agentSlug === options.agentSlug && member.cwd === options.cwd && (member.launchProfileKey ?? '') === (options.launchProfileKey ?? ''));
|
|
13
|
-
ids.push(existing?.id ?? await options.spawn(role));
|
|
19
|
+
const existing = reserved ?? (!forceNew ? members.find(member => !ids.includes(member.id) && member.agentSlug === options.agentSlug && member.cwd === options.cwd && (member.launchProfileKey ?? '') === (options.launchProfileKey ?? '')) : undefined);
|
|
20
|
+
ids.push(existing?.id ?? await options.spawn(role, forceNew ? options.coordinatorCreationKey : undefined));
|
|
14
21
|
}
|
|
15
22
|
return { coordinatorSessionId: ids[0], reviewerSessionIds: [ids[1]] };
|
|
16
23
|
}
|
|
@@ -8,9 +8,27 @@ import { COLLAB_HELP, executeCollaborationCommand, duration } from './collaborat
|
|
|
8
8
|
import { getTermdockVersion } from '../utils/version.js';
|
|
9
9
|
export const INTEGRATION_HELP = `td integration — local scoped integration administration
|
|
10
10
|
groups | list
|
|
11
|
+
group get <exact-group-id>
|
|
12
|
+
group rename <exact-group-id> --name <name> --expected-updated-at <N> --idempotency-key <key>
|
|
13
|
+
Administrator only; minimum CLI/running service 1.4.319;
|
|
14
|
+
admin_local_group_rename=true covers get/rename and group revision reads.
|
|
15
|
+
get returns {group:{id,name,updatedAt}}; groups also returns updatedAt.
|
|
16
|
+
rename returns {group: current metadata, applied: original committed metadata,
|
|
17
|
+
replayed: boolean}. Only name/updatedAt change; no membership, principal,
|
|
18
|
+
terminal, launch, message, history or creation-snapshot changes.
|
|
19
|
+
Read the revision first. GROUP_CHANGED returns currentUpdatedAt; reread and
|
|
20
|
+
decide again with a new key. Retry uncertain results with the original key
|
|
21
|
+
and all original parameters; a later rename is never overwritten by replay.
|
|
22
|
+
Same normalized name is a recorded no-op. Keys are retained, capped at 2000.
|
|
23
|
+
No terminal source, principal grant, prefix/name lookup or federated group.
|
|
24
|
+
Errors: INVALID_GROUP_RENAME_REQUEST, INVALID_GROUP_ID, INVALID_GROUP,
|
|
25
|
+
INVALID_GROUP_VERSION, INVALID_IDEMPOTENCY_KEY, IDEMPOTENCY_CONFLICT,
|
|
26
|
+
GROUP_CHANGED, GROUP_NOT_FOUND, GROUP_NOT_LOCAL, GROUP_STATE_UNCONFIRMED,
|
|
27
|
+
GROUP_RENAME_TARGET_UNAVAILABLE, GROUP_RENAME_STATE_UNCONFIRMED,
|
|
28
|
+
GROUP_RENAME_LIMIT, ADMIN_LOCAL_GROUP_RENAME_UNSUPPORTED.
|
|
11
29
|
group create --name <name> --idempotency-key <key>
|
|
12
30
|
Administrator only; create an empty local group without a terminal source.
|
|
13
|
-
Minimum CLI/running service 1.4.
|
|
31
|
+
Minimum CLI/running service 1.4.318; admin_local_group_create=true.
|
|
14
32
|
Returns {group: original creation snapshot}; same key/parameters reuse it.
|
|
15
33
|
Groups may later gain members; the snapshot is not their current membership.
|
|
16
34
|
No IDs, members, federation, launch profiles or principal credentials accepted.
|
|
@@ -89,7 +107,7 @@ function request(socketPath, method, route, body, requestHeaders, timeout = 3000
|
|
|
89
107
|
function parsed(response) {
|
|
90
108
|
const result = JSON.parse(response.body);
|
|
91
109
|
if (response.statusCode >= 300)
|
|
92
|
-
throw new CollaborationError(result.code ?? 'INTEGRATION_REQUEST_FAILED', result.error ?? 'Integration request failed', response.statusCode);
|
|
110
|
+
throw new CollaborationError(result.code ?? 'INTEGRATION_REQUEST_FAILED', result.error ?? 'Integration request failed', response.statusCode, result.code === 'GROUP_CHANGED' && Number.isSafeInteger(result.currentUpdatedAt) ? { currentUpdatedAt: result.currentUpdatedAt } : undefined);
|
|
93
111
|
return result;
|
|
94
112
|
}
|
|
95
113
|
export async function runIntegrationAdmin(argv, port, adminToken, write) {
|
|
@@ -101,6 +119,31 @@ export async function runIntegrationAdmin(argv, port, adminToken, write) {
|
|
|
101
119
|
return 0;
|
|
102
120
|
}
|
|
103
121
|
const socketPath = integrationSocketPath(port);
|
|
122
|
+
if (action === 'group' && ['get', 'rename'].includes(argv[1])) {
|
|
123
|
+
const operation = argv[1], id = argv[2], args = {};
|
|
124
|
+
const usage = 'Usage: td integration group get <exact-id> | group rename <exact-id> --name <name> --expected-updated-at <N> --idempotency-key <key>';
|
|
125
|
+
if (!id || !/^[a-zA-Z0-9._-]{1,80}$/.test(id))
|
|
126
|
+
throw new CollaborationError('INVALID_GROUP_ID', usage, 400);
|
|
127
|
+
if (operation === 'get' && argv.length !== 3)
|
|
128
|
+
throw new CollaborationError('INVALID_GROUP_RENAME_REQUEST', usage, 400);
|
|
129
|
+
if (operation === 'rename') {
|
|
130
|
+
for (let i = 3; i < argv.length; i += 2) {
|
|
131
|
+
if (!['--name', '--expected-updated-at', '--idempotency-key'].includes(argv[i]) || !argv[i + 1] || Object.hasOwn(args, argv[i]))
|
|
132
|
+
throw new CollaborationError('INVALID_GROUP_RENAME_REQUEST', usage, 400);
|
|
133
|
+
args[argv[i]] = argv[i + 1];
|
|
134
|
+
}
|
|
135
|
+
if (Object.keys(args).length !== 3 || !args['--name']?.trim() || !args['--idempotency-key']?.trim())
|
|
136
|
+
throw new CollaborationError('INVALID_GROUP_RENAME_REQUEST', usage, 400);
|
|
137
|
+
if (!/^(0|[1-9][0-9]*)$/.test(args['--expected-updated-at']) || !Number.isSafeInteger(Number(args['--expected-updated-at'])))
|
|
138
|
+
throw new CollaborationError('INVALID_GROUP_VERSION', usage, 400);
|
|
139
|
+
}
|
|
140
|
+
const capabilities = parsed(await request(socketPath, 'GET', '/admin/capabilities', undefined, headers(undefined, adminToken)));
|
|
141
|
+
if (capabilities.admin_local_group_rename !== true)
|
|
142
|
+
throw new CollaborationError('ADMIN_LOCAL_GROUP_RENAME_UNSUPPORTED', 'CLI and running service must support administrator group metadata operations (minimum 1.4.319)', 409);
|
|
143
|
+
const body = operation === 'rename' ? { name: args['--name'], expected_updated_at: Number(args['--expected-updated-at']), idempotency_key: args['--idempotency-key'] } : undefined;
|
|
144
|
+
write(JSON.stringify(parsed(await request(socketPath, body ? 'POST' : 'GET', `/admin/groups/${encodeURIComponent(id)}${body ? '/rename' : ''}`, body, headers(undefined, adminToken)))));
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
104
147
|
if (action === 'group') {
|
|
105
148
|
const args = {};
|
|
106
149
|
const usage = 'Usage: td integration group create --name <name> --idempotency-key <key>';
|
|
@@ -115,7 +158,7 @@ export async function runIntegrationAdmin(argv, port, adminToken, write) {
|
|
|
115
158
|
throw new CollaborationError('INVALID_GROUP_CREATE_REQUEST', usage, 400);
|
|
116
159
|
const capabilities = parsed(await request(socketPath, 'GET', '/admin/capabilities', undefined, headers(undefined, adminToken)));
|
|
117
160
|
if (capabilities.admin_local_group_create !== true)
|
|
118
|
-
throw new CollaborationError('ADMIN_LOCAL_GROUP_CREATE_UNSUPPORTED', 'CLI and running service must support empty local group creation (minimum 1.4.
|
|
161
|
+
throw new CollaborationError('ADMIN_LOCAL_GROUP_CREATE_UNSUPPORTED', 'CLI and running service must support empty local group creation (minimum 1.4.318)', 409);
|
|
119
162
|
write(JSON.stringify(parsed(await request(socketPath, 'POST', '/admin/groups', { name: args['--name'], idempotency_key: args['--idempotency-key'] }, headers(undefined, adminToken)))));
|
|
120
163
|
return 0;
|
|
121
164
|
}
|
|
@@ -210,7 +253,9 @@ export async function runIntegrationAdmin(argv, port, adminToken, write) {
|
|
|
210
253
|
catch (error) {
|
|
211
254
|
if (reserved)
|
|
212
255
|
fs.unlinkSync(reserved);
|
|
213
|
-
write(JSON.stringify({ ok: false, code: error instanceof CollaborationError ? error.code : 'INTEGRATION_ADMIN_ERROR',
|
|
256
|
+
write(JSON.stringify({ ok: false, code: error instanceof CollaborationError ? error.code : 'INTEGRATION_ADMIN_ERROR',
|
|
257
|
+
...(error instanceof CollaborationError && error.code === 'GROUP_CHANGED' ? error.details : {}),
|
|
258
|
+
error: error instanceof CollaborationError ? error.message : 'Integration administration failed; inspect arguments and private file paths' }));
|
|
214
259
|
return 1;
|
|
215
260
|
}
|
|
216
261
|
}
|
|
@@ -68,7 +68,16 @@ export class IntegrationRuntime {
|
|
|
68
68
|
if (!expected.length || given.length !== expected.length || !timingSafeEqual(given, expected))
|
|
69
69
|
integrationError('INTEGRATION_ADMIN_REQUIRED', 'Local administration credential is required', 401);
|
|
70
70
|
};
|
|
71
|
-
app.get('/admin/groups', run(req => { admin(req); return { groups: options.messages.list().filter(g => !g.federated).map(g => ({ id: g.id, name: g.name })) }; }));
|
|
71
|
+
app.get('/admin/groups', run(req => { admin(req); return { groups: options.messages.list().filter(g => !g.federated).map(g => ({ id: g.id, name: g.name, updatedAt: g.updatedAt })) }; }));
|
|
72
|
+
app.get('/admin/groups/:id', run(req => { admin(req); return { group: options.messages.getLocalGroupMetadata(req.params.id) }; }));
|
|
73
|
+
app.post('/admin/groups/:id/rename', run(req => {
|
|
74
|
+
admin(req);
|
|
75
|
+
const body = req.body;
|
|
76
|
+
if (!body || typeof body !== 'object' || Array.isArray(body) || Object.keys(body).some(key => !['name', 'expected_updated_at', 'idempotency_key'].includes(key))) {
|
|
77
|
+
integrationError('INVALID_GROUP_RENAME_REQUEST', 'Specify only name, expected_updated_at and idempotency_key');
|
|
78
|
+
}
|
|
79
|
+
return options.messages.renameLocalGroup(req.params.id, body.name, body.expected_updated_at, body.idempotency_key);
|
|
80
|
+
}));
|
|
72
81
|
app.post('/admin/groups', run(req => {
|
|
73
82
|
admin(req);
|
|
74
83
|
const body = req.body;
|
|
@@ -241,7 +250,8 @@ export class IntegrationRuntime {
|
|
|
241
250
|
session_cold_retry: true, session_cold_retry_min_version: '1.4.314',
|
|
242
251
|
session_rename: true, session_rename_min_version: '1.4.315',
|
|
243
252
|
session_close: true, session_close_min_version: '1.4.315',
|
|
244
|
-
admin_local_group_create: true, admin_local_group_create_min_version: '1.4.
|
|
253
|
+
admin_local_group_create: true, admin_local_group_create_min_version: '1.4.318',
|
|
254
|
+
admin_local_group_rename: true, admin_local_group_rename_min_version: '1.4.319',
|
|
245
255
|
integration_policy_update: true,
|
|
246
256
|
session_restore_diagnostics: true,
|
|
247
257
|
native_identity_linux_flock_owner: process.platform === 'linux',
|
|
@@ -251,6 +261,8 @@ export class IntegrationRuntime {
|
|
|
251
261
|
}
|
|
252
262
|
error(error) {
|
|
253
263
|
return { type: 'error', ok: false, code: error instanceof CollaborationError ? error.code : 'INTEGRATION_INTERNAL_ERROR',
|
|
264
|
+
...(error instanceof CollaborationError && error.code === 'GROUP_CHANGED' && Number.isSafeInteger(error.details?.currentUpdatedAt)
|
|
265
|
+
? { currentUpdatedAt: error.details.currentUpdatedAt } : {}),
|
|
254
266
|
error: error instanceof CollaborationError ? error.message : 'Integration operation failed', retryable: !(error instanceof CollaborationError) || error.httpStatus >= 500 };
|
|
255
267
|
}
|
|
256
268
|
group(id) {
|
|
@@ -1872,7 +1872,7 @@ async function refreshCollaborationAgentIdentity(backendSessionId, session, fres
|
|
|
1872
1872
|
function deliverCollaborationInboxWhenAgentReady(frontendSessionId) {
|
|
1873
1873
|
collaborationDeliveryWorker.wake(frontendSessionId);
|
|
1874
1874
|
}
|
|
1875
|
-
async function spawnCollaborationAgentSession(req, group, sourceSessionId, input, bootstrapRole) {
|
|
1875
|
+
async function spawnCollaborationAgentSession(req, group, sourceSessionId, input, bootstrapRole, creationKey) {
|
|
1876
1876
|
const { agentSlug, profile } = resolveCollaborationLaunch(group, input);
|
|
1877
1877
|
const launchers = await listDetectedAgentLaunchers();
|
|
1878
1878
|
const launcher = launchers.find((candidate) => candidate.slug === agentSlug);
|
|
@@ -1924,7 +1924,7 @@ async function spawnCollaborationAgentSession(req, group, sourceSessionId, input
|
|
|
1924
1924
|
sessionIds: [...latestGroup.sessionIds, frontendSessionId],
|
|
1925
1925
|
});
|
|
1926
1926
|
if (bootstrapRole)
|
|
1927
|
-
collaborationStore.setRole({ groupId: group.id, sessionId: frontendSessionId, role: bootstrapRole });
|
|
1927
|
+
collaborationStore.setRole({ groupId: group.id, sessionId: frontendSessionId, role: bootstrapRole, creationKey });
|
|
1928
1928
|
if (profile)
|
|
1929
1929
|
collaborationStore.setMemberLaunchProfile(group.id, frontendSessionId, profile);
|
|
1930
1930
|
await writeAutomaticTerminalPrompt(frontendSessionId, buildCollaborationSpawnCommand({ slug: launcher.slug, command: profile?.command ?? launcher.command }));
|
|
@@ -6409,6 +6409,12 @@ router.post('/operations/collaboration-groups/:groupId/team', async (req, res) =
|
|
|
6409
6409
|
return res.status(404).json({ error: '协作组不存在' });
|
|
6410
6410
|
if (group.federated)
|
|
6411
6411
|
throw new Error('跨服务组请先从成员设置添加 Agent');
|
|
6412
|
+
const coordinatorSessionId = req.body?.coordinatorSessionId;
|
|
6413
|
+
if (coordinatorSessionId !== undefined && coordinatorSessionId !== null && (typeof coordinatorSessionId !== 'string' || !coordinatorSessionId))
|
|
6414
|
+
throw new Error('请选择有效的协调者');
|
|
6415
|
+
const coordinatorCreationKey = req.body?.coordinatorCreationKey;
|
|
6416
|
+
if (coordinatorCreationKey !== undefined && (typeof coordinatorCreationKey !== 'string' || !/^[a-zA-Z0-9_-]{1,100}$/.test(coordinatorCreationKey)))
|
|
6417
|
+
throw new Error('协调者创建请求无效');
|
|
6412
6418
|
const { agentSlug, profile } = resolveCollaborationLaunch(group, req.body ?? {});
|
|
6413
6419
|
if (!(await listDetectedAgentLaunchers()).some(agent => agent.slug === agentSlug))
|
|
6414
6420
|
throw new Error('所选 Agent 当前不可用');
|
|
@@ -6416,7 +6422,7 @@ router.post('/operations/collaboration-groups/:groupId/team', async (req, res) =
|
|
|
6416
6422
|
throw new Error('请选择工作目录');
|
|
6417
6423
|
const cwd = await resolveWorkingDirectory(req, req.body.cwd);
|
|
6418
6424
|
const previous = preparingTeams.get(group.id) ?? Promise.resolve();
|
|
6419
|
-
const operation = previous.catch(() => { }).then(() => ensureTeam({ agentSlug, cwd, launchProfileKey: launchProfileKey(profile),
|
|
6425
|
+
const operation = previous.catch(() => { }).then(() => ensureTeam({ agentSlug, cwd, launchProfileKey: launchProfileKey(profile), coordinatorSessionId, coordinatorCreationKey,
|
|
6420
6426
|
members: () => {
|
|
6421
6427
|
const current = collaborationStore.getGroup(group.id);
|
|
6422
6428
|
if (!current || current.deleted)
|
|
@@ -6424,13 +6430,13 @@ router.post('/operations/collaboration-groups/:groupId/team', async (req, res) =
|
|
|
6424
6430
|
if (profile && launchProfileKey(current.launchProfiles?.find(p => p.id === profile.id)) !== launchProfileKey(profile))
|
|
6425
6431
|
throw new Error('启动方案已变更,请重新开始协作');
|
|
6426
6432
|
return globalSessionState.sessions.filter(record => current.sessionIds.includes(record.sessionId))
|
|
6427
|
-
.map(record => ({ id: record.sessionId, cwd: record.cwd, role: current.roles?.[record.sessionId], agentSlug: orchestrationSessionSnapshot(record).agent?.slug, launchProfileKey: launchProfileKey(current.memberLaunchProfiles?.[record.sessionId]) }));
|
|
6433
|
+
.map(record => ({ id: record.sessionId, cwd: record.cwd, role: current.roles?.[record.sessionId], agentSlug: orchestrationSessionSnapshot(record).agent?.slug, launchProfileKey: launchProfileKey(current.memberLaunchProfiles?.[record.sessionId]), creationKey: current.memberCreationKeys?.[record.sessionId] }));
|
|
6428
6434
|
},
|
|
6429
|
-
spawn: async (role) => {
|
|
6435
|
+
spawn: async (role, creationKey) => {
|
|
6430
6436
|
const current = collaborationStore.getGroup(group.id);
|
|
6431
6437
|
if (!current || current.deleted)
|
|
6432
6438
|
throw new Error('协作组已删除');
|
|
6433
|
-
const result = await spawnCollaborationAgentSession(req, current, null, { agentSlug, launchProfileId: profile?.id ?? '', cwd, mode: 'tmux', name: role.startsWith('自动协调者') ? `协调 ${group.name}` : `执行与评审 ${group.name}` }, role);
|
|
6439
|
+
const result = await spawnCollaborationAgentSession(req, current, null, { agentSlug, launchProfileId: profile?.id ?? '', cwd, mode: 'tmux', name: role.startsWith('自动协调者') ? `协调 ${group.name}` : `执行与评审 ${group.name}` }, role, creationKey);
|
|
6434
6440
|
return result.session.sessionId;
|
|
6435
6441
|
},
|
|
6436
6442
|
}));
|
package/docs/integrations.md
CHANGED
|
@@ -1027,10 +1027,10 @@ TD 生命周期锁不排他控制外部 tmux 命令/手工进程替换,最终
|
|
|
1027
1027
|
共享升级/业务适配由接入方后续验收;维护侧验证仅覆盖隔离测试的真实 tmux/Linux
|
|
1028
1028
|
进程退出与源码回归。macOS 真实 close 路径尚未实机验收。
|
|
1029
1029
|
|
|
1030
|
-
## 1.4.317:管理员幂等创建空本机组
|
|
1030
|
+
## 1.4.317 / 1.4.318:管理员幂等创建空本机组
|
|
1031
1031
|
|
|
1032
|
-
最低 **CLI / 实际服务均为 1.4.
|
|
1033
|
-
`admin_local_group_create=true`、`admin_local_group_create_min_version=1.4.
|
|
1032
|
+
最低 **CLI / 实际服务均为 1.4.318**,协议仍为 1。管理员回读
|
|
1033
|
+
`admin_local_group_create=true`、`admin_local_group_create_min_version=1.4.318`;
|
|
1034
1034
|
旧服务缺少能力时 CLI 返回 `ADMIN_LOCAL_GROUP_CREATE_UNSUPPORTED`,不回退到终端
|
|
1035
1035
|
成员来源、网页裸 HTTP 或私有文件写入。
|
|
1036
1036
|
|
|
@@ -1060,13 +1060,15 @@ API 名称非法返回 `INVALID_GROUP`,key 非法返回 `INVALID_IDEMPOTENCY_K
|
|
|
1060
1060
|
授权、业务调度或三模型创建。**组创建与后续 principal 授权是两步操作,不是一个事务**。
|
|
1061
1061
|
后者继续遵循已有凭据落盘、唯一 principal ID、固定授权组和拒绝静默替换规则。
|
|
1062
1062
|
|
|
1063
|
+
key在同一服务的管理员入口范围内共享,宿主应使用稳定的业务前缀避免互相碰撞。
|
|
1063
1064
|
同服务存储中,同 key 同参数(名称规范化后)返回原创建快照,包括原 ID、空成员和
|
|
1064
1065
|
原时间;同 key 异参返回 `IDEMPOTENCY_CONFLICT`。之后给原组加入成员或改名,不会改变
|
|
1065
1066
|
创建快照,不能把重试响应的空 `sessionIds` 当作当前成员清单;当前名称可用 groups
|
|
1066
1067
|
回读,成员清单沿现有组管理读接口。HTTP 回执丢失或持久写入结果不明时,保留原 key
|
|
1067
1068
|
和名称重试对账,不要换新 key “再建一个”。
|
|
1068
1069
|
|
|
1069
|
-
|
|
1070
|
+
1.4.318 补齐异常重试:同键回读前再次 durable 提交当前组和原创建记录;目录
|
|
1071
|
+
fsync 持续失败仍返回失败,不以缓存记录冒充成功。文件替换前失败不会提交半个组;替换后 fsync/回执异常可能已经创建,应同键对账。
|
|
1070
1072
|
服务重启保留 key→原快照映射。原组被明确删除、变成跨服务目标或原 ID 已不存在时,
|
|
1071
1073
|
同键返回 `GROUP_CREATE_TARGET_UNAVAILABLE`,不新建替代组;全局清理也保留该 key 的
|
|
1072
1074
|
保留记录。创建 journal 损坏、无法可靠读取或其完整性未确认返回
|
|
@@ -1093,3 +1095,77 @@ consumer、task 或看板任务;Case/组/principal/session/message 映射由
|
|
|
1093
1095
|
即使普通 send 早于实际订阅建立,保留期内的事实也可重放;宿主按 event_id 持久
|
|
1094
1096
|
去重/连续 ACK,并按原 message ID/reply_to 用历史对账明确回复。heartbeat 仅是连接
|
|
1095
1097
|
观测,不表示宿主 inbox 已落盘或业务已完成。
|
|
1098
|
+
|
|
1099
|
+
## 1.4.319:管理员查询与改名本机组
|
|
1100
|
+
|
|
1101
|
+
最低 **CLI / 实际服务均为 1.4.319**,协议仍为 1。回读
|
|
1102
|
+
`admin_local_group_rename=true`、`admin_local_group_rename_min_version=1.4.319`;
|
|
1103
|
+
该能力同时覆盖精确查询、改名及管理员列表的 `updatedAt` 回读。旧服务缺少能力时
|
|
1104
|
+
CLI 返回 `ADMIN_LOCAL_GROUP_RENAME_UNSUPPORTED`,不回退到成员身份、网页接口或私有文件。
|
|
1105
|
+
|
|
1106
|
+
```sh
|
|
1107
|
+
td integration group get <精确group-id>
|
|
1108
|
+
# {"group":{"id":"...","name":"原名称","updatedAt":1790000000000}}
|
|
1109
|
+
td integration group rename <精确group-id> --name '短标题' \
|
|
1110
|
+
--expected-updated-at 1790000000000 --idempotency-key stable-group-rename-key
|
|
1111
|
+
td integration groups # 列表保留id/name,追加updatedAt
|
|
1112
|
+
```
|
|
1113
|
+
|
|
1114
|
+
沿用本机 Unix socket 管理员鉴权,无终端来源、无新 principal 权限。管理路由:
|
|
1115
|
+
`GET /admin/groups/:id`;`POST /admin/groups/:id/rename`,只接受
|
|
1116
|
+
`{name,expected_updated_at,idempotency_key}`。不接受成员、角色、principal、指定新ID、
|
|
1117
|
+
federated 或启动配置。组 ID 必须精确匹配,不解析前缀/名称;仅存活本机组可用。
|
|
1118
|
+
GET 返回最小显示元数据 `{id,name,updatedAt}`,不导出启动配置、成员创建请求或凭据。
|
|
1119
|
+
|
|
1120
|
+
名称与空组创建复用校验:首尾 trim、非空、最多 256 字符,禁止
|
|
1121
|
+
`【】「」`、`·`、C0 控制字符及 DEL。key 非空、最多 256 字符,按原字符串区分并只存
|
|
1122
|
+
哈希。改名 key 在同一管理员服务的 **rename 操作范围**共享,与 create key 独立;
|
|
1123
|
+
建议使用稳定业务前缀。`expected_updated_at` 必须是非负安全整数。
|
|
1124
|
+
|
|
1125
|
+
复用现有组 `updatedAt` 作为并发版本。实际改名严格递增,只有名称相同时是持久记录的
|
|
1126
|
+
no-op,不推进版本。网页或成员/配置变更也可能推进组版本;新请求不匹配当前值返回
|
|
1127
|
+
`GROUP_CHANGED`(409)及 `currentUpdatedAt`,没有改动或成功回执。宿主重新 get、确认
|
|
1128
|
+
当前内容后,再用新版本和新 key 作新的决定;不要静默覆盖刚发生的改动。
|
|
1129
|
+
|
|
1130
|
+
返回两个独立快照,均只有 `{id,name,updatedAt}`:
|
|
1131
|
+
|
|
1132
|
+
```json
|
|
1133
|
+
{
|
|
1134
|
+
"group": {"id":"...","name":"当前名称","updatedAt":1790000000002},
|
|
1135
|
+
"applied": {"id":"...","name":"原操作改成的名称","updatedAt":1790000000001},
|
|
1136
|
+
"replayed": true
|
|
1137
|
+
}
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
首次成功 `replayed=false`,`group` 与 `applied` 相同;同 key、同精确组ID、同规范化名称、
|
|
1141
|
+
同原期望版本重试,`replayed=true`,返回原 `applied` 和 **当前** `group`。以后另有网页或
|
|
1142
|
+
管理员改名,旧键回读不重新执行,不撤销后来的名称/版本。原参数任意改变返回
|
|
1143
|
+
`IDEMPOTENCY_CONFLICT`(409)。原 create 的空组创建快照不变,也不因此创建新组。
|
|
1144
|
+
回执丢失或 fsync 失败时保留原全部参数/key 重试,不换 key 掩盖不确定结果。
|
|
1145
|
+
|
|
1146
|
+
名称/版本与幂等回执在同一个协作存储中 durable 原子提交,包含文件及父目录 fsync。
|
|
1147
|
+
替换前失败回滚;替换后 fsync 失败可能已改名,但不能宣称成功。同键重试再次 durable
|
|
1148
|
+
提交当前存储以确认结果,持续失败仍返回错误;不会第二次推进版本。重启保留原回执。
|
|
1149
|
+
rename journal 完整性不明返回 `GROUP_RENAME_STATE_UNCONFIRMED`,普通写入/全局清理不
|
|
1150
|
+
解除该阻断。最多保留 2,000 条 rename 回执(删除目标的 key 也保留);达到上限新 key
|
|
1151
|
+
返回 `GROUP_RENAME_LIMIT`,已有 key 可回读。没有 TTL/forget;调用者管理保留预算。
|
|
1152
|
+
保证范围仍是同持久存储唯一服务写入,不提供多进程共享文件事务,也不保证旧写入器
|
|
1153
|
+
降级后能保留新 journal。
|
|
1154
|
+
|
|
1155
|
+
新请求目标不存在/删除返回 `GROUP_NOT_FOUND`(404),跨服务组 `GROUP_NOT_LOCAL`
|
|
1156
|
+
(409);已有成功 key 的目标删除/变跨服务后重试 `GROUP_RENAME_TARGET_UNAVAILABLE`
|
|
1157
|
+
(409),不复活或新建替代。非法精确 ID `INVALID_GROUP_ID`,非法名称 `INVALID_GROUP`,
|
|
1158
|
+
非法版本 `INVALID_GROUP_VERSION`,非法 key `INVALID_IDEMPOTENCY_KEY`,多余/错误请求参数
|
|
1159
|
+
`INVALID_GROUP_RENAME_REQUEST`(以上 400)。当前组版本无法可靠读取/递增时
|
|
1160
|
+
`GROUP_STATE_UNCONFIRMED`(409)。存储 IO 失败为 `INTEGRATION_INTERNAL_ERROR`(500),
|
|
1161
|
+
不是成功回执;沿原键对账。
|
|
1162
|
+
|
|
1163
|
+
只修改 `name/updatedAt`;保留组 ID、成员/角色/配置、principal 归属及凭据、
|
|
1164
|
+
TD/native session ID、消息/reply、事件/consumer 历史。没有 Agent 启动/恢复/终端写入、
|
|
1165
|
+
迁组或业务 Case/裁判逻辑。网页组列表与管理员入口读同一个 store,名称通过现有侧栏
|
|
1166
|
+
刷新(定时约 10 秒及焦点刷新)显示,不承诺瞬时推送,也不把名称更新当 Agent 状态。
|
|
1167
|
+
|
|
1168
|
+
验收包含真实临时文件原子替换、file/dir fsync 失败和同键恢复、重启、旧快照回读、
|
|
1169
|
+
并发不同键竞争/同键重放、删除/跨服务、管理员 Unix 路由/CLI 权限及 JSON、网页列表
|
|
1170
|
+
回读和旧网页表单版本冲突。DevBox 业务组及真实 macOS/iOS 显示尚待接入方实机验收,
|
|
1171
|
+
不以源码/模拟回归代替其运行现场。
|
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.319",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-aIgdB+VZkOBFzs7DT4Slt/9Rm5pdM1mMkJXe3/FZxPM=",
|
|
10
|
+
"clientBundleHash": "sha256-WCUoxmf/ziVtU3GXXqX1A7M84gFLPv/RWWFcBBVtcfQ=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|