termdock 1.4.356 → 1.4.357
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/README.md +22 -4
- package/dist/client/assets/AndroidMirrorView-BGagwKtL.js +3 -0
- package/dist/client/assets/AndroidMirrorView-BGagwKtL.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-BGagwKtL.js.gz +0 -0
- package/dist/client/assets/App-DpMhxwYW.js +178 -0
- package/dist/client/assets/App-DpMhxwYW.js.br +0 -0
- package/dist/client/assets/App-DpMhxwYW.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js +9 -0
- package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Bd_l74EC.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DO_zJfZr.js → ChangeWalkthroughPanel-6DN-2BdR.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-6DN-2BdR.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-6DN-2BdR.js.gz +0 -0
- package/dist/client/assets/{ChatRichContent-Cu1E1cJ8.js → ChatRichContent-DjwpmW7d.js} +29 -29
- package/dist/client/assets/ChatRichContent-DjwpmW7d.js.br +0 -0
- package/dist/client/assets/ChatRichContent-DjwpmW7d.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DPTJ9pCt.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-Cbu1Bjl0.js +1 -0
- package/dist/client/assets/ComputerControlView-CwB-wQqB.js +6 -0
- package/dist/client/assets/ComputerControlView-CwB-wQqB.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CwB-wQqB.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-CPYwfryM.js → DagPlayground-DMn9Gyrw.js} +1 -1
- package/dist/client/assets/DagPlayground-DMn9Gyrw.js.br +0 -0
- package/dist/client/assets/DagPlayground-DMn9Gyrw.js.gz +0 -0
- package/dist/client/assets/{DiffLab-ptw96Q_4.js → DiffLab-YBWlCU2T.js} +1 -1
- package/dist/client/assets/DiffLab-YBWlCU2T.js.br +0 -0
- package/dist/client/assets/DiffLab-YBWlCU2T.js.gz +0 -0
- package/dist/client/assets/DiffReview-YOPDWqhv.js +1 -0
- package/dist/client/assets/DiffReview-YOPDWqhv.js.br +0 -0
- package/dist/client/assets/DiffReview-YOPDWqhv.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-eEi3y-0G.js → DiffReviewLab-SYomq14c.js} +1 -1
- package/dist/client/assets/DiffReviewLab-SYomq14c.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-SYomq14c.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-DqcQxp4Q.js → DiffViewer-mh9cBl5v.js} +1 -1
- package/dist/client/assets/DiffViewer-mh9cBl5v.js.br +0 -0
- package/dist/client/assets/DiffViewer-mh9cBl5v.js.gz +0 -0
- package/dist/client/assets/{GitLoadingSkeleton-DYrDIDF1.js → GitLoadingSkeleton-DKRTc5sz.js} +1 -1
- package/dist/client/assets/GitLoadingSkeleton-DKRTc5sz.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DKRTc5sz.js.gz +0 -0
- package/dist/client/assets/Markdown-C8OP1j-g.js +23 -0
- package/dist/client/assets/Markdown-C8OP1j-g.js.br +0 -0
- package/dist/client/assets/Markdown-C8OP1j-g.js.gz +0 -0
- package/dist/client/assets/Markdown-DKQhs57e.css +1 -0
- package/dist/client/assets/Markdown-DKQhs57e.css.br +0 -0
- package/dist/client/assets/Markdown-DKQhs57e.css.gz +0 -0
- package/dist/client/assets/{ModelPreview-DjtHLlqP.js → ModelPreview-CsZry3Wd.js} +3 -3
- package/dist/client/assets/ModelPreview-CsZry3Wd.js.br +0 -0
- package/dist/client/assets/ModelPreview-CsZry3Wd.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js +1 -0
- package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-CoRGi97z.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DNY2kC6B.js +1662 -0
- package/dist/client/assets/RightSidebar-DNY2kC6B.js.br +0 -0
- package/dist/client/assets/RightSidebar-DNY2kC6B.js.gz +0 -0
- package/dist/client/assets/SessionChatView-DXNpYUrk.js +13 -0
- package/dist/client/assets/SessionChatView-DXNpYUrk.js.br +0 -0
- package/dist/client/assets/SessionChatView-DXNpYUrk.js.gz +0 -0
- package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js +2 -0
- package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-B_379HBJ.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-DfwGOAHB.js +1 -0
- package/dist/client/assets/TodoWorkspace-DfwGOAHB.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-DfwGOAHB.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-Cvf_KWZ0.js → abnfDiagram-VCTEODGH-C9M0gnl-.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-C9M0gnl-.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-C9M0gnl-.js.gz +0 -0
- package/dist/client/assets/app-CovJYQoW.js +37 -0
- package/dist/client/assets/app-CovJYQoW.js.br +0 -0
- package/dist/client/assets/app-CovJYQoW.js.gz +0 -0
- package/dist/client/assets/{arc-UvdowQOf.js → arc-q4wfkQcT.js} +1 -1
- package/dist/client/assets/arc-q4wfkQcT.js.br +0 -0
- package/dist/client/assets/arc-q4wfkQcT.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DotsbCCA.js → architectureDiagram-5GKGNRK7-CCuna3ab.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CCuna3ab.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CCuna3ab.js.gz +0 -0
- package/dist/client/assets/{arrow-down-FGzRy9D-.js → arrow-down-WyzmLXwQ.js} +1 -1
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CoOfSG4k.js → blockDiagram-I7D4REHJ-BXK68Qyt.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BXK68Qyt.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BXK68Qyt.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-BAfjgs8B.js → c4Diagram-7LVT6UL2-BqwmmVmS.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-BqwmmVmS.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BqwmmVmS.js.gz +0 -0
- package/dist/client/assets/channel-Dd6WQGB7.js +1 -0
- package/dist/client/assets/{chevron-left-xqARwD-7.js → chevron-left-CxeWIsDK.js} +1 -1
- package/dist/client/assets/{chunk-2Q5K7J3B-DiiQ7BvG.js → chunk-2Q5K7J3B-esKGR38U.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CczSK8wW.js → chunk-5VM5RSS4-B3InxqDA.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-BI3Di4Ve.js → chunk-F27PBJKO-CjUVyF-E.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CjUVyF-E.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CjUVyF-E.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-Cvvs1wmn.js → chunk-IMKFNOWR-BR8mmBs7.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-BR8mmBs7.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BR8mmBs7.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-lrJRD9WA.js → chunk-JWPE2WC7-CplXNOA7.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CnPC9D8B.js → chunk-POPQ4Y6H-D0JWCGnb.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BZfMhm64.js → chunk-SVP7TREG-BdJtJSmy.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-BdJtJSmy.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BdJtJSmy.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-DmkEaRK3.js → chunk-TICWLB2K-CoevFj8I.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-CoevFj8I.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CoevFj8I.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BP9Lccpe.js → chunk-XXDRQBXY-D7qYRhMH.js} +1 -1
- package/dist/client/assets/{circle-DGZOpG8V.js → circle-xgKDXpwG.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BdIUq_D7.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdIUq_D7.js +1 -0
- package/dist/client/assets/{clipboard-rLx5CzbY.js → clipboard-DeK6pJD3.js} +1 -1
- package/dist/client/assets/clipboardText-BWOwer6N.js +1 -0
- package/dist/client/assets/clipboardText-BWOwer6N.js.br +0 -0
- package/dist/client/assets/clipboardText-BWOwer6N.js.gz +0 -0
- package/dist/client/assets/clipboardText-vX90C7eX.css +1 -0
- package/dist/client/assets/clipboardText-vX90C7eX.css.br +0 -0
- package/dist/client/assets/clipboardText-vX90C7eX.css.gz +0 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-0xPYMc2z.js → cose-bilkent-JH36ORCC-CvnsiaWP.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CvnsiaWP.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CvnsiaWP.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BQ7-lCHm.js → cynefin-OW5HDTMX-BSGz8Olu.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BSGz8Olu.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BSGz8Olu.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CazHuSj1.js → cynefinDiagram-5FMLGOSQ-DYYT0AHs.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DYYT0AHs.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DYYT0AHs.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-CJNgsyHQ.js → dagre-GXQ25YYZ-BM883MN7.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-BM883MN7.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BM883MN7.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-D4xXIj1P.js → diagram-S7CK7UJ4-CYnxXy7R.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-CYnxXy7R.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CYnxXy7R.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BWhpL-35.js → diagram-UQ7AKVKN-UOIBVxRf.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-UOIBVxRf.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-UOIBVxRf.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-DG9A7EgJ.js → diagram-VSXAHHWV-CqTJzfmm.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-CqTJzfmm.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CqTJzfmm.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-L5PSvynM.js → diagram-VX7I27RA-T9Y88CFB.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-T9Y88CFB.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-T9Y88CFB.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-moBH7ruR.js → diagram-Z3DM3KII-kIQDy7E0.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-kIQDy7E0.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kIQDy7E0.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-DEiGgcRP.js → ebnfDiagram-PWID7BFC-z_VqR_JE.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-z_VqR_JE.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-z_VqR_JE.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-BboIleYi.js → erDiagram-RLTQ6QDP-0q52Z-pm.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-0q52Z-pm.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-0q52Z-pm.js.gz +0 -0
- package/dist/client/assets/{external-link-AZ3wjUg5.js → external-link-CsydVmO1.js} +1 -1
- package/dist/client/assets/{flowDiagram-HODETNUW-COxz7Rda.js → flowDiagram-HODETNUW-BrGqcUWn.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BrGqcUWn.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BrGqcUWn.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-_XdRvgyZ.js → ganttDiagram-EL5Y4UJY-CHAN6vQv.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CHAN6vQv.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CHAN6vQv.js.gz +0 -0
- package/dist/client/assets/{git-compare-90v75Jal.js → git-compare-BmKAtQTt.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CBb9xBNW.js → gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0ZV4FeB.js.gz +0 -0
- package/dist/client/assets/index-DEAMSl55.css +1 -0
- package/dist/client/assets/index-DEAMSl55.css.br +0 -0
- package/dist/client/assets/index-DEAMSl55.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-DjLdeNZi.js → infoDiagram-27XIBGKW-CrLj9y1o.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bcr-lhIE.js → ishikawaDiagram-5VMMS53U-BxGvUfLX.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BxGvUfLX.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BxGvUfLX.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-3vK6s9Pq.js → journeyDiagram-3NMN7TZE-rW9xlQ8G.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-rW9xlQ8G.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-rW9xlQ8G.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-DqDYDca0.js → kanban-definition-UXKFOSKX-CFI5iv9R.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CFI5iv9R.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CFI5iv9R.js.gz +0 -0
- package/dist/client/assets/{layout-C7_WwzCP.js → layout-Ct_an5XT.js} +1 -1
- package/dist/client/assets/layout-Ct_an5XT.js.br +0 -0
- package/dist/client/assets/layout-Ct_an5XT.js.gz +0 -0
- package/dist/client/assets/{linear-BQCRhl6P.js → linear-DpEFOA9l.js} +1 -1
- package/dist/client/assets/linear-DpEFOA9l.js.br +0 -0
- package/dist/client/assets/linear-DpEFOA9l.js.gz +0 -0
- package/dist/client/assets/{link-Cq14tNBm.js → link-34ChBc4F.js} +3 -3
- package/dist/client/assets/{link-Cq14tNBm.js.br → link-34ChBc4F.js.br} +0 -0
- package/dist/client/assets/link-34ChBc4F.js.gz +0 -0
- package/dist/client/assets/{list-tree-C281zrdg.js → list-tree-48dzbuUh.js} +1 -1
- package/dist/client/assets/{maximize-2-CovPxWdw.js → maximize-2-CbvSsu7O.js} +1 -1
- package/dist/client/assets/{mermaid.core-DGsccxt-.js → mermaid.core-DnVKnMmy.js} +5 -5
- package/dist/client/assets/mermaid.core-DnVKnMmy.js.br +0 -0
- package/dist/client/assets/mermaid.core-DnVKnMmy.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-l0eF1PQE.js → mindmap-definition-YA3MSWOX-C6shupTY.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C6shupTY.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C6shupTY.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-B5VzheZz.js → passwordBootstrap-Doe50DSa.js} +1 -1
- package/dist/client/assets/{passwordBootstrap-B5VzheZz.js.br → passwordBootstrap-Doe50DSa.js.br} +0 -0
- package/dist/client/assets/passwordBootstrap-Doe50DSa.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-fRrxGIDM.js → pegDiagram-XKGWAZYB-CDcnrvKX.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-CDcnrvKX.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CDcnrvKX.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-B-EBa3qN.js → pieDiagram-E7YTZNPT-CrGc03Tg.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrGc03Tg.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrGc03Tg.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Dj4e6f4h.js → quadrantDiagram-AXDQQJYC-3-aldwKj.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-3-aldwKj.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-3-aldwKj.js.gz +0 -0
- package/dist/client/assets/{quote-COQfrXhi.js → quote-B5GeKEq1.js} +1 -1
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-CEMppxTC.js → railroadDiagram-O6MQD6OU-51uKwR2_.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-51uKwR2_.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-51uKwR2_.js.gz +0 -0
- package/dist/client/assets/rdpSession-ocpkj4XY.js +1 -0
- package/dist/client/assets/rdpSession-ocpkj4XY.js.br +0 -0
- package/dist/client/assets/rdpSession-ocpkj4XY.js.gz +0 -0
- package/dist/client/assets/referenceSelection-fvfRDbgp.js +4 -0
- package/dist/client/assets/referenceSelection-fvfRDbgp.js.br +0 -0
- package/dist/client/assets/referenceSelection-fvfRDbgp.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Dri1k4_x.js → requirementDiagram-BXWQKSXE-CY6kp0_Y.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CY6kp0_Y.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CY6kp0_Y.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CMsL_tYL.js → sankeyDiagram-P5KCCOFB-BsA0NkHG.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BsA0NkHG.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BsA0NkHG.js.gz +0 -0
- package/dist/client/assets/{search-Dg6HWygj.js → search-CbpNLSpd.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.br → sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.br} +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BDzn7N2D.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-3QA6qj2j.js → sizeCapture-INFHLROL-gxtam7nc.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-gxtam7nc.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-gxtam7nc.js.gz +0 -0
- package/dist/client/assets/{stateDiagram-D77RDMKH-90IFPhD9.js → stateDiagram-D77RDMKH-C4XjYLZR.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-C4XjYLZR.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-C4XjYLZR.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BfHWFf-I.js +1 -0
- package/dist/client/assets/{sun-BAMMjiA8.js → sun-CMXn_ntS.js} +1 -1
- package/dist/client/assets/{swimlanes-42K2YHIH-BuHieVWC.js → swimlanes-42K2YHIH--a1wkQO8.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH--a1wkQO8.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH--a1wkQO8.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DsiDF1XD.js +8 -0
- package/dist/client/assets/swiper-CTPycjLq.js +1 -0
- package/dist/client/assets/swiper-CTPycjLq.js.br +0 -0
- package/dist/client/assets/swiper-CTPycjLq.js.gz +0 -0
- package/dist/client/assets/{terminal-Dea8wJF3.js → terminal-DaiFCKy_.js} +7 -7
- package/dist/client/assets/terminal-DaiFCKy_.js.br +0 -0
- package/dist/client/assets/terminal-DaiFCKy_.js.gz +0 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-C7FpaNwf.js → timeline-definition-24CTP7MA-DFmXXUuU.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DFmXXUuU.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DFmXXUuU.js.gz +0 -0
- package/dist/client/assets/triangle-alert-DgGU_xB4.js +1 -0
- package/dist/client/assets/{unplug-DN2SNXUL.js → unplug-CnZtWzVW.js} +1 -1
- package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js +1 -0
- package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js.br +0 -0
- package/dist/client/assets/use-gesture-react.esm-DHU0wi7Q.js.gz +0 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-CxoHHVcs.js → vennDiagram-4TSXK5OY-DgR4zroQ.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DgR4zroQ.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DgR4zroQ.js.gz +0 -0
- package/dist/client/assets/{videoCompression-rr2lu3uy.js → videoCompression-CcffRZdP.js} +1 -1
- package/dist/client/assets/videoCompression-CcffRZdP.js.br +0 -0
- package/dist/client/assets/videoCompression-CcffRZdP.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js → wardleyDiagram-VM6X3IG4-CY4SVUkf.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CY4SVUkf.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CY4SVUkf.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CghzsxQv.js → xychartDiagram-S5SC5T6Z-PblQhR-b.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-PblQhR-b.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-PblQhR-b.js.gz +0 -0
- package/dist/client/index.html +3 -3
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw-encrypted-background.js +1 -1
- package/dist/client/sw-encrypted-background.js.br +0 -0
- package/dist/client/sw-encrypted-background.js.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/collaborationPeerTransport.js +14 -69
- package/dist/server/agent/collaborationStore.js +5 -0
- package/dist/server/agent/installers.js +89 -33
- package/dist/server/agent/integrationServer.js +31 -2
- package/dist/server/agent/pluginPackages.js +51 -22
- package/dist/server/agent/sessionChatRoutes.js +45 -7
- package/dist/server/agentHook.js +56 -12
- package/dist/server/android/adb.js +24 -31
- package/dist/server/cli.js +52 -110
- package/dist/server/entry.js +17 -23
- package/dist/server/federation/cli.js +13 -47
- package/dist/server/federation/connectionErrors.js +37 -0
- package/dist/server/federation/connectionModel.js +83 -0
- package/dist/server/federation/desktopTargets.js +35 -13
- package/dist/server/federation/directRoutes.js +28 -36
- package/dist/server/federation/directTargetRegistry.js +106 -0
- package/dist/server/federation/httpUploadLimit.js +8 -0
- package/dist/server/federation/relay.js +13 -6
- package/dist/server/federation/relayTransport.js +147 -0
- package/dist/server/federation/routeAccess.js +5 -3
- package/dist/server/federation/runtime.js +4 -2
- package/dist/server/federation/selfRelay.js +10 -59
- package/dist/server/federation/serviceTransport.js +123 -0
- package/dist/server/federation/streamLimits.js +3 -0
- package/dist/server/federation/trustedCa.js +61 -0
- package/dist/server/routes/android.js +5 -7
- package/dist/server/routes/terminal.js +149 -111
- package/dist/server/shared/androidDevices.js +64 -0
- package/dist/server/shared/programStatus.js +174 -0
- package/dist/server/shared/shareResources.js +3 -2
- package/dist/server/todos/routes.js +36 -0
- package/dist/server/todos/store.js +31 -1
- package/dist/server/utils/bootCheck.js +41 -271
- package/dist/server/utils/localHttpsSetup.js +257 -0
- package/dist/server/utils/oscBuffer.js +9 -0
- package/dist/server/utils/sessionDisplayName.js +11 -9
- package/dist/server/utils/settings.js +6 -3
- package/dist/server/utils/tmuxDisplayGeometry.js +54 -0
- package/dist/server/utils/tmuxObserverSize.js +26 -0
- package/docs/integrations.md +2 -1
- package/package.json +5 -1
- package/runtime-manifest.json +3 -3
- package/scripts/install-utils.cjs +81 -0
- package/scripts/postinstall.mjs +19 -106
- package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js +0 -3
- package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.br +0 -0
- package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.gz +0 -0
- package/dist/client/assets/App-DEZ2i9ZZ.js +0 -178
- package/dist/client/assets/App-DEZ2i9ZZ.js.br +0 -0
- package/dist/client/assets/App-DEZ2i9ZZ.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js +0 -9
- package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.gz +0 -0
- package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.br +0 -0
- package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-CX0Aqdi2.js +0 -2
- package/dist/client/assets/ComputerControlView-DjQLzn10.js +0 -6
- package/dist/client/assets/ComputerControlView-DjQLzn10.js.br +0 -0
- package/dist/client/assets/ComputerControlView-DjQLzn10.js.gz +0 -0
- package/dist/client/assets/DagPlayground-CPYwfryM.js.br +0 -0
- package/dist/client/assets/DagPlayground-CPYwfryM.js.gz +0 -0
- package/dist/client/assets/DiffLab-ptw96Q_4.js.br +0 -0
- package/dist/client/assets/DiffLab-ptw96Q_4.js.gz +0 -0
- package/dist/client/assets/DiffReview-12E2zWyL.js +0 -1
- package/dist/client/assets/DiffReview-12E2zWyL.js.br +0 -0
- package/dist/client/assets/DiffReview-12E2zWyL.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.gz +0 -0
- package/dist/client/assets/DiffViewer-DqcQxp4Q.js.br +0 -0
- package/dist/client/assets/DiffViewer-DqcQxp4Q.js.gz +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.br +0 -0
- package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.gz +0 -0
- package/dist/client/assets/MarkdownPreview-CsJGsDRL.js +0 -19
- package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.br +0 -0
- package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DjtHLlqP.js.br +0 -0
- package/dist/client/assets/ModelPreview-DjtHLlqP.js.gz +0 -0
- package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js +0 -1
- package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.br +0 -0
- package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BltjUFwI.js +0 -1662
- package/dist/client/assets/RightSidebar-BltjUFwI.js.br +0 -0
- package/dist/client/assets/RightSidebar-BltjUFwI.js.gz +0 -0
- package/dist/client/assets/SessionChatView-CdKfHRp8.js +0 -13
- package/dist/client/assets/SessionChatView-CdKfHRp8.js.br +0 -0
- package/dist/client/assets/SessionChatView-CdKfHRp8.js.gz +0 -0
- package/dist/client/assets/SessionChatView-D8GoESjb.css +0 -1
- package/dist/client/assets/SessionChatView-D8GoESjb.css.br +0 -0
- package/dist/client/assets/SessionChatView-D8GoESjb.css.gz +0 -0
- package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js +0 -2
- package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.br +0 -0
- package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.gz +0 -0
- package/dist/client/assets/TodoWorkspace-Bh1C035B.js +0 -1
- package/dist/client/assets/TodoWorkspace-Bh1C035B.js.br +0 -0
- package/dist/client/assets/TodoWorkspace-Bh1C035B.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.gz +0 -0
- package/dist/client/assets/app-DuUnqxq-.js +0 -37
- package/dist/client/assets/app-DuUnqxq-.js.br +0 -0
- package/dist/client/assets/app-DuUnqxq-.js.gz +0 -0
- package/dist/client/assets/arc-UvdowQOf.js.br +0 -0
- package/dist/client/assets/arc-UvdowQOf.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.gz +0 -0
- package/dist/client/assets/arrow-up-DNkfesW0.js +0 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.gz +0 -0
- package/dist/client/assets/channel-BzMU9Wks.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DtAtEoWU.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DtAtEoWU.js +0 -1
- package/dist/client/assets/clipboardText-cZXParp1.js +0 -1
- package/dist/client/assets/clipboardText-cZXParp1.js.br +0 -0
- package/dist/client/assets/clipboardText-cZXParp1.js.gz +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.gz +0 -0
- package/dist/client/assets/index-nIgxJ6I3.css +0 -1
- package/dist/client/assets/index-nIgxJ6I3.css.br +0 -0
- package/dist/client/assets/index-nIgxJ6I3.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.gz +0 -0
- package/dist/client/assets/layout-C7_WwzCP.js.br +0 -0
- package/dist/client/assets/layout-C7_WwzCP.js.gz +0 -0
- package/dist/client/assets/linear-BQCRhl6P.js.br +0 -0
- package/dist/client/assets/linear-BQCRhl6P.js.gz +0 -0
- package/dist/client/assets/link-Cq14tNBm.js.gz +0 -0
- package/dist/client/assets/loader-circle-Df0zpx5N.js +0 -1
- package/dist/client/assets/mermaid.core-DGsccxt-.js.br +0 -0
- package/dist/client/assets/mermaid.core-DGsccxt-.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-B5VzheZz.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.gz +0 -0
- package/dist/client/assets/rdpSession-C5rS-ImV.js +0 -1
- package/dist/client/assets/rdpSession-C5rS-ImV.js.br +0 -0
- package/dist/client/assets/rdpSession-C5rS-ImV.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.gz +0 -0
- package/dist/client/assets/settings-2-iGqzPez0.js +0 -1
- package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CH-yvmL4.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-P_rDqbtg.js +0 -8
- package/dist/client/assets/swiper-DJjq1TYT.js +0 -1
- package/dist/client/assets/swiper-DJjq1TYT.js.br +0 -0
- package/dist/client/assets/swiper-DJjq1TYT.js.gz +0 -0
- package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js +0 -4
- package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.br +0 -0
- package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.gz +0 -0
- package/dist/client/assets/terminal-Dea8wJF3.js.br +0 -0
- package/dist/client/assets/terminal-Dea8wJF3.js.gz +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.gz +0 -0
- package/dist/client/assets/triangle-alert-Oj-OsZDw.js +0 -1
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js +0 -1
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.br +0 -0
- package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.gz +0 -0
- package/dist/client/assets/videoCompression-rr2lu3uy.js.br +0 -0
- package/dist/client/assets/videoCompression-rr2lu3uy.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.gz +0 -0
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { sessionViewModeRoutes, SessionViewModeStore } from '../agent/sessionViewModeRoutes.js';
|
|
2
|
+
import { incompleteOscSuffix } from '../utils/oscBuffer.js';
|
|
3
|
+
import { terminalProgramStatus, PROGRAM_STATUS_REPLY } from '../shared/programStatus.js';
|
|
2
4
|
import { sessionAttachmentRoutes } from '../agent/sessionAttachmentRoutes.js';
|
|
3
5
|
import { TodoStore, TodoError } from '../todos/store.js';
|
|
4
6
|
import { TodoRunner, todoRoutes } from '../todos/routes.js';
|
|
5
7
|
import { TerminalInputQueue } from '../utils/terminalInputQueue.js';
|
|
6
8
|
import { copyTmuxSelection } from '../utils/tmuxCopySelection.js';
|
|
7
9
|
import { isConfirmedEmptyTmuxServer } from '../utils/tmuxEmptyServerProbe.js';
|
|
8
|
-
import {
|
|
10
|
+
import { getSessionPresentation } from '../utils/sessionDisplayName.js';
|
|
9
11
|
import { integrationError } from '../agent/integrationStore.js';
|
|
10
12
|
import { assertNativeResumeAvailable, collectNativeResumeOwnerCandidates } from '../agent/nativeResumeOwner.js';
|
|
11
13
|
import { nativeIdentityDirectory, readNativeProcessIdentity, resolveProfileNativeIdentity } from '../agent/nativeProcessIdentity.js';
|
|
@@ -25,8 +27,9 @@ import { TerminalPasteBuffer } from '../utils/terminalPasteBuffer.js';
|
|
|
25
27
|
import { SharedSessionSampler, SharedSnapshotCache } from '../utils/sharedSampling.js';
|
|
26
28
|
import { batchTmuxOptions, TmuxMetadataWriter } from '../utils/tmuxMetadataWriter.js';
|
|
27
29
|
import { redrawTmuxClient } from '../utils/tmuxClientRedraw.js';
|
|
28
|
-
import {
|
|
30
|
+
import { TmuxDisplayGeometry } from '../utils/tmuxDisplayGeometry.js';
|
|
29
31
|
import { TmuxInitialScreen } from '../utils/tmuxInitialScreen.js';
|
|
32
|
+
import { readTmuxObserverSize } from '../utils/tmuxObserverSize.js';
|
|
30
33
|
import { TerminalOutputDelivery, resolveTerminalReplayCursor } from '../utils/terminalOutputDelivery.js';
|
|
31
34
|
import express from 'express';
|
|
32
35
|
import fs from 'fs';
|
|
@@ -44,7 +47,7 @@ import { getPtyHostManager } from '../ptyhost/manager.js';
|
|
|
44
47
|
import { pathValidator } from '../utils/pathValidator.js';
|
|
45
48
|
import { TERMINAL, TMUX } from '../config.js';
|
|
46
49
|
import { localAccessManager, localAccessInterfaceUrl } from '../utils/localAccess.js';
|
|
47
|
-
import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, getAutoRenamePromptPayloadCharsSetting, setAutoRenamePromptPayloadCharsSetting, getNewSessionAgentSlugSetting, setNewSessionAgentSlugSetting, getRunningSessionButtonEnabledSetting, getAttentionButtonEnabledSetting, getCollaborationPanelsSetting, setCollaborationPanelSetting, getAndroidPanelSetting, setAndroidPanelSetting, getRightSidebarTabsSetting, setRightSidebarTabsSetting,
|
|
50
|
+
import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, getAutoRenamePromptPayloadCharsSetting, setAutoRenamePromptPayloadCharsSetting, getNewSessionAgentSlugSetting, setNewSessionAgentSlugSetting, getRunningSessionButtonEnabledSetting, getAttentionButtonEnabledSetting, getCollaborationPanelsSetting, setCollaborationPanelSetting, getAndroidPanelSetting, setAndroidPanelSetting, getRightSidebarTabsSetting, setRightSidebarTabsSetting, getCollaborationFloatingGroupIdSetting, setCollaborationFloatingGroupIdSetting, getServiceSwitcherExpandedSetting, setServiceSwitcherExpandedSetting, setRunningSessionButtonEnabledSetting, setAttentionButtonEnabledSetting, getFileSortModesSetting, getHideGitIgnoredRootsSetting, getGitIgnoreExceptionsSetting, setGitIgnoreExceptionsSetting, setHideGitIgnoredRootSetting, setFileSortModesSetting, setFileSortModeSetting, getNestedGitScanRootsSetting, setNestedGitScanRootSetting, getPinnedExplorerRootsSetting, setPinnedExplorerRootsSetting, setPinnedExplorerRootSetting, watchPinnedExplorerRootsSetting, getActiveGitReposSetting, setActiveGitRepoSetting, } from '../utils/settings.js';
|
|
48
51
|
import { loadContextDraft, saveContextDraft } from '../utils/contextDraft.js';
|
|
49
52
|
import { getOnboardingServerUrl } from '../onboardingServer.js';
|
|
50
53
|
import { inspectLinuxInotifyUsage, isWatchResourceExhaustion } from '../utils/fileWatchPolicy.js';
|
|
@@ -86,7 +89,7 @@ import { assertDetachedCloseOwnership } from '../agent/integrationCloseOwnership
|
|
|
86
89
|
import { readTmuxLayout, readTmuxLayouts } from '../utils/tmuxLayoutReader.js';
|
|
87
90
|
import { CollaborationDeliveryWorker } from '../agent/collaborationDeliveryWorker.js';
|
|
88
91
|
import { approveCollaborationDialog, captureTmuxPaneHistory, captureTmuxPaneText, sendTmuxPaneKey, writeCollaborationTmuxPane } from '../agent/collaborationTmuxDelivery.js';
|
|
89
|
-
import { listAllHookAgents, refreshStaleHooksAtLaunch, installHooksForSlug, uninstallHooksForSlug, } from '../agent/installers.js';
|
|
92
|
+
import { listAllHookAgents, refreshStaleHooksAtLaunch, installHooksForSlug, runtimeHooksStateForSlug, uninstallHooksForSlug, } from '../agent/installers.js';
|
|
90
93
|
import { loadPlugins, savePlugin, removePlugin, readPluginIcon, validateManifest, } from '../agent/plugins.js';
|
|
91
94
|
import { TmuxLifecycleCoordinator } from '../utils/tmuxLifecycle.js';
|
|
92
95
|
import { buildInteractiveColorEnvironment, buildTmuxColorEnvironmentCommands, ensureTmuxColorCapabilities, resolveTmuxInnerTerm, } from '../utils/terminalColorEnvironment.js';
|
|
@@ -1471,6 +1474,11 @@ function orchestrationSessionSnapshot(record) {
|
|
|
1471
1474
|
const terminalConnected = Boolean(backend);
|
|
1472
1475
|
const slug = binding?.pane?.agentSlug ?? binding?.agentSlug ?? record.agentResume?.slug;
|
|
1473
1476
|
const agent = slug ? agentBySlug(slug) : backend?.agent;
|
|
1477
|
+
const presentation = getSessionPresentation({ ...record,
|
|
1478
|
+
activeProgram: backend?.activeProgram?.command ?? record.activeProgram,
|
|
1479
|
+
shellTitle: backend?.lastOscTitle ?? record.shellTitle, cwd: backend?.cwd ?? record.cwd,
|
|
1480
|
+
promptState: backend?.lastPromptState ?? null, agent,
|
|
1481
|
+
}, shellNamesBackend);
|
|
1474
1482
|
return {
|
|
1475
1483
|
...collaborationStore.sessionFacts(record.sessionId, terminalConnected || route.state === 'ready' || route.state === 'shell'),
|
|
1476
1484
|
last_terminal_output_at: backend?.lastOutputAt || null,
|
|
@@ -1483,12 +1491,8 @@ function orchestrationSessionSnapshot(record) {
|
|
|
1483
1491
|
sessionId: record.sessionId,
|
|
1484
1492
|
agentNativeSessionId: binding?.pane ? binding.pane.nativeSessionId : binding?.nativeSessionId ?? backend?.agentSession?.sessionId ?? record.agentResume?.sessionId ?? null,
|
|
1485
1493
|
backendSessionId: backendId ?? null,
|
|
1486
|
-
name:
|
|
1487
|
-
|
|
1488
|
-
shellTitle: backend?.lastOscTitle ?? record.shellTitle,
|
|
1489
|
-
cwd: backend?.cwd ?? record.cwd,
|
|
1490
|
-
agent: agent ? { displayName: agent.displayName } : null,
|
|
1491
|
-
}),
|
|
1494
|
+
name: presentation.displayName,
|
|
1495
|
+
...presentation,
|
|
1492
1496
|
cwd: backend?.cwd ?? record.cwd ?? '',
|
|
1493
1497
|
agent: agent ? { slug: agent.slug, displayName: agent.displayName } : null,
|
|
1494
1498
|
status: route.state === 'unchecked' && terminalConnected ? 'terminal-connected' : route.state,
|
|
@@ -1939,20 +1943,22 @@ async function resolveCollaborationRoute(frontendSessionId) {
|
|
|
1939
1943
|
return { state: 'detached', reason: 'TMUX_BACKEND_UNAVAILABLE' };
|
|
1940
1944
|
assertGeneration();
|
|
1941
1945
|
const assertCurrent = terminalInputGuard(globalSessionState.sessions.find(candidate => candidate.sessionId === frontendSessionId));
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1946
|
+
const writeText = async (prompt) => {
|
|
1947
|
+
if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
|
|
1948
|
+
throw new Error('SESSION_REMOVED');
|
|
1949
|
+
if (recoveredNativeIdentity) {
|
|
1950
|
+
const current = await inspectCollaborationTmux(binding, null, false, true, true, true);
|
|
1951
|
+
const proof = current.candidates?.find(candidate => candidate.serverPid === pinned.serverPid && candidate.sessionId === pinned.sessionId
|
|
1952
|
+
&& candidate.paneId === pinned.paneId && candidate.panePid === pinned.panePid);
|
|
1953
|
+
if (!proof?.nativeIdentityVerified || proof.nativeIdentityFailure || proof.nativeSessionId !== pinned.nativeSessionId
|
|
1954
|
+
|| proof.agentSlug !== pinned.agentSlug || !routeOwnershipConfirmed(frontendSessionId, binding, [proof]))
|
|
1955
|
+
throw new Error('ROUTE_NATIVE_IDENTITY_CHANGED_BEFORE_WRITE');
|
|
1956
|
+
}
|
|
1957
|
+
await writeCollaborationTmuxPane(runTmux, pinned, prompt, runTmuxStdin, () => { assertGeneration(); assertCurrent(); });
|
|
1958
|
+
backend.lastActivity = Date.now();
|
|
1959
|
+
};
|
|
1960
|
+
return { state: 'ready', isShell: pane.isShell, capture: async () => captureTmuxPaneText(runTmux, pinned), writeText,
|
|
1961
|
+
write: messages => writeText(formatLocalCollaborationMessages(frontendSessionId, messages)) };
|
|
1956
1962
|
}
|
|
1957
1963
|
if (!backend || !binding.backendSessionId)
|
|
1958
1964
|
return { state: 'offline', reason: 'SHELL_BACKEND_NOT_RUNNING' };
|
|
@@ -1967,22 +1973,23 @@ async function resolveCollaborationRoute(frontendSessionId) {
|
|
|
1967
1973
|
if (launch)
|
|
1968
1974
|
return launch;
|
|
1969
1975
|
}
|
|
1976
|
+
const writeText = async (prompt) => {
|
|
1977
|
+
if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
|
|
1978
|
+
throw new Error('SESSION_REMOVED');
|
|
1979
|
+
if (terminalSessions.get(binding.backendSessionId) !== target)
|
|
1980
|
+
throw new Error('SHELL_BACKEND_CHANGED');
|
|
1981
|
+
await writeBracketedPrompt(target.ptyProcess, prompt, () => {
|
|
1982
|
+
assertGeneration();
|
|
1983
|
+
assertCurrent();
|
|
1984
|
+
if (terminalSessions.get(binding.backendSessionId) !== target)
|
|
1985
|
+
throw new Error('TERMINAL_INPUT_TARGET_CHANGED');
|
|
1986
|
+
});
|
|
1987
|
+
target.lastActivity = Date.now();
|
|
1988
|
+
};
|
|
1970
1989
|
return { state: 'ready',
|
|
1971
1990
|
isShell: backend.activeProgram?.source !== 'unknown' && shellNamesBackend.has(backend.activeProgram?.command?.toLowerCase() ?? ''),
|
|
1972
|
-
capture: async () => target.autoTitleContext,
|
|
1973
|
-
write:
|
|
1974
|
-
if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === frontendSessionId))
|
|
1975
|
-
throw new Error('SESSION_REMOVED');
|
|
1976
|
-
if (terminalSessions.get(binding.backendSessionId) !== target)
|
|
1977
|
-
throw new Error('SHELL_BACKEND_CHANGED');
|
|
1978
|
-
await writeBracketedPrompt(target.ptyProcess, formatLocalCollaborationMessages(frontendSessionId, messages), () => {
|
|
1979
|
-
assertGeneration();
|
|
1980
|
-
assertCurrent();
|
|
1981
|
-
if (terminalSessions.get(binding.backendSessionId) !== target)
|
|
1982
|
-
throw new Error('TERMINAL_INPUT_TARGET_CHANGED');
|
|
1983
|
-
});
|
|
1984
|
-
target.lastActivity = Date.now();
|
|
1985
|
-
} };
|
|
1991
|
+
capture: async () => target.autoTitleContext, writeText,
|
|
1992
|
+
write: messages => writeText(formatLocalCollaborationMessages(frontendSessionId, messages)) };
|
|
1986
1993
|
}
|
|
1987
1994
|
async function refreshCollaborationAgentIdentity(backendSessionId, session, freshProcess = false) {
|
|
1988
1995
|
let activeProgram = null;
|
|
@@ -3441,7 +3448,7 @@ async function buildSessionInventory() {
|
|
|
3441
3448
|
const tmuxMeta = session.tmuxSessionName ? liveTmuxByName.get(session.tmuxSessionName) : undefined;
|
|
3442
3449
|
const activeProgram = backend?.activeProgram?.command ?? tmuxMeta?.program ?? session.activeProgram ?? null;
|
|
3443
3450
|
const cwd = backend?.cwd ?? tmuxMeta?.cwd ?? session.cwd ?? null;
|
|
3444
|
-
const shellTitle =
|
|
3451
|
+
const shellTitle = backend?.lastOscTitle ?? tmuxMeta?.shellTitle ?? session.shellTitle ?? null;
|
|
3445
3452
|
// Identity is available without opening a terminal stream. Use foreground
|
|
3446
3453
|
// argv for interpreter/wrapper launches, and resume identity at shell prompts.
|
|
3447
3454
|
const foregroundAgent = (backend ? detectSessionAgent(backend) : null)
|
|
@@ -3467,6 +3474,7 @@ async function buildSessionInventory() {
|
|
|
3467
3474
|
cwd,
|
|
3468
3475
|
shellTitle,
|
|
3469
3476
|
agent,
|
|
3477
|
+
...getSessionPresentation({ ...session, activeProgram, cwd, shellTitle, agent, promptState: backend?.lastPromptState ?? null }, shellNamesBackend),
|
|
3470
3478
|
};
|
|
3471
3479
|
});
|
|
3472
3480
|
const clientByTmux = new Map();
|
|
@@ -3623,7 +3631,7 @@ function getPtyProcessPid(ptyProcess) {
|
|
|
3623
3631
|
return null;
|
|
3624
3632
|
}
|
|
3625
3633
|
// ── OSC sniffing for CWD tracking + prompt state + title ──
|
|
3626
|
-
const OSC_SNIFF_CAP =
|
|
3634
|
+
const OSC_SNIFF_CAP = 512 * 1024; // bounded incomplete hook payload (JSON escaping can expand stdin)
|
|
3627
3635
|
// Match all OSC sequences we care about:
|
|
3628
3636
|
// OSC 0;... / OSC 2;... → title (may contain cwd or command name)
|
|
3629
3637
|
// OSC 7;... → cwd report (kitty-shell-cwd://host/path)
|
|
@@ -3787,7 +3795,7 @@ function sniffOsc(buf, home) {
|
|
|
3787
3795
|
}
|
|
3788
3796
|
}
|
|
3789
3797
|
}
|
|
3790
|
-
const remaining = buf
|
|
3798
|
+
const remaining = incompleteOscSuffix(buf, lastMatchEnd, OSC_SNIFF_CAP);
|
|
3791
3799
|
return { cwd: lastCwd, title: lastTitle, promptState, exitCode, tuiProgress, agentEvents, notification, remaining };
|
|
3792
3800
|
}
|
|
3793
3801
|
/** The body of a `notify;<title>;<body>` OSC 777 payload, or null. */
|
|
@@ -4111,7 +4119,7 @@ function serializeAgentIdentity(agent) {
|
|
|
4111
4119
|
: null;
|
|
4112
4120
|
}
|
|
4113
4121
|
let lastAgentStatusSnapshots = new Map();
|
|
4114
|
-
function broadcastAgentStatus(sessionId, session, force = false) {
|
|
4122
|
+
function broadcastAgentStatus(sessionId, session, force = false, notify = true) {
|
|
4115
4123
|
const payload = buildAgentStatusPayload(sessionId, session);
|
|
4116
4124
|
const snapshot = JSON.stringify(payload);
|
|
4117
4125
|
const previousSnapshot = lastAgentStatusSnapshots.get(sessionId);
|
|
@@ -4123,7 +4131,36 @@ function broadcastAgentStatus(sessionId, session, force = false) {
|
|
|
4123
4131
|
const previous = previousSnapshot
|
|
4124
4132
|
? JSON.parse(previousSnapshot)
|
|
4125
4133
|
: null;
|
|
4126
|
-
|
|
4134
|
+
if (notify)
|
|
4135
|
+
notifyAgentTransition(sessionId, previous, payload);
|
|
4136
|
+
}
|
|
4137
|
+
const nativeStatusRecoveryTimers = new WeakMap();
|
|
4138
|
+
function cancelNativeStatusRecovery(session) {
|
|
4139
|
+
const timer = nativeStatusRecoveryTimers.get(session);
|
|
4140
|
+
if (timer)
|
|
4141
|
+
clearTimeout(timer);
|
|
4142
|
+
nativeStatusRecoveryTimers.delete(session);
|
|
4143
|
+
}
|
|
4144
|
+
/** A matching program's explicit terminal completion can recover a missed
|
|
4145
|
+
* Stop/Interrupt hook. Never infer completion from output silence or CPU. */
|
|
4146
|
+
function scheduleNativeStatusRecovery(sessionId, session, endedApps) {
|
|
4147
|
+
const agent = session.agent, state = session.agentSession;
|
|
4148
|
+
if (!agent || state?.status !== 'working' || !endedApps.some(app => agent.slug === app || agent.aliases.includes(app)))
|
|
4149
|
+
return;
|
|
4150
|
+
cancelNativeStatusRecovery(session);
|
|
4151
|
+
const timer = setTimeout(() => {
|
|
4152
|
+
nativeStatusRecoveryTimers.delete(session);
|
|
4153
|
+
if (terminalSessions.get(sessionId) !== session || session.agent !== agent || session.agentSession !== state || state.status !== 'working')
|
|
4154
|
+
return;
|
|
4155
|
+
if (terminalProgramStatus(session).activeApps().some(app => agent.slug === app || agent.aliases.includes(app)))
|
|
4156
|
+
return;
|
|
4157
|
+
state.status = 'idle';
|
|
4158
|
+
state.message = null;
|
|
4159
|
+
state.presentation = null;
|
|
4160
|
+
broadcastAgentStatus(sessionId, session, false, false);
|
|
4161
|
+
}, 3000);
|
|
4162
|
+
timer.unref?.();
|
|
4163
|
+
nativeStatusRecoveryTimers.set(session, timer);
|
|
4127
4164
|
}
|
|
4128
4165
|
/** Persist the info needed to resume this pane's agent conversation after the
|
|
4129
4166
|
* agent exits / the server restarts (last-known semantics, debounced). */
|
|
@@ -4252,6 +4289,7 @@ function applyAgentSignals(sessionId, session, events, notification) {
|
|
|
4252
4289
|
for (const event of events) {
|
|
4253
4290
|
if (!agentEventMatchesCurrentAgent(session.agent, event))
|
|
4254
4291
|
continue;
|
|
4292
|
+
cancelNativeStatusRecovery(session);
|
|
4255
4293
|
// An event naming an agent brands the pane even when the process poll
|
|
4256
4294
|
// can't see through a wrapper: identity via protocol.
|
|
4257
4295
|
if (!session.agent && event.agent) {
|
|
@@ -5605,11 +5643,11 @@ function processSessionOutput(sessionId, session, data, opts) {
|
|
|
5605
5643
|
// Sniff OSC sequences for CWD tracking + prompt state + title
|
|
5606
5644
|
try {
|
|
5607
5645
|
const buf = session.oscSniffBuf + data;
|
|
5608
|
-
if (buf.length > OSC_SNIFF_CAP) {
|
|
5609
|
-
session.oscSniffBuf = buf.slice(-OSC_SNIFF_CAP / 4); // trim
|
|
5610
|
-
}
|
|
5611
5646
|
const result = sniffOsc(buf, home);
|
|
5612
5647
|
session.oscSniffBuf = result.remaining;
|
|
5648
|
+
const progress = terminalProgramStatus(session).feed(data);
|
|
5649
|
+
if (progress.query && opts.broadcast)
|
|
5650
|
+
session.ptyProcess.write(PROGRAM_STATUS_REPLY);
|
|
5613
5651
|
// CWD change
|
|
5614
5652
|
if (result.cwd && result.cwd !== session.lastOscCwd) {
|
|
5615
5653
|
session.lastOscCwd = result.cwd;
|
|
@@ -5642,8 +5680,8 @@ function processSessionOutput(sessionId, session, data, opts) {
|
|
|
5642
5680
|
refreshGitStatus(sessionId, session);
|
|
5643
5681
|
}
|
|
5644
5682
|
}
|
|
5645
|
-
if (
|
|
5646
|
-
session.tuiProgress =
|
|
5683
|
+
if (progress.changed) {
|
|
5684
|
+
session.tuiProgress = progress.progress;
|
|
5647
5685
|
broadcastJsonWs(sessionId, {
|
|
5648
5686
|
type: 'tui-progress',
|
|
5649
5687
|
tuiProgress: session.tuiProgress,
|
|
@@ -5654,6 +5692,8 @@ function processSessionOutput(sessionId, session, data, opts) {
|
|
|
5654
5692
|
if (result.agentEvents.length > 0 || result.notification) {
|
|
5655
5693
|
applyAgentSignals(sessionId, session, result.agentEvents, result.notification);
|
|
5656
5694
|
}
|
|
5695
|
+
if (progress.endedApps.length)
|
|
5696
|
+
scheduleNativeStatusRecovery(sessionId, session, progress.endedApps);
|
|
5657
5697
|
}
|
|
5658
5698
|
catch { /* sniff failure should never block data */ }
|
|
5659
5699
|
appendAutoTitleContext(sessionId, session, data, opts.broadcast);
|
|
@@ -5672,6 +5712,11 @@ function setupPtyHandlers(sessionId, session) {
|
|
|
5672
5712
|
});
|
|
5673
5713
|
session.exitDisposable = session.ptyProcess.onExit(({ exitCode, signal }) => {
|
|
5674
5714
|
console.log(`Terminal session ${sessionId} exited with code ${exitCode}, signal ${signal}`);
|
|
5715
|
+
const progress = terminalProgramStatus(session).exit();
|
|
5716
|
+
if (progress.changed) {
|
|
5717
|
+
session.tuiProgress = progress.progress;
|
|
5718
|
+
broadcastEvent(sessionId, { type: 'tui-progress', tuiProgress: session.tuiProgress });
|
|
5719
|
+
}
|
|
5675
5720
|
broadcastEvent(sessionId, { type: 'exit', exitCode, signal });
|
|
5676
5721
|
// User-initiated closes dispose this listener before killing the pty, so
|
|
5677
5722
|
// reaching here means the process exited on its own. Sessions with a live
|
|
@@ -5729,8 +5774,8 @@ async function spawnTerminalSession(req, input) {
|
|
|
5729
5774
|
}
|
|
5730
5775
|
async function spawnTerminalSessionUnlocked(req, input) {
|
|
5731
5776
|
const cwd = await resolveWorkingDirectory(req, input.cwd);
|
|
5732
|
-
|
|
5733
|
-
|
|
5777
|
+
let cols = input.cols || 80;
|
|
5778
|
+
let rows = input.rows || 24;
|
|
5734
5779
|
const sessionId = Math.random().toString(36).substring(2, 15) +
|
|
5735
5780
|
Math.random().toString(36).substring(2, 15);
|
|
5736
5781
|
let mode = normalizeMode(input.mode);
|
|
@@ -5752,6 +5797,7 @@ async function spawnTerminalSessionUnlocked(req, input) {
|
|
|
5752
5797
|
}
|
|
5753
5798
|
else
|
|
5754
5799
|
await prepareManagedTmuxSession(tmuxSessionName, cwd);
|
|
5800
|
+
({ cols, rows } = await readTmuxObserverSize(runTmux, input.tmuxAttachTarget ?? `=${tmuxSessionName}`));
|
|
5755
5801
|
}
|
|
5756
5802
|
const command = mode === 'tmux'
|
|
5757
5803
|
? getTmuxBinary()
|
|
@@ -6610,6 +6656,23 @@ router.get('/session-inventory', async (_req, res) => {
|
|
|
6610
6656
|
}
|
|
6611
6657
|
});
|
|
6612
6658
|
const todoRuntime = {
|
|
6659
|
+
async target(id) {
|
|
6660
|
+
const record = globalSessionState.sessions.find(session => session.sessionId === id);
|
|
6661
|
+
if (!record)
|
|
6662
|
+
throw new TodoError('这个会话已关闭,请重新选择', 409);
|
|
6663
|
+
const route = await resolveCollaborationRoute(id);
|
|
6664
|
+
const facts = orchestrationSessionSnapshot(record);
|
|
6665
|
+
if (route.state !== 'ready' || route.isShell || !facts.agent)
|
|
6666
|
+
throw new TodoError('这个会话暂时无法接收待办,请先在终端启动 Agent', 409);
|
|
6667
|
+
const launcher = (await listDetectedAgentLaunchers()).find(agent => agent.slug === facts.agent.slug);
|
|
6668
|
+
return { name: facts.name, config: { agentSlug: facts.agent.slug, command: launcher?.command ?? facts.agent.slug, cwd: record.cwd ?? '', prompt: '' } };
|
|
6669
|
+
},
|
|
6670
|
+
async deliver(run, prompt) {
|
|
6671
|
+
const route = await resolveCollaborationRoute(run.sessionId);
|
|
6672
|
+
if (route.state !== 'ready' || route.isShell || !route.writeText)
|
|
6673
|
+
throw new TodoError('目标会话状态已变化,请检查终端后重试', 409);
|
|
6674
|
+
await route.writeText(prompt);
|
|
6675
|
+
},
|
|
6613
6676
|
async validate(config, req) {
|
|
6614
6677
|
const launcher = (await listDetectedAgentLaunchers()).find(agent => agent.slug === config.agentSlug);
|
|
6615
6678
|
if (!launcher)
|
|
@@ -7815,16 +7878,7 @@ router.put('/settings', async (req, res) => {
|
|
|
7815
7878
|
setRightSidebarTabsSetting(body.rightSidebarTabs);
|
|
7816
7879
|
}
|
|
7817
7880
|
if (body.androidPanel && typeof body.androidPanel === 'object') {
|
|
7818
|
-
|
|
7819
|
-
const merged = normalizeAndroidPanel({ ...getAndroidPanelSetting(), ...body.androidPanel });
|
|
7820
|
-
setAndroidPanelSetting({
|
|
7821
|
-
enabled: merged.enabled,
|
|
7822
|
-
quality: merged.quality,
|
|
7823
|
-
activePresetId: merged.activePresetId,
|
|
7824
|
-
presets: merged.presets,
|
|
7825
|
-
docked: merged.docked,
|
|
7826
|
-
deviceSerial: merged.deviceSerial,
|
|
7827
|
-
});
|
|
7881
|
+
setAndroidPanelSetting(body.androidPanel);
|
|
7828
7882
|
}
|
|
7829
7883
|
if (body.collaborationPanel && typeof body.collaborationPanel.clientId === 'string') {
|
|
7830
7884
|
setCollaborationPanelSetting(body.collaborationPanel.clientId, body.collaborationPanel.state);
|
|
@@ -8089,7 +8143,7 @@ router.post('/agent-hooks/:agent/install', async (req, res) => {
|
|
|
8089
8143
|
const agent = req.params.agent;
|
|
8090
8144
|
try {
|
|
8091
8145
|
const result = await installHooksForSlug(agent);
|
|
8092
|
-
res.json({ agent, ...result, state:
|
|
8146
|
+
res.json({ agent, ...result, state: await runtimeHooksStateForSlug(agent) });
|
|
8093
8147
|
}
|
|
8094
8148
|
catch (error) {
|
|
8095
8149
|
res.status(400).json({ error: error.message });
|
|
@@ -9065,16 +9119,18 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9065
9119
|
let clientPaused = false;
|
|
9066
9120
|
let replayRequest = null;
|
|
9067
9121
|
let replayRetryTimer = null;
|
|
9068
|
-
let clientCols = session.cols;
|
|
9069
|
-
let clientRows = session.rows;
|
|
9070
|
-
let initialAttachmentResize = true;
|
|
9071
9122
|
let tmuxSizeOwnershipSupported = false;
|
|
9072
9123
|
let initialScreen = null;
|
|
9073
|
-
if (initialDimensions && options.independentTmux) {
|
|
9074
|
-
clientCols = initialDimensions.cols;
|
|
9075
|
-
clientRows = initialDimensions.rows;
|
|
9076
|
-
}
|
|
9077
9124
|
const ownTmux = session.mode === 'tmux' && options.independentTmux === true;
|
|
9125
|
+
const displayGeometry = ownTmux ? new TmuxDisplayGeometry(session, runTmux, session.tmuxSessionName, () => {
|
|
9126
|
+
const pids = new Set();
|
|
9127
|
+
for (const client of wsClients.get(sessionId)?.values() ?? []) {
|
|
9128
|
+
const pid = tmuxAttachments.get(client)?.pid;
|
|
9129
|
+
if (pid !== undefined)
|
|
9130
|
+
pids.add(pid);
|
|
9131
|
+
}
|
|
9132
|
+
return pids;
|
|
9133
|
+
}, initialDimensions) : null;
|
|
9078
9134
|
if (ownTmux)
|
|
9079
9135
|
independentTmuxClients.add(ws);
|
|
9080
9136
|
const attachment = ownTmux ? new TerminalClientAttachment(async (cols, rows) => {
|
|
@@ -9083,13 +9139,7 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9083
9139
|
const tmuxBinary = getTmuxBinary();
|
|
9084
9140
|
const supportsFeatures = await supportsTmuxClientFeatures(tmuxBinary);
|
|
9085
9141
|
tmuxSizeOwnershipSupported = supportsFeatures;
|
|
9086
|
-
|
|
9087
|
-
// owns an attached client. Resolve by exact PID, never another client.
|
|
9088
|
-
const raw = await runTmux(['list-clients', '-t', session.tmuxSessionName, '-F', '#{client_pid} #{client_tty}']);
|
|
9089
|
-
const metadata = raw.split('\n').map(line => line.trim().split(/\s+/))
|
|
9090
|
-
.find(([pid]) => pid === String(session.ptyProcess.pid));
|
|
9091
|
-
if (metadata?.[1] && supportsFeatures)
|
|
9092
|
-
await runTmux(['refresh-client', '-t', metadata[1], '-f', 'ignore-size']);
|
|
9142
|
+
await displayGeometry.prepareAttach({ cols, rows }, supportsFeatures);
|
|
9093
9143
|
const env = buildInteractiveColorEnvironment({ ...process.env, PATH: buildAugmentedPath() });
|
|
9094
9144
|
delete env.TMUX;
|
|
9095
9145
|
delete env.TMUX_PANE;
|
|
@@ -9134,7 +9184,7 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9134
9184
|
attachment.close();
|
|
9135
9185
|
initialScreen?.cancel();
|
|
9136
9186
|
initialScreen = null;
|
|
9137
|
-
|
|
9187
|
+
displayGeometry.reset();
|
|
9138
9188
|
delivery.setActive(false); // Discard only this observer's obsolete stream.
|
|
9139
9189
|
}
|
|
9140
9190
|
replayRequest = (async () => {
|
|
@@ -9175,20 +9225,16 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9175
9225
|
if (delivery.active) {
|
|
9176
9226
|
const screen = new TmuxInitialScreen();
|
|
9177
9227
|
initialScreen = screen;
|
|
9178
|
-
if (!await attachment.open(
|
|
9228
|
+
if (!await attachment.open(displayGeometry.size.cols, displayGeometry.size.rows)) {
|
|
9179
9229
|
screen.cancel();
|
|
9180
9230
|
return;
|
|
9181
9231
|
}
|
|
9182
9232
|
const first = await screen.ready;
|
|
9183
|
-
if (initialScreen === screen)
|
|
9184
|
-
initialScreen = null;
|
|
9185
9233
|
if (first.status === 'cancelled' || ws.readyState !== ws.OPEN)
|
|
9186
9234
|
return;
|
|
9187
9235
|
if (first.status === 'overflow')
|
|
9188
9236
|
throw new Error('Initial tmux screen exceeded output budget');
|
|
9189
|
-
|
|
9190
|
-
// reset followed by the screen in a second client write. Subsequent
|
|
9191
|
-
// bytes already wait in delivery and retain their original ordering.
|
|
9237
|
+
initialScreen = null;
|
|
9192
9238
|
replayChunks = first.data ? [first.data] : ['\x1bc'];
|
|
9193
9239
|
}
|
|
9194
9240
|
else {
|
|
@@ -9228,8 +9274,8 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9228
9274
|
streamEpoch: TERMINAL_STREAM_EPOCH,
|
|
9229
9275
|
outputProtocol: options.flowControl ? 2 : undefined,
|
|
9230
9276
|
copyModeInput: ownTmux,
|
|
9231
|
-
cols: session.cols,
|
|
9232
|
-
rows: session.rows,
|
|
9277
|
+
cols: displayGeometry?.size.cols ?? session.cols,
|
|
9278
|
+
rows: displayGeometry?.size.rows ?? session.rows,
|
|
9233
9279
|
runtime,
|
|
9234
9280
|
ptyBackend: session.ptyBackend || 'unknown',
|
|
9235
9281
|
mode: session.mode,
|
|
@@ -9280,7 +9326,11 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9280
9326
|
}
|
|
9281
9327
|
else if (ws.readyState === ws.OPEN)
|
|
9282
9328
|
ws.close(1011, 'Replay unavailable');
|
|
9283
|
-
}).finally(() => {
|
|
9329
|
+
}).finally(() => {
|
|
9330
|
+
initialScreen?.cancel();
|
|
9331
|
+
initialScreen = null;
|
|
9332
|
+
replayRequest = null;
|
|
9333
|
+
});
|
|
9284
9334
|
return replayRequest;
|
|
9285
9335
|
};
|
|
9286
9336
|
if (attachment)
|
|
@@ -9359,38 +9409,19 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9359
9409
|
if (Number.isFinite(cols) && Number.isFinite(rows) && cols > 0 && rows > 0) {
|
|
9360
9410
|
if (attachment) {
|
|
9361
9411
|
await enqueueTmuxIo(session, async () => {
|
|
9362
|
-
const
|
|
9363
|
-
|
|
9364
|
-
for (const client of wsClients.get(sessionId)?.values() ?? []) {
|
|
9365
|
-
const pid = tmuxAttachments.get(client)?.pid;
|
|
9366
|
-
if (pid !== undefined)
|
|
9367
|
-
displayPids.add(pid);
|
|
9368
|
-
}
|
|
9369
|
-
if (tmuxSizeOwnershipSupported) {
|
|
9370
|
-
await claimTmuxSize(runTmux, session.tmuxSessionName, attachment.pid, displayPids);
|
|
9371
|
-
}
|
|
9372
|
-
const sameSize = clientCols === cleanCols && clientRows === cleanRows;
|
|
9373
|
-
const ok = sameSize ? attachment.attached : attachment.resize(cleanCols, cleanRows);
|
|
9374
|
-
if (ok) {
|
|
9375
|
-
// The first resize confirms the grid supplied at attachment.
|
|
9376
|
-
// Its PTY is already drawing that grid; forcing refresh-client
|
|
9377
|
-
// here repeats the initial clear/full redraw. Later same-size
|
|
9378
|
-
// requests remain explicit display recovery requests.
|
|
9379
|
-
const needsRedraw = sameSize && !initialAttachmentResize;
|
|
9380
|
-
initialAttachmentResize = false;
|
|
9381
|
-
clientCols = cleanCols;
|
|
9382
|
-
clientRows = cleanRows;
|
|
9412
|
+
const result = await displayGeometry.resize(attachment, { cols, rows }, tmuxSizeOwnershipSupported);
|
|
9413
|
+
if (result.ok) {
|
|
9383
9414
|
session.lastActivity = Date.now();
|
|
9384
9415
|
broadcastJsonWs(sessionId, {
|
|
9385
|
-
type: 'pty-size', cols:
|
|
9416
|
+
type: 'pty-size', cols: result.cols, rows: result.rows, source: `ws-resize:${clientId}`,
|
|
9386
9417
|
}, clientId);
|
|
9387
|
-
if (
|
|
9418
|
+
if (result.redraw)
|
|
9388
9419
|
await redrawTmuxClient(runTmux, session.tmuxSessionName, attachment.pid);
|
|
9389
9420
|
}
|
|
9390
9421
|
if (ws.readyState === ws.OPEN)
|
|
9391
9422
|
ws.send(JSON.stringify({
|
|
9392
9423
|
type: 'resize-ack', seq: typeof msg.seq === 'number' ? msg.seq : undefined,
|
|
9393
|
-
ok, cols:
|
|
9424
|
+
ok: result.ok, cols: result.cols, rows: result.rows, screenSyncPending: false,
|
|
9394
9425
|
}));
|
|
9395
9426
|
});
|
|
9396
9427
|
break;
|
|
@@ -9475,10 +9506,17 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
|
|
|
9475
9506
|
break;
|
|
9476
9507
|
outputWanted = msg.active;
|
|
9477
9508
|
const resumed = delivery.setActive(outputWanted);
|
|
9478
|
-
if (!delivery.active)
|
|
9509
|
+
if (!delivery.active) {
|
|
9479
9510
|
attachment?.close();
|
|
9511
|
+
initialScreen?.cancel();
|
|
9512
|
+
}
|
|
9480
9513
|
if (resumed && delivery.active) {
|
|
9481
|
-
|
|
9514
|
+
// A rapid hide/show can resume while the cancelled first redraw
|
|
9515
|
+
// is still unwinding. Start a new attachment after it has settled.
|
|
9516
|
+
await replayRequest;
|
|
9517
|
+
if (ws.readyState === ws.OPEN && outputWanted) {
|
|
9518
|
+
void sendReplay(typeof msg.since === 'number' ? msg.since : 0, typeof msg.epoch === 'string' ? msg.epoch : undefined);
|
|
9519
|
+
}
|
|
9482
9520
|
}
|
|
9483
9521
|
break;
|
|
9484
9522
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function isValidAndroidSerial(serial) {
|
|
2
|
+
if (!serial || serial.length > 128 || !/^(?:[0-9a-zA-Z_.:\-]+|\[[0-9a-fA-F:.]+\]:\d{1,5})$/.test(serial))
|
|
3
|
+
return false;
|
|
4
|
+
return serial.startsWith('[') || /^[^:]+:\d+$/.test(serial) ? normalizeAndroidAddress(serial) !== null : true;
|
|
5
|
+
}
|
|
6
|
+
export function normalizeAndroidAddress(raw) {
|
|
7
|
+
let value = raw.trim();
|
|
8
|
+
const pasted = /^[a-z]+:\/\/([^/]+)/i.exec(value);
|
|
9
|
+
if (pasted)
|
|
10
|
+
value = pasted[1];
|
|
11
|
+
value = value.replace(/^\/+|\/+$/g, '');
|
|
12
|
+
const v6 = /^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(value);
|
|
13
|
+
if (v6) {
|
|
14
|
+
try {
|
|
15
|
+
new URL(`http://[${v6[1]}]`);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const port = v6[2] ?? '5555';
|
|
21
|
+
return Number(port) >= 1 && Number(port) <= 65535 ? `[${v6[1]}]:${port}` : null;
|
|
22
|
+
}
|
|
23
|
+
if (!/^[0-9a-zA-Z_.\-]+(?::\d{1,5})?$/.test(value))
|
|
24
|
+
return null;
|
|
25
|
+
const [host, port = '5555'] = value.split(':');
|
|
26
|
+
if (/^\d+\.\d+\.\d+\.\d+$/.test(host) && host.split('.').some(part => Number(part) > 255))
|
|
27
|
+
return null;
|
|
28
|
+
return Number(port) >= 1 && Number(port) <= 65535 ? `${host}:${port}` : null;
|
|
29
|
+
}
|
|
30
|
+
export function androidDeviceKey(device) {
|
|
31
|
+
return device.physicalId ? `physical:${device.physicalId}` : `serial:${device.serial}`;
|
|
32
|
+
}
|
|
33
|
+
export function groupAndroidDevices(devices, selectedSerial = '') {
|
|
34
|
+
const groups = new Map();
|
|
35
|
+
const rank = (device) => (device.state === 'device' ? 0 : 10)
|
|
36
|
+
+ (device.serial === selectedSerial ? 0 : !device.isNetwork ? 1 : device.serial.startsWith('[') ? 3 : 2);
|
|
37
|
+
for (const device of devices) {
|
|
38
|
+
const key = androidDeviceKey(device), group = groups.get(key);
|
|
39
|
+
if (!group)
|
|
40
|
+
groups.set(key, { key, device, routes: [device] });
|
|
41
|
+
else {
|
|
42
|
+
group.routes.push(device);
|
|
43
|
+
if (rank(device) < rank(group.device))
|
|
44
|
+
group.device = device;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return [...groups.values()];
|
|
48
|
+
}
|
|
49
|
+
/** Never switch an explicit selection to an unrelated phone. */
|
|
50
|
+
export function resolveAndroidSelection(devices, serial, physicalId) {
|
|
51
|
+
const groups = groupAndroidDevices(devices, serial);
|
|
52
|
+
const exact = devices.find(device => device.serial === serial);
|
|
53
|
+
const identity = physicalId || exact?.physicalId;
|
|
54
|
+
if (identity)
|
|
55
|
+
return groups.find(group => group.device.physicalId === identity)?.device;
|
|
56
|
+
if (serial)
|
|
57
|
+
return exact;
|
|
58
|
+
const ready = groups.filter(group => group.device.state === 'device');
|
|
59
|
+
return ready.length === 1 ? ready[0].device : undefined;
|
|
60
|
+
}
|
|
61
|
+
export function androidRouteAccess(grants, serial) {
|
|
62
|
+
const matching = grants?.filter(grant => grant.serial === serial) || [];
|
|
63
|
+
return matching.some(grant => grant.access === 'control') ? 'control' : matching.length ? 'view' : undefined;
|
|
64
|
+
}
|