termdock 1.4.184 → 1.4.186

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 (324) hide show
  1. package/.desktop-dist/main.js +15 -0
  2. package/dist/client/assets/{App-QbHtW5ZR.js → App-C2mwGy6R.js} +33 -33
  3. package/dist/client/assets/App-C2mwGy6R.js.br +0 -0
  4. package/dist/client/assets/App-C2mwGy6R.js.gz +0 -0
  5. package/dist/client/assets/{ChangeWalkthroughPanel-CKBv-8OF.js → ChangeWalkthroughPanel-GUWGKnD8.js} +2 -2
  6. package/dist/client/assets/ChangeWalkthroughPanel-GUWGKnD8.js.br +0 -0
  7. package/dist/client/assets/ChangeWalkthroughPanel-GUWGKnD8.js.gz +0 -0
  8. package/dist/client/assets/{DagPlayground-D23apWqB.js → DagPlayground-COZ0Op26.js} +1 -1
  9. package/dist/client/assets/DagPlayground-COZ0Op26.js.br +0 -0
  10. package/dist/client/assets/DagPlayground-COZ0Op26.js.gz +0 -0
  11. package/dist/client/assets/{DiffLab-BG57Q8oJ.js → DiffLab-RJHQvQAX.js} +1 -1
  12. package/dist/client/assets/DiffLab-RJHQvQAX.js.br +0 -0
  13. package/dist/client/assets/DiffLab-RJHQvQAX.js.gz +0 -0
  14. package/dist/client/assets/{DiffReview-BaYWAjWk.js → DiffReview-CmTEd0iK.js} +1 -1
  15. package/dist/client/assets/DiffReview-CmTEd0iK.js.br +0 -0
  16. package/dist/client/assets/DiffReview-CmTEd0iK.js.gz +0 -0
  17. package/dist/client/assets/{DiffReviewLab-BMRkWJpo.js → DiffReviewLab-Dk2pyW7m.js} +1 -1
  18. package/dist/client/assets/DiffReviewLab-Dk2pyW7m.js.br +0 -0
  19. package/dist/client/assets/DiffReviewLab-Dk2pyW7m.js.gz +0 -0
  20. package/dist/client/assets/{DiffViewer-DmPGE-p1.js → DiffViewer-DCaJDgM3.js} +1 -1
  21. package/dist/client/assets/DiffViewer-DCaJDgM3.js.br +0 -0
  22. package/dist/client/assets/DiffViewer-DCaJDgM3.js.gz +0 -0
  23. package/dist/client/assets/{ModelPreview-DjdRuKdU.js → ModelPreview-C_vapzZ3.js} +1 -1
  24. package/dist/client/assets/ModelPreview-C_vapzZ3.js.br +0 -0
  25. package/dist/client/assets/ModelPreview-C_vapzZ3.js.gz +0 -0
  26. package/dist/client/assets/{RightSidebar-CLfYAwjH.js → RightSidebar-DP8E03Z5.js} +4 -4
  27. package/dist/client/assets/RightSidebar-DP8E03Z5.js.br +0 -0
  28. package/dist/client/assets/RightSidebar-DP8E03Z5.js.gz +0 -0
  29. package/dist/client/assets/{abnfDiagram-VCTEODGH-BKfhcqzo.js → abnfDiagram-VCTEODGH-C4I53K_x.js} +1 -1
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-C4I53K_x.js.br +0 -0
  31. package/dist/client/assets/abnfDiagram-VCTEODGH-C4I53K_x.js.gz +0 -0
  32. package/dist/client/assets/app-Jc82YAYK.js +34 -0
  33. package/dist/client/assets/app-Jc82YAYK.js.br +0 -0
  34. package/dist/client/assets/app-Jc82YAYK.js.gz +0 -0
  35. package/dist/client/assets/{arc-B2R02Jyo.js → arc-CyZMZ98J.js} +1 -1
  36. package/dist/client/assets/arc-CyZMZ98J.js.br +0 -0
  37. package/dist/client/assets/arc-CyZMZ98J.js.gz +0 -0
  38. package/dist/client/assets/{architectureDiagram-5GKGNRK7-C_EdNLCI.js → architectureDiagram-5GKGNRK7-DWvpfoqD.js} +1 -1
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-DWvpfoqD.js.br +0 -0
  40. package/dist/client/assets/architectureDiagram-5GKGNRK7-DWvpfoqD.js.gz +0 -0
  41. package/dist/client/assets/{blockDiagram-I7D4REHJ-CZkLLWFL.js → blockDiagram-I7D4REHJ-C0vryo85.js} +1 -1
  42. package/dist/client/assets/blockDiagram-I7D4REHJ-C0vryo85.js.br +0 -0
  43. package/dist/client/assets/blockDiagram-I7D4REHJ-C0vryo85.js.gz +0 -0
  44. package/dist/client/assets/{c4Diagram-7LVT6UL2-DIRXP3sk.js → c4Diagram-7LVT6UL2-C1YTZveN.js} +1 -1
  45. package/dist/client/assets/c4Diagram-7LVT6UL2-C1YTZveN.js.br +0 -0
  46. package/dist/client/assets/c4Diagram-7LVT6UL2-C1YTZveN.js.gz +0 -0
  47. package/dist/client/assets/channel-DKzbD3mY.js +1 -0
  48. package/dist/client/assets/{chunk-2Q5K7J3B-B_HG9iik.js → chunk-2Q5K7J3B-D8p2mast.js} +1 -1
  49. package/dist/client/assets/{chunk-5VM5RSS4-C85zpvZf.js → chunk-5VM5RSS4-yLRj1N3c.js} +1 -1
  50. package/dist/client/assets/{chunk-F27PBJKO-QxLjhNJi.js → chunk-F27PBJKO-nNw9YRcZ.js} +1 -1
  51. package/dist/client/assets/chunk-F27PBJKO-nNw9YRcZ.js.br +0 -0
  52. package/dist/client/assets/chunk-F27PBJKO-nNw9YRcZ.js.gz +0 -0
  53. package/dist/client/assets/{chunk-IMKFNOWR-Kp44y8de.js → chunk-IMKFNOWR-DWWAAKM2.js} +1 -1
  54. package/dist/client/assets/chunk-IMKFNOWR-DWWAAKM2.js.br +0 -0
  55. package/dist/client/assets/chunk-IMKFNOWR-DWWAAKM2.js.gz +0 -0
  56. package/dist/client/assets/{chunk-JWPE2WC7-DnliK5YG.js → chunk-JWPE2WC7-DgzSStM6.js} +1 -1
  57. package/dist/client/assets/{chunk-POPQ4Y6H-Bd-wSR0l.js → chunk-POPQ4Y6H-Dogs_44f.js} +1 -1
  58. package/dist/client/assets/{chunk-SVP7TREG-dPKLRLcY.js → chunk-SVP7TREG-C_mOQgYF.js} +1 -1
  59. package/dist/client/assets/chunk-SVP7TREG-C_mOQgYF.js.br +0 -0
  60. package/dist/client/assets/chunk-SVP7TREG-C_mOQgYF.js.gz +0 -0
  61. package/dist/client/assets/{chunk-TICWLB2K-Uqiejv4H.js → chunk-TICWLB2K-DGrKuihe.js} +1 -1
  62. package/dist/client/assets/chunk-TICWLB2K-DGrKuihe.js.br +0 -0
  63. package/dist/client/assets/chunk-TICWLB2K-DGrKuihe.js.gz +0 -0
  64. package/dist/client/assets/{chunk-XXDRQBXY-CbTvwUgM.js → chunk-XXDRQBXY-CU4sw7XW.js} +1 -1
  65. package/dist/client/assets/classDiagram-ZZMXUADV-CJGW_lzo.js +1 -0
  66. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CJGW_lzo.js +1 -0
  67. package/dist/client/assets/{cose-bilkent-JH36ORCC-Brx6BYXK.js → cose-bilkent-JH36ORCC-cxa_WMru.js} +1 -1
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-cxa_WMru.js.br +0 -0
  69. package/dist/client/assets/cose-bilkent-JH36ORCC-cxa_WMru.js.gz +0 -0
  70. package/dist/client/assets/{cynefin-OW5HDTMX-CYdrk2jO.js → cynefin-OW5HDTMX-mAOLPFl-.js} +1 -1
  71. package/dist/client/assets/cynefin-OW5HDTMX-mAOLPFl-.js.br +0 -0
  72. package/dist/client/assets/cynefin-OW5HDTMX-mAOLPFl-.js.gz +0 -0
  73. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BDrUYJ9x.js → cynefinDiagram-5FMLGOSQ-CpWUaVAu.js} +1 -1
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CpWUaVAu.js.br +0 -0
  75. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CpWUaVAu.js.gz +0 -0
  76. package/dist/client/assets/{dagre-GXQ25YYZ-BHW1LKXa.js → dagre-GXQ25YYZ-DMqz7NxZ.js} +1 -1
  77. package/dist/client/assets/dagre-GXQ25YYZ-DMqz7NxZ.js.br +0 -0
  78. package/dist/client/assets/dagre-GXQ25YYZ-DMqz7NxZ.js.gz +0 -0
  79. package/dist/client/assets/{diagram-S7CK7UJ4-CtfJlYha.js → diagram-S7CK7UJ4-mHQcbzDo.js} +1 -1
  80. package/dist/client/assets/diagram-S7CK7UJ4-mHQcbzDo.js.br +0 -0
  81. package/dist/client/assets/diagram-S7CK7UJ4-mHQcbzDo.js.gz +0 -0
  82. package/dist/client/assets/{diagram-UQ7AKVKN-RD7A67TT.js → diagram-UQ7AKVKN-CGL9wE16.js} +1 -1
  83. package/dist/client/assets/diagram-UQ7AKVKN-CGL9wE16.js.br +0 -0
  84. package/dist/client/assets/diagram-UQ7AKVKN-CGL9wE16.js.gz +0 -0
  85. package/dist/client/assets/{diagram-VSXAHHWV-Bc2ee4NI.js → diagram-VSXAHHWV-DEF2bVNf.js} +1 -1
  86. package/dist/client/assets/diagram-VSXAHHWV-DEF2bVNf.js.br +0 -0
  87. package/dist/client/assets/diagram-VSXAHHWV-DEF2bVNf.js.gz +0 -0
  88. package/dist/client/assets/{diagram-VX7I27RA-DmVDnfe0.js → diagram-VX7I27RA-DW1HCibh.js} +1 -1
  89. package/dist/client/assets/diagram-VX7I27RA-DW1HCibh.js.br +0 -0
  90. package/dist/client/assets/diagram-VX7I27RA-DW1HCibh.js.gz +0 -0
  91. package/dist/client/assets/{diagram-Z3DM3KII-CJzqTJGS.js → diagram-Z3DM3KII-ta2mseKz.js} +1 -1
  92. package/dist/client/assets/diagram-Z3DM3KII-ta2mseKz.js.br +0 -0
  93. package/dist/client/assets/diagram-Z3DM3KII-ta2mseKz.js.gz +0 -0
  94. package/dist/client/assets/{ebnfDiagram-PWID7BFC-D11WgZfq.js → ebnfDiagram-PWID7BFC-Csqc2Qxg.js} +1 -1
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-Csqc2Qxg.js.br +0 -0
  96. package/dist/client/assets/ebnfDiagram-PWID7BFC-Csqc2Qxg.js.gz +0 -0
  97. package/dist/client/assets/{erDiagram-RLTQ6QDP-De3NtkE9.js → erDiagram-RLTQ6QDP-t64YNWRD.js} +1 -1
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-t64YNWRD.js.br +0 -0
  99. package/dist/client/assets/erDiagram-RLTQ6QDP-t64YNWRD.js.gz +0 -0
  100. package/dist/client/assets/{flowDiagram-HODETNUW-CPc7ilVS.js → flowDiagram-HODETNUW-BQmk9bpv.js} +1 -1
  101. package/dist/client/assets/flowDiagram-HODETNUW-BQmk9bpv.js.br +0 -0
  102. package/dist/client/assets/flowDiagram-HODETNUW-BQmk9bpv.js.gz +0 -0
  103. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-B2YoYsnX.js → ganttDiagram-EL5Y4UJY-CCP5TaFL.js} +1 -1
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CCP5TaFL.js.br +0 -0
  105. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CCP5TaFL.js.gz +0 -0
  106. package/dist/client/assets/{gestureArbiter-BQGqQudb.js → gestureArbiter-DyVdZw46.js} +1 -1
  107. package/dist/client/assets/gestureArbiter-DyVdZw46.js.br +0 -0
  108. package/dist/client/assets/gestureArbiter-DyVdZw46.js.gz +0 -0
  109. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DXLBdHJ4.js → gitGraphDiagram-WWUBYQGX-DDGiOP-G.js} +1 -1
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DDGiOP-G.js.br +0 -0
  111. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DDGiOP-G.js.gz +0 -0
  112. package/dist/client/assets/{infoDiagram-27XIBGKW-DM85TkAA.js → infoDiagram-27XIBGKW-CJUcAxoK.js} +1 -1
  113. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BXKIZG70.js → ishikawaDiagram-5VMMS53U-WfmO-dkM.js} +1 -1
  114. package/dist/client/assets/ishikawaDiagram-5VMMS53U-WfmO-dkM.js.br +0 -0
  115. package/dist/client/assets/ishikawaDiagram-5VMMS53U-WfmO-dkM.js.gz +0 -0
  116. package/dist/client/assets/{journeyDiagram-3NMN7TZE-28KA3Stz.js → journeyDiagram-3NMN7TZE-BQdtiR19.js} +1 -1
  117. package/dist/client/assets/journeyDiagram-3NMN7TZE-BQdtiR19.js.br +0 -0
  118. package/dist/client/assets/journeyDiagram-3NMN7TZE-BQdtiR19.js.gz +0 -0
  119. package/dist/client/assets/{kanban-definition-UXKFOSKX-DTx8Y6S-.js → kanban-definition-UXKFOSKX-BpD89N0a.js} +1 -1
  120. package/dist/client/assets/kanban-definition-UXKFOSKX-BpD89N0a.js.br +0 -0
  121. package/dist/client/assets/kanban-definition-UXKFOSKX-BpD89N0a.js.gz +0 -0
  122. package/dist/client/assets/{layout-DITnCY23.js → layout--JMDcm4W.js} +1 -1
  123. package/dist/client/assets/{layout-DITnCY23.js.br → layout--JMDcm4W.js.br} +0 -0
  124. package/dist/client/assets/layout--JMDcm4W.js.gz +0 -0
  125. package/dist/client/assets/{linear-W7oK9k7n.js → linear-D58DhRP7.js} +1 -1
  126. package/dist/client/assets/linear-D58DhRP7.js.br +0 -0
  127. package/dist/client/assets/linear-D58DhRP7.js.gz +0 -0
  128. package/dist/client/assets/{mermaid.core-DWz9TUWr.js → mermaid.core-Pq-3I5ga.js} +5 -5
  129. package/dist/client/assets/mermaid.core-Pq-3I5ga.js.br +0 -0
  130. package/dist/client/assets/mermaid.core-Pq-3I5ga.js.gz +0 -0
  131. package/dist/client/assets/{mindmap-definition-YA3MSWOX-CNEufoKq.js → mindmap-definition-YA3MSWOX-BmbqNhHo.js} +1 -1
  132. package/dist/client/assets/mindmap-definition-YA3MSWOX-BmbqNhHo.js.br +0 -0
  133. package/dist/client/assets/mindmap-definition-YA3MSWOX-BmbqNhHo.js.gz +0 -0
  134. package/dist/client/assets/{passwordBootstrap-BLMrRBuz.js → passwordBootstrap-ZAb5oVA5.js} +1 -1
  135. package/dist/client/assets/passwordBootstrap-ZAb5oVA5.js.br +0 -0
  136. package/dist/client/assets/passwordBootstrap-ZAb5oVA5.js.gz +0 -0
  137. package/dist/client/assets/{pegDiagram-XKGWAZYB-DYN1PL3N.js → pegDiagram-XKGWAZYB-DHDH23Ne.js} +1 -1
  138. package/dist/client/assets/pegDiagram-XKGWAZYB-DHDH23Ne.js.br +0 -0
  139. package/dist/client/assets/pegDiagram-XKGWAZYB-DHDH23Ne.js.gz +0 -0
  140. package/dist/client/assets/{pieDiagram-E7YTZNPT-2_TH40ba.js → pieDiagram-E7YTZNPT-BSu54gdQ.js} +1 -1
  141. package/dist/client/assets/pieDiagram-E7YTZNPT-BSu54gdQ.js.br +0 -0
  142. package/dist/client/assets/pieDiagram-E7YTZNPT-BSu54gdQ.js.gz +0 -0
  143. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DkXLrkgM.js → quadrantDiagram-AXDQQJYC-BKv6ZdnD.js} +1 -1
  144. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BKv6ZdnD.js.br +0 -0
  145. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BKv6ZdnD.js.gz +0 -0
  146. package/dist/client/assets/{railroadDiagram-O6MQD6OU-w391MCs5.js → railroadDiagram-O6MQD6OU-B9gMo_Zg.js} +1 -1
  147. package/dist/client/assets/railroadDiagram-O6MQD6OU-B9gMo_Zg.js.br +0 -0
  148. package/dist/client/assets/railroadDiagram-O6MQD6OU-B9gMo_Zg.js.gz +0 -0
  149. package/dist/client/assets/{referenceLongPress-DQp-76vd.js → referenceLongPress-CU1tIbO6.js} +1 -1
  150. package/dist/client/assets/referenceLongPress-CU1tIbO6.js.br +0 -0
  151. package/dist/client/assets/referenceLongPress-CU1tIbO6.js.gz +0 -0
  152. package/dist/client/assets/{requirementDiagram-BXWQKSXE-DvMmFxcQ.js → requirementDiagram-BXWQKSXE-D1uTeDRN.js} +1 -1
  153. package/dist/client/assets/requirementDiagram-BXWQKSXE-D1uTeDRN.js.br +0 -0
  154. package/dist/client/assets/requirementDiagram-BXWQKSXE-D1uTeDRN.js.gz +0 -0
  155. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DGtByb8-.js → sankeyDiagram-P5KCCOFB-6ILVLTlv.js} +1 -1
  156. package/dist/client/assets/sankeyDiagram-P5KCCOFB-6ILVLTlv.js.br +0 -0
  157. package/dist/client/assets/sankeyDiagram-P5KCCOFB-6ILVLTlv.js.gz +0 -0
  158. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-ivGNt591.js → sequenceDiagram-WJ2MYXX4-C3sf6C4q.js} +1 -1
  159. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-C3sf6C4q.js.br +0 -0
  160. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-C3sf6C4q.js.gz +0 -0
  161. package/dist/client/assets/{sizeCapture-INFHLROL-Dcopqjtm.js → sizeCapture-INFHLROL-Cvt9n7uC.js} +1 -1
  162. package/dist/client/assets/sizeCapture-INFHLROL-Cvt9n7uC.js.br +0 -0
  163. package/dist/client/assets/sizeCapture-INFHLROL-Cvt9n7uC.js.gz +0 -0
  164. package/dist/client/assets/{sparkles-DWCL-_3n.js → sparkles-DzUtpGjS.js} +1 -1
  165. package/dist/client/assets/{stateDiagram-D77RDMKH-BKt1Fmon.js → stateDiagram-D77RDMKH-Dk7pwVJJ.js} +1 -1
  166. package/dist/client/assets/stateDiagram-D77RDMKH-Dk7pwVJJ.js.br +0 -0
  167. package/dist/client/assets/stateDiagram-D77RDMKH-Dk7pwVJJ.js.gz +0 -0
  168. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BxBjLjs3.js +1 -0
  169. package/dist/client/assets/{swimlanes-42K2YHIH-DsF9UaJ7.js → swimlanes-42K2YHIH-BMgLBwHl.js} +1 -1
  170. package/dist/client/assets/swimlanes-42K2YHIH-BMgLBwHl.js.br +0 -0
  171. package/dist/client/assets/swimlanes-42K2YHIH-BMgLBwHl.js.gz +0 -0
  172. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-XlasM7eg.js +8 -0
  173. package/dist/client/assets/{timeline-definition-24CTP7MA-Bqw430aU.js → timeline-definition-24CTP7MA-CCcoHFxT.js} +1 -1
  174. package/dist/client/assets/timeline-definition-24CTP7MA-CCcoHFxT.js.br +0 -0
  175. package/dist/client/assets/{timeline-definition-24CTP7MA-Bqw430aU.js.gz → timeline-definition-24CTP7MA-CCcoHFxT.js.gz} +0 -0
  176. package/dist/client/assets/{triangle-alert-B2fBo8hF.js → triangle-alert-DMoi3OxM.js} +1 -1
  177. package/dist/client/assets/{vennDiagram-4TSXK5OY-BCK_tqYC.js → vennDiagram-4TSXK5OY-BBDyrPPT.js} +1 -1
  178. package/dist/client/assets/vennDiagram-4TSXK5OY-BBDyrPPT.js.br +0 -0
  179. package/dist/client/assets/vennDiagram-4TSXK5OY-BBDyrPPT.js.gz +0 -0
  180. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-CKLgm2V9.js → wardleyDiagram-VM6X3IG4-CUDgyxeY.js} +1 -1
  181. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CUDgyxeY.js.br +0 -0
  182. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CUDgyxeY.js.gz +0 -0
  183. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Byhc73N8.js → xychartDiagram-S5SC5T6Z-Cscz_XUA.js} +1 -1
  184. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Cscz_XUA.js.br +0 -0
  185. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Cscz_XUA.js.gz +0 -0
  186. package/dist/client/index.html +1 -1
  187. package/dist/client/index.html.br +0 -0
  188. package/dist/client/index.html.gz +0 -0
  189. package/dist/client/sw.js +1 -1
  190. package/dist/client/sw.js.br +0 -0
  191. package/dist/client/sw.js.gz +0 -0
  192. package/dist/server/agent/collaborationPrompt.js +1 -1
  193. package/dist/server/federation/deviceProfile.js +1 -0
  194. package/dist/server/federation/deviceProfiles.js +32 -0
  195. package/dist/server/federation/runtime.js +5 -1
  196. package/dist/server/ptyHost.js +2 -0
  197. package/dist/server/routes/terminal.js +31 -6
  198. package/dist/server/utils/bootCheck.js +2 -0
  199. package/dist/server/utils/ensureNodePty.js +9 -0
  200. package/dist/server/utils/ptySpawnBackoff.js +35 -0
  201. package/package.json +2 -2
  202. package/runtime-manifest.json +4 -4
  203. package/scripts/ensure-node-pty.cjs +63 -0
  204. package/scripts/node-pty-darwin-spawn.inc +64 -0
  205. package/scripts/postinstall.mjs +3 -0
  206. package/scripts/prepare-desktop-runtime.mjs +3 -0
  207. package/dist/client/assets/App-QbHtW5ZR.js.br +0 -0
  208. package/dist/client/assets/App-QbHtW5ZR.js.gz +0 -0
  209. package/dist/client/assets/ChangeWalkthroughPanel-CKBv-8OF.js.br +0 -0
  210. package/dist/client/assets/ChangeWalkthroughPanel-CKBv-8OF.js.gz +0 -0
  211. package/dist/client/assets/DagPlayground-D23apWqB.js.br +0 -0
  212. package/dist/client/assets/DagPlayground-D23apWqB.js.gz +0 -0
  213. package/dist/client/assets/DiffLab-BG57Q8oJ.js.br +0 -0
  214. package/dist/client/assets/DiffLab-BG57Q8oJ.js.gz +0 -0
  215. package/dist/client/assets/DiffReview-BaYWAjWk.js.br +0 -0
  216. package/dist/client/assets/DiffReview-BaYWAjWk.js.gz +0 -0
  217. package/dist/client/assets/DiffReviewLab-BMRkWJpo.js.br +0 -0
  218. package/dist/client/assets/DiffReviewLab-BMRkWJpo.js.gz +0 -0
  219. package/dist/client/assets/DiffViewer-DmPGE-p1.js.br +0 -0
  220. package/dist/client/assets/DiffViewer-DmPGE-p1.js.gz +0 -0
  221. package/dist/client/assets/ModelPreview-DjdRuKdU.js.br +0 -0
  222. package/dist/client/assets/ModelPreview-DjdRuKdU.js.gz +0 -0
  223. package/dist/client/assets/RightSidebar-CLfYAwjH.js.br +0 -0
  224. package/dist/client/assets/RightSidebar-CLfYAwjH.js.gz +0 -0
  225. package/dist/client/assets/abnfDiagram-VCTEODGH-BKfhcqzo.js.br +0 -0
  226. package/dist/client/assets/abnfDiagram-VCTEODGH-BKfhcqzo.js.gz +0 -0
  227. package/dist/client/assets/app-CFSed4cT.js +0 -34
  228. package/dist/client/assets/app-CFSed4cT.js.br +0 -0
  229. package/dist/client/assets/app-CFSed4cT.js.gz +0 -0
  230. package/dist/client/assets/arc-B2R02Jyo.js.br +0 -0
  231. package/dist/client/assets/arc-B2R02Jyo.js.gz +0 -0
  232. package/dist/client/assets/architectureDiagram-5GKGNRK7-C_EdNLCI.js.br +0 -0
  233. package/dist/client/assets/architectureDiagram-5GKGNRK7-C_EdNLCI.js.gz +0 -0
  234. package/dist/client/assets/blockDiagram-I7D4REHJ-CZkLLWFL.js.br +0 -0
  235. package/dist/client/assets/blockDiagram-I7D4REHJ-CZkLLWFL.js.gz +0 -0
  236. package/dist/client/assets/c4Diagram-7LVT6UL2-DIRXP3sk.js.br +0 -0
  237. package/dist/client/assets/c4Diagram-7LVT6UL2-DIRXP3sk.js.gz +0 -0
  238. package/dist/client/assets/channel-DFSlHLuy.js +0 -1
  239. package/dist/client/assets/chunk-F27PBJKO-QxLjhNJi.js.br +0 -0
  240. package/dist/client/assets/chunk-F27PBJKO-QxLjhNJi.js.gz +0 -0
  241. package/dist/client/assets/chunk-IMKFNOWR-Kp44y8de.js.br +0 -0
  242. package/dist/client/assets/chunk-IMKFNOWR-Kp44y8de.js.gz +0 -0
  243. package/dist/client/assets/chunk-SVP7TREG-dPKLRLcY.js.br +0 -0
  244. package/dist/client/assets/chunk-SVP7TREG-dPKLRLcY.js.gz +0 -0
  245. package/dist/client/assets/chunk-TICWLB2K-Uqiejv4H.js.br +0 -0
  246. package/dist/client/assets/chunk-TICWLB2K-Uqiejv4H.js.gz +0 -0
  247. package/dist/client/assets/classDiagram-ZZMXUADV-2P0NBW8n.js +0 -1
  248. package/dist/client/assets/classDiagram-v2-VYDZK3BY-2P0NBW8n.js +0 -1
  249. package/dist/client/assets/cose-bilkent-JH36ORCC-Brx6BYXK.js.br +0 -0
  250. package/dist/client/assets/cose-bilkent-JH36ORCC-Brx6BYXK.js.gz +0 -0
  251. package/dist/client/assets/cynefin-OW5HDTMX-CYdrk2jO.js.br +0 -0
  252. package/dist/client/assets/cynefin-OW5HDTMX-CYdrk2jO.js.gz +0 -0
  253. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BDrUYJ9x.js.br +0 -0
  254. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BDrUYJ9x.js.gz +0 -0
  255. package/dist/client/assets/dagre-GXQ25YYZ-BHW1LKXa.js.br +0 -0
  256. package/dist/client/assets/dagre-GXQ25YYZ-BHW1LKXa.js.gz +0 -0
  257. package/dist/client/assets/diagram-S7CK7UJ4-CtfJlYha.js.br +0 -0
  258. package/dist/client/assets/diagram-S7CK7UJ4-CtfJlYha.js.gz +0 -0
  259. package/dist/client/assets/diagram-UQ7AKVKN-RD7A67TT.js.br +0 -0
  260. package/dist/client/assets/diagram-UQ7AKVKN-RD7A67TT.js.gz +0 -0
  261. package/dist/client/assets/diagram-VSXAHHWV-Bc2ee4NI.js.br +0 -0
  262. package/dist/client/assets/diagram-VSXAHHWV-Bc2ee4NI.js.gz +0 -0
  263. package/dist/client/assets/diagram-VX7I27RA-DmVDnfe0.js.br +0 -0
  264. package/dist/client/assets/diagram-VX7I27RA-DmVDnfe0.js.gz +0 -0
  265. package/dist/client/assets/diagram-Z3DM3KII-CJzqTJGS.js.br +0 -0
  266. package/dist/client/assets/diagram-Z3DM3KII-CJzqTJGS.js.gz +0 -0
  267. package/dist/client/assets/ebnfDiagram-PWID7BFC-D11WgZfq.js.br +0 -0
  268. package/dist/client/assets/ebnfDiagram-PWID7BFC-D11WgZfq.js.gz +0 -0
  269. package/dist/client/assets/erDiagram-RLTQ6QDP-De3NtkE9.js.br +0 -0
  270. package/dist/client/assets/erDiagram-RLTQ6QDP-De3NtkE9.js.gz +0 -0
  271. package/dist/client/assets/flowDiagram-HODETNUW-CPc7ilVS.js.br +0 -0
  272. package/dist/client/assets/flowDiagram-HODETNUW-CPc7ilVS.js.gz +0 -0
  273. package/dist/client/assets/ganttDiagram-EL5Y4UJY-B2YoYsnX.js.br +0 -0
  274. package/dist/client/assets/ganttDiagram-EL5Y4UJY-B2YoYsnX.js.gz +0 -0
  275. package/dist/client/assets/gestureArbiter-BQGqQudb.js.br +0 -0
  276. package/dist/client/assets/gestureArbiter-BQGqQudb.js.gz +0 -0
  277. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DXLBdHJ4.js.br +0 -0
  278. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DXLBdHJ4.js.gz +0 -0
  279. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BXKIZG70.js.br +0 -0
  280. package/dist/client/assets/ishikawaDiagram-5VMMS53U-BXKIZG70.js.gz +0 -0
  281. package/dist/client/assets/journeyDiagram-3NMN7TZE-28KA3Stz.js.br +0 -0
  282. package/dist/client/assets/journeyDiagram-3NMN7TZE-28KA3Stz.js.gz +0 -0
  283. package/dist/client/assets/kanban-definition-UXKFOSKX-DTx8Y6S-.js.br +0 -0
  284. package/dist/client/assets/kanban-definition-UXKFOSKX-DTx8Y6S-.js.gz +0 -0
  285. package/dist/client/assets/layout-DITnCY23.js.gz +0 -0
  286. package/dist/client/assets/linear-W7oK9k7n.js.br +0 -0
  287. package/dist/client/assets/linear-W7oK9k7n.js.gz +0 -0
  288. package/dist/client/assets/mermaid.core-DWz9TUWr.js.br +0 -0
  289. package/dist/client/assets/mermaid.core-DWz9TUWr.js.gz +0 -0
  290. package/dist/client/assets/mindmap-definition-YA3MSWOX-CNEufoKq.js.br +0 -0
  291. package/dist/client/assets/mindmap-definition-YA3MSWOX-CNEufoKq.js.gz +0 -0
  292. package/dist/client/assets/passwordBootstrap-BLMrRBuz.js.br +0 -0
  293. package/dist/client/assets/passwordBootstrap-BLMrRBuz.js.gz +0 -0
  294. package/dist/client/assets/pegDiagram-XKGWAZYB-DYN1PL3N.js.br +0 -0
  295. package/dist/client/assets/pegDiagram-XKGWAZYB-DYN1PL3N.js.gz +0 -0
  296. package/dist/client/assets/pieDiagram-E7YTZNPT-2_TH40ba.js.br +0 -0
  297. package/dist/client/assets/pieDiagram-E7YTZNPT-2_TH40ba.js.gz +0 -0
  298. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DkXLrkgM.js.br +0 -0
  299. package/dist/client/assets/quadrantDiagram-AXDQQJYC-DkXLrkgM.js.gz +0 -0
  300. package/dist/client/assets/railroadDiagram-O6MQD6OU-w391MCs5.js.br +0 -0
  301. package/dist/client/assets/railroadDiagram-O6MQD6OU-w391MCs5.js.gz +0 -0
  302. package/dist/client/assets/referenceLongPress-DQp-76vd.js.br +0 -0
  303. package/dist/client/assets/referenceLongPress-DQp-76vd.js.gz +0 -0
  304. package/dist/client/assets/requirementDiagram-BXWQKSXE-DvMmFxcQ.js.br +0 -0
  305. package/dist/client/assets/requirementDiagram-BXWQKSXE-DvMmFxcQ.js.gz +0 -0
  306. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DGtByb8-.js.br +0 -0
  307. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DGtByb8-.js.gz +0 -0
  308. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-ivGNt591.js.br +0 -0
  309. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-ivGNt591.js.gz +0 -0
  310. package/dist/client/assets/sizeCapture-INFHLROL-Dcopqjtm.js.br +0 -0
  311. package/dist/client/assets/sizeCapture-INFHLROL-Dcopqjtm.js.gz +0 -0
  312. package/dist/client/assets/stateDiagram-D77RDMKH-BKt1Fmon.js.br +0 -0
  313. package/dist/client/assets/stateDiagram-D77RDMKH-BKt1Fmon.js.gz +0 -0
  314. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BegmURZh.js +0 -1
  315. package/dist/client/assets/swimlanes-42K2YHIH-DsF9UaJ7.js.br +0 -0
  316. package/dist/client/assets/swimlanes-42K2YHIH-DsF9UaJ7.js.gz +0 -0
  317. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CxlA0Asv.js +0 -8
  318. package/dist/client/assets/timeline-definition-24CTP7MA-Bqw430aU.js.br +0 -0
  319. package/dist/client/assets/vennDiagram-4TSXK5OY-BCK_tqYC.js.br +0 -0
  320. package/dist/client/assets/vennDiagram-4TSXK5OY-BCK_tqYC.js.gz +0 -0
  321. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CKLgm2V9.js.br +0 -0
  322. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CKLgm2V9.js.gz +0 -0
  323. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Byhc73N8.js.br +0 -0
  324. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Byhc73N8.js.gz +0 -0
@@ -0,0 +1,35 @@
1
+ /** Shared across WebSockets and sessions: PTYs/FDs are process-wide resources. */
2
+ export class PtySpawnDeferredError extends Error {
3
+ retryAfterMs;
4
+ constructor(retryAfterMs) {
5
+ super(`PTY creation cooling down for ${retryAfterMs}ms`);
6
+ this.retryAfterMs = retryAfterMs;
7
+ }
8
+ }
9
+ export class PtySpawnBackoff {
10
+ now;
11
+ failures = 0;
12
+ retryAt = 0;
13
+ constructor(now = Date.now) {
14
+ this.now = now;
15
+ }
16
+ get retryAfterMs() { return Math.max(0, this.retryAt - this.now()); }
17
+ check() {
18
+ if (this.retryAfterMs > 0)
19
+ throw new PtySpawnDeferredError(this.retryAfterMs);
20
+ }
21
+ spawn(create) {
22
+ this.check();
23
+ try {
24
+ const result = create();
25
+ this.failures = 0;
26
+ this.retryAt = 0;
27
+ return result;
28
+ }
29
+ catch (error) {
30
+ this.failures = Math.min(this.failures + 1, 6);
31
+ this.retryAt = this.now() + Math.min(30_000, 1000 * 2 ** (this.failures - 1));
32
+ throw error; // Preserve errno and the original diagnostic in the real failure log.
33
+ }
34
+ }
35
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.184",
3
+ "version": "1.4.186",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -83,7 +83,7 @@
83
83
  "mermaid": "^11.17.2",
84
84
  "motion": "^12.40.0",
85
85
  "multicast-dns": "^7.2.5",
86
- "node-pty": "^1.1.0",
86
+ "node-pty": "1.1.0",
87
87
  "qrcode": "^1.5.4",
88
88
  "react": "^18.2.0",
89
89
  "react-diff-view": "^3.3.3",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.184",
4
+ "version": "1.4.186",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
- "dependencyHash": "sha256-kSujny2SLOFnZ1ffxm1FYtli7g1vEN8d3vj1oQeLLdc=",
9
- "serverBundleHash": "sha256-NRDtV9wYAm3AzMqg2Z770mA5HFlDMcEQDq2Qkx6iGJw=",
10
- "clientBundleHash": "sha256-i34xRoKhGsUX4Avqi/8+wolj61Nks3ERSlBE1WZDb64=",
8
+ "dependencyHash": "sha256-K4KyYJuVoQDpZsBM8ZX1Rw3MddOxAzVdp/cPm0iGZz0=",
9
+ "serverBundleHash": "sha256-SpiuRE2j2Gzm2ShsdKVYNdDvpVRy88JLJyzDknTqoAQ=",
10
+ "clientBundleHash": "sha256-A/GUx3lPyEWzLOGIWlM2aJrObBaQtMZzQxi/gAupkbk=",
11
11
  "entrypoint": "dist/server/cli.js",
12
12
  "clientEntrypoint": "dist/client/index.html"
13
13
  }
@@ -0,0 +1,63 @@
1
+ // Pinned node-pty 1.1.0 macOS FD fix. Runs before loading the native addon.
2
+ const fs = require('node:fs');
3
+ const path = require('node:path');
4
+ const { createHash } = require('node:crypto');
5
+ const { spawnSync } = require('node:child_process');
6
+ const hash = data => createHash('sha256').update(data).digest('hex');
7
+ const upstreamHash = '5e1005d6bdcfbe97b486ee415419fe7adae99035047f07340fbad36419e0bae6';
8
+
9
+ function patchSource(source) {
10
+ if (hash(source) !== upstreamHash) throw new Error('Unrecognized node-pty source; review the macOS FD patch before upgrading');
11
+ const start = source.indexOf('static void\npty_posix_spawn(char** argv', source.indexOf('pty_getproc(int fd)'));
12
+ const end = source.indexOf('\n#endif', start);
13
+ if (start < 0 || end < 0) throw new Error('node-pty spawn implementation missing');
14
+ source = source.slice(0, start) + fs.readFileSync(path.join(__dirname, 'node-pty-darwin-spawn.inc'), 'utf8').trimEnd() + source.slice(end);
15
+ source = source.replace(' int stat_loc;', ' int stat_loc = 0;');
16
+ source = source.replace(' }\n#else\n while (true)', ' }\n if (kq >= 0) close(kq);\n#else\n while (true)');
17
+ source = source.replace('throw Napi::Error::New(napiEnv, "posix_spawnp failed.");',
18
+ 'throw Napi::Error::New(napiEnv, std::string("posix_spawnp failed: errno=") + std::to_string(err) + " (" + strerror(err) + ")");');
19
+ source = source.replace(' if (pty_nonblock(master) == -1) {\n throw',
20
+ ' if (pty_nonblock(master) == -1) {\n close(master);\n kill(pid, SIGKILL);\n HANDLE_EINTR(waitpid(pid, NULL, 0));\n throw');
21
+ return source;
22
+ }
23
+
24
+ const checked = new Set();
25
+ function ensureNodePty(ptyRoot = path.dirname(require.resolve('node-pty/package.json'))) {
26
+ if (process.platform !== 'darwin' || checked.has(ptyRoot)) return;
27
+ const sourcePath = path.join(ptyRoot, 'src/unix/pty.cc');
28
+ const backupPath = path.join(ptyRoot, 'src/unix/pty.cc.termdock-original');
29
+ const markerPath = path.join(ptyRoot, '.termdock-fd-fix.json');
30
+ const binaryPath = path.join(ptyRoot, 'build/Release/pty.node');
31
+ const helperPath = path.join(ptyRoot, 'build/Release/spawn-helper');
32
+ const original = fs.readFileSync(fs.existsSync(backupPath) ? backupPath : sourcePath, 'utf8');
33
+ const patched = patchSource(original);
34
+ const sourceHash = hash(patched);
35
+ try {
36
+ const marker = JSON.parse(fs.readFileSync(markerPath, 'utf8'));
37
+ if (marker.source === sourceHash && marker.binary === hash(fs.readFileSync(binaryPath))
38
+ && hash(fs.readFileSync(sourcePath)) === sourceHash && fs.existsSync(helperPath)) {
39
+ const helperMode = fs.statSync(helperPath).mode;
40
+ if ((helperMode & 0o111) !== 0o111) fs.chmodSync(helperPath, helperMode | 0o111);
41
+ checked.add(ptyRoot);
42
+ return;
43
+ }
44
+ } catch { /* First install or replaced binary: rebuild, never accept a spawn-only probe. */ }
45
+ fs.writeFileSync(backupPath, original);
46
+ fs.writeFileSync(sourcePath, patched);
47
+ fs.rmSync(markerPath, { force: true });
48
+ // Prevent the native loader from silently falling back to a leaking prebuild.
49
+ fs.rmSync(path.join(ptyRoot, 'prebuilds', `darwin-${process.arch}`), { recursive: true, force: true });
50
+ fs.rmSync(path.join(ptyRoot, 'build/Debug'), { recursive: true, force: true });
51
+ console.log('Rebuilding node-pty with the Termdock macOS FD cleanup fix...');
52
+ const result = spawnSync('npx', ['--yes', 'node-gyp', 'rebuild'], {
53
+ cwd: ptyRoot, stdio: 'inherit', timeout: 180_000,
54
+ });
55
+ if (result.error || result.status !== 0) {
56
+ throw new Error('Patched node-pty rebuild failed; install Xcode Command Line Tools and retry. ' + (result.error?.message || ''));
57
+ }
58
+ fs.chmodSync(helperPath, fs.statSync(helperPath).mode | 0o111);
59
+ fs.writeFileSync(markerPath, JSON.stringify({ source: sourceHash, binary: hash(fs.readFileSync(binaryPath)) }));
60
+ checked.add(ptyRoot);
61
+ }
62
+ module.exports = { ensureNodePty, patchSource };
63
+ if (require.main === module) ensureNodePty(process.argv[2]);
@@ -0,0 +1,64 @@
1
+ // Termdock: every descriptor is owned until explicitly transferred to JS.
2
+ static void
3
+ pty_posix_spawn(char** argv, char** env,
4
+ const struct termios *termp,
5
+ const struct winsize *winp,
6
+ int* master, pid_t* pid, int* err) {
7
+ struct OwnedFd {
8
+ int fd = -1;
9
+ ~OwnedFd() { if (fd >= 0) close(fd); }
10
+ } low_fds[3], parent_master, slave;
11
+ *master = -1;
12
+ *err = 0;
13
+ for (size_t i = 0; i < 3; ++i) {
14
+ low_fds[i].fd = posix_openpt(O_RDWR);
15
+ if (low_fds[i].fd == -1) { *err = errno; return; }
16
+ if (low_fds[i].fd >= STDERR_FILENO) break;
17
+ }
18
+
19
+ parent_master.fd = posix_openpt(O_RDWR);
20
+ if (parent_master.fd == -1) { *err = errno; return; }
21
+ if (grantpt(parent_master.fd) == -1 || unlockpt(parent_master.fd) == -1) {
22
+ *err = errno; return;
23
+ }
24
+ char name[128];
25
+ if (ioctl(parent_master.fd, TIOCPTYGNAME, name) == -1) { *err = errno; return; }
26
+ slave.fd = open(name, O_RDWR | O_NOCTTY);
27
+ if (slave.fd == -1) { *err = errno; return; }
28
+ if (termp && tcsetattr(slave.fd, TCSANOW, termp) == -1) { *err = errno; return; }
29
+ if (winp && ioctl(slave.fd, TIOCSWINSZ, winp) == -1) { *err = errno; return; }
30
+
31
+ struct Actions {
32
+ posix_spawn_file_actions_t value;
33
+ bool initialized = false;
34
+ ~Actions() { if (initialized) posix_spawn_file_actions_destroy(&value); }
35
+ } acts;
36
+ struct Attributes {
37
+ posix_spawnattr_t value;
38
+ bool initialized = false;
39
+ ~Attributes() { if (initialized) posix_spawnattr_destroy(&value); }
40
+ } attrs;
41
+ if ((*err = posix_spawn_file_actions_init(&acts.value)) != 0) return;
42
+ acts.initialized = true;
43
+ for (int fd = STDIN_FILENO; fd <= STDERR_FILENO; ++fd) {
44
+ if ((*err = posix_spawn_file_actions_adddup2(&acts.value, slave.fd, fd)) != 0) return;
45
+ }
46
+ if ((*err = posix_spawn_file_actions_addclose(&acts.value, slave.fd)) != 0) return;
47
+ if ((*err = posix_spawn_file_actions_addclose(&acts.value, parent_master.fd)) != 0) return;
48
+ if ((*err = posix_spawnattr_init(&attrs.value)) != 0) return;
49
+ attrs.initialized = true;
50
+ const int flags = POSIX_SPAWN_CLOEXEC_DEFAULT | POSIX_SPAWN_SETSIGDEF |
51
+ POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSID;
52
+ if ((*err = posix_spawnattr_setflags(&attrs.value, flags)) != 0) return;
53
+ sigset_t signals;
54
+ sigfillset(&signals);
55
+ if ((*err = posix_spawnattr_setsigdefault(&attrs.value, &signals)) != 0) return;
56
+ sigemptyset(&signals);
57
+ if ((*err = posix_spawnattr_setsigmask(&attrs.value, &signals)) != 0) return;
58
+ do {
59
+ *err = posix_spawn(pid, argv[0], &acts.value, &attrs.value, argv, env);
60
+ } while (*err == EINTR);
61
+ if (*err != 0) return;
62
+ *master = parent_master.fd;
63
+ parent_master.fd = -1; // JS owns only the master; parent closes slave and low FDs.
64
+ }
@@ -48,8 +48,11 @@ function which(bin) {
48
48
  // —— native modules: 实际 spawn 测试,不只是 require ——
49
49
  console.log('\n=== Rebuilding native modules ===');
50
50
 
51
+ const { ensureNodePty } = require_('./ensure-node-pty.cjs');
51
52
  const PTY_PATH = require_.resolve('node-pty/package.json', { paths: [pkgRoot] }).replace('/package.json', '');
52
53
 
54
+ ensureNodePty(PTY_PATH);
55
+
53
56
  // Ensure node-pty prebuild spawn-helper binaries have execute permissions.
54
57
  // npm may strip +x during install, which causes terminal creation to fail.
55
58
  function fixSpawnHelperPermissions() {
@@ -187,6 +187,9 @@ run(process.platform === 'win32' ? 'npm.cmd' : 'npm', [
187
187
  },
188
188
  });
189
189
 
190
+ // Ship the same repair gate for bundled and subsequently downloaded runtimes.
191
+ fs.cpSync(path.join(root, 'scripts'), path.join(serverDir, 'scripts'), { recursive: true });
192
+ run(runtimeNode, [path.join(serverDir, 'scripts/ensure-node-pty.cjs'), path.join(serverDir, 'node_modules/node-pty')], { cwd: serverDir });
190
193
  makeSpawnHelpersExecutable(path.join(serverDir, 'node_modules', 'node-pty'));
191
194
  run(runtimeNode, [
192
195
  '-e',