termdock 1.4.285 → 1.4.287

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 (329) hide show
  1. package/.desktop-dist/main.js +17 -558
  2. package/README.md +2 -4
  3. package/dist/client/assets/{App--hZmWk-u.js → App-qs0jye8B.js} +29 -28
  4. package/dist/client/assets/App-qs0jye8B.js.br +0 -0
  5. package/dist/client/assets/App-qs0jye8B.js.gz +0 -0
  6. package/dist/client/assets/{ChangeWalkthroughPanel-BQ1hdwzt.js → ChangeWalkthroughPanel-X-M6nxKJ.js} +1 -1
  7. package/dist/client/assets/ChangeWalkthroughPanel-X-M6nxKJ.js.br +0 -0
  8. package/dist/client/assets/ChangeWalkthroughPanel-X-M6nxKJ.js.gz +0 -0
  9. package/dist/client/assets/{DagPlayground-BERXHwib.js → DagPlayground-DgiUaUkH.js} +1 -1
  10. package/dist/client/assets/DagPlayground-DgiUaUkH.js.br +0 -0
  11. package/dist/client/assets/DagPlayground-DgiUaUkH.js.gz +0 -0
  12. package/dist/client/assets/{DiffLab-DF14_TAz.js → DiffLab-u8njwj0d.js} +1 -1
  13. package/dist/client/assets/DiffLab-u8njwj0d.js.br +0 -0
  14. package/dist/client/assets/DiffLab-u8njwj0d.js.gz +0 -0
  15. package/dist/client/assets/{DiffReview-BQcIn0zl.js → DiffReview-DoQY-klj.js} +1 -1
  16. package/dist/client/assets/DiffReview-DoQY-klj.js.br +0 -0
  17. package/dist/client/assets/DiffReview-DoQY-klj.js.gz +0 -0
  18. package/dist/client/assets/{DiffReviewLab-CgChwzQr.js → DiffReviewLab-DlKbMbfq.js} +1 -1
  19. package/dist/client/assets/DiffReviewLab-DlKbMbfq.js.br +0 -0
  20. package/dist/client/assets/DiffReviewLab-DlKbMbfq.js.gz +0 -0
  21. package/dist/client/assets/{DiffViewer-hDpe-wvG.js → DiffViewer-nlvDqGPJ.js} +1 -1
  22. package/dist/client/assets/DiffViewer-nlvDqGPJ.js.br +0 -0
  23. package/dist/client/assets/DiffViewer-nlvDqGPJ.js.gz +0 -0
  24. package/dist/client/assets/{ModelPreview-vg3vRIhx.js → ModelPreview-C3beTH3N.js} +1 -1
  25. package/dist/client/assets/ModelPreview-C3beTH3N.js.br +0 -0
  26. package/dist/client/assets/ModelPreview-C3beTH3N.js.gz +0 -0
  27. package/dist/client/assets/{RightSidebar-5H4vhn3k.js → RightSidebar-BtktcUdh.js} +5 -5
  28. package/dist/client/assets/RightSidebar-BtktcUdh.js.br +0 -0
  29. package/dist/client/assets/RightSidebar-BtktcUdh.js.gz +0 -0
  30. package/dist/client/assets/{abnfDiagram-VCTEODGH-DI7938HB.js → abnfDiagram-VCTEODGH-7J_hDjG2.js} +1 -1
  31. package/dist/client/assets/abnfDiagram-VCTEODGH-7J_hDjG2.js.br +0 -0
  32. package/dist/client/assets/abnfDiagram-VCTEODGH-7J_hDjG2.js.gz +0 -0
  33. package/dist/client/assets/{app-BeVXUQb-.js → app-CHKqaWIE.js} +7 -7
  34. package/dist/client/assets/app-CHKqaWIE.js.br +0 -0
  35. package/dist/client/assets/app-CHKqaWIE.js.gz +0 -0
  36. package/dist/client/assets/{arc-D4qDm5Yn.js → arc-Bg_CuCZm.js} +1 -1
  37. package/dist/client/assets/arc-Bg_CuCZm.js.br +0 -0
  38. package/dist/client/assets/arc-Bg_CuCZm.js.gz +0 -0
  39. package/dist/client/assets/{architectureDiagram-5GKGNRK7-C4IZCNC9.js → architectureDiagram-5GKGNRK7-CsSHwySz.js} +1 -1
  40. package/dist/client/assets/architectureDiagram-5GKGNRK7-CsSHwySz.js.br +0 -0
  41. package/dist/client/assets/architectureDiagram-5GKGNRK7-CsSHwySz.js.gz +0 -0
  42. package/dist/client/assets/{blockDiagram-I7D4REHJ-DHVOr_jQ.js → blockDiagram-I7D4REHJ-DePM_hkV.js} +1 -1
  43. package/dist/client/assets/blockDiagram-I7D4REHJ-DePM_hkV.js.br +0 -0
  44. package/dist/client/assets/blockDiagram-I7D4REHJ-DePM_hkV.js.gz +0 -0
  45. package/dist/client/assets/{c4Diagram-7LVT6UL2-kQqkOkIe.js → c4Diagram-7LVT6UL2-BQ8B9h53.js} +1 -1
  46. package/dist/client/assets/c4Diagram-7LVT6UL2-BQ8B9h53.js.br +0 -0
  47. package/dist/client/assets/c4Diagram-7LVT6UL2-BQ8B9h53.js.gz +0 -0
  48. package/dist/client/assets/channel-8p7Zocq1.js +1 -0
  49. package/dist/client/assets/{chunk-2Q5K7J3B-D2kOR60I.js → chunk-2Q5K7J3B-Bo9Nc-d4.js} +1 -1
  50. package/dist/client/assets/{chunk-5VM5RSS4-CxaDg0nL.js → chunk-5VM5RSS4-D_qQp7an.js} +1 -1
  51. package/dist/client/assets/{chunk-F27PBJKO-Bxf7XPNj.js → chunk-F27PBJKO-CJvGLWuF.js} +1 -1
  52. package/dist/client/assets/chunk-F27PBJKO-CJvGLWuF.js.br +0 -0
  53. package/dist/client/assets/chunk-F27PBJKO-CJvGLWuF.js.gz +0 -0
  54. package/dist/client/assets/{chunk-IMKFNOWR-BTifpaB5.js → chunk-IMKFNOWR-e4fa23mF.js} +1 -1
  55. package/dist/client/assets/chunk-IMKFNOWR-e4fa23mF.js.br +0 -0
  56. package/dist/client/assets/chunk-IMKFNOWR-e4fa23mF.js.gz +0 -0
  57. package/dist/client/assets/{chunk-JWPE2WC7-Deieql_u.js → chunk-JWPE2WC7-D9qVRvQs.js} +1 -1
  58. package/dist/client/assets/{chunk-POPQ4Y6H-CqZwUpjK.js → chunk-POPQ4Y6H-7eOizLll.js} +1 -1
  59. package/dist/client/assets/{chunk-SVP7TREG-Bm1spPMb.js → chunk-SVP7TREG-Co1wDBYI.js} +1 -1
  60. package/dist/client/assets/chunk-SVP7TREG-Co1wDBYI.js.br +0 -0
  61. package/dist/client/assets/chunk-SVP7TREG-Co1wDBYI.js.gz +0 -0
  62. package/dist/client/assets/{chunk-TICWLB2K-BGLj-zGP.js → chunk-TICWLB2K-yKjTtLNf.js} +1 -1
  63. package/dist/client/assets/chunk-TICWLB2K-yKjTtLNf.js.br +0 -0
  64. package/dist/client/assets/chunk-TICWLB2K-yKjTtLNf.js.gz +0 -0
  65. package/dist/client/assets/{chunk-XXDRQBXY-CR77bUfc.js → chunk-XXDRQBXY-DDFq5Eoi.js} +1 -1
  66. package/dist/client/assets/classDiagram-ZZMXUADV-DM8VyUpP.js +1 -0
  67. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DM8VyUpP.js +1 -0
  68. package/dist/client/assets/{cose-bilkent-JH36ORCC-GTawhnoV.js → cose-bilkent-JH36ORCC-Ng2b-szu.js} +1 -1
  69. package/dist/client/assets/cose-bilkent-JH36ORCC-Ng2b-szu.js.br +0 -0
  70. package/dist/client/assets/cose-bilkent-JH36ORCC-Ng2b-szu.js.gz +0 -0
  71. package/dist/client/assets/{cynefin-OW5HDTMX-DHdRkQdW.js → cynefin-OW5HDTMX-BUzoxsoE.js} +1 -1
  72. package/dist/client/assets/cynefin-OW5HDTMX-BUzoxsoE.js.br +0 -0
  73. package/dist/client/assets/cynefin-OW5HDTMX-BUzoxsoE.js.gz +0 -0
  74. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-Cj2ytLun.js → cynefinDiagram-5FMLGOSQ-9sKimYPk.js} +1 -1
  75. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-9sKimYPk.js.br +0 -0
  76. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-9sKimYPk.js.gz +0 -0
  77. package/dist/client/assets/{dagre-GXQ25YYZ-BdFZmtIj.js → dagre-GXQ25YYZ-C6GZ4pYU.js} +1 -1
  78. package/dist/client/assets/dagre-GXQ25YYZ-C6GZ4pYU.js.br +0 -0
  79. package/dist/client/assets/dagre-GXQ25YYZ-C6GZ4pYU.js.gz +0 -0
  80. package/dist/client/assets/{diagram-S7CK7UJ4-D5WQNuKI.js → diagram-S7CK7UJ4-DHewWm_2.js} +1 -1
  81. package/dist/client/assets/diagram-S7CK7UJ4-DHewWm_2.js.br +0 -0
  82. package/dist/client/assets/diagram-S7CK7UJ4-DHewWm_2.js.gz +0 -0
  83. package/dist/client/assets/{diagram-UQ7AKVKN-ChwjfMce.js → diagram-UQ7AKVKN-BU-Qm_iS.js} +1 -1
  84. package/dist/client/assets/diagram-UQ7AKVKN-BU-Qm_iS.js.br +0 -0
  85. package/dist/client/assets/diagram-UQ7AKVKN-BU-Qm_iS.js.gz +0 -0
  86. package/dist/client/assets/{diagram-VSXAHHWV-DT4FET5f.js → diagram-VSXAHHWV-DEvxj92u.js} +1 -1
  87. package/dist/client/assets/diagram-VSXAHHWV-DEvxj92u.js.br +0 -0
  88. package/dist/client/assets/diagram-VSXAHHWV-DEvxj92u.js.gz +0 -0
  89. package/dist/client/assets/{diagram-VX7I27RA-BLJsAGx6.js → diagram-VX7I27RA-DwwnVInb.js} +1 -1
  90. package/dist/client/assets/diagram-VX7I27RA-DwwnVInb.js.br +0 -0
  91. package/dist/client/assets/diagram-VX7I27RA-DwwnVInb.js.gz +0 -0
  92. package/dist/client/assets/{diagram-Z3DM3KII-C1ofLllK.js → diagram-Z3DM3KII-DDhqqeca.js} +1 -1
  93. package/dist/client/assets/diagram-Z3DM3KII-DDhqqeca.js.br +0 -0
  94. package/dist/client/assets/diagram-Z3DM3KII-DDhqqeca.js.gz +0 -0
  95. package/dist/client/assets/{ebnfDiagram-PWID7BFC-apxDEeqe.js → ebnfDiagram-PWID7BFC-CQz2BRgT.js} +1 -1
  96. package/dist/client/assets/ebnfDiagram-PWID7BFC-CQz2BRgT.js.br +0 -0
  97. package/dist/client/assets/ebnfDiagram-PWID7BFC-CQz2BRgT.js.gz +0 -0
  98. package/dist/client/assets/{erDiagram-RLTQ6QDP-Dq9hBYpH.js → erDiagram-RLTQ6QDP-D2eLjKEA.js} +1 -1
  99. package/dist/client/assets/erDiagram-RLTQ6QDP-D2eLjKEA.js.br +0 -0
  100. package/dist/client/assets/erDiagram-RLTQ6QDP-D2eLjKEA.js.gz +0 -0
  101. package/dist/client/assets/{flowDiagram-HODETNUW-Juk-Qv9f.js → flowDiagram-HODETNUW-B7oJq5P3.js} +1 -1
  102. package/dist/client/assets/flowDiagram-HODETNUW-B7oJq5P3.js.br +0 -0
  103. package/dist/client/assets/flowDiagram-HODETNUW-B7oJq5P3.js.gz +0 -0
  104. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-mmwd0mxs.js → ganttDiagram-EL5Y4UJY-BUA_LsMw.js} +1 -1
  105. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BUA_LsMw.js.br +0 -0
  106. package/dist/client/assets/ganttDiagram-EL5Y4UJY-BUA_LsMw.js.gz +0 -0
  107. package/dist/client/assets/{gestureArbiter-CM_xJnCS.js → gestureArbiter-8VtxF9dg.js} +1 -1
  108. package/dist/client/assets/gestureArbiter-8VtxF9dg.js.br +0 -0
  109. package/dist/client/assets/gestureArbiter-8VtxF9dg.js.gz +0 -0
  110. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX--UL7HV4P.js → gitGraphDiagram-WWUBYQGX-BlbsPdki.js} +1 -1
  111. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BlbsPdki.js.br +0 -0
  112. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BlbsPdki.js.gz +0 -0
  113. package/dist/client/assets/{index-pZsldTFS.css → index-DUCUcxTy.css} +1 -1
  114. package/dist/client/assets/index-DUCUcxTy.css.br +0 -0
  115. package/dist/client/assets/{index-pZsldTFS.css.gz → index-DUCUcxTy.css.gz} +0 -0
  116. package/dist/client/assets/{infoDiagram-27XIBGKW-CcsxyqYJ.js → infoDiagram-27XIBGKW-DdYvRIDS.js} +1 -1
  117. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CNVFPx1_.js → ishikawaDiagram-5VMMS53U-CZbBbDjz.js} +1 -1
  118. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CZbBbDjz.js.br +0 -0
  119. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CZbBbDjz.js.gz +0 -0
  120. package/dist/client/assets/{journeyDiagram-3NMN7TZE-BtIuJLUp.js → journeyDiagram-3NMN7TZE-DtxlqtaG.js} +1 -1
  121. package/dist/client/assets/journeyDiagram-3NMN7TZE-DtxlqtaG.js.br +0 -0
  122. package/dist/client/assets/journeyDiagram-3NMN7TZE-DtxlqtaG.js.gz +0 -0
  123. package/dist/client/assets/{kanban-definition-UXKFOSKX-gOFjuFZV.js → kanban-definition-UXKFOSKX-UMDV9UCG.js} +1 -1
  124. package/dist/client/assets/kanban-definition-UXKFOSKX-UMDV9UCG.js.br +0 -0
  125. package/dist/client/assets/kanban-definition-UXKFOSKX-UMDV9UCG.js.gz +0 -0
  126. package/dist/client/assets/{layout-KEP24zEE.js → layout-CAAXci79.js} +1 -1
  127. package/dist/client/assets/layout-CAAXci79.js.br +0 -0
  128. package/dist/client/assets/layout-CAAXci79.js.gz +0 -0
  129. package/dist/client/assets/{linear-BwUXWDLn.js → linear-BGBP_FE_.js} +1 -1
  130. package/dist/client/assets/linear-BGBP_FE_.js.br +0 -0
  131. package/dist/client/assets/linear-BGBP_FE_.js.gz +0 -0
  132. package/dist/client/assets/{mermaid.core-DkzJYwWa.js → mermaid.core-BH_WDKpZ.js} +5 -5
  133. package/dist/client/assets/mermaid.core-BH_WDKpZ.js.br +0 -0
  134. package/dist/client/assets/mermaid.core-BH_WDKpZ.js.gz +0 -0
  135. package/dist/client/assets/{mindmap-definition-YA3MSWOX-BE1H8WPd.js → mindmap-definition-YA3MSWOX-7yyx6kg5.js} +1 -1
  136. package/dist/client/assets/mindmap-definition-YA3MSWOX-7yyx6kg5.js.br +0 -0
  137. package/dist/client/assets/mindmap-definition-YA3MSWOX-7yyx6kg5.js.gz +0 -0
  138. package/dist/client/assets/{passwordBootstrap-Dhzj9-U2.js → passwordBootstrap-Dt3dN800.js} +1 -1
  139. package/dist/client/assets/passwordBootstrap-Dt3dN800.js.br +0 -0
  140. package/dist/client/assets/passwordBootstrap-Dt3dN800.js.gz +0 -0
  141. package/dist/client/assets/{pegDiagram-XKGWAZYB-CorBwvfP.js → pegDiagram-XKGWAZYB-D254I9Yl.js} +1 -1
  142. package/dist/client/assets/pegDiagram-XKGWAZYB-D254I9Yl.js.br +0 -0
  143. package/dist/client/assets/pegDiagram-XKGWAZYB-D254I9Yl.js.gz +0 -0
  144. package/dist/client/assets/{pieDiagram-E7YTZNPT-A017Uk-W.js → pieDiagram-E7YTZNPT-DTy-4KXi.js} +1 -1
  145. package/dist/client/assets/pieDiagram-E7YTZNPT-DTy-4KXi.js.br +0 -0
  146. package/dist/client/assets/pieDiagram-E7YTZNPT-DTy-4KXi.js.gz +0 -0
  147. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-CNNywvhG.js → quadrantDiagram-AXDQQJYC-BMsaHxl0.js} +1 -1
  148. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BMsaHxl0.js.br +0 -0
  149. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BMsaHxl0.js.gz +0 -0
  150. package/dist/client/assets/{railroadDiagram-O6MQD6OU-DIxiWn5A.js → railroadDiagram-O6MQD6OU-D4c39AAQ.js} +1 -1
  151. package/dist/client/assets/railroadDiagram-O6MQD6OU-D4c39AAQ.js.br +0 -0
  152. package/dist/client/assets/railroadDiagram-O6MQD6OU-D4c39AAQ.js.gz +0 -0
  153. package/dist/client/assets/{referenceLongPress-Bp8q50sv.js → referenceLongPress-TTIbwCKV.js} +1 -1
  154. package/dist/client/assets/referenceLongPress-TTIbwCKV.js.br +0 -0
  155. package/dist/client/assets/referenceLongPress-TTIbwCKV.js.gz +0 -0
  156. package/dist/client/assets/{requirementDiagram-BXWQKSXE-Ob4lS23U.js → requirementDiagram-BXWQKSXE-CwJjBKnR.js} +1 -1
  157. package/dist/client/assets/requirementDiagram-BXWQKSXE-CwJjBKnR.js.br +0 -0
  158. package/dist/client/assets/requirementDiagram-BXWQKSXE-CwJjBKnR.js.gz +0 -0
  159. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-Cc5e7umb.js → sankeyDiagram-P5KCCOFB-DVlRBDMK.js} +1 -1
  160. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DVlRBDMK.js.br +0 -0
  161. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DVlRBDMK.js.gz +0 -0
  162. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CLTRKFht.js → sequenceDiagram-WJ2MYXX4-BsWqKeoD.js} +1 -1
  163. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BsWqKeoD.js.br +0 -0
  164. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BsWqKeoD.js.gz +0 -0
  165. package/dist/client/assets/{sizeCapture-INFHLROL-h6hFhQw6.js → sizeCapture-INFHLROL-1FEOsRFT.js} +1 -1
  166. package/dist/client/assets/sizeCapture-INFHLROL-1FEOsRFT.js.br +0 -0
  167. package/dist/client/assets/sizeCapture-INFHLROL-1FEOsRFT.js.gz +0 -0
  168. package/dist/client/assets/{sparkles-9OJtJfyK.js → sparkles-hN4VSTDx.js} +1 -1
  169. package/dist/client/assets/{stateDiagram-D77RDMKH-DSaJxX_r.js → stateDiagram-D77RDMKH-DWNE48Sc.js} +1 -1
  170. package/dist/client/assets/stateDiagram-D77RDMKH-DWNE48Sc.js.br +0 -0
  171. package/dist/client/assets/stateDiagram-D77RDMKH-DWNE48Sc.js.gz +0 -0
  172. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BMprFuVB.js +1 -0
  173. package/dist/client/assets/{swimlanes-42K2YHIH-CP7ABWyE.js → swimlanes-42K2YHIH-ghhxa8QM.js} +1 -1
  174. package/dist/client/assets/swimlanes-42K2YHIH-ghhxa8QM.js.br +0 -0
  175. package/dist/client/assets/swimlanes-42K2YHIH-ghhxa8QM.js.gz +0 -0
  176. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Dg4tYXGL.js +8 -0
  177. package/dist/client/assets/{timeline-definition-24CTP7MA-CdwVIVF6.js → timeline-definition-24CTP7MA-B0eZfCze.js} +1 -1
  178. package/dist/client/assets/timeline-definition-24CTP7MA-B0eZfCze.js.br +0 -0
  179. package/dist/client/assets/timeline-definition-24CTP7MA-B0eZfCze.js.gz +0 -0
  180. package/dist/client/assets/{triangle-alert-BvT4KSYf.js → triangle-alert-zb36qQ-j.js} +1 -1
  181. package/dist/client/assets/{vennDiagram-4TSXK5OY-BXGgQFVY.js → vennDiagram-4TSXK5OY-DCdV0A4l.js} +1 -1
  182. package/dist/client/assets/vennDiagram-4TSXK5OY-DCdV0A4l.js.br +0 -0
  183. package/dist/client/assets/vennDiagram-4TSXK5OY-DCdV0A4l.js.gz +0 -0
  184. package/dist/client/assets/{videoCompression-BFXJyhpz.js → videoCompression-BzT-9eWg.js} +1 -1
  185. package/dist/client/assets/videoCompression-BzT-9eWg.js.br +0 -0
  186. package/dist/client/assets/videoCompression-BzT-9eWg.js.gz +0 -0
  187. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-CtLophqU.js → wardleyDiagram-VM6X3IG4-BQvk-8b6.js} +1 -1
  188. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BQvk-8b6.js.br +0 -0
  189. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BQvk-8b6.js.gz +0 -0
  190. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-YZ9bnI1e.js → xychartDiagram-S5SC5T6Z-D1VdK6g5.js} +1 -1
  191. package/dist/client/assets/xychartDiagram-S5SC5T6Z-D1VdK6g5.js.br +0 -0
  192. package/dist/client/assets/xychartDiagram-S5SC5T6Z-D1VdK6g5.js.gz +0 -0
  193. package/dist/client/index.html +2 -2
  194. package/dist/client/index.html.br +0 -0
  195. package/dist/client/index.html.gz +0 -0
  196. package/dist/client/sw.js +1 -1
  197. package/dist/client/sw.js.br +0 -0
  198. package/dist/client/sw.js.gz +0 -0
  199. package/dist/server/entry.js +2 -6
  200. package/dist/server/routes/terminal.js +4 -22
  201. package/dist/server/utils/enableSupervision.js +2 -3
  202. package/dist/server/utils/runtimeClient.js +0 -32
  203. package/package.json +3 -3
  204. package/runtime-manifest.json +3 -3
  205. package/scripts/classify-release.mjs +0 -1
  206. package/dist/client/assets/App--hZmWk-u.js.br +0 -0
  207. package/dist/client/assets/App--hZmWk-u.js.gz +0 -0
  208. package/dist/client/assets/ChangeWalkthroughPanel-BQ1hdwzt.js.br +0 -0
  209. package/dist/client/assets/ChangeWalkthroughPanel-BQ1hdwzt.js.gz +0 -0
  210. package/dist/client/assets/DagPlayground-BERXHwib.js.br +0 -0
  211. package/dist/client/assets/DagPlayground-BERXHwib.js.gz +0 -0
  212. package/dist/client/assets/DiffLab-DF14_TAz.js.br +0 -0
  213. package/dist/client/assets/DiffLab-DF14_TAz.js.gz +0 -0
  214. package/dist/client/assets/DiffReview-BQcIn0zl.js.br +0 -0
  215. package/dist/client/assets/DiffReview-BQcIn0zl.js.gz +0 -0
  216. package/dist/client/assets/DiffReviewLab-CgChwzQr.js.br +0 -0
  217. package/dist/client/assets/DiffReviewLab-CgChwzQr.js.gz +0 -0
  218. package/dist/client/assets/DiffViewer-hDpe-wvG.js.br +0 -0
  219. package/dist/client/assets/DiffViewer-hDpe-wvG.js.gz +0 -0
  220. package/dist/client/assets/ModelPreview-vg3vRIhx.js.br +0 -0
  221. package/dist/client/assets/ModelPreview-vg3vRIhx.js.gz +0 -0
  222. package/dist/client/assets/RightSidebar-5H4vhn3k.js.br +0 -0
  223. package/dist/client/assets/RightSidebar-5H4vhn3k.js.gz +0 -0
  224. package/dist/client/assets/abnfDiagram-VCTEODGH-DI7938HB.js.br +0 -0
  225. package/dist/client/assets/abnfDiagram-VCTEODGH-DI7938HB.js.gz +0 -0
  226. package/dist/client/assets/app-BeVXUQb-.js.br +0 -0
  227. package/dist/client/assets/app-BeVXUQb-.js.gz +0 -0
  228. package/dist/client/assets/arc-D4qDm5Yn.js.br +0 -0
  229. package/dist/client/assets/arc-D4qDm5Yn.js.gz +0 -0
  230. package/dist/client/assets/architectureDiagram-5GKGNRK7-C4IZCNC9.js.br +0 -0
  231. package/dist/client/assets/architectureDiagram-5GKGNRK7-C4IZCNC9.js.gz +0 -0
  232. package/dist/client/assets/blockDiagram-I7D4REHJ-DHVOr_jQ.js.br +0 -0
  233. package/dist/client/assets/blockDiagram-I7D4REHJ-DHVOr_jQ.js.gz +0 -0
  234. package/dist/client/assets/c4Diagram-7LVT6UL2-kQqkOkIe.js.br +0 -0
  235. package/dist/client/assets/c4Diagram-7LVT6UL2-kQqkOkIe.js.gz +0 -0
  236. package/dist/client/assets/channel-DNlwrmA4.js +0 -1
  237. package/dist/client/assets/chunk-F27PBJKO-Bxf7XPNj.js.br +0 -0
  238. package/dist/client/assets/chunk-F27PBJKO-Bxf7XPNj.js.gz +0 -0
  239. package/dist/client/assets/chunk-IMKFNOWR-BTifpaB5.js.br +0 -0
  240. package/dist/client/assets/chunk-IMKFNOWR-BTifpaB5.js.gz +0 -0
  241. package/dist/client/assets/chunk-SVP7TREG-Bm1spPMb.js.br +0 -0
  242. package/dist/client/assets/chunk-SVP7TREG-Bm1spPMb.js.gz +0 -0
  243. package/dist/client/assets/chunk-TICWLB2K-BGLj-zGP.js.br +0 -0
  244. package/dist/client/assets/chunk-TICWLB2K-BGLj-zGP.js.gz +0 -0
  245. package/dist/client/assets/classDiagram-ZZMXUADV-CUt4JCwJ.js +0 -1
  246. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CUt4JCwJ.js +0 -1
  247. package/dist/client/assets/cose-bilkent-JH36ORCC-GTawhnoV.js.br +0 -0
  248. package/dist/client/assets/cose-bilkent-JH36ORCC-GTawhnoV.js.gz +0 -0
  249. package/dist/client/assets/cynefin-OW5HDTMX-DHdRkQdW.js.br +0 -0
  250. package/dist/client/assets/cynefin-OW5HDTMX-DHdRkQdW.js.gz +0 -0
  251. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cj2ytLun.js.br +0 -0
  252. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Cj2ytLun.js.gz +0 -0
  253. package/dist/client/assets/dagre-GXQ25YYZ-BdFZmtIj.js.br +0 -0
  254. package/dist/client/assets/dagre-GXQ25YYZ-BdFZmtIj.js.gz +0 -0
  255. package/dist/client/assets/diagram-S7CK7UJ4-D5WQNuKI.js.br +0 -0
  256. package/dist/client/assets/diagram-S7CK7UJ4-D5WQNuKI.js.gz +0 -0
  257. package/dist/client/assets/diagram-UQ7AKVKN-ChwjfMce.js.br +0 -0
  258. package/dist/client/assets/diagram-UQ7AKVKN-ChwjfMce.js.gz +0 -0
  259. package/dist/client/assets/diagram-VSXAHHWV-DT4FET5f.js.br +0 -0
  260. package/dist/client/assets/diagram-VSXAHHWV-DT4FET5f.js.gz +0 -0
  261. package/dist/client/assets/diagram-VX7I27RA-BLJsAGx6.js.br +0 -0
  262. package/dist/client/assets/diagram-VX7I27RA-BLJsAGx6.js.gz +0 -0
  263. package/dist/client/assets/diagram-Z3DM3KII-C1ofLllK.js.br +0 -0
  264. package/dist/client/assets/diagram-Z3DM3KII-C1ofLllK.js.gz +0 -0
  265. package/dist/client/assets/ebnfDiagram-PWID7BFC-apxDEeqe.js.br +0 -0
  266. package/dist/client/assets/ebnfDiagram-PWID7BFC-apxDEeqe.js.gz +0 -0
  267. package/dist/client/assets/erDiagram-RLTQ6QDP-Dq9hBYpH.js.br +0 -0
  268. package/dist/client/assets/erDiagram-RLTQ6QDP-Dq9hBYpH.js.gz +0 -0
  269. package/dist/client/assets/flowDiagram-HODETNUW-Juk-Qv9f.js.br +0 -0
  270. package/dist/client/assets/flowDiagram-HODETNUW-Juk-Qv9f.js.gz +0 -0
  271. package/dist/client/assets/ganttDiagram-EL5Y4UJY-mmwd0mxs.js.br +0 -0
  272. package/dist/client/assets/ganttDiagram-EL5Y4UJY-mmwd0mxs.js.gz +0 -0
  273. package/dist/client/assets/gestureArbiter-CM_xJnCS.js.br +0 -0
  274. package/dist/client/assets/gestureArbiter-CM_xJnCS.js.gz +0 -0
  275. package/dist/client/assets/gitGraphDiagram-WWUBYQGX--UL7HV4P.js.br +0 -0
  276. package/dist/client/assets/gitGraphDiagram-WWUBYQGX--UL7HV4P.js.gz +0 -0
  277. package/dist/client/assets/index-pZsldTFS.css.br +0 -0
  278. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CNVFPx1_.js.br +0 -0
  279. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CNVFPx1_.js.gz +0 -0
  280. package/dist/client/assets/journeyDiagram-3NMN7TZE-BtIuJLUp.js.br +0 -0
  281. package/dist/client/assets/journeyDiagram-3NMN7TZE-BtIuJLUp.js.gz +0 -0
  282. package/dist/client/assets/kanban-definition-UXKFOSKX-gOFjuFZV.js.br +0 -0
  283. package/dist/client/assets/kanban-definition-UXKFOSKX-gOFjuFZV.js.gz +0 -0
  284. package/dist/client/assets/layout-KEP24zEE.js.br +0 -0
  285. package/dist/client/assets/layout-KEP24zEE.js.gz +0 -0
  286. package/dist/client/assets/linear-BwUXWDLn.js.br +0 -0
  287. package/dist/client/assets/linear-BwUXWDLn.js.gz +0 -0
  288. package/dist/client/assets/mermaid.core-DkzJYwWa.js.br +0 -0
  289. package/dist/client/assets/mermaid.core-DkzJYwWa.js.gz +0 -0
  290. package/dist/client/assets/mindmap-definition-YA3MSWOX-BE1H8WPd.js.br +0 -0
  291. package/dist/client/assets/mindmap-definition-YA3MSWOX-BE1H8WPd.js.gz +0 -0
  292. package/dist/client/assets/passwordBootstrap-Dhzj9-U2.js.br +0 -0
  293. package/dist/client/assets/passwordBootstrap-Dhzj9-U2.js.gz +0 -0
  294. package/dist/client/assets/pegDiagram-XKGWAZYB-CorBwvfP.js.br +0 -0
  295. package/dist/client/assets/pegDiagram-XKGWAZYB-CorBwvfP.js.gz +0 -0
  296. package/dist/client/assets/pieDiagram-E7YTZNPT-A017Uk-W.js.br +0 -0
  297. package/dist/client/assets/pieDiagram-E7YTZNPT-A017Uk-W.js.gz +0 -0
  298. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CNNywvhG.js.br +0 -0
  299. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CNNywvhG.js.gz +0 -0
  300. package/dist/client/assets/railroadDiagram-O6MQD6OU-DIxiWn5A.js.br +0 -0
  301. package/dist/client/assets/railroadDiagram-O6MQD6OU-DIxiWn5A.js.gz +0 -0
  302. package/dist/client/assets/referenceLongPress-Bp8q50sv.js.br +0 -0
  303. package/dist/client/assets/referenceLongPress-Bp8q50sv.js.gz +0 -0
  304. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ob4lS23U.js.br +0 -0
  305. package/dist/client/assets/requirementDiagram-BXWQKSXE-Ob4lS23U.js.gz +0 -0
  306. package/dist/client/assets/sankeyDiagram-P5KCCOFB-Cc5e7umb.js.br +0 -0
  307. package/dist/client/assets/sankeyDiagram-P5KCCOFB-Cc5e7umb.js.gz +0 -0
  308. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CLTRKFht.js.br +0 -0
  309. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-CLTRKFht.js.gz +0 -0
  310. package/dist/client/assets/sizeCapture-INFHLROL-h6hFhQw6.js.br +0 -0
  311. package/dist/client/assets/sizeCapture-INFHLROL-h6hFhQw6.js.gz +0 -0
  312. package/dist/client/assets/stateDiagram-D77RDMKH-DSaJxX_r.js.br +0 -0
  313. package/dist/client/assets/stateDiagram-D77RDMKH-DSaJxX_r.js.gz +0 -0
  314. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CQ9iS9Nl.js +0 -1
  315. package/dist/client/assets/swimlanes-42K2YHIH-CP7ABWyE.js.br +0 -0
  316. package/dist/client/assets/swimlanes-42K2YHIH-CP7ABWyE.js.gz +0 -0
  317. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BbfCRvRt.js +0 -8
  318. package/dist/client/assets/timeline-definition-24CTP7MA-CdwVIVF6.js.br +0 -0
  319. package/dist/client/assets/timeline-definition-24CTP7MA-CdwVIVF6.js.gz +0 -0
  320. package/dist/client/assets/vennDiagram-4TSXK5OY-BXGgQFVY.js.br +0 -0
  321. package/dist/client/assets/vennDiagram-4TSXK5OY-BXGgQFVY.js.gz +0 -0
  322. package/dist/client/assets/videoCompression-BFXJyhpz.js.br +0 -0
  323. package/dist/client/assets/videoCompression-BFXJyhpz.js.gz +0 -0
  324. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CtLophqU.js.br +0 -0
  325. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CtLophqU.js.gz +0 -0
  326. package/dist/client/assets/xychartDiagram-S5SC5T6Z-YZ9bnI1e.js.br +0 -0
  327. package/dist/client/assets/xychartDiagram-S5SC5T6Z-YZ9bnI1e.js.gz +0 -0
  328. package/dist/server/utils/desktopRuntimeOwner.js +0 -105
  329. package/scripts/prepare-desktop-runtime.mjs +0 -228
@@ -4,24 +4,19 @@ import { prepareServiceFrontend, selectServiceFrontend } from './bundledFrontend
4
4
  import { serviceConnection, serviceConnectionKeys, importServiceConnection, saveServiceConnection, invitationForService } from './serviceConnections.js';
5
5
  const pendingServiceInvitations = new WeakMap();
6
6
  import { app, BrowserWindow, clipboard, dialog, ipcMain, Menu, net, nativeImage, Notification, powerMonitor, screen, session, shell, Tray, } from 'electron';
7
- import { execFile, spawn } from 'node:child_process';
7
+ import { execFile } from 'node:child_process';
8
8
  import crypto from 'node:crypto';
9
9
  import dgram from 'node:dgram';
10
10
  import fs from 'node:fs';
11
- import http from 'node:http';
12
11
  import https from 'node:https';
13
12
  import os from 'node:os';
14
13
  import path from 'node:path';
15
14
  import { promisify } from 'node:util';
16
15
  import { fileURLToPath } from 'node:url';
17
16
  import { desktopStatusTooltip, formatCompactDesktopStatus, menuBarStatusRows, mergeServiceActivity, nextServiceOrigin, normalizeServiceActivity, summarizeServiceActivity, } from './activityStatus.js';
18
- import { checkForDesktopUpdates, checkForRuntimeUpdates, configureDesktopUpdater, ensureLatestRuntime, getDesktopUpdateState, getDesktopRuntimeUpdateState, installDownloadedDesktopUpdate, isDesktopUpdateInstalling, markDesktopRuntimeRestartFailed, markDesktopRuntimeRestarting, markDesktopRuntimeRunning, subscribeDesktopRuntimeUpdateState, subscribeDesktopUpdateState, } from './updater.js';
19
- import { resolvePackagedRuntime, rollbackDownloadedRuntime, } from './runtime.js';
17
+ import { checkForDesktopUpdates, configureDesktopUpdater, getDesktopUpdateState, installDownloadedDesktopUpdate, isDesktopUpdateInstalling, subscribeDesktopUpdateState, } from './updater.js';
20
18
  import { isExternalLinkStagingUrl, isSafeExternalUrl } from './externalLinks.js';
21
19
  import { shouldThrottleDesktopRenderer } from './windowPolicy.js';
22
- import { checkConnectedServiceRuntime, getConnectedServiceRuntimeState, restartConnectedServiceRuntime, } from './connectedServiceRuntime.js';
23
- import { isOwnedDesktopRuntimeTarget } from './runtimeTarget.js';
24
- import { canReadLocalInvite } from './localInviteGuard.js';
25
20
  import { serviceDocumentNeedsReload } from './serviceWindowRecovery.js';
26
21
  import { CertificateTrustRequests, resolveServiceCertificateTrust, canOfferCertificateTrust, downloadCertificateAuthority, isCertificateTrustError, isLocalNetworkHostname, matchManagedLocalCertificate, } from './certificateTrust.js';
27
22
  const execFileAsync = promisify(execFile);
@@ -30,13 +25,10 @@ const projectRoot = path.resolve(currentDir, '..');
30
25
  const termdockDir = path.join(os.homedir(), '.termdock');
31
26
  const desktopConfigPath = path.join(termdockDir, 'desktop.json');
32
27
  const serverStatePath = path.join(termdockDir, 'server.json');
33
- const desktopRuntimeOwnerSocketPath = path.join(termdockDir, 'desktop-runtime-owner.sock');
34
- let federationRelayProcess = null;
35
28
  const DEFAULT_LOCAL_URL = 'http://localhost:9834';
36
29
  const PROTOCOL_VERSION = 1;
37
30
  const HEALTH_TIMEOUT_MS = 3_500;
38
31
  const SERVICE_RECOVERY_PROBE_TIMEOUT_MS = 5_000;
39
- const START_TIMEOUT_MS = 90_000;
40
32
  const RESTORE_LOAD_TIMEOUT_MS = 15_000;
41
33
  const localServiceCertificatePath = path.join(termdockDir, 'certs', 'termdock-local.pem');
42
34
  const sessionTrustedCertificateTargets = new Set();
@@ -82,9 +74,6 @@ let menuBarStatus = null;
82
74
  let menuBarStatusWidth = 0;
83
75
  let floatingWidgetWindow = null;
84
76
  let floatingPositionTimer = null;
85
- let desktopRuntimeOwnerServer = null;
86
- let connectedServiceRuntimePollTimer = null;
87
- let connectedServiceRuntimePollInFlight = false;
88
77
  let isQuitting = false;
89
78
  const FLOATING_WIDGET_WIDTHS = [64, 108, 152];
90
79
  const FLOATING_WIDGET_HEIGHT = 40;
@@ -813,7 +802,6 @@ async function probeServiceWithCertificateAuthority(rawUrl, certificateAuthority
813
802
  protocolVersion: typeof metadata?.protocolVersion === 'number'
814
803
  ? metadata.protocolVersion
815
804
  : undefined,
816
- desktopManaged: metadata?.desktopManaged === true,
817
805
  };
818
806
  }
819
807
  }
@@ -857,7 +845,6 @@ async function probeService(rawUrl) {
857
845
  protocolVersion: typeof metadata.protocolVersion === 'number'
858
846
  ? metadata.protocolVersion
859
847
  : undefined,
860
- desktopManaged: metadata.desktopManaged === true,
861
848
  };
862
849
  }
863
850
  }
@@ -934,477 +921,20 @@ async function getLocalServiceStatus() {
934
921
  const probe = await probeService(stateUrl(state));
935
922
  return { running: probe.ok, state, probe };
936
923
  }
937
- function runtimePaths() {
938
- if (app.isPackaged) {
939
- const selected = resolvePackagedRuntime({
940
- appVersion: app.getVersion(),
941
- resourcesPath: process.resourcesPath,
942
- });
943
- return {
944
- ...selected,
945
- node: path.join(process.resourcesPath, 'runtime', 'bin', 'node'),
946
- launcher: path.join(process.resourcesPath, 'cli', 'td'),
947
- toolchainBin: path.join(process.resourcesPath, 'toolchain', 'bin'),
948
- };
949
- }
950
- return {
951
- node: process.env.TERMDOCK_NODE_BIN || 'node',
952
- serverRoot: projectRoot,
953
- cli: path.join(projectRoot, 'dist', 'server', 'cli.js'),
954
- launcher: path.join(projectRoot, 'desktop', 'cli', 'td'),
955
- toolchainBin: path.join(projectRoot, '.desktop-runtime', 'toolchain', 'bin'),
956
- version: app.getVersion(),
957
- source: 'development',
958
- };
959
- }
960
- /** Explicit opt-in only; all routing and reconnect behavior lives in the shared CLI. */
961
- function startConfiguredFederationRelay() {
962
- const configPath = path.join(termdockDir, 'federation', 'relay.json');
963
- if (federationRelayProcess || !fs.existsSync(configPath))
964
- return;
965
- let logFd;
966
- try {
967
- const runtime = runtimePaths();
968
- if (!fs.existsSync(runtime.cli))
969
- throw new Error('Runtime unavailable');
970
- const logPath = path.join(termdockDir, 'federation', 'relay.log');
971
- logFd = fs.openSync(logPath, 'a', 0o600);
972
- fs.fchmodSync(logFd, 0o600);
973
- const child = spawn(runtime.node, [runtime.cli, '--federation-relay', configPath], {
974
- detached: false,
975
- stdio: ['ignore', logFd, logFd],
976
- env: desktopRuntimeEnv(runtime),
977
- });
978
- federationRelayProcess = child;
979
- child.once('error', () => {
980
- if (federationRelayProcess === child)
981
- federationRelayProcess = null;
982
- console.error('[federation] Configured relay failed to start; inspect the private relay log.');
983
- });
984
- child.once('exit', () => { if (federationRelayProcess === child)
985
- federationRelayProcess = null; });
986
- }
987
- catch {
988
- console.error('[federation] Unable to start configured relay; verify the runtime and private configuration.');
989
- }
990
- finally {
991
- if (logFd !== undefined)
992
- fs.closeSync(logFd);
993
- }
994
- }
995
- async function executableVersion(executable) {
996
- try {
997
- const { stdout } = await execFileAsync(executable, ['--version'], {
998
- timeout: 5_000,
999
- maxBuffer: 128 * 1024,
1000
- });
1001
- return stdout.trim().split(/\s+/).at(-1) || null;
1002
- }
1003
- catch {
1004
- return null;
1005
- }
1006
- }
1007
- async function discoverCliInstallations() {
1008
- const candidates = new Set();
1009
- try {
1010
- const { stdout } = await execFileAsync('/bin/zsh', ['-lic', 'whence -pa td termdock'], {
1011
- timeout: 5_000,
1012
- maxBuffer: 128 * 1024,
1013
- });
1014
- for (const line of stdout.split('\n')) {
1015
- const candidate = line.trim();
1016
- if (candidate.startsWith('/'))
1017
- candidates.add(candidate);
1018
- }
1019
- }
1020
- catch {
1021
- // A clean machine may not have any CLI entry yet.
1022
- }
1023
- for (const candidate of ['/usr/local/bin/td', '/opt/homebrew/bin/td']) {
1024
- if (fs.existsSync(candidate))
1025
- candidates.add(candidate);
1026
- }
1027
- const bundledLauncher = runtimePaths().launcher;
1028
- return Promise.all([...candidates].map(async (candidate) => {
1029
- let resolved = candidate;
1030
- try {
1031
- resolved = fs.realpathSync(candidate);
1032
- }
1033
- catch {
1034
- // Keep the visible path for a broken symlink so the repair UI can show it.
1035
- }
1036
- return {
1037
- path: candidate,
1038
- version: await executableVersion(candidate),
1039
- bundled: resolved === bundledLauncher,
1040
- };
1041
- }));
1042
- }
1043
- async function bundledCliVersion() {
1044
- const runtime = runtimePaths();
1045
- try {
1046
- const { stdout } = await execFileAsync(runtime.node, [runtime.cli, '--version'], {
1047
- timeout: 5_000,
1048
- maxBuffer: 128 * 1024,
1049
- env: desktopRuntimeEnv(runtime),
1050
- });
1051
- return stdout.trim() || app.getVersion();
1052
- }
1053
- catch {
1054
- return app.getVersion();
1055
- }
1056
- }
1057
924
  async function snapshot() {
1058
925
  const config = readDesktopConfig();
1059
- const [localService, cliInstallations, cliVersion] = await Promise.all([
1060
- getLocalServiceStatus(),
1061
- discoverCliInstallations(),
1062
- bundledCliVersion(),
1063
- ]);
1064
926
  return {
1065
927
  appVersion: app.getVersion(),
1066
- runtimeVersion: cliVersion,
1067
- packaged: app.isPackaged,
1068
- bundledCliVersion: cliVersion,
1069
- cliInstallations,
1070
- localService,
928
+ localService: await getLocalServiceStatus(),
1071
929
  connections: config.connections,
1072
930
  lastConnectionUrl: config.lastConnectionUrl,
1073
931
  desktopPreferences: config.desktopPreferences,
1074
932
  };
1075
933
  }
1076
- function desktopRuntimeEnv(runtime = runtimePaths()) {
1077
- const currentPath = process.env.PATH ?? '/usr/bin:/bin:/usr/sbin:/sbin';
1078
- const userBinPaths = [
1079
- path.join(os.homedir(), '.local', 'bin'),
1080
- path.join(os.homedir(), 'bin'),
1081
- path.join(os.homedir(), '.npm-global', 'bin'),
1082
- ];
1083
- return {
1084
- ...process.env,
1085
- LANG: process.env.LANG || 'en_US.UTF-8',
1086
- LC_CTYPE: process.env.LC_CTYPE || process.env.LANG || 'en_US.UTF-8',
1087
- PATH: [runtime.toolchainBin, ...userBinPaths, '/opt/homebrew/bin', '/usr/local/bin', currentPath]
1088
- .filter(Boolean)
1089
- .join(path.delimiter),
1090
- TERMDOCK_DESKTOP: '1',
1091
- TERMDOCK_DESKTOP_OWNER_SOCKET: desktopRuntimeOwnerSocketPath,
1092
- TERMDOCK_BUNDLED_RUNTIME: app.isPackaged ? '1' : '0',
1093
- TERMDOCK_VERSION: runtime.version,
1094
- TERMDOCK_DESKTOP_SHELL_VERSION: app.getVersion(),
1095
- TMUX_BIN: fs.existsSync(path.join(runtime.toolchainBin, 'tmux'))
1096
- ? path.join(runtime.toolchainBin, 'tmux')
1097
- : process.env.TMUX_BIN,
1098
- };
1099
- }
1100
- async function waitForLocalService(childPid) {
1101
- const deadline = Date.now() + START_TIMEOUT_MS;
1102
- let lastProbe = { ok: false, url: DEFAULT_LOCAL_URL, error: '服务尚未启动' };
1103
- while (Date.now() < deadline) {
1104
- const state = readServerState();
1105
- const url = state ? stateUrl(state) : DEFAULT_LOCAL_URL;
1106
- lastProbe = await probeService(url);
1107
- if (lastProbe.ok)
1108
- return lastProbe;
1109
- if (childPid && !isProcessRunning(childPid)) {
1110
- return { ...lastProbe, error: '服务进程在健康检查通过前退出' };
1111
- }
1112
- await new Promise((resolve) => setTimeout(resolve, 300));
1113
- }
1114
- return lastProbe;
1115
- }
1116
- async function ensureTmuxUtf8Environment(runtime) {
1117
- const tmux = path.join(runtime.toolchainBin, 'tmux');
1118
- if (!fs.existsSync(tmux))
1119
- return;
1120
- const locale = desktopRuntimeEnv(runtime).LANG || 'en_US.UTF-8';
1121
- for (const name of ['LANG', 'LC_CTYPE']) {
1122
- try {
1123
- await execFileAsync(tmux, ['set-environment', '-g', name, locale], {
1124
- timeout: 5_000,
1125
- maxBuffer: 128 * 1024,
1126
- env: desktopRuntimeEnv(runtime),
1127
- });
1128
- }
1129
- catch {
1130
- // tmux is optional and may not have a running server yet.
1131
- }
1132
- }
1133
- }
1134
- async function confirmAndStopExisting(status) {
1135
- if (!status.state)
1136
- return true;
1137
- const version = status.probe?.version ? `版本:${status.probe.version}\n` : '';
1138
- const result = await showDesktopMessageBox({
1139
- type: 'warning',
1140
- title: '接管本机 Termdock 服务',
1141
- message: '检测到正在运行的 Termdock 服务',
1142
- detail: `${version}地址:${stateUrl(status.state)}\nPID:${status.state.pid}\n\n停止后将由桌面版使用同一个 ~/.termdock 重新启动。tmux 会话不会被删除。`,
1143
- buttons: ['连接现有服务', '停止并由桌面版接管', '取消'],
1144
- defaultId: 0,
1145
- cancelId: 2,
1146
- });
1147
- if (result.response === 0) {
1148
- await connectWindow(stateUrl(status.state));
1149
- return false;
1150
- }
1151
- if (result.response !== 1)
1152
- return false;
1153
- if (!isProcessRunning(status.state.pid))
1154
- return true;
1155
- process.kill(status.state.pid, 'SIGTERM');
1156
- const deadline = Date.now() + 8_000;
1157
- while (Date.now() < deadline && isProcessRunning(status.state.pid)) {
1158
- await new Promise((resolve) => setTimeout(resolve, 150));
1159
- }
1160
- if (isProcessRunning(status.state.pid)) {
1161
- throw new Error(`旧服务 PID ${status.state.pid} 未能在超时时间内退出`);
1162
- }
1163
- try {
1164
- const latest = readServerState();
1165
- if (latest?.pid === status.state.pid)
1166
- fs.rmSync(serverStatePath, { force: true });
1167
- }
1168
- catch {
1169
- // The exiting CLI normally removes the state file itself.
1170
- }
1171
- return true;
1172
- }
1173
- async function startLocalService() {
1174
- const existing = await getLocalServiceStatus();
1175
- if (existing.running) {
1176
- const shouldStart = await confirmAndStopExisting(existing);
1177
- if (!shouldStart) {
1178
- return existing.probe ?? { ok: true, url: stateUrl(existing.state) };
1179
- }
1180
- }
1181
- if (app.isPackaged) {
1182
- try {
1183
- await ensureLatestRuntime();
1184
- }
1185
- catch (error) {
1186
- console.error('[desktop-runtime] update check failed; using the current runtime', error);
1187
- }
1188
- }
1189
- let runtime = runtimePaths();
1190
- if (!fs.existsSync(runtime.cli)) {
1191
- throw new Error('未找到 Termdock 服务端构建,请先运行 npm run build');
1192
- }
1193
- if (app.isPackaged && !fs.existsSync(runtime.node)) {
1194
- throw new Error('安装包缺少内嵌 Node Runtime');
1195
- }
1196
- const startRuntime = async (selected) => {
1197
- fs.mkdirSync(termdockDir, { recursive: true, mode: 0o700 });
1198
- const logPath = path.join(termdockDir, 'server.log');
1199
- const logFd = fs.openSync(logPath, 'a');
1200
- const child = spawn(selected.node, [
1201
- selected.cli,
1202
- '--foreground',
1203
- '--host',
1204
- '0.0.0.0',
1205
- '--port',
1206
- '9834',
1207
- ], {
1208
- detached: true,
1209
- stdio: ['ignore', logFd, logFd],
1210
- env: desktopRuntimeEnv(selected),
1211
- });
1212
- fs.closeSync(logFd);
1213
- child.unref();
1214
- return waitForLocalService(child.pid);
1215
- };
1216
- let probe = await startRuntime(runtime);
1217
- if (!probe.ok && app.isPackaged && runtime.source === 'downloaded') {
1218
- if (rollbackDownloadedRuntime({
1219
- appVersion: app.getVersion(),
1220
- resourcesPath: process.resourcesPath,
1221
- }, runtime.version)) {
1222
- console.error(`[desktop-runtime] ${runtime.version} failed to start; rolled back`);
1223
- runtime = runtimePaths();
1224
- probe = await startRuntime(runtime);
1225
- }
1226
- }
1227
- if (!probe.ok) {
1228
- throw new Error(`桌面版服务启动失败:${probe.error ?? '未知错误'}。日志:${path.join(termdockDir, 'server.log')}`);
1229
- }
1230
- await ensureTmuxUtf8Environment(runtime);
1231
- markDesktopRuntimeRunning(runtime.version);
1232
- await connectWindow(probe.url);
1233
- return probe;
1234
- }
1235
- async function restartDesktopManagedRuntime() {
1236
- const status = await getLocalServiceStatus();
1237
- const update = getDesktopRuntimeUpdateState();
1238
- if (!status.running || status.probe?.desktopManaged !== true) {
1239
- throw new Error('当前服务不是由这个 Termdock Desktop 宿主管理的。');
1240
- }
1241
- if (update.status !== 'ready' || !update.latestVersion) {
1242
- throw new Error('没有等待重启的 Runtime 更新。');
1243
- }
1244
- markDesktopRuntimeRestarting();
1245
- const restartTimer = setTimeout(() => {
1246
- void (async () => {
1247
- const pid = status.state?.pid;
1248
- if (!pid || !isProcessRunning(pid)) {
1249
- throw new Error('本机服务状态已失效,请重试。');
1250
- }
1251
- process.kill(pid, 'SIGTERM');
1252
- const deadline = Date.now() + 15_000;
1253
- while (isProcessRunning(pid) && Date.now() < deadline) {
1254
- await new Promise((resolve) => setTimeout(resolve, 150));
1255
- }
1256
- if (isProcessRunning(pid))
1257
- throw new Error(`本机服务 PID ${pid} 未能正常退出。`);
1258
- const latest = readServerState();
1259
- if (latest?.pid === pid)
1260
- fs.rmSync(serverStatePath, { force: true });
1261
- await startLocalService();
1262
- })().catch((error) => {
1263
- markDesktopRuntimeRestartFailed(error);
1264
- console.error('[desktop-runtime] restart failed', error);
1265
- });
1266
- }, 250);
1267
- restartTimer.unref();
1268
- return getDesktopRuntimeUpdateState();
1269
- }
1270
- function isOwnedDesktopRuntimeWindow(window, status) {
1271
- const origin = windowServiceOrigins.get(window);
1272
- if (!origin || !status.running || status.probe?.desktopManaged !== true || !status.state)
1273
- return false;
1274
- const localAddresses = new Set(Object.values(os.networkInterfaces())
1275
- .flatMap((addresses) => addresses?.map((address) => address.address.toLowerCase()) ?? []));
1276
- return isOwnedDesktopRuntimeTarget({
1277
- origin,
1278
- servicePort: status.state.port,
1279
- desktopManaged: true,
1280
- localAddresses,
1281
- });
1282
- }
1283
- async function routeRuntimeOperationForWindow(webContents, desktopOperation, serviceOperation) {
1284
- const sourceWindow = BrowserWindow.fromWebContents(webContents);
1285
- if (!sourceWindow || !windowServiceOrigins.has(sourceWindow)) {
1286
- throw new Error('只能从已连接的 Termdock 服务窗口操作 Runtime。');
1287
- }
1288
- const status = await getLocalServiceStatus();
1289
- return isOwnedDesktopRuntimeWindow(sourceWindow, status)
1290
- ? desktopOperation()
1291
- : serviceOperation();
1292
- }
1293
- function startConnectedServiceRuntimePolling() {
1294
- if (connectedServiceRuntimePollTimer)
1295
- return;
1296
- const poll = async () => {
1297
- if (connectedServiceRuntimePollInFlight)
1298
- return;
1299
- connectedServiceRuntimePollInFlight = true;
1300
- try {
1301
- const status = await getLocalServiceStatus();
1302
- await Promise.all(BrowserWindow.getAllWindows().map(async (window) => {
1303
- if (window.isDestroyed() || !windowServiceOrigins.has(window))
1304
- return;
1305
- if (isOwnedDesktopRuntimeWindow(window, status))
1306
- return;
1307
- try {
1308
- const state = await getConnectedServiceRuntimeState(window.webContents);
1309
- if (!window.isDestroyed()) {
1310
- window.webContents.send('desktop:runtime-update-state-changed', state);
1311
- }
1312
- }
1313
- catch {
1314
- // A disconnected or older service will be retried on the next poll.
1315
- }
1316
- }));
1317
- }
1318
- finally {
1319
- connectedServiceRuntimePollInFlight = false;
1320
- }
1321
- };
1322
- void poll();
1323
- connectedServiceRuntimePollTimer = setInterval(() => void poll(), 2_000);
1324
- connectedServiceRuntimePollTimer.unref();
1325
- }
1326
- function writeRuntimeOwnerResponse(response, statusCode, payload) {
1327
- response.writeHead(statusCode, { 'content-type': 'application/json; charset=utf-8' });
1328
- response.end(JSON.stringify(payload));
1329
- }
1330
- async function startDesktopRuntimeOwnerServer() {
1331
- if (desktopRuntimeOwnerServer)
1332
- return;
1333
- fs.mkdirSync(termdockDir, { recursive: true, mode: 0o700 });
1334
- fs.rmSync(desktopRuntimeOwnerSocketPath, { force: true });
1335
- const server = http.createServer((request, response) => {
1336
- void (async () => {
1337
- if (request.method === 'GET' && request.url === '/runtime-update') {
1338
- writeRuntimeOwnerResponse(response, 200, getDesktopRuntimeUpdateState());
1339
- return;
1340
- }
1341
- if (request.method === 'POST' && request.url === '/runtime-update/check') {
1342
- writeRuntimeOwnerResponse(response, 200, await checkForRuntimeUpdates());
1343
- return;
1344
- }
1345
- if (request.method === 'POST' && request.url === '/runtime-update/restart') {
1346
- writeRuntimeOwnerResponse(response, 202, await restartDesktopManagedRuntime());
1347
- return;
1348
- }
1349
- writeRuntimeOwnerResponse(response, 404, { error: '未知的 Desktop Runtime 操作。' });
1350
- })().catch((error) => {
1351
- writeRuntimeOwnerResponse(response, 409, {
1352
- error: error instanceof Error ? error.message : String(error),
1353
- });
1354
- });
1355
- });
1356
- await new Promise((resolve, reject) => {
1357
- server.once('error', reject);
1358
- server.listen(desktopRuntimeOwnerSocketPath, () => {
1359
- server.off('error', reject);
1360
- resolve();
1361
- });
1362
- });
1363
- server.on('error', (error) => {
1364
- console.error('[desktop-runtime] owner socket failed', error);
1365
- });
1366
- fs.chmodSync(desktopRuntimeOwnerSocketPath, 0o600);
1367
- desktopRuntimeOwnerServer = server;
1368
- }
1369
- function shellQuote(value) {
1370
- return `'${value.replace(/'/g, `'\\''`)}'`;
1371
- }
1372
- function appleScriptQuote(value) {
1373
- return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
1374
- }
1375
- async function installCli() {
1376
- if (!app.isPackaged) {
1377
- throw new Error('CLI 一键安装只在打包后的 Termdock.app 中可用');
1378
- }
1379
- const runtime = runtimePaths();
1380
- if (!fs.existsSync(runtime.launcher)) {
1381
- throw new Error('安装包中缺少 CLI 启动器');
1382
- }
1383
- const current = await discoverCliInstallations();
1384
- const detailLines = current.length > 0
1385
- ? current.map((entry) => `${entry.path}(${entry.version ?? '版本未知'})`)
1386
- : ['未检测到已有 td/termdock 命令'];
1387
- const confirmation = await showDesktopMessageBox({
1388
- type: 'question',
1389
- title: '安装 Termdock CLI',
1390
- message: '将桌面版内嵌 CLI 安装为 td 和 termdock',
1391
- detail: `${detailLines.join('\n')}\n\n目标目录:/usr/local/bin\n已有同名入口只会在你确认后替换。`,
1392
- buttons: ['安装', '取消'],
1393
- defaultId: 0,
1394
- cancelId: 1,
1395
- });
1396
- if (confirmation.response !== 0)
1397
- return snapshot();
1398
- const command = [
1399
- 'mkdir -p /usr/local/bin',
1400
- `ln -sfn ${shellQuote(runtime.launcher)} /usr/local/bin/td`,
1401
- `ln -sfn ${shellQuote(runtime.launcher)} /usr/local/bin/termdock`,
1402
- ].join(' && ');
1403
- await execFileAsync('/usr/bin/osascript', [
1404
- '-e',
1405
- `do shell script "${appleScriptQuote(command)}" with administrator privileges`,
1406
- ], { timeout: 120_000, maxBuffer: 256 * 1024 });
1407
- return snapshot();
934
+ function bundledClientDist() {
935
+ return app.isPackaged
936
+ ? path.join(process.resourcesPath, 'client')
937
+ : path.join(projectRoot, 'dist', 'client');
1408
938
  }
1409
939
  async function connectWindow(rawUrl, options = {}) {
1410
940
  if (options.focus !== false) {
@@ -1486,7 +1016,7 @@ async function connectWindow(rawUrl, options = {}) {
1486
1016
  if (known?.targetPeerId)
1487
1017
  serviceWindowPeers.set(workspaceWindow, known.targetPeerId);
1488
1018
  try {
1489
- await prepareServiceFrontend(workspaceWindow.webContents.session, key, frontendSource, () => path.join(runtimePaths().serverRoot, 'dist', 'client'));
1019
+ await prepareServiceFrontend(workspaceWindow.webContents.session, key, frontendSource, bundledClientDist);
1490
1020
  }
1491
1021
  catch (error) {
1492
1022
  workspaceWindow.destroy();
@@ -1661,14 +1191,16 @@ function createDesktopWindow(options) {
1661
1191
  : null;
1662
1192
  if (serviceSession)
1663
1193
  installCertificateVerifyProcedure(serviceSession, options?.serviceOrigin);
1194
+ // macOS clips the old fixed width on smaller displays but leaves the fixed
1195
+ // height untouched. Size workspace windows to the active display's usable
1196
+ // area before loading, including restored windows shown without focus.
1197
+ const workspaceBounds = options && process.platform === 'darwin'
1198
+ ? screen.getDisplayNearestPoint(screen.getCursorScreenPoint()).workArea
1199
+ : { width: options ? 1500 : 1280, height: 820 };
1664
1200
  const window = new BrowserWindow({
1665
1201
  title: options ? `Termdock — ${options.label}` : 'Termdock — 连接中心',
1666
1202
  show: false,
1667
- // The web workspace enables its persistent right inspector at 1440px.
1668
- // Open service windows above that breakpoint so the visible pin action
1669
- // cannot write a pinned state that the initial layout refuses to render.
1670
- width: options ? 1500 : 1280,
1671
- height: 820,
1203
+ ...workspaceBounds,
1672
1204
  minWidth: 760,
1673
1205
  minHeight: 520,
1674
1206
  backgroundColor: 'rgb(28, 27, 26)',
@@ -2049,43 +1581,6 @@ function installIpcHandlers() {
2049
1581
  broadcastServiceActivity();
2050
1582
  return true;
2051
1583
  });
2052
- ipcMain.handle('desktop:local-invite', async (event) => {
2053
- const sourceWindow = BrowserWindow.fromWebContents(event.sender);
2054
- if (!sourceWindow || sourceWindow.isDestroyed() || event.senderFrame !== event.sender.mainFrame)
2055
- return null;
2056
- const registeredOrigin = windowServiceOrigins.get(sourceWindow);
2057
- const initialUrl = event.sender.getURL();
2058
- // First reject remote/preview callers before any asynchronous local probing.
2059
- let callerPort;
2060
- try {
2061
- const url = new URL(initialUrl);
2062
- callerPort = Number(url.port || (url.protocol === 'https:' ? 443 : 80));
2063
- }
2064
- catch {
2065
- return null;
2066
- }
2067
- if (!canReadLocalInvite({ registeredOrigin, currentUrl: initialUrl, mainFrame: true, running: true, desktopManaged: true, servicePort: callerPort }))
2068
- return null;
2069
- const status = await getLocalServiceStatus().catch(() => null);
2070
- if (!status || !status.state || sourceWindow.isDestroyed() || event.sender.isDestroyed()
2071
- || event.senderFrame !== event.sender.mainFrame || event.sender.getURL() !== initialUrl
2072
- || windowServiceOrigins.get(sourceWindow) !== registeredOrigin
2073
- || !canReadLocalInvite({ registeredOrigin, currentUrl: event.sender.getURL(), mainFrame: true,
2074
- running: status.running, desktopManaged: status.probe?.desktopManaged === true, servicePort: status.state.port })
2075
- || !isOwnedDesktopRuntimeWindow(sourceWindow, status))
2076
- return null;
2077
- try {
2078
- const data = JSON.parse(fs.readFileSync(path.join(termdockDir, 'federation', 'pairing.json'), 'utf8'));
2079
- if (typeof data.serviceId !== 'string' || !/^12D3KooW[1-9A-HJ-NP-Za-km-z]{44}$/.test(data.serviceId)
2080
- || typeof data.pairingCode !== 'string' || !/^[A-Za-z0-9_-]{32,128}$/.test(data.pairingCode))
2081
- return null;
2082
- return { url: registeredOrigin, targetPeerId: data.serviceId, pairingCode: data.pairingCode, serviceName: '本机 Termdock' };
2083
- }
2084
- catch {
2085
- return null;
2086
- }
2087
- });
2088
- ipcMain.handle('desktop:start-local', () => startLocalService());
2089
1584
  ipcMain.handle('desktop:update-preferences', async (_event, preferences) => {
2090
1585
  updateDesktopPreferences({
2091
1586
  ...(typeof preferences?.menuBarStatusEnabled === 'boolean'
@@ -2116,13 +1611,9 @@ function installIpcHandlers() {
2116
1611
  updateDesktopPreferences({ floatingWidgetEnabled: false });
2117
1612
  return snapshot();
2118
1613
  });
2119
- ipcMain.handle('desktop:install-cli', () => installCli());
2120
1614
  ipcMain.handle('desktop:update-state', () => getDesktopUpdateState());
2121
1615
  ipcMain.handle('desktop:check-update', () => checkForDesktopUpdates());
2122
1616
  ipcMain.handle('desktop:install-update', () => installDownloadedDesktopUpdate());
2123
- ipcMain.handle('desktop:runtime-update-state', (event) => routeRuntimeOperationForWindow(event.sender, () => getDesktopRuntimeUpdateState(), () => getConnectedServiceRuntimeState(event.sender)));
2124
- ipcMain.handle('desktop:check-runtime-update', (event) => routeRuntimeOperationForWindow(event.sender, () => checkForRuntimeUpdates(), () => checkConnectedServiceRuntime(event.sender)));
2125
- ipcMain.handle('desktop:restart-runtime', (event) => routeRuntimeOperationForWindow(event.sender, () => restartDesktopManagedRuntime(), () => restartConnectedServiceRuntime(event.sender)));
2126
1617
  ipcMain.handle('desktop:show-connection-center', () => showConnectionCenter());
2127
1618
  ipcMain.handle('desktop:reveal-data-directory', async () => {
2128
1619
  fs.mkdirSync(termdockDir, { recursive: true, mode: 0o700 });
@@ -2266,16 +1757,6 @@ function installMenu() {
2266
1757
  click: () => void showConnectionCenter(),
2267
1758
  },
2268
1759
  { label: '打开服务', submenu: serviceItems },
2269
- {
2270
- label: '安装或修复 CLI…',
2271
- click: () => void installCli().catch((error) => {
2272
- void showDesktopMessageBox({
2273
- type: 'error',
2274
- title: 'CLI 安装失败',
2275
- message: error instanceof Error ? error.message : String(error),
2276
- });
2277
- }),
2278
- },
2279
1760
  {
2280
1761
  label: '检查更新…',
2281
1762
  click: () => void checkForDesktopUpdates({ presentNativeDialogs: true }),
@@ -2394,7 +1875,6 @@ function installMenu() {
2394
1875
  app.whenReady().then(async () => {
2395
1876
  triggerLocalNetworkPermission();
2396
1877
  configureLocalServiceCertificateTrust();
2397
- await startDesktopRuntimeOwnerServer();
2398
1878
  installIpcHandlers();
2399
1879
  installMenu();
2400
1880
  refreshDesktopStatusSurfaces();
@@ -2412,22 +1892,11 @@ app.whenReady().then(async () => {
2412
1892
  window.webContents.send('desktop:update-state-changed', state);
2413
1893
  }
2414
1894
  });
2415
- subscribeDesktopRuntimeUpdateState((state) => {
2416
- void getLocalServiceStatus().then((status) => {
2417
- for (const window of BrowserWindow.getAllWindows()) {
2418
- if (!window.isDestroyed() && isOwnedDesktopRuntimeWindow(window, status)) {
2419
- window.webContents.send('desktop:runtime-update-state-changed', state);
2420
- }
2421
- }
2422
- });
2423
- });
2424
- startConnectedServiceRuntimePolling();
2425
- startConfiguredFederationRelay();
2426
1895
  const startupConfig = readDesktopConfig();
2427
1896
  const restoreUrls = startupConfig.openConnectionUrls;
2428
1897
  startupRestoreActive = true;
2429
1898
  const startupProgressTimer = setTimeout(() => {
2430
- void showStartupProgress('正在检查本机 Runtime 和已保存连接…');
1899
+ void showStartupProgress('正在检查已保存连接…');
2431
1900
  }, 350);
2432
1901
  startupProgressTimer.unref();
2433
1902
  let completedRestores = 0;
@@ -2476,19 +1945,9 @@ app.whenReady().then(async () => {
2476
1945
  });
2477
1946
  app.on('window-all-closed', () => {
2478
1947
  // Keep the macOS application lifecycle conventional: closing the last
2479
- // window keeps the app available in the Dock, while the detached Termdock
2480
- // service continues independently.
1948
+ // window keeps the app available in the Dock.
2481
1949
  });
2482
1950
  app.on('before-quit', () => {
2483
1951
  isQuitting = true;
2484
- federationRelayProcess?.kill('SIGTERM');
2485
- federationRelayProcess = null;
2486
- desktopRuntimeOwnerServer?.close();
2487
- desktopRuntimeOwnerServer = null;
2488
- if (connectedServiceRuntimePollTimer)
2489
- clearInterval(connectedServiceRuntimePollTimer);
2490
- connectedServiceRuntimePollTimer = null;
2491
- connectedServiceRuntimePollInFlight = false;
2492
- fs.rmSync(desktopRuntimeOwnerSocketPath, { force: true });
2493
1952
  });
2494
1953
  export { PROTOCOL_VERSION };