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.
- package/.desktop-dist/main.js +24 -1
- package/dist/client/assets/App-D_s_HKS_.js +150 -0
- package/dist/client/assets/App-D_s_HKS_.js.br +0 -0
- package/dist/client/assets/App-D_s_HKS_.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-DLyqq7b5.js → ChangeWalkthroughPanel-Cu0Yao62.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-Cu0Yao62.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Cu0Yao62.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DRfTbwp8.js → DagPlayground-CSOix-HK.js} +1 -1
- package/dist/client/assets/DagPlayground-CSOix-HK.js.br +0 -0
- package/dist/client/assets/DagPlayground-CSOix-HK.js.gz +0 -0
- package/dist/client/assets/{DiffLab-DKN99QG9.js → DiffLab-BcAWbOO6.js} +1 -1
- package/dist/client/assets/DiffLab-BcAWbOO6.js.br +0 -0
- package/dist/client/assets/DiffLab-BcAWbOO6.js.gz +0 -0
- package/dist/client/assets/DiffReview-BWjdAFLx.js +1 -0
- package/dist/client/assets/DiffReview-BWjdAFLx.js.br +0 -0
- package/dist/client/assets/DiffReview-BWjdAFLx.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-BF4-lS-2.js → DiffReviewLab-Cu6iJ0Qj.js} +2 -2
- package/dist/client/assets/DiffReviewLab-Cu6iJ0Qj.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-Cu6iJ0Qj.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-BPbCNAf4.js → DiffViewer-eDeRzaL8.js} +4 -4
- package/dist/client/assets/DiffViewer-eDeRzaL8.js.br +0 -0
- package/dist/client/assets/DiffViewer-eDeRzaL8.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-BAT3hzdd.js → ModelPreview-BGjF2yOr.js} +1 -1
- package/dist/client/assets/ModelPreview-BGjF2yOr.js.br +0 -0
- package/dist/client/assets/{ModelPreview-BAT3hzdd.js.gz → ModelPreview-BGjF2yOr.js.gz} +0 -0
- package/dist/client/assets/{RightSidebar-By9TweTY.js → RightSidebar-D-9oktAD.js} +17 -17
- package/dist/client/assets/RightSidebar-D-9oktAD.js.br +0 -0
- package/dist/client/assets/RightSidebar-D-9oktAD.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-Bk16uzXD.js → abnfDiagram-VCTEODGH-C_u-rr2R.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-C_u-rr2R.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-C_u-rr2R.js.gz +0 -0
- package/dist/client/assets/app-CCG0_5GJ.js +34 -0
- package/dist/client/assets/app-CCG0_5GJ.js.br +0 -0
- package/dist/client/assets/app-CCG0_5GJ.js.gz +0 -0
- package/dist/client/assets/{arc-DMBlezaP.js → arc-BjJQU3mv.js} +1 -1
- package/dist/client/assets/arc-BjJQU3mv.js.br +0 -0
- package/dist/client/assets/arc-BjJQU3mv.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-Br-msIoJ.js → architectureDiagram-5GKGNRK7-BKFWaLFO.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BKFWaLFO.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BKFWaLFO.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-C-x58YCu.js → blockDiagram-I7D4REHJ-MJoV1FUB.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-MJoV1FUB.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-MJoV1FUB.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-CAlEaMdj.js → c4Diagram-7LVT6UL2-C6SNtzsx.js} +1 -1
- package/dist/client/assets/{c4Diagram-7LVT6UL2-CAlEaMdj.js.br → c4Diagram-7LVT6UL2-C6SNtzsx.js.br} +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-C6SNtzsx.js.gz +0 -0
- package/dist/client/assets/channel-CoI73tW-.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-U4aknoFM.js → chunk-2Q5K7J3B-B3I8Qke5.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CqAHZBUv.js → chunk-5VM5RSS4-D-ibpXtD.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-1RzLwPRG.js → chunk-F27PBJKO-CuZ4Nj7k.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CuZ4Nj7k.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CuZ4Nj7k.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-C5FRcAip.js → chunk-IMKFNOWR-DFMuErBg.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-DFMuErBg.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DFMuErBg.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-w3aNMbTO.js → chunk-JWPE2WC7-MLbO0_Sh.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BH_7SqIs.js → chunk-POPQ4Y6H-Dhwd4cP5.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DpPJEz7q.js → chunk-SVP7TREG-0oMXOqu5.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-0oMXOqu5.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-0oMXOqu5.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-C1ufAM96.js → chunk-TICWLB2K-CTZsC7zh.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-CTZsC7zh.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CTZsC7zh.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BBol0FkH.js → chunk-XXDRQBXY-D62Xn6d4.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-uCZC6P8X.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-uCZC6P8X.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-QCrdjZd-.js → cose-bilkent-JH36ORCC-D6WY17YG.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-D6WY17YG.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-D6WY17YG.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-VeSZI5Am.js → cynefin-OW5HDTMX-CjsSgc5Y.js} +1 -1
- package/dist/client/assets/{cynefin-OW5HDTMX-VeSZI5Am.js.br → cynefin-OW5HDTMX-CjsSgc5Y.js.br} +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CjsSgc5Y.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-UYuiPQMA.js → cynefinDiagram-5FMLGOSQ-C13y_2L6.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C13y_2L6.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-C13y_2L6.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-CPwpP7i8.js → dagre-GXQ25YYZ-B0MHDxwh.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-B0MHDxwh.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B0MHDxwh.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-cvc-fmR5.js → diagram-S7CK7UJ4-WAAoUwwE.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-WAAoUwwE.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-WAAoUwwE.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BN9b-Gbr.js → diagram-UQ7AKVKN-oFLYjxnU.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-oFLYjxnU.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-oFLYjxnU.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-D_vwPGhu.js → diagram-VSXAHHWV-BT52UWVf.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-BT52UWVf.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BT52UWVf.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-IvWBliYG.js → diagram-VX7I27RA-DHtHhHeL.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-DHtHhHeL.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DHtHhHeL.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DsD7ugta.js → diagram-Z3DM3KII-DYn8h5C5.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DYn8h5C5.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DYn8h5C5.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-LUfIm08H.js → ebnfDiagram-PWID7BFC-DVOMPQsS.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DVOMPQsS.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-DVOMPQsS.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-CxO1vcSC.js → erDiagram-RLTQ6QDP-DwpXqEHm.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-DwpXqEHm.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DwpXqEHm.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BxsXGvzu.js → flowDiagram-HODETNUW-6tQKtyeA.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-6tQKtyeA.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-6tQKtyeA.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CZqsom0a.js → ganttDiagram-EL5Y4UJY-D6HUcRY5.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-D6HUcRY5.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-D6HUcRY5.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-D-L8_LpU.js → gestureArbiter-CKf2Hkgj.js} +1 -1
- package/dist/client/assets/gestureArbiter-CKf2Hkgj.js.br +0 -0
- package/dist/client/assets/gestureArbiter-CKf2Hkgj.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-CM0LprRw.js → gitGraphDiagram-WWUBYQGX-BBaP9rSI.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BBaP9rSI.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BBaP9rSI.js.gz +0 -0
- package/dist/client/assets/{index-BxbMl-YL.css → index-Up8msTxj.css} +1 -1
- package/dist/client/assets/index-Up8msTxj.css.br +0 -0
- package/dist/client/assets/index-Up8msTxj.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-BrgL7Wgw.js → infoDiagram-27XIBGKW-BYOUI1Il.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-_5bWdZR9.js → ishikawaDiagram-5VMMS53U-DCBgwWjy.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DCBgwWjy.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DCBgwWjy.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-DLBGD3H_.js → journeyDiagram-3NMN7TZE-BYmgOj5N.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BYmgOj5N.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BYmgOj5N.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-BT9usdy_.js → kanban-definition-UXKFOSKX-CocyGtkP.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CocyGtkP.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CocyGtkP.js.gz +0 -0
- package/dist/client/assets/{layout-BWSPteFE.js → layout-DWBpjpOF.js} +1 -1
- package/dist/client/assets/layout-DWBpjpOF.js.br +0 -0
- package/dist/client/assets/layout-DWBpjpOF.js.gz +0 -0
- package/dist/client/assets/{linear-BFBAjVvD.js → linear-qeQYuaIB.js} +1 -1
- package/dist/client/assets/linear-qeQYuaIB.js.br +0 -0
- package/dist/client/assets/linear-qeQYuaIB.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-cgws6gqZ.js → mermaid.core-DseMo_Ai.js} +5 -5
- package/dist/client/assets/mermaid.core-DseMo_Ai.js.br +0 -0
- package/dist/client/assets/mermaid.core-DseMo_Ai.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-omElBGNi.js → mindmap-definition-YA3MSWOX-DQ_Ucqr1.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-DQ_Ucqr1.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-DQ_Ucqr1.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-BrwZSxjM.js +2 -0
- package/dist/client/assets/passwordBootstrap-BrwZSxjM.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-BrwZSxjM.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-C8T74N_K.js → pegDiagram-XKGWAZYB-Ccz6wuVe.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-Ccz6wuVe.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Ccz6wuVe.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-BYLfEfAi.js → pieDiagram-E7YTZNPT-BVkAvjMD.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-BVkAvjMD.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BVkAvjMD.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-mpPXf0Qe.js → quadrantDiagram-AXDQQJYC-D3yIXDEz.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D3yIXDEz.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D3yIXDEz.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-Chw-WSL2.js → railroadDiagram-O6MQD6OU-CiCBCnVM.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CiCBCnVM.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CiCBCnVM.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-D8KX1cLU.js +1 -0
- package/dist/client/assets/referenceLongPress-D8KX1cLU.js.br +0 -0
- package/dist/client/assets/referenceLongPress-D8KX1cLU.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BjCi2vMX.js → requirementDiagram-BXWQKSXE-DFolqcJu.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DFolqcJu.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DFolqcJu.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-DJHQa94v.js → sankeyDiagram-P5KCCOFB-MHrVR1HM.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-MHrVR1HM.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-MHrVR1HM.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Db_9FOcd.js → sequenceDiagram-WJ2MYXX4-BAaWJNOh.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BAaWJNOh.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BAaWJNOh.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-DkMDFfNb.js → sizeCapture-INFHLROL-DG7HBuJy.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-DG7HBuJy.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DG7HBuJy.js.gz +0 -0
- package/dist/client/assets/{sparkles-BOa0rxsG.js → sparkles-CaTLsKw2.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-k18uHDaB.js → stateDiagram-D77RDMKH-8W5KUqNo.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-8W5KUqNo.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-8W5KUqNo.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BffKX60h.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-Ii5YmMuR.js → swimlanes-42K2YHIH-Vn41F0Yk.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-Vn41F0Yk.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-Vn41F0Yk.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BBSzZUFZ.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-Bz1ihhnW.js → timeline-definition-24CTP7MA-FBkTRIh_.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-FBkTRIh_.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-FBkTRIh_.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-DjTkarlR.js → triangle-alert-uzQ1_yYw.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-C4keR7zu.js → vennDiagram-4TSXK5OY-CeQQKZ6B.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-CeQQKZ6B.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CeQQKZ6B.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-CnuhM6Ku.js → wardleyDiagram-VM6X3IG4-Dxg6BkMa.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-Dxg6BkMa.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-Dxg6BkMa.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-C_FOBDil.js → xychartDiagram-S5SC5T6Z-KYdnUfr7.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-KYdnUfr7.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-KYdnUfr7.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw-downloads.js +4 -1
- package/dist/client/sw-downloads.js.br +0 -0
- package/dist/client/sw-downloads.js.gz +0 -0
- package/dist/client/sw-notifications.js +9 -7
- package/dist/client/sw-notifications.js.br +0 -0
- package/dist/client/sw-notifications.js.gz +0 -0
- package/dist/client/sw-secure-api.js +10 -4
- package/dist/client/sw-secure-api.js.br +0 -0
- package/dist/client/sw-secure-api.js.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/collaborationPrompt.js +1 -1
- package/dist/server/ptyHost.js +2 -0
- package/dist/server/routes/terminal.js +31 -6
- package/dist/server/utils/bootCheck.js +2 -0
- package/dist/server/utils/ensureNodePty.js +9 -0
- package/dist/server/utils/ptySpawnBackoff.js +35 -0
- package/dist/server/utils/publicSecurity.js +2 -1
- package/package.json +2 -2
- package/runtime-manifest.json +4 -4
- package/scripts/ensure-node-pty.cjs +63 -0
- package/scripts/node-pty-darwin-spawn.inc +64 -0
- package/scripts/postinstall.mjs +3 -0
- package/scripts/prepare-desktop-runtime.mjs +3 -0
- package/dist/client/assets/App-CFFI-TT7.js +0 -150
- package/dist/client/assets/App-CFFI-TT7.js.br +0 -0
- package/dist/client/assets/App-CFFI-TT7.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DLyqq7b5.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-DLyqq7b5.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DRfTbwp8.js.br +0 -0
- package/dist/client/assets/DagPlayground-DRfTbwp8.js.gz +0 -0
- package/dist/client/assets/DiffLab-DKN99QG9.js.br +0 -0
- package/dist/client/assets/DiffLab-DKN99QG9.js.gz +0 -0
- package/dist/client/assets/DiffReview-CwIniDBI.js +0 -1
- package/dist/client/assets/DiffReview-CwIniDBI.js.br +0 -0
- package/dist/client/assets/DiffReview-CwIniDBI.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-BF4-lS-2.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BF4-lS-2.js.gz +0 -0
- package/dist/client/assets/DiffViewer-BPbCNAf4.js.br +0 -0
- package/dist/client/assets/DiffViewer-BPbCNAf4.js.gz +0 -0
- package/dist/client/assets/ModelPreview-BAT3hzdd.js.br +0 -0
- package/dist/client/assets/RightSidebar-By9TweTY.js.br +0 -0
- package/dist/client/assets/RightSidebar-By9TweTY.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Bk16uzXD.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Bk16uzXD.js.gz +0 -0
- package/dist/client/assets/app--ptzLpkm.js +0 -34
- package/dist/client/assets/app--ptzLpkm.js.br +0 -0
- package/dist/client/assets/app--ptzLpkm.js.gz +0 -0
- package/dist/client/assets/arc-DMBlezaP.js.br +0 -0
- package/dist/client/assets/arc-DMBlezaP.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Br-msIoJ.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Br-msIoJ.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-C-x58YCu.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-C-x58YCu.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CAlEaMdj.js.gz +0 -0
- package/dist/client/assets/channel-mb_Wh_TH.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-1RzLwPRG.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-1RzLwPRG.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-C5FRcAip.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-C5FRcAip.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DpPJEz7q.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DpPJEz7q.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-C1ufAM96.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-C1ufAM96.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-BA6cN_wA.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BA6cN_wA.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-QCrdjZd-.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-QCrdjZd-.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-VeSZI5Am.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-UYuiPQMA.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-UYuiPQMA.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CPwpP7i8.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CPwpP7i8.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-cvc-fmR5.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-cvc-fmR5.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BN9b-Gbr.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BN9b-Gbr.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-D_vwPGhu.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-D_vwPGhu.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-IvWBliYG.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-IvWBliYG.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DsD7ugta.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DsD7ugta.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-LUfIm08H.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-LUfIm08H.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CxO1vcSC.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CxO1vcSC.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BxsXGvzu.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BxsXGvzu.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CZqsom0a.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CZqsom0a.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-D-L8_LpU.js.br +0 -0
- package/dist/client/assets/gestureArbiter-D-L8_LpU.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CM0LprRw.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CM0LprRw.js.gz +0 -0
- package/dist/client/assets/index-BxbMl-YL.css.br +0 -0
- package/dist/client/assets/index-BxbMl-YL.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-_5bWdZR9.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-_5bWdZR9.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DLBGD3H_.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DLBGD3H_.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BT9usdy_.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BT9usdy_.js.gz +0 -0
- package/dist/client/assets/layout-BWSPteFE.js.br +0 -0
- package/dist/client/assets/layout-BWSPteFE.js.gz +0 -0
- package/dist/client/assets/linear-BFBAjVvD.js.br +0 -0
- package/dist/client/assets/linear-BFBAjVvD.js.gz +0 -0
- package/dist/client/assets/mermaid.core-cgws6gqZ.js.br +0 -0
- package/dist/client/assets/mermaid.core-cgws6gqZ.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-omElBGNi.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-omElBGNi.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-Cljd9Rbw.js +0 -2
- package/dist/client/assets/passwordBootstrap-Cljd9Rbw.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Cljd9Rbw.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-C8T74N_K.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-C8T74N_K.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BYLfEfAi.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BYLfEfAi.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-mpPXf0Qe.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-mpPXf0Qe.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Chw-WSL2.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Chw-WSL2.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-CkoqkG5k.js +0 -1
- package/dist/client/assets/referenceLongPress-CkoqkG5k.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CkoqkG5k.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BjCi2vMX.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BjCi2vMX.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DJHQa94v.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DJHQa94v.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Db_9FOcd.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Db_9FOcd.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DkMDFfNb.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DkMDFfNb.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-k18uHDaB.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-k18uHDaB.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DlvGImBG.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-Ii5YmMuR.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-Ii5YmMuR.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CyO4bKWX.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-Bz1ihhnW.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Bz1ihhnW.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-C4keR7zu.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-C4keR7zu.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnuhM6Ku.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CnuhM6Ku.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-C_FOBDil.js.br +0 -0
- 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}
|
|
1427
|
-
: '
|
|
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
|
-
|
|
7337
|
-
|
|
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.
|
|
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": "
|
|
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",
|
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.185",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
|
-
"dependencyHash": "sha256-
|
|
9
|
-
"serverBundleHash": "sha256
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
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
|
+
}
|
package/scripts/postinstall.mjs
CHANGED
|
@@ -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',
|