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
|
@@ -23,15 +23,53 @@ export function sessionChatRoutes(options) {
|
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
const group = options.store.list().find(g => g.name === ctx.groupName && !g.federated && g.sessionIds.length === 1 && g.sessionIds[0] === ctx.session.sessionId);
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
26
|
+
const paged = req.query.limit !== undefined;
|
|
27
|
+
const limit = paged ? Number(req.query.limit) : 500;
|
|
28
|
+
const before = req.query.before, after = req.query.after, requestId = req.query.requestId;
|
|
29
|
+
if (paged && (typeof req.query.limit !== 'string' || !/^\d{1,2}$/.test(req.query.limit) || limit < 1 || limit > 60
|
|
30
|
+
|| before !== undefined && (typeof before !== 'string' || before.length > 128)
|
|
31
|
+
|| after !== undefined && (typeof after !== 'string' || after.length > 128)
|
|
32
|
+
|| before !== undefined && after !== undefined
|
|
33
|
+
|| requestId !== undefined && (typeof requestId !== 'string' || !/^[a-zA-Z0-9_-]{16,100}$/.test(requestId)))) {
|
|
34
|
+
res.status(400).json({ error: '对话分页参数无效' });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const history = group ? options.store.listGroupMessages(group.id) : [];
|
|
38
|
+
const originals = new Map(history.map(message => [message.id, message]));
|
|
39
|
+
const visible = history.filter(message => {
|
|
40
|
+
if (message.integrationOrigin?.source === 'session-chat')
|
|
29
41
|
return true;
|
|
30
|
-
const original = message.toPrincipalId && message.replyTo ?
|
|
31
|
-
return original?.groupId === group
|
|
32
|
-
})
|
|
42
|
+
const original = message.toPrincipalId && message.replyTo ? originals.get(message.replyTo) : null;
|
|
43
|
+
return original?.groupId === group?.id && message.toPrincipalId === original?.integrationOrigin?.integrationId && original?.integrationOrigin?.source === 'session-chat';
|
|
44
|
+
});
|
|
45
|
+
const cursor = before ?? after;
|
|
46
|
+
const anchor = cursor === undefined ? -1 : visible.findIndex(message => message.id === cursor);
|
|
47
|
+
if (paged && cursor !== undefined && anchor < 0) {
|
|
48
|
+
res.status(404).json({ error: '这段对话已不可用,请返回最新消息', code: 'CHAT_CURSOR_UNAVAILABLE' });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const end = !paged || cursor === undefined ? visible.length : before !== undefined ? anchor : Math.min(visible.length, anchor + 1 + limit);
|
|
52
|
+
const start = paged && after !== undefined ? anchor + 1 : Math.max(0, end - limit);
|
|
53
|
+
const project = (m) => ({ id: m.id, role: m.toPrincipalId ? 'assistant' : 'user', ...(m.toPrincipalId ? chatPresentation(m.content, m.metadata) : { content: m.content }), ...(m.uiState ? { uiState: m.uiState } : {}), createdAt: m.createdAt, status: m.status === 'read' ? 'delivered' : m.status, replyTo: m.replyTo, requestId: m.idempotencyKey, responseKind: m.responseKind, ...(paged ? { sequence: m.sequence } : {}) });
|
|
54
|
+
const messages = visible.slice(start, end).map(project);
|
|
55
|
+
// Refresh only the small tail already displayed, including delivery and
|
|
56
|
+
// form revisions, while fetching subsequent replies contiguously.
|
|
57
|
+
const updates = paged && after !== undefined ? visible.slice(Math.max(0, anchor + 1 - limit), anchor + 1).map(project) : undefined;
|
|
58
|
+
const page = paged ? { hasOlder: start > 0, hasNewer: end < visible.length, mode: before !== undefined ? 'before' : after !== undefined ? 'after' : 'latest' } : undefined;
|
|
59
|
+
let lastRequest;
|
|
60
|
+
for (let index = visible.length - 1; index >= 0; index--)
|
|
61
|
+
if (!visible[index].toPrincipalId) {
|
|
62
|
+
lastRequest = visible[index];
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
const replyPending = !!lastRequest && !['failed', 'expired'].includes(lastRequest.status) && !visible.some(message => message.toPrincipalId && message.replyTo === lastRequest.id && !['ack', 'progress'].includes(message.responseKind || ''));
|
|
66
|
+
const confirmedRequestId = paged && typeof requestId === 'string' && visible.some(message => !message.toPrincipalId && message.idempotencyKey === requestId) ? requestId : undefined;
|
|
67
|
+
const payload = { messages, ...(updates ? { updates } : {}), ...(page ? { page, replyPending, ...(confirmedRequestId ? { confirmedRequestId } : {}) } : {}), agentAvailable: !!ctx.session.agent, agent: ctx.session.agent ? { slug: ctx.session.agent.slug, displayName: ctx.session.agent.displayName || ctx.session.agent.slug } : null };
|
|
68
|
+
const revision = createHash('sha256').update(JSON.stringify(payload)).digest('base64url');
|
|
33
69
|
res.setHeader('Cache-Control', 'no-store');
|
|
34
|
-
|
|
70
|
+
// A JSON acknowledgement works inside the encrypted transport and keeps
|
|
71
|
+
// older clients compatible; no HTTP cache contains conversation bodies.
|
|
72
|
+
res.json(req.query.revision === revision ? { unchanged: true, revision } : { ...payload, revision });
|
|
35
73
|
});
|
|
36
74
|
router.put('/:sessionId/chat/:messageId/state', (req, res) => {
|
|
37
75
|
const ctx = context(req), body = req.body;
|
package/dist/server/agentHook.js
CHANGED
|
@@ -48,6 +48,19 @@ const MAX_STDIN = 64 * 1024;
|
|
|
48
48
|
* asking the user a question) survives there.
|
|
49
49
|
*/
|
|
50
50
|
function effectiveEvent(agent, event, stdinJson) {
|
|
51
|
+
// These tools ask a question without opening a permission dialog. Ordinary
|
|
52
|
+
// tool starts must stay silent so they cannot manufacture a waiting state.
|
|
53
|
+
if (event === 'tool-start') {
|
|
54
|
+
try {
|
|
55
|
+
const tool = JSON.parse(stdinJson)?.tool_name;
|
|
56
|
+
return (agent === 'claude' && tool === 'AskUserQuestion')
|
|
57
|
+
|| (agent === 'codex' && tool === 'request_user_input')
|
|
58
|
+
? 'question-asked' : null;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
51
64
|
if ((agent === 'copilot' || agent === 'grok') && event === 'notification') {
|
|
52
65
|
const blocks = stdinJson.includes('elicitation_dialog')
|
|
53
66
|
|| (agent === 'copilot' && stdinJson.includes('permission_prompt'));
|
|
@@ -56,11 +69,29 @@ function effectiveEvent(agent, event, stdinJson) {
|
|
|
56
69
|
return event;
|
|
57
70
|
}
|
|
58
71
|
/** Write raw bytes to a tty device, best-effort. */
|
|
59
|
-
function writeDev(path, bytes) {
|
|
72
|
+
async function writeDev(path, bytes) {
|
|
60
73
|
try {
|
|
61
|
-
|
|
74
|
+
// A leftover tmux client may no longer drain its PTY. It must not block
|
|
75
|
+
// this hook before the current observer gets its copy of the event.
|
|
76
|
+
const fd = fs.openSync(path, fs.constants.O_WRONLY | fs.constants.O_NONBLOCK | fs.constants.O_NOCTTY);
|
|
62
77
|
try {
|
|
63
|
-
|
|
78
|
+
const buffer = Buffer.from(bytes);
|
|
79
|
+
let offset = 0;
|
|
80
|
+
const deadline = Date.now() + 250;
|
|
81
|
+
while (offset < buffer.length) {
|
|
82
|
+
try {
|
|
83
|
+
const written = fs.writeSync(fd, buffer, offset, buffer.length - offset);
|
|
84
|
+
if (written <= 0)
|
|
85
|
+
return false;
|
|
86
|
+
offset += written;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const code = error.code;
|
|
90
|
+
if (!['EAGAIN', 'EWOULDBLOCK', 'EINTR'].includes(code ?? '') || Date.now() >= deadline)
|
|
91
|
+
return false;
|
|
92
|
+
await new Promise(resolve => setTimeout(resolve, 2));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
64
95
|
}
|
|
65
96
|
finally {
|
|
66
97
|
fs.closeSync(fd);
|
|
@@ -156,26 +187,29 @@ function tmuxClientTtyDevices() {
|
|
|
156
187
|
* enabled, as termdock sets on managed sessions) forwards to its client —
|
|
157
188
|
* the termdock server — as the plain inner OSC.
|
|
158
189
|
*/
|
|
159
|
-
function writeToControllingTty(sequence, inTmuxPane) {
|
|
190
|
+
async function writeToControllingTty(sequence, inTmuxPane) {
|
|
160
191
|
if (inTmuxPane) {
|
|
161
192
|
const clientTtys = tmuxClientTtyDevices();
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
193
|
+
// A surviving client from a previous server may be listed first. Deliver
|
|
194
|
+
// to every managed observer; short-circuiting at the first successful
|
|
195
|
+
// write leaves the current server without any lifecycle events.
|
|
196
|
+
const delivered = await Promise.all(clientTtys.map(device => writeDev(device, sequence)));
|
|
197
|
+
if (delivered.includes(true))
|
|
198
|
+
return true;
|
|
165
199
|
}
|
|
166
200
|
// Only genuine tmux panes (TMUX_PANE is set by tmux itself) get the DCS
|
|
167
201
|
// passthrough wrap; a bare inherited TMUX just means an ancestor ran tmux.
|
|
168
202
|
const wire = inTmuxPane
|
|
169
203
|
? `\x1bPtmux;${sequence.replace(/\x1b/g, '\x1b\x1b')}\x1b\\`
|
|
170
204
|
: sequence;
|
|
171
|
-
if (writeDev('/dev/tty', wire))
|
|
205
|
+
if (await writeDev('/dev/tty', wire))
|
|
172
206
|
return true;
|
|
173
207
|
const dev = ancestorTtyDevice();
|
|
174
208
|
if (dev)
|
|
175
209
|
return writeDev(dev, wire);
|
|
176
210
|
return false;
|
|
177
211
|
}
|
|
178
|
-
function main() {
|
|
212
|
+
async function main() {
|
|
179
213
|
try {
|
|
180
214
|
// Gate: emit when (a) inside a termdock-spawned shell (TERMDOCK env), or
|
|
181
215
|
// (b) inside any tmux pane (TMUX+TMUX_PANE) — there the passthrough wrap
|
|
@@ -205,18 +239,28 @@ function main() {
|
|
|
205
239
|
let input = '';
|
|
206
240
|
if (!process.stdin.isTTY) {
|
|
207
241
|
try {
|
|
208
|
-
|
|
242
|
+
const chunks = [];
|
|
243
|
+
let size = 0;
|
|
244
|
+
for await (const chunk of process.stdin) {
|
|
245
|
+
const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
246
|
+
const part = bytes.subarray(0, MAX_STDIN - size);
|
|
247
|
+
chunks.push(part);
|
|
248
|
+
size += part.length;
|
|
249
|
+
if (size >= MAX_STDIN)
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
input = Buffer.concat(chunks).toString('utf8');
|
|
209
253
|
}
|
|
210
254
|
catch { /* no payload */ }
|
|
211
255
|
}
|
|
212
256
|
const event = effectiveEvent(agent, eventArg, input);
|
|
213
257
|
if (!event)
|
|
214
258
|
return;
|
|
215
|
-
writeToControllingTty(buildHookSequence(agent, event, input, statusArg || undefined), inTmuxPane);
|
|
259
|
+
await writeToControllingTty(buildHookSequence(agent, event, input, statusArg || undefined), inTmuxPane);
|
|
216
260
|
}
|
|
217
261
|
catch {
|
|
218
262
|
// Never break the agent's flow.
|
|
219
263
|
}
|
|
220
264
|
process.exit(0);
|
|
221
265
|
}
|
|
222
|
-
main();
|
|
266
|
+
void main();
|
|
@@ -2,7 +2,7 @@ import { execFile } from 'node:child_process';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { delimiter, join } from 'node:path';
|
|
4
4
|
import { promisify } from 'node:util';
|
|
5
|
-
import {
|
|
5
|
+
import { normalizeAndroidAddress } from '../shared/androidDevices.js';
|
|
6
6
|
import { createHash } from 'node:crypto';
|
|
7
7
|
const execFileAsync = promisify(execFile);
|
|
8
8
|
const EXTRA_PATH = ['/usr/local/bin', '/opt/homebrew/bin', '/opt/local/bin', '/usr/bin', '/usr/lib/android-sdk/platform-tools'];
|
|
@@ -117,6 +117,8 @@ export async function getDeviceProperties(serial) {
|
|
|
117
117
|
return {};
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
const deviceIdentities = new Map();
|
|
121
|
+
const IDENTITY_TTL = 5 * 60_000;
|
|
120
122
|
export async function listDevices() {
|
|
121
123
|
const output = await runAdb(['devices', '-l'], { timeout: 10_000 });
|
|
122
124
|
const devices = [];
|
|
@@ -127,9 +129,27 @@ export async function listDevices() {
|
|
|
127
129
|
if (info)
|
|
128
130
|
devices.push(info);
|
|
129
131
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
+
const now = Date.now();
|
|
133
|
+
for (const [key, value] of deviceIdentities)
|
|
134
|
+
if (now - value.observed > IDENTITY_TTL)
|
|
135
|
+
deviceIdentities.delete(key);
|
|
136
|
+
const namespace = resolveAdbBinary() || '';
|
|
137
|
+
await Promise.all(devices.map(async (device) => {
|
|
138
|
+
const key = `${namespace}:${device.serial}`;
|
|
139
|
+
if (device.state === 'device') {
|
|
140
|
+
Object.assign(device, await getDeviceProperties(device.serial));
|
|
141
|
+
deviceIdentities.delete(key);
|
|
142
|
+
if (device.physicalId)
|
|
143
|
+
deviceIdentities.set(key, { physicalId: device.physicalId, observed: now });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const previous = deviceIdentities.get(key);
|
|
147
|
+
if (previous)
|
|
148
|
+
device.physicalId = previous.physicalId;
|
|
149
|
+
}
|
|
132
150
|
}));
|
|
151
|
+
while (deviceIdentities.size > 512)
|
|
152
|
+
deviceIdentities.delete(deviceIdentities.keys().next().value);
|
|
133
153
|
return devices;
|
|
134
154
|
}
|
|
135
155
|
export async function connectDevice(address) {
|
|
@@ -148,31 +168,4 @@ export async function disconnectDevice(address) {
|
|
|
148
168
|
return (await runAdb(['disconnect', normalized], { timeout: 10_000 })).trim();
|
|
149
169
|
}
|
|
150
170
|
/** 接受 `ip:port`、纯 ip(补 5555)、或带 scheme/路径的粘贴内容。 */
|
|
151
|
-
export
|
|
152
|
-
let value = raw.trim();
|
|
153
|
-
if (!value)
|
|
154
|
-
return null;
|
|
155
|
-
const urlMatch = /^[a-z]+:\/\/([^/]+)/i.exec(value);
|
|
156
|
-
if (urlMatch)
|
|
157
|
-
value = urlMatch[1];
|
|
158
|
-
value = value.replace(/^\/+|\/+$/g, '');
|
|
159
|
-
const ipv6 = /^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(value);
|
|
160
|
-
if (ipv6) {
|
|
161
|
-
if (isIP(ipv6[1]) !== 6)
|
|
162
|
-
return null;
|
|
163
|
-
const port = ipv6[2] ?? '5555';
|
|
164
|
-
if (Number(port) < 1 || Number(port) > 65535)
|
|
165
|
-
return null;
|
|
166
|
-
return `[${ipv6[1]}]:${port}`;
|
|
167
|
-
}
|
|
168
|
-
if (!/^[0-9a-zA-Z_.\-]+(?::\d+)?$/.test(value))
|
|
169
|
-
return null;
|
|
170
|
-
if (!value.includes(':') && /^\d+\.\d+\.\d+\.\d+$/.test(value))
|
|
171
|
-
value = `${value}:5555`;
|
|
172
|
-
const [host, port] = value.split(':');
|
|
173
|
-
if (port !== undefined && !/^\d{1,5}$/.test(port))
|
|
174
|
-
return null;
|
|
175
|
-
if (!host)
|
|
176
|
-
return null;
|
|
177
|
-
return port === undefined ? `${host}:5555` : `${host}:${port}`;
|
|
178
|
-
}
|
|
171
|
+
export const normalizeAddress = normalizeAndroidAddress;
|
package/dist/server/cli.js
CHANGED
|
@@ -26,7 +26,7 @@ import { detectLocalSessionContext, resolveLocalCollaborationContext } from './a
|
|
|
26
26
|
import { parseAutomationCommand, executeAutomationCommand, AUTOMATION_HELP } from './agent/automationCli.js';
|
|
27
27
|
import { parseCollaborationCommand, executeCollaborationCommand, COLLAB_HELP } from './agent/collaborationCli.js';
|
|
28
28
|
import fs from 'fs';
|
|
29
|
-
import {
|
|
29
|
+
import { localCertificateNeedsRefresh, setupLocalHttps } from './utils/localHttpsSetup.js';
|
|
30
30
|
import http from 'http';
|
|
31
31
|
import https from 'https';
|
|
32
32
|
import path from 'path';
|
|
@@ -140,7 +140,8 @@ Options:
|
|
|
140
140
|
--https-key <p> HTTPS private key path for local access
|
|
141
141
|
--https-ca <p> CA certificate path exposed through a temporary mobile setup server
|
|
142
142
|
--setup-local-https
|
|
143
|
-
Generate
|
|
143
|
+
Generate local HTTPS certs; install verified mkcert if needed
|
|
144
|
+
--no-install-ca Generate certificates without changing local trust stores
|
|
144
145
|
--foreground Run in the foreground
|
|
145
146
|
--supervise Like --foreground, but under the process supervisor
|
|
146
147
|
(auto-restarts on crash, records why). Use this for
|
|
@@ -189,7 +190,7 @@ Options:
|
|
|
189
190
|
--plugin-create <file>
|
|
190
191
|
Create a plugin from a manifest JSON file
|
|
191
192
|
--plugin-install <source>
|
|
192
|
-
Install a
|
|
193
|
+
Install a plugin package from Git (HTTPS/HTTP/SSH) or a local path
|
|
193
194
|
--plugin-list List installed agent plugins
|
|
194
195
|
--plugin-check <slug>
|
|
195
196
|
Check the installed plugin source for updates
|
|
@@ -410,54 +411,6 @@ function resolveHealthTarget(options, https) {
|
|
|
410
411
|
const displayHost = host === '0.0.0.0' ? 'localhost' : host;
|
|
411
412
|
return { url: `${scheme}://${displayHost}:${port}/health`, scheme, host: displayHost, port };
|
|
412
413
|
}
|
|
413
|
-
const EXTRA_EXECUTABLE_DIRS = ['/opt/homebrew/bin', '/usr/local/bin'];
|
|
414
|
-
function executableCandidates(command) {
|
|
415
|
-
if (command.includes(path.sep))
|
|
416
|
-
return [command];
|
|
417
|
-
const dirs = [...(process.env.PATH ?? '').split(path.delimiter), ...EXTRA_EXECUTABLE_DIRS].filter(Boolean);
|
|
418
|
-
const seen = new Set();
|
|
419
|
-
return dirs
|
|
420
|
-
.map((dir) => path.join(dir, command))
|
|
421
|
-
.filter((candidate) => {
|
|
422
|
-
if (seen.has(candidate))
|
|
423
|
-
return false;
|
|
424
|
-
seen.add(candidate);
|
|
425
|
-
return true;
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
async function findExecutable(command) {
|
|
429
|
-
for (const candidate of executableCandidates(command)) {
|
|
430
|
-
try {
|
|
431
|
-
await execFileAsync(candidate, ['--version'], { timeout: 5000, maxBuffer: 128 * 1024 });
|
|
432
|
-
return candidate;
|
|
433
|
-
}
|
|
434
|
-
catch { /* try next candidate */ }
|
|
435
|
-
}
|
|
436
|
-
return null;
|
|
437
|
-
}
|
|
438
|
-
async function ensureMkcertInstalled() {
|
|
439
|
-
const existing = await findExecutable('mkcert');
|
|
440
|
-
if (existing)
|
|
441
|
-
return existing;
|
|
442
|
-
const brew = await findExecutable('brew');
|
|
443
|
-
if (!brew) {
|
|
444
|
-
throw new Error(`${ICON.err} ${c.red('mkcert is required for local HTTPS setup, and Homebrew was not found.')}\n ${c.dim('Install Homebrew first, or manually install:')} ${c.cyan('brew install mkcert')}`);
|
|
445
|
-
}
|
|
446
|
-
console.log(`${ICON.info} ${c.dim('mkcert is not installed. Installing with Homebrew...')}`);
|
|
447
|
-
try {
|
|
448
|
-
await execFileAsync(brew, ['install', 'mkcert'], { timeout: 10 * 60 * 1000, maxBuffer: 8 * 1024 * 1024 });
|
|
449
|
-
}
|
|
450
|
-
catch (error) {
|
|
451
|
-
const err = error;
|
|
452
|
-
const detail = (err.stderr || err.message || '').toString().trim();
|
|
453
|
-
throw new Error(`${ICON.err} ${c.red('Failed to install mkcert with Homebrew.')}${detail ? `\n${detail}` : ''}`);
|
|
454
|
-
}
|
|
455
|
-
const installed = await findExecutable('mkcert');
|
|
456
|
-
if (!installed) {
|
|
457
|
-
throw new Error(`${ICON.err} ${c.red('mkcert installation completed, but mkcert was not found on PATH.')}`);
|
|
458
|
-
}
|
|
459
|
-
return installed;
|
|
460
|
-
}
|
|
461
414
|
function getRequiredLocalHttpsNames() {
|
|
462
415
|
const localName = getLocalAccessSetting().name;
|
|
463
416
|
return [
|
|
@@ -469,62 +422,32 @@ function getRequiredLocalHttpsNames() {
|
|
|
469
422
|
'::1',
|
|
470
423
|
];
|
|
471
424
|
}
|
|
472
|
-
async function defaultCertificateNeedsRefresh() {
|
|
473
|
-
if (!fileExists(defaultHttpsCertPath) || !fileExists(defaultHttpsKeyPath))
|
|
474
|
-
return true;
|
|
475
|
-
return (await getMissingCertificateNames(defaultHttpsCertPath, getRequiredLocalHttpsNames())).length > 0;
|
|
476
|
-
}
|
|
477
425
|
async function ensureDefaultHttpsCertificateFresh() {
|
|
478
|
-
if (!(
|
|
426
|
+
if (!localCertificateNeedsRefresh(certDir, getRequiredLocalHttpsNames()))
|
|
479
427
|
return false;
|
|
480
|
-
console.log(`${ICON.info} ${c.dim('Local HTTPS certificate
|
|
481
|
-
await runSetupLocalHttps({ quietRestartHint: true, installCa: false });
|
|
428
|
+
console.log(`${ICON.info} ${c.dim('Local HTTPS certificate needs repair or renewal; preparing a validated replacement...')}`);
|
|
429
|
+
await runSetupLocalHttps({ quietRestartHint: true, installCa: false, allowCaChange: false });
|
|
482
430
|
return true;
|
|
483
431
|
}
|
|
484
432
|
async function runSetupLocalHttps(options = {}) {
|
|
485
|
-
const
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
}
|
|
492
|
-
console.log(
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
const rootCA = path.join(stdout.trim(), 'rootCA.pem');
|
|
501
|
-
if (fs.existsSync(rootCA)) {
|
|
502
|
-
fs.copyFileSync(rootCA, defaultHttpsCaPath);
|
|
503
|
-
try {
|
|
504
|
-
fs.chmodSync(defaultHttpsCaPath, 0o600);
|
|
505
|
-
}
|
|
506
|
-
catch { /* ignore */ }
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
catch { /* CA download is optional but recommended */ }
|
|
510
|
-
try {
|
|
511
|
-
fs.chmodSync(defaultHttpsCertPath, 0o600);
|
|
512
|
-
}
|
|
513
|
-
catch { /* ignore */ }
|
|
514
|
-
try {
|
|
515
|
-
fs.chmodSync(defaultHttpsKeyPath, 0o600);
|
|
516
|
-
}
|
|
517
|
-
catch { /* ignore */ }
|
|
518
|
-
console.log(`${ICON.ok} ${c.green('Local HTTPS certificates are ready.')}`);
|
|
519
|
-
console.log(` ${c.dim('Cert:')} ${c.cyan(defaultHttpsCertPath)}`);
|
|
520
|
-
console.log(` ${c.dim('Key:')} ${c.cyan(defaultHttpsKeyPath)}`);
|
|
521
|
-
if (fs.existsSync(defaultHttpsCaPath)) {
|
|
522
|
-
console.log(` ${c.dim('CA:')} ${c.cyan(defaultHttpsCaPath)} ${c.dim('(served on mobile setup page)')}`);
|
|
523
|
-
}
|
|
433
|
+
const result = await setupLocalHttps({
|
|
434
|
+
directory: certDir, names: getRequiredLocalHttpsNames(),
|
|
435
|
+
installCa: options.installCa, allowCaChange: options.allowCaChange,
|
|
436
|
+
log: message => console.log(`${ICON.info} ${c.dim(message)}`),
|
|
437
|
+
});
|
|
438
|
+
console.log(`${ICON.ok} ${c.green('Local HTTPS certificates are generated and validated.')}`);
|
|
439
|
+
console.log(` ${c.dim('Cert:')} ${c.cyan(result.files.cert)}`);
|
|
440
|
+
console.log(` ${c.dim('Key:')} ${c.cyan(result.files.key)}`);
|
|
441
|
+
console.log(` ${c.dim('CA:')} ${c.cyan(result.files.ca)} ${c.dim('(install and trust this public certificate on each client device)')}`);
|
|
442
|
+
for (const warning of result.warnings)
|
|
443
|
+
console.warn(`${ICON.warn} ${c.yellow(warning)}`);
|
|
444
|
+
if (result.trust === 'requested')
|
|
445
|
+
console.log(` ${c.dim('Local CA trust installation was requested; browser trust may require certutil and a browser restart.')}`);
|
|
446
|
+
else
|
|
447
|
+
console.log(` ${c.dim('Local CA trust has not been installed by this command.')}`);
|
|
524
448
|
console.log('');
|
|
525
|
-
if (!options.quietRestartHint)
|
|
449
|
+
if (!options.quietRestartHint)
|
|
526
450
|
console.log(`${ICON.info} ${c.dim('Restart Termdock to use HTTPS:')} ${c.cyan('td --stop && td')}`);
|
|
527
|
-
}
|
|
528
451
|
}
|
|
529
452
|
function printRunningState(state) {
|
|
530
453
|
const displayHost = state.host === '0.0.0.0' ? 'localhost' : state.host;
|
|
@@ -632,6 +555,7 @@ function parseArgs(argv) {
|
|
|
632
555
|
let httpsKey;
|
|
633
556
|
let httpsCa;
|
|
634
557
|
let setupLocalHttps = false;
|
|
558
|
+
let installLocalCa = true;
|
|
635
559
|
let foreground = false;
|
|
636
560
|
let supervise = false;
|
|
637
561
|
let noSupervisor = false;
|
|
@@ -931,6 +855,10 @@ function parseArgs(argv) {
|
|
|
931
855
|
setupLocalHttps = true;
|
|
932
856
|
continue;
|
|
933
857
|
}
|
|
858
|
+
if (arg === '--no-install-ca') {
|
|
859
|
+
installLocalCa = false;
|
|
860
|
+
continue;
|
|
861
|
+
}
|
|
934
862
|
if (arg === '--foreground') {
|
|
935
863
|
foreground = true;
|
|
936
864
|
continue;
|
|
@@ -1173,6 +1101,7 @@ function parseArgs(argv) {
|
|
|
1173
1101
|
httpsKey,
|
|
1174
1102
|
httpsCa,
|
|
1175
1103
|
setupLocalHttps,
|
|
1104
|
+
installLocalCa,
|
|
1176
1105
|
foreground,
|
|
1177
1106
|
supervise,
|
|
1178
1107
|
noSupervisor,
|
|
@@ -2140,7 +2069,7 @@ function runPluginInitJson() {
|
|
|
2140
2069
|
hooks: 'Hooks publish declared lifecycle/status events; collaboration does not wait for an idle phase and does not require hooks.',
|
|
2141
2070
|
},
|
|
2142
2071
|
security: {
|
|
2143
|
-
source: '
|
|
2072
|
+
source: 'Public and self-hosted Git repositories support HTTPS, HTTP, SSH and scp-style addresses. The service computer uses its Git credential helpers, SSH agent/configuration, proxy and CA settings. URL passwords and query tokens are rejected.',
|
|
2144
2073
|
package: 'Symlinks, active/external SVG content, oversized files, submodules, and excessive unpacked size are rejected.',
|
|
2145
2074
|
hooks: 'hooks.target must be a non-symlinked ~/ JSON path. Termdock generates the hook command; manifests cannot inject shell.',
|
|
2146
2075
|
titleCommands: 'Installing or inspecting a plugin never executes its title/model commands. They run only after the user enables automatic titles for that plugin.',
|
|
@@ -2167,7 +2096,7 @@ function runPluginInitJson() {
|
|
|
2167
2096
|
},
|
|
2168
2097
|
integrationSteps: [
|
|
2169
2098
|
'Create a repository with manifest.json at its root; icon.svg and helper files are optional.',
|
|
2170
|
-
'Publish the repository, then install it with td plugin-install <
|
|
2099
|
+
'Publish the repository, then install it with td plugin-install <git-url>. Public/private HTTPS, HTTP, SSH and local directories are supported.',
|
|
2171
2100
|
'For manifest-only development, td plugin-create <manifest-file> remains available.',
|
|
2172
2101
|
'Ask the user to open Settings > Detection Rules and click Install for this Agent. They can uninstall it there later.',
|
|
2173
2102
|
'If the Agent hook format is not a Claude-style hooks map, configure native hooks to call td agent-event directly.',
|
|
@@ -2318,7 +2247,7 @@ ${c.dim('──────────────────')}
|
|
|
2318
2247
|
${c.dim('# Inject the Agent definition; it appears in the UI immediately')}
|
|
2319
2248
|
td plugin-create ./trae-manifest.json
|
|
2320
2249
|
|
|
2321
|
-
${c.dim('# Or install a complete, updateable package from a public
|
|
2250
|
+
${c.dim('# Or install a complete, updateable package from a public or private Git repository')}
|
|
2322
2251
|
td plugin-install https://github.com/owner/trae-termdock-plugin
|
|
2323
2252
|
|
|
2324
2253
|
${c.dim('# The user then opens Settings > Detection Rules and clicks Install.')}
|
|
@@ -3360,7 +3289,7 @@ async function promptLine(prompt) {
|
|
|
3360
3289
|
});
|
|
3361
3290
|
}
|
|
3362
3291
|
async function runFirstRunWizard() {
|
|
3363
|
-
if (!process.stdin.isTTY || isFirstRunCompleted())
|
|
3292
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY || isFirstRunCompleted())
|
|
3364
3293
|
return;
|
|
3365
3294
|
console.log(`${ICON.info} ${c.bold('Termdock first-time local access setup')}`);
|
|
3366
3295
|
const prefix = await promptLine(' Choose your .termdock.local prefix (e.g. jovn): ');
|
|
@@ -3411,12 +3340,18 @@ async function waitForServerMetadata(result, fallbackPort) {
|
|
|
3411
3340
|
};
|
|
3412
3341
|
}
|
|
3413
3342
|
async function refreshDefaultHttpsCertificateSafely() {
|
|
3343
|
+
// Explicit custom certificates belong to their operator. A declined setup or
|
|
3344
|
+
// headless first run without any default files must not trigger a download.
|
|
3345
|
+
const custom = options.httpsCert && options.httpsCert !== defaultHttpsCertPath
|
|
3346
|
+
|| options.httpsKey && options.httpsKey !== defaultHttpsKeyPath
|
|
3347
|
+
|| options.httpsCa && options.httpsCa !== defaultHttpsCaPath;
|
|
3348
|
+
if (custom || ![defaultHttpsCertPath, defaultHttpsKeyPath, defaultHttpsCaPath].some(file => fs.existsSync(file)))
|
|
3349
|
+
return false;
|
|
3414
3350
|
try {
|
|
3415
3351
|
return await ensureDefaultHttpsCertificateFresh();
|
|
3416
3352
|
}
|
|
3417
3353
|
catch (error) {
|
|
3418
|
-
|
|
3419
|
-
return false;
|
|
3354
|
+
throw new Error(`Existing local HTTPS configuration could not be repaired; refusing to fall back to HTTP. Run td --setup-local-https. ${String(error)}`, { cause: error });
|
|
3420
3355
|
}
|
|
3421
3356
|
}
|
|
3422
3357
|
async function main() {
|
|
@@ -3445,7 +3380,7 @@ async function main() {
|
|
|
3445
3380
|
}
|
|
3446
3381
|
if (options.setupLocalHttps) {
|
|
3447
3382
|
try {
|
|
3448
|
-
await runSetupLocalHttps();
|
|
3383
|
+
await runSetupLocalHttps({ installCa: options.installLocalCa });
|
|
3449
3384
|
process.exit(0);
|
|
3450
3385
|
}
|
|
3451
3386
|
catch (error) {
|
|
@@ -3570,7 +3505,7 @@ async function main() {
|
|
|
3570
3505
|
}
|
|
3571
3506
|
if (options.pluginInstall !== undefined) {
|
|
3572
3507
|
if (!options.pluginInstall) {
|
|
3573
|
-
console.error(`${ICON.err} ${c.red('plugin-install requires
|
|
3508
|
+
console.error(`${ICON.err} ${c.red('plugin-install requires a Git URL (HTTPS/HTTP/SSH) or local package path')}`);
|
|
3574
3509
|
process.exit(1);
|
|
3575
3510
|
}
|
|
3576
3511
|
await runPluginInstall(options.pluginInstall);
|
|
@@ -3753,8 +3688,13 @@ async function main() {
|
|
|
3753
3688
|
return;
|
|
3754
3689
|
}
|
|
3755
3690
|
if (options.foreground) {
|
|
3756
|
-
|
|
3757
|
-
|
|
3691
|
+
const bootChecks = runBootChecks();
|
|
3692
|
+
if (!bootChecks.nodePty.ok || !bootChecks.tmux.ok) {
|
|
3693
|
+
for (const line of formatBootCheckReport(bootChecks, colorsEnabled))
|
|
3694
|
+
console.log(line);
|
|
3695
|
+
}
|
|
3696
|
+
if (!bootChecks.nodePty.ok)
|
|
3697
|
+
throw new Error('Native terminal initialization failed; see the boot check above.');
|
|
3758
3698
|
warnIfAuthDisabled(options.host ?? DEFAULT_HOST);
|
|
3759
3699
|
// Dynamic import keeps terminal.ts side-effects (loadClientStatesFromDisk
|
|
3760
3700
|
// etc.) out of fast paths like `termdock --tls` / `--status`.
|
|
@@ -3879,6 +3819,8 @@ async function main() {
|
|
|
3879
3819
|
}
|
|
3880
3820
|
console.log("");
|
|
3881
3821
|
}
|
|
3822
|
+
if (!bootChecks.nodePty.ok)
|
|
3823
|
+
process.exit(1);
|
|
3882
3824
|
await runFirstRunWizard();
|
|
3883
3825
|
await refreshDefaultHttpsCertificateSafely();
|
|
3884
3826
|
const refreshedHttps = resolveHttpsOptions(options);
|
package/dist/server/entry.js
CHANGED
|
@@ -5,7 +5,7 @@ import { CollaborationPeerTransport, connectCollaborationRpc } from './agent/col
|
|
|
5
5
|
import { collaborationStore, collaborationTaskStore, deliverPeerCollaboration, collaborationLocalActivity, collaborationDirectorySessions, prepareCollaborationTaskWorker, integrationSessionAdapter } from './routes/terminal.js';
|
|
6
6
|
import { CollaborationTaskService } from './agent/collaborationTaskService.js';
|
|
7
7
|
import { setPushTargetPeerId } from './notifications/pushService.js';
|
|
8
|
-
import {
|
|
8
|
+
import { desktopServiceTargets } from './federation/desktopTargets.js';
|
|
9
9
|
import { createOpenAccessRouter } from './federation/openAccess.js';
|
|
10
10
|
import { createPasswordLoginRouter } from './federation/passwordLoginRoutes.js';
|
|
11
11
|
import { apiAccessGate, isTrustedLocalRequest } from './utils/apiAccess.js';
|
|
@@ -14,7 +14,8 @@ import { createFederationRuntime } from './federation/runtime.js';
|
|
|
14
14
|
import { startWebTransportServer } from './federation/webTransportServer.js';
|
|
15
15
|
import { RouteAccess } from './federation/routeAccess.js';
|
|
16
16
|
import { RouteInvitationStore } from './federation/routeInvitations.js';
|
|
17
|
-
import {
|
|
17
|
+
import { verifyDirectTarget } from './federation/directRoutes.js';
|
|
18
|
+
import { DirectTargetRegistry } from './federation/directTargetRegistry.js';
|
|
18
19
|
import { secureChannelOriginAllowed } from './federation/originPolicy.js';
|
|
19
20
|
import { RelayRouter } from './federation/relay.js';
|
|
20
21
|
import { DesktopSelfRelay } from './federation/selfRelay.js';
|
|
@@ -490,7 +491,7 @@ export function startServer(options = {}) {
|
|
|
490
491
|
let routeInvitations;
|
|
491
492
|
let federationServiceId = '';
|
|
492
493
|
let activeRouteIds = () => [];
|
|
493
|
-
const desktopTargets = () =>
|
|
494
|
+
const desktopTargets = () => desktopServiceTargets(homedir(), federationServiceId);
|
|
494
495
|
const routeAccess = new RouteAccess(path.join(homedir(), '.termdock', 'federation', 'routes.json'), Date.now, (subjectId, targetServiceId) => routeInvitations?.allows(subjectId, targetServiceId) === true || collaborationTransport?.canRoute(subjectId, targetServiceId) === true, desktopTargets, () => activeRouteIds());
|
|
495
496
|
const relayRouter = new RelayRouter({
|
|
496
497
|
isLocalTarget: id => id === federationServiceId,
|
|
@@ -499,29 +500,14 @@ export function startServer(options = {}) {
|
|
|
499
500
|
allowRoute: (principal, serviceId) => routeAccess.allowRoute(principal, serviceId),
|
|
500
501
|
});
|
|
501
502
|
activeRouteIds = () => relayRouter.activeRouteIds();
|
|
502
|
-
const
|
|
503
|
+
const directTargetRegistry = new DirectTargetRegistry(relayRouter, path.join(homedir(), '.termdock', 'federation'));
|
|
503
504
|
const refreshDirectTargets = () => {
|
|
504
|
-
|
|
505
|
-
for (const [id, registered] of dynamicDirectTargets) {
|
|
506
|
-
const target = desired.get(id);
|
|
507
|
-
if (!target || registered.signature !== JSON.stringify([target.url, target.caPath, target.caFingerprint256])) {
|
|
508
|
-
registered.close();
|
|
509
|
-
dynamicDirectTargets.delete(id);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
for (const [id, target] of desired)
|
|
513
|
-
if (!dynamicDirectTargets.has(id)) {
|
|
514
|
-
try {
|
|
515
|
-
dynamicDirectTargets.set(id, { signature: JSON.stringify([target.url, target.caPath, target.caFingerprint256]), close: attachRegisteredDirectTargets(relayRouter, [target], path.join(homedir(), '.termdock', 'federation')) });
|
|
516
|
-
}
|
|
517
|
-
catch { /* A malformed or unavailable local route remains unusable. */ }
|
|
518
|
-
}
|
|
505
|
+
directTargetRegistry.refresh(routeAccess.configuredDirectTargets().filter(target => target.serviceId !== federationServiceId));
|
|
519
506
|
};
|
|
520
507
|
refreshDirectTargets();
|
|
521
508
|
const desktopRoutesTimer = setInterval(refreshDirectTargets, 2000);
|
|
522
509
|
desktopRoutesTimer.unref();
|
|
523
|
-
onServerClose(() => { clearInterval(desktopRoutesTimer);
|
|
524
|
-
target.close(); });
|
|
510
|
+
onServerClose(() => { clearInterval(desktopRoutesTimer); directTargetRegistry.close(); });
|
|
525
511
|
onServerClose(() => relayRouter.close());
|
|
526
512
|
onServerClose(() => { void stopAllScrcpySessions(); void androidRecordings.stopAll(); });
|
|
527
513
|
onServerClose(stopComputerBridges);
|
|
@@ -559,7 +545,10 @@ export function startServer(options = {}) {
|
|
|
559
545
|
throw new Error('COLLABORATION_UNAVAILABLE');
|
|
560
546
|
return collaborationTransport.receive(subjectId, packet);
|
|
561
547
|
},
|
|
562
|
-
listRouteTargets: () => {
|
|
548
|
+
listRouteTargets: () => {
|
|
549
|
+
refreshDirectTargets();
|
|
550
|
+
return routeAccess.configuredTargets().map(target => directTargetRegistry.describe(target));
|
|
551
|
+
},
|
|
563
552
|
listRouteAccess: () => routeInvitations?.list() || [],
|
|
564
553
|
grantRouteAccess: async (issuerId, targetServiceId, subjectId, url) => {
|
|
565
554
|
if (!routeInvitations)
|
|
@@ -693,7 +682,12 @@ export function startServer(options = {}) {
|
|
|
693
682
|
const selfRelay = new DesktopSelfRelay({
|
|
694
683
|
desktopFile: path.join(homedir(), '.termdock', 'desktop.json'),
|
|
695
684
|
targets: () => routeAccess.configuredDirectTargets(), baseDir: path.join(homedir(), '.termdock', 'federation'), identity: runtime.identity, serviceId: runtime.serviceId,
|
|
696
|
-
localOrigin:
|
|
685
|
+
localOrigin: () => {
|
|
686
|
+
const address = server.address();
|
|
687
|
+
if (!address || typeof address === 'string')
|
|
688
|
+
throw new Error('Local service is not listening');
|
|
689
|
+
return `${scheme}://${localAuthority}:${address.port}`;
|
|
690
|
+
}, ...(localCa ? { localCa } : {}),
|
|
697
691
|
});
|
|
698
692
|
selfRelay.start();
|
|
699
693
|
onServerClose(() => selfRelay.close());
|