termdock 1.4.356 → 1.4.358

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 (490) hide show
  1. package/README.md +22 -4
  2. package/dist/client/assets/AndroidMirrorView-COoPljXi.js +3 -0
  3. package/dist/client/assets/AndroidMirrorView-COoPljXi.js.br +0 -0
  4. package/dist/client/assets/AndroidMirrorView-COoPljXi.js.gz +0 -0
  5. package/dist/client/assets/App-7BA7Jt-V.js +178 -0
  6. package/dist/client/assets/App-7BA7Jt-V.js.br +0 -0
  7. package/dist/client/assets/App-7BA7Jt-V.js.gz +0 -0
  8. package/dist/client/assets/ArchitecturePanel-B51eVL3I.js +9 -0
  9. package/dist/client/assets/ArchitecturePanel-B51eVL3I.js.br +0 -0
  10. package/dist/client/assets/ArchitecturePanel-B51eVL3I.js.gz +0 -0
  11. package/dist/client/assets/{ChangeWalkthroughPanel-DO_zJfZr.js → ChangeWalkthroughPanel-ZGMybE0m.js} +2 -2
  12. package/dist/client/assets/ChangeWalkthroughPanel-ZGMybE0m.js.br +0 -0
  13. package/dist/client/assets/ChangeWalkthroughPanel-ZGMybE0m.js.gz +0 -0
  14. package/dist/client/assets/{ChatRichContent-Cu1E1cJ8.js → ChatRichContent-KkN7aIGv.js} +29 -29
  15. package/dist/client/assets/ChatRichContent-KkN7aIGv.js.br +0 -0
  16. package/dist/client/assets/ChatRichContent-KkN7aIGv.js.gz +0 -0
  17. package/dist/client/assets/CollaborationMainWorkspace-BVeBgGMT.js +1 -0
  18. package/dist/client/assets/CollaborationMainWorkspace-BVeBgGMT.js.br +0 -0
  19. package/dist/client/assets/CollaborationMainWorkspace-BVeBgGMT.js.gz +0 -0
  20. package/dist/client/assets/CollaborationTaskContent-C3Od6xQy.js +1 -0
  21. package/dist/client/assets/ComputerControlView-CnaeZBuh.js +6 -0
  22. package/dist/client/assets/ComputerControlView-CnaeZBuh.js.br +0 -0
  23. package/dist/client/assets/ComputerControlView-CnaeZBuh.js.gz +0 -0
  24. package/dist/client/assets/{DagPlayground-CPYwfryM.js → DagPlayground-E7wKGgTF.js} +1 -1
  25. package/dist/client/assets/DagPlayground-E7wKGgTF.js.br +0 -0
  26. package/dist/client/assets/DagPlayground-E7wKGgTF.js.gz +0 -0
  27. package/dist/client/assets/{DiffLab-ptw96Q_4.js → DiffLab-BMXY4mRl.js} +1 -1
  28. package/dist/client/assets/DiffLab-BMXY4mRl.js.br +0 -0
  29. package/dist/client/assets/DiffLab-BMXY4mRl.js.gz +0 -0
  30. package/dist/client/assets/DiffReview-DHi_V-SX.js +1 -0
  31. package/dist/client/assets/DiffReview-DHi_V-SX.js.br +0 -0
  32. package/dist/client/assets/DiffReview-DHi_V-SX.js.gz +0 -0
  33. package/dist/client/assets/{DiffReviewLab-eEi3y-0G.js → DiffReviewLab-nhoosNZM.js} +1 -1
  34. package/dist/client/assets/DiffReviewLab-nhoosNZM.js.br +0 -0
  35. package/dist/client/assets/DiffReviewLab-nhoosNZM.js.gz +0 -0
  36. package/dist/client/assets/{DiffViewer-DqcQxp4Q.js → DiffViewer-CyDc8WOB.js} +1 -1
  37. package/dist/client/assets/DiffViewer-CyDc8WOB.js.br +0 -0
  38. package/dist/client/assets/DiffViewer-CyDc8WOB.js.gz +0 -0
  39. package/dist/client/assets/{GitLoadingSkeleton-DYrDIDF1.js → GitLoadingSkeleton-RRbTeMuA.js} +1 -1
  40. package/dist/client/assets/GitLoadingSkeleton-RRbTeMuA.js.br +0 -0
  41. package/dist/client/assets/GitLoadingSkeleton-RRbTeMuA.js.gz +0 -0
  42. package/dist/client/assets/Markdown-DKQhs57e.css +1 -0
  43. package/dist/client/assets/Markdown-DKQhs57e.css.br +0 -0
  44. package/dist/client/assets/Markdown-DKQhs57e.css.gz +0 -0
  45. package/dist/client/assets/Markdown-Ip0FYCJ1.js +23 -0
  46. package/dist/client/assets/Markdown-Ip0FYCJ1.js.br +0 -0
  47. package/dist/client/assets/Markdown-Ip0FYCJ1.js.gz +0 -0
  48. package/dist/client/assets/{ModelPreview-DjtHLlqP.js → ModelPreview-DuwBl4st.js} +3 -3
  49. package/dist/client/assets/ModelPreview-DuwBl4st.js.br +0 -0
  50. package/dist/client/assets/ModelPreview-DuwBl4st.js.gz +0 -0
  51. package/dist/client/assets/RecordingSaveDialog-Czkjuaeu.js +1 -0
  52. package/dist/client/assets/RecordingSaveDialog-Czkjuaeu.js.br +0 -0
  53. package/dist/client/assets/RecordingSaveDialog-Czkjuaeu.js.gz +0 -0
  54. package/dist/client/assets/RightSidebar-BvYh2_n2.js +1662 -0
  55. package/dist/client/assets/RightSidebar-BvYh2_n2.js.br +0 -0
  56. package/dist/client/assets/RightSidebar-BvYh2_n2.js.gz +0 -0
  57. package/dist/client/assets/SessionChatView-hFOVLdHC.js +13 -0
  58. package/dist/client/assets/SessionChatView-hFOVLdHC.js.br +0 -0
  59. package/dist/client/assets/SessionChatView-hFOVLdHC.js.gz +0 -0
  60. package/dist/client/assets/SessionResourceSidebar-D-VXNdmE.js +2 -0
  61. package/dist/client/assets/SessionResourceSidebar-D-VXNdmE.js.br +0 -0
  62. package/dist/client/assets/SessionResourceSidebar-D-VXNdmE.js.gz +0 -0
  63. package/dist/client/assets/TodoWorkspace-CCL-wZTu.js +1 -0
  64. package/dist/client/assets/TodoWorkspace-CCL-wZTu.js.br +0 -0
  65. package/dist/client/assets/TodoWorkspace-CCL-wZTu.js.gz +0 -0
  66. package/dist/client/assets/{abnfDiagram-VCTEODGH-Cvf_KWZ0.js → abnfDiagram-VCTEODGH-CdEUK_s_.js} +1 -1
  67. package/dist/client/assets/abnfDiagram-VCTEODGH-CdEUK_s_.js.br +0 -0
  68. package/dist/client/assets/abnfDiagram-VCTEODGH-CdEUK_s_.js.gz +0 -0
  69. package/dist/client/assets/app-DZ6mCJiW.js +37 -0
  70. package/dist/client/assets/app-DZ6mCJiW.js.br +0 -0
  71. package/dist/client/assets/app-DZ6mCJiW.js.gz +0 -0
  72. package/dist/client/assets/{arc-UvdowQOf.js → arc-Dmbeqzc-.js} +1 -1
  73. package/dist/client/assets/arc-Dmbeqzc-.js.br +0 -0
  74. package/dist/client/assets/arc-Dmbeqzc-.js.gz +0 -0
  75. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DotsbCCA.js → architectureDiagram-5GKGNRK7-CZcdXQrP.js} +1 -1
  76. package/dist/client/assets/architectureDiagram-5GKGNRK7-CZcdXQrP.js.br +0 -0
  77. package/dist/client/assets/{architectureDiagram-5GKGNRK7-DotsbCCA.js.gz → architectureDiagram-5GKGNRK7-CZcdXQrP.js.gz} +0 -0
  78. package/dist/client/assets/{arrow-down-FGzRy9D-.js → arrow-down-Ty3zwcgl.js} +1 -1
  79. package/dist/client/assets/{blockDiagram-I7D4REHJ-CoOfSG4k.js → blockDiagram-I7D4REHJ-D9jFhXcb.js} +1 -1
  80. package/dist/client/assets/blockDiagram-I7D4REHJ-D9jFhXcb.js.br +0 -0
  81. package/dist/client/assets/blockDiagram-I7D4REHJ-D9jFhXcb.js.gz +0 -0
  82. package/dist/client/assets/{c4Diagram-7LVT6UL2-BAfjgs8B.js → c4Diagram-7LVT6UL2-c9o0rNTP.js} +1 -1
  83. package/dist/client/assets/c4Diagram-7LVT6UL2-c9o0rNTP.js.br +0 -0
  84. package/dist/client/assets/c4Diagram-7LVT6UL2-c9o0rNTP.js.gz +0 -0
  85. package/dist/client/assets/channel-BzD84hIE.js +1 -0
  86. package/dist/client/assets/{chevron-left-xqARwD-7.js → chevron-left-CVjGQZf0.js} +1 -1
  87. package/dist/client/assets/{chunk-2Q5K7J3B-DiiQ7BvG.js → chunk-2Q5K7J3B-Bl_5wWZ4.js} +1 -1
  88. package/dist/client/assets/{chunk-5VM5RSS4-CczSK8wW.js → chunk-5VM5RSS4-D9XQn27m.js} +1 -1
  89. package/dist/client/assets/{chunk-F27PBJKO-BI3Di4Ve.js → chunk-F27PBJKO-DWyskKWD.js} +1 -1
  90. package/dist/client/assets/chunk-F27PBJKO-DWyskKWD.js.br +0 -0
  91. package/dist/client/assets/chunk-F27PBJKO-DWyskKWD.js.gz +0 -0
  92. package/dist/client/assets/{chunk-IMKFNOWR-Cvvs1wmn.js → chunk-IMKFNOWR-DrWbExPc.js} +1 -1
  93. package/dist/client/assets/chunk-IMKFNOWR-DrWbExPc.js.br +0 -0
  94. package/dist/client/assets/chunk-IMKFNOWR-DrWbExPc.js.gz +0 -0
  95. package/dist/client/assets/{chunk-JWPE2WC7-lrJRD9WA.js → chunk-JWPE2WC7-B7O1zrh6.js} +1 -1
  96. package/dist/client/assets/{chunk-POPQ4Y6H-CnPC9D8B.js → chunk-POPQ4Y6H-D7TlizKK.js} +1 -1
  97. package/dist/client/assets/{chunk-SVP7TREG-BZfMhm64.js → chunk-SVP7TREG-DNK10F6v.js} +1 -1
  98. package/dist/client/assets/chunk-SVP7TREG-DNK10F6v.js.br +0 -0
  99. package/dist/client/assets/chunk-SVP7TREG-DNK10F6v.js.gz +0 -0
  100. package/dist/client/assets/{chunk-TICWLB2K-DmkEaRK3.js → chunk-TICWLB2K-zVD9YIYY.js} +1 -1
  101. package/dist/client/assets/chunk-TICWLB2K-zVD9YIYY.js.br +0 -0
  102. package/dist/client/assets/chunk-TICWLB2K-zVD9YIYY.js.gz +0 -0
  103. package/dist/client/assets/{chunk-XXDRQBXY-BP9Lccpe.js → chunk-XXDRQBXY-bRScHSGz.js} +1 -1
  104. package/dist/client/assets/{circle-DGZOpG8V.js → circle-BIJQEbCa.js} +1 -1
  105. package/dist/client/assets/classDiagram-ZZMXUADV-DNwfONVW.js +1 -0
  106. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DNwfONVW.js +1 -0
  107. package/dist/client/assets/{clipboard-rLx5CzbY.js → clipboard-DV8t7tww.js} +1 -1
  108. package/dist/client/assets/clipboardText-C4QKbGHg.css +1 -0
  109. package/dist/client/assets/clipboardText-C4QKbGHg.css.br +0 -0
  110. package/dist/client/assets/clipboardText-C4QKbGHg.css.gz +0 -0
  111. package/dist/client/assets/clipboardText-DoB9NjH8.js +1 -0
  112. package/dist/client/assets/clipboardText-DoB9NjH8.js.br +0 -0
  113. package/dist/client/assets/clipboardText-DoB9NjH8.js.gz +0 -0
  114. package/dist/client/assets/{cose-bilkent-JH36ORCC-0xPYMc2z.js → cose-bilkent-JH36ORCC-Bf6IObhf.js} +1 -1
  115. package/dist/client/assets/cose-bilkent-JH36ORCC-Bf6IObhf.js.br +0 -0
  116. package/dist/client/assets/cose-bilkent-JH36ORCC-Bf6IObhf.js.gz +0 -0
  117. package/dist/client/assets/{cynefin-OW5HDTMX-BQ7-lCHm.js → cynefin-OW5HDTMX-DAtjde93.js} +1 -1
  118. package/dist/client/assets/cynefin-OW5HDTMX-DAtjde93.js.br +0 -0
  119. package/dist/client/assets/cynefin-OW5HDTMX-DAtjde93.js.gz +0 -0
  120. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CazHuSj1.js → cynefinDiagram-5FMLGOSQ-Bwoin99V.js} +1 -1
  121. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Bwoin99V.js.br +0 -0
  122. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Bwoin99V.js.gz +0 -0
  123. package/dist/client/assets/{dagre-GXQ25YYZ-CJNgsyHQ.js → dagre-GXQ25YYZ-dxPzSob9.js} +1 -1
  124. package/dist/client/assets/dagre-GXQ25YYZ-dxPzSob9.js.br +0 -0
  125. package/dist/client/assets/dagre-GXQ25YYZ-dxPzSob9.js.gz +0 -0
  126. package/dist/client/assets/{diagram-S7CK7UJ4-D4xXIj1P.js → diagram-S7CK7UJ4-BXdiLivz.js} +1 -1
  127. package/dist/client/assets/diagram-S7CK7UJ4-BXdiLivz.js.br +0 -0
  128. package/dist/client/assets/diagram-S7CK7UJ4-BXdiLivz.js.gz +0 -0
  129. package/dist/client/assets/{diagram-UQ7AKVKN-BWhpL-35.js → diagram-UQ7AKVKN-DXveP3fg.js} +1 -1
  130. package/dist/client/assets/diagram-UQ7AKVKN-DXveP3fg.js.br +0 -0
  131. package/dist/client/assets/diagram-UQ7AKVKN-DXveP3fg.js.gz +0 -0
  132. package/dist/client/assets/{diagram-VSXAHHWV-DG9A7EgJ.js → diagram-VSXAHHWV-BAZtoQue.js} +1 -1
  133. package/dist/client/assets/diagram-VSXAHHWV-BAZtoQue.js.br +0 -0
  134. package/dist/client/assets/diagram-VSXAHHWV-BAZtoQue.js.gz +0 -0
  135. package/dist/client/assets/{diagram-VX7I27RA-L5PSvynM.js → diagram-VX7I27RA-Bhc7cKpk.js} +1 -1
  136. package/dist/client/assets/diagram-VX7I27RA-Bhc7cKpk.js.br +0 -0
  137. package/dist/client/assets/diagram-VX7I27RA-Bhc7cKpk.js.gz +0 -0
  138. package/dist/client/assets/{diagram-Z3DM3KII-moBH7ruR.js → diagram-Z3DM3KII-DWIa_F-y.js} +1 -1
  139. package/dist/client/assets/diagram-Z3DM3KII-DWIa_F-y.js.br +0 -0
  140. package/dist/client/assets/diagram-Z3DM3KII-DWIa_F-y.js.gz +0 -0
  141. package/dist/client/assets/{ebnfDiagram-PWID7BFC-DEiGgcRP.js → ebnfDiagram-PWID7BFC-B3LDILSm.js} +1 -1
  142. package/dist/client/assets/ebnfDiagram-PWID7BFC-B3LDILSm.js.br +0 -0
  143. package/dist/client/assets/ebnfDiagram-PWID7BFC-B3LDILSm.js.gz +0 -0
  144. package/dist/client/assets/{erDiagram-RLTQ6QDP-BboIleYi.js → erDiagram-RLTQ6QDP-Cfu95bMX.js} +1 -1
  145. package/dist/client/assets/erDiagram-RLTQ6QDP-Cfu95bMX.js.br +0 -0
  146. package/dist/client/assets/erDiagram-RLTQ6QDP-Cfu95bMX.js.gz +0 -0
  147. package/dist/client/assets/{external-link-AZ3wjUg5.js → external-link-DodqgrCc.js} +1 -1
  148. package/dist/client/assets/{flowDiagram-HODETNUW-COxz7Rda.js → flowDiagram-HODETNUW-DVtO6aQE.js} +1 -1
  149. package/dist/client/assets/flowDiagram-HODETNUW-DVtO6aQE.js.br +0 -0
  150. package/dist/client/assets/flowDiagram-HODETNUW-DVtO6aQE.js.gz +0 -0
  151. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-_XdRvgyZ.js → ganttDiagram-EL5Y4UJY-Bh1TvYzb.js} +1 -1
  152. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bh1TvYzb.js.br +0 -0
  153. package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bh1TvYzb.js.gz +0 -0
  154. package/dist/client/assets/{git-compare-90v75Jal.js → git-compare-KkbucDhN.js} +1 -1
  155. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CBb9xBNW.js → gitGraphDiagram-WWUBYQGX-BKbRxPsF.js} +1 -1
  156. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BKbRxPsF.js.br +0 -0
  157. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BKbRxPsF.js.gz +0 -0
  158. package/dist/client/assets/index-DEAMSl55.css +1 -0
  159. package/dist/client/assets/index-DEAMSl55.css.br +0 -0
  160. package/dist/client/assets/index-DEAMSl55.css.gz +0 -0
  161. package/dist/client/assets/{infoDiagram-27XIBGKW-DjLdeNZi.js → infoDiagram-27XIBGKW-CLhO8B16.js} +1 -1
  162. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bcr-lhIE.js → ishikawaDiagram-5VMMS53U-BwchGTP9.js} +1 -1
  163. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BwchGTP9.js.br +0 -0
  164. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BwchGTP9.js.gz +0 -0
  165. package/dist/client/assets/{journeyDiagram-3NMN7TZE-3vK6s9Pq.js → journeyDiagram-3NMN7TZE-eWBpuyMm.js} +1 -1
  166. package/dist/client/assets/journeyDiagram-3NMN7TZE-eWBpuyMm.js.br +0 -0
  167. package/dist/client/assets/journeyDiagram-3NMN7TZE-eWBpuyMm.js.gz +0 -0
  168. package/dist/client/assets/{kanban-definition-UXKFOSKX-DqDYDca0.js → kanban-definition-UXKFOSKX-Sik-RHYc.js} +1 -1
  169. package/dist/client/assets/kanban-definition-UXKFOSKX-Sik-RHYc.js.br +0 -0
  170. package/dist/client/assets/kanban-definition-UXKFOSKX-Sik-RHYc.js.gz +0 -0
  171. package/dist/client/assets/{layout-C7_WwzCP.js → layout-BJX2CDWF.js} +1 -1
  172. package/dist/client/assets/layout-BJX2CDWF.js.br +0 -0
  173. package/dist/client/assets/layout-BJX2CDWF.js.gz +0 -0
  174. package/dist/client/assets/{linear-BQCRhl6P.js → linear-0FKHr918.js} +1 -1
  175. package/dist/client/assets/{linear-BQCRhl6P.js.br → linear-0FKHr918.js.br} +0 -0
  176. package/dist/client/assets/linear-0FKHr918.js.gz +0 -0
  177. package/dist/client/assets/{link-Cq14tNBm.js → link-DWUQqMDL.js} +3 -3
  178. package/dist/client/assets/link-DWUQqMDL.js.br +0 -0
  179. package/dist/client/assets/link-DWUQqMDL.js.gz +0 -0
  180. package/dist/client/assets/{list-tree-C281zrdg.js → list-tree-DxdLnXUB.js} +1 -1
  181. package/dist/client/assets/{maximize-2-CovPxWdw.js → maximize-2-Clx4ktqB.js} +1 -1
  182. package/dist/client/assets/{mermaid.core-DGsccxt-.js → mermaid.core-DWoaNsig.js} +5 -5
  183. package/dist/client/assets/mermaid.core-DWoaNsig.js.br +0 -0
  184. package/dist/client/assets/mermaid.core-DWoaNsig.js.gz +0 -0
  185. package/dist/client/assets/{mindmap-definition-YA3MSWOX-l0eF1PQE.js → mindmap-definition-YA3MSWOX-kFqW8-1C.js} +1 -1
  186. package/dist/client/assets/mindmap-definition-YA3MSWOX-kFqW8-1C.js.br +0 -0
  187. package/dist/client/assets/mindmap-definition-YA3MSWOX-kFqW8-1C.js.gz +0 -0
  188. package/dist/client/assets/{passwordBootstrap-B5VzheZz.js → passwordBootstrap-ZDVK8UPE.js} +1 -1
  189. package/dist/client/assets/passwordBootstrap-ZDVK8UPE.js.br +0 -0
  190. package/dist/client/assets/passwordBootstrap-ZDVK8UPE.js.gz +0 -0
  191. package/dist/client/assets/{pegDiagram-XKGWAZYB-fRrxGIDM.js → pegDiagram-XKGWAZYB-CndGmUtZ.js} +1 -1
  192. package/dist/client/assets/pegDiagram-XKGWAZYB-CndGmUtZ.js.br +0 -0
  193. package/dist/client/assets/pegDiagram-XKGWAZYB-CndGmUtZ.js.gz +0 -0
  194. package/dist/client/assets/{pieDiagram-E7YTZNPT-B-EBa3qN.js → pieDiagram-E7YTZNPT-Q550203T.js} +1 -1
  195. package/dist/client/assets/pieDiagram-E7YTZNPT-Q550203T.js.br +0 -0
  196. package/dist/client/assets/pieDiagram-E7YTZNPT-Q550203T.js.gz +0 -0
  197. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Dj4e6f4h.js → quadrantDiagram-AXDQQJYC-BrjlUGzZ.js} +1 -1
  198. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BrjlUGzZ.js.br +0 -0
  199. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BrjlUGzZ.js.gz +0 -0
  200. package/dist/client/assets/{quote-COQfrXhi.js → quote-B9G-yF_k.js} +1 -1
  201. package/dist/client/assets/{railroadDiagram-O6MQD6OU-CEMppxTC.js → railroadDiagram-O6MQD6OU-CSqOaX_w.js} +1 -1
  202. package/dist/client/assets/railroadDiagram-O6MQD6OU-CSqOaX_w.js.br +0 -0
  203. package/dist/client/assets/railroadDiagram-O6MQD6OU-CSqOaX_w.js.gz +0 -0
  204. package/dist/client/assets/rdpSession-DdqSmi-Z.js +1 -0
  205. package/dist/client/assets/rdpSession-DdqSmi-Z.js.br +0 -0
  206. package/dist/client/assets/rdpSession-DdqSmi-Z.js.gz +0 -0
  207. package/dist/client/assets/referenceSelection-0uCpJjt2.js +4 -0
  208. package/dist/client/assets/referenceSelection-0uCpJjt2.js.br +0 -0
  209. package/dist/client/assets/referenceSelection-0uCpJjt2.js.gz +0 -0
  210. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Dri1k4_x.js → requirementDiagram-BXWQKSXE-NGPth3Pf.js} +1 -1
  211. package/dist/client/assets/requirementDiagram-BXWQKSXE-NGPth3Pf.js.br +0 -0
  212. package/dist/client/assets/requirementDiagram-BXWQKSXE-NGPth3Pf.js.gz +0 -0
  213. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CMsL_tYL.js → sankeyDiagram-P5KCCOFB-CbxpJ6iI.js} +1 -1
  214. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CbxpJ6iI.js.br +0 -0
  215. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CbxpJ6iI.js.gz +0 -0
  216. package/dist/client/assets/{search-Dg6HWygj.js → search-DAQ_AOVP.js} +1 -1
  217. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-4_4hZtOd.js → sequenceDiagram-WJ2MYXX4-D3gJOK25.js} +1 -1
  218. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D3gJOK25.js.br +0 -0
  219. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D3gJOK25.js.gz +0 -0
  220. package/dist/client/assets/{sizeCapture-INFHLROL-3QA6qj2j.js → sizeCapture-INFHLROL-D4D1KI0n.js} +1 -1
  221. package/dist/client/assets/sizeCapture-INFHLROL-D4D1KI0n.js.br +0 -0
  222. package/dist/client/assets/sizeCapture-INFHLROL-D4D1KI0n.js.gz +0 -0
  223. package/dist/client/assets/{stateDiagram-D77RDMKH-90IFPhD9.js → stateDiagram-D77RDMKH-BjtgjBg5.js} +1 -1
  224. package/dist/client/assets/stateDiagram-D77RDMKH-BjtgjBg5.js.br +0 -0
  225. package/dist/client/assets/stateDiagram-D77RDMKH-BjtgjBg5.js.gz +0 -0
  226. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BkFsvhZ0.js +1 -0
  227. package/dist/client/assets/{sun-BAMMjiA8.js → sun-DvwMJkda.js} +1 -1
  228. package/dist/client/assets/{swimlanes-42K2YHIH-BuHieVWC.js → swimlanes-42K2YHIH-C17jwdFo.js} +1 -1
  229. package/dist/client/assets/swimlanes-42K2YHIH-C17jwdFo.js.br +0 -0
  230. package/dist/client/assets/swimlanes-42K2YHIH-C17jwdFo.js.gz +0 -0
  231. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Bcw2hbFj.js +8 -0
  232. package/dist/client/assets/swiper-BaumVgFd.js +1 -0
  233. package/dist/client/assets/swiper-BaumVgFd.js.br +0 -0
  234. package/dist/client/assets/swiper-BaumVgFd.js.gz +0 -0
  235. package/dist/client/assets/{terminal-Dea8wJF3.js → terminal-DaiFCKy_.js} +7 -7
  236. package/dist/client/assets/terminal-DaiFCKy_.js.br +0 -0
  237. package/dist/client/assets/terminal-DaiFCKy_.js.gz +0 -0
  238. package/dist/client/assets/{timeline-definition-24CTP7MA-C7FpaNwf.js → timeline-definition-24CTP7MA-CtdHmPoC.js} +1 -1
  239. package/dist/client/assets/timeline-definition-24CTP7MA-CtdHmPoC.js.br +0 -0
  240. package/dist/client/assets/timeline-definition-24CTP7MA-CtdHmPoC.js.gz +0 -0
  241. package/dist/client/assets/triangle-alert-D-tt7pA2.js +1 -0
  242. package/dist/client/assets/{unplug-DN2SNXUL.js → unplug-BQxOculv.js} +1 -1
  243. package/dist/client/assets/use-gesture-react.esm-CM42s15B.js +1 -0
  244. package/dist/client/assets/use-gesture-react.esm-CM42s15B.js.br +0 -0
  245. package/dist/client/assets/use-gesture-react.esm-CM42s15B.js.gz +0 -0
  246. package/dist/client/assets/{vennDiagram-4TSXK5OY-CxoHHVcs.js → vennDiagram-4TSXK5OY-DhwCFaVe.js} +1 -1
  247. package/dist/client/assets/vennDiagram-4TSXK5OY-DhwCFaVe.js.br +0 -0
  248. package/dist/client/assets/vennDiagram-4TSXK5OY-DhwCFaVe.js.gz +0 -0
  249. package/dist/client/assets/{videoCompression-rr2lu3uy.js → videoCompression-BFhMaMl7.js} +1 -1
  250. package/dist/client/assets/videoCompression-BFhMaMl7.js.br +0 -0
  251. package/dist/client/assets/videoCompression-BFhMaMl7.js.gz +0 -0
  252. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js → wardleyDiagram-VM6X3IG4-BP4Z-QQ4.js} +1 -1
  253. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BP4Z-QQ4.js.br +0 -0
  254. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BP4Z-QQ4.js.gz +0 -0
  255. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CghzsxQv.js → xychartDiagram-S5SC5T6Z-CEPWf1tk.js} +1 -1
  256. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CEPWf1tk.js.br +0 -0
  257. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CEPWf1tk.js.gz +0 -0
  258. package/dist/client/index.html +3 -3
  259. package/dist/client/index.html.br +0 -0
  260. package/dist/client/index.html.gz +0 -0
  261. package/dist/client/sw-encrypted-background.js +1 -1
  262. package/dist/client/sw-encrypted-background.js.br +0 -0
  263. package/dist/client/sw-encrypted-background.js.gz +0 -0
  264. package/dist/client/sw.js +1 -1
  265. package/dist/client/sw.js.br +0 -0
  266. package/dist/client/sw.js.gz +0 -0
  267. package/dist/server/agent/collaborationPeerTransport.js +14 -69
  268. package/dist/server/agent/collaborationStore.js +5 -0
  269. package/dist/server/agent/installers.js +89 -33
  270. package/dist/server/agent/integrationServer.js +31 -2
  271. package/dist/server/agent/pluginPackages.js +51 -22
  272. package/dist/server/agent/sessionChatRoutes.js +45 -7
  273. package/dist/server/agentHook.js +56 -12
  274. package/dist/server/android/adb.js +24 -31
  275. package/dist/server/cli.js +52 -110
  276. package/dist/server/entry.js +17 -23
  277. package/dist/server/federation/cli.js +13 -47
  278. package/dist/server/federation/connectionErrors.js +37 -0
  279. package/dist/server/federation/connectionModel.js +83 -0
  280. package/dist/server/federation/desktopTargets.js +35 -13
  281. package/dist/server/federation/directRoutes.js +28 -36
  282. package/dist/server/federation/directTargetRegistry.js +106 -0
  283. package/dist/server/federation/httpUploadLimit.js +8 -0
  284. package/dist/server/federation/relay.js +13 -6
  285. package/dist/server/federation/relayTransport.js +147 -0
  286. package/dist/server/federation/routeAccess.js +5 -3
  287. package/dist/server/federation/runtime.js +4 -2
  288. package/dist/server/federation/selfRelay.js +10 -59
  289. package/dist/server/federation/serviceTransport.js +123 -0
  290. package/dist/server/federation/streamLimits.js +3 -0
  291. package/dist/server/federation/trustedCa.js +61 -0
  292. package/dist/server/routes/android.js +5 -7
  293. package/dist/server/routes/terminal.js +149 -111
  294. package/dist/server/shared/androidDevices.js +64 -0
  295. package/dist/server/shared/programStatus.js +174 -0
  296. package/dist/server/shared/shareResources.js +3 -2
  297. package/dist/server/todos/routes.js +36 -0
  298. package/dist/server/todos/store.js +31 -1
  299. package/dist/server/utils/bootCheck.js +41 -271
  300. package/dist/server/utils/localHttpsSetup.js +257 -0
  301. package/dist/server/utils/oscBuffer.js +9 -0
  302. package/dist/server/utils/sessionDisplayName.js +11 -9
  303. package/dist/server/utils/settings.js +6 -3
  304. package/dist/server/utils/tmuxDisplayGeometry.js +54 -0
  305. package/dist/server/utils/tmuxObserverSize.js +26 -0
  306. package/docs/integrations.md +2 -1
  307. package/package.json +6 -1
  308. package/runtime-manifest.json +3 -3
  309. package/scripts/install-utils.cjs +81 -0
  310. package/scripts/postinstall.mjs +19 -106
  311. package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js +0 -3
  312. package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.br +0 -0
  313. package/dist/client/assets/AndroidMirrorView-DW9oRr0w.js.gz +0 -0
  314. package/dist/client/assets/App-DEZ2i9ZZ.js +0 -178
  315. package/dist/client/assets/App-DEZ2i9ZZ.js.br +0 -0
  316. package/dist/client/assets/App-DEZ2i9ZZ.js.gz +0 -0
  317. package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js +0 -9
  318. package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.br +0 -0
  319. package/dist/client/assets/ArchitecturePanel-Bf4b-6An.js.gz +0 -0
  320. package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.br +0 -0
  321. package/dist/client/assets/ChangeWalkthroughPanel-DO_zJfZr.js.gz +0 -0
  322. package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.br +0 -0
  323. package/dist/client/assets/ChatRichContent-Cu1E1cJ8.js.gz +0 -0
  324. package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js +0 -1
  325. package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.br +0 -0
  326. package/dist/client/assets/CollaborationMainWorkspace-BhmpSEbf.js.gz +0 -0
  327. package/dist/client/assets/CollaborationTaskContent-CX0Aqdi2.js +0 -2
  328. package/dist/client/assets/ComputerControlView-DjQLzn10.js +0 -6
  329. package/dist/client/assets/ComputerControlView-DjQLzn10.js.br +0 -0
  330. package/dist/client/assets/ComputerControlView-DjQLzn10.js.gz +0 -0
  331. package/dist/client/assets/DagPlayground-CPYwfryM.js.br +0 -0
  332. package/dist/client/assets/DagPlayground-CPYwfryM.js.gz +0 -0
  333. package/dist/client/assets/DiffLab-ptw96Q_4.js.br +0 -0
  334. package/dist/client/assets/DiffLab-ptw96Q_4.js.gz +0 -0
  335. package/dist/client/assets/DiffReview-12E2zWyL.js +0 -1
  336. package/dist/client/assets/DiffReview-12E2zWyL.js.br +0 -0
  337. package/dist/client/assets/DiffReview-12E2zWyL.js.gz +0 -0
  338. package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.br +0 -0
  339. package/dist/client/assets/DiffReviewLab-eEi3y-0G.js.gz +0 -0
  340. package/dist/client/assets/DiffViewer-DqcQxp4Q.js.br +0 -0
  341. package/dist/client/assets/DiffViewer-DqcQxp4Q.js.gz +0 -0
  342. package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.br +0 -0
  343. package/dist/client/assets/GitLoadingSkeleton-DYrDIDF1.js.gz +0 -0
  344. package/dist/client/assets/MarkdownPreview-CsJGsDRL.js +0 -19
  345. package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.br +0 -0
  346. package/dist/client/assets/MarkdownPreview-CsJGsDRL.js.gz +0 -0
  347. package/dist/client/assets/ModelPreview-DjtHLlqP.js.br +0 -0
  348. package/dist/client/assets/ModelPreview-DjtHLlqP.js.gz +0 -0
  349. package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js +0 -1
  350. package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.br +0 -0
  351. package/dist/client/assets/RecordingSaveDialog-DUtwgIME.js.gz +0 -0
  352. package/dist/client/assets/RightSidebar-BltjUFwI.js +0 -1662
  353. package/dist/client/assets/RightSidebar-BltjUFwI.js.br +0 -0
  354. package/dist/client/assets/RightSidebar-BltjUFwI.js.gz +0 -0
  355. package/dist/client/assets/SessionChatView-CdKfHRp8.js +0 -13
  356. package/dist/client/assets/SessionChatView-CdKfHRp8.js.br +0 -0
  357. package/dist/client/assets/SessionChatView-CdKfHRp8.js.gz +0 -0
  358. package/dist/client/assets/SessionChatView-D8GoESjb.css +0 -1
  359. package/dist/client/assets/SessionChatView-D8GoESjb.css.br +0 -0
  360. package/dist/client/assets/SessionChatView-D8GoESjb.css.gz +0 -0
  361. package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js +0 -2
  362. package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.br +0 -0
  363. package/dist/client/assets/SessionResourceSidebar-DmQOydhf.js.gz +0 -0
  364. package/dist/client/assets/TodoWorkspace-Bh1C035B.js +0 -1
  365. package/dist/client/assets/TodoWorkspace-Bh1C035B.js.br +0 -0
  366. package/dist/client/assets/TodoWorkspace-Bh1C035B.js.gz +0 -0
  367. package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.br +0 -0
  368. package/dist/client/assets/abnfDiagram-VCTEODGH-Cvf_KWZ0.js.gz +0 -0
  369. package/dist/client/assets/app-DuUnqxq-.js +0 -37
  370. package/dist/client/assets/app-DuUnqxq-.js.br +0 -0
  371. package/dist/client/assets/app-DuUnqxq-.js.gz +0 -0
  372. package/dist/client/assets/arc-UvdowQOf.js.br +0 -0
  373. package/dist/client/assets/arc-UvdowQOf.js.gz +0 -0
  374. package/dist/client/assets/architectureDiagram-5GKGNRK7-DotsbCCA.js.br +0 -0
  375. package/dist/client/assets/arrow-up-DNkfesW0.js +0 -1
  376. package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.br +0 -0
  377. package/dist/client/assets/blockDiagram-I7D4REHJ-CoOfSG4k.js.gz +0 -0
  378. package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.br +0 -0
  379. package/dist/client/assets/c4Diagram-7LVT6UL2-BAfjgs8B.js.gz +0 -0
  380. package/dist/client/assets/channel-BzMU9Wks.js +0 -1
  381. package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.br +0 -0
  382. package/dist/client/assets/chunk-F27PBJKO-BI3Di4Ve.js.gz +0 -0
  383. package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.br +0 -0
  384. package/dist/client/assets/chunk-IMKFNOWR-Cvvs1wmn.js.gz +0 -0
  385. package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.br +0 -0
  386. package/dist/client/assets/chunk-SVP7TREG-BZfMhm64.js.gz +0 -0
  387. package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.br +0 -0
  388. package/dist/client/assets/chunk-TICWLB2K-DmkEaRK3.js.gz +0 -0
  389. package/dist/client/assets/classDiagram-ZZMXUADV-DtAtEoWU.js +0 -1
  390. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DtAtEoWU.js +0 -1
  391. package/dist/client/assets/clipboardText-cZXParp1.js +0 -1
  392. package/dist/client/assets/clipboardText-cZXParp1.js.br +0 -0
  393. package/dist/client/assets/clipboardText-cZXParp1.js.gz +0 -0
  394. package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.br +0 -0
  395. package/dist/client/assets/cose-bilkent-JH36ORCC-0xPYMc2z.js.gz +0 -0
  396. package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.br +0 -0
  397. package/dist/client/assets/cynefin-OW5HDTMX-BQ7-lCHm.js.gz +0 -0
  398. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.br +0 -0
  399. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CazHuSj1.js.gz +0 -0
  400. package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.br +0 -0
  401. package/dist/client/assets/dagre-GXQ25YYZ-CJNgsyHQ.js.gz +0 -0
  402. package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.br +0 -0
  403. package/dist/client/assets/diagram-S7CK7UJ4-D4xXIj1P.js.gz +0 -0
  404. package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.br +0 -0
  405. package/dist/client/assets/diagram-UQ7AKVKN-BWhpL-35.js.gz +0 -0
  406. package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.br +0 -0
  407. package/dist/client/assets/diagram-VSXAHHWV-DG9A7EgJ.js.gz +0 -0
  408. package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.br +0 -0
  409. package/dist/client/assets/diagram-VX7I27RA-L5PSvynM.js.gz +0 -0
  410. package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.br +0 -0
  411. package/dist/client/assets/diagram-Z3DM3KII-moBH7ruR.js.gz +0 -0
  412. package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.br +0 -0
  413. package/dist/client/assets/ebnfDiagram-PWID7BFC-DEiGgcRP.js.gz +0 -0
  414. package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.br +0 -0
  415. package/dist/client/assets/erDiagram-RLTQ6QDP-BboIleYi.js.gz +0 -0
  416. package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.br +0 -0
  417. package/dist/client/assets/flowDiagram-HODETNUW-COxz7Rda.js.gz +0 -0
  418. package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.br +0 -0
  419. package/dist/client/assets/ganttDiagram-EL5Y4UJY-_XdRvgyZ.js.gz +0 -0
  420. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.br +0 -0
  421. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CBb9xBNW.js.gz +0 -0
  422. package/dist/client/assets/index-nIgxJ6I3.css +0 -1
  423. package/dist/client/assets/index-nIgxJ6I3.css.br +0 -0
  424. package/dist/client/assets/index-nIgxJ6I3.css.gz +0 -0
  425. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.br +0 -0
  426. package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bcr-lhIE.js.gz +0 -0
  427. package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.br +0 -0
  428. package/dist/client/assets/journeyDiagram-3NMN7TZE-3vK6s9Pq.js.gz +0 -0
  429. package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.br +0 -0
  430. package/dist/client/assets/kanban-definition-UXKFOSKX-DqDYDca0.js.gz +0 -0
  431. package/dist/client/assets/layout-C7_WwzCP.js.br +0 -0
  432. package/dist/client/assets/layout-C7_WwzCP.js.gz +0 -0
  433. package/dist/client/assets/linear-BQCRhl6P.js.gz +0 -0
  434. package/dist/client/assets/link-Cq14tNBm.js.br +0 -0
  435. package/dist/client/assets/link-Cq14tNBm.js.gz +0 -0
  436. package/dist/client/assets/loader-circle-Df0zpx5N.js +0 -1
  437. package/dist/client/assets/mermaid.core-DGsccxt-.js.br +0 -0
  438. package/dist/client/assets/mermaid.core-DGsccxt-.js.gz +0 -0
  439. package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.br +0 -0
  440. package/dist/client/assets/mindmap-definition-YA3MSWOX-l0eF1PQE.js.gz +0 -0
  441. package/dist/client/assets/passwordBootstrap-B5VzheZz.js.br +0 -0
  442. package/dist/client/assets/passwordBootstrap-B5VzheZz.js.gz +0 -0
  443. package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.br +0 -0
  444. package/dist/client/assets/pegDiagram-XKGWAZYB-fRrxGIDM.js.gz +0 -0
  445. package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.br +0 -0
  446. package/dist/client/assets/pieDiagram-E7YTZNPT-B-EBa3qN.js.gz +0 -0
  447. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.br +0 -0
  448. package/dist/client/assets/quadrantDiagram-AXDQQJYC-Dj4e6f4h.js.gz +0 -0
  449. package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.br +0 -0
  450. package/dist/client/assets/railroadDiagram-O6MQD6OU-CEMppxTC.js.gz +0 -0
  451. package/dist/client/assets/rdpSession-C5rS-ImV.js +0 -1
  452. package/dist/client/assets/rdpSession-C5rS-ImV.js.br +0 -0
  453. package/dist/client/assets/rdpSession-C5rS-ImV.js.gz +0 -0
  454. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.br +0 -0
  455. package/dist/client/assets/requirementDiagram-BXWQKSXE-Dri1k4_x.js.gz +0 -0
  456. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.br +0 -0
  457. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CMsL_tYL.js.gz +0 -0
  458. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.br +0 -0
  459. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-4_4hZtOd.js.gz +0 -0
  460. package/dist/client/assets/settings-2-iGqzPez0.js +0 -1
  461. package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.br +0 -0
  462. package/dist/client/assets/sizeCapture-INFHLROL-3QA6qj2j.js.gz +0 -0
  463. package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.br +0 -0
  464. package/dist/client/assets/stateDiagram-D77RDMKH-90IFPhD9.js.gz +0 -0
  465. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CH-yvmL4.js +0 -1
  466. package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.br +0 -0
  467. package/dist/client/assets/swimlanes-42K2YHIH-BuHieVWC.js.gz +0 -0
  468. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-P_rDqbtg.js +0 -8
  469. package/dist/client/assets/swiper-DJjq1TYT.js +0 -1
  470. package/dist/client/assets/swiper-DJjq1TYT.js.br +0 -0
  471. package/dist/client/assets/swiper-DJjq1TYT.js.gz +0 -0
  472. package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js +0 -4
  473. package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.br +0 -0
  474. package/dist/client/assets/syntaxHighlight-Cz6TPDW9.js.gz +0 -0
  475. package/dist/client/assets/terminal-Dea8wJF3.js.br +0 -0
  476. package/dist/client/assets/terminal-Dea8wJF3.js.gz +0 -0
  477. package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.br +0 -0
  478. package/dist/client/assets/timeline-definition-24CTP7MA-C7FpaNwf.js.gz +0 -0
  479. package/dist/client/assets/triangle-alert-Oj-OsZDw.js +0 -1
  480. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js +0 -1
  481. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.br +0 -0
  482. package/dist/client/assets/use-gesture-react.esm-DYpdiE_k.js.gz +0 -0
  483. package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.br +0 -0
  484. package/dist/client/assets/vennDiagram-4TSXK5OY-CxoHHVcs.js.gz +0 -0
  485. package/dist/client/assets/videoCompression-rr2lu3uy.js.br +0 -0
  486. package/dist/client/assets/videoCompression-rr2lu3uy.js.gz +0 -0
  487. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.br +0 -0
  488. package/dist/client/assets/wardleyDiagram-VM6X3IG4-B4Hsh-Ad.js.gz +0 -0
  489. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.br +0 -0
  490. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CghzsxQv.js.gz +0 -0
@@ -23,15 +23,53 @@ export function sessionChatRoutes(options) {
23
23
  return;
24
24
  }
25
25
  const group = options.store.list().find(g => g.name === ctx.groupName && !g.federated && g.sessionIds.length === 1 && g.sessionIds[0] === ctx.session.sessionId);
26
- const canSeeRequest = (message) => message?.integrationOrigin?.source === 'session-chat';
27
- const messages = group ? options.store.listMessages(group.id, 500).filter(message => {
28
- if (canSeeRequest(message))
26
+ const paged = req.query.limit !== undefined;
27
+ const limit = paged ? Number(req.query.limit) : 500;
28
+ const before = req.query.before, after = req.query.after, requestId = req.query.requestId;
29
+ if (paged && (typeof req.query.limit !== 'string' || !/^\d{1,2}$/.test(req.query.limit) || limit < 1 || limit > 60
30
+ || before !== undefined && (typeof before !== 'string' || before.length > 128)
31
+ || after !== undefined && (typeof after !== 'string' || after.length > 128)
32
+ || before !== undefined && after !== undefined
33
+ || requestId !== undefined && (typeof requestId !== 'string' || !/^[a-zA-Z0-9_-]{16,100}$/.test(requestId)))) {
34
+ res.status(400).json({ error: '对话分页参数无效' });
35
+ return;
36
+ }
37
+ const history = group ? options.store.listGroupMessages(group.id) : [];
38
+ const originals = new Map(history.map(message => [message.id, message]));
39
+ const visible = history.filter(message => {
40
+ if (message.integrationOrigin?.source === 'session-chat')
29
41
  return true;
30
- const original = message.toPrincipalId && message.replyTo ? options.store.getMessage(message.replyTo) : null;
31
- return original?.groupId === group.id && message.toPrincipalId === original.integrationOrigin?.integrationId && canSeeRequest(original);
32
- }).map(m => ({ id: m.id, role: m.toPrincipalId ? 'assistant' : 'user', ...(m.toPrincipalId ? chatPresentation(m.content, m.metadata) : { content: m.content }), ...(m.uiState ? { uiState: m.uiState } : {}), createdAt: m.createdAt, status: m.status === 'read' ? 'delivered' : m.status, replyTo: m.replyTo, requestId: m.idempotencyKey, responseKind: m.responseKind })) : [];
42
+ const original = message.toPrincipalId && message.replyTo ? originals.get(message.replyTo) : null;
43
+ return original?.groupId === group?.id && message.toPrincipalId === original?.integrationOrigin?.integrationId && original?.integrationOrigin?.source === 'session-chat';
44
+ });
45
+ const cursor = before ?? after;
46
+ const anchor = cursor === undefined ? -1 : visible.findIndex(message => message.id === cursor);
47
+ if (paged && cursor !== undefined && anchor < 0) {
48
+ res.status(404).json({ error: '这段对话已不可用,请返回最新消息', code: 'CHAT_CURSOR_UNAVAILABLE' });
49
+ return;
50
+ }
51
+ const end = !paged || cursor === undefined ? visible.length : before !== undefined ? anchor : Math.min(visible.length, anchor + 1 + limit);
52
+ const start = paged && after !== undefined ? anchor + 1 : Math.max(0, end - limit);
53
+ const project = (m) => ({ id: m.id, role: m.toPrincipalId ? 'assistant' : 'user', ...(m.toPrincipalId ? chatPresentation(m.content, m.metadata) : { content: m.content }), ...(m.uiState ? { uiState: m.uiState } : {}), createdAt: m.createdAt, status: m.status === 'read' ? 'delivered' : m.status, replyTo: m.replyTo, requestId: m.idempotencyKey, responseKind: m.responseKind, ...(paged ? { sequence: m.sequence } : {}) });
54
+ const messages = visible.slice(start, end).map(project);
55
+ // Refresh only the small tail already displayed, including delivery and
56
+ // form revisions, while fetching subsequent replies contiguously.
57
+ const updates = paged && after !== undefined ? visible.slice(Math.max(0, anchor + 1 - limit), anchor + 1).map(project) : undefined;
58
+ const page = paged ? { hasOlder: start > 0, hasNewer: end < visible.length, mode: before !== undefined ? 'before' : after !== undefined ? 'after' : 'latest' } : undefined;
59
+ let lastRequest;
60
+ for (let index = visible.length - 1; index >= 0; index--)
61
+ if (!visible[index].toPrincipalId) {
62
+ lastRequest = visible[index];
63
+ break;
64
+ }
65
+ const replyPending = !!lastRequest && !['failed', 'expired'].includes(lastRequest.status) && !visible.some(message => message.toPrincipalId && message.replyTo === lastRequest.id && !['ack', 'progress'].includes(message.responseKind || ''));
66
+ const confirmedRequestId = paged && typeof requestId === 'string' && visible.some(message => !message.toPrincipalId && message.idempotencyKey === requestId) ? requestId : undefined;
67
+ const payload = { messages, ...(updates ? { updates } : {}), ...(page ? { page, replyPending, ...(confirmedRequestId ? { confirmedRequestId } : {}) } : {}), agentAvailable: !!ctx.session.agent, agent: ctx.session.agent ? { slug: ctx.session.agent.slug, displayName: ctx.session.agent.displayName || ctx.session.agent.slug } : null };
68
+ const revision = createHash('sha256').update(JSON.stringify(payload)).digest('base64url');
33
69
  res.setHeader('Cache-Control', 'no-store');
34
- res.json({ messages, agentAvailable: !!ctx.session.agent, agent: ctx.session.agent ? { slug: ctx.session.agent.slug, displayName: ctx.session.agent.displayName || ctx.session.agent.slug } : null });
70
+ // A JSON acknowledgement works inside the encrypted transport and keeps
71
+ // older clients compatible; no HTTP cache contains conversation bodies.
72
+ res.json(req.query.revision === revision ? { unchanged: true, revision } : { ...payload, revision });
35
73
  });
36
74
  router.put('/:sessionId/chat/:messageId/state', (req, res) => {
37
75
  const ctx = context(req), body = req.body;
@@ -48,6 +48,19 @@ const MAX_STDIN = 64 * 1024;
48
48
  * asking the user a question) survives there.
49
49
  */
50
50
  function effectiveEvent(agent, event, stdinJson) {
51
+ // These tools ask a question without opening a permission dialog. Ordinary
52
+ // tool starts must stay silent so they cannot manufacture a waiting state.
53
+ if (event === 'tool-start') {
54
+ try {
55
+ const tool = JSON.parse(stdinJson)?.tool_name;
56
+ return (agent === 'claude' && tool === 'AskUserQuestion')
57
+ || (agent === 'codex' && tool === 'request_user_input')
58
+ ? 'question-asked' : null;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
51
64
  if ((agent === 'copilot' || agent === 'grok') && event === 'notification') {
52
65
  const blocks = stdinJson.includes('elicitation_dialog')
53
66
  || (agent === 'copilot' && stdinJson.includes('permission_prompt'));
@@ -56,11 +69,29 @@ function effectiveEvent(agent, event, stdinJson) {
56
69
  return event;
57
70
  }
58
71
  /** Write raw bytes to a tty device, best-effort. */
59
- function writeDev(path, bytes) {
72
+ async function writeDev(path, bytes) {
60
73
  try {
61
- const fd = fs.openSync(path, 'w');
74
+ // A leftover tmux client may no longer drain its PTY. It must not block
75
+ // this hook before the current observer gets its copy of the event.
76
+ const fd = fs.openSync(path, fs.constants.O_WRONLY | fs.constants.O_NONBLOCK | fs.constants.O_NOCTTY);
62
77
  try {
63
- fs.writeSync(fd, bytes);
78
+ const buffer = Buffer.from(bytes);
79
+ let offset = 0;
80
+ const deadline = Date.now() + 250;
81
+ while (offset < buffer.length) {
82
+ try {
83
+ const written = fs.writeSync(fd, buffer, offset, buffer.length - offset);
84
+ if (written <= 0)
85
+ return false;
86
+ offset += written;
87
+ }
88
+ catch (error) {
89
+ const code = error.code;
90
+ if (!['EAGAIN', 'EWOULDBLOCK', 'EINTR'].includes(code ?? '') || Date.now() >= deadline)
91
+ return false;
92
+ await new Promise(resolve => setTimeout(resolve, 2));
93
+ }
94
+ }
64
95
  }
65
96
  finally {
66
97
  fs.closeSync(fd);
@@ -156,26 +187,29 @@ function tmuxClientTtyDevices() {
156
187
  * enabled, as termdock sets on managed sessions) forwards to its client —
157
188
  * the termdock server — as the plain inner OSC.
158
189
  */
159
- function writeToControllingTty(sequence, inTmuxPane) {
190
+ async function writeToControllingTty(sequence, inTmuxPane) {
160
191
  if (inTmuxPane) {
161
192
  const clientTtys = tmuxClientTtyDevices();
162
- if (clientTtys.length > 0) {
163
- return clientTtys.some((device) => writeDev(device, sequence));
164
- }
193
+ // A surviving client from a previous server may be listed first. Deliver
194
+ // to every managed observer; short-circuiting at the first successful
195
+ // write leaves the current server without any lifecycle events.
196
+ const delivered = await Promise.all(clientTtys.map(device => writeDev(device, sequence)));
197
+ if (delivered.includes(true))
198
+ return true;
165
199
  }
166
200
  // Only genuine tmux panes (TMUX_PANE is set by tmux itself) get the DCS
167
201
  // passthrough wrap; a bare inherited TMUX just means an ancestor ran tmux.
168
202
  const wire = inTmuxPane
169
203
  ? `\x1bPtmux;${sequence.replace(/\x1b/g, '\x1b\x1b')}\x1b\\`
170
204
  : sequence;
171
- if (writeDev('/dev/tty', wire))
205
+ if (await writeDev('/dev/tty', wire))
172
206
  return true;
173
207
  const dev = ancestorTtyDevice();
174
208
  if (dev)
175
209
  return writeDev(dev, wire);
176
210
  return false;
177
211
  }
178
- function main() {
212
+ async function main() {
179
213
  try {
180
214
  // Gate: emit when (a) inside a termdock-spawned shell (TERMDOCK env), or
181
215
  // (b) inside any tmux pane (TMUX+TMUX_PANE) — there the passthrough wrap
@@ -205,18 +239,28 @@ function main() {
205
239
  let input = '';
206
240
  if (!process.stdin.isTTY) {
207
241
  try {
208
- input = fs.readFileSync(0, 'utf8').slice(0, MAX_STDIN);
242
+ const chunks = [];
243
+ let size = 0;
244
+ for await (const chunk of process.stdin) {
245
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
246
+ const part = bytes.subarray(0, MAX_STDIN - size);
247
+ chunks.push(part);
248
+ size += part.length;
249
+ if (size >= MAX_STDIN)
250
+ break;
251
+ }
252
+ input = Buffer.concat(chunks).toString('utf8');
209
253
  }
210
254
  catch { /* no payload */ }
211
255
  }
212
256
  const event = effectiveEvent(agent, eventArg, input);
213
257
  if (!event)
214
258
  return;
215
- writeToControllingTty(buildHookSequence(agent, event, input, statusArg || undefined), inTmuxPane);
259
+ await writeToControllingTty(buildHookSequence(agent, event, input, statusArg || undefined), inTmuxPane);
216
260
  }
217
261
  catch {
218
262
  // Never break the agent's flow.
219
263
  }
220
264
  process.exit(0);
221
265
  }
222
- main();
266
+ void main();
@@ -2,7 +2,7 @@ import { execFile } from 'node:child_process';
2
2
  import { existsSync } from 'node:fs';
3
3
  import { delimiter, join } from 'node:path';
4
4
  import { promisify } from 'node:util';
5
- import { isIP } from 'node:net';
5
+ import { normalizeAndroidAddress } from '../shared/androidDevices.js';
6
6
  import { createHash } from 'node:crypto';
7
7
  const execFileAsync = promisify(execFile);
8
8
  const EXTRA_PATH = ['/usr/local/bin', '/opt/homebrew/bin', '/opt/local/bin', '/usr/bin', '/usr/lib/android-sdk/platform-tools'];
@@ -117,6 +117,8 @@ export async function getDeviceProperties(serial) {
117
117
  return {};
118
118
  }
119
119
  }
120
+ const deviceIdentities = new Map();
121
+ const IDENTITY_TTL = 5 * 60_000;
120
122
  export async function listDevices() {
121
123
  const output = await runAdb(['devices', '-l'], { timeout: 10_000 });
122
124
  const devices = [];
@@ -127,9 +129,27 @@ export async function listDevices() {
127
129
  if (info)
128
130
  devices.push(info);
129
131
  }
130
- await Promise.all(devices.filter(device => device.state === 'device').map(async (device) => {
131
- Object.assign(device, await getDeviceProperties(device.serial));
132
+ const now = Date.now();
133
+ for (const [key, value] of deviceIdentities)
134
+ if (now - value.observed > IDENTITY_TTL)
135
+ deviceIdentities.delete(key);
136
+ const namespace = resolveAdbBinary() || '';
137
+ await Promise.all(devices.map(async (device) => {
138
+ const key = `${namespace}:${device.serial}`;
139
+ if (device.state === 'device') {
140
+ Object.assign(device, await getDeviceProperties(device.serial));
141
+ deviceIdentities.delete(key);
142
+ if (device.physicalId)
143
+ deviceIdentities.set(key, { physicalId: device.physicalId, observed: now });
144
+ }
145
+ else {
146
+ const previous = deviceIdentities.get(key);
147
+ if (previous)
148
+ device.physicalId = previous.physicalId;
149
+ }
132
150
  }));
151
+ while (deviceIdentities.size > 512)
152
+ deviceIdentities.delete(deviceIdentities.keys().next().value);
133
153
  return devices;
134
154
  }
135
155
  export async function connectDevice(address) {
@@ -148,31 +168,4 @@ export async function disconnectDevice(address) {
148
168
  return (await runAdb(['disconnect', normalized], { timeout: 10_000 })).trim();
149
169
  }
150
170
  /** 接受 `ip:port`、纯 ip(补 5555)、或带 scheme/路径的粘贴内容。 */
151
- export function normalizeAddress(raw) {
152
- let value = raw.trim();
153
- if (!value)
154
- return null;
155
- const urlMatch = /^[a-z]+:\/\/([^/]+)/i.exec(value);
156
- if (urlMatch)
157
- value = urlMatch[1];
158
- value = value.replace(/^\/+|\/+$/g, '');
159
- const ipv6 = /^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(value);
160
- if (ipv6) {
161
- if (isIP(ipv6[1]) !== 6)
162
- return null;
163
- const port = ipv6[2] ?? '5555';
164
- if (Number(port) < 1 || Number(port) > 65535)
165
- return null;
166
- return `[${ipv6[1]}]:${port}`;
167
- }
168
- if (!/^[0-9a-zA-Z_.\-]+(?::\d+)?$/.test(value))
169
- return null;
170
- if (!value.includes(':') && /^\d+\.\d+\.\d+\.\d+$/.test(value))
171
- value = `${value}:5555`;
172
- const [host, port] = value.split(':');
173
- if (port !== undefined && !/^\d{1,5}$/.test(port))
174
- return null;
175
- if (!host)
176
- return null;
177
- return port === undefined ? `${host}:5555` : `${host}:${port}`;
178
- }
171
+ export const normalizeAddress = normalizeAndroidAddress;
@@ -26,7 +26,7 @@ import { detectLocalSessionContext, resolveLocalCollaborationContext } from './a
26
26
  import { parseAutomationCommand, executeAutomationCommand, AUTOMATION_HELP } from './agent/automationCli.js';
27
27
  import { parseCollaborationCommand, executeCollaborationCommand, COLLAB_HELP } from './agent/collaborationCli.js';
28
28
  import fs from 'fs';
29
- import { getMissingCertificateNames } from './utils/certificateNames.js';
29
+ import { localCertificateNeedsRefresh, setupLocalHttps } from './utils/localHttpsSetup.js';
30
30
  import http from 'http';
31
31
  import https from 'https';
32
32
  import path from 'path';
@@ -140,7 +140,8 @@ Options:
140
140
  --https-key <p> HTTPS private key path for local access
141
141
  --https-ca <p> CA certificate path exposed through a temporary mobile setup server
142
142
  --setup-local-https
143
- Generate and trust local HTTPS certs with mkcert
143
+ Generate local HTTPS certs; install verified mkcert if needed
144
+ --no-install-ca Generate certificates without changing local trust stores
144
145
  --foreground Run in the foreground
145
146
  --supervise Like --foreground, but under the process supervisor
146
147
  (auto-restarts on crash, records why). Use this for
@@ -189,7 +190,7 @@ Options:
189
190
  --plugin-create <file>
190
191
  Create a plugin from a manifest JSON file
191
192
  --plugin-install <source>
192
- Install a complete plugin package from HTTPS Git or a local path
193
+ Install a plugin package from Git (HTTPS/HTTP/SSH) or a local path
193
194
  --plugin-list List installed agent plugins
194
195
  --plugin-check <slug>
195
196
  Check the installed plugin source for updates
@@ -410,54 +411,6 @@ function resolveHealthTarget(options, https) {
410
411
  const displayHost = host === '0.0.0.0' ? 'localhost' : host;
411
412
  return { url: `${scheme}://${displayHost}:${port}/health`, scheme, host: displayHost, port };
412
413
  }
413
- const EXTRA_EXECUTABLE_DIRS = ['/opt/homebrew/bin', '/usr/local/bin'];
414
- function executableCandidates(command) {
415
- if (command.includes(path.sep))
416
- return [command];
417
- const dirs = [...(process.env.PATH ?? '').split(path.delimiter), ...EXTRA_EXECUTABLE_DIRS].filter(Boolean);
418
- const seen = new Set();
419
- return dirs
420
- .map((dir) => path.join(dir, command))
421
- .filter((candidate) => {
422
- if (seen.has(candidate))
423
- return false;
424
- seen.add(candidate);
425
- return true;
426
- });
427
- }
428
- async function findExecutable(command) {
429
- for (const candidate of executableCandidates(command)) {
430
- try {
431
- await execFileAsync(candidate, ['--version'], { timeout: 5000, maxBuffer: 128 * 1024 });
432
- return candidate;
433
- }
434
- catch { /* try next candidate */ }
435
- }
436
- return null;
437
- }
438
- async function ensureMkcertInstalled() {
439
- const existing = await findExecutable('mkcert');
440
- if (existing)
441
- return existing;
442
- const brew = await findExecutable('brew');
443
- if (!brew) {
444
- throw new Error(`${ICON.err} ${c.red('mkcert is required for local HTTPS setup, and Homebrew was not found.')}\n ${c.dim('Install Homebrew first, or manually install:')} ${c.cyan('brew install mkcert')}`);
445
- }
446
- console.log(`${ICON.info} ${c.dim('mkcert is not installed. Installing with Homebrew...')}`);
447
- try {
448
- await execFileAsync(brew, ['install', 'mkcert'], { timeout: 10 * 60 * 1000, maxBuffer: 8 * 1024 * 1024 });
449
- }
450
- catch (error) {
451
- const err = error;
452
- const detail = (err.stderr || err.message || '').toString().trim();
453
- throw new Error(`${ICON.err} ${c.red('Failed to install mkcert with Homebrew.')}${detail ? `\n${detail}` : ''}`);
454
- }
455
- const installed = await findExecutable('mkcert');
456
- if (!installed) {
457
- throw new Error(`${ICON.err} ${c.red('mkcert installation completed, but mkcert was not found on PATH.')}`);
458
- }
459
- return installed;
460
- }
461
414
  function getRequiredLocalHttpsNames() {
462
415
  const localName = getLocalAccessSetting().name;
463
416
  return [
@@ -469,62 +422,32 @@ function getRequiredLocalHttpsNames() {
469
422
  '::1',
470
423
  ];
471
424
  }
472
- async function defaultCertificateNeedsRefresh() {
473
- if (!fileExists(defaultHttpsCertPath) || !fileExists(defaultHttpsKeyPath))
474
- return true;
475
- return (await getMissingCertificateNames(defaultHttpsCertPath, getRequiredLocalHttpsNames())).length > 0;
476
- }
477
425
  async function ensureDefaultHttpsCertificateFresh() {
478
- if (!(await defaultCertificateNeedsRefresh()))
426
+ if (!localCertificateNeedsRefresh(certDir, getRequiredLocalHttpsNames()))
479
427
  return false;
480
- console.log(`${ICON.info} ${c.dim('Local HTTPS certificate is missing current domain/IP SANs; regenerating...')}`);
481
- await runSetupLocalHttps({ quietRestartHint: true, installCa: false });
428
+ console.log(`${ICON.info} ${c.dim('Local HTTPS certificate needs repair or renewal; preparing a validated replacement...')}`);
429
+ await runSetupLocalHttps({ quietRestartHint: true, installCa: false, allowCaChange: false });
482
430
  return true;
483
431
  }
484
432
  async function runSetupLocalHttps(options = {}) {
485
- const mkcert = await ensureMkcertInstalled();
486
- ensureStateDir();
487
- fs.mkdirSync(certDir, { recursive: true, mode: 0o700 });
488
- if (options.installCa !== false) {
489
- console.log(`${ICON.info} ${c.dim('Installing local CA into this computer trust store...')}`);
490
- await execFileAsync(mkcert, ['-install'], { timeout: 120000, maxBuffer: 1024 * 1024 });
491
- }
492
- console.log(`${ICON.info} ${c.dim('Generating local certificate for Termdock domains...')}`);
493
- await execFileAsync(mkcert, [
494
- '-cert-file', defaultHttpsCertPath,
495
- '-key-file', defaultHttpsKeyPath,
496
- ...getRequiredLocalHttpsNames(),
497
- ], { cwd: certDir, timeout: 120000, maxBuffer: 1024 * 1024 });
498
- try {
499
- const { stdout } = await execFileAsync(mkcert, ['-CAROOT'], { timeout: 5000, maxBuffer: 64 * 1024 });
500
- const rootCA = path.join(stdout.trim(), 'rootCA.pem');
501
- if (fs.existsSync(rootCA)) {
502
- fs.copyFileSync(rootCA, defaultHttpsCaPath);
503
- try {
504
- fs.chmodSync(defaultHttpsCaPath, 0o600);
505
- }
506
- catch { /* ignore */ }
507
- }
508
- }
509
- catch { /* CA download is optional but recommended */ }
510
- try {
511
- fs.chmodSync(defaultHttpsCertPath, 0o600);
512
- }
513
- catch { /* ignore */ }
514
- try {
515
- fs.chmodSync(defaultHttpsKeyPath, 0o600);
516
- }
517
- catch { /* ignore */ }
518
- console.log(`${ICON.ok} ${c.green('Local HTTPS certificates are ready.')}`);
519
- console.log(` ${c.dim('Cert:')} ${c.cyan(defaultHttpsCertPath)}`);
520
- console.log(` ${c.dim('Key:')} ${c.cyan(defaultHttpsKeyPath)}`);
521
- if (fs.existsSync(defaultHttpsCaPath)) {
522
- console.log(` ${c.dim('CA:')} ${c.cyan(defaultHttpsCaPath)} ${c.dim('(served on mobile setup page)')}`);
523
- }
433
+ const result = await setupLocalHttps({
434
+ directory: certDir, names: getRequiredLocalHttpsNames(),
435
+ installCa: options.installCa, allowCaChange: options.allowCaChange,
436
+ log: message => console.log(`${ICON.info} ${c.dim(message)}`),
437
+ });
438
+ console.log(`${ICON.ok} ${c.green('Local HTTPS certificates are generated and validated.')}`);
439
+ console.log(` ${c.dim('Cert:')} ${c.cyan(result.files.cert)}`);
440
+ console.log(` ${c.dim('Key:')} ${c.cyan(result.files.key)}`);
441
+ console.log(` ${c.dim('CA:')} ${c.cyan(result.files.ca)} ${c.dim('(install and trust this public certificate on each client device)')}`);
442
+ for (const warning of result.warnings)
443
+ console.warn(`${ICON.warn} ${c.yellow(warning)}`);
444
+ if (result.trust === 'requested')
445
+ console.log(` ${c.dim('Local CA trust installation was requested; browser trust may require certutil and a browser restart.')}`);
446
+ else
447
+ console.log(` ${c.dim('Local CA trust has not been installed by this command.')}`);
524
448
  console.log('');
525
- if (!options.quietRestartHint) {
449
+ if (!options.quietRestartHint)
526
450
  console.log(`${ICON.info} ${c.dim('Restart Termdock to use HTTPS:')} ${c.cyan('td --stop && td')}`);
527
- }
528
451
  }
529
452
  function printRunningState(state) {
530
453
  const displayHost = state.host === '0.0.0.0' ? 'localhost' : state.host;
@@ -632,6 +555,7 @@ function parseArgs(argv) {
632
555
  let httpsKey;
633
556
  let httpsCa;
634
557
  let setupLocalHttps = false;
558
+ let installLocalCa = true;
635
559
  let foreground = false;
636
560
  let supervise = false;
637
561
  let noSupervisor = false;
@@ -931,6 +855,10 @@ function parseArgs(argv) {
931
855
  setupLocalHttps = true;
932
856
  continue;
933
857
  }
858
+ if (arg === '--no-install-ca') {
859
+ installLocalCa = false;
860
+ continue;
861
+ }
934
862
  if (arg === '--foreground') {
935
863
  foreground = true;
936
864
  continue;
@@ -1173,6 +1101,7 @@ function parseArgs(argv) {
1173
1101
  httpsKey,
1174
1102
  httpsCa,
1175
1103
  setupLocalHttps,
1104
+ installLocalCa,
1176
1105
  foreground,
1177
1106
  supervise,
1178
1107
  noSupervisor,
@@ -2140,7 +2069,7 @@ function runPluginInitJson() {
2140
2069
  hooks: 'Hooks publish declared lifecycle/status events; collaboration does not wait for an idle phase and does not require hooks.',
2141
2070
  },
2142
2071
  security: {
2143
- source: 'Only public HTTPS repository roots on approved Git hosts or explicit local paths are accepted; URL credentials are rejected.',
2072
+ source: 'Public and self-hosted Git repositories support HTTPS, HTTP, SSH and scp-style addresses. The service computer uses its Git credential helpers, SSH agent/configuration, proxy and CA settings. URL passwords and query tokens are rejected.',
2144
2073
  package: 'Symlinks, active/external SVG content, oversized files, submodules, and excessive unpacked size are rejected.',
2145
2074
  hooks: 'hooks.target must be a non-symlinked ~/ JSON path. Termdock generates the hook command; manifests cannot inject shell.',
2146
2075
  titleCommands: 'Installing or inspecting a plugin never executes its title/model commands. They run only after the user enables automatic titles for that plugin.',
@@ -2167,7 +2096,7 @@ function runPluginInitJson() {
2167
2096
  },
2168
2097
  integrationSteps: [
2169
2098
  'Create a repository with manifest.json at its root; icon.svg and helper files are optional.',
2170
- 'Publish the repository, then install it with td plugin-install <https-git-url>. Local directories are also supported.',
2099
+ 'Publish the repository, then install it with td plugin-install <git-url>. Public/private HTTPS, HTTP, SSH and local directories are supported.',
2171
2100
  'For manifest-only development, td plugin-create <manifest-file> remains available.',
2172
2101
  'Ask the user to open Settings > Detection Rules and click Install for this Agent. They can uninstall it there later.',
2173
2102
  'If the Agent hook format is not a Claude-style hooks map, configure native hooks to call td agent-event directly.',
@@ -2318,7 +2247,7 @@ ${c.dim('──────────────────')}
2318
2247
  ${c.dim('# Inject the Agent definition; it appears in the UI immediately')}
2319
2248
  td plugin-create ./trae-manifest.json
2320
2249
 
2321
- ${c.dim('# Or install a complete, updateable package from a public HTTPS Git repository')}
2250
+ ${c.dim('# Or install a complete, updateable package from a public or private Git repository')}
2322
2251
  td plugin-install https://github.com/owner/trae-termdock-plugin
2323
2252
 
2324
2253
  ${c.dim('# The user then opens Settings > Detection Rules and clicks Install.')}
@@ -3360,7 +3289,7 @@ async function promptLine(prompt) {
3360
3289
  });
3361
3290
  }
3362
3291
  async function runFirstRunWizard() {
3363
- if (!process.stdin.isTTY || isFirstRunCompleted())
3292
+ if (!process.stdin.isTTY || !process.stdout.isTTY || isFirstRunCompleted())
3364
3293
  return;
3365
3294
  console.log(`${ICON.info} ${c.bold('Termdock first-time local access setup')}`);
3366
3295
  const prefix = await promptLine(' Choose your .termdock.local prefix (e.g. jovn): ');
@@ -3411,12 +3340,18 @@ async function waitForServerMetadata(result, fallbackPort) {
3411
3340
  };
3412
3341
  }
3413
3342
  async function refreshDefaultHttpsCertificateSafely() {
3343
+ // Explicit custom certificates belong to their operator. A declined setup or
3344
+ // headless first run without any default files must not trigger a download.
3345
+ const custom = options.httpsCert && options.httpsCert !== defaultHttpsCertPath
3346
+ || options.httpsKey && options.httpsKey !== defaultHttpsKeyPath
3347
+ || options.httpsCa && options.httpsCa !== defaultHttpsCaPath;
3348
+ if (custom || ![defaultHttpsCertPath, defaultHttpsKeyPath, defaultHttpsCaPath].some(file => fs.existsSync(file)))
3349
+ return false;
3414
3350
  try {
3415
3351
  return await ensureDefaultHttpsCertificateFresh();
3416
3352
  }
3417
3353
  catch (error) {
3418
- console.error(error instanceof Error ? error.message : error);
3419
- return false;
3354
+ throw new Error(`Existing local HTTPS configuration could not be repaired; refusing to fall back to HTTP. Run td --setup-local-https. ${String(error)}`, { cause: error });
3420
3355
  }
3421
3356
  }
3422
3357
  async function main() {
@@ -3445,7 +3380,7 @@ async function main() {
3445
3380
  }
3446
3381
  if (options.setupLocalHttps) {
3447
3382
  try {
3448
- await runSetupLocalHttps();
3383
+ await runSetupLocalHttps({ installCa: options.installLocalCa });
3449
3384
  process.exit(0);
3450
3385
  }
3451
3386
  catch (error) {
@@ -3570,7 +3505,7 @@ async function main() {
3570
3505
  }
3571
3506
  if (options.pluginInstall !== undefined) {
3572
3507
  if (!options.pluginInstall) {
3573
- console.error(`${ICON.err} ${c.red('plugin-install requires an HTTPS Git URL or local package path')}`);
3508
+ console.error(`${ICON.err} ${c.red('plugin-install requires a Git URL (HTTPS/HTTP/SSH) or local package path')}`);
3574
3509
  process.exit(1);
3575
3510
  }
3576
3511
  await runPluginInstall(options.pluginInstall);
@@ -3753,8 +3688,13 @@ async function main() {
3753
3688
  return;
3754
3689
  }
3755
3690
  if (options.foreground) {
3756
- // Boot check (marker prevents re-run if parent already completed)
3757
- runBootChecks();
3691
+ const bootChecks = runBootChecks();
3692
+ if (!bootChecks.nodePty.ok || !bootChecks.tmux.ok) {
3693
+ for (const line of formatBootCheckReport(bootChecks, colorsEnabled))
3694
+ console.log(line);
3695
+ }
3696
+ if (!bootChecks.nodePty.ok)
3697
+ throw new Error('Native terminal initialization failed; see the boot check above.');
3758
3698
  warnIfAuthDisabled(options.host ?? DEFAULT_HOST);
3759
3699
  // Dynamic import keeps terminal.ts side-effects (loadClientStatesFromDisk
3760
3700
  // etc.) out of fast paths like `termdock --tls` / `--status`.
@@ -3879,6 +3819,8 @@ async function main() {
3879
3819
  }
3880
3820
  console.log("");
3881
3821
  }
3822
+ if (!bootChecks.nodePty.ok)
3823
+ process.exit(1);
3882
3824
  await runFirstRunWizard();
3883
3825
  await refreshDefaultHttpsCertificateSafely();
3884
3826
  const refreshedHttps = resolveHttpsOptions(options);
@@ -5,7 +5,7 @@ import { CollaborationPeerTransport, connectCollaborationRpc } from './agent/col
5
5
  import { collaborationStore, collaborationTaskStore, deliverPeerCollaboration, collaborationLocalActivity, collaborationDirectorySessions, prepareCollaborationTaskWorker, integrationSessionAdapter } from './routes/terminal.js';
6
6
  import { CollaborationTaskService } from './agent/collaborationTaskService.js';
7
7
  import { setPushTargetPeerId } from './notifications/pushService.js';
8
- import { desktopDirectTargets } from './federation/desktopTargets.js';
8
+ import { desktopServiceTargets } from './federation/desktopTargets.js';
9
9
  import { createOpenAccessRouter } from './federation/openAccess.js';
10
10
  import { createPasswordLoginRouter } from './federation/passwordLoginRoutes.js';
11
11
  import { apiAccessGate, isTrustedLocalRequest } from './utils/apiAccess.js';
@@ -14,7 +14,8 @@ import { createFederationRuntime } from './federation/runtime.js';
14
14
  import { startWebTransportServer } from './federation/webTransportServer.js';
15
15
  import { RouteAccess } from './federation/routeAccess.js';
16
16
  import { RouteInvitationStore } from './federation/routeInvitations.js';
17
- import { attachRegisteredDirectTargets, verifyDirectTarget } from './federation/directRoutes.js';
17
+ import { verifyDirectTarget } from './federation/directRoutes.js';
18
+ import { DirectTargetRegistry } from './federation/directTargetRegistry.js';
18
19
  import { secureChannelOriginAllowed } from './federation/originPolicy.js';
19
20
  import { RelayRouter } from './federation/relay.js';
20
21
  import { DesktopSelfRelay } from './federation/selfRelay.js';
@@ -490,7 +491,7 @@ export function startServer(options = {}) {
490
491
  let routeInvitations;
491
492
  let federationServiceId = '';
492
493
  let activeRouteIds = () => [];
493
- const desktopTargets = () => desktopDirectTargets(path.join(homedir(), '.termdock', 'desktop.json'), federationServiceId);
494
+ const desktopTargets = () => desktopServiceTargets(homedir(), federationServiceId);
494
495
  const routeAccess = new RouteAccess(path.join(homedir(), '.termdock', 'federation', 'routes.json'), Date.now, (subjectId, targetServiceId) => routeInvitations?.allows(subjectId, targetServiceId) === true || collaborationTransport?.canRoute(subjectId, targetServiceId) === true, desktopTargets, () => activeRouteIds());
495
496
  const relayRouter = new RelayRouter({
496
497
  isLocalTarget: id => id === federationServiceId,
@@ -499,29 +500,14 @@ export function startServer(options = {}) {
499
500
  allowRoute: (principal, serviceId) => routeAccess.allowRoute(principal, serviceId),
500
501
  });
501
502
  activeRouteIds = () => relayRouter.activeRouteIds();
502
- const dynamicDirectTargets = new Map();
503
+ const directTargetRegistry = new DirectTargetRegistry(relayRouter, path.join(homedir(), '.termdock', 'federation'));
503
504
  const refreshDirectTargets = () => {
504
- const desired = new Map(routeAccess.configuredDirectTargets().filter(target => target.serviceId !== federationServiceId).map(target => [target.serviceId, target]));
505
- for (const [id, registered] of dynamicDirectTargets) {
506
- const target = desired.get(id);
507
- if (!target || registered.signature !== JSON.stringify([target.url, target.caPath, target.caFingerprint256])) {
508
- registered.close();
509
- dynamicDirectTargets.delete(id);
510
- }
511
- }
512
- for (const [id, target] of desired)
513
- if (!dynamicDirectTargets.has(id)) {
514
- try {
515
- dynamicDirectTargets.set(id, { signature: JSON.stringify([target.url, target.caPath, target.caFingerprint256]), close: attachRegisteredDirectTargets(relayRouter, [target], path.join(homedir(), '.termdock', 'federation')) });
516
- }
517
- catch { /* A malformed or unavailable local route remains unusable. */ }
518
- }
505
+ directTargetRegistry.refresh(routeAccess.configuredDirectTargets().filter(target => target.serviceId !== federationServiceId));
519
506
  };
520
507
  refreshDirectTargets();
521
508
  const desktopRoutesTimer = setInterval(refreshDirectTargets, 2000);
522
509
  desktopRoutesTimer.unref();
523
- onServerClose(() => { clearInterval(desktopRoutesTimer); for (const target of dynamicDirectTargets.values())
524
- target.close(); });
510
+ onServerClose(() => { clearInterval(desktopRoutesTimer); directTargetRegistry.close(); });
525
511
  onServerClose(() => relayRouter.close());
526
512
  onServerClose(() => { void stopAllScrcpySessions(); void androidRecordings.stopAll(); });
527
513
  onServerClose(stopComputerBridges);
@@ -559,7 +545,10 @@ export function startServer(options = {}) {
559
545
  throw new Error('COLLABORATION_UNAVAILABLE');
560
546
  return collaborationTransport.receive(subjectId, packet);
561
547
  },
562
- listRouteTargets: () => { refreshDirectTargets(); return routeAccess.configuredTargets().map(target => ({ ...target, available: relayRouter.hasRoute(target.serviceId) })); },
548
+ listRouteTargets: () => {
549
+ refreshDirectTargets();
550
+ return routeAccess.configuredTargets().map(target => directTargetRegistry.describe(target));
551
+ },
563
552
  listRouteAccess: () => routeInvitations?.list() || [],
564
553
  grantRouteAccess: async (issuerId, targetServiceId, subjectId, url) => {
565
554
  if (!routeInvitations)
@@ -693,7 +682,12 @@ export function startServer(options = {}) {
693
682
  const selfRelay = new DesktopSelfRelay({
694
683
  desktopFile: path.join(homedir(), '.termdock', 'desktop.json'),
695
684
  targets: () => routeAccess.configuredDirectTargets(), baseDir: path.join(homedir(), '.termdock', 'federation'), identity: runtime.identity, serviceId: runtime.serviceId,
696
- localOrigin: `${scheme}://${localAuthority}:${port}`, ...(localCa ? { localCa } : {}),
685
+ localOrigin: () => {
686
+ const address = server.address();
687
+ if (!address || typeof address === 'string')
688
+ throw new Error('Local service is not listening');
689
+ return `${scheme}://${localAuthority}:${address.port}`;
690
+ }, ...(localCa ? { localCa } : {}),
697
691
  });
698
692
  selfRelay.start();
699
693
  onServerClose(() => selfRelay.close());