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
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
const CONTENT_TYPES = {
|
|
4
|
+
'.js': 'text/javascript; charset=utf-8', '.mjs': 'text/javascript; charset=utf-8',
|
|
5
|
+
'.css': 'text/css; charset=utf-8', '.html': 'text/html; charset=utf-8',
|
|
6
|
+
'.json': 'application/json; charset=utf-8', '.svg': 'image/svg+xml',
|
|
7
|
+
'.webmanifest': 'application/manifest+json', '.txt': 'text/plain; charset=utf-8',
|
|
8
|
+
};
|
|
9
|
+
export function selectStaticEncoding(header) {
|
|
10
|
+
const qualities = new Map();
|
|
11
|
+
for (const token of header.toLowerCase().split(',')) {
|
|
12
|
+
const [name, ...params] = token.trim().split(';');
|
|
13
|
+
const q = params.map((value) => value.trim()).find((value) => value.startsWith('q='));
|
|
14
|
+
const quality = q === undefined ? 1 : Number(q.slice(2));
|
|
15
|
+
qualities.set(name, Number.isFinite(quality) && quality >= 0 && quality <= 1 ? quality : 0);
|
|
16
|
+
}
|
|
17
|
+
const br = qualities.get('br') ?? qualities.get('*') ?? 0;
|
|
18
|
+
const gzip = qualities.get('gzip') ?? qualities.get('*') ?? 0;
|
|
19
|
+
if (br <= 0 && gzip <= 0)
|
|
20
|
+
return null;
|
|
21
|
+
return br >= gzip ? 'br' : 'gzip';
|
|
22
|
+
}
|
|
23
|
+
export function setStaticCacheHeaders(req, res) {
|
|
24
|
+
let pathname;
|
|
25
|
+
try {
|
|
26
|
+
pathname = decodeURIComponent(new URL(req.url, 'http://localhost').pathname);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (pathname.startsWith('/assets/') || /^\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/.test(pathname)) {
|
|
32
|
+
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');
|
|
33
|
+
}
|
|
34
|
+
else if (pathname === '/sw.js' || pathname === '/registerSW.js' || pathname === '/manifest.webmanifest' || pathname === '/' || pathname.endsWith('/index.html')) {
|
|
35
|
+
// Allow conditional validation without ever reusing a stale entry point.
|
|
36
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Serve build-time compressed assets; missing sidecars fall through to Express.
|
|
40
|
+
* No synchronous compression or disk reads in the terminal server's event loop.
|
|
41
|
+
*/
|
|
42
|
+
export function createStaticCompressionMiddleware(rootDir) {
|
|
43
|
+
const root = path.resolve(rootDir);
|
|
44
|
+
return async (req, res, next) => {
|
|
45
|
+
if (req.method !== 'GET' && req.method !== 'HEAD' || req.headers.range)
|
|
46
|
+
return next();
|
|
47
|
+
let pathname;
|
|
48
|
+
try {
|
|
49
|
+
pathname = decodeURIComponent(new URL(req.url, 'http://localhost').pathname);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return next();
|
|
53
|
+
}
|
|
54
|
+
if (pathname === '/')
|
|
55
|
+
pathname = '/index.html';
|
|
56
|
+
const type = CONTENT_TYPES[path.extname(pathname).toLowerCase()];
|
|
57
|
+
if (!type)
|
|
58
|
+
return next();
|
|
59
|
+
res.vary('Accept-Encoding');
|
|
60
|
+
const encoding = selectStaticEncoding(String(req.headers['accept-encoding'] || ''));
|
|
61
|
+
if (!encoding)
|
|
62
|
+
return next();
|
|
63
|
+
const original = path.resolve(root, '.' + pathname);
|
|
64
|
+
if (!original.startsWith(root + path.sep))
|
|
65
|
+
return next();
|
|
66
|
+
const compressed = original + (encoding === 'br' ? '.br' : '.gz');
|
|
67
|
+
try {
|
|
68
|
+
const [source, stat] = await Promise.all([fs.promises.stat(original), fs.promises.stat(compressed)]);
|
|
69
|
+
if (!source.isFile() || !stat.isFile() || stat.mtimeMs < source.mtimeMs)
|
|
70
|
+
return next();
|
|
71
|
+
res.setHeader('Content-Type', type);
|
|
72
|
+
res.setHeader('Content-Encoding', encoding);
|
|
73
|
+
res.setHeader('ETag', `W/"${stat.size.toString(16)}-${stat.mtimeMs.toString(16)}-${encoding}"`);
|
|
74
|
+
res.setHeader('Last-Modified', source.mtime.toUTCString());
|
|
75
|
+
setStaticCacheHeaders(req, res);
|
|
76
|
+
if (req.fresh) {
|
|
77
|
+
res.status(304).end();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
res.setHeader('Content-Length', stat.size);
|
|
81
|
+
if (req.method === 'HEAD') {
|
|
82
|
+
res.end();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const stream = fs.createReadStream(compressed);
|
|
86
|
+
res.once('close', () => stream.destroy());
|
|
87
|
+
stream.on('error', (error) => { if (!res.headersSent)
|
|
88
|
+
next(error);
|
|
89
|
+
else
|
|
90
|
+
res.destroy(error); });
|
|
91
|
+
stream.pipe(res);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
next();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** A display connection owns its PTY parser stream; the tmux task is separate.
|
|
2
|
+
* Epoch checks also cover disconnect/unsubscribe while spawning asynchronously.
|
|
3
|
+
*/
|
|
4
|
+
export class TerminalClientAttachment {
|
|
5
|
+
spawn;
|
|
6
|
+
onData;
|
|
7
|
+
onExit;
|
|
8
|
+
epoch = 0;
|
|
9
|
+
process = null;
|
|
10
|
+
subscriptions = [];
|
|
11
|
+
constructor(spawn, onData, onExit) {
|
|
12
|
+
this.spawn = spawn;
|
|
13
|
+
this.onData = onData;
|
|
14
|
+
this.onExit = onExit;
|
|
15
|
+
}
|
|
16
|
+
get pid() { return this.process?.pid; }
|
|
17
|
+
get attached() { return this.process !== null; }
|
|
18
|
+
async open(cols, rows) {
|
|
19
|
+
this.close();
|
|
20
|
+
const epoch = this.epoch;
|
|
21
|
+
const process = await this.spawn(cols, rows);
|
|
22
|
+
if (epoch !== this.epoch) {
|
|
23
|
+
process.kill();
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
this.process = process;
|
|
27
|
+
this.subscriptions = [
|
|
28
|
+
process.onData(data => { if (epoch === this.epoch)
|
|
29
|
+
this.onData(data); }),
|
|
30
|
+
process.onExit(() => {
|
|
31
|
+
if (epoch !== this.epoch)
|
|
32
|
+
return;
|
|
33
|
+
this.process = null;
|
|
34
|
+
this.disposeSubscriptions();
|
|
35
|
+
this.onExit();
|
|
36
|
+
}),
|
|
37
|
+
];
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
write(data) { this.process?.write(data); }
|
|
41
|
+
resize(cols, rows) {
|
|
42
|
+
if (!this.process)
|
|
43
|
+
return false;
|
|
44
|
+
this.process.resize(cols, rows);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
close() {
|
|
48
|
+
this.epoch += 1;
|
|
49
|
+
this.disposeSubscriptions();
|
|
50
|
+
const process = this.process;
|
|
51
|
+
this.process = null;
|
|
52
|
+
// This is the attached tmux CLI process, never a pane or tmux server.
|
|
53
|
+
if (process)
|
|
54
|
+
process.kill();
|
|
55
|
+
}
|
|
56
|
+
disposeSubscriptions() {
|
|
57
|
+
for (const subscription of this.subscriptions)
|
|
58
|
+
subscription.dispose();
|
|
59
|
+
this.subscriptions = [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Validate untrusted browser geometry before creating the attached PTY. */
|
|
2
|
+
export function readTerminalHandshakeDimensions(params) {
|
|
3
|
+
const cols = Number(params.get('cols'));
|
|
4
|
+
const rows = Number(params.get('rows'));
|
|
5
|
+
if (!Number.isInteger(cols) || !Number.isInteger(rows)
|
|
6
|
+
|| cols < 1 || rows < 1 || cols > 1000 || rows > 1000)
|
|
7
|
+
return undefined;
|
|
8
|
+
return { cols, rows };
|
|
9
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** Per-observer output budget. A slow observer never pauses the shared PTY. */
|
|
2
|
+
export class TerminalOutputDelivery {
|
|
3
|
+
send;
|
|
4
|
+
flowControl;
|
|
5
|
+
windowBytes;
|
|
6
|
+
queueLimit;
|
|
7
|
+
onOverflow;
|
|
8
|
+
active = true;
|
|
9
|
+
replaying = true;
|
|
10
|
+
needsReplay = false;
|
|
11
|
+
queue = [];
|
|
12
|
+
queuedBytes = 0;
|
|
13
|
+
outstanding = [];
|
|
14
|
+
outstandingBytes = 0;
|
|
15
|
+
nextId = 1;
|
|
16
|
+
lastAck = 0;
|
|
17
|
+
constructor(send, flowControl, windowBytes = 128 * 1024, queueLimit = 512 * 1024, onOverflow) {
|
|
18
|
+
this.send = send;
|
|
19
|
+
this.flowControl = flowControl;
|
|
20
|
+
this.windowBytes = windowBytes;
|
|
21
|
+
this.queueLimit = queueLimit;
|
|
22
|
+
this.onOverflow = onOverflow;
|
|
23
|
+
}
|
|
24
|
+
setActive(active) {
|
|
25
|
+
const changed = active !== this.active;
|
|
26
|
+
this.active = active;
|
|
27
|
+
if (!active) {
|
|
28
|
+
this.queue = [];
|
|
29
|
+
this.queuedBytes = 0;
|
|
30
|
+
}
|
|
31
|
+
return changed;
|
|
32
|
+
}
|
|
33
|
+
enqueue(frame) {
|
|
34
|
+
if (!this.active || this.needsReplay)
|
|
35
|
+
return;
|
|
36
|
+
// Bound single frames too. PTY producers may deliver multi-megabyte chunks.
|
|
37
|
+
const bytes = Buffer.byteLength(frame.data);
|
|
38
|
+
if (bytes + this.queuedBytes > this.queueLimit) {
|
|
39
|
+
this.queue = [];
|
|
40
|
+
this.queuedBytes = 0;
|
|
41
|
+
this.needsReplay = true;
|
|
42
|
+
this.onOverflow?.();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.queue.push(frame);
|
|
46
|
+
this.queuedBytes += bytes;
|
|
47
|
+
this.flush();
|
|
48
|
+
}
|
|
49
|
+
acknowledge(id) {
|
|
50
|
+
if (!Number.isSafeInteger(id) || id <= this.lastAck || id >= this.nextId)
|
|
51
|
+
return;
|
|
52
|
+
this.lastAck = id;
|
|
53
|
+
while (this.outstanding.length && this.outstanding[0].id <= id) {
|
|
54
|
+
this.outstandingBytes -= this.outstanding.shift().bytes;
|
|
55
|
+
}
|
|
56
|
+
this.flush();
|
|
57
|
+
}
|
|
58
|
+
finishReplay(lastSeq) {
|
|
59
|
+
// Shell replay is captured after the async metadata lookup. Discard live
|
|
60
|
+
// frames covered by that snapshot before exposing newer queued output.
|
|
61
|
+
this.queue = this.queue.filter((frame) => frame.seq === undefined || frame.seq > lastSeq);
|
|
62
|
+
this.queuedBytes = this.queue.reduce((sum, frame) => sum + Buffer.byteLength(frame.data), 0);
|
|
63
|
+
this.outstanding = [];
|
|
64
|
+
this.outstandingBytes = 0;
|
|
65
|
+
this.needsReplay = false;
|
|
66
|
+
this.replaying = false;
|
|
67
|
+
this.flush();
|
|
68
|
+
}
|
|
69
|
+
get pendingBytes() { return this.queuedBytes + this.outstandingBytes; }
|
|
70
|
+
flush() {
|
|
71
|
+
if (!this.active || this.replaying || this.needsReplay)
|
|
72
|
+
return;
|
|
73
|
+
while (this.queue.length && (!this.flowControl || this.outstandingBytes < this.windowBytes)) {
|
|
74
|
+
const frame = this.queue.shift();
|
|
75
|
+
const bytes = Buffer.byteLength(frame.data);
|
|
76
|
+
this.queuedBytes -= bytes;
|
|
77
|
+
if (this.flowControl) {
|
|
78
|
+
const id = this.nextId++;
|
|
79
|
+
this.outstanding.push({ id, bytes });
|
|
80
|
+
this.outstandingBytes += bytes;
|
|
81
|
+
this.send({ ...frame, flowSeq: id });
|
|
82
|
+
}
|
|
83
|
+
else
|
|
84
|
+
this.send(frame);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function resolveTerminalReplayCursor(since, clientEpoch, epoch) {
|
|
89
|
+
return clientEpoch === epoch && Number.isSafeInteger(since) && since > 0 ? since : 0;
|
|
90
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Repaint through the existing PTY stream, preserving output order and modes.
|
|
2
|
+
* capture-pane is an observation of cells, not a terminal parser checkpoint.
|
|
3
|
+
* It must never be spliced into ongoing incremental output after a resize.
|
|
4
|
+
*/
|
|
5
|
+
export async function redrawTmuxClient(runTmux, sessionName, clientPid) {
|
|
6
|
+
if (typeof clientPid !== 'number')
|
|
7
|
+
return;
|
|
8
|
+
const clients = await runTmux([
|
|
9
|
+
'list-clients', '-t', sessionName, '-F', '#{client_pid} #{client_tty}',
|
|
10
|
+
]);
|
|
11
|
+
const client = clients.split('\n').map(line => line.trim().split(/\s+/))
|
|
12
|
+
.find(([pid]) => pid === String(clientPid));
|
|
13
|
+
// Never fall back to another attached client if this one exited.
|
|
14
|
+
if (client?.[1])
|
|
15
|
+
await runTmux(['refresh-client', '-t', client[1]]);
|
|
16
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const SYNC_END = '\x1b[?2026l';
|
|
2
|
+
/** Collect tmux's first synchronized redraw from its actual PTY stream.
|
|
3
|
+
* Return subsequent bytes to the live delivery queue without duplicating
|
|
4
|
+
* the initial screen in both connected.replayChunks and data frames.
|
|
5
|
+
*/
|
|
6
|
+
export class TmuxInitialScreen {
|
|
7
|
+
maxBytes;
|
|
8
|
+
ready;
|
|
9
|
+
resolve;
|
|
10
|
+
buffer = '';
|
|
11
|
+
bytes = 0;
|
|
12
|
+
done = false;
|
|
13
|
+
timer;
|
|
14
|
+
constructor(timeoutMs = 1500, maxBytes = 512 * 1024) {
|
|
15
|
+
this.maxBytes = maxBytes;
|
|
16
|
+
this.ready = new Promise(resolve => { this.resolve = resolve; });
|
|
17
|
+
// Compatibility escape hatch for a tmux build without synchronized
|
|
18
|
+
// output. Normal startup completes on the protocol boundary immediately.
|
|
19
|
+
this.timer = setTimeout(() => this.finish('timeout', this.buffer), timeoutMs);
|
|
20
|
+
this.timer.unref?.();
|
|
21
|
+
}
|
|
22
|
+
push(data) {
|
|
23
|
+
if (this.done)
|
|
24
|
+
return data;
|
|
25
|
+
this.bytes += Buffer.byteLength(data);
|
|
26
|
+
if (this.bytes > this.maxBytes) {
|
|
27
|
+
this.finish('overflow', '');
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
const searchFrom = Math.max(0, this.buffer.length - SYNC_END.length + 1);
|
|
31
|
+
this.buffer += data;
|
|
32
|
+
const end = this.buffer.indexOf(SYNC_END, searchFrom);
|
|
33
|
+
if (end < 0)
|
|
34
|
+
return '';
|
|
35
|
+
const boundary = end + SYNC_END.length;
|
|
36
|
+
const initial = this.buffer.slice(0, boundary);
|
|
37
|
+
const remainder = this.buffer.slice(boundary);
|
|
38
|
+
this.finish('complete', initial);
|
|
39
|
+
return remainder;
|
|
40
|
+
}
|
|
41
|
+
cancel() { this.finish('cancelled', ''); }
|
|
42
|
+
finish(status, data) {
|
|
43
|
+
if (this.done)
|
|
44
|
+
return;
|
|
45
|
+
this.done = true;
|
|
46
|
+
clearTimeout(this.timer);
|
|
47
|
+
this.buffer = '';
|
|
48
|
+
this.resolve({ status, data });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** PTY output wakes the check; tmux's exact client dimensions prove readiness.
|
|
2
|
+
* No polling or grace period. The timeout rejects failure, never grants success.
|
|
3
|
+
*/
|
|
4
|
+
export function waitForTmuxClientSize(readClients, onOutput, pid, cols, rows) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
let finished = false;
|
|
7
|
+
let checking = false;
|
|
8
|
+
let dirty = false;
|
|
9
|
+
let dispose = () => { };
|
|
10
|
+
const finish = (error) => {
|
|
11
|
+
if (finished)
|
|
12
|
+
return;
|
|
13
|
+
finished = true;
|
|
14
|
+
clearTimeout(timeout);
|
|
15
|
+
dispose();
|
|
16
|
+
if (error)
|
|
17
|
+
reject(error);
|
|
18
|
+
else
|
|
19
|
+
resolve();
|
|
20
|
+
};
|
|
21
|
+
const timeout = setTimeout(() => finish(new Error('tmux client has not applied PTY dimensions')), 500);
|
|
22
|
+
const check = async () => {
|
|
23
|
+
if (finished)
|
|
24
|
+
return;
|
|
25
|
+
dirty = true;
|
|
26
|
+
if (checking)
|
|
27
|
+
return;
|
|
28
|
+
checking = true;
|
|
29
|
+
try {
|
|
30
|
+
do {
|
|
31
|
+
dirty = false;
|
|
32
|
+
const clients = await readClients();
|
|
33
|
+
if (finished)
|
|
34
|
+
return;
|
|
35
|
+
const ready = clients.split('\n').some((line) => {
|
|
36
|
+
const [clientPid, width, height] = line.trim().split(/\s+/).map(Number);
|
|
37
|
+
return clientPid === pid && width === cols && height === rows;
|
|
38
|
+
});
|
|
39
|
+
if (ready) {
|
|
40
|
+
finish();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
} while (dirty && !finished);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
finish(error);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
checking = false;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// Subscribe before reading so output arriving during the query is not lost.
|
|
53
|
+
dispose = onOutput(() => { void check(); });
|
|
54
|
+
void check();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { authEvents, isAuthEnabled, isUpgradeRequestAuthenticated } from './authProtection.js';
|
|
2
|
+
/** Attach after application handlers. Recheck before input and during idle output. */
|
|
3
|
+
export function guardWebSocketSession(ws, cookie) {
|
|
4
|
+
const authenticatedAtConnect = isAuthEnabled();
|
|
5
|
+
const check = (touch = false) => {
|
|
6
|
+
if ((authenticatedAtConnect && !isAuthEnabled()) || !isUpgradeRequestAuthenticated(cookie, touch)) {
|
|
7
|
+
// terminate immediately: a close handshake alone can leave input flowing.
|
|
8
|
+
ws.terminate();
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return true;
|
|
12
|
+
};
|
|
13
|
+
const handlers = ws.listeners('message');
|
|
14
|
+
ws.removeAllListeners('message');
|
|
15
|
+
ws.on('message', (...args) => {
|
|
16
|
+
if (!check(true))
|
|
17
|
+
return;
|
|
18
|
+
for (const handler of handlers)
|
|
19
|
+
handler.apply(ws, args);
|
|
20
|
+
});
|
|
21
|
+
const timer = setInterval(check, 1000);
|
|
22
|
+
timer.unref();
|
|
23
|
+
authEvents.on('revoked', check);
|
|
24
|
+
ws.once('close', () => {
|
|
25
|
+
clearInterval(timer);
|
|
26
|
+
authEvents.off('revoked', check);
|
|
27
|
+
});
|
|
28
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "termdock",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.170",
|
|
4
4
|
"description": "A complete web-based terminal application with modern UI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": ".desktop-dist/main.js",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"desktop:dev": "npm run build && npm run build:desktop && electron-forge start",
|
|
29
29
|
"desktop:prepare": "npm run build && npm run build:desktop && node scripts/prepare-desktop-runtime.mjs",
|
|
30
30
|
"desktop:make": "node scripts/ensure-macos-appdmg.mjs && npm run desktop:prepare && electron-forge make",
|
|
31
|
-
"build:client": "vite build",
|
|
31
|
+
"build:client": "vite build && node scripts/precompress-client.mjs",
|
|
32
32
|
"build:server": "tsc -p tsconfig.server.json && node -e \"require('fs').chmodSync('dist/server/cli.js', 0o755)\"",
|
|
33
33
|
"build:runtime-manifest": "node scripts/generate-runtime-manifest.mjs",
|
|
34
34
|
"generate:pwa-assets": "pwa-assets-generator --config pwa-assets.config.ts",
|
|
@@ -67,13 +67,13 @@
|
|
|
67
67
|
"browser-haptic": "^1.0.13",
|
|
68
68
|
"busboy": "^1.6.0",
|
|
69
69
|
"cookie-parser": "^1.4.7",
|
|
70
|
-
"dompurify": "^3.4.
|
|
70
|
+
"dompurify": "^3.4.14",
|
|
71
71
|
"dotenv": "^17.4.2",
|
|
72
72
|
"express": "^5.2.1",
|
|
73
73
|
"heic-convert": "^2.1.0",
|
|
74
74
|
"katex": "^0.17.0",
|
|
75
75
|
"lucide-react": "^1.17.0",
|
|
76
|
-
"mermaid": "^11.
|
|
76
|
+
"mermaid": "^11.17.2",
|
|
77
77
|
"motion": "^12.40.0",
|
|
78
78
|
"multicast-dns": "^7.2.5",
|
|
79
79
|
"node-pty": "^1.1.0",
|
|
@@ -142,5 +142,8 @@
|
|
|
142
142
|
"homepage": "https://github.com/Jovines/termdock#readme",
|
|
143
143
|
"bugs": {
|
|
144
144
|
"url": "https://github.com/Jovines/termdock/issues"
|
|
145
|
+
},
|
|
146
|
+
"overrides": {
|
|
147
|
+
"prismjs": "^1.30.0"
|
|
145
148
|
}
|
|
146
149
|
}
|
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.170",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
|
-
"dependencyHash": "sha256
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256-
|
|
8
|
+
"dependencyHash": "sha256-/c1QpL8I/K1/8wYVjqa7fYdeLyBTU/rKXAewGrOlv5A=",
|
|
9
|
+
"serverBundleHash": "sha256-UnxPdyYPj72Onfz2xiJRjMo4a9sqZKuU5SQWxv+34FI=",
|
|
10
|
+
"clientBundleHash": "sha256-cCiR1ftP22xjjDpmpH11ITbCOOtGOCsltJzVRAukDxo=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Regenerate shipped terminal font shards (requires fonttools[woff]).
|
|
3
|
+
|
|
4
|
+
The complete fonts remain the editable source and compatibility fallback. Normal
|
|
5
|
+
builds use these checked-in, content-addressed shards without requiring Python.
|
|
6
|
+
Keep cmap coverage and advance widths exactly equal to the source faces.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import io
|
|
12
|
+
import json
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from fontTools import subset
|
|
16
|
+
from fontTools.ttLib import TTFont
|
|
17
|
+
|
|
18
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
19
|
+
FONTS = ROOT / "public/fonts"
|
|
20
|
+
OUTPUT = FONTS / "terminal"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def ranges(points: list[int]) -> str:
|
|
24
|
+
spans: list[list[int]] = []
|
|
25
|
+
for cp in sorted(points):
|
|
26
|
+
if spans and cp == spans[-1][1] + 1:
|
|
27
|
+
spans[-1][1] = cp
|
|
28
|
+
else:
|
|
29
|
+
spans.append([cp, cp])
|
|
30
|
+
return ",".join(f"U+{a:X}" if a == b else f"U+{a:X}-{b:X}" for a, b in spans)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def main() -> None:
|
|
34
|
+
OUTPUT.mkdir(exist_ok=True)
|
|
35
|
+
css: list[str] = ["/* Generated by scripts/generate-font-subsets.py; do not edit. */"]
|
|
36
|
+
manifest: dict[str, object] = {"schemaVersion": 1, "faces": []}
|
|
37
|
+
expected: set[str] = set()
|
|
38
|
+
for family, stems in [
|
|
39
|
+
("Termdock Mono", [f"JetBrainsMonoNLNerdFontMono-{w}" for w in ["Regular", "Bold", "Italic", "BoldItalic"]]),
|
|
40
|
+
("Noto Sans Mono CJK SC", ["NotoSansMonoCJKsc-Subset", "NotoSansMonoCJKsc-Bold-Subset"]),
|
|
41
|
+
]:
|
|
42
|
+
for stem in stems:
|
|
43
|
+
source = FONTS / f"{stem}.woff2"
|
|
44
|
+
original = TTFont(source)
|
|
45
|
+
cmap = original.getBestCmap()
|
|
46
|
+
groups: dict[str, list[int]] = {}
|
|
47
|
+
for cp in sorted(cmap):
|
|
48
|
+
if family == "Termdock Mono":
|
|
49
|
+
key = f"icons-{cp // 1024:x}" if 0xE000 <= cp <= 0xF8FF or 0xF0000 <= cp <= 0x10FFFF else "text"
|
|
50
|
+
else:
|
|
51
|
+
key = f"cjk-{cp // 256:x}" if 0x3400 <= cp <= 0x9FFF else "punctuation"
|
|
52
|
+
groups.setdefault(key, []).append(cp)
|
|
53
|
+
records = []
|
|
54
|
+
for key, points in groups.items():
|
|
55
|
+
font = TTFont(source, recalcTimestamp=False)
|
|
56
|
+
options = subset.Options()
|
|
57
|
+
options.recalc_timestamp = False
|
|
58
|
+
subsetter = subset.Subsetter(options=options)
|
|
59
|
+
subsetter.populate(unicodes=points)
|
|
60
|
+
subsetter.subset(font)
|
|
61
|
+
buffer = io.BytesIO()
|
|
62
|
+
font.save(buffer)
|
|
63
|
+
body = buffer.getvalue()
|
|
64
|
+
name = f"{stem}-{key}-{hashlib.sha256(body).hexdigest()[:12]}.woff2"
|
|
65
|
+
(OUTPUT / name).write_bytes(body)
|
|
66
|
+
expected.add(name)
|
|
67
|
+
# Verify both coverage and metrics rather than trusting the subsetter.
|
|
68
|
+
result = TTFont(io.BytesIO(body))
|
|
69
|
+
result_cmap = result.getBestCmap()
|
|
70
|
+
assert set(result_cmap) == set(points), name
|
|
71
|
+
for cp in points:
|
|
72
|
+
assert result["hmtx"].metrics[result_cmap[cp]][0] == original["hmtx"].metrics[cmap[cp]][0], (name, cp)
|
|
73
|
+
weight = 700 if "Bold" in stem else 400
|
|
74
|
+
style = "italic" if "Italic" in stem else "normal"
|
|
75
|
+
css.append(f'@font-face{{font-family:"{family}";src:url("/fonts/terminal/{name}") format("woff2");font-weight:{weight};font-style:{style};font-display:swap;unicode-range:{ranges(points)};}}')
|
|
76
|
+
records.append({"file": name, "bytes": len(body), "codepoints": len(points), "group": key})
|
|
77
|
+
manifest["faces"].append({"source": source.name, "sourceSha256": hashlib.sha256(source.read_bytes()).hexdigest(), "shards": records})
|
|
78
|
+
# Delete only generated font shards; the full source font pack is untouched.
|
|
79
|
+
for old in OUTPUT.glob("*.woff2"):
|
|
80
|
+
if old.name not in expected:
|
|
81
|
+
old.unlink()
|
|
82
|
+
(ROOT / "src/lib/terminal/fontFaces.css").write_text("\n".join(css) + "\n")
|
|
83
|
+
(OUTPUT / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
|
|
84
|
+
print(f"Generated {len(expected)} font shards; coverage and advance widths verified.")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
if __name__ == "__main__":
|
|
88
|
+
main()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import { brotliCompress, gzip, constants } from 'node:zlib';
|
|
5
|
+
|
|
6
|
+
const br = promisify(brotliCompress);
|
|
7
|
+
const gz = promisify(gzip);
|
|
8
|
+
const root = path.resolve(process.argv[2] || 'dist/client');
|
|
9
|
+
const extensions = new Set(['.js', '.mjs', '.css', '.html', '.json', '.svg', '.webmanifest', '.txt']);
|
|
10
|
+
|
|
11
|
+
async function visit(directory) {
|
|
12
|
+
// Bound compression concurrency: builds must not allocate one zlib context
|
|
13
|
+
// per Mermaid chunk or compete with the running terminal server.
|
|
14
|
+
for (const entry of await fs.readdir(directory, { withFileTypes: true })) {
|
|
15
|
+
const file = path.join(directory, entry.name);
|
|
16
|
+
if (entry.isDirectory()) await visit(file);
|
|
17
|
+
else if (entry.isFile() && extensions.has(path.extname(file))) {
|
|
18
|
+
const raw = await fs.readFile(file);
|
|
19
|
+
if (raw.length < 1024) continue;
|
|
20
|
+
const compressed = await br(raw, { params: { [constants.BROTLI_PARAM_QUALITY]: 9 } });
|
|
21
|
+
await fs.writeFile(`${file}.br`, compressed);
|
|
22
|
+
await fs.writeFile(`${file}.gz`, await gz(raw, { level: 7 }));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
await visit(root);
|
|
28
|
+
console.log('Prepared Brotli/gzip client assets.');
|