termdock 1.4.183 → 1.4.185

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 (339) hide show
  1. package/.desktop-dist/main.js +24 -1
  2. package/dist/client/assets/App-D_s_HKS_.js +150 -0
  3. package/dist/client/assets/App-D_s_HKS_.js.br +0 -0
  4. package/dist/client/assets/App-D_s_HKS_.js.gz +0 -0
  5. package/dist/client/assets/{ChangeWalkthroughPanel-DLyqq7b5.js → ChangeWalkthroughPanel-Cu0Yao62.js} +2 -2
  6. package/dist/client/assets/ChangeWalkthroughPanel-Cu0Yao62.js.br +0 -0
  7. package/dist/client/assets/ChangeWalkthroughPanel-Cu0Yao62.js.gz +0 -0
  8. package/dist/client/assets/{DagPlayground-DRfTbwp8.js → DagPlayground-CSOix-HK.js} +1 -1
  9. package/dist/client/assets/DagPlayground-CSOix-HK.js.br +0 -0
  10. package/dist/client/assets/DagPlayground-CSOix-HK.js.gz +0 -0
  11. package/dist/client/assets/{DiffLab-DKN99QG9.js → DiffLab-BcAWbOO6.js} +1 -1
  12. package/dist/client/assets/DiffLab-BcAWbOO6.js.br +0 -0
  13. package/dist/client/assets/DiffLab-BcAWbOO6.js.gz +0 -0
  14. package/dist/client/assets/DiffReview-BWjdAFLx.js +1 -0
  15. package/dist/client/assets/DiffReview-BWjdAFLx.js.br +0 -0
  16. package/dist/client/assets/DiffReview-BWjdAFLx.js.gz +0 -0
  17. package/dist/client/assets/{DiffReviewLab-BF4-lS-2.js → DiffReviewLab-Cu6iJ0Qj.js} +2 -2
  18. package/dist/client/assets/DiffReviewLab-Cu6iJ0Qj.js.br +0 -0
  19. package/dist/client/assets/DiffReviewLab-Cu6iJ0Qj.js.gz +0 -0
  20. package/dist/client/assets/{DiffViewer-BPbCNAf4.js → DiffViewer-eDeRzaL8.js} +4 -4
  21. package/dist/client/assets/DiffViewer-eDeRzaL8.js.br +0 -0
  22. package/dist/client/assets/DiffViewer-eDeRzaL8.js.gz +0 -0
  23. package/dist/client/assets/{ModelPreview-BAT3hzdd.js → ModelPreview-BGjF2yOr.js} +1 -1
  24. package/dist/client/assets/ModelPreview-BGjF2yOr.js.br +0 -0
  25. package/dist/client/assets/{ModelPreview-BAT3hzdd.js.gz → ModelPreview-BGjF2yOr.js.gz} +0 -0
  26. package/dist/client/assets/{RightSidebar-By9TweTY.js → RightSidebar-D-9oktAD.js} +17 -17
  27. package/dist/client/assets/RightSidebar-D-9oktAD.js.br +0 -0
  28. package/dist/client/assets/RightSidebar-D-9oktAD.js.gz +0 -0
  29. package/dist/client/assets/{abnfDiagram-VCTEODGH-Bk16uzXD.js → abnfDiagram-VCTEODGH-C_u-rr2R.js} +1 -1
  30. package/dist/client/assets/abnfDiagram-VCTEODGH-C_u-rr2R.js.br +0 -0
  31. package/dist/client/assets/abnfDiagram-VCTEODGH-C_u-rr2R.js.gz +0 -0
  32. package/dist/client/assets/app-CCG0_5GJ.js +34 -0
  33. package/dist/client/assets/app-CCG0_5GJ.js.br +0 -0
  34. package/dist/client/assets/app-CCG0_5GJ.js.gz +0 -0
  35. package/dist/client/assets/{arc-DMBlezaP.js → arc-BjJQU3mv.js} +1 -1
  36. package/dist/client/assets/arc-BjJQU3mv.js.br +0 -0
  37. package/dist/client/assets/arc-BjJQU3mv.js.gz +0 -0
  38. package/dist/client/assets/{architectureDiagram-5GKGNRK7-Br-msIoJ.js → architectureDiagram-5GKGNRK7-BKFWaLFO.js} +1 -1
  39. package/dist/client/assets/architectureDiagram-5GKGNRK7-BKFWaLFO.js.br +0 -0
  40. package/dist/client/assets/architectureDiagram-5GKGNRK7-BKFWaLFO.js.gz +0 -0
  41. package/dist/client/assets/{blockDiagram-I7D4REHJ-C-x58YCu.js → blockDiagram-I7D4REHJ-MJoV1FUB.js} +1 -1
  42. package/dist/client/assets/blockDiagram-I7D4REHJ-MJoV1FUB.js.br +0 -0
  43. package/dist/client/assets/blockDiagram-I7D4REHJ-MJoV1FUB.js.gz +0 -0
  44. package/dist/client/assets/{c4Diagram-7LVT6UL2-CAlEaMdj.js → c4Diagram-7LVT6UL2-C6SNtzsx.js} +1 -1
  45. package/dist/client/assets/{c4Diagram-7LVT6UL2-CAlEaMdj.js.br → c4Diagram-7LVT6UL2-C6SNtzsx.js.br} +0 -0
  46. package/dist/client/assets/c4Diagram-7LVT6UL2-C6SNtzsx.js.gz +0 -0
  47. package/dist/client/assets/channel-CoI73tW-.js +1 -0
  48. package/dist/client/assets/{chunk-2Q5K7J3B-U4aknoFM.js → chunk-2Q5K7J3B-B3I8Qke5.js} +1 -1
  49. package/dist/client/assets/{chunk-5VM5RSS4-CqAHZBUv.js → chunk-5VM5RSS4-D-ibpXtD.js} +1 -1
  50. package/dist/client/assets/{chunk-F27PBJKO-1RzLwPRG.js → chunk-F27PBJKO-CuZ4Nj7k.js} +1 -1
  51. package/dist/client/assets/chunk-F27PBJKO-CuZ4Nj7k.js.br +0 -0
  52. package/dist/client/assets/chunk-F27PBJKO-CuZ4Nj7k.js.gz +0 -0
  53. package/dist/client/assets/{chunk-IMKFNOWR-C5FRcAip.js → chunk-IMKFNOWR-DFMuErBg.js} +1 -1
  54. package/dist/client/assets/chunk-IMKFNOWR-DFMuErBg.js.br +0 -0
  55. package/dist/client/assets/chunk-IMKFNOWR-DFMuErBg.js.gz +0 -0
  56. package/dist/client/assets/{chunk-JWPE2WC7-w3aNMbTO.js → chunk-JWPE2WC7-MLbO0_Sh.js} +1 -1
  57. package/dist/client/assets/{chunk-POPQ4Y6H-BH_7SqIs.js → chunk-POPQ4Y6H-Dhwd4cP5.js} +1 -1
  58. package/dist/client/assets/{chunk-SVP7TREG-DpPJEz7q.js → chunk-SVP7TREG-0oMXOqu5.js} +1 -1
  59. package/dist/client/assets/chunk-SVP7TREG-0oMXOqu5.js.br +0 -0
  60. package/dist/client/assets/chunk-SVP7TREG-0oMXOqu5.js.gz +0 -0
  61. package/dist/client/assets/{chunk-TICWLB2K-C1ufAM96.js → chunk-TICWLB2K-CTZsC7zh.js} +1 -1
  62. package/dist/client/assets/chunk-TICWLB2K-CTZsC7zh.js.br +0 -0
  63. package/dist/client/assets/chunk-TICWLB2K-CTZsC7zh.js.gz +0 -0
  64. package/dist/client/assets/{chunk-XXDRQBXY-BBol0FkH.js → chunk-XXDRQBXY-D62Xn6d4.js} +1 -1
  65. package/dist/client/assets/classDiagram-ZZMXUADV-uCZC6P8X.js +1 -0
  66. package/dist/client/assets/classDiagram-v2-VYDZK3BY-uCZC6P8X.js +1 -0
  67. package/dist/client/assets/{cose-bilkent-JH36ORCC-QCrdjZd-.js → cose-bilkent-JH36ORCC-D6WY17YG.js} +1 -1
  68. package/dist/client/assets/cose-bilkent-JH36ORCC-D6WY17YG.js.br +0 -0
  69. package/dist/client/assets/cose-bilkent-JH36ORCC-D6WY17YG.js.gz +0 -0
  70. package/dist/client/assets/{cynefin-OW5HDTMX-VeSZI5Am.js → cynefin-OW5HDTMX-CjsSgc5Y.js} +1 -1
  71. package/dist/client/assets/{cynefin-OW5HDTMX-VeSZI5Am.js.br → cynefin-OW5HDTMX-CjsSgc5Y.js.br} +0 -0
  72. package/dist/client/assets/cynefin-OW5HDTMX-CjsSgc5Y.js.gz +0 -0
  73. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-UYuiPQMA.js → cynefinDiagram-5FMLGOSQ-C13y_2L6.js} +1 -1
  74. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C13y_2L6.js.br +0 -0
  75. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C13y_2L6.js.gz +0 -0
  76. package/dist/client/assets/{dagre-GXQ25YYZ-CPwpP7i8.js → dagre-GXQ25YYZ-B0MHDxwh.js} +1 -1
  77. package/dist/client/assets/dagre-GXQ25YYZ-B0MHDxwh.js.br +0 -0
  78. package/dist/client/assets/dagre-GXQ25YYZ-B0MHDxwh.js.gz +0 -0
  79. package/dist/client/assets/{diagram-S7CK7UJ4-cvc-fmR5.js → diagram-S7CK7UJ4-WAAoUwwE.js} +1 -1
  80. package/dist/client/assets/diagram-S7CK7UJ4-WAAoUwwE.js.br +0 -0
  81. package/dist/client/assets/diagram-S7CK7UJ4-WAAoUwwE.js.gz +0 -0
  82. package/dist/client/assets/{diagram-UQ7AKVKN-BN9b-Gbr.js → diagram-UQ7AKVKN-oFLYjxnU.js} +1 -1
  83. package/dist/client/assets/diagram-UQ7AKVKN-oFLYjxnU.js.br +0 -0
  84. package/dist/client/assets/diagram-UQ7AKVKN-oFLYjxnU.js.gz +0 -0
  85. package/dist/client/assets/{diagram-VSXAHHWV-D_vwPGhu.js → diagram-VSXAHHWV-BT52UWVf.js} +1 -1
  86. package/dist/client/assets/diagram-VSXAHHWV-BT52UWVf.js.br +0 -0
  87. package/dist/client/assets/diagram-VSXAHHWV-BT52UWVf.js.gz +0 -0
  88. package/dist/client/assets/{diagram-VX7I27RA-IvWBliYG.js → diagram-VX7I27RA-DHtHhHeL.js} +1 -1
  89. package/dist/client/assets/diagram-VX7I27RA-DHtHhHeL.js.br +0 -0
  90. package/dist/client/assets/diagram-VX7I27RA-DHtHhHeL.js.gz +0 -0
  91. package/dist/client/assets/{diagram-Z3DM3KII-DsD7ugta.js → diagram-Z3DM3KII-DYn8h5C5.js} +1 -1
  92. package/dist/client/assets/diagram-Z3DM3KII-DYn8h5C5.js.br +0 -0
  93. package/dist/client/assets/diagram-Z3DM3KII-DYn8h5C5.js.gz +0 -0
  94. package/dist/client/assets/{ebnfDiagram-PWID7BFC-LUfIm08H.js → ebnfDiagram-PWID7BFC-DVOMPQsS.js} +1 -1
  95. package/dist/client/assets/ebnfDiagram-PWID7BFC-DVOMPQsS.js.br +0 -0
  96. package/dist/client/assets/ebnfDiagram-PWID7BFC-DVOMPQsS.js.gz +0 -0
  97. package/dist/client/assets/{erDiagram-RLTQ6QDP-CxO1vcSC.js → erDiagram-RLTQ6QDP-DwpXqEHm.js} +1 -1
  98. package/dist/client/assets/erDiagram-RLTQ6QDP-DwpXqEHm.js.br +0 -0
  99. package/dist/client/assets/erDiagram-RLTQ6QDP-DwpXqEHm.js.gz +0 -0
  100. package/dist/client/assets/{flowDiagram-HODETNUW-BxsXGvzu.js → flowDiagram-HODETNUW-6tQKtyeA.js} +1 -1
  101. package/dist/client/assets/flowDiagram-HODETNUW-6tQKtyeA.js.br +0 -0
  102. package/dist/client/assets/flowDiagram-HODETNUW-6tQKtyeA.js.gz +0 -0
  103. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CZqsom0a.js → ganttDiagram-EL5Y4UJY-D6HUcRY5.js} +1 -1
  104. package/dist/client/assets/ganttDiagram-EL5Y4UJY-D6HUcRY5.js.br +0 -0
  105. package/dist/client/assets/ganttDiagram-EL5Y4UJY-D6HUcRY5.js.gz +0 -0
  106. package/dist/client/assets/{gestureArbiter-D-L8_LpU.js → gestureArbiter-CKf2Hkgj.js} +1 -1
  107. package/dist/client/assets/gestureArbiter-CKf2Hkgj.js.br +0 -0
  108. package/dist/client/assets/gestureArbiter-CKf2Hkgj.js.gz +0 -0
  109. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CM0LprRw.js → gitGraphDiagram-WWUBYQGX-BBaP9rSI.js} +1 -1
  110. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BBaP9rSI.js.br +0 -0
  111. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BBaP9rSI.js.gz +0 -0
  112. package/dist/client/assets/{index-BxbMl-YL.css → index-Up8msTxj.css} +1 -1
  113. package/dist/client/assets/index-Up8msTxj.css.br +0 -0
  114. package/dist/client/assets/index-Up8msTxj.css.gz +0 -0
  115. package/dist/client/assets/{infoDiagram-27XIBGKW-BrgL7Wgw.js → infoDiagram-27XIBGKW-BYOUI1Il.js} +1 -1
  116. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-_5bWdZR9.js → ishikawaDiagram-5VMMS53U-DCBgwWjy.js} +1 -1
  117. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DCBgwWjy.js.br +0 -0
  118. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DCBgwWjy.js.gz +0 -0
  119. package/dist/client/assets/{journeyDiagram-3NMN7TZE-DLBGD3H_.js → journeyDiagram-3NMN7TZE-BYmgOj5N.js} +1 -1
  120. package/dist/client/assets/journeyDiagram-3NMN7TZE-BYmgOj5N.js.br +0 -0
  121. package/dist/client/assets/journeyDiagram-3NMN7TZE-BYmgOj5N.js.gz +0 -0
  122. package/dist/client/assets/{kanban-definition-UXKFOSKX-BT9usdy_.js → kanban-definition-UXKFOSKX-CocyGtkP.js} +1 -1
  123. package/dist/client/assets/kanban-definition-UXKFOSKX-CocyGtkP.js.br +0 -0
  124. package/dist/client/assets/kanban-definition-UXKFOSKX-CocyGtkP.js.gz +0 -0
  125. package/dist/client/assets/{layout-BWSPteFE.js → layout-DWBpjpOF.js} +1 -1
  126. package/dist/client/assets/layout-DWBpjpOF.js.br +0 -0
  127. package/dist/client/assets/layout-DWBpjpOF.js.gz +0 -0
  128. package/dist/client/assets/{linear-BFBAjVvD.js → linear-qeQYuaIB.js} +1 -1
  129. package/dist/client/assets/linear-qeQYuaIB.js.br +0 -0
  130. package/dist/client/assets/linear-qeQYuaIB.js.gz +0 -0
  131. package/dist/client/assets/{mermaid.core-cgws6gqZ.js → mermaid.core-DseMo_Ai.js} +5 -5
  132. package/dist/client/assets/mermaid.core-DseMo_Ai.js.br +0 -0
  133. package/dist/client/assets/mermaid.core-DseMo_Ai.js.gz +0 -0
  134. package/dist/client/assets/{mindmap-definition-YA3MSWOX-omElBGNi.js → mindmap-definition-YA3MSWOX-DQ_Ucqr1.js} +1 -1
  135. package/dist/client/assets/mindmap-definition-YA3MSWOX-DQ_Ucqr1.js.br +0 -0
  136. package/dist/client/assets/mindmap-definition-YA3MSWOX-DQ_Ucqr1.js.gz +0 -0
  137. package/dist/client/assets/passwordBootstrap-BrwZSxjM.js +2 -0
  138. package/dist/client/assets/passwordBootstrap-BrwZSxjM.js.br +0 -0
  139. package/dist/client/assets/passwordBootstrap-BrwZSxjM.js.gz +0 -0
  140. package/dist/client/assets/{pegDiagram-XKGWAZYB-C8T74N_K.js → pegDiagram-XKGWAZYB-Ccz6wuVe.js} +1 -1
  141. package/dist/client/assets/pegDiagram-XKGWAZYB-Ccz6wuVe.js.br +0 -0
  142. package/dist/client/assets/pegDiagram-XKGWAZYB-Ccz6wuVe.js.gz +0 -0
  143. package/dist/client/assets/{pieDiagram-E7YTZNPT-BYLfEfAi.js → pieDiagram-E7YTZNPT-BVkAvjMD.js} +1 -1
  144. package/dist/client/assets/pieDiagram-E7YTZNPT-BVkAvjMD.js.br +0 -0
  145. package/dist/client/assets/pieDiagram-E7YTZNPT-BVkAvjMD.js.gz +0 -0
  146. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-mpPXf0Qe.js → quadrantDiagram-AXDQQJYC-D3yIXDEz.js} +1 -1
  147. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D3yIXDEz.js.br +0 -0
  148. package/dist/client/assets/quadrantDiagram-AXDQQJYC-D3yIXDEz.js.gz +0 -0
  149. package/dist/client/assets/{railroadDiagram-O6MQD6OU-Chw-WSL2.js → railroadDiagram-O6MQD6OU-CiCBCnVM.js} +1 -1
  150. package/dist/client/assets/railroadDiagram-O6MQD6OU-CiCBCnVM.js.br +0 -0
  151. package/dist/client/assets/railroadDiagram-O6MQD6OU-CiCBCnVM.js.gz +0 -0
  152. package/dist/client/assets/referenceLongPress-D8KX1cLU.js +1 -0
  153. package/dist/client/assets/referenceLongPress-D8KX1cLU.js.br +0 -0
  154. package/dist/client/assets/referenceLongPress-D8KX1cLU.js.gz +0 -0
  155. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BjCi2vMX.js → requirementDiagram-BXWQKSXE-DFolqcJu.js} +1 -1
  156. package/dist/client/assets/requirementDiagram-BXWQKSXE-DFolqcJu.js.br +0 -0
  157. package/dist/client/assets/requirementDiagram-BXWQKSXE-DFolqcJu.js.gz +0 -0
  158. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DJHQa94v.js → sankeyDiagram-P5KCCOFB-MHrVR1HM.js} +1 -1
  159. package/dist/client/assets/sankeyDiagram-P5KCCOFB-MHrVR1HM.js.br +0 -0
  160. package/dist/client/assets/sankeyDiagram-P5KCCOFB-MHrVR1HM.js.gz +0 -0
  161. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Db_9FOcd.js → sequenceDiagram-WJ2MYXX4-BAaWJNOh.js} +1 -1
  162. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BAaWJNOh.js.br +0 -0
  163. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BAaWJNOh.js.gz +0 -0
  164. package/dist/client/assets/{sizeCapture-INFHLROL-DkMDFfNb.js → sizeCapture-INFHLROL-DG7HBuJy.js} +1 -1
  165. package/dist/client/assets/sizeCapture-INFHLROL-DG7HBuJy.js.br +0 -0
  166. package/dist/client/assets/sizeCapture-INFHLROL-DG7HBuJy.js.gz +0 -0
  167. package/dist/client/assets/{sparkles-BOa0rxsG.js → sparkles-CaTLsKw2.js} +1 -1
  168. package/dist/client/assets/{stateDiagram-D77RDMKH-k18uHDaB.js → stateDiagram-D77RDMKH-8W5KUqNo.js} +1 -1
  169. package/dist/client/assets/stateDiagram-D77RDMKH-8W5KUqNo.js.br +0 -0
  170. package/dist/client/assets/stateDiagram-D77RDMKH-8W5KUqNo.js.gz +0 -0
  171. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BffKX60h.js +1 -0
  172. package/dist/client/assets/{swimlanes-42K2YHIH-Ii5YmMuR.js → swimlanes-42K2YHIH-Vn41F0Yk.js} +1 -1
  173. package/dist/client/assets/swimlanes-42K2YHIH-Vn41F0Yk.js.br +0 -0
  174. package/dist/client/assets/swimlanes-42K2YHIH-Vn41F0Yk.js.gz +0 -0
  175. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BBSzZUFZ.js +8 -0
  176. package/dist/client/assets/{timeline-definition-24CTP7MA-Bz1ihhnW.js → timeline-definition-24CTP7MA-FBkTRIh_.js} +1 -1
  177. package/dist/client/assets/timeline-definition-24CTP7MA-FBkTRIh_.js.br +0 -0
  178. package/dist/client/assets/timeline-definition-24CTP7MA-FBkTRIh_.js.gz +0 -0
  179. package/dist/client/assets/{triangle-alert-DjTkarlR.js → triangle-alert-uzQ1_yYw.js} +1 -1
  180. package/dist/client/assets/{vennDiagram-4TSXK5OY-C4keR7zu.js → vennDiagram-4TSXK5OY-CeQQKZ6B.js} +1 -1
  181. package/dist/client/assets/vennDiagram-4TSXK5OY-CeQQKZ6B.js.br +0 -0
  182. package/dist/client/assets/vennDiagram-4TSXK5OY-CeQQKZ6B.js.gz +0 -0
  183. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-CnuhM6Ku.js → wardleyDiagram-VM6X3IG4-Dxg6BkMa.js} +1 -1
  184. package/dist/client/assets/wardleyDiagram-VM6X3IG4-Dxg6BkMa.js.br +0 -0
  185. package/dist/client/assets/wardleyDiagram-VM6X3IG4-Dxg6BkMa.js.gz +0 -0
  186. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C_FOBDil.js → xychartDiagram-S5SC5T6Z-KYdnUfr7.js} +1 -1
  187. package/dist/client/assets/xychartDiagram-S5SC5T6Z-KYdnUfr7.js.br +0 -0
  188. package/dist/client/assets/xychartDiagram-S5SC5T6Z-KYdnUfr7.js.gz +0 -0
  189. package/dist/client/index.html +2 -2
  190. package/dist/client/index.html.br +0 -0
  191. package/dist/client/index.html.gz +0 -0
  192. package/dist/client/sw-downloads.js +4 -1
  193. package/dist/client/sw-downloads.js.br +0 -0
  194. package/dist/client/sw-downloads.js.gz +0 -0
  195. package/dist/client/sw-notifications.js +9 -7
  196. package/dist/client/sw-notifications.js.br +0 -0
  197. package/dist/client/sw-notifications.js.gz +0 -0
  198. package/dist/client/sw-secure-api.js +10 -4
  199. package/dist/client/sw-secure-api.js.br +0 -0
  200. package/dist/client/sw-secure-api.js.gz +0 -0
  201. package/dist/client/sw.js +1 -1
  202. package/dist/client/sw.js.br +0 -0
  203. package/dist/client/sw.js.gz +0 -0
  204. package/dist/server/agent/collaborationPrompt.js +1 -1
  205. package/dist/server/ptyHost.js +2 -0
  206. package/dist/server/routes/terminal.js +31 -6
  207. package/dist/server/utils/bootCheck.js +2 -0
  208. package/dist/server/utils/ensureNodePty.js +9 -0
  209. package/dist/server/utils/ptySpawnBackoff.js +35 -0
  210. package/dist/server/utils/publicSecurity.js +2 -1
  211. package/package.json +2 -2
  212. package/runtime-manifest.json +4 -4
  213. package/scripts/ensure-node-pty.cjs +63 -0
  214. package/scripts/node-pty-darwin-spawn.inc +64 -0
  215. package/scripts/postinstall.mjs +3 -0
  216. package/scripts/prepare-desktop-runtime.mjs +3 -0
  217. package/dist/client/assets/App-CFFI-TT7.js +0 -150
  218. package/dist/client/assets/App-CFFI-TT7.js.br +0 -0
  219. package/dist/client/assets/App-CFFI-TT7.js.gz +0 -0
  220. package/dist/client/assets/ChangeWalkthroughPanel-DLyqq7b5.js.br +0 -0
  221. package/dist/client/assets/ChangeWalkthroughPanel-DLyqq7b5.js.gz +0 -0
  222. package/dist/client/assets/DagPlayground-DRfTbwp8.js.br +0 -0
  223. package/dist/client/assets/DagPlayground-DRfTbwp8.js.gz +0 -0
  224. package/dist/client/assets/DiffLab-DKN99QG9.js.br +0 -0
  225. package/dist/client/assets/DiffLab-DKN99QG9.js.gz +0 -0
  226. package/dist/client/assets/DiffReview-CwIniDBI.js +0 -1
  227. package/dist/client/assets/DiffReview-CwIniDBI.js.br +0 -0
  228. package/dist/client/assets/DiffReview-CwIniDBI.js.gz +0 -0
  229. package/dist/client/assets/DiffReviewLab-BF4-lS-2.js.br +0 -0
  230. package/dist/client/assets/DiffReviewLab-BF4-lS-2.js.gz +0 -0
  231. package/dist/client/assets/DiffViewer-BPbCNAf4.js.br +0 -0
  232. package/dist/client/assets/DiffViewer-BPbCNAf4.js.gz +0 -0
  233. package/dist/client/assets/ModelPreview-BAT3hzdd.js.br +0 -0
  234. package/dist/client/assets/RightSidebar-By9TweTY.js.br +0 -0
  235. package/dist/client/assets/RightSidebar-By9TweTY.js.gz +0 -0
  236. package/dist/client/assets/abnfDiagram-VCTEODGH-Bk16uzXD.js.br +0 -0
  237. package/dist/client/assets/abnfDiagram-VCTEODGH-Bk16uzXD.js.gz +0 -0
  238. package/dist/client/assets/app--ptzLpkm.js +0 -34
  239. package/dist/client/assets/app--ptzLpkm.js.br +0 -0
  240. package/dist/client/assets/app--ptzLpkm.js.gz +0 -0
  241. package/dist/client/assets/arc-DMBlezaP.js.br +0 -0
  242. package/dist/client/assets/arc-DMBlezaP.js.gz +0 -0
  243. package/dist/client/assets/architectureDiagram-5GKGNRK7-Br-msIoJ.js.br +0 -0
  244. package/dist/client/assets/architectureDiagram-5GKGNRK7-Br-msIoJ.js.gz +0 -0
  245. package/dist/client/assets/blockDiagram-I7D4REHJ-C-x58YCu.js.br +0 -0
  246. package/dist/client/assets/blockDiagram-I7D4REHJ-C-x58YCu.js.gz +0 -0
  247. package/dist/client/assets/c4Diagram-7LVT6UL2-CAlEaMdj.js.gz +0 -0
  248. package/dist/client/assets/channel-mb_Wh_TH.js +0 -1
  249. package/dist/client/assets/chunk-F27PBJKO-1RzLwPRG.js.br +0 -0
  250. package/dist/client/assets/chunk-F27PBJKO-1RzLwPRG.js.gz +0 -0
  251. package/dist/client/assets/chunk-IMKFNOWR-C5FRcAip.js.br +0 -0
  252. package/dist/client/assets/chunk-IMKFNOWR-C5FRcAip.js.gz +0 -0
  253. package/dist/client/assets/chunk-SVP7TREG-DpPJEz7q.js.br +0 -0
  254. package/dist/client/assets/chunk-SVP7TREG-DpPJEz7q.js.gz +0 -0
  255. package/dist/client/assets/chunk-TICWLB2K-C1ufAM96.js.br +0 -0
  256. package/dist/client/assets/chunk-TICWLB2K-C1ufAM96.js.gz +0 -0
  257. package/dist/client/assets/classDiagram-ZZMXUADV-BA6cN_wA.js +0 -1
  258. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BA6cN_wA.js +0 -1
  259. package/dist/client/assets/cose-bilkent-JH36ORCC-QCrdjZd-.js.br +0 -0
  260. package/dist/client/assets/cose-bilkent-JH36ORCC-QCrdjZd-.js.gz +0 -0
  261. package/dist/client/assets/cynefin-OW5HDTMX-VeSZI5Am.js.gz +0 -0
  262. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-UYuiPQMA.js.br +0 -0
  263. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-UYuiPQMA.js.gz +0 -0
  264. package/dist/client/assets/dagre-GXQ25YYZ-CPwpP7i8.js.br +0 -0
  265. package/dist/client/assets/dagre-GXQ25YYZ-CPwpP7i8.js.gz +0 -0
  266. package/dist/client/assets/diagram-S7CK7UJ4-cvc-fmR5.js.br +0 -0
  267. package/dist/client/assets/diagram-S7CK7UJ4-cvc-fmR5.js.gz +0 -0
  268. package/dist/client/assets/diagram-UQ7AKVKN-BN9b-Gbr.js.br +0 -0
  269. package/dist/client/assets/diagram-UQ7AKVKN-BN9b-Gbr.js.gz +0 -0
  270. package/dist/client/assets/diagram-VSXAHHWV-D_vwPGhu.js.br +0 -0
  271. package/dist/client/assets/diagram-VSXAHHWV-D_vwPGhu.js.gz +0 -0
  272. package/dist/client/assets/diagram-VX7I27RA-IvWBliYG.js.br +0 -0
  273. package/dist/client/assets/diagram-VX7I27RA-IvWBliYG.js.gz +0 -0
  274. package/dist/client/assets/diagram-Z3DM3KII-DsD7ugta.js.br +0 -0
  275. package/dist/client/assets/diagram-Z3DM3KII-DsD7ugta.js.gz +0 -0
  276. package/dist/client/assets/ebnfDiagram-PWID7BFC-LUfIm08H.js.br +0 -0
  277. package/dist/client/assets/ebnfDiagram-PWID7BFC-LUfIm08H.js.gz +0 -0
  278. package/dist/client/assets/erDiagram-RLTQ6QDP-CxO1vcSC.js.br +0 -0
  279. package/dist/client/assets/erDiagram-RLTQ6QDP-CxO1vcSC.js.gz +0 -0
  280. package/dist/client/assets/flowDiagram-HODETNUW-BxsXGvzu.js.br +0 -0
  281. package/dist/client/assets/flowDiagram-HODETNUW-BxsXGvzu.js.gz +0 -0
  282. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CZqsom0a.js.br +0 -0
  283. package/dist/client/assets/ganttDiagram-EL5Y4UJY-CZqsom0a.js.gz +0 -0
  284. package/dist/client/assets/gestureArbiter-D-L8_LpU.js.br +0 -0
  285. package/dist/client/assets/gestureArbiter-D-L8_LpU.js.gz +0 -0
  286. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CM0LprRw.js.br +0 -0
  287. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CM0LprRw.js.gz +0 -0
  288. package/dist/client/assets/index-BxbMl-YL.css.br +0 -0
  289. package/dist/client/assets/index-BxbMl-YL.css.gz +0 -0
  290. package/dist/client/assets/ishikawaDiagram-5VMMS53U-_5bWdZR9.js.br +0 -0
  291. package/dist/client/assets/ishikawaDiagram-5VMMS53U-_5bWdZR9.js.gz +0 -0
  292. package/dist/client/assets/journeyDiagram-3NMN7TZE-DLBGD3H_.js.br +0 -0
  293. package/dist/client/assets/journeyDiagram-3NMN7TZE-DLBGD3H_.js.gz +0 -0
  294. package/dist/client/assets/kanban-definition-UXKFOSKX-BT9usdy_.js.br +0 -0
  295. package/dist/client/assets/kanban-definition-UXKFOSKX-BT9usdy_.js.gz +0 -0
  296. package/dist/client/assets/layout-BWSPteFE.js.br +0 -0
  297. package/dist/client/assets/layout-BWSPteFE.js.gz +0 -0
  298. package/dist/client/assets/linear-BFBAjVvD.js.br +0 -0
  299. package/dist/client/assets/linear-BFBAjVvD.js.gz +0 -0
  300. package/dist/client/assets/mermaid.core-cgws6gqZ.js.br +0 -0
  301. package/dist/client/assets/mermaid.core-cgws6gqZ.js.gz +0 -0
  302. package/dist/client/assets/mindmap-definition-YA3MSWOX-omElBGNi.js.br +0 -0
  303. package/dist/client/assets/mindmap-definition-YA3MSWOX-omElBGNi.js.gz +0 -0
  304. package/dist/client/assets/passwordBootstrap-Cljd9Rbw.js +0 -2
  305. package/dist/client/assets/passwordBootstrap-Cljd9Rbw.js.br +0 -0
  306. package/dist/client/assets/passwordBootstrap-Cljd9Rbw.js.gz +0 -0
  307. package/dist/client/assets/pegDiagram-XKGWAZYB-C8T74N_K.js.br +0 -0
  308. package/dist/client/assets/pegDiagram-XKGWAZYB-C8T74N_K.js.gz +0 -0
  309. package/dist/client/assets/pieDiagram-E7YTZNPT-BYLfEfAi.js.br +0 -0
  310. package/dist/client/assets/pieDiagram-E7YTZNPT-BYLfEfAi.js.gz +0 -0
  311. package/dist/client/assets/quadrantDiagram-AXDQQJYC-mpPXf0Qe.js.br +0 -0
  312. package/dist/client/assets/quadrantDiagram-AXDQQJYC-mpPXf0Qe.js.gz +0 -0
  313. package/dist/client/assets/railroadDiagram-O6MQD6OU-Chw-WSL2.js.br +0 -0
  314. package/dist/client/assets/railroadDiagram-O6MQD6OU-Chw-WSL2.js.gz +0 -0
  315. package/dist/client/assets/referenceLongPress-CkoqkG5k.js +0 -1
  316. package/dist/client/assets/referenceLongPress-CkoqkG5k.js.br +0 -0
  317. package/dist/client/assets/referenceLongPress-CkoqkG5k.js.gz +0 -0
  318. package/dist/client/assets/requirementDiagram-BXWQKSXE-BjCi2vMX.js.br +0 -0
  319. package/dist/client/assets/requirementDiagram-BXWQKSXE-BjCi2vMX.js.gz +0 -0
  320. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DJHQa94v.js.br +0 -0
  321. package/dist/client/assets/sankeyDiagram-P5KCCOFB-DJHQa94v.js.gz +0 -0
  322. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Db_9FOcd.js.br +0 -0
  323. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Db_9FOcd.js.gz +0 -0
  324. package/dist/client/assets/sizeCapture-INFHLROL-DkMDFfNb.js.br +0 -0
  325. package/dist/client/assets/sizeCapture-INFHLROL-DkMDFfNb.js.gz +0 -0
  326. package/dist/client/assets/stateDiagram-D77RDMKH-k18uHDaB.js.br +0 -0
  327. package/dist/client/assets/stateDiagram-D77RDMKH-k18uHDaB.js.gz +0 -0
  328. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DlvGImBG.js +0 -1
  329. package/dist/client/assets/swimlanes-42K2YHIH-Ii5YmMuR.js.br +0 -0
  330. package/dist/client/assets/swimlanes-42K2YHIH-Ii5YmMuR.js.gz +0 -0
  331. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CyO4bKWX.js +0 -8
  332. package/dist/client/assets/timeline-definition-24CTP7MA-Bz1ihhnW.js.br +0 -0
  333. package/dist/client/assets/timeline-definition-24CTP7MA-Bz1ihhnW.js.gz +0 -0
  334. package/dist/client/assets/vennDiagram-4TSXK5OY-C4keR7zu.js.br +0 -0
  335. package/dist/client/assets/vennDiagram-4TSXK5OY-C4keR7zu.js.gz +0 -0
  336. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnuhM6Ku.js.br +0 -0
  337. package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnuhM6Ku.js.gz +0 -0
  338. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C_FOBDil.js.br +0 -0
  339. package/dist/client/assets/xychartDiagram-S5SC5T6Z-C_FOBDil.js.gz +0 -0
@@ -1,3 +1,5 @@
1
+ import { ensureNodePty } from '../utils/ensureNodePty.js';
2
+ import { PtySpawnBackoff, PtySpawnDeferredError } from '../utils/ptySpawnBackoff.js';
1
3
  import { collaborationGroupRoutes } from '../agent/collaborationGroupRoutes.js';
2
4
  import { TerminalClientAttachment } from '../utils/terminalClientAttachment.js';
3
5
  import { redrawTmuxClient } from '../utils/tmuxClientRedraw.js';
@@ -1423,8 +1425,8 @@ function tryDeliverCollaborationInbox(frontendSessionId) {
1423
1425
  const unavailable = remote.serviceConnected !== true || Date.now() - (remote.serviceCheckedAt ?? 0) > 15_000;
1424
1426
  return { delivered: [], pending: collaborationStore.pendingCount(frontendSessionId),
1425
1427
  serviceUnavailable: unavailable, reason: unavailable
1426
- ? `服务 ${remote.serviceLabel} 不可达:消息尚未送达,仅保存在待发送队列;请勿等待对方已收到的回复,服务重连且 Mac 客户端运行后重试投递。`
1427
- : '跨服务消息尚未确认送达,正在等待 Mac 客户端转发。' };
1428
+ ? `服务 ${remote.serviceLabel} 不可达:消息尚未送达,仅保存在待发送队列;请勿等待对方已收到的回复,服务重连且转发客户端恢复运行后重试投递。`
1429
+ : '跨服务消息尚未确认送达,正在等待在线客户端转发。' };
1428
1430
  }
1429
1431
  collaborationDeliveryWorker.wake(frontendSessionId);
1430
1432
  const route = collaborationDeliveryWorker.state(frontendSessionId);
@@ -5034,6 +5036,7 @@ async function getPtyProvider() {
5034
5036
  }
5035
5037
  }
5036
5038
  try {
5039
+ ensureNodePty();
5037
5040
  const nodePty = await import('node-pty');
5038
5041
  console.log('Using node-pty for terminal sessions');
5039
5042
  return { spawn: nodePty.spawn, backend: 'node-pty' };
@@ -7126,6 +7129,7 @@ async function executeTmuxAction(tmuxTarget, action, body, control) {
7126
7129
  }
7127
7130
  return { shouldBroadcastLayout };
7128
7131
  }
7132
+ const attachmentSpawnBackoff = new PtySpawnBackoff();
7129
7133
  export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, initialDimensions) {
7130
7134
  const session = terminalSessions.get(sessionId);
7131
7135
  if (!session) {
@@ -7146,6 +7150,7 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
7146
7150
  let outputWanted = options.outputActive !== false;
7147
7151
  let clientPaused = false;
7148
7152
  let replayRequest = null;
7153
+ let replayRetryTimer = null;
7149
7154
  let clientCols = session.cols;
7150
7155
  let clientRows = session.rows;
7151
7156
  let initialAttachmentResize = true;
@@ -7158,6 +7163,7 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
7158
7163
  if (ownTmux)
7159
7164
  independentTmuxClients.add(ws);
7160
7165
  const attachment = ownTmux ? new TerminalClientAttachment(async (cols, rows) => {
7166
+ attachmentSpawnBackoff.check();
7161
7167
  const provider = await getPtyProvider();
7162
7168
  const tmuxBinary = getTmuxBinary();
7163
7169
  const supportsFeatures = await supportsTmuxClientFeatures(tmuxBinary);
@@ -7171,10 +7177,10 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
7171
7177
  const env = buildInteractiveColorEnvironment({ ...process.env, PATH: buildAugmentedPath() });
7172
7178
  delete env.TMUX;
7173
7179
  delete env.TMUX_PANE;
7174
- return provider.spawn(tmuxBinary, buildTmuxAttachArgs(session.tmuxSessionName, supportsFeatures), {
7180
+ return attachmentSpawnBackoff.spawn(() => provider.spawn(tmuxBinary, buildTmuxAttachArgs(session.tmuxSessionName, supportsFeatures), {
7175
7181
  name: 'xterm-256color', cols, rows, cwd: session.cwd || os.homedir(),
7176
7182
  env: { ...env, TERM: 'xterm-256color', COLORTERM: 'truecolor' },
7177
- });
7183
+ }));
7178
7184
  }, (data) => {
7179
7185
  if (ws.readyState !== ws.OPEN)
7180
7186
  return;
@@ -7200,6 +7206,8 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
7200
7206
  persistAndBroadcastGlobalState();
7201
7207
  }
7202
7208
  const sendReplay = (requestedSince = initialSince, clientEpoch = options.streamEpoch) => {
7209
+ if (replayRetryTimer)
7210
+ return Promise.resolve();
7203
7211
  if (replayRequest)
7204
7212
  return replayRequest;
7205
7213
  const sinceSeq = resolveTerminalReplayCursor(requestedSince, clientEpoch, TERMINAL_STREAM_EPOCH);
@@ -7333,8 +7341,25 @@ export function handleTerminalWebSocket(ws, sessionId, clientId, options = {}, i
7333
7341
  })().catch((error) => {
7334
7342
  initialScreen?.cancel();
7335
7343
  initialScreen = null;
7336
- console.warn(`[ws] replay failed session=${sessionId}: ${getErrorMessage(error)}`);
7337
- if (ws.readyState === ws.OPEN)
7344
+ if (!(error instanceof PtySpawnDeferredError)) {
7345
+ console.warn(`[ws] replay failed session=${sessionId}: ${getErrorMessage(error)}`);
7346
+ }
7347
+ const retryAfterMs = attachment ? attachmentSpawnBackoff.retryAfterMs : 0;
7348
+ if (retryAfterMs > 0 && ws.readyState === ws.OPEN) {
7349
+ // Hold failed connections through the cooldown, so automatic reconnect
7350
+ // does not itself become a high-frequency handshake loop.
7351
+ const timer = setTimeout(() => {
7352
+ replayRetryTimer = null;
7353
+ ws.off('close', cancelRetry);
7354
+ if (ws.readyState === ws.OPEN)
7355
+ ws.close(1013, 'PTY temporarily unavailable');
7356
+ }, retryAfterMs);
7357
+ replayRetryTimer = timer;
7358
+ const cancelRetry = () => { clearTimeout(timer); replayRetryTimer = null; };
7359
+ timer.unref();
7360
+ ws.once('close', cancelRetry);
7361
+ }
7362
+ else if (ws.readyState === ws.OPEN)
7338
7363
  ws.close(1011, 'Replay unavailable');
7339
7364
  }).finally(() => { replayRequest = null; });
7340
7365
  return replayRequest;
@@ -1,3 +1,4 @@
1
+ import { ensureNodePty } from './ensureNodePty.js';
1
2
  /**
2
3
  * Termdock 启动自检 — 确保原生模块和系统依赖在启动时可用
3
4
  *
@@ -253,6 +254,7 @@ function checkTmux() {
253
254
  // ---------------------------------------------------------------------------
254
255
  let _cachedResult = null;
255
256
  export function runBootChecks() {
257
+ ensureNodePty(); // Must precede the global marker and any native module load.
256
258
  if (_cachedResult)
257
259
  return _cachedResult;
258
260
  // 如果 marker 存在且有效,读取缓存的检查结果
@@ -0,0 +1,9 @@
1
+ import { createRequire } from 'node:module';
2
+ // Both src/server/utils and dist/server/utils resolve to the shipped scripts.
3
+ const require = createRequire(import.meta.url);
4
+ export function ensureNodePty() {
5
+ if (process.platform !== 'darwin')
6
+ return;
7
+ const { ensureNodePty: ensure } = require('../../../scripts/ensure-node-pty.cjs');
8
+ ensure(require.resolve('node-pty/package.json').replace(/[/\\]package\.json$/, ''));
9
+ }
@@ -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
+ }
@@ -32,12 +32,13 @@ export const securityHeaders = (req, res, next) => {
32
32
  const preview = /^\/api\/terminal\/fs(?:\/|$)/i.test(req.path);
33
33
  const host = req.get('host') ?? '';
34
34
  const shellSource = /^[a-z0-9.\-:\[\]]+$/i.test(host) ? `http://${host}/preview-shell.html https://${host}/preview-shell.html` : "'none'";
35
+ const workspaceSource = /^[a-z0-9.\-:\[\]]+$/i.test(host) ? `http://${host}/workspace.html https://${host}/workspace.html` : '';
35
36
  const shell = req.path === '/preview-shell.html';
36
37
  res.setHeader('Content-Security-Policy', shell
37
38
  ? "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline' 'wasm-unsafe-eval' blob: https: http:; style-src 'unsafe-inline' blob: https:; img-src blob: data: https:; font-src blob: data: https:; media-src blob: data: https:; connect-src blob: https: wss:; worker-src blob:; frame-src 'none'; frame-ancestors 'self'; object-src 'none'; base-uri https://termdock-preview.invalid; form-action 'none'"
38
39
  : preview
39
40
  ? "sandbox allow-scripts; frame-ancestors 'self'; object-src 'none'; base-uri 'self'"
40
- : `script-src 'self' 'wasm-unsafe-eval'; script-src-attr 'none'; worker-src 'self' blob:; frame-src ${shellSource}; frame-ancestors 'self'; object-src 'none'; base-uri 'self'`);
41
+ : `script-src 'self' 'wasm-unsafe-eval'; script-src-attr 'none'; worker-src 'self' blob:; frame-src ${shellSource} ${workspaceSource}; frame-ancestors 'self'; object-src 'none'; base-uri 'self'`);
41
42
  if (getPublicOrigin()) {
42
43
  res.setHeader('Strict-Transport-Security', 'max-age=31536000');
43
44
  if (!isAuthEnabled()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.183",
3
+ "version": "1.4.185",
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.183",
4
+ "version": "1.4.185",
5
5
  "runtimeProtocolVersion": 1,
6
6
  "minimumDesktopVersion": "1.4.46",
7
7
  "nodeMajor": 22,
8
- "dependencyHash": "sha256-kSujny2SLOFnZ1ffxm1FYtli7g1vEN8d3vj1oQeLLdc=",
9
- "serverBundleHash": "sha256-//OpMMWFXRg8QzpFFBu/P7z4cA1+K9ZU3DV4Ns/JAwM=",
10
- "clientBundleHash": "sha256-UGaJ61xoKrp6tvQ+Ux7cOVgZWkgcERW4ZT/h5DYHbxo=",
8
+ "dependencyHash": "sha256-K4KyYJuVoQDpZsBM8ZX1Rw3MddOxAzVdp/cPm0iGZz0=",
9
+ "serverBundleHash": "sha256-ujVeh2byUUue1ZHjY2QYb+f4sO3osPXityEDTuliPD8=",
10
+ "clientBundleHash": "sha256-ofo9lDUDNVOo2nZLRNKzOfg3EcY+LsalkE4kOBYYbtY=",
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',