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.
Files changed (370) hide show
  1. package/README.en.md +3 -1
  2. package/README.md +3 -1
  3. package/THIRD_PARTY_NOTICES.md +30 -0
  4. package/dist/client/assets/{App-ggIA_xqR.js → App-CytIMrFr.js} +62 -55
  5. package/dist/client/assets/App-CytIMrFr.js.br +0 -0
  6. package/dist/client/assets/App-CytIMrFr.js.gz +0 -0
  7. package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js +9 -0
  8. package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.br +0 -0
  9. package/dist/client/assets/ArchitecturePanel-BRTR2IsK.js.gz +0 -0
  10. package/dist/client/assets/{ArchitecturePanel-Cmpmp6FS.css → ArchitecturePanel-B_BDrrfR.css} +1 -1
  11. package/dist/client/assets/ArchitecturePanel-B_BDrrfR.css.br +0 -0
  12. package/dist/client/assets/ArchitecturePanel-B_BDrrfR.css.gz +0 -0
  13. package/dist/client/assets/{ChangeWalkthroughPanel-D1Puc7B3.js → ChangeWalkthroughPanel-Bm9Tvd6H.js} +2 -2
  14. package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.br +0 -0
  15. package/dist/client/assets/ChangeWalkthroughPanel-Bm9Tvd6H.js.gz +0 -0
  16. package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js +1 -0
  17. package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.br +0 -0
  18. package/dist/client/assets/CollaborationMainWorkspace-BagYBDlJ.js.gz +0 -0
  19. package/dist/client/assets/CollaborationTaskContent-D7LXylWr.js +2 -0
  20. package/dist/client/assets/{ComputerControlView-D5Lw9sNA.js → ComputerControlView-CC6r2cD3.js} +2 -2
  21. package/dist/client/assets/ComputerControlView-CC6r2cD3.js.br +0 -0
  22. package/dist/client/assets/ComputerControlView-CC6r2cD3.js.gz +0 -0
  23. package/dist/client/assets/{DagPlayground-DYJrGfiG.js → DagPlayground-BqAadqBT.js} +1 -1
  24. package/dist/client/assets/DagPlayground-BqAadqBT.js.br +0 -0
  25. package/dist/client/assets/DagPlayground-BqAadqBT.js.gz +0 -0
  26. package/dist/client/assets/{DiffLab-5zdcFW3z.js → DiffLab-CrEVLy-j.js} +1 -1
  27. package/dist/client/assets/DiffLab-CrEVLy-j.js.br +0 -0
  28. package/dist/client/assets/DiffLab-CrEVLy-j.js.gz +0 -0
  29. package/dist/client/assets/{DiffReview-BBBC_NjV.js → DiffReview-C8e2GQxb.js} +1 -1
  30. package/dist/client/assets/DiffReview-C8e2GQxb.js.br +0 -0
  31. package/dist/client/assets/DiffReview-C8e2GQxb.js.gz +0 -0
  32. package/dist/client/assets/{DiffReviewLab-CbhosFSB.js → DiffReviewLab-RQ1NmpZE.js} +2 -2
  33. package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.br +0 -0
  34. package/dist/client/assets/DiffReviewLab-RQ1NmpZE.js.gz +0 -0
  35. package/dist/client/assets/{DiffViewer-BuQwFQ4V.js → DiffViewer-KljgMa9h.js} +8 -8
  36. package/dist/client/assets/DiffViewer-KljgMa9h.js.br +0 -0
  37. package/dist/client/assets/DiffViewer-KljgMa9h.js.gz +0 -0
  38. package/dist/client/assets/{ModelPreview-nO2VmqdP.js → ModelPreview-B9UR1TR3.js} +1 -1
  39. package/dist/client/assets/ModelPreview-B9UR1TR3.js.br +0 -0
  40. package/dist/client/assets/ModelPreview-B9UR1TR3.js.gz +0 -0
  41. package/dist/client/assets/RightSidebar-DSH93gN5.js +1677 -0
  42. package/dist/client/assets/RightSidebar-DSH93gN5.js.br +0 -0
  43. package/dist/client/assets/RightSidebar-DSH93gN5.js.gz +0 -0
  44. package/dist/client/assets/{abnfDiagram-VCTEODGH-yi0K8GDG.js → abnfDiagram-VCTEODGH-WFUf9n1A.js} +1 -1
  45. package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.br +0 -0
  46. package/dist/client/assets/abnfDiagram-VCTEODGH-WFUf9n1A.js.gz +0 -0
  47. package/dist/client/assets/{app-B6FdOF6K.js → app-Bey8S6UU.js} +4 -4
  48. package/dist/client/assets/app-Bey8S6UU.js.br +0 -0
  49. package/dist/client/assets/app-Bey8S6UU.js.gz +0 -0
  50. package/dist/client/assets/{arc-_nLI_-XZ.js → arc-BXKxIsA3.js} +1 -1
  51. package/dist/client/assets/arc-BXKxIsA3.js.br +0 -0
  52. package/dist/client/assets/arc-BXKxIsA3.js.gz +0 -0
  53. package/dist/client/assets/{architectureDiagram-5GKGNRK7-CikrA78O.js → architectureDiagram-5GKGNRK7-DAfRrSxr.js} +1 -1
  54. package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.br +0 -0
  55. package/dist/client/assets/architectureDiagram-5GKGNRK7-DAfRrSxr.js.gz +0 -0
  56. package/dist/client/assets/{blockDiagram-I7D4REHJ-CWJq6qJ7.js → blockDiagram-I7D4REHJ-1HbSy7rb.js} +1 -1
  57. package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.br +0 -0
  58. package/dist/client/assets/blockDiagram-I7D4REHJ-1HbSy7rb.js.gz +0 -0
  59. package/dist/client/assets/{c4Diagram-7LVT6UL2-gzPzLGvs.js → c4Diagram-7LVT6UL2-Dxwui-M_.js} +1 -1
  60. package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.br +0 -0
  61. package/dist/client/assets/c4Diagram-7LVT6UL2-Dxwui-M_.js.gz +0 -0
  62. package/dist/client/assets/channel-Dkh0SMv-.js +1 -0
  63. package/dist/client/assets/{chunk-2Q5K7J3B-CfX9l18E.js → chunk-2Q5K7J3B-CJSdJ_A1.js} +1 -1
  64. package/dist/client/assets/{chunk-5VM5RSS4-JSV1yrXM.js → chunk-5VM5RSS4-BNEXn4bI.js} +1 -1
  65. package/dist/client/assets/{chunk-F27PBJKO-CQ0LXeap.js → chunk-F27PBJKO-BaM6iLMb.js} +1 -1
  66. package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.br +0 -0
  67. package/dist/client/assets/chunk-F27PBJKO-BaM6iLMb.js.gz +0 -0
  68. package/dist/client/assets/{chunk-IMKFNOWR-CJOEPkK9.js → chunk-IMKFNOWR-DxPJBdLq.js} +1 -1
  69. package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.br +0 -0
  70. package/dist/client/assets/chunk-IMKFNOWR-DxPJBdLq.js.gz +0 -0
  71. package/dist/client/assets/{chunk-JWPE2WC7-Dpp7Xu_E.js → chunk-JWPE2WC7-BwEOSoiu.js} +1 -1
  72. package/dist/client/assets/{chunk-POPQ4Y6H-9hDa1b8z.js → chunk-POPQ4Y6H-CbYcBz8G.js} +1 -1
  73. package/dist/client/assets/{chunk-SVP7TREG-BskkG9gg.js → chunk-SVP7TREG-CpnycZ3K.js} +1 -1
  74. package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.br +0 -0
  75. package/dist/client/assets/chunk-SVP7TREG-CpnycZ3K.js.gz +0 -0
  76. package/dist/client/assets/{chunk-TICWLB2K-DyzuP-9I.js → chunk-TICWLB2K-5oWwjAOF.js} +1 -1
  77. package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.br +0 -0
  78. package/dist/client/assets/chunk-TICWLB2K-5oWwjAOF.js.gz +0 -0
  79. package/dist/client/assets/{chunk-XXDRQBXY-C31_1i6z.js → chunk-XXDRQBXY-VWUm4Sz5.js} +1 -1
  80. package/dist/client/assets/classDiagram-ZZMXUADV-DqvmSdwt.js +1 -0
  81. package/dist/client/assets/classDiagram-v2-VYDZK3BY-DqvmSdwt.js +1 -0
  82. package/dist/client/assets/{cose-bilkent-JH36ORCC-Bm-ESDOc.js → cose-bilkent-JH36ORCC-gpF5Tw44.js} +1 -1
  83. package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.br +0 -0
  84. package/dist/client/assets/cose-bilkent-JH36ORCC-gpF5Tw44.js.gz +0 -0
  85. package/dist/client/assets/{cynefin-OW5HDTMX-DbFWAPvX.js → cynefin-OW5HDTMX-HFr7zRQ0.js} +1 -1
  86. package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.br +0 -0
  87. package/dist/client/assets/cynefin-OW5HDTMX-HFr7zRQ0.js.gz +0 -0
  88. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js → cynefinDiagram-5FMLGOSQ-LccKgJj0.js} +1 -1
  89. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.br +0 -0
  90. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-LccKgJj0.js.gz +0 -0
  91. package/dist/client/assets/{dagre-GXQ25YYZ-D_5uEMjJ.js → dagre-GXQ25YYZ-C7eLk1r1.js} +1 -1
  92. package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.br +0 -0
  93. package/dist/client/assets/dagre-GXQ25YYZ-C7eLk1r1.js.gz +0 -0
  94. package/dist/client/assets/{diagram-S7CK7UJ4-DWVpndRP.js → diagram-S7CK7UJ4-DkWPZYAg.js} +1 -1
  95. package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.br +0 -0
  96. package/dist/client/assets/diagram-S7CK7UJ4-DkWPZYAg.js.gz +0 -0
  97. package/dist/client/assets/{diagram-UQ7AKVKN-DmYTya3w.js → diagram-UQ7AKVKN-DluTsMXz.js} +1 -1
  98. package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.br +0 -0
  99. package/dist/client/assets/diagram-UQ7AKVKN-DluTsMXz.js.gz +0 -0
  100. package/dist/client/assets/{diagram-VSXAHHWV-BEA6kqNj.js → diagram-VSXAHHWV-BLXEmXmu.js} +1 -1
  101. package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.br +0 -0
  102. package/dist/client/assets/diagram-VSXAHHWV-BLXEmXmu.js.gz +0 -0
  103. package/dist/client/assets/{diagram-VX7I27RA-CU9vP0P0.js → diagram-VX7I27RA-DO3J99WU.js} +1 -1
  104. package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.br +0 -0
  105. package/dist/client/assets/diagram-VX7I27RA-DO3J99WU.js.gz +0 -0
  106. package/dist/client/assets/{diagram-Z3DM3KII-B_GvE2g-.js → diagram-Z3DM3KII-kvkSusTy.js} +1 -1
  107. package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.br +0 -0
  108. package/dist/client/assets/diagram-Z3DM3KII-kvkSusTy.js.gz +0 -0
  109. package/dist/client/assets/{ebnfDiagram-PWID7BFC-BLrPQuLE.js → ebnfDiagram-PWID7BFC-Bxd9hatc.js} +1 -1
  110. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.br +0 -0
  111. package/dist/client/assets/ebnfDiagram-PWID7BFC-Bxd9hatc.js.gz +0 -0
  112. package/dist/client/assets/{erDiagram-RLTQ6QDP-DlXgoyZ-.js → erDiagram-RLTQ6QDP-BWc3uM23.js} +1 -1
  113. package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.br +0 -0
  114. package/dist/client/assets/erDiagram-RLTQ6QDP-BWc3uM23.js.gz +0 -0
  115. package/dist/client/assets/{flowDiagram-HODETNUW-fPHWxEDZ.js → flowDiagram-HODETNUW-BQhPtc9z.js} +1 -1
  116. package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.br +0 -0
  117. package/dist/client/assets/flowDiagram-HODETNUW-BQhPtc9z.js.gz +0 -0
  118. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-B8MOv6ug.js → ganttDiagram-EL5Y4UJY-DzmTLgVr.js} +1 -1
  119. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.br +0 -0
  120. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DzmTLgVr.js.gz +0 -0
  121. package/dist/client/assets/{gestureArbiter-JW8vcVRm.js → gestureArbiter-BuNZMZ7A.js} +1 -1
  122. package/dist/client/assets/gestureArbiter-BuNZMZ7A.js.br +0 -0
  123. package/dist/client/assets/gestureArbiter-BuNZMZ7A.js.gz +0 -0
  124. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-lH9gSoFx.js → gitGraphDiagram-WWUBYQGX-r0Onfl7K.js} +1 -1
  125. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.br +0 -0
  126. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-r0Onfl7K.js.gz +0 -0
  127. package/dist/client/assets/{index-CNY7CTVa.css → index-C6D5a-dg.css} +1 -1
  128. package/dist/client/assets/index-C6D5a-dg.css.br +0 -0
  129. package/dist/client/assets/{index-CNY7CTVa.css.gz → index-C6D5a-dg.css.gz} +0 -0
  130. package/dist/client/assets/{infoDiagram-27XIBGKW-CSG29Ty_.js → infoDiagram-27XIBGKW-C52jpDzv.js} +1 -1
  131. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-CcwSE5qV.js → ishikawaDiagram-5VMMS53U-C-l0eHmO.js} +1 -1
  132. package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.br +0 -0
  133. package/dist/client/assets/ishikawaDiagram-5VMMS53U-C-l0eHmO.js.gz +0 -0
  134. package/dist/client/assets/{journeyDiagram-3NMN7TZE-CXFUeP2c.js → journeyDiagram-3NMN7TZE-DmhgEOjX.js} +1 -1
  135. package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.br +0 -0
  136. package/dist/client/assets/journeyDiagram-3NMN7TZE-DmhgEOjX.js.gz +0 -0
  137. package/dist/client/assets/{kanban-definition-UXKFOSKX-KEHwljd2.js → kanban-definition-UXKFOSKX-BnZWlxIT.js} +1 -1
  138. package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.br +0 -0
  139. package/dist/client/assets/kanban-definition-UXKFOSKX-BnZWlxIT.js.gz +0 -0
  140. package/dist/client/assets/{layout-DqYx0MnO.js → layout-BrxPpC7u.js} +1 -1
  141. package/dist/client/assets/layout-BrxPpC7u.js.br +0 -0
  142. package/dist/client/assets/layout-BrxPpC7u.js.gz +0 -0
  143. package/dist/client/assets/{linear-BnG3XaJW.js → linear-DaEpqVcH.js} +1 -1
  144. package/dist/client/assets/linear-DaEpqVcH.js.br +0 -0
  145. package/dist/client/assets/linear-DaEpqVcH.js.gz +0 -0
  146. package/dist/client/assets/{mermaid.core-Ce00rdM6.js → mermaid.core-CidoOS12.js} +5 -5
  147. package/dist/client/assets/mermaid.core-CidoOS12.js.br +0 -0
  148. package/dist/client/assets/mermaid.core-CidoOS12.js.gz +0 -0
  149. package/dist/client/assets/{mindmap-definition-YA3MSWOX-D0hOW4SY.js → mindmap-definition-YA3MSWOX-Bpr3CVLy.js} +1 -1
  150. package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.br +0 -0
  151. package/dist/client/assets/mindmap-definition-YA3MSWOX-Bpr3CVLy.js.gz +0 -0
  152. package/dist/client/assets/passwordBootstrap-D7hFrc0r.js +2 -0
  153. package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.br +0 -0
  154. package/dist/client/assets/passwordBootstrap-D7hFrc0r.js.gz +0 -0
  155. package/dist/client/assets/{pegDiagram-XKGWAZYB-UKp9t91x.js → pegDiagram-XKGWAZYB-Bw2JpSYn.js} +1 -1
  156. package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.br +0 -0
  157. package/dist/client/assets/pegDiagram-XKGWAZYB-Bw2JpSYn.js.gz +0 -0
  158. package/dist/client/assets/{pieDiagram-E7YTZNPT-Dif97wbH.js → pieDiagram-E7YTZNPT-BaKc3ifQ.js} +1 -1
  159. package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.br +0 -0
  160. package/dist/client/assets/pieDiagram-E7YTZNPT-BaKc3ifQ.js.gz +0 -0
  161. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-BPyHtH91.js → quadrantDiagram-AXDQQJYC-B0Yi-dl9.js} +1 -1
  162. package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.br +0 -0
  163. package/dist/client/assets/quadrantDiagram-AXDQQJYC-B0Yi-dl9.js.gz +0 -0
  164. package/dist/client/assets/{railroadDiagram-O6MQD6OU-Wleq9LmS.js → railroadDiagram-O6MQD6OU-DCcCQofU.js} +1 -1
  165. package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.br +0 -0
  166. package/dist/client/assets/railroadDiagram-O6MQD6OU-DCcCQofU.js.gz +0 -0
  167. package/dist/client/assets/{rdpSession-CobFMSUs.js → rdpSession-DY81W5BY.js} +1 -1
  168. package/dist/client/assets/rdpSession-DY81W5BY.js.br +0 -0
  169. package/dist/client/assets/rdpSession-DY81W5BY.js.gz +0 -0
  170. package/dist/client/assets/{referenceLongPress-bZ0xp-v2.js → referenceLongPress-CAzWqXsY.js} +1 -1
  171. package/dist/client/assets/referenceLongPress-CAzWqXsY.js.br +0 -0
  172. package/dist/client/assets/referenceLongPress-CAzWqXsY.js.gz +0 -0
  173. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BL4pp0Ta.js → requirementDiagram-BXWQKSXE-CEJFRPWH.js} +1 -1
  174. package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.br +0 -0
  175. package/dist/client/assets/requirementDiagram-BXWQKSXE-CEJFRPWH.js.gz +0 -0
  176. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CV1cKx37.js → sankeyDiagram-P5KCCOFB-B3Wk45FA.js} +1 -1
  177. package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.br +0 -0
  178. package/dist/client/assets/sankeyDiagram-P5KCCOFB-B3Wk45FA.js.gz +0 -0
  179. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BF2InLwV.js → sequenceDiagram-WJ2MYXX4-BejEsITb.js} +1 -1
  180. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.br +0 -0
  181. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BejEsITb.js.gz +0 -0
  182. package/dist/client/assets/{sizeCapture-INFHLROL-CldUyStR.js → sizeCapture-INFHLROL-DZ5NJZnM.js} +1 -1
  183. package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.br +0 -0
  184. package/dist/client/assets/sizeCapture-INFHLROL-DZ5NJZnM.js.gz +0 -0
  185. package/dist/client/assets/{sparkles-Cg-yPdE2.js → sparkles-DQGLdN2b.js} +1 -1
  186. package/dist/client/assets/{stateDiagram-D77RDMKH-CByehbEd.js → stateDiagram-D77RDMKH-D8SSEwHa.js} +1 -1
  187. package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.br +0 -0
  188. package/dist/client/assets/stateDiagram-D77RDMKH-D8SSEwHa.js.gz +0 -0
  189. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-D1KQOetv.js +1 -0
  190. package/dist/client/assets/{swimlanes-42K2YHIH--1_7YTL4.js → swimlanes-42K2YHIH-Dow-EKMG.js} +1 -1
  191. package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.br +0 -0
  192. package/dist/client/assets/swimlanes-42K2YHIH-Dow-EKMG.js.gz +0 -0
  193. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DQbZCzq9.js +8 -0
  194. package/dist/client/assets/{timeline-definition-24CTP7MA-CXfXJFK6.js → timeline-definition-24CTP7MA-DpQ9D5f6.js} +1 -1
  195. package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.br +0 -0
  196. package/dist/client/assets/timeline-definition-24CTP7MA-DpQ9D5f6.js.gz +0 -0
  197. package/dist/client/assets/{triangle-alert-CbMRJ6sx.js → triangle-alert-Bdf_dBch.js} +1 -1
  198. package/dist/client/assets/{vennDiagram-4TSXK5OY-byr6UQpL.js → vennDiagram-4TSXK5OY-DoemAmM2.js} +1 -1
  199. package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.br +0 -0
  200. package/dist/client/assets/vennDiagram-4TSXK5OY-DoemAmM2.js.gz +0 -0
  201. package/dist/client/assets/{videoCompression-ivJAy00d.js → videoCompression-Bg4gUQUf.js} +1 -1
  202. package/dist/client/assets/videoCompression-Bg4gUQUf.js.br +0 -0
  203. package/dist/client/assets/videoCompression-Bg4gUQUf.js.gz +0 -0
  204. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-FJduk-7s.js → wardleyDiagram-VM6X3IG4-MernEZ54.js} +1 -1
  205. package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.br +0 -0
  206. package/dist/client/assets/wardleyDiagram-VM6X3IG4-MernEZ54.js.gz +0 -0
  207. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-Ct1fBPFS.js → xychartDiagram-S5SC5T6Z-CzO3HEHD.js} +1 -1
  208. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.br +0 -0
  209. package/dist/client/assets/xychartDiagram-S5SC5T6Z-CzO3HEHD.js.gz +0 -0
  210. package/dist/client/index.html +2 -2
  211. package/dist/client/index.html.br +0 -0
  212. package/dist/client/index.html.gz +0 -0
  213. package/dist/client/sw.js +1 -1
  214. package/dist/client/sw.js.br +0 -0
  215. package/dist/client/sw.js.gz +0 -0
  216. package/dist/server/agent/integrationCli.js +23 -0
  217. package/dist/server/agent/integrationServer.js +7 -0
  218. package/dist/server/agent/integrationSessions.js +24 -1
  219. package/dist/server/agent/sessionLifecycle.js +2 -2
  220. package/dist/server/architecture/cli.js +295 -0
  221. package/dist/server/architecture/document.js +328 -0
  222. package/dist/server/architecture/documentDiff.js +34 -0
  223. package/dist/server/architecture/fieldMutation.js +52 -0
  224. package/dist/server/architecture/flowchart.js +62 -0
  225. package/dist/server/architecture/mermaidDiff.js +85 -0
  226. package/dist/server/architecture/routes.js +117 -0
  227. package/dist/server/architecture/store.js +502 -0
  228. package/dist/server/cli.js +7 -1
  229. package/dist/server/entry.js +2 -0
  230. package/dist/server/federation/accessPolicy.js +9 -1
  231. package/docs/integrations.md +40 -0
  232. package/package.json +3 -1
  233. package/runtime-manifest.json +4 -4
  234. package/dist/client/assets/App-ggIA_xqR.js.br +0 -0
  235. package/dist/client/assets/App-ggIA_xqR.js.gz +0 -0
  236. package/dist/client/assets/ArchitecturePanel-Cmpmp6FS.css.br +0 -0
  237. package/dist/client/assets/ArchitecturePanel-Cmpmp6FS.css.gz +0 -0
  238. package/dist/client/assets/ArchitecturePanel-CoBspW_C.js +0 -12
  239. package/dist/client/assets/ArchitecturePanel-CoBspW_C.js.br +0 -0
  240. package/dist/client/assets/ArchitecturePanel-CoBspW_C.js.gz +0 -0
  241. package/dist/client/assets/ChangeWalkthroughPanel-D1Puc7B3.js.br +0 -0
  242. package/dist/client/assets/ChangeWalkthroughPanel-D1Puc7B3.js.gz +0 -0
  243. package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js +0 -1
  244. package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js.br +0 -0
  245. package/dist/client/assets/CollaborationMainWorkspace-BPyK5Xs8.js.gz +0 -0
  246. package/dist/client/assets/CollaborationTaskContent-CTSJJqze.js +0 -2
  247. package/dist/client/assets/ComputerControlView-D5Lw9sNA.js.br +0 -0
  248. package/dist/client/assets/ComputerControlView-D5Lw9sNA.js.gz +0 -0
  249. package/dist/client/assets/DagPlayground-DYJrGfiG.js.br +0 -0
  250. package/dist/client/assets/DagPlayground-DYJrGfiG.js.gz +0 -0
  251. package/dist/client/assets/DiffLab-5zdcFW3z.js.br +0 -0
  252. package/dist/client/assets/DiffLab-5zdcFW3z.js.gz +0 -0
  253. package/dist/client/assets/DiffReview-BBBC_NjV.js.br +0 -0
  254. package/dist/client/assets/DiffReview-BBBC_NjV.js.gz +0 -0
  255. package/dist/client/assets/DiffReviewLab-CbhosFSB.js.br +0 -0
  256. package/dist/client/assets/DiffReviewLab-CbhosFSB.js.gz +0 -0
  257. package/dist/client/assets/DiffViewer-BuQwFQ4V.js.br +0 -0
  258. package/dist/client/assets/DiffViewer-BuQwFQ4V.js.gz +0 -0
  259. package/dist/client/assets/ModelPreview-nO2VmqdP.js.br +0 -0
  260. package/dist/client/assets/ModelPreview-nO2VmqdP.js.gz +0 -0
  261. package/dist/client/assets/RightSidebar-BoNzpS2K.js +0 -1677
  262. package/dist/client/assets/RightSidebar-BoNzpS2K.js.br +0 -0
  263. package/dist/client/assets/RightSidebar-BoNzpS2K.js.gz +0 -0
  264. package/dist/client/assets/abnfDiagram-VCTEODGH-yi0K8GDG.js.br +0 -0
  265. package/dist/client/assets/abnfDiagram-VCTEODGH-yi0K8GDG.js.gz +0 -0
  266. package/dist/client/assets/app-B6FdOF6K.js.br +0 -0
  267. package/dist/client/assets/app-B6FdOF6K.js.gz +0 -0
  268. package/dist/client/assets/arc-_nLI_-XZ.js.br +0 -0
  269. package/dist/client/assets/arc-_nLI_-XZ.js.gz +0 -0
  270. package/dist/client/assets/architectureDiagram-5GKGNRK7-CikrA78O.js.br +0 -0
  271. package/dist/client/assets/architectureDiagram-5GKGNRK7-CikrA78O.js.gz +0 -0
  272. package/dist/client/assets/blockDiagram-I7D4REHJ-CWJq6qJ7.js.br +0 -0
  273. package/dist/client/assets/blockDiagram-I7D4REHJ-CWJq6qJ7.js.gz +0 -0
  274. package/dist/client/assets/c4Diagram-7LVT6UL2-gzPzLGvs.js.br +0 -0
  275. package/dist/client/assets/c4Diagram-7LVT6UL2-gzPzLGvs.js.gz +0 -0
  276. package/dist/client/assets/channel-BYsFmOmF.js +0 -1
  277. package/dist/client/assets/chunk-F27PBJKO-CQ0LXeap.js.br +0 -0
  278. package/dist/client/assets/chunk-F27PBJKO-CQ0LXeap.js.gz +0 -0
  279. package/dist/client/assets/chunk-IMKFNOWR-CJOEPkK9.js.br +0 -0
  280. package/dist/client/assets/chunk-IMKFNOWR-CJOEPkK9.js.gz +0 -0
  281. package/dist/client/assets/chunk-SVP7TREG-BskkG9gg.js.br +0 -0
  282. package/dist/client/assets/chunk-SVP7TREG-BskkG9gg.js.gz +0 -0
  283. package/dist/client/assets/chunk-TICWLB2K-DyzuP-9I.js.br +0 -0
  284. package/dist/client/assets/chunk-TICWLB2K-DyzuP-9I.js.gz +0 -0
  285. package/dist/client/assets/classDiagram-ZZMXUADV-BnmZv6Ns.js +0 -1
  286. package/dist/client/assets/classDiagram-v2-VYDZK3BY-BnmZv6Ns.js +0 -1
  287. package/dist/client/assets/cose-bilkent-JH36ORCC-Bm-ESDOc.js.br +0 -0
  288. package/dist/client/assets/cose-bilkent-JH36ORCC-Bm-ESDOc.js.gz +0 -0
  289. package/dist/client/assets/cynefin-OW5HDTMX-DbFWAPvX.js.br +0 -0
  290. package/dist/client/assets/cynefin-OW5HDTMX-DbFWAPvX.js.gz +0 -0
  291. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js.br +0 -0
  292. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-Ca0IKRdH.js.gz +0 -0
  293. package/dist/client/assets/dagre-GXQ25YYZ-D_5uEMjJ.js.br +0 -0
  294. package/dist/client/assets/dagre-GXQ25YYZ-D_5uEMjJ.js.gz +0 -0
  295. package/dist/client/assets/diagram-S7CK7UJ4-DWVpndRP.js.br +0 -0
  296. package/dist/client/assets/diagram-S7CK7UJ4-DWVpndRP.js.gz +0 -0
  297. package/dist/client/assets/diagram-UQ7AKVKN-DmYTya3w.js.br +0 -0
  298. package/dist/client/assets/diagram-UQ7AKVKN-DmYTya3w.js.gz +0 -0
  299. package/dist/client/assets/diagram-VSXAHHWV-BEA6kqNj.js.br +0 -0
  300. package/dist/client/assets/diagram-VSXAHHWV-BEA6kqNj.js.gz +0 -0
  301. package/dist/client/assets/diagram-VX7I27RA-CU9vP0P0.js.br +0 -0
  302. package/dist/client/assets/diagram-VX7I27RA-CU9vP0P0.js.gz +0 -0
  303. package/dist/client/assets/diagram-Z3DM3KII-B_GvE2g-.js.br +0 -0
  304. package/dist/client/assets/diagram-Z3DM3KII-B_GvE2g-.js.gz +0 -0
  305. package/dist/client/assets/ebnfDiagram-PWID7BFC-BLrPQuLE.js.br +0 -0
  306. package/dist/client/assets/ebnfDiagram-PWID7BFC-BLrPQuLE.js.gz +0 -0
  307. package/dist/client/assets/erDiagram-RLTQ6QDP-DlXgoyZ-.js.br +0 -0
  308. package/dist/client/assets/erDiagram-RLTQ6QDP-DlXgoyZ-.js.gz +0 -0
  309. package/dist/client/assets/flowDiagram-HODETNUW-fPHWxEDZ.js.br +0 -0
  310. package/dist/client/assets/flowDiagram-HODETNUW-fPHWxEDZ.js.gz +0 -0
  311. package/dist/client/assets/ganttDiagram-EL5Y4UJY-B8MOv6ug.js.br +0 -0
  312. package/dist/client/assets/ganttDiagram-EL5Y4UJY-B8MOv6ug.js.gz +0 -0
  313. package/dist/client/assets/gestureArbiter-JW8vcVRm.js.br +0 -0
  314. package/dist/client/assets/gestureArbiter-JW8vcVRm.js.gz +0 -0
  315. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lH9gSoFx.js.br +0 -0
  316. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-lH9gSoFx.js.gz +0 -0
  317. package/dist/client/assets/index-CNY7CTVa.css.br +0 -0
  318. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CcwSE5qV.js.br +0 -0
  319. package/dist/client/assets/ishikawaDiagram-5VMMS53U-CcwSE5qV.js.gz +0 -0
  320. package/dist/client/assets/journeyDiagram-3NMN7TZE-CXFUeP2c.js.br +0 -0
  321. package/dist/client/assets/journeyDiagram-3NMN7TZE-CXFUeP2c.js.gz +0 -0
  322. package/dist/client/assets/kanban-definition-UXKFOSKX-KEHwljd2.js.br +0 -0
  323. package/dist/client/assets/kanban-definition-UXKFOSKX-KEHwljd2.js.gz +0 -0
  324. package/dist/client/assets/layout-DqYx0MnO.js.br +0 -0
  325. package/dist/client/assets/layout-DqYx0MnO.js.gz +0 -0
  326. package/dist/client/assets/linear-BnG3XaJW.js.br +0 -0
  327. package/dist/client/assets/linear-BnG3XaJW.js.gz +0 -0
  328. package/dist/client/assets/mermaid.core-Ce00rdM6.js.br +0 -0
  329. package/dist/client/assets/mermaid.core-Ce00rdM6.js.gz +0 -0
  330. package/dist/client/assets/mindmap-definition-YA3MSWOX-D0hOW4SY.js.br +0 -0
  331. package/dist/client/assets/mindmap-definition-YA3MSWOX-D0hOW4SY.js.gz +0 -0
  332. package/dist/client/assets/passwordBootstrap-Bncb8qF_.js +0 -2
  333. package/dist/client/assets/passwordBootstrap-Bncb8qF_.js.br +0 -0
  334. package/dist/client/assets/passwordBootstrap-Bncb8qF_.js.gz +0 -0
  335. package/dist/client/assets/pegDiagram-XKGWAZYB-UKp9t91x.js.br +0 -0
  336. package/dist/client/assets/pegDiagram-XKGWAZYB-UKp9t91x.js.gz +0 -0
  337. package/dist/client/assets/pieDiagram-E7YTZNPT-Dif97wbH.js.br +0 -0
  338. package/dist/client/assets/pieDiagram-E7YTZNPT-Dif97wbH.js.gz +0 -0
  339. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPyHtH91.js.br +0 -0
  340. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BPyHtH91.js.gz +0 -0
  341. package/dist/client/assets/railroadDiagram-O6MQD6OU-Wleq9LmS.js.br +0 -0
  342. package/dist/client/assets/railroadDiagram-O6MQD6OU-Wleq9LmS.js.gz +0 -0
  343. package/dist/client/assets/rdpSession-CobFMSUs.js.br +0 -0
  344. package/dist/client/assets/rdpSession-CobFMSUs.js.gz +0 -0
  345. package/dist/client/assets/referenceLongPress-bZ0xp-v2.js.br +0 -0
  346. package/dist/client/assets/referenceLongPress-bZ0xp-v2.js.gz +0 -0
  347. package/dist/client/assets/requirementDiagram-BXWQKSXE-BL4pp0Ta.js.br +0 -0
  348. package/dist/client/assets/requirementDiagram-BXWQKSXE-BL4pp0Ta.js.gz +0 -0
  349. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CV1cKx37.js.br +0 -0
  350. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CV1cKx37.js.gz +0 -0
  351. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BF2InLwV.js.br +0 -0
  352. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-BF2InLwV.js.gz +0 -0
  353. package/dist/client/assets/sizeCapture-INFHLROL-CldUyStR.js.br +0 -0
  354. package/dist/client/assets/sizeCapture-INFHLROL-CldUyStR.js.gz +0 -0
  355. package/dist/client/assets/stateDiagram-D77RDMKH-CByehbEd.js.br +0 -0
  356. package/dist/client/assets/stateDiagram-D77RDMKH-CByehbEd.js.gz +0 -0
  357. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CTcrJ-w0.js +0 -1
  358. package/dist/client/assets/swimlanes-42K2YHIH--1_7YTL4.js.br +0 -0
  359. package/dist/client/assets/swimlanes-42K2YHIH--1_7YTL4.js.gz +0 -0
  360. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-RSMV9AhO.js +0 -8
  361. package/dist/client/assets/timeline-definition-24CTP7MA-CXfXJFK6.js.br +0 -0
  362. package/dist/client/assets/timeline-definition-24CTP7MA-CXfXJFK6.js.gz +0 -0
  363. package/dist/client/assets/vennDiagram-4TSXK5OY-byr6UQpL.js.br +0 -0
  364. package/dist/client/assets/vennDiagram-4TSXK5OY-byr6UQpL.js.gz +0 -0
  365. package/dist/client/assets/videoCompression-ivJAy00d.js.br +0 -0
  366. package/dist/client/assets/videoCompression-ivJAy00d.js.gz +0 -0
  367. package/dist/client/assets/wardleyDiagram-VM6X3IG4-FJduk-7s.js.br +0 -0
  368. package/dist/client/assets/wardleyDiagram-VM6X3IG4-FJduk-7s.js.gz +0 -0
  369. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Ct1fBPFS.js.br +0 -0
  370. 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
+ }