termdock 1.4.169 → 1.4.171
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.desktop-dist/main.js +155 -20
- package/dist/client/assets/{ChangeWalkthroughPanel-u9y3e-pI.js → ChangeWalkthroughPanel-Ddx5GDvK.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-Ddx5GDvK.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Ddx5GDvK.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-BLUwaOMM.js → DagPlayground-DqBFuU_r.js} +1 -1
- package/dist/client/assets/DagPlayground-DqBFuU_r.js.br +0 -0
- package/dist/client/assets/DagPlayground-DqBFuU_r.js.gz +0 -0
- package/dist/client/assets/{DiffLab-ThgXydJA.js → DiffLab-BowFIppA.js} +1 -1
- package/dist/client/assets/DiffLab-BowFIppA.js.br +0 -0
- package/dist/client/assets/DiffLab-BowFIppA.js.gz +0 -0
- package/dist/client/assets/{DiffReview-DNkXOQ2y.js → DiffReview-CY5ro-NB.js} +1 -1
- package/dist/client/assets/DiffReview-CY5ro-NB.js.br +0 -0
- package/dist/client/assets/DiffReview-CY5ro-NB.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CHyV1WMR.js → DiffReviewLab-csbhxMnF.js} +1 -1
- package/dist/client/assets/DiffReviewLab-csbhxMnF.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-csbhxMnF.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-CxxOpsVz.js → DiffViewer-hy9qKEFv.js} +1 -1
- package/dist/client/assets/DiffViewer-hy9qKEFv.js.br +0 -0
- package/dist/client/assets/DiffViewer-hy9qKEFv.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-DZzx3Tzo.js → ModelPreview-BrjJiMa1.js} +1 -1
- package/dist/client/assets/ModelPreview-BrjJiMa1.js.br +0 -0
- package/dist/client/assets/ModelPreview-BrjJiMa1.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-Bv8Y6hqx.js → RightSidebar-CX6u9KLA.js} +4 -4
- package/dist/client/assets/RightSidebar-CX6u9KLA.js.br +0 -0
- package/dist/client/assets/RightSidebar-CX6u9KLA.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-DKmZLRlf.js → abnfDiagram-VCTEODGH-UcmExwvr.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-UcmExwvr.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-UcmExwvr.js.gz +0 -0
- package/dist/client/assets/{app-tT08GaCs.js → app-CuXPRCrJ.js} +39 -39
- package/dist/client/assets/app-CuXPRCrJ.js.br +0 -0
- package/dist/client/assets/app-CuXPRCrJ.js.gz +0 -0
- package/dist/client/assets/{arc-CjmHoRed.js → arc-CO-AGnEa.js} +1 -1
- package/dist/client/assets/arc-CO-AGnEa.js.br +0 -0
- package/dist/client/assets/arc-CO-AGnEa.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-B0EDOwYH.js → architectureDiagram-5GKGNRK7-TAFZQaPY.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-TAFZQaPY.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-TAFZQaPY.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CW-AaouZ.js → blockDiagram-I7D4REHJ-BbXmhWF8.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BbXmhWF8.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BbXmhWF8.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-aE7hFKfo.js → c4Diagram-7LVT6UL2-CkfmAF-k.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-CkfmAF-k.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-CkfmAF-k.js.gz +0 -0
- package/dist/client/assets/channel-DL78KxYG.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-FAEL5P17.js → chunk-2Q5K7J3B-DObAmPce.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BQJAvucM.js → chunk-5VM5RSS4-DzxXhelD.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-DEkt187T.js → chunk-F27PBJKO-Dj3YQyGM.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-Dj3YQyGM.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-Dj3YQyGM.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-BfOJ-x_l.js → chunk-IMKFNOWR-CE7bqxoG.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-CE7bqxoG.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CE7bqxoG.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-BN6q6jKH.js → chunk-JWPE2WC7-DFJoL74-.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-BrhQRNCn.js → chunk-POPQ4Y6H-B30lkME1.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-CjZOC5Dj.js → chunk-SVP7TREG-CgOpDyvy.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-CgOpDyvy.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CgOpDyvy.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-Wshj9ws7.js → chunk-TICWLB2K-BR5XGMNg.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-BR5XGMNg.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-BR5XGMNg.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-BPPghuc3.js → chunk-XXDRQBXY-BKldUs8F.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-b_-qSVi1.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-b_-qSVi1.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-BjxJYQH8.js → cose-bilkent-JH36ORCC-CnrvvmQg.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-CnrvvmQg.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CnrvvmQg.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-QmUTVmd_.js → cynefin-OW5HDTMX-le0YxHqk.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-le0YxHqk.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-le0YxHqk.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-CBJtWB9m.js → cynefinDiagram-5FMLGOSQ-2qqjuIA5.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-2qqjuIA5.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-2qqjuIA5.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-CJFctjtR.js → dagre-GXQ25YYZ-ySY-m_3G.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-ySY-m_3G.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-ySY-m_3G.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-e7Jn-RGH.js → diagram-S7CK7UJ4-_JCGlMd8.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-_JCGlMd8.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-_JCGlMd8.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-B1G-uMf2.js → diagram-UQ7AKVKN-BSVqFKk8.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-BSVqFKk8.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-BSVqFKk8.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-cp7u53yF.js → diagram-VSXAHHWV-DOp5kQU_.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-DOp5kQU_.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-DOp5kQU_.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-DJWrVfMd.js → diagram-VX7I27RA-9C4wLPPz.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-9C4wLPPz.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-9C4wLPPz.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-B-IZbqzJ.js → diagram-Z3DM3KII-CDfeZux0.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-CDfeZux0.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-CDfeZux0.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-Bt4zDbpn.js → ebnfDiagram-PWID7BFC-BbqbgHfs.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BbqbgHfs.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BbqbgHfs.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-DUPOkndO.js → erDiagram-RLTQ6QDP-DDlGxrsN.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-DDlGxrsN.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DDlGxrsN.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-CBSvTIxa.js → flowDiagram-HODETNUW-CR06BU6T.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-CR06BU6T.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CR06BU6T.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-C7BvkSc8.js → ganttDiagram-EL5Y4UJY-CO0RMu26.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CO0RMu26.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-CO0RMu26.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-C4v6Do2L.js → gitGraphDiagram-WWUBYQGX-lrQmE7bg.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lrQmE7bg.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lrQmE7bg.js.gz +0 -0
- package/dist/client/assets/{index-BaBARzax.css → index-DUsATQ7Z.css} +1 -1
- package/dist/client/assets/index-DUsATQ7Z.css.br +0 -0
- package/dist/client/assets/{index-BaBARzax.css.gz → index-DUsATQ7Z.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CVQtEdgb.js → infoDiagram-27XIBGKW-xfXwS_2x.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Cf7tUoyW.js → ishikawaDiagram-5VMMS53U-BitFMw4X.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BitFMw4X.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-BitFMw4X.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-B-9CWrlr.js → journeyDiagram-3NMN7TZE-BaptOqLI.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BaptOqLI.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-BaptOqLI.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-LDN2IZeo.js → kanban-definition-UXKFOSKX-gNERL_7-.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-gNERL_7-.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-gNERL_7-.js.gz +0 -0
- package/dist/client/assets/{layout-DvqSuFgF.js → layout-DxvfKq_w.js} +1 -1
- package/dist/client/assets/layout-DxvfKq_w.js.br +0 -0
- package/dist/client/assets/layout-DxvfKq_w.js.gz +0 -0
- package/dist/client/assets/{linear-D43LQnis.js → linear-CdfrlKH3.js} +1 -1
- package/dist/client/assets/linear-CdfrlKH3.js.br +0 -0
- package/dist/client/assets/linear-CdfrlKH3.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-DiblHLKe.js → mermaid.core-DSB8LH5g.js} +5 -5
- package/dist/client/assets/mermaid.core-DSB8LH5g.js.br +0 -0
- package/dist/client/assets/mermaid.core-DSB8LH5g.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-k3f4uWuu.js → mindmap-definition-YA3MSWOX-c1A1Od88.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-c1A1Od88.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-c1A1Od88.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-Dj32Fl3j.js → pegDiagram-XKGWAZYB-BfvzWDRQ.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-BfvzWDRQ.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-BfvzWDRQ.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-DWGSixfl.js → pieDiagram-E7YTZNPT-hlalKFPc.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-hlalKFPc.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-hlalKFPc.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BPScfZWR.js → quadrantDiagram-AXDQQJYC-CpaPlOYr.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CpaPlOYr.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-CpaPlOYr.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-CL00HIC2.js → railroadDiagram-O6MQD6OU-WIoLi5_4.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-WIoLi5_4.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-WIoLi5_4.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-CosES4L6.js → requirementDiagram-BXWQKSXE-D-mTFl9s.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-D-mTFl9s.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-D-mTFl9s.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CjM8CYFn.js → sankeyDiagram-P5KCCOFB-B-aT0uzw.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B-aT0uzw.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B-aT0uzw.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-3RKv_35o.js → sequenceDiagram-WJ2MYXX4-Dh0UfH57.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Dh0UfH57.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-Dh0UfH57.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-BrVkA4VD.js → sizeCapture-INFHLROL-Cdld6RrD.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-Cdld6RrD.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-Cdld6RrD.js.gz +0 -0
- package/dist/client/assets/{sparkles-B3pwUd8-.js → sparkles-DltQJKyI.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-DeWhyAVC.js → stateDiagram-D77RDMKH-Cc2PXJDa.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-Cc2PXJDa.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-Cc2PXJDa.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CteZAcit.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-i2m0Wmhn.js → swimlanes-42K2YHIH-BZA6sOfL.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BZA6sOfL.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-BZA6sOfL.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-CPZYMPQw.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-BImN0AS_.js → timeline-definition-24CTP7MA-CamJJSnU.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-CamJJSnU.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CamJJSnU.js.gz +0 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DVUHKmvC.js → vennDiagram-4TSXK5OY-DVZko4RV.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DVZko4RV.js.br +0 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DVUHKmvC.js.gz → vennDiagram-4TSXK5OY-DVZko4RV.js.gz} +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-B9qi-hc7.js → wardleyDiagram-VM6X3IG4-CUNnb5lq.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CUNnb5lq.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CUNnb5lq.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-3jgBcYVl.js → xychartDiagram-S5SC5T6Z-B41aTxS9.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-B41aTxS9.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-B41aTxS9.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/package.json +1 -1
- package/runtime-manifest.json +2 -2
- package/scripts/prepare-desktop-runtime.mjs +1 -0
- package/dist/client/assets/ChangeWalkthroughPanel-u9y3e-pI.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-u9y3e-pI.js.gz +0 -0
- package/dist/client/assets/DagPlayground-BLUwaOMM.js.br +0 -0
- package/dist/client/assets/DagPlayground-BLUwaOMM.js.gz +0 -0
- package/dist/client/assets/DiffLab-ThgXydJA.js.br +0 -0
- package/dist/client/assets/DiffLab-ThgXydJA.js.gz +0 -0
- package/dist/client/assets/DiffReview-DNkXOQ2y.js.br +0 -0
- package/dist/client/assets/DiffReview-DNkXOQ2y.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CHyV1WMR.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CHyV1WMR.js.gz +0 -0
- package/dist/client/assets/DiffViewer-CxxOpsVz.js.br +0 -0
- package/dist/client/assets/DiffViewer-CxxOpsVz.js.gz +0 -0
- package/dist/client/assets/ModelPreview-DZzx3Tzo.js.br +0 -0
- package/dist/client/assets/ModelPreview-DZzx3Tzo.js.gz +0 -0
- package/dist/client/assets/RightSidebar-Bv8Y6hqx.js.br +0 -0
- package/dist/client/assets/RightSidebar-Bv8Y6hqx.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DKmZLRlf.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-DKmZLRlf.js.gz +0 -0
- package/dist/client/assets/app-tT08GaCs.js.br +0 -0
- package/dist/client/assets/app-tT08GaCs.js.gz +0 -0
- package/dist/client/assets/arc-CjmHoRed.js.br +0 -0
- package/dist/client/assets/arc-CjmHoRed.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-B0EDOwYH.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-B0EDOwYH.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CW-AaouZ.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CW-AaouZ.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-aE7hFKfo.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-aE7hFKfo.js.gz +0 -0
- package/dist/client/assets/channel-DhsPQnwY.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-DEkt187T.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-DEkt187T.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BfOJ-x_l.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BfOJ-x_l.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CjZOC5Dj.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CjZOC5Dj.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Wshj9ws7.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-Wshj9ws7.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-2OomHNTG.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-2OomHNTG.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BjxJYQH8.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BjxJYQH8.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-QmUTVmd_.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-QmUTVmd_.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CBJtWB9m.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CBJtWB9m.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJFctjtR.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJFctjtR.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-e7Jn-RGH.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-e7Jn-RGH.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-B1G-uMf2.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-B1G-uMf2.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-cp7u53yF.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-cp7u53yF.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DJWrVfMd.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DJWrVfMd.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-B-IZbqzJ.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-B-IZbqzJ.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt4zDbpn.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bt4zDbpn.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DUPOkndO.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DUPOkndO.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CBSvTIxa.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-CBSvTIxa.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-C7BvkSc8.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-C7BvkSc8.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C4v6Do2L.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-C4v6Do2L.js.gz +0 -0
- package/dist/client/assets/index-BaBARzax.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Cf7tUoyW.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-Cf7tUoyW.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-B-9CWrlr.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-B-9CWrlr.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-LDN2IZeo.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-LDN2IZeo.js.gz +0 -0
- package/dist/client/assets/layout-DvqSuFgF.js.br +0 -0
- package/dist/client/assets/layout-DvqSuFgF.js.gz +0 -0
- package/dist/client/assets/linear-D43LQnis.js.br +0 -0
- package/dist/client/assets/linear-D43LQnis.js.gz +0 -0
- package/dist/client/assets/mermaid.core-DiblHLKe.js.br +0 -0
- package/dist/client/assets/mermaid.core-DiblHLKe.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-k3f4uWuu.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-k3f4uWuu.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Dj32Fl3j.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Dj32Fl3j.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DWGSixfl.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-DWGSixfl.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPScfZWR.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPScfZWR.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CL00HIC2.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CL00HIC2.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CosES4L6.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CosES4L6.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CjM8CYFn.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CjM8CYFn.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-3RKv_35o.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-3RKv_35o.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BrVkA4VD.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BrVkA4VD.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DeWhyAVC.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DeWhyAVC.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-DvdrGmTm.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-i2m0Wmhn.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-i2m0Wmhn.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DIzij9pB.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-BImN0AS_.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-BImN0AS_.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DVUHKmvC.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B9qi-hc7.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-B9qi-hc7.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-3jgBcYVl.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-3jgBcYVl.js.gz +0 -0
package/.desktop-dist/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { app, BrowserWindow, clipboard, dialog, ipcMain, Menu, net, nativeImage, Notification, screen, session, shell, Tray, } from 'electron';
|
|
1
|
+
import { app, BrowserWindow, clipboard, dialog, ipcMain, Menu, net, nativeImage, Notification, powerMonitor, screen, session, shell, Tray, } from 'electron';
|
|
2
2
|
import { execFile, spawn } from 'node:child_process';
|
|
3
3
|
import crypto from 'node:crypto';
|
|
4
4
|
import dgram from 'node:dgram';
|
|
@@ -16,7 +16,8 @@ import { isExternalLinkStagingUrl, isSafeExternalUrl } from './externalLinks.js'
|
|
|
16
16
|
import { shouldThrottleDesktopRenderer } from './windowPolicy.js';
|
|
17
17
|
import { checkConnectedServiceRuntime, getConnectedServiceRuntimeState, restartConnectedServiceRuntime, } from './connectedServiceRuntime.js';
|
|
18
18
|
import { isOwnedDesktopRuntimeTarget } from './runtimeTarget.js';
|
|
19
|
-
import {
|
|
19
|
+
import { serviceDocumentNeedsReload } from './serviceWindowRecovery.js';
|
|
20
|
+
import { CertificateTrustRequests, resolveServiceCertificateTrust, canOfferCertificateTrust, downloadCertificateAuthority, isCertificateTrustError, isLocalNetworkHostname, matchManagedLocalCertificate, } from './certificateTrust.js';
|
|
20
21
|
const execFileAsync = promisify(execFile);
|
|
21
22
|
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
22
23
|
const projectRoot = path.resolve(currentDir, '..');
|
|
@@ -27,12 +28,17 @@ const desktopRuntimeOwnerSocketPath = path.join(termdockDir, 'desktop-runtime-ow
|
|
|
27
28
|
const DEFAULT_LOCAL_URL = 'http://localhost:9834';
|
|
28
29
|
const PROTOCOL_VERSION = 1;
|
|
29
30
|
const HEALTH_TIMEOUT_MS = 3_500;
|
|
31
|
+
const SERVICE_RECOVERY_PROBE_TIMEOUT_MS = 5_000;
|
|
30
32
|
const START_TIMEOUT_MS = 90_000;
|
|
31
33
|
const RESTORE_LOAD_TIMEOUT_MS = 15_000;
|
|
32
34
|
const localServiceCertificatePath = path.join(termdockDir, 'certs', 'termdock-local.pem');
|
|
33
35
|
const sessionTrustedCertificateTargets = new Set();
|
|
36
|
+
const certificateTrustRequests = new CertificateTrustRequests();
|
|
37
|
+
const sessionTrustedLeafByOrigin = new Map();
|
|
34
38
|
const sessionTrustedCertificateAuthorities = new Map();
|
|
35
39
|
let managedLocalCertificateFingerprint = null;
|
|
40
|
+
const serviceWindowRecoveryTimers = new WeakMap();
|
|
41
|
+
const serviceWindowRecoveryInFlight = new WeakSet();
|
|
36
42
|
/** Delivered-but-unseen desktop notifications, mirrored into the Dock badge. */
|
|
37
43
|
const activeNotifications = new Map();
|
|
38
44
|
let unreadNotificationCount = 0;
|
|
@@ -443,7 +449,15 @@ function openExternalLink(url) {
|
|
|
443
449
|
function certificateTrustKey(hostname, fingerprint) {
|
|
444
450
|
return `${hostname.toLowerCase().replace(/^\[|\]$/g, '')}\0${fingerprint}`;
|
|
445
451
|
}
|
|
446
|
-
function
|
|
452
|
+
function readManagedLocalCertificateFingerprint() {
|
|
453
|
+
try {
|
|
454
|
+
return new crypto.X509Certificate(fs.readFileSync(localServiceCertificatePath)).fingerprint256;
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
function installCertificateVerifyProcedure(targetSession = session.defaultSession, serviceOrigin) {
|
|
447
461
|
targetSession.setCertificateVerifyProc((request, callback) => {
|
|
448
462
|
let isLocalTarget = false;
|
|
449
463
|
try {
|
|
@@ -460,20 +474,36 @@ function installCertificateVerifyProcedure(targetSession = session.defaultSessio
|
|
|
460
474
|
// Keep Chromium's default verification if the certificate cannot be parsed.
|
|
461
475
|
}
|
|
462
476
|
const explicitlyTrustedTarget = presentedFingerprint
|
|
463
|
-
?
|
|
477
|
+
? serviceOrigin
|
|
478
|
+
? new URL(serviceOrigin).hostname.replace(/^\[|\]$/g, '').toLowerCase()
|
|
479
|
+
=== request.hostname.replace(/^\[|\]$/g, '').toLowerCase()
|
|
480
|
+
&& sessionTrustedLeafByOrigin.get(serviceOrigin) === presentedFingerprint
|
|
481
|
+
: sessionTrustedCertificateTargets.has(certificateTrustKey(request.hostname, presentedFingerprint))
|
|
464
482
|
: false;
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
|
|
483
|
+
const managedMatch = isLocalTarget
|
|
484
|
+
? matchManagedLocalCertificate(presentedFingerprint, managedLocalCertificateFingerprint, readManagedLocalCertificateFingerprint)
|
|
485
|
+
: { matches: false, currentFingerprint: managedLocalCertificateFingerprint };
|
|
486
|
+
managedLocalCertificateFingerprint = managedMatch.currentFingerprint;
|
|
487
|
+
const managedLocalCertificate = managedMatch.matches;
|
|
488
|
+
if (explicitlyTrustedTarget || managedLocalCertificate) {
|
|
489
|
+
callback(0);
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
if (serviceOrigin && canOfferCertificateTrust(serviceOrigin)
|
|
493
|
+
&& isCertificateTrustError(request.verificationResult)) {
|
|
494
|
+
// Resolve trust before Chromium caches a rejection. This covers fetch,
|
|
495
|
+
// WebSocket and navigation requests, not only the initial Node probe.
|
|
496
|
+
void resolveServiceCertificateTrust(serviceOrigin, request.hostname, request.certificate.data, () => requestCertificateTrust(serviceOrigin)).then((trusted) => callback(trusted ? 0 : -3), (error) => {
|
|
497
|
+
console.warn(`[desktop-certificate] ${serviceOrigin}: ${networkErrorDetails(error)}`);
|
|
498
|
+
callback(-3);
|
|
499
|
+
});
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
callback(-3);
|
|
468
503
|
});
|
|
469
504
|
}
|
|
470
505
|
function configureLocalServiceCertificateTrust() {
|
|
471
|
-
|
|
472
|
-
managedLocalCertificateFingerprint = new crypto.X509Certificate(fs.readFileSync(localServiceCertificatePath)).fingerprint256;
|
|
473
|
-
}
|
|
474
|
-
catch {
|
|
475
|
-
// The certificate is created when the local service first enables HTTPS.
|
|
476
|
-
}
|
|
506
|
+
managedLocalCertificateFingerprint = readManagedLocalCertificateFingerprint();
|
|
477
507
|
installCertificateVerifyProcedure();
|
|
478
508
|
}
|
|
479
509
|
function defaultConfig() {
|
|
@@ -549,7 +579,19 @@ function trustedCertificateAuthorityFor(target) {
|
|
|
549
579
|
const origin = new URL(target).origin;
|
|
550
580
|
return readDesktopConfig().trustedCertificateAuthorities.find((entry) => entry.origin === origin);
|
|
551
581
|
}
|
|
552
|
-
|
|
582
|
+
function requestCertificateTrust(target) {
|
|
583
|
+
return certificateTrustRequests.request(new URL(target).origin, () => confirmCertificateTrust(target));
|
|
584
|
+
}
|
|
585
|
+
function rememberSessionCertificate(target, certificate) {
|
|
586
|
+
const url = new URL(target);
|
|
587
|
+
const previous = sessionTrustedLeafByOrigin.get(url.origin);
|
|
588
|
+
if (previous)
|
|
589
|
+
sessionTrustedCertificateTargets.delete(certificateTrustKey(url.hostname, previous));
|
|
590
|
+
sessionTrustedLeafByOrigin.set(url.origin, certificate.leafFingerprint256);
|
|
591
|
+
sessionTrustedCertificateAuthorities.set(url.origin, certificate.certificatePem);
|
|
592
|
+
sessionTrustedCertificateTargets.add(certificateTrustKey(url.hostname, certificate.leafFingerprint256));
|
|
593
|
+
}
|
|
594
|
+
async function confirmCertificateTrust(target) {
|
|
553
595
|
let certificate;
|
|
554
596
|
try {
|
|
555
597
|
certificate = await downloadCertificateAuthority(target);
|
|
@@ -565,8 +607,7 @@ async function requestCertificateTrust(target) {
|
|
|
565
607
|
}
|
|
566
608
|
const existingTrust = trustedCertificateAuthorityFor(target);
|
|
567
609
|
if (existingTrust?.fingerprint256 === certificate.fingerprint256) {
|
|
568
|
-
|
|
569
|
-
sessionTrustedCertificateTargets.add(certificateTrustKey(new URL(target).hostname, certificate.leafFingerprint256));
|
|
610
|
+
rememberSessionCertificate(target, certificate);
|
|
570
611
|
return certificate;
|
|
571
612
|
}
|
|
572
613
|
const confirmation = await showDesktopMessageBox({
|
|
@@ -596,8 +637,7 @@ async function requestCertificateTrust(target) {
|
|
|
596
637
|
trustedAt: Date.now(),
|
|
597
638
|
});
|
|
598
639
|
writeDesktopConfig(config);
|
|
599
|
-
|
|
600
|
-
sessionTrustedCertificateTargets.add(certificateTrustKey(new URL(target).hostname, certificate.leafFingerprint256));
|
|
640
|
+
rememberSessionCertificate(target, certificate);
|
|
601
641
|
return certificate;
|
|
602
642
|
}
|
|
603
643
|
async function requestLocalNetworkPermissionRetry(target) {
|
|
@@ -834,6 +874,12 @@ async function probeServiceWithLocalNetworkPermission(rawUrl, options = {}) {
|
|
|
834
874
|
// Do the first macOS HTTPS probe with Node TLS. Sending an untrusted
|
|
835
875
|
// certificate through Chromium first permanently caches that rejection for
|
|
836
876
|
// the process and prevents an immediate retry after the user approves it.
|
|
877
|
+
if (options.interactive !== false && canOfferCertificateTrust(normalizedUrl)
|
|
878
|
+
&& trustedCertificateAuthorityFor(normalizedUrl)) {
|
|
879
|
+
const certificate = await requestCertificateTrust(normalizedUrl);
|
|
880
|
+
if (!certificate)
|
|
881
|
+
return { ok: false, url: normalizedUrl, error: 'HTTPS 证书尚未受信任' };
|
|
882
|
+
}
|
|
837
883
|
const approvedAuthority = sessionTrustedCertificateAuthorities.get(new URL(normalizedUrl).origin);
|
|
838
884
|
let probe = approvedAuthority
|
|
839
885
|
? await probeServiceWithCertificateAuthority(normalizedUrl, approvedAuthority)
|
|
@@ -1315,6 +1361,14 @@ async function installCli() {
|
|
|
1315
1361
|
return snapshot();
|
|
1316
1362
|
}
|
|
1317
1363
|
async function connectWindow(rawUrl, options = {}) {
|
|
1364
|
+
if (options.focus !== false) {
|
|
1365
|
+
try {
|
|
1366
|
+
certificateTrustRequests.retry(new URL(normalizeServiceUrl(rawUrl)).origin);
|
|
1367
|
+
}
|
|
1368
|
+
catch {
|
|
1369
|
+
return await probeService(rawUrl);
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1318
1372
|
let probe = await probeServiceWithLocalNetworkPermission(rawUrl, {
|
|
1319
1373
|
interactive: options.focus !== false,
|
|
1320
1374
|
});
|
|
@@ -1344,6 +1398,9 @@ async function connectWindow(rawUrl, options = {}) {
|
|
|
1344
1398
|
existing.lastConnectedAt = Date.now();
|
|
1345
1399
|
writeDesktopConfig(config);
|
|
1346
1400
|
}
|
|
1401
|
+
if (await serviceDocumentNeedsReload(existingWindow.webContents, key)) {
|
|
1402
|
+
await existingWindow.loadURL(probe.url);
|
|
1403
|
+
}
|
|
1347
1404
|
if (options.focus !== false) {
|
|
1348
1405
|
mainWindow?.hide();
|
|
1349
1406
|
showAndFocusWindow(existingWindow);
|
|
@@ -1462,6 +1519,55 @@ function finishStartupProgress() {
|
|
|
1462
1519
|
return;
|
|
1463
1520
|
mainWindow.webContents.send('desktop:startup-progress', null);
|
|
1464
1521
|
}
|
|
1522
|
+
function scheduleServiceWindowRecovery(window, reason, delayMs = 750) {
|
|
1523
|
+
if (window.isDestroyed() || !windowServiceOrigins.has(window))
|
|
1524
|
+
return;
|
|
1525
|
+
const previous = serviceWindowRecoveryTimers.get(window);
|
|
1526
|
+
if (previous)
|
|
1527
|
+
clearTimeout(previous);
|
|
1528
|
+
const timer = setTimeout(() => {
|
|
1529
|
+
serviceWindowRecoveryTimers.delete(window);
|
|
1530
|
+
void recoverServiceWindow(window, reason);
|
|
1531
|
+
}, delayMs);
|
|
1532
|
+
timer.unref();
|
|
1533
|
+
serviceWindowRecoveryTimers.set(window, timer);
|
|
1534
|
+
}
|
|
1535
|
+
async function recoverServiceWindow(window, reason) {
|
|
1536
|
+
if (window.isDestroyed() || serviceWindowRecoveryInFlight.has(window))
|
|
1537
|
+
return;
|
|
1538
|
+
const serviceOrigin = windowServiceOrigins.get(window);
|
|
1539
|
+
if (!serviceOrigin)
|
|
1540
|
+
return;
|
|
1541
|
+
serviceWindowRecoveryInFlight.add(window);
|
|
1542
|
+
try {
|
|
1543
|
+
let probeTimer = null;
|
|
1544
|
+
const probe = await Promise.race([
|
|
1545
|
+
probeServiceWithLocalNetworkPermission(serviceOrigin, { interactive: false }),
|
|
1546
|
+
new Promise((resolve) => {
|
|
1547
|
+
probeTimer = setTimeout(() => resolve({
|
|
1548
|
+
ok: false,
|
|
1549
|
+
url: serviceOrigin,
|
|
1550
|
+
error: '桌面恢复健康检查超时',
|
|
1551
|
+
}), SERVICE_RECOVERY_PROBE_TIMEOUT_MS);
|
|
1552
|
+
probeTimer.unref();
|
|
1553
|
+
}),
|
|
1554
|
+
]);
|
|
1555
|
+
if (probeTimer)
|
|
1556
|
+
clearTimeout(probeTimer);
|
|
1557
|
+
if (!probe.ok || window.isDestroyed())
|
|
1558
|
+
return;
|
|
1559
|
+
if (!(await serviceDocumentNeedsReload(window.webContents, serviceOrigin)) || window.isDestroyed())
|
|
1560
|
+
return;
|
|
1561
|
+
console.warn(`[desktop-recovery] reloading ${serviceOrigin} after ${reason}`);
|
|
1562
|
+
await window.loadURL(probe.url);
|
|
1563
|
+
}
|
|
1564
|
+
catch (error) {
|
|
1565
|
+
console.warn(`[desktop-recovery] ${serviceOrigin} recovery after ${reason} failed: ${networkErrorDetails(error)}`);
|
|
1566
|
+
}
|
|
1567
|
+
finally {
|
|
1568
|
+
serviceWindowRecoveryInFlight.delete(window);
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1465
1571
|
function createDesktopWindow(options) {
|
|
1466
1572
|
const serviceSession = options
|
|
1467
1573
|
? session.fromPartition(`persist:termdock-service-${crypto
|
|
@@ -1471,7 +1577,7 @@ function createDesktopWindow(options) {
|
|
|
1471
1577
|
.slice(0, 24)}`)
|
|
1472
1578
|
: null;
|
|
1473
1579
|
if (serviceSession)
|
|
1474
|
-
installCertificateVerifyProcedure(serviceSession);
|
|
1580
|
+
installCertificateVerifyProcedure(serviceSession, options?.serviceOrigin);
|
|
1475
1581
|
const window = new BrowserWindow({
|
|
1476
1582
|
title: options ? `Termdock — ${options.label}` : 'Termdock — 连接中心',
|
|
1477
1583
|
show: false,
|
|
@@ -1499,6 +1605,15 @@ function createDesktopWindow(options) {
|
|
|
1499
1605
|
});
|
|
1500
1606
|
if (options)
|
|
1501
1607
|
windowServiceOrigins.set(window, options.serviceOrigin);
|
|
1608
|
+
if (options) {
|
|
1609
|
+
window.webContents.on('certificate-error', (event, url, error, certificate, callback) => {
|
|
1610
|
+
if (new URL(url).origin !== options.serviceOrigin
|
|
1611
|
+
|| !canOfferCertificateTrust(url) || !isCertificateTrustError(error))
|
|
1612
|
+
return;
|
|
1613
|
+
event.preventDefault();
|
|
1614
|
+
void resolveServiceCertificateTrust(options.serviceOrigin, new URL(url).hostname, certificate.data, () => requestCertificateTrust(options.serviceOrigin)).then(callback, () => callback(false));
|
|
1615
|
+
});
|
|
1616
|
+
}
|
|
1502
1617
|
if (options) {
|
|
1503
1618
|
window.webContents.on('page-title-updated', (event) => {
|
|
1504
1619
|
event.preventDefault();
|
|
@@ -1610,6 +1725,14 @@ function createDesktopWindow(options) {
|
|
|
1610
1725
|
}
|
|
1611
1726
|
`);
|
|
1612
1727
|
});
|
|
1728
|
+
window.webContents.on('did-fail-load', (_event, _errorCode, _errorDescription, _validatedURL, isMainFrame) => {
|
|
1729
|
+
if (isMainFrame)
|
|
1730
|
+
scheduleServiceWindowRecovery(window, 'main-frame-load-failure');
|
|
1731
|
+
});
|
|
1732
|
+
window.webContents.on('render-process-gone', (_event, details) => {
|
|
1733
|
+
scheduleServiceWindowRecovery(window, `renderer-${details.reason}`);
|
|
1734
|
+
});
|
|
1735
|
+
window.on('unresponsive', () => scheduleServiceWindowRecovery(window, 'unresponsive'));
|
|
1613
1736
|
window.on('closed', () => {
|
|
1614
1737
|
if (mainWindow === window)
|
|
1615
1738
|
mainWindow = null;
|
|
@@ -1629,6 +1752,7 @@ function createDesktopWindow(options) {
|
|
|
1629
1752
|
broadcastServiceActivity();
|
|
1630
1753
|
// User is looking at the app — the Dock badge has served its purpose.
|
|
1631
1754
|
clearUnreadNotifications();
|
|
1755
|
+
scheduleServiceWindowRecovery(window, 'window-focus');
|
|
1632
1756
|
});
|
|
1633
1757
|
window.on('close', (event) => {
|
|
1634
1758
|
const serviceOrigin = windowServiceOrigins.get(window);
|
|
@@ -1663,7 +1787,13 @@ function installIpcHandlers() {
|
|
|
1663
1787
|
return png.buffer.slice(png.byteOffset, png.byteOffset + png.byteLength);
|
|
1664
1788
|
});
|
|
1665
1789
|
ipcMain.handle('desktop:snapshot', () => snapshot());
|
|
1666
|
-
ipcMain.handle('desktop:probe', (_event, url) =>
|
|
1790
|
+
ipcMain.handle('desktop:probe', (_event, url) => {
|
|
1791
|
+
try {
|
|
1792
|
+
certificateTrustRequests.retry(new URL(normalizeServiceUrl(url)).origin);
|
|
1793
|
+
}
|
|
1794
|
+
catch { /* probe reports invalid URLs */ }
|
|
1795
|
+
return probeServiceWithLocalNetworkPermission(url);
|
|
1796
|
+
});
|
|
1667
1797
|
ipcMain.handle('desktop:save-connection', async (_event, input) => {
|
|
1668
1798
|
const url = normalizeServiceUrl(input.url);
|
|
1669
1799
|
const config = readDesktopConfig();
|
|
@@ -2047,6 +2177,11 @@ app.whenReady().then(async () => {
|
|
|
2047
2177
|
refreshDesktopStatusSurfaces();
|
|
2048
2178
|
screen.on('display-removed', keepFloatingWidgetOnScreen);
|
|
2049
2179
|
screen.on('display-metrics-changed', keepFloatingWidgetOnScreen);
|
|
2180
|
+
powerMonitor.on('resume', () => {
|
|
2181
|
+
for (const window of serviceWindows.values()) {
|
|
2182
|
+
scheduleServiceWindowRecovery(window, 'system-resume', 1_200);
|
|
2183
|
+
}
|
|
2184
|
+
});
|
|
2050
2185
|
configureDesktopUpdater(showDesktopMessageBox);
|
|
2051
2186
|
subscribeDesktopUpdateState((state) => {
|
|
2052
2187
|
for (const window of BrowserWindow.getAllWindows()) {
|
package/dist/client/assets/{ChangeWalkthroughPanel-u9y3e-pI.js → ChangeWalkthroughPanel-Ddx5GDvK.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a0 as K,aJ as ce,as as s,e as le,n as de,I as me,g as he}from"./app-tT08GaCs.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as xe}from"./sparkles-B3pwUd8-.js";const ue=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],fe=K("chevron-left",ue);const pe=[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]],ye=K("git-branch",pe);const ge=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]],be=K("maximize-2",ge);const ke=[["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"}]],ve=K("minimize-2",ke);function Ne(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function we(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 je(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 J({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:je(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const R=190,U=92,Q=132,Me=28,C=16,ee=18,X=54,te=24,ae=18,Ee=8,z=24,B=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function ne(t){return B[t%B.length]}function _e(t,d){return`${t.from}->${t.to}:${d}`}function $e(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(U,36+Math.max(0,o-1)*ae)}function se(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 oe(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 De(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(z,d[h.key]??0)/2;if(u===0){r.push(N);return}const w=o[u-1],E=Math.max(z,d[w.key]??0)/2;r.push(Math.max(N,r[u-1]+E+M+Ee))});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(z,d[o[u].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,u)=>{h.laneY=r[u]-g+a})}}function Ie(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+X;m.forEach(({node:x,index:f},j)=>{const I=Math.max($e(x.id,l,a),Math.ceil(i[x.id]??U));w.push({node:x,index:f,layer:n,row:j,x:C+n*(R+Q),y:c,height:I}),c+=I+Me})}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:_e(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=oe(m,v,"from");c.forEach((x,f)=>{const j=v[x];j.fromPortIndex=f,j.fromY=se(E.get(n),f,c.length)})}for(const[n,m]of G){const c=oe(m,v,"to");c.forEach((x,f)=>{const j=v[x];j.toPortIndex=f,j.toY=se(E.get(n),f,c.length)})}De(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))-te-(Math.floor(f/2)+1)*ee,S=Math.max(...j.map(A=>A.y+A.height))+te+(Math.floor(f/2)+1)*ee;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+X+U,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(z,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*R+O*Q,height:W+C+X}}function re(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 Ae(t){const d=t.fromNode.x+R+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?re([{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}]):re([{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 Ge(t){const d=t.fromNode.x+R+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 Ce({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=Ne(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?Ie(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):[],V=f?new Set(A.map(e=>e.key)):null,q=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,T=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??T.get(e.id)),H=L.findIndex(e=>e.id===n),F=e=>{if(L.length===0)return;const y=H<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,H+e)),p=L[y],b=p.anchor??T.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(xe,{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:()=>F(-1),disabled:H===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(fe,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[H<0?"—":H+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>F(1),disabled:H===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(ve,{size:15}):s.jsx(be,{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(ye,{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:B.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=Ae(e),p=ne(e.index),b=I===e.key||!!V?.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%B.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+R+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:$}=Ge(e),k=ne(e.index),Z=I===e.key||!!V?.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?`
|
|
1
|
+
import{a0 as K,aJ as ce,as as s,e as le,n as de,I as me,g as he}from"./app-CuXPRCrJ.js";import{b as D}from"./dnd-BCFAPC0L.js";import{S as xe}from"./sparkles-DltQJKyI.js";const ue=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],fe=K("chevron-left",ue);const pe=[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]],ye=K("git-branch",pe);const ge=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]],be=K("maximize-2",ge);const ke=[["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"}]],ve=K("minimize-2",ke);function Ne(t,d){return(d?t.filter(o=>o.repoRoot===d):t).slice().sort((o,r)=>r.injectedAt-o.injectedAt)[0]??null}function we(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 je(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 J({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:je(t),className:`${o} text-left transition hover:border-primary/35 hover:bg-primary/15 active:scale-[0.99]`,style:r,children:d})}const R=190,U=92,Q=132,Me=28,C=16,ee=18,X=54,te=24,ae=18,Ee=8,z=24,B=["rgb(var(--primary-rgb))","rgb(var(--accent-rgb))","rgb(var(--warning-rgb))","rgb(var(--success-rgb))","rgb(192 132 252)"];function ne(t){return B[t%B.length]}function _e(t,d){return`${t.from}->${t.to}:${d}`}function $e(t,d,i){const o=Math.max(d.get(t)?.length??0,i.get(t)?.length??0);return Math.max(U,36+Math.max(0,o-1)*ae)}function se(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 oe(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 De(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(z,d[h.key]??0)/2;if(u===0){r.push(N);return}const w=o[u-1],E=Math.max(z,d[w.key]??0)/2;r.push(Math.max(N,r[u-1]+E+M+Ee))});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(z,d[o[u].key]??0)/2)),a=Math.max(0,C-l);o.forEach((h,u)=>{h.laneY=r[u]-g+a})}}function Ie(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+X;m.forEach(({node:x,index:f},j)=>{const I=Math.max($e(x.id,l,a),Math.ceil(i[x.id]??U));w.push({node:x,index:f,layer:n,row:j,x:C+n*(R+Q),y:c,height:I}),c+=I+Me})}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:_e(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=oe(m,v,"from");c.forEach((x,f)=>{const j=v[x];j.fromPortIndex=f,j.fromY=se(E.get(n),f,c.length)})}for(const[n,m]of G){const c=oe(m,v,"to");c.forEach((x,f)=>{const j=v[x];j.toPortIndex=f,j.toY=se(E.get(n),f,c.length)})}De(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))-te-(Math.floor(f/2)+1)*ee,S=Math.max(...j.map(A=>A.y+A.height))+te+(Math.floor(f/2)+1)*ee;n.laneY=f%2===0?Math.max(C,I):S});const O=Math.max(0,...w.map(n=>n.layer)),W=Math.max(C+X+U,...w.map(n=>n.y+n.height),...v.map(n=>n.laneY+Math.max(z,o[n.key]??0)/2));return{nodes:w,edges:v,width:C*2+(O+1)*R+O*Q,height:W+C+X}}function re(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 Ae(t){const d=t.fromNode.x+R+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?re([{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}]):re([{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 Ge(t){const d=t.fromNode.x+R+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 Ce({walkthroughs:t,repoRoot:d,onNavigate:i,fullscreen:o=!1,onToggleFullscreen:r}){const{t:g}=ce(),l=D.useId(),a=Ne(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?Ie(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):[],V=f?new Set(A.map(e=>e.key)):null,q=f?new Set([f,...A.flatMap(e=>[e.from,e.to])]):S?new Set([S.from,S.to]):null,T=new Map(a.sections.filter(e=>e.nodeId&&e.anchor).map(e=>[e.nodeId,e.anchor])),L=a.nodes.filter(e=>e.anchor??T.get(e.id)),H=L.findIndex(e=>e.id===n),F=e=>{if(L.length===0)return;const y=H<0?e<0?L.length-1:0:Math.min(L.length-1,Math.max(0,H+e)),p=L[y],b=p.anchor??T.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(xe,{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:()=>F(-1),disabled:H===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(fe,{size:15})}),s.jsxs("span",{className:"min-w-8 text-center text-[10px] tabular-nums text-muted-foreground",children:[H<0?"—":H+1,"/",L.length]}),s.jsx("button",{type:"button",onClick:()=>F(1),disabled:H===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(ve,{size:15}):s.jsx(be,{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(ye,{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:B.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=Ae(e),p=ne(e.index),b=I===e.key||!!V?.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%B.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+R+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:$}=Ge(e),k=ne(e.index),Z=I===e.key||!!V?.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
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(J,{elementRef:k=>{k?h.current.set(e.id,k):h.current.delete(e.id)},anchor:e.anchor??T.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 ${q?.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)]":q?"border-border/15 opacity-40":"border-border/25"}`,style:{left:p,top:b,width:R,minHeight:$},children:[s.jsx("span",{className:"absolute inset-0",onPointerEnter:()=>W(e.id),onPointerLeave:()=>W(k=>k===e.id?null:k)}),s.jsx("span",{className:`pointer-events-none absolute bottom-2 left-0 top-2 w-[3px] rounded-r-full ${we(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(de,{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(J,{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(me,{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(he,{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{Ce as C,ye as G,be as M,ve as a};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{as as t}from"./app-
|
|
1
|
+
import{as as t}from"./app-CuXPRCrJ.js";import{C as s}from"./ChangeWalkthroughPanel-Ddx5GDvK.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-DltQJKyI.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 h(){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{h as DagPlayground};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{as as t}from"./app-
|
|
1
|
+
import{as as t}from"./app-CuXPRCrJ.js";import{b as a}from"./dnd-BCFAPC0L.js";import{c as k,S as C,D as _}from"./DiffViewer-hy9qKEFv.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";const u={kotlin:{label:"Kotlin function signature + callback",path:"SearchHintIconHelper.kt",diff:`diff --git a/SearchHintIconHelper.kt b/SearchHintIconHelper.kt
|
|
2
2
|
--- a/SearchHintIconHelper.kt
|
|
3
3
|
+++ b/SearchHintIconHelper.kt
|
|
4
4
|
@@ -43,15 +43,20 @@ object SearchHintIconHelper {
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a0 as He,as as r,ak as tt,l as mt,e as pt,d as xt,aJ as gt,aP as vt,a3 as yt,B as bt,G as qe,aO as wt,av as kt,X as Rt,aL as Nt}from"./app-tT08GaCs.js";import{b as a,r as rt}from"./dnd-BCFAPC0L.js";import{S as nt}from"./sparkles-B3pwUd8-.js";import{D as jt,p as Dt,i as Mt}from"./DiffViewer-CxxOpsVz.js";const Tt=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],St=He("arrow-left",Tt);const It=[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]],Et=He("list-tree",It);const Ct=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Ft=He("list",Ct);function st({selected:t,depth:o=0,title:i,leading:x,children:m,trailing:c,role:b,tabIndex:v,ariaExpanded:g,onClick:f,onKeyDown:y,onPointerDown:L,onPointerUp:T,onPointerCancel:E,dataAttributes:B}){return r.jsxs("div",{role:b,tabIndex:v,"aria-expanded":g,title:i,onClick:f,onKeyDown:y,onPointerDown:L,onPointerUp:T,onPointerCancel:E,...B,className:`group flex w-full cursor-pointer items-center gap-1 rounded px-2 py-1.5 text-left text-[13px] transition active:scale-[0.99] ${t?"bg-surface-elevated text-foreground":"text-muted-foreground hover:bg-surface-2 hover:text-foreground"}`,style:{paddingLeft:`${o*14+8}px`},children:[r.jsx("span",{className:"flex min-w-[14px] shrink-0 items-center justify-center text-muted-foreground/80",children:x}),r.jsx("span",{className:"min-w-0 flex-1",children:m}),c]})}function ot(t){return t.path.replace(/^\/+/,"")}function _t(t){if(t.displayName!==void 0||t.displayDir!==void 0)return{name:t.displayName||t.path,dir:t.displayDir||""};const o=t.path.split("/").filter(Boolean);return{name:o.pop()||t.path,dir:o.join("/")}}function at(t,o){const i=new Map,x=(c,b,v,g)=>{const f=c.get(b);if(f)return f;const y={path:v,name:b,childCount:0,directories:[],files:[]};return c.set(b,y),g?.directories.push(y),y};for(const c of t){const b=o(c).split("/").filter(Boolean);if(b.length<=1)continue;let v=i,g=null,f="";for(const y of b.slice(0,-1)){f=f?`${f}/${y}`:y;const L=x(v,y,f,g);g=L,v=new Map(L.directories.map(T=>[T.name,T]))}g?.files.push(c)}const m=c=>{const b=c.directories.map(m).sort((g,f)=>g.name.localeCompare(f.name)),v=c.files.sort((g,f)=>g.path.localeCompare(f.path));return{...c,directories:b,files:v,childCount:b.reduce((g,f)=>g+f.childCount,0)+v.length}};return Array.from(i.values()).map(m).sort((c,b)=>c.name.localeCompare(b.name))}function Be(t,o,i=0){const x=o.selectedKey===t.key||o.selectedKey===t.path||o.selectedKey===t.absolutePath,m=_t(t);return r.jsx(st,{selected:x,role:"button",tabIndex:0,title:t.title??t.absolutePath??t.path,onClick:()=>{tt()||o.onSelectFile(t)},onKeyDown:c=>{c.key!=="Enter"&&c.key!==" "||(c.preventDefault(),o.onSelectFile(t))},leading:o.renderLeading(t),depth:i,trailing:o.renderTrailing?.(t),dataAttributes:{"data-diff-selection-path":t.key,"data-diff-file-path":t.path,"data-diff-absolute-path":t.absolutePath??"","data-diff-status":t.status},children:r.jsxs("span",{className:"select-text","data-sidebar-selectable":!0,children:[r.jsx("span",{className:`block truncate leading-snug ${x?"font-medium":""}`,children:m.name}),o.mode!=="tree"&&m.dir&&r.jsx("span",{className:"block truncate text-[10px] text-muted-foreground/75",children:m.dir}),o.renderSubtitle?.(t)]})},t.key)}function ct(t,o,i,x,m){let c=t;const b=[t.name];for(;c.files.length===0&&c.directories.length===1;)c=c.directories[0],b.push(c.name);const v=b.join("/"),g=`${o}:${c.path}`,f=i.collapsedDirectoryKeys.has(g);return r.jsxs("div",{className:"space-y-px",children:[r.jsx(st,{role:"button",tabIndex:0,onClick:()=>{tt()||i.onToggleDirectory(g)},onKeyDown:y=>{y.key!=="Enter"&&y.key!==" "||(y.preventDefault(),i.onToggleDirectory(g))},ariaExpanded:!f,depth:x,title:c.path,leading:f?r.jsx(pt,{size:13}):r.jsx(xt,{size:13}),trailing:r.jsxs("span",{className:"flex shrink-0 items-center gap-1",children:[r.jsx("span",{className:"shrink-0 rounded bg-surface-2 px-1.5 py-0.5 text-[10px] text-muted-foreground/60 transition group-hover:text-muted-foreground",children:c.childCount}),i.renderDirectoryTrailing?.(c.path,m)]}),children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[r.jsx(mt,{size:14,className:"shrink-0 text-[color:var(--folder)]"}),r.jsx("span",{className:"min-w-0 flex-1 truncate leading-snug select-text","data-sidebar-selectable":!0,children:v})]})}),!f&&r.jsxs("div",{className:"space-y-px",children:[c.directories.map(y=>ct(y,o,i,x+1,m)),c.files.length>0&&r.jsx("div",{className:"space-y-px",children:c.files.map(y=>Be(y,i,x+1))})]})]},g)}function At(t,o){const i=o.getFileTreePath??ot,x=t.files.filter(c=>i(c).split("/").filter(Boolean).length<=1),m=at(t.files,i);return r.jsxs("div",{className:"space-y-px",children:[m.map(c=>ct(c,t.key,o,0,t)),x.length>0&&r.jsx("div",{className:"space-y-px",children:x.map(c=>Be(c,o))})]})}function Pt(t,o=ot){const i=[],x=c=>{for(const b of c.directories)x(b);i.push(...c.files)};for(const c of at(t,o))x(c);const m=new Set(i.map(c=>c.key));return i.push(...t.filter(c=>!m.has(c.key))),i}function zt(t){return r.jsx("div",{className:t.mode==="tree"?"space-y-px pt-1":"space-y-2",children:t.groups.map(o=>{const i=!!o.header,x=!!o.collapsed;return r.jsxs("section",{className:i?"overflow-hidden rounded-lg border border-border/15 bg-surface/60":"",children:[o.header,!x&&r.jsx("div",{className:t.mode==="tree"?i?"space-y-px bg-surface/60 p-1":"space-y-px":i?"space-y-px bg-surface/60 p-1.5":"space-y-px",children:t.mode==="tree"?At(o,t):o.files.map(m=>Be(m,t))})]},o.key)})})}const Ee="termdock:diff-review:list-width:v1",Lt=120,Le=320,Ue=220,Ht=560;function Bt(t){return typeof t=="number"&&Number.isFinite(t)}function Ye(t,o){const i=Math.max(Ue,o-360),x=Math.min(Ht,i);return Math.min(x,Math.max(Ue,t))}function Wt(){return kt(Ee,Bt)??Le}function $t({list:t,detail:o,mobile:i,mobileListHeader:x,mobileDetailHeader:m,desktopListHeader:c,backLabel:b,onMobileSlideChange:v,externalSwiperRef:g,desktopLayout:f="split",onDetailScroll:y,desktopSidePanel:L,desktopListClassName:T,detailOwnsScroll:E=!1}){const{t:B}=gt(),W=a.useRef(null),$=a.useRef(null),C=a.useRef(null),[O,V]=a.useState(Wt);a.useEffect(()=>{if(i||f!=="split")return;const p=$.current;p&&V(j=>Ye(j,p.clientWidth))},[f,i]);const ne=a.useCallback(p=>{i||f!=="split"||(p.preventDefault(),C.current={startX:p.clientX,startWidth:O,pointerId:p.pointerId},p.currentTarget.setPointerCapture(p.pointerId))},[f,O,i]),ie=a.useCallback(p=>{const j=C.current;if(!j||j.pointerId!==p.pointerId)return;const P=$.current?.clientWidth??window.innerWidth,D=Ye(j.startWidth+p.clientX-j.startX,P);V(D),vt(Ee,D,Lt)},[]),se=a.useCallback(p=>{const j=C.current;if(!(!j||j.pointerId!==p.pointerId)){C.current=null,yt(Ee);try{p.currentTarget.releasePointerCapture(p.pointerId)}catch{}}},[]);if(i){const p=()=>{const w=W.current;w&&w.slideTo(1)},j=()=>{const w=W.current;w&&w.slideTo(0)},P=typeof t=="function"?t({slideToDetail:p}):t,D=typeof m=="function"?m({slideToList:j,slideToDetail:p}):m;return r.jsxs(bt,{className:"h-full min-h-0 w-full",slidesPerView:1,resistanceRatio:.45,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:".swiper-no-swiping",allowTouchMove:!1,touchAngle:75,touchStartPreventDefault:!1,onSwiper:w=>{W.current=w,g&&(g.current=w)},onSlideChange:w=>{v?.(w.activeIndex)},children:[r.jsx(qe,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden",children:[x&&r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:x}),r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain",children:P})]})}),r.jsx(qe,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:D??r.jsxs("button",{type:"button",onClick:j,className:"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full bg-surface-2 px-3 text-xs font-semibold text-muted-foreground transition hover:bg-surface-elevated hover:text-foreground active:scale-95",children:[r.jsx(St,{size:14}),b]})}),r.jsx("div",{className:E?"min-h-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain",onScroll:E?void 0:w=>y?.(w.currentTarget),children:o})]})})]})}const G=typeof t=="function"?t({slideToDetail:()=>{}}):t;return f==="stacked"?E?r.jsxs("div",{className:"termdock-native-select min-h-0 flex-1 overflow-hidden px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",children:[c&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:c}),G,r.jsx("div",{className:"mt-3 h-[calc(100%-3rem)] min-h-0 overflow-hidden rounded-xl border border-border/15 bg-surface",children:o})]}):r.jsxs("div",{className:"termdock-native-select termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",onScroll:p=>y?.(p.currentTarget),children:[c&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:c}),G,r.jsx("div",{className:"mt-3 overflow-hidden rounded-xl border border-border/15 bg-surface",children:o})]}):r.jsxs("div",{ref:$,className:"flex h-full min-h-0 overflow-hidden",children:[L,r.jsxs("div",{className:T??"shrink-0 overflow-y-auto overscroll-contain border-r border-border/15 bg-surface",style:{width:O},children:[c&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:c}),G]}),r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":B("diffViewer.resizeNavigation"),title:B("diffViewer.resizeNavigation"),className:"group relative z-10 w-2 shrink-0 cursor-col-resize touch-none border-r border-border/15 bg-surface",onPointerDown:ne,onPointerMove:ie,onPointerUp:se,onPointerCancel:se,onDoubleClick:()=>{V(Le),wt(Ee,Le)},children:r.jsx("span",{className:"pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border/30 transition group-hover:bg-primary/60"})}),r.jsx("div",{className:E?"min-w-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-w-0 flex-1 overflow-y-auto overscroll-contain",onScroll:E?void 0:p=>y?.(p.currentTarget),children:o})]})}function Ot({mode:t,onModeChange:o,showAi:i=!1}){return r.jsxs("div",{className:"inline-flex h-7 shrink-0 overflow-hidden rounded-full bg-surface-2 p-0.5",children:[r.jsx("button",{type:"button",onClick:()=>o("list"),"aria-pressed":t==="list",className:`inline-flex h-6 w-7 items-center justify-center rounded-full transition active:scale-95 ${t==="list"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Ft,{size:13})}),r.jsx("button",{type:"button",onClick:()=>o("tree"),"aria-pressed":t==="tree",className:`inline-flex h-6 w-7 items-center justify-center rounded-full transition active:scale-95 ${t==="tree"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Et,{size:13})}),i&&r.jsx("button",{type:"button",onClick:()=>o("ai"),"aria-pressed":t==="ai",className:`inline-flex h-6 w-7 items-center justify-center rounded-full transition active:scale-95 ${t==="ai"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(nt,{size:13})})]})}function Vt({groups:t,mode:o,onModeChange:i,selectedKey:x,collapsedDirectoryKeys:m,onToggleDirectory:c,onSelectFile:b,renderLeading:v,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:y,detail:L,mobile:T,backLabel:E,compact:B=!1,emptyContent:W,listPrefix:$,aiContent:C,listContainerClassName:O="px-2 py-2",detailContainerClassName:V="termdock-native-select termdock-diff-stream-scroller min-h-0",renderListHeader:ne,renderMobileDetailHeader:ie,externalSwiperRef:se,onMobileSlideChange:G,slideToDetailOnMobile:p=!0,desktopLayout:j="split",onDetailScroll:P,desktopSidePanel:D,desktopListClassName:w,detailOwnsScroll:z}){const[X,oe]=a.useState(!1);a.useEffect(()=>{if(!X)return;const F=_=>{_.key==="Escape"&&oe(!1)};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[X]);const le=r.jsx(Ot,{mode:o,onModeChange:i,showAi:!!C}),be=o==="tree"?"tree":"list",ue=ne?ne(le):r.jsx("div",{className:"flex justify-end",children:le}),de=t.some(F=>F.files.length>0),U=r.jsx($t,{mobile:X?!1:T,backLabel:E,externalSwiperRef:se,onMobileSlideChange:G,desktopLayout:X?"split":j,onDetailScroll:P,desktopSidePanel:D,desktopListClassName:w,detailOwnsScroll:z,mobileListHeader:T?ue:void 0,desktopListHeader:T?void 0:ue,mobileDetailHeader:ie,list:({slideToDetail:F})=>r.jsx("div",{className:O,children:o==="ai"?typeof C=="function"?C({slideToDetail:F,fullscreen:X,toggleFullscreen:()=>oe(_=>!_)}):C??W:r.jsxs(r.Fragment,{children:[$,de?r.jsx(zt,{groups:t,selectedKey:x,mode:be,mobile:T,compact:B,collapsedDirectoryKeys:m,onToggleDirectory:c,onSelectFile:_=>{b(_),T&&p&&window.requestAnimationFrame(F)},renderLeading:v,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:y}):W]})}),detail:r.jsx("div",{className:z?"h-full min-h-0":V,children:L})});return!X||typeof document>"u"?U:rt.createPortal(r.jsxs("div",{className:"fixed inset-0 z-modal-panel flex min-h-0 flex-col bg-surface text-foreground",children:[r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border/15 bg-[var(--chrome-bg)] px-3",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsx(nt,{size:15,className:"shrink-0 text-primary"}),r.jsx("span",{className:"truncate text-[12px] font-semibold",children:"DAG Review"}),r.jsx("span",{className:"hidden text-[10px] text-muted-foreground sm:inline",children:"Select a step to inspect its exact change"})]}),r.jsx("button",{type:"button",onClick:()=>oe(!1),className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:"Exit full-screen DAG review (Esc)","aria-label":"Exit full-screen DAG review",children:r.jsx(Rt,{size:16})})]}),r.jsx("div",{className:"min-h-0 flex-1",children:U})]}),document.body)}const Gt=96,Pe=44;function Xt({file:t,repoRoot:o,selectionPath:i,displayName:x,displayDir:m,selected:c,activePane:b,visible:v,reusableContent:g=!1,estimatedHeight:f,lightweight:y=!1,wrap:L,showScrollHint:T,viewType:E,inlineMode:B,diffOptions:W,reloadKey:$=0,auditRecords:C,diffOverride:O,preparedDiff:V,renderBadge:ne,onInsertDiffReference:ie,onHunkGitAction:se,onReferenceCopied:G,insertedReferenceKey:p,copiedReferenceKey:j,onClearAuditRecord:P,onContentReady:D,onHeightChange:w}){const z=a.useRef(null),X=a.useRef(null),oe=a.useRef(null),[le,be]=a.useState(null),ue=a.useRef(64),de=a.useRef(f??104),U=a.useRef(null),F=a.useRef(null),_=a.useRef(!1),ae=a.useRef(!1),A=a.useRef(null),[K,fe]=a.useState(!1),[we,Me]=a.useState(!1),ke=t.absolutePath||(o?`${o}/${t.path}`:t.path),J=a.useCallback(()=>{ae.current||(ae.current=!0,Me(!0),D?.(i))},[D,i]);a.useLayoutEffect(()=>(_.current=!1,ae.current=!1,U.current=null,F.current=null,A.current!==null&&(window.clearTimeout(A.current),A.current=null),fe(!1),Me(!1),()=>{A.current!==null&&(window.clearTimeout(A.current),A.current=null)}),[O,V,$,g,v]),a.useLayoutEffect(()=>{const k=U.current;!K||k===null||Math.abs((f??104)-k)>=1||(U.current=null,J())},[J,f,K]),a.useLayoutEffect(()=>{if(!v||!K)return;const k=oe.current;if(!k)return;const q=()=>{if(!_.current||ae.current)return;const ce=Math.ceil(Math.max(k.getBoundingClientRect().height,k.scrollHeight)),Te=ue.current;ce>0&&Te!==ce&&(ue.current=ce,be(ce));const Z=z.current;if(!Z)return;const he=X.current?.getBoundingClientRect().height??Pe,ee=Math.ceil(Math.max(Z.scrollHeight,he+ce+1));ee<=0||F.current===ee||(F.current=ee,A.current!==null&&window.clearTimeout(A.current),A.current=window.setTimeout(()=>{if(A.current=null,!_.current||ae.current)return;const I=F.current;if(I===null)return;const S=de.current;if(U.current=I,Math.abs(S-I)<1||!w){de.current=I,U.current=null,J();return}de.current=I,w(i,S,I)},Gt))};if(q(),typeof ResizeObserver>"u")return;const Ne=new ResizeObserver(q);return Ne.observe(k),()=>Ne.disconnect()},[J,w,i,K,v]);const Re=v&&!we;return r.jsxs("div",{ref:z,"data-diff-stream-item":i,"data-diff-selection-path":i,"data-diff-file-path":t.path,"data-diff-absolute-path":ke,className:`scroll-mt-3 border-b border-border/15 last:border-b-0 ${Re||!v?"overflow-hidden":""} ${c?"bg-surface-elevated/35":""}`,style:v?Re?{height:f??104}:void 0:{height:f??104},children:[r.jsxs("div",{ref:X,"data-diff-stream-header":!0,className:`sticky top-0 z-10 flex min-w-0 items-center gap-2 border-b border-border/15 px-3 py-2 backdrop-blur ${c?"bg-surface-elevated/95":"bg-surface/95"}`,children:[ne(t.status),r.jsxs("div",{className:"min-w-0 flex-1",title:ke,children:[r.jsx("div",{className:"truncate text-xs font-semibold text-foreground",children:x}),m&&r.jsx("div",{className:"truncate text-[10px] text-muted-foreground",children:m})]})]}),r.jsxs("div",{ref:oe,className:"relative","data-diff-stream-body":!0,style:v?{minHeight:we?64:Math.max(le??64,(f??104)-Pe)}:{height:Math.max(le??64,(f??104)-Pe)},children:[v?r.jsx(jt,{active:b,repoRoot:o,filePath:t.path,referenceFilePath:ke,changedFile:t,wrap:L,showScrollHint:T,viewType:E,inlineMode:B,diffOptions:W,reloadKey:$,embedded:!0,lightweight:y,auditRecords:C,diffOverride:O,preparedDiff:V,onClearAuditRecord:P,onContentReady:()=>{if(g){_.current=!0,fe(!0),J();return}_.current||(_.current=!0,fe(!0))},onInsertDiffReference:ie,onHunkGitAction:se,onReferenceCopied:G,insertedReferenceKey:p,copiedReferenceKey:j}):r.jsx("div",{className:"flex h-full min-h-16 items-center justify-center bg-surface px-3 py-4 text-center text-xs text-muted-foreground",children:t.path}),v&&K&&!we&&r.jsx("div",{"data-diff-measuring-overlay":!0,className:"absolute inset-0 z-20 bg-surface"})]})]})}const Qe=8,Kt=3,Je=2,ze=1600,Ze=104,qt=1e3,ye=new Map;function Ut(t,o){for(ye.delete(t),ye.set(t,o);ye.size>qt;){const i=ye.keys().next().value;if(i===void 0)break;ye.delete(i)}}function Yt(t,o){return!!(t&&t.diffOverride===o.diffOverride&&t.reloadKey===o.reloadKey&&t.wrap===o.wrap&&t.showScrollHint===o.showScrollHint&&t.viewType===o.viewType&&t.inlineMode===o.inlineMode&&t.algorithm===o.algorithm&&t.whitespace===o.whitespace&&t.context===o.context)}const Qt={added:{label:"A",className:"text-[color:var(--diff-insert-strong)]",title:"Added"},modified:{label:"M",className:"text-[color:var(--diff-hunk-accent)]",title:"Modified"},deleted:{label:"D",className:"text-[color:var(--diff-delete-strong)]",title:"Deleted"},renamed:{label:"R",className:"text-muted-foreground",title:"Renamed"},copied:{label:"C",className:"text-[color:var(--diff-insert-strong)]",title:"Copied"},untracked:{label:"U",className:"text-[color:var(--diff-insert-strong)]",title:"Untracked (new file)"},conflicted:{label:"!",className:"text-destructive",title:"Conflicted"},unknown:{label:"?",className:"text-muted-foreground",title:"Unknown"}};function nr({status:t}){const o=Qt[t]??{label:"?",className:"text-muted-foreground",title:t};return r.jsx("span",{className:`w-4 shrink-0 text-center text-[10px] font-mono font-bold ${o.className}`,title:o.title,children:o.label})}function sr(t,o){return o?{key:o,nonce:t.nonce+1}:t}function or({files:t,groups:o,selectedKey:i,onSelectFile:x,mode:m,onModeChange:c,collapsedDirectoryKeys:b,onToggleDirectory:v,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:y,renderSubtitle:L,renderStreamBadge:T,onInsertDiffReference:E,onHunkGitAction:B,onReferenceCopied:W,insertedReferenceKey:$,copiedReferenceKey:C,onClearAuditRecord:O,mobile:V,backLabel:ne,compact:ie,desktopLayout:se,wrap:G,showScrollHint:p,diffViewType:j,inlineMode:P,diffOptions:D,activePane:w,reloadKey:z=0,renderListHeader:X,renderMobileDetailHeader:oe,emptyContent:le,listPrefix:be,aiContent:ue,listContainerClassName:de,detailContainerClassName:U,desktopSidePanel:F,desktopListClassName:_,onDetailScroll:ae,initialDetailScrollTop:A,scrollToKey:K,scrollToKeyNonce:fe=0,externalSwiperRef:we,onMobileSlideChange:Me,slideToDetailOnMobile:ke}){const J=Nt(e=>e.rootPath),Re=a.useMemo(()=>e=>i===e.key||i===e.path||i===e.absolutePath,[i]),k=a.useMemo(()=>{const e=new Map;for(const s of t)e.set(s.key,s),s.path&&e.set(s.path,s),s.absolutePath&&e.set(s.absolutePath,s);const n=[],l=new Set;for(const s of o){const d=m==="tree"?Pt(s.files):s.files;for(const h of d){const u=e.get(h.key);!u||l.has(u.key)||(n.push(u),l.add(u.key))}}for(const s of t)l.has(s.key)||n.push(s);return n},[t,o,m]),q=a.useRef(null),Ne=a.useRef(null),ce=a.useRef(null),Te=a.useRef(z),Z=a.useRef(0),he=a.useRef(null),ee=a.useRef(new Map(ye)),I=a.useRef({key:null,top:0}),S=a.useRef(new Set),je=a.useRef(new Map),Ce=a.useRef(new Map),H=a.useRef(null),We=a.useRef(()=>{}),De=a.useRef([]),pe=a.useRef(new Map),$e=a.useRef({tops:[],heights:[],bottom:0}),[Oe,it]=a.useState(()=>new Set),[lt,ut]=a.useState(0),[te,xe]=a.useState({top:0,height:0}),Se=a.useMemo(()=>k.map(e=>e.key),[k]),Ie=Se.join("");Ce.current=new Map(k.map(e=>[e.key,{diffOverride:e.diffOverride,reloadKey:z,wrap:G,showScrollHint:p,viewType:j,inlineMode:P,algorithm:D?.algorithm,whitespace:D?.whitespace,context:D?.context}])),De.current=Se,pe.current=new Map(Se.map((e,n)=>[e,n]));const R=a.useMemo(()=>{const e=Se.map(s=>ee.current.get(s)??Ze),n=new Array(e.length);for(let s=0;s<e.length;s+=1)n[s]=s===0?0:n[s-1]+e[s-1];const l=e.length>0?n[e.length-1]+e[e.length-1]:0;return{tops:n,heights:e,bottom:l}},[lt,Ie]);$e.current=R;const me=a.useMemo(()=>K?k.find(e=>K===e.key||K===e.path||K===e.absolutePath)?.key??null:null,[k,K]),Fe=a.useMemo(()=>i?k.find(e=>i===e.key||i===e.path||i===e.absolutePath)?.key??null:null,[k,i]),Y=a.useMemo(()=>{const e=R.tops.length;if(e===0)return-1;let n=0,l=e;for(;n<l;){const s=Math.floor((n+l)/2);R.tops[s]<=te.top+1?n=s+1:l=s}return Math.min(e-1,Math.max(0,n-1))},[R.tops,te.top]);a.useEffect(()=>{if(!w||Y<0)return;const e=[Y];for(let s=1;s<=Kt;s+=1)e.push(Y+s),e.push(Y-s);const n=e.filter((s,d)=>s>=0&&s<k.length&&e.indexOf(s)===d).map(s=>k[s]).filter(s=>s.diffOverride===void 0&&!!(s.repoRoot??J));let l=!1;return(async()=>{for(let s=0;s<n.length&&!l;s+=Je){const d=n.slice(s,s+Je);await Promise.all(d.map(h=>{const u=h.repoRoot??J,N=et(h.path,u);return Dt(N,u??void 0,P??"words",D).catch(()=>{})}))}})(),()=>{l=!0}},[w,k,D,P,J,Y]);const re=a.useCallback(e=>{S.current=e,it(e)},[]),Ve=a.useMemo(()=>{const e=te.top-ze,n=te.top+te.height+ze,l=new Set;let s=0,d=R.tops.length;for(;s<d;){const u=Math.floor((s+d)/2);R.tops[u]<=e?s=u+1:d=u}const h=Math.max(0,s-1);for(let u=h;u<R.tops.length;u+=1){const N=R.tops[u];if(N>n)break;N+R.heights[u]>=e&&N<=n&&l.add(u)}for(let u=Y-1;u<=Y+1;u+=1)u>=0&&u<R.tops.length&&l.add(u);return Array.from(l).sort((u,N)=>u-N)},[R,te,Y]),_e=a.useCallback(()=>{if(H.current)return;const e=De.current;if(e.length===0)return;const n=I.current.key,l=Math.min(e.length-1,(n!==null?pe.current.get(n):void 0)??Math.max(0,Y)),s=u=>Math.abs((pe.current.get(u)??0)-l),d=[];S.current.has(e[l])||d.push(e[l]);for(let u=1;u<=Qe;u+=1){const N=l+u,M=l-u;N<e.length&&!S.current.has(e[N])&&d.push(e[N]),M>=0&&!S.current.has(e[M])&&d.push(e[M])}const h=d[0];if(h){if(S.current.size>=Qe){const u=s(h),N=Array.from(S.current).filter(Q=>Q!==H.current).sort((Q,ve)=>s(ve)-s(Q))[0];if(!N||s(N)<=u)return;const M=new Set(S.current);M.delete(N),re(M)}H.current=h,re(new Set(S.current).add(h))}},[re,Y]);We.current=_e;const ge=a.useCallback(e=>{if(S.current.has(e))return;const n=H.current;if(n&&n!==e){const l=new Set(S.current);l.delete(n),re(l),H.current=null}H.current=e,re(new Set(S.current).add(e))},[re]),Ge=a.useCallback(e=>{if(!S.current.has(e))return;const n=Ce.current.get(e);n&&je.current.set(e,n),H.current===e&&(H.current=null),window.requestAnimationFrame(()=>We.current())},[]),Xe=a.useCallback((e,n,l)=>{if(Math.abs(l-n)<1)return;const s=ee.current.get(e);s!==void 0&&Math.abs(s-l)<1||(ee.current.set(e,l),Ut(e,l),ut(d=>d+1))},[]);a.useLayoutEffect(()=>{if(Te.current!==z){Te.current=z;for(const e of k){if(e.diffOverride!==void 0)continue;const n=et(e.path,e.repoRoot);Mt(n,e.repoRoot??void 0,D)}}},[k,D,z]),a.useLayoutEffect(()=>{const e=q.current;if(!e)return;const n=()=>{const s=Math.max(0,Math.ceil(e.clientHeight));if(s===0)return;const d=e.scrollTop;xe(h=>h.height===s&&h.top===d?h:{top:d,height:s})};if(n(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(n);return l.observe(e),()=>l.disconnect()},[V]),a.useEffect(()=>{Fe&&ge(Fe)},[ge,Fe]),a.useEffect(()=>{const e=new Set(De.current);for(const n of Array.from(ee.current.keys()))e.has(n)||ee.current.delete(n);for(const n of Array.from(S.current))if(!e.has(n)){const l=new Set(S.current);l.delete(n),re(l)}for(const n of Array.from(je.current.keys()))e.has(n)||je.current.delete(n);if(H.current&&!e.has(H.current)&&(H.current=null),k.length===0){H.current=null,je.current.clear(),re(new Set);return}_e()},[k.length,Ie,_e,Ve,re]);const Ke=a.useCallback(e=>{q.current=e;const n=Z.current,l=e.scrollTop;Z.current=l;const s=d=>{const h=$e.current,u=De.current;let N=0,M=h.tops.length;for(;N<M;){const Ae=Math.floor((N+M)/2);h.tops[Ae]<=d+1?N=Ae+1:M=Ae}const Q=Math.min(u.length-1,Math.max(0,N-1)),ve=u[Q]??null;I.current={key:ve,top:h.tops[Q]??0},ve&&ge(ve)};Math.abs(l-n)>=ze?(rt.flushSync(()=>{xe({top:l,height:e.clientHeight})}),s(l)):he.current===null&&(he.current=window.requestAnimationFrame(()=>{he.current=null;const d=q.current;if(d){const h=d.scrollTop;xe({top:h,height:d.clientHeight}),s(h)}})),ae?.(e)},[ae,ge]);a.useEffect(()=>()=>{he.current!==null&&window.cancelAnimationFrame(he.current)},[]),a.useLayoutEffect(()=>{const e=q.current;if(!e)return;const n=I.current;if(n.key===null)return;const l=pe.current.get(n.key);if(l===void 0)return;const s=(R.tops[l]??n.top)-n.top;if(Math.abs(s)<1)return;const d=e.scrollTop+s;Z.current=d,xe(h=>({top:d,height:h.height})),typeof e.scrollTo=="function"?e.scrollTo({top:d,behavior:"instant"}):e.scrollTop=d},[R]),a.useLayoutEffect(()=>{const e=De.current,n=R.tops;if(e.length===0){I.current={key:null,top:0};return}const l=Z.current,s=l+(q.current?.clientHeight??te.height),d=I.current;if(d.key!==null){const M=pe.current.get(d.key);if(M!==void 0){const Q=n[M]??0;if(Q+(R.heights[M]??Ze)>l&&Q<s){I.current={key:d.key,top:Q};return}}}let h=0,u=n.length;for(;h<u;){const M=Math.floor((h+u)/2);n[M]<=l+1?h=M+1:u=M}const N=Math.min(n.length-1,Math.max(0,h-1));I.current={key:e[N]??null,top:n[N]??0}}),a.useLayoutEffect(()=>{if(!me||Ne.current===fe)return;const e=pe.current.get(me);if(e===void 0)return;ge(me),I.current={key:me,top:R.tops[e]??0};const n=q.current;if(!n)return;Ne.current=fe;const l=R.tops[e]??0;typeof n.scrollTo=="function"?n.scrollTo({top:l,behavior:"instant"}):n.scrollTop=l;const s=n.scrollTop;Z.current=s,xe({top:s,height:n.clientHeight})},[R,te.height,ge,me,fe]),a.useLayoutEffect(()=>{if(A===void 0||me)return;const e=Ie;if(ce.current===e)return;const n=q.current;if(!n)return;ce.current=e;const l=Math.max(0,R.bottom-n.clientHeight),s=Math.min(Math.max(0,A),l);typeof n.scrollTo=="function"?n.scrollTo({top:s,behavior:"instant"}):n.scrollTop=s;const d=n.scrollTop;Z.current=d,xe({top:d,height:n.clientHeight})},[R.bottom,A,Ie,me]);const dt=a.useCallback((e,n)=>{const l=Re(e),s=Ce.current.get(e.key),d=s!==void 0&&Yt(je.current.get(e.key),s);return r.jsx(Xt,{file:Jt(e),repoRoot:e.repoRoot,selectionPath:e.key,displayName:e.displayName,displayDir:e.displayDir,selected:l,activePane:w,visible:Oe.has(e.key),reusableContent:d,estimatedHeight:n,lightweight:!1,wrap:G,showScrollHint:p,viewType:j,inlineMode:P,diffOptions:D,reloadKey:z,auditRecords:e.auditRecords,diffOverride:e.diffOverride,renderBadge:h=>T(h,e),onInsertDiffReference:e.onInsertDiffReference??E,onHunkGitAction:e.onHunkGitAction??B,onReferenceCopied:W,insertedReferenceKey:$,copiedReferenceKey:C,onClearAuditRecord:O,onContentReady:Ge,onHeightChange:Xe})},[w,C,D,j,Ge,Xe,P,$,Re,Oe,O,B,E,W,z,T,p,G]),ft=r.jsx("div",{"data-diff-stream-content":!0,"data-diff-stream-canvas":!0,className:"termdock-diff-stream relative overflow-clip bg-surface will-change-transform",style:{height:Math.max(te.height,R.bottom)},children:Ve.map(e=>{const n=k[e];return n?r.jsx("div",{"data-diff-canvas-slot":n.key,className:"absolute inset-x-0",style:{top:R.tops[e]},children:dt(n,R.heights[e])},n.key):null})}),ht=r.jsx("div",{ref:q,className:"termdock-diff-stream termdock-diff-stream-scroller h-full max-h-full min-h-0 overflow-y-auto overscroll-contain bg-surface [overflow-anchor:none]",onScroll:e=>Ke(e.currentTarget),children:ft});return r.jsx(Vt,{groups:o,mode:m,onModeChange:c,selectedKey:i,collapsedDirectoryKeys:b,onToggleDirectory:v,onSelectFile:x,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:y,renderSubtitle:L,detail:ht,mobile:V,backLabel:ne,compact:ie,emptyContent:le,listPrefix:be,aiContent:ue,listContainerClassName:de,detailContainerClassName:U,renderListHeader:X,renderMobileDetailHeader:oe,externalSwiperRef:we,onMobileSlideChange:Me,slideToDetailOnMobile:ke,desktopLayout:se,onDetailScroll:Ke,desktopSidePanel:F,desktopListClassName:_,detailOwnsScroll:!0})}function Jt(t){return{path:t.path,absolutePath:t.absolutePath,status:t.status}}function et(t,o){if(t)return o&&t.startsWith(`${o}/`)?t.slice(o.length+1):t}export{St as A,nr as C,or as D,Et as L,Pt as f,sr as n};
|
|
1
|
+
import{a0 as He,as as r,ak as tt,l as mt,e as pt,d as xt,aJ as gt,aP as vt,a3 as yt,B as bt,G as qe,aO as wt,av as kt,X as Rt,aL as Nt}from"./app-CuXPRCrJ.js";import{b as a,r as rt}from"./dnd-BCFAPC0L.js";import{S as nt}from"./sparkles-DltQJKyI.js";import{D as jt,p as Dt,i as Mt}from"./DiffViewer-hy9qKEFv.js";const Tt=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],St=He("arrow-left",Tt);const It=[["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M13 12h8",key:"h98zly"}],["path",{d:"M13 19h8",key:"c3s6r1"}],["path",{d:"M3 10a2 2 0 0 0 2 2h3",key:"1npucw"}],["path",{d:"M3 5v12a2 2 0 0 0 2 2h3",key:"x1gjn2"}]],Et=He("list-tree",It);const Ct=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],Ft=He("list",Ct);function st({selected:t,depth:o=0,title:i,leading:x,children:m,trailing:c,role:b,tabIndex:v,ariaExpanded:g,onClick:f,onKeyDown:y,onPointerDown:L,onPointerUp:T,onPointerCancel:E,dataAttributes:B}){return r.jsxs("div",{role:b,tabIndex:v,"aria-expanded":g,title:i,onClick:f,onKeyDown:y,onPointerDown:L,onPointerUp:T,onPointerCancel:E,...B,className:`group flex w-full cursor-pointer items-center gap-1 rounded px-2 py-1.5 text-left text-[13px] transition active:scale-[0.99] ${t?"bg-surface-elevated text-foreground":"text-muted-foreground hover:bg-surface-2 hover:text-foreground"}`,style:{paddingLeft:`${o*14+8}px`},children:[r.jsx("span",{className:"flex min-w-[14px] shrink-0 items-center justify-center text-muted-foreground/80",children:x}),r.jsx("span",{className:"min-w-0 flex-1",children:m}),c]})}function ot(t){return t.path.replace(/^\/+/,"")}function _t(t){if(t.displayName!==void 0||t.displayDir!==void 0)return{name:t.displayName||t.path,dir:t.displayDir||""};const o=t.path.split("/").filter(Boolean);return{name:o.pop()||t.path,dir:o.join("/")}}function at(t,o){const i=new Map,x=(c,b,v,g)=>{const f=c.get(b);if(f)return f;const y={path:v,name:b,childCount:0,directories:[],files:[]};return c.set(b,y),g?.directories.push(y),y};for(const c of t){const b=o(c).split("/").filter(Boolean);if(b.length<=1)continue;let v=i,g=null,f="";for(const y of b.slice(0,-1)){f=f?`${f}/${y}`:y;const L=x(v,y,f,g);g=L,v=new Map(L.directories.map(T=>[T.name,T]))}g?.files.push(c)}const m=c=>{const b=c.directories.map(m).sort((g,f)=>g.name.localeCompare(f.name)),v=c.files.sort((g,f)=>g.path.localeCompare(f.path));return{...c,directories:b,files:v,childCount:b.reduce((g,f)=>g+f.childCount,0)+v.length}};return Array.from(i.values()).map(m).sort((c,b)=>c.name.localeCompare(b.name))}function Be(t,o,i=0){const x=o.selectedKey===t.key||o.selectedKey===t.path||o.selectedKey===t.absolutePath,m=_t(t);return r.jsx(st,{selected:x,role:"button",tabIndex:0,title:t.title??t.absolutePath??t.path,onClick:()=>{tt()||o.onSelectFile(t)},onKeyDown:c=>{c.key!=="Enter"&&c.key!==" "||(c.preventDefault(),o.onSelectFile(t))},leading:o.renderLeading(t),depth:i,trailing:o.renderTrailing?.(t),dataAttributes:{"data-diff-selection-path":t.key,"data-diff-file-path":t.path,"data-diff-absolute-path":t.absolutePath??"","data-diff-status":t.status},children:r.jsxs("span",{className:"select-text","data-sidebar-selectable":!0,children:[r.jsx("span",{className:`block truncate leading-snug ${x?"font-medium":""}`,children:m.name}),o.mode!=="tree"&&m.dir&&r.jsx("span",{className:"block truncate text-[10px] text-muted-foreground/75",children:m.dir}),o.renderSubtitle?.(t)]})},t.key)}function ct(t,o,i,x,m){let c=t;const b=[t.name];for(;c.files.length===0&&c.directories.length===1;)c=c.directories[0],b.push(c.name);const v=b.join("/"),g=`${o}:${c.path}`,f=i.collapsedDirectoryKeys.has(g);return r.jsxs("div",{className:"space-y-px",children:[r.jsx(st,{role:"button",tabIndex:0,onClick:()=>{tt()||i.onToggleDirectory(g)},onKeyDown:y=>{y.key!=="Enter"&&y.key!==" "||(y.preventDefault(),i.onToggleDirectory(g))},ariaExpanded:!f,depth:x,title:c.path,leading:f?r.jsx(pt,{size:13}):r.jsx(xt,{size:13}),trailing:r.jsxs("span",{className:"flex shrink-0 items-center gap-1",children:[r.jsx("span",{className:"shrink-0 rounded bg-surface-2 px-1.5 py-0.5 text-[10px] text-muted-foreground/60 transition group-hover:text-muted-foreground",children:c.childCount}),i.renderDirectoryTrailing?.(c.path,m)]}),children:r.jsxs("span",{className:"flex min-w-0 items-center gap-1",children:[r.jsx(mt,{size:14,className:"shrink-0 text-[color:var(--folder)]"}),r.jsx("span",{className:"min-w-0 flex-1 truncate leading-snug select-text","data-sidebar-selectable":!0,children:v})]})}),!f&&r.jsxs("div",{className:"space-y-px",children:[c.directories.map(y=>ct(y,o,i,x+1,m)),c.files.length>0&&r.jsx("div",{className:"space-y-px",children:c.files.map(y=>Be(y,i,x+1))})]})]},g)}function At(t,o){const i=o.getFileTreePath??ot,x=t.files.filter(c=>i(c).split("/").filter(Boolean).length<=1),m=at(t.files,i);return r.jsxs("div",{className:"space-y-px",children:[m.map(c=>ct(c,t.key,o,0,t)),x.length>0&&r.jsx("div",{className:"space-y-px",children:x.map(c=>Be(c,o))})]})}function Pt(t,o=ot){const i=[],x=c=>{for(const b of c.directories)x(b);i.push(...c.files)};for(const c of at(t,o))x(c);const m=new Set(i.map(c=>c.key));return i.push(...t.filter(c=>!m.has(c.key))),i}function zt(t){return r.jsx("div",{className:t.mode==="tree"?"space-y-px pt-1":"space-y-2",children:t.groups.map(o=>{const i=!!o.header,x=!!o.collapsed;return r.jsxs("section",{className:i?"overflow-hidden rounded-lg border border-border/15 bg-surface/60":"",children:[o.header,!x&&r.jsx("div",{className:t.mode==="tree"?i?"space-y-px bg-surface/60 p-1":"space-y-px":i?"space-y-px bg-surface/60 p-1.5":"space-y-px",children:t.mode==="tree"?At(o,t):o.files.map(m=>Be(m,t))})]},o.key)})})}const Ee="termdock:diff-review:list-width:v1",Lt=120,Le=320,Ue=220,Ht=560;function Bt(t){return typeof t=="number"&&Number.isFinite(t)}function Ye(t,o){const i=Math.max(Ue,o-360),x=Math.min(Ht,i);return Math.min(x,Math.max(Ue,t))}function Wt(){return kt(Ee,Bt)??Le}function $t({list:t,detail:o,mobile:i,mobileListHeader:x,mobileDetailHeader:m,desktopListHeader:c,backLabel:b,onMobileSlideChange:v,externalSwiperRef:g,desktopLayout:f="split",onDetailScroll:y,desktopSidePanel:L,desktopListClassName:T,detailOwnsScroll:E=!1}){const{t:B}=gt(),W=a.useRef(null),$=a.useRef(null),C=a.useRef(null),[O,V]=a.useState(Wt);a.useEffect(()=>{if(i||f!=="split")return;const p=$.current;p&&V(j=>Ye(j,p.clientWidth))},[f,i]);const ne=a.useCallback(p=>{i||f!=="split"||(p.preventDefault(),C.current={startX:p.clientX,startWidth:O,pointerId:p.pointerId},p.currentTarget.setPointerCapture(p.pointerId))},[f,O,i]),ie=a.useCallback(p=>{const j=C.current;if(!j||j.pointerId!==p.pointerId)return;const P=$.current?.clientWidth??window.innerWidth,D=Ye(j.startWidth+p.clientX-j.startX,P);V(D),vt(Ee,D,Lt)},[]),se=a.useCallback(p=>{const j=C.current;if(!(!j||j.pointerId!==p.pointerId)){C.current=null,yt(Ee);try{p.currentTarget.releasePointerCapture(p.pointerId)}catch{}}},[]);if(i){const p=()=>{const w=W.current;w&&w.slideTo(1)},j=()=>{const w=W.current;w&&w.slideTo(0)},P=typeof t=="function"?t({slideToDetail:p}):t,D=typeof m=="function"?m({slideToList:j,slideToDetail:p}):m;return r.jsxs(bt,{className:"h-full min-h-0 w-full",slidesPerView:1,resistanceRatio:.45,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:".swiper-no-swiping",allowTouchMove:!1,touchAngle:75,touchStartPreventDefault:!1,onSwiper:w=>{W.current=w,g&&(g.current=w)},onSlideChange:w=>{v?.(w.activeIndex)},children:[r.jsx(qe,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden",children:[x&&r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:x}),r.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto overscroll-contain",children:P})]})}),r.jsx(qe,{className:"h-full min-h-0",children:r.jsxs("div",{className:"flex h-full min-h-0 flex-col overflow-hidden bg-surface",children:[r.jsx("div",{className:"shrink-0 border-b border-border/15 px-3 py-2",children:D??r.jsxs("button",{type:"button",onClick:j,className:"inline-flex h-9 shrink-0 items-center gap-1.5 rounded-full bg-surface-2 px-3 text-xs font-semibold text-muted-foreground transition hover:bg-surface-elevated hover:text-foreground active:scale-95",children:[r.jsx(St,{size:14}),b]})}),r.jsx("div",{className:E?"min-h-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain",onScroll:E?void 0:w=>y?.(w.currentTarget),children:o})]})})]})}const G=typeof t=="function"?t({slideToDetail:()=>{}}):t;return f==="stacked"?E?r.jsxs("div",{className:"termdock-native-select min-h-0 flex-1 overflow-hidden px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",children:[c&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:c}),G,r.jsx("div",{className:"mt-3 h-[calc(100%-3rem)] min-h-0 overflow-hidden rounded-xl border border-border/15 bg-surface",children:o})]}):r.jsxs("div",{className:"termdock-native-select termdock-diff-stream-scroller min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-[calc(env(safe-area-inset-bottom)+4.5rem)]",onScroll:p=>y?.(p.currentTarget),children:[c&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:c}),G,r.jsx("div",{className:"mt-3 overflow-hidden rounded-xl border border-border/15 bg-surface",children:o})]}):r.jsxs("div",{ref:$,className:"flex h-full min-h-0 overflow-hidden",children:[L,r.jsxs("div",{className:T??"shrink-0 overflow-y-auto overscroll-contain border-r border-border/15 bg-surface",style:{width:O},children:[c&&r.jsx("div",{className:"sticky top-0 z-10 border-b border-border/15 bg-surface px-2 py-2",children:c}),G]}),r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":B("diffViewer.resizeNavigation"),title:B("diffViewer.resizeNavigation"),className:"group relative z-10 w-2 shrink-0 cursor-col-resize touch-none border-r border-border/15 bg-surface",onPointerDown:ne,onPointerMove:ie,onPointerUp:se,onPointerCancel:se,onDoubleClick:()=>{V(Le),wt(Ee,Le)},children:r.jsx("span",{className:"pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border/30 transition group-hover:bg-primary/60"})}),r.jsx("div",{className:E?"min-w-0 flex-1 overflow-hidden":"termdock-diff-stream-scroller min-w-0 flex-1 overflow-y-auto overscroll-contain",onScroll:E?void 0:p=>y?.(p.currentTarget),children:o})]})}function Ot({mode:t,onModeChange:o,showAi:i=!1}){return r.jsxs("div",{className:"inline-flex h-7 shrink-0 overflow-hidden rounded-full bg-surface-2 p-0.5",children:[r.jsx("button",{type:"button",onClick:()=>o("list"),"aria-pressed":t==="list",className:`inline-flex h-6 w-7 items-center justify-center rounded-full transition active:scale-95 ${t==="list"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Ft,{size:13})}),r.jsx("button",{type:"button",onClick:()=>o("tree"),"aria-pressed":t==="tree",className:`inline-flex h-6 w-7 items-center justify-center rounded-full transition active:scale-95 ${t==="tree"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(Et,{size:13})}),i&&r.jsx("button",{type:"button",onClick:()=>o("ai"),"aria-pressed":t==="ai",className:`inline-flex h-6 w-7 items-center justify-center rounded-full transition active:scale-95 ${t==="ai"?"bg-surface-elevated text-foreground shadow-sm":"text-muted-foreground hover:text-foreground"}`,children:r.jsx(nt,{size:13})})]})}function Vt({groups:t,mode:o,onModeChange:i,selectedKey:x,collapsedDirectoryKeys:m,onToggleDirectory:c,onSelectFile:b,renderLeading:v,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:y,detail:L,mobile:T,backLabel:E,compact:B=!1,emptyContent:W,listPrefix:$,aiContent:C,listContainerClassName:O="px-2 py-2",detailContainerClassName:V="termdock-native-select termdock-diff-stream-scroller min-h-0",renderListHeader:ne,renderMobileDetailHeader:ie,externalSwiperRef:se,onMobileSlideChange:G,slideToDetailOnMobile:p=!0,desktopLayout:j="split",onDetailScroll:P,desktopSidePanel:D,desktopListClassName:w,detailOwnsScroll:z}){const[X,oe]=a.useState(!1);a.useEffect(()=>{if(!X)return;const F=_=>{_.key==="Escape"&&oe(!1)};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[X]);const le=r.jsx(Ot,{mode:o,onModeChange:i,showAi:!!C}),be=o==="tree"?"tree":"list",ue=ne?ne(le):r.jsx("div",{className:"flex justify-end",children:le}),de=t.some(F=>F.files.length>0),U=r.jsx($t,{mobile:X?!1:T,backLabel:E,externalSwiperRef:se,onMobileSlideChange:G,desktopLayout:X?"split":j,onDetailScroll:P,desktopSidePanel:D,desktopListClassName:w,detailOwnsScroll:z,mobileListHeader:T?ue:void 0,desktopListHeader:T?void 0:ue,mobileDetailHeader:ie,list:({slideToDetail:F})=>r.jsx("div",{className:O,children:o==="ai"?typeof C=="function"?C({slideToDetail:F,fullscreen:X,toggleFullscreen:()=>oe(_=>!_)}):C??W:r.jsxs(r.Fragment,{children:[$,de?r.jsx(zt,{groups:t,selectedKey:x,mode:be,mobile:T,compact:B,collapsedDirectoryKeys:m,onToggleDirectory:c,onSelectFile:_=>{b(_),T&&p&&window.requestAnimationFrame(F)},renderLeading:v,renderTrailing:g,renderDirectoryTrailing:f,renderSubtitle:y}):W]})}),detail:r.jsx("div",{className:z?"h-full min-h-0":V,children:L})});return!X||typeof document>"u"?U:rt.createPortal(r.jsxs("div",{className:"fixed inset-0 z-modal-panel flex min-h-0 flex-col bg-surface text-foreground",children:[r.jsxs("div",{className:"flex h-12 shrink-0 items-center justify-between border-b border-border/15 bg-[var(--chrome-bg)] px-3",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsx(nt,{size:15,className:"shrink-0 text-primary"}),r.jsx("span",{className:"truncate text-[12px] font-semibold",children:"DAG Review"}),r.jsx("span",{className:"hidden text-[10px] text-muted-foreground sm:inline",children:"Select a step to inspect its exact change"})]}),r.jsx("button",{type:"button",onClick:()=>oe(!1),className:"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition hover:bg-surface-2 hover:text-foreground active:scale-95",title:"Exit full-screen DAG review (Esc)","aria-label":"Exit full-screen DAG review",children:r.jsx(Rt,{size:16})})]}),r.jsx("div",{className:"min-h-0 flex-1",children:U})]}),document.body)}const Gt=96,Pe=44;function Xt({file:t,repoRoot:o,selectionPath:i,displayName:x,displayDir:m,selected:c,activePane:b,visible:v,reusableContent:g=!1,estimatedHeight:f,lightweight:y=!1,wrap:L,showScrollHint:T,viewType:E,inlineMode:B,diffOptions:W,reloadKey:$=0,auditRecords:C,diffOverride:O,preparedDiff:V,renderBadge:ne,onInsertDiffReference:ie,onHunkGitAction:se,onReferenceCopied:G,insertedReferenceKey:p,copiedReferenceKey:j,onClearAuditRecord:P,onContentReady:D,onHeightChange:w}){const z=a.useRef(null),X=a.useRef(null),oe=a.useRef(null),[le,be]=a.useState(null),ue=a.useRef(64),de=a.useRef(f??104),U=a.useRef(null),F=a.useRef(null),_=a.useRef(!1),ae=a.useRef(!1),A=a.useRef(null),[K,fe]=a.useState(!1),[we,Me]=a.useState(!1),ke=t.absolutePath||(o?`${o}/${t.path}`:t.path),J=a.useCallback(()=>{ae.current||(ae.current=!0,Me(!0),D?.(i))},[D,i]);a.useLayoutEffect(()=>(_.current=!1,ae.current=!1,U.current=null,F.current=null,A.current!==null&&(window.clearTimeout(A.current),A.current=null),fe(!1),Me(!1),()=>{A.current!==null&&(window.clearTimeout(A.current),A.current=null)}),[O,V,$,g,v]),a.useLayoutEffect(()=>{const k=U.current;!K||k===null||Math.abs((f??104)-k)>=1||(U.current=null,J())},[J,f,K]),a.useLayoutEffect(()=>{if(!v||!K)return;const k=oe.current;if(!k)return;const q=()=>{if(!_.current||ae.current)return;const ce=Math.ceil(Math.max(k.getBoundingClientRect().height,k.scrollHeight)),Te=ue.current;ce>0&&Te!==ce&&(ue.current=ce,be(ce));const Z=z.current;if(!Z)return;const he=X.current?.getBoundingClientRect().height??Pe,ee=Math.ceil(Math.max(Z.scrollHeight,he+ce+1));ee<=0||F.current===ee||(F.current=ee,A.current!==null&&window.clearTimeout(A.current),A.current=window.setTimeout(()=>{if(A.current=null,!_.current||ae.current)return;const I=F.current;if(I===null)return;const S=de.current;if(U.current=I,Math.abs(S-I)<1||!w){de.current=I,U.current=null,J();return}de.current=I,w(i,S,I)},Gt))};if(q(),typeof ResizeObserver>"u")return;const Ne=new ResizeObserver(q);return Ne.observe(k),()=>Ne.disconnect()},[J,w,i,K,v]);const Re=v&&!we;return r.jsxs("div",{ref:z,"data-diff-stream-item":i,"data-diff-selection-path":i,"data-diff-file-path":t.path,"data-diff-absolute-path":ke,className:`scroll-mt-3 border-b border-border/15 last:border-b-0 ${Re||!v?"overflow-hidden":""} ${c?"bg-surface-elevated/35":""}`,style:v?Re?{height:f??104}:void 0:{height:f??104},children:[r.jsxs("div",{ref:X,"data-diff-stream-header":!0,className:`sticky top-0 z-10 flex min-w-0 items-center gap-2 border-b border-border/15 px-3 py-2 backdrop-blur ${c?"bg-surface-elevated/95":"bg-surface/95"}`,children:[ne(t.status),r.jsxs("div",{className:"min-w-0 flex-1",title:ke,children:[r.jsx("div",{className:"truncate text-xs font-semibold text-foreground",children:x}),m&&r.jsx("div",{className:"truncate text-[10px] text-muted-foreground",children:m})]})]}),r.jsxs("div",{ref:oe,className:"relative","data-diff-stream-body":!0,style:v?{minHeight:we?64:Math.max(le??64,(f??104)-Pe)}:{height:Math.max(le??64,(f??104)-Pe)},children:[v?r.jsx(jt,{active:b,repoRoot:o,filePath:t.path,referenceFilePath:ke,changedFile:t,wrap:L,showScrollHint:T,viewType:E,inlineMode:B,diffOptions:W,reloadKey:$,embedded:!0,lightweight:y,auditRecords:C,diffOverride:O,preparedDiff:V,onClearAuditRecord:P,onContentReady:()=>{if(g){_.current=!0,fe(!0),J();return}_.current||(_.current=!0,fe(!0))},onInsertDiffReference:ie,onHunkGitAction:se,onReferenceCopied:G,insertedReferenceKey:p,copiedReferenceKey:j}):r.jsx("div",{className:"flex h-full min-h-16 items-center justify-center bg-surface px-3 py-4 text-center text-xs text-muted-foreground",children:t.path}),v&&K&&!we&&r.jsx("div",{"data-diff-measuring-overlay":!0,className:"absolute inset-0 z-20 bg-surface"})]})]})}const Qe=8,Kt=3,Je=2,ze=1600,Ze=104,qt=1e3,ye=new Map;function Ut(t,o){for(ye.delete(t),ye.set(t,o);ye.size>qt;){const i=ye.keys().next().value;if(i===void 0)break;ye.delete(i)}}function Yt(t,o){return!!(t&&t.diffOverride===o.diffOverride&&t.reloadKey===o.reloadKey&&t.wrap===o.wrap&&t.showScrollHint===o.showScrollHint&&t.viewType===o.viewType&&t.inlineMode===o.inlineMode&&t.algorithm===o.algorithm&&t.whitespace===o.whitespace&&t.context===o.context)}const Qt={added:{label:"A",className:"text-[color:var(--diff-insert-strong)]",title:"Added"},modified:{label:"M",className:"text-[color:var(--diff-hunk-accent)]",title:"Modified"},deleted:{label:"D",className:"text-[color:var(--diff-delete-strong)]",title:"Deleted"},renamed:{label:"R",className:"text-muted-foreground",title:"Renamed"},copied:{label:"C",className:"text-[color:var(--diff-insert-strong)]",title:"Copied"},untracked:{label:"U",className:"text-[color:var(--diff-insert-strong)]",title:"Untracked (new file)"},conflicted:{label:"!",className:"text-destructive",title:"Conflicted"},unknown:{label:"?",className:"text-muted-foreground",title:"Unknown"}};function nr({status:t}){const o=Qt[t]??{label:"?",className:"text-muted-foreground",title:t};return r.jsx("span",{className:`w-4 shrink-0 text-center text-[10px] font-mono font-bold ${o.className}`,title:o.title,children:o.label})}function sr(t,o){return o?{key:o,nonce:t.nonce+1}:t}function or({files:t,groups:o,selectedKey:i,onSelectFile:x,mode:m,onModeChange:c,collapsedDirectoryKeys:b,onToggleDirectory:v,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:y,renderSubtitle:L,renderStreamBadge:T,onInsertDiffReference:E,onHunkGitAction:B,onReferenceCopied:W,insertedReferenceKey:$,copiedReferenceKey:C,onClearAuditRecord:O,mobile:V,backLabel:ne,compact:ie,desktopLayout:se,wrap:G,showScrollHint:p,diffViewType:j,inlineMode:P,diffOptions:D,activePane:w,reloadKey:z=0,renderListHeader:X,renderMobileDetailHeader:oe,emptyContent:le,listPrefix:be,aiContent:ue,listContainerClassName:de,detailContainerClassName:U,desktopSidePanel:F,desktopListClassName:_,onDetailScroll:ae,initialDetailScrollTop:A,scrollToKey:K,scrollToKeyNonce:fe=0,externalSwiperRef:we,onMobileSlideChange:Me,slideToDetailOnMobile:ke}){const J=Nt(e=>e.rootPath),Re=a.useMemo(()=>e=>i===e.key||i===e.path||i===e.absolutePath,[i]),k=a.useMemo(()=>{const e=new Map;for(const s of t)e.set(s.key,s),s.path&&e.set(s.path,s),s.absolutePath&&e.set(s.absolutePath,s);const n=[],l=new Set;for(const s of o){const d=m==="tree"?Pt(s.files):s.files;for(const h of d){const u=e.get(h.key);!u||l.has(u.key)||(n.push(u),l.add(u.key))}}for(const s of t)l.has(s.key)||n.push(s);return n},[t,o,m]),q=a.useRef(null),Ne=a.useRef(null),ce=a.useRef(null),Te=a.useRef(z),Z=a.useRef(0),he=a.useRef(null),ee=a.useRef(new Map(ye)),I=a.useRef({key:null,top:0}),S=a.useRef(new Set),je=a.useRef(new Map),Ce=a.useRef(new Map),H=a.useRef(null),We=a.useRef(()=>{}),De=a.useRef([]),pe=a.useRef(new Map),$e=a.useRef({tops:[],heights:[],bottom:0}),[Oe,it]=a.useState(()=>new Set),[lt,ut]=a.useState(0),[te,xe]=a.useState({top:0,height:0}),Se=a.useMemo(()=>k.map(e=>e.key),[k]),Ie=Se.join("");Ce.current=new Map(k.map(e=>[e.key,{diffOverride:e.diffOverride,reloadKey:z,wrap:G,showScrollHint:p,viewType:j,inlineMode:P,algorithm:D?.algorithm,whitespace:D?.whitespace,context:D?.context}])),De.current=Se,pe.current=new Map(Se.map((e,n)=>[e,n]));const R=a.useMemo(()=>{const e=Se.map(s=>ee.current.get(s)??Ze),n=new Array(e.length);for(let s=0;s<e.length;s+=1)n[s]=s===0?0:n[s-1]+e[s-1];const l=e.length>0?n[e.length-1]+e[e.length-1]:0;return{tops:n,heights:e,bottom:l}},[lt,Ie]);$e.current=R;const me=a.useMemo(()=>K?k.find(e=>K===e.key||K===e.path||K===e.absolutePath)?.key??null:null,[k,K]),Fe=a.useMemo(()=>i?k.find(e=>i===e.key||i===e.path||i===e.absolutePath)?.key??null:null,[k,i]),Y=a.useMemo(()=>{const e=R.tops.length;if(e===0)return-1;let n=0,l=e;for(;n<l;){const s=Math.floor((n+l)/2);R.tops[s]<=te.top+1?n=s+1:l=s}return Math.min(e-1,Math.max(0,n-1))},[R.tops,te.top]);a.useEffect(()=>{if(!w||Y<0)return;const e=[Y];for(let s=1;s<=Kt;s+=1)e.push(Y+s),e.push(Y-s);const n=e.filter((s,d)=>s>=0&&s<k.length&&e.indexOf(s)===d).map(s=>k[s]).filter(s=>s.diffOverride===void 0&&!!(s.repoRoot??J));let l=!1;return(async()=>{for(let s=0;s<n.length&&!l;s+=Je){const d=n.slice(s,s+Je);await Promise.all(d.map(h=>{const u=h.repoRoot??J,N=et(h.path,u);return Dt(N,u??void 0,P??"words",D).catch(()=>{})}))}})(),()=>{l=!0}},[w,k,D,P,J,Y]);const re=a.useCallback(e=>{S.current=e,it(e)},[]),Ve=a.useMemo(()=>{const e=te.top-ze,n=te.top+te.height+ze,l=new Set;let s=0,d=R.tops.length;for(;s<d;){const u=Math.floor((s+d)/2);R.tops[u]<=e?s=u+1:d=u}const h=Math.max(0,s-1);for(let u=h;u<R.tops.length;u+=1){const N=R.tops[u];if(N>n)break;N+R.heights[u]>=e&&N<=n&&l.add(u)}for(let u=Y-1;u<=Y+1;u+=1)u>=0&&u<R.tops.length&&l.add(u);return Array.from(l).sort((u,N)=>u-N)},[R,te,Y]),_e=a.useCallback(()=>{if(H.current)return;const e=De.current;if(e.length===0)return;const n=I.current.key,l=Math.min(e.length-1,(n!==null?pe.current.get(n):void 0)??Math.max(0,Y)),s=u=>Math.abs((pe.current.get(u)??0)-l),d=[];S.current.has(e[l])||d.push(e[l]);for(let u=1;u<=Qe;u+=1){const N=l+u,M=l-u;N<e.length&&!S.current.has(e[N])&&d.push(e[N]),M>=0&&!S.current.has(e[M])&&d.push(e[M])}const h=d[0];if(h){if(S.current.size>=Qe){const u=s(h),N=Array.from(S.current).filter(Q=>Q!==H.current).sort((Q,ve)=>s(ve)-s(Q))[0];if(!N||s(N)<=u)return;const M=new Set(S.current);M.delete(N),re(M)}H.current=h,re(new Set(S.current).add(h))}},[re,Y]);We.current=_e;const ge=a.useCallback(e=>{if(S.current.has(e))return;const n=H.current;if(n&&n!==e){const l=new Set(S.current);l.delete(n),re(l),H.current=null}H.current=e,re(new Set(S.current).add(e))},[re]),Ge=a.useCallback(e=>{if(!S.current.has(e))return;const n=Ce.current.get(e);n&&je.current.set(e,n),H.current===e&&(H.current=null),window.requestAnimationFrame(()=>We.current())},[]),Xe=a.useCallback((e,n,l)=>{if(Math.abs(l-n)<1)return;const s=ee.current.get(e);s!==void 0&&Math.abs(s-l)<1||(ee.current.set(e,l),Ut(e,l),ut(d=>d+1))},[]);a.useLayoutEffect(()=>{if(Te.current!==z){Te.current=z;for(const e of k){if(e.diffOverride!==void 0)continue;const n=et(e.path,e.repoRoot);Mt(n,e.repoRoot??void 0,D)}}},[k,D,z]),a.useLayoutEffect(()=>{const e=q.current;if(!e)return;const n=()=>{const s=Math.max(0,Math.ceil(e.clientHeight));if(s===0)return;const d=e.scrollTop;xe(h=>h.height===s&&h.top===d?h:{top:d,height:s})};if(n(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(n);return l.observe(e),()=>l.disconnect()},[V]),a.useEffect(()=>{Fe&&ge(Fe)},[ge,Fe]),a.useEffect(()=>{const e=new Set(De.current);for(const n of Array.from(ee.current.keys()))e.has(n)||ee.current.delete(n);for(const n of Array.from(S.current))if(!e.has(n)){const l=new Set(S.current);l.delete(n),re(l)}for(const n of Array.from(je.current.keys()))e.has(n)||je.current.delete(n);if(H.current&&!e.has(H.current)&&(H.current=null),k.length===0){H.current=null,je.current.clear(),re(new Set);return}_e()},[k.length,Ie,_e,Ve,re]);const Ke=a.useCallback(e=>{q.current=e;const n=Z.current,l=e.scrollTop;Z.current=l;const s=d=>{const h=$e.current,u=De.current;let N=0,M=h.tops.length;for(;N<M;){const Ae=Math.floor((N+M)/2);h.tops[Ae]<=d+1?N=Ae+1:M=Ae}const Q=Math.min(u.length-1,Math.max(0,N-1)),ve=u[Q]??null;I.current={key:ve,top:h.tops[Q]??0},ve&&ge(ve)};Math.abs(l-n)>=ze?(rt.flushSync(()=>{xe({top:l,height:e.clientHeight})}),s(l)):he.current===null&&(he.current=window.requestAnimationFrame(()=>{he.current=null;const d=q.current;if(d){const h=d.scrollTop;xe({top:h,height:d.clientHeight}),s(h)}})),ae?.(e)},[ae,ge]);a.useEffect(()=>()=>{he.current!==null&&window.cancelAnimationFrame(he.current)},[]),a.useLayoutEffect(()=>{const e=q.current;if(!e)return;const n=I.current;if(n.key===null)return;const l=pe.current.get(n.key);if(l===void 0)return;const s=(R.tops[l]??n.top)-n.top;if(Math.abs(s)<1)return;const d=e.scrollTop+s;Z.current=d,xe(h=>({top:d,height:h.height})),typeof e.scrollTo=="function"?e.scrollTo({top:d,behavior:"instant"}):e.scrollTop=d},[R]),a.useLayoutEffect(()=>{const e=De.current,n=R.tops;if(e.length===0){I.current={key:null,top:0};return}const l=Z.current,s=l+(q.current?.clientHeight??te.height),d=I.current;if(d.key!==null){const M=pe.current.get(d.key);if(M!==void 0){const Q=n[M]??0;if(Q+(R.heights[M]??Ze)>l&&Q<s){I.current={key:d.key,top:Q};return}}}let h=0,u=n.length;for(;h<u;){const M=Math.floor((h+u)/2);n[M]<=l+1?h=M+1:u=M}const N=Math.min(n.length-1,Math.max(0,h-1));I.current={key:e[N]??null,top:n[N]??0}}),a.useLayoutEffect(()=>{if(!me||Ne.current===fe)return;const e=pe.current.get(me);if(e===void 0)return;ge(me),I.current={key:me,top:R.tops[e]??0};const n=q.current;if(!n)return;Ne.current=fe;const l=R.tops[e]??0;typeof n.scrollTo=="function"?n.scrollTo({top:l,behavior:"instant"}):n.scrollTop=l;const s=n.scrollTop;Z.current=s,xe({top:s,height:n.clientHeight})},[R,te.height,ge,me,fe]),a.useLayoutEffect(()=>{if(A===void 0||me)return;const e=Ie;if(ce.current===e)return;const n=q.current;if(!n)return;ce.current=e;const l=Math.max(0,R.bottom-n.clientHeight),s=Math.min(Math.max(0,A),l);typeof n.scrollTo=="function"?n.scrollTo({top:s,behavior:"instant"}):n.scrollTop=s;const d=n.scrollTop;Z.current=d,xe({top:d,height:n.clientHeight})},[R.bottom,A,Ie,me]);const dt=a.useCallback((e,n)=>{const l=Re(e),s=Ce.current.get(e.key),d=s!==void 0&&Yt(je.current.get(e.key),s);return r.jsx(Xt,{file:Jt(e),repoRoot:e.repoRoot,selectionPath:e.key,displayName:e.displayName,displayDir:e.displayDir,selected:l,activePane:w,visible:Oe.has(e.key),reusableContent:d,estimatedHeight:n,lightweight:!1,wrap:G,showScrollHint:p,viewType:j,inlineMode:P,diffOptions:D,reloadKey:z,auditRecords:e.auditRecords,diffOverride:e.diffOverride,renderBadge:h=>T(h,e),onInsertDiffReference:e.onInsertDiffReference??E,onHunkGitAction:e.onHunkGitAction??B,onReferenceCopied:W,insertedReferenceKey:$,copiedReferenceKey:C,onClearAuditRecord:O,onContentReady:Ge,onHeightChange:Xe})},[w,C,D,j,Ge,Xe,P,$,Re,Oe,O,B,E,W,z,T,p,G]),ft=r.jsx("div",{"data-diff-stream-content":!0,"data-diff-stream-canvas":!0,className:"termdock-diff-stream relative overflow-clip bg-surface will-change-transform",style:{height:Math.max(te.height,R.bottom)},children:Ve.map(e=>{const n=k[e];return n?r.jsx("div",{"data-diff-canvas-slot":n.key,className:"absolute inset-x-0",style:{top:R.tops[e]},children:dt(n,R.heights[e])},n.key):null})}),ht=r.jsx("div",{ref:q,className:"termdock-diff-stream termdock-diff-stream-scroller h-full max-h-full min-h-0 overflow-y-auto overscroll-contain bg-surface [overflow-anchor:none]",onScroll:e=>Ke(e.currentTarget),children:ft});return r.jsx(Vt,{groups:o,mode:m,onModeChange:c,selectedKey:i,collapsedDirectoryKeys:b,onToggleDirectory:v,onSelectFile:x,renderLeading:g,renderTrailing:f,renderDirectoryTrailing:y,renderSubtitle:L,detail:ht,mobile:V,backLabel:ne,compact:ie,emptyContent:le,listPrefix:be,aiContent:ue,listContainerClassName:de,detailContainerClassName:U,renderListHeader:X,renderMobileDetailHeader:oe,externalSwiperRef:we,onMobileSlideChange:Me,slideToDetailOnMobile:ke,desktopLayout:se,onDetailScroll:Ke,desktopSidePanel:F,desktopListClassName:_,detailOwnsScroll:!0})}function Jt(t){return{path:t.path,absolutePath:t.absolutePath,status:t.status}}function et(t,o){if(t)return o&&t.startsWith(`${o}/`)?t.slice(o.length+1):t}export{St as A,nr as C,or as D,Et as L,Pt as f,sr as n};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{as as u}from"./app-
|
|
1
|
+
import{as as u}from"./app-CuXPRCrJ.js";import{b as o}from"./dnd-BCFAPC0L.js";import{D}from"./DiffReview-CY5ro-NB.js";import"./react-XDCjal2T.js";import"./terminal-C7X98Amf.js";import"./sparkles-DltQJKyI.js";import"./DiffViewer-hy9qKEFv.js";const w=40,p="/tmp/termdock-diff-review-lab";function h(n,l){const i=[`diff --git a/${n} b/${n}`,`--- a/${n}`,`+++ b/${n}`,`@@ -1,${l} +1,${l} @@`];for(let t=0;t<l;t+=1)t%5===0&&i.push(`-const removed_${t} = ${t};`),t%3===0&&i.push(`+const added_${t} = ${t} * 2;`),i.push(` context line ${t} in ${n}`);return i.join(`
|
|
2
2
|
`)}function j(n,l){return Array.from({length:w},(i,t)=>{const r=6+t*7%60,d=`src/module${String(t).padStart(2,"0")}/File${t}.ts`,a=`${p}/${d}`,f=h(d,r),m=h(d,1);return{key:a,path:d,absolutePath:a,status:"modified",repoRoot:p,displayName:`File${t}.ts`,displayDir:`src/module${String(t).padStart(2,"0")} · ${r} lines`,diffOverride:!l||n.has(t)?f:m,auditRecords:[]}})}function K(){const n=o.useMemo(()=>{if(typeof window>"u")return 0;const e=new URLSearchParams(window.location.search).get("delay"),s=e===null?0:Number.parseInt(e,10);return Number.isInteger(s)&&s>0?s:0},[]),l=n>0,[i,t]=o.useState(()=>new Set);o.useEffect(()=>{if(!l)return;const e=Array.from({length:w},(s,c)=>window.setTimeout(()=>{t(R=>{const y=new Set(R);return y.add(c),y})},n+c*20));return()=>e.forEach(s=>window.clearTimeout(s))},[l,n]);const r=o.useMemo(()=>j(i,l),[i,l]),d=o.useMemo(()=>[{key:"mock-repo",root:p,label:"diff-review-lab",files:r.map(e=>({key:e.key,path:e.path,absolutePath:e.absolutePath,displayName:e.displayName,displayDir:e.displayDir,status:e.status}))}],[r]),a=o.useMemo(()=>{if(typeof window>"u")return null;const e=new URLSearchParams(window.location.search).get("select");if(e===null)return null;const s=Number.parseInt(e,10);return Number.isInteger(s)&&s>=0&&s<r.length?s:null},[r.length]),[f,m]=o.useState(()=>a!==null?r[a].key:null),[b,g]=o.useState(()=>({key:a!==null?r[a].key:null,nonce:a!==null?1:0})),[S,x]=o.useState("list"),[$,k]=o.useState(new Set),[v,N]=o.useState(a!==null?1:0);return u.jsxs("div",{className:"flex h-screen flex-col bg-background text-foreground","data-diff-review-lab":!0,children:[u.jsxs("div",{className:"shrink-0 border-b border-border/20 px-3 py-2 text-xs text-muted-foreground",children:["DiffReview Lab · ",r.length," mock files · selected: ",u.jsx("span",{"data-lab-selected":!0,children:f??"none"})," · slide ",v]}),u.jsx("div",{className:"min-h-0 flex-1",children:u.jsx(D,{mobile:!0,backLabel:"Back",files:r,groups:d,selectedKey:f,scrollToKey:b.key,scrollToKeyNonce:b.nonce,mode:S,onModeChange:e=>{e!=="ai"&&x(e)},collapsedDirectoryKeys:$,onToggleDirectory:e=>k(s=>{const c=new Set(s);return c.has(e)?c.delete(e):c.add(e),c}),onSelectFile:e=>{m(e.key),g(s=>({key:e.key,nonce:s.nonce+1}))},onMobileSlideChange:N,renderLeading:()=>null,renderStreamBadge:e=>u.jsx("span",{className:"text-[10px] text-muted-foreground",children:e}),wrap:!0,showScrollHint:!1,activePane:!0})})]})}export{K as DiffReviewLab};
|
|
Binary file
|