termdock 1.4.327 → 1.4.328
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-C0c83Pxp.js → App-xr2R4dST.js} +6 -6
- package/dist/client/assets/App-xr2R4dST.js.br +0 -0
- package/dist/client/assets/App-xr2R4dST.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-znWmrZsF.js → ArchitecturePanel-XprzcGMT.js} +2 -2
- package/dist/client/assets/ArchitecturePanel-XprzcGMT.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-XprzcGMT.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-Bt4fjEoD.js → ChangeWalkthroughPanel-g83lCwJi.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-g83lCwJi.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-g83lCwJi.js.gz +0 -0
- package/dist/client/assets/{CollaborationMainWorkspace-0s90d39f.js → CollaborationMainWorkspace-BbkFTnw1.js} +1 -1
- package/dist/client/assets/CollaborationMainWorkspace-BbkFTnw1.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BbkFTnw1.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-C8Nrrlcz.js +2 -0
- package/dist/client/assets/ComputerControlView-yBUQcmwF.js +6 -0
- package/dist/client/assets/ComputerControlView-yBUQcmwF.js.br +0 -0
- package/dist/client/assets/ComputerControlView-yBUQcmwF.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-311LPbK_.js → DagPlayground--KDWJkVL.js} +1 -1
- package/dist/client/assets/DagPlayground--KDWJkVL.js.br +0 -0
- package/dist/client/assets/DagPlayground--KDWJkVL.js.gz +0 -0
- package/dist/client/assets/{DiffLab-CHZ0EL2E.js → DiffLab-BAyGlKKp.js} +1 -1
- package/dist/client/assets/DiffLab-BAyGlKKp.js.br +0 -0
- package/dist/client/assets/DiffLab-BAyGlKKp.js.gz +0 -0
- package/dist/client/assets/{DiffReview-BA7zArOA.js → DiffReview-CLKpyDPZ.js} +1 -1
- package/dist/client/assets/DiffReview-CLKpyDPZ.js.br +0 -0
- package/dist/client/assets/DiffReview-CLKpyDPZ.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-C_6SxWtH.js → DiffReviewLab-BoFElesI.js} +1 -1
- package/dist/client/assets/DiffReviewLab-BoFElesI.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-BoFElesI.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-B0YoRCEi.js → DiffViewer-DDiASWHf.js} +1 -1
- package/dist/client/assets/DiffViewer-DDiASWHf.js.br +0 -0
- package/dist/client/assets/DiffViewer-DDiASWHf.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-BboTxu4_.js → ModelPreview-PJWJT35T.js} +1 -1
- package/dist/client/assets/ModelPreview-PJWJT35T.js.br +0 -0
- package/dist/client/assets/ModelPreview-PJWJT35T.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-TFRZlsFX.js → RightSidebar-CfOJHcXO.js} +3 -3
- package/dist/client/assets/RightSidebar-CfOJHcXO.js.br +0 -0
- package/dist/client/assets/RightSidebar-CfOJHcXO.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-BK2-PKkq.js → abnfDiagram-VCTEODGH-CwEvSK80.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-CwEvSK80.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-CwEvSK80.js.gz +0 -0
- package/dist/client/assets/{app-D2yRvfNE.js → app-DNnVU3VK.js} +10 -10
- package/dist/client/assets/app-DNnVU3VK.js.br +0 -0
- package/dist/client/assets/app-DNnVU3VK.js.gz +0 -0
- package/dist/client/assets/{arc-DqI6rAeJ.js → arc-Ctz1KMpY.js} +1 -1
- package/dist/client/assets/arc-Ctz1KMpY.js.br +0 -0
- package/dist/client/assets/arc-Ctz1KMpY.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CZBYAIxt.js → architectureDiagram-5GKGNRK7-DJSgVQQQ.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DJSgVQQQ.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DJSgVQQQ.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-BAZ4LopQ.js → blockDiagram-I7D4REHJ-N_yr-Q8w.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-N_yr-Q8w.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-N_yr-Q8w.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-Boh80g9D.js → c4Diagram-7LVT6UL2-DVQnawpY.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-DVQnawpY.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DVQnawpY.js.gz +0 -0
- package/dist/client/assets/channel-b8iCTsm_.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CQtYmkXv.js → chunk-2Q5K7J3B-BXZwjzSA.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-lfjEsOLd.js → chunk-5VM5RSS4-mKa-FMDa.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-B3iWUfsu.js → chunk-F27PBJKO-BW5JuQIW.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-BW5JuQIW.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BW5JuQIW.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-BV8W69Xy.js → chunk-IMKFNOWR-CDGBumC-.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CDGBumC-.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CDGBumC-.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BHn7J2ij.js → chunk-JWPE2WC7-CGx9O6IX.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-1UAKkjro.js → chunk-POPQ4Y6H-BkWYxDSy.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DMDJrwWD.js → chunk-SVP7TREG-BGwkXakv.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-BGwkXakv.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BGwkXakv.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-DViVpzs1.js → chunk-TICWLB2K-CMxjLRcv.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-CMxjLRcv.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-CMxjLRcv.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-Cyg6qo-b.js → chunk-XXDRQBXY-DCIQ1i4z.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DrGmXJ_R.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DrGmXJ_R.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-Dq6PJ-un.js → cose-bilkent-JH36ORCC-Des2am0k.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Des2am0k.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Des2am0k.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX--pc9zClZ.js → cynefin-OW5HDTMX-BOJs6wCD.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-BOJs6wCD.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BOJs6wCD.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-1whKia5t.js → cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DVLqWiJ6.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-8TjGkCEP.js → dagre-GXQ25YYZ-e7mtFW8V.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-e7mtFW8V.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-e7mtFW8V.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BTgsveUu.js → diagram-S7CK7UJ4-B9P-CEm4.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-B9P-CEm4.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-B9P-CEm4.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-CPxoDqq7.js → diagram-UQ7AKVKN-DvTmtjeC.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-DvTmtjeC.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DvTmtjeC.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BtNBFyC3.js → diagram-VSXAHHWV-BmwhsB8_.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-BmwhsB8_.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BmwhsB8_.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DLfdx0dh.js → diagram-VX7I27RA-CvV9NUzM.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-CvV9NUzM.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CvV9NUzM.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-C9FdZJ41.js → diagram-Z3DM3KII-DT1POaEF.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-DT1POaEF.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DT1POaEF.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-CAxaqCAJ.js → ebnfDiagram-PWID7BFC-QZNS7lcr.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-QZNS7lcr.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-QZNS7lcr.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-BBO2Iz-B.js → erDiagram-RLTQ6QDP-C9KhKBAJ.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-C9KhKBAJ.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-C9KhKBAJ.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-DQ-nPGNL.js → flowDiagram-HODETNUW-Du-YKajw.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-Du-YKajw.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-Du-YKajw.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-C4bKdSCF.js → ganttDiagram-EL5Y4UJY-I9ibR23C.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-I9ibR23C.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-I9ibR23C.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-miROLzXb.js → gestureArbiter-BE8k_FL7.js} +1 -1
- package/dist/client/assets/gestureArbiter-BE8k_FL7.js.br +0 -0
- package/dist/client/assets/gestureArbiter-BE8k_FL7.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-cAbsg4ei.js → gitGraphDiagram-WWUBYQGX-BK6myYCK.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BK6myYCK.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-BK6myYCK.js.gz +0 -0
- package/dist/client/assets/{index-Dd_3ISCb.css → index-C6xPtOPw.css} +1 -1
- package/dist/client/assets/index-C6xPtOPw.css.br +0 -0
- package/dist/client/assets/{index-Dd_3ISCb.css.gz → index-C6xPtOPw.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-EV88OFTf.js → infoDiagram-27XIBGKW-D1tExNKF.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bi-60w6U.js → ishikawaDiagram-5VMMS53U-CwY6cf7s.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CwY6cf7s.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CwY6cf7s.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-Bgbk61sp.js → journeyDiagram-3NMN7TZE-Cqy1TbUI.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Cqy1TbUI.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Cqy1TbUI.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-Ly6IeL8s.js → kanban-definition-UXKFOSKX-SXzevtXv.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-SXzevtXv.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-SXzevtXv.js.gz +0 -0
- package/dist/client/assets/{layout-CEjMszLD.js → layout-CFH4KsMu.js} +1 -1
- package/dist/client/assets/layout-CFH4KsMu.js.br +0 -0
- package/dist/client/assets/{layout-CEjMszLD.js.gz → layout-CFH4KsMu.js.gz} +0 -0
- package/dist/client/assets/{linear-BCB67kKS.js → linear-DSGS6T8F.js} +1 -1
- package/dist/client/assets/linear-DSGS6T8F.js.br +0 -0
- package/dist/client/assets/linear-DSGS6T8F.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BmSOfxMH.js → mermaid.core-BpDQIw7m.js} +5 -5
- package/dist/client/assets/mermaid.core-BpDQIw7m.js.br +0 -0
- package/dist/client/assets/mermaid.core-BpDQIw7m.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-VEZ7qGHM.js → mindmap-definition-YA3MSWOX-D7H6k38f.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D7H6k38f.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D7H6k38f.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-BUV0AT5k.js → passwordBootstrap-B4SLDWeK.js} +1 -1
- package/dist/client/assets/passwordBootstrap-B4SLDWeK.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-B4SLDWeK.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-DtFnROHy.js → pegDiagram-XKGWAZYB-DT21hoef.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-DT21hoef.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DT21hoef.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-CrRFKgsg.js → pieDiagram-E7YTZNPT-CP_7qBRV.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CP_7qBRV.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CP_7qBRV.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DrxOcCWy.js → quadrantDiagram-AXDQQJYC-CLBVrI3n.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLBVrI3n.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLBVrI3n.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-BaXzskST.js → railroadDiagram-O6MQD6OU-DJoM5WtF.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DJoM5WtF.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DJoM5WtF.js.gz +0 -0
- package/dist/client/assets/rdpSession-C0jVZfFV.js +1 -0
- package/dist/client/assets/rdpSession-C0jVZfFV.js.br +0 -0
- package/dist/client/assets/rdpSession-C0jVZfFV.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-DqibFmuj.js → referenceLongPress-LCYPFdN8.js} +1 -1
- package/dist/client/assets/referenceLongPress-LCYPFdN8.js.br +0 -0
- package/dist/client/assets/referenceLongPress-LCYPFdN8.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BdwuNHm0.js → requirementDiagram-BXWQKSXE-BHLyxBdU.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BHLyxBdU.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BHLyxBdU.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-L8-WTgQS.js → sankeyDiagram-P5KCCOFB-CUgEsLUw.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CUgEsLUw.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CUgEsLUw.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Hloa_AO5.js → sequenceDiagram-WJ2MYXX4-qEb89gHp.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-qEb89gHp.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-qEb89gHp.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-0sRpfplV.js → sizeCapture-INFHLROL-BUOHBGK2.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-BUOHBGK2.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BUOHBGK2.js.gz +0 -0
- package/dist/client/assets/{sparkles-CgDDXr95.js → sparkles-Cm9xs8pz.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-DqT3kcLM.js → stateDiagram-D77RDMKH-Dx0afnU6.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-Dx0afnU6.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Dx0afnU6.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CzHE6VoX.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-BH5xHrJq.js → swimlanes-42K2YHIH-DeG8X6CN.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-DeG8X6CN.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-DeG8X6CN.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B4wu-iuA.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-D3Ez5FZh.js → timeline-definition-24CTP7MA-Bkts868I.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-Bkts868I.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Bkts868I.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-DqUvQ_x8.js → triangle-alert-D1VnXjVL.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DEGLdtyy.js → vennDiagram-4TSXK5OY-BOoHxntl.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DEGLdtyy.js.br → vennDiagram-4TSXK5OY-BOoHxntl.js.br} +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BOoHxntl.js.gz +0 -0
- package/dist/client/assets/{videoCompression-DIBRptEJ.js → videoCompression-BONtNnBl.js} +1 -1
- package/dist/client/assets/videoCompression-BONtNnBl.js.br +0 -0
- package/dist/client/assets/videoCompression-BONtNnBl.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-BWXojK8h.js → wardleyDiagram-VM6X3IG4-BAuuRkvt.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BAuuRkvt.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BAuuRkvt.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CI95cYmG.js → xychartDiagram-S5SC5T6Z-DvJOw2Ss.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvJOw2Ss.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-DvJOw2Ss.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.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 +3 -0
- package/dist/server/agent/integrationRecoveryBinding.js +34 -0
- package/dist/server/agent/integrationServer.js +1 -0
- package/dist/server/agent/integrationSessions.js +79 -3
- package/dist/server/entry.js +4 -0
- package/dist/server/routes/terminal.js +90 -0
- package/docs/integrations.md +27 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-C0c83Pxp.js.br +0 -0
- package/dist/client/assets/App-C0c83Pxp.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-znWmrZsF.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-znWmrZsF.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bt4fjEoD.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bt4fjEoD.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-0s90d39f.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-0s90d39f.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-CHVGId4O.js +0 -2
- package/dist/client/assets/ComputerControlView-BxLiNZeK.js +0 -5
- package/dist/client/assets/ComputerControlView-BxLiNZeK.js.br +0 -0
- package/dist/client/assets/ComputerControlView-BxLiNZeK.js.gz +0 -0
- package/dist/client/assets/DagPlayground-311LPbK_.js.br +0 -0
- package/dist/client/assets/DagPlayground-311LPbK_.js.gz +0 -0
- package/dist/client/assets/DiffLab-CHZ0EL2E.js.br +0 -0
- package/dist/client/assets/DiffLab-CHZ0EL2E.js.gz +0 -0
- package/dist/client/assets/DiffReview-BA7zArOA.js.br +0 -0
- package/dist/client/assets/DiffReview-BA7zArOA.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-C_6SxWtH.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-C_6SxWtH.js.gz +0 -0
- package/dist/client/assets/DiffViewer-B0YoRCEi.js.br +0 -0
- package/dist/client/assets/DiffViewer-B0YoRCEi.js.gz +0 -0
- package/dist/client/assets/ModelPreview-BboTxu4_.js.br +0 -0
- package/dist/client/assets/ModelPreview-BboTxu4_.js.gz +0 -0
- package/dist/client/assets/RightSidebar-TFRZlsFX.js.br +0 -0
- package/dist/client/assets/RightSidebar-TFRZlsFX.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BK2-PKkq.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BK2-PKkq.js.gz +0 -0
- package/dist/client/assets/app-D2yRvfNE.js.br +0 -0
- package/dist/client/assets/app-D2yRvfNE.js.gz +0 -0
- package/dist/client/assets/arc-DqI6rAeJ.js.br +0 -0
- package/dist/client/assets/arc-DqI6rAeJ.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CZBYAIxt.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CZBYAIxt.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BAZ4LopQ.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BAZ4LopQ.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Boh80g9D.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Boh80g9D.js.gz +0 -0
- package/dist/client/assets/channel-B3pP90yO.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-B3iWUfsu.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-B3iWUfsu.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BV8W69Xy.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BV8W69Xy.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DMDJrwWD.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-DMDJrwWD.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DViVpzs1.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DViVpzs1.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-CcfJXXoP.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CcfJXXoP.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Dq6PJ-un.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Dq6PJ-un.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX--pc9zClZ.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX--pc9zClZ.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-1whKia5t.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-1whKia5t.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-8TjGkCEP.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-8TjGkCEP.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BTgsveUu.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BTgsveUu.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CPxoDqq7.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-CPxoDqq7.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BtNBFyC3.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BtNBFyC3.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DLfdx0dh.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DLfdx0dh.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-C9FdZJ41.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-C9FdZJ41.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CAxaqCAJ.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-CAxaqCAJ.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BBO2Iz-B.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BBO2Iz-B.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DQ-nPGNL.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DQ-nPGNL.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-C4bKdSCF.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-C4bKdSCF.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-miROLzXb.js.br +0 -0
- package/dist/client/assets/gestureArbiter-miROLzXb.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-cAbsg4ei.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-cAbsg4ei.js.gz +0 -0
- package/dist/client/assets/index-Dd_3ISCb.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bi-60w6U.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Bi-60w6U.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Bgbk61sp.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-Bgbk61sp.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Ly6IeL8s.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Ly6IeL8s.js.gz +0 -0
- package/dist/client/assets/layout-CEjMszLD.js.br +0 -0
- package/dist/client/assets/linear-BCB67kKS.js.br +0 -0
- package/dist/client/assets/linear-BCB67kKS.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BmSOfxMH.js.br +0 -0
- package/dist/client/assets/mermaid.core-BmSOfxMH.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-VEZ7qGHM.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-VEZ7qGHM.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-BUV0AT5k.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-BUV0AT5k.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DtFnROHy.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-DtFnROHy.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrRFKgsg.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CrRFKgsg.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DrxOcCWy.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DrxOcCWy.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BaXzskST.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BaXzskST.js.gz +0 -0
- package/dist/client/assets/rdpSession-DtIeoTyy.js +0 -1
- package/dist/client/assets/rdpSession-DtIeoTyy.js.br +0 -0
- package/dist/client/assets/rdpSession-DtIeoTyy.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-DqibFmuj.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DqibFmuj.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BdwuNHm0.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BdwuNHm0.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-L8-WTgQS.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-L8-WTgQS.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Hloa_AO5.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Hloa_AO5.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-0sRpfplV.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-0sRpfplV.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DqT3kcLM.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DqT3kcLM.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DjkkxZUN.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BH5xHrJq.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BH5xHrJq.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DpLhj_Dx.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-D3Ez5FZh.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-D3Ez5FZh.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DEGLdtyy.js.gz +0 -0
- package/dist/client/assets/videoCompression-DIBRptEJ.js.br +0 -0
- package/dist/client/assets/videoCompression-DIBRptEJ.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BWXojK8h.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BWXojK8h.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CI95cYmG.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CI95cYmG.js.gz +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RightSidebar-
|
|
2
|
-
import{ah as gt,aO as At,df as he,bA as e,_ as Dt,cv as Ge,cw as Mt,dg as We,n as yt,X as Se,dl as et,C as Tt,g as Ft,e as Fe,c as Lt,a as Pt,d as jt,dr as It}from"./app-D2yRvfNE.js";import{b as s,r as vt}from"./dnd-BCFAPC0L.js";import{ad as Je,ai as Le,a as wt,a4 as Ot,H as Ht,n as tt,Z as Bt,a5 as _t,a0 as qe,b as pe,e as Nt,a1 as qt,a3 as nt,u as Ut,ae as Wt,i as Jt,r as Vt,R as kt,o as Kt,af as Xt,a6 as Zt,p as Yt,D as Ee,N as mt,a2 as Qt}from"./App-C0c83Pxp.js";import{L as Gt}from"./DiffViewer-B0YoRCEi.js";import er from"./purify.es-4eNOHKSq.js";import{l as tr,i as rr,S as sr}from"./RightSidebar-TFRZlsFX.js";import{L as nr}from"./triangle-alert-DqUvQ_x8.js";import{S as St}from"./sparkles-CgDDXr95.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-miROLzXb.js";import"./referenceLongPress-DqibFmuj.js";import"./DiffReview-BA7zArOA.js";import"./ChangeWalkthroughPanel-Bt4fjEoD.js";const ir=[["path",{d:"M17 7 7 17",key:"15tmo1"}],["path",{d:"M17 17H7V7",key:"1org7z"}]],ar=gt("arrow-down-left",ir);const lr=[["path",{d:"m15 15 6 6",key:"1s409w"}],["path",{d:"m15 9 6-6",key:"ko1vev"}],["path",{d:"M21 16v5h-5",key:"1ck2sf"}],["path",{d:"M21 8V3h-5",key:"1qoq8a"}],["path",{d:"M3 16v5h5",key:"1t08am"}],["path",{d:"m3 21 6-6",key:"wwnumi"}],["path",{d:"M3 8V3h5",key:"1ln10m"}],["path",{d:"M9 9 3 3",key:"v551iv"}]],cr=gt("expand",lr);function or(r,o){const a=new Map,d={id:"all-perspectives",title:o,summary:r.summary,nodes:[],edges:[]};return r.perspectives.forEach((p,n)=>{const x=`perspective${n}`,g=new Map(p.nodes.map((u,c)=>[u.id,`${x}_node${c}`]));a.set(x,{perspective:p.id}),d.nodes.push({id:x,title:p.title,summary:p.summary,files:[],description:p.description});for(const u of p.nodes){const c=g.get(u.id);a.set(c,{perspective:p.id,node:u.id}),d.nodes.push({...u,id:c,parentId:u.parentId?g.get(u.parentId):x})}d.edges.push(...p.edges.map(u=>({...u,from:g.get(u.from),to:g.get(u.to)})))}),{view:d,references:a}}async function $e(r,o,a,d){const p=new URLSearchParams({root:r}),n=await fetch(`/api/terminal/architecture/${o}${d?"":`${o.includes("?")?"&":"?"}${p}`}`,{signal:a,cache:"no-store",...d?{method:"PUT",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":await At()},body:JSON.stringify({root:r,...d})}:{}}),x=await n.json();if(!n.ok)throw new Error(x.error||`HTTP ${n.status}`);return x}async function ur(r,o){const a=await $e(r,"documents",o);if(!Array.isArray(a.files))throw new Error("Invalid architecture library");return[...new Set(a.files.filter(d=>typeof d=="string"&&Je(d)))].sort()}async function Ue(r,o,a){if(!Je(o))throw new Error("Invalid architecture file");const d=await $e(r,`document?${new URLSearchParams({file:o})}`,a);if(!("document"in d)||d.revision!==null&&typeof d.revision!="string")throw new Error("Invalid architecture response");return{document:d.document?Le(JSON.stringify(d.document)):null,revision:typeof d.revision=="string"?d.revision:null}}async function dr(r,o,a,d,p,n,x){const g=await $e(r,"field",void 0,{file:o,perspective:a,node:d,field:p,value:n,revision:x});return Le(JSON.stringify(g.document))}async function mr(r,o,a){const d=await $e(r,`history?${new URLSearchParams({file:o})}`,a);if(!Array.isArray(d.versions))throw new Error("Invalid architecture history");return d.versions}async function hr(r,o){return $e(r,`bundle?${new URLSearchParams({file:o})}`)}async function xr(r,o,a){const d=await $e(r,"bundle",void 0,{bundle:o,revision:a});return Le(JSON.stringify(d.document))}async function pr(r,o,a,d){const p=await $e(r,"document",void 0,{file:o,document:a,...d!==void 0?{revision:d}:{}});return Le(JSON.stringify(p.document))}const fr=s.lazy(()=>Dt(()=>import("./RightSidebar-TFRZlsFX.js").then(r=>r.R),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])).then(r=>({default:r.MarkdownPreview})));function rt(r,o){return o?{description:"说明",diagram:"关系图源码",context:"上下文",constraint:"约束",concern:"问题与风险",todo:"待办",note:"备注"}[r]:{description:"Description",diagram:"Diagram source",context:"Context",constraint:"Constraints",concern:"Concerns",todo:"To do",note:"Notes"}[r]}function st({value:r,rootPath:o,onEdit:a,onOpenFile:d}){const{locale:p}=he(),n=p==="zh",x=r.description?.replace(/^#\s+([^\n]+)\n\s*/,(u,c)=>c.trim()===r.title?"":u),g=u=>e.jsx(s.Suspense,{fallback:e.jsx("p",{className:"whitespace-pre-wrap text-sm",children:u}),children:e.jsx(fr,{referenceLines:!1,content:u,filePath:null,rootPath:o??null,lineRange:null,onLineRangeClick:()=>{},scrollTop:0,outlineOpen:!1,lightboxOpen:!1,onLocalLinkOpen:c=>d?.({path:o&&c.path.startsWith(`${o}/`)?c.path.slice(o.length+1):c.path})})});return e.jsxs("div",{className:"space-y-2",children:[x&&e.jsx("div",{className:"min-w-0 overflow-x-auto",children:g(x)}),wt.filter(u=>u!=="description"&&r[u]).map(u=>e.jsxs("details",{className:"rounded-lg border border-border/15 px-2",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs font-medium",children:rt(u,n)}),e.jsxs("div",{className:"min-w-0 overflow-x-auto pb-2",children:[u==="diagram"?e.jsx("pre",{className:"whitespace-pre-wrap break-all text-xs",children:r[u]}):g(r[u]),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded px-2 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a(u),children:n?"编辑此字段":"Edit field"})]})]},u)),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-3 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a("description"),children:n?"编辑文档":"Edit document"}),r.meta&&e.jsxs("details",{children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"版本信息":"Version information"}),e.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 break-all pb-3 text-xs text-muted-foreground",children:Object.entries(r.meta).filter(([u])=>u!=="previousDiagram").map(([u,c])=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{children:{created:n?"创建":"Created",updated:n?"更新":"Updated",updateCount:n?"更新次数":"Updates",gitCommit:"Commit",gitBranch:n?"分支":"Branch"}[u]??u}),e.jsx("dd",{children:String(c)})]},u))})]})]})}function Qe({root:r,file:o,perspective:a,node:d,initialField:p,onSaved:n,onCancel:x}){const{locale:g}=he(),u=g==="zh",[c,F]=s.useState(null),[M,k]=s.useState(p),[C,R]=s.useState(""),[N,E]=s.useState(""),[z,$]=s.useState(""),[l,b]=s.useState(!1),h=s.useRef(!0),j=s.useRef(0);s.useEffect(()=>{h.current=!0;const f=++j.current;F(null),$("");const H=new AbortController;return Ue(r,o,H.signal).then(P=>{!H.signal.aborted&&f===j.current&&F(P)}).catch(P=>{!H.signal.aborted&&f===j.current&&$(String(P.message))}),()=>{h.current=!1,++j.current,H.abort()}},[r,o]),s.useEffect(()=>{const f=c?.document?.perspectives.find(U=>U.id===a),H=d?f?.nodes.find(U=>U.id===d):f;if(!H||!f)return;const P=H[M]??(M==="description"?H.summary:M==="diagram"?Ot(f,d):"");R(P),E(P)},[c,a,d,M]);const B=C!==N;return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col gap-3",onSubmit:f=>{if(f.preventDefault(),!c||l||!B)return;const H=j.current;b(!0),$(""),dr(r,o,a,d,M,C,c.revision).then(P=>{h.current&&H===j.current&&n(P)}).catch(P=>{h.current&&H===j.current&&$(P.message)}).finally(()=>{h.current&&H===j.current&&b(!1)})},children:[e.jsxs("label",{className:"flex items-center gap-2 text-xs",children:[u?"字段":"Field",e.jsx("select",{"aria-label":u?"文档字段":"Document field",className:"min-h-11 min-w-0 flex-1 rounded bg-surface-2 px-2",value:M,disabled:l||B,onChange:f=>k(f.target.value),children:wt.map(f=>e.jsx("option",{value:f,children:rt(f,u)},f))})]}),B&&e.jsx("p",{className:"text-xs text-muted-foreground",children:u?"保存当前字段后可切换字段。":"Save this field before switching fields."}),!c&&!z&&e.jsx("p",{role:"status",className:"text-xs",children:u?"读取最新文档…":"Loading the latest document…"}),e.jsx("textarea",{"aria-label":rt(M,u),spellCheck:!1,className:"min-h-56 w-full flex-1 resize-y rounded-lg border border-border/30 bg-surface-2 p-3 font-mono text-sm focus-visible:ring-2 focus-visible:ring-ring",disabled:!c||l,maxLength:1e5,value:C,onChange:f=>R(f.target.value)}),z&&e.jsx("p",{role:"alert",className:"break-words text-xs text-destructive",children:z}),e.jsxs("div",{className:"sticky bottom-0 flex gap-2 bg-surface py-2",children:[e.jsx("button",{type:"submit",className:"min-h-11 rounded-lg bg-primary/15 px-4 text-sm text-primary disabled:opacity-40",disabled:!c||l||!B,children:l?u?"保存中…":"Saving…":u?"保存":"Save"}),e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-4 text-sm hover:bg-surface-elevated",disabled:l,onClick:x,children:u?"取消":"Cancel"})]})]})}function br({root:r,file:o,document:a,onLoaded:d}){const{locale:p}=he(),n=p==="zh",[x,g]=s.useState(""),[u,c]=s.useState(""),[F,M]=s.useState(!1),[k,C]=s.useState(null),[R,N]=s.useState(null),E=s.useRef(null),z=s.useRef(0);s.useEffect(()=>(z.current++,N(null),C(null),g(""),c(""),M(!1),()=>{z.current++}),[r,o]);async function $(b){const h=++z.current;M(!0),g(""),c("");try{await b(()=>h===z.current)}catch(j){h===z.current&&g(j instanceof Error?j.message:String(j))}finally{h===z.current&&M(!1)}}const l="inline-flex min-h-11 items-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated disabled:opacity-40";return e.jsxs("details",{className:"rounded-lg border border-border/15 px-3",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"历史、导入与分享":"History, import and sharing"}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async b=>{const h=await mr(r,o);b()&&C(h)})},children:[e.jsx(Ht,{size:14}),n?"更新差异":"Changes"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{await Ge(new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),"termdock-architecture.json")})},children:[e.jsx(tt,{size:14}),"JSON"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=await hr(r,o);await Ge(new Blob([JSON.stringify(b,null,2)],{type:"application/json"}),"architecture.omm.json")})},children:[e.jsx(tt,{size:14}),".omm"]}),e.jsxs("button",{className:l,type:"button",disabled:F,onClick:()=>E.current?.click(),children:[e.jsx(Bt,{size:14}),n?"导入":"Import"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=Mt(),h=_t(window.location.origin,{root:r,file:o,...b?{peerId:b.targetPeerId,serviceName:b.serviceName}:{}});await navigator.clipboard.writeText(h),c(n?"链接已复制,打开时需要登录此 Termdock 服务。":"Link copied. Sign in to this Termdock service to view it.")})},children:[e.jsx(Gt,{size:14}),n?"复制查看链接":"Copy viewer link"]})]}),e.jsx("input",{ref:E,hidden:!0,type:"file",accept:".json,application/json",onChange:b=>{const h=b.target.files?.[0];b.target.value="",h&&$(async j=>{if(h.size>5e6)throw new Error(n?"文档超过 5 MB。":"Document exceeds 5 MB.");const B=await h.text();if(!j())return;const f=JSON.parse(B);if(f?.format==="termdock-omm-bundle"){const Q=await Ue(r,".omm");if(!j())return;N({name:h.name,value:f,file:".omm",revision:Q.revision});return}const H=Le(B),P=H.analysis?qe(H.analysis):pe,U=await Ue(r,P);j()&&N({name:h.name,value:H,file:P,revision:U.revision})})}}),R&&e.jsxs("div",{className:"my-2 rounded-lg bg-surface-2 p-3 text-xs",children:[e.jsxs("p",{className:"break-all",children:[R.name," → ",R.file]}),e.jsx("p",{className:"mt-1 text-muted-foreground",children:R.file===".omm"?n?"合并文档中的目录和字段;同名字段将更新。":"Merge bundled directories and fields; matching fields are updated.":n?"保存为此范围的架构,并保留此前的版本。":"Save this scope and retain its previous version."}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[e.jsx("button",{className:`${l} text-primary`,disabled:F,type:"button",onClick:()=>{$(async b=>{const h=R.file===".omm"?await xr(r,R.value,R.revision):await pr(r,R.file,R.value,R.revision);b()&&(N(null),d(R.file,h))})},children:n?"确认导入":"Import document"}),e.jsx("button",{className:l,disabled:F,type:"button",onClick:()=>N(null),children:n?"取消":"Cancel"})]})]}),F&&e.jsx("p",{role:"status",className:"py-2 text-xs",children:n?"处理中…":"Working…"}),x&&e.jsx("p",{role:"alert",className:"break-words py-2 text-xs text-destructive",children:x}),u&&e.jsx("p",{role:"status",className:"py-2 text-xs text-muted-foreground",children:u}),k&&e.jsxs("div",{className:"space-y-2 pb-3",children:[k.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground",children:n?"还没有历史版本。使用原生命令或文档编辑保存后会保留版本。":"No previous versions. Native saves and document edits retain history."}),k.map(b=>e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs",children:[new Date(b.savedAt).toLocaleString()," · ",b.changes.length," ",n?"处差异":"changes"]}),e.jsx("ul",{className:"space-y-1 text-xs text-muted-foreground",children:b.changes.map((h,j)=>e.jsxs("li",{className:"break-words",children:[h.kind==="added"?"+":h.kind==="removed"?"−":"~"," ",h.perspective?h.title:n?"项目总览":h.title," · ",h.fields.join(", ")]},j))})]},b.id))]})]})}async function gr(r,o,a=pe){const{document:d}=await Ue(r,a,o);if(d?.analysis&&qe(d.analysis)!==a)throw new Nt("Architecture scope does not match its file");return d}async function yr(r,o){return ur(r,o)}function jr({view:r,parentId:o,selectedId:a,onSelect:d,active:p=!0,referenceWidth:n,inspector:x,inspectorStage:g="details",onDismissInspector:u,onExpandedChange:c,navigation:F,heading:M}){const{t:k,locale:C}=he(),[R,N]=s.useState(1),E=s.useId().replace(/[^a-zA-Z0-9]/g,""),z=s.useRef(null),$=s.useRef(null),l=s.useRef(null),b=s.useRef(null),h=s.useRef(null),[j,B]=s.useState(""),[f,H]=s.useState(!1),[P,U]=s.useState(1),Q=s.useRef(1),[T,ne]=s.useState(!1),fe=s.useRef(!0),V=s.useRef({inspector:x,onDismissInspector:u});V.current={inspector:x,onDismissInspector:u};const _=s.useRef(c);_.current=c;const ee=s.useRef({left:0,top:0}),[ie,oe]=s.useState(!1),[ae,xe]=s.useState({width:320,height:320,clipHeight:0}),v=s.useRef(new Map),O=s.useRef(!1),K=s.useRef(0),le=s.useMemo(()=>qt(r,o,R),[r,o,R]),Y=s.useMemo(()=>nt(r,o).edges,[r,o]),W=s.useMemo(()=>{const i=j.match(/viewBox="([^"]+)"/)?.[1].split(/\s+/).map(Number),S=i?.[2]||320,m=i?.[3]||240,A=T?window.innerWidth:n||ae.width,w=Math.max(1,Math.min(1.4,Math.max(160,A-24)/S));return{width:S,height:m,scale:w}},[j,ae.width,T,n]),ce={width:W.width*W.scale*P,height:W.height*W.scale*P},ue=(i,S,m)=>{const A=Math.max(.01,Math.min(4,i)),w=$.current;if(w){const J=w.getBoundingClientRect(),be=S===void 0?w.clientWidth/2:S-J.left,me=m===void 0?w.clientHeight/2:m-J.top,Z=A/Q.current,ve=(w.scrollLeft+be)*Z-be,ge=(w.scrollTop+me)*Z-me,Ie=()=>{$.current===w&&(w.scrollLeft=ve,w.scrollTop=ge)};window.requestAnimationFrame?window.requestAnimationFrame(Ie):window.setTimeout(Ie,0)}Q.current=A,U(A)},se=()=>{Q.current=1,U(1),$.current&&($.current.scrollLeft=0,$.current.scrollTop=0)};s.useEffect(()=>{let i=!1;return B(""),H(!1),se(),oe(!1),v.current.clear(),le.nodes.length>300?(H(!0),()=>{i=!0}):(tr().then(async S=>{rr(S);const m=await S.render(`td-architecture-${E}`,le.code);i||B(er.sanitize(m.svg,{USE_PROFILES:{svg:!0,svgFilters:!0}}))}).catch(()=>{i||H(!0)}),()=>{i=!0})},[le.code,E]),s.useEffect(()=>{p||ne(!1)},[p]),s.useEffect(()=>{_.current?.(T)},[T]),s.useEffect(()=>()=>_.current?.(!1),[]),s.useLayoutEffect(()=>{const i=$.current;if(i)return i.scrollLeft=ee.current.left,i.scrollTop=ee.current.top,()=>{ee.current={left:i.scrollLeft,top:i.scrollTop}}},[T,!!j]),s.useEffect(()=>{const i=$.current;if(!i)return;const S=i.closest("[data-architecture-content]"),m=()=>{xe({width:i.clientWidth||320,height:i.clientHeight||320,clipHeight:S?.clientHeight||0})};m();const A=new ResizeObserver(m);return A.observe(i),S&&A.observe(S),()=>A.disconnect()},[j,T]),We(l,T&&p,()=>{V.current.inspector?V.current.onDismissInspector?.():ne(!1)},()=>fe.current?h.current:null),s.useEffect(()=>{if(!T)return;const i=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=i,v.current.clear()}},[T]),s.useLayoutEffect(()=>{const i=z.current?.querySelector("svg"),S=i?.querySelector("g");if(!(!i||!S||typeof S.getBBox!="function"))try{const m=S.getBBox();if(![m.x,m.y,m.width,m.height].every(Number.isFinite)||m.width<=0||m.height<=0)return;const A=`${m.x-16} ${m.y-16} ${m.width+32} ${m.height+32}`;if(i.getAttribute("viewBox")===A)return;i.setAttribute("viewBox",A),B(i.outerHTML)}catch{}},[j,T]),s.useLayoutEffect(()=>{z.current?.querySelectorAll("g.node, g.cluster").forEach(i=>{const S=Number(i.id.match(/(?:^|-)n(\d+)(?:-|$)/)?.[1]),m=le.nodes[S];if(!m)return;i.dataset.architectureRole=m.role,i.dataset.architectureNode=m.id,i.dataset.architectureRelated=String(!!a&&Y.some(w=>w.from===a&&w.to===m.id||w.to===a&&w.from===m.id));const A=i.matches("g.cluster")?i.querySelector("g.cluster-label")??i:i;A!==i&&(i.removeAttribute("role"),i.removeAttribute("tabindex")),A.dataset.architectureNode=m.id,A.setAttribute("role","button"),A.setAttribute("tabindex","0"),A.setAttribute("aria-label",m.title),A.setAttribute("aria-pressed",String(a===m.id)),i.setAttribute("aria-pressed",String(a===m.id))})}),s.useLayoutEffect(()=>{if(!a||g==="source"||g==="analysis")return;const i=$.current,S=[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(Z=>Z.dataset.architectureNode===a);if(!i||!S)return;let m=i.getBoundingClientRect();const A=i.closest("[data-architecture-content]");if(!T&&A&&m.width>24&&m.height>24){const Z=A.getBoundingClientRect();Z.height>160&&m.height<=Z.height&&(m.top<Z.top?A.scrollTop+=m.top-Z.top:m.bottom>Z.bottom&&(A.scrollTop+=m.bottom-Z.bottom),m=i.getBoundingClientRect());const ve=Math.max(m.top,Z.top),ge=Math.min(m.bottom,Z.bottom);m=new DOMRect(m.left,ve,m.width,Math.max(0,ge-ve))}const w=S.getBoundingClientRect();if(m.width<=24||m.height<=24||w.width<=0||w.height<=0)return;const J=12,be=w.width>m.width-2*J?(w.left+w.right-m.left-m.right)/2:w.left<m.left+J?w.left-m.left-J:w.right>m.right-J?w.right-m.right+J:0,me=w.height>m.height-2*J?(w.top+w.bottom-m.top-m.bottom)/2:w.top<m.top+J?w.top-m.top-J:w.bottom>m.bottom-J?w.bottom-m.bottom+J:0;i.scrollLeft+=be,i.scrollTop+=me},[a,ae.width,ae.height,ae.clipHeight,T,g,j]);const D=i=>{[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(S=>S.dataset.architectureNode===i)?.focus?.({preventScroll:!0}),d(i)},X="flex h-11 min-w-11 items-center justify-center rounded-lg px-2 hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",q=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomOut"),disabled:P<=.01,onClick:()=>ue(Q.current/1.25),children:e.jsx(Ut,{size:17})}),e.jsxs("button",{type:"button",className:`${X} text-xs tabular-nums`,"aria-label":k("architecture.resetZoom"),title:k("architecture.resetZoom"),onClick:se,children:[Math.round(W.scale*P*100),"%"]}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomIn"),disabled:P>=4,onClick:()=>ue(Q.current*1.25),children:e.jsx(yt,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.fitGraph"),onClick:()=>ue(Math.min((ae.width-24)/W.width,(ae.height-24)/W.height)/W.scale),children:e.jsx(sr,{size:17})}),!T&&e.jsx("button",{ref:h,type:"button",className:X,"aria-label":k("architecture.fullscreen"),onClick:()=>{fe.current=!0,ne(!0)},children:e.jsx(cr,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.download"),disabled:!j,onClick:()=>{oe(!1),Ge(new Blob([j],{type:"image/svg+xml"}),`architecture-${r.id}.svg`).catch(()=>oe(!0))},children:e.jsx(tt,{size:17})})]}),Ce=r.nodes.find(i=>i.id===o)?.title??r.title,Pe=e.jsxs(e.Fragment,{children:[T?e.jsxs("header",{className:"shrink-0 border-b border-border/15 px-2 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"min-w-0 flex-1 px-1",children:M??e.jsx("h2",{className:"truncate text-xs font-semibold",title:Ce,children:Ce})}),e.jsxs("label",{className:"flex shrink-0 items-center gap-1 text-xs text-muted-foreground",children:[C==="zh"?"展开":"Levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"h-11 max-w-20 rounded bg-surface px-1 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current":i===6?C==="zh"?"全部":"All":`${i}`},i))})]}),e.jsx("button",{ref:b,type:"button",className:X,"aria-label":k("architecture.closeFullscreen"),onClick:()=>ne(!1),children:e.jsx(Se,{size:18})})]}),e.jsx("div",{className:"flex items-center justify-between gap-1",title:k("architecture.panHint"),children:q})]}):e.jsxs("div",{className:"shrink-0 border-b border-border/15 bg-surface-2 px-2 py-1",children:[e.jsx("div",{className:"flex items-center justify-between gap-1",children:q}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-1 px-1 text-xs text-muted-foreground",children:[e.jsx("span",{children:k("architecture.panHint")}),e.jsxs("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[C==="zh"?"展开层级":"Expand levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"min-h-8 rounded bg-surface-2 px-2 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current level":i===6?C==="zh"?"全部":"All":`${i}`},i))})]})]})]}),T&&F&&e.jsx("div",{className:"shrink-0 px-2",children:F}),ie&&e.jsx("p",{role:"alert",className:"px-3 py-2 text-xs text-destructive",children:k("architecture.downloadFailed")}),e.jsxs("div",{className:T?"relative flex min-h-0 flex-1 flex-col overflow-hidden min-[768px]:flex-row":"relative",children:[f?e.jsx("p",{role:"alert",className:"p-4 text-sm text-muted-foreground",children:le.nodes.length>300?C==="zh"?"图中模块较多,请减少展开层级或选择单个视角。":"This graph has many modules. Expand fewer levels or select one perspective.":k("architecture.diagramFailed")}):j?e.jsx("div",{ref:$,"data-sidebar-gesture-ignore":!0,className:`termdock-architecture-viewport overflow-auto overscroll-contain p-3 ${T?"min-h-0 min-w-0 flex-1":"h-[min(50dvh,26rem)]"}`,style:{touchAction:"none",maxHeight:!T&&ae.clipHeight?Math.max(160,ae.clipHeight-150):void 0},onPointerDown:i=>{if(i.button!==0)return;v.current.size||(O.current=!1,K.current=0);const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node")??void 0;v.current.set(i.pointerId,{x:i.clientX,y:i.clientY,nodeId:S}),v.current.size>1&&(O.current=!0);try{i.currentTarget.setPointerCapture?.(i.pointerId)}catch{}},onPointerMove:i=>{const S=v.current.get(i.pointerId);if(!S)return;const m=[...v.current.values()];v.current.set(i.pointerId,{...S,x:i.clientX,y:i.clientY});const A=[...v.current.values()];if(A.length>=2){const w=me=>Math.hypot(me[0].x-me[1].x,me[0].y-me[1].y),J=w(m),be=w(A);J>0&&ue(Q.current*be/J,(A[0].x+A[1].x)/2,(A[0].y+A[1].y)/2),O.current=!0}else{const w=S.x-i.clientX,J=S.y-i.clientY;K.current+=Math.hypot(w,J),K.current>5&&(O.current=!0),i.currentTarget.scrollLeft+=w,i.currentTarget.scrollTop+=J}},onPointerUp:i=>{const S=v.current.get(i.pointerId),m=v.current.size===1&&!O.current&&S?.nodeId;v.current.delete(i.pointerId),m&&(O.current=!0,D(m))},onPointerCancel:i=>{v.current.delete(i.pointerId),O.current=!0},onLostPointerCapture:i=>{v.current.delete(i.pointerId)},children:e.jsx("div",{ref:z,role:"group","aria-label":k("architecture.modules"),className:"termdock-architecture-diagram mx-auto",style:ce,onClick:i=>{if(O.current)return;const m=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");m&&D(m)},onKeyDown:i=>{if(i.key!=="Enter"&&i.key!==" ")return;const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");S&&(i.preventDefault(),D(S))},dangerouslySetInnerHTML:{__html:j}})}):e.jsx("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:k("architecture.rendering")}),T&&x]})]});return T?vt.createPortal(e.jsx("section",{ref:l,tabIndex:-1,role:"dialog","aria-modal":"true","aria-label":k("architecture.diagram"),"data-sidebar-gesture-ignore":!0,className:"fixed inset-0 z-modal-panel flex flex-col overflow-hidden bg-surface text-foreground pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]",children:Pe}),document.body):e.jsx("section",{className:"overflow-clip rounded-xl border border-border/20 bg-surface-2","aria-label":k("architecture.diagram"),children:Pe})}function je(r,o){let a=r.trim().replace(/^@/,"");/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1)),a=a.replace(/\\ /g," ").replace(/:\d+(?:-\d+)?$/,"").replace(/\/+$/,""),/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1));const d=o.replace(/\/+$/,"");if(a.startsWith("/")){if(!a.startsWith(`${d}/`))return null;a=a.slice(d.length+1)}return a=a.replace(/^\.\//,""),a.length<=1024&&Wt(a)?a:null}function ht(r,o){const a=[...r.matchAll(/^# (.+?): hunk \d+,/gm)].map(x=>x[1]),p=(a.length?a:r.split(/\r?\n/).map(x=>x.trim()).filter(Boolean)).map(x=>je(x,o));if(p.some(x=>x===null))return null;const n=[...new Set(p)];return n.length<=20?n:null}function $t({rootPath:r,initialDirectory:o,selected:a,onChange:d,selectionDisabled:p=!1,compact:n=!1}){const{t:x}=he(),g=r.replace(/\/+$/,"")||"/",[u,c]=s.useState(()=>o&&je(o,g)?o.replace(/\/+$/,""):g),[F,M]=s.useState(""),[k,C]=s.useState(null),[R,N]=s.useState(0),[E,z]=s.useState(null);s.useEffect(()=>{if(!E)return;const f=window.setTimeout(()=>z(null),1800);return()=>window.clearTimeout(f)},[E]);const $=et(f=>f.invalidateDirectoryCache),l=new Set(a.map(f=>`${g==="/"?"":g}/${f}`)),b=f=>{const H=je(f,g);p||!H||a.includes(H)||a.length>=20||d([...a,H])},h=f=>{f!==g&&!je(f,g)||(c(f),M(""),C(null))},j=`inline-flex shrink-0 items-center justify-center rounded-lg text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 ${n?"h-8 w-8 [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11":"h-11 w-11"}`,B=je(u,g);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"shrink-0 px-2 py-1",children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.parentFolder"),onClick:()=>h(u.slice(0,u.lastIndexOf("/"))||g),children:e.jsx(Jt,{size:17})}),e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.backToProjectRoot"),onClick:()=>h(g),children:e.jsx(Vt,{size:16})}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:u,children:B??(u.split("/").pop()||"/")}),B&&e.jsx("button",{type:"button",className:`${j} text-primary`,disabled:p||!a.includes(B)&&a.length>=20,"aria-label":`${x("architecture.addScopeReference")}: ${u.split("/").pop()}`,title:B,"aria-pressed":a.includes(B),onClick:()=>b(u),children:a.includes(B)?e.jsx(Tt,{size:15}):e.jsx(nr,{size:15})}),e.jsx("button",{type:"button",className:j,"aria-label":x("rightSidebar.refreshFiles"),onClick:()=>{$(u,!0),N(f=>f+1)},children:e.jsx(kt,{size:15})})]})}),p&&e.jsx("p",{role:"alert",className:"shrink-0 px-3 pb-2 text-xs text-muted-foreground",children:x("architecture.correctPathsFirst")}),e.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 pb-2",children:e.jsx("input",{"aria-label":x("architecture.searchScopePaths"),placeholder:x("architecture.searchScopePaths"),value:F,onChange:f=>M(f.target.value),className:`${n?"h-9 [@media(pointer:coarse)]:h-11":"h-11"} w-full rounded-lg border border-border/20 bg-surface-2 px-3 text-sm focus-visible:ring-2 focus-visible:ring-ring`})}),e.jsx("div",{className:"min-h-0 flex-1 overflow-auto overscroll-contain bg-surface",children:e.jsx(Kt,{rootPath:u,selectedFilePath:k,onFileSelect:f=>{C(f),b(f)},onDirectoryRoot:h,onPathReference:b,getReferenceText:f=>je(f,g)??f,query:F,onReferenceCopied:z,copiedReferenceKey:E,onSearchFromDirectory:h,referenceSelection:{paths:l,label:x("architecture.addScopeReference"),disabled:p||a.length>=20}},`${u}:${R}`)})]})}function vr({rootPath:r,initialDirectory:o,initial:a,onConfirm:d,onCancel:p}){const{t:n}=he(),x=s.useRef(null);We(x,!0,p);const g=s.useId(),[u,c]=s.useState(a);s.useEffect(()=>{const M=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=M}},[]);const F="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40";return vt.createPortal(e.jsxs("div",{className:"fixed inset-0 z-popover flex items-center justify-center p-[max(0.75rem,env(safe-area-inset-top))]",children:[e.jsx("button",{type:"button",className:"absolute inset-0 z-10 cursor-default bg-[var(--app-backdrop)]","aria-label":n("common.cancel"),onClick:p}),e.jsxs("section",{ref:x,id:`${g}-dialog`,tabIndex:-1,role:"dialog","aria-modal":"true","aria-labelledby":g,"aria-describedby":`${g}-hint`,className:"relative z-20 flex h-full max-h-[42rem] w-full max-w-xl flex-col overflow-hidden rounded-xl border border-border/20 bg-surface text-foreground shadow-xl",children:[e.jsxs("header",{className:"shrink-0 px-3 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{id:g,className:"min-w-0 flex-1 text-sm font-semibold",title:n("architecture.browsePathsHint"),children:n("architecture.choosePaths")}),e.jsx("button",{type:"button",className:F,"aria-label":n("common.close"),onClick:p,children:e.jsx(Se,{size:17})})]}),e.jsx("p",{id:`${g}-hint`,className:"sr-only",children:n("architecture.browsePathsHint")})]}),e.jsx($t,{rootPath:r,initialDirectory:o,selected:u,onChange:c}),e.jsxs("footer",{className:"shrink-0 space-y-2 border-t border-border/15 p-3",children:[e.jsxs("p",{className:"text-xs text-muted-foreground",children:[n("architecture.selectedPaths")," ",u.length," / 20"]}),u.length>0&&e.jsx("div",{className:"flex max-h-24 flex-wrap gap-1 overflow-y-auto",children:u.map(M=>e.jsxs("button",{type:"button",className:`${F} min-w-0 max-w-full bg-surface-2`,"aria-label":`${n("architecture.removePath")}: ${M}`,onClick:()=>c(k=>k.filter(C=>C!==M)),children:[e.jsx("span",{className:"truncate font-mono",children:M}),e.jsx(Se,{size:13,className:"shrink-0"})]},M))}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:F,onClick:p,children:n("common.cancel")}),e.jsx("button",{type:"button",className:`${F} bg-primary/15 text-primary`,onClick:()=>d(u),children:n("architecture.usePaths")})]})]})]})]}),document.body)}function xt({rootPath:r,initial:o,outputFile:a,currentFile:d,currentDirectory:p,active:n=!0,onInsertPrompt:x,onPrepared:g,onClose:u}){const{t:c,locale:F}=he(),M=s.useRef(null),k=s.useRef(null);We(k,n,u),s.useLayoutEffect(()=>{n&&k.current?.scrollIntoView?.({block:"start"})},[n]);const[C,R]=s.useState(!1);s.useLayoutEffect(()=>{const D=k.current;if(!n||!D)return;const X=()=>R(D.clientWidth>=900);if(X(),typeof ResizeObserver>"u")return;const q=new ResizeObserver(X);return q.observe(D),()=>q.disconnect()},[n]);const N=s.useId(),[E,z]=s.useState(o.kind),[$,l]=s.useState(o.target),[b,h]=s.useState(o.paths.join(`
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RightSidebar-CfOJHcXO.js","assets/app-DNnVU3VK.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-C6xPtOPw.css","assets/App-xr2R4dST.js","assets/gestureArbiter-BE8k_FL7.js","assets/gestureArbiter-C2J0D0kV.css","assets/triangle-alert-D1VnXjVL.js","assets/referenceLongPress-LCYPFdN8.js","assets/DiffReview-CLKpyDPZ.js","assets/sparkles-Cm9xs8pz.js","assets/DiffViewer-DDiASWHf.js","assets/DiffViewer-T3uj2-aP.css","assets/ChangeWalkthroughPanel-g83lCwJi.js","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{ah as gt,aO as At,df as he,bA as e,_ as Dt,cv as Ge,cw as Mt,dg as We,n as yt,X as Se,dl as et,C as Tt,g as Ft,e as Fe,c as Lt,a as Pt,d as jt,dr as It}from"./app-DNnVU3VK.js";import{b as s,r as vt}from"./dnd-BCFAPC0L.js";import{ad as Je,ai as Le,a as wt,a4 as Ot,H as Ht,n as tt,Z as Bt,a5 as _t,a0 as qe,b as pe,e as Nt,a1 as qt,a3 as nt,u as Ut,ae as Wt,i as Jt,r as Vt,R as kt,o as Kt,af as Xt,a6 as Zt,p as Yt,D as Ee,N as mt,a2 as Qt}from"./App-xr2R4dST.js";import{L as Gt}from"./DiffViewer-DDiASWHf.js";import er from"./purify.es-4eNOHKSq.js";import{l as tr,i as rr,S as sr}from"./RightSidebar-CfOJHcXO.js";import{L as nr}from"./triangle-alert-D1VnXjVL.js";import{S as St}from"./sparkles-Cm9xs8pz.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-BE8k_FL7.js";import"./referenceLongPress-LCYPFdN8.js";import"./DiffReview-CLKpyDPZ.js";import"./ChangeWalkthroughPanel-g83lCwJi.js";const ir=[["path",{d:"M17 7 7 17",key:"15tmo1"}],["path",{d:"M17 17H7V7",key:"1org7z"}]],ar=gt("arrow-down-left",ir);const lr=[["path",{d:"m15 15 6 6",key:"1s409w"}],["path",{d:"m15 9 6-6",key:"ko1vev"}],["path",{d:"M21 16v5h-5",key:"1ck2sf"}],["path",{d:"M21 8V3h-5",key:"1qoq8a"}],["path",{d:"M3 16v5h5",key:"1t08am"}],["path",{d:"m3 21 6-6",key:"wwnumi"}],["path",{d:"M3 8V3h5",key:"1ln10m"}],["path",{d:"M9 9 3 3",key:"v551iv"}]],cr=gt("expand",lr);function or(r,o){const a=new Map,d={id:"all-perspectives",title:o,summary:r.summary,nodes:[],edges:[]};return r.perspectives.forEach((p,n)=>{const x=`perspective${n}`,g=new Map(p.nodes.map((u,c)=>[u.id,`${x}_node${c}`]));a.set(x,{perspective:p.id}),d.nodes.push({id:x,title:p.title,summary:p.summary,files:[],description:p.description});for(const u of p.nodes){const c=g.get(u.id);a.set(c,{perspective:p.id,node:u.id}),d.nodes.push({...u,id:c,parentId:u.parentId?g.get(u.parentId):x})}d.edges.push(...p.edges.map(u=>({...u,from:g.get(u.from),to:g.get(u.to)})))}),{view:d,references:a}}async function $e(r,o,a,d){const p=new URLSearchParams({root:r}),n=await fetch(`/api/terminal/architecture/${o}${d?"":`${o.includes("?")?"&":"?"}${p}`}`,{signal:a,cache:"no-store",...d?{method:"PUT",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":await At()},body:JSON.stringify({root:r,...d})}:{}}),x=await n.json();if(!n.ok)throw new Error(x.error||`HTTP ${n.status}`);return x}async function ur(r,o){const a=await $e(r,"documents",o);if(!Array.isArray(a.files))throw new Error("Invalid architecture library");return[...new Set(a.files.filter(d=>typeof d=="string"&&Je(d)))].sort()}async function Ue(r,o,a){if(!Je(o))throw new Error("Invalid architecture file");const d=await $e(r,`document?${new URLSearchParams({file:o})}`,a);if(!("document"in d)||d.revision!==null&&typeof d.revision!="string")throw new Error("Invalid architecture response");return{document:d.document?Le(JSON.stringify(d.document)):null,revision:typeof d.revision=="string"?d.revision:null}}async function dr(r,o,a,d,p,n,x){const g=await $e(r,"field",void 0,{file:o,perspective:a,node:d,field:p,value:n,revision:x});return Le(JSON.stringify(g.document))}async function mr(r,o,a){const d=await $e(r,`history?${new URLSearchParams({file:o})}`,a);if(!Array.isArray(d.versions))throw new Error("Invalid architecture history");return d.versions}async function hr(r,o){return $e(r,`bundle?${new URLSearchParams({file:o})}`)}async function xr(r,o,a){const d=await $e(r,"bundle",void 0,{bundle:o,revision:a});return Le(JSON.stringify(d.document))}async function pr(r,o,a,d){const p=await $e(r,"document",void 0,{file:o,document:a,...d!==void 0?{revision:d}:{}});return Le(JSON.stringify(p.document))}const fr=s.lazy(()=>Dt(()=>import("./RightSidebar-CfOJHcXO.js").then(r=>r.R),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])).then(r=>({default:r.MarkdownPreview})));function rt(r,o){return o?{description:"说明",diagram:"关系图源码",context:"上下文",constraint:"约束",concern:"问题与风险",todo:"待办",note:"备注"}[r]:{description:"Description",diagram:"Diagram source",context:"Context",constraint:"Constraints",concern:"Concerns",todo:"To do",note:"Notes"}[r]}function st({value:r,rootPath:o,onEdit:a,onOpenFile:d}){const{locale:p}=he(),n=p==="zh",x=r.description?.replace(/^#\s+([^\n]+)\n\s*/,(u,c)=>c.trim()===r.title?"":u),g=u=>e.jsx(s.Suspense,{fallback:e.jsx("p",{className:"whitespace-pre-wrap text-sm",children:u}),children:e.jsx(fr,{referenceLines:!1,content:u,filePath:null,rootPath:o??null,lineRange:null,onLineRangeClick:()=>{},scrollTop:0,outlineOpen:!1,lightboxOpen:!1,onLocalLinkOpen:c=>d?.({path:o&&c.path.startsWith(`${o}/`)?c.path.slice(o.length+1):c.path})})});return e.jsxs("div",{className:"space-y-2",children:[x&&e.jsx("div",{className:"min-w-0 overflow-x-auto",children:g(x)}),wt.filter(u=>u!=="description"&&r[u]).map(u=>e.jsxs("details",{className:"rounded-lg border border-border/15 px-2",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs font-medium",children:rt(u,n)}),e.jsxs("div",{className:"min-w-0 overflow-x-auto pb-2",children:[u==="diagram"?e.jsx("pre",{className:"whitespace-pre-wrap break-all text-xs",children:r[u]}):g(r[u]),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded px-2 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a(u),children:n?"编辑此字段":"Edit field"})]})]},u)),a&&e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-3 text-xs text-primary hover:bg-surface-elevated",onClick:()=>a("description"),children:n?"编辑文档":"Edit document"}),r.meta&&e.jsxs("details",{children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"版本信息":"Version information"}),e.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 break-all pb-3 text-xs text-muted-foreground",children:Object.entries(r.meta).filter(([u])=>u!=="previousDiagram").map(([u,c])=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{children:{created:n?"创建":"Created",updated:n?"更新":"Updated",updateCount:n?"更新次数":"Updates",gitCommit:"Commit",gitBranch:n?"分支":"Branch"}[u]??u}),e.jsx("dd",{children:String(c)})]},u))})]})]})}function Qe({root:r,file:o,perspective:a,node:d,initialField:p,onSaved:n,onCancel:x}){const{locale:g}=he(),u=g==="zh",[c,F]=s.useState(null),[M,k]=s.useState(p),[C,R]=s.useState(""),[N,E]=s.useState(""),[z,$]=s.useState(""),[l,b]=s.useState(!1),h=s.useRef(!0),j=s.useRef(0);s.useEffect(()=>{h.current=!0;const f=++j.current;F(null),$("");const H=new AbortController;return Ue(r,o,H.signal).then(P=>{!H.signal.aborted&&f===j.current&&F(P)}).catch(P=>{!H.signal.aborted&&f===j.current&&$(String(P.message))}),()=>{h.current=!1,++j.current,H.abort()}},[r,o]),s.useEffect(()=>{const f=c?.document?.perspectives.find(U=>U.id===a),H=d?f?.nodes.find(U=>U.id===d):f;if(!H||!f)return;const P=H[M]??(M==="description"?H.summary:M==="diagram"?Ot(f,d):"");R(P),E(P)},[c,a,d,M]);const B=C!==N;return e.jsxs("form",{className:"flex min-h-0 flex-1 flex-col gap-3",onSubmit:f=>{if(f.preventDefault(),!c||l||!B)return;const H=j.current;b(!0),$(""),dr(r,o,a,d,M,C,c.revision).then(P=>{h.current&&H===j.current&&n(P)}).catch(P=>{h.current&&H===j.current&&$(P.message)}).finally(()=>{h.current&&H===j.current&&b(!1)})},children:[e.jsxs("label",{className:"flex items-center gap-2 text-xs",children:[u?"字段":"Field",e.jsx("select",{"aria-label":u?"文档字段":"Document field",className:"min-h-11 min-w-0 flex-1 rounded bg-surface-2 px-2",value:M,disabled:l||B,onChange:f=>k(f.target.value),children:wt.map(f=>e.jsx("option",{value:f,children:rt(f,u)},f))})]}),B&&e.jsx("p",{className:"text-xs text-muted-foreground",children:u?"保存当前字段后可切换字段。":"Save this field before switching fields."}),!c&&!z&&e.jsx("p",{role:"status",className:"text-xs",children:u?"读取最新文档…":"Loading the latest document…"}),e.jsx("textarea",{"aria-label":rt(M,u),spellCheck:!1,className:"min-h-56 w-full flex-1 resize-y rounded-lg border border-border/30 bg-surface-2 p-3 font-mono text-sm focus-visible:ring-2 focus-visible:ring-ring",disabled:!c||l,maxLength:1e5,value:C,onChange:f=>R(f.target.value)}),z&&e.jsx("p",{role:"alert",className:"break-words text-xs text-destructive",children:z}),e.jsxs("div",{className:"sticky bottom-0 flex gap-2 bg-surface py-2",children:[e.jsx("button",{type:"submit",className:"min-h-11 rounded-lg bg-primary/15 px-4 text-sm text-primary disabled:opacity-40",disabled:!c||l||!B,children:l?u?"保存中…":"Saving…":u?"保存":"Save"}),e.jsx("button",{type:"button",className:"min-h-11 rounded-lg px-4 text-sm hover:bg-surface-elevated",disabled:l,onClick:x,children:u?"取消":"Cancel"})]})]})}function br({root:r,file:o,document:a,onLoaded:d}){const{locale:p}=he(),n=p==="zh",[x,g]=s.useState(""),[u,c]=s.useState(""),[F,M]=s.useState(!1),[k,C]=s.useState(null),[R,N]=s.useState(null),E=s.useRef(null),z=s.useRef(0);s.useEffect(()=>(z.current++,N(null),C(null),g(""),c(""),M(!1),()=>{z.current++}),[r,o]);async function $(b){const h=++z.current;M(!0),g(""),c("");try{await b(()=>h===z.current)}catch(j){h===z.current&&g(j instanceof Error?j.message:String(j))}finally{h===z.current&&M(!1)}}const l="inline-flex min-h-11 items-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated disabled:opacity-40";return e.jsxs("details",{className:"rounded-lg border border-border/15 px-3",children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:n?"历史、导入与分享":"History, import and sharing"}),e.jsxs("div",{className:"flex flex-wrap gap-1",children:[e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async b=>{const h=await mr(r,o);b()&&C(h)})},children:[e.jsx(Ht,{size:14}),n?"更新差异":"Changes"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{await Ge(new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),"termdock-architecture.json")})},children:[e.jsx(tt,{size:14}),"JSON"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=await hr(r,o);await Ge(new Blob([JSON.stringify(b,null,2)],{type:"application/json"}),"architecture.omm.json")})},children:[e.jsx(tt,{size:14}),".omm"]}),e.jsxs("button",{className:l,type:"button",disabled:F,onClick:()=>E.current?.click(),children:[e.jsx(Bt,{size:14}),n?"导入":"Import"]}),e.jsxs("button",{className:l,type:"button",disabled:F||!a,onClick:()=>{$(async()=>{const b=Mt(),h=_t(window.location.origin,{root:r,file:o,...b?{peerId:b.targetPeerId,serviceName:b.serviceName}:{}});await navigator.clipboard.writeText(h),c(n?"链接已复制,打开时需要登录此 Termdock 服务。":"Link copied. Sign in to this Termdock service to view it.")})},children:[e.jsx(Gt,{size:14}),n?"复制查看链接":"Copy viewer link"]})]}),e.jsx("input",{ref:E,hidden:!0,type:"file",accept:".json,application/json",onChange:b=>{const h=b.target.files?.[0];b.target.value="",h&&$(async j=>{if(h.size>5e6)throw new Error(n?"文档超过 5 MB。":"Document exceeds 5 MB.");const B=await h.text();if(!j())return;const f=JSON.parse(B);if(f?.format==="termdock-omm-bundle"){const Q=await Ue(r,".omm");if(!j())return;N({name:h.name,value:f,file:".omm",revision:Q.revision});return}const H=Le(B),P=H.analysis?qe(H.analysis):pe,U=await Ue(r,P);j()&&N({name:h.name,value:H,file:P,revision:U.revision})})}}),R&&e.jsxs("div",{className:"my-2 rounded-lg bg-surface-2 p-3 text-xs",children:[e.jsxs("p",{className:"break-all",children:[R.name," → ",R.file]}),e.jsx("p",{className:"mt-1 text-muted-foreground",children:R.file===".omm"?n?"合并文档中的目录和字段;同名字段将更新。":"Merge bundled directories and fields; matching fields are updated.":n?"保存为此范围的架构,并保留此前的版本。":"Save this scope and retain its previous version."}),e.jsxs("div",{className:"mt-2 flex gap-2",children:[e.jsx("button",{className:`${l} text-primary`,disabled:F,type:"button",onClick:()=>{$(async b=>{const h=R.file===".omm"?await xr(r,R.value,R.revision):await pr(r,R.file,R.value,R.revision);b()&&(N(null),d(R.file,h))})},children:n?"确认导入":"Import document"}),e.jsx("button",{className:l,disabled:F,type:"button",onClick:()=>N(null),children:n?"取消":"Cancel"})]})]}),F&&e.jsx("p",{role:"status",className:"py-2 text-xs",children:n?"处理中…":"Working…"}),x&&e.jsx("p",{role:"alert",className:"break-words py-2 text-xs text-destructive",children:x}),u&&e.jsx("p",{role:"status",className:"py-2 text-xs text-muted-foreground",children:u}),k&&e.jsxs("div",{className:"space-y-2 pb-3",children:[k.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground",children:n?"还没有历史版本。使用原生命令或文档编辑保存后会保留版本。":"No previous versions. Native saves and document edits retain history."}),k.map(b=>e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs",children:[new Date(b.savedAt).toLocaleString()," · ",b.changes.length," ",n?"处差异":"changes"]}),e.jsx("ul",{className:"space-y-1 text-xs text-muted-foreground",children:b.changes.map((h,j)=>e.jsxs("li",{className:"break-words",children:[h.kind==="added"?"+":h.kind==="removed"?"−":"~"," ",h.perspective?h.title:n?"项目总览":h.title," · ",h.fields.join(", ")]},j))})]},b.id))]})]})}async function gr(r,o,a=pe){const{document:d}=await Ue(r,a,o);if(d?.analysis&&qe(d.analysis)!==a)throw new Nt("Architecture scope does not match its file");return d}async function yr(r,o){return ur(r,o)}function jr({view:r,parentId:o,selectedId:a,onSelect:d,active:p=!0,referenceWidth:n,inspector:x,inspectorStage:g="details",onDismissInspector:u,onExpandedChange:c,navigation:F,heading:M}){const{t:k,locale:C}=he(),[R,N]=s.useState(1),E=s.useId().replace(/[^a-zA-Z0-9]/g,""),z=s.useRef(null),$=s.useRef(null),l=s.useRef(null),b=s.useRef(null),h=s.useRef(null),[j,B]=s.useState(""),[f,H]=s.useState(!1),[P,U]=s.useState(1),Q=s.useRef(1),[T,ne]=s.useState(!1),fe=s.useRef(!0),V=s.useRef({inspector:x,onDismissInspector:u});V.current={inspector:x,onDismissInspector:u};const _=s.useRef(c);_.current=c;const ee=s.useRef({left:0,top:0}),[ie,oe]=s.useState(!1),[ae,xe]=s.useState({width:320,height:320,clipHeight:0}),v=s.useRef(new Map),O=s.useRef(!1),K=s.useRef(0),le=s.useMemo(()=>qt(r,o,R),[r,o,R]),Y=s.useMemo(()=>nt(r,o).edges,[r,o]),W=s.useMemo(()=>{const i=j.match(/viewBox="([^"]+)"/)?.[1].split(/\s+/).map(Number),S=i?.[2]||320,m=i?.[3]||240,A=T?window.innerWidth:n||ae.width,w=Math.max(1,Math.min(1.4,Math.max(160,A-24)/S));return{width:S,height:m,scale:w}},[j,ae.width,T,n]),ce={width:W.width*W.scale*P,height:W.height*W.scale*P},ue=(i,S,m)=>{const A=Math.max(.01,Math.min(4,i)),w=$.current;if(w){const J=w.getBoundingClientRect(),be=S===void 0?w.clientWidth/2:S-J.left,me=m===void 0?w.clientHeight/2:m-J.top,Z=A/Q.current,ve=(w.scrollLeft+be)*Z-be,ge=(w.scrollTop+me)*Z-me,Ie=()=>{$.current===w&&(w.scrollLeft=ve,w.scrollTop=ge)};window.requestAnimationFrame?window.requestAnimationFrame(Ie):window.setTimeout(Ie,0)}Q.current=A,U(A)},se=()=>{Q.current=1,U(1),$.current&&($.current.scrollLeft=0,$.current.scrollTop=0)};s.useEffect(()=>{let i=!1;return B(""),H(!1),se(),oe(!1),v.current.clear(),le.nodes.length>300?(H(!0),()=>{i=!0}):(tr().then(async S=>{rr(S);const m=await S.render(`td-architecture-${E}`,le.code);i||B(er.sanitize(m.svg,{USE_PROFILES:{svg:!0,svgFilters:!0}}))}).catch(()=>{i||H(!0)}),()=>{i=!0})},[le.code,E]),s.useEffect(()=>{p||ne(!1)},[p]),s.useEffect(()=>{_.current?.(T)},[T]),s.useEffect(()=>()=>_.current?.(!1),[]),s.useLayoutEffect(()=>{const i=$.current;if(i)return i.scrollLeft=ee.current.left,i.scrollTop=ee.current.top,()=>{ee.current={left:i.scrollLeft,top:i.scrollTop}}},[T,!!j]),s.useEffect(()=>{const i=$.current;if(!i)return;const S=i.closest("[data-architecture-content]"),m=()=>{xe({width:i.clientWidth||320,height:i.clientHeight||320,clipHeight:S?.clientHeight||0})};m();const A=new ResizeObserver(m);return A.observe(i),S&&A.observe(S),()=>A.disconnect()},[j,T]),We(l,T&&p,()=>{V.current.inspector?V.current.onDismissInspector?.():ne(!1)},()=>fe.current?h.current:null),s.useEffect(()=>{if(!T)return;const i=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=i,v.current.clear()}},[T]),s.useLayoutEffect(()=>{const i=z.current?.querySelector("svg"),S=i?.querySelector("g");if(!(!i||!S||typeof S.getBBox!="function"))try{const m=S.getBBox();if(![m.x,m.y,m.width,m.height].every(Number.isFinite)||m.width<=0||m.height<=0)return;const A=`${m.x-16} ${m.y-16} ${m.width+32} ${m.height+32}`;if(i.getAttribute("viewBox")===A)return;i.setAttribute("viewBox",A),B(i.outerHTML)}catch{}},[j,T]),s.useLayoutEffect(()=>{z.current?.querySelectorAll("g.node, g.cluster").forEach(i=>{const S=Number(i.id.match(/(?:^|-)n(\d+)(?:-|$)/)?.[1]),m=le.nodes[S];if(!m)return;i.dataset.architectureRole=m.role,i.dataset.architectureNode=m.id,i.dataset.architectureRelated=String(!!a&&Y.some(w=>w.from===a&&w.to===m.id||w.to===a&&w.from===m.id));const A=i.matches("g.cluster")?i.querySelector("g.cluster-label")??i:i;A!==i&&(i.removeAttribute("role"),i.removeAttribute("tabindex")),A.dataset.architectureNode=m.id,A.setAttribute("role","button"),A.setAttribute("tabindex","0"),A.setAttribute("aria-label",m.title),A.setAttribute("aria-pressed",String(a===m.id)),i.setAttribute("aria-pressed",String(a===m.id))})}),s.useLayoutEffect(()=>{if(!a||g==="source"||g==="analysis")return;const i=$.current,S=[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(Z=>Z.dataset.architectureNode===a);if(!i||!S)return;let m=i.getBoundingClientRect();const A=i.closest("[data-architecture-content]");if(!T&&A&&m.width>24&&m.height>24){const Z=A.getBoundingClientRect();Z.height>160&&m.height<=Z.height&&(m.top<Z.top?A.scrollTop+=m.top-Z.top:m.bottom>Z.bottom&&(A.scrollTop+=m.bottom-Z.bottom),m=i.getBoundingClientRect());const ve=Math.max(m.top,Z.top),ge=Math.min(m.bottom,Z.bottom);m=new DOMRect(m.left,ve,m.width,Math.max(0,ge-ve))}const w=S.getBoundingClientRect();if(m.width<=24||m.height<=24||w.width<=0||w.height<=0)return;const J=12,be=w.width>m.width-2*J?(w.left+w.right-m.left-m.right)/2:w.left<m.left+J?w.left-m.left-J:w.right>m.right-J?w.right-m.right+J:0,me=w.height>m.height-2*J?(w.top+w.bottom-m.top-m.bottom)/2:w.top<m.top+J?w.top-m.top-J:w.bottom>m.bottom-J?w.bottom-m.bottom+J:0;i.scrollLeft+=be,i.scrollTop+=me},[a,ae.width,ae.height,ae.clipHeight,T,g,j]);const D=i=>{[...z.current?.querySelectorAll("[data-architecture-node]")??[]].find(S=>S.dataset.architectureNode===i)?.focus?.({preventScroll:!0}),d(i)},X="flex h-11 min-w-11 items-center justify-center rounded-lg px-2 hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",q=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomOut"),disabled:P<=.01,onClick:()=>ue(Q.current/1.25),children:e.jsx(Ut,{size:17})}),e.jsxs("button",{type:"button",className:`${X} text-xs tabular-nums`,"aria-label":k("architecture.resetZoom"),title:k("architecture.resetZoom"),onClick:se,children:[Math.round(W.scale*P*100),"%"]}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.zoomIn"),disabled:P>=4,onClick:()=>ue(Q.current*1.25),children:e.jsx(yt,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.fitGraph"),onClick:()=>ue(Math.min((ae.width-24)/W.width,(ae.height-24)/W.height)/W.scale),children:e.jsx(sr,{size:17})}),!T&&e.jsx("button",{ref:h,type:"button",className:X,"aria-label":k("architecture.fullscreen"),onClick:()=>{fe.current=!0,ne(!0)},children:e.jsx(cr,{size:17})}),e.jsx("button",{type:"button",className:X,"aria-label":k("architecture.download"),disabled:!j,onClick:()=>{oe(!1),Ge(new Blob([j],{type:"image/svg+xml"}),`architecture-${r.id}.svg`).catch(()=>oe(!0))},children:e.jsx(tt,{size:17})})]}),Ce=r.nodes.find(i=>i.id===o)?.title??r.title,Pe=e.jsxs(e.Fragment,{children:[T?e.jsxs("header",{className:"shrink-0 border-b border-border/15 px-2 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"min-w-0 flex-1 px-1",children:M??e.jsx("h2",{className:"truncate text-xs font-semibold",title:Ce,children:Ce})}),e.jsxs("label",{className:"flex shrink-0 items-center gap-1 text-xs text-muted-foreground",children:[C==="zh"?"展开":"Levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"h-11 max-w-20 rounded bg-surface px-1 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current":i===6?C==="zh"?"全部":"All":`${i}`},i))})]}),e.jsx("button",{ref:b,type:"button",className:X,"aria-label":k("architecture.closeFullscreen"),onClick:()=>ne(!1),children:e.jsx(Se,{size:18})})]}),e.jsx("div",{className:"flex items-center justify-between gap-1",title:k("architecture.panHint"),children:q})]}):e.jsxs("div",{className:"shrink-0 border-b border-border/15 bg-surface-2 px-2 py-1",children:[e.jsx("div",{className:"flex items-center justify-between gap-1",children:q}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-1 px-1 text-xs text-muted-foreground",children:[e.jsx("span",{children:k("architecture.panHint")}),e.jsxs("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[C==="zh"?"展开层级":"Expand levels",e.jsx("select",{"aria-label":C==="zh"?"展开层级":"Expand levels",className:"min-h-8 rounded bg-surface-2 px-2 text-foreground",value:R,onChange:i=>N(Number(i.target.value)),children:[0,1,2,6].map(i=>e.jsx("option",{value:i,children:i===0?C==="zh"?"当前层":"Current level":i===6?C==="zh"?"全部":"All":`${i}`},i))})]})]})]}),T&&F&&e.jsx("div",{className:"shrink-0 px-2",children:F}),ie&&e.jsx("p",{role:"alert",className:"px-3 py-2 text-xs text-destructive",children:k("architecture.downloadFailed")}),e.jsxs("div",{className:T?"relative flex min-h-0 flex-1 flex-col overflow-hidden min-[768px]:flex-row":"relative",children:[f?e.jsx("p",{role:"alert",className:"p-4 text-sm text-muted-foreground",children:le.nodes.length>300?C==="zh"?"图中模块较多,请减少展开层级或选择单个视角。":"This graph has many modules. Expand fewer levels or select one perspective.":k("architecture.diagramFailed")}):j?e.jsx("div",{ref:$,"data-sidebar-gesture-ignore":!0,className:`termdock-architecture-viewport overflow-auto overscroll-contain p-3 ${T?"min-h-0 min-w-0 flex-1":"h-[min(50dvh,26rem)]"}`,style:{touchAction:"none",maxHeight:!T&&ae.clipHeight?Math.max(160,ae.clipHeight-150):void 0},onPointerDown:i=>{if(i.button!==0)return;v.current.size||(O.current=!1,K.current=0);const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node")??void 0;v.current.set(i.pointerId,{x:i.clientX,y:i.clientY,nodeId:S}),v.current.size>1&&(O.current=!0);try{i.currentTarget.setPointerCapture?.(i.pointerId)}catch{}},onPointerMove:i=>{const S=v.current.get(i.pointerId);if(!S)return;const m=[...v.current.values()];v.current.set(i.pointerId,{...S,x:i.clientX,y:i.clientY});const A=[...v.current.values()];if(A.length>=2){const w=me=>Math.hypot(me[0].x-me[1].x,me[0].y-me[1].y),J=w(m),be=w(A);J>0&&ue(Q.current*be/J,(A[0].x+A[1].x)/2,(A[0].y+A[1].y)/2),O.current=!0}else{const w=S.x-i.clientX,J=S.y-i.clientY;K.current+=Math.hypot(w,J),K.current>5&&(O.current=!0),i.currentTarget.scrollLeft+=w,i.currentTarget.scrollTop+=J}},onPointerUp:i=>{const S=v.current.get(i.pointerId),m=v.current.size===1&&!O.current&&S?.nodeId;v.current.delete(i.pointerId),m&&(O.current=!0,D(m))},onPointerCancel:i=>{v.current.delete(i.pointerId),O.current=!0},onLostPointerCapture:i=>{v.current.delete(i.pointerId)},children:e.jsx("div",{ref:z,role:"group","aria-label":k("architecture.modules"),className:"termdock-architecture-diagram mx-auto",style:ce,onClick:i=>{if(O.current)return;const m=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");m&&D(m)},onKeyDown:i=>{if(i.key!=="Enter"&&i.key!==" ")return;const S=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");S&&(i.preventDefault(),D(S))},dangerouslySetInnerHTML:{__html:j}})}):e.jsx("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:k("architecture.rendering")}),T&&x]})]});return T?vt.createPortal(e.jsx("section",{ref:l,tabIndex:-1,role:"dialog","aria-modal":"true","aria-label":k("architecture.diagram"),"data-sidebar-gesture-ignore":!0,className:"fixed inset-0 z-modal-panel flex flex-col overflow-hidden bg-surface text-foreground pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]",children:Pe}),document.body):e.jsx("section",{className:"overflow-clip rounded-xl border border-border/20 bg-surface-2","aria-label":k("architecture.diagram"),children:Pe})}function je(r,o){let a=r.trim().replace(/^@/,"");/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1)),a=a.replace(/\\ /g," ").replace(/:\d+(?:-\d+)?$/,"").replace(/\/+$/,""),/^([`"']).*\1$/.test(a)&&(a=a.slice(1,-1));const d=o.replace(/\/+$/,"");if(a.startsWith("/")){if(!a.startsWith(`${d}/`))return null;a=a.slice(d.length+1)}return a=a.replace(/^\.\//,""),a.length<=1024&&Wt(a)?a:null}function ht(r,o){const a=[...r.matchAll(/^# (.+?): hunk \d+,/gm)].map(x=>x[1]),p=(a.length?a:r.split(/\r?\n/).map(x=>x.trim()).filter(Boolean)).map(x=>je(x,o));if(p.some(x=>x===null))return null;const n=[...new Set(p)];return n.length<=20?n:null}function $t({rootPath:r,initialDirectory:o,selected:a,onChange:d,selectionDisabled:p=!1,compact:n=!1}){const{t:x}=he(),g=r.replace(/\/+$/,"")||"/",[u,c]=s.useState(()=>o&&je(o,g)?o.replace(/\/+$/,""):g),[F,M]=s.useState(""),[k,C]=s.useState(null),[R,N]=s.useState(0),[E,z]=s.useState(null);s.useEffect(()=>{if(!E)return;const f=window.setTimeout(()=>z(null),1800);return()=>window.clearTimeout(f)},[E]);const $=et(f=>f.invalidateDirectoryCache),l=new Set(a.map(f=>`${g==="/"?"":g}/${f}`)),b=f=>{const H=je(f,g);p||!H||a.includes(H)||a.length>=20||d([...a,H])},h=f=>{f!==g&&!je(f,g)||(c(f),M(""),C(null))},j=`inline-flex shrink-0 items-center justify-center rounded-lg text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 ${n?"h-8 w-8 [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11":"h-11 w-11"}`,B=je(u,g);return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"shrink-0 px-2 py-1",children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.parentFolder"),onClick:()=>h(u.slice(0,u.lastIndexOf("/"))||g),children:e.jsx(Jt,{size:17})}),e.jsx("button",{type:"button",className:j,disabled:u===g,"aria-label":x("rightSidebar.backToProjectRoot"),onClick:()=>h(g),children:e.jsx(Vt,{size:16})}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:u,children:B??(u.split("/").pop()||"/")}),B&&e.jsx("button",{type:"button",className:`${j} text-primary`,disabled:p||!a.includes(B)&&a.length>=20,"aria-label":`${x("architecture.addScopeReference")}: ${u.split("/").pop()}`,title:B,"aria-pressed":a.includes(B),onClick:()=>b(u),children:a.includes(B)?e.jsx(Tt,{size:15}):e.jsx(nr,{size:15})}),e.jsx("button",{type:"button",className:j,"aria-label":x("rightSidebar.refreshFiles"),onClick:()=>{$(u,!0),N(f=>f+1)},children:e.jsx(kt,{size:15})})]})}),p&&e.jsx("p",{role:"alert",className:"shrink-0 px-3 pb-2 text-xs text-muted-foreground",children:x("architecture.correctPathsFirst")}),e.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 pb-2",children:e.jsx("input",{"aria-label":x("architecture.searchScopePaths"),placeholder:x("architecture.searchScopePaths"),value:F,onChange:f=>M(f.target.value),className:`${n?"h-9 [@media(pointer:coarse)]:h-11":"h-11"} w-full rounded-lg border border-border/20 bg-surface-2 px-3 text-sm focus-visible:ring-2 focus-visible:ring-ring`})}),e.jsx("div",{className:"min-h-0 flex-1 overflow-auto overscroll-contain bg-surface",children:e.jsx(Kt,{rootPath:u,selectedFilePath:k,onFileSelect:f=>{C(f),b(f)},onDirectoryRoot:h,onPathReference:b,getReferenceText:f=>je(f,g)??f,query:F,onReferenceCopied:z,copiedReferenceKey:E,onSearchFromDirectory:h,referenceSelection:{paths:l,label:x("architecture.addScopeReference"),disabled:p||a.length>=20}},`${u}:${R}`)})]})}function vr({rootPath:r,initialDirectory:o,initial:a,onConfirm:d,onCancel:p}){const{t:n}=he(),x=s.useRef(null);We(x,!0,p);const g=s.useId(),[u,c]=s.useState(a);s.useEffect(()=>{const M=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=M}},[]);const F="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg px-3 text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40";return vt.createPortal(e.jsxs("div",{className:"fixed inset-0 z-popover flex items-center justify-center p-[max(0.75rem,env(safe-area-inset-top))]",children:[e.jsx("button",{type:"button",className:"absolute inset-0 z-10 cursor-default bg-[var(--app-backdrop)]","aria-label":n("common.cancel"),onClick:p}),e.jsxs("section",{ref:x,id:`${g}-dialog`,tabIndex:-1,role:"dialog","aria-modal":"true","aria-labelledby":g,"aria-describedby":`${g}-hint`,className:"relative z-20 flex h-full max-h-[42rem] w-full max-w-xl flex-col overflow-hidden rounded-xl border border-border/20 bg-surface text-foreground shadow-xl",children:[e.jsxs("header",{className:"shrink-0 px-3 py-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{id:g,className:"min-w-0 flex-1 text-sm font-semibold",title:n("architecture.browsePathsHint"),children:n("architecture.choosePaths")}),e.jsx("button",{type:"button",className:F,"aria-label":n("common.close"),onClick:p,children:e.jsx(Se,{size:17})})]}),e.jsx("p",{id:`${g}-hint`,className:"sr-only",children:n("architecture.browsePathsHint")})]}),e.jsx($t,{rootPath:r,initialDirectory:o,selected:u,onChange:c}),e.jsxs("footer",{className:"shrink-0 space-y-2 border-t border-border/15 p-3",children:[e.jsxs("p",{className:"text-xs text-muted-foreground",children:[n("architecture.selectedPaths")," ",u.length," / 20"]}),u.length>0&&e.jsx("div",{className:"flex max-h-24 flex-wrap gap-1 overflow-y-auto",children:u.map(M=>e.jsxs("button",{type:"button",className:`${F} min-w-0 max-w-full bg-surface-2`,"aria-label":`${n("architecture.removePath")}: ${M}`,onClick:()=>c(k=>k.filter(C=>C!==M)),children:[e.jsx("span",{className:"truncate font-mono",children:M}),e.jsx(Se,{size:13,className:"shrink-0"})]},M))}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:F,onClick:p,children:n("common.cancel")}),e.jsx("button",{type:"button",className:`${F} bg-primary/15 text-primary`,onClick:()=>d(u),children:n("architecture.usePaths")})]})]})]})]}),document.body)}function xt({rootPath:r,initial:o,outputFile:a,currentFile:d,currentDirectory:p,active:n=!0,onInsertPrompt:x,onPrepared:g,onClose:u}){const{t:c,locale:F}=he(),M=s.useRef(null),k=s.useRef(null);We(k,n,u),s.useLayoutEffect(()=>{n&&k.current?.scrollIntoView?.({block:"start"})},[n]);const[C,R]=s.useState(!1);s.useLayoutEffect(()=>{const D=k.current;if(!n||!D)return;const X=()=>R(D.clientWidth>=900);if(X(),typeof ResizeObserver>"u")return;const q=new ResizeObserver(X);return q.observe(D),()=>q.disconnect()},[n]);const N=s.useId(),[E,z]=s.useState(o.kind),[$,l]=s.useState(o.target),[b,h]=s.useState(o.paths.join(`
|
|
3
3
|
`)),[j,B]=s.useState(o.depth),[f,H]=s.useState(o.focus),[P,U]=s.useState(null),[Q,T]=s.useState(!1),[ne,fe]=s.useState(!1),V=s.useRef(0);s.useEffect(()=>()=>{V.current++},[]),s.useEffect(()=>{n||(V.current++,T(!1),fe(!1))},[n]);const _=ht(b,r),ee=d?je(d,r):null,ie=p?je(p,r):null,oe=ie?p:ee?d.slice(0,d.lastIndexOf("/")):r,xe=n&&C&&E!=="project"&&!a&&!ne;let v=null;try{(E==="project"||_)&&(v=Xt({kind:E,target:$,paths:_??[],depth:j,focus:f}))}catch{}const O=v?Zt(r,F,v,a):"",K="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg text-xs font-medium transition hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",le=`${K} px-3`,Y=`${K} px-1`,W="min-h-10 w-full min-w-0 rounded-lg border border-border/20 bg-surface px-2 py-2 text-sm text-foreground focus-visible:ring-2 focus-visible:ring-ring",ce=()=>{V.current++,T(!1),U(null)},ue=D=>{h(_?[...new Set([..._,D])].join(`
|
|
4
4
|
`):`${b.trim()}
|
|
5
5
|
${D}`),ce()},se=v;return e.jsxs("div",{ref:k,id:`${N}-workspace`,tabIndex:-1,className:xe?"grid min-h-0 min-w-0 flex-1 grid-cols-[20rem_minmax(0,1fr)] grid-rows-[minmax(0,1fr)] items-start gap-3":"min-w-0 shrink-0",children:[xe&&e.jsxs("section",{"aria-label":c("architecture.choosePaths"),"aria-describedby":`${N}-browser-hint`,className:"flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-xl border border-border/20 bg-surface-2",children:[e.jsxs("header",{className:"flex min-h-9 shrink-0 items-center gap-2 px-3",children:[e.jsx("h3",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:c("architecture.browsePathsHint"),children:c("architecture.choosePaths")}),e.jsxs("p",{role:"status","aria-label":`${c("architecture.selectedPaths")} ${_?.length??0} / 20`,className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:[_?.length??0," / 20"]}),e.jsx("p",{id:`${N}-browser-hint`,className:"sr-only",children:c("architecture.browsePathsHint")})]}),e.jsx($t,{compact:!0,rootPath:r,initialDirectory:oe,selected:_??[],selectionDisabled:!_,onChange:D=>{h(D.join(`
|
|
Binary file
|
|
Binary file
|
package/dist/client/assets/{ChangeWalkthroughPanel-Bt4fjEoD.js → ChangeWalkthroughPanel-g83lCwJi.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ah as re,df as ce,bA as s,e as le}from"./app-D2yRvfNE.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as de}from"./sparkles-CgDDXr95.js";import{M as me,G as he,L as ue,T as xe,C as fe}from"./triangle-alert-DqUvQ_x8.js";const pe=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],ye=re("chevron-left",pe);const ge=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],be=re("minimize-2",ge);function ke(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ve(t){switch(t){case"entry":case"source":return"bg-sky-400";case"ui":return"bg-fuchsia-400";case"risk":return"bg-destructive";case"test":return"bg-emerald-400";default:return"bg-primary"}}function Ne(t){if(!t)return;const d=typeof t.sectionIndex=="number"?` section ${t.sectionIndex+1}`:"",i=typeof t.hunkIndex=="number"?` hunk ${t.hunkIndex+1}`:"";return`${t.filePath}${i}${d}`}function Q({anchor:t,children:d,onNavigate:i,className:o,style:r,elementRef:g,onActivate:l}){return!t&&!l?s.jsx("span",{ref:g,className:o,style:r,children:d}):s.jsx("button",{ref:g,type:"button",onClick:()=>{l?.(),t&&i(t)},title:Ne(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const H=190,X=92,q=132,we=28,C=16,J=18,T=54,ee=24,ae=18,je=8,B=24,z=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function te(t){return z[t%z.length]}function Me(t,d){return`${t.from}->${t.to}:${d}`}function Ee(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(X,36+Math.max(0,o-1)*ae)}function ne(t,d,i){if(i<=1)return t.y+t.height/2;const o=Math.max(0,t.height-36),r=Math.min(o,(i-1)*ae);return t.y+t.height/2-r/2+r/(i-1)*d}function se(t,d,i){return t.slice().sort((o,r)=>{const g=d[o],l=d[r],a=i==="from"?g.toNode:g.fromNode,h=i==="from"?l.toNode:l.fromNode;return a.y-h.y||a.index-h.index||g.index-l.index})}function $e(t,d){const i=new Map;for(const o of t){if(Math.abs(o.toNode.layer-o.fromNode.layer)!==1)continue;const r=`${o.fromNode.layer}:${o.toNode.layer}`,g=i.get(r)??[];g.push(o),i.set(r,g)}for(const o of i.values()){o.sort((h,x)=>(h.fromY+h.toY)/2-(x.fromY+x.toY)/2||h.index-x.index);const r=[];o.forEach((h,x)=>{const N=(h.fromY+h.toY)/2,M=Math.max(B,d[h.key]??0)/2;if(x===0){r.push(N);return}const w=o[x-1],E=Math.max(B,d[w.key]??0)/2;r.push(Math.max(N,r[x-1]+E+M+je))});const g=r.reduce((h,x,N)=>h+x-(o[N].fromY+o[N].toY)/2,0)/Math.max(1,r.length),l=Math.min(...r.map((h,x)=>h-g-Math.max(B,d[o[x].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,x)=>{h.laneY=r[x]-g+a})}}function _e(t,d,i={},o={}){const r=new Map(t.map((n,m)=>[n.id,{node:n,index:m}])),g=d.filter(n=>r.has(n.from)&&r.has(n.to)),l=new Map,a=new Map;for(const n of t)l.set(n.id,[]),a.set(n.id,[]);for(const n of g)l.get(n.to)?.push(n.from),a.get(n.from)?.push(n.to);const h=new Map,x=new Set,N=n=>{const m=h.get(n);if(m!==void 0)return m;if(x.has(n))return 0;x.add(n);const c=l.get(n)??[],u=c.length===0?0:Math.max(...c.map(N))+1;return x.delete(n),h.set(n,u),u};for(const n of t)N(n.id);const M=new Map;for(const n of t){const m=h.get(n.id)??0,c=M.get(m)??[],u=r.get(n.id);u&&c.push(u),M.set(m,c)}const w=[];for(const[n,m]of M.entries()){m.sort((u,f)=>u.index-f.index);let c=C+T;m.forEach(({node:u,index:f},j)=>{const I=Math.max(Ee(u.id,l,a),Math.ceil(i[u.id]??X));w.push({node:u,index:f,layer:n,row:j,x:C+n*(H+q),y:c,height:I}),c+=I+we})}const E=new Map(w.map(n=>[n.node.id,n])),v=g.flatMap((n,m)=>{const c=E.get(n.from),u=E.get(n.to);return!c||!u?[]:[{...n,key:Me(n,m),index:m,fromNode:c,toNode:u,routeIndex:m,fromPortIndex:0,toPortIndex:0,fromY:c.y+c.height/2,toY:u.y+u.height/2,laneY:(c.y+c.height/2+u.y+u.height/2)/2}]}),$=new Map,G=new Map;v.forEach((n,m)=>{$.set(n.from,[...$.get(n.from)??[],m]),G.set(n.to,[...G.get(n.to)??[],m])});for(const[n,m]of $){const c=se(m,v,"from");c.forEach((u,f)=>{const j=v[u];j.fromPortIndex=f,j.fromY=ne(E.get(n),f,c.length)})}for(const[n,m]of G){const c=se(m,v,"to");c.forEach((u,f)=>{const j=v[u];j.toPortIndex=f,j.toY=ne(E.get(n),f,c.length)})}$e(v,o);let Y=0;v.forEach(n=>{const m=Math.min(n.fromNode.layer,n.toNode.layer),c=Math.max(n.fromNode.layer,n.toNode.layer);if(c-m<=1)return;const f=Y;Y+=1,n.routeIndex=f;const j=w.filter(A=>A.layer>=m&&A.layer<=c),I=Math.min(...j.map(A=>A.y))-ee-(Math.floor(f/2)+1)*J,S=Math.max(...j.map(A=>A.y+A.height))+ee+(Math.floor(f/2)+1)*J;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+T+X,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(B,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*H+O*q,height:W+C+T}}function oe(t,d=12){const i=t[0];if(!i)return"";const o=[`M ${i.x} ${i.y}`];for(let r=1;r<t.length;r+=1){const g=t[r-1],l=t[r],a=t[r+1];if(!a){o.push(`L ${l.x} ${l.y}`);continue}const h=l.x-g.x,x=l.y-g.y,N=a.x-l.x,M=a.y-l.y,w=Math.abs(h)+Math.abs(x),E=Math.abs(N)+Math.abs(M);if(w===0||E===0||h&&N||x&&M){o.push(`L ${l.x} ${l.y}`);continue}const v=Math.min(d,w/2,E/2),$={x:l.x-Math.sign(h)*v,y:l.y-Math.sign(x)*v},G={x:l.x+Math.sign(N)*v,y:l.y+Math.sign(M)*v};o.push(`L ${$.x} ${$.y}`),o.push(`Q ${l.x} ${l.y} ${G.x} ${G.y}`)}return o.join(" ")}function De(t){const d=t.fromNode.x+H+8,i=t.fromY,o=t.toNode.x-8,r=t.toY,g=Math.abs(t.toNode.layer-t.fromNode.layer),l=d+22+t.fromPortIndex*5,a=o-22-t.toPortIndex*5;return g<=1?oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}]):oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}])}function Ie(t){const d=t.fromNode.x+H+8,i=t.toNode.x-8,o=Math.abs(t.toNode.layer-t.fromNode.layer),r=Math.max(34,Math.abs(i-d));return o<=1?{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(72,Math.min(108,r-34))}:{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(84,Math.min(120,r*.3))}}function Pe({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=ke(t,d),h=D.useRef(new Map),x=D.useRef(new Map),[N,M]=D.useState({}),[w,E]=D.useState({}),[v,$]=D.useState(null),[G,Y]=D.useState(null),[O,W]=D.useState(null),[n,m]=D.useState(null),c=D.useMemo(()=>a?_e(a.nodes,a.edges,N,w):null,[N,w,a]);if(D.useLayoutEffect(()=>{if(!a)return;const e={};for(const p of a.nodes){const b=h.current.get(p.id);b&&(e[p.id]=b.offsetHeight)}M(p=>{const b=Object.keys(p),_=Object.keys(e);return b.length===_.length&&_.every(k=>p[k]===e[k])?p:e});const y={};for(const[p,b]of x.current)y[p]=b.offsetHeight;E(p=>{const b=Object.keys(p),_=Object.keys(y);return b.length===_.length&&_.every(k=>p[k]===y[k])?p:y})},[a]),!a||!c)return null;const u=`walkthrough-arrow-${l.replace(/[^a-zA-Z0-9_-]/g,"")||"default"}`,f=O??n,j=f?null:v??G,I=c.edges.some(e=>e.key===j)?j:null,S=c.edges.find(e=>e.key===I),A=f?c.edges.filter(e=>e.from===f||e.to===f):[],U=f?new Set(A.map(e=>e.key)):null,F=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,K=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??K.get(e.id)),R=L.findIndex(e=>e.id===n),V=e=>{if(L.length===0)return;const y=R<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,R+e)),p=L[y],b=p.anchor??K.get(p.id);b&&(m(p.id),Y(null),i(b))};return s.jsxs("section",{className:"mb-2 px-0 py-0",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/12 text-primary",children:s.jsx(de,{size:14})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("div",{className:"whitespace-normal break-words text-[12px] font-semibold leading-snug text-foreground",children:a.title}),a.summary&&s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:a.summary})]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[o&&L.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("button",{type:"button",onClick:()=>V(-1),disabled:R===0,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Previous change","aria-label":"Previous change",children:s.jsx(ye,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[R<0?"—":R+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>V(1),disabled:R===L.length-1,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Next change","aria-label":"Next change",children:s.jsx(le,{size:15})})]}),r&&s.jsx("button",{type:"button",onClick:r,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:o?"Exit full-screen DAG review":"Review from DAG in full screen","aria-label":o?"Exit full-screen DAG review":"Review from DAG in full screen",children:o?s.jsx(be,{size:15}):s.jsx(me,{size:15})})]})]}),a.highlights.length>0&&s.jsx("div",{className:"mt-2 grid gap-1.5",children:a.highlights.slice(0,4).map((e,y)=>s.jsxs("div",{className:"rounded-md bg-surface-2 px-2 py-1.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.tag&&s.jsx("span",{className:"shrink-0 rounded bg-surface-elevated px-1.5 py-0.5 text-[9px] font-semibold text-primary",children:e.tag}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.what})]}),s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:e.effect})]},`${e.what}-${y}`))}),a.nodes.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2 text-[10px] text-muted-foreground",children:[s.jsxs("div",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-[0.12em]",children:[s.jsx(he,{size:11}),"DAG"]}),a.edges.some(e=>e.label?.trim())&&s.jsx("span",{className:"normal-case tracking-normal",children:g("diffViewer.focusPathHint")})]}),s.jsx("div",{className:"overflow-x-auto rounded-md border border-border/15 bg-surface-2 p-1.5",onWheel:e=>e.stopPropagation(),children:s.jsxs("div",{className:"relative",style:{width:c.width,height:c.height},children:[s.jsxs("svg",{className:"absolute inset-0",width:c.width,height:c.height,"aria-hidden":"true",children:[s.jsx("defs",{children:z.map((e,y)=>s.jsx("marker",{id:`${u}-${y}`,viewBox:"0 0 10 10",refX:"8.5",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto",markerUnits:"strokeWidth",children:s.jsx("path",{d:"M0,0 L10,5 L0,10 Z",fill:e})},e))}),c.edges.map(e=>{const y=De(e),p=te(e.index),b=I===e.key||!!U?.has(e.key),_=!!((I||f)&&!b);return s.jsxs("g",{className:"transition-opacity duration-150",style:{opacity:_?.3:1},children:[s.jsx("path",{className:"pointer-events-none",d:y,fill:"none",stroke:"var(--surface-2)",strokeWidth:b?7:5,strokeLinecap:"round"}),s.jsx("path",{className:"pointer-events-none transition-[stroke-width,opacity] duration-150",d:y,fill:"none",stroke:p,strokeWidth:b?3:1.8,strokeLinecap:"round",markerEnd:`url(#${u}-${e.index%z.length})`}),s.jsx("path",{"data-dag-edge":e.key,d:y,fill:"none",stroke:"transparent",strokeWidth:"14",className:"cursor-pointer",onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(k=>k===e.key?null:k),onClick:()=>{m(null),Y(k=>k===e.key?null:e.key)}}),s.jsx("circle",{className:"pointer-events-none",cx:e.fromNode.x+H+8,cy:e.fromY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"}),s.jsx("circle",{className:"pointer-events-none",cx:e.toNode.x-8,cy:e.toY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"})]},e.key)})]}),c.edges.map(e=>{const y=e.label?.trim();if(!y)return null;const{x:p,y:b,maxWidth:_}=Ie(e),k=te(e.index),Z=I===e.key||!!U?.has(e.key),ie=!!((I||f)&&!Z);return s.jsxs("button",{ref:P=>{P?x.current.set(e.key,P):x.current.delete(e.key)},type:"button","data-dag-edge-label":e.key,className:"absolute -translate-x-1/2 -translate-y-1/2 whitespace-normal break-words rounded-md border bg-surface-elevated px-1.5 py-1 text-center text-[9px] leading-[11px] shadow-sm transition-[opacity,box-shadow,transform] duration-150 [overflow-wrap:anywhere] hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",style:{left:p,top:b,maxWidth:_,width:"max-content",borderColor:k,color:k,opacity:ie?.38:1,boxShadow:Z?`0 0 0 2px ${k}, 0 6px 18px rgb(0 0 0 / 0.24)`:void 0},title:`${e.fromNode.index+1} ${e.fromNode.node.title} → ${e.toNode.index+1} ${e.toNode.node.title}${e.desc?`
|
|
1
|
+
import{ah as re,df as ce,bA as s,e as le}from"./app-DNnVU3VK.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as de}from"./sparkles-Cm9xs8pz.js";import{M as me,G as he,L as ue,T as xe,C as fe}from"./triangle-alert-D1VnXjVL.js";const pe=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],ye=re("chevron-left",pe);const ge=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],be=re("minimize-2",ge);function ke(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ve(t){switch(t){case"entry":case"source":return"bg-sky-400";case"ui":return"bg-fuchsia-400";case"risk":return"bg-destructive";case"test":return"bg-emerald-400";default:return"bg-primary"}}function Ne(t){if(!t)return;const d=typeof t.sectionIndex=="number"?` section ${t.sectionIndex+1}`:"",i=typeof t.hunkIndex=="number"?` hunk ${t.hunkIndex+1}`:"";return`${t.filePath}${i}${d}`}function Q({anchor:t,children:d,onNavigate:i,className:o,style:r,elementRef:g,onActivate:l}){return!t&&!l?s.jsx("span",{ref:g,className:o,style:r,children:d}):s.jsx("button",{ref:g,type:"button",onClick:()=>{l?.(),t&&i(t)},title:Ne(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const H=190,X=92,q=132,we=28,C=16,J=18,T=54,ee=24,ae=18,je=8,B=24,z=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function te(t){return z[t%z.length]}function Me(t,d){return`${t.from}->${t.to}:${d}`}function Ee(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(X,36+Math.max(0,o-1)*ae)}function ne(t,d,i){if(i<=1)return t.y+t.height/2;const o=Math.max(0,t.height-36),r=Math.min(o,(i-1)*ae);return t.y+t.height/2-r/2+r/(i-1)*d}function se(t,d,i){return t.slice().sort((o,r)=>{const g=d[o],l=d[r],a=i==="from"?g.toNode:g.fromNode,h=i==="from"?l.toNode:l.fromNode;return a.y-h.y||a.index-h.index||g.index-l.index})}function $e(t,d){const i=new Map;for(const o of t){if(Math.abs(o.toNode.layer-o.fromNode.layer)!==1)continue;const r=`${o.fromNode.layer}:${o.toNode.layer}`,g=i.get(r)??[];g.push(o),i.set(r,g)}for(const o of i.values()){o.sort((h,x)=>(h.fromY+h.toY)/2-(x.fromY+x.toY)/2||h.index-x.index);const r=[];o.forEach((h,x)=>{const N=(h.fromY+h.toY)/2,M=Math.max(B,d[h.key]??0)/2;if(x===0){r.push(N);return}const w=o[x-1],E=Math.max(B,d[w.key]??0)/2;r.push(Math.max(N,r[x-1]+E+M+je))});const g=r.reduce((h,x,N)=>h+x-(o[N].fromY+o[N].toY)/2,0)/Math.max(1,r.length),l=Math.min(...r.map((h,x)=>h-g-Math.max(B,d[o[x].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,x)=>{h.laneY=r[x]-g+a})}}function _e(t,d,i={},o={}){const r=new Map(t.map((n,m)=>[n.id,{node:n,index:m}])),g=d.filter(n=>r.has(n.from)&&r.has(n.to)),l=new Map,a=new Map;for(const n of t)l.set(n.id,[]),a.set(n.id,[]);for(const n of g)l.get(n.to)?.push(n.from),a.get(n.from)?.push(n.to);const h=new Map,x=new Set,N=n=>{const m=h.get(n);if(m!==void 0)return m;if(x.has(n))return 0;x.add(n);const c=l.get(n)??[],u=c.length===0?0:Math.max(...c.map(N))+1;return x.delete(n),h.set(n,u),u};for(const n of t)N(n.id);const M=new Map;for(const n of t){const m=h.get(n.id)??0,c=M.get(m)??[],u=r.get(n.id);u&&c.push(u),M.set(m,c)}const w=[];for(const[n,m]of M.entries()){m.sort((u,f)=>u.index-f.index);let c=C+T;m.forEach(({node:u,index:f},j)=>{const I=Math.max(Ee(u.id,l,a),Math.ceil(i[u.id]??X));w.push({node:u,index:f,layer:n,row:j,x:C+n*(H+q),y:c,height:I}),c+=I+we})}const E=new Map(w.map(n=>[n.node.id,n])),v=g.flatMap((n,m)=>{const c=E.get(n.from),u=E.get(n.to);return!c||!u?[]:[{...n,key:Me(n,m),index:m,fromNode:c,toNode:u,routeIndex:m,fromPortIndex:0,toPortIndex:0,fromY:c.y+c.height/2,toY:u.y+u.height/2,laneY:(c.y+c.height/2+u.y+u.height/2)/2}]}),$=new Map,G=new Map;v.forEach((n,m)=>{$.set(n.from,[...$.get(n.from)??[],m]),G.set(n.to,[...G.get(n.to)??[],m])});for(const[n,m]of $){const c=se(m,v,"from");c.forEach((u,f)=>{const j=v[u];j.fromPortIndex=f,j.fromY=ne(E.get(n),f,c.length)})}for(const[n,m]of G){const c=se(m,v,"to");c.forEach((u,f)=>{const j=v[u];j.toPortIndex=f,j.toY=ne(E.get(n),f,c.length)})}$e(v,o);let Y=0;v.forEach(n=>{const m=Math.min(n.fromNode.layer,n.toNode.layer),c=Math.max(n.fromNode.layer,n.toNode.layer);if(c-m<=1)return;const f=Y;Y+=1,n.routeIndex=f;const j=w.filter(A=>A.layer>=m&&A.layer<=c),I=Math.min(...j.map(A=>A.y))-ee-(Math.floor(f/2)+1)*J,S=Math.max(...j.map(A=>A.y+A.height))+ee+(Math.floor(f/2)+1)*J;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+T+X,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(B,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*H+O*q,height:W+C+T}}function oe(t,d=12){const i=t[0];if(!i)return"";const o=[`M ${i.x} ${i.y}`];for(let r=1;r<t.length;r+=1){const g=t[r-1],l=t[r],a=t[r+1];if(!a){o.push(`L ${l.x} ${l.y}`);continue}const h=l.x-g.x,x=l.y-g.y,N=a.x-l.x,M=a.y-l.y,w=Math.abs(h)+Math.abs(x),E=Math.abs(N)+Math.abs(M);if(w===0||E===0||h&&N||x&&M){o.push(`L ${l.x} ${l.y}`);continue}const v=Math.min(d,w/2,E/2),$={x:l.x-Math.sign(h)*v,y:l.y-Math.sign(x)*v},G={x:l.x+Math.sign(N)*v,y:l.y+Math.sign(M)*v};o.push(`L ${$.x} ${$.y}`),o.push(`Q ${l.x} ${l.y} ${G.x} ${G.y}`)}return o.join(" ")}function De(t){const d=t.fromNode.x+H+8,i=t.fromY,o=t.toNode.x-8,r=t.toY,g=Math.abs(t.toNode.layer-t.fromNode.layer),l=d+22+t.fromPortIndex*5,a=o-22-t.toPortIndex*5;return g<=1?oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}]):oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}])}function Ie(t){const d=t.fromNode.x+H+8,i=t.toNode.x-8,o=Math.abs(t.toNode.layer-t.fromNode.layer),r=Math.max(34,Math.abs(i-d));return o<=1?{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(72,Math.min(108,r-34))}:{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(84,Math.min(120,r*.3))}}function Pe({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=ke(t,d),h=D.useRef(new Map),x=D.useRef(new Map),[N,M]=D.useState({}),[w,E]=D.useState({}),[v,$]=D.useState(null),[G,Y]=D.useState(null),[O,W]=D.useState(null),[n,m]=D.useState(null),c=D.useMemo(()=>a?_e(a.nodes,a.edges,N,w):null,[N,w,a]);if(D.useLayoutEffect(()=>{if(!a)return;const e={};for(const p of a.nodes){const b=h.current.get(p.id);b&&(e[p.id]=b.offsetHeight)}M(p=>{const b=Object.keys(p),_=Object.keys(e);return b.length===_.length&&_.every(k=>p[k]===e[k])?p:e});const y={};for(const[p,b]of x.current)y[p]=b.offsetHeight;E(p=>{const b=Object.keys(p),_=Object.keys(y);return b.length===_.length&&_.every(k=>p[k]===y[k])?p:y})},[a]),!a||!c)return null;const u=`walkthrough-arrow-${l.replace(/[^a-zA-Z0-9_-]/g,"")||"default"}`,f=O??n,j=f?null:v??G,I=c.edges.some(e=>e.key===j)?j:null,S=c.edges.find(e=>e.key===I),A=f?c.edges.filter(e=>e.from===f||e.to===f):[],U=f?new Set(A.map(e=>e.key)):null,F=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,K=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??K.get(e.id)),R=L.findIndex(e=>e.id===n),V=e=>{if(L.length===0)return;const y=R<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,R+e)),p=L[y],b=p.anchor??K.get(p.id);b&&(m(p.id),Y(null),i(b))};return s.jsxs("section",{className:"mb-2 px-0 py-0",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/12 text-primary",children:s.jsx(de,{size:14})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("div",{className:"whitespace-normal break-words text-[12px] font-semibold leading-snug text-foreground",children:a.title}),a.summary&&s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:a.summary})]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[o&&L.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("button",{type:"button",onClick:()=>V(-1),disabled:R===0,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Previous change","aria-label":"Previous change",children:s.jsx(ye,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[R<0?"—":R+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>V(1),disabled:R===L.length-1,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Next change","aria-label":"Next change",children:s.jsx(le,{size:15})})]}),r&&s.jsx("button",{type:"button",onClick:r,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:o?"Exit full-screen DAG review":"Review from DAG in full screen","aria-label":o?"Exit full-screen DAG review":"Review from DAG in full screen",children:o?s.jsx(be,{size:15}):s.jsx(me,{size:15})})]})]}),a.highlights.length>0&&s.jsx("div",{className:"mt-2 grid gap-1.5",children:a.highlights.slice(0,4).map((e,y)=>s.jsxs("div",{className:"rounded-md bg-surface-2 px-2 py-1.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.tag&&s.jsx("span",{className:"shrink-0 rounded bg-surface-elevated px-1.5 py-0.5 text-[9px] font-semibold text-primary",children:e.tag}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.what})]}),s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:e.effect})]},`${e.what}-${y}`))}),a.nodes.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2 text-[10px] text-muted-foreground",children:[s.jsxs("div",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-[0.12em]",children:[s.jsx(he,{size:11}),"DAG"]}),a.edges.some(e=>e.label?.trim())&&s.jsx("span",{className:"normal-case tracking-normal",children:g("diffViewer.focusPathHint")})]}),s.jsx("div",{className:"overflow-x-auto rounded-md border border-border/15 bg-surface-2 p-1.5",onWheel:e=>e.stopPropagation(),children:s.jsxs("div",{className:"relative",style:{width:c.width,height:c.height},children:[s.jsxs("svg",{className:"absolute inset-0",width:c.width,height:c.height,"aria-hidden":"true",children:[s.jsx("defs",{children:z.map((e,y)=>s.jsx("marker",{id:`${u}-${y}`,viewBox:"0 0 10 10",refX:"8.5",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto",markerUnits:"strokeWidth",children:s.jsx("path",{d:"M0,0 L10,5 L0,10 Z",fill:e})},e))}),c.edges.map(e=>{const y=De(e),p=te(e.index),b=I===e.key||!!U?.has(e.key),_=!!((I||f)&&!b);return s.jsxs("g",{className:"transition-opacity duration-150",style:{opacity:_?.3:1},children:[s.jsx("path",{className:"pointer-events-none",d:y,fill:"none",stroke:"var(--surface-2)",strokeWidth:b?7:5,strokeLinecap:"round"}),s.jsx("path",{className:"pointer-events-none transition-[stroke-width,opacity] duration-150",d:y,fill:"none",stroke:p,strokeWidth:b?3:1.8,strokeLinecap:"round",markerEnd:`url(#${u}-${e.index%z.length})`}),s.jsx("path",{"data-dag-edge":e.key,d:y,fill:"none",stroke:"transparent",strokeWidth:"14",className:"cursor-pointer",onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(k=>k===e.key?null:k),onClick:()=>{m(null),Y(k=>k===e.key?null:e.key)}}),s.jsx("circle",{className:"pointer-events-none",cx:e.fromNode.x+H+8,cy:e.fromY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"}),s.jsx("circle",{className:"pointer-events-none",cx:e.toNode.x-8,cy:e.toY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"})]},e.key)})]}),c.edges.map(e=>{const y=e.label?.trim();if(!y)return null;const{x:p,y:b,maxWidth:_}=Ie(e),k=te(e.index),Z=I===e.key||!!U?.has(e.key),ie=!!((I||f)&&!Z);return s.jsxs("button",{ref:P=>{P?x.current.set(e.key,P):x.current.delete(e.key)},type:"button","data-dag-edge-label":e.key,className:"absolute -translate-x-1/2 -translate-y-1/2 whitespace-normal break-words rounded-md border bg-surface-elevated px-1.5 py-1 text-center text-[9px] leading-[11px] shadow-sm transition-[opacity,box-shadow,transform] duration-150 [overflow-wrap:anywhere] hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",style:{left:p,top:b,maxWidth:_,width:"max-content",borderColor:k,color:k,opacity:ie?.38:1,boxShadow:Z?`0 0 0 2px ${k}, 0 6px 18px rgb(0 0 0 / 0.24)`:void 0},title:`${e.fromNode.index+1} ${e.fromNode.node.title} → ${e.toNode.index+1} ${e.toNode.node.title}${e.desc?`
|
|
2
2
|
${e.desc}`:""}`,"aria-pressed":G===e.key,onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(P=>P===e.key?null:P),onClick:()=>{m(null),Y(P=>P===e.key?null:e.key)},children:[s.jsxs("span",{className:"block font-bold tabular-nums",children:[e.fromNode.index+1," → ",e.toNode.index+1]}),s.jsx("span",{className:"block text-muted-foreground",children:y})]},`${e.key}-label`)}),c.nodes.map(({node:e,index:y,x:p,y:b,height:_})=>s.jsxs(Q,{elementRef:k=>{k?h.current.set(e.id,k):h.current.delete(e.id)},anchor:e.anchor??K.get(e.id),onActivate:()=>{m(e.id),Y(null)},onNavigate:i,className:`absolute overflow-hidden rounded-lg border bg-surface/95 px-2.5 py-2 text-foreground shadow-[0_10px_24px_rgba(0,0,0,0.18)] transition-[opacity,border-color,box-shadow] duration-150 ${F?.has(e.id)?"border-primary/60 shadow-[0_0_0_1px_rgb(var(--primary-rgb)/0.28),0_10px_24px_rgba(0,0,0,0.22)]":F?"border-border/15 opacity-40":"border-border/25"}`,style:{left:p,top:b,width:H,minHeight:_},children:[s.jsx("span",{className:"absolute inset-0",onPointerEnter:()=>W(e.id),onPointerLeave:()=>W(k=>k===e.id?null:k)}),s.jsx("span",{className:`pointer-events-none absolute bottom-2 left-0 top-2 w-[3px] rounded-r-full ${ve(e.kind)}`}),s.jsxs("div",{className:"pointer-events-none relative flex min-w-0 items-center gap-1.5",children:[s.jsx("span",{className:"flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-primary/15 text-[9px] font-bold text-primary",children:y+1}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.title}),e.anchor&&s.jsx(ue,{size:11,className:"shrink-0 opacity-70"})]}),e.kind&&s.jsx("div",{className:"pointer-events-none relative mt-0.5 truncate text-[9px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/80",children:e.kind}),s.jsx("div",{className:"pointer-events-none relative mt-0.5 whitespace-normal break-words text-[10px] leading-snug text-muted-foreground",children:e.business})]},e.id))]})})]}),(a.risks.length>0||a.checks.length>0)&&s.jsxs("div",{className:"mt-2 grid gap-1.5",children:[a.risks.slice(0,3).map((e,y)=>s.jsxs(Q,{anchor:e.anchor,onNavigate:i,className:"flex w-full items-start gap-1.5 rounded-md border border-[rgb(var(--warning-rgb)_/_0.25)] bg-[rgb(var(--warning-rgb)_/_0.10)] px-2 py-1.5 text-[10px] text-muted-foreground",children:[s.jsx(xe,{size:12,className:"mt-0.5 shrink-0 text-[color:var(--warning)]"}),s.jsx("span",{className:"min-w-0 whitespace-normal break-words leading-snug",children:e.title})]},`${e.title}-${y}`)),a.checks.slice(0,3).map((e,y)=>s.jsxs("div",{className:"flex items-start gap-1.5 rounded-md bg-surface-2 px-2 py-1.5 text-[10px] text-muted-foreground",children:[s.jsx(fe,{size:12,className:"mt-0.5 shrink-0 text-primary"}),s.jsx("span",{className:"min-w-0 whitespace-normal break-words leading-snug",children:e})]},`${e}-${y}`))]})]})}export{Pe as C,be as M,ye as a};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{de as O,bF as U,aD as q,b3 as H,cY as J,bA as e,T as Q,bo as v,S as X}from"./app-
|
|
1
|
+
import{de as O,bF as U,aD as q,b3 as H,cY as J,bA as e,T as Q,bo as v,S as X}from"./app-DNnVU3VK.js";import{b as t}from"./dnd-BCFAPC0L.js";import{ao as n,ab as Z,al as I,P as ee,$ as se,w as te,R as E,l as ae,ag as ne,ah as re}from"./App-xr2R4dST.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-BE8k_FL7.js";import"./triangle-alert-D1VnXjVL.js";import"./referenceLongPress-LCYPFdN8.js";function xe({groupId:l,activeSessionId:a,onOpenSidebar:p,leftSidebarVisible:S=!1,onToggleRightSidebar:h,rightSidebarOpen:b=!1,defaultSessionMode:R}){const g=t.useRef(null);t.useEffect(()=>{g.current?.focus()},[]);const[r,j]=t.useState(null),[D,P]=t.useState([]),[c,f]=t.useState(null),[y,T]=t.useState(null),[x,z]=t.useState(null),[$,G]=t.useState(null),o=O(),[L,N]=t.useState(!1);t.useEffect(()=>{if(o==="ready"){N(!1);return}const s=setTimeout(()=>N(!0),1e3);return()=>clearTimeout(s)},[o]);const A=n(s=>s.view),V=n(s=>s.drafts),w=n(s=>s.setDraft),[M,W]=t.useState(l),u=t.useCallback(async()=>{try{const s=await U();j(s),f(null)}catch(s){f(s instanceof Error?s.message:"协作组加载失败")}},[]);t.useEffect(()=>{let s=!1;q().then(i=>{s||P(i)}).catch(()=>{}),H().then(i=>{if(s)return;const F=i.collaborationPanels?.[Z()]?.drafts;for(const[C,K]of Object.entries(F??{}))n.getState().drafts[C]||w(C,K)}).catch(()=>{});const _=J(i=>{s||(j(i),f(null))}),B=I(()=>{navigator.onLine!==!1&&u()},1e4,[X,"pageshow"]);return()=>{s=!0,_(),B()}},[u]);const m=r?.groups.find(s=>s.id===l),d=r?.sessions.find(s=>s.sessionId===a),Y=a?d?.name?`终端 · ${d.name}`:"继续终端会话":"选择终端",k=async s=>{await re(s),n.getState().terminal()};return e.jsxs("section",{"aria-label":"协作主工作区",className:"absolute inset-0 flex min-h-0 min-w-0 flex-col bg-[var(--chrome-bg)] text-foreground",children:[e.jsxs("header",{"data-termdock-window-header":"true",className:"flex min-h-14 shrink-0 items-center gap-1 border-b border-border/15 px-2 sm:min-h-16 sm:gap-3 sm:px-6",children:[!S&&e.jsx("button",{type:"button","aria-label":"打开会话侧栏",className:"inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg text-muted-foreground hover:bg-surface-2",onClick:p,children:e.jsx(ee,{size:17})}),e.jsx(se,{size:18,className:"hidden shrink-0 text-primary sm:block"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{ref:g,tabIndex:-1,className:"truncate text-base font-semibold outline-none",children:m?.name??"协作工作区"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:m?`${m.sessionIds.length} 位成员`:"正在连接工作组"})]}),h&&e.jsx("button",{type:"button","aria-label":"文件侧栏",title:"文件侧栏","aria-pressed":b,className:`inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg ${b?"bg-surface-2 text-primary":"text-muted-foreground hover:bg-surface-2"}`,onClick:h,children:e.jsx(te,{size:17})}),e.jsxs("button",{type:"button","aria-label":a?`打开终端:${d?.name??"当前会话"}`:"选择终端",title:a?`切换到${d?.name??"当前终端会话"},保留看板位置与消息草稿`:"从会话列表选择要打开的终端",className:"inline-flex min-h-11 min-w-11 max-w-[40%] items-center justify-center gap-2 rounded-lg px-2 text-xs text-muted-foreground hover:bg-surface-2",onClick:()=>{a?n.getState().terminal():p()},children:[e.jsx(Q,{size:17,className:"shrink-0"}),e.jsx("span",{className:"hidden min-w-0 truncate sm:inline",children:Y}),e.jsx("span",{className:"sm:hidden",children:a?"终端":"选择终端"})]})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 py-2 sm:px-6",children:[(L||v(c))&&e.jsxs("div",{role:"status",className:"mb-2 flex shrink-0 items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(E,{size:13,className:o==="offline"?"":"animate-spin"}),e.jsx("span",{children:o==="offline"?"网络已断开,联网后自动恢复":"正在恢复连接,当前结果和草稿已保留"})]}),(y||c&&o==="ready"&&!v(c))&&e.jsxs("div",{role:"alert",className:"mb-3 flex shrink-0 items-center gap-2 rounded-lg bg-destructive/10 p-3 text-xs text-destructive",children:[e.jsx("span",{className:"flex-1",children:y||c}),e.jsx("button",{type:"button","aria-label":"重新加载协作组",className:"min-h-11 px-3",onClick:()=>{u()},children:e.jsx(E,{size:14})})]}),x&&e.jsx("p",{role:"status",className:"mb-3 shrink-0 text-xs text-primary",children:x}),r?m?e.jsx(ae,{fullWorkspace:!0,initialView:A,active:!0,notice:x,groups:r.groups,sessions:r.sessions,agents:D,sessionsState:"loaded",selectedGroupId:M,setSelectedGroupId:W,initialGroupId:l,activeSessionId:a,initialDrafts:V,onDraftChange:w,docked:!1,inputKeySuffix:"main",floatingVisible:!0,floating:!1,onOpenSession:k,onOpenTaskSession:k,onDockMessages:a?async()=>{await ne(l,a)}:void 0,defaultSessionMode:R,busy:$,setBusy:G,setError:T,setNotice:z,refresh:u}):e.jsx("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"协作组已移除或暂不可用。任务记录仍保留在原服务中。"}):e.jsx("p",{role:"status",className:"py-10 text-center text-sm text-muted-foreground",children:"正在加载协作工作区…"})]})]})}export{xe as default};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{bA as r}from"./app-DNnVU3VK.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-CfOJHcXO.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-xr2R4dST.js";import"./gestureArbiter-BE8k_FL7.js";import"./triangle-alert-D1VnXjVL.js";import"./referenceLongPress-LCYPFdN8.js";import"./DiffReview-CLKpyDPZ.js";import"./sparkles-Cm9xs8pz.js";import"./DiffViewer-DDiASWHf.js";import"./ChangeWalkthroughPanel-g83lCwJi.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};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-C0jVZfFV.js","assets/app-DNnVU3VK.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-C6xPtOPw.css","assets/ChangeWalkthroughPanel-g83lCwJi.js","assets/sparkles-Cm9xs8pz.js","assets/triangle-alert-D1VnXjVL.js","assets/App-xr2R4dST.js","assets/gestureArbiter-BE8k_FL7.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-LCYPFdN8.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{ah as Ve,cz as Ot,df as St,bA as t,a4 as Ft,cw as $e,bz as qe,W as yt,o as vt,l as Kt,X as $t,_ as wt}from"./app-DNnVU3VK.js";import{b as s,r as Ze}from"./dnd-BCFAPC0L.js";import{a as Ut}from"./ChangeWalkthroughPanel-g83lCwJi.js";import{s as Ct,Y as kt,K as Ge,j as jt}from"./App-xr2R4dST.js";import{M as Bt}from"./triangle-alert-D1VnXjVL.js";const Vt=[["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"}]],Ht=Ve("mouse-pointer-2",Vt);const Yt=[["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"}]],Xt=Ve("settings-2",Yt);const Wt=[["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"}]],qt=Ve("zoom-in",Wt);const Zt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Gt=Ve("zoom-out",Zt);function Qe(e){const n=e==="darwin"?"mac":e==="win32"?"windows":"linux",c={host:"127.0.0.1",platform:n,protocol:n==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:c,remote:{...c,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Et(e,n){const c=Qe(n);if(!e||typeof e!="object")return c;const a=e,i=(y,u)=>{const l=y&&typeof y=="object"?y:{},g=(f,x)=>typeof l[f]=="string"&&l[f].length<=x&&!/[\x00-\x1f]/.test(l[f])?l[f]:u[f];return{host:g("host",253),username:g("username",255),domain:g("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:u.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:u.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:u.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:a.target==="remote"?"remote":"local",local:{...i(a.local,c.local),host:"127.0.0.1"},remote:i(a.remote,c.remote),viewOnly:a.viewOnly===!0,fit:a.fit!==!1,autoConnect:a.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 Jt(e){const[n,c]=s.useState(Qe),[a,i]=s.useState(!1),[y,u]=s.useState("loading"),[l,g]=s.useState(0),[f,x]=s.useState([]),[k,v]=s.useState("idle"),b=s.useRef(n),P=s.useRef(0),E=s.useRef(0),h=s.useRef(""),p=s.useRef(null),j=s.useRef(new Set),N=s.useCallback(S=>{b.current=S(b.current),P.current++,c(b.current),u("saving")},[]);s.useEffect(()=>{const S=++E.current;P.current=0,h.current="",p.current=null,b.current=Qe(),c(b.current),i(!1),u("loading"),x([]),v("idle");const T=new AbortController;return fetch("/api/computer/preferences",{signal:T.signal}).then(async R=>{if(!R.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await R.json()}).then(R=>{if(S!==E.current||T.signal.aborted)return;let w=Et(R.preferences);const V=P.current>0;if(!R.configured&&!V)try{const I=localStorage.getItem(`termdock:computer-host:${e}`);if(I){const J=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(I)?"local":"remote";w=Et({...w,target:J,[J]:{...w[J],host:I,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||w[J].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),P.current++}}catch{}V||(b.current=w),h.current=R.configured?JSON.stringify(w):"",c(b.current),i(!0),u(R.configured?"saved":"saving"),x(Array.isArray(R.credentialKeys)?R.credentialKeys.filter(I=>typeof I=="string"):[]),v(R.credentialError?"error":"idle")}).catch(()=>{!T.signal.aborted&&S===E.current&&u("error")}),()=>{++E.current,T.abort();for(const R of j.current)R.abort();j.current.clear()}},[e,l]);const _=s.useCallback(()=>{if(p.current)return p.current;if(!a)return Promise.resolve(!1);const S=E.current,T=(async()=>{for(;h.current!==JSON.stringify(b.current);){const R=JSON.stringify(b.current),w=new AbortController;j.current.add(w),u("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:R,signal:w.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(S!==E.current)return!1;h.current=R}catch{return S===E.current&&u("error"),!1}finally{j.current.delete(w)}}return S===E.current&&u("saved"),!0})();return p.current=T,T.finally(()=>{p.current===T&&(p.current=null)}),T},[a]);s.useEffect(()=>{if(!a||h.current===JSON.stringify(n))return;const S=setTimeout(()=>{_()},300);return()=>clearTimeout(S)},[a,n,_]);const Y=s.useCallback(async(S,T,R)=>{const w=E.current,V=new AbortController;S!=="use"&&v("saving");try{if(!await _()||w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(V);const I=await fetch(`/api/computer/credentials/${S}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:T,...S==="save"?{password:R}:{}}),signal:V.signal});if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!I.ok)throw new Error(S==="use"&&I.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const K=await I.json();if(w!==E.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const J=Tt(T);if(S==="save"&&x(ee=>[...new Set([...ee,J])]),S==="forget"&&x(ee=>ee.filter(we=>we!==J)),S==="use"&&(typeof K.password!="string"||!K.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return v("idle"),K.password}catch(I){throw w===E.current&&!V.signal.aborted&&v("error"),I}finally{j.current.delete(V)}},[_]);return{preferences:n,change:N,loaded:a,saveState:y,flush:_,credentialKeys:f,loginState:k,credentialRequest:Y,retry:()=>a?void _():g(S=>S+1)}}class Qt{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(n,c){this.socket=Ot(`/api/computer/ws?host=${encodeURIComponent(n)}`),this.socket.onopen=a=>this.onopen?.(a),this.socket.onerror=a=>this.onerror?.(a),this.socket.onclose=a=>{(a.code!==1e3||a.reason)&&c(a.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(a)},this.socket.onmessage=a=>{try{const i=JSON.parse(a.data);if(i.type!=="data"||typeof i.data!="string"||!Number.isSafeInteger(i.seq))throw new Error("Invalid VNC record");const y=Uint8Array.from(atob(i.data),u=>u.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:y.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:i.seq}))}catch{c("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(n){const c=ArrayBuffer.isView(n)?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(n);for(let a=0;a<c.length;a+=32*1024){const i=c.subarray(a,a+32768);let y="";for(const u of i)y+=String.fromCharCode(u);this.socket.send(JSON.stringify({type:"data",data:btoa(y)}))}}close(){this.socket.close()}}function er(e){return e==="mac"||e==="linux"||e==="windows"}function tr(e){const n=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],c=e==="mac"?n:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?n:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[c,[32,"Space"]]:[c],copy:[n,[99,"KeyC"]],paste:[n,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function rr(e){const n=e;return{rendersCursor:!0,position:()=>({x:Number.isFinite(n._mousePos.x)?n._display.absX(n._mousePos.x):n._fbWidth/2,y:Number.isFinite(n._mousePos.y)?n._display.absY(n._mousePos.y):n._fbHeight/2}),size:()=>({width:n._fbWidth,height:n._fbHeight}),surface:()=>n._canvas,send:(c,a,i)=>{const y=n._display.scale,u=(c-n._display.absX(0))*y,l=(a-n._display.absY(0))*y;n._mousePos={x:u,y:l},n._mouseMoveTimer!==null&&clearTimeout(n._mouseMoveTimer),n._mouseMoveTimer=null,n._mouseButtonMask=i,n._mouseLastMoveTime=Date.now(),n._sendMouse(u,l,i);const g=n._canvas.getBoundingClientRect();n._cursor?.move(g.left+u,g.top+l)}}}function nr(e,n,c){const a=new AbortController,i=new Set,y=new Set;let u,l,g=!1,f=performance.now();const x=()=>i.size>0||y.size>0,k=h=>{u=void 0,!(g||!x())&&(performance.now()-f>1e3||(c.record("browser-frame",{time:h,interval:l===void 0?null:h-l,logical:n.position?.(),renderer:n.observeCursor?.()}),l=h,u=requestAnimationFrame(k)))},v=()=>{x()?u===void 0&&(l=void 0,u=requestAnimationFrame(k)):(u!==void 0&&cancelAnimationFrame(u),u=void 0,l=void 0)},b=h=>{if(h.pointerType!=="touch"&&h.pointerType!=="pen")return;f=performance.now(),h.type==="pointerdown"?i.add(h.pointerId):(h.type==="pointerup"||h.type==="pointercancel"||h.type==="lostpointercapture")&&i.delete(h.pointerId);const p=h.getCoalescedEvents?.()??[];c.record("raw-pointer",{type:h.type,time:h.timeStamp,id:h.pointerId,pointerType:h.pointerType,client:[h.clientX,h.clientY],trusted:h.isTrusted,coalesced:p.slice(-16).map(j=>[j.timeStamp,j.clientX,j.clientY])}),v()},P=h=>{f=performance.now(),y.clear();for(const p of Array.from(h.touches))y.add(p.identifier);c.record("raw-touch",{type:h.type,time:h.timeStamp,trusted:h.isTrusted,touches:Array.from(h.touches,p=>[p.identifier,p.clientX,p.clientY]),changed:Array.from(h.changedTouches,p=>[p.identifier,p.clientX,p.clientY])}),v()},E={capture:!0,passive:!0,signal:a.signal};for(const h of["pointerdown","pointermove","pointerup","pointercancel","lostpointercapture"])e.addEventListener(h,b,E);for(const h of["touchstart","touchmove","touchend","touchcancel"])e.addEventListener(h,P,E);return c.record("observation-start",{version:2,pointerEvents:typeof PointerEvent<"u",touchEvents:"ontouchstart"in window}),()=>{g=!0,a.abort(),u!==void 0&&cancelAnimationFrame(u),c.record("observation-stop"),c.flush("observation-stop")}}const Lt="termdock:computer-touch-mode:v1";function or(){try{const e=localStorage.getItem(Lt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function sr(e){try{localStorage.setItem(Lt,e)}catch{}}const Oe=8,ar=300,cr=450,Nt=18,ir=50,Ue=(e,n)=>Math.max(0,Math.min(e,Math.max(0,n-1)));function lr(e,n,c,a,i={}){const y=new AbortController,u=i.trace?nr(e,n,i.trace):void 0,l=new Map;let g=0,f=0,x=!1,k=!1,v=!1,b=!1,P=0,E=1,h="pending",p=[],j={x:0,y:0},N={x:0,y:0},_,Y=0,S=0,T,R=!0,w,V=!1;const I=()=>{const o=n.size(),d=a.current??={x:o.width/2,y:o.height/2};return d.x=Ue(d.x,o.width),d.y=Ue(d.y,o.height),d};let K;const J=()=>{const o=n.size();if((!K||K.width!==o.width||K.height!==o.height)&&(R=!0),!R&&K)return K;const d=n.surface(),C=e.getBoundingClientRect(),$=d.getBoundingClientRect(),D=[];for(let M=d.parentElement;M&&M!==e;M=M.parentElement){const F=getComputedStyle(M),B=/auto|scroll/.test(F.overflowX)?Math.max(0,M.scrollWidth-M.clientWidth):0,se=/auto|scroll/.test(F.overflowY)?Math.max(0,M.scrollHeight-M.clientHeight):0;if(!B&&!se)continue;const ae=M.getBoundingClientRect();D.push({element:M,left:ae.left-C.left,top:ae.top-C.top,right:ae.right-C.left,bottom:ae.bottom-C.top,maxX:B,maxY:se})}return K={...o,left:$.left-C.left,top:$.top-C.top,scaleX:o.width&&$.width?$.width/o.width:1,scaleY:o.height&&$.height?$.height/o.height:1,viewportWidth:C.width,viewportHeight:C.height,clientLeft:C.left,clientTop:C.top,scrollers:D},R=!1,K},ee=(o,d)=>{if(!i.trace)return;const C=K;i.trace.record(o,{mode:i.mode,pointerType:d?.pointerType,pointerId:d?.pointerId,client:d?[d.clientX,d.clientY]:void 0,inputTime:d?.timeStamp,target:a.current?[a.current.x,a.current.y]:null,actual:n.position?.(),buttons:S,fingers:l.size,moved:x,pinching:b,scrolling:v,zoom:i.zoom?.get(),scale:C?[C.scaleX,C.scaleY]:void 0,surface:C?[C.left,C.top,C.width,C.height]:void 0,viewport:C?[C.clientLeft,C.clientTop,C.viewportWidth,C.viewportHeight]:void 0})};i.trace?.record("touchpad-attached",{mode:i.mode,viewOnly:i.viewOnly}),c.hidden=!0;const we=()=>{const o=J(),d=I();if(!o.width||!o.height||b||i.viewOnly)return;let C=o.left+d.x*o.scaleX,$=o.top+d.y*o.scaleY;for(const D of o.scrollers){if(D.maxX){const M=D.element.scrollLeft,F=C<D.left+20?C-D.left-20:C>D.right-20?C-D.right+20:0,B=Math.max(0,Math.min(D.maxX,M+F));M!==B&&(D.element.scrollLeft=B,C-=B-M,o.left-=B-M)}if(D.maxY){const M=D.element.scrollTop,F=$<D.top+20?$-D.top-20:$>D.bottom-20?$-D.bottom+20:0,B=Math.max(0,Math.min(D.maxY,M+F));M!==B&&(D.element.scrollTop=B,$-=B-M,o.top-=B-M)}}},ne=(o=S)=>{if(i.viewOnly)return;const d=I(),C=n.position?.();n.send(Math.round(d.x),Math.round(d.y),o),i.trace?.record("send",{target:[Math.round(d.x),Math.round(d.y)],buttons:o,before:C,after:n.position?.()})},Me=()=>{T=void 0,we();let o=0;for(;Math.abs(Y)>=Nt&&o++<8;){const d=Y>0?16:8;ne(d),ne(0),Y-=Math.sign(Y)*Nt}},Ce=()=>{V||(T??=requestAnimationFrame(Me))},Pe=()=>{T!==void 0&&(cancelAnimationFrame(T),Me())},q=()=>{T!==void 0&&cancelAnimationFrame(T),T=void 0,Y=0},ke=()=>{clearTimeout(w),Pe(),S&&(S=0,ne())},re=o=>{o.cancelable&&o.preventDefault(),o.stopImmediatePropagation()},Q=()=>{const[o,d]=[...l.values()];return{distance:Math.hypot(o.x-d.x,o.y-d.y),x:(o.x+d.x)/2,y:(o.y+d.y)/2}},U=(o=!1)=>{if(V||k||l.size!==2||f!==2)return;const d=Q();if(h==="pending"){const C=[...l.values()].map((B,se)=>({x:B.x-p[se].x,y:B.y-p[se].y})),$=C.map(B=>Math.hypot(B.x,B.y));if(Math.max(...$)<Oe)return;if(!o&&Math.min(...$)<Oe){_??=setTimeout(()=>{_=void 0,U(!0)},ir);return}clearTimeout(_),_=void 0;const D=Math.abs(d.distance-P),M=C[0].x*C[1].x+C[0].y*C[1].y<0,F=Math.min(...$)>=Oe?M:D>Math.max(Math.abs(d.x-j.x),Math.abs(d.y-j.y));h=i.zoom&&D>=Oe&&F?"pinch":i.mode==="direct"&&i.zoom&&i.zoom.get()>1?"pan":"scroll",b=h==="pinch",x=!0,ee("two-finger-classified")}h==="pinch"&&P>0?(i.zoom?.set(E*d.distance/P,d),i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):h==="pan"?(i.zoom?.pan(d.x-N.x,d.y-N.y),R=!0):Y+=N.y-d.y,N=d,Ce()},te=o=>{const d=J();a.current={x:Ue((o.clientX-d.clientLeft-d.left)/d.scaleX,d.width),y:Ue((o.clientY-d.clientTop-d.top)/d.scaleY,d.height)}},de=o=>{if(!(o.pointerType!=="touch"&&o.pointerType!=="pen")){re(o),l.size||(R=!0,clearTimeout(_),_=void 0,g=performance.now(),f=0,x=!1,k=!1,v=!1,b=!1,Y=0,i.mode==="direct"?te(o):n.position&&(a.current={...n.position()},I())),l.set(o.pointerId,{x:o.clientX,y:o.clientY,startX:o.clientX,startY:o.clientY}),f=Math.max(f,l.size),ee("down",o);try{e.setPointerCapture(o.pointerId)}catch{}if(clearTimeout(w),l.size===1&&f===1)w=setTimeout(()=>{!V&&l.size===1&&!x&&!k&&(S=1,ne())},cr);else if(ke(),v=!0,l.size===2&&f===2){const d=Q();P=d.distance,E=i.zoom?.get()??1,j=N=d,h="pending",p=[...l.values()].map(({x:C,y:$})=>({x:C,y:$}))}else k=!0,clearTimeout(_),_=void 0}},pe=o=>{if(o.pointerType==="mouse")return;const d=l.get(o.pointerId);if(!d)return;re(o);const C=o.clientX-d.x,$=o.clientY-d.y;if(d.x=o.clientX,d.y=o.clientY,ee("move-input",o),Math.hypot(d.x-d.startX,d.y-d.startY)>Oe&&(x=!0,clearTimeout(w)),l.size===2&&!k)U();else if(l.size===1&&!v&&!k){if(i.mode==="direct"){te(o),x&&(S=1),ne(),Ce();return}const D=I(),M=J();D.x+=C/M.scaleX,D.y+=$/M.scaleY,I(),ne(),Ce()}},Ie=o=>{if(!l.has(o.pointerId))return;re(o),ee(o.type,o),clearTimeout(_),_=void 0;const d=S!==0;o.type!=="pointerup"&&(k=!0,q()),ke(),l.delete(o.pointerId);try{e.hasPointerCapture(o.pointerId)&&e.releasePointerCapture(o.pointerId)}catch{}l.size||(Y=0,!k&&!d&&!x&&f<=2&&performance.now()-g<=ar&&(i.mode!=="direct"||f===1)&&(ne(f===2?4:1),ne(0)),ee("gesture-end",o),i.trace?.flush("gesture-end"))},je=()=>{k=!0,q(),clearTimeout(_),_=void 0,ke();const o=[...l.keys()];l.clear(),Y=0;for(const d of o)try{e.hasPointerCapture(d)&&e.releasePointerCapture(d)}catch{}},X={capture:!0,passive:!1,signal:y.signal};e.addEventListener("pointerdown",de,X),e.addEventListener("pointermove",pe,X),e.addEventListener("pointerup",Ie,X),e.addEventListener("pointercancel",Ie,X),e.addEventListener("lostpointercapture",Ie,X);for(const o of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(o,re,X);const oe=()=>{R=!0,Ce()};e.addEventListener("scroll",oe,{capture:!0,signal:y.signal}),window.addEventListener("blur",je,{signal:y.signal});const L=()=>{document.hidden&&je()};document.addEventListener("visibilitychange",L,{signal:y.signal});const W=new ResizeObserver(oe);return W.observe(e),W.observe(n.surface()),!a.current&&n.position&&(a.current={...n.position()}),we(),()=>{V||(V=!0,ee("touchpad-detached"),y.abort(),je(),W.disconnect(),c.hidden=!0,u?.(),i.trace?.flush("touchpad-detached"))}}function ur(e,n){e=Math.max(1,e||1280),n=Math.max(1,n||800);const c=Math.max(1,640/e,480/n);return{width:Math.max(640,Math.min(2560,Math.round(e*c))),height:Math.max(480,Math.min(1600,Math.round(n*c)))}}const Je="",dr={Enter:"enter",Backspace:"backspace",Delete:"delete",Tab:"tab",ArrowUp:"up",ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right"};function pr({sendText:e,sendKey:n,sendChord:c,commandKey:a=[65515,"MetaLeft"],inputRef:i,onFocusChange:y}){const{t:u}=St(),l=s.useRef(null),g=s.useRef(!1),f=s.useRef(null),x=i??l,k=s.useRef({sendText:e,sendKey:n});k.current={sendText:e,sendKey:n};const[v,b]=s.useState(!1),P=()=>{x.current&&(x.current.value=Je,x.current.setSelectionRange(1,1)),b(!1)},E=()=>{const p=(x.current?.value||"").replace(/^\u200b/,"");p&&k.current.sendText(p),P()},h=()=>{f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),E()};return s.useLayoutEffect(()=>{const p=x.current;p.value=Je,p.setSelectionRange(1,1),p.focus({preventScroll:!0});const j=N=>{if(g.current||N.isComposing)return;const _=N.inputType==="deleteContentBackward"?"backspace":N.inputType==="deleteContentForward"?"delete":["insertLineBreak","insertParagraph"].includes(N.inputType)?"enter":null;if(!_)return;N.preventDefault();const Y=_==="enter"&&f.current!==null;h(),Y||k.current.sendKey(_)};return p.addEventListener("beforeinput",j),()=>{if(p.removeEventListener("beforeinput",j),f.current!==null){cancelAnimationFrame(f.current),f.current=null;const N=p.value.replace(/^\u200b/,"");!g.current&&N&&k.current.sendText(N)}}},[]),t.jsxs("div",{className:"relative shrink-0 border-t border-border bg-surface px-3 py-2",children:[!v&&t.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-y-2 left-6 flex items-center text-sm text-muted-foreground",children:u("computer.keyboardPlaceholder")}),t.jsx("input",{ref:x,className:"min-h-11 w-full rounded-md border border-border bg-background px-3 text-base outline-none focus:border-primary","aria-label":u("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,inputMode:"text",enterKeyHint:"enter",maxLength:1025,defaultValue:Je,onChange:p=>{if(b(!!p.target.value.replace(/^\u200b/,"")),g.current||p.nativeEvent.isComposing||f.current!==null)return;p.nativeEvent.inputType==="deleteContentBackward"&&!p.target.value?(k.current.sendKey("backspace"),P()):E()},onCompositionStart:()=>{f.current!==null&&h(),g.current=!0},onCompositionEnd:()=>{g.current=!1,f.current!==null&&cancelAnimationFrame(f.current),f.current=requestAnimationFrame(()=>{f.current=null,E()})},onFocus:()=>y?.(!0),onBlur:()=>{!g.current&&f.current!==null&&h(),y?.(!1)},onKeyDown:p=>{if(g.current||p.nativeEvent.isComposing||p.keyCode===229)return;const j=p.ctrlKey||p.altKey||p.metaKey,N=(p.ctrlKey||p.metaKey)&&!p.altKey&&p.key.toLowerCase()==="v";if(c&&!N&&!p.getModifierState("AltGraph")&&(j||p.shiftKey)){const S={Enter:65293,Backspace:65288,Delete:65535,Tab:65289,ArrowUp:65362,ArrowDown:65364,ArrowLeft:65361,ArrowRight:65363,Home:65360,End:65367,PageUp:65365,PageDown:65366}[p.key]??(j&&p.key.length===1?p.key.toLowerCase().codePointAt(0):void 0);if(S!==void 0){p.preventDefault(),h();const T=[];p.ctrlKey&&T.push([65507,"ControlLeft"]),p.altKey&&T.push([65513,"AltLeft"]),p.metaKey&&!T.some(([R])=>R===a[0])&&T.push(a),p.shiftKey&&T.push([65505,"ShiftLeft"]),T.push([S,p.code||p.key]),c(T);return}}const _=dr[p.key];_&&(p.preventDefault(),h(),k.current.sendKey(_))}})]})}function mr(e){let n=[],c=null;const a=new Map,i=()=>{c=null,n.splice(0,32).forEach(y=>{e(y),y[2]?a.set(y[0],y):a.delete(y[0])}),n.length&&(c=requestAnimationFrame(i))};return{send(y){n.push(...y),c===null&&i()},clear(){c!==null&&cancelAnimationFrame(c),c=null,n=[];const y=[...a.values()].reverse();a.clear();for(const[u,l]of y)try{e([u,l,!1])}catch{}}}}const fr=e=>Math.max(1,Math.min(8,Number.isFinite(e)?e:1));function hr(e,n){let c=1;const a="viewportZoom"in e,i=e,y=()=>a?e.pointerTarget.surface():i._canvas,u=()=>a?e.viewportScroller:i._screen,l=a?void 0:i._updateScale;return l&&(i._updateScale=function(){l.call(i),i._display.scale*=c}),{get:()=>c,set(g,f){const x=fr(g),k=y(),v=u(),b=k.getBoundingClientRect(),P=v.getBoundingClientRect(),E=f??{x:P.left+P.width/2,y:P.top+P.height/2},h={x:(E.x-b.left)/(b.width||1),y:(E.y-b.top)/(b.height||1)};c=x,a?e.viewportZoom=c:i._updateScale();const p=k.getBoundingClientRect();v.scrollLeft+=p.left+h.x*p.width-E.x,v.scrollTop+=p.top+h.y*p.height-E.y,c===1&&(v.scrollLeft=0,v.scrollTop=0),n(c)},pan(g,f){const x=u();x.scrollLeft-=g,x.scrollTop-=f},dispose(){l&&(i._updateScale=l)}}}function gr(e,n){const c=e,a=c._keyboard,i=a._target,y=e.focus,u=document.createElement("textarea");u.tabIndex=-1,u.setAttribute("aria-label","Remote desktop keyboard"),u.autocapitalize="off",u.autocomplete="off",u.spellcheck=!1,Object.assign(u.style,{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",fontSize:"16px",opacity:"0",pointerEvents:"none"}),c._screen.append(u);const l=new AbortController;let g=!1,f=null,x=!1;const k=()=>{c._mouseMoveTimer!==null&&clearTimeout(c._mouseMoveTimer),c._mouseMoveTimer=null,c._mouseButtonMask&&(c._mouseButtonMask=0,c._sendMouse(c._mousePos.x,c._mousePos.y,0))};window.addEventListener("blur",k,{signal:l.signal}),document.addEventListener("visibilitychange",()=>{document.hidden&&(a._allKeysUp(),k())},{signal:l.signal});const v=()=>{f!==null&&cancelAnimationFrame(f),f=null;const b=u.value;u.value="",b&&!e.viewOnly&&n(b)};return u.addEventListener("keydown",b=>{(g||b.isComposing||b.keyCode===229)&&b.stopImmediatePropagation()},{capture:!0,signal:l.signal}),u.addEventListener("compositionstart",()=>{f!==null&&v(),g=!0,a._allKeysUp()},{signal:l.signal}),u.addEventListener("compositionend",()=>{g=!1,f!==null&&cancelAnimationFrame(f),f=requestAnimationFrame(v)},{signal:l.signal}),u.addEventListener("input",b=>{!g&&!b.isComposing&&f===null&&v()},{signal:l.signal}),u.addEventListener("blur",()=>{!g&&f!==null&&v(),a._allKeysUp()},{signal:l.signal}),a.ungrab(),a._target=u,e.viewOnly||a.grab(),e.focus=b=>{!x&&!e.viewOnly&&u.focus(b)},document.activeElement===i&&e.focus({preventScroll:!0}),()=>{x||(x=!0,f!==null&&(g?cancelAnimationFrame(f):v()),k(),l.abort(),a.ungrab(),a._target=i,e.viewOnly||a.grab(),e.focus=y,u.remove())}}function*xr(e){for(const n of e.replace(/\r\n?/g,`
|
|
3
|
+
`)){const c=n.codePointAt(0);yield n===`
|
|
4
|
+
`?65293:n===" "?65289:c<256?c:16777216|c}}const et=1048576;function br(e,n,c){const a=new AbortController;let i=!1,y=-1/0,u=!0;const l=new Set,g=v=>{if(!(v.ctrlKey||v.metaKey)||v.altKey||v.isComposing)return;const b=v.key.toLowerCase();b==="v"?(i=v.shiftKey,l.add(v.code||v.key),v.stopImmediatePropagation()):(b==="c"||b==="x")&&(y=performance.now())},f=v=>{v.preventDefault(),v.stopImmediatePropagation();const b=v.clipboardData;if(!b||!Array.from(b.types).includes("text/plain")){c.failed();return}const P=b.getData("text/plain");if(P.length>et){c.failed();return}try{c.paste(P,i)}catch{c.failed()}i=!1},x=v=>{const b=v.detail?.text;if(typeof b!="string"||b.length>et){c.failed();return}c.receive(b),performance.now()-y<2e3&&(y=-1/0,navigator.clipboard?.writeText?navigator.clipboard.writeText(b).catch(()=>{u&&c.failed()}):c.failed())},k={capture:!0,signal:a.signal};return e.addEventListener("keydown",g,k),e.addEventListener("keyup",v=>{l.delete(v.code||v.key)&&v.stopImmediatePropagation()},k),e.addEventListener("paste",f,k),n.addEventListener("clipboard",x,{signal:a.signal}),n.addEventListener("clipboarderror",c.failed,{signal:a.signal}),window.addEventListener("blur",()=>{l.clear(),i=!1,y=-1/0},{signal:a.signal}),()=>{u=!1,a.abort()}}function yr(){const e=performance.now(),n=e+15*6e4,c=`motion-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;let a=[],i=0,y=0,u=!1,l;const g=f=>{if(clearTimeout(l),l=void 0,!a.length)return;const x=a;a=[];for(let k=0;k<x.length;k+=64)Ft("info","COMPUTER_MOTION_TRACE",{version:2,id:c,sequence:++y,startedAt:performance.timeOrigin+e,reason:f,dropped:k?0:i,samples:x.slice(k,k+64)});i=0};return{record(f,x={}){if(u)return;const k=performance.now()-e;if(performance.now()>=n){g("expired"),u=!0;return}a.length>=8192&&(a.splice(2048,1),i++),a.push([Math.round(k*10)/10,f,x]),clearTimeout(l),l=setTimeout(()=>g("idle"),750)},flush:g,dispose(){u||(u=!0,g("dispose"))}}}const xe="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",be="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Be(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 vr(){const{t:e}=St(),n=s.useMemo(()=>yr(),[]);s.useEffect(()=>(n.record("panel-open",{viewport:[window.innerWidth,window.innerHeight],dpr:window.devicePixelRatio}),n.flush("panel-open"),()=>n.flush("panel-unmounted")),[n]);const[c,a]=s.useState(()=>$e()?.targetPeerId??""),[i,y]=s.useState(null),{preferences:u,change:l,loaded:g,saveState:f,flush:x,retry:k,credentialKeys:v,loginState:b,credentialRequest:P}=Jt(c),E=u.target==="local",h=u[u.target],{host:p,platform:j,protocol:N,port:_,domain:Y,ignoreCert:S,username:T}=h,R=N==="rdp"&&i?.rdpAvailable===!1,{viewOnly:w,fit:V}=u,I=h.rememberLogin&&v.includes(Tt(h)),K=r=>l(m=>({...m,[m.target]:{...m[m.target],...r}})),J=r=>K({username:r}),ee=r=>K({domain:r}),we=r=>{K({ignoreCert:r}),x()},ne=r=>K({port:r}),Me=r=>{r&&(ye.current(),ze.clear(),W(null)),l(m=>({...m,viewOnly:r})),x()},[Ce,Pe]=s.useState(!1),q=tr(j),ke=j==="mac"?"⌘V":"Ctrl+V",[re,Q]=s.useState(""),[U,te]=s.useState("idle"),[de,pe]=s.useState(null),[Ie,je]=s.useState(""),[X,oe]=s.useState(!1),[L,W]=s.useState(null),o=s.useRef(null),[d,C]=s.useState(!1),[$,D]=s.useState(!1),M=s.useRef(0),[F,B]=s.useState(()=>navigator.maxTouchPoints>0||window.innerWidth<=640);s.useEffect(()=>{const r=()=>B(navigator.maxTouchPoints>0||window.innerWidth<=640);return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[]);const se=L==="keyboard"&&d&&(!F||!window.visualViewport||$),[ae,tt]=s.useState(1),ce=s.useRef(null),rt=s.useRef(null),[Ee,nt]=s.useState(""),[At,Ne]=s.useState(!1),[He,ot]=s.useState(null),[_t,ie]=s.useState(!1),[Rt,Ye]=s.useState(!1),[Mt,Pt]=s.useState(!1),[me,It]=s.useState(or),st=s.useRef(null),at=s.useRef(null),ye=s.useRef(()=>{}),De=s.useRef(()=>{}),[ct,Dt]=s.useState(qe),Ae=s.useRef(!1),ve=s.useRef(""),it=s.useRef(()=>{}),lt=s.useRef(null),Fe=s.useRef(null),fe=s.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),O=s.useRef(null),ut=s.useRef(!1);ut.current=U==="connected"&&!w;const ze=s.useMemo(()=>mr(([r,m,z])=>O.current?.sendKey(r,m,z)),[]),Xe=s.useRef(null),he=s.useRef(0),We=s.useRef(void 0),le=s.useCallback(()=>{ye.current(),De.current(),ce.current?.dispose(),ce.current=null,ze.clear(),at.current=null,he.current++,clearTimeout(We.current);const r=O.current;O.current=null,r?.disconnect(),Xe.current?.close(),Xe.current=null,fe.replaceChildren()},[fe,ze]);s.useLayoutEffect(()=>(Fe.current?.appendChild(fe),()=>{fe.remove()}),[fe,X]),s.useEffect(()=>()=>le(),[le]),s.useEffect(()=>{const r=()=>{const m=qe();Dt(m),!m&&(Ae.current=!1,ve.current="",le(),te("idle"),Q(""),oe(!1),W(null))};return window.addEventListener(yt,r),()=>window.removeEventListener(yt,r)},[le]),s.useEffect(()=>{const r=()=>a($e()?.targetPeerId??"");return window.addEventListener(vt,r),()=>window.removeEventListener(vt,r)},[]),s.useEffect(()=>{le(),Ae.current=!1,ve.current="",te("idle"),pe(null),Q(""),y(null),oe(!1),W(null),Pe(!1),je(""),nt(""),Ne(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async m=>{if(!m.ok)throw new Error(m.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await m.json()}).then(m=>{r.signal.aborted||y(m)}).catch(m=>{r.signal.aborted||pe(Be(String(m)))}),()=>{r.abort(),le()}},[c,le]),s.useEffect(()=>{w&&De.current(),O.current&&(O.current.viewOnly=w)},[w]),s.useEffect(()=>{O.current&&(O.current.scaleViewport=V)},[V]),s.useEffect(()=>{O.current&&"pauseResize"in O.current&&(O.current.pauseResize=!!L)},[L]),s.useEffect(()=>{const r=O.current;r&&("keyboardActive"in r?r.keyboardActive=L==="keyboard":r.focusOnClick=L!=="keyboard")},[L]);const dt=r=>{r===E||Z||!g||(Q(""),pe(null),l(m=>({...m,target:r?"local":"remote"})),x())},pt=()=>{Ae.current=!0,ve.current="",le(),te("idle"),Q(""),oe(!1),W(null),Ne(!1)},mt=async r=>{if(r?.preventDefault(),R)return;if(Ae.current=!0,U==="credentials"&&O.current&&"sendCredentials"in O.current){ve.current=re,O.current.sendCredentials({username:T,password:re}),te("connecting");return}if(!qe()||!g||!re&&!I)return;x(),ot(null),ie(!1),Ye(!1),le(),pe(null),je(""),te("connecting"),Ne(!1);const m=he.current,z=H=>{m===he.current&&(le(),te("error"),pe(H),W(null),ve.current="",(H==="computer.authFailed"||H==="computer.permission"||H==="computer.loginExpired")&&Q(""),I&&(H==="computer.authFailed"||H==="computer.loginExpired")&&P("forget",h).catch(()=>{}))};We.current=setTimeout(()=>z("computer.timeout"),6e4);try{let H=re||await P("use",h);if(m!==he.current)return;ve.current=H||"";let G;if(N==="rdp"){const{RdpSession:ue}=await wt(async()=>{const{RdpSession:Le}=await import("./rdpSession-C0jVZfFV.js");return{RdpSession:Le}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]));if(m!==he.current)return;document.activeElement?.blur?.(),Ze.flushSync(()=>{te("connecting"),window.innerWidth<=640&&oe(!0)});const Se=Fe.current?.getBoundingClientRect(),Te=ur(Se?.width||1280,Se?.height||800);G=new ue(fe,{host:p.trim(),port:Number(_),username:T.trim(),password:H||"",domain:Y.trim(),ignoreCert:S,...Te},Le=>z(Be(Le)),n)}else{const{default:ue}=await wt(async()=>{const{default:Le}=await import("./rfb-CxsXsMUX.js");return{default:Le}},[]);if(m!==he.current)return;const Se=new Qt(p.trim(),Le=>z(Be(Le)));Xe.current=Se;const Te=new ue(fe,Se,{shared:!0,credentials:{username:T.trim()||void 0,password:H}});Te.background="var(--chrome-bg)",Te.resizeSession=!1,Te.qualityLevel=6,Te.compressionLevel=2,G=Te}H=void 0,O.current=G,G.scaleViewport=V,G.viewOnly=w,G.addEventListener("connect",()=>{if(m!==he.current)return;clearTimeout(We.current),te("connected"),Q(""),window.innerWidth<=640&&(document.activeElement?.blur?.(),oe(!0));const ue=ve.current;ve.current="",h.rememberLogin&&ue&&P("save",h,ue).catch(()=>{})}),G.addEventListener("credentialsrequired",ue=>{if(m!==he.current)return;const Se=ue.detail.types;Pt(Se.includes("username")),te("credentials")}),G.addEventListener("securityfailure",()=>z("computer.authFailed")),G.addEventListener("disconnect",()=>z("computer.disconnected")),G.addEventListener("desktopname",ue=>{m===he.current&&je(ue.detail.name)})}catch(H){z(Be(String(H)))}},ge=r=>{const m=O.current;!m||U!=="connected"||w||(L==="keyboard"?o.current?.focus({preventScroll:!0}):L!=="clipboard"&&!F&&m.focus?.({preventScroll:!0}),ze.send([...r.map(([z,H])=>[z,H,!0]),...[...r].reverse().map(([z,H])=>[z,H,!1])]))},A=U==="connected",Z=U==="connecting"||U==="credentials",Ke=A||U==="connecting";s.useEffect(()=>{const r=O.current;if(!A||!r||!("viewportZoom"in r)&&!("_display"in r))return;const m=hr(r,tt);return ce.current=m,tt(1),()=>{m.dispose(),ce.current===m&&(ce.current=null)}},[A]),s.useEffect(()=>{const r=O.current,m=Fe.current,z=st.current;if(!A||L&&L!=="keyboard"||me!=="trackpad"&&!(navigator.maxTouchPoints>0)||!r||!m||!z)return;const H="pointerTarget"in r?r.pointerTarget:rr(r),G=lr(m,H,z,at,{mode:me,zoom:ce.current??void 0,viewOnly:w,trace:n});return ye.current=G,()=>{G(),ye.current===G&&(ye.current=()=>{})}},[A,w,me,X,L,n]),s.useEffect(()=>{const r=O.current;if(!(!A||w||!r))return br(fe,r,{paste:(m,z)=>{r.clipboardPasteFrom(m),ge(z?[...q.paste.slice(0,1),[65505,"ShiftLeft"],...q.paste.slice(1)]:q.paste),Ne(!0),ie(!1)},receive:m=>{ot(m),Ye(!1)},failed:()=>{ie(!0),W("clipboard")}})},[A,w,j,fe]),s.useEffect(()=>{const r=O.current;if(!A||w||!r||"pointerTarget"in r||!("_keyboard"in r))return;const m=gr(r,gt);return De.current=m,()=>{m(),De.current===m&&(De.current=()=>{})}},[A,w]);const ft=r=>{r!==me&&(ye.current(),It(r),sr(r))};it.current=()=>{mt()},s.useEffect(()=>{ct&&g&&i&&!R&&u.autoConnect&&I&&U==="idle"&&!Ae.current&&it.current()},[ct,g,i,R,u.autoConnect,I,U]);const ht=()=>{Ae.current=!0,P("forget",h).catch(()=>{})},_e=r=>{if(r==="keyboard"){if(L==="keyboard"&&!se){o.current?.blur(),o.current?.focus({preventScroll:!0});return}ye.current(),M.current=window.visualViewport?.height??window.innerHeight,Ze.flushSync(()=>{C(!1),D(!1),W(m=>m===r?null:r)})}else ye.current(),W(m=>m===r?null:r)},zt=()=>{ce.current?.set(1),l(r=>({...r,fit:!0})),x()},gt=r=>{if(!O.current||!ut.current)return;const m=[];for(const z of xr(r))m.push([z,null,!0],[z,null,!1]);ze.send(m)};s.useEffect(()=>{if(!A||L!=="keyboard"&&L!=="clipboard"||!window.visualViewport)return;const r=window.visualViewport,m=rt.current,z=()=>{L==="keyboard"&&D(d&&M.current-r.height>100),X&&m&&r.height>=160&&(m.style.height=`${r.height}px`,m.style.top=`${r.offsetTop}px`)};return z(),r.addEventListener("resize",z),r.addEventListener("scroll",z),()=>{r.removeEventListener("resize",z),r.removeEventListener("scroll",z),m&&(m.style.height="",m.style.top="")}},[A,L,X,d]);const xt=t.jsxs("div",{className:"flex shrink-0 items-center text-xs",role:"group","aria-label":e("computer.desktopZoom"),title:F?e("computer.pinchHint"):void 0,children:[t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomOut"),disabled:!A||ae<=1,onPointerDown:r=>r.preventDefault(),onClick:()=>ce.current?.set(ae/1.25),children:t.jsx(Gt,{size:16})}),t.jsxs("button",{type:"button",className:"min-h-11 min-w-11","aria-label":e("computer.resetZoom"),disabled:!A,onPointerDown:r=>r.preventDefault(),onClick:zt,children:[Math.round(ae*100),"%"]}),t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center","aria-label":e("computer.zoomIn"),disabled:!A||ae>=8,onPointerDown:r=>r.preventDefault(),onClick:()=>ce.current?.set(ae*1.25),children:t.jsx(qt,{size:16})}),F&&t.jsx("span",{className:"hidden pr-2 text-[10px] text-muted-foreground sm:inline",children:e("computer.pinchHint")})]}),Re=`flex shrink-0 items-center justify-center rounded-md hover:bg-surface-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary ${F?"min-h-11 min-w-11":"h-8 min-w-8"}`,bt=t.jsxs("div",{ref:rt,className:`flex min-h-0 flex-col bg-surface text-foreground ${X?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:X?"dialog":void 0,"aria-modal":X||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&L&&(r.preventDefault(),W(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:`relative z-30 flex shrink-0 items-center gap-2 border-b border-border bg-surface px-2 ${F?"min-h-12":"min-h-8"}`,children:[X&&t.jsx("button",{type:"button",className:Re,onClick:()=>{oe(!1),W(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(Ut,{size:20})}),t.jsx(Kt,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:A&&(Ie||(E?i?.hostname||$e()?.serviceName:p))||e("computer.title")}),A&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),A&&b==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),A&&f==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ct,{size:12,className:"animate-spin text-muted-foreground"})}),A&&f==="error"&&t.jsxs("button",{type:"button",className:xe,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:k,children:["! ",e("computer.retry")]}),Z&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.cancel")]}),A&&!F&&L==="keyboard"&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("keyboard"),"aria-label":e("computer.keyboard"),"aria-pressed":se,children:t.jsx(Ge,{size:18})}),A&&!F&&t.jsx("button",{type:"button",className:`${Re} ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:w,onClick:()=>_e("clipboard"),"aria-label":e("computer.clipboardTool"),title:e("computer.clipboardTool"),"aria-pressed":L==="clipboard",children:t.jsx(jt,{size:18})}),A&&!X&&t.jsxs("button",{type:"button",className:`${Re} gap-1 px-1 text-xs`,onClick:()=>oe(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(Bt,{size:16}),e("computer.expand")]}),A&&t.jsx("button",{type:"button",className:Re,onClick:()=>_e("tools"),"aria-label":e("computer.tools"),"aria-expanded":L==="tools",children:t.jsx(Xt,{size:18})})]}),!Ke&&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=>{mt(r)},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 ${E?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":E,disabled:Z||!i||!g,onClick:()=>dt(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${E?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!E,disabled:Z||!g,onClick:()=>dt(!1),children:e("computer.otherComputer")})]}),E?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:$e()?.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:be,value:p,disabled:Z||!g,onChange:r=>{K({host:r.target.value,domain:"",ignoreCert:!1}),Q(""),pe(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[j==="mac"?"macOS":j==="linux"?"Ubuntu / Linux":"Windows"," · ",N.toUpperCase()," · ",N==="rdp"?_||"3389":"5900",w?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(N==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:be,value:T,disabled:!g,onChange:r=>J(r.target.value),onBlur:()=>{x()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:N==="rdp"||U==="credentials"&&Mt,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:be,type:"password",value:re,disabled:!g,onChange:r=>Q(r.target.value),placeholder:I&&U!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||U==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(N==="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:h.rememberLogin,disabled:Z||!g||b==="saving",onChange:r=>{const m=r.target.checked;K({rememberLogin:m}),!m&&I?P("forget",{...h,rememberLogin:m}).catch(()=>{}):x()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:Z||b==="saving",onClick:ht,children:e("computer.forgetLogin")})]}),b==="error"&&!de&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),R&&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")})]}),U==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),de&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(de),de==="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:S,onChange:r=>we(r.target.checked)}),e("computer.trustCertificateHere")]}),U==="error"&&de!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{Pe(!0),requestAnimationFrame(()=>lt.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsx("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:!g||R||b==="saving"||E&&!i||!p.trim()||!re&&(!I||U==="credentials")||N==="rdp"&&(!T.trim()||!Number.isInteger(Number(_))||Number(_)<1||Number(_)>65535),children:e(U==="credentials"?"computer.authenticate":U==="error"?"computer.retryConnect":"computer.connect")}),t.jsxs("details",{ref:lt,className:"border-b border-border text-xs",open:Ce,onToggle:r=>Pe(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:Ce?"−":"+"})]}),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:be,value:j,disabled:Z||!g,onChange:r=>{er(r.target.value)&&K({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),Q(""),x()},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:be,value:N,disabled:Z||!g,onChange:r=>{K({protocol:r.target.value==="rdp"?"rdp":"vnc"}),Q(""),pe(null),x()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),N==="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:be,type:"number",min:1,max:65535,step:1,value:_,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ne(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:be,value:Y,disabled:Z||!g,onBlur:()=>{x()},onChange:r=>ee(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:S,disabled:Z||!g,onChange:r=>we(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:w,disabled:Z||!g,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:u.autoConnect,disabled:Z||!g,onChange:r=>{l(m=>({...m,autoConnect:r.target.checked})),x()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(f==="saved"?"computer.settingsSaved":f==="error"?g?"computer.settingsSaveFailed":"computer.settingsLoadFailed":f==="loading"?"computer.settingsLoading":"computer.settingsSaving"),f==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:k,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(N==="rdp"?j==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":j==="mac"?"computer.step1":j==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(N==="rdp"?"computer.rdpStep2":j==="mac"?"computer.step2":j==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),N==="vnc"&&j==="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
|
|
5
|
+
x11vnc -storepasswd
|
|
6
|
+
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(N==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),A&&L==="tools"&&t.jsx("button",{type:"button",className:`absolute inset-x-0 ${F?"bottom-14 top-12":"bottom-0 top-8"} z-20 bg-background/40`,"aria-label":e("computer.returnToDesktop"),onClick:()=>W(null)}),A&&t.jsxs("div",{hidden:L!=="tools",className:`${L==="tools"?"flex":"hidden"} absolute inset-x-3 ${F?"top-14":"top-10"} 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:()=>W(null),children:t.jsx($t,{size:18})})]}),F&&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 ${me===r?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":me===r,onClick:()=>ft(r),children:e(r==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},r))})}),!F&&t.jsxs(t.Fragment,{children:[xt,t.jsxs("button",{type:"button",className:xe,disabled:w,onClick:()=>_e("keyboard"),children:[t.jsx(Ge,{size:14}),e("computer.keyboard")]})]}),t.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[t.jsx("input",{type:"checkbox",checked:w,onChange:r=>Me(r.target.checked)}),e("computer.viewOnly")]}),t.jsx("button",{type:"button",className:xe,onClick:()=>{ce.current?.set(1),l(r=>({...r,fit:!r.fit})),x()},children:e(V?"computer.actualSize":"computer.fit")}),t.jsxs("select",{className:`${xe} min-w-0 bg-surface`,"aria-label":e("computer.shortcuts"),value:"",disabled:w,onChange:r=>{ge(q[r.target.value]??[])},children:[t.jsx("option",{value:"",disabled:!0,children:e("computer.shortcuts")}),t.jsxs("option",{value:"tab",children:[j==="mac"?"⌘ Tab":"Alt+Tab"," · ",e("computer.switchApps")]}),t.jsxs("option",{value:"search",children:[j==="mac"?"⌘ Space":"Super / Win"," · ",e(j==="mac"?"computer.spotlight":"computer.systemSearch")]}),t.jsx("option",{value:"copy",children:j==="mac"?"⌘C":"Ctrl+C"}),t.jsx("option",{value:"paste",children:ke}),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:xe,disabled:b==="saving",onClick:ht,children:e("computer.forgetLogin")}),t.jsxs("button",{type:"button",className:`${xe} ml-auto text-destructive`,onClick:pt,children:[t.jsx(kt,{size:14}),e("computer.disconnect")]})]})]}),t.jsxs("div",{ref:Fe,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${Ke?"":"hidden"}`,onMouseDownCapture:r=>{L==="keyboard"&&r.preventDefault()},style:{touchAction:A?"none":void 0},"aria-label":e("computer.remoteTitle"),children:[!A&&Ke&&t.jsxs("div",{role:"status",className:"absolute inset-0 z-20 flex items-center justify-center gap-2 bg-surface text-xs text-muted-foreground",children:[t.jsx(Ct,{size:16,className:"animate-spin"}),e("computer.connecting")]}),A&&t.jsx("div",{ref:st,hidden:!0,"aria-hidden":"true",className:"pointer-events-none absolute left-0 top-0 z-20 h-5 w-5 will-change-transform"})]}),t.jsx("div",{hidden:L!=="tools",children:A&&F&&!w&&t.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:e(me==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),A&&L==="keyboard"&&!w&&t.jsxs(t.Fragment,{children:[t.jsx(pr,{sendChord:ge,commandKey:q.copy[0],inputRef:o,onFocusChange:C,sendText:gt,sendKey:r=>ge(r==="tab"?[[65289,"Tab"]]:r==="delete"?[[65535,"Delete"]]:q[r])}),t.jsx("div",{className:"grid shrink-0 grid-cols-6 gap-1 bg-surface px-1",role:"group","aria-label":e("computer.keyboardNavigation"),children:["escape","left","down","up","right","selectAll"].map(r=>t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm hover:bg-surface-2","aria-label":e(`computer.key${r[0].toUpperCase()}${r.slice(1)}`),onPointerDown:m=>m.preventDefault(),onClick:()=>ge(r==="selectAll"?[...q.copy.slice(0,1),[97,"KeyA"]]:q[r]),children:{escape:"Esc",left:"←",down:"↓",up:"↑",right:"→",selectAll:j==="mac"?"⌘A":"Ctrl+A"}[r]},r))})]}),A&&L==="clipboard"&&!w&&t.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:r=>{if(r.preventDefault(),!(!Ee||!O.current))try{O.current.clipboardPasteFrom(Ee),Ne(!0),ie(!1)}catch{ie(!0)}},children:[t.jsx("textarea",{className:`${be} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":e("computer.clipboard"),placeholder:e("computer.clipboardPlaceholder"),value:Ee,onChange:r=>{nt(r.target.value),Ne(!1)},maxLength:et}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{type:"submit",className:`${xe} min-h-11 flex-1`,disabled:!Ee,children:e("computer.clipboard")}),t.jsx("button",{type:"button",className:`${xe} min-h-11`,onClick:()=>{try{Ee&&O.current?.clipboardPasteFrom(Ee),ge(q.paste),ie(!1),Ne(!!Ee)}catch{ie(!0)}},children:ke})]}),t.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:At?e("computer.clipboardSent"):e("computer.clipboardHint",{shortcut:ke})}),He!==null&&t.jsxs("div",{className:"space-y-1",children:[t.jsx("textarea",{className:`${be} resize-none py-2 text-base`,rows:2,readOnly:!0,value:He,"aria-label":e("computer.remoteClipboard"),onFocus:r=>r.currentTarget.select()}),t.jsx("button",{type:"button",className:xe,onClick:()=>{if(!navigator.clipboard?.writeText){ie(!0);return}navigator.clipboard.writeText(He).then(()=>{Ye(!0),ie(!1)},()=>ie(!0))},children:e(Rt?"computer.clipboardCopied":"computer.copyToDevice")})]}),_t&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.clipboardAccessFailed")}),de&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e(de)})]}),Ke&&F&&t.jsxs("div",{className:"relative z-30 flex shrink-0 items-center border-t border-border bg-surface px-1 py-1 text-[11px]",children:[t.jsxs("div",{className:`grid min-w-0 flex-1 ${L==="keyboard"?"grid-cols-5":"grid-cols-3"}`,children:[t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${se?"bg-surface-2 text-primary":""}`,disabled:!A||w,onClick:()=>_e("keyboard"),"aria-pressed":se,children:[t.jsx(Ge,{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 ${L==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:!A||w,onClick:()=>_e("clipboard"),"aria-pressed":L==="clipboard",children:[t.jsx(jt,{size:18}),e("computer.clipboardTool")]}),L==="keyboard"?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm",onPointerDown:r=>r.preventDefault(),onClick:()=>ge([[65289,"Tab"]]),children:"Tab"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>ge(q.backspace),children:"⌫"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>ge(q.enter),children:"↵"})]}):t.jsx(t.Fragment,{children:t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:!A||w,onClick:()=>ft(me==="trackpad"?"direct":"trackpad"),"aria-label":e("computer.switchTouchMode"),children:[t.jsx(Ht,{size:18}),e(me==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})})]}),xt]})]});return X?Ze.createPortal(bt,document.body):bt}const Nr=Object.freeze(Object.defineProperty({__proto__:null,default:vr},Symbol.toStringTag,{value:"Module"}));export{et as C,Nr as a,xr as b,ur as c};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{bA as t}from"./app-
|
|
1
|
+
import{bA as t}from"./app-DNnVU3VK.js";import{C as s}from"./ChangeWalkthroughPanel-g83lCwJi.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-Cm9xs8pz.js";import"./triangle-alert-D1VnXjVL.js";const e="/tmp/termdock-dag-playground",i={version:1,id:"dag-playground",repoRoot:e,workspaceRoot:e,title:"改动解释升级为可点击导览",summary:"这是一页免登录 playground,用真实 ChangeWalkthroughPanel 调 DAG 的节点、边、label 和密度。",generatedBy:"dag-playground",injectedAt:Date.now(),highlights:[{what:"先看总览,再看链路",effect:"读者不用先进入 diff,也能理解整批改动目的。",tag:"理解"},{what:"多条链路直接画出来",effect:"分支、汇合、验证路径不再靠 next 文本猜。",tag:"链路"},{what:"点击节点跳回证据",effect:"导览和真实 diff 之间形成闭环。",tag:"导航"}],nodes:[{id:"export",title:"导出 section 级 diff",kind:"source",business:"CLI 把 hunk 拆成多个连续改动 section,并为每个 section 生成稳定 fingerprint。这里故意写长一点,用来验证 DAG 节点是否会按照真实文本高度撑开,而不是被固定高度裁掉。",anchor:{repoRoot:e,filePath:"src/server/cli.ts",hunkIndex:0,sectionIndex:0}},{id:"prompt",title:"约束 AI 输出",kind:"process",business:"提示词要求先写总览,再逐 section 生成解释。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:0}},{id:"schema",title:"校验导览结构",kind:"process",business:"检查节点、边和锚点字段是否完整。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"fallback",title:"补齐兼容字段",kind:"process",business:"旧版结果缺字段时生成稳定回退值。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:1}},{id:"store",title:"保存整批导览结构",kind:"process",business:"服务端把 walkthrough 作为一等数据持久化。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"api",title:"前端读取总览",kind:"api",business:"一次请求拿到 records 和 walkthroughs。",anchor:{repoRoot:e,filePath:"src/lib/terminal/api.ts",hunkIndex:0}},{id:"panel",title:"渲染 DAG 导览",kind:"ui",business:"用节点和边表达实现链路,节点可点击。节点内容可能是一两句话,也可能包含较长的业务解释;布局需要先测量 DOM 高度,再重新计算每一行节点的 y 坐标和连线端点。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/ChangeWalkthroughPanel.tsx",hunkIndex:0}},{id:"jump",title:"跳回真实 diff",kind:"ui",business:"点击节点后定位到文件、hunk 或 section。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:1}},{id:"section",title:"贴近改动展示解释",kind:"ui",business:"section 解释跟在对应 diff 块后面,而不是堆在 hunk 顶部。这个节点也故意写得更长,用来观察右侧分支和下方验证节点的连线是否会避让变高后的卡片。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/DiffViewer.tsx",hunkIndex:0,sectionIndex:1}},{id:"verify",title:"验证导出和注入",kind:"test",business:"跑 lint、install、health、资源检查和注入自测。"}],edges:[{from:"export",to:"prompt",label:"提供输入",desc:"sectionFingerprint 让 AI 可以稳定引用。"},{from:"export",to:"schema",label:"结构校验",desc:"先确认输入可以稳定落库。"},{from:"export",to:"fallback",label:"兼容旧数据",desc:"为历史记录补齐必要字段。"},{from:"prompt",to:"store",label:"注入",desc:"AI payload 写回本地服务。"},{from:"schema",to:"store",label:"通过后保存",desc:"合法结构进入存储层。"},{from:"fallback",to:"store",label:"归一化后保存",desc:"兼容数据与新数据走同一链路。"},{from:"store",to:"api",label:"读取",desc:"浏览器从服务端拿到导览。"},{from:"api",to:"panel",label:"渲染",desc:"结构化数据变成导览图。"},{from:"panel",to:"jump",label:"点击",desc:"节点驱动 diff 定位。"},{from:"jump",to:"section",label:"定位",desc:"落到对应 section 解释。"},{from:"export",to:"verify",label:"验证",desc:"导出结构要覆盖 tracked/untracked。"},{from:"section",to:"verify",label:"回归",desc:"确认展示位置和交互。"}],sections:[],risks:[{title:"边和 label 不能遮住节点主体。"},{title:"窄侧栏下横向滚动要可控。"}],checks:["在 360px、560px、900px 宽度下截图检查。","确认边的箭头、label 背板和节点层级清楚。","确认节点点击区域和 hover 状态可感知。"]};function p(){return t.jsx("div",{className:"min-h-screen bg-background p-5 text-foreground","data-dag-playground":!0,children:t.jsxs("div",{className:"mx-auto max-w-[72rem]",children:[t.jsxs("div",{className:"mb-3",children:[t.jsx("h1",{className:"text-sm font-semibold",children:"DAG Playground"}),t.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Auth-free playground for tuning the real ChangeWalkthroughPanel."})]}),t.jsxs("div",{className:"grid gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})}),t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})})]})]})})}export{p as DagPlayground};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{bA as e}from"./app-
|
|
1
|
+
import{bA as e}from"./app-DNnVU3VK.js";import{b as a}from"./dnd-BCFAPC0L.js";import{c as M,S as _,D as T}from"./DiffViewer-DDiASWHf.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./referenceLongPress-LCYPFdN8.js";const w=`diff --git a/CommentGap.kt b/CommentGap.kt
|
|
2
2
|
--- a/CommentGap.kt
|
|
3
3
|
+++ b/CommentGap.kt
|
|
4
4
|
@@ -1,4 +1,4 @@
|
|
Binary file
|
|
Binary file
|