@eventcatalog/core 3.17.5 → 3.18.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.
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +1 -1
- package/dist/analytics/log-build.js +3 -3
- package/dist/{chunk-MJVOXKKM.js → chunk-3XKMODP4.js} +1 -1
- package/dist/{chunk-VWSQYMKF.js → chunk-52VBVLRT.js} +1 -1
- package/dist/{chunk-LLGEQ4MZ.js → chunk-7CZBLKHQ.js} +1 -1
- package/dist/{chunk-O6SVMZR3.js → chunk-GSHSX7NU.js} +1 -1
- package/dist/{chunk-6LCHHROP.js → chunk-OQ6UFIEN.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +1 -1
- package/dist/eventcatalog.js +5 -5
- package/dist/generate.cjs +1 -1
- package/dist/generate.js +3 -3
- package/dist/utils/cli-logger.cjs +1 -1
- package/dist/utils/cli-logger.js +2 -2
- package/eventcatalog/src/components/EnvironmentDropdown.tsx +1 -1
- package/eventcatalog/src/components/Header.astro +5 -5
- package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +10 -6
- package/eventcatalog/src/components/MDX/NodeGraph/NodeGraphPortal.tsx +1 -1
- package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +10 -10
- package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +15 -13
- package/eventcatalog/src/components/Search/Search.astro +2 -2
- package/eventcatalog/src/components/SideNav/NestedSideBar/SearchBar.tsx +1 -1
- package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +5 -6
- package/eventcatalog/src/content.config.ts +18 -3
- package/eventcatalog/src/enterprise/mcp/mcp-server.ts +11 -17
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +2 -26
- package/eventcatalog/src/pages/_index.astro +138 -113
- package/eventcatalog/src/pages/index.astro +17 -5
- package/eventcatalog/src/styles/theme.css +7 -2
- package/eventcatalog/src/styles/themes/forest.css +7 -7
- package/eventcatalog/src/utils/node-graphs/container-node-graph.ts +5 -1
- package/eventcatalog/src/utils/node-graphs/data-products-node-graph.ts +3 -1
- package/eventcatalog/src/utils/node-graphs/domains-canvas.ts +8 -2
- package/eventcatalog/src/utils/node-graphs/domains-node-graph.ts +1 -1
- package/eventcatalog/src/utils/node-graphs/flows-node-graph.ts +2 -2
- package/eventcatalog/src/utils/node-graphs/message-node-graph.ts +13 -4
- package/eventcatalog/src/utils/node-graphs/services-node-graph.ts +4 -1
- package/eventcatalog/src/utils/node-graphs/utils/utils.ts +80 -17
- package/eventcatalog/tailwind.config.mjs +11 -2
- package/package.json +4 -4
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-3XKMODP4.js";
|
|
4
|
+
import "../chunk-52VBVLRT.js";
|
|
5
5
|
import "../chunk-4UVFXLPI.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-OQ6UFIEN.js";
|
|
7
7
|
import "../chunk-5T63CXKU.js";
|
|
8
8
|
export {
|
|
9
9
|
log_build_default as default
|
package/dist/constants.cjs
CHANGED
package/dist/constants.js
CHANGED
package/dist/eventcatalog.cjs
CHANGED
|
@@ -114,7 +114,7 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
|
|
|
114
114
|
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
115
115
|
|
|
116
116
|
// package.json
|
|
117
|
-
var version = "3.
|
|
117
|
+
var version = "3.18.0";
|
|
118
118
|
|
|
119
119
|
// src/constants.ts
|
|
120
120
|
var VERSION = version;
|
package/dist/eventcatalog.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
} from "./chunk-PLNJC7NZ.js";
|
|
7
7
|
import {
|
|
8
8
|
log_build_default
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-3XKMODP4.js";
|
|
10
|
+
import "./chunk-52VBVLRT.js";
|
|
11
11
|
import "./chunk-4UVFXLPI.js";
|
|
12
12
|
import {
|
|
13
13
|
runMigrations
|
|
@@ -22,13 +22,13 @@ import {
|
|
|
22
22
|
} from "./chunk-3KXCGYET.js";
|
|
23
23
|
import {
|
|
24
24
|
generate
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-7CZBLKHQ.js";
|
|
26
26
|
import {
|
|
27
27
|
logger
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-GSHSX7NU.js";
|
|
29
29
|
import {
|
|
30
30
|
VERSION
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-OQ6UFIEN.js";
|
|
32
32
|
import {
|
|
33
33
|
getEventCatalogConfigFile,
|
|
34
34
|
verifyRequiredFieldsAreInCatalogConfigFile
|
package/dist/generate.cjs
CHANGED
package/dist/generate.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generate
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-7CZBLKHQ.js";
|
|
4
|
+
import "./chunk-GSHSX7NU.js";
|
|
5
|
+
import "./chunk-OQ6UFIEN.js";
|
|
6
6
|
import "./chunk-5T63CXKU.js";
|
|
7
7
|
export {
|
|
8
8
|
generate
|
package/dist/utils/cli-logger.js
CHANGED
|
@@ -63,7 +63,7 @@ export const EnvironmentDropdown: React.FC<EnvironmentDropdownProps> = ({ enviro
|
|
|
63
63
|
<button
|
|
64
64
|
type="button"
|
|
65
65
|
onClick={toggleDropdown}
|
|
66
|
-
className="flex items-center space-x-1 text-sm font-medium text-[rgb(var(--ec-header-text))] hover:text-[rgb(var(--ec-
|
|
66
|
+
className="flex items-center space-x-1 text-sm font-medium text-[rgb(var(--ec-header-text)/0.7)] hover:text-[rgb(var(--ec-header-text))] focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[rgb(var(--ec-accent))] rounded-md px-3 py-2 transition-colors"
|
|
67
67
|
aria-expanded={isOpen}
|
|
68
68
|
aria-haspopup="true"
|
|
69
69
|
>
|
|
@@ -29,7 +29,7 @@ const repositoryUrl = catalog?.repositoryUrl || 'https://github.com/event-catalo
|
|
|
29
29
|
>
|
|
30
30
|
<div class="px-4 sm:px-4 lg:px-4">
|
|
31
31
|
<div class="flex justify-between items-center">
|
|
32
|
-
<div class="flex-shrink-0 flex items-center w-3/12">
|
|
32
|
+
<div class="flex-shrink-0 flex items-center w-3/12 lg:w-[360px]">
|
|
33
33
|
<a href={buildUrl(catalog.landingPage || '/')} class="flex space-x-2 items-center group">
|
|
34
34
|
{
|
|
35
35
|
logo.src && logo.src !== '/' && (
|
|
@@ -45,7 +45,7 @@ const repositoryUrl = catalog?.repositoryUrl || 'https://github.com/event-catalo
|
|
|
45
45
|
</div>
|
|
46
46
|
|
|
47
47
|
<div class="hidden lg:flex flex-grow -ml-1 items-center">
|
|
48
|
-
<div class="
|
|
48
|
+
<div class="w-full max-w-xl">
|
|
49
49
|
<Search />
|
|
50
50
|
</div>
|
|
51
51
|
{isEventCatalogChatEnabled() && <ChatPanelButton client:idle />}
|
|
@@ -132,7 +132,7 @@ const repositoryUrl = catalog?.repositoryUrl || 'https://github.com/event-catalo
|
|
|
132
132
|
<img
|
|
133
133
|
src={buildUrl('/icons/discord.svg', true)}
|
|
134
134
|
alt=""
|
|
135
|
-
class="h-6 w-6
|
|
135
|
+
class="h-6 w-6 hover:opacity-100 transition-opacity ec-themed-icon"
|
|
136
136
|
aria-hidden="true"
|
|
137
137
|
/>
|
|
138
138
|
</a>
|
|
@@ -146,7 +146,7 @@ const repositoryUrl = catalog?.repositoryUrl || 'https://github.com/event-catalo
|
|
|
146
146
|
<img
|
|
147
147
|
src={buildUrl('/icons/github.svg', true)}
|
|
148
148
|
alt=""
|
|
149
|
-
class="h-6 w-6
|
|
149
|
+
class="h-6 w-6 hover:opacity-100 transition-opacity ec-themed-icon"
|
|
150
150
|
aria-hidden="true"
|
|
151
151
|
/>
|
|
152
152
|
</a>
|
|
@@ -164,7 +164,7 @@ const repositoryUrl = catalog?.repositoryUrl || 'https://github.com/event-catalo
|
|
|
164
164
|
<img
|
|
165
165
|
src={buildUrl('/icons/github.svg', true)}
|
|
166
166
|
alt=""
|
|
167
|
-
class="h-6 w-6 opacity-70 hover:opacity-100 transition-opacity"
|
|
167
|
+
class="h-6 w-6 opacity-70 hover:opacity-100 transition-opacity ec-themed-icon"
|
|
168
168
|
aria-hidden="true"
|
|
169
169
|
/>
|
|
170
170
|
</a>
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* - URL building with Astro's URL utilities
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { useCallback, lazy, Suspense } from 'react';
|
|
12
|
-
import '@eventcatalog/visualiser/styles.css';
|
|
11
|
+
import { useCallback, lazy, Suspense, useEffect } from 'react';
|
|
13
12
|
import type { Node, Edge } from '@xyflow/react';
|
|
13
|
+
import { buildUrl } from '@utils/url-builder';
|
|
14
14
|
|
|
15
15
|
const NodeGraph = lazy(() => import('@eventcatalog/visualiser').then((module) => ({ default: module.NodeGraph })));
|
|
16
16
|
|
|
@@ -39,17 +39,21 @@ interface AstroNodeGraphProps {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const AstroNodeGraph = ({ isDevMode = false, resourceKey, ...otherProps }: AstroNodeGraphProps) => {
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
// Load visualizer styles only when this component is mounted.
|
|
44
|
+
// Use the core-scoped stylesheet so visualizer styles don't override EventCatalog utility classes globally.
|
|
45
|
+
import('@eventcatalog/visualiser/styles-core.css');
|
|
46
|
+
}, []);
|
|
47
|
+
|
|
42
48
|
// Astro-specific navigation handler
|
|
43
49
|
const handleNavigate = useCallback((url: string) => {
|
|
44
50
|
// Use window.location for navigation since we can't import astro:transitions/client in a React component
|
|
45
51
|
window.location.href = url;
|
|
46
52
|
}, []);
|
|
47
53
|
|
|
48
|
-
// Astro-specific URL builder
|
|
54
|
+
// Astro-specific URL builder that respects the configured base path
|
|
49
55
|
const handleBuildUrl = useCallback((path: string) => {
|
|
50
|
-
|
|
51
|
-
// The consuming app (core) should handle base URLs if needed
|
|
52
|
-
return path;
|
|
56
|
+
return buildUrl(path);
|
|
53
57
|
}, []);
|
|
54
58
|
|
|
55
59
|
// Layout persistence: Save layout to Astro API route
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const NodeGraphPortal = (props: any) => {
|
|
2
2
|
return (
|
|
3
3
|
<div
|
|
4
|
-
className="h-[30em] my-6 mb-12 w-full relative border border-[rgb(var(--ec-page-border))] rounded-md"
|
|
4
|
+
className="h-[30em] my-6 mb-12 w-full relative !border !border-[rgb(var(--ec-page-border))] rounded-md overflow-hidden"
|
|
5
5
|
id={`${props.id}-portal`}
|
|
6
6
|
style={{
|
|
7
7
|
maxHeight: props.maxHeight ? `${props.maxHeight}em` : `30em`,
|
|
@@ -33,14 +33,14 @@ export default function ApiAccessSection({
|
|
|
33
33
|
const isCopied = copiedId === `${message.data.id}-api`;
|
|
34
34
|
|
|
35
35
|
return (
|
|
36
|
-
<div className="flex-shrink-0 border-b border-
|
|
36
|
+
<div className="flex-shrink-0 border-b border-[rgb(var(--ec-page-border))]">
|
|
37
37
|
<button
|
|
38
38
|
onClick={onToggle}
|
|
39
|
-
className="w-full flex items-center justify-between px-4 py-2 text-left hover:bg-
|
|
39
|
+
className="w-full flex items-center justify-between px-4 py-2 text-left hover:bg-[rgb(var(--ec-page-bg)/0.5)] transition-colors"
|
|
40
40
|
>
|
|
41
41
|
<div className="flex items-center gap-2">
|
|
42
|
-
<CommandLineIcon className="h-3.5 w-3.5 text-
|
|
43
|
-
<span className="text-xs font-medium text-
|
|
42
|
+
<CommandLineIcon className="h-3.5 w-3.5 text-[rgb(var(--ec-icon-color))]" />
|
|
43
|
+
<span className="text-xs font-medium text-[rgb(var(--ec-page-text))]">API</span>
|
|
44
44
|
{!apiAccessEnabled && (
|
|
45
45
|
<span className="inline-flex items-center gap-1 rounded bg-[rgb(var(--ec-accent-subtle))] px-1.5 py-0.5 text-[10px] font-medium text-[rgb(var(--ec-accent-text))] border border-[rgb(var(--ec-accent)/0.2)]">
|
|
46
46
|
<LockClosedIcon className="h-2.5 w-2.5" />
|
|
@@ -49,9 +49,9 @@ export default function ApiAccessSection({
|
|
|
49
49
|
)}
|
|
50
50
|
</div>
|
|
51
51
|
{isExpanded ? (
|
|
52
|
-
<ChevronUpIcon className="h-3.5 w-3.5 text-
|
|
52
|
+
<ChevronUpIcon className="h-3.5 w-3.5 text-[rgb(var(--ec-page-text-muted))]" />
|
|
53
53
|
) : (
|
|
54
|
-
<ChevronDownIcon className="h-3.5 w-3.5 text-
|
|
54
|
+
<ChevronDownIcon className="h-3.5 w-3.5 text-[rgb(var(--ec-page-text-muted))]" />
|
|
55
55
|
)}
|
|
56
56
|
</button>
|
|
57
57
|
|
|
@@ -81,7 +81,7 @@ export default function ApiAccessSection({
|
|
|
81
81
|
className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
|
|
82
82
|
copiedId === `${message.data.id}-curl`
|
|
83
83
|
? 'bg-emerald-50 text-emerald-600 border-emerald-200'
|
|
84
|
-
: 'text-
|
|
84
|
+
: 'text-[rgb(var(--ec-page-text-muted))] border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-input-bg))] hover:text-[rgb(var(--ec-page-text))]'
|
|
85
85
|
}`}
|
|
86
86
|
>
|
|
87
87
|
{copiedId === `${message.data.id}-curl` ? (
|
|
@@ -101,7 +101,7 @@ export default function ApiAccessSection({
|
|
|
101
101
|
className={`inline-flex items-center gap-1.5 px-2 py-1 text-[10px] font-medium rounded border transition-colors ${
|
|
102
102
|
copiedId === `${message.data.id}-url`
|
|
103
103
|
? 'bg-emerald-50 text-emerald-600 border-emerald-200'
|
|
104
|
-
: 'text-
|
|
104
|
+
: 'text-[rgb(var(--ec-page-text-muted))] border-[rgb(var(--ec-page-border))] hover:bg-[rgb(var(--ec-input-bg))] hover:text-[rgb(var(--ec-page-text))]'
|
|
105
105
|
}`}
|
|
106
106
|
>
|
|
107
107
|
{copiedId === `${message.data.id}-url` ? (
|
|
@@ -121,8 +121,8 @@ export default function ApiAccessSection({
|
|
|
121
121
|
) : (
|
|
122
122
|
<div className="flex items-center justify-between gap-3 bg-[rgb(var(--ec-accent-subtle))] border border-[rgb(var(--ec-accent)/0.2)] rounded-md px-3 py-2.5">
|
|
123
123
|
<div className="flex-1 min-w-0">
|
|
124
|
-
<p className="text-xs font-medium text-
|
|
125
|
-
<p className="text-[10px] text-
|
|
124
|
+
<p className="text-xs font-medium text-[rgb(var(--ec-page-text))]">Access schemas via API</p>
|
|
125
|
+
<p className="text-[10px] text-[rgb(var(--ec-page-text-muted))] mt-0.5">CI/CD, automation & integrations</p>
|
|
126
126
|
</div>
|
|
127
127
|
<a
|
|
128
128
|
href="https://eventcatalog.cloud"
|
|
@@ -29,8 +29,8 @@ export default function ApiContentViewer({ message, onCopy, copiedId, apiAccessE
|
|
|
29
29
|
<div className="flex items-center justify-center w-16 h-16 mx-auto mb-4 rounded-2xl bg-[rgb(var(--ec-accent-subtle))] border border-[rgb(var(--ec-accent)/0.3)]">
|
|
30
30
|
<LockClosedIcon className="h-8 w-8 text-[rgb(var(--ec-accent))]" />
|
|
31
31
|
</div>
|
|
32
|
-
<h3 className="text-lg font-semibold text-
|
|
33
|
-
<p className="text-sm text-
|
|
32
|
+
<h3 className="text-lg font-semibold text-[rgb(var(--ec-page-text))] mb-2">API Access</h3>
|
|
33
|
+
<p className="text-sm text-[rgb(var(--ec-page-text-muted))] mb-6">
|
|
34
34
|
Access your schemas programmatically via REST API. Perfect for CI/CD pipelines, automation, and integrations with your
|
|
35
35
|
development workflow.
|
|
36
36
|
</p>
|
|
@@ -45,7 +45,7 @@ export default function ApiContentViewer({ message, onCopy, copiedId, apiAccessE
|
|
|
45
45
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
|
46
46
|
</svg>
|
|
47
47
|
</a>
|
|
48
|
-
<p className="text-xs text-
|
|
48
|
+
<p className="text-xs text-[rgb(var(--ec-page-text-muted))] mt-3">Start your 14-day free trial</p>
|
|
49
49
|
</div>
|
|
50
50
|
</div>
|
|
51
51
|
);
|
|
@@ -56,12 +56,12 @@ export default function ApiContentViewer({ message, onCopy, copiedId, apiAccessE
|
|
|
56
56
|
<div className="max-w-2xl">
|
|
57
57
|
{/* Header */}
|
|
58
58
|
<div className="flex items-center gap-3 mb-6">
|
|
59
|
-
<div className="flex items-center justify-center w-10 h-10 rounded-lg bg-
|
|
60
|
-
<CommandLineIcon className="h-5 w-5 text-
|
|
59
|
+
<div className="flex items-center justify-center w-10 h-10 rounded-lg bg-[rgb(var(--ec-accent-subtle))]">
|
|
60
|
+
<CommandLineIcon className="h-5 w-5 text-[rgb(var(--ec-icon-color))]" />
|
|
61
61
|
</div>
|
|
62
62
|
<div>
|
|
63
|
-
<h3 className="text-sm font-semibold text-
|
|
64
|
-
<p className="text-xs text-
|
|
63
|
+
<h3 className="text-sm font-semibold text-[rgb(var(--ec-page-text))]">API Access</h3>
|
|
64
|
+
<p className="text-xs text-[rgb(var(--ec-page-text-muted))]">Access this schema programmatically</p>
|
|
65
65
|
</div>
|
|
66
66
|
</div>
|
|
67
67
|
|
|
@@ -125,16 +125,18 @@ export default function ApiContentViewer({ message, onCopy, copiedId, apiAccessE
|
|
|
125
125
|
</div>
|
|
126
126
|
|
|
127
127
|
{/* Response Info */}
|
|
128
|
-
<div className="border border-
|
|
129
|
-
<h4 className="text-xs font-semibold text-
|
|
128
|
+
<div className="border border-[rgb(var(--ec-page-border))] rounded-lg p-4">
|
|
129
|
+
<h4 className="text-xs font-semibold text-[rgb(var(--ec-page-text))] mb-3">Response</h4>
|
|
130
130
|
<div className="space-y-2">
|
|
131
131
|
<div className="flex items-center justify-between text-xs">
|
|
132
|
-
<span className="text-
|
|
133
|
-
<code className="text-
|
|
132
|
+
<span className="text-[rgb(var(--ec-page-text-muted))]">Content-Type</span>
|
|
133
|
+
<code className="text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-input-bg))] px-2 py-0.5 rounded">
|
|
134
|
+
application/json
|
|
135
|
+
</code>
|
|
134
136
|
</div>
|
|
135
137
|
<div className="flex items-center justify-between text-xs">
|
|
136
|
-
<span className="text-
|
|
137
|
-
<span className="text-
|
|
138
|
+
<span className="text-[rgb(var(--ec-page-text-muted))]">Returns</span>
|
|
139
|
+
<span className="text-[rgb(var(--ec-page-text))]">Raw schema content</span>
|
|
138
140
|
</div>
|
|
139
141
|
</div>
|
|
140
142
|
</div>
|
|
@@ -4,14 +4,14 @@ import SearchModal from './SearchModal.tsx';
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<div>
|
|
7
|
-
<div class="relative flex items-center w-full pr-4">
|
|
7
|
+
<div class="relative flex items-center w-full pr-4 ml-1">
|
|
8
8
|
<input
|
|
9
9
|
id="search-dummy-input"
|
|
10
10
|
type="text"
|
|
11
11
|
name="search"
|
|
12
12
|
placeholder="Search EventCatalog"
|
|
13
13
|
autocomplete="off"
|
|
14
|
-
class="block w-full rounded-md caret-transparent border-0 py-1.5 pr-14 pl-10 text-[rgb(var(--ec-header-text))] bg-[rgb(var(--ec-dropdown-bg))] shadow-sm ring-1 ring-inset ring-[rgb(var(--ec-dropdown-border))] placeholder:text-[rgb(var(--ec-icon-color))] font-light sm:text-sm sm:leading-6
|
|
14
|
+
class="block w-full rounded-md caret-transparent border-0 py-1.5 pr-14 !pl-10 text-[rgb(var(--ec-header-text))] bg-[rgb(var(--ec-dropdown-bg))] shadow-sm ring-1 ring-inset ring-[rgb(var(--ec-dropdown-border))] placeholder:text-[rgb(var(--ec-icon-color))] font-light sm:text-sm sm:leading-6"
|
|
15
15
|
/>
|
|
16
16
|
<MagnifyingGlassIcon className="absolute inset-y-0 left-0 h-9 w-8 flex items-center pl-4 text-[rgb(var(--ec-icon-color))]" />
|
|
17
17
|
<div class="absolute inset-y-0 right-0 flex py-1.5 pr-6">
|
|
@@ -190,7 +190,7 @@ export default function SearchBar({ nodes, onSelectResult, onSearchChange }: Pro
|
|
|
190
190
|
placeholder="Search resources..."
|
|
191
191
|
value={searchQuery}
|
|
192
192
|
onChange={(e) => handleSearchChange(e.target.value)}
|
|
193
|
-
className="w-full pl-9 pr-8 py-2 text-sm bg-[rgb(var(--ec-input-bg))] border border-[rgb(var(--ec-input-border))] rounded-lg focus
|
|
193
|
+
className="w-full !pl-9 !pr-8 !py-2 !text-sm !bg-[rgb(var(--ec-input-bg))] !border !border-[rgb(var(--ec-input-border))] !rounded-lg focus:!outline-none focus:!ring-2 focus:!ring-[rgb(var(--ec-accent))] focus:!border-transparent !text-[rgb(var(--ec-input-text))] placeholder:!text-[rgb(var(--ec-input-placeholder))]"
|
|
194
194
|
/>
|
|
195
195
|
{searchQuery && (
|
|
196
196
|
<button
|
|
@@ -865,7 +865,7 @@ export default function NestedSideBar() {
|
|
|
865
865
|
<span
|
|
866
866
|
className={cn(
|
|
867
867
|
'flex items-center justify-center w-5 h-5 flex-shrink-0',
|
|
868
|
-
isActive ? 'text-[rgb(var(--ec-
|
|
868
|
+
isActive ? 'text-[rgb(var(--ec-accent-text))]' : 'text-[rgb(var(--ec-content-text-muted))]'
|
|
869
869
|
)}
|
|
870
870
|
>
|
|
871
871
|
<IconComponent className="w-4 h-4" />
|
|
@@ -876,7 +876,7 @@ export default function NestedSideBar() {
|
|
|
876
876
|
className={cn(
|
|
877
877
|
'text-[13px] truncate',
|
|
878
878
|
isActive
|
|
879
|
-
? 'text-[rgb(var(--ec-
|
|
879
|
+
? 'text-[rgb(var(--ec-accent-text))] font-medium'
|
|
880
880
|
: 'text-[rgb(var(--ec-content-text-secondary))] group-hover:text-[rgb(var(--ec-content-text))]'
|
|
881
881
|
)}
|
|
882
882
|
>
|
|
@@ -910,7 +910,7 @@ export default function NestedSideBar() {
|
|
|
910
910
|
'group flex items-center justify-between w-full px-3 py-1.5 rounded-lg cursor-pointer text-left transition-colors hover:bg-[rgb(var(--ec-content-hover))] active:bg-[rgb(var(--ec-content-hover))]';
|
|
911
911
|
const parentClasses = itemHasChildren ? 'font-medium' : '';
|
|
912
912
|
const activeClasses = isActive
|
|
913
|
-
? 'bg-[rgb(var(--ec-
|
|
913
|
+
? 'bg-[rgb(var(--ec-accent-subtle))] hover:bg-[rgb(var(--ec-accent-subtle))] !rounded-none'
|
|
914
914
|
: '';
|
|
915
915
|
|
|
916
916
|
// Leaf item with href → render as link
|
|
@@ -1122,8 +1122,7 @@ export default function NestedSideBar() {
|
|
|
1122
1122
|
onClick={() => navigateToFavorite(fav)}
|
|
1123
1123
|
className={cn(
|
|
1124
1124
|
'group flex items-center justify-between w-full px-3 py-1.5 rounded-lg cursor-pointer text-left transition-colors hover:bg-amber-500/10 active:bg-amber-500/20',
|
|
1125
|
-
isActive &&
|
|
1126
|
-
'bg-[rgb(var(--ec-content-active))] hover:bg-[rgb(var(--ec-content-active))] border-l-2 border-[rgb(var(--ec-accent))] rounded-l-none'
|
|
1125
|
+
isActive && 'bg-[rgb(var(--ec-accent-subtle))] hover:bg-[rgb(var(--ec-accent-subtle))] !rounded-none'
|
|
1127
1126
|
)}
|
|
1128
1127
|
>
|
|
1129
1128
|
<div className="flex items-center gap-2.5 min-w-0 flex-1">
|
|
@@ -1131,7 +1130,7 @@ export default function NestedSideBar() {
|
|
|
1131
1130
|
className={cn(
|
|
1132
1131
|
'text-[14px] truncate',
|
|
1133
1132
|
isActive
|
|
1134
|
-
? 'text-[rgb(var(--ec-
|
|
1133
|
+
? 'text-[rgb(var(--ec-accent-text))] font-medium'
|
|
1135
1134
|
: 'text-[rgb(var(--ec-content-text-secondary))] group-hover:text-[rgb(var(--ec-content-text))]'
|
|
1136
1135
|
)}
|
|
1137
1136
|
>
|
|
@@ -311,6 +311,14 @@ const flows = defineCollection({
|
|
|
311
311
|
.merge(baseSchema),
|
|
312
312
|
});
|
|
313
313
|
|
|
314
|
+
const operationSchema = z
|
|
315
|
+
.object({
|
|
316
|
+
method: z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']).optional(),
|
|
317
|
+
path: z.string().optional(),
|
|
318
|
+
statusCodes: z.array(z.string()).optional(),
|
|
319
|
+
})
|
|
320
|
+
.optional();
|
|
321
|
+
|
|
314
322
|
const messageDetailsPanelPropertySchema = z.object({
|
|
315
323
|
producers: detailPanelPropertySchema.optional(),
|
|
316
324
|
consumers: detailPanelPropertySchema.optional(),
|
|
@@ -332,10 +340,12 @@ const events = defineCollection({
|
|
|
332
340
|
}),
|
|
333
341
|
schema: z
|
|
334
342
|
.object({
|
|
343
|
+
// Used by users
|
|
344
|
+
operation: operationSchema,
|
|
345
|
+
// Used by eventcatalog
|
|
335
346
|
producers: z.array(reference('services')).optional(),
|
|
336
347
|
consumers: z.array(reference('services')).optional(),
|
|
337
348
|
channels: z.array(channelPointer).optional(),
|
|
338
|
-
// Used by eventcatalog
|
|
339
349
|
messageChannels: z.array(reference('channels')).optional(),
|
|
340
350
|
detailsPanel: messageDetailsPanelPropertySchema.optional(),
|
|
341
351
|
})
|
|
@@ -352,11 +362,13 @@ const commands = defineCollection({
|
|
|
352
362
|
}),
|
|
353
363
|
schema: z
|
|
354
364
|
.object({
|
|
365
|
+
// Used by users
|
|
366
|
+
operation: operationSchema,
|
|
367
|
+
// Used by eventcatalog
|
|
355
368
|
producers: z.array(reference('services')).optional(),
|
|
356
369
|
consumers: z.array(reference('services')).optional(),
|
|
357
370
|
channels: z.array(channelPointer).optional(),
|
|
358
371
|
detailsPanel: messageDetailsPanelPropertySchema.optional(),
|
|
359
|
-
// Used by eventcatalog
|
|
360
372
|
messageChannels: z.array(reference('channels')).optional(),
|
|
361
373
|
})
|
|
362
374
|
.merge(baseSchema),
|
|
@@ -372,11 +384,13 @@ const queries = defineCollection({
|
|
|
372
384
|
}),
|
|
373
385
|
schema: z
|
|
374
386
|
.object({
|
|
387
|
+
// Used by users
|
|
388
|
+
operation: operationSchema,
|
|
389
|
+
// Used by eventcatalog
|
|
375
390
|
producers: z.array(reference('services')).optional(),
|
|
376
391
|
consumers: z.array(reference('services')).optional(),
|
|
377
392
|
channels: z.array(channelPointer).optional(),
|
|
378
393
|
detailsPanel: messageDetailsPanelPropertySchema.optional(),
|
|
379
|
-
// Used by eventcatalog
|
|
380
394
|
messageChannels: z.array(reference('channels')).optional(),
|
|
381
395
|
})
|
|
382
396
|
.merge(baseSchema),
|
|
@@ -622,6 +636,7 @@ const channels = defineCollection({
|
|
|
622
636
|
channels: z.array(channelPointer).optional(),
|
|
623
637
|
address: z.string().optional(),
|
|
624
638
|
protocols: z.array(z.string()).optional(),
|
|
639
|
+
deliveryGuarantee: z.enum(['at-most-once', 'at-least-once', 'exactly-once']).optional(),
|
|
625
640
|
routes: z.array(channelPointer).optional(),
|
|
626
641
|
parameters: z
|
|
627
642
|
.record(
|
|
@@ -433,16 +433,8 @@ function createMcpServer() {
|
|
|
433
433
|
return server;
|
|
434
434
|
}
|
|
435
435
|
|
|
436
|
-
//
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
// Create transport for handling requests
|
|
440
|
-
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
441
|
-
sessionIdGenerator: undefined, // Stateless mode
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
// Connect the server to the transport
|
|
445
|
-
let isConnected = false;
|
|
436
|
+
// MCP server and transport are created per-request to avoid
|
|
437
|
+
// "Stateless transport cannot be reused across requests" errors.
|
|
446
438
|
|
|
447
439
|
// Create Hono app for MCP routes
|
|
448
440
|
const app = new Hono().basePath('/docs/mcp');
|
|
@@ -478,13 +470,15 @@ app.get('/', async (c: Context) => {
|
|
|
478
470
|
// MCP protocol endpoint - handles POST requests for MCP protocol
|
|
479
471
|
app.post('/', async (c: Context) => {
|
|
480
472
|
try {
|
|
481
|
-
//
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
473
|
+
// Create fresh server and transport per request — the MCP SDK's
|
|
474
|
+
// WebStandardStreamableHTTPServerTransport is single-use in stateless
|
|
475
|
+
// mode: it sets _hasHandledRequest=true after the first call and throws
|
|
476
|
+
// on any subsequent request. McpServer equally rejects reconnection.
|
|
477
|
+
const server = createMcpServer();
|
|
478
|
+
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
479
|
+
sessionIdGenerator: undefined,
|
|
480
|
+
});
|
|
481
|
+
await server.connect(transport);
|
|
488
482
|
return await transport.handleRequest(c.req.raw);
|
|
489
483
|
} catch (error) {
|
|
490
484
|
console.error('MCP request error:', error);
|