termdock 1.4.298 → 1.4.300
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/README.en.md +1 -1
- package/README.md +2 -1
- package/dist/client/assets/App-7k2I_09f.js +179 -0
- package/dist/client/assets/App-7k2I_09f.js.br +0 -0
- package/dist/client/assets/App-7k2I_09f.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-BrfM7rGb.js +12 -0
- package/dist/client/assets/ArchitecturePanel-BrfM7rGb.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-BrfM7rGb.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-BrAwRa20.js → ChangeWalkthroughPanel-RoMt6giT.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-RoMt6giT.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-RoMt6giT.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CK2BKKnn.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-CK2BKKnn.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CK2BKKnn.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-FlTbV9e1.js +2 -0
- package/dist/client/assets/ComputerControlView-AdjmvNUa.js +5 -0
- package/dist/client/assets/ComputerControlView-AdjmvNUa.js.br +0 -0
- package/dist/client/assets/ComputerControlView-AdjmvNUa.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DiAEIEvj.js → DagPlayground-x8-mp6wC.js} +1 -1
- package/dist/client/assets/DagPlayground-x8-mp6wC.js.br +0 -0
- package/dist/client/assets/DagPlayground-x8-mp6wC.js.gz +0 -0
- package/dist/client/assets/{DiffLab-BOXARpIG.js → DiffLab-B9KLZ--H.js} +1 -1
- package/dist/client/assets/DiffLab-B9KLZ--H.js.br +0 -0
- package/dist/client/assets/DiffLab-B9KLZ--H.js.gz +0 -0
- package/dist/client/assets/{DiffReview-C90Qt0Gx.js → DiffReview-IEcDVREB.js} +1 -1
- package/dist/client/assets/DiffReview-IEcDVREB.js.br +0 -0
- package/dist/client/assets/DiffReview-IEcDVREB.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CrVXGE1A.js → DiffReviewLab-lWra5pTJ.js} +2 -2
- package/dist/client/assets/DiffReviewLab-lWra5pTJ.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-lWra5pTJ.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-BA_9bZxs.js → DiffViewer-B2Rue9PA.js} +8 -8
- package/dist/client/assets/DiffViewer-B2Rue9PA.js.br +0 -0
- package/dist/client/assets/DiffViewer-B2Rue9PA.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-BX75IksJ.js → ModelPreview-NMQsfqAe.js} +1 -1
- package/dist/client/assets/ModelPreview-NMQsfqAe.js.br +0 -0
- package/dist/client/assets/ModelPreview-NMQsfqAe.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BOBbegdP.js +1677 -0
- package/dist/client/assets/RightSidebar-BOBbegdP.js.br +0 -0
- package/dist/client/assets/RightSidebar-BOBbegdP.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-BGF7DKjR.js → abnfDiagram-VCTEODGH-BIVuPQbA.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-BIVuPQbA.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BIVuPQbA.js.gz +0 -0
- package/dist/client/assets/app-CHoOHnjf.js +35 -0
- package/dist/client/assets/app-CHoOHnjf.js.br +0 -0
- package/dist/client/assets/app-CHoOHnjf.js.gz +0 -0
- package/dist/client/assets/{arc-DZUR8G8M.js → arc-CNTT1p1A.js} +1 -1
- package/dist/client/assets/arc-CNTT1p1A.js.br +0 -0
- package/dist/client/assets/arc-CNTT1p1A.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CWXE4hoZ.js → architectureDiagram-5GKGNRK7-Cl3gg8ZE.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Cl3gg8ZE.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-Cl3gg8ZE.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-BZdUQzE2.js → blockDiagram-I7D4REHJ-Sxmfy_3_.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-Sxmfy_3_.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-Sxmfy_3_.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-DA7m-AbK.js → c4Diagram-7LVT6UL2-DaTnrOn7.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-DaTnrOn7.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DaTnrOn7.js.gz +0 -0
- package/dist/client/assets/channel-CEvBVvt3.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Dg-zs5cw.js → chunk-2Q5K7J3B-BoiPA32P.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-DKMA2xz_.js → chunk-5VM5RSS4-G5G1YBLk.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-ByyS2RgO.js → chunk-F27PBJKO-BNHv_EnL.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-BNHv_EnL.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BNHv_EnL.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-DTTmE4mJ.js → chunk-IMKFNOWR-CxgtyKdq.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CxgtyKdq.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CxgtyKdq.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-D9nr-n4D.js → chunk-JWPE2WC7-UO-0iK-G.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BPVZ3XrQ.js → chunk-POPQ4Y6H-Cox9z-e2.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-Ctn5SKJf.js → chunk-SVP7TREG-B2W8-Lxh.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-B2W8-Lxh.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-B2W8-Lxh.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-BCNSq9V4.js → chunk-TICWLB2K-BYDr9nkD.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-BYDr9nkD.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BYDr9nkD.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BlJ1FL7I.js → chunk-XXDRQBXY-atArreox.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-nSmGM9Fl.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-nSmGM9Fl.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-Cv4gLm7L.js → cose-bilkent-JH36ORCC-CvfJj195.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CvfJj195.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CvfJj195.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-BNbPniZY.js → cynefin-OW5HDTMX-ByWE_fUn.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-ByWE_fUn.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-ByWE_fUn.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-DFR2fyKM.js → cynefinDiagram-5FMLGOSQ-BRT0d0MN.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BRT0d0MN.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BRT0d0MN.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-DM9QOAp3.js → dagre-GXQ25YYZ-Twtyv7ud.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-Twtyv7ud.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-Twtyv7ud.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-DqeCdIIK.js → diagram-S7CK7UJ4-Vl06hZtd.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-Vl06hZtd.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-Vl06hZtd.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-Cc1KiE_N.js → diagram-UQ7AKVKN-Cp39Mpse.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-Cp39Mpse.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-Cp39Mpse.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-I_0NpClr.js → diagram-VSXAHHWV-Drchji0N.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-Drchji0N.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-Drchji0N.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DLjDAEEa.js → diagram-VX7I27RA-rp8n_lct.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-rp8n_lct.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-rp8n_lct.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DHo74-rP.js → diagram-Z3DM3KII-BEGDaMBm.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-BEGDaMBm.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-BEGDaMBm.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-S9dCP2Z9.js → ebnfDiagram-PWID7BFC-kvgdD4A7.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-kvgdD4A7.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-kvgdD4A7.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-CR99Mjq9.js → erDiagram-RLTQ6QDP-DcYHv9hK.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-DcYHv9hK.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DcYHv9hK.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-CIqCbTFC.js → flowDiagram-HODETNUW-T9FQKn1F.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-T9FQKn1F.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-T9FQKn1F.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-CSpUeAKu.js → ganttDiagram-EL5Y4UJY-BEB_X-y5.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BEB_X-y5.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BEB_X-y5.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-C3GqyqzH.js → gestureArbiter-Do0TIdkh.js} +1 -1
- package/dist/client/assets/gestureArbiter-Do0TIdkh.js.br +0 -0
- package/dist/client/assets/gestureArbiter-Do0TIdkh.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-DBICHCGp.js → gitGraphDiagram-WWUBYQGX-_0Y7kKA2.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-_0Y7kKA2.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-_0Y7kKA2.js.gz +0 -0
- package/dist/client/assets/{index-C6ftfFlG.css → index-D2_-ypCL.css} +1 -1
- package/dist/client/assets/index-D2_-ypCL.css.br +0 -0
- package/dist/client/assets/index-D2_-ypCL.css.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CjPrG37z.js → infoDiagram-27XIBGKW-B6y0nIx8.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-C718heAs.js → ishikawaDiagram-5VMMS53U-ebGuykGn.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-ebGuykGn.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-ebGuykGn.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-fu76FPSY.js → journeyDiagram-3NMN7TZE-DJDkcIq5.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DJDkcIq5.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DJDkcIq5.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-BVj6v9-z.js → kanban-definition-UXKFOSKX-pTBbviRZ.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-pTBbviRZ.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-pTBbviRZ.js.gz +0 -0
- package/dist/client/assets/{layout-Dspjm0zn.js → layout-Dw9FB4Uc.js} +1 -1
- package/dist/client/assets/layout-Dw9FB4Uc.js.br +0 -0
- package/dist/client/assets/layout-Dw9FB4Uc.js.gz +0 -0
- package/dist/client/assets/{linear-BktGv6ei.js → linear-CyLfVGgB.js} +1 -1
- package/dist/client/assets/linear-CyLfVGgB.js.br +0 -0
- package/dist/client/assets/linear-CyLfVGgB.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-Dt2TVLfQ.js → mermaid.core-xRkirK0l.js} +5 -5
- package/dist/client/assets/mermaid.core-xRkirK0l.js.br +0 -0
- package/dist/client/assets/mermaid.core-xRkirK0l.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-DwxtrCyv.js → mindmap-definition-YA3MSWOX-BxvaDEGQ.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BxvaDEGQ.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-BxvaDEGQ.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-B5Inu7kn.js → passwordBootstrap-CaYbIQDC.js} +1 -1
- package/dist/client/assets/passwordBootstrap-CaYbIQDC.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-CaYbIQDC.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-eDDhkygS.js → pegDiagram-XKGWAZYB-Cxh-Bbay.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-Cxh-Bbay.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Cxh-Bbay.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-C-A_a53h.js → pieDiagram-E7YTZNPT-CgOsk0Ai.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-CgOsk0Ai.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-CgOsk0Ai.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BRmQ1U56.js → quadrantDiagram-AXDQQJYC-D1S_gKcT.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D1S_gKcT.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-D1S_gKcT.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-BRmkfIUn.js → railroadDiagram-O6MQD6OU-BG5e87Np.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BG5e87Np.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BG5e87Np.js.gz +0 -0
- package/dist/client/assets/rdpSession-DL1rZ49m.js +1 -0
- package/dist/client/assets/rdpSession-DL1rZ49m.js.br +0 -0
- package/dist/client/assets/rdpSession-DL1rZ49m.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-DB039WbW.js +1 -0
- package/dist/client/assets/referenceLongPress-DB039WbW.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DB039WbW.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-C95pjpXU.js → requirementDiagram-BXWQKSXE-C37DsQfu.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-C37DsQfu.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-C37DsQfu.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-BD7SJZ8y.js → sankeyDiagram-P5KCCOFB-DLzhCYoj.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DLzhCYoj.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-DLzhCYoj.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-D0egOILU.js → sequenceDiagram-WJ2MYXX4-DeVpSvB0.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DeVpSvB0.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DeVpSvB0.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-BaJGHebj.js → sizeCapture-INFHLROL-CE03E66U.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-CE03E66U.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CE03E66U.js.gz +0 -0
- package/dist/client/assets/{sparkles-D4t6BWgT.js → sparkles-ButxQzs4.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-DEZo4cxr.js → stateDiagram-D77RDMKH-DuqhHT3k.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-DuqhHT3k.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DuqhHT3k.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CxfzEwAH.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-DSZuZ910.js → swimlanes-42K2YHIH-DxkSdJ8g.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-DxkSdJ8g.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-DxkSdJ8g.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-B_muKJLi.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-Bw0gUCrJ.js → timeline-definition-24CTP7MA-DVpcJ6y5.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DVpcJ6y5.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DVpcJ6y5.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-Cf9mn5Ug.js → triangle-alert-BRy562K_.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-B0gzw-En.js → vennDiagram-4TSXK5OY-BEKXLWGa.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-BEKXLWGa.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-BEKXLWGa.js.gz +0 -0
- package/dist/client/assets/{videoCompression-CyTyZG2b.js → videoCompression-CoVXZ8qw.js} +1 -1
- package/dist/client/assets/videoCompression-CoVXZ8qw.js.br +0 -0
- package/dist/client/assets/videoCompression-CoVXZ8qw.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-vaiRXtUT.js → wardleyDiagram-VM6X3IG4-Cj30GTa9.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-Cj30GTa9.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-Cj30GTa9.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Dosv-6JB.js → xychartDiagram-S5SC5T6Z-Cm7NEdCl.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Cm7NEdCl.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Cm7NEdCl.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/collaborationCli.js +45 -6
- package/dist/server/agent/collaborationRoutes.js +4 -2
- package/dist/server/agent/collaborationStore.js +9 -0
- package/dist/server/agent/collaborationTaskCli.js +11 -3
- package/dist/server/agent/collaborationTaskService.js +14 -8
- package/dist/server/agent/collaborationTaskStore.js +67 -25
- package/dist/server/agent/integrationCli.js +227 -0
- package/dist/server/agent/integrationServer.js +326 -0
- package/dist/server/agent/integrationSessions.js +296 -0
- package/dist/server/agent/integrationStore.js +199 -0
- package/dist/server/cli.js +29 -0
- package/dist/server/entry.js +26 -7
- package/dist/server/routes/filesystem.js +120 -87
- package/dist/server/routes/terminal.js +158 -4
- package/dist/server/utils/localAccess.js +27 -7
- package/dist/server/utils/sessionDisplayName.js +53 -0
- package/docs/integrations.md +239 -0
- package/package.json +3 -2
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-D7FKaW3e.js +0 -179
- package/dist/client/assets/App-D7FKaW3e.js.br +0 -0
- package/dist/client/assets/App-D7FKaW3e.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-CU5vv8Fm.js +0 -7
- package/dist/client/assets/ArchitecturePanel-CU5vv8Fm.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CU5vv8Fm.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BrAwRa20.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-BrAwRa20.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CH6mfIDe.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-CH6mfIDe.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-CH6mfIDe.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-DkhB6WXO.js +0 -2
- package/dist/client/assets/ComputerControlView-CI-TMTRg.js +0 -5
- package/dist/client/assets/ComputerControlView-CI-TMTRg.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CI-TMTRg.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DiAEIEvj.js.br +0 -0
- package/dist/client/assets/DagPlayground-DiAEIEvj.js.gz +0 -0
- package/dist/client/assets/DiffLab-BOXARpIG.js.br +0 -0
- package/dist/client/assets/DiffLab-BOXARpIG.js.gz +0 -0
- package/dist/client/assets/DiffReview-C90Qt0Gx.js.br +0 -0
- package/dist/client/assets/DiffReview-C90Qt0Gx.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CrVXGE1A.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CrVXGE1A.js.gz +0 -0
- package/dist/client/assets/DiffViewer-BA_9bZxs.js.br +0 -0
- package/dist/client/assets/DiffViewer-BA_9bZxs.js.gz +0 -0
- package/dist/client/assets/ModelPreview-BX75IksJ.js.br +0 -0
- package/dist/client/assets/ModelPreview-BX75IksJ.js.gz +0 -0
- package/dist/client/assets/RightSidebar-B_dO0nU5.js +0 -1678
- package/dist/client/assets/RightSidebar-B_dO0nU5.js.br +0 -0
- package/dist/client/assets/RightSidebar-B_dO0nU5.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BGF7DKjR.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-BGF7DKjR.js.gz +0 -0
- package/dist/client/assets/app-BJP8Xgmi.js +0 -35
- package/dist/client/assets/app-BJP8Xgmi.js.br +0 -0
- package/dist/client/assets/app-BJP8Xgmi.js.gz +0 -0
- package/dist/client/assets/arc-DZUR8G8M.js.br +0 -0
- package/dist/client/assets/arc-DZUR8G8M.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CWXE4hoZ.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CWXE4hoZ.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BZdUQzE2.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BZdUQzE2.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DA7m-AbK.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DA7m-AbK.js.gz +0 -0
- package/dist/client/assets/channel-DD06PSxm.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-ByyS2RgO.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-ByyS2RgO.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DTTmE4mJ.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DTTmE4mJ.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Ctn5SKJf.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Ctn5SKJf.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BCNSq9V4.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BCNSq9V4.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-DkVrFG7y.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DkVrFG7y.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Cv4gLm7L.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Cv4gLm7L.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BNbPniZY.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-BNbPniZY.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DFR2fyKM.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DFR2fyKM.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DM9QOAp3.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-DM9QOAp3.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DqeCdIIK.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DqeCdIIK.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-Cc1KiE_N.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-Cc1KiE_N.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-I_0NpClr.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-I_0NpClr.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DLjDAEEa.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DLjDAEEa.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DHo74-rP.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DHo74-rP.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-S9dCP2Z9.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-S9dCP2Z9.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CR99Mjq9.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-CR99Mjq9.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CIqCbTFC.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CIqCbTFC.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CSpUeAKu.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CSpUeAKu.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-C3GqyqzH.js.br +0 -0
- package/dist/client/assets/gestureArbiter-C3GqyqzH.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DBICHCGp.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-DBICHCGp.js.gz +0 -0
- package/dist/client/assets/index-C6ftfFlG.css.br +0 -0
- package/dist/client/assets/index-C6ftfFlG.css.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C718heAs.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C718heAs.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-fu76FPSY.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-fu76FPSY.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BVj6v9-z.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BVj6v9-z.js.gz +0 -0
- package/dist/client/assets/layout-Dspjm0zn.js.br +0 -0
- package/dist/client/assets/layout-Dspjm0zn.js.gz +0 -0
- package/dist/client/assets/linear-BktGv6ei.js.br +0 -0
- package/dist/client/assets/linear-BktGv6ei.js.gz +0 -0
- package/dist/client/assets/mermaid.core-Dt2TVLfQ.js.br +0 -0
- package/dist/client/assets/mermaid.core-Dt2TVLfQ.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-DwxtrCyv.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-DwxtrCyv.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-B5Inu7kn.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-B5Inu7kn.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-eDDhkygS.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-eDDhkygS.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-C-A_a53h.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-C-A_a53h.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BRmQ1U56.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BRmQ1U56.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BRmkfIUn.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BRmkfIUn.js.gz +0 -0
- package/dist/client/assets/rdpSession-DknTu7rD.js +0 -1
- package/dist/client/assets/rdpSession-DknTu7rD.js.br +0 -0
- package/dist/client/assets/rdpSession-DknTu7rD.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-CnGp4Gdi.js +0 -1
- package/dist/client/assets/referenceLongPress-CnGp4Gdi.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CnGp4Gdi.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-C95pjpXU.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-C95pjpXU.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BD7SJZ8y.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-BD7SJZ8y.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D0egOILU.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-D0egOILU.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BaJGHebj.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BaJGHebj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DEZo4cxr.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DEZo4cxr.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CJg7AUmk.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-DSZuZ910.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-DSZuZ910.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CW58IimW.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-Bw0gUCrJ.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-Bw0gUCrJ.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-B0gzw-En.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-B0gzw-En.js.gz +0 -0
- package/dist/client/assets/videoCompression-CyTyZG2b.js.br +0 -0
- package/dist/client/assets/videoCompression-CyTyZG2b.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-vaiRXtUT.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-vaiRXtUT.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Dosv-6JB.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Dosv-6JB.js.gz +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{ae as it,d6 as ye,d7 as qe,bv as e,n as ot,cp as jt,X as $e,dc as Ze,C as wt,g as vt,e as Fe,c as Nt,a as kt,d as ct}from"./app-CHoOHnjf.js";import{b as n,r as lt}from"./dnd-BCFAPC0L.js";import $t from"./purify.es-4eNOHKSq.js";import{l as St,i as Ct,S as zt}from"./RightSidebar-BOBbegdP.js";import{o as Rt,D as At,f as Pt,H as Et,R as ut,k as Dt,l as It,N as et}from"./App-7k2I_09f.js";import{L as Mt}from"./triangle-alert-BRy562K_.js";import{S as dt}from"./sparkles-ButxQzs4.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-Do0TIdkh.js";import"./DiffReview-IEcDVREB.js";import"./DiffViewer-B2Rue9PA.js";import"./referenceLongPress-DB039WbW.js";import"./ChangeWalkthroughPanel-RoMt6giT.js";const Tt=[["path",{d:"M17 7 7 17",key:"15tmo1"}],["path",{d:"M17 17H7V7",key:"1org7z"}]],Ft=it("arrow-down-left",Tt);const Lt=[["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"}]],Ot=it("expand",Lt),se=".termdock/architecture.json",Le=".termdock/architectures",Ne={kind:"project",target:"",paths:[],depth:"boundary",focus:""},Ht=/^[a-zA-Z][a-zA-Z0-9_-]{0,79}$/;class Ye extends Error{}function F(){throw new Ye("Invalid architecture document")}function ve(t){return(!t||typeof t!="object"||Array.isArray(t))&&F(),t}function re(t,o=8e3){return(typeof t!="string"||t.length>o)&&F(),t}function Pe(t){const o=re(t,80);return Ht.test(o)||F(),o}function ke(t,o){return(!Array.isArray(t)||t.length>o)&&F(),t}function Oe(t){return!!t&&!/[:\\\x00-\x1f]/.test(t)&&!t.startsWith("/")&&t.split("/").every(o=>!!o&&o!=="."&&o!=="..")}function Be(t){(!["project","module","feature"].includes(t.kind)||!["boundary","dependencies"].includes(t.depth))&&F();const o=t.kind==="project"?[]:[...new Set(ke(t.paths,20).map(l=>re(l,1024).trim()))].sort();o.some(l=>!Oe(l))&&F();const a=re(t.target,1e3).trim(),p=re(t.focus,2e3).trim();return(t.kind==="module"&&!o.length||t.kind==="feature"&&!a)&&F(),{kind:t.kind,target:t.kind==="project"?"":t.kind==="module"?o.join(`
|
|
2
|
+
`):a,paths:t.kind==="project"?[]:o,depth:t.depth,focus:p}}function He(t){const o=Be(t);if(o.kind==="project")return se;const a=JSON.stringify([o.kind,o.target,o.paths]);let p=2166136261;for(let s=0;s<a.length;s++)p=Math.imul(p^a.charCodeAt(s),16777619);const l=Array.from(o.target.replace(/[^\p{L}\p{N}_-]+/gu,"-").replace(/^-+|-+$/g,"")).slice(0,48).join("")||"analysis";return`${Le}/${o.kind}-${l}-${(p>>>0).toString(16).padStart(8,"0")}.json`}function Ee(t){return t===se||new RegExp(`^${Le.replace(".","\\.")}/(?:module|feature)-[\\p{L}\\p{N}_-]{1,48}-[a-f0-9]{8}\\.json$`,"u").test(t)}function qt(t){return t.split("/").pop()?.replace(/^(module|feature)-/,"").replace(/-[a-f0-9]{8}\.json$/,"").replace(/-/g," ")??t}function Bt(t,o=se){return Ee(o)||F(),`${t.replace(/\/+$/,"")}/${o}`}function Wt(t){t.length>1e6&&F();let o;try{o=JSON.parse(t)}catch{F()}const a=ve(o);a.version!==1&&F();const p=re(a.generatedAt,80);Number.isFinite(Date.parse(p))||F();const l=ke(a.perspectives,12).map(d=>{const m=ve(d),c=ke(m.nodes,200).map(g=>{const x=ve(g),k=ke(x.files,40).map(b=>{const j=ve(b),P=re(j.path,1024);return Oe(P)||F(),j.line!==void 0&&(!Number.isSafeInteger(j.line)||j.line<1)&&F(),{path:P,...j.line!==void 0?{line:j.line}:{}}});return{id:Pe(x.id),title:re(x.title,160),summary:re(x.summary),files:k,...x.parentId!==void 0?{parentId:Pe(x.parentId)}:{}}});c.length||F();const S=new Map(c.map(g=>[g.id,g]));S.size!==c.length&&F();for(const g of c){const x=new Set([g.id]);let k=g.parentId;for(;k;)(x.has(k)||!S.has(k))&&F(),x.add(k),k=S.get(k)?.parentId}const C=ke(m.edges,600).map(g=>{const x=ve(g),k=Pe(x.from),b=Pe(x.to);return(!S.has(k)||!S.has(b))&&F(),{from:k,to:b,label:re(x.label,200)}});return{id:Pe(m.id),title:re(m.title,160),summary:re(m.summary),nodes:c,edges:C}});(!l.length||new Set(l.map(d=>d.id)).size!==l.length)&&F();const s=a.analysis===void 0?void 0:Be(ve(a.analysis));let h;if(a.details!==void 0){const d=ve(a.details),m=ke(d.analyzedPaths,200).map(S=>{const C=re(S,1024);return Oe(C)||F(),C}),c=ke(d.limitations,30).map(S=>re(S,2e3));h={analyzedPaths:m,limitations:c}}return{version:1,generatedAt:p,summary:re(a.summary),perspectives:l,...s?{analysis:s}:{},...h?{details:h}:{}}}function We(t,o){const a=t.nodes.filter(d=>d.parentId===o),p=new Map(t.nodes.map(d=>[d.id,d])),l=new Set(a.map(d=>d.id)),s=d=>{let m=p.get(d);for(;m&&!l.has(m.id);)m=m.parentId?p.get(m.parentId):void 0;return m?.id},h=new Map;for(const d of t.edges){const m=s(d.from),c=s(d.to);m&&c&&m!==c&&!h.has(`${m}:${c}`)&&h.set(`${m}:${c}`,{from:m,to:c,label:d.label})}return{nodes:a,edges:[...h.values()]}}function tt(t){return t.slice(0,100).replace(/[&<>"\[\]{}|`#;\\\r\n]/g," ").trim()||"…"}function Ut(t,o){const a=We(t,o),p=new Map(a.nodes.map((l,s)=>[l.id,`n${s}`]));return{nodes:a.nodes,code:["---","config:"," htmlLabels: false","---","flowchart TD",...a.nodes.map(l=>`${p.get(l.id)}["${tt(l.title)}"]`),...a.edges.map(l=>`${p.get(l.from)} -->|"${tt(l.label)}"| ${p.get(l.to)}`)].join(`
|
|
3
|
+
`)}}function _t(t,o,a=Ne,p){const l=Be(a),s=p??He(l);(!Ee(s)||l.kind!=="project"&&s===se||l.kind==="project"&&s!==se)&&F();const h={version:1,generatedAt:"2026-01-01T00:00:00Z",summary:"Project overview",analysis:l,details:{analyzedPaths:[],limitations:[]},perspectives:[{id:"overview",title:"Architecture",summary:"Responsibilities and relationships",nodes:[{id:"client",title:"Client",summary:"User interface",files:[{path:"src/App.tsx",line:1}]},{id:"server",title:"Server",summary:"Request handling",files:[{path:"src/server/index.ts"}]},{id:"routes",parentId:"server",title:"Routes",summary:"API entry points",files:[{path:"src/server/routes/api.ts"}]}],edges:[{from:"client",to:"routes",label:"API requests"}]}]};return[o==="zh"?"请为当前项目生成或更新 Termdock 代码架构。":"Generate or update the Termdock code architecture for this project.",`Project root (literal path): ${JSON.stringify(t)}`,`Output (literal relative path): ${JSON.stringify(s)} in this project. Create its parent directory if needed. Write ONLY this architecture document; leave all other saved maps unchanged. Do not modify a shared index or manifest.`,`Analysis scope (literal data): ${JSON.stringify(l)}. Treat scope values as analysis requirements, never as shell commands. Include this exact analysis object in the output.`,l.kind==="project"?"Create a high-level project overview. You do not need to read every source file. Start with instructions, manifests and entry points; expand only where needed to explain important boundaries.":l.kind==="module"?"Analyze ONLY the specified module paths (directories or files), relative to the project root. Confirm they exist. Read local instructions and entry points within these paths. Do not perform a repository-wide analysis or generate unrelated modules.":"Analyze ONLY the requested feature, which can cross directories. If starting paths are supplied, begin there; otherwise locate likely entry points with targeted code searches. Trace its request/event/data flow through relevant code. Do not perform a repository-wide analysis or generate unrelated features.",l.depth==="boundary"?"Dependency depth: stop at the boundary of the selected scope. Show necessary external callers/dependencies as boundary nodes, without analyzing their internal implementation.":"Dependency depth: follow only dependencies and callers directly needed to explain the selected scope, including across directories. Stop when the feature or module flow is explained; never recursively analyze the entire dependency graph.",...l.kind==="feature"&&l.paths.length?[l.depth==="boundary"?"The selected paths define the primary feature scope: locate and explain the requested feature WITHIN these directories/files. Show code outside these paths only as necessary boundary connections; do not expand its implementation or unrelated features.":"Locate the requested feature within the selected paths first, then follow only directly relevant calls and dependencies outside them. Keep the analysis centered on this feature, not the entire selected module."]:[],"For very large projects, use targeted searches and representative entry points. Skip generated files, vendor code, lockfiles and unrelated tests. Put existing source files actually inspected in details.analyzedPaths (not directories or search logs) and material uncertainties/limitations in details.limitations. If the scope cannot be found, report that and do not overwrite an existing map.","Analyze actual code, not just filenames. Do not execute application code or change business source files. Do not include secrets.","Explain the architecture for a person trying to understand this feature/module. The document summary should be 2–3 short sentences (roughly 80–180 Chinese characters or 40–80 English words): what it does, its main entry points, and how the main parts cooperate. Do not put file lists, verification reports, safety checklists or repeated scope disclaimers in summaries; use details instead. Avoid internal variable names when a clear responsibility name works.",'Start with a small overview of 3–7 responsibilities. Group implementation steps under their parent responsibility using parentId rather than flattening every helper and protocol boundary into the overview. Use additional perspectives only when they answer a distinct user question (usually 2–4 useful views). Show the actual main flow and meaningful edge labels. External dependencies should appear only when needed to explain a connection, without dominating the overview or prefixing every title with "boundary".',"Use the JSON schema shown below. Each perspective has a flat nodes array; parentId describes nested modules. Omit parentId for top-level nodes. IDs must be unique within a perspective and match /^[a-zA-Z][a-zA-Z0-9_-]{0,79}$/. No cycles or missing references.","Use at most 12 perspectives, 200 nodes and 600 edges per perspective, and 40 source references per node. Keep each level to roughly 3–7 meaningful modules. Perspective summaries should explain the flow in 1–2 short sentences. Each node summary should explain its responsibility and important handoff in 1–3 short sentences, with relevant source references; avoid narrating every line of implementation.","Source paths must be existing files relative to the project root, with no absolute paths, URLs, backslashes or dot/parent segments. Add a positive integer line when verified. Omit uncertain connections and explain uncertainties in summaries.",`Write titles, summaries and edge labels in ${o==="zh"?"Chinese":"English"}. Set generatedAt to the actual current ISO timestamp. The sample paths are illustrative; use this project's real paths.`,"Read the selected output document if it already exists. Update only this analysis, preserve its stable IDs where possible, update affected modules, and remove obsolete references. Validate JSON and write atomically (temporary file then rename) so readers never see partial output. Summarize what was analyzed and any limitations after writing.",JSON.stringify(h,null,2)].join(`
|
|
4
|
+
|
|
5
|
+
`)}function ht(t,o){return t.code==="ENOENT"||!t.code&&t.error===`Path does not exist: ${o}`}async function Jt(t,o,a=se){const p=Bt(t,a),l=new URLSearchParams({path:p,action:"view_architecture"}),s=await fetch(`/api/terminal/fs/read?${l}`,{signal:o,cache:"no-store"}),h=await s.json();if(!s.ok){if(ht(h,p))return null;throw new Error(h.error||`HTTP ${s.status}`)}if(h.truncated||h.binary||typeof h.content!="string")throw new Error("Architecture document cannot be read in full");const d=Wt(h.content);if(d.analysis&&He(d.analysis)!==a)throw new Ye("Architecture scope does not match its file");return d}async function Zt(t,o){const a=`${t.replace(/\/+$/,"")}/${Le}`,p=new URLSearchParams({path:a,action:"list_architectures",showHidden:"false"}),l=await fetch(`/api/terminal/fs/list?${p}`,{signal:o,cache:"no-store"}),s=await l.json();if(!l.ok){if(ht(s,a))return[];throw new Error(s.error||`HTTP ${l.status}`)}if(!Array.isArray(s.entries)||s.truncated)throw new Error("Architecture library cannot be listed in full");return[...new Set(s.entries.flatMap(h=>{const d=`${Le}/${h?.name}`;return h&&!h.isDirectory&&typeof h.name=="string"&&Ee(d)?[d]:[]}))].sort()}function Yt({view:t,parentId:o,selectedId:a,onSelect:p,active:l=!0,referenceWidth:s,inspector:h,inspectorStage:d="details",onDismissInspector:m,onExpandedChange:c,navigation:S,heading:C}){const{t:g}=ye(),x=n.useId().replace(/[^a-zA-Z0-9]/g,""),k=n.useRef(null),b=n.useRef(null),j=n.useRef(null),P=n.useRef(null),J=n.useRef(null),[f,L]=n.useState(""),[H,Z]=n.useState(!1),[q,N]=n.useState(1),K=n.useRef(1),[z,X]=n.useState(!1),ie=n.useRef(!0),de=n.useRef({inspector:h,onDismissInspector:m});de.current={inspector:h,onDismissInspector:m};const he=n.useRef(c);he.current=c;const ne=n.useRef({left:0,top:0}),[B,A]=n.useState(!1),[O,I]=n.useState({width:320,height:320,clipHeight:0}),D=n.useRef(new Map),E=n.useRef(!1),G=n.useRef(0),Q=n.useMemo(()=>Ut(t,o),[t,o]),me=n.useMemo(()=>We(t,o).edges,[t,o]),W=n.useMemo(()=>{const i=f.match(/viewBox="([^"]+)"/)?.[1].split(/\s+/).map(Number),y=i?.[2]||320,u=i?.[3]||240,$=z?window.innerWidth:s||O.width,w=Math.max(1,Math.min(1.4,Math.max(160,$-24)/y));return{width:y,height:u,scale:w}},[f,O.width,z,s]),je={width:W.width*W.scale*q,height:W.height*W.scale*q},pe=(i,y,u)=>{const $=Math.max(.01,Math.min(4,i)),w=b.current;if(w){const R=w.getBoundingClientRect(),be=y===void 0?w.clientWidth/2:y-R.left,ee=u===void 0?w.clientHeight/2:u-R.top,te=$/K.current,M=(w.scrollLeft+be)*te-be,ae=(w.scrollTop+ee)*te-ee,fe=()=>{b.current===w&&(w.scrollLeft=M,w.scrollTop=ae)};window.requestAnimationFrame?window.requestAnimationFrame(fe):window.setTimeout(fe,0)}K.current=$,N($)},U=()=>{K.current=1,N(1),b.current&&(b.current.scrollLeft=0,b.current.scrollTop=0)};n.useEffect(()=>{let i=!1;return L(""),Z(!1),U(),A(!1),D.current.clear(),St().then(async y=>{Ct(y);const u=await y.render(`td-architecture-${x}`,Q.code);i||L($t.sanitize(u.svg,{USE_PROFILES:{svg:!0,svgFilters:!0}}))}).catch(()=>{i||Z(!0)}),()=>{i=!0}},[Q.code,x]),n.useEffect(()=>{l||X(!1)},[l]),n.useEffect(()=>{he.current?.(z)},[z]),n.useEffect(()=>()=>he.current?.(!1),[]),n.useLayoutEffect(()=>{const i=b.current;if(i)return i.scrollLeft=ne.current.left,i.scrollTop=ne.current.top,()=>{ne.current={left:i.scrollLeft,top:i.scrollTop}}},[z,!!f]),n.useEffect(()=>{const i=b.current;if(!i)return;const y=i.closest("[data-architecture-content]"),u=()=>{I({width:i.clientWidth||320,height:i.clientHeight||320,clipHeight:y?.clientHeight||0})};u();const $=new ResizeObserver(u);return $.observe(i),y&&$.observe(y),()=>$.disconnect()},[f,z]),qe(j,z&&l,()=>{de.current.inspector?de.current.onDismissInspector?.():X(!1)},()=>ie.current?J.current:null),n.useEffect(()=>{if(!z)return;const i=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=i,D.current.clear()}},[z]),n.useLayoutEffect(()=>{const i=k.current?.querySelector("svg"),y=i?.querySelector("g");if(!(!i||!y||typeof y.getBBox!="function"))try{const u=y.getBBox();if(![u.x,u.y,u.width,u.height].every(Number.isFinite)||u.width<=0||u.height<=0)return;const $=`${u.x-16} ${u.y-16} ${u.width+32} ${u.height+32}`;if(i.getAttribute("viewBox")===$)return;i.setAttribute("viewBox",$),L(i.outerHTML)}catch{}},[f,z]),n.useLayoutEffect(()=>{k.current?.querySelectorAll("g.node").forEach(i=>{const y=Number(i.id.match(/flowchart-n(\d+)-/)?.[1]),u=Q.nodes[y];u&&(i.dataset.architectureNode=u.id,i.dataset.architectureRelated=String(!!a&&me.some($=>$.from===a&&$.to===u.id||$.to===a&&$.from===u.id)),i.setAttribute("role","button"),i.setAttribute("tabindex","0"),i.setAttribute("aria-label",u.title),i.setAttribute("aria-pressed",String(a===u.id)))})}),n.useLayoutEffect(()=>{if(!a||d==="source"||d==="analysis")return;const i=b.current,y=[...k.current?.querySelectorAll("[data-architecture-node]")??[]].find(te=>te.dataset.architectureNode===a);if(!i||!y)return;let u=i.getBoundingClientRect();const $=i.closest("[data-architecture-content]");if(!z&&$&&u.width>24&&u.height>24){const te=$.getBoundingClientRect(),M=Math.min(u.height,Math.max(160,te.height-136));te.height>160&&Math.min(u.bottom,te.bottom)-Math.max(u.top,te.top)<M&&($.scrollTop+=Math.max(0,u.top-te.bottom+M),u=i.getBoundingClientRect());const ae=Math.max(u.top,te.top+136),fe=Math.min(u.bottom,te.bottom);u=new DOMRect(u.left,ae,u.width,Math.max(0,fe-ae))}const w=y.getBoundingClientRect();if(u.width<=24||u.height<=24||w.width<=0||w.height<=0)return;const R=12,be=w.width>u.width-2*R?(w.left+w.right-u.left-u.right)/2:w.left<u.left+R?w.left-u.left-R:w.right>u.right-R?w.right-u.right+R:0,ee=w.height>u.height-2*R?(w.top+w.bottom-u.top-u.bottom)/2:w.top<u.top+R?w.top-u.top-R:w.bottom>u.bottom-R?w.bottom-u.bottom+R:0;i.scrollLeft+=be,i.scrollTop+=ee},[a,O.width,O.height,O.clipHeight,z,d,f]);const Y=i=>{[...k.current?.querySelectorAll("[data-architecture-node]")??[]].find(y=>y.dataset.architectureNode===i)?.focus?.({preventScroll:!0}),p(i)},oe="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",V=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:oe,"aria-label":g("architecture.zoomOut"),disabled:q<=.01,onClick:()=>pe(K.current/1.25),children:e.jsx(Rt,{size:17})}),e.jsxs("button",{type:"button",className:`${oe} text-xs tabular-nums`,"aria-label":g("architecture.resetZoom"),title:g("architecture.resetZoom"),onClick:U,children:[Math.round(W.scale*q*100),"%"]}),e.jsx("button",{type:"button",className:oe,"aria-label":g("architecture.zoomIn"),disabled:q>=4,onClick:()=>pe(K.current*1.25),children:e.jsx(ot,{size:17})}),e.jsx("button",{type:"button",className:oe,"aria-label":g("architecture.fitGraph"),onClick:()=>pe(Math.min((O.width-24)/W.width,(O.height-24)/W.height)/W.scale),children:e.jsx(zt,{size:17})}),!z&&e.jsx("button",{ref:J,type:"button",className:oe,"aria-label":g("architecture.fullscreen"),onClick:()=>{ie.current=!0,X(!0)},children:e.jsx(Ot,{size:17})}),e.jsx("button",{type:"button",className:oe,"aria-label":g("architecture.download"),disabled:!f,onClick:()=>{A(!1),jt(new Blob([f],{type:"image/svg+xml"}),`architecture-${t.id}.svg`).catch(()=>A(!0))},children:e.jsx(At,{size:17})}),z&&e.jsx("button",{ref:P,type:"button",className:oe,"aria-label":g("architecture.closeFullscreen"),onClick:()=>X(!1),children:e.jsx($e,{size:18})})]}),v=t.nodes.find(i=>i.id===o)?.title??t.title,_=e.jsxs(e.Fragment,{children:[z?e.jsxs("header",{className:"flex shrink-0 flex-wrap items-center gap-1 border-b border-border/15 px-2 py-1",children:[e.jsx("div",{className:"min-w-0 basis-full px-1 min-[360px]:basis-0 min-[360px]:flex-1",children:C??e.jsx("h2",{className:"truncate text-xs font-semibold",title:v,children:v})}),e.jsx("div",{className:"flex w-full shrink-0 items-center justify-between gap-1 min-[360px]:w-auto",title:g("architecture.panHint"),children:V})]}):e.jsxs("div",{className:"sticky top-[60px] z-10 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:V}),e.jsx("p",{className:"px-1 pb-1 text-xs text-muted-foreground",children:g("architecture.panHint")})]}),z&&S,B&&e.jsx("p",{role:"alert",className:"px-3 py-2 text-xs text-destructive",children:g("architecture.downloadFailed")}),e.jsxs("div",{className:z?"relative flex min-h-0 flex-1 flex-col overflow-hidden min-[768px]:flex-row":"relative",children:[H?e.jsx("p",{role:"alert",className:"p-4 text-sm text-muted-foreground",children:g("architecture.diagramFailed")}):f?e.jsx("div",{ref:b,"data-sidebar-gesture-ignore":!0,className:`termdock-architecture-viewport overflow-auto overscroll-contain p-3 ${z?"min-h-0 min-w-0 flex-1":"h-[min(50dvh,26rem)]"}`,style:{touchAction:"none",maxHeight:!z&&O.clipHeight?Math.max(160,O.clipHeight-150):void 0},onPointerDown:i=>{if(i.button!==0)return;D.current.size||(E.current=!1,G.current=0);const y=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node")??void 0;D.current.set(i.pointerId,{x:i.clientX,y:i.clientY,nodeId:y}),D.current.size>1&&(E.current=!0);try{i.currentTarget.setPointerCapture?.(i.pointerId)}catch{}},onPointerMove:i=>{const y=D.current.get(i.pointerId);if(!y)return;const u=[...D.current.values()];D.current.set(i.pointerId,{...y,x:i.clientX,y:i.clientY});const $=[...D.current.values()];if($.length>=2){const w=ee=>Math.hypot(ee[0].x-ee[1].x,ee[0].y-ee[1].y),R=w(u),be=w($);R>0&&pe(K.current*be/R,($[0].x+$[1].x)/2,($[0].y+$[1].y)/2),E.current=!0}else{const w=y.x-i.clientX,R=y.y-i.clientY;G.current+=Math.hypot(w,R),G.current>5&&(E.current=!0),i.currentTarget.scrollLeft+=w,i.currentTarget.scrollTop+=R}},onPointerUp:i=>{const y=D.current.get(i.pointerId),u=D.current.size===1&&!E.current&&y?.nodeId;D.current.delete(i.pointerId),u&&(E.current=!0,Y(u))},onPointerCancel:i=>{D.current.delete(i.pointerId),E.current=!0},onLostPointerCapture:i=>{D.current.delete(i.pointerId)},children:e.jsx("div",{ref:k,role:"group","aria-label":g("architecture.modules"),className:"termdock-architecture-diagram mx-auto",style:je,onClick:i=>{if(E.current)return;const u=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");u&&Y(u)},onKeyDown:i=>{if(i.key!=="Enter"&&i.key!==" ")return;const y=i.target.closest("[data-architecture-node]")?.getAttribute("data-architecture-node");y&&(i.preventDefault(),Y(y))},dangerouslySetInnerHTML:{__html:f}})}):e.jsx("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:g("architecture.rendering")}),z&&h]})]});return z?lt.createPortal(e.jsx("section",{ref:j,tabIndex:-1,role:"dialog","aria-modal":"true","aria-label":g("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:_}),document.body):e.jsx("section",{className:"overflow-clip rounded-xl border border-border/20 bg-surface-2","aria-label":g("architecture.diagram"),children:_})}function ge(t,o){let a=t.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 p=o.replace(/\/+$/,"");if(a.startsWith("/")){if(!a.startsWith(`${p}/`))return null;a=a.slice(p.length+1)}return a=a.replace(/^\.\//,""),a.length<=1024&&Oe(a)?a:null}function rt(t,o){const a=[...t.matchAll(/^# (.+?): hunk \d+,/gm)].map(h=>h[1]),l=(a.length?a:t.split(/\r?\n/).map(h=>h.trim()).filter(Boolean)).map(h=>ge(h,o));if(l.some(h=>h===null))return null;const s=[...new Set(l)];return s.length<=20?s:null}function mt({rootPath:t,initialDirectory:o,selected:a,onChange:p,selectionDisabled:l=!1,compact:s=!1}){const{t:h}=ye(),d=t.replace(/\/+$/,"")||"/",[m,c]=n.useState(()=>o&&ge(o,d)?o.replace(/\/+$/,""):d),[S,C]=n.useState(""),[g,x]=n.useState(null),[k,b]=n.useState(0),[j,P]=n.useState(null);n.useEffect(()=>{if(!j)return;const N=window.setTimeout(()=>P(null),1800);return()=>window.clearTimeout(N)},[j]);const J=Ze(N=>N.invalidateDirectoryCache),f=new Set(a.map(N=>`${d==="/"?"":d}/${N}`)),L=N=>{const K=ge(N,d);l||!K||a.includes(K)||a.length>=20||p([...a,K])},H=N=>{N!==d&&!ge(N,d)||(c(N),C(""),x(null))},Z=`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 ${s?"h-8 w-8 [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11":"h-11 w-11"}`,q=ge(m,d);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:Z,disabled:m===d,"aria-label":h("rightSidebar.parentFolder"),onClick:()=>H(m.slice(0,m.lastIndexOf("/"))||d),children:e.jsx(Pt,{size:17})}),e.jsx("button",{type:"button",className:Z,disabled:m===d,"aria-label":h("rightSidebar.backToProjectRoot"),onClick:()=>H(d),children:e.jsx(Et,{size:16})}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",title:m,children:q??(m.split("/").pop()||"/")}),q&&e.jsx("button",{type:"button",className:`${Z} text-primary`,disabled:l||!a.includes(q)&&a.length>=20,"aria-label":`${h("architecture.addScopeReference")}: ${m.split("/").pop()}`,title:q,"aria-pressed":a.includes(q),onClick:()=>L(m),children:a.includes(q)?e.jsx(wt,{size:15}):e.jsx(Mt,{size:15})}),e.jsx("button",{type:"button",className:Z,"aria-label":h("rightSidebar.refreshFiles"),onClick:()=>{J(m,!0),b(N=>N+1)},children:e.jsx(ut,{size:15})})]})}),l&&e.jsx("p",{role:"alert",className:"shrink-0 px-3 pb-2 text-xs text-muted-foreground",children:h("architecture.correctPathsFirst")}),e.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 pb-2",children:e.jsx("input",{"aria-label":h("architecture.searchScopePaths"),placeholder:h("architecture.searchScopePaths"),value:S,onChange:N=>C(N.target.value),className:`${s?"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(Dt,{rootPath:m,selectedFilePath:g,onFileSelect:N=>{x(N),L(N)},onDirectoryRoot:H,onPathReference:L,getReferenceText:N=>ge(N,d)??N,query:S,onReferenceCopied:P,copiedReferenceKey:j,onSearchFromDirectory:H,referenceSelection:{paths:f,label:h("architecture.addScopeReference"),disabled:l||a.length>=20}},`${m}:${k}`)})]})}function Vt({rootPath:t,initialDirectory:o,initial:a,onConfirm:p,onCancel:l}){const{t:s}=ye(),h=n.useRef(null);qe(h,!0,l);const d=n.useId(),[m,c]=n.useState(a);n.useEffect(()=>{const C=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=C}},[]);const S="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 lt.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":s("common.cancel"),onClick:l}),e.jsxs("section",{ref:h,id:`${d}-dialog`,tabIndex:-1,role:"dialog","aria-modal":"true","aria-labelledby":d,"aria-describedby":`${d}-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:d,className:"min-w-0 flex-1 text-sm font-semibold",title:s("architecture.browsePathsHint"),children:s("architecture.choosePaths")}),e.jsx("button",{type:"button",className:S,"aria-label":s("common.close"),onClick:l,children:e.jsx($e,{size:17})})]}),e.jsx("p",{id:`${d}-hint`,className:"sr-only",children:s("architecture.browsePathsHint")})]}),e.jsx(mt,{rootPath:t,initialDirectory:o,selected:m,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:[s("architecture.selectedPaths")," ",m.length," / 20"]}),m.length>0&&e.jsx("div",{className:"flex max-h-24 flex-wrap gap-1 overflow-y-auto",children:m.map(C=>e.jsxs("button",{type:"button",className:`${S} min-w-0 max-w-full bg-surface-2`,"aria-label":`${s("architecture.removePath")}: ${C}`,onClick:()=>c(g=>g.filter(x=>x!==C)),children:[e.jsx("span",{className:"truncate font-mono",children:C}),e.jsx($e,{size:13,className:"shrink-0"})]},C))}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:S,onClick:l,children:s("common.cancel")}),e.jsx("button",{type:"button",className:`${S} bg-primary/15 text-primary`,onClick:()=>p(m),children:s("architecture.usePaths")})]})]})]})]}),document.body)}function st({rootPath:t,initial:o,outputFile:a,currentFile:p,currentDirectory:l,active:s=!0,onInsertPrompt:h,onPrepared:d,onClose:m}){const{t:c,locale:S}=ye(),C=n.useRef(null),g=n.useRef(null);qe(g,s,m),n.useLayoutEffect(()=>{s&&g.current?.scrollIntoView?.({block:"start"})},[s]);const[x,k]=n.useState(!1);n.useLayoutEffect(()=>{const v=g.current;if(!s||!v)return;const _=()=>k(v.clientWidth>=900);if(_(),typeof ResizeObserver>"u")return;const i=new ResizeObserver(_);return i.observe(v),()=>i.disconnect()},[s]);const b=n.useId(),[j,P]=n.useState(o.kind),[J,f]=n.useState(o.target),[L,H]=n.useState(o.paths.join(`
|
|
6
|
+
`)),[Z,q]=n.useState(o.depth),[N,K]=n.useState(o.focus),[z,X]=n.useState(null),[ie,de]=n.useState(!1),[he,ne]=n.useState(!1),B=n.useRef(0);n.useEffect(()=>()=>{B.current++},[]),n.useEffect(()=>{s||(B.current++,de(!1),ne(!1))},[s]);const A=rt(L,t),O=p?ge(p,t):null,I=l?ge(l,t):null,D=I?l:O?p.slice(0,p.lastIndexOf("/")):t,G=s&&x&&j!=="project"&&!a&&!he;let Q=null;try{(j==="project"||A)&&(Q=Be({kind:j,target:J,paths:A??[],depth:Z,focus:N}))}catch{}const me=Q?_t(t,S,Q,a):"",W="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",je=`${W} px-3`,pe=`${W} px-1`,U="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",Y=()=>{B.current++,de(!1),X(null)},oe=v=>{H(A?[...new Set([...A,v])].join(`
|
|
7
|
+
`):`${L.trim()}
|
|
8
|
+
${v}`),Y()},V=Q;return e.jsxs("div",{ref:g,id:`${b}-workspace`,tabIndex:-1,className:G?"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:[G&&e.jsxs("section",{"aria-label":c("architecture.choosePaths"),"aria-describedby":`${b}-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")} ${A?.length??0} / 20`,className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:[A?.length??0," / 20"]}),e.jsx("p",{id:`${b}-browser-hint`,className:"sr-only",children:c("architecture.browsePathsHint")})]}),e.jsx(mt,{compact:!0,rootPath:t,initialDirectory:D,selected:A??[],selectionDisabled:!A,onChange:v=>{H(v.join(`
|
|
9
|
+
`)),Y()}})]}),e.jsxs("form",{ref:C,tabIndex:-1,className:`min-w-0 space-y-2.5 rounded-xl border border-border/20 bg-surface-2 p-3 ${G?"max-h-full overflow-y-auto overscroll-contain":""}`,onSubmit:v=>{if(v.preventDefault(),!V||ie||!s||!C.current)return;const _=++B.current,i=C.current;i.focus({preventScroll:!0}),de(!0),X(null),Promise.resolve().then(()=>_===B.current&&i.isConnected?h(me,i):!1).then(y=>{_===B.current&&(y===!0?(d(a??He(V),V),X("inserted")):X("insertFailed"))}).catch(()=>{_===B.current&&X("insertFailed")}).finally(()=>{_===B.current&&de(!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:`${je} px-2`,"aria-label":c("architecture.closePreparation"),onClick:m,children:e.jsx($e,{size:16})})]}),e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${b}-kind`,children:[e.jsx("span",{children:c("architecture.analysisRange")}),e.jsxs("select",{id:`${b}-kind`,className:U,value:j,disabled:!!a,onChange:v=>{P(v.target.value),Y()},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")})]})]}),j==="feature"&&e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${b}-target`,children:[e.jsx("span",{children:c("architecture.featureTarget")}),e.jsx("input",{id:`${b}-target`,className:U,value:J,readOnly:!!a,maxLength:1e3,placeholder:c("architecture.featurePlaceholder"),onChange:v=>{f(v.target.value),Y()},"aria-describedby":`${b}-validation`})]}),j!=="project"&&e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"block text-xs",htmlFor:`${b}-paths`,children:c(j==="module"?"architecture.modulePaths":"architecture.startPaths")}),e.jsx("textarea",{id:`${b}-paths`,className:`${U} resize-y font-mono text-xs`,rows:2,value:L,readOnly:!!a,placeholder:c("architecture.modulePlaceholder"),onChange:v=>{H(v.target.value),Y()},onBlur:()=>{!a&&A&&H(A.join(`
|
|
10
|
+
`))},onPaste:v=>{if(a)return;const _=rt(v.clipboardData.getData("text/plain"),t);if(!_?.length||!A)return;const i=[...new Set([...A,..._])];i.length>20||(v.preventDefault(),H(i.join(`
|
|
11
|
+
`)),Y())},"aria-describedby":`${b}-paths-hint ${b}-validation`}),!a&&e.jsxs("div",{className:"flex flex-wrap gap-1",children:[!G&&e.jsxs("button",{type:"button",className:`${pe} text-primary`,"aria-label":c("architecture.choosePaths"),onClick:()=>ne(!0),children:[e.jsx(It,{size:14}),c("architecture.browsePaths")]}),I&&e.jsx("button",{type:"button",className:pe,disabled:!!A?.includes(I)||(A?.length??0)>=20,title:I,onClick:()=>oe(I),children:c("architecture.useCurrentDirectory")}),O&&e.jsx("button",{type:"button",className:pe,disabled:!!A?.includes(O)||(A?.length??0)>=20,title:O,onClick:()=>oe(O),children:c("architecture.useCurrentFile")})]}),e.jsx("p",{id:`${b}-paths-hint`,className:"text-xs leading-relaxed text-muted-foreground",title:t,children:c("architecture.pathsHint")})]}),!Q&&(L.trim()||J.trim())&&e.jsx("p",{id:`${b}-validation`,role:"alert",className:"text-xs text-muted-foreground",children:c(j==="module"?"architecture.invalidPaths":"architecture.requiredFeature")}),e.jsxs("label",{className:"block space-y-1 text-xs",htmlFor:`${b}-focus`,children:[e.jsx("span",{children:c("architecture.focus")}),e.jsx("textarea",{id:`${b}-focus`,className:`${U} resize-y`,rows:2,maxLength:2e3,value:N,placeholder:c("architecture.focusPlaceholder"),onChange:v=>{K(v.target.value),Y()}})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{type:"submit",disabled:!Q||ie,className:`${je} bg-primary/15 text-primary`,children:c(ie?"architecture.inserting":"architecture.insertPrompt")}),e.jsxs("button",{type:"button",disabled:!Q||ie,className:je,onClick:()=>{if(!V)return;const v=++B.current;Promise.resolve().then(()=>navigator.clipboard.writeText(me)).then(()=>{v===B.current&&(d(a??He(V),V),X("copied"))}).catch(()=>{v===B.current&&X("failed")})},children:[e.jsx(vt,{size:14}),c("architecture.copyPrompt")]})]}),z&&e.jsx("p",{role:"status",className:"text-xs text-muted-foreground",children:c(`architecture.${z}`)}),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:`${b}-depth`,children:[e.jsx("span",{children:c("architecture.dependencyDepth")}),e.jsxs("select",{id:`${b}-depth`,className:U,value:Z,onChange:v=>{q(v.target.value),Y()},children:[e.jsx("option",{value:"boundary",children:c("architecture.boundaryDepth")}),e.jsx("option",{value:"dependencies",children:c("architecture.followDepth")})]})]}),j==="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:me,className:`${U} 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")})]}),s&&he&&e.jsx(Vt,{rootPath:t,initialDirectory:D,initial:A??[],onCancel:()=>ne(!1),onConfirm:v=>{H(v.join(`
|
|
12
|
+
`)),ne(!1),Y()}})]})}function Kt({node:t,view:o,parentId:a,onSelect:p,onExplore:l,onAnalyze:s,onOpenFile:h,onClose:d,embedded:m=!1}){const{t:c}=ye(),S=We(o,a),C=S.edges.filter(x=>x.from===t.id||x.to===t.id),g="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:m?"space-y-3":"space-y-3 rounded-xl border border-primary/30 bg-surface-2 p-3","aria-label":t.title,children:[!m&&e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("h3",{className:"pt-2 text-sm font-semibold",children:t.title}),e.jsx("button",{type:"button",className:`${g} shrink-0 px-2`,"aria-label":c("architecture.closeDetail"),onClick:d,children:e.jsx($e,{size:16})})]}),e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed",children:t.summary}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[o.nodes.some(x=>x.parentId===t.id)&&e.jsxs("button",{type:"button",className:`${g} bg-primary/15 text-primary`,onClick:l,children:[c("architecture.explore"),e.jsx(Fe,{size:14})]}),t.files.length>0&&e.jsxs("button",{type:"button",className:`${g} text-primary`,onClick:s,children:[e.jsx(dt,{size:14}),c("architecture.analyzeModule")]})]}),C.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:C.map((x,k)=>{const b=x.from===t.id,j=S.nodes.find(P=>P.id===(b?x.to:x.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:()=>p(j.id),"aria-label":`${c(b?"architecture.outgoing":"architecture.incoming")}: ${j.title} · ${x.label}`,children:[b?e.jsx(Nt,{size:15,className:"shrink-0 text-primary"}):e.jsx(Ft,{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(b?"architecture.outgoing":"architecture.incoming")," · ",x.label]})]}),e.jsx(Fe,{size:14,className:"shrink-0"})]},`${x.from}:${x.to}:${k}`):null})})]}),t.files.length>0&&e.jsxs("details",{open:t.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")," (",t.files.length,")"]}),t.files.map(x=>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:()=>h(x),children:[x.path,x.line?`:${x.line}`:""]},`${x.path}:${x.line??""}`))]})]})}function Xt({title:t,stageKey:o,source:a=!1,fullHeight:p=!1,inGraph:l=!1,docked:s=!1,side:h=!1,active:d=!0,onBack:m,backLabel:c,onClose:S,onDismiss:C,onCollapse:g,children:x}){const{t:k}=ye(),b=n.useRef(null),j=n.useRef(null),P=n.useRef(new Map);qe(b,d&&!l&&(!s||p),C),n.useLayoutEffect(()=>{j.current&&(j.current.scrollTop=P.current.get(o)??0),d&&b.current?.querySelector("button:not(:disabled)")?.focus({preventScroll:!0})},[o,d]);const J=s?p?"relative h-full w-full flex-1":h?"relative h-full w-[22rem] max-w-[40%] shrink-0":"relative h-[48%] max-h-96 w-full shrink-0":l?`${a||p?"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||p?"min-[768px]:w-[min(50vw,40rem)]":"min-[768px]:w-[22rem]"}`:h?"inset-y-0 right-0 w-[22rem] max-w-full":"inset-0",f="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",L=()=>{j.current&&P.current.set(o,j.current.scrollTop)};return e.jsxs("aside",{ref:b,tabIndex:-1,role:l||s&&!p?void 0:"dialog","aria-modal":l?void 0:!1,"aria-label":t,"data-architecture-inspector":!0,"data-sidebar-gesture-ignore":!0,onClickCapture:L,className:`${s?"":"absolute"} z-20 flex min-h-0 flex-col overflow-hidden border border-border/30 bg-surface ${s?"":"shadow-xl"} ${J}`,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:f,"aria-label":m?c:k("architecture.closeDetail"),onClick:m??S,children:[e.jsx(kt,{size:17}),e.jsx("span",{children:m?c:k("architecture.backToMap")})]}),e.jsx("h2",{className:"min-w-0 flex-1 truncate text-sm font-semibold",title:t,children:t}),g&&e.jsx("button",{type:"button",className:f,"aria-label":k("architecture.collapseDetail"),onClick:g,children:e.jsx(ct,{size:17})}),m&&e.jsx("button",{type:"button",className:f,"aria-label":k("architecture.closeDetail"),onClick:S,children:e.jsx($e,{size:17})})]}),e.jsx("div",{ref:j,onScroll:L,className:`min-h-0 flex-1 ${a?"overflow-hidden":"overflow-y-auto overscroll-contain p-3"}`,children:x})]})}function Gt({node:t,onExpand:o,onClose:a}){const{t:p}=ye(),l=n.useRef(null),s=n.useRef(null);n.useLayoutEffect(()=>{document.activeElement!==l.current&&(s.current=document.activeElement),l.current?.focus({preventScroll:!0})},[t.id]),n.useLayoutEffect(()=>()=>{s.current?.isConnected&&s.current.focus({preventScroll:!0})},[]);const h="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:l,tabIndex:-1,"aria-label":t.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:t.title,children:t.title}),e.jsx("button",{type:"button",className:`${h} text-primary`,onClick:o,children:p("architecture.expandDetail")}),e.jsx("button",{type:"button",className:h,"aria-label":p("architecture.closeDetail"),onClick:a,children:e.jsx($e,{size:17})})]}),e.jsx("p",{className:"line-clamp-2 break-words text-xs leading-relaxed text-muted-foreground",children:t.summary})]})}function Ve(t){return`termdock.architecture.selection:${t}`}function nt(t){try{const o=t?sessionStorage.getItem(Ve(t)):null;return o&&Ee(o)?o:se}catch{return se}}function at(t){try{const o=t?sessionStorage.getItem(Ve(t)):null;return!!o&&Ee(o)}catch{return!1}}function mr({rootPath:t,active:o,onInsertPrompt:a,onOpenFile:p,renderSource:l}){const{t:s,locale:h}=ye(),d=Ze(r=>r.rootPath===t?r.selectedFilePath:null),m=Ze(r=>r.rootPath===t?r.explorerRoot:null),[c,S]=n.useState(()=>nt(t)),[C,g]=n.useState([]),[x,k]=n.useState(!1),[b,j]=n.useState(Ne),[P,J]=n.useState(null),[f,L]=n.useState(null),[H,Z]=n.useState(!0),[q,N]=n.useState(null),[K,z]=n.useState(0),[X,ie]=n.useState(""),[de,he]=n.useState([]),[ne,B]=n.useState(null),[A,O]=n.useState([]),[I,D]=n.useState(null),[E,G]=n.useState(null),[Q,me]=n.useState(null),[W,je]=n.useState(!1),[pe,U]=n.useState(!1),[Y,oe]=n.useState(()=>typeof window<"u"&&window.innerWidth>=768),V=n.useRef(0),v=n.useRef(at(t)),_=n.useRef(null),i=n.useRef(null),[y,u]=n.useState(0),[$,w]=n.useState("auto"),R=$==="auto"?y>=560?"graph":"outline":$,be=n.useRef(null),ee=r=>{v.current=!0,S(r);try{t&&sessionStorage.setItem(Ve(t),r)}catch{}},te=()=>{J(null),be.current?.focus({preventScroll:!0})};n.useEffect(()=>{const r=()=>oe(window.innerWidth>=768);return window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[]),n.useEffect(()=>{const r=_.current;if(!r||!o||typeof ResizeObserver>"u")return;const T=()=>{r.clientWidth>0&&u(r.clientWidth)};T();const ue=new ResizeObserver(T);return ue.observe(r),()=>ue.disconnect()},[o]),n.useEffect(()=>{L(null),N(null),Z(!0),ie(""),he([]),le(),J(null),S(nt(t)),g([]),k(!1),j(Ne),v.current=at(t)},[t]),n.useEffect(()=>{L(null),N(null),Z(!0),ie(""),he([]),le()},[c]),n.useEffect(()=>{if(!o||!t)return;let r=!1,T=null,ue;const Ge=async gt=>{const Je=++V.current,Te=new AbortController;T=Te,gt&&(Z(!0),N(null));const yt=window.setTimeout(()=>Te.abort(),15e3);try{const[we,Ae]=await Promise.allSettled([Jt(t,Te.signal,c),Zt(t,Te.signal)]);if(r||V.current!==Je)return;if(Ae.status==="fulfilled"?(g(Ae.value),k(!1)):k(!0),we.status==="rejected")throw we.reason;L(Qe=>JSON.stringify(Qe)===JSON.stringify(we.value)?Qe:we.value),N(null),!we.value&&c===se&&!v.current&&Ae.status==="fulfilled"&&Ae.value.length===1&&ee(Ae.value[0])}catch(we){if(r||V.current!==Je)return;N(we instanceof Ye?"format":"load")}finally{window.clearTimeout(yt),!r&&V.current===Je&&(Z(!1),ue=setTimeout(()=>{r||Ge(!1)},1e4))}};return Ge(!0),()=>{r=!0,++V.current,T?.abort(),clearTimeout(ue)}},[t,o,K,c]);const M=f?.perspectives.find(r=>r.id===X)??f?.perspectives[0],ae=n.useMemo(()=>{const r=[];for(const T of de){if(!M?.nodes.some(ue=>ue.id===T&&ue.parentId===r[r.length-1]))break;r.push(T)}return r},[de,M]),fe=ae[ae.length-1],Ce=n.useMemo(()=>M?We(M,fe):null,[M,fe]),ce=Ce?.nodes.find(r=>r.id===ne),ze=M?.nodes.find(r=>r.id===fe),pt=[...new Set([se,...C,c])],De=f?.analysis??(c===se?Ne:b.kind==="project"?null:b),le=()=>{B(null),U(!1),O([]),D(null),G(null),me(null)},Ie=(r,T=!1)=>{O(ue=>T&&ne?[...ue,ne]:[]),U(T),D(null),G(null),me(null),B(r)},Se=r=>{he(r),le(),i.current&&(i.current.scrollTop=0)},ft=r=>{l?(U(!0),D(r)):p(r)},xt=r=>{G({...Ne,kind:"module",paths:[...new Set(r.files.map(T=>T.path))].slice(0,20)}),me(null)},Ke=I?()=>D(null):E?()=>G(null):A.length?()=>{B(A[A.length-1]),O(r=>r.slice(0,-1))}:void 0,bt=s(I||E?"architecture.backToModule":"architecture.previousModule"),Re=W?Y:y>=900,Ue=!Re&&!pe&&!I&&!E,Me=!W&&!!ce&&(!!I||!!E||R==="outline"),xe="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",_e=Ue?le:Ke??(!Re&&R==="graph"?()=>U(!1):le),Xe=r=>ce&&((r||R==="graph")&&Ue?e.jsx(Gt,{node:ce,onExpand:()=>U(!0),onClose:le}):e.jsx(Xt,{active:o&&!E,docked:!r||!I&&!E,title:ce.title,stageKey:`${ce.id}:${I?`${I.path}:${I.line}`:E?"analysis":"details"}`,source:!!I,fullHeight:r?!!E:Me,inGraph:r,side:Re,onBack:Ke,backLabel:bt,onClose:le,onDismiss:_e,onCollapse:!Re&&!Me&&!I&&!E?()=>U(!1):void 0,children:I&&l?l(I):E?e.jsxs(e.Fragment,{children:[e.jsx(st,{active:o,rootPath:t,currentFile:d,currentDirectory:m,initial:E,onInsertPrompt:a,onPrepared:me,onClose:()=>G(null)},ce.id),Q&&e.jsx("button",{type:"button",className:`${xe} mt-3 bg-primary/15 text-primary`,onClick:()=>{j(E),ee(Q),le()},children:s("architecture.viewPrepared")})]}):e.jsx(Kt,{embedded:!0,node:ce,view:M,parentId:fe,onSelect:T=>Ie(T,!0),onExplore:()=>Se([...ae,ce.id]),onAnalyze:()=>xt(ce),onOpenFile:ft,onClose:le})}));return t?e.jsxs("div",{ref:_,className:"relative flex h-full min-h-0 flex-col",onKeyDown:r=>{!W&&ce&&r.key==="Escape"&&!r.defaultPrevented&&!r.nativeEvent.isComposing&&(r.preventDefault(),r.stopPropagation(),_e())},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(et,{size:16}),s("architecture.title")]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs("button",{ref:be,type:"button",className:xe,disabled:!De,onClick:()=>{De&&(le(),J(P?null:{initial:De,...f?{outputFile:c}:{}}))},"aria-expanded":!!P,children:[e.jsx(dt,{size:14}),s(f?"architecture.update":"architecture.generate")]}),(f||c!==se)&&e.jsx("button",{type:"button",className:`${xe} px-2`,"aria-label":s("architecture.newAnalysis"),onClick:()=>{le(),J({initial:Ne})},children:e.jsx(ot,{size:16})}),e.jsx("button",{type:"button",className:`${xe} px-2`,"aria-label":s("architecture.refresh"),disabled:H,onClick:()=>z(r=>r+1),children:e.jsx(ut,{size:15,className:H?"animate-spin":""})})]})]}),e.jsxs("div",{className:`relative flex min-h-0 flex-1 ${Re&&!Me?"flex-row":"flex-col"}`,"data-architecture-workspace":!0,children:[e.jsx("div",{ref:i,hidden:Me,"data-architecture-content":!0,className:`min-h-0 min-w-0 flex-1 overflow-y-auto p-3 [overflow-anchor:none] ${P?"flex flex-col":""}`,children:P?e.jsx(st,{active:o,rootPath:t,currentFile:d,currentDirectory:m,initial:P.initial,outputFile:P.outputFile,onInsertPrompt:a,onPrepared:(r,T)=>{j(T),ee(r)},onClose:te},`${P.outputFile??"new"}:${JSON.stringify(P.initial)}`):e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"mb-3 flex items-center gap-2 text-xs text-muted-foreground",children:[s("architecture.savedAnalyses"),e.jsx("select",{"aria-label":s("architecture.savedAnalyses"),value:c,onChange:r=>{j(Ne),ee(r.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:pt.map(r=>e.jsx("option",{value:r,children:r===se?s("architecture.projectRange"):`${s(r.includes("/module-")?"architecture.moduleRange":"architecture.featureRange")}: ${r===c&&f?.analysis?f.analysis.target.replace(/\n/g,", "):qt(r)}`},r))})]}),x&&e.jsx("p",{role:"alert",className:"mb-3 text-xs text-muted-foreground",children:s("architecture.libraryFailed")}),H&&!f&&e.jsx("p",{role:"status",className:"py-4 text-sm text-muted-foreground",children:s("architecture.loading")}),q&&e.jsxs("div",{role:"alert",className:"mb-3 rounded-lg border border-destructive/30 p-3 text-sm",children:[e.jsx("p",{children:s(q==="format"?"architecture.invalid":"architecture.loadFailed")}),f&&e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:s("architecture.previous")}),e.jsx("button",{type:"button",className:`${xe} mt-2 bg-surface-2`,onClick:()=>z(r=>r+1),children:s("architecture.retry")})]}),!H&&!q&&!f&&e.jsxs("div",{className:"flex flex-col items-center gap-3 px-4 py-8 text-center",children:[e.jsx(et,{size:32,className:"text-muted-foreground"}),e.jsx("h2",{className:"text-base font-medium",children:s("architecture.empty")}),e.jsx("p",{className:"max-w-sm text-sm leading-relaxed text-muted-foreground",children:s(c===se?"architecture.emptyHint":"architecture.awaitingFile")})]}),f&&M&&Ce&&e.jsxs("div",{className:"space-y-3",children:[!De&&e.jsx("p",{className:"text-xs text-muted-foreground",children:s("architecture.scopeUnavailable")}),f.analysis&&e.jsxs("p",{className:"break-words text-xs text-muted-foreground",children:[s(`architecture.${f.analysis.kind}Range`),f.analysis.target?` · ${f.analysis.target.replace(/\n/g,", ")}`:""," · ",s(f.analysis.depth==="boundary"?"architecture.boundaryDepth":"architecture.followDepth")]}),f.summary.length<=240&&e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed text-muted-foreground",children:f.summary}),e.jsxs("label",{className:"sticky -top-3 z-10 !mt-0 -mx-3 flex items-center gap-2 bg-surface px-3 py-2 text-xs text-muted-foreground",children:[s("architecture.perspective"),e.jsx("select",{"aria-label":s("architecture.perspective"),value:M.id,onChange:r=>{ie(r.target.value),Se([])},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:f.perspectives.map(r=>e.jsx("option",{value:r.id,children:r.title},r.id))})]}),ae.length>0&&e.jsxs("nav",{className:"flex flex-wrap items-center gap-1 text-xs","aria-label":s("architecture.breadcrumb"),children:[e.jsx("button",{type:"button",className:`${xe} px-2`,onClick:()=>Se([]),children:M.title}),ae.map((r,T)=>e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Fe,{size:12}),e.jsx("button",{type:"button",className:`${xe} px-2`,onClick:()=>Se(ae.slice(0,T+1)),children:M.nodes.find(ue=>ue.id===r)?.title})]},r))]}),e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed text-muted-foreground",children:ze?.summary??M.summary}),e.jsx("div",{role:"group","aria-label":s("architecture.browseMode"),className:"flex gap-1 rounded-lg bg-surface-2 p-1",children:["outline","graph"].map(r=>e.jsx("button",{type:"button","aria-pressed":R===r,className:`${xe} flex-1 ${R===r?"bg-surface text-primary":"text-muted-foreground"}`,onClick:()=>w(r),children:s(r==="outline"?"architecture.outlineMode":"architecture.graphMode")},r))}),R==="graph"?e.jsxs(e.Fragment,{children:[e.jsx(Yt,{view:M,parentId:fe,selectedId:ne,onSelect:Ie,active:o,referenceWidth:y,inspector:Xe(!0),inspectorStage:I?"source":E?"analysis":Ue?"preview":"details",onDismissInspector:_e,onExpandedChange:r=>{je(r),r||le()},heading:e.jsxs("div",{className:"relative",children:[e.jsx("select",{"aria-label":s("architecture.perspective"),title:M.title,value:M.id,onChange:r=>{ie(r.target.value),Se([])},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:f.perspectives.map(r=>e.jsx("option",{value:r.id,children:r.title},r.id))}),e.jsx(ct,{size:12,className:"pointer-events-none absolute right-0 top-1/2 -translate-y-1/2 text-muted-foreground"})]}),navigation:ae.length>0?e.jsxs("nav",{"aria-label":s("architecture.breadcrumb"),className:"flex items-center gap-1 px-2",children:[e.jsx("button",{type:"button",className:`${xe} shrink-0 px-2`,onClick:()=>Se(ae.slice(0,-1)),children:s("architecture.parentModule")}),e.jsxs("span",{className:"truncate text-xs text-muted-foreground",children:[M.title," / ",ze?.title]})]}):void 0}),e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:[s("architecture.modules")," (",Ce.nodes.length,")"]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:Ce.nodes.map(r=>e.jsx("button",{type:"button","aria-pressed":ce?.id===r.id,className:`${xe} bg-surface-2`,onClick:()=>Ie(r.id),children:r.title},r.id))})]})]}):e.jsx("div",{className:"space-y-2",role:"group","aria-label":s("architecture.modules"),children:Ce.nodes.map(r=>e.jsx("div",{children:e.jsxs("button",{type:"button","aria-label":r.title,"aria-expanded":ce?.id===r.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:()=>Ie(r.id),children:[e.jsxs("span",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:r.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:r.summary})]})},r.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:[s("architecture.analysisNotes")," · ",s("architecture.savedAt")," ",new Date(f.generatedAt).toLocaleString(h==="zh"?"zh-CN":"en-US")]}),e.jsxs("div",{className:"space-y-3 pb-3",children:[f.summary.length>240&&e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm leading-relaxed text-muted-foreground",children:f.summary}),f.details?.limitations.length?e.jsxs("div",{children:[e.jsx("h3",{className:"mb-1 text-xs font-semibold",children:s("architecture.limitations")}),e.jsx("ul",{className:"list-disc space-y-1 pl-4 text-xs leading-relaxed text-muted-foreground",children:f.details.limitations.map((r,T)=>e.jsx("li",{children:r},T))})]}):null,f.details?.analyzedPaths.length?e.jsxs("details",{children:[e.jsxs("summary",{className:"min-h-11 cursor-pointer py-3 text-xs text-muted-foreground",children:[s("architecture.analyzedPaths")," (",f.details.analyzedPaths.length,")"]}),f.details.analyzedPaths.map(r=>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:()=>p({path:r}),children:r},r))]}):null]})]}),ze&&ze.files.length>0&&e.jsxs("details",{children:[e.jsx("summary",{className:"cursor-pointer py-2 text-xs text-muted-foreground",children:s("architecture.sourceFiles")}),ze.files.map(r=>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:()=>p(r),children:[r.path,r.line?`:${r.line}`:""]},`${r.path}:${r.line??""}`))]})]})]})}),o&&!W&&Xe(!1)]})]}):e.jsx("p",{className:"p-5 text-sm text-muted-foreground",children:s("fileTree.noWorkingDir")})}export{mr as ArchitecturePanel};
|
|
Binary file
|
|
Binary file
|
package/dist/client/assets/{ChangeWalkthroughPanel-BrAwRa20.js → ChangeWalkthroughPanel-RoMt6giT.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ae as re,da as ce,bx as s,e as le}from"./app-BJP8Xgmi.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as de}from"./sparkles-D4t6BWgT.js";import{M as me,G as he,L as xe,T as ue,C as fe}from"./triangle-alert-Cf9mn5Ug.js";const pe=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],ye=re("chevron-left",pe);const ge=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],be=re("minimize-2",ge);function ke(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ve(t){switch(t){case"entry":case"source":return"bg-sky-400";case"ui":return"bg-fuchsia-400";case"risk":return"bg-destructive";case"test":return"bg-emerald-400";default:return"bg-primary"}}function Ne(t){if(!t)return;const d=typeof t.sectionIndex=="number"?` section ${t.sectionIndex+1}`:"",i=typeof t.hunkIndex=="number"?` hunk ${t.hunkIndex+1}`:"";return`${t.filePath}${i}${d}`}function Q({anchor:t,children:d,onNavigate:i,className:o,style:r,elementRef:g,onActivate:l}){return!t&&!l?s.jsx("span",{ref:g,className:o,style:r,children:d}):s.jsx("button",{ref:g,type:"button",onClick:()=>{l?.(),t&&i(t)},title:Ne(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const H=190,X=92,q=132,we=28,C=16,J=18,T=54,ee=24,ae=18,je=8,B=24,z=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function te(t){return z[t%z.length]}function Me(t,d){return`${t.from}->${t.to}:${d}`}function Ee(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(X,36+Math.max(0,o-1)*ae)}function ne(t,d,i){if(i<=1)return t.y+t.height/2;const o=Math.max(0,t.height-36),r=Math.min(o,(i-1)*ae);return t.y+t.height/2-r/2+r/(i-1)*d}function se(t,d,i){return t.slice().sort((o,r)=>{const g=d[o],l=d[r],a=i==="from"?g.toNode:g.fromNode,h=i==="from"?l.toNode:l.fromNode;return a.y-h.y||a.index-h.index||g.index-l.index})}function $e(t,d){const i=new Map;for(const o of t){if(Math.abs(o.toNode.layer-o.fromNode.layer)!==1)continue;const r=`${o.fromNode.layer}:${o.toNode.layer}`,g=i.get(r)??[];g.push(o),i.set(r,g)}for(const o of i.values()){o.sort((h,u)=>(h.fromY+h.toY)/2-(u.fromY+u.toY)/2||h.index-u.index);const r=[];o.forEach((h,u)=>{const N=(h.fromY+h.toY)/2,M=Math.max(B,d[h.key]??0)/2;if(u===0){r.push(N);return}const w=o[u-1],E=Math.max(B,d[w.key]??0)/2;r.push(Math.max(N,r[u-1]+E+M+je))});const g=r.reduce((h,u,N)=>h+u-(o[N].fromY+o[N].toY)/2,0)/Math.max(1,r.length),l=Math.min(...r.map((h,u)=>h-g-Math.max(B,d[o[u].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,u)=>{h.laneY=r[u]-g+a})}}function _e(t,d,i={},o={}){const r=new Map(t.map((n,m)=>[n.id,{node:n,index:m}])),g=d.filter(n=>r.has(n.from)&&r.has(n.to)),l=new Map,a=new Map;for(const n of t)l.set(n.id,[]),a.set(n.id,[]);for(const n of g)l.get(n.to)?.push(n.from),a.get(n.from)?.push(n.to);const h=new Map,u=new Set,N=n=>{const m=h.get(n);if(m!==void 0)return m;if(u.has(n))return 0;u.add(n);const c=l.get(n)??[],x=c.length===0?0:Math.max(...c.map(N))+1;return u.delete(n),h.set(n,x),x};for(const n of t)N(n.id);const M=new Map;for(const n of t){const m=h.get(n.id)??0,c=M.get(m)??[],x=r.get(n.id);x&&c.push(x),M.set(m,c)}const w=[];for(const[n,m]of M.entries()){m.sort((x,f)=>x.index-f.index);let c=C+T;m.forEach(({node:x,index:f},j)=>{const I=Math.max(Ee(x.id,l,a),Math.ceil(i[x.id]??X));w.push({node:x,index:f,layer:n,row:j,x:C+n*(H+q),y:c,height:I}),c+=I+we})}const E=new Map(w.map(n=>[n.node.id,n])),v=g.flatMap((n,m)=>{const c=E.get(n.from),x=E.get(n.to);return!c||!x?[]:[{...n,key:Me(n,m),index:m,fromNode:c,toNode:x,routeIndex:m,fromPortIndex:0,toPortIndex:0,fromY:c.y+c.height/2,toY:x.y+x.height/2,laneY:(c.y+c.height/2+x.y+x.height/2)/2}]}),$=new Map,G=new Map;v.forEach((n,m)=>{$.set(n.from,[...$.get(n.from)??[],m]),G.set(n.to,[...G.get(n.to)??[],m])});for(const[n,m]of $){const c=se(m,v,"from");c.forEach((x,f)=>{const j=v[x];j.fromPortIndex=f,j.fromY=ne(E.get(n),f,c.length)})}for(const[n,m]of G){const c=se(m,v,"to");c.forEach((x,f)=>{const j=v[x];j.toPortIndex=f,j.toY=ne(E.get(n),f,c.length)})}$e(v,o);let Y=0;v.forEach(n=>{const m=Math.min(n.fromNode.layer,n.toNode.layer),c=Math.max(n.fromNode.layer,n.toNode.layer);if(c-m<=1)return;const f=Y;Y+=1,n.routeIndex=f;const j=w.filter(A=>A.layer>=m&&A.layer<=c),I=Math.min(...j.map(A=>A.y))-ee-(Math.floor(f/2)+1)*J,S=Math.max(...j.map(A=>A.y+A.height))+ee+(Math.floor(f/2)+1)*J;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+T+X,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(B,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*H+O*q,height:W+C+T}}function oe(t,d=12){const i=t[0];if(!i)return"";const o=[`M ${i.x} ${i.y}`];for(let r=1;r<t.length;r+=1){const g=t[r-1],l=t[r],a=t[r+1];if(!a){o.push(`L ${l.x} ${l.y}`);continue}const h=l.x-g.x,u=l.y-g.y,N=a.x-l.x,M=a.y-l.y,w=Math.abs(h)+Math.abs(u),E=Math.abs(N)+Math.abs(M);if(w===0||E===0||h&&N||u&&M){o.push(`L ${l.x} ${l.y}`);continue}const v=Math.min(d,w/2,E/2),$={x:l.x-Math.sign(h)*v,y:l.y-Math.sign(u)*v},G={x:l.x+Math.sign(N)*v,y:l.y+Math.sign(M)*v};o.push(`L ${$.x} ${$.y}`),o.push(`Q ${l.x} ${l.y} ${G.x} ${G.y}`)}return o.join(" ")}function De(t){const d=t.fromNode.x+H+8,i=t.fromY,o=t.toNode.x-8,r=t.toY,g=Math.abs(t.toNode.layer-t.fromNode.layer),l=d+22+t.fromPortIndex*5,a=o-22-t.toPortIndex*5;return g<=1?oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}]):oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}])}function Ie(t){const d=t.fromNode.x+H+8,i=t.toNode.x-8,o=Math.abs(t.toNode.layer-t.fromNode.layer),r=Math.max(34,Math.abs(i-d));return o<=1?{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(72,Math.min(108,r-34))}:{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(84,Math.min(120,r*.3))}}function Pe({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=ke(t,d),h=D.useRef(new Map),u=D.useRef(new Map),[N,M]=D.useState({}),[w,E]=D.useState({}),[v,$]=D.useState(null),[G,Y]=D.useState(null),[O,W]=D.useState(null),[n,m]=D.useState(null),c=D.useMemo(()=>a?_e(a.nodes,a.edges,N,w):null,[N,w,a]);if(D.useLayoutEffect(()=>{if(!a)return;const e={};for(const p of a.nodes){const b=h.current.get(p.id);b&&(e[p.id]=b.offsetHeight)}M(p=>{const b=Object.keys(p),_=Object.keys(e);return b.length===_.length&&_.every(k=>p[k]===e[k])?p:e});const y={};for(const[p,b]of u.current)y[p]=b.offsetHeight;E(p=>{const b=Object.keys(p),_=Object.keys(y);return b.length===_.length&&_.every(k=>p[k]===y[k])?p:y})},[a]),!a||!c)return null;const x=`walkthrough-arrow-${l.replace(/[^a-zA-Z0-9_-]/g,"")||"default"}`,f=O??n,j=f?null:v??G,I=c.edges.some(e=>e.key===j)?j:null,S=c.edges.find(e=>e.key===I),A=f?c.edges.filter(e=>e.from===f||e.to===f):[],U=f?new Set(A.map(e=>e.key)):null,F=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,K=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??K.get(e.id)),R=L.findIndex(e=>e.id===n),V=e=>{if(L.length===0)return;const y=R<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,R+e)),p=L[y],b=p.anchor??K.get(p.id);b&&(m(p.id),Y(null),i(b))};return s.jsxs("section",{className:"mb-2 px-0 py-0",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/12 text-primary",children:s.jsx(de,{size:14})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("div",{className:"whitespace-normal break-words text-[12px] font-semibold leading-snug text-foreground",children:a.title}),a.summary&&s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:a.summary})]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[o&&L.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("button",{type:"button",onClick:()=>V(-1),disabled:R===0,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Previous change","aria-label":"Previous change",children:s.jsx(ye,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[R<0?"—":R+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>V(1),disabled:R===L.length-1,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Next change","aria-label":"Next change",children:s.jsx(le,{size:15})})]}),r&&s.jsx("button",{type:"button",onClick:r,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:o?"Exit full-screen DAG review":"Review from DAG in full screen","aria-label":o?"Exit full-screen DAG review":"Review from DAG in full screen",children:o?s.jsx(be,{size:15}):s.jsx(me,{size:15})})]})]}),a.highlights.length>0&&s.jsx("div",{className:"mt-2 grid gap-1.5",children:a.highlights.slice(0,4).map((e,y)=>s.jsxs("div",{className:"rounded-md bg-surface-2 px-2 py-1.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.tag&&s.jsx("span",{className:"shrink-0 rounded bg-surface-elevated px-1.5 py-0.5 text-[9px] font-semibold text-primary",children:e.tag}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.what})]}),s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:e.effect})]},`${e.what}-${y}`))}),a.nodes.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2 text-[10px] text-muted-foreground",children:[s.jsxs("div",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-[0.12em]",children:[s.jsx(he,{size:11}),"DAG"]}),a.edges.some(e=>e.label?.trim())&&s.jsx("span",{className:"normal-case tracking-normal",children:g("diffViewer.focusPathHint")})]}),s.jsx("div",{className:"overflow-x-auto rounded-md border border-border/15 bg-surface-2 p-1.5",onWheel:e=>e.stopPropagation(),children:s.jsxs("div",{className:"relative",style:{width:c.width,height:c.height},children:[s.jsxs("svg",{className:"absolute inset-0",width:c.width,height:c.height,"aria-hidden":"true",children:[s.jsx("defs",{children:z.map((e,y)=>s.jsx("marker",{id:`${x}-${y}`,viewBox:"0 0 10 10",refX:"8.5",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto",markerUnits:"strokeWidth",children:s.jsx("path",{d:"M0,0 L10,5 L0,10 Z",fill:e})},e))}),c.edges.map(e=>{const y=De(e),p=te(e.index),b=I===e.key||!!U?.has(e.key),_=!!((I||f)&&!b);return s.jsxs("g",{className:"transition-opacity duration-150",style:{opacity:_?.3:1},children:[s.jsx("path",{className:"pointer-events-none",d:y,fill:"none",stroke:"var(--surface-2)",strokeWidth:b?7:5,strokeLinecap:"round"}),s.jsx("path",{className:"pointer-events-none transition-[stroke-width,opacity] duration-150",d:y,fill:"none",stroke:p,strokeWidth:b?3:1.8,strokeLinecap:"round",markerEnd:`url(#${x}-${e.index%z.length})`}),s.jsx("path",{"data-dag-edge":e.key,d:y,fill:"none",stroke:"transparent",strokeWidth:"14",className:"cursor-pointer",onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(k=>k===e.key?null:k),onClick:()=>{m(null),Y(k=>k===e.key?null:e.key)}}),s.jsx("circle",{className:"pointer-events-none",cx:e.fromNode.x+H+8,cy:e.fromY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"}),s.jsx("circle",{className:"pointer-events-none",cx:e.toNode.x-8,cy:e.toY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"})]},e.key)})]}),c.edges.map(e=>{const y=e.label?.trim();if(!y)return null;const{x:p,y:b,maxWidth:_}=Ie(e),k=te(e.index),Z=I===e.key||!!U?.has(e.key),ie=!!((I||f)&&!Z);return s.jsxs("button",{ref:P=>{P?u.current.set(e.key,P):u.current.delete(e.key)},type:"button","data-dag-edge-label":e.key,className:"absolute -translate-x-1/2 -translate-y-1/2 whitespace-normal break-words rounded-md border bg-surface-elevated px-1.5 py-1 text-center text-[9px] leading-[11px] shadow-sm transition-[opacity,box-shadow,transform] duration-150 [overflow-wrap:anywhere] hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",style:{left:p,top:b,maxWidth:_,width:"max-content",borderColor:k,color:k,opacity:ie?.38:1,boxShadow:Z?`0 0 0 2px ${k}, 0 6px 18px rgb(0 0 0 / 0.24)`:void 0},title:`${e.fromNode.index+1} ${e.fromNode.node.title} → ${e.toNode.index+1} ${e.toNode.node.title}${e.desc?`
|
|
2
|
-
${e.desc}`:""}`,"aria-pressed":G===e.key,onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(P=>P===e.key?null:P),onClick:()=>{m(null),Y(P=>P===e.key?null:e.key)},children:[s.jsxs("span",{className:"block font-bold tabular-nums",children:[e.fromNode.index+1," → ",e.toNode.index+1]}),s.jsx("span",{className:"block text-muted-foreground",children:y})]},`${e.key}-label`)}),c.nodes.map(({node:e,index:y,x:p,y:b,height:_})=>s.jsxs(Q,{elementRef:
|
|
1
|
+
import{ae as re,d6 as ce,bv as s,e as le}from"./app-CHoOHnjf.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as de}from"./sparkles-ButxQzs4.js";import{M as me,G as he,L as ue,T as xe,C as fe}from"./triangle-alert-BRy562K_.js";const pe=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],ye=re("chevron-left",pe);const ge=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],be=re("minimize-2",ge);function ve(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function ke(t){switch(t){case"entry":case"source":return"bg-sky-400";case"ui":return"bg-fuchsia-400";case"risk":return"bg-destructive";case"test":return"bg-emerald-400";default:return"bg-primary"}}function Ne(t){if(!t)return;const d=typeof t.sectionIndex=="number"?` section ${t.sectionIndex+1}`:"",i=typeof t.hunkIndex=="number"?` hunk ${t.hunkIndex+1}`:"";return`${t.filePath}${i}${d}`}function Q({anchor:t,children:d,onNavigate:i,className:o,style:r,elementRef:g,onActivate:l}){return!t&&!l?s.jsx("span",{ref:g,className:o,style:r,children:d}):s.jsx("button",{ref:g,type:"button",onClick:()=>{l?.(),t&&i(t)},title:Ne(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const H=190,X=92,q=132,we=28,C=16,J=18,T=54,ee=24,ae=18,je=8,B=24,z=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function te(t){return z[t%z.length]}function Me(t,d){return`${t.from}->${t.to}:${d}`}function Ee(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(X,36+Math.max(0,o-1)*ae)}function ne(t,d,i){if(i<=1)return t.y+t.height/2;const o=Math.max(0,t.height-36),r=Math.min(o,(i-1)*ae);return t.y+t.height/2-r/2+r/(i-1)*d}function se(t,d,i){return t.slice().sort((o,r)=>{const g=d[o],l=d[r],a=i==="from"?g.toNode:g.fromNode,h=i==="from"?l.toNode:l.fromNode;return a.y-h.y||a.index-h.index||g.index-l.index})}function $e(t,d){const i=new Map;for(const o of t){if(Math.abs(o.toNode.layer-o.fromNode.layer)!==1)continue;const r=`${o.fromNode.layer}:${o.toNode.layer}`,g=i.get(r)??[];g.push(o),i.set(r,g)}for(const o of i.values()){o.sort((h,x)=>(h.fromY+h.toY)/2-(x.fromY+x.toY)/2||h.index-x.index);const r=[];o.forEach((h,x)=>{const N=(h.fromY+h.toY)/2,M=Math.max(B,d[h.key]??0)/2;if(x===0){r.push(N);return}const w=o[x-1],E=Math.max(B,d[w.key]??0)/2;r.push(Math.max(N,r[x-1]+E+M+je))});const g=r.reduce((h,x,N)=>h+x-(o[N].fromY+o[N].toY)/2,0)/Math.max(1,r.length),l=Math.min(...r.map((h,x)=>h-g-Math.max(B,d[o[x].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,x)=>{h.laneY=r[x]-g+a})}}function _e(t,d,i={},o={}){const r=new Map(t.map((n,m)=>[n.id,{node:n,index:m}])),g=d.filter(n=>r.has(n.from)&&r.has(n.to)),l=new Map,a=new Map;for(const n of t)l.set(n.id,[]),a.set(n.id,[]);for(const n of g)l.get(n.to)?.push(n.from),a.get(n.from)?.push(n.to);const h=new Map,x=new Set,N=n=>{const m=h.get(n);if(m!==void 0)return m;if(x.has(n))return 0;x.add(n);const c=l.get(n)??[],u=c.length===0?0:Math.max(...c.map(N))+1;return x.delete(n),h.set(n,u),u};for(const n of t)N(n.id);const M=new Map;for(const n of t){const m=h.get(n.id)??0,c=M.get(m)??[],u=r.get(n.id);u&&c.push(u),M.set(m,c)}const w=[];for(const[n,m]of M.entries()){m.sort((u,f)=>u.index-f.index);let c=C+T;m.forEach(({node:u,index:f},j)=>{const I=Math.max(Ee(u.id,l,a),Math.ceil(i[u.id]??X));w.push({node:u,index:f,layer:n,row:j,x:C+n*(H+q),y:c,height:I}),c+=I+we})}const E=new Map(w.map(n=>[n.node.id,n])),k=g.flatMap((n,m)=>{const c=E.get(n.from),u=E.get(n.to);return!c||!u?[]:[{...n,key:Me(n,m),index:m,fromNode:c,toNode:u,routeIndex:m,fromPortIndex:0,toPortIndex:0,fromY:c.y+c.height/2,toY:u.y+u.height/2,laneY:(c.y+c.height/2+u.y+u.height/2)/2}]}),$=new Map,G=new Map;k.forEach((n,m)=>{$.set(n.from,[...$.get(n.from)??[],m]),G.set(n.to,[...G.get(n.to)??[],m])});for(const[n,m]of $){const c=se(m,k,"from");c.forEach((u,f)=>{const j=k[u];j.fromPortIndex=f,j.fromY=ne(E.get(n),f,c.length)})}for(const[n,m]of G){const c=se(m,k,"to");c.forEach((u,f)=>{const j=k[u];j.toPortIndex=f,j.toY=ne(E.get(n),f,c.length)})}$e(k,o);let Y=0;k.forEach(n=>{const m=Math.min(n.fromNode.layer,n.toNode.layer),c=Math.max(n.fromNode.layer,n.toNode.layer);if(c-m<=1)return;const f=Y;Y+=1,n.routeIndex=f;const j=w.filter(A=>A.layer>=m&&A.layer<=c),I=Math.min(...j.map(A=>A.y))-ee-(Math.floor(f/2)+1)*J,S=Math.max(...j.map(A=>A.y+A.height))+ee+(Math.floor(f/2)+1)*J;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+T+X,...w.map(n=>n.y+n.height),...k.map(n=>n.laneY+Math.max(B,o[n.key]??0)/2));return{nodes:w,edges:k,width:C*2+(O+1)*H+O*q,height:W+C+T}}function oe(t,d=12){const i=t[0];if(!i)return"";const o=[`M ${i.x} ${i.y}`];for(let r=1;r<t.length;r+=1){const g=t[r-1],l=t[r],a=t[r+1];if(!a){o.push(`L ${l.x} ${l.y}`);continue}const h=l.x-g.x,x=l.y-g.y,N=a.x-l.x,M=a.y-l.y,w=Math.abs(h)+Math.abs(x),E=Math.abs(N)+Math.abs(M);if(w===0||E===0||h&&N||x&&M){o.push(`L ${l.x} ${l.y}`);continue}const k=Math.min(d,w/2,E/2),$={x:l.x-Math.sign(h)*k,y:l.y-Math.sign(x)*k},G={x:l.x+Math.sign(N)*k,y:l.y+Math.sign(M)*k};o.push(`L ${$.x} ${$.y}`),o.push(`Q ${l.x} ${l.y} ${G.x} ${G.y}`)}return o.join(" ")}function De(t){const d=t.fromNode.x+H+8,i=t.fromY,o=t.toNode.x-8,r=t.toY,g=Math.abs(t.toNode.layer-t.fromNode.layer),l=d+22+t.fromPortIndex*5,a=o-22-t.toPortIndex*5;return g<=1?oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}]):oe([{x:d,y:i},{x:l,y:i},{x:l,y:t.laneY},{x:a,y:t.laneY},{x:a,y:r},{x:o,y:r}])}function Ie(t){const d=t.fromNode.x+H+8,i=t.toNode.x-8,o=Math.abs(t.toNode.layer-t.fromNode.layer),r=Math.max(34,Math.abs(i-d));return o<=1?{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(72,Math.min(108,r-34))}:{x:(d+i)/2,y:t.laneY,maxWidth:Math.max(84,Math.min(120,r*.3))}}function Pe({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=ve(t,d),h=D.useRef(new Map),x=D.useRef(new Map),[N,M]=D.useState({}),[w,E]=D.useState({}),[k,$]=D.useState(null),[G,Y]=D.useState(null),[O,W]=D.useState(null),[n,m]=D.useState(null),c=D.useMemo(()=>a?_e(a.nodes,a.edges,N,w):null,[N,w,a]);if(D.useLayoutEffect(()=>{if(!a)return;const e={};for(const p of a.nodes){const b=h.current.get(p.id);b&&(e[p.id]=b.offsetHeight)}M(p=>{const b=Object.keys(p),_=Object.keys(e);return b.length===_.length&&_.every(v=>p[v]===e[v])?p:e});const y={};for(const[p,b]of x.current)y[p]=b.offsetHeight;E(p=>{const b=Object.keys(p),_=Object.keys(y);return b.length===_.length&&_.every(v=>p[v]===y[v])?p:y})},[a]),!a||!c)return null;const u=`walkthrough-arrow-${l.replace(/[^a-zA-Z0-9_-]/g,"")||"default"}`,f=O??n,j=f?null:k??G,I=c.edges.some(e=>e.key===j)?j:null,S=c.edges.find(e=>e.key===I),A=f?c.edges.filter(e=>e.from===f||e.to===f):[],U=f?new Set(A.map(e=>e.key)):null,F=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,K=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??K.get(e.id)),R=L.findIndex(e=>e.id===n),V=e=>{if(L.length===0)return;const y=R<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,R+e)),p=L[y],b=p.anchor??K.get(p.id);b&&(m(p.id),Y(null),i(b))};return s.jsxs("section",{className:"mb-2 px-0 py-0",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[s.jsx("span",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/12 text-primary",children:s.jsx(de,{size:14})}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsx("div",{className:"whitespace-normal break-words text-[12px] font-semibold leading-snug text-foreground",children:a.title}),a.summary&&s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:a.summary})]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[o&&L.length>0&&s.jsxs(s.Fragment,{children:[s.jsx("button",{type:"button",onClick:()=>V(-1),disabled:R===0,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Previous change","aria-label":"Previous change",children:s.jsx(ye,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[R<0?"—":R+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>V(1),disabled:R===L.length-1,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95 disabled:pointer-events-none disabled:opacity-30",title:"Next change","aria-label":"Next change",children:s.jsx(le,{size:15})})]}),r&&s.jsx("button",{type:"button",onClick:r,className:"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:o?"Exit full-screen DAG review":"Review from DAG in full screen","aria-label":o?"Exit full-screen DAG review":"Review from DAG in full screen",children:o?s.jsx(be,{size:15}):s.jsx(me,{size:15})})]})]}),a.highlights.length>0&&s.jsx("div",{className:"mt-2 grid gap-1.5",children:a.highlights.slice(0,4).map((e,y)=>s.jsxs("div",{className:"rounded-md bg-surface-2 px-2 py-1.5",children:[s.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[e.tag&&s.jsx("span",{className:"shrink-0 rounded bg-surface-elevated px-1.5 py-0.5 text-[9px] font-semibold text-primary",children:e.tag}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.what})]}),s.jsx("div",{className:"mt-0.5 text-[10px] leading-snug text-muted-foreground",children:e.effect})]},`${e.what}-${y}`))}),a.nodes.length>0&&s.jsxs("div",{className:"mt-2",children:[s.jsxs("div",{className:"mb-1 flex items-center justify-between gap-2 text-[10px] text-muted-foreground",children:[s.jsxs("div",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-[0.12em]",children:[s.jsx(he,{size:11}),"DAG"]}),a.edges.some(e=>e.label?.trim())&&s.jsx("span",{className:"normal-case tracking-normal",children:g("diffViewer.focusPathHint")})]}),s.jsx("div",{className:"overflow-x-auto rounded-md border border-border/15 bg-surface-2 p-1.5",onWheel:e=>e.stopPropagation(),children:s.jsxs("div",{className:"relative",style:{width:c.width,height:c.height},children:[s.jsxs("svg",{className:"absolute inset-0",width:c.width,height:c.height,"aria-hidden":"true",children:[s.jsx("defs",{children:z.map((e,y)=>s.jsx("marker",{id:`${u}-${y}`,viewBox:"0 0 10 10",refX:"8.5",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto",markerUnits:"strokeWidth",children:s.jsx("path",{d:"M0,0 L10,5 L0,10 Z",fill:e})},e))}),c.edges.map(e=>{const y=De(e),p=te(e.index),b=I===e.key||!!U?.has(e.key),_=!!((I||f)&&!b);return s.jsxs("g",{className:"transition-opacity duration-150",style:{opacity:_?.3:1},children:[s.jsx("path",{className:"pointer-events-none",d:y,fill:"none",stroke:"var(--surface-2)",strokeWidth:b?7:5,strokeLinecap:"round"}),s.jsx("path",{className:"pointer-events-none transition-[stroke-width,opacity] duration-150",d:y,fill:"none",stroke:p,strokeWidth:b?3:1.8,strokeLinecap:"round",markerEnd:`url(#${u}-${e.index%z.length})`}),s.jsx("path",{"data-dag-edge":e.key,d:y,fill:"none",stroke:"transparent",strokeWidth:"14",className:"cursor-pointer",onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(v=>v===e.key?null:v),onClick:()=>{m(null),Y(v=>v===e.key?null:e.key)}}),s.jsx("circle",{className:"pointer-events-none",cx:e.fromNode.x+H+8,cy:e.fromY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"}),s.jsx("circle",{className:"pointer-events-none",cx:e.toNode.x-8,cy:e.toY,r:b?4:3,fill:p,stroke:"var(--surface-2)",strokeWidth:"2"})]},e.key)})]}),c.edges.map(e=>{const y=e.label?.trim();if(!y)return null;const{x:p,y:b,maxWidth:_}=Ie(e),v=te(e.index),Z=I===e.key||!!U?.has(e.key),ie=!!((I||f)&&!Z);return s.jsxs("button",{ref:P=>{P?x.current.set(e.key,P):x.current.delete(e.key)},type:"button","data-dag-edge-label":e.key,className:"absolute -translate-x-1/2 -translate-y-1/2 whitespace-normal break-words rounded-md border bg-surface-elevated px-1.5 py-1 text-center text-[9px] leading-[11px] shadow-sm transition-[opacity,box-shadow,transform] duration-150 [overflow-wrap:anywhere] hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",style:{left:p,top:b,maxWidth:_,width:"max-content",borderColor:v,color:v,opacity:ie?.38:1,boxShadow:Z?`0 0 0 2px ${v}, 0 6px 18px rgb(0 0 0 / 0.24)`:void 0},title:`${e.fromNode.index+1} ${e.fromNode.node.title} → ${e.toNode.index+1} ${e.toNode.node.title}${e.desc?`
|
|
2
|
+
${e.desc}`:""}`,"aria-pressed":G===e.key,onPointerEnter:()=>$(e.key),onPointerLeave:()=>$(P=>P===e.key?null:P),onClick:()=>{m(null),Y(P=>P===e.key?null:e.key)},children:[s.jsxs("span",{className:"block font-bold tabular-nums",children:[e.fromNode.index+1," → ",e.toNode.index+1]}),s.jsx("span",{className:"block text-muted-foreground",children:y})]},`${e.key}-label`)}),c.nodes.map(({node:e,index:y,x:p,y:b,height:_})=>s.jsxs(Q,{elementRef:v=>{v?h.current.set(e.id,v):h.current.delete(e.id)},anchor:e.anchor??K.get(e.id),onActivate:()=>{m(e.id),Y(null)},onNavigate:i,className:`absolute overflow-hidden rounded-lg border bg-surface/95 px-2.5 py-2 text-foreground shadow-[0_10px_24px_rgba(0,0,0,0.18)] transition-[opacity,border-color,box-shadow] duration-150 ${F?.has(e.id)?"border-primary/60 shadow-[0_0_0_1px_rgb(var(--primary-rgb)/0.28),0_10px_24px_rgba(0,0,0,0.22)]":F?"border-border/15 opacity-40":"border-border/25"}`,style:{left:p,top:b,width:H,minHeight:_},children:[s.jsx("span",{className:"absolute inset-0",onPointerEnter:()=>W(e.id),onPointerLeave:()=>W(v=>v===e.id?null:v)}),s.jsx("span",{className:`pointer-events-none absolute bottom-2 left-0 top-2 w-[3px] rounded-r-full ${ke(e.kind)}`}),s.jsxs("div",{className:"pointer-events-none relative flex min-w-0 items-center gap-1.5",children:[s.jsx("span",{className:"flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-primary/15 text-[9px] font-bold text-primary",children:y+1}),s.jsx("span",{className:"min-w-0 flex-1 whitespace-normal break-words text-[11px] font-semibold leading-snug text-foreground",children:e.title}),e.anchor&&s.jsx(ue,{size:11,className:"shrink-0 opacity-70"})]}),e.kind&&s.jsx("div",{className:"pointer-events-none relative mt-0.5 truncate text-[9px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/80",children:e.kind}),s.jsx("div",{className:"pointer-events-none relative mt-0.5 whitespace-normal break-words text-[10px] leading-snug text-muted-foreground",children:e.business})]},e.id))]})})]}),(a.risks.length>0||a.checks.length>0)&&s.jsxs("div",{className:"mt-2 grid gap-1.5",children:[a.risks.slice(0,3).map((e,y)=>s.jsxs(Q,{anchor:e.anchor,onNavigate:i,className:"flex w-full items-start gap-1.5 rounded-md border border-[rgb(var(--warning-rgb)_/_0.25)] bg-[rgb(var(--warning-rgb)_/_0.10)] px-2 py-1.5 text-[10px] text-muted-foreground",children:[s.jsx(xe,{size:12,className:"mt-0.5 shrink-0 text-[color:var(--warning)]"}),s.jsx("span",{className:"min-w-0 whitespace-normal break-words leading-snug",children:e.title})]},`${e.title}-${y}`)),a.checks.slice(0,3).map((e,y)=>s.jsxs("div",{className:"flex items-start gap-1.5 rounded-md bg-surface-2 px-2 py-1.5 text-[10px] text-muted-foreground",children:[s.jsx(fe,{size:12,className:"mt-0.5 shrink-0 text-primary"}),s.jsx("span",{className:"min-w-0 whitespace-normal break-words leading-snug",children:e})]},`${e}-${y}`))]})]})}export{Pe as C,be as M,ye as a};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d5 as Y,bA as Z,az as F,a_ as H,cQ as J,S as C,bv as e,T as X,bj as L}from"./app-CHoOHnjf.js";import{b as s}from"./dnd-BCFAPC0L.js";import{a5 as r,Z as I,P as ee,W as te,q as se,R as S,i as ne,$ as ae,a0 as re}from"./App-7k2I_09f.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./gestureArbiter-Do0TIdkh.js";import"./triangle-alert-BRy562K_.js";import"./referenceLongPress-DB039WbW.js";function xe({groupId:m,activeSessionId:n,onOpenSidebar:h,leftSidebarVisible:R=!1,onToggleRightSidebar:b,rightSidebarOpen:g=!1,defaultSessionMode:T}){const j=s.useRef(null);s.useEffect(()=>{j.current?.focus()},[]);const[i,v]=s.useState(null),[z,D]=s.useState([]),[u,x]=s.useState(null),[y,P]=s.useState(null),[p,$]=s.useState(null),[G,A]=s.useState(null),o=Y(),[W,w]=s.useState(!1);s.useEffect(()=>{if(o==="ready"){w(!1);return}const t=setTimeout(()=>w(!0),1e3);return()=>clearTimeout(t)},[o]);const M=r(t=>t.view),V=r(t=>t.drafts),N=r(t=>t.setDraft),[_,q]=s.useState(m),l=s.useCallback(async()=>{try{const t=await Z();v(t),x(null)}catch(t){x(t instanceof Error?t.message:"协作组加载失败")}},[]);s.useEffect(()=>{let t=!1;F().then(c=>{t||D(c)}).catch(()=>{}),H().then(c=>{if(t)return;const Q=c.collaborationPanels?.[I()]?.drafts;for(const[k,U]of Object.entries(Q??{}))r.getState().drafts[k]||N(k,U)}).catch(()=>{});const K=J(c=>{t||(v(c),x(null))});l();const a=()=>{!document.hidden&&navigator.onLine!==!1&&l()},O=setInterval(a,1e4);return document.addEventListener("visibilitychange",a),window.addEventListener(C,a),window.addEventListener("pageshow",a),()=>{t=!0,K(),clearInterval(O),document.removeEventListener("visibilitychange",a),window.removeEventListener(C,a),window.removeEventListener("pageshow",a)}},[l]);const d=i?.groups.find(t=>t.id===m),f=i?.sessions.find(t=>t.sessionId===n),B=n?f?.name?`终端 · ${f.name}`:"继续终端会话":"选择终端",E=async t=>{await re(t),r.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",{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:[!R&&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:h,children:e.jsx(ee,{size:17})}),e.jsx(te,{size:18,className:"hidden shrink-0 text-primary sm:block"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{ref:j,tabIndex:-1,className:"truncate text-base font-semibold outline-none",children:d?.name??"协作工作区"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:d?`${d.sessionIds.length} 位成员`:"正在连接工作组"})]}),b&&e.jsx("button",{type:"button","aria-label":"文件侧栏",title:"文件侧栏","aria-pressed":g,className:`inline-flex min-h-11 min-w-11 items-center justify-center rounded-lg ${g?"bg-surface-2 text-primary":"text-muted-foreground hover:bg-surface-2"}`,onClick:b,children:e.jsx(se,{size:17})}),e.jsxs("button",{type:"button","aria-label":n?`打开终端:${f?.name??"当前会话"}`:"选择终端",title:n?`切换到${f?.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:()=>{n?r.getState().terminal():h()},children:[e.jsx(X,{size:17,className:"shrink-0"}),e.jsx("span",{className:"hidden min-w-0 truncate sm:inline",children:B}),e.jsx("span",{className:"sm:hidden",children:n?"终端":"选择终端"})]})]}),e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col px-4 py-2 sm:px-6",children:[(W||L(u))&&e.jsxs("div",{role:"status",className:"mb-2 flex shrink-0 items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(S,{size:13,className:o==="offline"?"":"animate-spin"}),e.jsx("span",{children:o==="offline"?"网络已断开,联网后自动恢复":"正在恢复连接,当前结果和草稿已保留"})]}),(y||u&&o==="ready"&&!L(u))&&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||u}),e.jsx("button",{type:"button","aria-label":"重新加载协作组",className:"min-h-11 px-3",onClick:()=>{l()},children:e.jsx(S,{size:14})})]}),p&&e.jsx("p",{role:"status",className:"mb-3 shrink-0 text-xs text-primary",children:p}),i?d?e.jsx(ne,{fullWorkspace:!0,initialView:M,active:!0,notice:p,groups:i.groups,sessions:i.sessions,agents:z,sessionsState:"loaded",selectedGroupId:_,setSelectedGroupId:q,initialGroupId:m,activeSessionId:n,initialDrafts:V,onDraftChange:N,docked:!1,inputKeySuffix:"main",floatingVisible:!0,floating:!1,onOpenSession:E,onOpenTaskSession:E,onDockMessages:n?async()=>{await ae(m,n)}:void 0,defaultSessionMode:T,busy:G,setBusy:A,setError:P,setNotice:$,refresh:l}):e.jsx("p",{className:"py-10 text-center text-sm text-muted-foreground",children:"协作组已移除或暂不可用。任务记录仍保留在原服务中。"}):e.jsx("p",{role:"status",className:"py-10 text-center text-sm text-muted-foreground",children:"正在加载协作工作区…"})]})]})}export{xe as default};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{bv as r}from"./app-CHoOHnjf.js";import{b as m}from"./dnd-BCFAPC0L.js";import{b as n}from"./RightSidebar-BOBbegdP.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./App-7k2I_09f.js";import"./gestureArbiter-Do0TIdkh.js";import"./triangle-alert-BRy562K_.js";import"./referenceLongPress-DB039WbW.js";import"./DiffReview-IEcDVREB.js";import"./sparkles-ButxQzs4.js";import"./DiffViewer-B2Rue9PA.js";import"./ChangeWalkthroughPanel-RoMt6giT.js";function v({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{v as default};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rdpSession-DL1rZ49m.js","assets/app-CHoOHnjf.js","assets/react-XDCjal2T.js","assets/dnd-BCFAPC0L.js","assets/terminal-C7X98Amf.js","assets/index-D2_-ypCL.css","assets/ChangeWalkthroughPanel-RoMt6giT.js","assets/sparkles-ButxQzs4.js","assets/triangle-alert-BRy562K_.js","assets/RightSidebar-BOBbegdP.js","assets/App-7k2I_09f.js","assets/gestureArbiter-Do0TIdkh.js","assets/gestureArbiter-C2J0D0kV.css","assets/referenceLongPress-DB039WbW.js","assets/DiffReview-IEcDVREB.js","assets/DiffViewer-B2Rue9PA.js","assets/DiffViewer-T3uj2-aP.css","assets/RightSidebar-DW-JEgm2.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{ae as Me,ct as lt,d6 as et,bv as t,cq as Ce,bu as _e,W as Xe,o as We,l as ut,X as dt,_ as qe}from"./app-CHoOHnjf.js";import{b as o,r as mt}from"./dnd-BCFAPC0L.js";import{a as pt}from"./ChangeWalkthroughPanel-RoMt6giT.js";import{L as Ge}from"./RightSidebar-BOBbegdP.js";import{U as Je,K as ft,g as ht}from"./App-7k2I_09f.js";import{M as xt}from"./triangle-alert-BRy562K_.js";const gt=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],Qe=Me("mouse-pointer-2",gt);const bt=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],yt=Me("settings-2",bt);const vt=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],wt=Me("zoom-in",vt);function Ie(e){const s=e==="darwin"?"mac":e==="win32"?"windows":"linux",m={host:"127.0.0.1",platform:s,protocol:s==="mac"?"vnc":"rdp",port:"3389",username:"",domain:"",ignoreCert:!1,rememberLogin:!0};return{target:"local",local:m,remote:{...m,host:""},viewOnly:!1,fit:!0,autoConnect:!0}}function Ze(e,s){const m=Ie(s);if(!e||typeof e!="object")return m;const i=e,h=(c,x)=>{const l=c&&typeof c=="object"?c:{},R=(d,V)=>typeof l[d]=="string"&&l[d].length<=V&&!/[\x00-\x1f]/.test(l[d])?l[d]:x[d];return{host:R("host",253),username:R("username",255),domain:R("domain",255),platform:["mac","linux","windows"].includes(String(l.platform))?l.platform:x.platform,protocol:l.protocol==="rdp"||l.protocol==="vnc"?l.protocol:x.protocol,port:typeof l.port=="string"&&/^\d{0,5}$/.test(l.port)&&Number(l.port)<=65535?l.port:x.port,ignoreCert:l.ignoreCert===!0,rememberLogin:l.rememberLogin!==!1}};return{target:i.target==="remote"?"remote":"local",local:{...h(i.local,m.local),host:"127.0.0.1"},remote:h(i.remote,m.remote),viewOnly:i.viewOnly===!0,fit:i.fit!==!1,autoConnect:i.autoConnect!==!1}}function tt(e){return JSON.stringify([e.host.trim().toLowerCase(),e.protocol,e.protocol==="vnc"?5900:Number(e.port),e.username.trim(),e.domain.trim()])}function Ct(e){const[s,m]=o.useState(Ie),[i,h]=o.useState(!1),[c,x]=o.useState("loading"),[l,R]=o.useState(0),[d,V]=o.useState([]),[H,D]=o.useState("idle"),P=o.useRef(s),z=o.useRef(0),w=o.useRef(0),U=o.useRef(""),C=o.useRef(null),j=o.useRef(new Set),Y=o.useCallback(y=>{P.current=y(P.current),z.current++,m(P.current),x("saving")},[]);o.useEffect(()=>{const y=++w.current;z.current=0,U.current="",C.current=null,P.current=Ie(),m(P.current),h(!1),x("loading"),V([]),D("idle");const N=new AbortController;return fetch("/api/computer/preferences",{signal:N.signal}).then(async p=>{if(!p.ok)throw new Error("PREFERENCES_LOAD_FAILED");return await p.json()}).then(p=>{if(y!==w.current||N.signal.aborted)return;let E=Ze(p.preferences);const I=z.current>0;if(!p.configured&&!I)try{const L=localStorage.getItem(`termdock:computer-host:${e}`);if(L){const B=/^(127\.0\.0\.1|localhost|::1|\[::1\])$/i.test(L)?"local":"remote";E=Ze({...E,target:B,[B]:{...E[B],host:L,platform:localStorage.getItem(`termdock:computer-platform:${e}`)||E[B].platform,protocol:localStorage.getItem(`termdock:computer-protocol:${e}`)||"vnc",port:localStorage.getItem(`termdock:computer-rdp-port:${e}`)||"3389"}}),z.current++}}catch{}I||(P.current=E),U.current=p.configured?JSON.stringify(E):"",m(P.current),h(!0),x(p.configured?"saved":"saving"),V(Array.isArray(p.credentialKeys)?p.credentialKeys.filter(L=>typeof L=="string"):[]),D(p.credentialError?"error":"idle")}).catch(()=>{!N.signal.aborted&&y===w.current&&x("error")}),()=>{++w.current,N.abort();for(const p of j.current)p.abort();j.current.clear()}},[e,l]);const O=o.useCallback(()=>{if(C.current)return C.current;if(!i)return Promise.resolve(!1);const y=w.current,N=(async()=>{for(;U.current!==JSON.stringify(P.current);){const p=JSON.stringify(P.current),E=new AbortController;j.current.add(E),x("saving");try{if(!(await fetch("/api/computer/preferences",{method:"PUT",headers:{"Content-Type":"application/json"},body:p,signal:E.signal})).ok)throw new Error("PREFERENCES_SAVE_FAILED");if(y!==w.current)return!1;U.current=p}catch{return y===w.current&&x("error"),!1}finally{j.current.delete(E)}}return y===w.current&&x("saved"),!0})();return C.current=N,N.finally(()=>{C.current===N&&(C.current=null)}),N},[i]);o.useEffect(()=>{if(!i||U.current===JSON.stringify(s))return;const y=setTimeout(()=>{O()},300);return()=>clearTimeout(y)},[i,s,O]);const ee=o.useCallback(async(y,N,p)=>{const E=w.current,I=new AbortController;y!=="use"&&D("saving");try{if(!await O()||E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");j.current.add(I);const L=await fetch(`/api/computer/credentials/${y}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:N,...y==="save"?{password:p}:{}}),signal:I.signal});if(E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");if(!L.ok)throw new Error(y==="use"&&L.status===404?"COMPUTER_CREDENTIALS_MISSING":"COMPUTER_CREDENTIALS_FAILED");const X=await L.json();if(E!==w.current)throw new Error("COMPUTER_CREDENTIALS_FAILED");const B=tt(N);if(y==="save"&&V(ne=>[...new Set([...ne,B])]),y==="forget"&&V(ne=>ne.filter(xe=>xe!==B)),y==="use"&&(typeof X.password!="string"||!X.password))throw new Error("COMPUTER_CREDENTIALS_MISSING");return D("idle"),X.password}catch(L){throw E===w.current&&!I.signal.aborted&&D("error"),L}finally{j.current.delete(I)}},[O]);return{preferences:s,change:Y,loaded:i,saveState:c,flush:O,credentialKeys:d,loginState:H,credentialRequest:ee,retry:()=>i?void O():R(y=>y+1)}}class jt{binaryType="arraybuffer";protocol="";CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;onopen=null;onmessage=null;onerror=null;onclose=null;socket;get readyState(){return this.socket.readyState}constructor(s,m){this.socket=lt(`/api/computer/ws?host=${encodeURIComponent(s)}`),this.socket.onopen=i=>this.onopen?.(i),this.socket.onerror=i=>this.onerror?.(i),this.socket.onclose=i=>{(i.code!==1e3||i.reason)&&m(i.reason||"COMPUTER_DISCONNECTED"),this.onclose?.(i)},this.socket.onmessage=i=>{try{const h=JSON.parse(i.data);if(h.type!=="data"||typeof h.data!="string"||!Number.isSafeInteger(h.seq))throw new Error("Invalid VNC record");const c=Uint8Array.from(atob(h.data),x=>x.charCodeAt(0));this.onmessage?.(new MessageEvent("message",{data:c.buffer})),this.socket.readyState===1&&this.socket.send(JSON.stringify({type:"ack",seq:h.seq}))}catch{m("COMPUTER_INVALID_MESSAGE"),this.close(),this.onclose?.(new CloseEvent("close",{code:4400}))}}}send(s){const m=ArrayBuffer.isView(s)?new Uint8Array(s.buffer,s.byteOffset,s.byteLength):new Uint8Array(s);for(let i=0;i<m.length;i+=32*1024){const h=m.subarray(i,i+32768);let c="";for(const x of h)c+=String.fromCharCode(x);this.socket.send(JSON.stringify({type:"data",data:btoa(c)}))}}close(){this.socket.close()}}function Nt(e){return e==="mac"||e==="linux"||e==="windows"}function Et(e){const s=e==="mac"?[65513,"MetaLeft"]:[65507,"ControlLeft"],m=e==="mac"?s:[65515,"MetaLeft"];return{escape:[[65307,"Escape"]],enter:[[65293,"Enter"]],backspace:[[65288,"Backspace"]],tab:[e==="mac"?s:[65513,"AltLeft"],[65289,"Tab"]],search:e==="mac"?[m,[32,"Space"]]:[m],copy:[s,[99,"KeyC"]],paste:[s,[118,"KeyV"]],up:[[65362,"ArrowUp"]],down:[[65364,"ArrowDown"]],left:[[65361,"ArrowLeft"]],right:[[65363,"ArrowRight"]]}}function kt(e){const s=e;return{size:()=>({width:s._fbWidth,height:s._fbHeight}),surface:()=>s._canvas,send:(m,i,h)=>{const c=s._display.scale,x=(m-s._display.absX(0))*c,l=(i-s._display.absY(0))*c;s._mousePos={x,y:l},s._mouseMoveTimer!==null&&clearTimeout(s._mouseMoveTimer),s._mouseMoveTimer=null,s._mouseButtonMask=h,s._mouseLastMoveTime=Date.now(),s._sendMouse(x,l,h)}}}const rt="termdock:computer-touch-mode:v1";function St(){try{const e=localStorage.getItem(rt);if(e==="trackpad"||e==="direct")return e}catch{}return navigator.maxTouchPoints>0&&window.matchMedia("(any-pointer: coarse)").matches?"trackpad":"direct"}function Lt(e){try{localStorage.setItem(rt,e)}catch{}}const Tt=8,At=300,_t=450,Re=18,je=(e,s)=>Math.max(0,Math.min(e,Math.max(0,s-1)));function Rt(e,s,m,i){const h=new AbortController,c=new Map;let x=0,l=0,R=!1,d=!1,V=!1,H=0,D=0,P,z=!1,w=!0,U=!0,C,j=!1;const Y=()=>{const n=s.size(),a=i.current??={x:n.width/2,y:n.height/2};return a.x=je(a.x,n.width),a.y=je(a.y,n.height),a};let O;const ee=()=>{const n=s.size();if((!O||O.width!==n.width||O.height!==n.height)&&(U=!0),!U&&O)return O;const a=s.surface(),g=e.getBoundingClientRect(),k=a.getBoundingClientRect(),b=[];for(let f=a.parentElement;f&&f!==e;f=f.parentElement){const K=getComputedStyle(f),T=/auto|scroll/.test(K.overflowX)?Math.max(0,f.scrollWidth-f.clientWidth):0,te=/auto|scroll/.test(K.overflowY)?Math.max(0,f.scrollHeight-f.clientHeight):0;if(!T&&!te)continue;const v=f.getBoundingClientRect();b.push({element:f,left:v.left-g.left,top:v.top-g.top,right:v.right-g.left,bottom:v.bottom-g.top,maxX:T,maxY:te})}return O={...n,left:k.left-g.left,top:k.top-g.top,scaleX:n.width&&k.width?k.width/n.width:1,scaleY:n.height&&k.height?k.height/n.height:1,viewportWidth:g.width,viewportHeight:g.height,clientLeft:g.left,clientTop:g.top,scrollers:b},U=!1,O},y=()=>{const n=ee(),a=Y();if(!n.width||!n.height||!w){m.hidden=!0;return}let g=n.left+a.x*n.scaleX,k=n.top+a.y*n.scaleY;for(const b of n.scrollers){if(b.maxX){const f=b.element.scrollLeft,K=g<b.left+20?g-b.left-20:g>b.right-20?g-b.right+20:0,T=Math.max(0,Math.min(b.maxX,f+K));f!==T&&(b.element.scrollLeft=T,g-=T-f,n.left-=T-f)}if(b.maxY){const f=b.element.scrollTop,K=k<b.top+20?k-b.top-20:k>b.bottom-20?k-b.bottom+20:0,T=Math.max(0,Math.min(b.maxY,f+K));f!==T&&(b.element.scrollTop=T,k-=T-f,n.top-=T-f)}}m.hidden=g<0||k<0||g>=n.viewportWidth||k>=n.viewportHeight,m.style.transform=`translate3d(${g}px, ${k}px, 0)`},N=(n=D)=>{const a=Y();s.send(Math.round(a.x),Math.round(a.y),n)},p=()=>{P=void 0,y(),z&&(z=!1,N());let n=0;for(;Math.abs(H)>=Re&&n++<8;){const a=H>0?16:8;N(a),N(0),H-=Math.sign(H)*Re}},E=()=>{j||(P??=requestAnimationFrame(p))},I=()=>{P!==void 0&&(cancelAnimationFrame(P),p())},L=()=>{clearTimeout(C),I(),D&&(D=0,N())},X=n=>{n.cancelable&&n.preventDefault(),n.stopImmediatePropagation()},B=()=>[...c.values()].reduce((n,a)=>n+a.y,0)/c.size,ne=n=>{if(!(n.pointerType!=="touch"&&n.pointerType!=="pen")){X(n),w=!0,E(),c.size||(x=performance.now(),l=0,R=!1,d=!1,V=!1,H=0),c.set(n.pointerId,{x:n.clientX,y:n.clientY,startX:n.clientX,startY:n.clientY}),l=Math.max(l,c.size);try{e.setPointerCapture(n.pointerId)}catch{}clearTimeout(C),c.size===1&&l===1?C=setTimeout(()=>{!j&&c.size===1&&!R&&!d&&(D=1,N())},_t):(L(),V=!0)}},xe=n=>{if(n.pointerType==="mouse"){const f=ee();i.current={x:je((n.clientX-f.clientLeft-f.left)/f.scaleX,f.width),y:je((n.clientY-f.clientTop-f.top)/f.scaleY,f.height)},w=!1,m.hidden=!0;return}const a=c.get(n.pointerId);if(!a)return;X(n);const g=B(),k=n.clientX-a.x,b=n.clientY-a.y;if(a.x=n.clientX,a.y=n.clientY,Math.hypot(a.x-a.startX,a.y-a.startY)>Tt&&(R=!0,clearTimeout(C)),c.size===2&&!d)H+=g-B(),Math.abs(H)>=Re&&(R=!0,E());else if(c.size===1&&!V&&!d){const f=Y(),K=O??ee();f.x+=k/K.scaleX,f.y+=b/K.scaleY,Y(),z=!0,E()}},me=n=>{if(!c.has(n.pointerId))return;X(n);const a=D!==0;n.type!=="pointerup"&&(d=!0),L(),c.delete(n.pointerId);try{e.hasPointerCapture(n.pointerId)&&e.releasePointerCapture(n.pointerId)}catch{}c.size||(H=0,!d&&!a&&!R&&l<=2&&performance.now()-x<=At&&(N(l===2?4:1),N(0)))},pe=()=>{d=!0,L();const n=[...c.keys()];c.clear(),H=0;for(const a of n)try{e.hasPointerCapture(a)&&e.releasePointerCapture(a)}catch{}},W={capture:!0,passive:!1,signal:h.signal};e.addEventListener("pointerdown",ne,W),e.addEventListener("pointermove",xe,W),e.addEventListener("pointerup",me,W),e.addEventListener("pointercancel",me,W),e.addEventListener("lostpointercapture",me,W);for(const n of["touchstart","touchmove","touchend","touchcancel","contextmenu"])e.addEventListener(n,X,W);const oe=()=>{U=!0,E()};e.addEventListener("scroll",oe,{capture:!0,signal:h.signal}),window.addEventListener("blur",pe,{signal:h.signal});const ge=()=>{document.hidden&&pe()};document.addEventListener("visibilitychange",ge,{signal:h.signal});const q=new ResizeObserver(oe);return q.observe(e),q.observe(s.surface()),y(),()=>{j||(j=!0,h.abort(),pe(),q.disconnect(),m.hidden=!0)}}function It(e,s){e=Math.max(1,e||1280),s=Math.max(1,s||800);const m=Math.max(1,640/e,480/s);return{width:Math.max(640,Math.min(2560,Math.round(e*m))),height:Math.max(480,Math.min(1600,Math.round(s*m)))}}function Mt({sendText:e,sendKey:s}){const{t:m}=et(),i=o.useRef(null),h=o.useRef(!1),c=o.useRef(null),[x,l]=o.useState(""),R=()=>{const d=i.current?.value||"";d&&e(d),i.current&&(i.current.value=""),l("")};return o.useEffect(()=>(i.current?.focus({preventScroll:!0}),()=>{c.current!==null&&cancelAnimationFrame(c.current)}),[]),t.jsx("input",{ref:i,tabIndex:-1,className:"pointer-events-none absolute left-0 top-0 h-px w-px border-0 p-0 text-base opacity-0","aria-label":m("computer.keyboardInput"),autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",spellCheck:!1,maxLength:1024,value:x,onChange:d=>{l(d.target.value),!h.current&&c.current===null&&R()},onCompositionStart:()=>{h.current=!0},onCompositionEnd:()=>{h.current=!1,c.current!==null&&cancelAnimationFrame(c.current),c.current=requestAnimationFrame(()=>{c.current=null,R()})},onKeyDown:d=>{h.current||d.nativeEvent.isComposing||c.current!==null||(d.key==="Enter"||d.key==="Backspace"&&!d.currentTarget.value)&&(d.preventDefault(),s(d.key==="Enter"?"enter":"backspace"))}})}function Pt(e){let s=[],m=null;const i=new Map,h=()=>{m=null,s.splice(0,32).forEach(c=>{e(c),c[2]?i.set(c[0],c):i.delete(c[0])}),s.length&&(m=requestAnimationFrame(h))};return{send(c){s.push(...c),m===null&&h()},clear(){m!==null&&cancelAnimationFrame(m),m=null,s=[];const c=[...i.values()].reverse();i.clear();for(const[x,l]of c)try{e([x,l,!1])}catch{}}}}const ae="inline-flex min-h-9 items-center justify-center gap-1.5 rounded-md border border-border px-2.5 text-xs hover:bg-surface-2 disabled:opacity-40",ie="min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm outline-none focus:border-primary";function Ne(e){return/API_NOT_ALLOWED|AUTHORIZATION|revoked|PAIRING/.test(e)?"computer.permission":e.includes("RDP_BACKEND_UNAVAILABLE")?"computer.rdpBackendUnavailable":e.includes("RDP_CERTIFICATE")?"computer.rdpCertificate":e.includes("CREDENTIALS_MISSING")?"computer.loginExpired":e.includes("CREDENTIALS_FAILED")?"computer.loginSaveFailed":e.includes("AUTH_FAILED")?"computer.authFailed":e.includes("RDP_FAILED")?"computer.rdpFailed":e.includes("SCREEN_SHARING_OFF")?"computer.sharingOff":e.includes("PRIVATE_HOST_ONLY")?"computer.privateOnly":e.includes("INVALID_HOST")?"computer.invalidHost":e.includes("TIMEOUT")?"computer.timeout":e.includes("UNREACHABLE")?"computer.unreachable":e.includes("DISCONNECTED")?"computer.disconnected":"computer.failed"}function Dt(){const{t:e}=et(),[s,m]=o.useState(()=>Ce()?.targetPeerId??""),[i,h]=o.useState(null),{preferences:c,change:x,loaded:l,saveState:R,flush:d,retry:V,credentialKeys:H,loginState:D,credentialRequest:P}=Ct(s),z=c.target==="local",w=c[c.target],{host:U,platform:C,protocol:j,port:Y,domain:O,ignoreCert:ee,username:y}=w,N=j==="rdp"&&i?.rdpAvailable===!1,{viewOnly:p,fit:E}=c,I=w.rememberLogin&&H.includes(tt(w)),L=r=>x(u=>({...u,[u.target]:{...u[u.target],...r}})),X=r=>L({username:r}),B=r=>L({domain:r}),ne=r=>{L({ignoreCert:r}),d()},xe=r=>L({port:r}),me=r=>{r&&(le.current(),ye.clear(),G(null)),x(u=>({...u,viewOnly:r})),d()},[pe,W]=o.useState(!1),oe=Et(C),ge=C==="mac"?"⌘V":"Ctrl+V",[q,n]=o.useState(""),[a,g]=o.useState("idle"),[k,b]=o.useState(null),[f,K]=o.useState(""),[T,te]=o.useState(!1),[v,G]=o.useState(null),Ee=o.useRef(null),[we,Pe]=o.useState(""),[nt,be]=o.useState(!1),[ot,st]=o.useState(!1),[J,ct]=o.useState(St),De=o.useRef(null),Oe=o.useRef(null),le=o.useRef(()=>{}),[ze,at]=o.useState(_e),fe=o.useRef(!1),se=o.useRef(""),Fe=o.useRef(()=>{}),Ue=o.useRef(null),ke=o.useRef(null),ue=o.useMemo(()=>{const r=document.createElement("div");return r.className="h-full w-full min-h-0 overflow-hidden",r},[]),_=o.useRef(null),ye=o.useMemo(()=>Pt(([r,u,S])=>_.current?.sendKey(r,u,S)),[]),Se=o.useRef(null),re=o.useRef(0),Le=o.useRef(void 0),Q=o.useCallback(()=>{le.current(),ye.clear(),Oe.current=null,re.current++,clearTimeout(Le.current);const r=_.current;_.current=null,r?.disconnect(),Se.current?.close(),Se.current=null,ue.replaceChildren()},[ue,ye]);o.useLayoutEffect(()=>(ke.current?.appendChild(ue),()=>{ue.remove()}),[ue,T]),o.useEffect(()=>()=>Q(),[Q]),o.useEffect(()=>{const r=()=>{const u=_e();at(u),!u&&(fe.current=!1,se.current="",Q(),g("idle"),n(""),te(!1),G(null))};return window.addEventListener(Xe,r),()=>window.removeEventListener(Xe,r)},[Q]),o.useEffect(()=>{const r=()=>m(Ce()?.targetPeerId??"");return window.addEventListener(We,r),()=>window.removeEventListener(We,r)},[]),o.useEffect(()=>{Q(),fe.current=!1,se.current="",g("idle"),b(null),n(""),h(null),te(!1),G(null),W(!1),K(""),Pe(""),be(!1);const r=new AbortController;return fetch("/api/computer/status",{signal:r.signal}).then(async u=>{if(!u.ok)throw new Error(u.status===403?"API_NOT_ALLOWED":"COMPUTER_FAILED");return await u.json()}).then(u=>{r.signal.aborted||h(u)}).catch(u=>{r.signal.aborted||b(Ne(String(u)))}),()=>{r.abort(),Q()}},[s,Q]),o.useEffect(()=>{_.current&&(_.current.viewOnly=p)},[p]),o.useEffect(()=>{_.current&&(_.current.scaleViewport=E)},[E]),o.useEffect(()=>{_.current&&"pauseResize"in _.current&&(_.current.pauseResize=!!v)},[v]),o.useEffect(()=>{_.current&&"keyboardActive"in _.current&&(_.current.keyboardActive=v==="keyboard")},[v]);const $e=r=>{r===z||$||!l||(n(""),b(null),x(u=>({...u,target:r?"local":"remote"})),d())},Ve=()=>{fe.current=!0,se.current="",Q(),g("idle"),n(""),te(!1),G(null),be(!1)},He=async r=>{if(r?.preventDefault(),N)return;if(fe.current=!0,a==="credentials"&&_.current&&"sendCredentials"in _.current){se.current=q,_.current.sendCredentials({username:y,password:q}),g("connecting");return}if(!_e()||!l||!q&&!I)return;d(),Q(),b(null),K(""),g("connecting"),be(!1);const u=re.current,S=A=>{u===re.current&&(Q(),g("error"),b(A),G(null),se.current="",(A==="computer.authFailed"||A==="computer.permission"||A==="computer.loginExpired")&&n(""),I&&(A==="computer.authFailed"||A==="computer.loginExpired")&&P("forget",w).catch(()=>{}))};Le.current=setTimeout(()=>S("computer.timeout"),6e4);try{let A=q||await P("use",w);if(u!==re.current)return;se.current=A||"";let F;if(j==="rdp"){const{RdpSession:Z}=await qe(async()=>{const{RdpSession:Ae}=await import("./rdpSession-DL1rZ49m.js");return{RdpSession:Ae}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]));if(u!==re.current)return;const de=window.innerWidth<=640,ce=Ee.current?.getBoundingClientRect(),ve=It(de?window.innerWidth:ce?.width||1280,Math.max(1,(de?window.innerHeight:ce?.height||800)-100));F=new Z(ue,{host:U.trim(),port:Number(Y),username:y.trim(),password:A||"",domain:O.trim(),ignoreCert:ee,...ve},Ae=>S(Ne(Ae)))}else{const{default:Z}=await qe(async()=>{const{default:ve}=await import("./rfb-CxsXsMUX.js");return{default:ve}},[]);if(u!==re.current)return;const de=new jt(U.trim(),ve=>S(Ne(ve)));Se.current=de;const ce=new Z(ue,de,{shared:!0,credentials:{username:y.trim()||void 0,password:A}});ce.background="var(--chrome-bg)",ce.resizeSession=!1,ce.qualityLevel=6,ce.compressionLevel=2,F=ce}A=void 0,_.current=F,F.scaleViewport=E,F.viewOnly=p,F.addEventListener("connect",()=>{if(u!==re.current)return;clearTimeout(Le.current),g("connected"),n(""),window.innerWidth<=640&&(document.activeElement?.blur?.(),te(!0));const Z=se.current;se.current="",w.rememberLogin&&Z&&P("save",w,Z).catch(()=>{})}),F.addEventListener("credentialsrequired",Z=>{if(u!==re.current)return;const de=Z.detail.types;st(de.includes("username")),g("credentials")}),F.addEventListener("securityfailure",()=>S("computer.authFailed")),F.addEventListener("disconnect",()=>S("computer.disconnected")),F.addEventListener("desktopname",Z=>{u===re.current&&K(Z.detail.name)})}catch(A){S(Ne(String(A)))}},he=r=>{!_.current||a!=="connected"||p||ye.send([...r.map(([S,A])=>[S,A,!0]),...[...r].reverse().map(([S,A])=>[S,A,!1])])},M=a==="connected",$=a==="connecting"||a==="credentials";o.useEffect(()=>{const r=_.current,u=ke.current,S=De.current;if(!M||p||v&&v!=="keyboard"||J!=="trackpad"||!r||!u||!S)return;const A="pointerTarget"in r?r.pointerTarget:kt(r),F=Rt(u,A,S,Oe);return le.current=F,()=>{F(),le.current===F&&(le.current=()=>{})}},[M,p,J,T,v]);const Ye=r=>{r!==J&&(le.current(),ct(r),Lt(r))};Fe.current=()=>{He()},o.useEffect(()=>{ze&&l&&i&&!N&&c.autoConnect&&I&&a==="idle"&&!fe.current&&Fe.current()},[ze,l,i,N,c.autoConnect,I,a]);const Ke=()=>{fe.current=!0,P("forget",w).catch(()=>{})},Te=r=>{le.current(),G(u=>u===r?null:r)},it=r=>{if(!_.current||p)return;const u=[];for(const S of r){const A=S.codePointAt(0),F=S===`
|
|
3
|
+
`?65293:S===" "?65289:A<256?A:16777216|A;u.push([F,null,!0],[F,null,!1])}ye.send(u)};o.useEffect(()=>{if(!M||v!=="keyboard"&&v!=="clipboard"||!T||!window.visualViewport)return;const r=window.visualViewport,u=Ee.current,S=()=>{u&&r.height>=160&&(u.style.height=`${r.height}px`,u.style.top=`${r.offsetTop}px`)};return S(),r.addEventListener("resize",S),r.addEventListener("scroll",S),()=>{r.removeEventListener("resize",S),r.removeEventListener("scroll",S),u&&(u.style.height="",u.style.top="")}},[M,v,T]);const Be=t.jsxs("div",{ref:Ee,className:`flex min-h-0 flex-col bg-surface text-foreground ${T?"fixed inset-0 z-modal-panel h-dvh pb-[env(safe-area-inset-bottom)] pt-[env(safe-area-inset-top)]":"relative h-full"}`,role:T?"dialog":void 0,"aria-modal":T||void 0,"aria-label":e("computer.title"),onKeyDown:r=>{r.stopPropagation(),r.key==="Escape"&&!r.nativeEvent.isComposing&&v&&(r.preventDefault(),G(null))},onKeyUp:r=>r.stopPropagation(),children:[t.jsxs("div",{className:"relative z-30 flex min-h-12 shrink-0 items-center gap-2 border-b border-border bg-surface px-3",children:[T&&t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center",onClick:()=>{te(!1),G(null)},"aria-label":e("computer.exitFullscreen"),children:t.jsx(pt,{size:20})}),t.jsx(ut,{size:16,className:"shrink-0 text-muted-foreground"}),t.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:M&&(f||(z?i?.hostname||Ce()?.serviceName:U))||e("computer.title")}),M&&t.jsx("span",{className:"text-[11px] text-primary",children:e("computer.connected")}),M&&D==="error"&&t.jsx("span",{role:"alert",className:"text-[11px] text-destructive",children:e("computer.loginSaveFailed")}),M&&R==="saving"&&t.jsx("span",{role:"status","aria-label":e("computer.settingsSaving"),title:e("computer.settingsSaving"),children:t.jsx(Ge,{size:12,className:"animate-spin text-muted-foreground"})}),M&&R==="error"&&t.jsxs("button",{type:"button",className:ae,title:e("computer.settingsSaveFailed"),"aria-label":e("computer.settingsSaveFailed"),onClick:V,children:["! ",e("computer.retry")]}),$&&t.jsxs("button",{type:"button",className:ae,onClick:Ve,children:[t.jsx(Je,{size:14}),e("computer.cancel")]}),M&&!T&&t.jsxs("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center gap-1 text-xs",onClick:()=>te(!0),"aria-label":e("computer.fullscreen"),children:[t.jsx(xt,{size:16}),e("computer.expand")]}),M&&t.jsx("button",{type:"button",className:"flex min-h-11 min-w-11 items-center justify-center",onClick:()=>Te("tools"),"aria-label":e("computer.tools"),"aria-expanded":v==="tools",children:t.jsx(yt,{size:18})})]}),!M&&t.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto p-4 sm:p-6",children:t.jsxs("div",{className:"mx-auto w-full max-w-md",children:[t.jsxs("form",{className:"space-y-3",onSubmit:r=>{He(r)},"aria-busy":a==="connecting",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-1 rounded-lg bg-background p-1",role:"group","aria-label":e("computer.target"),children:[t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${z?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":z,disabled:$||!i||!l,onClick:()=>$e(!0),children:e("computer.thisComputer")}),t.jsx("button",{type:"button",className:`min-h-11 rounded-md px-3 text-sm font-medium ${z?"text-muted-foreground hover:bg-surface":"bg-surface-2 text-foreground"}`,"aria-pressed":!z,disabled:$||!l,onClick:()=>$e(!1),children:e("computer.otherComputer")})]}),z?t.jsx("p",{className:"text-xs leading-relaxed text-muted-foreground",role:"status",children:i?e("computer.localService",{name:Ce()?.serviceName||i.hostname}):e("computer.loading")}):t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.host")}),t.jsx("input",{className:ie,value:U,disabled:$||!l,onChange:r=>{L({host:r.target.value,domain:"",ignoreCert:!1}),n(""),b(null)},placeholder:e("computer.hostPlaceholder"),onBlur:()=>{d()},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,required:!0,maxLength:253})]}),t.jsxs("p",{className:"text-xs text-muted-foreground",children:[C==="mac"?"macOS":C==="linux"?"Ubuntu / Linux":"Windows"," · ",j.toUpperCase()," · ",j==="rdp"?Y||"3389":"5900",p?` · ${e("computer.viewOnly")}`:""]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e(j==="rdp"?"computer.rdpUsername":"computer.username")}),t.jsx("input",{className:ie,value:y,disabled:a==="connecting"||!l,onChange:r=>X(r.target.value),onBlur:()=>{d()},autoCapitalize:"none",autoCorrect:"off",autoComplete:"off",required:j==="rdp"||a==="credentials"&&ot,maxLength:255})]}),t.jsxs("label",{className:"block space-y-1 text-xs",children:[t.jsx("span",{children:e("computer.password")}),t.jsx("input",{className:ie,type:"password",value:q,disabled:a==="connecting"||!l,onChange:r=>n(r.target.value),placeholder:I&&a!=="credentials"?e("computer.savedPassword"):void 0,autoComplete:"new-password",required:!I||a==="credentials",maxLength:1024})]}),t.jsx("p",{className:"text-[11px] leading-relaxed text-muted-foreground",children:e(j==="rdp"?"computer.rdpLoginHint":"computer.vncLoginHint")}),t.jsxs("div",{className:"flex min-h-11 items-center justify-between gap-2 text-xs",children:[t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:w.rememberLogin,disabled:$||!l||D==="saving",onChange:r=>{const u=r.target.checked;L({rememberLogin:u}),!u&&I?P("forget",{...w,rememberLogin:u}).catch(()=>{}):d()}}),e("computer.rememberLogin")]}),I&&t.jsx("button",{type:"button",className:"min-h-11 text-muted-foreground underline",disabled:$||D==="saving",onClick:Ke,children:e("computer.forgetLogin")})]}),D==="error"&&!k&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e("computer.loginSaveFailed")}),N&&t.jsxs("div",{role:"status",className:"space-y-1 text-xs leading-relaxed text-muted-foreground",children:[t.jsx("p",{children:e("computer.rdpBackendUnavailable")}),t.jsx("p",{children:e("computer.rdpBackendRecovery")})]}),a==="credentials"&&t.jsx("p",{className:"text-xs text-primary",children:e("computer.credentials")}),k&&t.jsxs("div",{role:"alert",className:"rounded-md bg-surface-2 p-3 text-xs leading-relaxed text-destructive",children:[e(k),k==="computer.rdpCertificate"&&t.jsxs("label",{className:"mt-1 flex min-h-11 items-center gap-2 text-foreground",children:[t.jsx("input",{type:"checkbox",checked:ee,onChange:r=>ne(r.target.checked)}),e("computer.trustCertificateHere")]}),a==="error"&&k!=="computer.rdpCertificate"&&t.jsx("button",{type:"button",className:"mt-1 block min-h-9 text-foreground underline",onClick:()=>{W(!0),requestAnimationFrame(()=>Ue.current?.scrollIntoView?.({block:"nearest",behavior:"smooth"}))},children:e("computer.checkSettings")})]}),t.jsxs("button",{type:"submit",className:"inline-flex min-h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground disabled:opacity-40",disabled:!l||N||a==="connecting"||D==="saving"||z&&!i||!U.trim()||!q&&(!I||a==="credentials")||j==="rdp"&&(!y.trim()||!Number.isInteger(Number(Y))||Number(Y)<1||Number(Y)>65535),children:[a==="connecting"&&t.jsx(Ge,{size:16,className:"animate-spin"}),e(a==="connecting"?"computer.connecting":a==="credentials"?"computer.authenticate":a==="error"?"computer.retryConnect":"computer.connect")]}),t.jsxs("details",{ref:Ue,className:"border-b border-border text-xs",open:pe,onToggle:r=>W(r.currentTarget.open),children:[t.jsxs("summary",{className:"flex min-h-11 cursor-pointer list-none items-center justify-between text-muted-foreground",children:[t.jsx("span",{children:e("computer.advanced")}),t.jsx("span",{"aria-hidden":"true",children:pe?"−":"+"})]}),t.jsxs("div",{className:"space-y-3 pb-4",children:[t.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.platform")}),t.jsxs("select",{className:ie,value:C,disabled:$||!l,onChange:r=>{Nt(r.target.value)&&L({platform:r.target.value,protocol:r.target.value==="mac"?"vnc":"rdp",ignoreCert:!1}),n(""),d()},children:[t.jsx("option",{value:"mac",children:"macOS"}),t.jsx("option",{value:"linux",children:"Ubuntu / Linux"}),t.jsx("option",{value:"windows",children:"Windows"})]})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.protocol")}),t.jsxs("select",{className:ie,value:j,disabled:$||!l,onChange:r=>{L({protocol:r.target.value==="rdp"?"rdp":"vnc"}),n(""),b(null),d()},children:[t.jsx("option",{value:"rdp",children:"RDP"}),t.jsx("option",{value:"vnc",children:"VNC"})]})]})]}),j==="rdp"&&t.jsxs(t.Fragment,{children:[t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.port")}),t.jsx("input",{className:ie,type:"number",min:1,max:65535,step:1,value:Y,disabled:$||!l,onBlur:()=>{d()},onChange:r=>xe(r.target.value)})]}),t.jsxs("label",{className:"block space-y-1",children:[t.jsx("span",{children:e("computer.domain")}),t.jsx("input",{className:ie,value:O,disabled:$||!l,onBlur:()=>{d()},onChange:r=>B(r.target.value),autoComplete:"off",maxLength:255})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:ee,disabled:$||!l,onChange:r=>ne(r.target.checked)}),e("computer.trustCertificate")]})]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:p,disabled:$||!l,onChange:r=>me(r.target.checked)}),e("computer.viewOnly")]}),t.jsxs("label",{className:"flex min-h-11 items-center gap-2",children:[t.jsx("input",{type:"checkbox",checked:c.autoConnect,disabled:$||!l,onChange:r=>{x(u=>({...u,autoConnect:r.target.checked})),d()}}),e("computer.autoConnect")]})]})]})]}),t.jsxs("p",{role:"status",className:"mt-2 text-[11px] leading-relaxed text-muted-foreground",children:[e(R==="saved"?"computer.settingsSaved":R==="error"?l?"computer.settingsSaveFailed":"computer.settingsLoadFailed":R==="loading"?"computer.settingsLoading":"computer.settingsSaving"),R==="error"&&t.jsx("button",{type:"button",className:"ml-2 min-h-9 text-primary underline",onClick:V,children:e("computer.retry")})]}),t.jsxs("details",{className:"text-xs",children:[t.jsx("summary",{className:"flex min-h-11 cursor-pointer items-center text-muted-foreground",children:e("computer.setup")}),t.jsxs("ol",{className:"ml-4 list-decimal space-y-2 pt-2 leading-relaxed text-muted-foreground",children:[t.jsx("li",{children:e(j==="rdp"?C==="linux"?"computer.rdpLinuxStep1":"computer.rdpStep1":C==="mac"?"computer.step1":C==="linux"?"computer.linuxStep1":"computer.windowsStep1")}),t.jsx("li",{children:e(j==="rdp"?"computer.rdpStep2":C==="mac"?"computer.step2":C==="linux"?"computer.linuxStep2":"computer.windowsStep2")}),t.jsx("li",{children:e("computer.step3")})]}),j==="vnc"&&C==="linux"&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e("computer.linuxCommandHint")}),t.jsx("pre",{className:"mt-2 overflow-x-auto rounded-md bg-background p-2 text-[11px]",children:t.jsx("code",{children:`sudo apt install x11vnc
|
|
4
|
+
x11vnc -storepasswd
|
|
5
|
+
x11vnc -display "$DISPLAY" -auth guess -localhost -usepw -forever -shared -rfbport 5900`})}),t.jsx("p",{className:"mt-2 leading-relaxed text-muted-foreground",children:e("computer.linuxProtocolHint")})]}),t.jsx("p",{className:"mt-3 leading-relaxed text-muted-foreground",children:e(j==="rdp"?"computer.rdpNetworkHint":"computer.networkHint")})]})]})}),M&&v==="tools"&&t.jsx("button",{type:"button",className:"absolute inset-x-0 bottom-14 top-12 z-20 bg-background/40","aria-label":e("computer.returnToDesktop"),onClick:()=>G(null)}),M&&t.jsxs("div",{hidden:v!=="tools",className:`${v==="tools"?"flex":"hidden"} absolute inset-x-3 top-14 z-30 max-h-[calc(100%-7rem)] flex-wrap items-center gap-3 overflow-y-auto rounded-lg border border-border bg-surface px-4 py-3 text-xs shadow-lg [&_button]:min-h-11 [&_select]:min-h-11 [&_label]:min-h-11`,role:"region","aria-label":e("computer.tools"),children:[t.jsxs("div",{className:"flex w-full items-center justify-between",children:[t.jsx("span",{className:"font-medium",children:e("computer.tools")}),t.jsx("button",{type:"button",className:"flex min-w-11 items-center justify-center","aria-label":e("computer.closeTools"),onClick:()=>G(null),children:t.jsx(dt,{size:18})})]}),t.jsx("div",{className:"flex w-full items-center gap-2",children:t.jsx("div",{className:"inline-flex rounded-md bg-background p-0.5",role:"group","aria-label":e("computer.touchMode"),children:["trackpad","direct"].map(r=>t.jsx("button",{type:"button",className:`min-h-9 rounded px-3 text-xs ${J===r?"bg-surface-2 text-foreground":"text-muted-foreground hover:bg-surface"}`,"aria-pressed":J===r,onClick:()=>Ye(r),children:e(r==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")},r))})}),t.jsxs("label",{className:"flex min-h-9 items-center gap-1.5",children:[t.jsx("input",{type:"checkbox",checked:p,onChange:r=>me(r.target.checked)}),e("computer.viewOnly")]}),t.jsx("button",{type:"button",className:ae,onClick:()=>{x(r=>({...r,fit:!r.fit})),d()},children:e(E?"computer.actualSize":"computer.fit")}),t.jsxs("select",{className:`${ae} min-w-0 bg-surface`,"aria-label":e("computer.shortcuts"),value:"",disabled:p,onChange:r=>{he(oe[r.target.value]??[])},children:[t.jsx("option",{value:"",disabled:!0,children:e("computer.shortcuts")}),t.jsxs("option",{value:"tab",children:[C==="mac"?"⌘ Tab":"Alt+Tab"," · ",e("computer.switchApps")]}),t.jsxs("option",{value:"search",children:[C==="mac"?"⌘ Space":"Super / Win"," · ",e(C==="mac"?"computer.spotlight":"computer.systemSearch")]}),t.jsx("option",{value:"copy",children:C==="mac"?"⌘C":"Ctrl+C"}),t.jsx("option",{value:"paste",children:ge}),t.jsx("option",{value:"escape",children:"Esc"}),t.jsx("option",{value:"enter",children:"Enter"}),t.jsx("option",{value:"backspace",children:"⌫"}),t.jsx("option",{value:"up",children:"↑"}),t.jsx("option",{value:"down",children:"↓"}),t.jsx("option",{value:"left",children:"←"}),t.jsx("option",{value:"right",children:"→"})]}),t.jsxs("div",{className:"flex w-full items-center justify-between border-t border-border pt-2",children:[I&&t.jsx("button",{type:"button",className:ae,disabled:D==="saving",onClick:Ke,children:e("computer.forgetLogin")}),t.jsxs("button",{type:"button",className:`${ae} ml-auto text-destructive`,onClick:Ve,children:[t.jsx(Je,{size:14}),e("computer.disconnect")]})]})]}),t.jsx("div",{ref:ke,"data-sidebar-gesture-ignore":"",className:`relative z-10 min-h-0 flex-1 overflow-hidden bg-[var(--chrome-bg)] ${M?"":"hidden"}`,style:{touchAction:M&&J==="trackpad"&&!p?"none":void 0},"aria-label":e("computer.remoteTitle"),children:M&&J==="trackpad"&&!p&&t.jsx("div",{ref:De,hidden:!0,"aria-hidden":"true",className:"pointer-events-none absolute left-0 top-0 z-20 h-5 w-5 will-change-transform",children:t.jsx(Qe,{size:20,strokeWidth:2,className:"fill-background text-primary drop-shadow"})})}),t.jsx("div",{hidden:v!=="tools",children:M&&!p&&t.jsx("p",{className:"shrink-0 border-t border-border px-2 py-1 text-[10px] leading-relaxed text-muted-foreground",children:e(J==="trackpad"?"computer.trackpadHint":"computer.directTouchHint")})}),M&&v==="keyboard"&&!p&&t.jsx(Mt,{sendText:it,sendKey:r=>he(oe[r])}),M&&v==="clipboard"&&!p&&t.jsxs("form",{className:"shrink-0 space-y-2 border-t border-border p-3",onSubmit:r=>{if(r.preventDefault(),!(!we||!_.current))try{_.current.clipboardPasteFrom(we),be(!0)}catch{b("computer.clipboardFailed")}},children:[t.jsx("textarea",{className:`${ie} min-w-0 resize-none py-2 text-base`,rows:2,"aria-label":e("computer.clipboard"),placeholder:e("computer.clipboardPlaceholder"),value:we,onChange:r=>{Pe(r.target.value),be(!1)},maxLength:16384}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{type:"submit",className:`${ae} min-h-11 flex-1`,disabled:!we,children:e("computer.clipboard")}),t.jsx("button",{type:"button",className:`${ae} min-h-11`,onClick:()=>he(oe.paste),children:ge})]}),t.jsx("p",{role:"status",className:"text-[10px] leading-relaxed text-muted-foreground",children:nt?e("computer.clipboardSent"):e("computer.clipboardHint",{shortcut:ge})}),k&&t.jsx("p",{role:"alert",className:"text-xs text-destructive",children:e(k)})]}),M&&t.jsxs("div",{className:`relative z-30 grid shrink-0 ${v==="keyboard"?"grid-cols-5":"grid-cols-4"} border-t border-border bg-surface px-1 py-1 text-[11px]`,children:[t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${v==="keyboard"?"bg-surface-2 text-primary":""}`,disabled:p,onClick:()=>Te("keyboard"),"aria-pressed":v==="keyboard",children:[t.jsx(ft,{size:18}),e("computer.keyboard")]}),t.jsxs("button",{type:"button",className:`flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md ${v==="clipboard"?"bg-surface-2 text-primary":""}`,disabled:p,onClick:()=>Te("clipboard"),"aria-pressed":v==="clipboard",children:[t.jsx(ht,{size:18}),e("computer.clipboardTool")]}),v==="keyboard"?t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-sm",onPointerDown:r=>r.preventDefault(),onClick:()=>he([[65289,"Tab"]]),children:"Tab"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(oe.backspace),children:"⌫"}),t.jsx("button",{type:"button",className:"min-h-11 rounded-md text-lg",onPointerDown:r=>r.preventDefault(),onClick:()=>he(oe.enter),children:"↵"})]}):t.jsxs(t.Fragment,{children:[t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",onClick:()=>{x(r=>({...r,fit:!r.fit})),d()},children:[t.jsx(wt,{size:18}),e(E?"computer.zoom":"computer.fit")]}),t.jsxs("button",{type:"button",className:"flex min-h-11 flex-col items-center justify-center gap-0.5 rounded-md",disabled:p,onClick:()=>Ye(J==="trackpad"?"direct":"trackpad"),"aria-label":e("computer.switchTouchMode"),children:[t.jsx(Qe,{size:18}),e(J==="trackpad"?"computer.trackpadMode":"computer.directTouchMode")]})]})]})]});return T?mt.createPortal(Be,document.body):Be}const Ht=Object.freeze(Object.defineProperty({__proto__:null,default:Dt},Symbol.toStringTag,{value:"Module"}));export{Ht as C,It as c};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bv as t}from"./app-CHoOHnjf.js";import{C as s}from"./ChangeWalkthroughPanel-RoMt6giT.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-ButxQzs4.js";import"./triangle-alert-BRy562K_.js";const e="/tmp/termdock-dag-playground",i={version:1,id:"dag-playground",repoRoot:e,workspaceRoot:e,title:"改动解释升级为可点击导览",summary:"这是一页免登录 playground,用真实 ChangeWalkthroughPanel 调 DAG 的节点、边、label 和密度。",generatedBy:"dag-playground",injectedAt:Date.now(),highlights:[{what:"先看总览,再看链路",effect:"读者不用先进入 diff,也能理解整批改动目的。",tag:"理解"},{what:"多条链路直接画出来",effect:"分支、汇合、验证路径不再靠 next 文本猜。",tag:"链路"},{what:"点击节点跳回证据",effect:"导览和真实 diff 之间形成闭环。",tag:"导航"}],nodes:[{id:"export",title:"导出 section 级 diff",kind:"source",business:"CLI 把 hunk 拆成多个连续改动 section,并为每个 section 生成稳定 fingerprint。这里故意写长一点,用来验证 DAG 节点是否会按照真实文本高度撑开,而不是被固定高度裁掉。",anchor:{repoRoot:e,filePath:"src/server/cli.ts",hunkIndex:0,sectionIndex:0}},{id:"prompt",title:"约束 AI 输出",kind:"process",business:"提示词要求先写总览,再逐 section 生成解释。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:0}},{id:"schema",title:"校验导览结构",kind:"process",business:"检查节点、边和锚点字段是否完整。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"fallback",title:"补齐兼容字段",kind:"process",business:"旧版结果缺字段时生成稳定回退值。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:1}},{id:"store",title:"保存整批导览结构",kind:"process",business:"服务端把 walkthrough 作为一等数据持久化。",anchor:{repoRoot:e,filePath:"src/server/utils/changeAuditStore.ts",hunkIndex:0}},{id:"api",title:"前端读取总览",kind:"api",business:"一次请求拿到 records 和 walkthroughs。",anchor:{repoRoot:e,filePath:"src/lib/terminal/api.ts",hunkIndex:0}},{id:"panel",title:"渲染 DAG 导览",kind:"ui",business:"用节点和边表达实现链路,节点可点击。节点内容可能是一两句话,也可能包含较长的业务解释;布局需要先测量 DOM 高度,再重新计算每一行节点的 y 坐标和连线端点。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/ChangeWalkthroughPanel.tsx",hunkIndex:0}},{id:"jump",title:"跳回真实 diff",kind:"ui",business:"点击节点后定位到文件、hunk 或 section。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/RightSidebar.tsx",hunkIndex:1}},{id:"section",title:"贴近改动展示解释",kind:"ui",business:"section 解释跟在对应 diff 块后面,而不是堆在 hunk 顶部。这个节点也故意写得更长,用来观察右侧分支和下方验证节点的连线是否会避让变高后的卡片。",anchor:{repoRoot:e,filePath:"src/lib/components/sidebar/DiffViewer.tsx",hunkIndex:0,sectionIndex:1}},{id:"verify",title:"验证导出和注入",kind:"test",business:"跑 lint、install、health、资源检查和注入自测。"}],edges:[{from:"export",to:"prompt",label:"提供输入",desc:"sectionFingerprint 让 AI 可以稳定引用。"},{from:"export",to:"schema",label:"结构校验",desc:"先确认输入可以稳定落库。"},{from:"export",to:"fallback",label:"兼容旧数据",desc:"为历史记录补齐必要字段。"},{from:"prompt",to:"store",label:"注入",desc:"AI payload 写回本地服务。"},{from:"schema",to:"store",label:"通过后保存",desc:"合法结构进入存储层。"},{from:"fallback",to:"store",label:"归一化后保存",desc:"兼容数据与新数据走同一链路。"},{from:"store",to:"api",label:"读取",desc:"浏览器从服务端拿到导览。"},{from:"api",to:"panel",label:"渲染",desc:"结构化数据变成导览图。"},{from:"panel",to:"jump",label:"点击",desc:"节点驱动 diff 定位。"},{from:"jump",to:"section",label:"定位",desc:"落到对应 section 解释。"},{from:"export",to:"verify",label:"验证",desc:"导出结构要覆盖 tracked/untracked。"},{from:"section",to:"verify",label:"回归",desc:"确认展示位置和交互。"}],sections:[],risks:[{title:"边和 label 不能遮住节点主体。"},{title:"窄侧栏下横向滚动要可控。"}],checks:["在 360px、560px、900px 宽度下截图检查。","确认边的箭头、label 背板和节点层级清楚。","确认节点点击区域和 hover 状态可感知。"]};function p(){return t.jsx("div",{className:"min-h-screen bg-background p-5 text-foreground","data-dag-playground":!0,children:t.jsxs("div",{className:"mx-auto max-w-[72rem]",children:[t.jsxs("div",{className:"mb-3",children:[t.jsx("h1",{className:"text-sm font-semibold",children:"DAG Playground"}),t.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:"Auth-free playground for tuning the real ChangeWalkthroughPanel."})]}),t.jsxs("div",{className:"grid gap-4 lg:grid-cols-[360px_minmax(0,1fr)]",children:[t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})}),t.jsx("div",{className:"min-w-0",children:t.jsx(s,{walkthroughs:[i],repoRoot:e,onNavigate:o=>{console.info("[DagPlayground] navigate",o)}})})]})]})})}export{p as DagPlayground};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{bv as e}from"./app-CHoOHnjf.js";import{b as a}from"./dnd-BCFAPC0L.js";import{c as M,S as _,D as T}from"./DiffViewer-B2Rue9PA.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./referenceLongPress-DB039WbW.js";const w=`diff --git a/CommentGap.kt b/CommentGap.kt
|
|
2
2
|
--- a/CommentGap.kt
|
|
3
3
|
+++ b/CommentGap.kt
|
|
4
4
|
@@ -1,4 +1,4 @@
|
|
Binary file
|
|
Binary file
|