termdock 1.4.168 → 1.4.170
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 +2 -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 +1 -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 +370 -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 +1 -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 +2 -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 +35 -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/DiffViewer-T3uj2-aP.css +1 -0
- package/dist/client/assets/DiffViewer-T3uj2-aP.css.br +0 -0
- package/dist/client/assets/DiffViewer-T3uj2-aP.css.gz +0 -0
- package/dist/client/assets/ModelPreview-DZzx3Tzo.js +4112 -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 +55 -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/RightSidebar-DW-JEgm2.css +1 -0
- package/dist/client/assets/{abnfDiagram-VRR7QNED-BPFn9m09.js → abnfDiagram-VCTEODGH-DKmZLRlf.js} +1 -1
- 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 +175 -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 +1 -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 +36 -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 +129 -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 +38 -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 +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CXqAcWtO.js → chunk-2Q5K7J3B-FAEL5P17.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-B2ewCivF.js → chunk-5VM5RSS4-BQJAvucM.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-DEkt187T.js +1 -0
- 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-EX3LRPZG-DcpNYccw.js → chunk-IMKFNOWR-BfOJ-x_l.js} +5 -5
- 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-JWPE2WC7-DJGW22NC.js → chunk-JWPE2WC7-BN6q6jKH.js} +1 -1
- package/dist/client/assets/chunk-POPQ4Y6H-BrhQRNCn.js +1 -0
- package/dist/client/assets/{chunk-MOJQB5TN-CI12TXOM.js → chunk-SVP7TREG-CjZOC5Dj.js} +4 -4
- 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-V7JOEXUC-D2J88tQk.js → chunk-TICWLB2K-Wshj9ws7.js} +3 -3
- 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/{chunk-XXDRQBXY-DFycwWDp.js → chunk-XXDRQBXY-BPPghuc3.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-2OomHNTG.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-2OomHNTG.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-D8eG4PZe.js → cose-bilkent-JH36ORCC-BjxJYQH8.js} +1 -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-VYW2F7L2-B9Z9SAtQ.js → cynefin-OW5HDTMX-QmUTVmd_.js} +38 -38
- 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 +62 -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/cytoscape.esm-D3_iZ_3b.js.br +0 -0
- package/dist/client/assets/cytoscape.esm-D3_iZ_3b.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-CJFctjtR.js +4 -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/defaultLocale-CrowFXzY.js.br +0 -0
- package/dist/client/assets/defaultLocale-CrowFXzY.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-e7Jn-RGH.js +30 -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 +41 -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-FQU43EPY-BSU4bMc7.js → diagram-VSXAHHWV-cp7u53yF.js} +3 -3
- 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 +24 -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 +24 -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/diffWorker-CAzvFFr7.js +27 -0
- package/dist/client/assets/diffWorker-CAzvFFr7.js.br +0 -0
- package/dist/client/assets/diffWorker-CAzvFFr7.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-N_k0E7sQ.js → ebnfDiagram-PWID7BFC-Bt4zDbpn.js} +1 -1
- 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 +99 -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 +168 -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 +292 -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 +106 -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 +1 -0
- package/dist/client/assets/index-BaBARzax.css.br +0 -0
- package/dist/client/assets/index-BaBARzax.css.gz +0 -0
- package/dist/client/assets/{index-Ca-rq7yX.js → index-UqXCGE5m.js} +4 -4
- package/dist/client/assets/index-UqXCGE5m.js.br +0 -0
- package/dist/client/assets/index-UqXCGE5m.js.gz +0 -0
- package/dist/client/assets/infoDiagram-27XIBGKW-CVQtEdgb.js +2 -0
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-Ew07ODU5.js → ishikawaDiagram-5VMMS53U-Cf7tUoyW.js} +5 -5
- 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-5HDEW3XC-BUjwylu4.js → journeyDiagram-3NMN7TZE-B-9CWrlr.js} +5 -5
- 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-HUTT4EX6-Cjv8zokk.js → kanban-definition-UXKFOSKX-LDN2IZeo.js} +7 -7
- 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/katex-55ZPZeOF.css.br +0 -0
- package/dist/client/assets/katex-55ZPZeOF.css.gz +0 -0
- package/dist/client/assets/katex-DnlPpQZa.js.br +0 -0
- package/dist/client/assets/katex-DnlPpQZa.js.gz +0 -0
- package/dist/client/assets/katex-HP8lGamR.js.br +0 -0
- package/dist/client/assets/katex-HP8lGamR.js.gz +0 -0
- package/dist/client/assets/layout-DvqSuFgF.js +1 -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-C6Z8ZZfN.js → linear-D43LQnis.js} +1 -1
- 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 +308 -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-LN4V7U3C-DACHJUhw.js → mindmap-definition-YA3MSWOX-k3f4uWuu.js} +3 -3
- 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/ordinal-Cboi1Yqb.js.br +0 -0
- package/dist/client/assets/ordinal-Cboi1Yqb.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-2B236MQR-C6YRG4Sp.js → pegDiagram-XKGWAZYB-Dj32Fl3j.js} +1 -1
- 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 +39 -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/purify.es-4eNOHKSq.js +3 -0
- package/dist/client/assets/purify.es-4eNOHKSq.js.br +0 -0
- package/dist/client/assets/purify.es-4eNOHKSq.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-DugxSPrH.js → quadrantDiagram-AXDQQJYC-BPScfZWR.js} +1 -1
- 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 +1 -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/react-XDCjal2T.js.br +0 -0
- package/dist/client/assets/react-XDCjal2T.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-BzaF87gc.js → requirementDiagram-BXWQKSXE-CosES4L6.js} +12 -12
- 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 +40 -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-DBY2YBRQ-B1gfbBUX.js → sequenceDiagram-WJ2MYXX4-3RKv_35o.js} +1 -1
- 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-X5ZJPWSS-Cx3c55P-.js → sizeCapture-INFHLROL-BrVkA4VD.js} +1 -1
- 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/sparkles-B3pwUd8-.js +1 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-DeWhyAVC.js +1 -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 +1 -0
- package/dist/client/assets/swimlanes-42K2YHIH-i2m0Wmhn.js +1 -0
- 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 +8 -0
- package/dist/client/assets/terminal-C7X98Amf.js.br +0 -0
- package/dist/client/assets/terminal-C7X98Amf.js.gz +0 -0
- package/dist/client/assets/{timeline-definition-FHXFAJF6-Dmjeiy4n.js → timeline-definition-24CTP7MA-BImN0AS_.js} +1 -1
- 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 +34 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DVUHKmvC.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DVUHKmvC.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-EHGQE667-C0Qt8nhi.js → wardleyDiagram-VM6X3IG4-B9qi-hc7.js} +4 -4
- 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 +7 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-3jgBcYVl.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-3jgBcYVl.js.gz +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-38-022d7c89c800.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-39-63f8fa5b3eba.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3a-2d8d46cc4dca.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3b-e75aed5d3969.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c-ac2534aae681.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c0-8c49a98e75c4.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c1-971c5e7a86ce.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c2-e5c4893acfb9.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c3-156f2560c871.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c4-49f0d18a7492.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c5-33d81ad28c5c.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3c6-5c301879d053.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-icons-3d-52c90894de44.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Bold-text-9e8d9df2dd02.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-38-7942d3c93afb.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-39-19989a2be535.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3a-7786ff4a4dd9.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3b-a759fd623d7e.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c-2a1178076740.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c0-6f2c7518f354.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c1-4bf64cae9dd2.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c2-7f26d4c7240b.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c3-fc8e5a85d620.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c4-91819b7977d3.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c5-26933eec54e2.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3c6-af186404c8af.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-icons-3d-b004d85f5642.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-BoldItalic-text-da002b4e56d3.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-38-b3e69191d92f.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-39-c4d8d66882cb.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3a-27609324e8a3.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3b-5e73d85d7506.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c-7e535d65bbdb.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c0-6465060a06a1.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c1-9fd72ccd9350.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c2-ea7dd77de270.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c3-12808f88907a.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c4-14b598e5e739.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c5-3d40530ce6c2.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3c6-7020aec0d9e1.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-icons-3d-19831897003a.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Italic-text-b7a9c776b048.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-38-a637901140d8.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-39-838726e8eeca.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3a-ec149087d0b9.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3b-db8e5a24d580.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c-2290d2ad4621.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c0-3b9edaf85d65.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c1-5e7fb0696bbc.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c2-cfad2884adf5.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c3-d641de88278b.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c4-3b0227356b3b.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c5-9dc67c4d20b4.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3c6-c5b444110c62.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-icons-3d-2b19b65bb43a.woff2 +0 -0
- package/dist/client/fonts/terminal/JetBrainsMonoNLNerdFontMono-Regular-text-d7b9316fdf4f.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-4e-46bdca5c323f.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-4f-17200dc0dd0d.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-50-370e36250c30.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-51-66352f738581.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-52-191f4025d2b5.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-53-fb0a637c39bf.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-54-66f2e72c9ca0.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-55-54b538fd4fd8.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-56-88f45aeb2030.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-57-154d4324f0ce.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-58-1660c86b8a05.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-59-31a4c5afa3aa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-5a-fa1d1941710e.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-5b-031a2b2ebeb7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-5c-065b634c07b3.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-5d-71f6cd3ed180.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-5e-f59de7a6e5c5.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-5f-8cbe737b6011.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-60-22913526da09.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-61-c810c1d1a3a3.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-62-9464d5d87d65.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-63-79564d99f5da.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-64-4b7cff1dae6f.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-65-8dd48db5e297.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-66-a808e22a3d14.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-67-ae5f61af3f79.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-68-a46bf47bd9ba.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-69-28210414eafb.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-6a-6bfb1f5e4fb7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-6b-39be890e04e4.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-6c-79a4ff740d98.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-6d-2de5a763980e.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-6e-8e55b339244d.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-6f-a56caf9fc7fc.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-70-d70c6ee8e03c.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-71-ac6f5f86dfef.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-72-db3d346ecc61.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-73-e7371bd71f0b.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-74-43946d9b2f0b.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-75-ea7cf53e31fa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-76-04c7fa4e0ebf.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-77-24d70898f6b8.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-78-c6a5d7135296.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-79-7812cb6432aa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-7a-6e123be5cd36.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-7b-a183ddc6890f.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-7c-0895291ece9c.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-7d-1d44252384cf.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-7e-7be4dc6f056e.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-7f-0d8e987db151.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-80-c0c154bb8be0.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-81-5343baca5ce7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-82-6d89af9614ce.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-83-fa17ef529c5b.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-84-287ecb493fad.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-85-fea695c48165.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-86-8bb35373cb82.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-87-f83e9f70a6cc.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-88-894cd19292c1.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-89-2903a6eaf546.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-8a-3ce275bfcf96.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-8b-3aaeb26309a6.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-8c-719b6608b746.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-8d-a7f1ccd0dfb7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-8e-d503ad5c4958.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-8f-18c6d04746c8.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-90-e9d94d915dfe.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-91-c258b07ec626.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-92-e4833a556b60.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-94-0889f5b84499.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-95-7ef116efe7ee.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-96-afbc0d2cacda.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-97-df3903d86f65.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-98-0f21094931ee.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-99-eb95f4bead58.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-9a-764e8b8723ec.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-9b-33a540b9196a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-9c-60d6040aa049.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-9e-4a64c65bf44d.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-cjk-9f-4d84fba11345.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Bold-Subset-punctuation-f1b7708e797a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-4e-bb1ec5541ecc.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-4f-d6e8daa67360.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-50-63c2ae7f85e8.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-51-41b6e0624888.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-52-57de15003b8d.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-53-94382657e2bc.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-54-177141086f32.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-55-5ec6fae9813a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-56-720aa493b429.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-57-a8884711a286.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-58-42a3e7e1fe9a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-59-887ee4253daa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-5a-c45806889e3c.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-5b-da142b99dca9.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-5c-2bb495e5b511.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-5d-9da87d6061f2.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-5e-e4010764e593.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-5f-a9c9021f6e01.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-60-306f229a68e0.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-61-6e4546c5f52a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-62-a73e47933059.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-63-e8f49f472799.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-64-37b54957eadc.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-65-2742b20127ad.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-66-239656e7fe56.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-67-5dfa72b26c3f.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-68-fe3d1fc05aae.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-69-22535dbbd090.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-6a-c4117cd520aa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-6b-895d3349f7de.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-6c-56a0c71eb1b4.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-6d-9ec807661604.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-6e-3b633363cd57.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-6f-91a1f1c31b75.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-70-3a904a2a2371.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-71-e8efb60879b0.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-72-591318b99498.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-73-d8f444050aa7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-74-55a832a12d7e.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-75-660977996a4c.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-76-441a04df9fb5.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-77-5915143c4398.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-78-242fbc33c745.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-79-24d13953150a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-7a-41973af74017.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-7b-f9661fdaf003.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-7c-ef5167770bf7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-7d-d84ad5d95f37.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-7e-66841a1c6381.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-7f-5090e017351a.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-80-9ad74a67c2b9.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-81-423a60a6dcf1.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-82-aad812217807.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-83-3dc74dbac89c.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-84-68db7802ffe8.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-85-fa235a7160e4.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-86-75a6a33d0db2.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-87-7d98ea8ce063.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-88-363fa8f178aa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-89-f2d185e8721f.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-8a-e372253a07f5.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-8b-0af53db9bdc1.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-8c-6a43d3643480.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-8d-09c4b5345b99.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-8e-122a752954a6.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-8f-c651bbfffeb3.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-90-ab0a5fef3083.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-91-e07b5cbe4792.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-92-cba0a8ee6758.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-94-e7a6bd14e248.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-95-420f721d52ba.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-96-90fd476b83f2.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-97-34036fc287f7.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-98-5c3cdd76911e.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-99-73e6090fd7c8.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-9a-673ebaebe683.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-9b-90a5a3ee22d6.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-9c-116d201c978b.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-9e-78db36865caa.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-cjk-9f-27e8d16243d5.woff2 +0 -0
- package/dist/client/fonts/terminal/NotoSansMonoCJKsc-Subset-punctuation-a4288065ed29.woff2 +0 -0
- package/dist/client/fonts/terminal/manifest.json +1349 -0
- package/dist/client/fonts/terminal/manifest.json.br +0 -0
- package/dist/client/fonts/terminal/manifest.json.gz +0 -0
- package/dist/client/icons/agents/claude.svg.br +0 -0
- package/dist/client/icons/agents/claude.svg.gz +0 -0
- package/dist/client/icons/agents/codex.svg.br +0 -0
- package/dist/client/icons/agents/codex.svg.gz +0 -0
- package/dist/client/icons/agents/copilot.svg.br +0 -0
- package/dist/client/icons/agents/copilot.svg.gz +0 -0
- package/dist/client/icons/agents/droid.svg.br +0 -0
- package/dist/client/icons/agents/droid.svg.gz +0 -0
- package/dist/client/icons/agents/gemini.svg.br +0 -0
- package/dist/client/icons/agents/gemini.svg.gz +0 -0
- package/dist/client/icons/agents/goose.svg.br +0 -0
- package/dist/client/icons/agents/goose.svg.gz +0 -0
- package/dist/client/index.html +7 -52
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw-notifications.js.br +0 -0
- package/dist/client/sw-notifications.js.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/client/workbox-9845bf53.js.br +0 -0
- package/dist/client/workbox-9845bf53.js.gz +0 -0
- package/dist/server/agent/installers.js +47 -27
- package/dist/server/cli.js +4 -4
- package/dist/server/entry.js +57 -145
- package/dist/server/routes/auth.js +9 -3
- package/dist/server/routes/filesystem.js +39 -9
- package/dist/server/routes/local.js +3 -2
- package/dist/server/routes/terminal.js +337 -225
- package/dist/server/utils/apiAccess.js +27 -0
- package/dist/server/utils/apiCachePolicy.js +10 -0
- package/dist/server/utils/authProtection.js +140 -38
- package/dist/server/utils/cookieSecurity.js +3 -2
- package/dist/server/utils/csrfProtection.js +2 -6
- package/dist/server/utils/previewValidation.js +16 -0
- package/dist/server/utils/publicSecurity.js +44 -0
- package/dist/server/utils/requestDeadline.js +2 -0
- package/dist/server/utils/requestSecurity.js +23 -28
- package/dist/server/utils/staticAssets.js +97 -0
- package/dist/server/utils/terminalClientAttachment.js +61 -0
- package/dist/server/utils/terminalHandshakeDimensions.js +9 -0
- package/dist/server/utils/terminalOutputDelivery.js +90 -0
- package/dist/server/utils/tmuxClientRedraw.js +16 -0
- package/dist/server/utils/tmuxInitialScreen.js +50 -0
- package/dist/server/utils/tmuxResizeReady.js +56 -0
- package/dist/server/utils/webSocketSecurity.js +28 -0
- package/package.json +7 -4
- package/runtime-manifest.json +4 -4
- package/scripts/generate-font-subsets.py +88 -0
- package/scripts/precompress-client.mjs +28 -0
- package/dist/client/assets/ModelPreview-BVdIA5hh.js +0 -4108
- package/dist/client/assets/app-uayLhfKS.js +0 -632
- package/dist/client/assets/arc-BrdWVufU.js +0 -1
- package/dist/client/assets/architectureDiagram-ZJ3FMSHR-M74Mohos.js +0 -36
- package/dist/client/assets/blockDiagram-677ZJIJ3-D6OG5gyC.js +0 -132
- package/dist/client/assets/c4Diagram-LMCZKHZV-C2w-_Jc4.js +0 -10
- package/dist/client/assets/channel-B3PaW8my.js +0 -1
- package/dist/client/assets/chunk-32BRIVSS-CEtSQTtD.js +0 -1
- package/dist/client/assets/chunk-RYQCIY6F-DS5ufo5c.js +0 -1
- package/dist/client/assets/chunk-VR4S4FIN-0lqTHFzc.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-CLK6o5ur.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-CLK6o5ur.js +0 -1
- package/dist/client/assets/cynefinDiagram-TSTJHNR4-DLfD0XDP.js +0 -62
- package/dist/client/assets/dagre-VKFMJZFB-BVcVxS_K.js +0 -4
- package/dist/client/assets/diagram-G47NLZAW-U4SDLU5l.js +0 -24
- package/dist/client/assets/diagram-NH7WQ7WH-DzUUOLaX.js +0 -24
- package/dist/client/assets/diagram-OA4YK3LP-CkCRYrYh.js +0 -30
- package/dist/client/assets/diagram-WEI45ONY-D5_8zUCk.js +0 -41
- package/dist/client/assets/diffWorker-Bg2YXCD-.js +0 -27
- package/dist/client/assets/erDiagram-Q63AITRT-CaBjWdJp.js +0 -85
- package/dist/client/assets/flowDiagram-23GEKE2U-CVOqw7CA.js +0 -156
- package/dist/client/assets/ganttDiagram-NO4QXBWP-DI8IFeJE.js +0 -292
- package/dist/client/assets/gitGraphDiagram-IHSO6WYX-CnpSm3yq.js +0 -106
- package/dist/client/assets/graph-D2o_JWn5.js +0 -1
- package/dist/client/assets/index-C13NrW5y.css +0 -1
- package/dist/client/assets/infoDiagram-FWYZ7A6U-C-dKF4KW.js +0 -2
- package/dist/client/assets/layout-1eBIAoSl.js +0 -1
- package/dist/client/assets/map-BdqsVdb3.js +0 -1
- package/dist/client/assets/mermaid.core-B13cUj_d.js +0 -306
- package/dist/client/assets/pieDiagram-ENE6RG2P-7cfuhoAx.js +0 -39
- package/dist/client/assets/purify.es-CC4Brkr_.js +0 -3
- package/dist/client/assets/railroadDiagram-RFXS5EU6-BhRp2Kow.js +0 -1
- package/dist/client/assets/sankeyDiagram-HTMAVEWB-4yvODBzh.js +0 -40
- package/dist/client/assets/stateDiagram-2N3HPSRC-CyZ_X_VK.js +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-9hsqTyV0.js +0 -1
- package/dist/client/assets/swimlanes-5IMT3BWC-BZPAGrt1.js +0 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-DYvi0MbZ.js +0 -8
- package/dist/client/assets/vennDiagram-L72KCM5P-BC2FrHDP.js +0 -34
- package/dist/client/assets/xychartDiagram-FW5EYKEG-cQNpjzG4.js +0 -7
- package/dist/client/registerSW.js +0 -1
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()) {
|
|
@@ -0,0 +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?`
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{as as t}from"./app-tT08GaCs.js";import{C as s}from"./ChangeWalkthroughPanel-u9y3e-pI.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";import"./sparkles-B3pwUd8-.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
|