termdock 1.4.310 → 1.4.312
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-CytIMrFr.js → App-ChS2-lkz.js} +8 -8
- package/dist/client/assets/App-ChS2-lkz.js.br +0 -0
- package/dist/client/assets/App-ChS2-lkz.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js +9 -0
- package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-Bm9Tvd6H.js → ChangeWalkthroughPanel-BlQ5-VPp.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-BagYBDlJ.js → CollaborationMainWorkspace-aFLAMqDr.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-BDQMRhU9.js +2 -0
- package/dist/client/assets/{ComputerControlView-CC6r2cD3.js → ComputerControlView-TAKDbBUl.js} +2 -2
- package/dist/client/assets/ComputerControlView-TAKDbBUl.js.br +0 -0
- package/dist/client/assets/ComputerControlView-TAKDbBUl.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-BqAadqBT.js → DagPlayground-CR4uDFOx.js} +1 -1
- package/dist/client/assets/DagPlayground-CR4uDFOx.js.br +0 -0
- package/dist/client/assets/DagPlayground-CR4uDFOx.js.gz +0 -0
- package/dist/client/assets/{DiffLab-CrEVLy-j.js → DiffLab-BqeHMDOy.js} +1 -1
- package/dist/client/assets/DiffLab-BqeHMDOy.js.br +0 -0
- package/dist/client/assets/DiffLab-BqeHMDOy.js.gz +0 -0
- package/dist/client/assets/{DiffReview-C8e2GQxb.js → DiffReview-DqrOcRfP.js} +1 -1
- package/dist/client/assets/DiffReview-DqrOcRfP.js.br +0 -0
- package/dist/client/assets/DiffReview-DqrOcRfP.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-RQ1NmpZE.js → DiffReviewLab-CEYpbrL6.js} +1 -1
- package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-KljgMa9h.js → DiffViewer-F-uQSmhG.js} +1 -1
- package/dist/client/assets/DiffViewer-F-uQSmhG.js.br +0 -0
- package/dist/client/assets/DiffViewer-F-uQSmhG.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-B9UR1TR3.js → ModelPreview-KmXFkgij.js} +1 -1
- package/dist/client/assets/ModelPreview-KmXFkgij.js.br +0 -0
- package/dist/client/assets/ModelPreview-KmXFkgij.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-DSH93gN5.js → RightSidebar-VMdXpo4h.js} +3 -3
- package/dist/client/assets/RightSidebar-VMdXpo4h.js.br +0 -0
- package/dist/client/assets/RightSidebar-VMdXpo4h.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-WFUf9n1A.js → abnfDiagram-VCTEODGH-CAMk1C0N.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.gz +0 -0
- package/dist/client/assets/{app-Bey8S6UU.js → app-CHxLSuGQ.js} +3 -3
- package/dist/client/assets/app-CHxLSuGQ.js.br +0 -0
- package/dist/client/assets/app-CHxLSuGQ.js.gz +0 -0
- package/dist/client/assets/{arc-BXKxIsA3.js → arc-CYG_-1vC.js} +1 -1
- package/dist/client/assets/arc-CYG_-1vC.js.br +0 -0
- package/dist/client/assets/arc-CYG_-1vC.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DAfRrSxr.js → architectureDiagram-5GKGNRK7-BqHzezLR.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-1HbSy7rb.js → blockDiagram-I7D4REHJ-D6GWRO_Z.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-Dxwui-M_.js → c4Diagram-7LVT6UL2-CutmGIGb.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.gz +0 -0
- package/dist/client/assets/channel-B3BKM2gg.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CJSdJ_A1.js → chunk-2Q5K7J3B-DwiUpGFu.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BNEXn4bI.js → chunk-5VM5RSS4-C35gLPSH.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BaM6iLMb.js → chunk-F27PBJKO-CNptP19P.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-DxPJBdLq.js → chunk-IMKFNOWR-DHdpB9A0.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BwEOSoiu.js → chunk-JWPE2WC7-CrKSOzdE.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CbYcBz8G.js → chunk-POPQ4Y6H-CiZGLRSk.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-CpnycZ3K.js → chunk-SVP7TREG-B70pX8OB.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-5oWwjAOF.js → chunk-TICWLB2K-Ba1mI99F.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-VWUm4Sz5.js → chunk-XXDRQBXY-DmKIl18h.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-CS4V_MQS.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CS4V_MQS.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-gpF5Tw44.js → cose-bilkent-JH36ORCC-C-NMDUHW.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-HFr7zRQ0.js → cynefin-OW5HDTMX-CZgEc1ab.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-LccKgJj0.js → cynefinDiagram-5FMLGOSQ-CHQeSNm2.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-C7eLk1r1.js → dagre-GXQ25YYZ-B_jkMdPS.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-DkWPZYAg.js → diagram-S7CK7UJ4-nv6Lnsrp.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-DluTsMXz.js → diagram-UQ7AKVKN-BZf2fzaA.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BLXEmXmu.js → diagram-VSXAHHWV-CxL0_BH8.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DO3J99WU.js → diagram-VX7I27RA-Dm9MqpIE.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-kvkSusTy.js → diagram-Z3DM3KII-BIfTa7P5.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-Bxd9hatc.js → ebnfDiagram-PWID7BFC-D4XhCDFS.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-BWc3uM23.js → erDiagram-RLTQ6QDP-Dxd48dXC.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BQhPtc9z.js → flowDiagram-HODETNUW-BXBMsEmE.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-DzmTLgVr.js → ganttDiagram-EL5Y4UJY-CBfDd-KZ.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-BuNZMZ7A.js → gestureArbiter-DXLmNGli.js} +1 -1
- package/dist/client/assets/gestureArbiter-DXLmNGli.js.br +0 -0
- package/dist/client/assets/{gestureArbiter-BuNZMZ7A.js.gz → gestureArbiter-DXLmNGli.js.gz} +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-r0Onfl7K.js → gitGraphDiagram-WWUBYQGX-DtLM68fN.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.gz +0 -0
- package/dist/client/assets/index-KuPaZyuZ.css +1 -0
- package/dist/client/assets/index-KuPaZyuZ.css.br +0 -0
- package/dist/client/assets/{index-C6D5a-dg.css.gz → index-KuPaZyuZ.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-C52jpDzv.js → infoDiagram-27XIBGKW-FRhqdJvW.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-C-l0eHmO.js → ishikawaDiagram-5VMMS53U-DAHBvAZ-.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-DmhgEOjX.js → journeyDiagram-3NMN7TZE-CVuWuL3Z.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-BnZWlxIT.js → kanban-definition-UXKFOSKX-ByQSUVJV.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.gz +0 -0
- package/dist/client/assets/{layout-BrxPpC7u.js → layout-Bb3Nb1c4.js} +1 -1
- package/dist/client/assets/layout-Bb3Nb1c4.js.br +0 -0
- package/dist/client/assets/layout-Bb3Nb1c4.js.gz +0 -0
- package/dist/client/assets/{linear-DaEpqVcH.js → linear-DHMMQlOo.js} +1 -1
- package/dist/client/assets/linear-DHMMQlOo.js.br +0 -0
- package/dist/client/assets/linear-DHMMQlOo.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-CidoOS12.js → mermaid.core-BYfniK0H.js} +5 -5
- package/dist/client/assets/mermaid.core-BYfniK0H.js.br +0 -0
- package/dist/client/assets/mermaid.core-BYfniK0H.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-Bpr3CVLy.js → mindmap-definition-YA3MSWOX-EDLD5AyH.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-D7hFrc0r.js → passwordBootstrap-DCrtirwT.js} +1 -1
- package/dist/client/assets/passwordBootstrap-DCrtirwT.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-DCrtirwT.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-Bw2JpSYn.js → pegDiagram-XKGWAZYB-BHYhkqJN.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-BaKc3ifQ.js → pieDiagram-E7YTZNPT-BUIJlswC.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-B0Yi-dl9.js → quadrantDiagram-AXDQQJYC-D8Im-7yC.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-DCcCQofU.js → railroadDiagram-O6MQD6OU-D7n6z2G1.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.gz +0 -0
- package/dist/client/assets/{rdpSession-DY81W5BY.js → rdpSession-DJlNIbVk.js} +1 -1
- package/dist/client/assets/rdpSession-DJlNIbVk.js.br +0 -0
- package/dist/client/assets/rdpSession-DJlNIbVk.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-CAzWqXsY.js → referenceLongPress-DFSrssSr.js} +1 -1
- package/dist/client/assets/referenceLongPress-DFSrssSr.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DFSrssSr.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CEJFRPWH.js → requirementDiagram-BXWQKSXE-Ki0rR-F7.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Ki0rR-F7.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Ki0rR-F7.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-B3Wk45FA.js → sankeyDiagram-P5KCCOFB-36NmMqsW.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BejEsITb.js → sequenceDiagram-WJ2MYXX4-5vsPuFyO.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-DZ5NJZnM.js → sizeCapture-INFHLROL-DbAulwBg.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.gz +0 -0
- package/dist/client/assets/{sparkles-DQGLdN2b.js → sparkles-CapLTKAs.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-D8SSEwHa.js → stateDiagram-D77RDMKH-Bgwe0g5S.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bg6S3Zm0.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-Dow-EKMG.js → swimlanes-42K2YHIH-COGAWe-g.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DwBBOocG.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-DpQ9D5f6.js → timeline-definition-24CTP7MA-C4gt5z68.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-C4gt5z68.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-C4gt5z68.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-Bdf_dBch.js → triangle-alert-xPHw25jD.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DoemAmM2.js → vennDiagram-4TSXK5OY-CIEXh9oD.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.gz +0 -0
- package/dist/client/assets/{videoCompression-Bg4gUQUf.js → videoCompression-CUkCS2-q.js} +1 -1
- package/dist/client/assets/videoCompression-CUkCS2-q.js.br +0 -0
- package/dist/client/assets/videoCompression-CUkCS2-q.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-MernEZ54.js → wardleyDiagram-VM6X3IG4-gQhcW1vd.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CzO3HEHD.js → xychartDiagram-S5SC5T6Z-BmIcdejz.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.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/agentLaunchCheck.js +22 -0
- package/dist/server/agent/collaborationCli.js +15 -4
- package/dist/server/agent/collaborationDeliveryWorker.js +3 -97
- package/dist/server/agent/collaborationTmuxDelivery.js +23 -51
- package/dist/server/agent/integrationServer.js +1 -0
- package/dist/server/agent/promptDelivery.js +20 -7
- package/dist/server/architecture/cli.js +30 -5
- package/dist/server/architecture/document.js +4 -4
- package/dist/server/architecture/documentDiff.js +5 -0
- package/dist/server/routes/terminal.js +103 -30
- package/docs/integrations.md +20 -1
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-CytIMrFr.js.br +0 -0
- package/dist/client/assets/App-CytIMrFr.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js +0 -9
- package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-D7LXylWr.js +0 -2
- package/dist/client/assets/ComputerControlView-CC6r2cD3.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CC6r2cD3.js.gz +0 -0
- package/dist/client/assets/DagPlayground-BqAadqBT.js.br +0 -0
- package/dist/client/assets/DagPlayground-BqAadqBT.js.gz +0 -0
- package/dist/client/assets/DiffLab-CrEVLy-j.js.br +0 -0
- package/dist/client/assets/DiffLab-CrEVLy-j.js.gz +0 -0
- package/dist/client/assets/DiffReview-C8e2GQxb.js.br +0 -0
- package/dist/client/assets/DiffReview-C8e2GQxb.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.gz +0 -0
- package/dist/client/assets/DiffViewer-KljgMa9h.js.br +0 -0
- package/dist/client/assets/DiffViewer-KljgMa9h.js.gz +0 -0
- package/dist/client/assets/ModelPreview-B9UR1TR3.js.br +0 -0
- package/dist/client/assets/ModelPreview-B9UR1TR3.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DSH93gN5.js.br +0 -0
- package/dist/client/assets/RightSidebar-DSH93gN5.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.gz +0 -0
- package/dist/client/assets/app-Bey8S6UU.js.br +0 -0
- package/dist/client/assets/app-Bey8S6UU.js.gz +0 -0
- package/dist/client/assets/arc-BXKxIsA3.js.br +0 -0
- package/dist/client/assets/arc-BXKxIsA3.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.gz +0 -0
- package/dist/client/assets/channel-Dkh0SMv-.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DqvmSdwt.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DqvmSdwt.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-BuNZMZ7A.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.gz +0 -0
- package/dist/client/assets/index-C6D5a-dg.css +0 -1
- package/dist/client/assets/index-C6D5a-dg.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.gz +0 -0
- package/dist/client/assets/layout-BrxPpC7u.js.br +0 -0
- package/dist/client/assets/layout-BrxPpC7u.js.gz +0 -0
- package/dist/client/assets/linear-DaEpqVcH.js.br +0 -0
- package/dist/client/assets/linear-DaEpqVcH.js.gz +0 -0
- package/dist/client/assets/mermaid.core-CidoOS12.js.br +0 -0
- package/dist/client/assets/mermaid.core-CidoOS12.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.gz +0 -0
- package/dist/client/assets/rdpSession-DY81W5BY.js.br +0 -0
- package/dist/client/assets/rdpSession-DY81W5BY.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-CAzWqXsY.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CAzWqXsY.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-D1KQOetv.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DQbZCzq9.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.gz +0 -0
- package/dist/client/assets/videoCompression-Bg4gUQUf.js.br +0 -0
- package/dist/client/assets/videoCompression-Bg4gUQUf.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.gz +0 -0
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import { collaborationMessageAnchorTokens } from './collaborationPrompt.js';
|
|
2
1
|
export class CollaborationDeliveryWorker {
|
|
3
2
|
options;
|
|
4
3
|
running = new Map();
|
|
5
4
|
states = new Map();
|
|
6
5
|
failures = new Map();
|
|
7
6
|
submitted = new Set();
|
|
8
|
-
/** Sessions whose latest delivery was confirmed rendered in this process,
|
|
9
|
-
* mapped to the timestamp until which confirmations are skipped. A recent
|
|
10
|
-
* confirmed delivery means the agent is actively consuming input, so
|
|
11
|
-
* follow-up messages settle immediately; once the cooldown lapses the
|
|
12
|
-
* agent's state is unknown again (it may be mid-turn, or finishing one)
|
|
13
|
-
* and the gate re-engages. Settled-but-unconfirmed deliveries never grant
|
|
14
|
-
* cooldown — that would re-open the turn-handover hole the gate closes. */
|
|
15
|
-
confirmedUntil = new Map();
|
|
16
7
|
timer = null;
|
|
17
8
|
ticking = null;
|
|
18
9
|
constructor(options) {
|
|
@@ -131,34 +122,6 @@ export class CollaborationDeliveryWorker {
|
|
|
131
122
|
return;
|
|
132
123
|
}
|
|
133
124
|
const attempts = store.diagnostic(message.id)?.attempt_count ?? 0;
|
|
134
|
-
// Confirm gate: the route becoming ready only proves the agent process is
|
|
135
|
-
// up, not that its TUI is consuming — a write landing while the agent
|
|
136
|
-
// finishes another turn can sit unsubmitted in its input box. When the
|
|
137
|
-
// route can read terminal history, watch for our message to appear there
|
|
138
|
-
// (the agent rendered it) and, while it is missing, try the recovery
|
|
139
|
-
// ladder: submit a paste left unsubmitted in the input box, dismiss a
|
|
140
|
-
// blocking approval dialog.
|
|
141
|
-
//
|
|
142
|
-
// The gate never re-writes the body. A successful write already put the
|
|
143
|
-
// bytes in the pty; a busy agent that has not echoed them yet is a
|
|
144
|
-
// diagnosis, not a lost message, and re-writing would deliver the body
|
|
145
|
-
// again the moment it does catch up (that is how one user message arrived
|
|
146
|
-
// as three copies). Only a write that throws is treated as a failed
|
|
147
|
-
// delivery and retried — that path is unchanged.
|
|
148
|
-
const confirmMs = this.options.firstDeliveryConfirmMs ?? 1_500;
|
|
149
|
-
const gateActive = !route.isShell && Boolean(route.confirm) && confirmMs > 0
|
|
150
|
-
&& Date.now() >= (this.confirmedUntil.get(id) ?? 0);
|
|
151
|
-
// Differential baseline for stuck-paste recovery: captured before the
|
|
152
|
-
// write so a later screen diff can tell our paste apart from stale ones.
|
|
153
|
-
let baseline = '';
|
|
154
|
-
if (gateActive && route.recoverStuck && !this.submitted.has(message.id) && route.capture) {
|
|
155
|
-
try {
|
|
156
|
-
baseline = (await route.capture()) ?? '';
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
baseline = '';
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
125
|
if (!this.submitted.has(message.id)) {
|
|
163
126
|
store.recordTransport(message.id, {
|
|
164
127
|
relay_online: null, peer_reachable: true,
|
|
@@ -190,75 +153,18 @@ export class CollaborationDeliveryWorker {
|
|
|
190
153
|
catch { /* best-effort */ }
|
|
191
154
|
}
|
|
192
155
|
}
|
|
193
|
-
if (gateActive) {
|
|
194
|
-
const confirmed = await this.confirmConsumed(pending, route, confirmMs, baseline, collaborationMessageAnchorTokens(pending));
|
|
195
|
-
// Confirmed rendered: refresh the exemption window so follow-ups in the
|
|
196
|
-
// agent's active turn settle immediately.
|
|
197
|
-
if (confirmed)
|
|
198
|
-
this.confirmedUntil.set(id, Date.now() + (this.options.confirmCooldownMs ?? 30_000));
|
|
199
|
-
// Either way the delivery settles here: the bytes are in the pty, and an
|
|
200
|
-
// unconfirmed one keeps that diagnosis for the sender instead of
|
|
201
|
-
// re-queuing a body that already arrived.
|
|
202
|
-
this.complete(id, message, confirmed ? null : 'AGENT_CONSUME_UNCONFIRMED');
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
156
|
// If persistence fails after writing, the in-process guard avoids a
|
|
206
157
|
// second write on retry. Across a crash, transport is at-least-once.
|
|
207
158
|
this.complete(id, message);
|
|
208
159
|
}
|
|
209
|
-
/**
|
|
210
|
-
|
|
211
|
-
* agent and counts as consumed. While the agent is blocked on an approval
|
|
212
|
-
* dialog (its Bash call needs permission) dismiss it once per cycle, and
|
|
213
|
-
* on the first cycle submit a paste that arrived during turn handover and
|
|
214
|
-
* is still sitting unsubmitted (differential baseline evidence only, at
|
|
215
|
-
* most once per delivery). Each recovery sends Enter on evidence, never
|
|
216
|
-
* blind. */
|
|
217
|
-
async confirmConsumed(messages, route, delayMs, baseline, tokens) {
|
|
218
|
-
let recovered = false;
|
|
219
|
-
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
220
|
-
await new Promise((resolve) => setTimeout(resolve, attempt === 0 ? delayMs : Math.min(1_200, delayMs)));
|
|
221
|
-
let content = null;
|
|
222
|
-
try {
|
|
223
|
-
content = await route.confirm();
|
|
224
|
-
}
|
|
225
|
-
catch {
|
|
226
|
-
content = null;
|
|
227
|
-
}
|
|
228
|
-
// Search the same token the formatter wrote into the delivered text:
|
|
229
|
-
// short ids in the terminal, full ids in `messages`. Deriving it here
|
|
230
|
-
// rather than reusing a literal is what keeps the two sides from
|
|
231
|
-
// drifting apart — a text that carries a token the gate does not search
|
|
232
|
-
// can never confirm, and the delivery is re-written to the bound.
|
|
233
|
-
if (content && messages.some((message) => content.includes(tokens.get(message.id) ?? message.id)))
|
|
234
|
-
return true;
|
|
235
|
-
if (!recovered && route.recoverStuck && baseline) {
|
|
236
|
-
try {
|
|
237
|
-
recovered = await route.recoverStuck(baseline);
|
|
238
|
-
}
|
|
239
|
-
catch { /* a failed submit must not settle delivery */ }
|
|
240
|
-
}
|
|
241
|
-
if (content && route.approve) {
|
|
242
|
-
try {
|
|
243
|
-
await route.approve();
|
|
244
|
-
}
|
|
245
|
-
catch { /* a failed dismiss must not settle delivery */ }
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
/** Settle a delivery as delivered. `unconfirmedReason`, when set, is a
|
|
251
|
-
* diagnosis that survives the settle: the write reached the pty (there is
|
|
252
|
-
* nothing more a retry may do) but the recipient never showed it, so the
|
|
253
|
-
* sender can still see why. Never re-queues — that is what would wedge the
|
|
254
|
-
* queue and duplicate the body. */
|
|
255
|
-
complete(id, message, unconfirmedReason = null) {
|
|
160
|
+
/** Delivery records terminal writes only; Agent replies are separate. */
|
|
161
|
+
complete(id, message) {
|
|
256
162
|
const { store } = this.options;
|
|
257
163
|
store.markDelivered([message.id]);
|
|
258
164
|
this.submitted.delete(message.id);
|
|
259
165
|
store.recordTransport(message.id, {
|
|
260
166
|
relay_online: null, peer_reachable: true, attempt_count: store.diagnostic(message.id)?.attempt_count ?? 1,
|
|
261
|
-
next_retry_at: null, last_error:
|
|
167
|
+
next_retry_at: null, last_error: null, checked_at: Date.now(),
|
|
262
168
|
});
|
|
263
169
|
this.failures.delete(id);
|
|
264
170
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { plainCollaborationSnapshot } from './collaborationText.js';
|
|
2
|
-
import { normalizePromptForPaste } from './promptDelivery.js';
|
|
2
|
+
import { normalizePromptForPaste, waitForPromptSubmit } from './promptDelivery.js';
|
|
3
3
|
const TMUX_KEY_NAMES = {
|
|
4
4
|
enter: 'Enter', escape: 'Escape', space: 'Space', left: 'Left', right: 'Right', up: 'Up', down: 'Down',
|
|
5
5
|
};
|
|
@@ -19,26 +19,9 @@ const APPROVAL_DIALOG_PATTERNS = [
|
|
|
19
19
|
/\b1\.\s*是\b/,
|
|
20
20
|
/允许.*执行|确认.*执行/i,
|
|
21
21
|
];
|
|
22
|
-
/** Agent TUIs collapse pasted input in the input box to a marker line like
|
|
23
|
-
* "[Pasted text #3 +42 lines]". While the paste sits unsubmitted the marker
|
|
24
|
-
* stays on screen; a submitted paste clears the box and only the transcript
|
|
25
|
-
* holds the content. Session-unique #N lets us diff screen captures. */
|
|
26
|
-
const PASTE_MARKER_PATTERN = /\[Pasted text #(\d+)/g;
|
|
27
22
|
export function detectApprovalDialog(content) {
|
|
28
23
|
return APPROVAL_DIALOG_PATTERNS.some((pattern) => pattern.test(content));
|
|
29
24
|
}
|
|
30
|
-
/** Paste marker sequence numbers visible in a screen capture. */
|
|
31
|
-
export function extractPasteMarkerNumbers(content) {
|
|
32
|
-
return new Set([...content.matchAll(PASTE_MARKER_PATTERN)].map((match) => Number(match[1])));
|
|
33
|
-
}
|
|
34
|
-
/** True when `after` shows a paste marker that was not in `before`. Diffing
|
|
35
|
-
* prevents a recovery Enter from submitting a stale paste that predates this
|
|
36
|
-
* delivery (or someone else's draft): we only ever submit what we just put
|
|
37
|
-
* there, at most once per delivery. */
|
|
38
|
-
export function hasNewPasteMarker(after, before) {
|
|
39
|
-
const beforeNumbers = extractPasteMarkerNumbers(before);
|
|
40
|
-
return [...extractPasteMarkerNumbers(after)].some((number) => !beforeNumbers.has(number));
|
|
41
|
-
}
|
|
42
25
|
async function assertSamePane(run, pane) {
|
|
43
26
|
const identity = (await run(['display-message', '-p', '-t', pane.paneId,
|
|
44
27
|
'#{pid}:#{session_id}:#{pane_id}:#{pane_pid}'])).trim();
|
|
@@ -48,15 +31,19 @@ async function assertSamePane(run, pane) {
|
|
|
48
31
|
/** Unique-per-process buffer name so concurrent deliveries to different panes
|
|
49
32
|
* never share (or clobber) a buffer. */
|
|
50
33
|
let bufferSequence = 0;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
34
|
+
const paneWrites = new Map();
|
|
35
|
+
/** Serialize TD paste/submit pairs for this exact runtime pane. */
|
|
36
|
+
export function writeCollaborationTmuxPane(run, pane, prompt, stdin) {
|
|
37
|
+
const key = `${pane.serverPid}:${pane.sessionId}:${pane.paneId}:${pane.panePid}`;
|
|
38
|
+
const previous = paneWrites.get(key) ?? Promise.resolve();
|
|
39
|
+
const operation = previous.catch(() => undefined).then(() => writeTmuxPrompt(run, pane, prompt, stdin))
|
|
40
|
+
.finally(() => { if (paneWrites.get(key) === operation)
|
|
41
|
+
paneWrites.delete(key); });
|
|
42
|
+
paneWrites.set(key, operation);
|
|
43
|
+
return operation;
|
|
44
|
+
}
|
|
45
|
+
async function writeTmuxPrompt(run, pane, prompt,
|
|
46
|
+
/** Body travels on stdin so tmux cannot parse its semicolons/backslashes. */
|
|
60
47
|
stdin) {
|
|
61
48
|
await assertSamePane(run, pane);
|
|
62
49
|
// A fixed pane target is independent of the current window, keyboard focus
|
|
@@ -77,13 +64,8 @@ stdin) {
|
|
|
77
64
|
// every tmux version.
|
|
78
65
|
const buffer = `termdock-collab-${process.pid}-${bufferSequence++}`;
|
|
79
66
|
try {
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
// client's paste can interleave between our text and our submit CR
|
|
83
|
-
// (measured: one contiguous block, 0ms apart, versus two invocations
|
|
84
|
-
// ~14ms apart). A failing step stops the rest — verified on 3.4 and 3.7 —
|
|
85
|
-
// which is the safe direction: a failed text paste is never followed by a
|
|
86
|
-
// bare CR into whatever the input box already held.
|
|
67
|
+
// Paste once, then send one unbracketed CR after 50ms. No screen parsing,
|
|
68
|
+
// Agent-specific recovery, consumption confirmation or additional Enter.
|
|
87
69
|
await stdin([
|
|
88
70
|
// The body arrives on stdin, not argv: it is user content, and in a
|
|
89
71
|
// `\;` chain argv is a language where `;` and `\` mean something.
|
|
@@ -91,13 +73,17 @@ stdin) {
|
|
|
91
73
|
// -r keeps LF as LF rather than the separator default of CR. The
|
|
92
74
|
// normalizer already folded every line break to CR, so no LF is left
|
|
93
75
|
// for it to rewrite — the flag is insurance, not the mechanism.
|
|
94
|
-
'paste-buffer', '-p', '-r', '-d', '-b', buffer, '-t', pane.paneId,
|
|
76
|
+
'paste-buffer', '-p', '-r', '-d', '-b', buffer, '-t', pane.paneId,
|
|
77
|
+
], normalizePromptForPaste(prompt));
|
|
78
|
+
await waitForPromptSubmit();
|
|
79
|
+
await assertSamePane(run, pane);
|
|
80
|
+
await run([
|
|
95
81
|
// The submit key rides outside the paste block: inside it, an editor
|
|
96
82
|
// inserts a pasted CR as text instead of acting on it. Pasting the bare
|
|
97
83
|
// CR (no -p) keeps the key in the same mode-proof channel as the text.
|
|
98
84
|
'set-buffer', '-b', buffer, '--', '\r', ';',
|
|
99
85
|
'paste-buffer', '-d', '-b', buffer, '-t', pane.paneId,
|
|
100
|
-
]
|
|
86
|
+
]);
|
|
101
87
|
}
|
|
102
88
|
finally {
|
|
103
89
|
// -d consumed the buffer on the happy path; this sweeps up after a failed
|
|
@@ -139,21 +125,7 @@ export async function approveCollaborationDialog(run, pane) {
|
|
|
139
125
|
await sendTmuxPaneKey(run, pane, 'enter');
|
|
140
126
|
return true;
|
|
141
127
|
}
|
|
142
|
-
/**
|
|
143
|
-
* turn and is still sitting unsubmitted in the input box. Only acts on
|
|
144
|
-
* differential evidence — a paste marker that appeared after the write —
|
|
145
|
-
* never on pre-existing stale markers, and returns whether Enter was sent.
|
|
146
|
-
* Committing the whole input buffer is safe: each delivery is written once,
|
|
147
|
-
* so each marker's content enters the transcript exactly once. */
|
|
148
|
-
export async function recoverStuckPaste(run, pane, baseline) {
|
|
149
|
-
const viewport = await captureTmuxPaneText(run, pane);
|
|
150
|
-
if (!hasNewPasteMarker(viewport, baseline))
|
|
151
|
-
return false;
|
|
152
|
-
await sendTmuxPaneKey(run, pane, 'enter');
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
/** History-inclusive pane text (scrollback + viewport) used to confirm a
|
|
156
|
-
* delivery was actually rendered by the agent, not wiped by a boot clear. */
|
|
128
|
+
/** History-inclusive terminal observation, without inferring consumption. */
|
|
157
129
|
export async function captureTmuxPaneHistory(run, pane, lines = 800, rawOutput = false) {
|
|
158
130
|
await assertSamePane(run, pane);
|
|
159
131
|
if (!Number.isInteger(lines) || lines < 1 || lines > 10000)
|
|
@@ -224,6 +224,7 @@ export class IntegrationRuntime {
|
|
|
224
224
|
startup_input_conditions: true, session_runtime_release: true, stable_session_identity: true, session_lifecycle_generation: true,
|
|
225
225
|
session_resume_configuration: true, session_lifecycle_min_version: '1.4.309',
|
|
226
226
|
session_startup_input_clear: true, session_startup_input_clear_min_version: '1.4.310',
|
|
227
|
+
agent_launch_process_check: true, agent_launch_process_check_min_version: '1.4.312',
|
|
227
228
|
integration_policy_update: true,
|
|
228
229
|
session_restore_diagnostics: true,
|
|
229
230
|
native_identity_linux_flock_owner: process.platform === 'linux',
|
|
@@ -8,13 +8,26 @@
|
|
|
8
8
|
export function normalizePromptForPaste(prompt) {
|
|
9
9
|
return prompt.replace(/\r\n|\r|\n/g, '\r').replace(/\x1b/g, '␛');
|
|
10
10
|
}
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export function
|
|
17
|
-
return `\x1b[200~${normalizePromptForPaste(prompt)}\x1b[201
|
|
11
|
+
/** Separate the paste and its single unbracketed CR by 50ms. */
|
|
12
|
+
export const PROMPT_SUBMIT_DELAY_MS = 50;
|
|
13
|
+
export function waitForPromptSubmit() {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve, PROMPT_SUBMIT_DELAY_MS));
|
|
15
|
+
}
|
|
16
|
+
export function buildBracketedPasteBytes(prompt) {
|
|
17
|
+
return `\x1b[200~${normalizePromptForPaste(prompt)}\x1b[201~`;
|
|
18
|
+
}
|
|
19
|
+
const promptWrites = new WeakMap();
|
|
20
|
+
/** Serialize TD prompt pairs per PTY. Success only records terminal writes. */
|
|
21
|
+
export function writeBracketedPrompt(target, prompt) {
|
|
22
|
+
const previous = promptWrites.get(target) ?? Promise.resolve();
|
|
23
|
+
const operation = previous.catch(() => undefined).then(async () => {
|
|
24
|
+
target.write(buildBracketedPasteBytes(prompt));
|
|
25
|
+
await waitForPromptSubmit();
|
|
26
|
+
target.write('\r');
|
|
27
|
+
}).finally(() => { if (promptWrites.get(target) === operation)
|
|
28
|
+
promptWrites.delete(target); });
|
|
29
|
+
promptWrites.set(target, operation);
|
|
30
|
+
return operation;
|
|
18
31
|
}
|
|
19
32
|
/**
|
|
20
33
|
* Process detection and hook events are independent Agent signals. A target is
|
|
@@ -29,6 +29,19 @@ Fields: description, diagram, context, constraint, concern, todo, note.
|
|
|
29
29
|
Examples: td architecture prompt --project .
|
|
30
30
|
td architecture write --format omm overall-architecture/auth description -
|
|
31
31
|
td architecture save --file .termdock/architecture.json -`;
|
|
32
|
+
function elementPath(view, node) {
|
|
33
|
+
if (!node)
|
|
34
|
+
return view.id;
|
|
35
|
+
if (node.documentPath)
|
|
36
|
+
return node.documentPath;
|
|
37
|
+
const parts = [node.id];
|
|
38
|
+
let parent = node.parentId;
|
|
39
|
+
while (parent) {
|
|
40
|
+
parts.unshift(parent);
|
|
41
|
+
parent = view.nodes.find(item => item.id === parent)?.parentId;
|
|
42
|
+
}
|
|
43
|
+
return [view.id, ...parts].join('/');
|
|
44
|
+
}
|
|
32
45
|
function target(document, element) {
|
|
33
46
|
const [perspective, ...parts] = element.split('/');
|
|
34
47
|
const view = document.perspectives.find(view => view.id === perspective);
|
|
@@ -78,10 +91,14 @@ export async function runArchitectureCli(args, io = { write: value => process.st
|
|
|
78
91
|
if (options.format && !['native', 'omm'].includes(options.format))
|
|
79
92
|
throw new Error('Format must be native or omm');
|
|
80
93
|
const file = options.file ?? (omm ? '.omm' : ARCHITECTURE_FILE);
|
|
94
|
+
const instructions = async () => {
|
|
95
|
+
const language = options.language ?? (omm ? (await store.config()).language : 'en');
|
|
96
|
+
return omm ? buildOmmScanPrompt(root, language) : buildArchitecturePrompt(root, language === 'zh' ? 'zh' : 'en');
|
|
97
|
+
};
|
|
81
98
|
const input = async (values) => values[0] === '-' ? io.stdin() : values.join(' ');
|
|
82
99
|
const json = (value) => io.write(JSON.stringify(value, null, 2));
|
|
83
100
|
if (command === 'prompt' || command === 'scan') {
|
|
84
|
-
io.write(
|
|
101
|
+
io.write(await instructions());
|
|
85
102
|
return 0;
|
|
86
103
|
}
|
|
87
104
|
if (command === 'setup') {
|
|
@@ -112,7 +129,7 @@ export async function runArchitectureCli(args, io = { write: value => process.st
|
|
|
112
129
|
io.write(`Removed ${relative}`);
|
|
113
130
|
continue;
|
|
114
131
|
}
|
|
115
|
-
const prompt =
|
|
132
|
+
const prompt = await instructions();
|
|
116
133
|
await fs.writeFile(destination, `---\nname: termdock-architecture\ndescription: Recursively analyze or update this project's Termdock code architecture.\n---\n${marker}\n\n${prompt}\n`, { mode: 0o600 });
|
|
117
134
|
io.write(`Installed ${relative}`);
|
|
118
135
|
}
|
|
@@ -206,10 +223,12 @@ export async function runArchitectureCli(args, io = { write: value => process.st
|
|
|
206
223
|
}
|
|
207
224
|
if (command === 'validate') {
|
|
208
225
|
const issues = [];
|
|
226
|
+
if (element)
|
|
227
|
+
target(document, element);
|
|
209
228
|
for (const view of document.perspectives) {
|
|
210
229
|
for (const item of [view, ...view.nodes]) {
|
|
211
|
-
const key =
|
|
212
|
-
if (element && !key.startsWith(element))
|
|
230
|
+
const key = elementPath(view, item === view ? undefined : item);
|
|
231
|
+
if (element && key !== element && !key.startsWith(`${element}/`))
|
|
213
232
|
continue;
|
|
214
233
|
if (!item.description && !item.summary)
|
|
215
234
|
issues.push({ element: key, message: 'Missing description' });
|
|
@@ -274,7 +293,13 @@ export async function runArchitectureCli(args, io = { write: value => process.st
|
|
|
274
293
|
return 0;
|
|
275
294
|
}
|
|
276
295
|
if (command === 'refs') {
|
|
277
|
-
|
|
296
|
+
const reference = (perspective, id) => {
|
|
297
|
+
const view = document.perspectives.find(view => view.id === perspective);
|
|
298
|
+
const node = id ? view.nodes.find(node => node.id === id) : undefined;
|
|
299
|
+
return { perspective, ...(id ? { node: id } : {}), element: elementPath(view, node), title: node?.title ?? view.title };
|
|
300
|
+
};
|
|
301
|
+
const connections = (selected.node ? selected.view.edges.filter(edge => edge.from === selected.node.id || edge.to === selected.node.id) : selected.view.edges).map(edge => ({ ...edge, fromElement: elementPath(selected.view, selected.view.nodes.find(node => node.id === edge.from)), toElement: elementPath(selected.view, selected.view.nodes.find(node => node.id === edge.to)) }));
|
|
302
|
+
json({ outgoing: (selected.node?.references ?? []).map(ref => reference(ref.perspective, ref.node)), incoming: document.perspectives.flatMap(view => view.nodes.filter(node => node.references?.some(ref => ref.perspective === selected.view.id && (!ref.node || ref.node === selected.node?.id))).map(node => reference(view.id, node.id))), connections });
|
|
278
303
|
return 0;
|
|
279
304
|
}
|
|
280
305
|
if (command === 'diff') {
|
|
@@ -304,19 +304,19 @@ export function buildArchitecturePrompt(root, language, analysis = DEFAULT_ANALY
|
|
|
304
304
|
'Source paths must be existing files relative to the project root, with no absolute paths, URLs, backslashes or dot/parent segments. Add a positive integer line when verified. Omit uncertain connections and explain uncertainties in summaries.',
|
|
305
305
|
`Write titles, summaries and edge labels in ${language === 'zh' ? 'Chinese' : 'English'}. Set generatedAt to the actual current ISO timestamp. The sample paths are illustrative; use this project's real paths.`,
|
|
306
306
|
'Read the selected output document if it already exists. Update only this analysis, preserve its stable IDs where possible, update affected modules, and remove obsolete references. Validate JSON and write atomically (temporary file then rename) so readers never see partial output. Summarize what was analyzed and any limitations after writing.',
|
|
307
|
-
`Prefer
|
|
307
|
+
`Prefer invoking executable td with this argument array: ${JSON.stringify(['architecture', 'save', '--project', root, '--file', output, '-'])}. Pass the complete JSON on stdin. Pass arguments separately; JSON string quoting is not shell escaping. This validates the document, archives the previous version, and records the update count and Git revision. If the CLI is unavailable, use the atomic file write above and disclose that history metadata was not recorded.`,
|
|
308
308
|
JSON.stringify(example, null, 2),
|
|
309
309
|
].join('\n\n');
|
|
310
310
|
}
|
|
311
311
|
/** Adapted scanner workflow from oh-my-mermaid, MIT; see THIRD_PARTY_NOTICES.md. */
|
|
312
312
|
export function buildOmmScanPrompt(root, language) {
|
|
313
313
|
return [
|
|
314
|
-
language
|
|
315
|
-
`Project root (literal path): ${JSON.stringify(root)}. Write document content in ${language
|
|
314
|
+
language.startsWith('zh') ? '分析当前项目并递归更新 .omm 架构文档。' : 'Recursively analyze this project and update its .omm architecture documents.',
|
|
315
|
+
`Project root (literal path): ${JSON.stringify(root)}. Write document content in language ${JSON.stringify(language)}.`,
|
|
316
316
|
'Read project instructions, manifests, entry points and existing .omm documentation. Select relevant perspectives: overall-architecture, request-lifecycle, data-flow, dependency-map, external-integrations, state-transitions, route-page-map, command-surface, extension-points, pipeline, orchestration, storage.',
|
|
317
317
|
'For each perspective, write a graph LR or graph TD diagram whose node IDs match child directory names (English kebab-case). Every edge must have a meaningful label. Node labels use name plus verified source path separated by \\n. Write description for EVERY node, inspect its actual source, and recursively create child diagrams wherever distinct internal components exist. Leaves still need descriptions. Do not stop at the top-level diagram.',
|
|
318
318
|
'Each element supports description, diagram, context, constraint, concern, todo, note. Use Markdown for text fields. Record real constraints and concerns without inventing them. Existing @perspective references can link between perspectives. Do not rewrite unchanged elements. Remove obsolete references after confirming them. Never modify business source files or include secrets.',
|
|
319
|
-
`
|
|
319
|
+
`Invoke executable td with this argument array: ${JSON.stringify(['architecture', 'write', '--project', root, '--format', 'omm', '<perspective/child/path>', '<field>', '-'])}, replacing the two placeholders with the element path and field. Supply that field on stdin. Pass arguments separately; JSON string quoting is not shell escaping. Use read, tree, refs and diff to inspect existing documents. Finish by invoking td with argument array ${JSON.stringify(['architecture', 'validate', '--project', root, '--format', 'omm'])}.`,
|
|
320
320
|
'Report the inspected sources, updated perspectives, recursion coverage and unresolved limitations. The Termdock architecture viewer reads .omm directly; no separate viewer server is required.',
|
|
321
321
|
].join('\n\n');
|
|
322
322
|
}
|
|
@@ -2,6 +2,11 @@ import { ARCHITECTURE_FIELDS } from './document.js';
|
|
|
2
2
|
/** Compare semantic document content, excluding timestamps and update counters. */
|
|
3
3
|
export function diffArchitecture(before, after) {
|
|
4
4
|
const changes = [];
|
|
5
|
+
if (before) {
|
|
6
|
+
const changed = ['summary', 'analysis', 'details', 'origin'].filter(key => JSON.stringify(before[key]) !== JSON.stringify(after[key]));
|
|
7
|
+
if (changed.length)
|
|
8
|
+
changes.push({ perspective: '', title: 'Project overview', kind: 'changed', fields: changed });
|
|
9
|
+
}
|
|
5
10
|
const oldViews = new Map(before?.perspectives.map(view => [view.id, view]) ?? []);
|
|
6
11
|
for (const view of after.perspectives) {
|
|
7
12
|
const previous = oldViews.get(view.id);
|