@eventcatalog/core 5.0.0-beta.8 → 5.0.0

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 (467) hide show
  1. package/LICENSE +234 -134
  2. package/README.md +5 -5
  3. package/dist/analytics/analytics.cjs +18 -3
  4. package/dist/analytics/analytics.d.cts +1 -1
  5. package/dist/analytics/analytics.d.ts +1 -1
  6. package/dist/analytics/analytics.js +3 -2
  7. package/dist/analytics/log-build.cjs +157 -76
  8. package/dist/analytics/log-build.d.cts +2 -2
  9. package/dist/analytics/log-build.d.ts +2 -2
  10. package/dist/analytics/log-build.js +7 -5
  11. package/dist/analytics/studio-usage.cjs +90 -0
  12. package/dist/analytics/studio-usage.d.cts +5 -0
  13. package/dist/analytics/studio-usage.d.ts +5 -0
  14. package/dist/analytics/studio-usage.js +10 -0
  15. package/dist/analytics/telemetry.cjs +42 -0
  16. package/dist/analytics/telemetry.d.cts +20 -0
  17. package/dist/analytics/telemetry.d.ts +20 -0
  18. package/dist/analytics/telemetry.js +8 -0
  19. package/dist/catalog-runtime.cjs +1 -1
  20. package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
  21. package/dist/{chunk-AWOO63ME.js → chunk-AD7CL772.js} +11 -4
  22. package/dist/chunk-CA6WCQ2T.js +54 -0
  23. package/dist/chunk-CPW6G62V.js +17 -0
  24. package/dist/{chunk-PU25TOOJ.js → chunk-JZN4RSMF.js} +1 -1
  25. package/dist/{chunk-4W55ZOOS.js → chunk-NEAVAFSJ.js} +66 -35
  26. package/dist/{chunk-C6T2AAFR.js → chunk-NIVST4WY.js} +9 -3
  27. package/dist/{chunk-ENAG6UH7.js → chunk-NKNOXQ62.js} +1 -6
  28. package/dist/{chunk-AYNZXUB5.js → chunk-OX6TSVHY.js} +5 -5
  29. package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
  30. package/dist/{chunk-RDIZJ7UT.js → chunk-RE7UTPWH.js} +1 -1
  31. package/dist/chunk-S5GWAUG5.js +29 -0
  32. package/dist/{chunk-T4G3VVZ4.js → chunk-YQGRMDRB.js} +4 -2
  33. package/dist/constants.cjs +1 -1
  34. package/dist/constants.js +1 -1
  35. package/dist/docs/api/02-config.md +57 -7
  36. package/dist/docs/development/00-why-eventcatalog.md +11 -11
  37. package/dist/docs/development/01-fundamentals.md +20 -13
  38. package/dist/docs/development/01-getting-started/configuration-overview.md +2 -2
  39. package/dist/docs/development/01-getting-started/installation.md +9 -1
  40. package/dist/docs/development/_getting-started.mdx +1 -1
  41. package/dist/docs/development/ask-your-architecture/01-intro.md +5 -5
  42. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/01-what-is-eventcatalog-assistant.md +0 -4
  43. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/02-configuration.md +15 -3
  44. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/03-bring-your-own-tools.md +0 -3
  45. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/_category_.json +1 -1
  46. package/dist/docs/development/ask-your-architecture/02-llms.txt.md +1 -1
  47. package/dist/docs/development/ask-your-architecture/{05-skills/01-introduction.md → 03-install-skills.md} +57 -7
  48. package/dist/docs/development/ask-your-architecture/03-mcp-server/_category_.json +1 -1
  49. package/dist/docs/development/ask-your-architecture/03-mcp-server/getting-started.md +86 -33
  50. package/dist/docs/development/ask-your-architecture/03-mcp-server/introduction.md +14 -4
  51. package/dist/docs/development/ask-your-architecture/03-schemas.txt.md +1 -1
  52. package/dist/docs/development/ask-your-architecture/04-agents/_category_.json +1 -1
  53. package/dist/docs/development/authentication/01-introduction.md +2 -23
  54. package/dist/docs/development/authentication/02-enabling-authentication.md +0 -20
  55. package/dist/docs/development/authentication/07-rbac-middleware.md +0 -2
  56. package/dist/docs/development/authentication/providers/03-setting-up-github.md +0 -2
  57. package/dist/docs/development/authentication/providers/03a-setting-up-google.md +0 -2
  58. package/dist/docs/development/authentication/providers/04-setting-up-azure-ad.md +0 -2
  59. package/dist/docs/development/authentication/providers/05-setting-up-okta.md +0 -3
  60. package/dist/docs/development/authentication/providers/06-setting-up-auth0.md +0 -2
  61. package/dist/docs/development/bring-your-own-documentation/01-introduction.md +0 -4
  62. package/dist/docs/development/bring-your-own-documentation/custom-pages/01-introduction.md +0 -3
  63. package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +0 -17
  64. package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +0 -4
  65. package/dist/docs/development/bring-your-own-documentation/custom-pages/04-owners.md +0 -2
  66. package/dist/docs/development/bring-your-own-documentation/resource-docs/01-introduction.md +1 -3
  67. package/dist/docs/development/bring-your-own-documentation/resource-docs/02-adding-resource-docs.md +1 -4
  68. package/dist/docs/development/bring-your-own-documentation/resource-docs/03-categories.md +0 -2
  69. package/dist/docs/development/bring-your-own-documentation/resource-docs/04-versioning.md +1 -3
  70. package/dist/docs/development/components/components/11-flow.md +17 -0
  71. package/dist/docs/development/components/components/15-nodegraph.md +43 -10
  72. package/dist/docs/development/components/components/18-remote-schema.md +1 -4
  73. package/dist/docs/development/components/custom-components/07-reference.md +14 -0
  74. package/dist/docs/development/customization/02-themes.md +0 -5
  75. package/dist/docs/development/customization/03-search.md +1 -1
  76. package/dist/docs/development/customization/05-custom-pages-and-api-routes/01-introduction.md +0 -2
  77. package/dist/docs/development/customization/05-custom-pages-and-api-routes/04-reference.md +7 -1
  78. package/dist/docs/development/customization/05-resource-sidebar.md +1 -1
  79. package/dist/docs/development/customization/09-embed-eventcatalog.md +20 -25
  80. package/dist/docs/development/deployment/hosting-options.md +7 -2
  81. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +16 -0
  82. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +31 -1
  83. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +1 -1
  84. package/dist/docs/development/governance/architecture-change-detection/01-introduction.md +0 -10
  85. package/dist/docs/development/governance/architecture-change-detection/06-pipeline-gates.md +0 -4
  86. package/dist/docs/development/guides/97-architecture-graph.md +1 -1
  87. package/dist/docs/development/guides/99-adding-analytics.md +0 -7
  88. package/dist/docs/development/guides/domains/03-model-subdomains.md +2 -2
  89. package/dist/docs/development/guides/domains/04-add-resources-to-domains/01-add-systems-to-domains.md +3 -1
  90. package/dist/docs/development/guides/domains/04-add-resources-to-domains/02-add-services-to-domains.md +5 -1
  91. package/dist/docs/development/guides/domains/04-add-resources-to-domains/03-add-messages-to-domains.md +2 -2
  92. package/dist/docs/development/guides/domains/04-add-resources-to-domains/05-add-entities-to-domains.md +1 -1
  93. package/dist/docs/development/guides/domains/04-add-resources-to-domains/06-domain-resources-page.md +40 -0
  94. package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-diagram.md +89 -0
  95. package/dist/docs/development/guides/domains/06-visualize-domains/_category_.json +1 -2
  96. package/dist/docs/development/guides/domains/09-reference.md +4 -4
  97. package/dist/docs/development/guides/owners/automated-teams-and-users/create-your-own-connector.md +0 -2
  98. package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-github.md +0 -3
  99. package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-microsoft-entra.md +0 -2
  100. package/dist/docs/development/guides/resources/adrs/03-linking-resources.md +8 -0
  101. package/dist/docs/development/guides/resources/adrs/06-reference.md +4 -4
  102. package/dist/docs/development/guides/resources/agents/11-reference.md +1 -1
  103. package/dist/docs/development/guides/resources/data/04-reference.md +1 -1
  104. package/dist/docs/development/guides/resources/data-products/07-reference.md +1 -1
  105. package/dist/docs/development/guides/resources/entities/05-entity-maps.md +1 -1
  106. package/dist/docs/development/guides/resources/entities/06-reference.md +2 -2
  107. package/dist/docs/development/guides/resources/flows/01-introduction.md +11 -1
  108. package/dist/docs/development/guides/resources/flows/03-model-flow-steps.md +65 -6
  109. package/dist/docs/development/guides/resources/flows/05-explore-flows.md +112 -0
  110. package/dist/docs/development/guides/resources/flows/06-reference.md +25 -4
  111. package/dist/docs/development/guides/resources/messages/01-what-are-messages.md +19 -0
  112. package/dist/docs/development/guides/resources/messages/04-message-channels/01-introduction.md +16 -0
  113. package/dist/docs/development/guides/resources/messages/04-message-channels/05-reference.md +2 -1
  114. package/dist/docs/development/guides/resources/messages/10-reference.md +6 -3
  115. package/dist/docs/development/guides/resources/schemas/04-explore-schemas/01-schema-explorer.md +2 -2
  116. package/dist/docs/development/guides/resources/schemas/04-explore-schemas/02-fields-explorer.md +0 -9
  117. package/dist/docs/development/guides/resources/schemas/05-schema-api.md +0 -3
  118. package/dist/docs/development/guides/resources/schemas/06-schema-mcp.md +11 -3
  119. package/dist/docs/development/guides/resources/services/04-add-resources-to-services/03-add-entities-to-services.md +1 -1
  120. package/dist/docs/development/guides/resources/services/05-resources-page.md +50 -0
  121. package/dist/docs/development/guides/resources/services/08-reference.md +2 -1
  122. package/dist/docs/development/guides/systems/01-introduction.md +1 -1
  123. package/dist/docs/development/guides/systems/02-create-system.md +2 -2
  124. package/dist/docs/development/guides/systems/03-add-resources-to-systems.md +35 -9
  125. package/dist/docs/development/guides/systems/04-model-relationships-and-actors.md +5 -3
  126. package/dist/docs/development/guides/systems/05-system-context-maps.md +39 -22
  127. package/dist/docs/development/guides/systems/06-reference.md +4 -4
  128. package/dist/docs/development/license/01-license-file.md +151 -0
  129. package/dist/docs/development/license/_category_.json +12 -0
  130. package/dist/docs/development/license-keys/_category_.json +3 -3
  131. package/dist/docs/development/license-keys/integrations.md +7 -37
  132. package/dist/docs/development/license-keys/license-validation.md +4 -0
  133. package/dist/docs/development/license-keys/overview.md +5 -1
  134. package/dist/docs/development/license-keys/plans.md +4 -2
  135. package/dist/docs/development/studio/01-introduction.md +60 -0
  136. package/dist/docs/development/studio/02-create-a-canvas.md +103 -0
  137. package/dist/docs/development/studio/03-set-up-persistent-storage.md +59 -0
  138. package/dist/docs/development/studio/04-collaborate-on-a-canvas.md +78 -0
  139. package/dist/docs/development/studio/05-connect-your-agent.md +102 -0
  140. package/dist/docs/development/studio/06-run-studio-in-production.md +54 -0
  141. package/dist/docs/development/studio/07-reference.md +294 -0
  142. package/dist/docs/development/studio/_category_.json +12 -0
  143. package/dist/docs/development/upgrading/v5.md +345 -0
  144. package/dist/docs/federation/00-overview.md +2 -8
  145. package/dist/docs/federation/01-first-federation.md +6 -18
  146. package/dist/docs/federation/explanation/how-it-works.md +0 -4
  147. package/dist/docs/federation/explanation/lockfile-and-cache.md +0 -4
  148. package/dist/docs/federation/explanation/mvp-status-and-feedback.md +0 -4
  149. package/dist/docs/federation/explanation/ownership-and-references.md +0 -4
  150. package/dist/docs/federation/how-to/configure-github-sources.md +6 -5
  151. package/dist/docs/federation/how-to/configure-validation-rules.md +0 -4
  152. package/dist/docs/federation/how-to/run-in-ci.md +2 -9
  153. package/dist/docs/federation/how-to/share-assets-and-components.md +0 -4
  154. package/dist/docs/federation/how-to/use-local-sources.md +0 -4
  155. package/dist/docs/federation/legacy-federation/00-introduction.md +4 -22
  156. package/dist/docs/federation/legacy-federation/01-installation.md +7 -58
  157. package/dist/docs/federation/legacy-federation/02-plugin-configuration.md +3 -21
  158. package/dist/docs/federation/legacy-federation/03-examples.md +3 -5
  159. package/dist/docs/federation/legacy-federation/04-configuration.md +3 -8
  160. package/dist/docs/federation/legacy-federation/05-setup-team-catalog.md +3 -6
  161. package/dist/docs/federation/reference/cli.md +2 -8
  162. package/dist/docs/federation/reference/configuration.md +0 -4
  163. package/dist/docs/federation/reference/diagnostic-rules.md +0 -5
  164. package/dist/docs/federation/reference/generated-output.md +0 -4
  165. package/dist/docs/federation/reference/supported-content.md +0 -4
  166. package/dist/docs/federation/reference/troubleshooting.md +0 -14
  167. package/dist/docs/plugins/02-generators.md +1 -1
  168. package/dist/docs/plugins/amazon-apigateway/00-intro.md +3 -28
  169. package/dist/docs/plugins/amazon-apigateway/01-installation.md +4 -56
  170. package/dist/docs/plugins/amazon-apigateway/02-plugin-configuration.md +1 -6
  171. package/dist/docs/plugins/apicurio/00-intro.md +2 -31
  172. package/dist/docs/plugins/apicurio/01-installation.md +2 -26
  173. package/dist/docs/plugins/apicurio/02-plugin-configuration.md +5 -13
  174. package/dist/docs/plugins/apicurio/03-features.md +1 -3
  175. package/dist/docs/plugins/asyncapi/00-intro.md +2 -28
  176. package/dist/docs/plugins/asyncapi/01-installation.md +3 -54
  177. package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +2 -1
  178. package/dist/docs/plugins/aws-glue-registry/00-intro.md +4 -32
  179. package/dist/docs/plugins/aws-glue-registry/00a-installation.md +3 -53
  180. package/dist/docs/plugins/azure-schema-registry/00-intro.md +4 -32
  181. package/dist/docs/plugins/azure-schema-registry/01-installation.md +6 -33
  182. package/dist/docs/plugins/azure-schema-registry/02-plugin-configuration.md +1 -14
  183. package/dist/docs/plugins/azure-schema-registry/04-examples.md +0 -2
  184. package/dist/docs/plugins/backstage/00-overview.md +1 -7
  185. package/dist/docs/plugins/backstage/01-get-started.md +6 -15
  186. package/dist/docs/plugins/backstage/06-configuration.md +2 -8
  187. package/dist/docs/plugins/confluent-schema-registry/00-intro.md +2 -29
  188. package/dist/docs/plugins/confluent-schema-registry/01-installation.md +2 -26
  189. package/dist/docs/plugins/eventbridge/00-intro.md +0 -4
  190. package/dist/docs/plugins/eventbridge/00a-installation.md +1 -87
  191. package/dist/docs/plugins/eventbridge/03-api.md +2 -20
  192. package/dist/docs/plugins/github/00-intro.md +0 -31
  193. package/dist/docs/plugins/github/01-installation.md +2 -34
  194. package/dist/docs/plugins/graphql/00-intro.md +0 -30
  195. package/dist/docs/plugins/graphql/01-installation.md +1 -53
  196. package/dist/docs/plugins/graphql/02-plugin-configuration.md +0 -1
  197. package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
  198. package/dist/docs/plugins/openapi/00-intro.md +0 -30
  199. package/dist/docs/plugins/openapi/01-installation.md +1 -57
  200. package/dist/docs/plugins/openapi/02-plugin-configuration.md +0 -5
  201. package/dist/docs/plugins/openapi/03-features.md +0 -4
  202. package/dist/eventcatalog-config-file-utils.cjs +34 -41
  203. package/dist/eventcatalog-config-file-utils.d.cts +56 -58
  204. package/dist/eventcatalog-config-file-utils.d.ts +56 -58
  205. package/dist/eventcatalog-config-file-utils.js +1 -1
  206. package/dist/eventcatalog.cjs +408 -281
  207. package/dist/eventcatalog.config.d.cts +26 -15
  208. package/dist/eventcatalog.config.d.ts +26 -15
  209. package/dist/eventcatalog.js +46 -27
  210. package/dist/features.cjs +36 -49
  211. package/dist/features.d.cts +1 -3
  212. package/dist/features.d.ts +1 -3
  213. package/dist/features.js +4 -6
  214. package/dist/federation/federate.cjs +37 -44
  215. package/dist/federation/federate.js +5 -5
  216. package/dist/federation/source-provider.js +2 -2
  217. package/dist/generate.cjs +37 -42
  218. package/dist/generate.js +4 -4
  219. package/dist/resolve-catalog-dependencies.cjs +34 -41
  220. package/dist/resolve-catalog-dependencies.js +2 -2
  221. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
  222. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
  223. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
  224. package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
  225. package/dist/runtime-dependencies/manifest.json +5 -1
  226. package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
  227. package/dist/utils/child-process-signals.cjs +53 -0
  228. package/dist/utils/child-process-signals.d.cts +19 -0
  229. package/dist/utils/child-process-signals.d.ts +19 -0
  230. package/dist/utils/child-process-signals.js +6 -0
  231. package/dist/utils/cli-logger.cjs +1 -1
  232. package/dist/utils/cli-logger.js +2 -2
  233. package/dist/utils/license-status.cjs +11 -4
  234. package/dist/utils/license-status.d.cts +3 -2
  235. package/dist/utils/license-status.d.ts +3 -2
  236. package/dist/utils/license-status.js +1 -1
  237. package/eventcatalog/astro.config.mjs +21 -1
  238. package/eventcatalog/integrations/config-loader.mjs +56 -58
  239. package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
  240. package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
  241. package/eventcatalog/integrations/storage.mjs +20 -0
  242. package/eventcatalog/integrations/studio-server.mjs +4 -1
  243. package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
  244. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
  245. package/eventcatalog/src/components/Homepage/CatalogDashboard.astro +342 -0
  246. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +60 -4
  247. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
  248. package/eventcatalog/src/components/NavigationProgress.astro +7 -0
  249. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
  250. package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
  251. package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
  252. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
  253. package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
  254. package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
  255. package/eventcatalog/src/components/Search/search-utils.ts +26 -0
  256. package/eventcatalog/src/components/Seo.astro +5 -1
  257. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +53 -48
  258. package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +183 -178
  259. package/eventcatalog/src/components/Settings/LicenseSettings.tsx +140 -31
  260. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +40 -35
  261. package/eventcatalog/src/components/Settings/LogoUpload.tsx +1 -1
  262. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +9 -8
  263. package/eventcatalog/src/components/Settings/Row.tsx +7 -4
  264. package/eventcatalog/src/components/Settings/SettingsShared.tsx +3 -3
  265. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +37 -76
  266. package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
  267. package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +122 -1
  268. package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
  269. package/eventcatalog/src/components/TrialBadge.astro +20 -9
  270. package/eventcatalog/src/content.config.ts +19 -2
  271. package/eventcatalog/src/features/auth/error.astro +4 -2
  272. package/eventcatalog/src/features/auth/login.astro +2 -1
  273. package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +21 -1
  274. package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
  275. package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
  276. package/eventcatalog/src/features/integrations/eventcatalog-features.ts +13 -7
  277. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
  278. package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +3 -3
  279. package/eventcatalog/src/features/mcp/apps/canvas/styles.css +3 -1
  280. package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +7 -5
  281. package/eventcatalog/src/features/mcp/apps/generated/canvas.html +123 -98
  282. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +118 -101
  283. package/eventcatalog/src/features/mcp/mcp-server.ts +20 -4
  284. package/eventcatalog/src/features/server/start.ts +25 -0
  285. package/eventcatalog/src/features/storage/database.ts +88 -0
  286. package/eventcatalog/src/features/storage/migrations.ts +85 -0
  287. package/eventcatalog/src/features/storage/sql/database.sql +5 -0
  288. package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
  289. package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
  290. package/eventcatalog/src/features/storage/sql.ts +28 -0
  291. package/eventcatalog/src/features/studio/agent-choreography.ts +13 -10
  292. package/eventcatalog/src/features/studio/agents.ts +28 -0
  293. package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
  294. package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
  295. package/eventcatalog/src/features/studio/api/client.ts +40 -0
  296. package/eventcatalog/src/features/studio/canvas-actions.ts +160 -34
  297. package/eventcatalog/src/features/studio/canvas-preview.ts +1 -2
  298. package/eventcatalog/src/features/studio/catalog.ts +16 -14
  299. package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +274 -105
  300. package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +15 -14
  301. package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +272 -119
  302. package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +1 -2
  303. package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
  304. package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
  305. package/eventcatalog/src/features/studio/components/JoinForm.tsx +101 -26
  306. package/eventcatalog/src/features/studio/components/LeftPanel.tsx +122 -230
  307. package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
  308. package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
  309. package/eventcatalog/src/features/studio/components/Presence.tsx +52 -45
  310. package/eventcatalog/src/features/studio/components/ShareDialog.tsx +277 -141
  311. package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
  312. package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +1314 -385
  313. package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
  314. package/eventcatalog/src/features/studio/document-name.ts +7 -0
  315. package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
  316. package/eventcatalog/src/features/studio/hooks/presence-sender.ts +19 -2
  317. package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +9 -3
  318. package/eventcatalog/src/features/studio/hooks/use-comments.ts +2 -2
  319. package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +8 -3
  320. package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +244 -32
  321. package/eventcatalog/src/features/studio/identity.ts +25 -1
  322. package/eventcatalog/src/features/studio/limits.ts +2 -0
  323. package/eventcatalog/src/features/studio/pages/[id].astro +42 -16
  324. package/eventcatalog/src/features/studio/pages/index.astro +596 -373
  325. package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +12 -15
  326. package/eventcatalog/src/features/studio/server/canvas-mcp.ts +8 -23
  327. package/eventcatalog/src/features/studio/server/runtime.ts +150 -46
  328. package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
  329. package/eventcatalog/src/features/studio/server/storage.ts +53 -73
  330. package/eventcatalog/src/features/studio/webmcp-relay/LICENSE +21 -0
  331. package/eventcatalog/src/features/studio/webmcp-relay/README.md +5 -0
  332. package/eventcatalog/src/features/studio/webmcp-relay/embed.js +2 -0
  333. package/eventcatalog/src/features/studio/webmcp-relay/widget.html +10 -0
  334. package/eventcatalog/src/features/studio/webmcp-relay/widget.js +1 -0
  335. package/eventcatalog/src/features/tools/catalog-tools.ts +3 -1
  336. package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
  337. package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
  338. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +3 -2
  339. package/eventcatalog/src/pages/_index.astro +5 -342
  340. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +2 -3
  341. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +0 -7
  342. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -1
  343. package/eventcatalog/src/pages/diagrams/[id]/[version]/_index.data.ts +0 -7
  344. package/eventcatalog/src/pages/diagrams/[id]/[version]/embed.astro +1 -0
  345. package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +1 -0
  346. package/eventcatalog/src/pages/directory/[type]/_index.data.ts +5 -7
  347. package/eventcatalog/src/pages/directory/[type]/index.astro +3 -1
  348. package/eventcatalog/src/pages/discover/[type]/_index.data.ts +5 -7
  349. package/eventcatalog/src/pages/discover/[type]/index.astro +3 -1
  350. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +0 -7
  351. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -0
  352. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +0 -7
  353. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -0
  354. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/_index.data.ts +0 -7
  355. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +3 -1
  356. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/_[filename].data.ts +0 -7
  357. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +0 -7
  358. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +1 -0
  359. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +1 -0
  360. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/_[...filename].data.ts +0 -4
  361. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/_index.data.ts +0 -7
  362. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/index.astro +1 -0
  363. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +3 -1
  364. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/_[filename].data.ts +0 -7
  365. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +1 -0
  366. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +2 -3
  367. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +0 -7
  368. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +1 -0
  369. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +1 -0
  370. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/_[filename].data.ts +0 -7
  371. package/eventcatalog/src/pages/docs/[type]/[id]/_index.data.ts +0 -7
  372. package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +2 -1
  373. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/_index.data.ts +0 -7
  374. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -0
  375. package/eventcatalog/src/pages/docs/[type]/[id]/language/_index.data.ts +0 -7
  376. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +1 -0
  377. package/eventcatalog/src/pages/docs/custom/[...path]/_index.data.ts +0 -7
  378. package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +1 -0
  379. package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +1 -1
  380. package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +1 -0
  381. package/eventcatalog/src/pages/docs/services/[id]/asyncapi/[filename].astro +1 -1
  382. package/eventcatalog/src/pages/docs/services/[id]/changelog/index.astro +1 -1
  383. package/eventcatalog/src/pages/docs/services/[id]/graphql/[filename].astro +1 -1
  384. package/eventcatalog/src/pages/docs/services/[id]/spec/[filename].astro +1 -1
  385. package/eventcatalog/src/pages/docs/teams/[id]/_index.data.ts +0 -7
  386. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +1 -0
  387. package/eventcatalog/src/pages/docs/users/[id]/_index.data.ts +0 -7
  388. package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -0
  389. package/eventcatalog/src/pages/index.astro +4 -2
  390. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/_index.data.ts +0 -7
  391. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +9 -1
  392. package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +0 -7
  393. package/eventcatalog/src/pages/schemas/explorer/index.astro +4 -2
  394. package/eventcatalog/src/pages/settings/license.astro +9 -1
  395. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/_index.data.ts +0 -7
  396. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/index.astro +1 -0
  397. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +0 -7
  398. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/_index.data.ts +0 -7
  399. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +1 -0
  400. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/_index.data.ts +0 -7
  401. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -0
  402. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +1 -0
  403. package/eventcatalog/src/pages/visualiser/[type]/[id]/_index.data.ts +38 -0
  404. package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +18 -41
  405. package/eventcatalog/src/pages/visualiser/designs/[id]/_index.data.ts +0 -7
  406. package/eventcatalog/src/pages/visualiser/designs/[id]/index.astro +2 -1
  407. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/_index.data.ts +0 -7
  408. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -0
  409. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +1 -0
  410. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/_index.data.ts +0 -7
  411. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +1 -0
  412. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/_index.data.ts +0 -7
  413. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +1 -0
  414. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +1 -0
  415. package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
  416. package/eventcatalog/src/utils/collections/flows.ts +20 -7
  417. package/eventcatalog/src/utils/collections/resource-owners.ts +8 -2
  418. package/eventcatalog/src/utils/collections/resources.ts +2 -0
  419. package/eventcatalog/src/utils/collections/util.ts +8 -4
  420. package/eventcatalog/src/utils/git.ts +11 -0
  421. package/eventcatalog/src/utils/homepage-dashboard.ts +143 -0
  422. package/eventcatalog/src/utils/license.ts +1 -1
  423. package/eventcatalog/src/utils/link-validation.ts +25 -19
  424. package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
  425. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
  426. package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +4 -2
  427. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
  428. package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
  429. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
  430. package/eventcatalog/src/utils/page-loaders/hybrid-page.ts +4 -15
  431. package/eventcatalog/src/utils/page-title.ts +15 -0
  432. package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
  433. package/eventcatalog/src/utils/trial.ts +13 -0
  434. package/package.json +11 -11
  435. package/dist/docs/development/ask-your-architecture/05-skills/02-installation.md +0 -60
  436. package/dist/docs/development/ask-your-architecture/05-skills/_category_.json +0 -11
  437. package/dist/docs/development/ask-your-architecture/06-slack-integration/01-introduction.md +0 -63
  438. package/dist/docs/development/ask-your-architecture/06-slack-integration/02-slack-app-setup.md +0 -154
  439. package/dist/docs/development/ask-your-architecture/06-slack-integration/03-installation.md +0 -169
  440. package/dist/docs/development/ask-your-architecture/06-slack-integration/04-deployment.md +0 -236
  441. package/dist/docs/development/ask-your-architecture/06-slack-integration/05-usage.md +0 -140
  442. package/dist/docs/development/ask-your-architecture/06-slack-integration/06-troubleshooting.md +0 -268
  443. package/dist/docs/development/ask-your-architecture/06-slack-integration/_category_.json +0 -13
  444. package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-integration-map.md +0 -40
  445. package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +0 -3
  446. package/eventcatalog/src/features/studio/canvas-doc.ts +0 -409
  447. package/eventcatalog/src/features/studio/clipboard.ts +0 -97
  448. package/eventcatalog/src/features/studio/components/CanvasControls.tsx +0 -154
  449. package/eventcatalog/src/features/studio/components/Comments.tsx +0 -770
  450. package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +0 -145
  451. package/eventcatalog/src/features/studio/components/DragGhost.tsx +0 -115
  452. package/eventcatalog/src/features/studio/components/Picture.tsx +0 -21
  453. package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +0 -212
  454. package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +0 -255
  455. package/eventcatalog/src/features/studio/components/icons.ts +0 -53
  456. package/eventcatalog/src/features/studio/components/status.ts +0 -51
  457. package/eventcatalog/src/features/studio/edges.ts +0 -56
  458. package/eventcatalog/src/features/studio/flow-state.ts +0 -92
  459. package/eventcatalog/src/features/studio/grouping.ts +0 -226
  460. package/eventcatalog/src/features/studio/layout.ts +0 -42
  461. package/eventcatalog/src/features/studio/levels.ts +0 -282
  462. package/eventcatalog/src/features/studio/node-types.ts +0 -205
  463. package/eventcatalog/src/features/studio/pages/new.astro +0 -24
  464. package/eventcatalog/src/features/studio/pages/wake.ts +0 -15
  465. package/eventcatalog/src/features/studio/placement.ts +0 -197
  466. package/eventcatalog/src/features/studio/studio.css +0 -273
  467. package/dist/{chunk-A2RZR3U4.js → chunk-6K7XZAYI.js} +3 -3
@@ -1,205 +0,0 @@
1
- /**
2
- * The kinds of node people (and agents) can put on a canvas, and what's in their data. Shared by the browser and
3
- * the server, so it has no UI in it: the icons for each type are in components/icons.ts.
4
- */
5
-
6
- export type NodeCategory = 'boundaries' | 'messages' | 'architecture' | 'other';
7
-
8
- export const NODE_CATEGORIES: { id: NodeCategory; label: string }[] = [
9
- { id: 'boundaries', label: 'Boundaries' },
10
- { id: 'messages', label: 'Messages' },
11
- { id: 'architecture', label: 'Architecture' },
12
- { id: 'other', label: 'Other' },
13
- ];
14
-
15
- /** Domains and systems as containers: boxes other nodes sit in */
16
- export const GROUP_TYPES = { domain: 'domain-group', system: 'system-group' } as const;
17
- export const isGroupType = (type?: string) => type === GROUP_TYPES.domain || type === GROUP_TYPES.system;
18
-
19
- export type NodeDefinition = {
20
- /** React Flow node type, matches the visualiser node component keys */
21
- type: string;
22
- label: string;
23
- category: NodeCategory;
24
- /** Not in the components list (still drawn, for canvases that have them) */
25
- unlisted?: boolean;
26
- /** Where the resource lives inside node.data (e.g. `service` for data.service). Undefined = data root */
27
- resourceKey?: string;
28
- /** Nodes that are sized on the canvas (containers, notes, text) start at this size */
29
- defaultSize?: { width: number; height: number };
30
- /** Only its width is set: its height follows what's in it (text) */
31
- autoHeight?: boolean;
32
- createData: () => Record<string, unknown>;
33
- };
34
-
35
- const resource = (name: string, summary: string) => ({ name, version: '0.0.1', summary, owners: [] });
36
-
37
- export const nodeDefinitions: NodeDefinition[] = [
38
- {
39
- type: GROUP_TYPES.domain,
40
- label: 'Domain',
41
- category: 'boundaries',
42
- resourceKey: 'domain',
43
- defaultSize: { width: 720, height: 460 },
44
- createData: () => ({ domain: { name: 'New Domain', version: '0.0.1' } }),
45
- },
46
- {
47
- type: GROUP_TYPES.system,
48
- label: 'System',
49
- category: 'boundaries',
50
- resourceKey: 'system',
51
- defaultSize: { width: 560, height: 360 },
52
- createData: () => ({ system: { name: 'New System', version: '0.0.1' } }),
53
- },
54
- {
55
- type: 'service',
56
- category: 'architecture',
57
- label: 'Service',
58
- resourceKey: 'service',
59
- createData: () => ({
60
- mode: 'full',
61
- service: { ...resource('New Service', 'Describe what this service does.'), sends: [], receives: [] },
62
- }),
63
- },
64
- {
65
- type: 'event',
66
- category: 'messages',
67
- label: 'Event',
68
- resourceKey: 'message',
69
- createData: () => ({ mode: 'full', message: resource('NewEvent', 'Something happened.') }),
70
- },
71
- {
72
- type: 'command',
73
- category: 'messages',
74
- label: 'Command',
75
- resourceKey: 'message',
76
- createData: () => ({ mode: 'full', message: resource('NewCommand', 'Asks a service to do something.') }),
77
- },
78
- {
79
- type: 'query',
80
- category: 'messages',
81
- label: 'Query',
82
- resourceKey: 'message',
83
- createData: () => ({ mode: 'full', message: resource('NewQuery', 'Asks for some information.') }),
84
- },
85
- {
86
- type: 'channel',
87
- category: 'architecture',
88
- label: 'Channel',
89
- resourceKey: 'channel',
90
- createData: () => ({ mode: 'full', channel: { ...resource('new.channel', 'Where messages are routed.'), protocols: [] } }),
91
- },
92
- {
93
- type: 'data',
94
- category: 'architecture',
95
- label: 'Data Store',
96
- resourceKey: 'data',
97
- createData: () => ({ mode: 'full', data: { ...resource('New Database', 'Stores data.'), container_type: 'database' } }),
98
- },
99
- {
100
- type: 'view',
101
- category: 'architecture',
102
- label: 'View',
103
- resourceKey: 'view',
104
- createData: () => ({ mode: 'full', view: resource('New View', 'What the user sees.') }),
105
- },
106
- {
107
- type: 'externalSystem',
108
- category: 'architecture',
109
- unlisted: true,
110
- label: 'External System',
111
- resourceKey: 'externalSystem',
112
- createData: () => ({ mode: 'full', externalSystem: resource('External System', 'A third party system.') }),
113
- },
114
- {
115
- type: 'agent',
116
- category: 'architecture',
117
- label: 'Agent',
118
- resourceKey: 'agent',
119
- createData: () => ({ mode: 'full', agent: { ...resource('New Agent', 'What this agent does.'), sends: [], receives: [] } }),
120
- },
121
- {
122
- type: 'actor',
123
- category: 'other',
124
- label: 'Actor',
125
- createData: () => ({ mode: 'full', name: 'Customer', summary: 'A person using the system.' }),
126
- },
127
- {
128
- type: 'text',
129
- category: 'other',
130
- label: 'Text',
131
- defaultSize: { width: 240, height: 40 },
132
- autoHeight: true,
133
- createData: () => ({ text: 'Add some text' }),
134
- },
135
- {
136
- type: 'note',
137
- category: 'other',
138
- label: 'Sticky Note',
139
- // About square, like a post-it (taller if more is written on it)
140
- defaultSize: { width: 200, height: 176 },
141
- autoHeight: true,
142
- createData: () => ({ text: '', color: 'yellow' }),
143
- },
144
- ];
145
-
146
- /** The types people and agents can add (not the unlisted ones) */
147
- export const COMPONENT_TYPES = nodeDefinitions
148
- .filter((definition) => !definition.unlisted)
149
- .map((definition) => definition.type) as [string, ...string[]];
150
-
151
- const definitionsByType = new Map(nodeDefinitions.map((definition) => [definition.type, definition]));
152
-
153
- // Node types that only come from the catalog (not in the components list)
154
- const catalogNodeTypes: Record<string, { label: string; resourceKey: string }> = {
155
- system: { label: 'System', resourceKey: 'system' },
156
- 'context-domain': { label: 'Domain', resourceKey: 'domain' },
157
- };
158
-
159
- export const getNodeDefinition = (type?: string) => (type ? definitionsByType.get(type) : undefined);
160
-
161
- export const getNodeLabel = (type?: string) => getNodeDefinition(type)?.label ?? catalogNodeTypes[type ?? '']?.label ?? 'Node';
162
-
163
- // About the size the visualiser's resource cards render at
164
- export const DEFAULT_NODE_SIZE = { width: 240, height: 112 };
165
-
166
- /** The size a new node of a type starts at (or, for cards, about the size it renders at) */
167
- export const getNodeSize = (type?: string) => getNodeDefinition(type)?.defaultSize ?? DEFAULT_NODE_SIZE;
168
-
169
- const getResourceKey = (type?: string) => getNodeDefinition(type)?.resourceKey ?? catalogNodeTypes[type ?? '']?.resourceKey;
170
-
171
- /** The resource object for a node (e.g. data.service), or the data itself for flat nodes */
172
- export const getResource = (type: string | undefined, data: Record<string, unknown>): Record<string, unknown> => {
173
- const key = getResourceKey(type);
174
- return key ? ((data[key] as Record<string, unknown>) ?? {}) : data;
175
- };
176
-
177
- /** Sticky notes sit on the canvas wherever they're put, never inside a container */
178
- export const canGoInContainer = (type?: string) => type !== 'note';
179
-
180
- /**
181
- * The level (L1, L2 or L3) a sticky note was added on: it's only shown there. Notes from before levels had notes
182
- * are on L3, the canvas people edit. Other nodes are on every level they fit in, so they have none.
183
- */
184
- export const getNoteLevel = (node: { type?: string; data: Record<string, unknown> }): 1 | 2 | 3 | undefined =>
185
- node.type === 'note' ? ((node.data.level as 1 | 2 | undefined) ?? 3) : undefined;
186
-
187
- /** Whether a node is on a level's canvas as itself: everything on L3, but notes only on the level they were added on */
188
- export const isOnLevel = (node: { type?: string; data: Record<string, unknown> }, level: 1 | 2 | 3) =>
189
- node.type !== 'note' || getNoteLevel(node) === level;
190
-
191
- /** Notes and text: written on the canvas itself (their text is their data, not a resource with a name) */
192
- export const isWrittenOnCanvas = (type?: string) => type === 'note' || type === 'text';
193
-
194
- /** Whether a node's resource has a version (actors and notes don't) */
195
- export const isVersioned = (type?: string) => !!getResourceKey(type);
196
-
197
- /** Returns new node data with fields of the resource changed */
198
- export const updateResource = (type: string | undefined, data: Record<string, unknown>, fields: Record<string, unknown>) => {
199
- const key = getResourceKey(type);
200
- return key ? { ...data, [key]: { ...getResource(type, data), ...fields } } : { ...data, ...fields };
201
- };
202
-
203
- /** A node's name, as people and agents see it */
204
- export const getNodeName = (type: string | undefined, data: Record<string, unknown>, fallback = 'node') =>
205
- String(getResource(type, data).name ?? data.text ?? fallback);
@@ -1,24 +0,0 @@
1
- ---
2
- import { buildUrl } from '@utils/url-builder';
3
- import { startStudio } from '../server/runtime';
4
- import { getSignedInUser, isSignedIn } from '../server/sign-in';
5
-
6
- export const prerender = false;
7
-
8
- // A new canvas. From the New canvas dialog (a POST) it's started with its name and who started it (whoever's signed in,
9
- // or the name they gave); a plain link starts an untitled one, created when its page connects.
10
- const MAX_TITLE_LENGTH = 200;
11
-
12
- if (Astro.request.method === 'POST') {
13
- const form = await Astro.request.formData();
14
- const text = (field: string) =>
15
- String(form.get(field) ?? '')
16
- .trim()
17
- .slice(0, MAX_TITLE_LENGTH) || undefined;
18
- const createdBy = getSignedInUser(Astro.locals)?.name ?? text('by');
19
- const canvasId = await (await startStudio({ isSignedIn })).createCanvas({ title: text('title'), createdBy });
20
- return Astro.redirect(buildUrl(`/studio/${canvasId}`), 303);
21
- }
22
-
23
- return Astro.redirect(buildUrl(`/studio/${crypto.randomUUID()}`));
24
- ---
@@ -1,15 +0,0 @@
1
- import type { APIRoute } from 'astro';
2
- import { startStudio } from '../server/runtime';
3
- import { isSignedIn } from '../server/sign-in';
4
-
5
- /**
6
- * Starts Studio (its storage, and the collaboration connection) without opening a page: `eventcatalog start` calls it
7
- * once the server listens, so tabs reconnecting after a restart find it ready. It's under /_eventcatalog, which sign-in
8
- * lets through (the server calls it without a session), and says nothing about the canvases.
9
- */
10
- export const GET: APIRoute = async () => {
11
- await startStudio({ isSignedIn });
12
- return new Response(null, { status: 204 });
13
- };
14
-
15
- export const prerender = false;
@@ -1,197 +0,0 @@
1
- import type { Node, XYPosition } from '@xyflow/react';
2
- import { fitGroup, getAbsolutePosition, GROUP_PADDING, sizeOf } from './grouping';
3
-
4
- /**
5
- * Where agents put what they add without a position, the way an architect would: next to what it connects to,
6
- * following the flow left to right (what sends to it on its left, what it sends to on its right), lined up with
7
- * it, and stacked around it when several things connect to the same node. Nothing already on the canvas moves.
8
- * Things connected to nothing go in a row below what's there. Containers are filled first, so what goes around them
9
- * leaves room for what they grow to hold.
10
- */
11
-
12
- /** A connection between two nodes, from the one that sends to the one that receives */
13
- export type Link = { source: string; target: string };
14
-
15
- /** Between connected nodes side by side (room for the labels on their connections), and nodes stacked in a column */
16
- const GAP = { x: 200, y: 80 };
17
- /** The least room left around nodes */
18
- const CLEARANCE = { x: 120, y: 60 };
19
- /** Between what's on the canvas and things connected to nothing added below it */
20
- const BELOW_GAP = 120;
21
- /** Things connected to nothing go side by side (so connecting them later is easy), this many to a row */
22
- const ROW_LENGTH = 4;
23
- /** How far to look for free space before giving up and going below everything */
24
- const MAX_ROWS = 12;
25
- const MAX_COLUMNS = 8;
26
-
27
- type Rect = { x: number; y: number; width: number; height: number };
28
- type Anchor = { rect: Rect; centerY: number; upstream: boolean };
29
-
30
- const rectOf = (node: Node): Rect => ({ ...node.position, ...sizeOf(node) });
31
-
32
- const tooClose = (a: Rect, b: Rect) =>
33
- a.x < b.x + b.width + CLEARANCE.x &&
34
- b.x < a.x + a.width + CLEARANCE.x &&
35
- a.y < b.y + b.height + CLEARANCE.y &&
36
- b.y < a.y + a.height + CLEARANCE.y;
37
-
38
- const below = (rects: Rect[]): XYPosition => ({
39
- x: Math.min(...rects.map((rect) => rect.x)),
40
- y: Math.max(...rects.map((rect) => rect.y + rect.height)) + BELOW_GAP,
41
- });
42
-
43
- /** 0, 1, -1, 2, -2, …: rows below and above in turn, so things stacked around a node stay centred on it */
44
- const rowOffset = (row: number) => (row % 2 ? (row + 1) / 2 : -row / 2);
45
-
46
- /**
47
- * Where the nodes to place go on the canvas (not relative to their containers: containers that grow to fit them
48
- * move what's in them, but nothing moves on the canvas). They're among `nodes`, with their containers set.
49
- * Everything else in `nodes` stays where it is.
50
- */
51
- export const placeNodes = (nodes: Node[], toPlace: string[], links: Link[]): Map<string, XYPosition> => {
52
- const working = new Map(nodes.map((node) => [node.id, node]));
53
- const remaining = new Set(toPlace.filter((id) => working.has(id)));
54
-
55
- const neighbours = new Map<string, { id: string; upstream: boolean }[]>();
56
- const addNeighbour = (id: string, neighbour: { id: string; upstream: boolean }) =>
57
- neighbours.set(id, [...(neighbours.get(id) ?? []), neighbour]);
58
- for (const { source, target } of links) {
59
- addNeighbour(source, { id: target, upstream: false });
60
- addNeighbour(target, { id: source, upstream: true });
61
- }
62
-
63
- const depthOf = (id: string | undefined): number => {
64
- const node = id ? working.get(id) : undefined;
65
- return node ? 1 + depthOf(node.parentId) : 0;
66
- };
67
-
68
- /** The node, or the container it's in, that sits directly in a level (undefined for the canvas itself) */
69
- const atLevel = (id: string, level: string | undefined) => {
70
- let node = working.get(id);
71
- while (node && node.parentId !== level) node = node.parentId ? working.get(node.parentId) : undefined;
72
- return node;
73
- };
74
-
75
- /** The containers things are put in grow to fit them (innermost first), as they will on the canvas */
76
- const growing = new Set<string>();
77
- for (const id of remaining) {
78
- for (let parentId = working.get(id)!.parentId; parentId; parentId = working.get(parentId)?.parentId) growing.add(parentId);
79
- }
80
- const fitContainers = () => {
81
- const containers = [...growing].filter((id) => working.has(id)).sort((a, b) => depthOf(b) - depthOf(a));
82
- for (const id of containers) {
83
- const fit = fitGroup(
84
- id,
85
- [...working.values()].filter((node) => node.parentId !== id || !remaining.has(node.id))
86
- );
87
- if (!fit) continue;
88
- const container = working.get(id)!;
89
- // Growing up or left: what's in it moves the other way, so nothing moves on the canvas
90
- if (fit.shift.x || fit.shift.y) {
91
- for (const child of working.values()) {
92
- if (child.parentId !== id) continue;
93
- working.set(child.id, {
94
- ...child,
95
- position: { x: child.position.x + fit.shift.x, y: child.position.y + fit.shift.y },
96
- });
97
- }
98
- }
99
- working.set(id, {
100
- ...container,
101
- position: { x: container.position.x - fit.shift.x, y: container.position.y - fit.shift.y },
102
- width: fit.width,
103
- height: fit.height,
104
- });
105
- }
106
- };
107
-
108
- // Innermost containers first, then outwards to the canvas
109
- const levels = [...new Set([...remaining].map((id) => working.get(id)!.parentId))].sort((a, b) => depthOf(b) - depthOf(a));
110
-
111
- for (const level of levels) {
112
- fitContainers();
113
- const parent = level ? working.get(level) : undefined;
114
- const origin = parent ? getAbsolutePosition(parent, working) : { x: 0, y: 0 };
115
- // Inside a container: clear of its header, so it grows down rather than up
116
- const start = parent ? { x: GROUP_PADDING.left, y: GROUP_PADDING.top } : { x: 0, y: 0 };
117
- const todo = [...remaining].filter((id) => working.get(id)!.parentId === level);
118
- // Things connected to nothing: a row below what was there, each to the right of what's been placed so far
119
- let row: { y: number; length: number } | undefined;
120
- const placedHere: Rect[] = [];
121
- const obstacles = () =>
122
- [...working.values()].filter((node) => node.parentId === level && !remaining.has(node.id)).map(rectOf);
123
-
124
- /** What a node connects to that's already placed: the node itself, or the container it's in, at this level */
125
- const anchorsOf = (id: string): Anchor[] =>
126
- (neighbours.get(id) ?? []).flatMap(({ id: other, upstream }) => {
127
- const shown = atLevel(other, level);
128
- if (!shown || shown.id === id || remaining.has(shown.id)) return [];
129
- const node = working.get(other)!;
130
- // Lined up with the node itself, even when it's inside a container
131
- const centerY = getAbsolutePosition(node, working).y + sizeOf(node).height / 2 - origin.y;
132
- return [{ rect: rectOf(shown), centerY, upstream }];
133
- });
134
-
135
- /** Nothing placed to start from: the first one with nothing sending to it, so the flow grows left to right */
136
- const startOf = (ids: string[]) =>
137
- ids.find(
138
- (id) =>
139
- !(neighbours.get(id) ?? []).some(({ id: other, upstream }) => {
140
- const shown = atLevel(other, level);
141
- return upstream && shown && shown.id !== id && ids.includes(shown.id);
142
- })
143
- ) ?? ids[0];
144
-
145
- const findSpot = (from: XYPosition, size: { width: number; height: number }, direction: 1 | -1): XYPosition => {
146
- const rects = obstacles();
147
- for (let column = 0; column < MAX_COLUMNS; column++) {
148
- const x = from.x + direction * column * (size.width + GAP.x);
149
- for (let row = 0; row < MAX_ROWS * 2; row++) {
150
- const spot = { x, y: from.y + rowOffset(row) * (size.height + GAP.y) };
151
- if (parent && spot.y < GROUP_PADDING.top) continue;
152
- if (!rects.some((rect) => tooClose({ ...spot, ...size }, rect))) return spot;
153
- }
154
- }
155
- return rects.length ? below(rects) : start;
156
- };
157
-
158
- while (todo.length > 0) {
159
- const candidates = todo.map((id) => ({ id, anchors: anchorsOf(id) }));
160
- const connected = candidates.reduce((best, candidate) =>
161
- candidate.anchors.length > best.anchors.length ? candidate : best
162
- );
163
- const { id, anchors } = connected.anchors.length > 0 ? connected : { id: startOf(todo), anchors: [] };
164
- const node = working.get(id)!;
165
- const size = sizeOf(node);
166
-
167
- let spot: XYPosition;
168
- if (anchors.length > 0) {
169
- const upstream = anchors.filter((anchor) => anchor.upstream);
170
- const downstream = anchors.filter((anchor) => !anchor.upstream);
171
- const x = upstream.length
172
- ? Math.max(...upstream.map(({ rect }) => rect.x + rect.width)) + GAP.x
173
- : Math.min(...downstream.map(({ rect }) => rect.x)) - GAP.x - size.width;
174
- const centerY = anchors.reduce((sum, anchor) => sum + anchor.centerY, 0) / anchors.length;
175
- spot = findSpot({ x, y: centerY - size.height / 2 }, size, upstream.length ? 1 : -1);
176
- } else {
177
- const rects = obstacles();
178
- if (!row || row.length === ROW_LENGTH) {
179
- spot = findSpot(rects.length ? below(rects) : start, size, 1);
180
- row = { y: spot.y, length: 1 };
181
- } else {
182
- spot = findSpot({ x: Math.max(...placedHere.map((rect) => rect.x + rect.width)) + GAP.x, y: row.y }, size, 1);
183
- row.length++;
184
- }
185
- }
186
-
187
- const position = { x: Math.round(spot.x), y: Math.round(spot.y) };
188
- working.set(id, { ...node, position });
189
- placedHere.push({ ...position, ...size });
190
- remaining.delete(id);
191
- todo.splice(todo.indexOf(id), 1);
192
- }
193
- }
194
-
195
- fitContainers();
196
- return new Map(toPlace.filter((id) => working.has(id)).map((id) => [id, getAbsolutePosition(working.get(id)!, working)]));
197
- };