termdock 1.4.307 → 1.4.309
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-cagV-flM.js → App-ggIA_xqR.js} +6 -6
- package/dist/client/assets/App-ggIA_xqR.js.br +0 -0
- package/dist/client/assets/App-ggIA_xqR.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-TdKPja7L.js → ArchitecturePanel-CoBspW_C.js} +1 -1
- package/dist/client/assets/ArchitecturePanel-CoBspW_C.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CoBspW_C.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DOj40Srm.js → ChangeWalkthroughPanel-D1Puc7B3.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-D1Puc7B3.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-D1Puc7B3.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-C5Tcos5l.js → CollaborationMainWorkspace-BPyK5Xs8.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-CTSJJqze.js +2 -0
- package/dist/client/assets/{ComputerControlView-C2sOFyuA.js → ComputerControlView-D5Lw9sNA.js} +2 -2
- package/dist/client/assets/ComputerControlView-D5Lw9sNA.js.br +0 -0
- package/dist/client/assets/ComputerControlView-D5Lw9sNA.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DFfVJW00.js → DagPlayground-DYJrGfiG.js} +1 -1
- package/dist/client/assets/DagPlayground-DYJrGfiG.js.br +0 -0
- package/dist/client/assets/DagPlayground-DYJrGfiG.js.gz +0 -0
- package/dist/client/assets/{DiffLab-hoj8gwUi.js → DiffLab-5zdcFW3z.js} +1 -1
- package/dist/client/assets/DiffLab-5zdcFW3z.js.br +0 -0
- package/dist/client/assets/DiffLab-5zdcFW3z.js.gz +0 -0
- package/dist/client/assets/{DiffReview-Cn_PmN-9.js → DiffReview-BBBC_NjV.js} +1 -1
- package/dist/client/assets/DiffReview-BBBC_NjV.js.br +0 -0
- package/dist/client/assets/DiffReview-BBBC_NjV.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-DycgD40E.js → DiffReviewLab-CbhosFSB.js} +1 -1
- package/dist/client/assets/DiffReviewLab-CbhosFSB.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CbhosFSB.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-DRnuph7U.js → DiffViewer-BuQwFQ4V.js} +1 -1
- package/dist/client/assets/DiffViewer-BuQwFQ4V.js.br +0 -0
- package/dist/client/assets/DiffViewer-BuQwFQ4V.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-Dvw-UtQQ.js → ModelPreview-nO2VmqdP.js} +1 -1
- package/dist/client/assets/ModelPreview-nO2VmqdP.js.br +0 -0
- package/dist/client/assets/ModelPreview-nO2VmqdP.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-CnnU7Ffp.js → RightSidebar-BoNzpS2K.js} +3 -3
- package/dist/client/assets/RightSidebar-BoNzpS2K.js.br +0 -0
- package/dist/client/assets/{RightSidebar-CnnU7Ffp.js.gz → RightSidebar-BoNzpS2K.js.gz} +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-BQVIT5gD.js → abnfDiagram-VCTEODGH-yi0K8GDG.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-yi0K8GDG.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-yi0K8GDG.js.gz +0 -0
- package/dist/client/assets/{app-CXvK8WZg.js → app-B6FdOF6K.js} +3 -3
- package/dist/client/assets/app-B6FdOF6K.js.br +0 -0
- package/dist/client/assets/app-B6FdOF6K.js.gz +0 -0
- package/dist/client/assets/{arc-DZG1NzUc.js → arc-_nLI_-XZ.js} +1 -1
- package/dist/client/assets/arc-_nLI_-XZ.js.br +0 -0
- package/dist/client/assets/arc-_nLI_-XZ.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-Bv15lJGE.js → architectureDiagram-5GKGNRK7-CikrA78O.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CikrA78O.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CikrA78O.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-DShw-lH7.js → blockDiagram-I7D4REHJ-CWJq6qJ7.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CWJq6qJ7.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CWJq6qJ7.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-BN6SsyOM.js → c4Diagram-7LVT6UL2-gzPzLGvs.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-gzPzLGvs.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-gzPzLGvs.js.gz +0 -0
- package/dist/client/assets/channel-BYsFmOmF.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-BkBkNjv0.js → chunk-2Q5K7J3B-CfX9l18E.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-LrpNvv_o.js → chunk-5VM5RSS4-JSV1yrXM.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BcpMMU4P.js → chunk-F27PBJKO-CQ0LXeap.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CQ0LXeap.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CQ0LXeap.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-cWvd5gJk.js → chunk-IMKFNOWR-CJOEPkK9.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CJOEPkK9.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CJOEPkK9.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-Bf4ORht5.js → chunk-JWPE2WC7-Dpp7Xu_E.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-M5MSHOUM.js → chunk-POPQ4Y6H-9hDa1b8z.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-Bj8gUFc2.js → chunk-SVP7TREG-BskkG9gg.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-BskkG9gg.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BskkG9gg.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-W1cGkC4s.js → chunk-TICWLB2K-DyzuP-9I.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-DyzuP-9I.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DyzuP-9I.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-mXLNbLH8.js → chunk-XXDRQBXY-C31_1i6z.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BnmZv6Ns.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BnmZv6Ns.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-CK0EaMQY.js → cose-bilkent-JH36ORCC-Bm-ESDOc.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bm-ESDOc.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bm-ESDOc.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-C-7tsMpt.js → cynefin-OW5HDTMX-DbFWAPvX.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-DbFWAPvX.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DbFWAPvX.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CijqM5Xa.js → cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-DCLINHGD.js → dagre-GXQ25YYZ-D_5uEMjJ.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-D_5uEMjJ.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-D_5uEMjJ.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-D-JvTWtL.js → diagram-S7CK7UJ4-DWVpndRP.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DWVpndRP.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DWVpndRP.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BT01Oee8.js → diagram-UQ7AKVKN-DmYTya3w.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-DmYTya3w.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DmYTya3w.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-C_j4_Ldm.js → diagram-VSXAHHWV-BEA6kqNj.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-BEA6kqNj.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BEA6kqNj.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DY62ObO9.js → diagram-VX7I27RA-CU9vP0P0.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-CU9vP0P0.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CU9vP0P0.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-TnINooIy.js → diagram-Z3DM3KII-B_GvE2g-.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-B_GvE2g-.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-B_GvE2g-.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-BahaUYTh.js → ebnfDiagram-PWID7BFC-BLrPQuLE.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BLrPQuLE.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BLrPQuLE.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-DNiKhK5j.js → erDiagram-RLTQ6QDP-DlXgoyZ-.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-DlXgoyZ-.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DlXgoyZ-.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-x9c9CGXD.js → flowDiagram-HODETNUW-fPHWxEDZ.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-fPHWxEDZ.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-fPHWxEDZ.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BofL5Lxs.js → ganttDiagram-EL5Y4UJY-B8MOv6ug.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-B8MOv6ug.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-B8MOv6ug.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-Cy5v_ZUL.js → gestureArbiter-JW8vcVRm.js} +1 -1
- package/dist/client/assets/gestureArbiter-JW8vcVRm.js.br +0 -0
- package/dist/client/assets/gestureArbiter-JW8vcVRm.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CHYuiGg1.js → gitGraphDiagram-WWUBYQGX-lH9gSoFx.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lH9gSoFx.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lH9gSoFx.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-mfFgE6OE.js → infoDiagram-27XIBGKW-CSG29Ty_.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CiCmFa95.js → ishikawaDiagram-5VMMS53U-CcwSE5qV.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CcwSE5qV.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CcwSE5qV.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-CVnBzo7n.js → journeyDiagram-3NMN7TZE-CXFUeP2c.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CXFUeP2c.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CXFUeP2c.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-3-zdGxI0.js → kanban-definition-UXKFOSKX-KEHwljd2.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-KEHwljd2.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-KEHwljd2.js.gz +0 -0
- package/dist/client/assets/{layout-DnB4RHWA.js → layout-DqYx0MnO.js} +1 -1
- package/dist/client/assets/layout-DqYx0MnO.js.br +0 -0
- package/dist/client/assets/layout-DqYx0MnO.js.gz +0 -0
- package/dist/client/assets/{linear-B_lli4BL.js → linear-BnG3XaJW.js} +1 -1
- package/dist/client/assets/linear-BnG3XaJW.js.br +0 -0
- package/dist/client/assets/linear-BnG3XaJW.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-ClemZ-kc.js → mermaid.core-Ce00rdM6.js} +5 -5
- package/dist/client/assets/mermaid.core-Ce00rdM6.js.br +0 -0
- package/dist/client/assets/mermaid.core-Ce00rdM6.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-hXDufapN.js → mindmap-definition-YA3MSWOX-D0hOW4SY.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D0hOW4SY.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D0hOW4SY.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-c-hmAGCQ.js → passwordBootstrap-Bncb8qF_.js} +1 -1
- package/dist/client/assets/passwordBootstrap-Bncb8qF_.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Bncb8qF_.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-yb1lAfHR.js → pegDiagram-XKGWAZYB-UKp9t91x.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-UKp9t91x.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-UKp9t91x.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-lVC2DWY_.js → pieDiagram-E7YTZNPT-Dif97wbH.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dif97wbH.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dif97wbH.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CeqeNP5C.js → quadrantDiagram-AXDQQJYC-BPyHtH91.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPyHtH91.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPyHtH91.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-BMEBmjF2.js → railroadDiagram-O6MQD6OU-Wleq9LmS.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Wleq9LmS.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Wleq9LmS.js.gz +0 -0
- package/dist/client/assets/{rdpSession-D77Fs4-L.js → rdpSession-CobFMSUs.js} +1 -1
- package/dist/client/assets/rdpSession-CobFMSUs.js.br +0 -0
- package/dist/client/assets/rdpSession-CobFMSUs.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-xNXQRqYn.js → referenceLongPress-bZ0xp-v2.js} +1 -1
- package/dist/client/assets/referenceLongPress-bZ0xp-v2.js.br +0 -0
- package/dist/client/assets/referenceLongPress-bZ0xp-v2.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CRhmIdDq.js → requirementDiagram-BXWQKSXE-BL4pp0Ta.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BL4pp0Ta.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BL4pp0Ta.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CZZPxGRu.js → sankeyDiagram-P5KCCOFB-CV1cKx37.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CV1cKx37.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CV1cKx37.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CvKYTCaL.js → sequenceDiagram-WJ2MYXX4-BF2InLwV.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BF2InLwV.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BF2InLwV.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-DpMFgVd8.js → sizeCapture-INFHLROL-CldUyStR.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-CldUyStR.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CldUyStR.js.gz +0 -0
- package/dist/client/assets/{sparkles-BBYDWqCu.js → sparkles-Cg-yPdE2.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-BUCKWh69.js → stateDiagram-D77RDMKH-CByehbEd.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-CByehbEd.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CByehbEd.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CTcrJ-w0.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-Du84aO1l.js → swimlanes-42K2YHIH--1_7YTL4.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH--1_7YTL4.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH--1_7YTL4.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-RSMV9AhO.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-94wGyYVM.js → timeline-definition-24CTP7MA-CXfXJFK6.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-CXfXJFK6.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CXfXJFK6.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-BFCgLlxS.js → triangle-alert-CbMRJ6sx.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-C74llwIj.js → vennDiagram-4TSXK5OY-byr6UQpL.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-byr6UQpL.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-byr6UQpL.js.gz +0 -0
- package/dist/client/assets/{videoCompression-b96RKMFE.js → videoCompression-ivJAy00d.js} +1 -1
- package/dist/client/assets/videoCompression-ivJAy00d.js.br +0 -0
- package/dist/client/assets/videoCompression-ivJAy00d.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DVdgFaBs.js → wardleyDiagram-VM6X3IG4-FJduk-7s.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-FJduk-7s.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-FJduk-7s.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BmUxPbqk.js → xychartDiagram-S5SC5T6Z-Ct1fBPFS.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Ct1fBPFS.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Ct1fBPFS.js.gz +0 -0
- package/dist/client/index.html +1 -1
- 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 +77 -17
- package/dist/server/agent/collaborationPrompt.js +3 -1
- package/dist/server/agent/collaborationProtocol.js +1 -1
- package/dist/server/agent/collaborationRoutes.js +7 -1
- package/dist/server/agent/collaborationStore.js +86 -11
- package/dist/server/agent/collaborationTaskService.js +2 -0
- package/dist/server/agent/integrationCli.js +52 -6
- package/dist/server/agent/integrationServer.js +99 -9
- package/dist/server/agent/integrationSessions.js +226 -18
- package/dist/server/agent/integrationStore.js +1 -1
- package/dist/server/agent/sessionLifecycle.js +81 -0
- package/dist/server/agent/sessionResumeConfiguration.js +32 -0
- package/dist/server/cli.js +1 -1
- package/dist/server/routes/terminal.js +75 -1
- package/docs/integrations.md +226 -6
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-cagV-flM.js.br +0 -0
- package/dist/client/assets/App-cagV-flM.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-TdKPja7L.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-TdKPja7L.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DOj40Srm.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DOj40Srm.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-C5Tcos5l.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-C5Tcos5l.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-DQpH2HIj.js +0 -2
- package/dist/client/assets/ComputerControlView-C2sOFyuA.js.br +0 -0
- package/dist/client/assets/ComputerControlView-C2sOFyuA.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DFfVJW00.js.br +0 -0
- package/dist/client/assets/DagPlayground-DFfVJW00.js.gz +0 -0
- package/dist/client/assets/DiffLab-hoj8gwUi.js.br +0 -0
- package/dist/client/assets/DiffLab-hoj8gwUi.js.gz +0 -0
- package/dist/client/assets/DiffReview-Cn_PmN-9.js.br +0 -0
- package/dist/client/assets/DiffReview-Cn_PmN-9.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-DycgD40E.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DycgD40E.js.gz +0 -0
- package/dist/client/assets/DiffViewer-DRnuph7U.js.br +0 -0
- package/dist/client/assets/DiffViewer-DRnuph7U.js.gz +0 -0
- package/dist/client/assets/ModelPreview-Dvw-UtQQ.js.br +0 -0
- package/dist/client/assets/ModelPreview-Dvw-UtQQ.js.gz +0 -0
- package/dist/client/assets/RightSidebar-CnnU7Ffp.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BQVIT5gD.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BQVIT5gD.js.gz +0 -0
- package/dist/client/assets/app-CXvK8WZg.js.br +0 -0
- package/dist/client/assets/app-CXvK8WZg.js.gz +0 -0
- package/dist/client/assets/arc-DZG1NzUc.js.br +0 -0
- package/dist/client/assets/arc-DZG1NzUc.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Bv15lJGE.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Bv15lJGE.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DShw-lH7.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-DShw-lH7.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BN6SsyOM.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BN6SsyOM.js.gz +0 -0
- package/dist/client/assets/channel-YDx-Ycsw.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BcpMMU4P.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BcpMMU4P.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-cWvd5gJk.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-cWvd5gJk.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Bj8gUFc2.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Bj8gUFc2.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-W1cGkC4s.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-W1cGkC4s.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-qeb16N1g.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-qeb16N1g.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CK0EaMQY.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CK0EaMQY.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C-7tsMpt.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C-7tsMpt.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CijqM5Xa.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CijqM5Xa.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DCLINHGD.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DCLINHGD.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D-JvTWtL.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D-JvTWtL.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BT01Oee8.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BT01Oee8.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-C_j4_Ldm.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-C_j4_Ldm.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DY62ObO9.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DY62ObO9.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-TnINooIy.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-TnINooIy.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BahaUYTh.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BahaUYTh.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DNiKhK5j.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DNiKhK5j.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-x9c9CGXD.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-x9c9CGXD.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BofL5Lxs.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BofL5Lxs.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-Cy5v_ZUL.js.br +0 -0
- package/dist/client/assets/gestureArbiter-Cy5v_ZUL.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CHYuiGg1.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CHYuiGg1.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CiCmFa95.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CiCmFa95.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CVnBzo7n.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CVnBzo7n.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-3-zdGxI0.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-3-zdGxI0.js.gz +0 -0
- package/dist/client/assets/layout-DnB4RHWA.js.br +0 -0
- package/dist/client/assets/layout-DnB4RHWA.js.gz +0 -0
- package/dist/client/assets/linear-B_lli4BL.js.br +0 -0
- package/dist/client/assets/linear-B_lli4BL.js.gz +0 -0
- package/dist/client/assets/mermaid.core-ClemZ-kc.js.br +0 -0
- package/dist/client/assets/mermaid.core-ClemZ-kc.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-hXDufapN.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-hXDufapN.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-c-hmAGCQ.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-c-hmAGCQ.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-yb1lAfHR.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-yb1lAfHR.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-lVC2DWY_.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-lVC2DWY_.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CeqeNP5C.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CeqeNP5C.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BMEBmjF2.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BMEBmjF2.js.gz +0 -0
- package/dist/client/assets/rdpSession-D77Fs4-L.js.br +0 -0
- package/dist/client/assets/rdpSession-D77Fs4-L.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-xNXQRqYn.js.br +0 -0
- package/dist/client/assets/referenceLongPress-xNXQRqYn.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CRhmIdDq.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CRhmIdDq.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZZPxGRu.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CZZPxGRu.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CvKYTCaL.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CvKYTCaL.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DpMFgVd8.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DpMFgVd8.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BUCKWh69.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BUCKWh69.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CrhJVriY.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-Du84aO1l.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-Du84aO1l.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-bsc39ya3.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-94wGyYVM.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-94wGyYVM.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-C74llwIj.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-C74llwIj.js.gz +0 -0
- package/dist/client/assets/videoCompression-b96RKMFE.js.br +0 -0
- package/dist/client/assets/videoCompression-b96RKMFE.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DVdgFaBs.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DVdgFaBs.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmUxPbqk.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmUxPbqk.js.gz +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { CollaborationError } from './collaborationProtocol.js';
|
|
4
|
+
const fail = (code, message) => { throw new CollaborationError(code, message, 409); };
|
|
5
|
+
/** Fingerprint only the launcher file and recovery semantics. This does not
|
|
6
|
+
* claim to fingerprint its dependencies, private Agent binaries, or history. */
|
|
7
|
+
export async function resumeConfigurationFingerprint(record, adapter) {
|
|
8
|
+
const semantics = await adapter.resumeConfiguration?.(record);
|
|
9
|
+
if (semantics === undefined)
|
|
10
|
+
fail('EXACT_RESUME_UNSUPPORTED', 'Adapter does not expose exact recovery semantics');
|
|
11
|
+
try {
|
|
12
|
+
const executable = fs.realpathSync(record.profile.executable);
|
|
13
|
+
const before = fs.statSync(executable);
|
|
14
|
+
if (!before.isFile() || before.size > 512 * 1024 * 1024)
|
|
15
|
+
fail('LAUNCHER_UNAVAILABLE', 'Launcher must be a regular file within the fingerprint size limit');
|
|
16
|
+
fs.accessSync(executable, fs.constants.X_OK);
|
|
17
|
+
const hash = createHash('sha256');
|
|
18
|
+
for await (const chunk of fs.createReadStream(executable))
|
|
19
|
+
hash.update(chunk);
|
|
20
|
+
const after = fs.statSync(executable);
|
|
21
|
+
if (before.dev !== after.dev || before.ino !== after.ino || before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs
|
|
22
|
+
|| fs.realpathSync(record.profile.executable) !== executable)
|
|
23
|
+
fail('RESUME_CONFIGURATION_CHANGED', 'Launcher changed while fingerprinting');
|
|
24
|
+
return createHash('sha256').update(JSON.stringify({ version: 1, executable, content: hash.digest('hex'),
|
|
25
|
+
agent: record.agent_slug, argv: record.profile.argv, resumeArgv: record.profile.resumeArgv, cwd: record.cwd, semantics })).digest('hex');
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (error instanceof CollaborationError)
|
|
29
|
+
throw error;
|
|
30
|
+
return fail('LAUNCHER_UNAVAILABLE', 'Recovery launcher could not be read and verified');
|
|
31
|
+
}
|
|
32
|
+
}
|
package/dist/server/cli.js
CHANGED
|
@@ -3489,7 +3489,7 @@ async function main() {
|
|
|
3489
3489
|
}
|
|
3490
3490
|
if (options.integration) {
|
|
3491
3491
|
const argv = options.integration;
|
|
3492
|
-
if (!argv.length ||
|
|
3492
|
+
if (!argv.length || argv.includes('--help') || argv[0] === 'help') {
|
|
3493
3493
|
console.log(INTEGRATION_HELP);
|
|
3494
3494
|
return;
|
|
3495
3495
|
}
|
|
@@ -2,6 +2,8 @@ import { collaborationSessionDisplayName } from '../utils/sessionDisplayName.js'
|
|
|
2
2
|
import { integrationError } from '../agent/integrationStore.js';
|
|
3
3
|
import { assertNativeResumeAvailable, collectNativeResumeOwnerCandidates } from '../agent/nativeResumeOwner.js';
|
|
4
4
|
import { readNativeProcessIdentity } from '../agent/nativeProcessIdentity.js';
|
|
5
|
+
import { releaseSessionRuntime } from '../agent/sessionLifecycle.js';
|
|
6
|
+
import { resumeConfigurationFingerprint } from '../agent/sessionResumeConfiguration.js';
|
|
5
7
|
import { integrationLaunchCommand } from '../agent/integrationSessions.js';
|
|
6
8
|
import { ensureTeam } from '../agent/collaborationTeam.js';
|
|
7
9
|
import { androidRecordings } from '../android/recording.js';
|
|
@@ -39,7 +41,7 @@ import { inspectLinuxInotifyUsage, isWatchResourceExhaustion } from '../utils/fi
|
|
|
39
41
|
import { writeResponseChunk } from '../utils/httpResponse.js';
|
|
40
42
|
import { getFocusSequence, removeClientFocusState, scanFocusTrackingMode, setClientFocusState, } from '../utils/tmuxFocus.js';
|
|
41
43
|
import { extractProgramLabelFromArgs, normalizeProgramName, normalizeTmuxMetadataProgram, selectTmuxForegroundProgram, } from '../utils/tmuxProgramDetection.js';
|
|
42
|
-
import { agentBySlug, buildResumeCommand, detectAgentFromCommand, inferResumeSessionId, getPluginNativeIdentityConfig, listAgents, } from '../agent/registry.js';
|
|
44
|
+
import { agentBySlug, buildResumeCommand, detectAgentFromCommand, inferResumeSessionId, getPluginNativeIdentityConfig, getPluginResumeConfig, listAgents, } from '../agent/registry.js';
|
|
43
45
|
import { applyAgentEvent, agentEventMatchesCurrentAgent, defaultAgentSessionState, parseAgentEvent, } from '../agent/session.js';
|
|
44
46
|
import { canRestoreDeadAgentShell, isConfirmedAgentResumeProcess, normalizePersistedAgentResumeInfo, } from '../agent/resumePersistence.js';
|
|
45
47
|
import { AgentResumeHistoryStore } from '../agent/resumeHistory.js';
|
|
@@ -1861,10 +1863,76 @@ function integrationTerminalRecord(record) {
|
|
|
1861
1863
|
integrationError('SESSION_IDENTITY_MISMATCH', 'Owned TD terminal binding changed', 409);
|
|
1862
1864
|
return terminal;
|
|
1863
1865
|
}
|
|
1866
|
+
async function integrationTmuxPresent(record) {
|
|
1867
|
+
try {
|
|
1868
|
+
await runTmux(['has-session', '-t', `=wt-integration-${record.session_id}`]);
|
|
1869
|
+
return true;
|
|
1870
|
+
}
|
|
1871
|
+
catch (error) {
|
|
1872
|
+
if (/can't find session|no server running|no sessions|error connecting.*No such file/i.test(getErrorMessage(error)))
|
|
1873
|
+
return false;
|
|
1874
|
+
throw error;
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1864
1877
|
export const integrationSessionAdapter = {
|
|
1865
1878
|
subscribe(listener) { integrationSessionObservers.add(listener); return () => { integrationSessionObservers.delete(listener); }; },
|
|
1866
1879
|
registerDeliveryGuard(guard) { integrationDeliveryGuard = guard; return () => { if (integrationDeliveryGuard === guard)
|
|
1867
1880
|
integrationDeliveryGuard = undefined; }; },
|
|
1881
|
+
pendingMessages(id) { return collaborationStore.pendingCount(id); },
|
|
1882
|
+
async prepareRelease(record) {
|
|
1883
|
+
if (collaborationStore.groupsForSession(record.session_id).some(group => group.id !== record.group_id))
|
|
1884
|
+
integrationError('SESSION_SCOPE_CONFLICT', 'Runtime belongs to another collaboration group; administrator must resolve its membership first', 409);
|
|
1885
|
+
return { group_role: collaborationStore.getGroup(record.group_id)?.roles?.[record.session_id] };
|
|
1886
|
+
},
|
|
1887
|
+
async resumeConfiguration(record) {
|
|
1888
|
+
await listDetectedAgentLaunchers();
|
|
1889
|
+
const agent = agentBySlug(record.agent_slug);
|
|
1890
|
+
const command = agent && buildResumeCommand(agent, 'td-fingerprint-native-id', null);
|
|
1891
|
+
if (!agent || !command)
|
|
1892
|
+
integrationError('EXACT_RESUME_UNSUPPORTED', 'Agent must support exact native recovery', 409);
|
|
1893
|
+
return { version: 1, slug: agent.slug, aliases: agent.aliases, capabilities: agent.capabilities ?? [],
|
|
1894
|
+
resume: getPluginResumeConfig(agent.slug) ?? command, nativeIdentity: getPluginNativeIdentityConfig(agent.slug) ?? null };
|
|
1895
|
+
},
|
|
1896
|
+
async runtimePresent(record) {
|
|
1897
|
+
if (integrationTerminalRecord(record))
|
|
1898
|
+
return true;
|
|
1899
|
+
if ([...terminalSessions.values()].some(s => s.mode === 'tmux' && s.tmuxSessionName === `wt-integration-${record.session_id}`))
|
|
1900
|
+
return true;
|
|
1901
|
+
if (collaborationStore.getGroup(record.group_id)?.sessionIds.includes(record.session_id))
|
|
1902
|
+
return true;
|
|
1903
|
+
return integrationTmuxPresent(record);
|
|
1904
|
+
},
|
|
1905
|
+
async release(record, reconcile) {
|
|
1906
|
+
await releaseSessionRuntime({
|
|
1907
|
+
barrier: action => collaborationDeliveryWorker.reconfigure(record.session_id, action),
|
|
1908
|
+
exists: () => integrationTmuxPresent(record),
|
|
1909
|
+
pendingMessages: () => collaborationStore.pendingCount(record.session_id),
|
|
1910
|
+
async verifyOwnership() {
|
|
1911
|
+
await integrationSessionAdapter.prepareRelease(record);
|
|
1912
|
+
const terminal = integrationTerminalRecord(record);
|
|
1913
|
+
if (!terminal || !record.terminal_binding)
|
|
1914
|
+
integrationError('SESSION_IDENTITY_MISMATCH', 'Live runtime lacks its exact persisted binding', 409);
|
|
1915
|
+
if (globalSessionState.sessions.some(other => other.sessionId !== record.session_id && (other.tmuxSessionName === terminal.tmuxSessionName
|
|
1916
|
+
|| terminal.backendSessionId && other.backendSessionId === terminal.backendSessionId)))
|
|
1917
|
+
integrationError('SESSION_IDENTITY_MISMATCH', 'Runtime has another logical owner', 409);
|
|
1918
|
+
},
|
|
1919
|
+
inspect: () => integrationSessionAdapter.inspect(record),
|
|
1920
|
+
destroy: async () => { await destroyTmuxSessionSafely(`wt-integration-${record.session_id}`); },
|
|
1921
|
+
async forgetRuntime() {
|
|
1922
|
+
// Only remove exact owned PTY/inventory records after actual tmux absence.
|
|
1923
|
+
integrationTerminalRecord(record);
|
|
1924
|
+
await integrationSessionAdapter.prepareRelease(record);
|
|
1925
|
+
for (const [id, backend] of terminalSessions)
|
|
1926
|
+
if (backend.mode === 'tmux' && backend.tmuxSessionName === `wt-integration-${record.session_id}`)
|
|
1927
|
+
cleanupSession(id, { killProcess: true });
|
|
1928
|
+
removeGlobalSessionRecord(record.session_id);
|
|
1929
|
+
collaborationStore.archiveSession(record.session_id);
|
|
1930
|
+
collaborationRouting.remove(record.session_id);
|
|
1931
|
+
await persistGlobalStateNow();
|
|
1932
|
+
broadcastClientState();
|
|
1933
|
+
},
|
|
1934
|
+
}, reconcile);
|
|
1935
|
+
},
|
|
1868
1936
|
async capture(record) {
|
|
1869
1937
|
const observed = await integrationSessionAdapter.inspect(record);
|
|
1870
1938
|
if (!observed.exists || !observed.running || observed.agentSlug !== record.agent_slug || !record.terminal_binding
|
|
@@ -2011,12 +2079,18 @@ async function launchIntegrationTerminal(record, restoring, prepared) {
|
|
|
2011
2079
|
if (!latest || latest.deleted)
|
|
2012
2080
|
integrationError('TASK_GROUP_NOT_FOUND', 'Integration group changed', 409);
|
|
2013
2081
|
collaborationStore.save({ id: latest.id, name: latest.name, sessionIds: [...new Set([...latest.sessionIds, record.session_id])] });
|
|
2082
|
+
if (restoring && record.group_role)
|
|
2083
|
+
collaborationStore.setRole({ groupId: latest.id, sessionId: record.session_id, role: record.group_role });
|
|
2014
2084
|
if (restoring)
|
|
2015
2085
|
upsertGlobalSessionRecord({ ...terminal, agentResume: { slug: record.agent_slug, sessionId: record.agent_native_session_id,
|
|
2016
2086
|
launchArgv: [record.profile.executable, ...record.profile.argv], updatedAt: Date.now() } });
|
|
2017
2087
|
await persistGlobalStateNow();
|
|
2018
2088
|
// Recheck the actual pinned shell immediately before writing. This cannot
|
|
2019
2089
|
// use an active-pane target which might have changed during preparation.
|
|
2090
|
+
if (record.resume_configuration_fingerprint && record.resume_configuration_fingerprint !== await resumeConfigurationFingerprint(record, integrationSessionAdapter))
|
|
2091
|
+
integrationError('RESUME_CONFIGURATION_CHANGED', 'Recovery configuration changed before terminal input', 409);
|
|
2092
|
+
if (restoring)
|
|
2093
|
+
await assertIntegrationNativeResumeAvailable(record);
|
|
2020
2094
|
const shell = await inspectCollaborationTmux({ sessionId: record.session_id, backendSessionId: opened.terminalSession.sessionId,
|
|
2021
2095
|
mode: 'tmux', tmuxSessionName: terminal.tmuxSessionName, agentSlug: null, nativeSessionId: null, pane: pinned });
|
|
2022
2096
|
if (shell.state !== 'ready' || !shell.pane || !await integrationPaneIsIdleShell(shell.pane))
|
package/docs/integrations.md
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
**实际运行服务至少 1.4.304**。管理员恢复诊断要求 **CLI / 实际服务均至少 1.4.305**;
|
|
9
9
|
直接 exec 为 pane PID 的原生 argv 核验及可选 Linux 持锁身份要求 **实际服务至少 1.4.306**;
|
|
10
10
|
后台执行记录与用途迁移要求 **CLI / 实际服务均至少 1.4.307**;
|
|
11
|
-
|
|
11
|
+
普通消息身份发送、持久回复及消息历史要求 **CLI / 实际服务均至少 1.4.308**;
|
|
12
|
+
释放运行承载、稳定逻辑身份与恢复配置确认要求 **CLI / 实际服务均至少 1.4.309**;
|
|
13
|
+
建议 CLI 与服务同步安装 1.4.309(既有接入命令的 CLI 最低仍为 1.4.301,诊断 CLI 最低为 1.4.305)。
|
|
12
14
|
现有 `--session`、消息投递、任务报告与自动协作入口继续兼容;旧的
|
|
13
15
|
`task create --integration` 仍表示代码集成子任务,新身份使用 `--principal`。
|
|
14
16
|
|
|
@@ -17,6 +19,90 @@ TD 提供受限身份、持久事件推送、关联咨询回复,以及会话
|
|
|
17
19
|
`complete` 是执行成员的明确交付,`accepted` 是用户明确验收;投递成功、终端快照、
|
|
18
20
|
事件 ACK 都不表示已读、任务完成或业务校验通过。
|
|
19
21
|
|
|
22
|
+
## 普通消息接入(1.4.308,推荐用于机器人与报表)
|
|
23
|
+
|
|
24
|
+
触发 Agent、追问和回帖可使用普通消息:**无需创建 task,不产生任务看板或逐期用户验收**。
|
|
25
|
+
消息负责可靠投递与关联回复;业务周期、结果版本、机器校验、外部发布状态由接入方记录。
|
|
26
|
+
只有需要 TD 任务分派、交付物、评审或人工验收时才使用后文 task;1.4.307 的 automation
|
|
27
|
+
purpose 是可选任务能力,不是机器人接入的前置要求。已有 task/attempt/session 和外部根帖
|
|
28
|
+
保持原记录,不自动迁移、重建、重投或重跑。
|
|
29
|
+
|
|
30
|
+
管理员为现有身份补权限后用 `td integration update --file /private/policy.json`:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
"permissions": ["message.send", "message.read", "events.read", "session.create", "session.read", "session.restore"]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
更新保留同一身份、组和凭据;保留实际需要的既有 task 权限以及原 launchProfiles。
|
|
37
|
+
`message.send` 授权 send/reply,`message.read` 授权组内 message get/list;它们不授予任务操作
|
|
38
|
+
或用户验收。events.read 可订阅授权组内事件。只允许该身份授权的一个本机组,拒绝跨服务目标、
|
|
39
|
+
组外成员、未授权操作与 task envelope。组中其他 principal 的消息可以按组授权读取,但不能
|
|
40
|
+
借其原消息 reply 或冒充其身份;只能向本组成员 send 新消息。
|
|
41
|
+
|
|
42
|
+
先回读实际运行服务,再检查三个能力均为 true:
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
export TERMDOCK_INTEGRATION_CREDENTIAL_FILE=/private/bridge-credential.json
|
|
46
|
+
td collab --principal report-bridge capabilities
|
|
47
|
+
# cli_version / server_version >= 1.4.308, integration_protocol = 1
|
|
48
|
+
# integration_message_send / integration_message_reply / integration_message_history = true
|
|
49
|
+
|
|
50
|
+
td collab --principal report-bridge send <TD成员ID> --file /private/prompt.txt --idempotency-key run:2026-10-10
|
|
51
|
+
# 保存输出 message_id、thread_id;status=pending 表示已持久入队
|
|
52
|
+
# 可附 --source feishu --external-actor '{"id":"external-user"}' --external-message-id <external-id>
|
|
53
|
+
|
|
54
|
+
td collab --principal report-bridge events subscribe --consumer bridge-inbox --jsonl
|
|
55
|
+
# 按 event_id 去重;先将事件落盘,再 ACK 已连续持久接收的位置
|
|
56
|
+
td collab --principal report-bridge events ack <cursor> --consumer bridge-inbox
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
CLI 在发送前检查运行服务 capability;旧服务返回 `INTEGRATION_MESSAGING_UNSUPPORTED`,
|
|
60
|
+
不会降级成用户或终端成员发送。凭据只通过私有文件注入;`--principal <id> --help` 不需要
|
|
61
|
+
凭据或运行服务。建议 CLI 与实际服务保持同一版本,版本号本身不能替代能力检测。
|
|
62
|
+
|
|
63
|
+
接收 Agent 在**原终端**使用明确回复(投递提示每次都附原消息 ID 与此用法):
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
td collab --session <自己的TD成员ID> reply <原消息ID> "收到" --response-kind ack --idempotency-key run:ack
|
|
67
|
+
td collab --session <自己的TD成员ID> reply <原消息ID> --file /private/result.txt --response-kind result --idempotency-key run:result
|
|
68
|
+
# 进展也可 --response-kind progress;不推断 Agent 内部进度或整个会话忙闲
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
回复保存到同一消息历史,`status=stored`、`stored_at`、`delivery.stage=stored`、
|
|
72
|
+
`delivery_semantics=durable_storage`、`delivered_at=null`、`attempt_count=0`;
|
|
73
|
+
不进终端投递队列,不伪造“写入终端”。原 message get/list 记录的 toSessionId 使用内部保留
|
|
74
|
+
地址 principal:<id> 以兼容历史结构,实际接收方由 toPrincipalId 标识;不要把这个地址当作成员 ID。Agent CLI 立即返回这个保存事实,不等待不存在的接收终端。
|
|
75
|
+
原发送的 receipt.result_ids/reply_ids/ack_at 来自明确的关联回复,原消息投递状态独立保留。
|
|
76
|
+
原生会话、结果正文及外部校验仍由实际 Agent/业务方负责;result 不表示用户验收或外部发布成功。
|
|
77
|
+
|
|
78
|
+
`message.reply` 的 payload 包含 `message_id`、`thread_id`、`reply_to`(原消息 ID)、
|
|
79
|
+
`from_session_id`、`to_session_id`(后台回复为 null)、`to_principal_id`、
|
|
80
|
+
`integration_origin`、`response_kind`、`stored_at`、`content`、`metadata`。
|
|
81
|
+
普通消息没有 task_id/attempt_id;不要套用 task 的 to-event/respond。外部话题和结果版本
|
|
82
|
+
用 message_id/thread_id 与 reply_to 关联。外部追问可以回复自己的原发送或收到的 Agent 回复:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
td collab --principal report-bridge reply <原发送ID或Agent回复ID> "解释一下" --idempotency-key followup:external-id
|
|
86
|
+
td collab --principal report-bridge message get <消息ID> --text
|
|
87
|
+
td collab --principal report-bridge message list --thread <话题ID> --limit 50
|
|
88
|
+
td collab --principal report-bridge message list --thread <话题ID> --after-id <上一页next_after_id> --limit 50
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
追问固定回原成员及原 thread,原成员不在授权组时返回 NO_REPLY_TARGET,不悄悄新建会话。
|
|
92
|
+
需要恢复时显式 session restore,仍保留原 native UUID、argv/cwd/包装器与 startupInput 条件。
|
|
93
|
+
命令变更必须给稳定 idempotency-key;同身份/组/key 且相同正文与参数返回同一消息 ID,
|
|
94
|
+
不同 payload 返回 IDEMPOTENCY_CONFLICT。原 Agent 回复另按 principal/成员/key 隔离。
|
|
95
|
+
|
|
96
|
+
消息/回复在成功返回前完成文件 fsync、原子替换和目录 fsync,事件从这些源记录持久生成。
|
|
97
|
+
订阅自动断线重连,从同 consumer 已 ACK 的连续位置重放;收到事件不自动 ACK,也不表示业务
|
|
98
|
+
已经处理。业务 inbox/outbox 按自身持久处理状态重试。事件保留缺口返回 EVENT_RETENTION_GAP
|
|
99
|
+
并停止;需结合仍保留的消息与业务数据库对账后建立新 consumer,不能声称任意历史均可重放。
|
|
100
|
+
message list 按本组 sequence 升序分页,返回 next_after_id/has_more,页还受 2 MiB 字节预算限制;
|
|
101
|
+
只覆盖仍保留的消息(常规历史最多保留 2000 条,pending 和未过期幂等记录另外保护,幂等保留 7 天)。
|
|
102
|
+
after-id 不在本组保留记录中返回 MESSAGE_NOT_FOUND;前缀不唯一返回 MESSAGE_ID_AMBIGUOUS。
|
|
103
|
+
鉴权撤销与权限更新沿用下文错误和重连契约。普通消息 delivered 仍只表示写入终端,不能从快照
|
|
104
|
+
缺少正文推断未消费,更不能因此自动重投已 delivered 消息。
|
|
105
|
+
|
|
20
106
|
## 管理员配置身份
|
|
21
107
|
|
|
22
108
|
接口只监听本机 Unix socket `~/.termdock/integration-<port>.sock`(0600),
|
|
@@ -49,7 +135,7 @@ td integration list
|
|
|
49
135
|
}
|
|
50
136
|
```
|
|
51
137
|
|
|
52
|
-
`launchProfiles`
|
|
138
|
+
`launchProfiles` 可为空(只操作已有消息或任务)。创建会话时只能选择预配 profile 和
|
|
53
139
|
目录,不能传任意命令/参数。`cwd` 必须已存在,真实路径须位于 `cwdRoots` 内;
|
|
54
140
|
符号链接不能逃出目录边界。参数按独立 token 引号转义,控制字符禁止。
|
|
55
141
|
`{cwd}`、`{sessionId}`、`{launchArgs}` 必须是独立参数;恢复模板必须各包含一次
|
|
@@ -302,9 +388,9 @@ task 事件 `event_id` 与任务内事件 ID 一致,`respond.reply_to_event_id
|
|
|
302
388
|
| `task.close/reopen/coordinate/pause/resume/retry/child-update/automation-blocked/review-passed/review-blocked` | `{event}`:保留服务事件的 source 与原文 |
|
|
303
389
|
| `task.result` | `{artifact}`:结果 id、attemptId、actor、content、summary、evidence、createdAt |
|
|
304
390
|
| `task.delivery` | `{delivery}`:任务投递 id、attemptId、messageId、status、deliveredAt、error |
|
|
305
|
-
| `message.queued/message.reply` | `{message_id,thread_id,reply_to,from_session_id,to_session_id,content,metadata}` |
|
|
306
|
-
| `message.delivery` | `{receipt}
|
|
307
|
-
| `session.starting/binding_pending/ready/restoring/failed` | `{session}`:下节公开会话记录,失败包含 error_code |
|
|
391
|
+
| `message.queued/message.reply` | `{message_id,thread_id,reply_to,from_session_id,to_session_id,to_principal_id,integration_origin,response_kind,stored_at,content,metadata}` |
|
|
392
|
+
| `message.delivery` | `{receipt}`:实际入队/远端接收/终端写入/后台回复保存阶段、失败、重试计数与时间,及明确回复 ID;不含快照或已读字段 |
|
|
393
|
+
| `session.starting/binding_pending/ready/restoring/releasing/released/failed` | `{session}`:下节公开会话记录,失败包含 error_code |
|
|
308
394
|
|
|
309
395
|
TD 在源记录提交后触发 journal 及订阅,journal 中的同一事件 ID 在重连重放时保持不变。
|
|
310
396
|
新 consumer 从最早保留事件开始;接入方按 `event_id` 去重,**先持久写入 inbox,
|
|
@@ -353,7 +439,9 @@ agent_native_session_id,state,error_code,cwd,launch_profile,created_at,updated_a
|
|
|
353
439
|
| binding_pending | 实际观察到该 Agent,尚未捕获确切原生 ID |
|
|
354
440
|
| ready | 实际观察到该 Agent 和确切原生 ID;不表示任务空闲/完成 |
|
|
355
441
|
| restoring | 显式恢复意图持久化,等待原 ID 的运行证据 |
|
|
356
|
-
|
|
|
442
|
+
| releasing | 释放意图已落盘;不能接收新投递,尚未证明实际承载回收 |
|
|
443
|
+
| released | 实际进程/PTY/tmux/活动终端登记与本组活动成员已移除;恢复描述保留 |
|
|
444
|
+
| failed | 启动、绑定、身份核验、释放或运行观察失败,详见 error_code |
|
|
357
445
|
|
|
358
446
|
同键同请求返回原 TD ID;已记录但结果不明的启动不会自动重新执行。通常等
|
|
359
447
|
session 事件;get 也会现场核验。120 秒内未形成绑定返回 `SESSION_BINDING_TIMEOUT`。
|
|
@@ -441,6 +529,133 @@ PID、同 ID 拒绝/不同 ID 排除、遗留 owner、错误 start_id/PID、inod
|
|
|
441
529
|
持锁、多个 ID 和 argv 冲突。**私有 TraeX 的 1.4.306 身份接入仍需使用方实机复验**。
|
|
442
530
|
原 `startupInput` 仍独立控制首次写入;核验 native ID 不表示输入初始化完成。
|
|
443
531
|
|
|
532
|
+
### 会话身份与运行承载的生命周期(1.4.309)
|
|
533
|
+
|
|
534
|
+
这项能力把稳定的会话记录与可回收的终端承载分开。TD 保留逻辑 `session_id`、
|
|
535
|
+
原生身份、授权归属、原启动配置和消息关联;terminal/backend/tmux/pane 是可重建的
|
|
536
|
+
运行承载。`released` 不进入活动终端列表,没有常驻 Agent、PTY 或 tmux。
|
|
537
|
+
它不是隐藏的终端,也不表示删除 Agent 原生历史。原生历史仍由 Agent 管理。
|
|
538
|
+
|
|
539
|
+
共享内核 `sessionLifecycle.ts` 提供操作串行、原生身份预留、代次和释放验证协议;
|
|
540
|
+
首批调用者为现有 IntegrationSession/受限 CLI。复用原有持久恢复记录,不新增
|
|
541
|
+
conversation/job/task 或裸 UUID 导入。现有用户关闭、最近关闭列表、任务执行归档
|
|
542
|
+
保持现有行为,本版尚未将它们迁入该协议。principal 是调用权限,不是业务类型。
|
|
543
|
+
|
|
544
|
+
```sh
|
|
545
|
+
# 管理员将 session.release 追加到原身份的 permissions,凭据保持不变。
|
|
546
|
+
td integration update --file /private/path/policy.json
|
|
547
|
+
# 后台从 get 获取当前 generation(不能硬编码,也不能仅沿用旧事件中的代次)。
|
|
548
|
+
td collab --principal report-bridge session get <session-id>
|
|
549
|
+
td collab --principal report-bridge session release <session-id> \
|
|
550
|
+
--generation <current-generation> --idempotency-key <this-release-key>
|
|
551
|
+
# 下一条外部消息先持久接收,显式恢复,再 send/reply。
|
|
552
|
+
td collab --principal report-bridge session restore <session-id> \
|
|
553
|
+
--idempotency-key <this-restore-key>
|
|
554
|
+
td collab --principal report-bridge reply <retained-original-message-id> \
|
|
555
|
+
--file /private/path/followup.txt --idempotency-key <this-message-key>
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
权限:`session.release` 与 `session.restore` 分开授权,`session.read` 用于状态回读。
|
|
559
|
+
必须仍属于原 principal/本机组;没有 `session.release` 的旧身份不会获得该能力。
|
|
560
|
+
运行中 Agent 必须先由调用方明确正常退出;TD 不根据 result、快照、输出间隔或
|
|
561
|
+
忙闲推断代为终止。首版验证固定的单 pane、原 shell PID/前台进程组和纯交互 shell
|
|
562
|
+
参数,没有 Agent 或其它前台工作。shell 中人工输入的未执行文字不属于可靠观测,
|
|
563
|
+
调用方需保证不与人工输入同时操作。无原生 ID、未知进程、进行中的启动/恢复、
|
|
564
|
+
pending 消息或其它组的成员归属均拒绝;不取消 pending、不补投 delivered 正文。
|
|
565
|
+
|
|
566
|
+
新增公开字段:`generation`(旧记录初始为 1)、`runtime_present`(true/false/null)、
|
|
567
|
+
`operation_uncertain`(可选)、`resume_configuration_fingerprint`(可选)。
|
|
568
|
+
`runtime_present=null` 表示观测/操作结果不明,不能解释为零资源;shell 仍存在时
|
|
569
|
+
为 true。成功 `released` 必须 `runtime_present=false,terminal_binding=null,error_code=null`。
|
|
570
|
+
释放保存的原组角色在恢复时重建,组、消息、结果、旧任务不会随释放删除。
|
|
571
|
+
|
|
572
|
+
实际释放和实际恢复在执行前递增 generation;管理员兼容确认也递增,以使旧观察
|
|
573
|
+
失效。已经 released 的新键 release、精确运行中的新键 restore 为无动作回读,保持
|
|
574
|
+
原 operation/generation。release 必须携带 get 返回的当前代次,旧值报
|
|
575
|
+
`SESSION_GENERATION_MISMATCH`;代次不等于消息序号、任务 attempt 或业务周期。
|
|
576
|
+
从本版开始完成的 release/restore 幂等键重放返回**该操作原结果快照**,可能已不是
|
|
577
|
+
当前状态;使用 get 查当前状态。不同参数复用键返回 `IDEMPOTENCY_CONFLICT`,
|
|
578
|
+
下一次实际操作使用新键。若崩溃发生在结果快照提交前,且会话已经进入后续代次,
|
|
579
|
+
旧键返回 OPERATION_OUTCOME_UNCONFIRMED,不把新操作结果冒充旧结果。升级前的旧幂等
|
|
580
|
+
记录仍按兼容规则回读当前状态,不重复执行。
|
|
581
|
+
|
|
582
|
+
同 ID 的生命周期串行;同 Agent/native ID 的验证/启动使用服务内互斥预留,重启后
|
|
583
|
+
持久的未决启动意图也阻挡另一描述启动。同一键的并发请求共用原操作,不启动两份。
|
|
584
|
+
原生身份检查继续使用实际 argv/当前持锁证据;该预留不是独立程序之间的全局原子锁。
|
|
585
|
+
释放先保存意图,再阻断新投递、等待正在进行的投递,重新核验后销毁,最后保存结果。
|
|
586
|
+
落盘失败不先执行回收;回收失败保留描述并报告 failed,不宣称 released。
|
|
587
|
+
|
|
588
|
+
重启对 releasing/不确定记录核验实际承载:已经不存在时可以清理残留登记并收口,
|
|
589
|
+
仍存在时返回 `OPERATION_OUTCOME_UNCONFIRMED`,不会自动杀进程或再启动 Agent。
|
|
590
|
+
调用方读 get/诊断、明确处理现场后,可用当前 generation 和新键再次请求 release。
|
|
591
|
+
Released 记录若出现未授权重建的承载,同样拒绝静默接管。
|
|
592
|
+
`session.releasing/released/restoring/ready/failed` 推送原 operation_id/generation;
|
|
593
|
+
沿用现有 event_id 去重、连续持久接收 ACK、断线重放与保留缺口契约。
|
|
594
|
+
|
|
595
|
+
Released 上 send/reply 返回 `SESSION_RELEASED`,不入队、不隐式启动。恢复重建承载后
|
|
596
|
+
逻辑 ID 不变,原 retained 消息的 reply_to、thread_id 与 principal 关联不需要迁移。
|
|
597
|
+
恢复返回 ready 只证明原生身份,消息仍受本次 startupInput 保护。恢复失败不得静默
|
|
598
|
+
创建另一 UUID、使用 --last,或改走新的业务任务/会话。
|
|
599
|
+
|
|
600
|
+
**历史保留边界不变**:普通消息仍只覆盖保留记录(通常最近 2,000 条及待投递/近期
|
|
601
|
+
幂等保护记录),每组事件仍保留 10,000 条。释放不是无限历史锚点;原消息裁剪后
|
|
602
|
+
reply 返回 `MESSAGE_NOT_FOUND`,不能伪造旧 reply_to。是否用同恢复会话的新普通
|
|
603
|
+
消息作为新咨询锚点由业务方决定,并保留自己的外部历史。没有 forget 或删除原生
|
|
604
|
+
历史接口;用户放弃历史与释放承载是不同操作,原生历史删除不在本版范围。
|
|
605
|
+
|
|
606
|
+
#### 恢复配置兼容性与旧记录初始化
|
|
607
|
+
|
|
608
|
+
新建可精确恢复的记录在启动前保存配置指纹。指纹涵盖当前 launcher 的真实路径、
|
|
609
|
+
文件 SHA-256、原 argv/resumeArgv/cwd、Agent 别名、精确 resume 语义、插件 nativeIdentity
|
|
610
|
+
声明。它不是整个私有 Agent 安装包/包装器依赖/原生历史的备份,也不会检查私有
|
|
611
|
+
会话正文。包装器路径相同不能证明内容相同;文件超过 512 MiB 不支持指纹采集。
|
|
612
|
+
现有不能精确 resume 的插件仍可创建终端,但不因此获得安全释放能力。
|
|
613
|
+
|
|
614
|
+
旧记录未保存历史文件内容,升级时只初始化代次,不自动采集为“历史已验证”。
|
|
615
|
+
第一次 release 前,管理员先读取**当前**指纹,核对原模型/参数/cwd、包装器当前内容
|
|
616
|
+
和插件恢复语义,再明确授权当前配置用于原历史恢复:
|
|
617
|
+
|
|
618
|
+
```sh
|
|
619
|
+
td integration resume-configuration <session-id>
|
|
620
|
+
# 返回 generation, recorded_fingerprint(旧记录为 null), current_fingerprint,
|
|
621
|
+
# confirmation_required。无 shell/PTY/状态改变,不返回文件正文或凭据。
|
|
622
|
+
td integration confirm-resume <session-id> \
|
|
623
|
+
--generation <returned-generation> --fingerprint <current_fingerprint>
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
确认只证明管理员接受当前兼容性,**不证明未知的旧包装器内容**;不改 argv/profile/
|
|
627
|
+
cwd/native UUID/私有程序。后来指纹不一致时明确失败,管理员也可在核对后用上述
|
|
628
|
+
步骤确认新兼容指纹;TD 不暗中迁移模型或参数。正在执行生命周期操作时不允许确认。
|
|
629
|
+
恢复继续使用原 profile 快照;同时按当前授权的 profile/cwdRoots 复核 cwd,撤销或
|
|
630
|
+
缩小授权不被旧快照绕过。插件精确恢复能力消失或身份/启动条件失败仍会拒绝。
|
|
631
|
+
|
|
632
|
+
能力检测:CLI/实际服务均至少 1.4.309,协议 1;服务 capabilities 必须包含
|
|
633
|
+
`session_runtime_release=true,stable_session_identity=true,session_lifecycle_generation=true,
|
|
634
|
+
session_resume_configuration=true,session_lifecycle_min_version="1.4.309"`。
|
|
635
|
+
CLI 对旧服务先检查能力,失败为 `SESSION_RELEASE_UNSUPPORTED`,不发送回收请求。
|
|
636
|
+
本地管理员配置确认同样先探测服务能力。未知或不兼容错误不得转为新会话。
|
|
637
|
+
|
|
638
|
+
| 错误码 | 准确语义及处理 |
|
|
639
|
+
| --- | --- |
|
|
640
|
+
| SESSION_RELEASE_UNSUPPORTED | CLI/实际服务或运行适配器不支持本协议;升级两者 |
|
|
641
|
+
| INVALID_SESSION_GENERATION | 缺少或非法代次;从 get 获取正整数 |
|
|
642
|
+
| SESSION_GENERATION_MISMATCH | 观察已过时;重新读当前记录,不硬改旧请求 |
|
|
643
|
+
| SESSION_STILL_RUNNING | 实际 Agent 仍在运行;不能推断空闲后自动退出 |
|
|
644
|
+
| SESSION_PENDING_MESSAGES | 存在 pending 正文;先明确处理,不清空或重投 |
|
|
645
|
+
| SESSION_OPERATION_IN_PROGRESS | 同 ID 正在操作或原启动未决 |
|
|
646
|
+
| SESSION_NATIVE_OPERATION_IN_PROGRESS | 同原生身份有其它描述的在途/持久未决操作 |
|
|
647
|
+
| SESSION_SCOPE_CONFLICT | 终端还属于其它组;管理员先处理归属 |
|
|
648
|
+
| SESSION_IDENTITY_MISMATCH | 固定终端/pane/PID/布局或 shell 证明不符 |
|
|
649
|
+
| RESUME_CONFIGURATION_UNCONFIRMED | 旧记录缺少兼容确认;管理员核对当前指纹 |
|
|
650
|
+
| RESUME_CONFIGURATION_CHANGED | launcher 内容/路径或插件恢复语义变化;不自动采纳 |
|
|
651
|
+
| OPERATION_OUTCOME_UNCONFIRMED | 释放结果不明或承载重新出现;保留记录并核对 |
|
|
652
|
+
| SESSION_STORAGE_FULL | 恢复记录 journal 超过 64 MiB;停止新增操作并由管理员处理 |
|
|
653
|
+
| SESSION_RELEASE_FAILED | 未分类释放失败;不返回私有异常输出 |
|
|
654
|
+
| SESSION_RELEASED | 消息目标已释放;先显式精确 restore |
|
|
655
|
+
|
|
656
|
+
原有权限/组/目录、幂等、EXACT_RESUME_UNSUPPORTED、原生重复所有者、启动/绑定错误
|
|
657
|
+
继续适用;本节不改变这些错误的保护条件。
|
|
658
|
+
|
|
444
659
|
### 管理员恢复诊断(1.4.305)
|
|
445
660
|
|
|
446
661
|
`capabilities.session_restore_diagnostics=true` 表示服务支持持久恢复诊断。
|
|
@@ -501,6 +716,11 @@ no-op restore 不创建新检查。报告跟随会话保存并可在服务重启
|
|
|
501
716
|
|
|
502
717
|
## 验收边界
|
|
503
718
|
|
|
719
|
+
本版维护机验证:共享释放协议、真实 Unix socket 权限/生命周期事件、零入队拒绝、
|
|
720
|
+
同键并发/旧代次/异常释放/重启对账、配置内容变化与旧记录显式确认、原消息关联;
|
|
721
|
+
隔离真实 tmux 的实际销毁与原逻辑 ID 重建。本机 fixture 不等于私有 TraeX 验收,
|
|
722
|
+
本版真实 TraeX 的零承载→同 UUID→真人原话题往返仍待使用方升级后验证。
|
|
723
|
+
|
|
504
724
|
维护机验证:真实 Unix socket 主动推送/断线重放/撤销、journal 重载与源记录补偿、
|
|
505
725
|
权限与幂等隔离、accepted 上咨询/关联答复、修订后的新结果、原 profile 恢复和
|
|
506
726
|
实际 shell 参数透传。适配器测试不冒充真实 Agent 的原生会话验收。
|
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.309",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-E9GDa4nrCXADRXdyPKufusZt6IcCr4m2mGdx5h34KMQ=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-3rATyPEt6ztAvF1p3T03N1mo2A1qIKkVUePIG0xc53w=",
|
|
10
|
+
"clientBundleHash": "sha256-Yh0fz4oTrM6A2pNHLYx+Y67/R7Wfa84cFlIPMrwAsfE=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{bv as r}from"./app-CXvK8WZg.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-CnnU7Ffp.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-cagV-flM.js";import"./gestureArbiter-Cy5v_ZUL.js";import"./triangle-alert-BFCgLlxS.js";import"./referenceLongPress-xNXQRqYn.js";import"./DiffReview-Cn_PmN-9.js";import"./sparkles-BBYDWqCu.js";import"./DiffViewer-DRnuph7U.js";import"./ChangeWalkthroughPanel-DOj40Srm.js";function v({content:o}){const e=m.useMemo(()=>n(o.split(`
|
|
2
|
-
`),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{v as default};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as a,C as n}from"./mermaid.core-ClemZ-kc.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as t,C as e}from"./chunk-TICWLB2K-W1cGkC4s.js";import{d as i}from"./mermaid.core-ClemZ-kc.js";import"./chunk-5VM5RSS4-LrpNvv_o.js";import"./chunk-XXDRQBXY-mXLNbLH8.js";import"./chunk-POPQ4Y6H-M5MSHOUM.js";import"./chunk-F27PBJKO-BcpMMU4P.js";import"./purify.es-4eNOHKSq.js";import"./app-CXvK8WZg.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as t,C as e}from"./chunk-TICWLB2K-W1cGkC4s.js";import{d as i}from"./mermaid.core-ClemZ-kc.js";import"./chunk-5VM5RSS4-LrpNvv_o.js";import"./chunk-XXDRQBXY-mXLNbLH8.js";import"./chunk-POPQ4Y6H-M5MSHOUM.js";import"./chunk-F27PBJKO-BcpMMU4P.js";import"./purify.es-4eNOHKSq.js";import"./app-CXvK8WZg.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|