@eventcatalog/core 5.0.0-beta.9 → 5.0.1

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 (458) hide show
  1. package/LICENSE +13 -12
  2. package/README.md +5 -5
  3. package/dist/analytics/analytics.cjs +1 -1
  4. package/dist/analytics/analytics.js +2 -2
  5. package/dist/analytics/log-build.cjs +91 -44
  6. package/dist/analytics/log-build.d.cts +2 -2
  7. package/dist/analytics/log-build.d.ts +2 -2
  8. package/dist/analytics/log-build.js +6 -5
  9. package/dist/analytics/studio-usage.cjs +90 -0
  10. package/dist/analytics/studio-usage.d.cts +5 -0
  11. package/dist/analytics/studio-usage.d.ts +5 -0
  12. package/dist/analytics/studio-usage.js +10 -0
  13. package/dist/catalog-runtime.cjs +1 -1
  14. package/dist/{chunk-ZEY2XUJN.js → chunk-46TBJZC3.js} +1 -1
  15. package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
  16. package/dist/{chunk-AWOO63ME.js → chunk-AD7CL772.js} +11 -4
  17. package/dist/chunk-CA6WCQ2T.js +54 -0
  18. package/dist/{chunk-GAHKCOQM.js → chunk-DVHJTQWQ.js} +1 -1
  19. package/dist/{chunk-TZVDMWQX.js → chunk-HFR5OPHV.js} +4 -2
  20. package/dist/{chunk-4CFZUHGG.js → chunk-KTXSCPEK.js} +1 -1
  21. package/dist/{chunk-ENAG6UH7.js → chunk-NKNOXQ62.js} +1 -6
  22. package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
  23. package/dist/chunk-S5GWAUG5.js +29 -0
  24. package/dist/{chunk-EUNQJO3J.js → chunk-UWAXRTAJ.js} +1 -1
  25. package/dist/{chunk-JQMYHZWI.js → chunk-YPWK5ITM.js} +15 -7
  26. package/dist/constants.cjs +1 -1
  27. package/dist/constants.js +1 -1
  28. package/dist/docs/api/02-config.md +57 -7
  29. package/dist/docs/development/00-why-eventcatalog.md +11 -11
  30. package/dist/docs/development/01-fundamentals.md +20 -13
  31. package/dist/docs/development/01-getting-started/configuration-overview.md +2 -2
  32. package/dist/docs/development/01-getting-started/installation.md +9 -1
  33. package/dist/docs/development/_getting-started.mdx +1 -1
  34. package/dist/docs/development/ask-your-architecture/01-intro.md +5 -5
  35. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/01-what-is-eventcatalog-assistant.md +0 -4
  36. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/02-configuration.md +15 -3
  37. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/03-bring-your-own-tools.md +0 -3
  38. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/_category_.json +1 -1
  39. package/dist/docs/development/ask-your-architecture/02-llms.txt.md +1 -1
  40. package/dist/docs/development/ask-your-architecture/{05-skills/01-introduction.md → 03-install-skills.md} +57 -7
  41. package/dist/docs/development/ask-your-architecture/03-mcp-server/_category_.json +1 -1
  42. package/dist/docs/development/ask-your-architecture/03-mcp-server/getting-started.md +86 -33
  43. package/dist/docs/development/ask-your-architecture/03-mcp-server/introduction.md +14 -4
  44. package/dist/docs/development/ask-your-architecture/03-schemas.txt.md +1 -1
  45. package/dist/docs/development/ask-your-architecture/04-agents/_category_.json +1 -1
  46. package/dist/docs/development/authentication/01-introduction.md +2 -23
  47. package/dist/docs/development/authentication/02-enabling-authentication.md +0 -20
  48. package/dist/docs/development/authentication/07-rbac-middleware.md +0 -2
  49. package/dist/docs/development/authentication/providers/03-setting-up-github.md +0 -2
  50. package/dist/docs/development/authentication/providers/03a-setting-up-google.md +0 -2
  51. package/dist/docs/development/authentication/providers/04-setting-up-azure-ad.md +0 -2
  52. package/dist/docs/development/authentication/providers/05-setting-up-okta.md +0 -3
  53. package/dist/docs/development/authentication/providers/06-setting-up-auth0.md +0 -2
  54. package/dist/docs/development/bring-your-own-documentation/01-introduction.md +0 -4
  55. package/dist/docs/development/bring-your-own-documentation/custom-pages/01-introduction.md +0 -3
  56. package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +0 -17
  57. package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +0 -4
  58. package/dist/docs/development/bring-your-own-documentation/custom-pages/04-owners.md +0 -2
  59. package/dist/docs/development/bring-your-own-documentation/resource-docs/01-introduction.md +1 -3
  60. package/dist/docs/development/bring-your-own-documentation/resource-docs/02-adding-resource-docs.md +1 -4
  61. package/dist/docs/development/bring-your-own-documentation/resource-docs/03-categories.md +0 -2
  62. package/dist/docs/development/bring-your-own-documentation/resource-docs/04-versioning.md +1 -3
  63. package/dist/docs/development/components/components/11-flow.md +17 -0
  64. package/dist/docs/development/components/components/15-nodegraph.md +43 -10
  65. package/dist/docs/development/components/components/18-remote-schema.md +1 -4
  66. package/dist/docs/development/components/custom-components/07-reference.md +14 -0
  67. package/dist/docs/development/customization/02-themes.md +0 -5
  68. package/dist/docs/development/customization/03-search.md +1 -1
  69. package/dist/docs/development/customization/05-custom-pages-and-api-routes/01-introduction.md +0 -2
  70. package/dist/docs/development/customization/05-custom-pages-and-api-routes/04-reference.md +7 -1
  71. package/dist/docs/development/customization/05-resource-sidebar.md +1 -1
  72. package/dist/docs/development/customization/09-embed-eventcatalog.md +20 -25
  73. package/dist/docs/development/deployment/hosting-options.md +7 -2
  74. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +16 -0
  75. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +31 -1
  76. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +1 -1
  77. package/dist/docs/development/governance/architecture-change-detection/01-introduction.md +0 -10
  78. package/dist/docs/development/governance/architecture-change-detection/06-pipeline-gates.md +0 -4
  79. package/dist/docs/development/guides/97-architecture-graph.md +1 -1
  80. package/dist/docs/development/guides/99-adding-analytics.md +0 -7
  81. package/dist/docs/development/guides/domains/03-model-subdomains.md +2 -2
  82. package/dist/docs/development/guides/domains/04-add-resources-to-domains/01-add-systems-to-domains.md +3 -1
  83. package/dist/docs/development/guides/domains/04-add-resources-to-domains/02-add-services-to-domains.md +5 -1
  84. package/dist/docs/development/guides/domains/04-add-resources-to-domains/03-add-messages-to-domains.md +2 -2
  85. package/dist/docs/development/guides/domains/04-add-resources-to-domains/05-add-entities-to-domains.md +1 -1
  86. package/dist/docs/development/guides/domains/04-add-resources-to-domains/06-domain-resources-page.md +40 -0
  87. package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-diagram.md +89 -0
  88. package/dist/docs/development/guides/domains/06-visualize-domains/_category_.json +1 -2
  89. package/dist/docs/development/guides/domains/09-reference.md +4 -4
  90. package/dist/docs/development/guides/owners/automated-teams-and-users/create-your-own-connector.md +0 -2
  91. package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-github.md +0 -3
  92. package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-microsoft-entra.md +0 -2
  93. package/dist/docs/development/guides/resources/adrs/03-linking-resources.md +8 -0
  94. package/dist/docs/development/guides/resources/adrs/06-reference.md +4 -4
  95. package/dist/docs/development/guides/resources/agents/11-reference.md +1 -1
  96. package/dist/docs/development/guides/resources/data/04-reference.md +1 -1
  97. package/dist/docs/development/guides/resources/data-products/07-reference.md +1 -1
  98. package/dist/docs/development/guides/resources/entities/05-entity-maps.md +1 -1
  99. package/dist/docs/development/guides/resources/entities/06-reference.md +2 -2
  100. package/dist/docs/development/guides/resources/flows/01-introduction.md +11 -1
  101. package/dist/docs/development/guides/resources/flows/03-model-flow-steps.md +65 -6
  102. package/dist/docs/development/guides/resources/flows/05-explore-flows.md +112 -0
  103. package/dist/docs/development/guides/resources/flows/06-reference.md +25 -4
  104. package/dist/docs/development/guides/resources/messages/01-what-are-messages.md +19 -0
  105. package/dist/docs/development/guides/resources/messages/04-message-channels/01-introduction.md +16 -0
  106. package/dist/docs/development/guides/resources/messages/04-message-channels/05-reference.md +2 -1
  107. package/dist/docs/development/guides/resources/messages/10-reference.md +6 -3
  108. package/dist/docs/development/guides/resources/schemas/04-explore-schemas/01-schema-explorer.md +2 -2
  109. package/dist/docs/development/guides/resources/schemas/04-explore-schemas/02-fields-explorer.md +0 -9
  110. package/dist/docs/development/guides/resources/schemas/05-schema-api.md +0 -3
  111. package/dist/docs/development/guides/resources/schemas/06-schema-mcp.md +11 -3
  112. package/dist/docs/development/guides/resources/services/04-add-resources-to-services/03-add-entities-to-services.md +1 -1
  113. package/dist/docs/development/guides/resources/services/05-resources-page.md +50 -0
  114. package/dist/docs/development/guides/resources/services/08-reference.md +2 -1
  115. package/dist/docs/development/guides/systems/01-introduction.md +1 -1
  116. package/dist/docs/development/guides/systems/02-create-system.md +2 -2
  117. package/dist/docs/development/guides/systems/03-add-resources-to-systems.md +35 -9
  118. package/dist/docs/development/guides/systems/04-model-relationships-and-actors.md +5 -3
  119. package/dist/docs/development/guides/systems/05-system-context-maps.md +39 -22
  120. package/dist/docs/development/guides/systems/06-reference.md +4 -4
  121. package/dist/docs/development/license/01-license-file.md +151 -0
  122. package/dist/docs/development/license/_category_.json +12 -0
  123. package/dist/docs/development/license-keys/_category_.json +3 -3
  124. package/dist/docs/development/license-keys/integrations.md +7 -37
  125. package/dist/docs/development/license-keys/license-validation.md +4 -0
  126. package/dist/docs/development/license-keys/overview.md +5 -1
  127. package/dist/docs/development/license-keys/plans.md +4 -2
  128. package/dist/docs/development/studio/01-introduction.md +60 -0
  129. package/dist/docs/development/studio/02-create-a-canvas.md +103 -0
  130. package/dist/docs/development/studio/03-set-up-persistent-storage.md +59 -0
  131. package/dist/docs/development/studio/04-collaborate-on-a-canvas.md +78 -0
  132. package/dist/docs/development/studio/05-connect-your-agent.md +102 -0
  133. package/dist/docs/development/studio/06-run-studio-in-production.md +54 -0
  134. package/dist/docs/development/studio/07-reference.md +294 -0
  135. package/dist/docs/development/studio/_category_.json +12 -0
  136. package/dist/docs/development/upgrading/v5.md +345 -0
  137. package/dist/docs/federation/00-overview.md +2 -8
  138. package/dist/docs/federation/01-first-federation.md +6 -18
  139. package/dist/docs/federation/explanation/how-it-works.md +0 -4
  140. package/dist/docs/federation/explanation/lockfile-and-cache.md +0 -4
  141. package/dist/docs/federation/explanation/mvp-status-and-feedback.md +0 -4
  142. package/dist/docs/federation/explanation/ownership-and-references.md +0 -4
  143. package/dist/docs/federation/how-to/configure-github-sources.md +6 -5
  144. package/dist/docs/federation/how-to/configure-validation-rules.md +0 -4
  145. package/dist/docs/federation/how-to/run-in-ci.md +2 -9
  146. package/dist/docs/federation/how-to/share-assets-and-components.md +0 -4
  147. package/dist/docs/federation/how-to/use-local-sources.md +0 -4
  148. package/dist/docs/federation/legacy-federation/00-introduction.md +4 -22
  149. package/dist/docs/federation/legacy-federation/01-installation.md +7 -58
  150. package/dist/docs/federation/legacy-federation/02-plugin-configuration.md +3 -21
  151. package/dist/docs/federation/legacy-federation/03-examples.md +3 -5
  152. package/dist/docs/federation/legacy-federation/04-configuration.md +3 -8
  153. package/dist/docs/federation/legacy-federation/05-setup-team-catalog.md +3 -6
  154. package/dist/docs/federation/reference/cli.md +2 -8
  155. package/dist/docs/federation/reference/configuration.md +0 -4
  156. package/dist/docs/federation/reference/diagnostic-rules.md +0 -5
  157. package/dist/docs/federation/reference/generated-output.md +0 -4
  158. package/dist/docs/federation/reference/supported-content.md +0 -4
  159. package/dist/docs/federation/reference/troubleshooting.md +0 -14
  160. package/dist/docs/plugins/02-generators.md +1 -1
  161. package/dist/docs/plugins/amazon-apigateway/00-intro.md +3 -28
  162. package/dist/docs/plugins/amazon-apigateway/01-installation.md +4 -56
  163. package/dist/docs/plugins/amazon-apigateway/02-plugin-configuration.md +1 -6
  164. package/dist/docs/plugins/apicurio/00-intro.md +2 -31
  165. package/dist/docs/plugins/apicurio/01-installation.md +2 -26
  166. package/dist/docs/plugins/apicurio/02-plugin-configuration.md +5 -13
  167. package/dist/docs/plugins/apicurio/03-features.md +1 -3
  168. package/dist/docs/plugins/asyncapi/00-intro.md +2 -28
  169. package/dist/docs/plugins/asyncapi/01-installation.md +3 -54
  170. package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +2 -1
  171. package/dist/docs/plugins/aws-glue-registry/00-intro.md +4 -32
  172. package/dist/docs/plugins/aws-glue-registry/00a-installation.md +3 -53
  173. package/dist/docs/plugins/azure-schema-registry/00-intro.md +4 -32
  174. package/dist/docs/plugins/azure-schema-registry/01-installation.md +6 -33
  175. package/dist/docs/plugins/azure-schema-registry/02-plugin-configuration.md +1 -14
  176. package/dist/docs/plugins/azure-schema-registry/04-examples.md +0 -2
  177. package/dist/docs/plugins/backstage/00-overview.md +1 -7
  178. package/dist/docs/plugins/backstage/01-get-started.md +6 -15
  179. package/dist/docs/plugins/backstage/06-configuration.md +2 -8
  180. package/dist/docs/plugins/confluent-schema-registry/00-intro.md +2 -29
  181. package/dist/docs/plugins/confluent-schema-registry/01-installation.md +2 -26
  182. package/dist/docs/plugins/eventbridge/00-intro.md +0 -4
  183. package/dist/docs/plugins/eventbridge/00a-installation.md +1 -87
  184. package/dist/docs/plugins/eventbridge/03-api.md +2 -20
  185. package/dist/docs/plugins/github/00-intro.md +0 -31
  186. package/dist/docs/plugins/github/01-installation.md +2 -34
  187. package/dist/docs/plugins/graphql/00-intro.md +0 -30
  188. package/dist/docs/plugins/graphql/01-installation.md +1 -53
  189. package/dist/docs/plugins/graphql/02-plugin-configuration.md +0 -1
  190. package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
  191. package/dist/docs/plugins/openapi/00-intro.md +0 -30
  192. package/dist/docs/plugins/openapi/01-installation.md +1 -57
  193. package/dist/docs/plugins/openapi/02-plugin-configuration.md +0 -5
  194. package/dist/docs/plugins/openapi/03-features.md +0 -4
  195. package/dist/eventcatalog-config-file-utils.cjs +34 -41
  196. package/dist/eventcatalog-config-file-utils.d.cts +56 -58
  197. package/dist/eventcatalog-config-file-utils.d.ts +56 -58
  198. package/dist/eventcatalog-config-file-utils.js +1 -1
  199. package/dist/eventcatalog.cjs +340 -249
  200. package/dist/eventcatalog.config.d.cts +18 -15
  201. package/dist/eventcatalog.config.d.ts +18 -15
  202. package/dist/eventcatalog.js +46 -28
  203. package/dist/features.cjs +36 -49
  204. package/dist/features.d.cts +1 -3
  205. package/dist/features.d.ts +1 -3
  206. package/dist/features.js +4 -6
  207. package/dist/federation/federate.cjs +37 -44
  208. package/dist/federation/federate.js +2 -2
  209. package/dist/generate.cjs +37 -42
  210. package/dist/generate.js +4 -4
  211. package/dist/resolve-catalog-dependencies.cjs +34 -41
  212. package/dist/resolve-catalog-dependencies.js +2 -2
  213. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
  214. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
  215. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
  216. package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
  217. package/dist/runtime-dependencies/manifest.json +5 -1
  218. package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
  219. package/dist/utils/child-process-signals.cjs +53 -0
  220. package/dist/utils/child-process-signals.d.cts +19 -0
  221. package/dist/utils/child-process-signals.d.ts +19 -0
  222. package/dist/utils/child-process-signals.js +6 -0
  223. package/dist/utils/cli-logger.cjs +1 -1
  224. package/dist/utils/cli-logger.js +2 -2
  225. package/dist/utils/license-status.cjs +11 -4
  226. package/dist/utils/license-status.d.cts +3 -2
  227. package/dist/utils/license-status.d.ts +3 -2
  228. package/dist/utils/license-status.js +1 -1
  229. package/eventcatalog/astro.config.mjs +21 -1
  230. package/eventcatalog/integrations/config-loader.mjs +56 -58
  231. package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
  232. package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
  233. package/eventcatalog/integrations/storage.mjs +20 -0
  234. package/eventcatalog/integrations/studio-server.mjs +4 -1
  235. package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
  236. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
  237. package/eventcatalog/src/components/Homepage/CatalogDashboard.astro +342 -0
  238. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +60 -4
  239. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
  240. package/eventcatalog/src/components/NavigationProgress.astro +7 -0
  241. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
  242. package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
  243. package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
  244. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
  245. package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
  246. package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
  247. package/eventcatalog/src/components/Search/search-utils.ts +26 -0
  248. package/eventcatalog/src/components/Seo.astro +5 -1
  249. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +53 -48
  250. package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +183 -178
  251. package/eventcatalog/src/components/Settings/LicenseSettings.tsx +140 -31
  252. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +40 -35
  253. package/eventcatalog/src/components/Settings/LogoUpload.tsx +1 -1
  254. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +9 -8
  255. package/eventcatalog/src/components/Settings/Row.tsx +7 -4
  256. package/eventcatalog/src/components/Settings/SettingsShared.tsx +3 -3
  257. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +37 -76
  258. package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
  259. package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +122 -1
  260. package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
  261. package/eventcatalog/src/components/TrialBadge.astro +20 -9
  262. package/eventcatalog/src/content.config.ts +19 -2
  263. package/eventcatalog/src/features/auth/error.astro +4 -2
  264. package/eventcatalog/src/features/auth/login.astro +2 -1
  265. package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +21 -1
  266. package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
  267. package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
  268. package/eventcatalog/src/features/integrations/eventcatalog-features.ts +13 -7
  269. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
  270. package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +3 -3
  271. package/eventcatalog/src/features/mcp/apps/canvas/styles.css +3 -1
  272. package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +7 -5
  273. package/eventcatalog/src/features/mcp/apps/generated/canvas.html +123 -98
  274. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +118 -101
  275. package/eventcatalog/src/features/mcp/mcp-server.ts +20 -4
  276. package/eventcatalog/src/features/server/start.ts +25 -0
  277. package/eventcatalog/src/features/storage/database.ts +88 -0
  278. package/eventcatalog/src/features/storage/migrations.ts +85 -0
  279. package/eventcatalog/src/features/storage/sql/database.sql +5 -0
  280. package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
  281. package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
  282. package/eventcatalog/src/features/storage/sql.ts +28 -0
  283. package/eventcatalog/src/features/studio/agent-choreography.ts +13 -10
  284. package/eventcatalog/src/features/studio/agents.ts +28 -0
  285. package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
  286. package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
  287. package/eventcatalog/src/features/studio/api/client.ts +40 -0
  288. package/eventcatalog/src/features/studio/canvas-actions.ts +160 -34
  289. package/eventcatalog/src/features/studio/canvas-preview.ts +1 -2
  290. package/eventcatalog/src/features/studio/catalog.ts +16 -14
  291. package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +274 -105
  292. package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +15 -14
  293. package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +272 -119
  294. package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +1 -2
  295. package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
  296. package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
  297. package/eventcatalog/src/features/studio/components/JoinForm.tsx +101 -26
  298. package/eventcatalog/src/features/studio/components/LeftPanel.tsx +122 -230
  299. package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
  300. package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
  301. package/eventcatalog/src/features/studio/components/Presence.tsx +52 -45
  302. package/eventcatalog/src/features/studio/components/ShareDialog.tsx +277 -141
  303. package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
  304. package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +1314 -385
  305. package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
  306. package/eventcatalog/src/features/studio/document-name.ts +7 -0
  307. package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
  308. package/eventcatalog/src/features/studio/hooks/presence-sender.ts +19 -2
  309. package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +9 -3
  310. package/eventcatalog/src/features/studio/hooks/use-comments.ts +2 -2
  311. package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +8 -3
  312. package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +244 -32
  313. package/eventcatalog/src/features/studio/identity.ts +25 -1
  314. package/eventcatalog/src/features/studio/limits.ts +2 -0
  315. package/eventcatalog/src/features/studio/pages/[id].astro +42 -16
  316. package/eventcatalog/src/features/studio/pages/index.astro +596 -373
  317. package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +12 -15
  318. package/eventcatalog/src/features/studio/server/canvas-mcp.ts +8 -23
  319. package/eventcatalog/src/features/studio/server/runtime.ts +150 -46
  320. package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
  321. package/eventcatalog/src/features/studio/server/storage.ts +53 -73
  322. package/eventcatalog/src/features/studio/webmcp-relay/LICENSE +21 -0
  323. package/eventcatalog/src/features/studio/webmcp-relay/README.md +5 -0
  324. package/eventcatalog/src/features/studio/webmcp-relay/embed.js +2 -0
  325. package/eventcatalog/src/features/studio/webmcp-relay/widget.html +10 -0
  326. package/eventcatalog/src/features/studio/webmcp-relay/widget.js +1 -0
  327. package/eventcatalog/src/features/tools/catalog-tools.ts +3 -1
  328. package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
  329. package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
  330. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +3 -2
  331. package/eventcatalog/src/pages/_index.astro +5 -342
  332. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +2 -3
  333. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +0 -7
  334. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -1
  335. package/eventcatalog/src/pages/diagrams/[id]/[version]/_index.data.ts +0 -7
  336. package/eventcatalog/src/pages/diagrams/[id]/[version]/embed.astro +1 -0
  337. package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +1 -0
  338. package/eventcatalog/src/pages/directory/[type]/_index.data.ts +5 -7
  339. package/eventcatalog/src/pages/directory/[type]/index.astro +3 -1
  340. package/eventcatalog/src/pages/discover/[type]/_index.data.ts +5 -7
  341. package/eventcatalog/src/pages/discover/[type]/index.astro +3 -1
  342. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +0 -7
  343. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -0
  344. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +0 -7
  345. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -0
  346. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/_index.data.ts +0 -7
  347. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +3 -1
  348. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/_[filename].data.ts +0 -7
  349. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +0 -7
  350. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +1 -0
  351. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +1 -0
  352. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/_[...filename].data.ts +0 -4
  353. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/_index.data.ts +0 -7
  354. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/index.astro +1 -0
  355. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +3 -1
  356. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/_[filename].data.ts +0 -7
  357. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +1 -0
  358. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +2 -3
  359. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +0 -7
  360. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +1 -0
  361. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +1 -0
  362. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/_[filename].data.ts +0 -7
  363. package/eventcatalog/src/pages/docs/[type]/[id]/_index.data.ts +0 -7
  364. package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +2 -1
  365. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/_index.data.ts +0 -7
  366. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -0
  367. package/eventcatalog/src/pages/docs/[type]/[id]/language/_index.data.ts +0 -7
  368. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +1 -0
  369. package/eventcatalog/src/pages/docs/custom/[...path]/_index.data.ts +0 -7
  370. package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +1 -0
  371. package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +1 -1
  372. package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +1 -0
  373. package/eventcatalog/src/pages/docs/services/[id]/asyncapi/[filename].astro +1 -1
  374. package/eventcatalog/src/pages/docs/services/[id]/changelog/index.astro +1 -1
  375. package/eventcatalog/src/pages/docs/services/[id]/graphql/[filename].astro +1 -1
  376. package/eventcatalog/src/pages/docs/services/[id]/spec/[filename].astro +1 -1
  377. package/eventcatalog/src/pages/docs/teams/[id]/_index.data.ts +0 -7
  378. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +1 -0
  379. package/eventcatalog/src/pages/docs/users/[id]/_index.data.ts +0 -7
  380. package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -0
  381. package/eventcatalog/src/pages/index.astro +4 -2
  382. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/_index.data.ts +0 -7
  383. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +9 -1
  384. package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +0 -7
  385. package/eventcatalog/src/pages/schemas/explorer/index.astro +4 -2
  386. package/eventcatalog/src/pages/settings/license.astro +9 -1
  387. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/_index.data.ts +0 -7
  388. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/index.astro +1 -0
  389. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +0 -7
  390. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/_index.data.ts +0 -7
  391. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +1 -0
  392. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/_index.data.ts +0 -7
  393. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -0
  394. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +1 -0
  395. package/eventcatalog/src/pages/visualiser/[type]/[id]/_index.data.ts +38 -0
  396. package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +18 -41
  397. package/eventcatalog/src/pages/visualiser/designs/[id]/_index.data.ts +0 -7
  398. package/eventcatalog/src/pages/visualiser/designs/[id]/index.astro +2 -1
  399. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/_index.data.ts +0 -7
  400. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -0
  401. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +1 -0
  402. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/_index.data.ts +0 -7
  403. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +1 -0
  404. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/_index.data.ts +0 -7
  405. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +1 -0
  406. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +1 -0
  407. package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
  408. package/eventcatalog/src/utils/collections/flows.ts +20 -7
  409. package/eventcatalog/src/utils/collections/resource-owners.ts +8 -2
  410. package/eventcatalog/src/utils/collections/resources.ts +2 -0
  411. package/eventcatalog/src/utils/collections/util.ts +8 -4
  412. package/eventcatalog/src/utils/git.ts +11 -0
  413. package/eventcatalog/src/utils/homepage-dashboard.ts +143 -0
  414. package/eventcatalog/src/utils/license.ts +1 -1
  415. package/eventcatalog/src/utils/link-validation.ts +25 -19
  416. package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
  417. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
  418. package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +4 -2
  419. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
  420. package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
  421. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
  422. package/eventcatalog/src/utils/page-loaders/hybrid-page.ts +4 -15
  423. package/eventcatalog/src/utils/page-title.ts +15 -0
  424. package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
  425. package/eventcatalog/src/utils/trial.ts +13 -0
  426. package/package.json +12 -12
  427. package/dist/docs/development/ask-your-architecture/05-skills/02-installation.md +0 -60
  428. package/dist/docs/development/ask-your-architecture/05-skills/_category_.json +0 -11
  429. package/dist/docs/development/ask-your-architecture/06-slack-integration/01-introduction.md +0 -63
  430. package/dist/docs/development/ask-your-architecture/06-slack-integration/02-slack-app-setup.md +0 -154
  431. package/dist/docs/development/ask-your-architecture/06-slack-integration/03-installation.md +0 -169
  432. package/dist/docs/development/ask-your-architecture/06-slack-integration/04-deployment.md +0 -236
  433. package/dist/docs/development/ask-your-architecture/06-slack-integration/05-usage.md +0 -140
  434. package/dist/docs/development/ask-your-architecture/06-slack-integration/06-troubleshooting.md +0 -268
  435. package/dist/docs/development/ask-your-architecture/06-slack-integration/_category_.json +0 -13
  436. package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-integration-map.md +0 -40
  437. package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +0 -3
  438. package/eventcatalog/src/features/studio/canvas-doc.ts +0 -409
  439. package/eventcatalog/src/features/studio/clipboard.ts +0 -97
  440. package/eventcatalog/src/features/studio/components/CanvasControls.tsx +0 -154
  441. package/eventcatalog/src/features/studio/components/Comments.tsx +0 -770
  442. package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +0 -145
  443. package/eventcatalog/src/features/studio/components/DragGhost.tsx +0 -115
  444. package/eventcatalog/src/features/studio/components/Picture.tsx +0 -21
  445. package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +0 -212
  446. package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +0 -255
  447. package/eventcatalog/src/features/studio/components/icons.ts +0 -53
  448. package/eventcatalog/src/features/studio/components/status.ts +0 -51
  449. package/eventcatalog/src/features/studio/edges.ts +0 -56
  450. package/eventcatalog/src/features/studio/flow-state.ts +0 -92
  451. package/eventcatalog/src/features/studio/grouping.ts +0 -226
  452. package/eventcatalog/src/features/studio/layout.ts +0 -42
  453. package/eventcatalog/src/features/studio/levels.ts +0 -282
  454. package/eventcatalog/src/features/studio/node-types.ts +0 -205
  455. package/eventcatalog/src/features/studio/pages/new.astro +0 -24
  456. package/eventcatalog/src/features/studio/pages/wake.ts +0 -15
  457. package/eventcatalog/src/features/studio/placement.ts +0 -197
  458. package/eventcatalog/src/features/studio/studio.css +0 -273
@@ -267,7 +267,7 @@ export const buildDomainGraph = ({
267
267
  draggable: false,
268
268
  selectable: false,
269
269
  data: {
270
- domain: { name: d.data.name, version: d.data.version },
270
+ domain: { id: d.data.id, name: d.data.name, version: d.data.version },
271
271
  // The domain viewed may itself be a subdomain of another
272
272
  subdomain: !!parentId || parentDomainOf.has(d.data.id),
273
273
  isFocused: !parentId,
@@ -309,7 +309,7 @@ export const buildDomainGraph = ({
309
309
  position: { x: 0, y: 0 },
310
310
  ...(parentId ? { parentId } : {}),
311
311
  data: {
312
- domain: { name: other.data.name, version: other.data.version },
312
+ domain: { id: other.data.id, name: other.data.name, version: other.data.version },
313
313
  subdomain: !!parentId,
314
314
  isFocused: false,
315
315
  otherDomain: true,
@@ -375,7 +375,7 @@ export const buildDomainGraph = ({
375
375
  type: 'system-group',
376
376
  parentId: domainGroup,
377
377
  position: { x: 0, y: 0 },
378
- data: { system: { name: system.data.name, version: system.data.version } },
378
+ data: { system: { id: system.data.id, name: system.data.name, version: system.data.version } },
379
379
  });
380
380
  }
381
381
  addNodes(graph.nodes);
@@ -1,6 +1,6 @@
1
1
  import type { Node, Edge } from '@xyflow/react';
2
2
  import { createEdge, createNode, buildContextMenuForMessage, buildContextMenuForService } from './utils/utils';
3
- import { layoutNodeGraph } from '@utils/node-graphs/layout-node-graph';
3
+ import { layoutWithElk } from '@eventcatalog/visualiser/layout';
4
4
 
5
5
  export interface FieldOccurrence {
6
6
  messageId: string;
@@ -173,5 +173,7 @@ export const getNodesAndEdges = async ({
173
173
 
174
174
  if (!layout) return { nodes, edges };
175
175
 
176
- return layoutNodeGraph({ nodes, edges });
176
+ // Lays out with ELK directly rather than layoutNodeGraph: this runs in the browser (the Fields Explorer),
177
+ // and layoutNodeGraph's cache reads the catalog's config, which would put the config in the browser's bundle
178
+ return (await layoutWithElk({ nodes, edges })) as unknown as { nodes: Node[]; edges: Edge[] };
177
179
  };
@@ -1,7 +1,14 @@
1
1
  import { hideMessageNodes, layoutWithElk } from '@eventcatalog/visualiser/layout';
2
+ import { isSSR } from '@utils/feature';
2
3
 
3
4
  type Graph = { nodes: any[]; edges: any[] };
4
5
 
6
+ // A build renders one route at a time (every message's docs page, then every schema page), so the
7
+ // cache has to outlast a whole route to be reused. A server keeps running as the catalog changes and
8
+ // renders pages as they're asked for, so it keeps the most recent layouts only.
9
+ const MAX_CACHED_LAYOUTS = isSSR() ? 200 : 5000;
10
+ const layouts = new Map<string, ReturnType<typeof layoutWithElk>>();
11
+
5
12
  /**
6
13
  * Lays a node graph out for the visualiser (with ELK, left to right). Builders
7
14
  * create their nodes and edges without positions and lay the finished graph
@@ -9,7 +16,19 @@ type Graph = { nodes: any[]; edges: any[] };
9
16
  * (nodes with children) are sized to fit them, and edges get the route they're
10
17
  * drawn along (`data.route`), with room for their labels.
11
18
  */
12
- export const layoutNodeGraph = async <G extends Graph>(graph: G): Promise<G> => (await layoutWithElk(graph)) as unknown as G;
19
+ export const layoutNodeGraph = async <G extends Graph>(graph: G): Promise<G> => {
20
+ // A build lays the same graph out on several pages (a message's docs, visualiser and schema pages):
21
+ // reuse the layout. Each caller gets its own copy, so it can't change the one kept.
22
+ const key = JSON.stringify(graph);
23
+ let layout = layouts.get(key);
24
+ if (!layout) {
25
+ layout = layoutWithElk(graph);
26
+ layouts.set(key, layout);
27
+ layout.catch(() => layouts.delete(key));
28
+ if (layouts.size > MAX_CACHED_LAYOUTS) layouts.delete(layouts.keys().next().value!);
29
+ }
30
+ return structuredClone(await layout) as unknown as G;
31
+ };
13
32
 
14
33
  /**
15
34
  * Lays out the graphs of a levels page: level 1 (`overview`: domains, systems
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The catalog resource a diagram node shows, for the node types the node graphs build. Has no imports so it can
3
+ * be shared by the server and the browser (the visualiser's "Open in Studio", the MCP App views).
4
+ */
5
+
6
+ // The collection each node type shows a resource of
7
+ const NODE_COLLECTIONS: Record<string, string> = {
8
+ service: 'services',
9
+ services: 'services',
10
+ agent: 'agents',
11
+ agents: 'agents',
12
+ event: 'events',
13
+ events: 'events',
14
+ command: 'commands',
15
+ commands: 'commands',
16
+ query: 'queries',
17
+ queries: 'queries',
18
+ channel: 'channels',
19
+ channels: 'channels',
20
+ flow: 'flows',
21
+ flows: 'flows',
22
+ data: 'containers',
23
+ containers: 'containers',
24
+ 'data-products': 'data-products',
25
+ domain: 'domains',
26
+ domains: 'domains',
27
+ 'context-domain': 'domains',
28
+ 'domain-group': 'domains',
29
+ system: 'systems',
30
+ systems: 'systems',
31
+ 'system-group': 'systems',
32
+ };
33
+
34
+ // Where each node type keeps the resource it shows
35
+ const RESOURCE_DATA_KEYS = [
36
+ 'service',
37
+ 'agent',
38
+ 'message',
39
+ 'channel',
40
+ 'data',
41
+ 'dataProduct',
42
+ 'flow',
43
+ 'entity',
44
+ 'domain',
45
+ 'system',
46
+ 'custom',
47
+ ];
48
+
49
+ type DiagramNode = { type?: string; data?: Record<string, unknown> };
50
+ type ResourceDetails = { id?: unknown; version?: unknown; [key: string]: unknown };
51
+
52
+ /** The resource a node shows, as in its data: the fields shown, or the catalog entry's data (if it holds the entry) */
53
+ export const getNodeResourceDetails = (node: DiagramNode): ResourceDetails | undefined => {
54
+ const data = node.data ?? {};
55
+ const resource = RESOURCE_DATA_KEYS.map((key) => data[key]).find(Boolean) as
56
+ | (ResourceDetails & { data?: ResourceDetails })
57
+ | undefined;
58
+ return resource?.data ?? resource;
59
+ };
60
+
61
+ /** The catalog resource a node shows (its collection, id and version), if it shows one */
62
+ export const getNodeCatalogResource = (node: DiagramNode): { collection: string; id: string; version?: string } | undefined => {
63
+ const collection = NODE_COLLECTIONS[node.type ?? ''];
64
+ const details = getNodeResourceDetails(node);
65
+ if (!collection || typeof details?.id !== 'string') return undefined;
66
+ return { collection, id: details.id, ...(typeof details.version === 'string' && { version: details.version }) };
67
+ };
@@ -142,7 +142,7 @@ const wrapNodesInSystemGroup = (systemNodes: any[], system: any) => {
142
142
  draggable: false,
143
143
  selectable: false,
144
144
  data: {
145
- system: { name: system.data.name, version: system.data.version },
145
+ system: { id: system.data.id, name: system.data.name, version: system.data.version },
146
146
  // The system is the resource being viewed on its own diagram
147
147
  isFocused: true,
148
148
  },
@@ -24,7 +24,9 @@ export class HybridPage<T = any> {
24
24
  }
25
25
 
26
26
  /**
27
- * Static method for getting data
27
+ * The page's data: its props in a static build, or looked up from its URL on a server. Undefined
28
+ * when nothing matches (an unknown resource or version): the page then returns
29
+ * `Astro.rewrite('/404')`. Throwing a Response instead made Astro answer with an empty 500.
28
30
  */
29
31
  static async getData(astro: AstroGlobal): Promise<any> {
30
32
  // Try props first (static mode)
@@ -32,13 +34,7 @@ export class HybridPage<T = any> {
32
34
  return this.transformProps(astro.props);
33
35
  }
34
36
 
35
- const data = await this.fetchData(astro.params);
36
-
37
- if (!data) {
38
- throw this.createNotFoundResponse();
39
- }
40
-
41
- return data;
37
+ return (await this.fetchData(astro.params)) ?? undefined;
42
38
  }
43
39
 
44
40
  /**
@@ -58,11 +54,4 @@ export class HybridPage<T = any> {
58
54
  protected static transformProps(props: any): any {
59
55
  return props;
60
56
  }
61
-
62
- protected static createNotFoundResponse(): Response {
63
- return new Response(null, {
64
- status: 404,
65
- statusText: 'Not found',
66
- });
67
- }
68
57
  }
@@ -0,0 +1,15 @@
1
+ import config from '@config';
2
+
3
+ /** The catalog's name: `title` in eventcatalog.config.js, or EventCatalog when it has none */
4
+ export const getCatalogTitle = (): string => config?.title?.trim() || 'EventCatalog';
5
+
6
+ /**
7
+ * A page's title, as browser tabs and link previews show it: the page's own title, then the
8
+ * catalog's (`Domains | Ordering | Acme Inc`), so tabs show the page first. A page without a title
9
+ * of its own (the homepage) is just the catalog's.
10
+ */
11
+ export const formatPageTitle = (title?: string): string => {
12
+ const catalogTitle = getCatalogTitle();
13
+ const pageTitle = title?.trim();
14
+ return pageTitle && pageTitle !== catalogTitle ? `${pageTitle} | ${catalogTitle}` : catalogTitle;
15
+ };
@@ -0,0 +1,64 @@
1
+ import { createElement, type CSSProperties, type ReactNode } from 'react';
2
+ import { createStyleObject } from 'react-syntax-highlighter/dist/cjs/create-element.js';
3
+
4
+ type Stylesheet = { [selector: string]: CSSProperties };
5
+ type HighlightedNode = {
6
+ type: 'element' | 'text';
7
+ value?: string | number;
8
+ tagName?: any;
9
+ properties?: { className?: string[]; style?: CSSProperties; [key: string]: unknown };
10
+ children?: HighlightedNode[];
11
+ };
12
+
13
+ const selectorsByStylesheet = new WeakMap<Stylesheet, Set<string>>();
14
+
15
+ /** The class names a theme styles, worked out once per theme */
16
+ const stylesheetSelectors = (stylesheet: Stylesheet) => {
17
+ let selectors = selectorsByStylesheet.get(stylesheet);
18
+ if (!selectors) {
19
+ selectors = new Set(Object.keys(stylesheet).flatMap((selector) => selector.split('.')));
20
+ selectorsByStylesheet.set(stylesheet, selectors);
21
+ }
22
+ return selectors;
23
+ };
24
+
25
+ const renderNode = (node: HighlightedNode, stylesheet: Stylesheet, useInlineStyles: boolean, key: string): ReactNode => {
26
+ if (node.type === 'text') return node.value;
27
+ if (!node.tagName) return undefined;
28
+
29
+ const properties = node.properties ?? {};
30
+ const classNames = properties.className;
31
+ let props;
32
+ if (!useInlineStyles) {
33
+ props = { ...properties, className: classNames?.join(' ') };
34
+ } else {
35
+ // Theme classes become inline styles; any other class names stay
36
+ const selectors = stylesheetSelectors(stylesheet);
37
+ const className =
38
+ classNames && (classNames.includes('token') ? ['token'] : []).concat(classNames.filter((name) => !selectors.has(name)));
39
+ props = {
40
+ ...properties,
41
+ className: className?.join(' ') || undefined,
42
+ style: createStyleObject(classNames ?? [], { ...properties.style }, stylesheet),
43
+ };
44
+ }
45
+
46
+ const children = (node.children ?? []).map((child, i) => renderNode(child, stylesheet, useInlineStyles, `code-segment-1-${i}`));
47
+ return createElement(node.tagName, { key, ...props }, children);
48
+ };
49
+
50
+ /**
51
+ * Renders react-syntax-highlighter's rows as its default renderer does (same elements, styles and keys), but
52
+ * works out the theme's class names once per theme rather than for every token: the default renderer did
53
+ * that for every token, which made highlighting a schema on the server take tens of milliseconds a page.
54
+ * Set `wrapLines`: with a custom renderer, react-syntax-highlighter turns it on when it isn't set.
55
+ */
56
+ export const renderHighlightedRows = ({
57
+ rows,
58
+ stylesheet,
59
+ useInlineStyles,
60
+ }: {
61
+ rows: HighlightedNode[];
62
+ stylesheet: Stylesheet;
63
+ useInlineStyles: boolean;
64
+ }): ReactNode[] => rows.map((node, i) => renderNode(node, stylesheet, useInlineStyles, `code-segment-${i}`));
@@ -5,6 +5,19 @@ export const LICENSE_FAQ_URL = 'https://www.eventcatalog.dev/license-faq';
5
5
  // Where a commercial license is renewed
6
6
  export const LICENSE_RENEW_URL = 'https://eventcatalog.cloud';
7
7
 
8
+ // Where the Business plan is bought: the order form on the website
9
+ export const BUY_BUSINESS_URL = 'https://www.eventcatalog.dev/buy?source=cli';
10
+
11
+ // Prices for a commercial license, linked while the trial is running
12
+ export const PRICING_URL = 'https://www.eventcatalog.dev/pricing';
13
+
14
+ // Questions about licensing or buying: talk to the EventCatalog team
15
+ export const TALK_TO_US_URL = 'https://www.eventcatalog.dev/book-demo';
16
+
17
+ // Shown with the trial, so organisations that qualify for Free Use don't read it as "EventCatalog is now paid"
18
+ export const FREE_USE_NOTE =
19
+ 'Under $10M revenue and $10M raised, an individual or an open-source project? You qualify for Free Use; get a free key at eventcatalog.cloud.';
20
+
8
21
  const DAY_IN_MS = 24 * 60 * 60 * 1000;
9
22
 
10
23
  export type TrialStatus = {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "license": "BUSL-1.1",
9
9
  "type": "module",
10
- "version": "5.0.0-beta.9",
10
+ "version": "5.0.1",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
@@ -47,10 +47,10 @@
47
47
  ],
48
48
  "dependencies": {
49
49
  "@ai-sdk/react": "^4.0.109",
50
- "@astrojs/markdown-remark": "^7.3.1",
51
- "@astrojs/mdx": "^8.0.1",
52
- "@astrojs/node": "^11.1.6",
53
- "@astrojs/react": "^6.0.6",
50
+ "@astrojs/markdown-remark": "^7.3.2",
51
+ "@astrojs/mdx": "^8.0.3",
52
+ "@astrojs/node": "^11.1.7",
53
+ "@astrojs/react": "^7.0.1",
54
54
  "@astrojs/rss": "^4.0.19",
55
55
  "@asyncapi/avro-schema-parser": "3.0.24",
56
56
  "@asyncapi/parser": "^3.6.0",
@@ -63,11 +63,10 @@
63
63
  "@hocuspocus/provider": "^4.7.0",
64
64
  "@hocuspocus/server": "^4.7.0",
65
65
  "@iconify-json/logos": "^1.2.4",
66
- "@mcp-b/webmcp-local-relay": "5.1.0",
67
66
  "@mcp-b/webmcp-polyfill": "5.1.0",
68
67
  "@mermaid-js/layout-elk": "^0.2.0",
69
68
  "@modelcontextprotocol/ext-apps": "^1.7.5",
70
- "@modelcontextprotocol/sdk": "^1.30.0",
69
+ "@modelcontextprotocol/sdk": "^1.32.0",
71
70
  "@nanostores/react": "^1.0.0",
72
71
  "@parcel/watcher": "^2.4.1",
73
72
  "@radix-ui/react-context-menu": "^2.2.6",
@@ -81,7 +80,7 @@
81
80
  "@tanstack/react-table": "^8.17.3",
82
81
  "@xyflow/react": "^12.12.0",
83
82
  "ai": "^7.0.106",
84
- "astro": "7.3.3",
83
+ "astro": "7.3.8",
85
84
  "astro-expressive-code": "^0.44.0",
86
85
  "astro-seo": "^1.2.0",
87
86
  "boxen": "^8.0.1",
@@ -99,6 +98,7 @@
99
98
  "gray-matter": "^4.0.3",
100
99
  "hono": "^4.13.7",
101
100
  "html-to-image": "^1.11.11",
101
+ "htmlparser2": "^12.0.0",
102
102
  "js-yaml": "^4.3.2",
103
103
  "jsonpath-plus": "^10.4.0",
104
104
  "jsonwebtoken": "^9.0.2",
@@ -139,10 +139,10 @@
139
139
  "uuid": "^11.1.1",
140
140
  "y-protocols": "^1.0.7",
141
141
  "yjs": "^13.6.33",
142
- "zod": "^4.3.6",
143
- "@eventcatalog/sdk": "2.30.0-beta.1",
144
- "@eventcatalog/linter": "1.2.0-beta.2",
145
- "@eventcatalog/visualiser": "^5.0.0-beta.4"
142
+ "zod": "^4.6.6",
143
+ "@eventcatalog/visualiser": "^5.0.0",
144
+ "@eventcatalog/linter": "1.2.1",
145
+ "@eventcatalog/sdk": "2.30.0"
146
146
  },
147
147
  "devDependencies": {
148
148
  "@astrojs/check": "^0.9.10",
@@ -1,60 +0,0 @@
1
- ---
2
- sidebar_position: 2
3
- keywords:
4
- - AI Skills
5
- - installation
6
- sidebar_label: Installation
7
- title: Installing AI Skills
8
- description: How to install EventCatalog AI skills for your AI coding agent
9
- ---
10
-
11
- ## CLI install (recommended)
12
-
13
- Use [npx skills](https://github.com/vercel-labs/skills) to install skills directly into your project:
14
-
15
- ```bash
16
- # Install all EventCatalog skills
17
- npx skills add event-catalog/skills
18
-
19
- # Install a specific skill
20
- npx skills add event-catalog/skills --skill catalog-documentation-creator
21
- ```
22
-
23
- This copies the skill files into your project's `.claude/skills/` directory where your AI agent can access them.
24
-
25
- ## Clone and copy
26
-
27
- Clone the repository and copy the skills you need:
28
-
29
- ```bash
30
- git clone https://github.com/event-catalog/skills.git
31
- cp -r skills/skills/catalog-documentation-creator .claude/skills/
32
- ```
33
-
34
- ## Git submodule
35
-
36
- Add as a submodule for easy updates:
37
-
38
- ```bash
39
- git submodule add https://github.com/event-catalog/skills.git .claude/skills/eventcatalog
40
- ```
41
-
42
- When new skills are released, pull updates with:
43
-
44
- ```bash
45
- git submodule update --remote
46
- ```
47
-
48
- ## Fork and customize
49
-
50
- Fork the repository and tailor skills to your team's conventions:
51
-
52
- 1. Fork [event-catalog/skills](https://github.com/event-catalog/skills) on GitHub
53
- 2. Modify skills to match your naming conventions, ownership patterns, and schema formats
54
- 3. Install from your fork:
55
-
56
- ```bash
57
- npx add-skill https://github.com/YOUR_ORG/eventcatalog-skills
58
- ```
59
-
60
- This is useful when your team has specific conventions for IDs, owners, or folder structures that differ from the defaults.
@@ -1,11 +0,0 @@
1
- {
2
- "label": "Skills",
3
- "position": 7,
4
- "collapsible": true,
5
- "collapsed": true,
6
- "link": {
7
- "type": "generated-index",
8
- "slug": "/development/ask-your-architecture/skills",
9
- "description": "Pre-built AI skills for generating EventCatalog documentation"
10
- }
11
- }
@@ -1,63 +0,0 @@
1
- ---
2
- sidebar_position: 1
3
- keywords:
4
- - Slack Bot
5
- - Slack Integration
6
- sidebar_label: Introduction
7
- title: Slack integration
8
- description: Query architecture documentation directly from Slack
9
- ---
10
-
11
- import PlanBanner from '@site/src/components/MDX/PlanBanner';
12
-
13
- <PlanBanner plan="Scale" />
14
-
15
- The EventCatalog Slack Bot connects to your EventCatalog MCP server, allowing teams to query architecture documentation directly from Slack. Ask questions about events, services, domains, and schemas without leaving your workspace.
16
-
17
- The slack bot is self hosted, you own your data and deployment.
18
-
19
- <div className="flex justify-center items-center gap-4 flex-col">
20
- <img src="/img/slack.png" alt="EventCatalog Slack Bot" className="rounded-lg" style={{ width: '30%', height: 'auto' }} />
21
- <span className="text-center text-sm text-gray-500">Example of the EventCatalog Slack Bot in action asking about the OrderCreated event</span>
22
- </div>
23
-
24
- ## How it works
25
-
26
- 1. You configure the bot with your own AI provider and model (e.g. Anthropic, OpenAI, Google)
27
- 1. Users @mention the bot or post in dedicated channels
28
- 2. The bot queries your EventCatalog MCP server
29
- 3. AI-powered responses appear in threads to keep channels organized
30
-
31
- ## Key features
32
-
33
- - **@Mention anywhere** - Add the bot to any channel and ask questions
34
- - **Dedicated channels** - Create auto-reply channels for architecture questions
35
- - **Multiple AI providers** - Works with Anthropic, OpenAI, or Google
36
- - **Self-hosted** - Your data stays private, you control your data and deployment
37
- - **Socket Mode** - No public URL or webhooks needed
38
- - **Custom tools support** - Bring your own integrations for real-time data
39
-
40
- ## Custom tools
41
-
42
- The Slack bot supports [custom tools](/docs/development/ask-your-architecture/eventcatalog-assistant/bring-your-own-tools) defined in your `eventcatalog.chat.js` file. This means you can bring real-time data into your Slack conversations:
43
-
44
- - Query production metrics from Datadog or Prometheus
45
- - Check service health and uptime
46
- - Look up on-call engineers from PagerDuty
47
- - Fetch queue depths from Kafka
48
- - Any custom integration your team needs
49
-
50
- Custom tools work automatically - the AI decides when to use them based on user questions. Ask "who is on-call for OrderService?" and get live data directly in Slack.
51
-
52
- ## Prerequisites
53
-
54
- - EventCatalog instance (with configured MCP server) running in [SSR mode](/docs/development/deployment/build-ssr-mode)
55
- - [EventCatalog Scale license](https://eventcatalog.cloud)
56
- - Slack workspace with app creation permissions
57
- - API key for your chosen AI provider
58
-
59
- ## Repository
60
-
61
- The EventCatalog Slack Bot is open source:
62
-
63
- [github.com/event-catalog/eventcatalog-slack-bot](https://github.com/event-catalog/eventcatalog-slack-bot)
@@ -1,154 +0,0 @@
1
- ---
2
- sidebar_position: 2
3
- keywords:
4
- - Slack Bot
5
- - Slack App
6
- sidebar_label: Slack app setup
7
- title: Slack app setup
8
- description: Create and configure your Slack app
9
- ---
10
-
11
- import PlanBanner from '@site/src/components/MDX/PlanBanner';
12
-
13
- <PlanBanner plan="Scale" />
14
-
15
- Create a Slack app to enable the EventCatalog bot in your workspace. You can create the app using a manifest (recommended) or manually configure all settings.
16
-
17
- ## Create from manifest (recommended)
18
-
19
- The fastest way to get started. The manifest automatically configures all required permissions and settings.
20
-
21
- ### Steps
22
-
23
- 1. Navigate to [api.slack.com/apps](https://api.slack.com/apps)
24
- 2. Click **Create New App** → **From an app manifest**
25
- 3. Select your workspace and click **Next**
26
- 4. Choose **YAML** and paste this manifest:
27
-
28
- ```yaml
29
- display_information:
30
- name: EventCatalog Bot
31
- description: Query your EventCatalog directly from Slack
32
- background_color: "#000000"
33
-
34
- features:
35
- bot_user:
36
- display_name: EventCatalog
37
- always_online: true
38
-
39
- oauth_config:
40
- scopes:
41
- bot:
42
- - app_mentions:read
43
- - chat:write
44
- - reactions:read
45
- - reactions:write
46
- - channels:history
47
-
48
- settings:
49
- event_subscriptions:
50
- bot_events:
51
- - app_mention
52
- - message.channels
53
- interactivity:
54
- is_enabled: false
55
- org_deploy_enabled: false
56
- socket_mode_enabled: true
57
- token_rotation_enabled: false
58
- ```
59
-
60
- 5. Click **Next**, review the summary, and click **Create**
61
-
62
- ### Get credentials
63
-
64
- After creating the app, collect three credentials needed to run the bot.
65
-
66
- #### App-Level Token
67
-
68
- 1. Go to **Basic Information** → **App-Level Tokens**
69
- 2. Click **Generate Token and Scopes**
70
- 3. Name: `socket-mode-token`
71
- 4. Add scope: `connections:write`
72
- 5. Click **Generate** and copy the token (starts with `xapp-`)
73
- 6. Save this as `SLACK_APP_TOKEN`
74
-
75
- #### Bot Token
76
-
77
- 1. Go to **OAuth & Permissions**
78
- 2. Click **Install to Workspace**
79
- 3. Review permissions and click **Allow**
80
- 4. Copy the **Bot User OAuth Token** (starts with `xoxb-`)
81
- 5. Save this as `SLACK_BOT_TOKEN`
82
-
83
- #### Signing Secret
84
-
85
- 1. Go to **Basic Information** → **App Credentials**
86
- 2. Copy the **Signing Secret**
87
- 3. Save this as `SLACK_SIGNING_SECRET`
88
-
89
- <details>
90
- <summary>Setup Slack app manually</summary>
91
-
92
- If you prefer to configure settings yourself, follow these steps.
93
-
94
- ### Create the app
95
-
96
- 1. Navigate to [api.slack.com/apps](https://api.slack.com/apps)
97
- 2. Click **Create New App** → **From scratch**
98
- 3. Name your app (e.g., "EventCatalog Bot") and select your workspace
99
- 4. Click **Create App**
100
-
101
- ### Enable Socket Mode
102
-
103
- 1. Click **Socket Mode** in the left sidebar
104
- 2. Toggle **Enable Socket Mode** to On
105
- 3. Create an App-Level Token when prompted:
106
- - Name: `socket-mode-token`
107
- - Scope: `connections:write`
108
- 4. Click **Generate**
109
- 5. Copy the token (starts with `xapp-`) - this is `SLACK_APP_TOKEN`
110
-
111
- ### Configure permissions
112
-
113
- 1. Click **OAuth & Permissions** in the left sidebar
114
- 2. Scroll to **Scopes** → **Bot Token Scopes**
115
- 3. Add these scopes:
116
- - `app_mentions:read` - Receive @mention events
117
- - `chat:write` - Send messages
118
- - `reactions:read` - Read reactions
119
- - `reactions:write` - Add and remove reactions
120
- - `channels:history` - Read public channel messages
121
-
122
- ### Enable events
123
-
124
- 1. Click **Event Subscriptions** in the left sidebar
125
- 2. Toggle **Enable Events** to On
126
- 3. Expand **Subscribe to bot events**
127
- 4. Add these events:
128
- - `app_mention`
129
- - `message.channels`
130
-
131
- ### Install the app
132
-
133
- 1. Click **OAuth & Permissions** in the left sidebar
134
- 2. Click **Install to Workspace**
135
- 3. Review permissions and click **Allow**
136
- 4. Copy the **Bot User OAuth Token** (starts with `xoxb-`) - this is `SLACK_BOT_TOKEN`
137
-
138
- ### Get signing secret
139
-
140
- 1. Click **Basic Information** in the left sidebar
141
- 2. Scroll to **App Credentials**
142
- 3. Copy the **Signing Secret** - this is `SLACK_SIGNING_SECRET`
143
-
144
- </details>
145
-
146
- ## Optional: Private channels and DMs
147
-
148
- By default, the bot only reads thread context in public channels. To enable thread context in private channels and DMs, add these additional scopes:
149
-
150
- - `groups:history` - Private channels
151
- - `im:history` - Direct messages
152
- - `mpim:history` - Group DMs
153
-
154
- After adding scopes, reinstall the app to your workspace.