termdock 1.4.296 → 1.4.297
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/.desktop-dist/main.js +35 -2
- package/README.en.md +257 -0
- package/README.md +284 -133
- package/dist/client/assets/App-BbqtNY2x.js +177 -0
- package/dist/client/assets/App-BbqtNY2x.js.br +0 -0
- package/dist/client/assets/App-BbqtNY2x.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DXprT-7m.js → ChangeWalkthroughPanel-CvQJIp_C.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-CvQJIp_C.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-CvQJIp_C.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-B0OgRtyR.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-B0OgRtyR.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-B0OgRtyR.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-C01GXOEq.js +2 -0
- package/dist/client/assets/ComputerControlView-CW1uA133.js +4 -0
- package/dist/client/assets/ComputerControlView-CW1uA133.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CW1uA133.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DZcUunT5.js → DagPlayground-CdE3tQsl.js} +1 -1
- package/dist/client/assets/DagPlayground-CdE3tQsl.js.br +0 -0
- package/dist/client/assets/DagPlayground-CdE3tQsl.js.gz +0 -0
- package/dist/client/assets/{DiffLab-Brv4DCTb.js → DiffLab-BLGNnazd.js} +1 -1
- package/dist/client/assets/DiffLab-BLGNnazd.js.br +0 -0
- package/dist/client/assets/DiffLab-BLGNnazd.js.gz +0 -0
- package/dist/client/assets/{DiffReview-BuLu1qCi.js → DiffReview-CYw3ASI6.js} +1 -1
- package/dist/client/assets/DiffReview-CYw3ASI6.js.br +0 -0
- package/dist/client/assets/DiffReview-CYw3ASI6.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-DSGamuAD.js → DiffReviewLab-CySIuWq_.js} +1 -1
- package/dist/client/assets/DiffReviewLab-CySIuWq_.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CySIuWq_.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-BUCYxg27.js → DiffViewer-WsYvN75z.js} +13 -13
- package/dist/client/assets/DiffViewer-WsYvN75z.js.br +0 -0
- package/dist/client/assets/DiffViewer-WsYvN75z.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-Bnlo-oVE.js → ModelPreview-Dnlx9ByX.js} +1 -1
- package/dist/client/assets/ModelPreview-Dnlx9ByX.js.br +0 -0
- package/dist/client/assets/ModelPreview-Dnlx9ByX.js.gz +0 -0
- package/dist/client/assets/RightSidebar-Cp5b_y0u.js +1678 -0
- package/dist/client/assets/RightSidebar-Cp5b_y0u.js.br +0 -0
- package/dist/client/assets/RightSidebar-Cp5b_y0u.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-K6Ppkrbt.js → abnfDiagram-VCTEODGH-CK1mGFRQ.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-CK1mGFRQ.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CK1mGFRQ.js.gz +0 -0
- package/dist/client/assets/app-DfACMixk.js +35 -0
- package/dist/client/assets/app-DfACMixk.js.br +0 -0
- package/dist/client/assets/app-DfACMixk.js.gz +0 -0
- package/dist/client/assets/{arc-Co2OQqtH.js → arc-yZE1gqDl.js} +1 -1
- package/dist/client/assets/arc-yZE1gqDl.js.br +0 -0
- package/dist/client/assets/arc-yZE1gqDl.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-BQnl7tVF.js → architectureDiagram-5GKGNRK7-U5XSC7cY.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-U5XSC7cY.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-U5XSC7cY.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-Bm5D5-qq.js → blockDiagram-I7D4REHJ-pVJnntSG.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-pVJnntSG.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-pVJnntSG.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-B9oPpey8.js → c4Diagram-7LVT6UL2-Bwz0AJJV.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-Bwz0AJJV.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Bwz0AJJV.js.gz +0 -0
- package/dist/client/assets/channel-qqjDJtcZ.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-TMaWHH0U.js → chunk-2Q5K7J3B-CXJ1kP4X.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CH7XpknV.js → chunk-5VM5RSS4-Dpdum_2z.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-CJ1rotBe.js → chunk-F27PBJKO-BCG5Zi_-.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-BCG5Zi_-.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BCG5Zi_-.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-UYKZ5uOG.js → chunk-IMKFNOWR-BM-GcNcv.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-BM-GcNcv.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BM-GcNcv.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BYL8aXjQ.js → chunk-JWPE2WC7-BWiXpQT9.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-C3E8yfU2.js → chunk-POPQ4Y6H-vQSslMNv.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DCTDYa1E.js → chunk-SVP7TREG-Aqfz6nPA.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-Aqfz6nPA.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Aqfz6nPA.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-wHiaOsBh.js → chunk-TICWLB2K-DDjekMd0.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-DDjekMd0.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DDjekMd0.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-D_d479hK.js → chunk-XXDRQBXY-BegIBcFg.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BDuBrfNz.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BDuBrfNz.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-DnhlPBLr.js → cose-bilkent-JH36ORCC-B2izFsBY.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-B2izFsBY.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-B2izFsBY.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BsjzNqJZ.js → cynefin-OW5HDTMX-C7HA99Zc.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-C7HA99Zc.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-C7HA99Zc.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-sVUb0zY5.js → cynefinDiagram-5FMLGOSQ-vNIzcCYl.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-vNIzcCYl.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-vNIzcCYl.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-YErk8S-c.js → dagre-GXQ25YYZ-Bv9WHNT9.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-Bv9WHNT9.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-Bv9WHNT9.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BaHbV5ho.js → diagram-S7CK7UJ4-DFg5UNic.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DFg5UNic.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DFg5UNic.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BocCYx3V.js → diagram-UQ7AKVKN-BFQsCAs7.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BFQsCAs7.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BFQsCAs7.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-ZMTYwWOQ.js → diagram-VSXAHHWV-C4R8TKEv.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-C4R8TKEv.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-C4R8TKEv.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-xmk_EY1h.js → diagram-VX7I27RA-CL75HIf0.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-CL75HIf0.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CL75HIf0.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DKDY_cG6.js → diagram-Z3DM3KII-CfJampuO.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-CfJampuO.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CfJampuO.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-C_0z-Jx9.js → ebnfDiagram-PWID7BFC-Ct53jhNd.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Ct53jhNd.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Ct53jhNd.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-DHUaG7mt.js → erDiagram-RLTQ6QDP-BgL2xOOa.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-BgL2xOOa.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BgL2xOOa.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BMNsdMBD.js → flowDiagram-HODETNUW-Cp4Nu5jY.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-Cp4Nu5jY.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-Cp4Nu5jY.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BH1AiKuF.js → ganttDiagram-EL5Y4UJY-DI0rdyPX.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DI0rdyPX.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DI0rdyPX.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-DvupkPra.js → gestureArbiter-Belsq4xq.js} +1 -1
- package/dist/client/assets/gestureArbiter-Belsq4xq.js.br +0 -0
- package/dist/client/assets/gestureArbiter-Belsq4xq.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DAgV0MV-.js → gitGraphDiagram-WWUBYQGX-C0H4loQP.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0H4loQP.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0H4loQP.js.gz +0 -0
- package/dist/client/assets/index-CYmI1EsU.css +1 -0
- package/dist/client/assets/index-CYmI1EsU.css.br +0 -0
- package/dist/client/assets/index-CYmI1EsU.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-C7iSg0cB.js → infoDiagram-27XIBGKW-BN4RpQTL.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BpZwsQvw.js → ishikawaDiagram-5VMMS53U-BZQ5qZB_.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BZQ5qZB_.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BZQ5qZB_.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-DXEeFLvw.js → journeyDiagram-3NMN7TZE-Q8bx0_N4.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Q8bx0_N4.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Q8bx0_N4.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-CV9ivL5u.js → kanban-definition-UXKFOSKX-D7JhGtpO.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-D7JhGtpO.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-D7JhGtpO.js.gz +0 -0
- package/dist/client/assets/{layout-DsKKsJKX.js → layout-DERUg0xU.js} +1 -1
- package/dist/client/assets/layout-DERUg0xU.js.br +0 -0
- package/dist/client/assets/layout-DERUg0xU.js.gz +0 -0
- package/dist/client/assets/{linear-Dl9MDNV3.js → linear-lNTe4x00.js} +1 -1
- package/dist/client/assets/linear-lNTe4x00.js.br +0 -0
- package/dist/client/assets/linear-lNTe4x00.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-CxZFe3as.js → mermaid.core-WHCwLQDQ.js} +5 -5
- package/dist/client/assets/mermaid.core-WHCwLQDQ.js.br +0 -0
- package/dist/client/assets/mermaid.core-WHCwLQDQ.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-C3ormYdL.js → mindmap-definition-YA3MSWOX-BouapA4v.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BouapA4v.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BouapA4v.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-a8z6jJNY.js → passwordBootstrap-E0piP814.js} +2 -2
- package/dist/client/assets/passwordBootstrap-E0piP814.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-E0piP814.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-CG0wNylH.js → pegDiagram-XKGWAZYB-Curpo5Rq.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-Curpo5Rq.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Curpo5Rq.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-D2-ydqyX.js → pieDiagram-E7YTZNPT-BLQCHaOG.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-BLQCHaOG.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BLQCHaOG.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CK3fRC18.js → quadrantDiagram-AXDQQJYC-PViFqGao.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-PViFqGao.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-PViFqGao.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-V4EFlydu.js → railroadDiagram-O6MQD6OU-BtHo1LpT.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BtHo1LpT.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BtHo1LpT.js.gz +0 -0
- package/dist/client/assets/rdpSession-O_f9ejOI.js +1 -0
- package/dist/client/assets/rdpSession-O_f9ejOI.js.br +0 -0
- package/dist/client/assets/rdpSession-O_f9ejOI.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-BjmYd1vB.js → referenceLongPress-BZr7Lqzh.js} +1 -1
- package/dist/client/assets/referenceLongPress-BZr7Lqzh.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BZr7Lqzh.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Di1_tyAX.js → requirementDiagram-BXWQKSXE-BUm81HUU.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BUm81HUU.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BUm81HUU.js.gz +0 -0
- package/dist/client/assets/rfb-CxsXsMUX.js +5 -0
- package/dist/client/assets/rfb-CxsXsMUX.js.br +0 -0
- package/dist/client/assets/rfb-CxsXsMUX.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-D-qpWNza.js → sankeyDiagram-P5KCCOFB-B-_-aZ_y.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B-_-aZ_y.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B-_-aZ_y.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-DmIxafrB.js → sequenceDiagram-WJ2MYXX4-DT6LDIfx.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DT6LDIfx.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DT6LDIfx.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-4MTh3tTt.js → sizeCapture-INFHLROL-CTYerd9j.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-CTYerd9j.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CTYerd9j.js.gz +0 -0
- package/dist/client/assets/{sparkles-Dk93lHg0.js → sparkles-CgaUBIwH.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-CgYgneIv.js → stateDiagram-D77RDMKH-CQbb5x2_.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-CQbb5x2_.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CQbb5x2_.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CJAVXcx1.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-OWA9HFVf.js → swimlanes-42K2YHIH-BHZ4X2Fd.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BHZ4X2Fd.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BHZ4X2Fd.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-VL2nyI27.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-BAzx5DyO.js → timeline-definition-24CTP7MA-BrjH6R6w.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-BrjH6R6w.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BrjH6R6w.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-CUIBOwqW.js → triangle-alert-C9IHD_eF.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-CBZ-PhTQ.js → vennDiagram-4TSXK5OY-C9f5jYgk.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-C9f5jYgk.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-C9f5jYgk.js.gz +0 -0
- package/dist/client/assets/{videoCompression-BCnqCkRK.js → videoCompression-DJaU8exd.js} +1 -1
- package/dist/client/assets/videoCompression-DJaU8exd.js.br +0 -0
- package/dist/client/assets/videoCompression-DJaU8exd.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DbWzC6l5.js → wardleyDiagram-VM6X3IG4-6ljFvtiC.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-6ljFvtiC.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-6ljFvtiC.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BmApnTWE.js → xychartDiagram-S5SC5T6Z-BaR2hm3e.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BaR2hm3e.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BaR2hm3e.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/collaborationCli.js +3 -3
- package/dist/server/agent/collaborationGroupRoutes.js +0 -2
- package/dist/server/agent/collaborationResultPresentation.js +14 -0
- package/dist/server/agent/collaborationService.js +3 -1
- package/dist/server/agent/collaborationStore.js +12 -21
- package/dist/server/agent/collaborationTaskBundles.js +2 -2
- package/dist/server/agent/collaborationTaskCli.js +4 -4
- package/dist/server/agent/collaborationTaskStore.js +87 -25
- package/dist/server/agent/collaborationTaskWorkspace.js +66 -1
- package/dist/server/agent/collaborationTeam.js +16 -0
- package/dist/server/agent/executionArchives.js +52 -0
- package/dist/server/entry.js +6 -1
- package/dist/server/federation/runtime.js +24 -6
- package/dist/server/routes/computer.js +198 -0
- package/dist/server/routes/computerTarget.js +23 -0
- package/dist/server/routes/guacamoleProtocol.js +55 -0
- package/dist/server/routes/rdp.js +162 -0
- package/dist/server/routes/terminal.js +375 -360
- package/dist/server/shared/computerPreferences.js +29 -0
- package/dist/server/utils/computerCredentials.js +88 -0
- package/dist/server/utils/sharedSampling.js +93 -0
- package/dist/server/utils/terminalOutputDelivery.js +8 -1
- package/dist/server/utils/tmuxMetadataWriter.js +61 -0
- package/package.json +4 -1
- package/runtime-manifest.json +4 -4
- package/dist/client/assets/App-BiLjlrk-.js +0 -171
- package/dist/client/assets/App-BiLjlrk-.js.br +0 -0
- package/dist/client/assets/App-BiLjlrk-.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DZcUunT5.js.br +0 -0
- package/dist/client/assets/DagPlayground-DZcUunT5.js.gz +0 -0
- package/dist/client/assets/DiffLab-Brv4DCTb.js.br +0 -0
- package/dist/client/assets/DiffLab-Brv4DCTb.js.gz +0 -0
- package/dist/client/assets/DiffReview-BuLu1qCi.js.br +0 -0
- package/dist/client/assets/DiffReview-BuLu1qCi.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-DSGamuAD.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DSGamuAD.js.gz +0 -0
- package/dist/client/assets/DiffViewer-BUCYxg27.js.br +0 -0
- package/dist/client/assets/DiffViewer-BUCYxg27.js.gz +0 -0
- package/dist/client/assets/ModelPreview-Bnlo-oVE.js.br +0 -0
- package/dist/client/assets/ModelPreview-Bnlo-oVE.js.gz +0 -0
- package/dist/client/assets/RightSidebar-r_3Lk5Rp.js +0 -1678
- package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.br +0 -0
- package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.gz +0 -0
- package/dist/client/assets/app-CATnTUZF.js +0 -35
- package/dist/client/assets/app-CATnTUZF.js.br +0 -0
- package/dist/client/assets/app-CATnTUZF.js.gz +0 -0
- package/dist/client/assets/arc-Co2OQqtH.js.br +0 -0
- package/dist/client/assets/arc-Co2OQqtH.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.gz +0 -0
- package/dist/client/assets/channel-Czv2W4qA.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-BdvOOL9k.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdvOOL9k.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-DvupkPra.js.br +0 -0
- package/dist/client/assets/gestureArbiter-DvupkPra.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.gz +0 -0
- package/dist/client/assets/index-Bi9A6QUP.css +0 -1
- package/dist/client/assets/index-Bi9A6QUP.css.br +0 -0
- package/dist/client/assets/index-Bi9A6QUP.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.gz +0 -0
- package/dist/client/assets/layout-DsKKsJKX.js.br +0 -0
- package/dist/client/assets/layout-DsKKsJKX.js.gz +0 -0
- package/dist/client/assets/linear-Dl9MDNV3.js.br +0 -0
- package/dist/client/assets/linear-Dl9MDNV3.js.gz +0 -0
- package/dist/client/assets/mermaid.core-CxZFe3as.js.br +0 -0
- package/dist/client/assets/mermaid.core-CxZFe3as.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-BjmYd1vB.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BjmYd1vB.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CvPf0fxf.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CZ_OauyW.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.gz +0 -0
- package/dist/client/assets/videoCompression-BCnqCkRK.js.br +0 -0
- package/dist/client/assets/videoCompression-BCnqCkRK.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.gz +0 -0
package/.desktop-dist/main.js
CHANGED
|
@@ -3,6 +3,7 @@ import { sessionAddress } from './collaborationFederation.js';
|
|
|
3
3
|
import { prepareServiceFrontend, selectServiceFrontend } from './bundledFrontend.js';
|
|
4
4
|
import { serviceConnection, serviceConnectionKeys, importServiceConnection, saveServiceConnection, invitationForService } from './serviceConnections.js';
|
|
5
5
|
import { serviceMenuEntries } from './serviceMenu.js';
|
|
6
|
+
import { LocalServiceSetupController } from './localServiceSetup.js';
|
|
6
7
|
const pendingServiceInvitations = new WeakMap();
|
|
7
8
|
import { app, BrowserWindow, clipboard, dialog, ipcMain, Menu, net, nativeImage, Notification, powerMonitor, screen, session, shell, Tray, } from 'electron';
|
|
8
9
|
import { execFile } from 'node:child_process';
|
|
@@ -13,7 +14,7 @@ import https from 'node:https';
|
|
|
13
14
|
import os from 'node:os';
|
|
14
15
|
import path from 'node:path';
|
|
15
16
|
import { promisify } from 'node:util';
|
|
16
|
-
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
17
18
|
import { desktopStatusTooltip, formatCompactDesktopStatus, menuBarStatusRows, mergeServiceActivity, nextServiceOrigin, normalizeServiceActivity, summarizeServiceActivity, } from './activityStatus.js';
|
|
18
19
|
import { checkForDesktopUpdates, configureDesktopUpdater, getDesktopUpdateState, installDownloadedDesktopUpdate, isDesktopUpdateInstalling, subscribeDesktopUpdateState, } from './updater.js';
|
|
19
20
|
import { isExternalLinkStagingUrl, isSafeExternalUrl } from './externalLinks.js';
|
|
@@ -62,6 +63,13 @@ function triggerLocalNetworkPermission() {
|
|
|
62
63
|
socket.send(Buffer.from('Termdock'), 5353, '224.0.0.251', close);
|
|
63
64
|
}
|
|
64
65
|
let mainWindow = null;
|
|
66
|
+
const localServiceSetup = new LocalServiceSetupController(getLocalServiceStatus, status => {
|
|
67
|
+
if (startupRestoreActive && ['checking', 'starting'].includes(status.phase))
|
|
68
|
+
updateStartupProgress(status.message);
|
|
69
|
+
if (mainWindow && !mainWindow.isDestroyed()) {
|
|
70
|
+
mainWindow.webContents.send('desktop:local-service-setup', status);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
65
73
|
let startupRestoreActive = false;
|
|
66
74
|
let startupProgressMessage = '正在启动 Termdock Desktop…';
|
|
67
75
|
const serviceWindows = new Map();
|
|
@@ -926,7 +934,7 @@ async function snapshot() {
|
|
|
926
934
|
const config = readDesktopConfig();
|
|
927
935
|
return {
|
|
928
936
|
appVersion: app.getVersion(),
|
|
929
|
-
localService: await getLocalServiceStatus(),
|
|
937
|
+
localService: { ...await getLocalServiceStatus(), setup: localServiceSetup.status },
|
|
930
938
|
connections: config.connections,
|
|
931
939
|
lastConnectionUrl: config.lastConnectionUrl,
|
|
932
940
|
desktopPreferences: config.desktopPreferences,
|
|
@@ -1445,6 +1453,25 @@ function installIpcHandlers() {
|
|
|
1445
1453
|
})();
|
|
1446
1454
|
});
|
|
1447
1455
|
ipcMain.handle('desktop:snapshot', () => snapshot());
|
|
1456
|
+
const connectionCenterSender = (event) => {
|
|
1457
|
+
const rendererPath = app.isPackaged
|
|
1458
|
+
? path.join(process.resourcesPath, 'renderer', 'index.html')
|
|
1459
|
+
: path.join(projectRoot, 'desktop', 'renderer', 'index.html');
|
|
1460
|
+
if (!mainWindow || event.sender !== mainWindow.webContents
|
|
1461
|
+
|| event.senderFrame !== event.sender.mainFrame
|
|
1462
|
+
|| event.senderFrame.url !== pathToFileURL(rendererPath).href) {
|
|
1463
|
+
throw new Error('请在连接中心准备本机服务。');
|
|
1464
|
+
}
|
|
1465
|
+
};
|
|
1466
|
+
ipcMain.handle('desktop:prepare-local-service', async (event, install) => {
|
|
1467
|
+
connectionCenterSender(event);
|
|
1468
|
+
await localServiceSetup.prepare(install === true);
|
|
1469
|
+
return snapshot();
|
|
1470
|
+
});
|
|
1471
|
+
ipcMain.handle('desktop:download-node', async (event) => {
|
|
1472
|
+
connectionCenterSender(event);
|
|
1473
|
+
await shell.openExternal('https://nodejs.org/en/download');
|
|
1474
|
+
});
|
|
1448
1475
|
const directorySender = (event) => {
|
|
1449
1476
|
const window = BrowserWindow.fromWebContents(event.sender);
|
|
1450
1477
|
if (!window || event.senderFrame !== event.sender.mainFrame)
|
|
@@ -1879,6 +1906,7 @@ app.whenReady().then(async () => {
|
|
|
1879
1906
|
triggerLocalNetworkPermission();
|
|
1880
1907
|
configureLocalServiceCertificateTrust();
|
|
1881
1908
|
installIpcHandlers();
|
|
1909
|
+
const localPreparation = localServiceSetup.prepare();
|
|
1882
1910
|
installMenu();
|
|
1883
1911
|
refreshDesktopStatusSurfaces();
|
|
1884
1912
|
screen.on('display-removed', keepFloatingWidgetOnScreen);
|
|
@@ -1905,6 +1933,11 @@ app.whenReady().then(async () => {
|
|
|
1905
1933
|
let completedRestores = 0;
|
|
1906
1934
|
updateStartupProgress(`正在恢复连接 0/${restoreUrls.length}…`);
|
|
1907
1935
|
const restoreResults = await Promise.all(restoreUrls.map(async (url) => {
|
|
1936
|
+
try {
|
|
1937
|
+
if (['localhost', '127.0.0.1', '[::1]'].includes(new URL(url).hostname))
|
|
1938
|
+
await localPreparation;
|
|
1939
|
+
}
|
|
1940
|
+
catch { /* The connection probe reports malformed saved URLs. */ }
|
|
1908
1941
|
const probe = await connectWindow(url, {
|
|
1909
1942
|
focus: false,
|
|
1910
1943
|
updateLastConnection: false,
|
package/README.en.md
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Termdock
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="public/pwa-192x192.png" alt="Termdock icon" width="96" />
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
**Bring your terminal and AI coding workspace to your phone, browser, and Mac.**
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/termdock)
|
|
10
|
+
[](https://www.npmjs.com/package/termdock)
|
|
11
|
+
[](https://github.com/Jovines/termdock/releases)
|
|
12
|
+
[](LICENSE)
|
|
13
|
+
|
|
14
|
+
[简体中文](README.md) · English
|
|
15
|
+
|
|
16
|
+
Termdock is a self-hosted web terminal and AI Agent workspace. Run Claude Code, Codex, Gemini CLI, or your usual shell tools on your computer, then reconnect to the same tmux session from your phone. Connect multiple machines, exchange messages between Agent sessions, review changes, and inspect files from one workspace.
|
|
17
|
+
|
|
18
|
+
Commands run on the machine hosting the Termdock service. The browser, PWA, and macOS app connect to that service. Install and authenticate your preferred AI CLI separately on the service machine; model accounts and usage charges belong to the respective providers.
|
|
19
|
+
|
|
20
|
+
[Quick start](#quick-start) · [Features](#features) · [AI and collaboration](#ai-and-collaboration) · [FAQ](#faq) · [Documentation](#documentation) · [Contributing](#contributing)
|
|
21
|
+
|
|
22
|
+
## Why Termdock
|
|
23
|
+
|
|
24
|
+
- **Continue away from your desk.** Read output, send instructions, and answer Agent questions from your phone. tmux sessions keep running when you close the client.
|
|
25
|
+
- **Use a terminal designed for touch.** Customizable shortcut bars, touch scrolling, session swiping, and iOS keyboard adjustments make terminal interaction easier on small screens.
|
|
26
|
+
- **Keep AI work together.** Manage multiple Agent sessions and use collaboration groups for goals, questions, reviews, and acceptance.
|
|
27
|
+
- **Reach multiple machines.** Switch service workspaces or use a configured entry service to relay encrypted traffic. Each target verifies its own identity and permissions.
|
|
28
|
+
- **Inspect the actual results.** Browse files, review Git diffs, preview documents and media, and reference selected content in an Agent conversation.
|
|
29
|
+
|
|
30
|
+
## Quick start
|
|
31
|
+
|
|
32
|
+
### Requirements
|
|
33
|
+
|
|
34
|
+
| Component | Requirement |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| Service host | macOS or Linux; Windows users can try a Linux environment under WSL2 |
|
|
37
|
+
| Runtime | **Node.js 22+** and npm |
|
|
38
|
+
| Persistent sessions | `tmux` available in `PATH` |
|
|
39
|
+
| Web client | A current Chrome, Edge, Firefox, or Safari; use HTTPS for phone access and PWA installation |
|
|
40
|
+
| macOS app | The current packaging target is Apple Silicon / arm64; see [Releases](https://github.com/Jovines/termdock/releases) |
|
|
41
|
+
|
|
42
|
+
Installation checks native terminal dependencies and tmux and attempts repairs when needed. To prepare tmux manually:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# macOS with Homebrew
|
|
46
|
+
brew install tmux
|
|
47
|
+
|
|
48
|
+
# Ubuntu / Debian
|
|
49
|
+
sudo apt-get update
|
|
50
|
+
sudo apt-get install -y tmux
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If `node-pty` needs compilation, install Xcode Command Line Tools on macOS (`xcode-select --install`), or `build-essential` and `python3` on Ubuntu / Debian. Behavior on WSL2, other Linux distributions, and mobile devices depends on the actual environment.
|
|
54
|
+
|
|
55
|
+
### Install and launch
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install -g termdock
|
|
59
|
+
|
|
60
|
+
# Set a password before starting the service
|
|
61
|
+
td --set-password
|
|
62
|
+
td
|
|
63
|
+
|
|
64
|
+
# Find the actual URLs and service status
|
|
65
|
+
td --status
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`td` and `termdock` are aliases for the same CLI. First launch may guide you through a local hostname and HTTPS setup. Open the URL printed in the startup log or `td --status`, sign in, and create a terminal.
|
|
69
|
+
|
|
70
|
+
For a local-only trial:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npx termdock --host 127.0.0.1
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Without certificates, the local URL is `http://localhost:9834`. With certificates, use the HTTPS URL reported by the CLI. The default listener is `0.0.0.0:9834`; background mode uses a supervisor to recover from service crashes.
|
|
77
|
+
|
|
78
|
+
### macOS app
|
|
79
|
+
|
|
80
|
+
Download the DMG from [GitHub Releases](https://github.com/Jovines/termdock/releases). The connection center connects to independently running local, LAN, or public Termdock services.
|
|
81
|
+
|
|
82
|
+
When Node.js 22+ and the CLI are available, the app detects and starts the local service as needed. When the CLI is missing, **安装并启动** installs it into `~/.termdock/cli`. If Node.js is missing or outdated, the connection center offers its official download page. Quitting the app leaves the standalone service running.
|
|
83
|
+
|
|
84
|
+
The app adds native windows, shortcuts, Finder file interactions, and application updates. See the [macOS guide](docs/macos-desktop.md) for build, signing, and upgrade details.
|
|
85
|
+
|
|
86
|
+
### Phone access and HTTPS
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
td --set-password
|
|
90
|
+
td --setup-local-https
|
|
91
|
+
td
|
|
92
|
+
td --status
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The HTTPS setup checks mkcert; on macOS it can install mkcert through Homebrew. You can also supply your own certificate and key with `--https-cert` and `--https-key`.
|
|
96
|
+
|
|
97
|
+
On the same reachable network, open the onboarding URL printed by the service, install and trust its local CA, then open the reported HTTPS URL:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
https://<name>.termdock.local:9834
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
On iPhone, use Safari's **Share → Add to Home Screen**. On Android, use the browser's app installation action. mDNS may be blocked by guest Wi-Fi, client isolation, or a VPN. An alternative hostname or IP address must also be covered by the certificate.
|
|
104
|
+
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
| Area | Capabilities |
|
|
108
|
+
| --- | --- |
|
|
109
|
+
| Terminal | xterm.js with WebGL rendering, tmux persistence, reconnect, mouse input, multiple sessions and saved layouts |
|
|
110
|
+
| Mobile | Touch scrolling, session swiping, pinch-to-resize text, configurable Esc / Tab / Ctrl / Alt / arrow shortcut bars |
|
|
111
|
+
| AI sessions | Built-in recognition and resume adapters for multiple Agent CLIs; extensible through plugins |
|
|
112
|
+
| Collaboration | Groups, messages, goals and subtasks, questions, plans, independent reviews, and explicit acceptance |
|
|
113
|
+
| Files and review | File browser, upload/download, clipboard images, drag and drop, Git diffs, contextual references |
|
|
114
|
+
| Previews | Markdown, images, video, sandboxed HTML, STL / GLB / glTF, and KiCad files; some conversions require additional host tools |
|
|
115
|
+
| Connected devices | RDP/VNC desktop control; Android mirroring with adb, scrcpy, and an authorized device |
|
|
116
|
+
| Clients | Browser, installable PWA, and macOS desktop app; English and Chinese UI; Flexoki dark and light themes |
|
|
117
|
+
| Access | OPAQUE password authorization, Noise encrypted transport, device invitations, revocation, and configured encrypted relays |
|
|
118
|
+
|
|
119
|
+
Desktop control supports RDP and VNC. Ubuntu/Linux and Windows default to RDP; macOS defaults to built-in VNC Screen Sharing. RDP requires a local `guacd` backend on the Termdock service computer, bound only to `127.0.0.1:4822`. Enter the target’s Remote Desktop credentials and port (usually 3389; Ubuntu Desktop Sharing may use 3390). Credentials travel through the encrypted Termdock channel and are never stored or placed in URLs. VNC uses port 5900; keep the service-to-VNC connection on a trusted LAN or VPN. See the [desktop-control instructions](README.md#电脑控制) for setup.
|
|
120
|
+
|
|
121
|
+
PWA caching lets you reopen the cached interface offline. Terminal input, file access, and device control still need a working service connection. Phones may pause background clients; tmux continues on the service host.
|
|
122
|
+
|
|
123
|
+
## AI and collaboration
|
|
124
|
+
|
|
125
|
+
### Use your preferred CLI
|
|
126
|
+
|
|
127
|
+
Install and sign in to an Agent CLI on the service host, then launch it inside a Termdock terminal, for example `claude`, `codex`, or `gemini`. You can continue using the same terminal from another client. Ordinary shell programs such as Vim and htop also work.
|
|
128
|
+
|
|
129
|
+
### Collaborate across sessions and machines
|
|
130
|
+
|
|
131
|
+
Create a collaboration group and add Agent sessions. Use its workspace to send messages, create goals, answer questions, review deliverables, and accept results. Automatic collaboration supports a coordinator, separate execution directories, and independent review.
|
|
132
|
+
|
|
133
|
+
Inside a Termdock-managed terminal:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
td collab --help
|
|
137
|
+
td collab status
|
|
138
|
+
td collab send <recipient-session-id> 'Please review the changes and reply with your findings'
|
|
139
|
+
td collab inbox --json
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Collaboration relies on terminal delivery and explicit replies rather than provider-specific hooks. After service identity registration, cross-service delivery and retries run in the service background without an open browser. **Written to a terminal does not mean read by an Agent or completed.** Reports retain their original text and timestamps; outcomes require explicit review or acceptance.
|
|
143
|
+
|
|
144
|
+
See the [collaboration guide](docs/collaboration.md) and [encrypted access and relay guide](src/server/federation/README.md) for permissions, setup, and protocol limits.
|
|
145
|
+
|
|
146
|
+
### Progress reminders and scheduled prompts
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
td notify 'Tests passed; ready for review' --title 'Milestone'
|
|
150
|
+
td automation create --name 'Review current work' --every 30 --self \
|
|
151
|
+
--prompt 'Review the current work and report what needs attention'
|
|
152
|
+
td automation list
|
|
153
|
+
td automation pause <automation-id>
|
|
154
|
+
td automation --help
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
`td n` is the short alias for `td notify`. Progress reminders require a connected Termdock page and are not stored offline. Existing-session scheduled prompts require an Agent running when the schedule fires. Schedules use the service timezone and run while the service is running; successful dispatch is not proof of task completion.
|
|
158
|
+
|
|
159
|
+
### Agent plugins
|
|
160
|
+
|
|
161
|
+
A plugin repository contains a root `manifest.json` and may include icons or helper scripts:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
td plugin-install https://github.com/owner/my-agent-termdock-plugin
|
|
165
|
+
td plugin-list --json
|
|
166
|
+
td plugin-doctor my-agent --json
|
|
167
|
+
td plugin-update my-agent
|
|
168
|
+
td plugin-remove my-agent
|
|
169
|
+
td agent-plugin --json
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Install only repositories you trust. Plugin installation and Agent hook installation have separate lifecycles; installing a plugin does not automatically install hooks. The [Chinese README](README.md#分享和安装-agent-插件) includes manifest examples and model selection rules.
|
|
173
|
+
|
|
174
|
+
## Service management and configuration
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
td --status # Inspect the background service
|
|
178
|
+
td --stop # Stop the supervisor and service
|
|
179
|
+
td --restart # Restart a supervised service
|
|
180
|
+
td --foreground # Run in the foreground for diagnosis
|
|
181
|
+
td update # Update the globally installed CLI
|
|
182
|
+
td --help # Full CLI reference
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
The CLI also checks for updates in the background. Installing an update does not automatically restart the running service; apply it through the explicit restart action. macOS app updates are separate from service updates.
|
|
186
|
+
|
|
187
|
+
Configuration examples live in [.env.example](.env.example); configuration loading, timeouts, supervision, and public access are documented in the [configuration guide](docs/configuration.md).
|
|
188
|
+
|
|
189
|
+
State lives under `~/.termdock`, including `auth.json`, `server.json`, `server.log`, `crash.log`, certificates, and federation identity and authorization data. Treat this directory as private.
|
|
190
|
+
|
|
191
|
+
The terminal has the permissions of the system account running the service. Public access requires a strong password, trusted HTTPS, and a correctly configured `TERMDOCK_PUBLIC_ORIGIN`; see [public access configuration](docs/configuration.md#公网安全模式). Application authentication and path checks do not provide multi-tenant OS isolation. A PWA still requires a trusted frontend code source.
|
|
192
|
+
|
|
193
|
+
## Development
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
git clone https://github.com/Jovines/termdock.git
|
|
197
|
+
cd termdock
|
|
198
|
+
npm install
|
|
199
|
+
npm run dev
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Open `http://localhost:9833`. Vite proxies API and WebSocket connections to the development backend on port 9835; the installed service uses port 9834.
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
npm run lint # TypeScript checking
|
|
206
|
+
npm test -- --run # One test run
|
|
207
|
+
npm run build # Build web client and server
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Build output lives in `dist/client/` and `dist/server/`. Start built output with `npm start`. To build and install the CLI globally from source, use `./install-local.sh`; it also rebuilds `node-pty`. See [CONTRIBUTING.md](CONTRIBUTING.md) for review and verification expectations.
|
|
211
|
+
|
|
212
|
+
The stack includes React, TypeScript, Vite, xterm.js, Zustand, Tailwind CSS, Express, ws, node-pty, tmux, and Electron for the macOS shell.
|
|
213
|
+
|
|
214
|
+
## FAQ
|
|
215
|
+
|
|
216
|
+
**Which URL should I open on my phone?** Use the reachable HTTPS URL from `td --status`. `localhost` on your phone refers to the phone itself. Complete CA trust through the onboarding page first.
|
|
217
|
+
|
|
218
|
+
**Will closing the client stop my work?** Not in tmux mode. Destroying a session, killing its process, or shutting down the host does stop it.
|
|
219
|
+
|
|
220
|
+
**Why does terminal creation fail?** Check `node --version`, `tmux -V`, `td --status`, and `~/.termdock/server.log`. Common causes are an old Node.js runtime, missing tmux, or a failed native `node-pty` installation.
|
|
221
|
+
|
|
222
|
+
**Why do I still see the old UI after updating?** Restart the service after the CLI update, accept the page update, and reload. If the phone PWA retains older resources, fully close and reopen it.
|
|
223
|
+
|
|
224
|
+
**Which browsers are supported?** Use current Chrome, Edge, Firefox, or Safari. Clipboard, WebGL, background behavior, and PWA installation vary by platform. Browser emulation does not replace physical macOS / iOS verification; see the [known macOS beta issue](docs/macos-27-local-network.md).
|
|
225
|
+
|
|
226
|
+
## Documentation
|
|
227
|
+
|
|
228
|
+
Some detailed guides are currently in Chinese.
|
|
229
|
+
|
|
230
|
+
| Guide | Contents |
|
|
231
|
+
| --- | --- |
|
|
232
|
+
| [Chinese README](README.md) | Extended setup and CLI examples |
|
|
233
|
+
| [Configuration](docs/configuration.md) | Environment variables, supervision, public access |
|
|
234
|
+
| [macOS app](docs/macos-desktop.md) | Local service assistance, shortcuts, packaging and updates |
|
|
235
|
+
| [Collaboration](docs/collaboration.md) | Messages, cross-service delivery, tasks, reviews and acceptance |
|
|
236
|
+
| [Encrypted access and relays](src/server/federation/README.md) | Password proof, device authorization, routing and preview limits |
|
|
237
|
+
| [Electronics preview](docs/electronics-preview.md) | KiCad tools and position references |
|
|
238
|
+
| [Model features](docs/model-features.md) | 3D feature and coordinate references |
|
|
239
|
+
|
|
240
|
+
## Contributing
|
|
241
|
+
|
|
242
|
+
Bug reports, feature discussions, translations, device feedback, Agent plugins, and pull requests are welcome. English and Chinese are both welcome. Start with [CONTRIBUTING.md](CONTRIBUTING.md), [Issues](https://github.com/Jovines/termdock/issues), or [Pull Requests](https://github.com/Jovines/termdock/pulls).
|
|
243
|
+
|
|
244
|
+
If Termdock helps your workflow, consider starring the repository or sharing it with someone who needs a mobile terminal or self-hosted AI workspace. Remove passwords, invitation links, keys, and private paths before sharing logs or screenshots.
|
|
245
|
+
|
|
246
|
+
## License and acknowledgments
|
|
247
|
+
|
|
248
|
+
Termdock uses the [MIT License](LICENSE). Bundled dependencies and fonts retain their own licenses; see [third-party notices](public/third-party-notices.txt).
|
|
249
|
+
|
|
250
|
+
Thanks to [xterm.js](https://github.com/xtermjs/xterm.js), [tmux](https://github.com/tmux/tmux), [node-pty](https://github.com/microsoft/node-pty), [noVNC](https://github.com/novnc/noVNC), and the other open-source projects that make Termdock possible. The interface uses [Flexoki](https://stephango.com/flexoki).
|
|
251
|
+
|
|
252
|
+
<details>
|
|
253
|
+
<summary>Project naming note</summary>
|
|
254
|
+
|
|
255
|
+
Termcove is a tentative future name. The application, npm package, and CLI currently remain Termdock / `termdock`; no migration is needed.
|
|
256
|
+
|
|
257
|
+
</details>
|