termdock 1.4.331 → 1.4.332
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/THIRD_PARTY_NOTICES.md +12 -0
- package/dist/client/assets/{App-xBkso5In.js → App-BB9Zns7R.js} +37 -37
- package/dist/client/assets/App-BB9Zns7R.js.br +0 -0
- package/dist/client/assets/App-BB9Zns7R.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-DCxpe1Bj.js +9 -0
- package/dist/client/assets/ArchitecturePanel-DCxpe1Bj.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-DCxpe1Bj.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-xvUzbgKh.js → ChangeWalkthroughPanel-CAyVfccZ.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-CAyVfccZ.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-CAyVfccZ.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-Bey7tYQF.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-Bey7tYQF.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-Bey7tYQF.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-Q5KzPAOz.js +2 -0
- package/dist/client/assets/{ComputerControlView-D-1UEmtr.js → ComputerControlView-CojIu02o.js} +3 -3
- package/dist/client/assets/ComputerControlView-CojIu02o.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CojIu02o.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-1KaifMRo.js → DagPlayground-BeyWYMaL.js} +1 -1
- package/dist/client/assets/DagPlayground-BeyWYMaL.js.br +0 -0
- package/dist/client/assets/DagPlayground-BeyWYMaL.js.gz +0 -0
- package/dist/client/assets/{DiffLab-Dh7lMk1W.js → DiffLab-DW3LP4Zk.js} +1 -1
- package/dist/client/assets/DiffLab-DW3LP4Zk.js.br +0 -0
- package/dist/client/assets/DiffLab-DW3LP4Zk.js.gz +0 -0
- package/dist/client/assets/{DiffReview-Bxe6OacV.js → DiffReview-CsQjyKYd.js} +1 -1
- package/dist/client/assets/DiffReview-CsQjyKYd.js.br +0 -0
- package/dist/client/assets/DiffReview-CsQjyKYd.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CwdLf6kM.js → DiffReviewLab-DRvhZLgu.js} +1 -1
- package/dist/client/assets/DiffReviewLab-DRvhZLgu.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-DRvhZLgu.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-oGb-V3AK.js → DiffViewer-CwTOIjTT.js} +1 -1
- package/dist/client/assets/DiffViewer-CwTOIjTT.js.br +0 -0
- package/dist/client/assets/DiffViewer-CwTOIjTT.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-BTunplWr.js → ModelPreview-BHmMm0Pj.js} +1 -1
- package/dist/client/assets/ModelPreview-BHmMm0Pj.js.br +0 -0
- package/dist/client/assets/ModelPreview-BHmMm0Pj.js.gz +0 -0
- package/dist/client/assets/RightSidebar-Coc7x6Q-.js +1677 -0
- package/dist/client/assets/RightSidebar-Coc7x6Q-.js.br +0 -0
- package/dist/client/assets/RightSidebar-Coc7x6Q-.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-D4LxQjpJ.js → abnfDiagram-VCTEODGH-wY9KgDKQ.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-wY9KgDKQ.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-wY9KgDKQ.js.gz +0 -0
- package/dist/client/assets/app-D-AilvVY.js +35 -0
- package/dist/client/assets/app-D-AilvVY.js.br +0 -0
- package/dist/client/assets/app-D-AilvVY.js.gz +0 -0
- package/dist/client/assets/{arc-BcCf73Fm.js → arc-DVBtoEGf.js} +1 -1
- package/dist/client/assets/arc-DVBtoEGf.js.br +0 -0
- package/dist/client/assets/arc-DVBtoEGf.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-Dfg95GK6.js → architectureDiagram-5GKGNRK7-CQPsSdTB.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CQPsSdTB.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CQPsSdTB.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-BwXSp0xK.js → blockDiagram-I7D4REHJ-OB_hCQwv.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-OB_hCQwv.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-OB_hCQwv.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-D4GfUedH.js → c4Diagram-7LVT6UL2-Cp72_koy.js} +1 -1
- package/dist/client/assets/{c4Diagram-7LVT6UL2-D4GfUedH.js.br → c4Diagram-7LVT6UL2-Cp72_koy.js.br} +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Cp72_koy.js.gz +0 -0
- package/dist/client/assets/channel-CYCNCfSN.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-BqcmDKjo.js → chunk-2Q5K7J3B-wZpiUjnH.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BBV3_wnk.js → chunk-5VM5RSS4-DZA-nY7e.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-B-r7e040.js → chunk-F27PBJKO-DWjLrbpP.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-DWjLrbpP.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-DWjLrbpP.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-B83oWEy_.js → chunk-IMKFNOWR-Dmq185X2.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-Dmq185X2.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-Dmq185X2.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-C2FW583q.js → chunk-JWPE2WC7-Bw9j-pi5.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BWU7oLd-.js → chunk-POPQ4Y6H-BjWtrh1M.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-C5OgXymb.js → chunk-SVP7TREG-VIH7H3Pr.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-VIH7H3Pr.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-VIH7H3Pr.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-B1LlRwu4.js → chunk-TICWLB2K-D8lo3HVO.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-D8lo3HVO.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-D8lo3HVO.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-7l9gcG6S.js → chunk-XXDRQBXY-DTbG8Qn9.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-CV6z7LP1.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-CV6z7LP1.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-DNBCyqkI.js → cose-bilkent-JH36ORCC-Cey1iRcB.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Cey1iRcB.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Cey1iRcB.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BiCAbJSv.js → cynefin-OW5HDTMX-BSP2A8yQ.js} +1 -1
- package/dist/client/assets/{cynefin-OW5HDTMX-BiCAbJSv.js.br → cynefin-OW5HDTMX-BSP2A8yQ.js.br} +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BiCAbJSv.js.gz → cynefin-OW5HDTMX-BSP2A8yQ.js.gz} +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CaRucQy9.js → cynefinDiagram-5FMLGOSQ-Wq4INzwW.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Wq4INzwW.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Wq4INzwW.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-kU4wdq9U.js → dagre-GXQ25YYZ-UgOLsTAJ.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-UgOLsTAJ.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-UgOLsTAJ.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BvDFZeQg.js → diagram-S7CK7UJ4-CXi8ez4a.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-CXi8ez4a.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-CXi8ez4a.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-DYTly1n3.js → diagram-UQ7AKVKN-WD44iVkL.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-WD44iVkL.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-WD44iVkL.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-C0bMSg7N.js → diagram-VSXAHHWV-DeeTr7nX.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-DeeTr7nX.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DeeTr7nX.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-C9_Uoa7n.js → diagram-VX7I27RA-r3wdM6Nm.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-r3wdM6Nm.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-r3wdM6Nm.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-CLsF0k3J.js → diagram-Z3DM3KII-q2jyvUdh.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-q2jyvUdh.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-q2jyvUdh.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-Bt6b2Ygi.js → ebnfDiagram-PWID7BFC-Cb7oWq7z.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Cb7oWq7z.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Cb7oWq7z.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-Bs5jB7E2.js → erDiagram-RLTQ6QDP-CNuNvK3_.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-CNuNvK3_.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CNuNvK3_.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-BCSeo8DJ.js → flowDiagram-HODETNUW-BYdnedTN.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BYdnedTN.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BYdnedTN.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-BnCBe-Ue.js → ganttDiagram-EL5Y4UJY-CaxdXqhz.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CaxdXqhz.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CaxdXqhz.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-W1Lo4NZw.js → gestureArbiter-DPJowqRM.js} +1 -1
- package/dist/client/assets/gestureArbiter-DPJowqRM.js.br +0 -0
- package/dist/client/assets/gestureArbiter-DPJowqRM.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-C7BJXlkD.js → gitGraphDiagram-WWUBYQGX-DRO8nFRo.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DRO8nFRo.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DRO8nFRo.js.gz +0 -0
- package/dist/client/assets/index-CRxcDATF.css +1 -0
- package/dist/client/assets/index-CRxcDATF.css.br +0 -0
- package/dist/client/assets/index-CRxcDATF.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CJXzvnav.js → infoDiagram-27XIBGKW-D8154Axl.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js → ishikawaDiagram-5VMMS53U-C-m2YcvO.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-m2YcvO.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-m2YcvO.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-C5bywqIt.js → journeyDiagram-3NMN7TZE-BaYbc4fI.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BaYbc4fI.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BaYbc4fI.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-ChHpoQyu.js → kanban-definition-UXKFOSKX-C4ZmM3W8.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-C4ZmM3W8.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-C4ZmM3W8.js.gz +0 -0
- package/dist/client/assets/{layout-e7M-xuok.js → layout-TUsrKU-t.js} +1 -1
- package/dist/client/assets/layout-TUsrKU-t.js.br +0 -0
- package/dist/client/assets/layout-TUsrKU-t.js.gz +0 -0
- package/dist/client/assets/{linear-A5CrihlL.js → linear-nScEH6bm.js} +1 -1
- package/dist/client/assets/{linear-A5CrihlL.js.br → linear-nScEH6bm.js.br} +0 -0
- package/dist/client/assets/linear-nScEH6bm.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-BNac_Y3z.js → mermaid.core-WM_j9CSC.js} +5 -5
- package/dist/client/assets/mermaid.core-WM_j9CSC.js.br +0 -0
- package/dist/client/assets/mermaid.core-WM_j9CSC.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-fQoEGcCr.js → mindmap-definition-YA3MSWOX-D5bLjroL.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D5bLjroL.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D5bLjroL.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap--0YoOXsx.js → passwordBootstrap-BHUt4zht.js} +1 -1
- package/dist/client/assets/passwordBootstrap-BHUt4zht.js.br +0 -0
- package/dist/client/assets/{passwordBootstrap--0YoOXsx.js.gz → passwordBootstrap-BHUt4zht.js.gz} +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-CYbfla8A.js → pegDiagram-XKGWAZYB-BCJ-HO-6.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BCJ-HO-6.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BCJ-HO-6.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-B6--ZKXC.js → pieDiagram-E7YTZNPT-Dg3u_zy9.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dg3u_zy9.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dg3u_zy9.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-Bau_h7Jl.js → quadrantDiagram-AXDQQJYC-Bi9SzqYi.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bi9SzqYi.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bi9SzqYi.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-CApEuiEL.js → railroadDiagram-O6MQD6OU-Kbg4uhta.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Kbg4uhta.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Kbg4uhta.js.gz +0 -0
- package/dist/client/assets/{rdpSession-CydBq1bk.js → rdpSession-D_TLn9lr.js} +1 -1
- package/dist/client/assets/rdpSession-D_TLn9lr.js.br +0 -0
- package/dist/client/assets/rdpSession-D_TLn9lr.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-8ExgTbB3.js → referenceLongPress-CalVNheA.js} +1 -1
- package/dist/client/assets/referenceLongPress-CalVNheA.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CalVNheA.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-Rxe80d7j.js → requirementDiagram-BXWQKSXE-DY1nJYdk.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DY1nJYdk.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-DY1nJYdk.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-BaPl8d6E.js → sankeyDiagram-P5KCCOFB-Ch9oVvbH.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-Ch9oVvbH.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-Ch9oVvbH.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-Asyx5gWK.js → sequenceDiagram-WJ2MYXX4-BXQhyqVP.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BXQhyqVP.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BXQhyqVP.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-BQaSglof.js → sizeCapture-INFHLROL-CHCCkDzJ.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-CHCCkDzJ.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CHCCkDzJ.js.gz +0 -0
- package/dist/client/assets/{sparkles-BMR6NziM.js → sparkles-CbQl9qpO.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-DycNNggj.js → stateDiagram-D77RDMKH-BsAiJFKS.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-BsAiJFKS.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-BsAiJFKS.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-joTNV3tX.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-2Z5Zd5j6.js → swimlanes-42K2YHIH-9JFTgCXC.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-9JFTgCXC.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-9JFTgCXC.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-C-2Ixi86.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-BHiRARcP.js → timeline-definition-24CTP7MA-tkuoWWzM.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-tkuoWWzM.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-tkuoWWzM.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-TsfoVQJR.js → triangle-alert-DTiOfHLO.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-JgKZ8N2y.js → vennDiagram-4TSXK5OY-CEnwO3RG.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-CEnwO3RG.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-CEnwO3RG.js.gz +0 -0
- package/dist/client/assets/{videoCompression-DGfMcwdq.js → videoCompression-q9AAJQ5R.js} +1 -1
- package/dist/client/assets/videoCompression-q9AAJQ5R.js.br +0 -0
- package/dist/client/assets/videoCompression-q9AAJQ5R.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DNmP9dmD.js → wardleyDiagram-VM6X3IG4-BFLZVXWw.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BFLZVXWw.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-BFLZVXWw.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-BBFR9gmo.js → xychartDiagram-S5SC5T6Z-CyZtg8vv.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CyZtg8vv.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CyZtg8vv.js.gz +0 -0
- package/dist/client/fonts/MapleMono-Bold.woff2 +0 -0
- package/dist/client/fonts/MapleMono-BoldItalic.woff2 +0 -0
- package/dist/client/fonts/MapleMono-Italic.woff2 +0 -0
- package/dist/client/fonts/MapleMono-OFL.txt +94 -0
- package/dist/client/fonts/MapleMono-OFL.txt.br +0 -0
- package/dist/client/fonts/MapleMono-OFL.txt.gz +0 -0
- package/dist/client/fonts/MapleMono-Regular.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-Bold-ascii-71449796b4f8.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-Bold-text-57c71f86a6f8.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-BoldItalic-ascii-6b6deb59a8cd.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-BoldItalic-text-b2e1a12c67be.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-Italic-ascii-cd2f6088ed50.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-Italic-text-a346c77141da.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-Regular-ascii-9a80fd4a5743.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockMaple-Regular-text-58438803bf4c.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockPromptIcons-Bold-icons-fa87935d39d0.woff2 +0 -0
- package/dist/client/fonts/terminal/TermdockPromptIcons-Regular-icons-0d64d12759b8.woff2 +0 -0
- package/dist/client/fonts/terminal/manifest.json +98 -0
- package/dist/client/fonts/terminal/manifest.json.br +0 -0
- package/dist/client/fonts/terminal/manifest.json.gz +0 -0
- package/dist/client/index.html +12 -11
- 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/collaborationPeerTransport.js +2 -2
- package/dist/server/entry.js +2 -1
- package/dist/server/federation/selfRelay.js +12 -8
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/scripts/generate-font-subsets.py +64 -9
- package/dist/client/assets/App-xBkso5In.js.br +0 -0
- package/dist/client/assets/App-xBkso5In.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-DNY0prqs.js +0 -9
- package/dist/client/assets/ArchitecturePanel-DNY0prqs.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-DNY0prqs.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-xvUzbgKh.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-xvUzbgKh.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-DsIWXeh0.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-DatXl2k_.js +0 -2
- package/dist/client/assets/ComputerControlView-D-1UEmtr.js.br +0 -0
- package/dist/client/assets/ComputerControlView-D-1UEmtr.js.gz +0 -0
- package/dist/client/assets/DagPlayground-1KaifMRo.js.br +0 -0
- package/dist/client/assets/DagPlayground-1KaifMRo.js.gz +0 -0
- package/dist/client/assets/DiffLab-Dh7lMk1W.js.br +0 -0
- package/dist/client/assets/DiffLab-Dh7lMk1W.js.gz +0 -0
- package/dist/client/assets/DiffReview-Bxe6OacV.js.br +0 -0
- package/dist/client/assets/DiffReview-Bxe6OacV.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CwdLf6kM.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CwdLf6kM.js.gz +0 -0
- package/dist/client/assets/DiffViewer-oGb-V3AK.js.br +0 -0
- package/dist/client/assets/DiffViewer-oGb-V3AK.js.gz +0 -0
- package/dist/client/assets/ModelPreview-BTunplWr.js.br +0 -0
- package/dist/client/assets/ModelPreview-BTunplWr.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DvYmab8z.js +0 -1677
- package/dist/client/assets/RightSidebar-DvYmab8z.js.br +0 -0
- package/dist/client/assets/RightSidebar-DvYmab8z.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-D4LxQjpJ.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-D4LxQjpJ.js.gz +0 -0
- package/dist/client/assets/app-A96wp9Xv.js +0 -35
- package/dist/client/assets/app-A96wp9Xv.js.br +0 -0
- package/dist/client/assets/app-A96wp9Xv.js.gz +0 -0
- package/dist/client/assets/arc-BcCf73Fm.js.br +0 -0
- package/dist/client/assets/arc-BcCf73Fm.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Dfg95GK6.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Dfg95GK6.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BwXSp0xK.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BwXSp0xK.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-D4GfUedH.js.gz +0 -0
- package/dist/client/assets/channel-k5dcS0_z.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-B-r7e040.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-B-r7e040.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-B83oWEy_.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-B83oWEy_.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-C5OgXymb.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-C5OgXymb.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-B1LlRwu4.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-B1LlRwu4.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DQzBzWJL.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DQzBzWJL.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-DNBCyqkI.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-DNBCyqkI.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CaRucQy9.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CaRucQy9.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-kU4wdq9U.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-kU4wdq9U.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BvDFZeQg.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BvDFZeQg.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DYTly1n3.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DYTly1n3.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-C0bMSg7N.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-C0bMSg7N.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C9_Uoa7n.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C9_Uoa7n.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CLsF0k3J.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CLsF0k3J.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt6b2Ygi.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt6b2Ygi.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bs5jB7E2.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-Bs5jB7E2.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BCSeo8DJ.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BCSeo8DJ.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BnCBe-Ue.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BnCBe-Ue.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-W1Lo4NZw.js.br +0 -0
- package/dist/client/assets/gestureArbiter-W1Lo4NZw.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C7BJXlkD.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C7BJXlkD.js.gz +0 -0
- package/dist/client/assets/index-e1PkqIqN.css +0 -1
- package/dist/client/assets/index-e1PkqIqN.css.br +0 -0
- package/dist/client/assets/index-e1PkqIqN.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BoBCZ1Wa.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-C5bywqIt.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-C5bywqIt.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-ChHpoQyu.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-ChHpoQyu.js.gz +0 -0
- package/dist/client/assets/layout-e7M-xuok.js.br +0 -0
- package/dist/client/assets/layout-e7M-xuok.js.gz +0 -0
- package/dist/client/assets/linear-A5CrihlL.js.gz +0 -0
- package/dist/client/assets/mermaid.core-BNac_Y3z.js.br +0 -0
- package/dist/client/assets/mermaid.core-BNac_Y3z.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-fQoEGcCr.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-fQoEGcCr.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap--0YoOXsx.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CYbfla8A.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-CYbfla8A.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B6--ZKXC.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-B6--ZKXC.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bau_h7Jl.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-Bau_h7Jl.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CApEuiEL.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CApEuiEL.js.gz +0 -0
- package/dist/client/assets/rdpSession-CydBq1bk.js.br +0 -0
- package/dist/client/assets/rdpSession-CydBq1bk.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-8ExgTbB3.js.br +0 -0
- package/dist/client/assets/referenceLongPress-8ExgTbB3.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Rxe80d7j.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-Rxe80d7j.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BaPl8d6E.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BaPl8d6E.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Asyx5gWK.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Asyx5gWK.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BQaSglof.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BQaSglof.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DycNNggj.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DycNNggj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CS1AgP_n.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-2Z5Zd5j6.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-2Z5Zd5j6.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Cxqp7K9j.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-BHiRARcP.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BHiRARcP.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-JgKZ8N2y.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-JgKZ8N2y.js.gz +0 -0
- package/dist/client/assets/videoCompression-DGfMcwdq.js.br +0 -0
- package/dist/client/assets/videoCompression-DGfMcwdq.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DNmP9dmD.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-DNmP9dmD.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBFR9gmo.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-BBFR9gmo.js.gz +0 -0
|
Binary file
|
package/dist/client/index.html
CHANGED
|
@@ -230,24 +230,25 @@
|
|
|
230
230
|
<title>Termdock</title>
|
|
231
231
|
|
|
232
232
|
<!-- Preload the faces commonly present in the first terminal viewport.
|
|
233
|
-
|
|
233
|
+
Preload text and compact prompt icons; other CJK/Nerd ranges load on demand.
|
|
234
234
|
Text faces must settle before xterm opens; loading a bold face afterward
|
|
235
235
|
makes the DOM renderer temporarily rebuild every visible row. -->
|
|
236
|
-
<link rel="preload" href="/fonts/terminal/
|
|
237
|
-
<link rel="preload" href="/fonts/terminal/
|
|
236
|
+
<link rel="preload" href="/fonts/terminal/TermdockMaple-Regular-ascii-9a80fd4a5743.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
237
|
+
<link rel="preload" href="/fonts/terminal/TermdockMaple-Bold-ascii-71449796b4f8.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
238
|
+
<link rel="preload" href="/fonts/terminal/TermdockPromptIcons-Regular-icons-0d64d12759b8.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
239
|
+
<link rel="preload" href="/fonts/terminal/TermdockPromptIcons-Bold-icons-fa87935d39d0.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
238
240
|
<link rel="preload" href="/fonts/TermdockStarSymbol-Subset.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
239
241
|
<link rel="preload" href="/fonts/NotoSansSymbols2-Subset.woff2" as="font" type="font/woff2" crossorigin="anonymous">
|
|
240
242
|
|
|
241
243
|
<!-- Self-hosted terminal fonts.
|
|
242
244
|
统一原则:每个 @font-face 都用 unicode-range 限定字符集,浏览器只在
|
|
243
245
|
实际渲染到该区间时才下载,做到 "全字符覆盖 + 不浪费带宽"。
|
|
244
|
-
|
|
245
|
-
|
|
246
|
+
字体链通过 :root 上的 --font-terminal / --font-mono 读取,
|
|
247
|
+
单一来源见 src/index.css。 -->
|
|
246
248
|
<style>
|
|
247
|
-
/*
|
|
248
|
-
Mono NL
|
|
249
|
-
|
|
250
|
-
fallback/tofu 跳到完整图标。 */
|
|
249
|
+
/* Termdock Maple is the primary terminal face. The original JetBrains
|
|
250
|
+
Mono NL Nerd Font Mono remains the UI / Nerd Font / Powerline fallback.
|
|
251
|
+
Their generated unicode-range faces live in terminal/fontFaces.css. */
|
|
251
252
|
/* Termdock Star Symbol —— 从 Menlo Regular 抽取 U+2726/U+2727
|
|
252
253
|
(✦/✧) 的子集。Menlo 是 macOS 上这两个符号与等宽文本视觉大小
|
|
253
254
|
最接近的系统字形,避免手机端走系统符号 fallback 后偏大。
|
|
@@ -289,11 +290,11 @@
|
|
|
289
290
|
里为空,不声明,避免无谓的字体回退查找。
|
|
290
291
|
Regular + Bold 两种变体自托管,替代 xterm 合成 bold CJK。 */
|
|
291
292
|
</style>
|
|
292
|
-
<script type="module" crossorigin src="/assets/app-
|
|
293
|
+
<script type="module" crossorigin src="/assets/app-D-AilvVY.js"></script>
|
|
293
294
|
<link rel="modulepreload" crossorigin href="/assets/react-XDCjal2T.js">
|
|
294
295
|
<link rel="modulepreload" crossorigin href="/assets/dnd-BCFAPC0L.js">
|
|
295
296
|
<link rel="modulepreload" crossorigin href="/assets/terminal-C7X98Amf.js">
|
|
296
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
297
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CRxcDATF.css">
|
|
297
298
|
<link rel="manifest" href="/manifest.webmanifest"></head>
|
|
298
299
|
<body>
|
|
299
300
|
<div id="termdock-startup" class="termdock-boot z-modal-panel">
|
|
Binary file
|
|
Binary file
|
package/dist/client/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),d={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"
|
|
1
|
+
if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,a)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let c={};const r=e=>n(e,o),d={module:{uri:o},exports:c,require:r};s[o]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(a(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"e861e4f0fa06e0ad9bb72cc43ebf650e"},{url:"assets/app-D-AilvVY.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-CRxcDATF.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"boot-logo.png",revision:"2e3a25efd9b0b8ca1eab53b5f2284556"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"ipad-status-bar.js",revision:"3a8080edb8a5cc658a7908f6ad69537f"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
|
package/dist/client/sw.js.br
CHANGED
|
Binary file
|
package/dist/client/sw.js.gz
CHANGED
|
Binary file
|
|
@@ -123,9 +123,9 @@ export class CollaborationRpc {
|
|
|
123
123
|
this.pending.clear();
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
export async function connectCollaborationRpc(identity, peer, endpoint, receive) {
|
|
126
|
+
export async function connectCollaborationRpc(identity, peer, endpoint, receive, configuredCa) {
|
|
127
127
|
validateCollaborationNode(peer);
|
|
128
|
-
const ca = peer.caFingerprint256 ? await readPinnedCertificateAuthority(peer.origin, peer.caFingerprint256) :
|
|
128
|
+
const ca = peer.caFingerprint256 ? await readPinnedCertificateAuthority(peer.origin, peer.caFingerprint256) : configuredCa;
|
|
129
129
|
const url = endpoint ?? `${peer.origin.replace(/^https:/, 'wss:')}/api/federation/secure`;
|
|
130
130
|
const socket = new WebSocket(url, { ca, rejectUnauthorized: true, followRedirects: false, handshakeTimeout: 3000, maxPayload: 1024 * 1024 });
|
|
131
131
|
const relay = endpoint ? relayDuplex(socket, peer.serviceId) : undefined;
|
package/dist/server/entry.js
CHANGED
|
@@ -677,7 +677,8 @@ export function startServer(options = {}) {
|
|
|
677
677
|
const localHostname = ['0.0.0.0', '::'].includes(host) ? 'localhost' : host;
|
|
678
678
|
const localAuthority = localHostname.includes(':') && !localHostname.startsWith('[') ? `[${localHostname}]` : localHostname;
|
|
679
679
|
const selfRelay = new DesktopSelfRelay({
|
|
680
|
-
desktopFile: path.join(homedir(), '.termdock', 'desktop.json'),
|
|
680
|
+
desktopFile: path.join(homedir(), '.termdock', 'desktop.json'),
|
|
681
|
+
targets: () => routeAccess.configuredDirectTargets(), baseDir: path.join(homedir(), '.termdock', 'federation'), identity: runtime.identity, serviceId: runtime.serviceId,
|
|
681
682
|
localOrigin: `${scheme}://${localAuthority}:${port}`, ...(localCa ? { localCa } : {}),
|
|
682
683
|
});
|
|
683
684
|
selfRelay.start();
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import WebSocket from 'ws';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
2
4
|
import { desktopDirectTargets } from './desktopTargets.js';
|
|
3
5
|
import { RelayClient } from './relay.js';
|
|
4
6
|
import { readPinnedCertificateAuthority } from './trustedCa.js';
|
|
@@ -57,8 +59,8 @@ function waitForReady(socket) {
|
|
|
57
59
|
}
|
|
58
60
|
/**
|
|
59
61
|
* A local Termdock service may publish only its own stable identity to other
|
|
60
|
-
* services pinned by the same Desktop
|
|
61
|
-
* and
|
|
62
|
+
* administrator-configured peers or services pinned by the same Desktop
|
|
63
|
+
* installation. Configuration supplies addresses and TLS trust only; the service proves itself with its own Noise identity and
|
|
62
64
|
* no browser/device authorization is copied into this process.
|
|
63
65
|
*/
|
|
64
66
|
export class DesktopSelfRelay {
|
|
@@ -89,11 +91,12 @@ export class DesktopSelfRelay {
|
|
|
89
91
|
refresh() {
|
|
90
92
|
if (this.stopped)
|
|
91
93
|
return;
|
|
92
|
-
const desired = new Map(desktopDirectTargets(this.options.desktopFile, this.options.serviceId)
|
|
93
|
-
.
|
|
94
|
+
const desired = new Map([...desktopDirectTargets(this.options.desktopFile, this.options.serviceId), ...(this.options.targets?.() || [])]
|
|
95
|
+
.filter(target => target.serviceId !== this.options.serviceId)
|
|
96
|
+
.map(target => [target.serviceId, { ...target, url: new URL(target.url.replace(/^wss:/, 'https:')).origin }]));
|
|
94
97
|
for (const [serviceId, state] of this.states) {
|
|
95
98
|
const target = desired.get(serviceId);
|
|
96
|
-
const signature = target && JSON.stringify([target.url, target.caFingerprint256]);
|
|
99
|
+
const signature = target && JSON.stringify([target.url, target.caFingerprint256, target.caPath]);
|
|
97
100
|
if (!target || signature !== state.signature) {
|
|
98
101
|
this.stopState(state);
|
|
99
102
|
this.states.delete(serviceId);
|
|
@@ -101,7 +104,7 @@ export class DesktopSelfRelay {
|
|
|
101
104
|
}
|
|
102
105
|
for (const [serviceId, target] of desired)
|
|
103
106
|
if (!this.states.has(serviceId)) {
|
|
104
|
-
const state = { signature: JSON.stringify([target.url, target.caFingerprint256]), stopped: false };
|
|
107
|
+
const state = { signature: JSON.stringify([target.url, target.caFingerprint256, target.caPath]), stopped: false };
|
|
105
108
|
this.states.set(serviceId, state);
|
|
106
109
|
void this.run(state, target);
|
|
107
110
|
}
|
|
@@ -137,7 +140,8 @@ export class DesktopSelfRelay {
|
|
|
137
140
|
}
|
|
138
141
|
async connect(state, target) {
|
|
139
142
|
const peer = { serviceId: target.serviceId, origin: target.url, ...(target.caFingerprint256 ? { caFingerprint256: target.caFingerprint256 } : {}) };
|
|
140
|
-
const
|
|
143
|
+
const configuredCa = target.caPath ? readFileSync(resolve(this.options.baseDir || process.cwd(), target.caPath)) : undefined;
|
|
144
|
+
const rpc = await connectCollaborationRpc(this.options.identity, peer, undefined, undefined, configuredCa);
|
|
141
145
|
let selfRelayToken;
|
|
142
146
|
try {
|
|
143
147
|
const result = await rpc.request({ type: 'self-relay-ticket' });
|
|
@@ -151,7 +155,7 @@ export class DesktopSelfRelay {
|
|
|
151
155
|
}
|
|
152
156
|
if (this.stopped || state.stopped)
|
|
153
157
|
return;
|
|
154
|
-
const ca = target.caFingerprint256 ? await readPinnedCertificateAuthority(target.url, target.caFingerprint256) :
|
|
158
|
+
const ca = target.caFingerprint256 ? await readPinnedCertificateAuthority(target.url, target.caFingerprint256) : configuredCa;
|
|
155
159
|
const upstream = await openSocket(relayEndpoint(target.url, selfRelayToken), ca);
|
|
156
160
|
state.upstream = upstream;
|
|
157
161
|
try {
|
package/package.json
CHANGED
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.332",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-oaGYi/P5ob8sd6VnNBOwshKozjhdV+hYiCmLAsn5x00=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-lmN7Or7gUKZy9ehDwSJ+vAJQSDcbNpEVqSGxxotR2c4=",
|
|
10
|
+
"clientBundleHash": "sha256-tvY+AzsMFBHQkZySF87ojAlWXBRrkv6IZIUGHJyllaI=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
@@ -7,6 +7,7 @@ Keep cmap coverage and advance widths exactly equal to the source faces.
|
|
|
7
7
|
"""
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
import argparse
|
|
10
11
|
import hashlib
|
|
11
12
|
import io
|
|
12
13
|
import json
|
|
@@ -18,6 +19,12 @@ from fontTools.ttLib import TTFont
|
|
|
18
19
|
ROOT = Path(__file__).resolve().parents[1]
|
|
19
20
|
FONTS = ROOT / "public/fonts"
|
|
20
21
|
OUTPUT = FONTS / "terminal"
|
|
22
|
+
FAMILY_SOURCES = [
|
|
23
|
+
("Termdock Prompt Icons", [f"JetBrainsMonoNLNerdFontMono-{w}" for w in ["Regular", "Bold"]]),
|
|
24
|
+
("Termdock Maple", [f"MapleMono-{w}" for w in ["Regular", "Bold", "Italic", "BoldItalic"]]),
|
|
25
|
+
("Termdock Mono", [f"JetBrainsMonoNLNerdFontMono-{w}" for w in ["Regular", "Bold", "Italic", "BoldItalic"]]),
|
|
26
|
+
("Noto Sans Mono CJK SC", ["NotoSansMonoCJKsc-Subset", "NotoSansMonoCJKsc-Bold-Subset"]),
|
|
27
|
+
]
|
|
21
28
|
|
|
22
29
|
|
|
23
30
|
def ranges(points: list[int]) -> str:
|
|
@@ -30,22 +37,44 @@ def ranges(points: list[int]) -> str:
|
|
|
30
37
|
return ",".join(f"U+{a:X}" if a == b else f"U+{a:X}-{b:X}" for a, b in spans)
|
|
31
38
|
|
|
32
39
|
|
|
33
|
-
def main() -> None:
|
|
40
|
+
def main(families: list[str] | None = None) -> None:
|
|
34
41
|
OUTPUT.mkdir(exist_ok=True)
|
|
35
42
|
css: list[str] = ["/* Generated by scripts/generate-font-subsets.py; do not edit. */"]
|
|
36
43
|
manifest: dict[str, object] = {"schemaVersion": 1, "faces": []}
|
|
37
44
|
expected: set[str] = set()
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
(
|
|
41
|
-
|
|
45
|
+
if families:
|
|
46
|
+
previous = json.loads((OUTPUT / "manifest.json").read_text())
|
|
47
|
+
def stored_family(face: dict) -> str:
|
|
48
|
+
return face.get("family") or ("Termdock Maple" if face["source"].startswith("MapleMono-")
|
|
49
|
+
else "Termdock Mono" if face["source"].startswith("JetBrainsMono")
|
|
50
|
+
else "Noto Sans Mono CJK SC")
|
|
51
|
+
manifest["faces"] = [face for face in previous["faces"] if stored_family(face) not in families]
|
|
52
|
+
expected.update(shard["file"] for face in manifest["faces"] for shard in face["shards"])
|
|
53
|
+
replaced_families = set(families)
|
|
54
|
+
if "Termdock Maple" in replaced_families:
|
|
55
|
+
replaced_families.add("Maple Mono")
|
|
56
|
+
css.extend(line for line in (ROOT / "src/lib/terminal/fontFaces.css").read_text().splitlines()
|
|
57
|
+
if line.startswith("@font-face") and not any(f'font-family:"{family}";' in line for family in replaced_families))
|
|
58
|
+
for family, stems in FAMILY_SOURCES:
|
|
59
|
+
if families and family not in families:
|
|
60
|
+
continue
|
|
42
61
|
for stem in stems:
|
|
43
62
|
source = FONTS / f"{stem}.woff2"
|
|
44
63
|
original = TTFont(source)
|
|
45
64
|
cmap = original.getBestCmap()
|
|
65
|
+
if family == "Termdock Prompt Icons":
|
|
66
|
+
spec = json.loads((ROOT / "tools/font/terminal-prompt-icons.json").read_text())
|
|
67
|
+
selected = {int(point, 16) for point in spec["codepoints"]}
|
|
68
|
+
for start, end in spec["ranges"]:
|
|
69
|
+
selected.update(range(int(start, 16), int(end, 16) + 1))
|
|
70
|
+
cmap = {cp: glyph for cp, glyph in cmap.items() if cp in selected}
|
|
46
71
|
groups: dict[str, list[int]] = {}
|
|
47
72
|
for cp in sorted(cmap):
|
|
48
|
-
if family == "Termdock
|
|
73
|
+
if family == "Termdock Prompt Icons":
|
|
74
|
+
key = "icons"
|
|
75
|
+
elif family == "Termdock Maple":
|
|
76
|
+
key = "ascii" if cp == 0xD or 0x20 <= cp <= 0x7E else "text"
|
|
77
|
+
elif family == "Termdock Mono":
|
|
49
78
|
key = f"icons-{cp // 1024:x}" if 0xE000 <= cp <= 0xF8FF or 0xF0000 <= cp <= 0x10FFFF else "text"
|
|
50
79
|
else:
|
|
51
80
|
key = f"cjk-{cp // 256:x}" if 0x3400 <= cp <= 0x9FFF else "punctuation"
|
|
@@ -58,10 +87,30 @@ def main() -> None:
|
|
|
58
87
|
subsetter = subset.Subsetter(options=options)
|
|
59
88
|
subsetter.populate(unicodes=points)
|
|
60
89
|
subsetter.subset(font)
|
|
90
|
+
if family == "Termdock Maple":
|
|
91
|
+
# Maple Mono is an OFL reserved name. Our web subsets keep
|
|
92
|
+
# its glyphs/metrics but carry their own derivative name.
|
|
93
|
+
for record in font["name"].names:
|
|
94
|
+
if record.nameID not in (1, 3, 4, 6, 16):
|
|
95
|
+
continue
|
|
96
|
+
value = record.toUnicode()
|
|
97
|
+
renamed = value.replace("Maple Mono", "Termdock Maple").replace("MapleMono", "TermdockMaple")
|
|
98
|
+
if renamed != value:
|
|
99
|
+
record.string = renamed.encode(record.getEncoding())
|
|
100
|
+
if family == "Termdock Prompt Icons":
|
|
101
|
+
suffix = "Bold" if "Bold" in stem else "Regular"
|
|
102
|
+
names = {1: family, 16: family, 3: f"TermdockPromptIcons-{suffix}",
|
|
103
|
+
4: f"{family} {suffix}", 6: f"TermdockPromptIcons-{suffix}"}
|
|
104
|
+
for record in font["name"].names:
|
|
105
|
+
if record.nameID in names:
|
|
106
|
+
record.string = names[record.nameID].encode(record.getEncoding())
|
|
61
107
|
buffer = io.BytesIO()
|
|
62
108
|
font.save(buffer)
|
|
63
109
|
body = buffer.getvalue()
|
|
64
|
-
|
|
110
|
+
output_stem = stem.replace("MapleMono", "TermdockMaple")
|
|
111
|
+
if family == "Termdock Prompt Icons":
|
|
112
|
+
output_stem = stem.replace("JetBrainsMonoNLNerdFontMono", "TermdockPromptIcons")
|
|
113
|
+
name = f"{output_stem}-{key}-{hashlib.sha256(body).hexdigest()[:12]}.woff2"
|
|
65
114
|
(OUTPUT / name).write_bytes(body)
|
|
66
115
|
expected.add(name)
|
|
67
116
|
# Verify both coverage and metrics rather than trusting the subsetter.
|
|
@@ -74,7 +123,10 @@ def main() -> None:
|
|
|
74
123
|
style = "italic" if "Italic" in stem else "normal"
|
|
75
124
|
css.append(f'@font-face{{font-family:"{family}";src:url("/fonts/terminal/{name}") format("woff2");font-weight:{weight};font-style:{style};font-display:swap;unicode-range:{ranges(points)};}}')
|
|
76
125
|
records.append({"file": name, "bytes": len(body), "codepoints": len(points), "group": key})
|
|
77
|
-
|
|
126
|
+
record = {"source": source.name, "sourceSha256": hashlib.sha256(source.read_bytes()).hexdigest(), "shards": records}
|
|
127
|
+
if family == "Termdock Prompt Icons":
|
|
128
|
+
record["family"] = family
|
|
129
|
+
manifest["faces"].append(record)
|
|
78
130
|
# Delete only generated font shards; the full source font pack is untouched.
|
|
79
131
|
for old in OUTPUT.glob("*.woff2"):
|
|
80
132
|
if old.name not in expected:
|
|
@@ -85,4 +137,7 @@ def main() -> None:
|
|
|
85
137
|
|
|
86
138
|
|
|
87
139
|
if __name__ == "__main__":
|
|
88
|
-
|
|
140
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
141
|
+
parser.add_argument("--family", action="append", choices=[family for family, _ in FAMILY_SOURCES],
|
|
142
|
+
help="Regenerate only this family, retaining other existing shards and manifest entries.")
|
|
143
|
+
main(parser.parse_args().family)
|
|
Binary file
|
|
Binary file
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RightSidebar-DvYmab8z.js","assets/app-A96wp9Xv.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-e1PkqIqN.css","assets/App-xBkso5In.js","assets/gestureArbiter-W1Lo4NZw.js","assets/gestureArbiter-C2J0D0kV.css","assets/triangle-alert-TsfoVQJR.js","assets/referenceLongPress-8ExgTbB3.js","assets/DiffReview-Bxe6OacV.js","assets/sparkles-BMR6NziM.js","assets/DiffViewer-oGb-V3AK.js","assets/DiffViewer-T3uj2-aP.css","assets/ChangeWalkthroughPanel-xvUzbgKh.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-A96wp9Xv.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-xBkso5In.js";import{L as Gt}from"./DiffViewer-oGb-V3AK.js";import er from"./purify.es-4eNOHKSq.js";import{l as tr,i as rr,S as sr}from"./RightSidebar-DvYmab8z.js";import{L as nr}from"./triangle-alert-TsfoVQJR.js";import{S as St}from"./sparkles-BMR6NziM.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-W1Lo4NZw.js";import"./referenceLongPress-8ExgTbB3.js";import"./DiffReview-Bxe6OacV.js";import"./ChangeWalkthroughPanel-xvUzbgKh.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-DvYmab8z.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
|
-
`)),[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
|
-
`):`${b.trim()}
|
|
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(`
|
|
6
|
-
`)),ce()}})]}),e.jsxs("form",{ref:M,tabIndex:-1,className:`min-w-0 space-y-2.5 rounded-xl border border-border/20 bg-surface-2 p-3 ${xe?"max-h-full overflow-y-auto overscroll-contain":""}`,onSubmit:D=>{if(D.preventDefault(),!se||Q||!n||!M.current)return;const X=++V.current,q=M.current;q.focus({preventScroll:!0}),T(!0),U(null),Promise.resolve().then(()=>X===V.current&&q.isConnected?x(O,q):!1).then(Ce=>{X===V.current&&(Ce===!0?(g(a??qe(se),se),U("inserted")):U("insertFailed"))}).catch(()=>{X===V.current&&U("insertFailed")}).finally(()=>{X===V.current&&T(!1)})},children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("h2",{className:"text-sm font-medium",children:c(a?"architecture.updateAnalysis":"architecture.prepare")}),e.jsx("button",{type:"button",className:`${le} px-2`,"aria-label":c("architecture.closePreparation"),onClick:u,children:e.jsx(Se,{size:16})})]}),e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${N}-kind`,children:[e.jsx("span",{children:c("architecture.analysisRange")}),e.jsxs("select",{id:`${N}-kind`,className:W,value:E,disabled:!!a,onChange:D=>{z(D.target.value),ce()},children:[e.jsx("option",{value:"project",children:c("architecture.projectRange")}),e.jsx("option",{value:"module",children:c("architecture.moduleRange")}),e.jsx("option",{value:"feature",children:c("architecture.featureRange")})]})]}),E==="feature"&&e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${N}-target`,children:[e.jsx("span",{children:c("architecture.featureTarget")}),e.jsx("input",{id:`${N}-target`,className:W,value:$,readOnly:!!a,maxLength:1e3,placeholder:c("architecture.featurePlaceholder"),onChange:D=>{l(D.target.value),ce()},"aria-describedby":`${N}-validation`})]}),E!=="project"&&e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"block text-xs",htmlFor:`${N}-paths`,children:c(E==="module"?"architecture.modulePaths":"architecture.startPaths")}),e.jsx("textarea",{id:`${N}-paths`,className:`${W} resize-y font-mono text-xs`,rows:2,value:b,readOnly:!!a,placeholder:c("architecture.modulePlaceholder"),onChange:D=>{h(D.target.value),ce()},onBlur:()=>{!a&&_&&h(_.join(`
|
|
7
|
-
`))},onPaste:D=>{if(a)return;const X=ht(D.clipboardData.getData("text/plain"),r);if(!X?.length||!_)return;const q=[...new Set([..._,...X])];q.length>20||(D.preventDefault(),h(q.join(`
|
|
8
|
-
`)),ce())},"aria-describedby":`${N}-paths-hint ${N}-validation`}),!a&&e.jsxs("div",{className:"flex flex-wrap gap-1",children:[!xe&&e.jsxs("button",{type:"button",className:`${Y} text-primary`,"aria-label":c("architecture.choosePaths"),onClick:()=>fe(!0),children:[e.jsx(Yt,{size:14}),c("architecture.browsePaths")]}),ie&&e.jsx("button",{type:"button",className:Y,disabled:!!_?.includes(ie)||(_?.length??0)>=20,title:ie,onClick:()=>ue(ie),children:c("architecture.useCurrentDirectory")}),ee&&e.jsx("button",{type:"button",className:Y,disabled:!!_?.includes(ee)||(_?.length??0)>=20,title:ee,onClick:()=>ue(ee),children:c("architecture.useCurrentFile")})]}),e.jsx("p",{id:`${N}-paths-hint`,className:"text-xs leading-relaxed text-muted-foreground",title:r,children:c("architecture.pathsHint")})]}),!v&&(b.trim()||$.trim())&&e.jsx("p",{id:`${N}-validation`,role:"alert",className:"text-xs text-muted-foreground",children:c(E==="module"?"architecture.invalidPaths":"architecture.requiredFeature")}),e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${N}-focus`,children:[e.jsx("span",{children:c("architecture.focus")}),e.jsx("textarea",{id:`${N}-focus`,className:`${W} resize-y`,rows:2,maxLength:2e3,value:f,placeholder:c("architecture.focusPlaceholder"),onChange:D=>{H(D.target.value),ce()}})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{type:"submit",disabled:!v||Q,className:`${le} bg-primary/15 text-primary`,children:c(Q?"architecture.inserting":"architecture.insertPrompt")}),e.jsxs("button",{type:"button",disabled:!v||Q,className:le,onClick:()=>{if(!se)return;const D=++V.current;Promise.resolve().then(()=>navigator.clipboard.writeText(O)).then(()=>{D===V.current&&(g(a??qe(se),se),U("copied"))}).catch(()=>{D===V.current&&U("failed")})},children:[e.jsx(Ft,{size:14}),c("architecture.copyPrompt")]})]}),P&&e.jsx("p",{role:"status",className:"text-xs text-muted-foreground",children:c(`architecture.${P}`)}),e.jsxs("details",{children:[e.jsx("summary",{className:"cursor-pointer py-2 text-xs text-muted-foreground",children:c("architecture.analysisOptions")}),e.jsxs("div",{className:"space-y-3 pt-1",children:[e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${N}-depth`,children:[e.jsx("span",{children:c("architecture.dependencyDepth")}),e.jsxs("select",{id:`${N}-depth`,className:W,value:j,onChange:D=>{B(D.target.value),ce()},children:[e.jsx("option",{value:"boundary",children:c("architecture.boundaryDepth")}),e.jsx("option",{value:"dependencies",children:c("architecture.followDepth")})]})]}),E==="feature"&&e.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",children:c("architecture.featureScopeHint")}),e.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",children:c(a?"architecture.updateOnly":"architecture.independentHint")})]})]}),e.jsxs("details",{children:[e.jsx("summary",{className:"cursor-pointer py-2 text-xs text-muted-foreground",children:c("architecture.previewPrompt")}),e.jsx("textarea",{readOnly:!0,"aria-label":c("architecture.previewPrompt"),value:O,className:`${W} mt-2 h-52 resize-y font-mono text-xs`})]}),e.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",children:c("architecture.promptHint")})]}),n&&ne&&e.jsx(vr,{rootPath:r,initialDirectory:oe,initial:_??[],onCancel:()=>fe(!1),onConfirm:D=>{h(D.join(`
|
|
9
|
-
`)),fe(!1),ce()}})]})}function wr({node:r,view:o,parentId:a,onSelect:d,onExplore:p,onAnalyze:n,onOpenFile:x,onClose:g,document:u,rootPath:c,onEdit:F,onReference:M,embedded:k=!1}){const{t:C,locale:R}=he(),N=[...r.references??[],...u?.perspectives.flatMap(l=>l.nodes.filter(b=>b.references?.some(h=>h.perspective===o.id&&(!h.node||h.node===r.id))).map(b=>({perspective:l.id,node:b.id})))??[]],E=nt(o,a),z=E.edges.filter(l=>l.from===r.id||l.to===r.id),$="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg px-3 text-xs font-medium transition hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring";return e.jsxs("section",{className:k?"space-y-3":"space-y-3 rounded-xl border border-primary/30 bg-surface-2 p-3","aria-label":r.title,children:[!k&&e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("h3",{className:"pt-2 text-sm font-semibold",children:r.title}),e.jsx("button",{type:"button",className:`${$} shrink-0 px-2`,"aria-label":C("architecture.closeDetail"),onClick:g,children:e.jsx(Se,{size:16})})]}),e.jsxs(e.Fragment,{children:[!r.description&&e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed",children:r.summary}),e.jsx(st,{value:r,rootPath:c,onEdit:F,onOpenFile:x})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[o.nodes.some(l=>l.parentId===r.id)&&e.jsxs("button",{type:"button",className:`${$} bg-primary/15 text-primary`,onClick:p,children:[C("architecture.explore"),e.jsx(Fe,{size:14})]}),r.files.length>0&&e.jsxs("button",{type:"button",className:`${$} text-primary`,onClick:n,children:[e.jsx(St,{size:14}),C("architecture.analyzeModule")]})]}),N.length>0&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs font-semibold text-muted-foreground",children:R==="zh"?"跨视角引用":"Cross-perspective references"}),N.map((l,b)=>e.jsxs("button",{type:"button","aria-label":`${R==="zh"?"打开引用":"Open reference"}: ${u?.perspectives.find(h=>h.id===l.perspective)?.nodes.find(h=>h.id===l.node)?.title??u?.perspectives.find(h=>h.id===l.perspective)?.title??l.perspective}`,className:`${$} block w-full text-left text-primary`,onClick:()=>M?.(l),children:[u?.perspectives.find(h=>h.id===l.perspective)?.nodes.find(h=>h.id===l.node)?.title??u?.perspectives.find(h=>h.id===l.perspective)?.title??l.perspective,e.jsx(Fe,{size:14})]},b))]}),z.length>0&&e.jsxs("div",{children:[e.jsx("h4",{className:"mb-1 text-xs font-semibold text-muted-foreground",children:C("architecture.connections")}),e.jsx("div",{className:"space-y-1",children:z.map((l,b)=>{const h=l.from===r.id,j=E.nodes.find(B=>B.id===(h?l.to:l.from));return j?e.jsxs("button",{type:"button",className:"flex min-h-11 w-full items-center gap-2 rounded-lg bg-surface px-3 py-2 text-left text-xs hover:bg-surface-elevated",onClick:()=>d(j.id),"aria-label":`${C(h?"architecture.outgoing":"architecture.incoming")}: ${j.title} · ${l.label}`,children:[h?e.jsx(Lt,{size:15,className:"shrink-0 text-primary"}):e.jsx(ar,{size:15,className:"shrink-0 text-muted-foreground"}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block font-medium",children:j.title}),e.jsxs("span",{className:"mt-0.5 block break-words text-muted-foreground",children:[C(h?"architecture.outgoing":"architecture.incoming")," · ",l.label]})]}),e.jsx(Fe,{size:14,className:"shrink-0"})]},`${l.from}:${l.to}:${b}`):null})})]}),r.files.length>0&&e.jsxs("details",{open:r.files.length<=4,children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs font-semibold text-muted-foreground",children:[C("architecture.sourceFiles")," (",r.files.length,")"]}),r.files.map(l=>e.jsxs("button",{type:"button",className:"block min-h-11 w-full break-all rounded-lg px-2 py-2 text-left font-mono text-xs text-primary hover:bg-surface-elevated",onClick:()=>x(l),children:[l.path,l.line?`:${l.line}`:""]},`${l.path}:${l.line??""}`))]})]})}function pt({title:r,stageKey:o,source:a=!1,fullHeight:d=!1,inGraph:p=!1,docked:n=!1,side:x=!1,active:g=!0,onBack:u,backLabel:c,onClose:F,onDismiss:M,onCollapse:k,children:C}){const{t:R}=he(),N=s.useRef(null),E=s.useRef(null),z=s.useRef(new Map);We(N,g&&!p&&(!n||d),M),s.useLayoutEffect(()=>{E.current&&(E.current.scrollTop=z.current.get(o)??0),g&&N.current?.querySelector("button:not(:disabled)")?.focus({preventScroll:!0})},[o,g]);const $=n?d?"relative h-full w-full flex-1":x?"relative h-full w-[22rem] max-w-[40%] shrink-0":"relative h-[48%] max-h-96 w-full shrink-0":p?`${a||d?"inset-0":"inset-x-0 bottom-0 max-h-[48%]"} min-[768px]:inset-y-0 min-[768px]:left-auto min-[768px]:right-0 min-[768px]:max-h-none ${a||d?"min-[768px]:w-[min(50vw,40rem)]":"min-[768px]:w-[22rem]"}`:x?"inset-y-0 right-0 w-[22rem] max-w-full":"inset-0",l="inline-flex min-h-11 shrink-0 items-center justify-center gap-1.5 rounded-lg px-2 text-xs text-primary hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring",b=()=>{E.current&&z.current.set(o,E.current.scrollTop)};return e.jsxs("aside",{ref:N,tabIndex:-1,role:p||n&&!d?void 0:"dialog","aria-modal":p?void 0:!1,"aria-label":r,"data-architecture-inspector":!0,"data-sidebar-gesture-ignore":!0,onClickCapture:b,className:`${n?"":"absolute"} z-20 flex min-h-0 flex-col overflow-hidden border border-border/30 bg-surface ${n?"":"shadow-xl"} ${$}`,children:[e.jsxs("header",{className:"flex shrink-0 items-center gap-2 border-b border-border/15 px-2 py-1",children:[e.jsxs("button",{type:"button",className:l,"aria-label":u?c:R("architecture.closeDetail"),onClick:u??F,children:[e.jsx(Pt,{size:17}),e.jsx("span",{children:u?c:R("architecture.backToMap")})]}),e.jsx("h2",{className:"min-w-0 flex-1 truncate text-sm font-semibold",title:r,children:r}),k&&e.jsx("button",{type:"button",className:l,"aria-label":R("architecture.collapseDetail"),onClick:k,children:e.jsx(jt,{size:17})}),u&&e.jsx("button",{type:"button",className:l,"aria-label":R("architecture.closeDetail"),onClick:F,children:e.jsx(Se,{size:17})})]}),e.jsx("div",{ref:E,onScroll:b,className:`min-h-0 flex-1 ${a?"overflow-hidden":"overflow-y-auto overscroll-contain p-3"}`,children:C})]})}function Nr({node:r,onExpand:o,onClose:a}){const{t:d}=he(),p=s.useRef(null),n=s.useRef(null);s.useLayoutEffect(()=>{document.activeElement!==p.current&&(n.current=document.activeElement),p.current?.focus({preventScroll:!0})},[r.id]),s.useLayoutEffect(()=>()=>{n.current?.isConnected&&n.current.focus({preventScroll:!0})},[]);const x="inline-flex min-h-11 shrink-0 items-center justify-center rounded-lg px-2 text-xs hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring";return e.jsxs("section",{ref:p,tabIndex:-1,"aria-label":r.title,"data-architecture-inspector":!0,"data-sidebar-gesture-ignore":!0,className:"shrink-0 border-t border-border/30 bg-surface px-3 pb-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"min-w-0 flex-1 truncate text-sm font-semibold",title:r.title,children:r.title}),e.jsx("button",{type:"button",className:`${x} text-primary`,onClick:o,children:d("architecture.expandDetail")}),e.jsx("button",{type:"button",className:x,"aria-label":d("architecture.closeDetail"),onClick:a,children:e.jsx(Se,{size:17})})]}),e.jsx("p",{className:"line-clamp-2 break-words text-xs leading-relaxed text-muted-foreground",children:r.summary})]})}function it(r){return`termdock.architecture.selection:${r}`}function ft(r){try{const o=r?sessionStorage.getItem(it(r)):null;return o&&Je(o)?o:pe}catch{return pe}}function bt(r){try{const o=r?sessionStorage.getItem(it(r)):null;return!!o&&Je(o)}catch{return!1}}function Ir({rootPath:r,active:o,onInsertPrompt:a,onOpenFile:d,renderSource:p}){const{t:n,locale:x}=he(),g=et(t=>t.rootPath===r?t.selectedFilePath:null),u=et(t=>t.rootPath===r?t.explorerRoot:null),[c,F]=s.useState(()=>ft(r)),[M,k]=s.useState([]),[C,R]=s.useState(!1),[N,E]=s.useState(Ee),[z,$]=s.useState(null),[l,b]=s.useState(null),[h,j]=s.useState(!0),[B,f]=s.useState(null),[H,P]=s.useState(0),[U,Q]=s.useState(!1),[T,ne]=s.useState(!1),[fe,V]=s.useState(""),[_,ee]=s.useState([]),[ie,oe]=s.useState(null),[ae,xe]=s.useState([]),[v,O]=s.useState(null),[K,le]=s.useState(null),[Y,W]=s.useState(null),[ce,ue]=s.useState(null),[se,D]=s.useState(!1),[X,q]=s.useState(!1),[Ce,Pe]=s.useState(()=>typeof window<"u"&&window.innerWidth>=768),i=s.useRef(0),S=s.useRef(bt(r)),m=s.useRef(null),A=s.useRef(null),[w,J]=s.useState(0),[be,me]=s.useState("auto"),Z=be==="auto"?w>=560?"graph":"outline":be,ve=s.useRef(null),ge=t=>{S.current=!0,F(t);try{r&&sessionStorage.setItem(it(r),t)}catch{}},Ie=()=>{$(null),ve.current?.focus({preventScroll:!0})};s.useEffect(()=>{const t=()=>Pe(window.innerWidth>=768);return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[]),s.useEffect(()=>{const t=m.current;if(!t||!o||typeof ResizeObserver>"u")return;const y=()=>{t.clientWidth>0&&J(t.clientWidth)};y();const I=new ResizeObserver(y);return I.observe(t),()=>I.disconnect()},[o]),s.useEffect(()=>{b(null),f(null),j(!0),ne(!1),V(""),ee([]),re(),$(null),F(ft(r)),k([]),R(!1),E(Ee),S.current=bt(r)},[r]),s.useEffect(()=>{b(null),f(null),j(!0),ne(!1),V(""),ee([]),re()},[c]),s.useEffect(()=>{if(!o||!r)return;let t=!1,y=null,I;const G=async Me=>{const Ye=++i.current,_e=new AbortController;y=_e,Me&&(j(!0),f(null));const Et=window.setTimeout(()=>_e.abort(),15e3);try{const[ke,Te]=await Promise.allSettled([gr(r,_e.signal,c),yr(r,_e.signal)]);if(t||i.current!==Ye)return;if(Te.status==="fulfilled"?(k(Te.value),R(!1)):R(!0),ke.status==="rejected")throw ke.reason;b(dt=>JSON.stringify(dt)===JSON.stringify(ke.value)?dt:ke.value),f(null),!ke.value&&c===pe&&!S.current&&Te.status==="fulfilled"&&Te.value.length===1&&ge(Te.value[0])}catch(ke){if(t||i.current!==Ye)return;f(ke instanceof Nt?"format":"load")}finally{window.clearTimeout(Et),!t&&i.current===Ye&&(j(!1),I=setTimeout(()=>{t||G(!1)},1e4))}};return G(!0),()=>{t=!0,++i.current,y?.abort(),clearTimeout(I)}},[r,o,H,c]);const at=JSON.stringify(r?[...new Set([`${r}/.termdock`,`${r}/.termdock/architectures`,`${r}/.omm`,...c===".omm"?l?.perspectives.flatMap(t=>[`${r}/.omm/${t.id}`,...t.nodes.flatMap(y=>y.documentPath?[`${r}/.omm/${y.documentPath}`]:[])])??[]:[]])].slice(0,128).sort():[]);s.useEffect(()=>{if(!o||!r)return;const t=new AbortController;let y;return It(JSON.parse(at),I=>{I.some(G=>G.type==="rescan-required"||G.path?.includes("/.omm/")||G.path?.includes("/.termdock/"))&&(clearTimeout(y),y=setTimeout(()=>P(G=>G+1),300))},t.signal).catch(()=>{}),()=>{t.abort(),clearTimeout(y)}},[r,o,at]);const L=l?.perspectives.find(t=>t.id===fe)??l?.perspectives[0],ze=s.useMemo(()=>l?or(l,x==="zh"?"全部视角":"All perspectives"):null,[l,x]),Ve=t=>{t==="all-perspectives"?(ne(!0),Ne([])):(ne(!1),V(t),Ne([]))},we=s.useMemo(()=>{const t=[];for(const y of _){if(!L?.nodes.some(I=>I.id===y&&I.parentId===t[t.length-1]))break;t.push(y)}return t},[_,L]),Oe=we[we.length-1],He=s.useMemo(()=>L?nt(L,Oe):null,[L,Oe]),te=L?.nodes.find(t=>t.id===ie),ye=L?.nodes.find(t=>t.id===Oe),Ct=[...new Set([pe,...M,c])],Be=l?.analysis??(c===pe||c===".omm"?Ee:N.kind==="project"?null:N),re=()=>{Q(!1),O(null),oe(null),q(!1),xe([]),le(null),W(null),ue(null)},Ae=(t,y=!1)=>{xe(I=>y&&ie?[...I,ie]:[]),q(y),Q(!1),O(null),le(null),W(null),ue(null),oe(t)},Ne=t=>{t.length&&ne(!1),ee(t),re(),A.current&&(A.current.scrollTop=0)},lt=t=>{p?(q(!0),le(t)):d(t)},zt=t=>{W({...Ee,kind:"module",paths:[...new Set(t.files.map(y=>y.path))].slice(0,20)}),ue(null)},ct=v?()=>O(null):K?()=>le(null):Y?()=>W(null):ae.length?()=>{oe(ae[ae.length-1]),xe(t=>t.slice(0,-1))}:void 0,Rt=n(K||Y||v?"architecture.backToModule":"architecture.previousModule"),Re=se?Ce:w>=900,Ke=!Re&&!X&&!K&&!Y&&!v,De=!se&&(!!te||U)&&(!!K||!!Y||!!v||Z==="outline"),Xe=t=>{const y=[];let I=L?.nodes.find(G=>G.id===t);for(;I?.parentId;)y.unshift(I.parentId),I=L?.nodes.find(G=>G.id===I.parentId);return y},ot=t=>{const y=l?.perspectives.find(I=>I.id===t.perspective);if(y)if(re(),V(y.id),t.node){const I=[];let G=y.nodes.find(Me=>Me.id===t.node);for(;G?.parentId;)I.unshift(G.parentId),G=y.nodes.find(Me=>Me.id===G.parentId);ee(I),oe(t.node),q(!0)}else ee([]),Q(!0)},de="inline-flex min-h-11 items-center justify-center gap-1.5 rounded-lg px-3 text-xs font-medium transition hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40",Ze=Ke?re:ct??(!Re&&Z==="graph"?()=>q(!1):re),ut=t=>U&&L?e.jsx(pt,{active:o,docked:!0,title:L.title,stageKey:`${L.id}:${v?"edit":"view-document"}`,source:!1,fullHeight:De||!!v,inGraph:t,side:Re,onBack:v?()=>O(null):void 0,backLabel:n("architecture.backToModule"),onClose:re,onDismiss:v?()=>O(null):re,children:v?e.jsx(Qe,{root:r,file:c,perspective:L.id,initialField:v.field,onSaved:y=>{++i.current,b(y),O(null),P(I=>I+1)},onCancel:()=>O(null)}):e.jsxs(e.Fragment,{children:[e.jsx(st,{value:L,rootPath:r,onEdit:y=>O({field:y}),onOpenFile:d}),e.jsx("button",{type:"button",className:`${de} text-primary`,onClick:()=>{ne(!1),Ne([])},children:x==="zh"?"进入此视角":"Explore this perspective"})]})}):te&&((t||Z==="graph")&&Ke?e.jsx(Nr,{node:te,onExpand:()=>q(!0),onClose:re}):e.jsx(pt,{active:o&&!Y,docked:!t||!K&&!Y,title:te.title,stageKey:`${te.id}:${K?`${K.path}:${K.line}`:Y?"analysis":v?`edit:${v.field}`:"details"}`,source:!!K,fullHeight:t?!!Y||!!v:De,inGraph:t,side:Re,onBack:ct,backLabel:Rt,onClose:re,onDismiss:Ze,onCollapse:!Re&&!De&&!K&&!Y&&!v?()=>q(!1):void 0,children:v?e.jsx(Qe,{root:r,file:c,perspective:L.id,node:v.node,initialField:v.field,onSaved:y=>{++i.current,b(y),O(null),P(I=>I+1)},onCancel:()=>O(null)},`${c}:${L.id}:${v.node??"view"}:${v.field}`):K&&p?p(K):Y?e.jsxs(e.Fragment,{children:[e.jsx(xt,{active:o,rootPath:r,currentFile:g,currentDirectory:u,initial:Y,onInsertPrompt:a,onPrepared:ue,onClose:()=>W(null)},te.id),ce&&e.jsx("button",{type:"button",className:`${de} mt-3 bg-primary/15 text-primary`,onClick:()=>{E(Y),ge(ce),re()},children:n("architecture.viewPrepared")})]}):e.jsx(wr,{embedded:!0,document:l,rootPath:r,onReference:ot,onEdit:y=>{q(!0),O({node:te.id,field:y})},node:te,view:L,parentId:te.parentId,onSelect:y=>Ae(y,!0),onExplore:()=>Ne([...Xe(te.id),te.id]),onAnalyze:()=>zt(te),onOpenFile:lt,onClose:re})}));return r?e.jsxs("div",{ref:m,className:"relative flex h-full min-h-0 flex-col",onKeyDown:t=>{!se&&(te||U)&&t.key==="Escape"&&!t.defaultPrevented&&!t.nativeEvent.isComposing&&(t.preventDefault(),t.stopPropagation(),Ze())},children:[e.jsxs("div",{className:"flex shrink-0 items-center justify-between gap-2 border-b border-border/15 px-3 py-2",children:[e.jsxs("span",{className:"flex items-center gap-2 text-sm font-semibold",children:[e.jsx(mt,{size:16}),n("architecture.title")]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs("button",{ref:ve,type:"button",className:de,disabled:!Be,onClick:()=>{Be&&(re(),$(z?null:{initial:Be,...l?{outputFile:c}:{}}))},"aria-expanded":!!z,children:[e.jsx(St,{size:14}),n(l?"architecture.update":"architecture.generate")]}),(l||c!==pe)&&e.jsx("button",{type:"button",className:`${de} px-2`,"aria-label":n("architecture.newAnalysis"),onClick:()=>{re(),$({initial:Ee})},children:e.jsx(yt,{size:16})}),e.jsx("button",{type:"button",className:`${de} px-2`,"aria-label":n("architecture.refresh"),disabled:h,onClick:()=>P(t=>t+1),children:e.jsx(kt,{size:15,className:h?"animate-spin":""})})]})]}),e.jsxs("div",{className:`relative flex min-h-0 flex-1 ${Re&&!De?"flex-row":"flex-col"}`,"data-architecture-workspace":!0,children:[e.jsx("div",{ref:A,hidden:De,"data-architecture-content":!0,className:`min-h-0 min-w-0 flex-1 overflow-y-auto p-3 [overflow-anchor:none] ${z?"flex flex-col":""}`,children:v&&!te&&!U?e.jsxs("div",{className:"flex min-h-full flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold",children:L?.title}),e.jsx(Qe,{root:r,file:c,perspective:L.id,initialField:v.field,onSaved:t=>{++i.current,b(t),O(null),P(y=>y+1)},onCancel:()=>O(null)},`${c}:${L?.id}:${v.field}`)]}):z?e.jsx(xt,{active:o,rootPath:r,currentFile:g,currentDirectory:u,initial:z.initial,outputFile:z.outputFile,onInsertPrompt:a,onPrepared:(t,y)=>{E(y),ge(t)},onClose:Ie},`${z.outputFile??"new"}:${JSON.stringify(z.initial)}`):e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"mb-3 flex items-center gap-2 text-xs text-muted-foreground",children:[n("architecture.savedAnalyses"),e.jsx("select",{"aria-label":n("architecture.savedAnalyses"),value:c,onChange:t=>{E(Ee),ge(t.target.value)},className:"min-h-10 min-w-0 flex-1 rounded-lg border border-border/20 bg-surface-2 px-2 text-sm text-foreground",children:Ct.map(t=>e.jsx("option",{value:t,children:t===".omm"?".omm · oh-my-mermaid":t===pe?n("architecture.projectRange"):`${n(t.includes("/module-")?"architecture.moduleRange":"architecture.featureRange")}: ${t===c&&l?.analysis?l.analysis.target.replace(/\n/g,", "):Qt(t)}`},t))})]}),C&&e.jsx("p",{role:"alert",className:"mb-3 text-xs text-muted-foreground",children:n("architecture.libraryFailed")}),h&&!l&&e.jsx("p",{role:"status",className:"py-4 text-sm text-muted-foreground",children:n("architecture.loading")}),B&&e.jsxs("div",{role:"alert",className:"mb-3 rounded-lg border border-destructive/30 p-3 text-sm",children:[e.jsx("p",{children:n(B==="format"?"architecture.invalid":"architecture.loadFailed")}),l&&e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:n("architecture.previous")}),e.jsx("button",{type:"button",className:`${de} mt-2 bg-surface-2`,onClick:()=>P(t=>t+1),children:n("architecture.retry")})]}),!h&&!B&&!l&&e.jsxs("div",{className:"flex flex-col items-center gap-3 px-4 py-8 text-center",children:[e.jsx(mt,{size:32,className:"text-muted-foreground"}),e.jsx("h2",{className:"text-base font-medium",children:n("architecture.empty")}),e.jsx("p",{className:"max-w-sm text-sm leading-relaxed text-muted-foreground",children:n(c===pe?"architecture.emptyHint":"architecture.awaitingFile")})]}),l&&L&&He&&e.jsxs("div",{className:"space-y-3",children:[!Be&&e.jsx("p",{className:"text-xs text-muted-foreground",children:n("architecture.scopeUnavailable")}),l.analysis&&e.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:[n(`architecture.${l.analysis.kind}Range`),l.analysis.target?` · ${l.analysis.target.replace(/\n/g,", ")}`:""," · ",n(l.analysis.depth==="boundary"?"architecture.boundaryDepth":"architecture.followDepth")]}),l.summary.length<=240&&e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed text-muted-foreground",children:l.summary}),e.jsxs("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[n("architecture.perspective"),e.jsxs("select",{"aria-label":n("architecture.perspective"),value:T?"all-perspectives":L.id,onChange:t=>Ve(t.target.value),className:"min-h-11 min-w-0 flex-1 rounded-lg border border-border/20 bg-surface-2 px-2 text-sm text-foreground",children:[e.jsx("option",{value:"all-perspectives",children:x==="zh"?"全部视角":"All perspectives"}),l.perspectives.map(t=>e.jsx("option",{value:t.id,children:t.title},t.id))]})]}),we.length>0&&e.jsxs("nav",{className:"flex flex-wrap items-center gap-1 text-xs","aria-label":n("architecture.breadcrumb"),children:[e.jsx("button",{type:"button",className:`${de} px-2`,onClick:()=>Ne([]),children:L.title}),we.map((t,y)=>e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Fe,{size:12}),e.jsx("button",{type:"button",className:`${de} px-2`,onClick:()=>Ne(we.slice(0,y+1)),children:L.nodes.find(I=>I.id===t)?.title})]},t))]}),e.jsx("p",{className:"line-clamp-3 whitespace-pre-wrap break-words text-sm leading-relaxed text-muted-foreground",children:ye?.summary??L.summary}),e.jsxs("details",{children:[e.jsx("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:x==="zh"?"视角文档与模块目录":"Perspective documents and module tree"}),e.jsx(st,{value:ye??L,rootPath:r,onOpenFile:lt,onEdit:t=>{ye?(oe(ye.id),q(!0),O({node:ye.id,field:t})):O({field:t})}}),e.jsx("nav",{"aria-label":x==="zh"?"模块目录":"Module tree",className:"my-2 border-l border-border/20",children:L.nodes.map(t=>e.jsx("button",{type:"button","aria-label":`${x==="zh"?"定位模块":"Go to module"}: ${t.title}`,className:`${de} flex w-full justify-start text-left ${ie===t.id?"text-primary":""}`,style:{paddingInlineStart:12+Xe(t.id).length*16},onClick:()=>{ee(Xe(t.id)),Ae(t.id),q(!0)},children:t.title},t.id))})]}),e.jsx("div",{role:"group","aria-label":n("architecture.browseMode"),className:"flex gap-1 rounded-lg bg-surface-2 p-1",children:["outline","graph"].map(t=>e.jsx("button",{type:"button","aria-pressed":Z===t,className:`${de} flex-1 ${Z===t?"bg-surface text-primary":"text-muted-foreground"}`,onClick:()=>me(t),children:n(t==="outline"?"architecture.outlineMode":"architecture.graphMode")},t))}),Z==="graph"?e.jsxs(e.Fragment,{children:[e.jsx(jr,{view:T&&ze?ze.view:L,parentId:T?void 0:Oe,selectedId:T&&ze?[...ze.references].find(([,t])=>t.perspective===L.id&&t.node===ie)?.[0]??null:ie,onSelect:t=>{if(T&&ze){const y=ze.references.get(t);y&&ot(y)}else Ae(t)},active:o,referenceWidth:w,inspector:ut(!0),inspectorStage:K?"source":Y||v?"analysis":Ke?"preview":"details",onDismissInspector:U?v?()=>O(null):re:Ze,onExpandedChange:t=>{D(t),!t&&se&&re()},heading:e.jsxs("div",{className:"relative",children:[e.jsxs("select",{"aria-label":n("architecture.perspective"),title:L.title,value:T?"all-perspectives":L.id,onChange:t=>Ve(t.target.value),className:"h-11 w-full min-w-0 appearance-none truncate bg-surface pr-4 text-xs font-semibold focus-visible:ring-2 focus-visible:ring-ring",children:[e.jsx("option",{value:"all-perspectives",children:x==="zh"?"全部视角":"All perspectives"}),l.perspectives.map(t=>e.jsx("option",{value:t.id,children:t.title},t.id))]}),e.jsx(jt,{size:12,className:"pointer-events-none absolute right-0 top-1/2 -translate-y-1/2 text-muted-foreground"})]}),navigation:we.length>0?e.jsxs("nav",{"aria-label":n("architecture.breadcrumb"),className:"flex items-center gap-1 px-2",children:[e.jsx("button",{type:"button",className:`${de} shrink-0 px-2`,onClick:()=>Ne(we.slice(0,-1)),children:n("architecture.parentModule")}),e.jsxs("span",{className:"truncate text-xs text-muted-foreground",children:[L.title," / ",ye?.title]})]}):void 0}),e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:[n("architecture.modules")," (",He.nodes.length,")"]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:He.nodes.map(t=>e.jsx("button",{type:"button","aria-pressed":te?.id===t.id,className:`${de} bg-surface-2`,onClick:()=>Ae(t.id),children:t.title},t.id))})]})]}):e.jsx("div",{className:"space-y-2",role:"group","aria-label":n("architecture.modules"),children:T?l.perspectives.map(t=>e.jsxs("button",{type:"button",className:"block min-h-16 w-full rounded-xl bg-surface-2 p-3 text-left",onClick:()=>Ve(t.id),children:[e.jsx("span",{className:"text-sm font-medium",children:t.title}),e.jsx("span",{className:"mt-1 block text-xs text-muted-foreground",children:t.summary})]},t.id)):He.nodes.map(t=>e.jsx("div",{children:e.jsxs("button",{type:"button","aria-label":t.title,"aria-expanded":te?.id===t.id,className:"block min-h-16 w-full rounded-xl border border-border/20 bg-surface-2 p-3 text-left transition hover:bg-surface-elevated focus-visible:ring-2 focus-visible:ring-ring",onClick:()=>Ae(t.id),children:[e.jsxs("span",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:t.title}),e.jsx(Fe,{size:16,className:"shrink-0 text-muted-foreground"})]}),e.jsx("span",{className:"mt-1.5 line-clamp-2 break-words text-xs leading-relaxed text-muted-foreground",children:t.summary})]})},t.id))}),e.jsxs("details",{className:"rounded-lg border border-border/15 px-3",children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:[n("architecture.analysisNotes")," · ",n("architecture.savedAt")," ",new Date(l.generatedAt).toLocaleString(x==="zh"?"zh-CN":"en-US")]}),e.jsxs("div",{className:"space-y-3 pb-3",children:[l.summary.length>240&&e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed text-muted-foreground",children:l.summary}),l.details?.limitations.length?e.jsxs("div",{children:[e.jsx("h3",{className:"mb-1 text-xs font-semibold",children:n("architecture.limitations")}),e.jsx("ul",{className:"list-disc space-y-1 pl-4 text-xs leading-relaxed text-muted-foreground",children:l.details.limitations.map((t,y)=>e.jsx("li",{children:t},y))})]}):null,l.details?.analyzedPaths.length?e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:[n("architecture.analyzedPaths")," (",l.details.analyzedPaths.length,")"]}),l.details.analyzedPaths.map(t=>e.jsx("button",{type:"button",className:"block min-h-11 w-full break-all rounded px-2 py-2 text-left font-mono text-xs text-primary hover:bg-surface-elevated",onClick:()=>d({path:t}),children:t},t))]}):null]})]}),ye&&ye.files.length>0&&e.jsxs("details",{children:[e.jsx("summary",{className:"cursor-pointer py-2 text-xs text-muted-foreground",children:n("architecture.sourceFiles")}),ye.files.map(t=>e.jsxs("button",{type:"button",className:"block min-h-10 w-full break-all rounded px-2 py-2 text-left font-mono text-xs text-primary hover:bg-surface-2",onClick:()=>d(t),children:[t.path,t.line?`:${t.line}`:""]},`${t.path}:${t.line??""}`))]})]}),e.jsx(br,{root:r,file:c,document:l,onLoaded:(t,y)=>{ge(t),b(y),P(I=>I+1)}})]})}),o&&!se&&ut(!1)]})]}):e.jsx("p",{className:"p-5 text-sm text-muted-foreground",children:n("fileTree.noWorkingDir")})}export{Ir as ArchitecturePanel};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
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-A96wp9Xv.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-xBkso5In.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-W1Lo4NZw.js";import"./triangle-alert-TsfoVQJR.js";import"./referenceLongPress-8ExgTbB3.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
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{bA as r}from"./app-A96wp9Xv.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-DvYmab8z.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-xBkso5In.js";import"./gestureArbiter-W1Lo4NZw.js";import"./triangle-alert-TsfoVQJR.js";import"./referenceLongPress-8ExgTbB3.js";import"./DiffReview-Bxe6OacV.js";import"./sparkles-BMR6NziM.js";import"./DiffViewer-oGb-V3AK.js";import"./ChangeWalkthroughPanel-xvUzbgKh.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};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|