termdock 1.4.309 → 1.4.310
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +3 -1
- package/README.md +3 -1
- package/THIRD_PARTY_NOTICES.md +30 -0
- package/dist/client/assets/{App-ggIA_xqR.js → App-CytIMrFr.js} +62 -55
- package/dist/client/assets/App-CytIMrFr.js.br +0 -0
- package/dist/client/assets/App-CytIMrFr.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js +9 -0
- package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.gz +0 -0
- package/dist/client/assets/{ArchitecturePanel-Cmpmp6FS.css → ArchitecturePanel-B_BDrrfR.css} +1 -1
- package/dist/client/assets/ArchitecturePanel-B_BDrrfR.css.br +0 -0
- package/dist/client/assets/ArchitecturePanel-B_BDrrfR.css.gz +0 -0
- package/dist/client/assets/{ChangeWalkthroughPanel-D1Puc7B3.js → ChangeWalkthroughPanel-Bm9Tvd6H.js} +2 -2
- package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js +1 -0
- package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-D7LXylWr.js +2 -0
- package/dist/client/assets/{ComputerControlView-D5Lw9sNA.js → ComputerControlView-CC6r2cD3.js} +2 -2
- package/dist/client/assets/ComputerControlView-CC6r2cD3.js.br +0 -0
- package/dist/client/assets/ComputerControlView-CC6r2cD3.js.gz +0 -0
- package/dist/client/assets/{DagPlayground-DYJrGfiG.js → DagPlayground-BqAadqBT.js} +1 -1
- package/dist/client/assets/DagPlayground-BqAadqBT.js.br +0 -0
- package/dist/client/assets/DagPlayground-BqAadqBT.js.gz +0 -0
- package/dist/client/assets/{DiffLab-5zdcFW3z.js → DiffLab-CrEVLy-j.js} +1 -1
- package/dist/client/assets/DiffLab-CrEVLy-j.js.br +0 -0
- package/dist/client/assets/DiffLab-CrEVLy-j.js.gz +0 -0
- package/dist/client/assets/{DiffReview-BBBC_NjV.js → DiffReview-C8e2GQxb.js} +1 -1
- package/dist/client/assets/DiffReview-C8e2GQxb.js.br +0 -0
- package/dist/client/assets/DiffReview-C8e2GQxb.js.gz +0 -0
- package/dist/client/assets/{DiffReviewLab-CbhosFSB.js → DiffReviewLab-RQ1NmpZE.js} +2 -2
- package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.gz +0 -0
- package/dist/client/assets/{DiffViewer-BuQwFQ4V.js → DiffViewer-KljgMa9h.js} +8 -8
- package/dist/client/assets/DiffViewer-KljgMa9h.js.br +0 -0
- package/dist/client/assets/DiffViewer-KljgMa9h.js.gz +0 -0
- package/dist/client/assets/{ModelPreview-nO2VmqdP.js → ModelPreview-B9UR1TR3.js} +1 -1
- package/dist/client/assets/ModelPreview-B9UR1TR3.js.br +0 -0
- package/dist/client/assets/ModelPreview-B9UR1TR3.js.gz +0 -0
- package/dist/client/assets/RightSidebar-DSH93gN5.js +1677 -0
- package/dist/client/assets/RightSidebar-DSH93gN5.js.br +0 -0
- package/dist/client/assets/RightSidebar-DSH93gN5.js.gz +0 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-yi0K8GDG.js → abnfDiagram-VCTEODGH-WFUf9n1A.js} +1 -1
- package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.gz +0 -0
- package/dist/client/assets/{app-B6FdOF6K.js → app-Bey8S6UU.js} +4 -4
- package/dist/client/assets/app-Bey8S6UU.js.br +0 -0
- package/dist/client/assets/app-Bey8S6UU.js.gz +0 -0
- package/dist/client/assets/{arc-_nLI_-XZ.js → arc-BXKxIsA3.js} +1 -1
- package/dist/client/assets/arc-BXKxIsA3.js.br +0 -0
- package/dist/client/assets/arc-BXKxIsA3.js.gz +0 -0
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-CikrA78O.js → architectureDiagram-5GKGNRK7-DAfRrSxr.js} +1 -1
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.gz +0 -0
- package/dist/client/assets/{blockDiagram-I7D4REHJ-CWJq6qJ7.js → blockDiagram-I7D4REHJ-1HbSy7rb.js} +1 -1
- package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.gz +0 -0
- package/dist/client/assets/{c4Diagram-7LVT6UL2-gzPzLGvs.js → c4Diagram-7LVT6UL2-Dxwui-M_.js} +1 -1
- package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.gz +0 -0
- package/dist/client/assets/channel-Dkh0SMv-.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CfX9l18E.js → chunk-2Q5K7J3B-CJSdJ_A1.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-JSV1yrXM.js → chunk-5VM5RSS4-BNEXn4bI.js} +1 -1
- package/dist/client/assets/{chunk-F27PBJKO-CQ0LXeap.js → chunk-F27PBJKO-BaM6iLMb.js} +1 -1
- package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.gz +0 -0
- package/dist/client/assets/{chunk-IMKFNOWR-CJOEPkK9.js → chunk-IMKFNOWR-DxPJBdLq.js} +1 -1
- package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.gz +0 -0
- package/dist/client/assets/{chunk-JWPE2WC7-Dpp7Xu_E.js → chunk-JWPE2WC7-BwEOSoiu.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-9hDa1b8z.js → chunk-POPQ4Y6H-CbYcBz8G.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-BskkG9gg.js → chunk-SVP7TREG-CpnycZ3K.js} +1 -1
- package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.gz +0 -0
- package/dist/client/assets/{chunk-TICWLB2K-DyzuP-9I.js → chunk-TICWLB2K-5oWwjAOF.js} +1 -1
- package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.gz +0 -0
- package/dist/client/assets/{chunk-XXDRQBXY-C31_1i6z.js → chunk-XXDRQBXY-VWUm4Sz5.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-DqvmSdwt.js +1 -0
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-DqvmSdwt.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-Bm-ESDOc.js → cose-bilkent-JH36ORCC-gpF5Tw44.js} +1 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.gz +0 -0
- package/dist/client/assets/{cynefin-OW5HDTMX-DbFWAPvX.js → cynefin-OW5HDTMX-HFr7zRQ0.js} +1 -1
- package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.gz +0 -0
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js → cynefinDiagram-5FMLGOSQ-LccKgJj0.js} +1 -1
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.gz +0 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-D_5uEMjJ.js → dagre-GXQ25YYZ-C7eLk1r1.js} +1 -1
- package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.gz +0 -0
- package/dist/client/assets/{diagram-S7CK7UJ4-DWVpndRP.js → diagram-S7CK7UJ4-DkWPZYAg.js} +1 -1
- package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.gz +0 -0
- package/dist/client/assets/{diagram-UQ7AKVKN-DmYTya3w.js → diagram-UQ7AKVKN-DluTsMXz.js} +1 -1
- package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.gz +0 -0
- package/dist/client/assets/{diagram-VSXAHHWV-BEA6kqNj.js → diagram-VSXAHHWV-BLXEmXmu.js} +1 -1
- package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.gz +0 -0
- package/dist/client/assets/{diagram-VX7I27RA-CU9vP0P0.js → diagram-VX7I27RA-DO3J99WU.js} +1 -1
- package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.gz +0 -0
- package/dist/client/assets/{diagram-Z3DM3KII-B_GvE2g-.js → diagram-Z3DM3KII-kvkSusTy.js} +1 -1
- package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.gz +0 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-BLrPQuLE.js → ebnfDiagram-PWID7BFC-Bxd9hatc.js} +1 -1
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.gz +0 -0
- package/dist/client/assets/{erDiagram-RLTQ6QDP-DlXgoyZ-.js → erDiagram-RLTQ6QDP-BWc3uM23.js} +1 -1
- package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.gz +0 -0
- package/dist/client/assets/{flowDiagram-HODETNUW-fPHWxEDZ.js → flowDiagram-HODETNUW-BQhPtc9z.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.gz +0 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-B8MOv6ug.js → ganttDiagram-EL5Y4UJY-DzmTLgVr.js} +1 -1
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.gz +0 -0
- package/dist/client/assets/{gestureArbiter-JW8vcVRm.js → gestureArbiter-BuNZMZ7A.js} +1 -1
- package/dist/client/assets/gestureArbiter-BuNZMZ7A.js.br +0 -0
- package/dist/client/assets/gestureArbiter-BuNZMZ7A.js.gz +0 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-lH9gSoFx.js → gitGraphDiagram-WWUBYQGX-r0Onfl7K.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.gz +0 -0
- package/dist/client/assets/{index-CNY7CTVa.css → index-C6D5a-dg.css} +1 -1
- package/dist/client/assets/index-C6D5a-dg.css.br +0 -0
- package/dist/client/assets/{index-CNY7CTVa.css.gz → index-C6D5a-dg.css.gz} +0 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-CSG29Ty_.js → infoDiagram-27XIBGKW-C52jpDzv.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CcwSE5qV.js → ishikawaDiagram-5VMMS53U-C-l0eHmO.js} +1 -1
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.gz +0 -0
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-CXFUeP2c.js → journeyDiagram-3NMN7TZE-DmhgEOjX.js} +1 -1
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.gz +0 -0
- package/dist/client/assets/{kanban-definition-UXKFOSKX-KEHwljd2.js → kanban-definition-UXKFOSKX-BnZWlxIT.js} +1 -1
- package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.gz +0 -0
- package/dist/client/assets/{layout-DqYx0MnO.js → layout-BrxPpC7u.js} +1 -1
- package/dist/client/assets/layout-BrxPpC7u.js.br +0 -0
- package/dist/client/assets/layout-BrxPpC7u.js.gz +0 -0
- package/dist/client/assets/{linear-BnG3XaJW.js → linear-DaEpqVcH.js} +1 -1
- package/dist/client/assets/linear-DaEpqVcH.js.br +0 -0
- package/dist/client/assets/linear-DaEpqVcH.js.gz +0 -0
- package/dist/client/assets/{mermaid.core-Ce00rdM6.js → mermaid.core-CidoOS12.js} +5 -5
- package/dist/client/assets/mermaid.core-CidoOS12.js.br +0 -0
- package/dist/client/assets/mermaid.core-CidoOS12.js.gz +0 -0
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-D0hOW4SY.js → mindmap-definition-YA3MSWOX-Bpr3CVLy.js} +1 -1
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-D7hFrc0r.js +2 -0
- package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.gz +0 -0
- package/dist/client/assets/{pegDiagram-XKGWAZYB-UKp9t91x.js → pegDiagram-XKGWAZYB-Bw2JpSYn.js} +1 -1
- package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.gz +0 -0
- package/dist/client/assets/{pieDiagram-E7YTZNPT-Dif97wbH.js → pieDiagram-E7YTZNPT-BaKc3ifQ.js} +1 -1
- package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.gz +0 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BPyHtH91.js → quadrantDiagram-AXDQQJYC-B0Yi-dl9.js} +1 -1
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.gz +0 -0
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-Wleq9LmS.js → railroadDiagram-O6MQD6OU-DCcCQofU.js} +1 -1
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.gz +0 -0
- package/dist/client/assets/{rdpSession-CobFMSUs.js → rdpSession-DY81W5BY.js} +1 -1
- package/dist/client/assets/rdpSession-DY81W5BY.js.br +0 -0
- package/dist/client/assets/rdpSession-DY81W5BY.js.gz +0 -0
- package/dist/client/assets/{referenceLongPress-bZ0xp-v2.js → referenceLongPress-CAzWqXsY.js} +1 -1
- package/dist/client/assets/referenceLongPress-CAzWqXsY.js.br +0 -0
- package/dist/client/assets/referenceLongPress-CAzWqXsY.js.gz +0 -0
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BL4pp0Ta.js → requirementDiagram-BXWQKSXE-CEJFRPWH.js} +1 -1
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.gz +0 -0
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CV1cKx37.js → sankeyDiagram-P5KCCOFB-B3Wk45FA.js} +1 -1
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.gz +0 -0
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BF2InLwV.js → sequenceDiagram-WJ2MYXX4-BejEsITb.js} +1 -1
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.gz +0 -0
- package/dist/client/assets/{sizeCapture-INFHLROL-CldUyStR.js → sizeCapture-INFHLROL-DZ5NJZnM.js} +1 -1
- package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.gz +0 -0
- package/dist/client/assets/{sparkles-Cg-yPdE2.js → sparkles-DQGLdN2b.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-CByehbEd.js → stateDiagram-D77RDMKH-D8SSEwHa.js} +1 -1
- package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-D1KQOetv.js +1 -0
- package/dist/client/assets/{swimlanes-42K2YHIH--1_7YTL4.js → swimlanes-42K2YHIH-Dow-EKMG.js} +1 -1
- package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DQbZCzq9.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-CXfXJFK6.js → timeline-definition-24CTP7MA-DpQ9D5f6.js} +1 -1
- package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.gz +0 -0
- package/dist/client/assets/{triangle-alert-CbMRJ6sx.js → triangle-alert-Bdf_dBch.js} +1 -1
- package/dist/client/assets/{vennDiagram-4TSXK5OY-byr6UQpL.js → vennDiagram-4TSXK5OY-DoemAmM2.js} +1 -1
- package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.gz +0 -0
- package/dist/client/assets/{videoCompression-ivJAy00d.js → videoCompression-Bg4gUQUf.js} +1 -1
- package/dist/client/assets/videoCompression-Bg4gUQUf.js.br +0 -0
- package/dist/client/assets/videoCompression-Bg4gUQUf.js.gz +0 -0
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-FJduk-7s.js → wardleyDiagram-VM6X3IG4-MernEZ54.js} +1 -1
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.gz +0 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Ct1fBPFS.js → xychartDiagram-S5SC5T6Z-CzO3HEHD.js} +1 -1
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.gz +0 -0
- package/dist/client/index.html +2 -2
- package/dist/client/index.html.br +0 -0
- package/dist/client/index.html.gz +0 -0
- package/dist/client/sw.js +1 -1
- package/dist/client/sw.js.br +0 -0
- package/dist/client/sw.js.gz +0 -0
- package/dist/server/agent/integrationCli.js +23 -0
- package/dist/server/agent/integrationServer.js +7 -0
- package/dist/server/agent/integrationSessions.js +24 -1
- package/dist/server/agent/sessionLifecycle.js +2 -2
- package/dist/server/architecture/cli.js +295 -0
- package/dist/server/architecture/document.js +328 -0
- package/dist/server/architecture/documentDiff.js +34 -0
- package/dist/server/architecture/fieldMutation.js +52 -0
- package/dist/server/architecture/flowchart.js +62 -0
- package/dist/server/architecture/mermaidDiff.js +85 -0
- package/dist/server/architecture/routes.js +117 -0
- package/dist/server/architecture/store.js +502 -0
- package/dist/server/cli.js +7 -1
- package/dist/server/entry.js +2 -0
- package/dist/server/federation/accessPolicy.js +9 -1
- package/docs/integrations.md +40 -0
- package/package.json +3 -1
- package/runtime-manifest.json +4 -4
- package/dist/client/assets/App-ggIA_xqR.js.br +0 -0
- package/dist/client/assets/App-ggIA_xqR.js.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-Cmpmp6FS.css.br +0 -0
- package/dist/client/assets/ArchitecturePanel-Cmpmp6FS.css.gz +0 -0
- package/dist/client/assets/ArchitecturePanel-CoBspW_C.js +0 -12
- package/dist/client/assets/ArchitecturePanel-CoBspW_C.js.br +0 -0
- package/dist/client/assets/ArchitecturePanel-CoBspW_C.js.gz +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-D1Puc7B3.js.br +0 -0
- package/dist/client/assets/ChangeWalkthroughPanel-D1Puc7B3.js.gz +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js +0 -1
- package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js.br +0 -0
- package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js.gz +0 -0
- package/dist/client/assets/CollaborationTaskContent-CTSJJqze.js +0 -2
- package/dist/client/assets/ComputerControlView-D5Lw9sNA.js.br +0 -0
- package/dist/client/assets/ComputerControlView-D5Lw9sNA.js.gz +0 -0
- package/dist/client/assets/DagPlayground-DYJrGfiG.js.br +0 -0
- package/dist/client/assets/DagPlayground-DYJrGfiG.js.gz +0 -0
- package/dist/client/assets/DiffLab-5zdcFW3z.js.br +0 -0
- package/dist/client/assets/DiffLab-5zdcFW3z.js.gz +0 -0
- package/dist/client/assets/DiffReview-BBBC_NjV.js.br +0 -0
- package/dist/client/assets/DiffReview-BBBC_NjV.js.gz +0 -0
- package/dist/client/assets/DiffReviewLab-CbhosFSB.js.br +0 -0
- package/dist/client/assets/DiffReviewLab-CbhosFSB.js.gz +0 -0
- package/dist/client/assets/DiffViewer-BuQwFQ4V.js.br +0 -0
- package/dist/client/assets/DiffViewer-BuQwFQ4V.js.gz +0 -0
- package/dist/client/assets/ModelPreview-nO2VmqdP.js.br +0 -0
- package/dist/client/assets/ModelPreview-nO2VmqdP.js.gz +0 -0
- package/dist/client/assets/RightSidebar-BoNzpS2K.js +0 -1677
- package/dist/client/assets/RightSidebar-BoNzpS2K.js.br +0 -0
- package/dist/client/assets/RightSidebar-BoNzpS2K.js.gz +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-yi0K8GDG.js.br +0 -0
- package/dist/client/assets/abnfDiagram-VCTEODGH-yi0K8GDG.js.gz +0 -0
- package/dist/client/assets/app-B6FdOF6K.js.br +0 -0
- package/dist/client/assets/app-B6FdOF6K.js.gz +0 -0
- package/dist/client/assets/arc-_nLI_-XZ.js.br +0 -0
- package/dist/client/assets/arc-_nLI_-XZ.js.gz +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CikrA78O.js.br +0 -0
- package/dist/client/assets/architectureDiagram-5GKGNRK7-CikrA78O.js.gz +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CWJq6qJ7.js.br +0 -0
- package/dist/client/assets/blockDiagram-I7D4REHJ-CWJq6qJ7.js.gz +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-gzPzLGvs.js.br +0 -0
- package/dist/client/assets/c4Diagram-7LVT6UL2-gzPzLGvs.js.gz +0 -0
- package/dist/client/assets/channel-BYsFmOmF.js +0 -1
- package/dist/client/assets/chunk-F27PBJKO-CQ0LXeap.js.br +0 -0
- package/dist/client/assets/chunk-F27PBJKO-CQ0LXeap.js.gz +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CJOEPkK9.js.br +0 -0
- package/dist/client/assets/chunk-IMKFNOWR-CJOEPkK9.js.gz +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BskkG9gg.js.br +0 -0
- package/dist/client/assets/chunk-SVP7TREG-BskkG9gg.js.gz +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DyzuP-9I.js.br +0 -0
- package/dist/client/assets/chunk-TICWLB2K-DyzuP-9I.js.gz +0 -0
- package/dist/client/assets/classDiagram-ZZMXUADV-BnmZv6Ns.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BnmZv6Ns.js +0 -1
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bm-ESDOc.js.br +0 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-Bm-ESDOc.js.gz +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DbFWAPvX.js.br +0 -0
- package/dist/client/assets/cynefin-OW5HDTMX-DbFWAPvX.js.gz +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js.br +0 -0
- package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js.gz +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-D_5uEMjJ.js.br +0 -0
- package/dist/client/assets/dagre-GXQ25YYZ-D_5uEMjJ.js.gz +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DWVpndRP.js.br +0 -0
- package/dist/client/assets/diagram-S7CK7UJ4-DWVpndRP.js.gz +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DmYTya3w.js.br +0 -0
- package/dist/client/assets/diagram-UQ7AKVKN-DmYTya3w.js.gz +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BEA6kqNj.js.br +0 -0
- package/dist/client/assets/diagram-VSXAHHWV-BEA6kqNj.js.gz +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CU9vP0P0.js.br +0 -0
- package/dist/client/assets/diagram-VX7I27RA-CU9vP0P0.js.gz +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-B_GvE2g-.js.br +0 -0
- package/dist/client/assets/diagram-Z3DM3KII-B_GvE2g-.js.gz +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BLrPQuLE.js.br +0 -0
- package/dist/client/assets/ebnfDiagram-PWID7BFC-BLrPQuLE.js.gz +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DlXgoyZ-.js.br +0 -0
- package/dist/client/assets/erDiagram-RLTQ6QDP-DlXgoyZ-.js.gz +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-fPHWxEDZ.js.br +0 -0
- package/dist/client/assets/flowDiagram-HODETNUW-fPHWxEDZ.js.gz +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-B8MOv6ug.js.br +0 -0
- package/dist/client/assets/ganttDiagram-EL5Y4UJY-B8MOv6ug.js.gz +0 -0
- package/dist/client/assets/gestureArbiter-JW8vcVRm.js.br +0 -0
- package/dist/client/assets/gestureArbiter-JW8vcVRm.js.gz +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lH9gSoFx.js.br +0 -0
- package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lH9gSoFx.js.gz +0 -0
- package/dist/client/assets/index-CNY7CTVa.css.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CcwSE5qV.js.br +0 -0
- package/dist/client/assets/ishikawaDiagram-5VMMS53U-CcwSE5qV.js.gz +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CXFUeP2c.js.br +0 -0
- package/dist/client/assets/journeyDiagram-3NMN7TZE-CXFUeP2c.js.gz +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-KEHwljd2.js.br +0 -0
- package/dist/client/assets/kanban-definition-UXKFOSKX-KEHwljd2.js.gz +0 -0
- package/dist/client/assets/layout-DqYx0MnO.js.br +0 -0
- package/dist/client/assets/layout-DqYx0MnO.js.gz +0 -0
- package/dist/client/assets/linear-BnG3XaJW.js.br +0 -0
- package/dist/client/assets/linear-BnG3XaJW.js.gz +0 -0
- package/dist/client/assets/mermaid.core-Ce00rdM6.js.br +0 -0
- package/dist/client/assets/mermaid.core-Ce00rdM6.js.gz +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D0hOW4SY.js.br +0 -0
- package/dist/client/assets/mindmap-definition-YA3MSWOX-D0hOW4SY.js.gz +0 -0
- package/dist/client/assets/passwordBootstrap-Bncb8qF_.js +0 -2
- package/dist/client/assets/passwordBootstrap-Bncb8qF_.js.br +0 -0
- package/dist/client/assets/passwordBootstrap-Bncb8qF_.js.gz +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-UKp9t91x.js.br +0 -0
- package/dist/client/assets/pegDiagram-XKGWAZYB-UKp9t91x.js.gz +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dif97wbH.js.br +0 -0
- package/dist/client/assets/pieDiagram-E7YTZNPT-Dif97wbH.js.gz +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPyHtH91.js.br +0 -0
- package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPyHtH91.js.gz +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Wleq9LmS.js.br +0 -0
- package/dist/client/assets/railroadDiagram-O6MQD6OU-Wleq9LmS.js.gz +0 -0
- package/dist/client/assets/rdpSession-CobFMSUs.js.br +0 -0
- package/dist/client/assets/rdpSession-CobFMSUs.js.gz +0 -0
- package/dist/client/assets/referenceLongPress-bZ0xp-v2.js.br +0 -0
- package/dist/client/assets/referenceLongPress-bZ0xp-v2.js.gz +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BL4pp0Ta.js.br +0 -0
- package/dist/client/assets/requirementDiagram-BXWQKSXE-BL4pp0Ta.js.gz +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CV1cKx37.js.br +0 -0
- package/dist/client/assets/sankeyDiagram-P5KCCOFB-CV1cKx37.js.gz +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BF2InLwV.js.br +0 -0
- package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BF2InLwV.js.gz +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CldUyStR.js.br +0 -0
- package/dist/client/assets/sizeCapture-INFHLROL-CldUyStR.js.gz +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CByehbEd.js.br +0 -0
- package/dist/client/assets/stateDiagram-D77RDMKH-CByehbEd.js.gz +0 -0
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CTcrJ-w0.js +0 -1
- package/dist/client/assets/swimlanes-42K2YHIH--1_7YTL4.js.br +0 -0
- package/dist/client/assets/swimlanes-42K2YHIH--1_7YTL4.js.gz +0 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-RSMV9AhO.js +0 -8
- package/dist/client/assets/timeline-definition-24CTP7MA-CXfXJFK6.js.br +0 -0
- package/dist/client/assets/timeline-definition-24CTP7MA-CXfXJFK6.js.gz +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-byr6UQpL.js.br +0 -0
- package/dist/client/assets/vennDiagram-4TSXK5OY-byr6UQpL.js.gz +0 -0
- package/dist/client/assets/videoCompression-ivJAy00d.js.br +0 -0
- package/dist/client/assets/videoCompression-ivJAy00d.js.gz +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-FJduk-7s.js.br +0 -0
- package/dist/client/assets/wardleyDiagram-VM6X3IG4-FJduk-7s.js.gz +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Ct1fBPFS.js.br +0 -0
- package/dist/client/assets/xychartDiagram-S5SC5T6Z-Ct1fBPFS.js.gz +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ARCHITECTURE_FIELDS } from './document.js';
|
|
2
|
+
/** Compare semantic document content, excluding timestamps and update counters. */
|
|
3
|
+
export function diffArchitecture(before, after) {
|
|
4
|
+
const changes = [];
|
|
5
|
+
const oldViews = new Map(before?.perspectives.map(view => [view.id, view]) ?? []);
|
|
6
|
+
for (const view of after.perspectives) {
|
|
7
|
+
const previous = oldViews.get(view.id);
|
|
8
|
+
oldViews.delete(view.id);
|
|
9
|
+
if (!previous)
|
|
10
|
+
changes.push({ perspective: view.id, title: view.title, kind: 'added', fields: [] });
|
|
11
|
+
else {
|
|
12
|
+
const changed = ['title', 'summary', 'edges', ...ARCHITECTURE_FIELDS].filter(key => JSON.stringify(previous[key]) !== JSON.stringify(view[key]));
|
|
13
|
+
if (changed.length)
|
|
14
|
+
changes.push({ perspective: view.id, title: view.title, kind: 'changed', fields: changed });
|
|
15
|
+
}
|
|
16
|
+
const oldNodes = new Map(previous?.nodes.map(node => [node.id, node]) ?? []);
|
|
17
|
+
for (const node of view.nodes) {
|
|
18
|
+
const old = oldNodes.get(node.id);
|
|
19
|
+
oldNodes.delete(node.id);
|
|
20
|
+
if (!old)
|
|
21
|
+
changes.push({ perspective: view.id, node: node.id, title: node.title, kind: 'added', fields: [] });
|
|
22
|
+
else {
|
|
23
|
+
const changed = ['title', 'summary', 'parentId', 'files', 'references', 'role', ...ARCHITECTURE_FIELDS].filter(key => JSON.stringify(old[key]) !== JSON.stringify(node[key]));
|
|
24
|
+
if (changed.length)
|
|
25
|
+
changes.push({ perspective: view.id, node: node.id, title: node.title, kind: 'changed', fields: changed });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const old of oldNodes.values())
|
|
29
|
+
changes.push({ perspective: view.id, node: old.id, title: old.title, kind: 'removed', fields: [] });
|
|
30
|
+
}
|
|
31
|
+
for (const old of oldViews.values())
|
|
32
|
+
changes.push({ perspective: old.id, title: old.title, kind: 'removed', fields: [] });
|
|
33
|
+
return changes;
|
|
34
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ARCHITECTURE_FIELDS, parseArchitecture } from './document.js';
|
|
2
|
+
import { parseFlowchart } from './flowchart.js';
|
|
3
|
+
/** Keep native structural data and its editable Mermaid field consistent. */
|
|
4
|
+
export function updateArchitectureField(input, perspective, nodeId, field, value) {
|
|
5
|
+
if (!ARCHITECTURE_FIELDS.includes(field) || typeof value !== 'string' || value.length > 100_000)
|
|
6
|
+
throw new Error('Invalid architecture field');
|
|
7
|
+
const document = parseArchitecture(JSON.stringify(input));
|
|
8
|
+
const view = document.perspectives.find(view => view.id === perspective);
|
|
9
|
+
const target = nodeId ? view?.nodes.find(node => node.id === nodeId) : view;
|
|
10
|
+
if (!view || !target)
|
|
11
|
+
throw new Error('Architecture element not found');
|
|
12
|
+
target[field] = value;
|
|
13
|
+
if (field === 'description')
|
|
14
|
+
target.summary = value.replace(/[#*`]/g, '').split(/\n\s*\n/)[0].slice(0, 600);
|
|
15
|
+
if (field === 'diagram') {
|
|
16
|
+
const graph = parseFlowchart(value);
|
|
17
|
+
const invalid = graph.issues.filter(issue => !issue.startsWith('Connection needs'));
|
|
18
|
+
if (invalid.length)
|
|
19
|
+
throw new Error(invalid.join('\n'));
|
|
20
|
+
const direct = view.nodes.filter(node => node.parentId === nodeId);
|
|
21
|
+
const removed = new Set(direct.filter(node => !graph.nodes.some(item => item.id === node.id)).map(node => node.id));
|
|
22
|
+
for (let index = 0; index < view.nodes.length; index++)
|
|
23
|
+
for (const node of view.nodes)
|
|
24
|
+
if (node.parentId && removed.has(node.parentId))
|
|
25
|
+
removed.add(node.id);
|
|
26
|
+
view.nodes = view.nodes.filter(node => !removed.has(node.id));
|
|
27
|
+
const directIds = new Set(direct.map(node => node.id));
|
|
28
|
+
view.edges = view.edges.filter(edge => !removed.has(edge.from) && !removed.has(edge.to) && !(directIds.has(edge.from) && directIds.has(edge.to)));
|
|
29
|
+
for (const item of graph.nodes) {
|
|
30
|
+
let node = view.nodes.find(node => node.id === item.id);
|
|
31
|
+
if (node && node.parentId !== nodeId)
|
|
32
|
+
throw new Error(`Diagram ID belongs to another level: ${item.id}`);
|
|
33
|
+
if (!node) {
|
|
34
|
+
node = { id: item.id, title: item.label.split('\n')[0], summary: '', files: [], ...(nodeId ? { parentId: nodeId } : {}) };
|
|
35
|
+
view.nodes.push(node);
|
|
36
|
+
}
|
|
37
|
+
node.title = item.label.split('\n')[0];
|
|
38
|
+
node.role = item.role;
|
|
39
|
+
if (item.ref) {
|
|
40
|
+
if (!document.perspectives.some(view => view.id === item.ref))
|
|
41
|
+
throw new Error(`Reference does not exist: ${item.ref}`);
|
|
42
|
+
node.references = [{ perspective: item.ref }];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
view.edges.push(...graph.edges);
|
|
46
|
+
for (const other of document.perspectives)
|
|
47
|
+
for (const node of other.nodes)
|
|
48
|
+
if (node.references?.some(ref => ref.perspective === perspective && ref.node && removed.has(ref.node)))
|
|
49
|
+
throw new Error('A removed node is referenced by another perspective');
|
|
50
|
+
}
|
|
51
|
+
return parseArchitecture(JSON.stringify(document));
|
|
52
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export function parseFlowchart(raw) {
|
|
2
|
+
if (raw.length > 100_000)
|
|
3
|
+
throw new Error('Diagram is too large');
|
|
4
|
+
const nodes = new Map(), edges = [], issues = [];
|
|
5
|
+
const clean = (value) => value.replace(/<br\s*\/?>/gi, '\n').replace(/\\n/g, '\n');
|
|
6
|
+
const token = (value) => {
|
|
7
|
+
const match = value.trim().match(/^(@?[\w-]+)(?:\s*(?:\[|\(\(?|\{)\s*(.*?)\s*(?:\]|\)\)?|\}))?(?:::\w+)?$/);
|
|
8
|
+
if (!match)
|
|
9
|
+
return null;
|
|
10
|
+
const id = match[1].replace(/^@/, ''), label = clean((match[2] ?? id).replace(/^"|"$/g, ''));
|
|
11
|
+
const ref = label.match(/^@([\w-]+)(?:\n|$)/)?.[1] ?? (match[1].startsWith('@') ? id : undefined);
|
|
12
|
+
return { id, label, ...(ref ? { ref } : {}) };
|
|
13
|
+
};
|
|
14
|
+
const put = (node) => { const previous = nodes.get(node.id); if (!previous || node.label !== node.id)
|
|
15
|
+
nodes.set(node.id, node); };
|
|
16
|
+
const lines = raw.split('\n').map(line => line.trim()).filter(line => line && !line.startsWith('%%'));
|
|
17
|
+
if (raw && !/^(?:graph|flowchart)\s+(?:LR|RL|TD|TB|BT)\b/i.test(lines[0] ?? ''))
|
|
18
|
+
issues.push('Diagram must start with a flowchart direction');
|
|
19
|
+
for (const original of lines) {
|
|
20
|
+
const line = original.replace(/;\s*$/, '');
|
|
21
|
+
if (/^(graph|flowchart|classDef|click\s|style\s|linkStyle|subgraph|end$)/i.test(line))
|
|
22
|
+
continue;
|
|
23
|
+
const cls = line.match(/^class\s+([\w\-,\s]+)\s+(entry|store|external|concern)$/);
|
|
24
|
+
if (cls) {
|
|
25
|
+
for (const id of cls[1].split(',').map(value => value.trim())) {
|
|
26
|
+
const node = nodes.get(id);
|
|
27
|
+
if (node)
|
|
28
|
+
node.role = cls[2];
|
|
29
|
+
}
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (/^class\s/.test(line))
|
|
33
|
+
continue;
|
|
34
|
+
const quoted = line.match(/^(.+?)\s+--\s+"([^"]+)"\s+-->\s+(.+)$/);
|
|
35
|
+
const parts = quoted ? [quoted[1], quoted[2], quoted[3]] : line.split(/(-->(?:\|[^|]*\|)?|--o|--x|---|-\.->|==>|~~>)/);
|
|
36
|
+
if (parts.length >= 3) {
|
|
37
|
+
for (let index = 0; index + 2 < parts.length; index += 2) {
|
|
38
|
+
const from = token(parts[index]), to = token(parts[index + 2]);
|
|
39
|
+
if (!from || !to) {
|
|
40
|
+
issues.push(`Unrecognized connection: ${line}`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
put(from);
|
|
44
|
+
put(to);
|
|
45
|
+
const label = clean(quoted ? parts[index + 1] : (parts[index + 1].match(/\|([^|]*)\|/)?.[1] ?? '').replace(/^"|"$/g, ''));
|
|
46
|
+
edges.push({ from: from.id, to: to.id, label });
|
|
47
|
+
if (!label)
|
|
48
|
+
issues.push(`Connection needs a label: ${from.id} → ${to.id}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const node = token(line);
|
|
53
|
+
if (node)
|
|
54
|
+
put(node);
|
|
55
|
+
else
|
|
56
|
+
issues.push(`Unrecognized diagram line: ${line}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (nodes.size > 200 || edges.length > 600)
|
|
60
|
+
throw new Error('Diagram exceeds the architecture limit');
|
|
61
|
+
return { nodes: [...nodes.values()], edges, issues };
|
|
62
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight mermaid parser — extracts node IDs and edges from mermaid text.
|
|
3
|
+
* Handles: graph/flowchart LR/TD/TB, subgraph, and common arrow syntaxes.
|
|
4
|
+
*/
|
|
5
|
+
export function parseMermaid(text) {
|
|
6
|
+
const nodes = new Set();
|
|
7
|
+
const edges = new Set();
|
|
8
|
+
const lines = text.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('%%'));
|
|
9
|
+
for (const line of lines) {
|
|
10
|
+
// Skip directives, classDef, click, style, etc.
|
|
11
|
+
if (/^(graph|flowchart|sequenceDiagram|classDiagram|erDiagram|gantt|pie|gitGraph)/i.test(line))
|
|
12
|
+
continue;
|
|
13
|
+
if (/^(classDef|class |click |style |linkStyle|subgraph|end$)/i.test(line))
|
|
14
|
+
continue;
|
|
15
|
+
if (/^%%\{/.test(line))
|
|
16
|
+
continue;
|
|
17
|
+
// Match edges: A --> B, A -->|label| B, A -- text --> B, etc.
|
|
18
|
+
const edgePattern = /^(\S+?)(?:\[.*?\]|(?:\(.*?\))|\{.*?\}|>.*?])?(\s*)(-->|--o|--x|---|-.->|==>|~~>|--\|.*?\|)(\s*)(\S+?)(?:\[.*?\]|(?:\(.*?\))|\{.*?\}|>.*?])?$/;
|
|
19
|
+
const edgeMatch = line.match(edgePattern);
|
|
20
|
+
if (edgeMatch) {
|
|
21
|
+
const [, src, , arrow, , dst] = edgeMatch;
|
|
22
|
+
const srcId = src.replace(/["']/g, '');
|
|
23
|
+
const dstId = dst.replace(/["']/g, '');
|
|
24
|
+
nodes.add(srcId);
|
|
25
|
+
nodes.add(dstId);
|
|
26
|
+
edges.add(`${srcId} ${arrow} ${dstId}`);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
// Broader edge match for complex syntax: A[Label] --> B[Label]
|
|
30
|
+
const broadEdge = /^([^\s[\]({]+).*?(-->|--o|--x|---|-.->|==>|~~>).*?([^\s[\]({]+)/;
|
|
31
|
+
const broadMatch = line.match(broadEdge);
|
|
32
|
+
if (broadMatch) {
|
|
33
|
+
const [, src, arrow, dst] = broadMatch;
|
|
34
|
+
const srcId = src.replace(/["']/g, '');
|
|
35
|
+
const dstId = dst.replace(/["']/g, '');
|
|
36
|
+
nodes.add(srcId);
|
|
37
|
+
nodes.add(dstId);
|
|
38
|
+
edges.add(`${srcId} ${arrow} ${dstId}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// Standalone node: A[Label] or A((Label)) or A{Label}
|
|
42
|
+
const nodeMatch = line.match(/^([^\s[\]({]+)[\[({]/);
|
|
43
|
+
if (nodeMatch) {
|
|
44
|
+
nodes.add(nodeMatch[1].replace(/["']/g, ''));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { nodes, edges };
|
|
48
|
+
}
|
|
49
|
+
export function diffMermaid(before, after) {
|
|
50
|
+
const prev = parseMermaid(before);
|
|
51
|
+
const curr = parseMermaid(after);
|
|
52
|
+
const added_nodes = [...curr.nodes].filter(n => !prev.nodes.has(n));
|
|
53
|
+
const removed_nodes = [...prev.nodes].filter(n => !curr.nodes.has(n));
|
|
54
|
+
const added_edges = [...curr.edges].filter(e => !prev.edges.has(e));
|
|
55
|
+
const removed_edges = [...prev.edges].filter(e => !curr.edges.has(e));
|
|
56
|
+
return {
|
|
57
|
+
added_nodes,
|
|
58
|
+
removed_nodes,
|
|
59
|
+
added_edges,
|
|
60
|
+
removed_edges,
|
|
61
|
+
has_changes: added_nodes.length > 0 || removed_nodes.length > 0 || added_edges.length > 0 || removed_edges.length > 0,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function formatDiff(diff) {
|
|
65
|
+
if (!diff.has_changes)
|
|
66
|
+
return 'No changes detected.\n';
|
|
67
|
+
const lines = [];
|
|
68
|
+
if (diff.added_nodes.length) {
|
|
69
|
+
lines.push('Added nodes:');
|
|
70
|
+
diff.added_nodes.forEach(n => lines.push(` + ${n}`));
|
|
71
|
+
}
|
|
72
|
+
if (diff.removed_nodes.length) {
|
|
73
|
+
lines.push('Removed nodes:');
|
|
74
|
+
diff.removed_nodes.forEach(n => lines.push(` - ${n}`));
|
|
75
|
+
}
|
|
76
|
+
if (diff.added_edges.length) {
|
|
77
|
+
lines.push('Added edges:');
|
|
78
|
+
diff.added_edges.forEach(e => lines.push(` + ${e}`));
|
|
79
|
+
}
|
|
80
|
+
if (diff.removed_edges.length) {
|
|
81
|
+
lines.push('Removed edges:');
|
|
82
|
+
diff.removed_edges.forEach(e => lines.push(` - ${e}`));
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n') + '\n';
|
|
85
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { pathValidator } from '../utils/pathValidator.js';
|
|
3
|
+
import { ARCHITECTURE_FIELDS, ARCHITECTURE_FILE } from './document.js';
|
|
4
|
+
import { ArchitectureConflict, ArchitectureStore } from './store.js';
|
|
5
|
+
import { updateArchitectureField } from './fieldMutation.js';
|
|
6
|
+
/** Mounted below /api/terminal, after its existing auth, CSRF and encrypted transport. */
|
|
7
|
+
export function architectureRoutes() {
|
|
8
|
+
const router = Router();
|
|
9
|
+
router.use(async (req, res, next) => {
|
|
10
|
+
try {
|
|
11
|
+
const requested = req.method === 'GET' ? req.query.root : req.body?.root;
|
|
12
|
+
if (typeof requested !== 'string') {
|
|
13
|
+
res.status(400).json({ error: 'Project root is required' });
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const root = await (req.pathValidator ?? pathValidator).validateAsync(requested);
|
|
17
|
+
res.locals.architectureStore = new ArchitectureStore(root);
|
|
18
|
+
next();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
res.status(403).json({ error: error instanceof Error ? error.message : 'Project cannot be accessed' });
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
const store = (res) => res.locals.architectureStore;
|
|
25
|
+
router.get('/documents', async (_req, res, next) => { try {
|
|
26
|
+
res.json({ files: await store(res).list() });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
next(error);
|
|
30
|
+
} });
|
|
31
|
+
router.get('/document', async (req, res, next) => { try {
|
|
32
|
+
res.json(await store(res).read(typeof req.query.file === 'string' ? req.query.file : ARCHITECTURE_FILE));
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
next(error);
|
|
36
|
+
} });
|
|
37
|
+
router.put('/document', async (req, res, next) => { try {
|
|
38
|
+
res.json(await store(res).save(req.body.file ?? ARCHITECTURE_FILE, req.body.document, req.body.revision));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
next(error);
|
|
42
|
+
} });
|
|
43
|
+
router.get('/history', async (req, res, next) => { try {
|
|
44
|
+
res.json({ versions: await store(res).history(String(req.query.file ?? ARCHITECTURE_FILE)) });
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
next(error);
|
|
48
|
+
} });
|
|
49
|
+
router.get('/version', async (req, res, next) => { try {
|
|
50
|
+
res.json({ document: await store(res).historical(String(req.query.file), String(req.query.id)) });
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
next(error);
|
|
54
|
+
} });
|
|
55
|
+
router.get('/bundle', async (req, res, next) => {
|
|
56
|
+
try {
|
|
57
|
+
const file = String(req.query.file ?? ARCHITECTURE_FILE), storage = store(res);
|
|
58
|
+
const loaded = await storage.read(file);
|
|
59
|
+
if (!loaded.document) {
|
|
60
|
+
res.status(404).json({ error: 'Architecture document not found' });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
res.json(file === '.omm' ? await storage.exportOmmBundle() : await storage.exportOmmBundle(loaded.document));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
next(error);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
router.put('/bundle', async (req, res, next) => { try {
|
|
70
|
+
await store(res).importOmmBundle(req.body.bundle, req.body.revision);
|
|
71
|
+
res.json(await store(res).read('.omm'));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
next(error);
|
|
75
|
+
} });
|
|
76
|
+
router.put('/field', async (req, res, next) => {
|
|
77
|
+
try {
|
|
78
|
+
const { file = ARCHITECTURE_FILE, perspective, node, field, value, revision } = req.body;
|
|
79
|
+
if (!ARCHITECTURE_FIELDS.includes(field) || typeof value !== 'string' || value.length > 100_000) {
|
|
80
|
+
res.status(400).json({ error: 'Invalid architecture field' });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const storage = store(res);
|
|
84
|
+
if (file === '.omm') {
|
|
85
|
+
const loaded = await storage.read('.omm'), view = loaded.document?.perspectives.find(view => view.id === perspective);
|
|
86
|
+
const target = node ? view?.nodes.find(item => item.id === node) : view;
|
|
87
|
+
if (!view || !target) {
|
|
88
|
+
res.status(404).json({ error: 'Architecture element not found' });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Resolve opaque viewer IDs back to .omm paths through the store's stable IDs.
|
|
92
|
+
const { createHash } = await import('node:crypto');
|
|
93
|
+
const element = node ? ('documentPath' in target && typeof target.documentPath === 'string' && target.documentPath.startsWith(`${view.id}/`) && `e_${createHash('sha256').update(target.documentPath).digest('hex').slice(0, 20)}` === node ? target.documentPath : undefined) : view.id;
|
|
94
|
+
if (!element) {
|
|
95
|
+
res.status(404).json({ error: 'Architecture element has no document yet' });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
res.json(await storage.writeOmmField(element, field, value, revision));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const loaded = await storage.read(file);
|
|
102
|
+
if (!loaded.document) {
|
|
103
|
+
res.status(404).json({ error: 'Architecture document not found' });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const document = updateArchitectureField(loaded.document, perspective, node, field, value);
|
|
107
|
+
res.json(await storage.save(file, document, revision));
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
next(error);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
router.use((error, _req, res, _next) => {
|
|
114
|
+
res.status(error instanceof ArchitectureConflict ? 409 : 400).json({ error: error instanceof Error ? error.message : 'Architecture operation failed' });
|
|
115
|
+
});
|
|
116
|
+
return router;
|
|
117
|
+
}
|