@eventcatalog/core 5.0.0-beta.5 → 5.0.0-beta.6

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 (84) hide show
  1. package/dist/analytics/analytics.cjs +1 -1
  2. package/dist/analytics/analytics.js +2 -2
  3. package/dist/analytics/log-build.cjs +1 -1
  4. package/dist/analytics/log-build.js +4 -4
  5. package/dist/{chunk-43AEF3JE.js → chunk-56CD2NH6.js} +1 -1
  6. package/dist/{chunk-YYMBYOQR.js → chunk-DE3QHVJP.js} +1 -1
  7. package/dist/{chunk-XQXMSQA5.js → chunk-L2IRFOE7.js} +1 -1
  8. package/dist/{chunk-SHHO3JJI.js → chunk-QBP3BBSV.js} +1 -1
  9. package/dist/{chunk-EBDTVZDW.js → chunk-XMPFHLK4.js} +4 -4
  10. package/dist/constants.cjs +1 -1
  11. package/dist/constants.js +1 -1
  12. package/dist/eventcatalog.cjs +1 -1
  13. package/dist/eventcatalog.js +11 -11
  14. package/dist/federation/federate.js +4 -4
  15. package/dist/generate.cjs +1 -1
  16. package/dist/generate.js +3 -3
  17. package/dist/runtime-dependencies/@hocuspocus__provider.mjs +3 -0
  18. package/dist/runtime-dependencies/@hocuspocus__server.mjs +3 -0
  19. package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +3 -0
  20. package/dist/runtime-dependencies/@mcp-b__webmcp-polyfill.mjs +3 -0
  21. package/dist/runtime-dependencies/manifest.json +8 -0
  22. package/dist/runtime-dependencies/react-hotkeys-hook.mjs +3 -0
  23. package/dist/runtime-dependencies/y-protocols.mjs +3 -0
  24. package/dist/runtime-dependencies/y-protocols__awareness.mjs +3 -0
  25. package/dist/runtime-dependencies/yjs.mjs +3 -0
  26. package/dist/utils/cli-logger.cjs +1 -1
  27. package/dist/utils/cli-logger.js +2 -2
  28. package/eventcatalog/astro.config.mjs +2 -0
  29. package/eventcatalog/integrations/studio-server.mjs +17 -0
  30. package/eventcatalog/src/features/integrations/eventcatalog-features.ts +20 -1
  31. package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +39 -0
  32. package/eventcatalog/src/features/mcp/apps/canvas/styles.css +22 -0
  33. package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +269 -0
  34. package/eventcatalog/src/features/mcp/apps/generated/canvas.html +209 -0
  35. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +2 -2
  36. package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +2 -1
  37. package/eventcatalog/src/features/mcp/mcp-apps.ts +6 -3
  38. package/eventcatalog/src/features/mcp/mcp-server.ts +17 -4
  39. package/eventcatalog/src/features/studio/agent-choreography.ts +378 -0
  40. package/eventcatalog/src/features/studio/canvas-actions.ts +287 -0
  41. package/eventcatalog/src/features/studio/canvas-doc.ts +280 -0
  42. package/eventcatalog/src/features/studio/catalog-resources.ts +152 -0
  43. package/eventcatalog/src/features/studio/catalog.ts +171 -0
  44. package/eventcatalog/src/features/studio/components/CanvasControls.tsx +153 -0
  45. package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +332 -0
  46. package/eventcatalog/src/features/studio/components/Comments.tsx +455 -0
  47. package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +217 -0
  48. package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +145 -0
  49. package/eventcatalog/src/features/studio/components/JoinForm.tsx +58 -0
  50. package/eventcatalog/src/features/studio/components/LeftPanel.tsx +218 -0
  51. package/eventcatalog/src/features/studio/components/Presence.tsx +284 -0
  52. package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +75 -0
  53. package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +760 -0
  54. package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +79 -0
  55. package/eventcatalog/src/features/studio/components/icons.ts +48 -0
  56. package/eventcatalog/src/features/studio/components/status.ts +22 -0
  57. package/eventcatalog/src/features/studio/edges.ts +54 -0
  58. package/eventcatalog/src/features/studio/flow-state.ts +92 -0
  59. package/eventcatalog/src/features/studio/grouping.ts +133 -0
  60. package/eventcatalog/src/features/studio/hooks/presence-sender.ts +46 -0
  61. package/eventcatalog/src/features/studio/hooks/presence-store.ts +115 -0
  62. package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +337 -0
  63. package/eventcatalog/src/features/studio/hooks/use-comments.ts +47 -0
  64. package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +99 -0
  65. package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +423 -0
  66. package/eventcatalog/src/features/studio/layout.ts +39 -0
  67. package/eventcatalog/src/features/studio/levels.ts +216 -0
  68. package/eventcatalog/src/features/studio/node-types.ts +173 -0
  69. package/eventcatalog/src/features/studio/pages/[id].astro +38 -0
  70. package/eventcatalog/src/features/studio/pages/index.astro +8 -0
  71. package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +27 -0
  72. package/eventcatalog/src/features/studio/placement.ts +197 -0
  73. package/eventcatalog/src/features/studio/server/canvas-mcp.ts +475 -0
  74. package/eventcatalog/src/features/studio/server/runtime.ts +215 -0
  75. package/eventcatalog/src/features/studio/server/tool-icons.ts +30 -0
  76. package/eventcatalog/src/features/studio/studio.css +89 -0
  77. package/eventcatalog/src/features/studio/tool-sync.ts +75 -0
  78. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +9 -2
  79. package/eventcatalog/src/utils/feature.ts +4 -0
  80. package/package.json +9 -2
  81. package/eventcatalog/public/studio-bg.png +0 -0
  82. package/eventcatalog/src/components/Studio/StudioPageModal.tsx +0 -150
  83. package/eventcatalog/src/pages/studio.astro +0 -316
  84. package/dist/{chunk-ZEY2XUJN.js → chunk-AYNZXUB5.js} +7 -7
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(analytics_exports);
36
36
  var import_os = __toESM(require("os"), 1);
37
37
 
38
38
  // package.json
39
- var version = "5.0.0-beta.5";
39
+ var version = "5.0.0-beta.6";
40
40
 
41
41
  // src/constants.ts
42
42
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "../chunk-SHHO3JJI.js";
4
- import "../chunk-XQXMSQA5.js";
3
+ } from "../chunk-QBP3BBSV.js";
4
+ import "../chunk-L2IRFOE7.js";
5
5
  export {
6
6
  raiseEvent
7
7
  };
@@ -176,7 +176,7 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
176
176
  var import_os = __toESM(require("os"), 1);
177
177
 
178
178
  // package.json
179
- var version = "5.0.0-beta.5";
179
+ var version = "5.0.0-beta.6";
180
180
 
181
181
  // src/constants.ts
182
182
  var VERSION = version;
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  log_build_default
3
- } from "../chunk-EBDTVZDW.js";
4
- import "../chunk-SHHO3JJI.js";
5
- import "../chunk-ZAZHAVKB.js";
3
+ } from "../chunk-XMPFHLK4.js";
6
4
  import "../chunk-PIYJM642.js";
7
- import "../chunk-XQXMSQA5.js";
5
+ import "../chunk-ZAZHAVKB.js";
6
+ import "../chunk-QBP3BBSV.js";
7
+ import "../chunk-L2IRFOE7.js";
8
8
  import "../chunk-RFIXKATC.js";
9
9
  export {
10
10
  log_build_default as default
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-XQXMSQA5.js";
3
+ } from "./chunk-L2IRFOE7.js";
4
4
 
5
5
  // src/utils/cli-logger.ts
6
6
  import pc from "picocolors";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  logger
3
- } from "./chunk-43AEF3JE.js";
3
+ } from "./chunk-56CD2NH6.js";
4
4
  import {
5
5
  cleanup,
6
6
  getEventCatalogConfigFile
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "5.0.0-beta.5";
2
+ var version = "5.0.0-beta.6";
3
3
 
4
4
  // src/constants.ts
5
5
  var VERSION = version;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-XQXMSQA5.js";
3
+ } from "./chunk-L2IRFOE7.js";
4
4
 
5
5
  // src/analytics/analytics.js
6
6
  import os from "os";
@@ -1,14 +1,14 @@
1
1
  import {
2
- raiseEvent
3
- } from "./chunk-SHHO3JJI.js";
2
+ getLicenseAnalytics
3
+ } from "./chunk-PIYJM642.js";
4
4
  import {
5
5
  countResources,
6
6
  hashCatalogContent,
7
7
  serializeCounts
8
8
  } from "./chunk-ZAZHAVKB.js";
9
9
  import {
10
- getLicenseAnalytics
11
- } from "./chunk-PIYJM642.js";
10
+ raiseEvent
11
+ } from "./chunk-QBP3BBSV.js";
12
12
  import {
13
13
  getEventCatalogConfigFile,
14
14
  verifyRequiredFieldsAreInCatalogConfigFile
@@ -25,7 +25,7 @@ __export(constants_exports, {
25
25
  module.exports = __toCommonJS(constants_exports);
26
26
 
27
27
  // package.json
28
- var version = "5.0.0-beta.5";
28
+ var version = "5.0.0-beta.6";
29
29
 
30
30
  // src/constants.ts
31
31
  var VERSION = version;
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-XQXMSQA5.js";
3
+ } from "./chunk-L2IRFOE7.js";
4
4
  export {
5
5
  VERSION
6
6
  };
@@ -181,7 +181,7 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
181
181
  var import_picocolors = __toESM(require("picocolors"), 1);
182
182
 
183
183
  // package.json
184
- var version = "5.0.0-beta.5";
184
+ var version = "5.0.0-beta.6";
185
185
 
186
186
  // src/constants.ts
187
187
  var VERSION = version;
@@ -4,27 +4,27 @@ import {
4
4
  import "./chunk-CA4U2JP7.js";
5
5
  import {
6
6
  log_build_default
7
- } from "./chunk-EBDTVZDW.js";
8
- import "./chunk-SHHO3JJI.js";
9
- import "./chunk-ZAZHAVKB.js";
7
+ } from "./chunk-XMPFHLK4.js";
10
8
  import {
11
9
  getLicenseStatus,
12
10
  printLicenseStatus
13
11
  } from "./chunk-PIYJM642.js";
12
+ import "./chunk-ZAZHAVKB.js";
14
13
  import {
15
14
  FederationConflictError,
16
15
  FederationDiagnosticError,
17
16
  federateCatalog
18
- } from "./chunk-ZEY2XUJN.js";
17
+ } from "./chunk-AYNZXUB5.js";
18
+ import "./chunk-5EPNFDT5.js";
19
+ import "./chunk-A2RZR3U4.js";
20
+ import "./chunk-R7Z5ALYI.js";
19
21
  import {
20
22
  getFederationDiagnosticCounts,
21
23
  getVisibleFederationDiagnostics
22
24
  } from "./chunk-JJPB6EOZ.js";
23
- import "./chunk-WRNH5C3U.js";
24
- import "./chunk-5EPNFDT5.js";
25
- import "./chunk-A2RZR3U4.js";
26
25
  import "./chunk-SDZQJTJW.js";
27
26
  import "./chunk-352FGP6W.js";
27
+ import "./chunk-WRNH5C3U.js";
28
28
  import {
29
29
  getProjectOutDir,
30
30
  isAuthEnabled,
@@ -33,10 +33,10 @@ import {
33
33
  } from "./chunk-MDWB5HLO.js";
34
34
  import {
35
35
  generate
36
- } from "./chunk-YYMBYOQR.js";
36
+ } from "./chunk-DE3QHVJP.js";
37
37
  import {
38
38
  logger
39
- } from "./chunk-43AEF3JE.js";
39
+ } from "./chunk-56CD2NH6.js";
40
40
  import {
41
41
  resolve_catalog_dependencies_default
42
42
  } from "./chunk-36RYTYT5.js";
@@ -50,7 +50,7 @@ import {
50
50
  import {
51
51
  watch
52
52
  } from "./chunk-U63GDPPY.js";
53
- import "./chunk-R7Z5ALYI.js";
53
+ import "./chunk-QBP3BBSV.js";
54
54
  import {
55
55
  getAstroConfigPath
56
56
  } from "./chunk-VIJJ7JKH.js";
@@ -66,7 +66,7 @@ import {
66
66
  } from "./chunk-LFQJXLHG.js";
67
67
  import {
68
68
  VERSION
69
- } from "./chunk-XQXMSQA5.js";
69
+ } from "./chunk-L2IRFOE7.js";
70
70
  import {
71
71
  getEventCatalogConfigFile,
72
72
  verifyRequiredFieldsAreInCatalogConfigFile
@@ -2,14 +2,14 @@ import {
2
2
  FederationConflictError,
3
3
  FederationDiagnosticError,
4
4
  federateCatalog
5
- } from "../chunk-ZEY2XUJN.js";
6
- import "../chunk-JJPB6EOZ.js";
7
- import "../chunk-WRNH5C3U.js";
5
+ } from "../chunk-AYNZXUB5.js";
8
6
  import "../chunk-5EPNFDT5.js";
9
7
  import "../chunk-A2RZR3U4.js";
8
+ import "../chunk-R7Z5ALYI.js";
9
+ import "../chunk-JJPB6EOZ.js";
10
10
  import "../chunk-SDZQJTJW.js";
11
11
  import "../chunk-352FGP6W.js";
12
- import "../chunk-R7Z5ALYI.js";
12
+ import "../chunk-WRNH5C3U.js";
13
13
  import "../chunk-RFIXKATC.js";
14
14
  export {
15
15
  FederationConflictError,
package/dist/generate.cjs CHANGED
@@ -112,7 +112,7 @@ var getEventCatalogConfigFile = async (projectDirectory) => {
112
112
  var import_picocolors = __toESM(require("picocolors"), 1);
113
113
 
114
114
  // package.json
115
- var version = "5.0.0-beta.5";
115
+ var version = "5.0.0-beta.6";
116
116
 
117
117
  // src/constants.ts
118
118
  var VERSION = version;
package/dist/generate.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generate
3
- } from "./chunk-YYMBYOQR.js";
4
- import "./chunk-43AEF3JE.js";
5
- import "./chunk-XQXMSQA5.js";
3
+ } from "./chunk-DE3QHVJP.js";
4
+ import "./chunk-56CD2NH6.js";
5
+ import "./chunk-L2IRFOE7.js";
6
6
  import "./chunk-RFIXKATC.js";
7
7
  export {
8
8
  generate
@@ -0,0 +1,3 @@
1
+ export * from "@hocuspocus/provider";
2
+ import * as dependency from "@hocuspocus/provider";
3
+ export default dependency.default;
@@ -0,0 +1,3 @@
1
+ export * from "@hocuspocus/server";
2
+ import * as dependency from "@hocuspocus/server";
3
+ export default dependency.default;
@@ -0,0 +1,3 @@
1
+ export * from "@mcp-b/webmcp-local-relay";
2
+ import * as dependency from "@mcp-b/webmcp-local-relay";
3
+ export default dependency.default;
@@ -0,0 +1,3 @@
1
+ export * from "@mcp-b/webmcp-polyfill";
2
+ import * as dependency from "@mcp-b/webmcp-polyfill";
3
+ export default dependency.default;
@@ -34,7 +34,11 @@
34
34
  "@heroicons/react/24/outline/RectangleGroupIcon": "@heroicons__react__24__outline__RectangleGroupIcon.mjs",
35
35
  "@heroicons/react/24/outline/ServerIcon": "@heroicons__react__24__outline__ServerIcon.mjs",
36
36
  "@heroicons/react/24/solid": "@heroicons__react__24__solid.mjs",
37
+ "@hocuspocus/provider": "@hocuspocus__provider.mjs",
38
+ "@hocuspocus/server": "@hocuspocus__server.mjs",
37
39
  "@iconify-json/logos": "@iconify-json__logos.mjs",
40
+ "@mcp-b/webmcp-local-relay": "@mcp-b__webmcp-local-relay.mjs",
41
+ "@mcp-b/webmcp-polyfill": "@mcp-b__webmcp-polyfill.mjs",
38
42
  "@mermaid-js/layout-elk": "@mermaid-js__layout-elk.mjs",
39
43
  "@mermaid-js/layout-elk/dist/mermaid-layout-elk.core.mjs": "@mermaid-js__layout-elk__dist__mermaid-layout-elk.core.mjs.mjs",
40
44
  "@modelcontextprotocol/ext-apps": "@modelcontextprotocol__ext-apps.mjs",
@@ -107,6 +111,7 @@
107
111
  "react-dom": "react-dom.mjs",
108
112
  "react-dom/client": "react-dom__client.mjs",
109
113
  "react-dom/server": "react-dom__server.mjs",
114
+ "react-hotkeys-hook": "react-hotkeys-hook.mjs",
110
115
  "react-markdown": "react-markdown.mjs",
111
116
  "react-syntax-highlighter": "react-syntax-highlighter.mjs",
112
117
  "react-syntax-highlighter/dist/cjs/styles/prism": "react-syntax-highlighter__dist__cjs__styles__prism.mjs",
@@ -139,6 +144,9 @@
139
144
  "unist-util-visit": "unist-util-visit.mjs",
140
145
  "update-notifier": "update-notifier.mjs",
141
146
  "uuid": "uuid.mjs",
147
+ "y-protocols": "y-protocols.mjs",
148
+ "y-protocols/awareness": "y-protocols__awareness.mjs",
149
+ "yjs": "yjs.mjs",
142
150
  "zod": "zod.mjs",
143
151
  "zod/v4": "zod__v4.mjs"
144
152
  }
@@ -0,0 +1,3 @@
1
+ export * from "react-hotkeys-hook";
2
+ import * as dependency from "react-hotkeys-hook";
3
+ export default dependency.default;
@@ -0,0 +1,3 @@
1
+ export * from "y-protocols";
2
+ import * as dependency from "y-protocols";
3
+ export default dependency.default;
@@ -0,0 +1,3 @@
1
+ export * from "y-protocols/awareness";
2
+ import * as dependency from "y-protocols/awareness";
3
+ export default dependency.default;
@@ -0,0 +1,3 @@
1
+ export * from "yjs";
2
+ import * as dependency from "yjs";
3
+ export default dependency.default;
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(cli_logger_exports);
36
36
  var import_picocolors = __toESM(require("picocolors"), 1);
37
37
 
38
38
  // package.json
39
- var version = "5.0.0-beta.5";
39
+ var version = "5.0.0-beta.6";
40
40
 
41
41
  // src/constants.ts
42
42
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  logger
3
- } from "../chunk-43AEF3JE.js";
4
- import "../chunk-XQXMSQA5.js";
3
+ } from "../chunk-56CD2NH6.js";
4
+ import "../chunk-L2IRFOE7.js";
5
5
  export {
6
6
  logger
7
7
  };
@@ -27,6 +27,7 @@ import expressiveCode from 'astro-expressive-code';
27
27
  // preprocessors and the rehype plugin below load those same package defaults.
28
28
  import expressiveCodeConfig from './ec.config.mjs';
29
29
  import ecstudioWatcher from './integrations/ecstudio-watcher.mjs';
30
+ import studioServer from './integrations/studio-server.mjs';
30
31
  import eventCatalogIntegration from './src/features/integrations/eventcatalog-features.ts';
31
32
  import eventCatalogRuntime, { getDevServerFileSystem, packageDirectory } from './integrations/eventcatalog-runtime.mjs';
32
33
  import config from './src/utils/eventcatalog-config/source.ts';
@@ -139,6 +140,7 @@ export default defineConfig({
139
140
  catalogAssets({ projectDirectory, generatedDirectory: join(runtimeDirectory, 'public') }),
140
141
  effectiveOutput !== 'server' && compress && (await loadAstroCompressIntegration(projectDirectory)),
141
142
  ecstudioWatcher(),
143
+ studioServer(),
142
144
  eventCatalogIntegration(),
143
145
  linkValidation(config.linkValidation),
144
146
  ].filter(Boolean),
@@ -0,0 +1,17 @@
1
+ import { getStudioRuntime } from '../src/features/studio/server/runtime.ts';
2
+ import { isCanvasEnabled } from '../src/utils/feature.ts';
3
+
4
+ // Collaborative canvases: the collaboration WebSocket (Yjs over Hocuspocus), on the dev server's port.
5
+ // The runtime is shared with server code (e.g. MCP tools) through globalThis.
6
+ export default function studioServer() {
7
+ return {
8
+ name: 'eventcatalog-studio-server',
9
+ hooks: {
10
+ 'astro:server:setup': ({ server, logger }) => {
11
+ if (!isCanvasEnabled() || !server.httpServer) return;
12
+ getStudioRuntime().attach(server.httpServer);
13
+ logger.info('Collaboration server ready at /_eventcatalog/studio');
14
+ },
15
+ },
16
+ };
17
+ }
@@ -13,6 +13,7 @@ import {
13
13
  isFullCatalogAPIEnabled,
14
14
  isDevMode,
15
15
  isSSR,
16
+ isCanvasEnabled,
16
17
  } from '../../utils/feature';
17
18
  import { getCustomPageRoutes, isApiRoute, listCustomPageFiles, resolveCustomPagesPrefix } from '../custom-pages/routes';
18
19
 
@@ -111,7 +112,8 @@ export default function eventCatalogIntegration(): AstroIntegration {
111
112
  }
112
113
 
113
114
  // Handle routes for MCP Server (requires SSR)
114
- if (isEventCatalogMCPEnabled()) {
115
+ // Also for canvases, so agents can join them (the canvas tools are on the MCP server)
116
+ if (isEventCatalogMCPEnabled() || isCanvasEnabled()) {
115
117
  params.injectRoute({
116
118
  pattern: '/docs/mcp/[...path]',
117
119
  entrypoint: path.join(packageDirectory, 'src/features/mcp/mcp-server.ts'),
@@ -173,6 +175,23 @@ export default function eventCatalogIntegration(): AstroIntegration {
173
175
  entrypoint: path.join(packageDirectory, 'src/features/visualizer-layout/reset.ts'),
174
176
  });
175
177
  }
178
+
179
+ // Collaborative canvases in EventCatalog Studio (/studio starts one). Their WebSocket server is in
180
+ // integrations/studio-server.mjs.
181
+ if (isCanvasEnabled()) {
182
+ params.injectRoute({
183
+ pattern: '/studio',
184
+ entrypoint: path.join(packageDirectory, 'src/features/studio/pages/index.astro'),
185
+ });
186
+ params.injectRoute({
187
+ pattern: '/studio/[id]',
188
+ entrypoint: path.join(packageDirectory, 'src/features/studio/pages/[id].astro'),
189
+ });
190
+ params.injectRoute({
191
+ pattern: '/webmcp-relay/[file]',
192
+ entrypoint: path.join(packageDirectory, 'src/features/studio/pages/webmcp-relay.ts'),
193
+ });
194
+ }
176
195
  },
177
196
  'astro:server:setup': ({ server }) => {
178
197
  // When custom page files appear or disappear, refresh the manifest.
@@ -0,0 +1,39 @@
1
+ // Shared by the canvas MCP App (client) and the MCP server: no server-only imports here
2
+ import type { CatalogRelation, CatalogResource } from '../../../studio/catalog-resources';
3
+
4
+ export const CANVAS_RESOURCE_URI = 'ui://eventcatalog/canvas.html';
5
+ /** Key of the payload in openCanvas results' `_meta` */
6
+ export const CANVAS_META_KEY = 'eventcatalog/canvas';
7
+ /** App-only tool the view loads the canvas from when the host doesn't pass the result's `_meta` */
8
+ export const CANVAS_VIEW_TOOL = 'getCanvasView';
9
+ /** App-only tool the view loads the catalog (for dragging resources in) from */
10
+ export const CANVAS_CATALOG_TOOL = 'getCanvasCatalog';
11
+ /** App-only tool the view syncs through when the chat's sandbox blocks the collaboration WebSocket */
12
+ export const CANVAS_SYNC_TOOL = 'syncCanvas';
13
+
14
+ /** A canvas listed in the view's picker */
15
+ export type CanvasListItem = { canvasId: string; title?: string; people: string[]; nodeCount: number; openComments: number };
16
+
17
+ /**
18
+ * What the view shows: a canvas (it connects to it itself, so people and agents edit it live), or, when opened
19
+ * without one (e.g. from ChatGPT's sidebar), a list of canvases to open or start.
20
+ */
21
+ export type CanvasPayload = CanvasView | CanvasHome;
22
+
23
+ export type CanvasHome = { view: 'home'; canvases: CanvasListItem[] };
24
+
25
+ export type CanvasView = {
26
+ view: 'canvas';
27
+ canvasId: string;
28
+ title?: string;
29
+ /** The collaboration WebSocket, e.g. wss://catalog.example.com/_eventcatalog/studio */
30
+ socketUrl: string;
31
+ /** The canvas in EventCatalog */
32
+ canvasUrl: string;
33
+ /** The EventCatalog MCP server, for "Connect your agent" */
34
+ mcpUrl: string;
35
+ /** What to call the user on the canvas, when the agent knows their name */
36
+ userName?: string;
37
+ };
38
+
39
+ export type CanvasCatalog = { resources: CatalogResource[]; relations: CatalogRelation[] };
@@ -0,0 +1,22 @@
1
+ /*
2
+ * The canvas view's Tailwind stylesheet (with Tailwind's base reset) and EventCatalog's theme variables,
3
+ * built from the classes of the collaborative canvas components it renders.
4
+ */
5
+ @import 'tailwindcss' source(none);
6
+ @import '../../../../styles/theme.css';
7
+ @import '../../../studio/studio.css';
8
+
9
+ @source './*.tsx';
10
+ @source '../../../studio/components/*.{ts,tsx}';
11
+
12
+ body {
13
+ margin: 0;
14
+ background: rgb(var(--ec-page-bg));
15
+ color: rgb(var(--ec-page-text));
16
+ font-family:
17
+ ui-sans-serif,
18
+ system-ui,
19
+ -apple-system,
20
+ 'Segoe UI',
21
+ sans-serif;
22
+ }