termdock 1.4.313 → 1.4.315
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/dist/client/assets/{App-ChS2-lkz.js → App-B2SFV3qg.js} +53 -53
- package/dist/client/assets/App-B2SFV3qg.js.br +0 -0
- package/dist/client/assets/App-B2SFV3qg.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-JtjyyJoW.js → ArchitecturePanel-Cj7za6DZ.js} +6 -6
- package/dist/client/assets/ArchitecturePanel-Cj7za6DZ.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Cj7za6DZ.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-BlQ5-VPp.js → ChangeWalkthroughPanel-BB52iLLC.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-BB52iLLC.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BB52iLLC.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-aFLAMqDr.js → CollaborationMainWorkspace-D5WKV3rA.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-D5WKV3rA.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-D5WKV3rA.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-MwUgcmG_.js +2 -0
- package/dist/client/assets/ComputerControlView-Dkc4R1IU.js +5 -0
- package/dist/client/assets/ComputerControlView-Dkc4R1IU.js.br +0 -0
- package/dist/client/assets/ComputerControlView-Dkc4R1IU.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-CR4uDFOx.js → DagPlayground-BHY3l8UG.js} +1 -1
- package/dist/client/assets/DagPlayground-BHY3l8UG.js.br +0 -0
- package/dist/client/assets/DagPlayground-BHY3l8UG.js.gz +0 -0
- package/dist/client/assets/{DiffLab-BqeHMDOy.js → DiffLab-BSQiKfBJ.js} +1 -1
- package/dist/client/assets/DiffLab-BSQiKfBJ.js.br +0 -0
- package/dist/client/assets/DiffLab-BSQiKfBJ.js.gz +0 -0
- package/dist/client/assets/{DiffReview-DqrOcRfP.js → DiffReview-CYrBBq0V.js} +1 -1
- package/dist/client/assets/DiffReview-CYrBBq0V.js.br +0 -0
- package/dist/client/assets/DiffReview-CYrBBq0V.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CEYpbrL6.js → DiffReviewLab-VSIbEnxm.js} +1 -1
- package/dist/client/assets/DiffReviewLab-VSIbEnxm.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-VSIbEnxm.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-F-uQSmhG.js → DiffViewer-Cx5fyiMB.js} +8 -8
- package/dist/client/assets/DiffViewer-Cx5fyiMB.js.br +0 -0
- package/dist/client/assets/DiffViewer-Cx5fyiMB.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-KmXFkgij.js → ModelPreview-B22odexG.js} +1 -1
- package/dist/client/assets/ModelPreview-B22odexG.js.br +0 -0
- package/dist/client/assets/ModelPreview-B22odexG.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-VMdXpo4h.js → RightSidebar-DKA0jXPW.js} +3 -3
- package/dist/client/assets/RightSidebar-DKA0jXPW.js.br +0 -0
- package/dist/client/assets/RightSidebar-DKA0jXPW.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-CAMk1C0N.js → abnfDiagram-VCTEODGH-sbUSsiPn.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-sbUSsiPn.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-sbUSsiPn.js.gz +0 -0
- package/dist/client/assets/app-CYOLJycb.js +35 -0
- package/dist/client/assets/app-CYOLJycb.js.br +0 -0
- package/dist/client/assets/app-CYOLJycb.js.gz +0 -0
- package/dist/client/assets/{arc-CYG_-1vC.js → arc-GhJ9aeQ3.js} +1 -1
- package/dist/client/assets/arc-GhJ9aeQ3.js.br +0 -0
- package/dist/client/assets/arc-GhJ9aeQ3.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-BqHzezLR.js → architectureDiagram-5GKGNRK7-BYmAIJBx.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BYmAIJBx.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BYmAIJBx.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-D6GWRO_Z.js → blockDiagram-I7D4REHJ-CZNZT_ez.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-CZNZT_ez.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CZNZT_ez.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-CutmGIGb.js → c4Diagram-7LVT6UL2-6xcSowLn.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-6xcSowLn.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-6xcSowLn.js.gz +0 -0
- package/dist/client/assets/channel-C1FwyjiU.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-DwiUpGFu.js → chunk-2Q5K7J3B-C06nkhUQ.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-C35gLPSH.js → chunk-5VM5RSS4-BHY43hJO.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-CNptP19P.js → chunk-F27PBJKO-Dl8JYcZO.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-Dl8JYcZO.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-Dl8JYcZO.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-DHdpB9A0.js → chunk-IMKFNOWR-BALi4Q3g.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-BALi4Q3g.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BALi4Q3g.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-CrKSOzdE.js → chunk-JWPE2WC7-BBD2d7j7.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-CiZGLRSk.js → chunk-POPQ4Y6H-CZN0_ndj.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-B70pX8OB.js → chunk-SVP7TREG-CD-Zf9rn.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-CD-Zf9rn.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CD-Zf9rn.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-Ba1mI99F.js → chunk-TICWLB2K-Clpg1zwp.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-Clpg1zwp.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Clpg1zwp.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-DmKIl18h.js → chunk-XXDRQBXY-BanPVnIr.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-FyKDan8T.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-FyKDan8T.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-C-NMDUHW.js → cose-bilkent-JH36ORCC-431u7cfU.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-431u7cfU.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-431u7cfU.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-CZgEc1ab.js → cynefin-OW5HDTMX-BuLFGx14.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BuLFGx14.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BuLFGx14.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CHQeSNm2.js → cynefinDiagram-5FMLGOSQ-qLzjwMMG.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-qLzjwMMG.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-qLzjwMMG.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-B_jkMdPS.js → dagre-GXQ25YYZ-CUdd5M5g.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-CUdd5M5g.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CUdd5M5g.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-nv6Lnsrp.js → diagram-S7CK7UJ4-DLQClBzm.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DLQClBzm.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DLQClBzm.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-BZf2fzaA.js → diagram-UQ7AKVKN-1RGASXU_.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-1RGASXU_.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-1RGASXU_.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-CxL0_BH8.js → diagram-VSXAHHWV-DqnCzn2R.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-DqnCzn2R.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DqnCzn2R.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-Dm9MqpIE.js → diagram-VX7I27RA-CMXsPqTS.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-CMXsPqTS.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CMXsPqTS.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-BIfTa7P5.js → diagram-Z3DM3KII-BM0N1kCR.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-BM0N1kCR.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BM0N1kCR.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-D4XhCDFS.js → ebnfDiagram-PWID7BFC-CvaVo-wh.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CvaVo-wh.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CvaVo-wh.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Dxd48dXC.js → erDiagram-RLTQ6QDP-okw-AY7i.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-okw-AY7i.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-okw-AY7i.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BXBMsEmE.js → flowDiagram-HODETNUW-B_DWtzOe.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-B_DWtzOe.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-B_DWtzOe.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CBfDd-KZ.js → ganttDiagram-EL5Y4UJY-Bm4nYUVg.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bm4nYUVg.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-Bm4nYUVg.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-DXLmNGli.js → gestureArbiter-XalN4TaN.js} +1 -1
- package/dist/client/assets/gestureArbiter-XalN4TaN.js.br +0 -0
- package/dist/client/assets/gestureArbiter-XalN4TaN.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DtLM68fN.js → gitGraphDiagram-WWUBYQGX-B7LAo8S2.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-B7LAo8S2.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-B7LAo8S2.js.gz +0 -0
- package/dist/client/assets/{index-KuPaZyuZ.css → index-BObjbh2R.css} +1 -1
- package/dist/client/assets/index-BObjbh2R.css.br +0 -0
- package/dist/client/assets/{index-KuPaZyuZ.css.gz → index-BObjbh2R.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-FRhqdJvW.js → infoDiagram-27XIBGKW-DXncUrwz.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DAHBvAZ-.js → ishikawaDiagram-5VMMS53U-Ds28H7pI.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.br → ishikawaDiagram-5VMMS53U-Ds28H7pI.js.br} +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Ds28H7pI.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-CVuWuL3Z.js → journeyDiagram-3NMN7TZE-WeF_efZ2.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-WeF_efZ2.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-WeF_efZ2.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-ByQSUVJV.js → kanban-definition-UXKFOSKX-CMbZcy6U.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-CMbZcy6U.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-CMbZcy6U.js.gz +0 -0
- package/dist/client/assets/{layout-Bb3Nb1c4.js → layout-DNapC8T-.js} +1 -1
- package/dist/client/assets/layout-DNapC8T-.js.br +0 -0
- package/dist/client/assets/layout-DNapC8T-.js.gz +0 -0
- package/dist/client/assets/{linear-DHMMQlOo.js → linear-B9AFx-TF.js} +1 -1
- package/dist/client/assets/linear-B9AFx-TF.js.br +0 -0
- package/dist/client/assets/linear-B9AFx-TF.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BYfniK0H.js → mermaid.core-Ddh1Z0hf.js} +5 -5
- package/dist/client/assets/mermaid.core-Ddh1Z0hf.js.br +0 -0
- package/dist/client/assets/mermaid.core-Ddh1Z0hf.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-EDLD5AyH.js → mindmap-definition-YA3MSWOX-B0xMGUol.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-B0xMGUol.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-B0xMGUol.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-DCrtirwT.js → passwordBootstrap-DQRd5vCF.js} +1 -1
- package/dist/client/assets/passwordBootstrap-DQRd5vCF.js.br +0 -0
- package/dist/client/assets/{passwordBootstrap-DCrtirwT.js.gz → passwordBootstrap-DQRd5vCF.js.gz} +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-BHYhkqJN.js → pegDiagram-XKGWAZYB-BVZ-3kEF.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BVZ-3kEF.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BVZ-3kEF.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-BUIJlswC.js → pieDiagram-E7YTZNPT-Cim4Hk3I.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-Cim4Hk3I.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Cim4Hk3I.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-D8Im-7yC.js → quadrantDiagram-AXDQQJYC-CYiEj5sp.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CYiEj5sp.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CYiEj5sp.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-D7n6z2G1.js → railroadDiagram-O6MQD6OU-DjNNfYra.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DjNNfYra.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DjNNfYra.js.gz +0 -0
- package/dist/client/assets/{rdpSession-DJlNIbVk.js → rdpSession-DEzSQAuN.js} +1 -1
- package/dist/client/assets/rdpSession-DEzSQAuN.js.br +0 -0
- package/dist/client/assets/rdpSession-DEzSQAuN.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-DFSrssSr.js → referenceLongPress-BjyTtoDY.js} +1 -1
- package/dist/client/assets/referenceLongPress-BjyTtoDY.js.br +0 -0
- package/dist/client/assets/referenceLongPress-BjyTtoDY.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Ki0rR-F7.js → requirementDiagram-BXWQKSXE-ZwiKdiI3.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-ZwiKdiI3.js.br +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Ki0rR-F7.js.gz → requirementDiagram-BXWQKSXE-ZwiKdiI3.js.gz} +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-36NmMqsW.js → sankeyDiagram-P5KCCOFB-BYR7ctps.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYR7ctps.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BYR7ctps.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-5vsPuFyO.js → sequenceDiagram-WJ2MYXX4-DxYCvK80.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DxYCvK80.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DxYCvK80.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-DbAulwBg.js → sizeCapture-INFHLROL-CXruk8Ko.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-CXruk8Ko.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CXruk8Ko.js.gz +0 -0
- package/dist/client/assets/{sparkles-CapLTKAs.js → sparkles-DRH97PDH.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-Bgwe0g5S.js → stateDiagram-D77RDMKH-CENDGrxr.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-CENDGrxr.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CENDGrxr.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-De-tGy_n.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-COGAWe-g.js → swimlanes-42K2YHIH-BZQeVFeA.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BZQeVFeA.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BZQeVFeA.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-D1YMLrIO.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-C4gt5z68.js → timeline-definition-24CTP7MA-DiJ9i33g.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DiJ9i33g.js.br +0 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-C4gt5z68.js.gz → timeline-definition-24CTP7MA-DiJ9i33g.js.gz} +0 -0
- package/dist/client/assets/{triangle-alert-xPHw25jD.js → triangle-alert-DECoBoOV.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-CIEXh9oD.js → vennDiagram-4TSXK5OY-DBiEJQ9Y.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DBiEJQ9Y.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DBiEJQ9Y.js.gz +0 -0
- package/dist/client/assets/{videoCompression-CUkCS2-q.js → videoCompression-8r1jOza9.js} +1 -1
- package/dist/client/assets/videoCompression-8r1jOza9.js.br +0 -0
- package/dist/client/assets/videoCompression-8r1jOza9.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-gQhcW1vd.js → wardleyDiagram-VM6X3IG4-B6wCSfya.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B6wCSfya.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B6wCSfya.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BmIcdejz.js → xychartDiagram-S5SC5T6Z-DlNQayU5.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DlNQayU5.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DlNQayU5.js.gz +0 -0
- package/dist/client/index.html +3 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/ipad-status-bar.js +12 -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/collaborationCli.js +30 -8
- package/dist/server/agent/collaborationStore.js +25 -2
- package/dist/server/agent/collaborationTmuxDelivery.js +11 -3
- package/dist/server/agent/integrationCli.js +15 -3
- package/dist/server/agent/integrationServer.js +16 -1
- package/dist/server/agent/integrationSessions.js +342 -14
- package/dist/server/agent/integrationStore.js +1 -1
- package/dist/server/agent/promptDelivery.js +7 -1
- package/dist/server/agent/sessionLaunchDiagnostics.js +26 -0
- package/dist/server/agent/sessionLifecycle.js +4 -0
- package/dist/server/agent/sessionManagement.js +87 -0
- package/dist/server/agent/terminalInput.js +9 -1
- package/dist/server/routes/terminal.js +172 -21
- package/docs/integrations.md +208 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-ChS2-lkz.js.br +0 -0
- package/dist/client/assets/App-ChS2-lkz.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-JtjyyJoW.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BlQ5-VPp.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-aFLAMqDr.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-BDQMRhU9.js +0 -2
- package/dist/client/assets/ComputerControlView-TAKDbBUl.js +0 -5
- package/dist/client/assets/ComputerControlView-TAKDbBUl.js.br +0 -0
- package/dist/client/assets/ComputerControlView-TAKDbBUl.js.gz +0 -0
- package/dist/client/assets/DagPlayground-CR4uDFOx.js.br +0 -0
- package/dist/client/assets/DagPlayground-CR4uDFOx.js.gz +0 -0
- package/dist/client/assets/DiffLab-BqeHMDOy.js.br +0 -0
- package/dist/client/assets/DiffLab-BqeHMDOy.js.gz +0 -0
- package/dist/client/assets/DiffReview-DqrOcRfP.js.br +0 -0
- package/dist/client/assets/DiffReview-DqrOcRfP.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CEYpbrL6.js.gz +0 -0
- package/dist/client/assets/DiffViewer-F-uQSmhG.js.br +0 -0
- package/dist/client/assets/DiffViewer-F-uQSmhG.js.gz +0 -0
- package/dist/client/assets/ModelPreview-KmXFkgij.js.br +0 -0
- package/dist/client/assets/ModelPreview-KmXFkgij.js.gz +0 -0
- package/dist/client/assets/RightSidebar-VMdXpo4h.js.br +0 -0
- package/dist/client/assets/RightSidebar-VMdXpo4h.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CAMk1C0N.js.gz +0 -0
- package/dist/client/assets/app-CHxLSuGQ.js +0 -35
- package/dist/client/assets/app-CHxLSuGQ.js.br +0 -0
- package/dist/client/assets/app-CHxLSuGQ.js.gz +0 -0
- package/dist/client/assets/arc-CYG_-1vC.js.br +0 -0
- package/dist/client/assets/arc-CYG_-1vC.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-BqHzezLR.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-D6GWRO_Z.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CutmGIGb.js.gz +0 -0
- package/dist/client/assets/channel-B3BKM2gg.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CNptP19P.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DHdpB9A0.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-B70pX8OB.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Ba1mI99F.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-CS4V_MQS.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CS4V_MQS.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-C-NMDUHW.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CZgEc1ab.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CHQeSNm2.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B_jkMdPS.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-nv6Lnsrp.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BZf2fzaA.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CxL0_BH8.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-Dm9MqpIE.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BIfTa7P5.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-D4XhCDFS.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Dxd48dXC.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BXBMsEmE.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CBfDd-KZ.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-DXLmNGli.js.br +0 -0
- package/dist/client/assets/gestureArbiter-DXLmNGli.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DtLM68fN.js.gz +0 -0
- package/dist/client/assets/index-KuPaZyuZ.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DAHBvAZ-.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CVuWuL3Z.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-ByQSUVJV.js.gz +0 -0
- package/dist/client/assets/layout-Bb3Nb1c4.js.br +0 -0
- package/dist/client/assets/layout-Bb3Nb1c4.js.gz +0 -0
- package/dist/client/assets/linear-DHMMQlOo.js.br +0 -0
- package/dist/client/assets/linear-DHMMQlOo.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BYfniK0H.js.br +0 -0
- package/dist/client/assets/mermaid.core-BYfniK0H.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-EDLD5AyH.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-DCrtirwT.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BHYhkqJN.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BUIJlswC.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D8Im-7yC.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-D7n6z2G1.js.gz +0 -0
- package/dist/client/assets/rdpSession-DJlNIbVk.js.br +0 -0
- package/dist/client/assets/rdpSession-DJlNIbVk.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-DFSrssSr.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DFSrssSr.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Ki0rR-F7.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-36NmMqsW.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-5vsPuFyO.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DbAulwBg.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Bgwe0g5S.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Bg6S3Zm0.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-COGAWe-g.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DwBBOocG.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-C4gt5z68.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CIEXh9oD.js.gz +0 -0
- package/dist/client/assets/videoCompression-CUkCS2-q.js.br +0 -0
- package/dist/client/assets/videoCompression-CUkCS2-q.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-gQhcW1vd.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BmIcdejz.js.gz +0 -0
package/docs/integrations.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# TD 通用外部接入(协议 1)
|
|
2
2
|
|
|
3
|
+
principal 改名/显式关闭要求 **CLI / 实际服务均至少 1.4.315**(见文末契约)。
|
|
4
|
+
|
|
3
5
|
最低 CLI / 运行服务版本:**termdock 1.4.300**,两者都必须升级并重启服务。
|
|
4
6
|
启动输入条件与保留凭据的策略更新要求 **CLI / 实际运行服务均至少 1.4.301**;协议仍为 1。
|
|
5
7
|
插件原生 ID 的前台 argv 回读及服务重启后的运行中 restore 核验修复要求
|
|
@@ -785,6 +787,104 @@ no-op restore 不创建新检查。报告跟随会话保存并可在服务重启
|
|
|
785
787
|
- 启动/恢复:`SESSION_CREATE_OUTCOME_UNKNOWN`, `SESSION_OPERATION_IN_PROGRESS`, `SESSION_BINDING_TIMEOUT`, `EXACT_RESUME_UNSUPPORTED`, `NATIVE_SESSION_ALREADY_RUNNING`, `NATIVE_SESSION_OWNER_UNCONFIRMED`, `AGENT_NOT_RUNNING`。
|
|
786
788
|
- 未分类异常:`SESSION_LAUNCH_FAILED`, `SESSION_OBSERVATION_FAILED`;错误不包含包装器输出、密钥或原始堆栈。
|
|
787
789
|
|
|
790
|
+
## 1.4.314:启动诊断与显式冷启动重试
|
|
791
|
+
|
|
792
|
+
最低 CLI 和实际运行服务均为 **1.4.314**,协议仍为 1。先回读两者版本及实际服务
|
|
793
|
+
`session_launch_diagnostics=true`、`session_cold_retry=true`;对应
|
|
794
|
+
`*_min_version` 均为 `1.4.314`。CLI 遇到不支持重试的服务返回
|
|
795
|
+
`SESSION_COLD_RETRY_UNSUPPORTED`,不发出重试请求。
|
|
796
|
+
|
|
797
|
+
管理员沿用 `td integration diagnostics <TD-session-id>`,同一响应新增
|
|
798
|
+
`launch_diagnostics`(可为 null)与 `launch_diagnostics_history`(最多 16 个此前实际
|
|
799
|
+
启动操作)。旧 `diagnostics` 原生所有者报告字段保持兼容;该入口仅回读持久记录,
|
|
800
|
+
不重新扫描进程、不挂接终端、不发送输入。313 及更早启动没有新增报告,不能从升级
|
|
801
|
+
反推旧失败原因。已有失败会话可以在满足下述检查后显式重试,产生新的诊断。
|
|
802
|
+
|
|
803
|
+
启动报告字段:
|
|
804
|
+
|
|
805
|
+
| 字段 | 含义 |
|
|
806
|
+
| --- | --- |
|
|
807
|
+
| `operation_id / generation / kind` | 此次操作和承载代次;kind 为 `cold_start / cold_retry / native_restore` |
|
|
808
|
+
| `phase / updated_at / steps` | 最后持久阶段和时间;steps 最多最近 24 个阶段,时间是 TD 记录时间 |
|
|
809
|
+
| `error_code / reason_code` | 公开失败码及已分类原因;无法分类为 `UNCLASSIFIED_LAUNCH_ERROR`,不保存原始错误文本 |
|
|
810
|
+
| `paste / submit` | 各自为 `not_attempted / attempted / write_returned`;attempted 在调用输入前持久保存,write_returned 表示调用返回 |
|
|
811
|
+
| `runtime_exists` | 最后观察是否存在原承载;没有观察时为 null,不代表读取时的实时进程 |
|
|
812
|
+
| `target_change` | 仅发生承载 fencing 冲突时可有:期望/当前 backend ID、期望/当前 launch ID、backend 实例是否相同 |
|
|
813
|
+
|
|
814
|
+
阶段清单:`configuration`、`runtime_prepare`、`binding_persist`、
|
|
815
|
+
`native_owner_check`(精确恢复)、`runtime_verify`、`launch_intent`、
|
|
816
|
+
`queue_wait`、`queue_acquired`、`paste_attempted`、`paste_written`、
|
|
817
|
+
`submit_attempted`、`submit_written`、`binding_observe`;中断冷重试回读到原 shell 时
|
|
818
|
+
另记 `reconciled_shell`。阶段只表示 TD 实际到达的步骤,不推断私有 CLI 根因。
|
|
819
|
+
崩溃在输入调用附近时,attempted 不能证明写入发生或未发生,不能据此补键。
|
|
820
|
+
write_returned 不证明原生程序消费、提交、成功执行或最终结果。正文仍按原机制
|
|
821
|
+
粘贴一次、等待至少 50ms、发送一次 CR;没有新的屏幕识别、启动 sleep 或额外 Enter。
|
|
822
|
+
|
|
823
|
+
完整报告仅管理员可读;principal 与主动 session 事件只返回
|
|
824
|
+
`launch_diagnostics_available=true`,不返回阶段、其他候选或结构证据。报告不保存
|
|
825
|
+
argv、命令正文、stdout/stderr、环境变量或凭据。报告历史受上述条数及原描述总存储
|
|
826
|
+
预算约束,不是无限保留的排查日志。
|
|
827
|
+
|
|
828
|
+
正式冷重试命令:
|
|
829
|
+
|
|
830
|
+
```sh
|
|
831
|
+
td collab --principal <id> session get <TD-session-id>
|
|
832
|
+
td integration diagnostics <TD-session-id>
|
|
833
|
+
td collab --principal <id> session retry-cold <TD-session-id> \
|
|
834
|
+
--generation <get返回的generation> --idempotency-key <本次操作唯一键>
|
|
835
|
+
```
|
|
836
|
+
|
|
837
|
+
权限沿用 **session.create**,并核对记录所属 principal/本机组、原 profile 当前仍被授权、
|
|
838
|
+
原 cwd 同时符合旧快照和当前目录授权。使用原启动配置快照,不接受新 argv/cwd/profile
|
|
839
|
+
参数。它保留逻辑 TD ID、消息关联和旧操作证据;实际尝试递增 generation、建立新
|
|
840
|
+
operation_id,状态为 starting,可能随后 binding_pending/ready/failed。返回的操作
|
|
841
|
+
快照不是实时状态;用 session get 查询最新状态。
|
|
842
|
+
|
|
843
|
+
只允许 failed、尚未绑定 native UUID、无 TD 消息历史/待投递且没有进行中或未确认操作
|
|
844
|
+
的记录;还需核实原绑定的唯一承载仍存在、原前台 Agent 已退出、回到合格 shell。
|
|
845
|
+
TD 会在生命周期锁及 worker 承载变更屏障内复核,不终止 Agent,不删除旧记录,不重建
|
|
846
|
+
消失或身份不明的终端。shell 检查不声称可读取用户未提交的任意草稿,调用方仍须拥有
|
|
847
|
+
输入操作权限并避免其他手工输入。TD 消息入队前设置持久、单调的历史标记;即使稍后
|
|
848
|
+
入队失败也保守拒绝冷重试。314 起消息裁剪保留双方历史标记;升级前已裁剪且没有 sender 标记的
|
|
849
|
+
历史无法证明完整,没有已知消息也返回未确认。旧格式或不可读存储同样拒绝;此缺口
|
|
850
|
+
持久保留,不因一次正常写入而被误判已修复。
|
|
851
|
+
|
|
852
|
+
必须有可信的原 launcher/plugin 恢复语义指纹且当前仍匹配;缺少指纹时管理员沿用
|
|
853
|
+
resume-configuration / confirm-resume 明确核对确认,不能把路径相同当内容相同。
|
|
854
|
+
指纹只覆盖 TD 已记录的 launcher 文件、原配置和插件恢复语义,不声称验证包装器依赖
|
|
855
|
+
或私有 Agent 二进制全部内容。
|
|
856
|
+
|
|
857
|
+
**cold retry 不是 native restore。** 无已知 UUID 时不能保证延续之前未知的原生历史,
|
|
858
|
+
也不证明旧程序未创建过原生历史;重试可能创建新 UUID。已有 UUID 必须使用原
|
|
859
|
+
session restore 与原生身份/重复所有者保护。原 session create 同幂等键继续回读已有
|
|
860
|
+
记录,不会自动冷重试。
|
|
861
|
+
|
|
862
|
+
同键同参数回读原操作结果,不再次启动;同键不同参数返回 IDEMPOTENCY_CONFLICT。
|
|
863
|
+
同会话不同操作键不能并发启动。重试意图和新代次在输入前持久保存,重试期间 send/reply
|
|
864
|
+
拒绝且不入队。服务重启后不会自动再启动:session get 核实原程序与 UUID 后可以转为
|
|
865
|
+
ready;回读精确原 shell 则为 failed/SESSION_COLD_RETRY_INTERRUPTED,明确结束未确认
|
|
866
|
+
状态,后续需新键显式重试;承载消失或仍不能确认时保留 cold_retry_pending=true 并拒绝
|
|
867
|
+
发送/重试。旧操作结果未提交且出现后续代次时,同旧键返回 OPERATION_OUTCOME_UNCONFIRMED,
|
|
868
|
+
不能把当前代次伪装为旧操作结果。
|
|
869
|
+
|
|
870
|
+
| 拒绝码(HTTP 409,另有注明时除外) | 含义 |
|
|
871
|
+
| --- | --- |
|
|
872
|
+
| `INVALID_SESSION_GENERATION / SESSION_GENERATION_MISMATCH` | 未传有效数值代次 / 代次已变 |
|
|
873
|
+
| `SESSION_COLD_RETRY_UNSUPPORTED` | CLI 或运行服务/adapter 不支持 |
|
|
874
|
+
| `SESSION_COLD_RETRY_NATIVE_BOUND` | 已有 UUID,应走精确 restore |
|
|
875
|
+
| `SESSION_COLD_RETRY_NOT_FAILED` | 当前不是 failed 冷启动 |
|
|
876
|
+
| `SESSION_MESSAGE_HISTORY_PRESENT / SESSION_MESSAGE_HISTORY_UNCONFIRMED` | 有消息/入队尝试 / 无法可靠核实历史 |
|
|
877
|
+
| `SESSION_COLD_RETRY_RUNTIME_UNCONFIRMED` | 无法核实原承载和退出 shell |
|
|
878
|
+
| `SESSION_OPERATION_IN_PROGRESS / OPERATION_OUTCOME_UNCONFIRMED` | 操作在进行 / 前次结果须对账 |
|
|
879
|
+
| `RESUME_CONFIGURATION_UNCONFIRMED / RESUME_CONFIGURATION_CHANGED` | 指纹缺失 / launcher 或恢复语义变化 |
|
|
880
|
+
| `SESSION_SCOPE_CONFLICT / SESSION_IDENTITY_MISMATCH` | 跨组承载或逻辑所有权冲突 |
|
|
881
|
+
| `LAUNCH_PROFILE_DENIED / SESSION_CWD_DENIED`(403) | 原 profile 或 cwd 当前不再授权 |
|
|
882
|
+
|
|
883
|
+
其他启动错误仍沿用前述准确码;fencing 冲突可为
|
|
884
|
+
`TERMINAL_INPUT_TARGET_CHANGED`,观察失败为 `SESSION_OBSERVATION_FAILED`,未知启动异常
|
|
885
|
+
为 `SESSION_LAUNCH_FAILED`,原 shell 检查失败可为 `SESSION_TARGET_NOT_SHELL`。
|
|
886
|
+
新能力并未确认 DevBox 私有 TraeX 的间歇启动原因,也不代替业务明确回复验收。
|
|
887
|
+
|
|
788
888
|
## 验收边界
|
|
789
889
|
|
|
790
890
|
本版维护机验证:共享释放协议、真实 Unix socket 权限/生命周期事件、零入队拒绝、
|
|
@@ -818,3 +918,111 @@ PID/start_id、实际 FD/inode 与内核 flock 一致的私有原生所有权证
|
|
|
818
918
|
并验证 Agent 真正加载原对话。
|
|
819
919
|
先完成测试环境的创建→追问→关联答复,再验重复键、追加咨询、断线重投和精确恢复。
|
|
820
920
|
业务定时器或正式群接入由使用方明确启用,TD 发版不会启用这些业务流程。
|
|
921
|
+
|
|
922
|
+
## 1.4.315:后台身份改名与显式关闭
|
|
923
|
+
|
|
924
|
+
最低 **CLI 与实际运行服务均为 1.4.315**;协议仍为 1。回读能力
|
|
925
|
+
`session_rename=true / session_rename_min_version=1.4.315`、
|
|
926
|
+
`session_close=true / session_close_min_version=1.4.315`。CLI 对缺少对应能力的服务返回
|
|
927
|
+
`SESSION_RENAME_UNSUPPORTED / SESSION_CLOSE_UNSUPPORTED`,不降级借用终端身份。
|
|
928
|
+
|
|
929
|
+
管理员在原完整策略中按需追加独立权限 `session.rename`、`session.close`,通过
|
|
930
|
+
`td integration update --file <policy.json>` 更新;旧身份不会自动获得这两个权限。
|
|
931
|
+
同一凭据、组、profile 和其他权限保留。后台 principal 不需要绑定终端,已有未删除的
|
|
932
|
+
本机授权组允许零活动成员;创建、恢复也不要求额外保留空管理成员。组的首次创建与
|
|
933
|
+
授权仍由管理员完成。普通手动创建的管理终端不属于 principal,不纳入这两个权限。
|
|
934
|
+
|
|
935
|
+
```sh
|
|
936
|
+
td collab --principal <id> session get <sid>
|
|
937
|
+
td collab --principal <id> session rename <sid> \
|
|
938
|
+
--generation <session-get-generation> --name 'Fast model' --idempotency-key <key>
|
|
939
|
+
td collab --principal <id> session close <sid> \
|
|
940
|
+
--generation <session-get-generation> --idempotency-key <key>
|
|
941
|
+
# 每次新操作前回读当前generation;同一请求重试保持相同参数与key。
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
对应本机 integration Unix socket 路由为 `POST /sessions/:id/rename`(JSON
|
|
945
|
+
`{generation,name,idempotency_key}`)和 `POST /sessions/:id/close`(JSON
|
|
946
|
+
`{generation,idempotency_key}`)。凭据仍只通过私有 credential file 注入,不能放 argv、
|
|
947
|
+
消息或日志。授权必须同时命中持久记录 `principal_id + group_id + session_id`,
|
|
948
|
+
不能修改同组其他 principal 或手动创建的成员;越界返回 `INTEGRATION_SESSION_NOT_FOUND`。
|
|
949
|
+
|
|
950
|
+
### 名称与代次
|
|
951
|
+
|
|
952
|
+
rename 复用已有名称清洗规则:控制字符/空白折叠、去首尾空白,截取最多 80 个字符;
|
|
953
|
+
清洗后为空返回 `INVALID_NAME`。名称保存为逻辑记录的 `name`,同步活动终端登记、
|
|
954
|
+
网页清单和 tmux 友好名称,释放后仍保留,下一次 restore 使用该名称。
|
|
955
|
+
released/closed 可以仅改审计名称,不重建运行承载、不启动 Agent、不写终端正文。
|
|
956
|
+
|
|
957
|
+
每次实际 rename 递增 generation,**保留原 launch `operation_id`、native UUID、
|
|
958
|
+
argv/profile/cwd/配置指纹及启动诊断**。`name_updated_at / name_generation /
|
|
959
|
+
name_operation_id` 记录本次改名对应的时间、代次和原操作;不把改名当作一次新启动。
|
|
960
|
+
新 `session.renamed` 事件包含 `{session_id,name,generation,operation_id}`,
|
|
961
|
+
沿用既有 event_id 去重、持久 inbox/ACK/重放契约。
|
|
962
|
+
|
|
963
|
+
先持久保存名称意图,再同步显示。`rename_pending=true` 表示名称已落盘,但显示同步
|
|
964
|
+
尚未收口;`session get` 或服务重启会重试显示同步,不重新递增、不创建终端。
|
|
965
|
+
进行中的启动/恢复/释放/关闭或不确定结果拒绝改名;待同步名称必须先通过 get 对账。
|
|
966
|
+
操作返回仍为 `{session: ...}`;不要把返回同键的历史快照当作最新状态。
|
|
967
|
+
|
|
968
|
+
### close 与 release 的区别
|
|
969
|
+
|
|
970
|
+
| 操作 | 运行承载 | 逻辑记录 | 后续恢复 |
|
|
971
|
+
|---|---|---|---|
|
|
972
|
+
| release | 只回收已退出 Agent 的精确原 shell | 保留原生恢复描述及消息关联 | 显式 restore 原 UUID |
|
|
973
|
+
| close | 明确结束精确自有运行 Agent,或原失败冷启动 shell | 保留审计、诊断及仍在保留期的消息 | closed 终态,首版不提供 reopen/restore |
|
|
974
|
+
|
|
975
|
+
close 不依据快照文字、忙闲、结果或验收推断是否可以终止。调用者负责业务授权与关闭
|
|
976
|
+
时机;TD 负责机械范围和承载核验。开始关闭会生成独立 `operation_id`、generation+1,
|
|
977
|
+
**先持久 `closing` 意图与精确目标实例,再进入既有 worker 屏障**,避免与自动终端写入
|
|
978
|
+
交叉。原 launch 诊断保留,其 operation_id 仍属于原启动,不随 close 改写。
|
|
979
|
+
|
|
980
|
+
必须无 pending 消息、无进行中/不确定启动或生命周期操作。scope 必须唯一:拒绝跨组
|
|
981
|
+
共有运行承载、其他逻辑所有者、链接到其他会话的 pane、分屏/其他 pane、原 tmux/pane 绑定变化。运行 Agent
|
|
982
|
+
需要当前 tmux server 实例与前台进程 PID/start identity、正确 Agent 与可验证的精确原 native UUID;
|
|
983
|
+
未绑定 UUID 的失败冷启动仅可关闭已证明的原 foreground shell,不能杀未确认的 Agent。
|
|
984
|
+
Linux 用当前 `/proc` starttime;macOS 用当前 `ps lstart` 与前台关系,不采用历史 PID。
|
|
985
|
+
不可观测平台/权限或缺失身份失败关闭。这里只做运行身份验证,不表示应用输入就绪。
|
|
986
|
+
|
|
987
|
+
终止前再次回读并比对原进程实例,按精确 tmux **session ID** 终止自有会话,不对
|
|
988
|
+
进程组执行批量 kill,不删除 native 历史、工作目录、credential、授权组或其他业务。
|
|
989
|
+
终止后最多观察 2 秒确认原实例与 tmux 消失,不重复终止。确认之后才移除活动 PTY、
|
|
990
|
+
侧栏登记和组成员并提交 `closed`、`runtime_present=false`、`terminal_binding=null`。
|
|
991
|
+
TD 生命周期锁不排他控制外部 tmux 命令/手工进程替换,最终核验与系统操作之间仍存在
|
|
992
|
+
外部竞争窗口;不承诺对未受 TD 控制的外部操作提供原子事务或阻止所有派生后台进程。
|
|
993
|
+
|
|
994
|
+
### 失败、幂等与重启
|
|
995
|
+
|
|
996
|
+
同一逻辑会话复用生命周期协调器;同参数同键合并/回读原操作,不重复终止。不同键
|
|
997
|
+
并发返回 `SESSION_OPERATION_IN_PROGRESS`;旧代次返回 `SESSION_GENERATION_MISMATCH`。
|
|
998
|
+
同键的已保存失败或 pending 结果也保持原快照,最新事实须另外 get。
|
|
999
|
+
|
|
1000
|
+
关闭意图未落盘时不终止承载。终止/清理/结果落盘失败时保留意图,报告 failed 与
|
|
1001
|
+
`operation_uncertain=true / close_pending=true / runtime_present=null`,不宣称 closed。
|
|
1002
|
+
重启及 get **只对账,不再发送终止**:确认原进程和 tmux 已不存在后,可以清理残留
|
|
1003
|
+
登记并收口 closed;仍存活、被替换或身份不明则保持拒绝,不自动杀可能的新进程。
|
|
1004
|
+
显式关闭过的记录即使出现异常新运行承载,也不会回到 ready。
|
|
1005
|
+
|
|
1006
|
+
`closed` 上新 send/reply/restore/retry-cold/release 返回 `SESSION_CLOSED`,不入队,
|
|
1007
|
+
不隐式新建 native UUID。尚未收口的 close 拒绝新投递及其他生命周期操作,先 get 对账。
|
|
1008
|
+
已保存的幂等操作结果可以回读,但不会执行新副作用。主动事件继续推送
|
|
1009
|
+
`session.closing / session.closed / session.failed`,payload 为公开 `{session}`;
|
|
1010
|
+
公开记录不暴露精确 close 进程目标,仅提供 `close_pending` 等状态。
|
|
1011
|
+
|
|
1012
|
+
| 错误 | 含义与处理 |
|
|
1013
|
+
|---|---|
|
|
1014
|
+
| INTEGRATION_PERMISSION_DENIED | 没有独立授权,不能借用成员身份绕过 |
|
|
1015
|
+
| INTEGRATION_SESSION_NOT_FOUND | 记录不属于当前 principal/本机组或不存在 |
|
|
1016
|
+
| INVALID_NAME / INVALID_SESSION_GENERATION / INVALID_IDEMPOTENCY_KEY | 修正参数后按正式契约调用 |
|
|
1017
|
+
| SESSION_GENERATION_MISMATCH / IDEMPOTENCY_CONFLICT | 代次或同键参数不同,回读状态;不要自动改参数重试 |
|
|
1018
|
+
| SESSION_OPERATION_IN_PROGRESS / SESSION_RENAME_SYNC_PENDING | 进行中或显示意图未收口,先 get |
|
|
1019
|
+
| SESSION_PENDING_MESSAGES | 存在待投递消息,业务先明确处理,TD不自动丢弃 |
|
|
1020
|
+
| SESSION_SCOPE_CONFLICT / SESSION_IDENTITY_MISMATCH | 共享归属、pane或原生身份冲突,管理员核对 |
|
|
1021
|
+
| SESSION_CLOSE_TARGET_UNCONFIRMED / SESSION_CLOSE_TARGET_CHANGED | 当前前台实例无法证明或意图后已变化,不终止未知进程 |
|
|
1022
|
+
| SESSION_CLOSE_FAILED / OPERATION_OUTCOME_UNCONFIRMED | 关闭/对账结果未确认,保留证据且不自动再次终止 |
|
|
1023
|
+
| SESSION_CLOSED | 审计终态,不能当 released 恢复 |
|
|
1024
|
+
|
|
1025
|
+
关闭不是消息送达、消费或业务完成证明;历史保留额度/事件保留缺口仍按原契约,不是
|
|
1026
|
+
永久审计存储。close 不增加 task、看板或 accepted。真实私有 TraeX 与 DevBox
|
|
1027
|
+
共享升级/业务适配由接入方后续验收;维护侧验证仅覆盖隔离测试的真实 tmux/Linux
|
|
1028
|
+
进程退出与源码回归。macOS 真实 close 路径尚未实机验收。
|
package/package.json
CHANGED
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.315",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-OcNFq1R90TyiGPlv/P8NiTYtCVsDIju/bXyESGY8kWI=",
|
|
10
|
+
"clientBundleHash": "sha256-tDdrBKrEm8DvNTZxh9nrfPrDrkgyyGJcKHHOtcL6TEo=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{bx as r}from"./app-CHxLSuGQ.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-VMdXpo4h.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-ChS2-lkz.js";import"./gestureArbiter-DXLmNGli.js";import"./triangle-alert-xPHw25jD.js";import"./referenceLongPress-DFSrssSr.js";import"./DiffReview-DqrOcRfP.js";import"./sparkles-CapLTKAs.js";import"./DiffViewer-F-uQSmhG.js";import"./ChangeWalkthroughPanel-BlQ5-VPp.js";function g({content:o}){const e=m.useMemo(()=>n(o.split(`
|
|
2
|
-
`),null,null),[o]);return r.jsx("div",{className:"min-w-0 space-y-3 break-words text-sm leading-6 text-foreground [&_h1]:text-lg [&_h2]:text-base [&_h3]:text-sm [&_pre]:max-w-full [&_table]:text-xs",children:e.map((t,i)=>r.jsx("div",{className:"min-w-0",children:typeof t.content=="function"?t.content(null):t.content},i))})}export{g as default};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-DJlNIbVk.js","assets/app-CHxLSuGQ.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-KuPaZyuZ.css","assets/ChangeWalkthroughPanel-BlQ5-VPp.js","assets/sparkles-CapLTKAs.js","assets/triangle-alert-xPHw25jD.js","assets/RightSidebar-VMdXpo4h.js","assets/App-ChS2-lkz.js","assets/gestureArbiter-DXLmNGli.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-DFSrssSr.js","assets/DiffReview-DqrOcRfP.js","assets/DiffViewer-F-uQSmhG.js","assets/DiffViewer-T3uj2-aP.css","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{af as Me,cw as lt,d9 as et,bx as t,ct as Ce,bw as _e,W as Xe,o as We,l as ut,X as dt,_ as qe}from"./app-CHxLSuGQ.js";import{b as o,r as mt}from"./dnd-BCFAPC0L.js";import{a as pt}from"./ChangeWalkthroughPanel-BlQ5-VPp.js";import{L as Ge}from"./RightSidebar-VMdXpo4h.js";import{X as Je,K as ft,j as ht}from"./App-ChS2-lkz.js";import{M as xt}from"./triangle-alert-xPHw25jD.js";const gt=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],Qe=Me("mouse-pointer-2",gt);const bt=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],yt=Me("settings-2",bt);const vt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],wt=Me("zoom-in",vt);function Ie(e){const s=e==="darwin"?"mac":e==="win32"?"windows":"linux",m={host:"127.0.0.1",platform:s,protocol:s==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:m,remote:{...m,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Ze(e,s){const m=Ie(s);if(!e||typeof e!="object")return m;const i=e,h=(c,x)=>{const l=c&&typeof c=="object"?c:{},R=(d,V)=>typeof l[d]=="string"&&l[d].length<=V&&!/[\x00-\x1f]/.test(l[d])?l[d]:x[d];return{host:R("host",253),username:R("username",255),domain:R("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:x.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:x.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:x.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:i.target==="remote"?"remote":"local",local:{...h(i.local,m.local),host:"127.0.0.1"},remote:h(i.remote,m.remote),viewOnly:i.viewOnly===!0,fit:i.fit!==!1,autoConnect:i.autoConnect!==!1}}function tt(e){return JSON.stringify([e.host.trim().toLowerCase(),e.protocol,e.protocol==="vnc"?5900:Number(e.port),e.username.trim(),e.domain.trim()])}function Ct(e){const[s,m]=o.useState(Ie),[i,h]=o.useState(!1),[c,x]=o.useState("loading"),[l,R]=o.useState(0),[d,V]=o.useState([]),[H,D]=o.useState("idle"),P=o.useRef(s),z=o.useRef(0),w=o.useRef(0),U=o.useRef(""),C=o.useRef(null),j=o.useRef(new Set),Y=o.useCallback(y=>{P.current=y(P.current),z.current++,m(P.current),x("saving")},[]);o.useEffect(()=>{const y=++w.current;z.current=0,U.current="",C.current=null,P.current=Ie(),m(P.current),h(!1),x("loading"),V([]),D("idle");const N=new AbortController;return fetch("/api/computer/preferences",{signal:N.signal}).then(async p=>{if(!p.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await p.json()}).then(p=>{if(y!==w.current||N.signal.aborted)return;let E=Ze(p.preferences);const I=z.current>0;if(!p.configured&&!I)try{const L=localStorage.getItem(`termdock:computer-host:${e}`);if(L){const B=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(L)?"local":"remote";E=Ze({...E,target:B,[B]:{...E[B],host:L,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||E[B].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),z.current++}}catch{}I||(P.current=E),U.current=p.configured?JSON.stringify(E):"",m(P.current),h(!0),x(p.configured?"saved":"saving"),V(Array.isArray(p.credentialKeys)?p.credentialKeys.filter(L=>typeof L=="string"):[]),D(p.credentialError?"error":"idle")}).catch(()=>{!N.signal.aborted&&y===w.current&&x("error")}),()=>{++w.current,N.abort();for(const p of j.current)p.abort();j.current.clear()}},[e,l]);const O=o.useCallback(()=>{if(C.current)return C.current;if(!i)return Promise.resolve(!1);const y=w.current,N=(async()=>{for(;U.current!==JSON.stringify(P.current);){const p=JSON.stringify(P.current),E=new AbortController;j.current.add(E),x("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:p,signal:E.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(y!==w.current)return!1;U.current=p}catch{return y===w.current&&x("error"),!1}finally{j.current.delete(E)}}return y===w.current&&x("saved"),!0})();return C.current=N,N.finally(()=>{C.current===N&&(C.current=null)}),N},[i]);o.useEffect(()=>{if(!i||U.current===JSON.stringify(s))return;const y=setTimeout(()=>{O()},300);return()=>clearTimeout(y)},[i,s,O]);const ee=o.useCallback(async(y,N,p)=>{const E=w.current,I=new AbortController;y!=="use"&&D("saving");try{if(!await O()||E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(I);const L=await fetch(`/api/computer/credentials/${y}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:N,...y==="save"?{password:p}:{}}),signal:I.signal});if(E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!L.ok)throw new Error(y==="use"&&L.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const X=await L.json();if(E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const B=tt(N);if(y==="save"&&V(ne=>[...new Set([...ne,B])]),y==="forget"&&V(ne=>ne.filter(xe=>xe!==B)),y==="use"&&(typeof X.password!="string"||!X.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return D("idle"),X.password}catch(L){throw E===w.current&&!I.signal.aborted&&D("error"),L}finally{j.current.delete(I)}},[O]);return{preferences:s,change:Y,loaded:i,saveState:c,flush:O,credentialKeys:d,loginState:H,credentialRequest:ee,retry:()=>i?void O():R(y=>y+1)}}class jt{binaryType="arraybuffer";protocol="";CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;onopen=null;onmessage=null;onerror=null;onclose=null;socket;get readyState(){return this.socket.readyState}constructor(s,m){this.socket=lt(`/api/computer/ws?host=${encodeURIComponent(s)}`),this.socket.onopen=i=>this.onopen?.(i),this.socket.onerror=i=>this.onerror?.(i),this.socket.onclose=i=>{(i.code!==1e3||i.reason)&&m(i.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(i)},this.socket.onmessage=i=>{try{const h=JSON.parse(i.data);if(h.type!=="data"||typeof h.data!="string"||!Number.isSafeInteger(h.seq))throw new Error("Invalid VNC record");const c=Uint8Array.from(atob(h.data),x=>x.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:c.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:h.seq}))}catch{m("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(s){const m=ArrayBuffer.isView(s)?new Uint8Array(s.buffer,s.byteOffset,s.byteLength):new Uint8Array(s);for(let i=0;i<m.length;i+=32*1024){const h=m.subarray(i,i+32768);let c="";for(const x of h)c+=String.fromCharCode(x);this.socket.send(JSON.stringify({type:"data",data:btoa(c)}))}}close(){this.socket.close()}}function Nt(e){return e==="mac"||e==="linux"||e==="windows"}function Et(e){const s=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],m=e==="mac"?s:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?s:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[m,[32,"Space"]]:[m],copy:[s,[99,"KeyC"]],paste:[s,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function kt(e){const s=e;return{size:()=>({width:s._fbWidth,height:s._fbHeight}),surface:()=>s._canvas,send:(m,i,h)=>{const c=s._display.scale,x=(m-s._display.absX(0))*c,l=(i-s._display.absY(0))*c;s._mousePos={x,y:l},s._mouseMoveTimer!==null&&clearTimeout(s._mouseMoveTimer),s._mouseMoveTimer=null,s._mouseButtonMask=h,s._mouseLastMoveTime=Date.now(),s._sendMouse(x,l,h)}}}const rt="termdock:computer-touch-mode:v1";function St(){try{const e=localStorage.getItem(rt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function Lt(e){try{localStorage.setItem(rt,e)}catch{}}const Tt=8,At=300,_t=450,Re=18,je=(e,s)=>Math.max(0,Math.min(e,Math.max(0,s-1)));function Rt(e,s,m,i){const h=new AbortController,c=new Map;let x=0,l=0,R=!1,d=!1,V=!1,H=0,D=0,P,z=!1,w=!0,U=!0,C,j=!1;const Y=()=>{const n=s.size(),a=i.current??={x:n.width/2,y:n.height/2};return a.x=je(a.x,n.width),a.y=je(a.y,n.height),a};let O;const ee=()=>{const n=s.size();if((!O||O.width!==n.width||O.height!==n.height)&&(U=!0),!U&&O)return O;const a=s.surface(),g=e.getBoundingClientRect(),k=a.getBoundingClientRect(),b=[];for(let f=a.parentElement;f&&f!==e;f=f.parentElement){const K=getComputedStyle(f),T=/auto|scroll/.test(K.overflowX)?Math.max(0,f.scrollWidth-f.clientWidth):0,te=/auto|scroll/.test(K.overflowY)?Math.max(0,f.scrollHeight-f.clientHeight):0;if(!T&&!te)continue;const v=f.getBoundingClientRect();b.push({element:f,left:v.left-g.left,top:v.top-g.top,right:v.right-g.left,bottom:v.bottom-g.top,maxX:T,maxY:te})}return O={...n,left:k.left-g.left,top:k.top-g.top,scaleX:n.width&&k.width?k.width/n.width:1,scaleY:n.height&&k.height?k.height/n.height:1,viewportWidth:g.width,viewportHeight:g.height,clientLeft:g.left,clientTop:g.top,scrollers:b},U=!1,O},y=()=>{const n=ee(),a=Y();if(!n.width||!n.height||!w){m.hidden=!0;return}let g=n.left+a.x*n.scaleX,k=n.top+a.y*n.scaleY;for(const b of n.scrollers){if(b.maxX){const f=b.element.scrollLeft,K=g<b.left+20?g-b.left-20:g>b.right-20?g-b.right+20:0,T=Math.max(0,Math.min(b.maxX,f+K));f!==T&&(b.element.scrollLeft=T,g-=T-f,n.left-=T-f)}if(b.maxY){const f=b.element.scrollTop,K=k<b.top+20?k-b.top-20:k>b.bottom-20?k-b.bottom+20:0,T=Math.max(0,Math.min(b.maxY,f+K));f!==T&&(b.element.scrollTop=T,k-=T-f,n.top-=T-f)}}m.hidden=g<0||k<0||g>=n.viewportWidth||k>=n.viewportHeight,m.style.transform=`translate3d(${g}px, ${k}px, 0)`},N=(n=D)=>{const a=Y();s.send(Math.round(a.x),Math.round(a.y),n)},p=()=>{P=void 0,y(),z&&(z=!1,N());let n=0;for(;Math.abs(H)>=Re&&n++<8;){const a=H>0?16:8;N(a),N(0),H-=Math.sign(H)*Re}},E=()=>{j||(P??=requestAnimationFrame(p))},I=()=>{P!==void 0&&(cancelAnimationFrame(P),p())},L=()=>{clearTimeout(C),I(),D&&(D=0,N())},X=n=>{n.cancelable&&n.preventDefault(),n.stopImmediatePropagation()},B=()=>[...c.values()].reduce((n,a)=>n+a.y,0)/c.size,ne=n=>{if(!(n.pointerType!=="touch"&&n.pointerType!=="pen")){X(n),w=!0,E(),c.size||(x=performance.now(),l=0,R=!1,d=!1,V=!1,H=0),c.set(n.pointerId,{x:n.clientX,y:n.clientY,startX:n.clientX,startY:n.clientY}),l=Math.max(l,c.size);try{e.setPointerCapture(n.pointerId)}catch{}clearTimeout(C),c.size===1&&l===1?C=setTimeout(()=>{!j&&c.size===1&&!R&&!d&&(D=1,N())},_t):(L(),V=!0)}},xe=n=>{if(n.pointerType==="mouse"){const f=ee();i.current={x:je((n.clientX-f.clientLeft-f.left)/f.scaleX,f.width),y:je((n.clientY-f.clientTop-f.top)/f.scaleY,f.height)},w=!1,m.hidden=!0;return}const a=c.get(n.pointerId);if(!a)return;X(n);const g=B(),k=n.clientX-a.x,b=n.clientY-a.y;if(a.x=n.clientX,a.y=n.clientY,Math.hypot(a.x-a.startX,a.y-a.startY)>Tt&&(R=!0,clearTimeout(C)),c.size===2&&!d)H+=g-B(),Math.abs(H)>=Re&&(R=!0,E());else if(c.size===1&&!V&&!d){const f=Y(),K=O??ee();f.x+=k/K.scaleX,f.y+=b/K.scaleY,Y(),z=!0,E()}},me=n=>{if(!c.has(n.pointerId))return;X(n);const a=D!==0;n.type!=="pointerup"&&(d=!0),L(),c.delete(n.pointerId);try{e.hasPointerCapture(n.pointerId)&&e.releasePointerCapture(n.pointerId)}catch{}c.size||(H=0,!d&&!a&&!R&&l<=2&&performance.now()-x<=At&&(N(l===2?4:1),N(0)))},pe=()=>{d=!0,L();const n=[...c.keys()];c.clear(),H=0;for(const a of n)try{e.hasPointerCapture(a)&&e.releasePointerCapture(a)}catch{}},W={capture:!0,passive:!1,signal:h.signal};e.addEventListener("pointerdown",ne,W),e.addEventListener("pointermove",xe,W),e.addEventListener("pointerup",me,W),e.addEventListener("pointercancel",me,W),e.addEventListener("lostpointercapture",me,W);for(const n of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(n,X,W);const oe=()=>{U=!0,E()};e.addEventListener("scroll",oe,{capture:!0,signal:h.signal}),window.addEventListener("blur",pe,{signal:h.signal});const ge=()=>{document.hidden&&pe()};document.addEventListener("visibilitychange",ge,{signal:h.signal});const q=new ResizeObserver(oe);return q.observe(e),q.observe(s.surface()),y(),()=>{j||(j=!0,h.abort(),pe(),q.disconnect(),m.hidden=!0)}}function It(e,s){e=Math.max(1,e||1280),s=Math.max(1,s||800);const m=Math.max(1,640/e,480/s);return{width:Math.max(640,Math.min(2560,Math.round(e*m))),height:Math.max(480,Math.min(1600,Math.round(s*m)))}}function Mt({sendText:e,sendKey:s}){const{t:m}=et(),i=o.useRef(null),h=o.useRef(!1),c=o.useRef(null),[x,l]=o.useState(""),R=()=>{const d=i.current?.value||"";d&&e(d),i.current&&(i.current.value=""),l("")};return o.useEffect(()=>(i.current?.focus({preventScroll:!0}),()=>{c.current!==null&&cancelAnimationFrame(c.current)}),[]),t.jsx("input",{ref:i,tabIndex:-1,className:"pointer-events-none absolute left-0 top-0 h-px w-px border-0 p-0 text-base opacity-0","aria-label":m("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,maxLength:1024,value:x,onChange:d=>{l(d.target.value),!h.current&&c.current===null&&R()},onCompositionStart:()=>{h.current=!0},onCompositionEnd:()=>{h.current=!1,c.current!==null&&cancelAnimationFrame(c.current),c.current=requestAnimationFrame(()=>{c.current=null,R()})},onKeyDown:d=>{h.current||d.nativeEvent.isComposing||c.current!==null||(d.key==="Enter"||d.key==="Backspace"&&!d.currentTarget.value)&&(d.preventDefault(),s(d.key==="Enter"?"enter":"backspace"))}})}function Pt(e){let s=[],m=null;const i=new Map,h=()=>{m=null,s.splice(0,32).forEach(c=>{e(c),c[2]?i.set(c[0],c):i.delete(c[0])}),s.length&&(m=requestAnimationFrame(h))};return{send(c){s.push(...c),m===null&&h()},clear(){m!==null&&cancelAnimationFrame(m),m=null,s=[];const c=[...i.values()].reverse();i.clear();for(const[x,l]of c)try{e([x,l,!1])}catch{}}}}const ae="inline-flex min-h-9 items-center justify-center gap-1.5 rounded-md border border-border px-2.5 text-xs hover:bg-surface-2 disabled:opacity-40",ie="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Ne(e){return/API_NOT_ALLOWED|AUTHORIZATION|revoked|PAIRING/.test(e)?"computer.permission":e.includes("RDP_BACKEND_UNAVAILABLE")?"computer.rdpBackendUnavailable":e.includes("RDP_CERTIFICATE")?"computer.rdpCertificate":e.includes("CREDENTIALS_MISSING")?"computer.loginExpired":e.includes("CREDENTIALS_FAILED")?"computer.loginSaveFailed":e.includes("AUTH_FAILED")?"computer.authFailed":e.includes("RDP_FAILED")?"computer.rdpFailed":e.includes("SCREEN_SHARING_OFF")?"computer.sharingOff":e.includes("PRIVATE_HOST_ONLY")?"computer.privateOnly":e.includes("INVALID_HOST")?"computer.invalidHost":e.includes("TIMEOUT")?"computer.timeout":e.includes("UNREACHABLE")?"computer.unreachable":e.includes("DISCONNECTED")?"computer.disconnected":"computer.failed"}function Dt(){const{t:e}=et(),[s,m]=o.useState(()=>Ce()?.targetPeerId??""),[i,h]=o.useState(null),{preferences:c,change:x,loaded:l,saveState:R,flush:d,retry:V,credentialKeys:H,loginState:D,credentialRequest:P}=Ct(s),z=c.target==="local",w=c[c.target],{host:U,platform:C,protocol:j,port:Y,domain:O,ignoreCert:ee,username:y}=w,N=j==="rdp"&&i?.rdpAvailable===!1,{viewOnly:p,fit:E}=c,I=w.rememberLogin&&H.includes(tt(w)),L=r=>x(u=>({...u,[u.target]:{...u[u.target],...r}})),X=r=>L({username:r}),B=r=>L({domain:r}),ne=r=>{L({ignoreCert:r}),d()},xe=r=>L({port:r}),me=r=>{r&&(le.current(),ye.clear(),G(null)),x(u=>({...u,viewOnly:r})),d()},[pe,W]=o.useState(!1),oe=Et(C),ge=C==="mac"?"⌘V":"Ctrl+V",[q,n]=o.useState(""),[a,g]=o.useState("idle"),[k,b]=o.useState(null),[f,K]=o.useState(""),[T,te]=o.useState(!1),[v,G]=o.useState(null),Ee=o.useRef(null),[we,Pe]=o.useState(""),[nt,be]=o.useState(!1),[ot,st]=o.useState(!1),[J,ct]=o.useState(St),De=o.useRef(null),Oe=o.useRef(null),le=o.useRef(()=>{}),[ze,at]=o.useState(_e),fe=o.useRef(!1),se=o.useRef(""),Fe=o.useRef(()=>{}),Ue=o.useRef(null),ke=o.useRef(null),ue=o.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),_=o.useRef(null),ye=o.useMemo(()=>Pt(([r,u,S])=>_.current?.sendKey(r,u,S)),[]),Se=o.useRef(null),re=o.useRef(0),Le=o.useRef(void 0),Q=o.useCallback(()=>{le.current(),ye.clear(),Oe.current=null,re.current++,clearTimeout(Le.current);const r=_.current;_.current=null,r?.disconnect(),Se.current?.close(),Se.current=null,ue.replaceChildren()},[ue,ye]);o.useLayoutEffect(()=>(ke.current?.appendChild(ue),()=>{ue.remove()}),[ue,T]),o.useEffect(()=>()=>Q(),[Q]),o.useEffect(()=>{const r=()=>{const u=_e();at(u),!u&&(fe.current=!1,se.current="",Q(),g("idle"),n(""),te(!1),G(null))};return window.addEventListener(Xe,r),()=>window.removeEventListener(Xe,r)},[Q]),o.useEffect(()=>{const r=()=>m(Ce()?.targetPeerId??"");return window.addEventListener(We,r),()=>window.removeEventListener(We,r)},[]),o.useEffect(()=>{Q(),fe.current=!1,se.current="",g("idle"),b(null),n(""),h(null),te(!1),G(null),W(!1),K(""),Pe(""),be(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async u=>{if(!u.ok)throw new Error(u.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await u.json()}).then(u=>{r.signal.aborted||h(u)}).catch(u=>{r.signal.aborted||b(Ne(String(u)))}),()=>{r.abort(),Q()}},[s,Q]),o.useEffect(()=>{_.current&&(_.current.viewOnly=p)},[p]),o.useEffect(()=>{_.current&&(_.current.scaleViewport=E)},[E]),o.useEffect(()=>{_.current&&"pauseResize"in _.current&&(_.current.pauseResize=!!v)},[v]),o.useEffect(()=>{_.current&&"keyboardActive"in _.current&&(_.current.keyboardActive=v==="keyboard")},[v]);const $e=r=>{r===z||$||!l||(n(""),b(null),x(u=>({...u,target:r?"local":"remote"})),d())},Ve=()=>{fe.current=!0,se.current="",Q(),g("idle"),n(""),te(!1),G(null),be(!1)},He=async r=>{if(r?.preventDefault(),N)return;if(fe.current=!0,a==="credentials"&&_.current&&"sendCredentials"in _.current){se.current=q,_.current.sendCredentials({username:y,password:q}),g("connecting");return}if(!_e()||!l||!q&&!I)return;d(),Q(),b(null),K(""),g("connecting"),be(!1);const u=re.current,S=A=>{u===re.current&&(Q(),g("error"),b(A),G(null),se.current="",(A==="computer.authFailed"||A==="computer.permission"||A==="computer.loginExpired")&&n(""),I&&(A==="computer.authFailed"||A==="computer.loginExpired")&&P("forget",w).catch(()=>{}))};Le.current=setTimeout(()=>S("computer.timeout"),6e4);try{let A=q||await P("use",w);if(u!==re.current)return;se.current=A||"";let F;if(j==="rdp"){const{RdpSession:Z}=await qe(async()=>{const{RdpSession:Ae}=await import("./rdpSession-DJlNIbVk.js");return{RdpSession:Ae}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]));if(u!==re.current)return;const de=window.innerWidth<=640,ce=Ee.current?.getBoundingClientRect(),ve=It(de?window.innerWidth:ce?.width||1280,Math.max(1,(de?window.innerHeight:ce?.height||800)-100));F=new Z(ue,{host:U.trim(),port:Number(Y),username:y.trim(),password:A||"",domain:O.trim(),ignoreCert:ee,...ve},Ae=>S(Ne(Ae)))}else{const{default:Z}=await qe(async()=>{const{default:ve}=await import("./rfb-CxsXsMUX.js");return{default:ve}},[]);if(u!==re.current)return;const de=new jt(U.trim(),ve=>S(Ne(ve)));Se.current=de;const ce=new Z(ue,de,{shared:!0,credentials:{username:y.trim()||void 0,password:A}});ce.background="var(--chrome-bg)",ce.resizeSession=!1,ce.qualityLevel=6,ce.compressionLevel=2,F=ce}A=void 0,_.current=F,F.scaleViewport=E,F.viewOnly=p,F.addEventListener("connect",()=>{if(u!==re.current)return;clearTimeout(Le.current),g("connected"),n(""),window.innerWidth<=640&&(document.activeElement?.blur?.(),te(!0));const Z=se.current;se.current="",w.rememberLogin&&Z&&P("save",w,Z).catch(()=>{})}),F.addEventListener("credentialsrequired",Z=>{if(u!==re.current)return;const de=Z.detail.types;st(de.includes("username")),g("credentials")}),F.addEventListener("securityfailure",()=>S("computer.authFailed")),F.addEventListener("disconnect",()=>S("computer.disconnected")),F.addEventListener("desktopname",Z=>{u===re.current&&K(Z.detail.name)})}catch(A){S(Ne(String(A)))}},he=r=>{!_.current||a!=="connected"||p||ye.send([...r.map(([S,A])=>[S,A,!0]),...[...r].reverse().map(([S,A])=>[S,A,!1])])},M=a==="connected",$=a==="connecting"||a==="credentials";o.useEffect(()=>{const r=_.current,u=ke.current,S=De.current;if(!M||p||v&&v!=="keyboard"||J!=="trackpad"||!r||!u||!S)return;const A="pointerTarget"in r?r.pointerTarget:kt(r),F=Rt(u,A,S,Oe);return le.current=F,()=>{F(),le.current===F&&(le.current=()=>{})}},[M,p,J,T,v]);const Ye=r=>{r!==J&&(le.current(),ct(r),Lt(r))};Fe.current=()=>{He()},o.useEffect(()=>{ze&&l&&i&&!N&&c.autoConnect&&I&&a==="idle"&&!fe.current&&Fe.current()},[ze,l,i,N,c.autoConnect,I,a]);const Ke=()=>{fe.current=!0,P("forget",w).catch(()=>{})},Te=r=>{le.current(),G(u=>u===r?null:r)},it=r=>{if(!_.current||p)return;const u=[];for(const S of r){const A=S.codePointAt(0),F=S===`
|
|
3
|
-
`?65293:S===" "?65289:A<256?A:16777216|A;u.push([F,null,!0],[F,null,!1])}ye.send(u)};o.useEffect(()=>{if(!M||v!=="keyboard"&&v!=="clipboard"||!T||!window.visualViewport)return;const r=window.visualViewport,u=Ee.current,S=()=>{u&&r.height>=160&&(u.style.height=`${r.height}px`,u.style.top=`${r.offsetTop}px`)};return S(),r.addEventListener("resize",S),r.addEventListener("scroll",S),()=>{r.removeEventListener("resize",S),r.removeEventListener("scroll",S),u&&(u.style.height="",u.style.top="")}},[M,v,T]);const Be=t.jsxs("div",{ref:Ee,className:`flex min-h-0 flex-col bg-surface text-foreground ${T?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:T?"dialog":void 0,"aria-modal":T||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&v&&(r.preventDefault(),G(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:"relative z-30 flex min-h-12 shrink-0 items-center gap-2 border-b border-border bg-surface px-3",children:[T&&t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center",onClick:()=>{te(!1),G(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(pt,{size:20})}),t.jsx(ut,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:M&&(f||(z?i?.hostname||Ce()?.serviceName:U))||e("computer.title")}),M&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),M&&D==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),M&&R==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ge,{size:12,className:"animate-spin text-muted-foreground"})}),M&&R==="error"&&t.jsxs("button",{type:"button",className:ae,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:V,children:["! ",e("computer.retry")]}),$&&t.jsxs("button",{type:"button",className:ae,onClick:Ve,children:[t.jsx(Je,{size:14}),e("computer.cancel")]}),M&&!T&&t.jsxs("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center gap-1 text-xs",onClick:()=>te(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(xt,{size:16}),e("computer.expand")]}),M&&t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center",onClick:()=>Te("tools"),"aria-label":e("computer.tools"),"aria-expanded":v==="tools",children:t.jsx(yt,{size:18})})]}),!M&&t.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-4 sm:p-6",children:t.jsxs("div",{className:"mx-auto w-full max-w-md",children:[t.jsxs("form",{className:"space-y-3",onSubmit:r=>{He(r)},"aria-busy":a==="connecting",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-1 rounded-lg bg-background p-1",role:"group","aria-label":e("computer.target"),children:[t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${z?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":z,disabled:$||!i||!l,onClick:()=>$e(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${z?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!z,disabled:$||!l,onClick:()=>$e(!1),children:e("computer.otherComputer")})]}),z?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:Ce()?.serviceName||i.hostname}):e("computer.loading")}):t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.host")}),t.jsx("input",{className:ie,value:U,disabled:$||!l,onChange:r=>{L({host:r.target.value,domain:"",ignoreCert:!1}),n(""),b(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{d()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[C==="mac"?"macOS":C==="linux"?"Ubuntu / Linux":"Windows"," · ",j.toUpperCase()," · ",j==="rdp"?Y||"3389":"5900",p?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(j==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:ie,value:y,disabled:a==="connecting"||!l,onChange:r=>X(r.target.value),onBlur:()=>{d()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:j==="rdp"||a==="credentials"&&ot,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:ie,type:"password",value:q,disabled:a==="connecting"||!l,onChange:r=>n(r.target.value),placeholder:I&&a!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||a==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(j==="rdp"?"computer.rdpLoginHint":"computer.vncLoginHint")}),t.jsxs("div",{className:"flex min-h-11 items-center justify-between gap-2 text-xs",children:[t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:w.rememberLogin,disabled:$||!l||D==="saving",onChange:r=>{const u=r.target.checked;L({rememberLogin:u}),!u&&I?P("forget",{...w,rememberLogin:u}).catch(()=>{}):d()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:$||D==="saving",onClick:Ke,children:e("computer.forgetLogin")})]}),D==="error"&&!k&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),N&&t.jsxs("div",{role:"status",className:"space-y-1 text-xs leading-relaxed text-muted-foreground",children:[t.jsx("p",{children:e("computer.rdpBackendUnavailable")}),t.jsx("p",{children:e("computer.rdpBackendRecovery")})]}),a==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),k&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(k),k==="computer.rdpCertificate"&&t.jsxs("label",{className:"mt-1 flex min-h-11 items-center gap-2 text-foreground",children:[t.jsx("input",{type:"checkbox",checked:ee,onChange:r=>ne(r.target.checked)}),e("computer.trustCertificateHere")]}),a==="error"&&k!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{W(!0),requestAnimationFrame(()=>Ue.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsxs("button",{type:"submit",className:"inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground disabled:opacity-40",disabled:!l||N||a==="connecting"||D==="saving"||z&&!i||!U.trim()||!q&&(!I||a==="credentials")||j==="rdp"&&(!y.trim()||!Number.isInteger(Number(Y))||Number(Y)<1||Number(Y)>65535),children:[a==="connecting"&&t.jsx(Ge,{size:16,className:"animate-spin"}),e(a==="connecting"?"computer.connecting":a==="credentials"?"computer.authenticate":a==="error"?"computer.retryConnect":"computer.connect")]}),t.jsxs("details",{ref:Ue,className:"border-b border-border text-xs",open:pe,onToggle:r=>W(r.currentTarget.open),children:[t.jsxs("summary",{className:"flex min-h-11 cursor-pointer list-none items-center justify-between text-muted-foreground",children:[t.jsx("span",{children:e("computer.advanced")}),t.jsx("span",{"aria-hidden":"true",children:pe?"−":"+"})]}),t.jsxs("div",{className:"space-y-3 pb-4",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.platform")}),t.jsxs("select",{className:ie,value:C,disabled:$||!l,onChange:r=>{Nt(r.target.value)&&L({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),n(""),d()},children:[t.jsx("option",{value:"mac",children:"macOS"}),t.jsx("option",{value:"linux",children:"Ubuntu / Linux"}),t.jsx("option",{value:"windows",children:"Windows"})]})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.protocol")}),t.jsxs("select",{className:ie,value:j,disabled:$||!l,onChange:r=>{L({protocol:r.target.value==="rdp"?"rdp":"vnc"}),n(""),b(null),d()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),j==="rdp"&&t.jsxs(t.Fragment,{children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.port")}),t.jsx("input",{className:ie,type:"number",min:1,max:65535,step:1,value:Y,disabled:$||!l,onBlur:()=>{d()},onChange:r=>xe(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:ie,value:O,disabled:$||!l,onBlur:()=>{d()},onChange:r=>B(r.target.value),autoComplete:"off",maxLength:255})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:ee,disabled:$||!l,onChange:r=>ne(r.target.checked)}),e("computer.trustCertificate")]})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:p,disabled:$||!l,onChange:r=>me(r.target.checked)}),e("computer.viewOnly")]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:c.autoConnect,disabled:$||!l,onChange:r=>{x(u=>({...u,autoConnect:r.target.checked})),d()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(R==="saved"?"computer.settingsSaved":R==="error"?l?"computer.settingsSaveFailed":"computer.settingsLoadFailed":R==="loading"?"computer.settingsLoading":"computer.settingsSaving"),R==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:V,children:e("computer.retry")})]}),t.jsxs("details",{className:"text-xs",children:[t.jsx("summary",{className:"flex min-h-11 cursor-pointer items-center text-muted-foreground",children:e("computer.setup")}),t.jsxs("ol",{className:"ml-4 list-decimal space-y-2 pt-2 leading-relaxed text-muted-foreground",children:[t.jsx("li",{children:e(j==="rdp"?C==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":C==="mac"?"computer.step1":C==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(j==="rdp"?"computer.rdpStep2":C==="mac"?"computer.step2":C==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),j==="vnc"&&C==="linux"&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e("computer.linuxCommandHint")}),t.jsx("pre",{className:"mt-2 overflow-x-auto rounded-md bg-background p-2 text-[11px]",children:t.jsx("code",{children:`sudo apt install x11vnc
|
|
4
|
-
x11vnc -storepasswd
|
|
5
|
-
x11vnc -display "$DISPLAY" -auth guess -localhost -usepw -forever -shared -rfbport 5900`})}),t.jsx("p",{className:"mt-2 leading-relaxed text-muted-foreground",children:e("computer.linuxProtocolHint")})]}),t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e(j==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),M&&v==="tools"&&t.jsx("button",{type:"button",className:"absolute inset-x-0 bottom-14 top-12 z-20 bg-background/40","aria-label":e("computer.returnToDesktop"),onClick:()=>G(null)}),M&&t.jsxs("div",{hidden:v!=="tools",className:`${v==="tools"?"flex":"hidden"} absolute inset-x-3 top-14 z-30 max-h-[calc(100%-7rem)] flex-wrap items-center gap-3 overflow-y-auto rounded-lg border border-border bg-surface px-4 py-3 text-xs shadow-lg [&_button]:min-h-11 [&_select]:min-h-11 [&_label]:min-h-11`,role:"region","aria-label":e("computer.tools"),children:[t.jsxs("div",{className:"flex w-full items-center justify-between",children:[t.jsx("span",{className:"font-medium",children:e("computer.tools")}),t.jsx("button",{type:"button",className:"flex min-w-11 items-center justify-center","aria-label":e("computer.closeTools"),onClick:()=>G(null),children:t.jsx(dt,{size:18})})]}),t.jsx("div",{className:"flex w-full items-center gap-2",children:t.jsx("div",{className:"inline-flex rounded-md bg-background p-0.5",role:"group","aria-label":e("computer.touchMode"),children:["trackpad","direct"].map(r=>t.jsx("button",{type:"button",className:`min-h-9 rounded px-3 text-xs ${J===r?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":J===r,onClick:()=>Ye(r),children:e(r==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},r))})}),t.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[t.jsx("input",{type:"checkbox",checked:p,onChange:r=>me(r.target.checked)}),e("computer.viewOnly")]}),t.jsx("button",{type:"button",className:ae,onClick:()=>{x(r=>({...r,fit:!r.fit})),d()},children:e(E?"computer.actualSize":"computer.fit")}),t.jsxs("select",{className:`${ae} min-w-0 bg-surface`,"aria-label":e("computer.shortcuts"),value:"",disabled:p,onChange:r=>{he(oe[r.target.value]??[])},children:[t.jsx("option",{value:"",disabled:!0,children:e("computer.shortcuts")}),t.jsxs("option",{value:"tab",children:[C==="mac"?"⌘ Tab":"Alt+Tab"," · ",e("computer.switchApps")]}),t.jsxs("option",{value:"search",children:[C==="mac"?"⌘ Space":"Super / Win"," · ",e(C==="mac"?"computer.spotlight":"computer.systemSearch")]}),t.jsx("option",{value:"copy",children:C==="mac"?"⌘C":"Ctrl+C"}),t.jsx("option",{value:"paste",children:ge}),t.jsx("option",{value:"escape",children:"Esc"}),t.jsx("option",{value:"enter",children:"Enter"}),t.jsx("option",{value:"backspace",children:"⌫"}),t.jsx("option",{value:"up",children:"↑"}),t.jsx("option",{value:"down",children:"↓"}),t.jsx("option",{value:"left",children:"←"}),t.jsx("option",{value:"right",children:"→"})]}),t.jsxs("div",{className:"flex w-full items-center justify-between border-t border-border pt-2",children:[I&&t.jsx("button",{type:"button",className:ae,disabled:D==="saving",onClick:Ke,children:e("computer.forgetLogin")}),t.jsxs("button",{type:"button",className:`${ae} ml-auto text-destructive`,onClick:Ve,children:[t.jsx(Je,{size:14}),e("computer.disconnect")]})]})]}),t.jsx("div",{ref:ke,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${M?"":"hidden"}`,style:{touchAction:M&&J==="trackpad"&&!p?"none":void 0},"aria-label":e("computer.remoteTitle"),children:M&&J==="trackpad"&&!p&&t.jsx("div",{ref:De,hidden:!0,"aria-hidden":"true",className:"pointer-events-none absolute left-0 top-0 z-20 h-5 w-5 will-change-transform",children:t.jsx(Qe,{size:20,strokeWidth:2,className:"fill-background text-primary drop-shadow"})})}),t.jsx("div",{hidden:v!=="tools",children:M&&!p&&t.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:e(J==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),M&&v==="keyboard"&&!p&&t.jsx(Mt,{sendText:it,sendKey:r=>he(oe[r])}),M&&v==="clipboard"&&!p&&t.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:r=>{if(r.preventDefault(),!(!we||!_.current))try{_.current.clipboardPasteFrom(we),be(!0)}catch{b("computer.clipboardFailed")}},children:[t.jsx("textarea",{className:`${ie} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":e("computer.clipboard"),placeholder:e("computer.clipboardPlaceholder"),value:we,onChange:r=>{Pe(r.target.value),be(!1)},maxLength:16384}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{type:"submit",className:`${ae} min-h-11 flex-1`,disabled:!we,children:e("computer.clipboard")}),t.jsx("button",{type:"button",className:`${ae} min-h-11`,onClick:()=>he(oe.paste),children:ge})]}),t.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:nt?e("computer.clipboardSent"):e("computer.clipboardHint",{shortcut:ge})}),k&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e(k)})]}),M&&t.jsxs("div",{className:`relative z-30 grid shrink-0 ${v==="keyboard"?"grid-cols-5":"grid-cols-4"} border-t border-border bg-surface px-1 py-1 text-[11px]`,children:[t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${v==="keyboard"?"bg-surface-2 text-primary":""}`,disabled:p,onClick:()=>Te("keyboard"),"aria-pressed":v==="keyboard",children:[t.jsx(ft,{size:18}),e("computer.keyboard")]}),t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${v==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:p,onClick:()=>Te("clipboard"),"aria-pressed":v==="clipboard",children:[t.jsx(ht,{size:18}),e("computer.clipboardTool")]}),v==="keyboard"?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm",onPointerDown:r=>r.preventDefault(),onClick:()=>he([[65289,"Tab"]]),children:"Tab"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(oe.backspace),children:"⌫"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(oe.enter),children:"↵"})]}):t.jsxs(t.Fragment,{children:[t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",onClick:()=>{x(r=>({...r,fit:!r.fit})),d()},children:[t.jsx(wt,{size:18}),e(E?"computer.zoom":"computer.fit")]}),t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:p,onClick:()=>Ye(J==="trackpad"?"direct":"trackpad"),"aria-label":e("computer.switchTouchMode"),children:[t.jsx(Qe,{size:18}),e(J==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})]})]})]});return T?mt.createPortal(Be,document.body):Be}const Ht=Object.freeze(Object.defineProperty({__proto__:null,default:Dt},Symbol.toStringTag,{value:"Module"}));export{Ht as C,It as c};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|