termdock 1.4.245 → 1.4.247
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/dist/client/apple-splash-default-1170x2532.png +0 -0
- package/dist/client/apple-splash-landscape-1136x640.png +0 -0
- package/dist/client/apple-splash-landscape-1334x750.png +0 -0
- package/dist/client/apple-splash-landscape-1792x828.png +0 -0
- package/dist/client/apple-splash-landscape-2048x1536.png +0 -0
- package/dist/client/apple-splash-landscape-2160x1620.png +0 -0
- package/dist/client/apple-splash-landscape-2208x1242.png +0 -0
- package/dist/client/apple-splash-landscape-2224x1668.png +0 -0
- package/dist/client/apple-splash-landscape-2266x1488.png +0 -0
- package/dist/client/apple-splash-landscape-2360x1640.png +0 -0
- package/dist/client/apple-splash-landscape-2388x1668.png +0 -0
- package/dist/client/apple-splash-landscape-2436x1125.png +0 -0
- package/dist/client/apple-splash-landscape-2532x1170.png +0 -0
- package/dist/client/apple-splash-landscape-2556x1179.png +0 -0
- package/dist/client/apple-splash-landscape-2622x1206.png +0 -0
- package/dist/client/apple-splash-landscape-2688x1242.png +0 -0
- package/dist/client/apple-splash-landscape-2732x2048.png +0 -0
- package/dist/client/apple-splash-landscape-2778x1284.png +0 -0
- package/dist/client/apple-splash-landscape-2796x1290.png +0 -0
- package/dist/client/apple-splash-landscape-2868x1320.png +0 -0
- package/dist/client/apple-splash-portrait-1125x2436.png +0 -0
- package/dist/client/apple-splash-portrait-1170x2532.png +0 -0
- package/dist/client/apple-splash-portrait-1179x2556.png +0 -0
- package/dist/client/apple-splash-portrait-1206x2622.png +0 -0
- package/dist/client/apple-splash-portrait-1242x2208.png +0 -0
- package/dist/client/apple-splash-portrait-1242x2688.png +0 -0
- package/dist/client/apple-splash-portrait-1284x2778.png +0 -0
- package/dist/client/apple-splash-portrait-1290x2796.png +0 -0
- package/dist/client/apple-splash-portrait-1320x2868.png +0 -0
- package/dist/client/apple-splash-portrait-1488x2266.png +0 -0
- package/dist/client/apple-splash-portrait-1536x2048.png +0 -0
- package/dist/client/apple-splash-portrait-1620x2160.png +0 -0
- package/dist/client/apple-splash-portrait-1640x2360.png +0 -0
- package/dist/client/apple-splash-portrait-1668x2224.png +0 -0
- package/dist/client/apple-splash-portrait-1668x2388.png +0 -0
- package/dist/client/apple-splash-portrait-2048x2732.png +0 -0
- package/dist/client/apple-splash-portrait-640x1136.png +0 -0
- package/dist/client/apple-splash-portrait-750x1334.png +0 -0
- package/dist/client/apple-splash-portrait-828x1792.png +0 -0
- package/dist/client/apple-touch-icon-180x180.png +0 -0
- package/dist/client/assets/{App-4yuJhk8K.js → App-BDty62Kk.js} +3 -3
- package/dist/client/assets/App-BDty62Kk.js.br +0 -0
- package/dist/client/assets/App-BDty62Kk.js.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-CO6hA8Zz.js → ChangeWalkthroughPanel-CxkUSDes.js} +1 -1
- package/dist/client/assets/ChangeWalkthroughPanel-CxkUSDes.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-CxkUSDes.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-CYNBQUiS.js → DagPlayground-BhuxmcCV.js} +1 -1
- package/dist/client/assets/DagPlayground-BhuxmcCV.js.br +0 -0
- package/dist/client/assets/DagPlayground-BhuxmcCV.js.gz +0 -0
- package/dist/client/assets/{DiffLab-D1EGXPSO.js → DiffLab-CYgVdf6M.js} +1 -1
- package/dist/client/assets/DiffLab-CYgVdf6M.js.br +0 -0
- package/dist/client/assets/DiffLab-CYgVdf6M.js.gz +0 -0
- package/dist/client/assets/{DiffReview-B3l9lyZN.js → DiffReview-tZp8igpn.js} +1 -1
- package/dist/client/assets/DiffReview-tZp8igpn.js.br +0 -0
- package/dist/client/assets/DiffReview-tZp8igpn.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-HnyTETr4.js → DiffReviewLab-D3DEF3Uv.js} +1 -1
- package/dist/client/assets/DiffReviewLab-D3DEF3Uv.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-D3DEF3Uv.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-Cg2L1fpw.js → DiffViewer-DvP6iXpD.js} +1 -1
- package/dist/client/assets/DiffViewer-DvP6iXpD.js.br +0 -0
- package/dist/client/assets/DiffViewer-DvP6iXpD.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-m9zsjnCS.js → ModelPreview-2hdKSHrI.js} +1 -1
- package/dist/client/assets/ModelPreview-2hdKSHrI.js.br +0 -0
- package/dist/client/assets/ModelPreview-2hdKSHrI.js.gz +0 -0
- package/dist/client/assets/{RightSidebar-D8UOa663.js → RightSidebar-BPn8cO-W.js} +4 -4
- package/dist/client/assets/RightSidebar-BPn8cO-W.js.br +0 -0
- package/dist/client/assets/RightSidebar-BPn8cO-W.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-B6aAcqAH.js → abnfDiagram-VCTEODGH-Ci-VUnN9.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-Ci-VUnN9.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-Ci-VUnN9.js.gz +0 -0
- package/dist/client/assets/app-Cs_Q5pAC.js +35 -0
- package/dist/client/assets/app-Cs_Q5pAC.js.br +0 -0
- package/dist/client/assets/app-Cs_Q5pAC.js.gz +0 -0
- package/dist/client/assets/{arc-MDwycufi.js → arc-B8fvq2_P.js} +1 -1
- package/dist/client/assets/arc-B8fvq2_P.js.br +0 -0
- package/dist/client/assets/arc-B8fvq2_P.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-DpW68CEx.js → architectureDiagram-5GKGNRK7-OBeKtuBG.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-OBeKtuBG.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-OBeKtuBG.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CZQQVsmh.js → blockDiagram-I7D4REHJ-BUOU_cl8.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-BUOU_cl8.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-BUOU_cl8.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-DjvDIEs1.js → c4Diagram-7LVT6UL2-Qpx1DCv2.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-Qpx1DCv2.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Qpx1DCv2.js.gz +0 -0
- package/dist/client/assets/channel-C0TVm2mO.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-C7cBdwoS.js → chunk-2Q5K7J3B-C6tpRlFu.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-DdwZ_Ooa.js → chunk-5VM5RSS4-C1PImfe4.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-CyDTfLmz.js → chunk-F27PBJKO-CvbHkCRN.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-CvbHkCRN.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CvbHkCRN.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-BYCj4545.js → chunk-IMKFNOWR-P1FyXJXz.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-P1FyXJXz.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-P1FyXJXz.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-Buwl5THX.js → chunk-JWPE2WC7-C8mWANKk.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-C7p1ptYd.js → chunk-POPQ4Y6H-DDSPZulQ.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-Biy6yZrB.js → chunk-SVP7TREG-Bh9Y6Jr-.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-Bh9Y6Jr-.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Bh9Y6Jr-.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-8e9Sd9jU.js → chunk-TICWLB2K-DnrwzqK1.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-DnrwzqK1.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DnrwzqK1.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-DECwND6H.js → chunk-XXDRQBXY-DtzSRWIw.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-Bzkbt-xD.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-Bzkbt-xD.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-PPh2sDUy.js → cose-bilkent-JH36ORCC-BuF2HtWL.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-BuF2HtWL.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-BuF2HtWL.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-B11p1v5N.js → cynefin-OW5HDTMX-DfyAdx1n.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-DfyAdx1n.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DfyAdx1n.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-BKyWp8p1.js → cynefinDiagram-5FMLGOSQ-DC3DO7Lb.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DC3DO7Lb.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DC3DO7Lb.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-B79CVuuK.js → dagre-GXQ25YYZ-BZ2xk9c1.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-BZ2xk9c1.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-BZ2xk9c1.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-BKPJHT5i.js → diagram-S7CK7UJ4-DN_5hPML.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DN_5hPML.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DN_5hPML.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-adkntJ-H.js → diagram-UQ7AKVKN-Db8fjjXs.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-Db8fjjXs.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-Db8fjjXs.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-CGOHyiQX.js → diagram-VSXAHHWV-BK0r1kdu.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-BK0r1kdu.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BK0r1kdu.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-C6uqmbvW.js → diagram-VX7I27RA-CUqffHxG.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-CUqffHxG.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CUqffHxG.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-DRbP0rNc.js → diagram-Z3DM3KII-D1MBNfci.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-D1MBNfci.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-D1MBNfci.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-ZH3JjPxG.js → ebnfDiagram-PWID7BFC-Dc-4AttC.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Dc-4AttC.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Dc-4AttC.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-2pB0nAqM.js → erDiagram-RLTQ6QDP-C9IHrclR.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-C9IHrclR.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-C9IHrclR.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-g-NFSGVN.js → flowDiagram-HODETNUW-DxUiy01E.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-DxUiy01E.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-DxUiy01E.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-ou0k7MyH.js → ganttDiagram-EL5Y4UJY-BGeAidmz.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BGeAidmz.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-BGeAidmz.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-BVGXbPvq.js → gestureArbiter-Bw8uUw_p.js} +1 -1
- package/dist/client/assets/gestureArbiter-Bw8uUw_p.js.br +0 -0
- package/dist/client/assets/gestureArbiter-Bw8uUw_p.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-9FN50t1H.js → gitGraphDiagram-WWUBYQGX-553Qx0ML.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-553Qx0ML.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-553Qx0ML.js.gz +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CDTlLBns.js → infoDiagram-27XIBGKW-DDPq7KlH.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DJigQx1g.js → ishikawaDiagram-5VMMS53U-DT74d8Pp.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DT74d8Pp.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DT74d8Pp.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-D2B7mocZ.js → journeyDiagram-3NMN7TZE-D_Wxj2Xv.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-D_Wxj2Xv.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-D_Wxj2Xv.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-Dibgxrol.js → kanban-definition-UXKFOSKX-DLX35yh7.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-DLX35yh7.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-DLX35yh7.js.gz +0 -0
- package/dist/client/assets/{layout-l7vsNiDT.js → layout-B59jVmB2.js} +1 -1
- package/dist/client/assets/layout-B59jVmB2.js.br +0 -0
- package/dist/client/assets/layout-B59jVmB2.js.gz +0 -0
- package/dist/client/assets/{linear-DYyWv-7A.js → linear-B9n7YHBO.js} +1 -1
- package/dist/client/assets/linear-B9n7YHBO.js.br +0 -0
- package/dist/client/assets/linear-B9n7YHBO.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-filx9uhD.js → mermaid.core-Cv1IKi5b.js} +5 -5
- package/dist/client/assets/mermaid.core-Cv1IKi5b.js.br +0 -0
- package/dist/client/assets/mermaid.core-Cv1IKi5b.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-fs33msHm.js → mindmap-definition-YA3MSWOX-CZt_3-JK.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-CZt_3-JK.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-CZt_3-JK.js.gz +0 -0
- package/dist/client/assets/{passwordBootstrap-v6a4CT6d.js → passwordBootstrap-B9SjYaCE.js} +1 -1
- package/dist/client/assets/passwordBootstrap-B9SjYaCE.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-B9SjYaCE.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-mdj0nBrT.js → pegDiagram-XKGWAZYB-Ltof8aAd.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-Ltof8aAd.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Ltof8aAd.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-YoRrPBgl.js → pieDiagram-E7YTZNPT-Bef0wElK.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-Bef0wElK.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Bef0wElK.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-DgZmaoSe.js → quadrantDiagram-AXDQQJYC-ClTyow_w.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-ClTyow_w.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-ClTyow_w.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-CnBSlDaa.js → railroadDiagram-O6MQD6OU-BcNsQrjf.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BcNsQrjf.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-BcNsQrjf.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-DJsVBw_j.js → referenceLongPress-AOtZCb9C.js} +1 -1
- package/dist/client/assets/referenceLongPress-AOtZCb9C.js.br +0 -0
- package/dist/client/assets/referenceLongPress-AOtZCb9C.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BA9ZoM3G.js → requirementDiagram-BXWQKSXE-i9Gtousl.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-i9Gtousl.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-i9Gtousl.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-bcxqUb6q.js → sankeyDiagram-P5KCCOFB-Dt-wGVVq.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-Dt-wGVVq.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-Dt-wGVVq.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-TLqeD9u8.js → sequenceDiagram-WJ2MYXX4-DQWC7uut.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DQWC7uut.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-DQWC7uut.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-D180O8mH.js → sizeCapture-INFHLROL-j7xNWJcU.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-j7xNWJcU.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-j7xNWJcU.js.gz +0 -0
- package/dist/client/assets/{sparkles-B2dq58Vr.js → sparkles-BRkfjZjN.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-CVeaj7aj.js → stateDiagram-D77RDMKH-M3TX8Erj.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-M3TX8Erj.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-M3TX8Erj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-_ulPeuS5.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-BSfkryAI.js → swimlanes-42K2YHIH-CxGcmQrd.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-CxGcmQrd.js.br +0 -0
- package/dist/client/assets/{swimlanes-42K2YHIH-BSfkryAI.js.gz → swimlanes-42K2YHIH-CxGcmQrd.js.gz} +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-BW2bKIPD.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-CXrJcUqt.js → timeline-definition-24CTP7MA-CUyya42z.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-CUyya42z.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CUyya42z.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-DiB-zDg8.js → triangle-alert-B6SvdIgg.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DUlZIoBs.js → vennDiagram-4TSXK5OY-Cm01D51L.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DUlZIoBs.js.br → vennDiagram-4TSXK5OY-Cm01D51L.js.br} +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-Cm01D51L.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-PW7fiK5-.js → wardleyDiagram-VM6X3IG4-CLA4d4s3.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CLA4d4s3.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-CLA4d4s3.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-CGgWBXnk.js → xychartDiagram-S5SC5T6Z-Cvnk40o2.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Cvnk40o2.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Cvnk40o2.js.gz +0 -0
- package/dist/client/favicon.ico +0 -0
- package/dist/client/fonts/JetBrainsMonoNLNerdFontMono-Bold.woff2 +0 -0
- package/dist/client/fonts/JetBrainsMonoNLNerdFontMono-BoldItalic.woff2 +0 -0
- package/dist/client/fonts/JetBrainsMonoNLNerdFontMono-Italic.woff2 +0 -0
- package/dist/client/fonts/JetBrainsMonoNLNerdFontMono-Regular.woff2 +0 -0
- package/dist/client/fonts/NotoSansMonoCJKsc-Bold-Subset.woff2 +0 -0
- package/dist/client/fonts/NotoSansMonoCJKsc-Subset.woff2 +0 -0
- package/dist/client/fonts/NotoSansSymbols2-Subset.woff2 +0 -0
- package/dist/client/fonts/TermdockStarSymbol-Subset.woff2 +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/index.html +1 -1
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/collaborationCli.js +36 -3
- package/dist/server/agent/collaborationDeliveryWorker.js +5 -0
- package/dist/server/agent/collaborationPeerTransport.js +8 -1
- package/dist/server/agent/collaborationService.js +77 -11
- package/dist/server/entry.js +11 -1
- package/dist/server/federation/runtime.js +50 -3
- package/dist/server/routes/terminal.js +13 -0
- package/package.json +1 -1
- package/runtime-manifest.json +3 -3
- package/dist/client/assets/App-4yuJhk8K.js.br +0 -0
- package/dist/client/assets/App-4yuJhk8K.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-CO6hA8Zz.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-CO6hA8Zz.js.gz +0 -0
- package/dist/client/assets/DagPlayground-CYNBQUiS.js.br +0 -0
- package/dist/client/assets/DagPlayground-CYNBQUiS.js.gz +0 -0
- package/dist/client/assets/DiffLab-D1EGXPSO.js.br +0 -0
- package/dist/client/assets/DiffLab-D1EGXPSO.js.gz +0 -0
- package/dist/client/assets/DiffReview-B3l9lyZN.js.br +0 -0
- package/dist/client/assets/DiffReview-B3l9lyZN.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-HnyTETr4.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-HnyTETr4.js.gz +0 -0
- package/dist/client/assets/DiffViewer-Cg2L1fpw.js.br +0 -0
- package/dist/client/assets/DiffViewer-Cg2L1fpw.js.gz +0 -0
- package/dist/client/assets/ModelPreview-m9zsjnCS.js.br +0 -0
- package/dist/client/assets/ModelPreview-m9zsjnCS.js.gz +0 -0
- package/dist/client/assets/RightSidebar-D8UOa663.js.br +0 -0
- package/dist/client/assets/RightSidebar-D8UOa663.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-B6aAcqAH.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-B6aAcqAH.js.gz +0 -0
- package/dist/client/assets/app-DiN3Jz4F.js +0 -35
- package/dist/client/assets/app-DiN3Jz4F.js.br +0 -0
- package/dist/client/assets/app-DiN3Jz4F.js.gz +0 -0
- package/dist/client/assets/arc-MDwycufi.js.br +0 -0
- package/dist/client/assets/arc-MDwycufi.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DpW68CEx.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DpW68CEx.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CZQQVsmh.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CZQQVsmh.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DjvDIEs1.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-DjvDIEs1.js.gz +0 -0
- package/dist/client/assets/channel-DXQeuo6Q.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-CyDTfLmz.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CyDTfLmz.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BYCj4545.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-BYCj4545.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Biy6yZrB.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-Biy6yZrB.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-8e9Sd9jU.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-8e9Sd9jU.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-u-fQC4d0.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-u-fQC4d0.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-PPh2sDUy.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-PPh2sDUy.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-B11p1v5N.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-B11p1v5N.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BKyWp8p1.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-BKyWp8p1.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B79CVuuK.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-B79CVuuK.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BKPJHT5i.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-BKPJHT5i.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-adkntJ-H.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-adkntJ-H.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CGOHyiQX.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-CGOHyiQX.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C6uqmbvW.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-C6uqmbvW.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DRbP0rNc.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-DRbP0rNc.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-ZH3JjPxG.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-ZH3JjPxG.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-2pB0nAqM.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-2pB0nAqM.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-g-NFSGVN.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-g-NFSGVN.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-ou0k7MyH.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-ou0k7MyH.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-BVGXbPvq.js.br +0 -0
- package/dist/client/assets/gestureArbiter-BVGXbPvq.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-9FN50t1H.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-9FN50t1H.js.gz +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DJigQx1g.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-DJigQx1g.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-D2B7mocZ.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-D2B7mocZ.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Dibgxrol.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-Dibgxrol.js.gz +0 -0
- package/dist/client/assets/layout-l7vsNiDT.js.br +0 -0
- package/dist/client/assets/layout-l7vsNiDT.js.gz +0 -0
- package/dist/client/assets/linear-DYyWv-7A.js.br +0 -0
- package/dist/client/assets/linear-DYyWv-7A.js.gz +0 -0
- package/dist/client/assets/mermaid.core-filx9uhD.js.br +0 -0
- package/dist/client/assets/mermaid.core-filx9uhD.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-fs33msHm.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-fs33msHm.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-v6a4CT6d.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-v6a4CT6d.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-mdj0nBrT.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-mdj0nBrT.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-YoRrPBgl.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-YoRrPBgl.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DgZmaoSe.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-DgZmaoSe.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CnBSlDaa.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-CnBSlDaa.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-DJsVBw_j.js.br +0 -0
- package/dist/client/assets/referenceLongPress-DJsVBw_j.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BA9ZoM3G.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BA9ZoM3G.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-bcxqUb6q.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-bcxqUb6q.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-TLqeD9u8.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-TLqeD9u8.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-D180O8mH.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-D180O8mH.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CVeaj7aj.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CVeaj7aj.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-Cja01XE6.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH-BSfkryAI.js.br +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-Bt2D90qE.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-CXrJcUqt.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CXrJcUqt.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DUlZIoBs.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-PW7fiK5-.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-PW7fiK5-.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CGgWBXnk.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CGgWBXnk.js.gz +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/client/index.html
CHANGED
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
里为空,不声明,避免无谓的字体回退查找。
|
|
189
189
|
Regular + Bold 两种变体自托管,替代 xterm 合成 bold CJK。 */
|
|
190
190
|
</style>
|
|
191
|
-
<script type="module" crossorigin src="/assets/app-
|
|
191
|
+
<script type="module" crossorigin src="/assets/app-Cs_Q5pAC.js"></script>
|
|
192
192
|
<link rel="modulepreload" crossorigin href="/assets/react-XDCjal2T.js">
|
|
193
193
|
<link rel="modulepreload" crossorigin href="/assets/dnd-BCFAPC0L.js">
|
|
194
194
|
<link rel="modulepreload" crossorigin href="/assets/terminal-C7X98Amf.js">
|
|
Binary file
|
|
Binary file
|
package/dist/client/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,o)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(s[a])return;let c={};const r=e=>n(e,a),d={module:{uri:a},exports:c,require:r};s[a]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(o(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"
|
|
1
|
+
if(!self.define){let e,s={};const n=(n,i)=>(n=new URL(n+".js",i).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(i,o)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(s[a])return;let c={};const r=e=>n(e,a),d={module:{uri:a},exports:c,require:r};s[a]=Promise.all(i.map(e=>d[e]||r(e))).then(e=>(o(...e),c))}}define(["./workbox-9845bf53"],function(e){"use strict";importScripts("sw-encrypted-background.js","sw-notifications.js","sw-secure-api.js","sw-downloads.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"7a1b8ea45b07e7de857a9dc039051c63"},{url:"assets/app-Cs_Q5pAC.js",revision:null},{url:"assets/react-XDCjal2T.js",revision:null},{url:"assets/dnd-BCFAPC0L.js",revision:null},{url:"assets/terminal-C7X98Amf.js",revision:null},{url:"assets/index-fjWWhVQp.css",revision:null},{url:"icons/agents/opencode.svg",revision:"851c2931d95821ba2b39b68587b48976"},{url:"icons/agents/kimi.svg",revision:"5366c710f4f763022fe159a69cf17409"},{url:"icons/agents/grok.svg",revision:"cd745b0b964545bc7a6b4f36021c3298"},{url:"icons/agents/goose.svg",revision:"c79b927278983c19098d77b4b0c11ab3"},{url:"icons/agents/gemini.svg",revision:"7a64f6d6f80a908255e9c0256903882e"},{url:"icons/agents/droid.svg",revision:"f28723b8c5c115e0908ba3c72613e256"},{url:"icons/agents/cursor.svg",revision:"a1528f3d3cda497f75a5db28defb19de"},{url:"icons/agents/copilot.svg",revision:"dd52e96c1eac0b6ec4bedcd0ddd3b52d"},{url:"icons/agents/codex.svg",revision:"608e55babb0b217e1f2da287342b46d3"},{url:"icons/agents/claude.svg",revision:"08af0225b7acdd8e8f573f3247e5e1c3"},{url:"icons/agents/amp.svg",revision:"af12f8b33faa81e4d46ea7b93c7e43f3"},{url:"apple-touch-icon-180x180.png",revision:"628c2e2f28a9b545aa57be1352025643"},{url:"favicon.ico",revision:"2994debfa6f59a0898e24eb0c54d64b5"},{url:"maskable-icon-512x512.png",revision:"4d489331fd81f0713c400b26426442b9"},{url:"pwa-192x192.png",revision:"4d6f899888cfb8ccd7a1fd3c9e583ad2"},{url:"pwa-512x512.png",revision:"0885dd7ec8932e7f878b013d51a380a4"},{url:"robots.txt",revision:"d9339907142917dee4aac78494ac9cfe"},{url:"sw-downloads.js",revision:"48dab2e78bd93b4eee27fca487eccfde"},{url:"sw-notifications.js",revision:"fde578590ea8b0540d488ef448b48f45"},{url:"sw-secure-api.js",revision:"cf2bdbd03d41d66d60344c0b5a1075de"},{url:"manifest.webmanifest",revision:"83f9a43b74c236012adafb077fb6d774"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//,/^\/__termdock-download\//,/^\/health$/]})),e.registerRoute(/\/assets\/.*\.(?:js|css)$/,new e.CacheFirst({cacheName:"termdock-lazy-assets-v1",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:96,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/terminal\/[^/]+-[a-f0-9]{12}\.woff2$/,new e.CacheFirst({cacheName:"termdock-fonts-v2",plugins:[new e.CacheableResponsePlugin({statuses:[0,200]}),new e.ExpirationPlugin({maxEntries:384,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/fonts\/.*\.(?:woff2|ttf)$/,new e.StaleWhileRevalidate({cacheName:"termdock-fonts-v1",plugins:[new e.ExpirationPlugin({maxEntries:24,maxAgeSeconds:2592e3})]}),"GET")});
|
package/dist/client/sw.js.br
CHANGED
|
Binary file
|
package/dist/client/sw.js.gz
CHANGED
|
Binary file
|
|
@@ -107,7 +107,12 @@ cleanup without --confirm prints the plan and refuses (also 1);
|
|
|
107
107
|
Message limit: ${COLLAB_LIMITS.message_bytes} UTF-8 bytes; metadata: ${COLLAB_LIMITS.metadata_bytes} bytes.
|
|
108
108
|
Idempotency retention: 7 days. Terminal delivery, ACK and result never imply each other.
|
|
109
109
|
Delivery semantics: delivered = written to the terminal — never proof of
|
|
110
|
-
reading or task completion; a timeout stops waiting, it does not cancel delivery
|
|
110
|
+
reading or task completion; a timeout stops waiting, it does not cancel delivery.
|
|
111
|
+
The service cannot see whether the recipient's agent consumed a message. To
|
|
112
|
+
judge for yourself, use --wait-until delivered and read the recipient-screen
|
|
113
|
+
snapshot in the receipt: if your message is not visible on that screen, send it
|
|
114
|
+
again (a fresh send is a new message and will be written again); if it is
|
|
115
|
+
visible but unanswered, the recipient may simply not have started yet.`;
|
|
111
116
|
/** One roster row: prefer the member's human name, keep the full session id
|
|
112
117
|
* reachable for role set/unset targeting, mark unset members explicitly. */
|
|
113
118
|
function roleLine(member, role) {
|
|
@@ -308,6 +313,25 @@ export function waitSatisfied(receipt, stage, reply) {
|
|
|
308
313
|
const reached = stage === 'queued' || (stage === 'delivered' && ['delivered', 'read'].includes(receipt.status));
|
|
309
314
|
return reached && (!reply || (reply === 'ack' ? receipt.ack_at != null : reply === 'result' ? receipt.result_ids?.length > 0 : receipt.reply_ids?.length > 0));
|
|
310
315
|
}
|
|
316
|
+
/** Delivery diagnoses a sender can act on. `delivered` means the bytes reached
|
|
317
|
+
* the recipient's pty — never that anything consumed them; these map the
|
|
318
|
+
* machine reasons onto what the sender should do next, so a settled-but-
|
|
319
|
+
* unconsumed message is not mistaken for a lost one (or a good one). */
|
|
320
|
+
const DELIVERY_DIAGNOSTICS = {
|
|
321
|
+
AGENT_CONSUME_UNCONFIRMED: '消息已写入对方终端,但未确认被对方消费;它可能尚未开始处理,可用 capture 查看当前屏幕或重发',
|
|
322
|
+
SHELL_CONFIRMATION_REQUIRED: '目标当前是 shell,消息可能被当命令执行;确认请运行 message confirm-shell <id>',
|
|
323
|
+
DELIVERY_IN_PROGRESS: '投递进行中(写入前的中间标记,正常会在数秒内推进为 delivered 或带原因的重试)',
|
|
324
|
+
TERMINAL_WRITE_FAILED: '写入对方终端失败,会按重试间隔继续尝试',
|
|
325
|
+
TMUX_PANE_CHANGED: '目标面板已变化,投递已跳过,等待重新绑定',
|
|
326
|
+
TMUX_PANE_IN_MODE: '目标面板处于 tmux 模式(如滚动查看),按键已跳过',
|
|
327
|
+
};
|
|
328
|
+
export function deliveryDiagnosticText(lastError) {
|
|
329
|
+
if (typeof lastError !== 'string' || !lastError)
|
|
330
|
+
return '';
|
|
331
|
+
const code = lastError.split(':', 1)[0].trim();
|
|
332
|
+
const known = DELIVERY_DIAGNOSTICS[code];
|
|
333
|
+
return known ? `${code}:${known}` : lastError;
|
|
334
|
+
}
|
|
311
335
|
export async function executeCollaborationCommand(command, context, io) {
|
|
312
336
|
const o = command.options;
|
|
313
337
|
const now = io.now ?? Date.now;
|
|
@@ -329,6 +353,7 @@ export async function executeCollaborationCommand(command, context, io) {
|
|
|
329
353
|
};
|
|
330
354
|
const output = (value) => {
|
|
331
355
|
if (o.text) {
|
|
356
|
+
let diagnosed = false;
|
|
332
357
|
if (Array.isArray(value.messages))
|
|
333
358
|
for (const message of value.messages) {
|
|
334
359
|
const fanIds = Array.isArray(message.fanOutIds) ? message.fanOutIds : [];
|
|
@@ -346,6 +371,14 @@ export async function executeCollaborationCommand(command, context, io) {
|
|
|
346
371
|
if (!o['no-rules'] && value.message.instructions?.text)
|
|
347
372
|
io.write(`消息附群规版本 ${value.message.instructions.version};td collab rules get <组id> --text 查看全文`);
|
|
348
373
|
io.write(`[${value.status}] ${canonicalShortId(String(value.message_id ?? ''))}\n${value.message.content}`);
|
|
374
|
+
// A pending message keeps retrying by design (the alternative is
|
|
375
|
+
// dropping it); surface why and when the next attempt is so the sender
|
|
376
|
+
// can decide to wait or resend instead of guessing.
|
|
377
|
+
if (value.status === 'pending' && (value.attempt_count || value.last_error)) {
|
|
378
|
+
const retryIn = value.next_retry_at ? Math.max(0, Math.ceil((Number(value.next_retry_at) - now()) / 1000)) : null;
|
|
379
|
+
io.write(`投递中:第 ${value.attempt_count ?? 0} 次尝试${retryIn !== null ? `,下次重试约 ${retryIn} 秒后` : ''}${value.last_error ? `,最近原因 ${deliveryDiagnosticText(value.last_error)}` : ''}`);
|
|
380
|
+
diagnosed = true;
|
|
381
|
+
}
|
|
349
382
|
}
|
|
350
383
|
else if (value.message_id) {
|
|
351
384
|
io.write(`${value.status} ${canonicalShortId(String(value.message_id))}${value.thread_id ? ` thread=${canonicalShortId(String(value.thread_id))}` : ''}${value.code ? ` ${value.code}` : ''}${value.failure_reason ? ` ${value.failure_reason}` : ''}`);
|
|
@@ -363,8 +396,8 @@ export async function executeCollaborationCommand(command, context, io) {
|
|
|
363
396
|
}
|
|
364
397
|
else
|
|
365
398
|
io.write(JSON.stringify(value, null, 2));
|
|
366
|
-
if (value.last_error)
|
|
367
|
-
io.write(
|
|
399
|
+
if (value.last_error && !diagnosed)
|
|
400
|
+
io.write(`诊断:${deliveryDiagnosticText(value.last_error)}`);
|
|
368
401
|
if (value.next_cursor)
|
|
369
402
|
io.write(`next_cursor=${value.next_cursor} has_more=${value.has_more}`);
|
|
370
403
|
}
|
|
@@ -176,7 +176,12 @@ export class CollaborationDeliveryWorker {
|
|
|
176
176
|
// Capture the recipient terminal before marking delivered, so a sender
|
|
177
177
|
// waiting on delivered always finds the snapshot present. The capture is
|
|
178
178
|
// strictly best-effort: a failure must never block delivery completion.
|
|
179
|
+
// Delayed briefly so the pane shows the rendered paste rather than the
|
|
180
|
+
// input box mid-write.
|
|
179
181
|
if (route.capture) {
|
|
182
|
+
const snapshotDelay = this.options.snapshotDelayMs ?? 200;
|
|
183
|
+
if (snapshotDelay > 0)
|
|
184
|
+
await new Promise((resolve) => setTimeout(resolve, snapshotDelay));
|
|
180
185
|
try {
|
|
181
186
|
const snapshot = await route.capture();
|
|
182
187
|
if (snapshot)
|
|
@@ -302,8 +302,13 @@ export class CollaborationPeerTransport {
|
|
|
302
302
|
|| typeof message.toSessionId !== 'string' || !message.toSessionId.startsWith(`remote:${encodeURIComponent(b.localOrigin)}:`)
|
|
303
303
|
|| Buffer.byteLength(JSON.stringify(message)) > COLLAB_LIMITS.wire_bytes)
|
|
304
304
|
throw new Error('INVALID_PEER_MESSAGE');
|
|
305
|
+
const localTarget = localSession(b.localOrigin, message.toSessionId);
|
|
306
|
+
// A session-scoped peer may only ever reach the sessions its inviter granted.
|
|
307
|
+
const scope = this.options.scopeFor?.(subjectId);
|
|
308
|
+
if (scope !== undefined && !scope.includes(localTarget))
|
|
309
|
+
throw new Error('SESSION_SCOPE_DENIED');
|
|
305
310
|
const incoming = { ...message, fromSessionId: remoteSession(b.peer.origin, message.fromSessionId),
|
|
306
|
-
toSessionId:
|
|
311
|
+
toSessionId: localTarget, status: 'pending', deliveredAt: null, readAt: null,
|
|
307
312
|
snapshot: null, deliverySource: undefined, readSource: undefined, shellConfirmed: message.shellConfirmed === true };
|
|
308
313
|
const existing = store.getMessage(message.id);
|
|
309
314
|
if (existing && (existing.groupId !== incoming.groupId || existing.fromSessionId !== incoming.fromSessionId
|
|
@@ -402,7 +407,9 @@ export class CollaborationPeerTransport {
|
|
|
402
407
|
}
|
|
403
408
|
async sync(b) {
|
|
404
409
|
const store = this.options.store, key = `${b.groupId}:${b.peer.serviceId}`;
|
|
410
|
+
const scope = this.options.scopeFor?.(b.peer.serviceId);
|
|
405
411
|
const messages = store.federationSnapshot().messages.filter(m => m.groupId === b.groupId).filter(m => !m.fromSessionId?.startsWith('remote:') && m.fromSessionId !== null
|
|
412
|
+
&& (scope === undefined || scope.includes(m.fromSessionId))
|
|
406
413
|
&& m.toSessionId.startsWith(`remote:${encodeURIComponent(b.peer.origin)}:`) && !['failed', 'expired'].includes(m.status)
|
|
407
414
|
&& (m.status === 'pending' || !m.snapshot)).sort((a, b) => Number(b.status === 'pending') - Number(a.status === 'pending'));
|
|
408
415
|
const pending = messages.filter(m => m.status === 'pending');
|
|
@@ -33,6 +33,15 @@ export class CollaborationService {
|
|
|
33
33
|
throw new Error('INVALID_DIRECTORY');
|
|
34
34
|
for (const peer of data.peers)
|
|
35
35
|
validateCollaborationNode(peer);
|
|
36
|
+
if (data.scoped !== undefined) {
|
|
37
|
+
if (!data.scoped || typeof data.scoped !== 'object' || Array.isArray(data.scoped))
|
|
38
|
+
throw new Error('INVALID_DIRECTORY');
|
|
39
|
+
for (const [serviceId, scope] of Object.entries(data.scoped)) {
|
|
40
|
+
if (!data.peers.some(peer => peer.serviceId === serviceId) || !scope || typeof scope !== 'object'
|
|
41
|
+
|| typeof scope.device !== 'string' || !/^12D3KooW[a-zA-Z0-9]{30,60}$/.test(scope.device))
|
|
42
|
+
throw new Error('INVALID_DIRECTORY');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
36
45
|
if (data.origin)
|
|
37
46
|
validateCollaborationNode({ ...options.node(), origin: data.origin });
|
|
38
47
|
this.document = data;
|
|
@@ -95,6 +104,43 @@ export class CollaborationService {
|
|
|
95
104
|
void this.refresh();
|
|
96
105
|
return { ok: true, registered: this.document.peers.map(peer => peer.serviceId) };
|
|
97
106
|
}
|
|
107
|
+
/** Effective local sessions a peer may touch. `undefined` means a fully
|
|
108
|
+
* authorized directory peer; an array (possibly empty) means a peer that
|
|
109
|
+
* exists only because a device shared a write invitation for those sessions. */
|
|
110
|
+
effectiveScope(serviceId) {
|
|
111
|
+
const scoped = this.document.scoped?.[serviceId];
|
|
112
|
+
if (!scoped)
|
|
113
|
+
return undefined;
|
|
114
|
+
try {
|
|
115
|
+
return [...new Set(this.options.deviceScope?.(scoped.device) ?? [])];
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Register a peer that a device's session-scoped write grant vouches for.
|
|
122
|
+
* The peer never gains directory or group authority beyond those sessions,
|
|
123
|
+
* and the surface follows the grant: revoking or expiring it empties the scope. */
|
|
124
|
+
registerScopedPeer(origin, deviceSubject, node, sessions) {
|
|
125
|
+
if (!/^12D3KooW[a-zA-Z0-9]{30,60}$/.test(deviceSubject) || !Array.isArray(sessions) || !sessions.length || sessions.length > 64
|
|
126
|
+
|| sessions.some(session => typeof session !== 'string' || !session) || new Set(sessions).size !== sessions.length)
|
|
127
|
+
throw new Error('INVALID_SCOPE');
|
|
128
|
+
this.setOrigin(origin);
|
|
129
|
+
validateCollaborationNode(node);
|
|
130
|
+
const existing = this.document.peers.find(peer => peer.serviceId === node.serviceId || peer.origin === node.origin);
|
|
131
|
+
if (existing) {
|
|
132
|
+
if (existing.serviceId !== node.serviceId || existing.origin !== node.origin || existing.caFingerprint256 !== node.caFingerprint256)
|
|
133
|
+
throw new Error('PEER_IDENTITY_CHANGED');
|
|
134
|
+
// An already fully authorized directory peer must not be downgraded by a device.
|
|
135
|
+
if (!this.document.scoped?.[existing.serviceId])
|
|
136
|
+
return { ok: true, peer: existing.serviceId, sessions: [] };
|
|
137
|
+
}
|
|
138
|
+
this.remember(node);
|
|
139
|
+
this.document.scoped = { ...this.document.scoped, [node.serviceId]: { device: deviceSubject } };
|
|
140
|
+
this.persist();
|
|
141
|
+
void this.refresh();
|
|
142
|
+
return { ok: true, peer: node.serviceId, sessions: this.effectiveScope(node.serviceId) ?? [] };
|
|
143
|
+
}
|
|
98
144
|
invite(origin) {
|
|
99
145
|
this.setOrigin(origin);
|
|
100
146
|
const code = randomBytes(32).toString('base64url'), expiresAt = Date.now() + 10 * 60_000;
|
|
@@ -142,24 +188,31 @@ export class CollaborationService {
|
|
|
142
188
|
if (packet.action === 'duplex')
|
|
143
189
|
return { ok: true };
|
|
144
190
|
if (packet.action === 'directory')
|
|
145
|
-
return this.snapshot(peer
|
|
191
|
+
return this.snapshot(peer);
|
|
146
192
|
if (packet.action === 'group') {
|
|
147
193
|
const canonical = packet.group;
|
|
148
194
|
if (!canonical?.sessionIds?.some(id => address(id)?.origin === peer.origin) && !this.document.replicas?.[canonical?.id]?.includes(peer.origin))
|
|
149
195
|
throw new Error('GROUP_SENDER_NOT_MEMBER');
|
|
150
|
-
this.merge(canonical, packet.nodes);
|
|
196
|
+
this.merge(canonical, packet.nodes, peer);
|
|
151
197
|
return { ok: true };
|
|
152
198
|
}
|
|
153
199
|
throw new Error('COLLABORATION_OPERATION_UNSUPPORTED');
|
|
154
200
|
}
|
|
155
201
|
nodes() { return [...new Map([...this.options.transport.registeredNodes(), ...this.document.peers, this.node()].map(node => [node.origin, node])).values()]; }
|
|
156
|
-
|
|
202
|
+
/** A scoped peer sees exactly its authorized sessions and the groups those
|
|
203
|
+
* sessions belong to. Other peers' identities are not exposed to it. */
|
|
204
|
+
snapshot(peer) {
|
|
157
205
|
const origin = this.node().origin;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
206
|
+
const scope = this.effectiveScope(peer.serviceId);
|
|
207
|
+
const sessions = this.options.sessions();
|
|
208
|
+
const groups = this.options.store.federationSnapshot().groups
|
|
209
|
+
.filter(group => group.federated && (group.sessionIds.some(id => address(id)?.origin === peer.origin) || this.document.replicas?.[group.id]?.includes(peer.origin)))
|
|
210
|
+
.filter(group => scope === undefined || group.sessionIds.every(id => address(id) ? true : scope.includes(id)))
|
|
211
|
+
.map(group => mapGroup(group, id => address(id) ? id : remoteSession(origin, id)));
|
|
212
|
+
return { sessions: scope === undefined ? sessions : sessions.filter(session => scope.includes(session.sessionId)),
|
|
213
|
+
groups, nodes: scope === undefined ? this.nodes() : [this.node(), peer] };
|
|
161
214
|
}
|
|
162
|
-
merge(canonical, nodes) {
|
|
215
|
+
merge(canonical, nodes, source) {
|
|
163
216
|
if (!canonical || typeof canonical.id !== 'string' || !canonical.id.startsWith('cross-') || !Array.isArray(canonical.sessionIds)
|
|
164
217
|
|| canonical.sessionIds.length < 2 || canonical.sessionIds.length > 500 || typeof canonical.name !== 'string' || !canonical.name.trim() || COLLAB_NAME_FORBIDDEN.test(canonical.name)
|
|
165
218
|
|| !Number.isFinite(canonical.updatedAt) || canonical.updatedAt > Date.now() + 60_000 || !Array.isArray(nodes) || nodes.length > 65)
|
|
@@ -188,10 +241,19 @@ export class CollaborationService {
|
|
|
188
241
|
this.persist();
|
|
189
242
|
}
|
|
190
243
|
const localIds = new Set(this.options.sessions().map(s => s.sessionId));
|
|
244
|
+
const scope = source ? this.effectiveScope(source.serviceId) : undefined;
|
|
191
245
|
const incoming = { ...mapGroup(canonical, id => local(self.origin, id)), federated: true };
|
|
192
246
|
for (const id of incoming.sessionIds) {
|
|
193
247
|
const remote = address(id);
|
|
194
|
-
if (remote
|
|
248
|
+
if (remote) {
|
|
249
|
+
if (!nodes.some(node => node.origin === remote.origin))
|
|
250
|
+
throw new Error('GROUP_MEMBER_UNAVAILABLE');
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
// A scoped peer can never pull another local session into a group.
|
|
254
|
+
if (scope !== undefined && !scope.includes(id))
|
|
255
|
+
throw new Error('SESSION_SCOPE_DENIED');
|
|
256
|
+
if (!localIds.has(id) && !existing?.sessionIds.includes(id))
|
|
195
257
|
throw new Error('GROUP_MEMBER_UNAVAILABLE');
|
|
196
258
|
}
|
|
197
259
|
incoming.remoteSessions = incoming.sessionIds.filter(id => address(id)).map(id => {
|
|
@@ -241,10 +303,14 @@ export class CollaborationService {
|
|
|
241
303
|
const sessions = data.sessions.filter((s) => s && typeof s.sessionId === 'string' && !s.sessionId.startsWith('remote:'));
|
|
242
304
|
this.observations.set(peer.serviceId, { sessions, checkedAt: Date.now() });
|
|
243
305
|
for (const group of data.groups)
|
|
244
|
-
this.merge(group, data.nodes);
|
|
306
|
+
this.merge(group, data.nodes, peer);
|
|
245
307
|
for (const group of this.options.store.federationSnapshot().groups.filter(g => g.federated && (g.sessionIds.some(id => address(id)?.origin === peer.origin) || this.document.replicas?.[g.id]?.includes(peer.origin)))) {
|
|
308
|
+
const scope = this.effectiveScope(peer.serviceId);
|
|
309
|
+
// Never push a group to a scoped peer if it involves other local sessions.
|
|
310
|
+
if (scope !== undefined && !group.sessionIds.every(id => address(id) ? true : scope.includes(id)))
|
|
311
|
+
continue;
|
|
246
312
|
const canonical = mapGroup(group, id => address(id) ? id : remoteSession(this.node().origin, id));
|
|
247
|
-
const nodes = this.nodes();
|
|
313
|
+
const nodes = scope === undefined ? this.nodes() : [this.node(), peer];
|
|
248
314
|
if (canonical.sessionIds.some(id => !nodes.some(node => node.origin === address(id)?.origin)))
|
|
249
315
|
continue;
|
|
250
316
|
this.merge(canonical, nodes);
|
|
@@ -264,7 +330,7 @@ export class CollaborationService {
|
|
|
264
330
|
return { origin: peer.origin, serviceId: peer.serviceId, label: peer.origin,
|
|
265
331
|
connected: !!observed && !observed.error && Date.now() - observed.checkedAt < 15_000, error: observed?.error ?? (!observed ? 'CONNECTING' : undefined) };
|
|
266
332
|
});
|
|
267
|
-
return { protocolVersion: 2, sessions: this.document.peers.flatMap(peer => (this.observations.get(peer.serviceId)?.sessions ?? []).map(session => ({ ...session,
|
|
333
|
+
return { protocolVersion: 2, sessions: this.document.peers.flatMap(peer => this.document.scoped?.[peer.serviceId] ? [] : (this.observations.get(peer.serviceId)?.sessions ?? []).map(session => ({ ...session,
|
|
268
334
|
sessionId: remoteSession(peer.origin, session.sessionId), backendSessionId: null, agentNativeSessionId: null, serviceOrigin: peer.origin, serviceLabel: peer.origin,
|
|
269
335
|
serviceConnected: services.find(s => s.origin === peer.origin).connected, serviceCheckedAt: this.observations.get(peer.serviceId)?.checkedAt }))),
|
|
270
336
|
services: [...services, ...missing.map(origin => ({ origin, label: origin, connected: false, error: '服务连接授权尚未同步;在已授权服务页面连接后会自动完成' }))] };
|
package/dist/server/entry.js
CHANGED
|
@@ -29,7 +29,7 @@ import { homedir } from 'os';
|
|
|
29
29
|
import cookieParser from 'cookie-parser';
|
|
30
30
|
import { fileURLToPath } from 'url';
|
|
31
31
|
import { WebSocketServer } from 'ws';
|
|
32
|
-
import terminalRoutes, { handleTerminalWebSocket, handleControlWebSocket } from './routes/terminal.js';
|
|
32
|
+
import terminalRoutes, { handleTerminalWebSocket, handleControlWebSocket, resolveStableFederationSessionId } from './routes/terminal.js';
|
|
33
33
|
import filesystemRoutes from './routes/filesystem.js';
|
|
34
34
|
import authRoutes from './routes/auth.js';
|
|
35
35
|
import notificationRoutes from './routes/notifications.js';
|
|
@@ -452,6 +452,7 @@ export function startServer(options = {}) {
|
|
|
452
452
|
const federation = createFederationRuntime(app, path.join(homedir(), '.termdock', 'federation'), {
|
|
453
453
|
terminal: handleTerminalWebSocket, control: handleControlWebSocket,
|
|
454
454
|
}, {
|
|
455
|
+
resolveSessionId: resolveStableFederationSessionId,
|
|
455
456
|
collaborationConnected: (subjectId, rpc) => {
|
|
456
457
|
const channels = collaborationChannels.get(subjectId) ?? new Set();
|
|
457
458
|
channels.add(rpc);
|
|
@@ -471,6 +472,11 @@ export function startServer(options = {}) {
|
|
|
471
472
|
throw new Error('COLLABORATION_UNAVAILABLE');
|
|
472
473
|
return collaborationService.receive(subjectId, packet);
|
|
473
474
|
},
|
|
475
|
+
registerScopedCollaborationPeer: (deviceSubject, origin, node, sessions) => {
|
|
476
|
+
if (!collaborationService)
|
|
477
|
+
throw new Error('COLLABORATION_UNAVAILABLE');
|
|
478
|
+
return collaborationService.registerScopedPeer(origin, deviceSubject, node, sessions);
|
|
479
|
+
},
|
|
474
480
|
collaborationExchange: (subjectId, packet) => {
|
|
475
481
|
if (!collaborationTransport)
|
|
476
482
|
throw new Error('COLLABORATION_UNAVAILABLE');
|
|
@@ -530,6 +536,7 @@ export function startServer(options = {}) {
|
|
|
530
536
|
reverse: reverseCollaboration,
|
|
531
537
|
file: path.join(homedir(), '.termdock', 'federation', 'collaboration-peers.json'), serviceId: runtime.serviceId,
|
|
532
538
|
store: collaborationStore, deliver: deliverPeerCollaboration, activity: collaborationLocalActivity,
|
|
539
|
+
scopeFor: serviceId => collaborationService?.effectiveScope(serviceId),
|
|
533
540
|
connect: async (peer, via) => {
|
|
534
541
|
if (!via)
|
|
535
542
|
return connectPeer(peer);
|
|
@@ -559,6 +566,9 @@ export function startServer(options = {}) {
|
|
|
559
566
|
collaborationService = new CollaborationService({ file: path.join(homedir(), '.termdock', 'federation', 'collaboration-services.json'),
|
|
560
567
|
store: collaborationStore, transport: collaborationTransport, node: () => app.locals.collaborationNode,
|
|
561
568
|
sessions: collaborationDirectorySessions, reverse: reverseCollaboration, connect: connectPeer,
|
|
569
|
+
deviceScope: device => runtime.store.listEffective({ subjectId: device, serviceId: runtime.serviceId })
|
|
570
|
+
.filter(grant => grant.scope.kind === 'sessions' && grant.actions.includes('session.input'))
|
|
571
|
+
.flatMap(grant => grant.scope.kind === 'sessions' ? grant.scope.sessionIds : []),
|
|
562
572
|
pairConnect: peer => connectCollaborationRpc(runtime.identity, peer) });
|
|
563
573
|
app.locals.collaborationService = collaborationService;
|
|
564
574
|
collaborationService.start();
|
|
@@ -126,7 +126,25 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
126
126
|
let collaborationRpc;
|
|
127
127
|
let unregisterCollaboration;
|
|
128
128
|
const open = (action) => openAccessAllowed(context.allowOpenAccess === true, isAuthEnabled(), action);
|
|
129
|
-
const
|
|
129
|
+
const stableSessionId = (id) => {
|
|
130
|
+
try {
|
|
131
|
+
const resolved = options.resolveSessionId?.(id);
|
|
132
|
+
return typeof resolved === 'string' && resolved && resolved !== id ? resolved : undefined;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const allowed = (subjectId, action, sessionId) => {
|
|
139
|
+
if (open(action) || store.authorize({ subjectId, serviceId, action, sessionId }).allowed)
|
|
140
|
+
return true;
|
|
141
|
+
// The wire may still carry the transient backend PTY id while the grant
|
|
142
|
+
// is bound to the stable client session id (or an older backend id).
|
|
143
|
+
if (sessionId === undefined)
|
|
144
|
+
return false;
|
|
145
|
+
const stable = stableSessionId(sessionId);
|
|
146
|
+
return stable !== undefined && store.authorize({ subjectId, serviceId, action, sessionId: stable }).allowed;
|
|
147
|
+
};
|
|
130
148
|
const full = (subjectId) => open() || store.hasFullServiceAccess({ subjectId, serviceId });
|
|
131
149
|
let channel;
|
|
132
150
|
const operations = new Map();
|
|
@@ -276,6 +294,20 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
276
294
|
throw new Error('COLLABORATION_UPGRADE_REQUIRED');
|
|
277
295
|
send({ type: 'result', id: packet.id, ...options.collaborationService(subjectId, packet) });
|
|
278
296
|
}
|
|
297
|
+
else if (packet.type === 'collaboration-scoped-peer') {
|
|
298
|
+
if (!options.registerScopedCollaborationPeer)
|
|
299
|
+
throw new Error('COLLABORATION_UPGRADE_REQUIRED');
|
|
300
|
+
const origin = typeof packet.origin === 'string' ? packet.origin : '';
|
|
301
|
+
if (!origin || !packet.node || typeof packet.node !== 'object')
|
|
302
|
+
throw new Error('INVALID_COLLABORATION_PEER');
|
|
303
|
+
// The peer may only touch sessions this device can write to right now.
|
|
304
|
+
const sessions = [...new Set(store.listEffective({ subjectId, serviceId })
|
|
305
|
+
.filter(grant => grant.scope.kind === 'sessions' && grant.actions.includes('session.input'))
|
|
306
|
+
.flatMap(grant => grant.scope.kind === 'sessions' ? grant.scope.sessionIds : []))];
|
|
307
|
+
if (!sessions.length)
|
|
308
|
+
throw new Error('AUTHORIZATION_DENIED');
|
|
309
|
+
send({ type: 'result', id: packet.id, ...options.registerScopedCollaborationPeer(subjectId, origin, packet.node, sessions) });
|
|
310
|
+
}
|
|
279
311
|
else if (packet.type === 'collaboration-exchange') {
|
|
280
312
|
if (!options.collaborationExchange)
|
|
281
313
|
throw new Error('COLLABORATION_UNAVAILABLE');
|
|
@@ -411,9 +443,24 @@ export async function createFederationRuntime(app, directory, handlers, options
|
|
|
411
443
|
...(packet.expiresAt === undefined ? {} : { expiresAt: packet.expiresAt }) };
|
|
412
444
|
validateInvitation(invitation);
|
|
413
445
|
if (invitation.scope.kind === 'sessions') {
|
|
414
|
-
|
|
415
|
-
|
|
446
|
+
// Bind to the stable client session id, never the transient backend
|
|
447
|
+
// PTY id: backends are replaced on restart, tmux recovery or
|
|
448
|
+
// re-attach, which would otherwise invalidate the whole grant.
|
|
449
|
+
const stable = new Map();
|
|
450
|
+
for (const session of await sessionInventory()) {
|
|
451
|
+
if (session.live !== true)
|
|
452
|
+
continue;
|
|
453
|
+
const frontendSessionId = typeof session.sessionId === 'string' ? session.sessionId : '';
|
|
454
|
+
if (!frontendSessionId)
|
|
455
|
+
continue;
|
|
456
|
+
stable.set(frontendSessionId, frontendSessionId);
|
|
457
|
+
if (typeof session.backendSessionId === 'string' && session.backendSessionId)
|
|
458
|
+
stable.set(session.backendSessionId, frontendSessionId);
|
|
459
|
+
}
|
|
460
|
+
const sessionIds = invitation.scope.sessionIds.map(id => stable.get(id)).filter((id) => typeof id === 'string');
|
|
461
|
+
if (sessionIds.length !== invitation.scope.sessionIds.length || new Set(sessionIds).size !== sessionIds.length)
|
|
416
462
|
throw new Error('UNKNOWN_SESSION');
|
|
463
|
+
invitation.scope = { kind: 'sessions', sessionIds };
|
|
417
464
|
}
|
|
418
465
|
check('authorization.manage');
|
|
419
466
|
send({ type: 'result', id: packet.id, serviceId, ...invitations.create(subjectId, invitation) });
|
|
@@ -1436,6 +1436,19 @@ async function runAgentAutomation(automation, req) {
|
|
|
1436
1436
|
function resolveFrontendSessionId(input) {
|
|
1437
1437
|
return resolveCollaborationSessionId(input, globalSessionState.sessions, collaborationRouting);
|
|
1438
1438
|
}
|
|
1439
|
+
/** Stable-id resolver for encrypted client authorization: accepts either the
|
|
1440
|
+
* stable client session id or a transient backend PTY id and returns the stable
|
|
1441
|
+
* one, so session-scoped grants survive backend replacement. */
|
|
1442
|
+
export function resolveStableFederationSessionId(id) {
|
|
1443
|
+
if (!id)
|
|
1444
|
+
return null;
|
|
1445
|
+
try {
|
|
1446
|
+
return resolveFrontendSessionId({ sessionId: id, backendSessionId: id });
|
|
1447
|
+
}
|
|
1448
|
+
catch {
|
|
1449
|
+
return null;
|
|
1450
|
+
}
|
|
1451
|
+
}
|
|
1439
1452
|
function collaborationRemoteSessions() {
|
|
1440
1453
|
return Array.from(new Map(collaborationStore.list().flatMap((group) => group.remoteSessions ?? [])
|
|
1441
1454
|
.map((session) => {
|
package/package.json
CHANGED
package/runtime-manifest.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.247",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-K4KyYJuVoQDpZsBM8ZX1Rw3MddOxAzVdp/cPm0iGZz0=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
10
|
-
"clientBundleHash": "sha256
|
|
9
|
+
"serverBundleHash": "sha256-jt8V06gEQdEOQuK7k49oLE0RIfpkIZP7rDDt7Vh6E80=",
|
|
10
|
+
"clientBundleHash": "sha256-b+6COls3nNjiyFKb3RQRKLWhe9MI1wPlehaAY2rwHX8=",
|
|
11
11
|
"entrypoint": "dist/server/cli.js",
|
|
12
12
|
"clientEntrypoint": "dist/client/index.html"
|
|
13
13
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|