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.
Files changed (364) hide show
  1. package/.desktop-dist/main.js +35 -2
  2. package/README.en.md +257 -0
  3. package/README.md +284 -133
  4. package/dist/client/assets/App-BbqtNY2x.js +177 -0
  5. package/dist/client/assets/App-BbqtNY2x.js.br +0 -0
  6. package/dist/client/assets/App-BbqtNY2x.js.gz +0 -0
  7. package/dist/client/assets/{ChangeWalkthroughPanel-DXprT-7m.js → ChangeWalkthroughPanel-CvQJIp_C.js} +1 -1
  8. package/dist/client/assets/ChangeWalkthroughPanel-CvQJIp_C.js.br +0 -0
  9. package/dist/client/assets/ChangeWalkthroughPanel-CvQJIp_C.js.gz +0 -0
  10. package/dist/client/assets/CollaborationMainWorkspace-B0OgRtyR.js +1 -0
  11. package/dist/client/assets/CollaborationMainWorkspace-B0OgRtyR.js.br +0 -0
  12. package/dist/client/assets/CollaborationMainWorkspace-B0OgRtyR.js.gz +0 -0
  13. package/dist/client/assets/CollaborationTaskContent-C01GXOEq.js +2 -0
  14. package/dist/client/assets/ComputerControlView-CW1uA133.js +4 -0
  15. package/dist/client/assets/ComputerControlView-CW1uA133.js.br +0 -0
  16. package/dist/client/assets/ComputerControlView-CW1uA133.js.gz +0 -0
  17. package/dist/client/assets/{DagPlayground-DZcUunT5.js → DagPlayground-CdE3tQsl.js} +1 -1
  18. package/dist/client/assets/DagPlayground-CdE3tQsl.js.br +0 -0
  19. package/dist/client/assets/DagPlayground-CdE3tQsl.js.gz +0 -0
  20. package/dist/client/assets/{DiffLab-Brv4DCTb.js → DiffLab-BLGNnazd.js} +1 -1
  21. package/dist/client/assets/DiffLab-BLGNnazd.js.br +0 -0
  22. package/dist/client/assets/DiffLab-BLGNnazd.js.gz +0 -0
  23. package/dist/client/assets/{DiffReview-BuLu1qCi.js → DiffReview-CYw3ASI6.js} +1 -1
  24. package/dist/client/assets/DiffReview-CYw3ASI6.js.br +0 -0
  25. package/dist/client/assets/DiffReview-CYw3ASI6.js.gz +0 -0
  26. package/dist/client/assets/{DiffReviewLab-DSGamuAD.js → DiffReviewLab-CySIuWq_.js} +1 -1
  27. package/dist/client/assets/DiffReviewLab-CySIuWq_.js.br +0 -0
  28. package/dist/client/assets/DiffReviewLab-CySIuWq_.js.gz +0 -0
  29. package/dist/client/assets/{DiffViewer-BUCYxg27.js → DiffViewer-WsYvN75z.js} +13 -13
  30. package/dist/client/assets/DiffViewer-WsYvN75z.js.br +0 -0
  31. package/dist/client/assets/DiffViewer-WsYvN75z.js.gz +0 -0
  32. package/dist/client/assets/{ModelPreview-Bnlo-oVE.js → ModelPreview-Dnlx9ByX.js} +1 -1
  33. package/dist/client/assets/ModelPreview-Dnlx9ByX.js.br +0 -0
  34. package/dist/client/assets/ModelPreview-Dnlx9ByX.js.gz +0 -0
  35. package/dist/client/assets/RightSidebar-Cp5b_y0u.js +1678 -0
  36. package/dist/client/assets/RightSidebar-Cp5b_y0u.js.br +0 -0
  37. package/dist/client/assets/RightSidebar-Cp5b_y0u.js.gz +0 -0
  38. package/dist/client/assets/{abnfDiagram-VCTEODGH-K6Ppkrbt.js → abnfDiagram-VCTEODGH-CK1mGFRQ.js} +1 -1
  39. package/dist/client/assets/abnfDiagram-VCTEODGH-CK1mGFRQ.js.br +0 -0
  40. package/dist/client/assets/abnfDiagram-VCTEODGH-CK1mGFRQ.js.gz +0 -0
  41. package/dist/client/assets/app-DfACMixk.js +35 -0
  42. package/dist/client/assets/app-DfACMixk.js.br +0 -0
  43. package/dist/client/assets/app-DfACMixk.js.gz +0 -0
  44. package/dist/client/assets/{arc-Co2OQqtH.js → arc-yZE1gqDl.js} +1 -1
  45. package/dist/client/assets/arc-yZE1gqDl.js.br +0 -0
  46. package/dist/client/assets/arc-yZE1gqDl.js.gz +0 -0
  47. package/dist/client/assets/{architectureDiagram-5GKGNRK7-BQnl7tVF.js → architectureDiagram-5GKGNRK7-U5XSC7cY.js} +1 -1
  48. package/dist/client/assets/architectureDiagram-5GKGNRK7-U5XSC7cY.js.br +0 -0
  49. package/dist/client/assets/architectureDiagram-5GKGNRK7-U5XSC7cY.js.gz +0 -0
  50. package/dist/client/assets/{blockDiagram-I7D4REHJ-Bm5D5-qq.js → blockDiagram-I7D4REHJ-pVJnntSG.js} +1 -1
  51. package/dist/client/assets/blockDiagram-I7D4REHJ-pVJnntSG.js.br +0 -0
  52. package/dist/client/assets/blockDiagram-I7D4REHJ-pVJnntSG.js.gz +0 -0
  53. package/dist/client/assets/{c4Diagram-7LVT6UL2-B9oPpey8.js → c4Diagram-7LVT6UL2-Bwz0AJJV.js} +1 -1
  54. package/dist/client/assets/c4Diagram-7LVT6UL2-Bwz0AJJV.js.br +0 -0
  55. package/dist/client/assets/c4Diagram-7LVT6UL2-Bwz0AJJV.js.gz +0 -0
  56. package/dist/client/assets/channel-qqjDJtcZ.js +1 -0
  57. package/dist/client/assets/{chunk-2Q5K7J3B-TMaWHH0U.js → chunk-2Q5K7J3B-CXJ1kP4X.js} +1 -1
  58. package/dist/client/assets/{chunk-5VM5RSS4-CH7XpknV.js → chunk-5VM5RSS4-Dpdum_2z.js} +1 -1
  59. package/dist/client/assets/{chunk-F27PBJKO-CJ1rotBe.js → chunk-F27PBJKO-BCG5Zi_-.js} +1 -1
  60. package/dist/client/assets/chunk-F27PBJKO-BCG5Zi_-.js.br +0 -0
  61. package/dist/client/assets/chunk-F27PBJKO-BCG5Zi_-.js.gz +0 -0
  62. package/dist/client/assets/{chunk-IMKFNOWR-UYKZ5uOG.js → chunk-IMKFNOWR-BM-GcNcv.js} +1 -1
  63. package/dist/client/assets/chunk-IMKFNOWR-BM-GcNcv.js.br +0 -0
  64. package/dist/client/assets/chunk-IMKFNOWR-BM-GcNcv.js.gz +0 -0
  65. package/dist/client/assets/{chunk-JWPE2WC7-BYL8aXjQ.js → chunk-JWPE2WC7-BWiXpQT9.js} +1 -1
  66. package/dist/client/assets/{chunk-POPQ4Y6H-C3E8yfU2.js → chunk-POPQ4Y6H-vQSslMNv.js} +1 -1
  67. package/dist/client/assets/{chunk-SVP7TREG-DCTDYa1E.js → chunk-SVP7TREG-Aqfz6nPA.js} +1 -1
  68. package/dist/client/assets/chunk-SVP7TREG-Aqfz6nPA.js.br +0 -0
  69. package/dist/client/assets/chunk-SVP7TREG-Aqfz6nPA.js.gz +0 -0
  70. package/dist/client/assets/{chunk-TICWLB2K-wHiaOsBh.js → chunk-TICWLB2K-DDjekMd0.js} +1 -1
  71. package/dist/client/assets/chunk-TICWLB2K-DDjekMd0.js.br +0 -0
  72. package/dist/client/assets/chunk-TICWLB2K-DDjekMd0.js.gz +0 -0
  73. package/dist/client/assets/{chunk-XXDRQBXY-D_d479hK.js → chunk-XXDRQBXY-BegIBcFg.js} +1 -1
  74. package/dist/client/assets/classDiagram-ZZMXUADV-BDuBrfNz.js +1 -0
  75. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BDuBrfNz.js +1 -0
  76. package/dist/client/assets/{cose-bilkent-JH36ORCC-DnhlPBLr.js → cose-bilkent-JH36ORCC-B2izFsBY.js} +1 -1
  77. package/dist/client/assets/cose-bilkent-JH36ORCC-B2izFsBY.js.br +0 -0
  78. package/dist/client/assets/cose-bilkent-JH36ORCC-B2izFsBY.js.gz +0 -0
  79. package/dist/client/assets/{cynefin-OW5HDTMX-BsjzNqJZ.js → cynefin-OW5HDTMX-C7HA99Zc.js} +1 -1
  80. package/dist/client/assets/cynefin-OW5HDTMX-C7HA99Zc.js.br +0 -0
  81. package/dist/client/assets/cynefin-OW5HDTMX-C7HA99Zc.js.gz +0 -0
  82. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-sVUb0zY5.js → cynefinDiagram-5FMLGOSQ-vNIzcCYl.js} +1 -1
  83. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-vNIzcCYl.js.br +0 -0
  84. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-vNIzcCYl.js.gz +0 -0
  85. package/dist/client/assets/{dagre-GXQ25YYZ-YErk8S-c.js → dagre-GXQ25YYZ-Bv9WHNT9.js} +1 -1
  86. package/dist/client/assets/dagre-GXQ25YYZ-Bv9WHNT9.js.br +0 -0
  87. package/dist/client/assets/dagre-GXQ25YYZ-Bv9WHNT9.js.gz +0 -0
  88. package/dist/client/assets/{diagram-S7CK7UJ4-BaHbV5ho.js → diagram-S7CK7UJ4-DFg5UNic.js} +1 -1
  89. package/dist/client/assets/diagram-S7CK7UJ4-DFg5UNic.js.br +0 -0
  90. package/dist/client/assets/diagram-S7CK7UJ4-DFg5UNic.js.gz +0 -0
  91. package/dist/client/assets/{diagram-UQ7AKVKN-BocCYx3V.js → diagram-UQ7AKVKN-BFQsCAs7.js} +1 -1
  92. package/dist/client/assets/diagram-UQ7AKVKN-BFQsCAs7.js.br +0 -0
  93. package/dist/client/assets/diagram-UQ7AKVKN-BFQsCAs7.js.gz +0 -0
  94. package/dist/client/assets/{diagram-VSXAHHWV-ZMTYwWOQ.js → diagram-VSXAHHWV-C4R8TKEv.js} +1 -1
  95. package/dist/client/assets/diagram-VSXAHHWV-C4R8TKEv.js.br +0 -0
  96. package/dist/client/assets/diagram-VSXAHHWV-C4R8TKEv.js.gz +0 -0
  97. package/dist/client/assets/{diagram-VX7I27RA-xmk_EY1h.js → diagram-VX7I27RA-CL75HIf0.js} +1 -1
  98. package/dist/client/assets/diagram-VX7I27RA-CL75HIf0.js.br +0 -0
  99. package/dist/client/assets/diagram-VX7I27RA-CL75HIf0.js.gz +0 -0
  100. package/dist/client/assets/{diagram-Z3DM3KII-DKDY_cG6.js → diagram-Z3DM3KII-CfJampuO.js} +1 -1
  101. package/dist/client/assets/diagram-Z3DM3KII-CfJampuO.js.br +0 -0
  102. package/dist/client/assets/diagram-Z3DM3KII-CfJampuO.js.gz +0 -0
  103. package/dist/client/assets/{ebnfDiagram-PWID7BFC-C_0z-Jx9.js → ebnfDiagram-PWID7BFC-Ct53jhNd.js} +1 -1
  104. package/dist/client/assets/ebnfDiagram-PWID7BFC-Ct53jhNd.js.br +0 -0
  105. package/dist/client/assets/ebnfDiagram-PWID7BFC-Ct53jhNd.js.gz +0 -0
  106. package/dist/client/assets/{erDiagram-RLTQ6QDP-DHUaG7mt.js → erDiagram-RLTQ6QDP-BgL2xOOa.js} +1 -1
  107. package/dist/client/assets/erDiagram-RLTQ6QDP-BgL2xOOa.js.br +0 -0
  108. package/dist/client/assets/erDiagram-RLTQ6QDP-BgL2xOOa.js.gz +0 -0
  109. package/dist/client/assets/{flowDiagram-HODETNUW-BMNsdMBD.js → flowDiagram-HODETNUW-Cp4Nu5jY.js} +1 -1
  110. package/dist/client/assets/flowDiagram-HODETNUW-Cp4Nu5jY.js.br +0 -0
  111. package/dist/client/assets/flowDiagram-HODETNUW-Cp4Nu5jY.js.gz +0 -0
  112. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BH1AiKuF.js → ganttDiagram-EL5Y4UJY-DI0rdyPX.js} +1 -1
  113. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DI0rdyPX.js.br +0 -0
  114. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DI0rdyPX.js.gz +0 -0
  115. package/dist/client/assets/{gestureArbiter-DvupkPra.js → gestureArbiter-Belsq4xq.js} +1 -1
  116. package/dist/client/assets/gestureArbiter-Belsq4xq.js.br +0 -0
  117. package/dist/client/assets/gestureArbiter-Belsq4xq.js.gz +0 -0
  118. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DAgV0MV-.js → gitGraphDiagram-WWUBYQGX-C0H4loQP.js} +1 -1
  119. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0H4loQP.js.br +0 -0
  120. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C0H4loQP.js.gz +0 -0
  121. package/dist/client/assets/index-CYmI1EsU.css +1 -0
  122. package/dist/client/assets/index-CYmI1EsU.css.br +0 -0
  123. package/dist/client/assets/index-CYmI1EsU.css.gz +0 -0
  124. package/dist/client/assets/{infoDiagram-27XIBGKW-C7iSg0cB.js → infoDiagram-27XIBGKW-BN4RpQTL.js} +1 -1
  125. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BpZwsQvw.js → ishikawaDiagram-5VMMS53U-BZQ5qZB_.js} +1 -1
  126. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BZQ5qZB_.js.br +0 -0
  127. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BZQ5qZB_.js.gz +0 -0
  128. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DXEeFLvw.js → journeyDiagram-3NMN7TZE-Q8bx0_N4.js} +1 -1
  129. package/dist/client/assets/journeyDiagram-3NMN7TZE-Q8bx0_N4.js.br +0 -0
  130. package/dist/client/assets/journeyDiagram-3NMN7TZE-Q8bx0_N4.js.gz +0 -0
  131. package/dist/client/assets/{kanban-definition-UXKFOSKX-CV9ivL5u.js → kanban-definition-UXKFOSKX-D7JhGtpO.js} +1 -1
  132. package/dist/client/assets/kanban-definition-UXKFOSKX-D7JhGtpO.js.br +0 -0
  133. package/dist/client/assets/kanban-definition-UXKFOSKX-D7JhGtpO.js.gz +0 -0
  134. package/dist/client/assets/{layout-DsKKsJKX.js → layout-DERUg0xU.js} +1 -1
  135. package/dist/client/assets/layout-DERUg0xU.js.br +0 -0
  136. package/dist/client/assets/layout-DERUg0xU.js.gz +0 -0
  137. package/dist/client/assets/{linear-Dl9MDNV3.js → linear-lNTe4x00.js} +1 -1
  138. package/dist/client/assets/linear-lNTe4x00.js.br +0 -0
  139. package/dist/client/assets/linear-lNTe4x00.js.gz +0 -0
  140. package/dist/client/assets/{mermaid.core-CxZFe3as.js → mermaid.core-WHCwLQDQ.js} +5 -5
  141. package/dist/client/assets/mermaid.core-WHCwLQDQ.js.br +0 -0
  142. package/dist/client/assets/mermaid.core-WHCwLQDQ.js.gz +0 -0
  143. package/dist/client/assets/{mindmap-definition-YA3MSWOX-C3ormYdL.js → mindmap-definition-YA3MSWOX-BouapA4v.js} +1 -1
  144. package/dist/client/assets/mindmap-definition-YA3MSWOX-BouapA4v.js.br +0 -0
  145. package/dist/client/assets/mindmap-definition-YA3MSWOX-BouapA4v.js.gz +0 -0
  146. package/dist/client/assets/{passwordBootstrap-a8z6jJNY.js → passwordBootstrap-E0piP814.js} +2 -2
  147. package/dist/client/assets/passwordBootstrap-E0piP814.js.br +0 -0
  148. package/dist/client/assets/passwordBootstrap-E0piP814.js.gz +0 -0
  149. package/dist/client/assets/{pegDiagram-XKGWAZYB-CG0wNylH.js → pegDiagram-XKGWAZYB-Curpo5Rq.js} +1 -1
  150. package/dist/client/assets/pegDiagram-XKGWAZYB-Curpo5Rq.js.br +0 -0
  151. package/dist/client/assets/pegDiagram-XKGWAZYB-Curpo5Rq.js.gz +0 -0
  152. package/dist/client/assets/{pieDiagram-E7YTZNPT-D2-ydqyX.js → pieDiagram-E7YTZNPT-BLQCHaOG.js} +1 -1
  153. package/dist/client/assets/pieDiagram-E7YTZNPT-BLQCHaOG.js.br +0 -0
  154. package/dist/client/assets/pieDiagram-E7YTZNPT-BLQCHaOG.js.gz +0 -0
  155. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CK3fRC18.js → quadrantDiagram-AXDQQJYC-PViFqGao.js} +1 -1
  156. package/dist/client/assets/quadrantDiagram-AXDQQJYC-PViFqGao.js.br +0 -0
  157. package/dist/client/assets/quadrantDiagram-AXDQQJYC-PViFqGao.js.gz +0 -0
  158. package/dist/client/assets/{railroadDiagram-O6MQD6OU-V4EFlydu.js → railroadDiagram-O6MQD6OU-BtHo1LpT.js} +1 -1
  159. package/dist/client/assets/railroadDiagram-O6MQD6OU-BtHo1LpT.js.br +0 -0
  160. package/dist/client/assets/railroadDiagram-O6MQD6OU-BtHo1LpT.js.gz +0 -0
  161. package/dist/client/assets/rdpSession-O_f9ejOI.js +1 -0
  162. package/dist/client/assets/rdpSession-O_f9ejOI.js.br +0 -0
  163. package/dist/client/assets/rdpSession-O_f9ejOI.js.gz +0 -0
  164. package/dist/client/assets/{referenceLongPress-BjmYd1vB.js → referenceLongPress-BZr7Lqzh.js} +1 -1
  165. package/dist/client/assets/referenceLongPress-BZr7Lqzh.js.br +0 -0
  166. package/dist/client/assets/referenceLongPress-BZr7Lqzh.js.gz +0 -0
  167. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Di1_tyAX.js → requirementDiagram-BXWQKSXE-BUm81HUU.js} +1 -1
  168. package/dist/client/assets/requirementDiagram-BXWQKSXE-BUm81HUU.js.br +0 -0
  169. package/dist/client/assets/requirementDiagram-BXWQKSXE-BUm81HUU.js.gz +0 -0
  170. package/dist/client/assets/rfb-CxsXsMUX.js +5 -0
  171. package/dist/client/assets/rfb-CxsXsMUX.js.br +0 -0
  172. package/dist/client/assets/rfb-CxsXsMUX.js.gz +0 -0
  173. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-D-qpWNza.js → sankeyDiagram-P5KCCOFB-B-_-aZ_y.js} +1 -1
  174. package/dist/client/assets/sankeyDiagram-P5KCCOFB-B-_-aZ_y.js.br +0 -0
  175. package/dist/client/assets/sankeyDiagram-P5KCCOFB-B-_-aZ_y.js.gz +0 -0
  176. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-DmIxafrB.js → sequenceDiagram-WJ2MYXX4-DT6LDIfx.js} +1 -1
  177. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DT6LDIfx.js.br +0 -0
  178. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DT6LDIfx.js.gz +0 -0
  179. package/dist/client/assets/{sizeCapture-INFHLROL-4MTh3tTt.js → sizeCapture-INFHLROL-CTYerd9j.js} +1 -1
  180. package/dist/client/assets/sizeCapture-INFHLROL-CTYerd9j.js.br +0 -0
  181. package/dist/client/assets/sizeCapture-INFHLROL-CTYerd9j.js.gz +0 -0
  182. package/dist/client/assets/{sparkles-Dk93lHg0.js → sparkles-CgaUBIwH.js} +1 -1
  183. package/dist/client/assets/{stateDiagram-D77RDMKH-CgYgneIv.js → stateDiagram-D77RDMKH-CQbb5x2_.js} +1 -1
  184. package/dist/client/assets/stateDiagram-D77RDMKH-CQbb5x2_.js.br +0 -0
  185. package/dist/client/assets/stateDiagram-D77RDMKH-CQbb5x2_.js.gz +0 -0
  186. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CJAVXcx1.js +1 -0
  187. package/dist/client/assets/{swimlanes-42K2YHIH-OWA9HFVf.js → swimlanes-42K2YHIH-BHZ4X2Fd.js} +1 -1
  188. package/dist/client/assets/swimlanes-42K2YHIH-BHZ4X2Fd.js.br +0 -0
  189. package/dist/client/assets/swimlanes-42K2YHIH-BHZ4X2Fd.js.gz +0 -0
  190. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-VL2nyI27.js +8 -0
  191. package/dist/client/assets/{timeline-definition-24CTP7MA-BAzx5DyO.js → timeline-definition-24CTP7MA-BrjH6R6w.js} +1 -1
  192. package/dist/client/assets/timeline-definition-24CTP7MA-BrjH6R6w.js.br +0 -0
  193. package/dist/client/assets/timeline-definition-24CTP7MA-BrjH6R6w.js.gz +0 -0
  194. package/dist/client/assets/{triangle-alert-CUIBOwqW.js → triangle-alert-C9IHD_eF.js} +1 -1
  195. package/dist/client/assets/{vennDiagram-4TSXK5OY-CBZ-PhTQ.js → vennDiagram-4TSXK5OY-C9f5jYgk.js} +1 -1
  196. package/dist/client/assets/vennDiagram-4TSXK5OY-C9f5jYgk.js.br +0 -0
  197. package/dist/client/assets/vennDiagram-4TSXK5OY-C9f5jYgk.js.gz +0 -0
  198. package/dist/client/assets/{videoCompression-BCnqCkRK.js → videoCompression-DJaU8exd.js} +1 -1
  199. package/dist/client/assets/videoCompression-DJaU8exd.js.br +0 -0
  200. package/dist/client/assets/videoCompression-DJaU8exd.js.gz +0 -0
  201. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DbWzC6l5.js → wardleyDiagram-VM6X3IG4-6ljFvtiC.js} +1 -1
  202. package/dist/client/assets/wardleyDiagram-VM6X3IG4-6ljFvtiC.js.br +0 -0
  203. package/dist/client/assets/wardleyDiagram-VM6X3IG4-6ljFvtiC.js.gz +0 -0
  204. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BmApnTWE.js → xychartDiagram-S5SC5T6Z-BaR2hm3e.js} +1 -1
  205. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BaR2hm3e.js.br +0 -0
  206. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BaR2hm3e.js.gz +0 -0
  207. package/dist/client/index.html +2 -2
  208. package/dist/client/index.html.br +0 -0
  209. package/dist/client/index.html.gz +0 -0
  210. package/dist/client/sw.js +1 -1
  211. package/dist/client/sw.js.br +0 -0
  212. package/dist/client/sw.js.gz +0 -0
  213. package/dist/server/agent/collaborationCli.js +3 -3
  214. package/dist/server/agent/collaborationGroupRoutes.js +0 -2
  215. package/dist/server/agent/collaborationResultPresentation.js +14 -0
  216. package/dist/server/agent/collaborationService.js +3 -1
  217. package/dist/server/agent/collaborationStore.js +12 -21
  218. package/dist/server/agent/collaborationTaskBundles.js +2 -2
  219. package/dist/server/agent/collaborationTaskCli.js +4 -4
  220. package/dist/server/agent/collaborationTaskStore.js +87 -25
  221. package/dist/server/agent/collaborationTaskWorkspace.js +66 -1
  222. package/dist/server/agent/collaborationTeam.js +16 -0
  223. package/dist/server/agent/executionArchives.js +52 -0
  224. package/dist/server/entry.js +6 -1
  225. package/dist/server/federation/runtime.js +24 -6
  226. package/dist/server/routes/computer.js +198 -0
  227. package/dist/server/routes/computerTarget.js +23 -0
  228. package/dist/server/routes/guacamoleProtocol.js +55 -0
  229. package/dist/server/routes/rdp.js +162 -0
  230. package/dist/server/routes/terminal.js +375 -360
  231. package/dist/server/shared/computerPreferences.js +29 -0
  232. package/dist/server/utils/computerCredentials.js +88 -0
  233. package/dist/server/utils/sharedSampling.js +93 -0
  234. package/dist/server/utils/terminalOutputDelivery.js +8 -1
  235. package/dist/server/utils/tmuxMetadataWriter.js +61 -0
  236. package/package.json +4 -1
  237. package/runtime-manifest.json +4 -4
  238. package/dist/client/assets/App-BiLjlrk-.js +0 -171
  239. package/dist/client/assets/App-BiLjlrk-.js.br +0 -0
  240. package/dist/client/assets/App-BiLjlrk-.js.gz +0 -0
  241. package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.br +0 -0
  242. package/dist/client/assets/ChangeWalkthroughPanel-DXprT-7m.js.gz +0 -0
  243. package/dist/client/assets/DagPlayground-DZcUunT5.js.br +0 -0
  244. package/dist/client/assets/DagPlayground-DZcUunT5.js.gz +0 -0
  245. package/dist/client/assets/DiffLab-Brv4DCTb.js.br +0 -0
  246. package/dist/client/assets/DiffLab-Brv4DCTb.js.gz +0 -0
  247. package/dist/client/assets/DiffReview-BuLu1qCi.js.br +0 -0
  248. package/dist/client/assets/DiffReview-BuLu1qCi.js.gz +0 -0
  249. package/dist/client/assets/DiffReviewLab-DSGamuAD.js.br +0 -0
  250. package/dist/client/assets/DiffReviewLab-DSGamuAD.js.gz +0 -0
  251. package/dist/client/assets/DiffViewer-BUCYxg27.js.br +0 -0
  252. package/dist/client/assets/DiffViewer-BUCYxg27.js.gz +0 -0
  253. package/dist/client/assets/ModelPreview-Bnlo-oVE.js.br +0 -0
  254. package/dist/client/assets/ModelPreview-Bnlo-oVE.js.gz +0 -0
  255. package/dist/client/assets/RightSidebar-r_3Lk5Rp.js +0 -1678
  256. package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.br +0 -0
  257. package/dist/client/assets/RightSidebar-r_3Lk5Rp.js.gz +0 -0
  258. package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.br +0 -0
  259. package/dist/client/assets/abnfDiagram-VCTEODGH-K6Ppkrbt.js.gz +0 -0
  260. package/dist/client/assets/app-CATnTUZF.js +0 -35
  261. package/dist/client/assets/app-CATnTUZF.js.br +0 -0
  262. package/dist/client/assets/app-CATnTUZF.js.gz +0 -0
  263. package/dist/client/assets/arc-Co2OQqtH.js.br +0 -0
  264. package/dist/client/assets/arc-Co2OQqtH.js.gz +0 -0
  265. package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.br +0 -0
  266. package/dist/client/assets/architectureDiagram-5GKGNRK7-BQnl7tVF.js.gz +0 -0
  267. package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.br +0 -0
  268. package/dist/client/assets/blockDiagram-I7D4REHJ-Bm5D5-qq.js.gz +0 -0
  269. package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.br +0 -0
  270. package/dist/client/assets/c4Diagram-7LVT6UL2-B9oPpey8.js.gz +0 -0
  271. package/dist/client/assets/channel-Czv2W4qA.js +0 -1
  272. package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.br +0 -0
  273. package/dist/client/assets/chunk-F27PBJKO-CJ1rotBe.js.gz +0 -0
  274. package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.br +0 -0
  275. package/dist/client/assets/chunk-IMKFNOWR-UYKZ5uOG.js.gz +0 -0
  276. package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.br +0 -0
  277. package/dist/client/assets/chunk-SVP7TREG-DCTDYa1E.js.gz +0 -0
  278. package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.br +0 -0
  279. package/dist/client/assets/chunk-TICWLB2K-wHiaOsBh.js.gz +0 -0
  280. package/dist/client/assets/classDiagram-ZZMXUADV-BdvOOL9k.js +0 -1
  281. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BdvOOL9k.js +0 -1
  282. package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.br +0 -0
  283. package/dist/client/assets/cose-bilkent-JH36ORCC-DnhlPBLr.js.gz +0 -0
  284. package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.br +0 -0
  285. package/dist/client/assets/cynefin-OW5HDTMX-BsjzNqJZ.js.gz +0 -0
  286. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.br +0 -0
  287. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-sVUb0zY5.js.gz +0 -0
  288. package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.br +0 -0
  289. package/dist/client/assets/dagre-GXQ25YYZ-YErk8S-c.js.gz +0 -0
  290. package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.br +0 -0
  291. package/dist/client/assets/diagram-S7CK7UJ4-BaHbV5ho.js.gz +0 -0
  292. package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.br +0 -0
  293. package/dist/client/assets/diagram-UQ7AKVKN-BocCYx3V.js.gz +0 -0
  294. package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.br +0 -0
  295. package/dist/client/assets/diagram-VSXAHHWV-ZMTYwWOQ.js.gz +0 -0
  296. package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.br +0 -0
  297. package/dist/client/assets/diagram-VX7I27RA-xmk_EY1h.js.gz +0 -0
  298. package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.br +0 -0
  299. package/dist/client/assets/diagram-Z3DM3KII-DKDY_cG6.js.gz +0 -0
  300. package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.br +0 -0
  301. package/dist/client/assets/ebnfDiagram-PWID7BFC-C_0z-Jx9.js.gz +0 -0
  302. package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.br +0 -0
  303. package/dist/client/assets/erDiagram-RLTQ6QDP-DHUaG7mt.js.gz +0 -0
  304. package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.br +0 -0
  305. package/dist/client/assets/flowDiagram-HODETNUW-BMNsdMBD.js.gz +0 -0
  306. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.br +0 -0
  307. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BH1AiKuF.js.gz +0 -0
  308. package/dist/client/assets/gestureArbiter-DvupkPra.js.br +0 -0
  309. package/dist/client/assets/gestureArbiter-DvupkPra.js.gz +0 -0
  310. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.br +0 -0
  311. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DAgV0MV-.js.gz +0 -0
  312. package/dist/client/assets/index-Bi9A6QUP.css +0 -1
  313. package/dist/client/assets/index-Bi9A6QUP.css.br +0 -0
  314. package/dist/client/assets/index-Bi9A6QUP.css.gz +0 -0
  315. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.br +0 -0
  316. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BpZwsQvw.js.gz +0 -0
  317. package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.br +0 -0
  318. package/dist/client/assets/journeyDiagram-3NMN7TZE-DXEeFLvw.js.gz +0 -0
  319. package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.br +0 -0
  320. package/dist/client/assets/kanban-definition-UXKFOSKX-CV9ivL5u.js.gz +0 -0
  321. package/dist/client/assets/layout-DsKKsJKX.js.br +0 -0
  322. package/dist/client/assets/layout-DsKKsJKX.js.gz +0 -0
  323. package/dist/client/assets/linear-Dl9MDNV3.js.br +0 -0
  324. package/dist/client/assets/linear-Dl9MDNV3.js.gz +0 -0
  325. package/dist/client/assets/mermaid.core-CxZFe3as.js.br +0 -0
  326. package/dist/client/assets/mermaid.core-CxZFe3as.js.gz +0 -0
  327. package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.br +0 -0
  328. package/dist/client/assets/mindmap-definition-YA3MSWOX-C3ormYdL.js.gz +0 -0
  329. package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.br +0 -0
  330. package/dist/client/assets/passwordBootstrap-a8z6jJNY.js.gz +0 -0
  331. package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.br +0 -0
  332. package/dist/client/assets/pegDiagram-XKGWAZYB-CG0wNylH.js.gz +0 -0
  333. package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.br +0 -0
  334. package/dist/client/assets/pieDiagram-E7YTZNPT-D2-ydqyX.js.gz +0 -0
  335. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.br +0 -0
  336. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CK3fRC18.js.gz +0 -0
  337. package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.br +0 -0
  338. package/dist/client/assets/railroadDiagram-O6MQD6OU-V4EFlydu.js.gz +0 -0
  339. package/dist/client/assets/referenceLongPress-BjmYd1vB.js.br +0 -0
  340. package/dist/client/assets/referenceLongPress-BjmYd1vB.js.gz +0 -0
  341. package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.br +0 -0
  342. package/dist/client/assets/requirementDiagram-BXWQKSXE-Di1_tyAX.js.gz +0 -0
  343. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.br +0 -0
  344. package/dist/client/assets/sankeyDiagram-P5KCCOFB-D-qpWNza.js.gz +0 -0
  345. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.br +0 -0
  346. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DmIxafrB.js.gz +0 -0
  347. package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.br +0 -0
  348. package/dist/client/assets/sizeCapture-INFHLROL-4MTh3tTt.js.gz +0 -0
  349. package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.br +0 -0
  350. package/dist/client/assets/stateDiagram-D77RDMKH-CgYgneIv.js.gz +0 -0
  351. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CvPf0fxf.js +0 -1
  352. package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.br +0 -0
  353. package/dist/client/assets/swimlanes-42K2YHIH-OWA9HFVf.js.gz +0 -0
  354. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CZ_OauyW.js +0 -8
  355. package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.br +0 -0
  356. package/dist/client/assets/timeline-definition-24CTP7MA-BAzx5DyO.js.gz +0 -0
  357. package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.br +0 -0
  358. package/dist/client/assets/vennDiagram-4TSXK5OY-CBZ-PhTQ.js.gz +0 -0
  359. package/dist/client/assets/videoCompression-BCnqCkRK.js.br +0 -0
  360. package/dist/client/assets/videoCompression-BCnqCkRK.js.gz +0 -0
  361. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.br +0 -0
  362. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DbWzC6l5.js.gz +0 -0
  363. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.br +0 -0
  364. package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmApnTWE.js.gz +0 -0
@@ -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
+ [![npm](https://img.shields.io/npm/v/termdock)](https://www.npmjs.com/package/termdock)
10
+ [![Downloads](https://img.shields.io/npm/dm/termdock)](https://www.npmjs.com/package/termdock)
11
+ [![macOS Download](https://img.shields.io/github/v/release/Jovines/termdock?label=macOS)](https://github.com/Jovines/termdock/releases)
12
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green)](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>