@elevasis/ui 1.7.4 → 1.7.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.
@@ -1,30 +1,31 @@
1
+ import { useCyberColors, EmptyState, CyberLegendItem, CyberAreaChart, ContextViewer, JsonViewer, StyledMarkdown } from '../chunk-4KPI7YCY.js';
2
+ export { APIErrorAlert, CardHeader, CollapsibleSection, ContextViewer, CustomSelector, DetailCardSkeleton, EmptyState, JsonViewer, ListSkeleton, PageNotFound, PageTitleCaption, ResourceCard, StatCard, StatCardSkeleton, StatsCardSkeleton, StyledMarkdown, TabCountBadge, TimeRangeSelector, TrendIndicator, catalogItemToResourceDefinition } from '../chunk-4KPI7YCY.js';
1
3
  export { ElevasisLoader, NavigationButton } from '../chunk-YGYF6G7W.js';
2
4
  import '../chunk-TYV5NJV2.js';
3
- import { useMarkAsRead, useMarkAllAsRead, useNotificationCount, useNotifications, useSubmitAction, useDeleteTask } from '../chunk-G4TAF3T6.js';
5
+ import { useResourcesHealth, useMarkAsRead, useMarkAllAsRead, useNotificationCount, useNotifications, useSubmitAction, useDeleteTask } from '../chunk-OK3XFSJJ.js';
6
+ import { getTimeRangeDates, formatBucketTime } from '../chunk-6HZAMY6T.js';
4
7
  import '../chunk-JGJSZ3UE.js';
5
8
  import '../chunk-LHQTTUL2.js';
6
9
  import { Graph_module_css_default, useDirectedChainHighlighting, useNodeSelection, useFitViewTrigger, useGraphHighlighting, calculateGraphHeight, GRAPH_CONSTANTS } from '../chunk-F6RBK7NJ.js';
7
10
  export { Graph_module_css_default as graphStyles } from '../chunk-F6RBK7NJ.js';
8
- import { STATUS_COLORS, getStatusIcon, formatDuration, getStatusColors, AGENT_CONSTANTS, shouldAnimateEdge, ResourceStatusColors, TIMELINE_CONSTANTS, calculateBarPosition, CONTAINER_CONSTANTS, useExecutionPath, useUnifiedWorkflowLayout, WORKFLOW_CONSTANTS, useReactFlowAgent } from '../chunk-YJFTZUJJ.js';
9
- export { CONTAINER_CONSTANTS, SHARED_VIZ_CONSTANTS } from '../chunk-YJFTZUJJ.js';
11
+ import { STATUS_COLORS, getStatusIcon, formatDuration, getStatusColors, AGENT_CONSTANTS, shouldAnimateEdge, TIMELINE_CONSTANTS, calculateBarPosition, CONTAINER_CONSTANTS, useExecutionPath, useUnifiedWorkflowLayout, WORKFLOW_CONSTANTS, useReactFlowAgent } from '../chunk-3Q5V2T6L.js';
12
+ export { CONTAINER_CONSTANTS, SHARED_VIZ_CONSTANTS } from '../chunk-3Q5V2T6L.js';
13
+ import '../chunk-YZ6GTZXL.js';
10
14
  import '../chunk-TIRMFDM4.js';
11
- import { getResourceIcon } from '../chunk-LFYO3MDC.js';
12
- import { getErrorInfo, getErrorTitle, formatErrorMessage } from '../chunk-4VGWQ5AN.js';
15
+ import '../chunk-LFYO3MDC.js';
16
+ import { getErrorInfo, formatErrorMessage, getErrorTitle } from '../chunk-4VGWQ5AN.js';
13
17
  import '../chunk-2JBWPFHF.js';
14
18
  import '../chunk-FWZJH3TL.js';
15
19
  import '../chunk-NEK6JKPW.js';
16
20
  import '../chunk-L2CM2CUA.js';
17
21
  import '../chunk-KA7LO7U5.js';
18
22
  import '../chunk-DD3CCMCZ.js';
19
- import { useAuthContext } from '../chunk-7PLEQFHO.js';
20
- import { useRouterContext } from '../chunk-Q7DJKLEN.js';
21
- import { Paper, Stack, Text, Group, Badge, Box, useComputedColorScheme, Center, Title, Button, Loader, Collapse, ScrollArea, Card, Skeleton, Select, Alert, Code, ThemeIcon, Grid, Modal, Space, TextInput, Table, Textarea, Radio, Checkbox, NumberInput, Tooltip, UnstyledButton, Divider, Popover, Indicator, ActionIcon, SegmentedControl, Menu, Accordion, SimpleGrid } from '@mantine/core';
23
+ import '../chunk-7PLEQFHO.js';
24
+ import '../chunk-Q7DJKLEN.js';
25
+ import { Paper, Stack, Text, Group, Badge, Box, useComputedColorScheme, Modal, Center, Space, Button, Title, TextInput, Table, Textarea, Radio, Checkbox, Select, NumberInput, Tooltip, Card, Loader, UnstyledButton, Divider, ScrollArea, Popover, Indicator, ActionIcon, SegmentedControl, Alert, ThemeIcon, Menu, Accordion, Collapse, SimpleGrid } from '@mantine/core';
22
26
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
23
- import { IconPlayerPlay, IconPlayerStop, IconArrowsSplit, IconSquare, IconBrain, IconFileText, IconMail, IconSend, IconClock, IconArrowUp, IconMessageCircle, IconRocket, IconEye, IconEdit, IconAlertTriangle, IconRefresh, IconX, IconCheck, IconMinus, IconTrendingUp, IconTrendingDown, IconChevronUp, IconChevronDown, IconAlertCircle, IconInfoCircle, IconChevronRight, IconSelector, IconTrash, IconCircle, IconCircleFilled, IconBell, IconFocus2, IconRobot, IconGitBranch, IconDotsVertical, IconExternalLink, IconTool, IconSettings, IconCpu, IconClockHour4, IconVersions, IconNetwork, IconSitemap, IconFileOff, IconCircleX, IconCircleCheck } from '@tabler/icons-react';
24
- import { memo, useMemo, useState, cloneElement, useEffect, useCallback, Fragment as Fragment$1 } from 'react';
25
- import Markdown from 'react-markdown';
26
- import { Prism } from 'react-syntax-highlighter';
27
- import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism';
27
+ import { memo, useMemo, cloneElement, useEffect, useState, useCallback, Fragment as Fragment$1 } from 'react';
28
+ import { IconPlayerPlay, IconPlayerStop, IconArrowsSplit, IconSquare, IconBrain, IconFileText, IconMail, IconSend, IconClock, IconArrowUp, IconMessageCircle, IconRocket, IconEye, IconEdit, IconAlertTriangle, IconRefresh, IconX, IconCheck, IconChevronUp, IconChevronDown, IconSelector, IconTrash, IconChartBar, IconCircle, IconCircleFilled, IconBell, IconFocus2, IconAlertCircle, IconRobot, IconGitBranch, IconDotsVertical, IconExternalLink, IconChevronRight, IconTool, IconSettings, IconCpu, IconClockHour4, IconVersions, IconNetwork, IconSitemap, IconFileOff, IconCircleX, IconCircleCheck } from '@tabler/icons-react';
28
29
  import { AreaChart } from '@mantine/charts';
29
30
  import { useDisclosure } from '@mantine/hooks';
30
31
  import { formatDistanceToNow } from 'date-fns';
@@ -34,677 +35,6 @@ import { useForm } from '@mantine/form';
34
35
  import dagre from '@dagrejs/dagre';
35
36
  import { notifications } from '@mantine/notifications';
36
37
 
37
- function EmptyState({ icon: Icon, title, description, action, py = "xl" }) {
38
- return /* @__PURE__ */ jsx(Center, { py, children: /* @__PURE__ */ jsxs(Stack, { align: "center", gap: "xs", children: [
39
- /* @__PURE__ */ jsx(Icon, { size: 48, style: { opacity: 0.5 } }),
40
- /* @__PURE__ */ jsx(Title, { order: 4, children: title }),
41
- description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", ta: "center", children: description }),
42
- action && /* @__PURE__ */ jsx(Button, { variant: "light", onClick: action.onClick, leftSection: action.icon, mt: "sm", children: action.label })
43
- ] }) });
44
- }
45
- function TabCountBadge({ count, isLoading }) {
46
- return /* @__PURE__ */ jsx(Box, { miw: 20, h: 20, style: { display: "flex", alignItems: "center", justifyContent: "center" }, children: isLoading ? /* @__PURE__ */ jsx(Loader, { size: 12 }) : /* @__PURE__ */ jsx(Badge, { size: "sm", variant: "light", circle: count < 10, children: count }) });
47
- }
48
- function TrendIndicator({ current, previous, inverse }) {
49
- const change = previous === 0 ? 0 : (current - previous) / previous * 100;
50
- const isPositive = inverse ? change < 0 : change > 0;
51
- const isFlat = Math.abs(change) < 0.1;
52
- const color = isFlat ? "gray" : isPositive ? "green" : "red";
53
- const Icon = isFlat ? IconMinus : change > 0 ? IconTrendingUp : IconTrendingDown;
54
- return /* @__PURE__ */ jsxs(Group, { gap: 4, children: [
55
- /* @__PURE__ */ jsx(Icon, { size: 12 }),
56
- /* @__PURE__ */ jsx(Badge, { size: "sm", color, variant: "light", children: isFlat ? "No change" : `${isPositive ? "+" : ""}${Math.abs(change).toFixed(1)}%` })
57
- ] });
58
- }
59
- function CollapsibleSection({
60
- title,
61
- count,
62
- countLabel,
63
- children,
64
- emptyMessage,
65
- defaultExpanded = true,
66
- maxHeight = 300
67
- }) {
68
- const [expanded, setExpanded] = useState(defaultExpanded);
69
- const isEmpty = count === 0;
70
- return /* @__PURE__ */ jsxs(
71
- "div",
72
- {
73
- style: {
74
- borderRadius: "8px",
75
- padding: "8px",
76
- border: "1px solid var(--color-border)",
77
- boxShadow: "var(--standard-box-shadow)"
78
- },
79
- children: [
80
- /* @__PURE__ */ jsxs(
81
- Group,
82
- {
83
- gap: "xs",
84
- mb: expanded ? "xs" : 0,
85
- justify: "space-between",
86
- align: "center",
87
- style: { cursor: "pointer" },
88
- onClick: () => setExpanded(!expanded),
89
- children: [
90
- /* @__PURE__ */ jsxs(Group, { gap: "xs", align: "center", style: { flex: 1 }, children: [
91
- typeof title === "string" ? /* @__PURE__ */ jsx(
92
- Text,
93
- {
94
- fw: 600,
95
- size: "sm",
96
- c: "var(--color-text)",
97
- style: { fontFamily: "var(--elevasis-font-family-subtitle)" },
98
- children: title
99
- }
100
- ) : title,
101
- count !== void 0 && countLabel && /* @__PURE__ */ jsxs(Badge, { size: "sm", variant: "light", color: "gray", children: [
102
- count,
103
- " ",
104
- count === 1 ? countLabel.replace(/s$/, "") : countLabel
105
- ] })
106
- ] }),
107
- expanded ? /* @__PURE__ */ jsx(IconChevronUp, { size: 16 }) : /* @__PURE__ */ jsx(IconChevronDown, { size: 16 })
108
- ]
109
- }
110
- ),
111
- /* @__PURE__ */ jsx(Collapse, { in: expanded, children: isEmpty && emptyMessage ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: emptyMessage }) : /* @__PURE__ */ jsx(ScrollArea, { h: maxHeight, type: "scroll", offsetScrollbars: true, children }) })
112
- ]
113
- }
114
- );
115
- }
116
- var PageTitleCaption = ({ title, caption, rightSection }) => {
117
- const renderCaption = () => {
118
- if (!caption) return null;
119
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Text, { c: "dimmed", style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, children: caption }) });
120
- };
121
- const titleContent = /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column" }, children: [
122
- /* @__PURE__ */ jsx(Title, { order: 1, children: title }),
123
- /* @__PURE__ */ jsx(Space, { h: "4" }),
124
- renderCaption()
125
- ] });
126
- if (!rightSection) {
127
- return titleContent;
128
- }
129
- return /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "end", children: [
130
- titleContent,
131
- rightSection
132
- ] });
133
- };
134
- function StatsCardSkeleton({ chartHeight = 120, withChart = true, statCount = 3 }) {
135
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
136
- /* @__PURE__ */ jsx(Skeleton, { height: 24, width: 150, mb: "md" }),
137
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "xl", children: [
138
- /* @__PURE__ */ jsx(Skeleton, { height: 60, width: 100 }),
139
- statCount >= 2 && /* @__PURE__ */ jsx(Skeleton, { height: 60, width: 100 }),
140
- /* @__PURE__ */ jsx(Skeleton, { height: 40, circle: true })
141
- ] }),
142
- withChart && /* @__PURE__ */ jsx(Skeleton, { height: chartHeight })
143
- ] });
144
- }
145
- function ListSkeleton({ rows = 3, rowHeight = 50 }) {
146
- return /* @__PURE__ */ jsx(Stack, { gap: "xs", children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { height: rowHeight }, i)) });
147
- }
148
- function DetailCardSkeleton({ rows = 3 }) {
149
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
150
- /* @__PURE__ */ jsx(Skeleton, { height: 24, width: 150, mb: "md" }),
151
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "lg", children: [
152
- /* @__PURE__ */ jsx(Skeleton, { height: 80, width: 100 }),
153
- /* @__PURE__ */ jsx(Skeleton, { height: 80, width: 100 }),
154
- /* @__PURE__ */ jsx(Skeleton, { height: 40, circle: true })
155
- ] }),
156
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { height: 60 }, i)) })
157
- ] });
158
- }
159
- function CustomSelector({
160
- value,
161
- onChange,
162
- data,
163
- leftSection,
164
- placeholder,
165
- w,
166
- withCheckIcon = false,
167
- disabled
168
- }) {
169
- return /* @__PURE__ */ jsx(
170
- Select,
171
- {
172
- value,
173
- onChange,
174
- data,
175
- leftSection,
176
- placeholder,
177
- w,
178
- size: "xs",
179
- variant: "unstyled",
180
- withCheckIcon,
181
- disabled,
182
- styles: {
183
- wrapper: {
184
- border: "1px solid var(--color-border)",
185
- borderRadius: "var(--mantine-radius-default)",
186
- backgroundColor: "var(--color-surface)",
187
- transition: "border-color 150ms ease, background-color 150ms ease",
188
- "&:hover": {
189
- borderColor: "var(--color-border-hover, var(--mantine-color-dark-3))"
190
- }
191
- },
192
- input: {
193
- fontSize: "var(--mantine-font-size-xs)",
194
- fontWeight: 500,
195
- height: "30px",
196
- minHeight: "30px",
197
- paddingLeft: leftSection ? "30px" : void 0,
198
- borderRadius: "var(--mantine-radius-default)",
199
- cursor: "pointer"
200
- },
201
- section: {
202
- color: "var(--color-text-subtle)"
203
- },
204
- dropdown: {
205
- border: "1px solid var(--color-border)",
206
- backgroundColor: "var(--color-surface)",
207
- boxShadow: "var(--card-shadow)"
208
- },
209
- option: {
210
- fontSize: "var(--mantine-font-size-xs)"
211
- }
212
- }
213
- }
214
- );
215
- }
216
- function APIErrorAlert({
217
- error,
218
- title,
219
- showRequestId = true,
220
- icon = /* @__PURE__ */ jsx(IconAlertCircle, {}),
221
- color = "red"
222
- }) {
223
- const { message, code, requestId, retryAfter } = getErrorInfo(error);
224
- const alertTitle = title || getErrorTitle(code);
225
- return /* @__PURE__ */ jsxs(Alert, { icon, title: alertTitle, color, variant: "light", children: [
226
- /* @__PURE__ */ jsx(Text, { size: "sm", children: message }),
227
- retryAfter && /* @__PURE__ */ jsxs(Text, { size: "sm", mt: "xs", children: [
228
- "Please wait ",
229
- retryAfter,
230
- " seconds before retrying."
231
- ] }),
232
- showRequestId && requestId && /* @__PURE__ */ jsxs(Text, { size: "xs", c: "dimmed", mt: "xs", children: [
233
- "Request ID: ",
234
- /* @__PURE__ */ jsx(Code, { children: requestId })
235
- ] })
236
- ] });
237
- }
238
-
239
- // src/components/display/StatCard.module.css.js
240
- var StatCard_module_css_default = { "heroCard": "heroCard", "iconRing": "iconRing", "iconRingSm": "iconRingSm", "heroValue": "heroValue", "heroValueSm": "heroValueSm", "heroLabel": "heroLabel", "heroLabelSm": "heroLabelSm" };
241
- function StatCard(props) {
242
- if (props.variant === "hero") {
243
- return /* @__PURE__ */ jsx(HeroStatCard, { ...props });
244
- }
245
- const { label, value, icon: IconComponent, color } = props;
246
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
247
- /* @__PURE__ */ jsx(ThemeIcon, { size: "lg", variant: "light", color, children: /* @__PURE__ */ jsx(IconComponent, { size: 18 }) }),
248
- /* @__PURE__ */ jsxs("div", { children: [
249
- /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: label }),
250
- /* @__PURE__ */ jsx(Text, { size: "lg", fw: 600, style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, children: value })
251
- ] })
252
- ] }) });
253
- }
254
- function HeroStatCard({
255
- icon: IconComponent,
256
- value,
257
- label,
258
- valueColor,
259
- isLoading,
260
- size = "sm",
261
- children
262
- }) {
263
- const sm = size === "sm";
264
- const iconSize = sm ? 36 : 46;
265
- if (isLoading) {
266
- return /* @__PURE__ */ jsx(Paper, { p: sm ? "md" : "lg", className: StatCard_module_css_default.heroCard, children: /* @__PURE__ */ jsxs(Group, { gap: sm ? "sm" : "md", wrap: "nowrap", children: [
267
- /* @__PURE__ */ jsx(Skeleton, { circle: true, height: iconSize }),
268
- /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
269
- /* @__PURE__ */ jsx(Skeleton, { height: sm ? 24 : 32, width: 60 }),
270
- /* @__PURE__ */ jsx(Skeleton, { height: 12, width: 80 })
271
- ] })
272
- ] }) });
273
- }
274
- return /* @__PURE__ */ jsx(Paper, { p: sm ? "md" : "lg", className: StatCard_module_css_default.heroCard, children: /* @__PURE__ */ jsxs(Group, { gap: sm ? "sm" : "md", wrap: "nowrap", children: [
275
- /* @__PURE__ */ jsx("div", { className: sm ? StatCard_module_css_default.iconRingSm : StatCard_module_css_default.iconRing, children: /* @__PURE__ */ jsx(IconComponent, { size: sm ? 18 : 22 }) }),
276
- /* @__PURE__ */ jsxs(Stack, { gap: 2, style: { flex: children ? 1 : void 0 }, children: [
277
- /* @__PURE__ */ jsx(
278
- "span",
279
- {
280
- className: sm ? StatCard_module_css_default.heroValueSm : StatCard_module_css_default.heroValue,
281
- style: valueColor ? { color: valueColor } : void 0,
282
- children: value
283
- }
284
- ),
285
- children ? /* @__PURE__ */ jsxs(Group, { gap: "sm", wrap: "nowrap", style: { flex: 1 }, children: [
286
- /* @__PURE__ */ jsx("span", { className: sm ? StatCard_module_css_default.heroLabelSm : StatCard_module_css_default.heroLabel, children: label }),
287
- /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children })
288
- ] }) : /* @__PURE__ */ jsx("span", { className: sm ? StatCard_module_css_default.heroLabelSm : StatCard_module_css_default.heroLabel, children: label })
289
- ] })
290
- ] }) });
291
- }
292
- function StatCardSkeleton() {
293
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Skeleton, { height: 60 }) });
294
- }
295
- var customCodeTheme = Object.fromEntries(
296
- Object.entries(oneDark).map(([key, value]) => [
297
- key,
298
- typeof value === "object" && value !== null ? { ...value, background: "none", backgroundColor: "none" } : value
299
- ])
300
- );
301
- var defaultComponents = {
302
- h1: ({ children }) => /* @__PURE__ */ jsx(Title, { order: 3, c: "var(--color-primary)", mb: "xs", mt: "md", children }),
303
- h2: ({ children }) => /* @__PURE__ */ jsx(Title, { order: 4, c: "var(--color-primary)", mb: "xs", mt: "sm", children }),
304
- ul: ({ children }) => /* @__PURE__ */ jsx("ul", { style: { margin: "0.5rem 0", paddingLeft: "1.5rem" }, children }),
305
- ol: ({ children }) => /* @__PURE__ */ jsx("ol", { style: { margin: "0.5rem 0", paddingLeft: "1.5rem" }, children }),
306
- li: ({ children }) => /* @__PURE__ */ jsx("li", { style: { marginBottom: "0.25rem", fontSize: "var(--mantine-font-size-sm)" }, children }),
307
- code: ({ className, children, ...props }) => {
308
- const match = /language-(\w+)/.exec(className || "");
309
- const codeString = String(children).replace(/\n$/, "");
310
- if (match) {
311
- return /* @__PURE__ */ jsx(
312
- Prism,
313
- {
314
- style: customCodeTheme,
315
- language: match[1],
316
- PreTag: "div",
317
- customStyle: {
318
- margin: "0.5rem 0",
319
- borderRadius: "var(--mantine-radius-default)",
320
- fontSize: "0.8rem"
321
- },
322
- children: codeString
323
- }
324
- );
325
- }
326
- return /* @__PURE__ */ jsx(Code, { ...props, children });
327
- },
328
- pre: ({ children }) => /* @__PURE__ */ jsx(Fragment, { children }),
329
- blockquote: ({ children }) => /* @__PURE__ */ jsx(Box, { pl: "sm", my: "xs", style: { borderLeft: "2px solid var(--color-border)" }, children }),
330
- p: ({ children }) => /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, children }),
331
- strong: ({ children }) => /* @__PURE__ */ jsx(Text, { component: "span", fw: 700, children }),
332
- em: ({ children }) => /* @__PURE__ */ jsx(Text, { component: "span", fs: "italic", children })
333
- };
334
- function StyledMarkdown({ children, components, className, style }) {
335
- const mergedComponents = components ? { ...defaultComponents, ...components } : defaultComponents;
336
- return /* @__PURE__ */ jsx("div", { className, style, children: /* @__PURE__ */ jsx(Markdown, { components: mergedComponents, children }) });
337
- }
338
- var jsonTheme = Object.fromEntries(
339
- Object.entries(oneDark).map(([key, value]) => [
340
- key,
341
- typeof value === "object" && value !== null ? { ...value, background: "none", backgroundColor: "none" } : value
342
- ])
343
- );
344
- function JsonViewer({ data, maxHeight, fontSize = "0.8rem" }) {
345
- const jsonString = typeof data === "string" ? data : JSON.stringify(data, null, 2);
346
- return /* @__PURE__ */ jsx(
347
- Prism,
348
- {
349
- language: "json",
350
- style: jsonTheme,
351
- customStyle: {
352
- margin: 0,
353
- fontSize,
354
- maxHeight,
355
- overflow: maxHeight ? "auto" : void 0,
356
- overflowX: "auto"
357
- },
358
- children: jsonString
359
- }
360
- );
361
- }
362
- var subtleMarkdownComponents = {
363
- p: ({ children }) => /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, c: "var(--color-text-subtle)", style: { whiteSpace: "pre-wrap" }, children })
364
- };
365
- var subtleMarkdownWrapperStyle = {
366
- display: "flex",
367
- flexDirection: "column",
368
- gap: 8
369
- };
370
- function ContextViewer({ data }) {
371
- return /* @__PURE__ */ jsx(ContextNode, { data, depth: 0 });
372
- }
373
- function ContextNode({ data, depth }) {
374
- if (data === null || data === void 0) {
375
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "No context provided" });
376
- }
377
- if (typeof data === "string") {
378
- return /* @__PURE__ */ jsx(StyledMarkdown, { components: subtleMarkdownComponents, style: subtleMarkdownWrapperStyle, children: data });
379
- }
380
- if (typeof data === "number" || typeof data === "boolean") {
381
- return /* @__PURE__ */ jsx(Text, { size: "sm", children: String(data) });
382
- }
383
- if (Array.isArray(data)) {
384
- return /* @__PURE__ */ jsx(ArrayView, { items: data, depth });
385
- }
386
- if (typeof data === "object") {
387
- return /* @__PURE__ */ jsx(ObjectView, { data, depth });
388
- }
389
- return /* @__PURE__ */ jsx(Text, { size: "sm", children: String(data) });
390
- }
391
- function formatLabel(key) {
392
- return key.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
393
- }
394
- function hasMarkdown(value) {
395
- return /(\*\*.+\*\*|^#{1,6}\s|^\s*[-*]\s|\[.+\]\(.+\)|^\|.+\|$|^>\s|```)/.test(value);
396
- }
397
- function NestedSection({ title, children }) {
398
- const [expanded, setExpanded] = useState(true);
399
- return /* @__PURE__ */ jsxs(Stack, { gap: 6, children: [
400
- /* @__PURE__ */ jsxs(Group, { gap: 4, style: { cursor: "pointer", userSelect: "none" }, onClick: () => setExpanded((v) => !v), children: [
401
- /* @__PURE__ */ jsx(
402
- IconChevronRight,
403
- {
404
- size: 14,
405
- color: "var(--color-primary)",
406
- style: {
407
- transition: "transform 150ms ease",
408
- transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
409
- flexShrink: 0
410
- }
411
- }
412
- ),
413
- /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, style: { fontFamily: "var(--mantine-font-family-headings)" }, children: title })
414
- ] }),
415
- expanded && /* @__PURE__ */ jsx(Box, { pl: "sm", style: { borderLeft: "2px solid var(--color-border)" }, children })
416
- ] });
417
- }
418
- function PrimitiveValue({ value }) {
419
- if (value === null || value === void 0) {
420
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "\u2014" });
421
- }
422
- if (typeof value === "boolean") {
423
- return /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, children: value ? "Yes" : "No" });
424
- }
425
- if (typeof value === "number") {
426
- return /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, children: value.toLocaleString() });
427
- }
428
- const str = String(value);
429
- if (hasMarkdown(str)) {
430
- return /* @__PURE__ */ jsx(StyledMarkdown, { components: subtleMarkdownComponents, children: str });
431
- }
432
- return /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, c: "var(--color-text-subtle)", style: { whiteSpace: "pre-wrap" }, children: str });
433
- }
434
- function ArrayView({ items, depth }) {
435
- if (items.length === 0) {
436
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "Empty list" });
437
- }
438
- const allPrimitive = items.every((item) => typeof item !== "object" || item === null);
439
- if (allPrimitive) {
440
- return /* @__PURE__ */ jsx(Stack, { gap: 2, children: items.map((item, i) => /* @__PURE__ */ jsxs(Group, { gap: "xs", align: "flex-start", children: [
441
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { userSelect: "none" }, children: "\u2022" }),
442
- /* @__PURE__ */ jsx(PrimitiveValue, { value: item })
443
- ] }, i)) });
444
- }
445
- return /* @__PURE__ */ jsx(Stack, { gap: "sm", children: items.map((item, i) => /* @__PURE__ */ jsx(Paper, { p: "sm", style: { border: "1px solid var(--color-border)" }, children: /* @__PURE__ */ jsx(ContextNode, { data: item, depth: depth + 1 }) }, i)) });
446
- }
447
- function ObjectView({ data, depth }) {
448
- const entries = Object.entries(data);
449
- if (entries.length === 0) {
450
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "Empty" });
451
- }
452
- const simpleEntries = [];
453
- const complexEntries = [];
454
- for (const [key, value] of entries) {
455
- if (value === null || value === void 0 || typeof value === "boolean" || typeof value === "number") {
456
- simpleEntries.push([key, value]);
457
- } else if (typeof value === "string") {
458
- if (hasMarkdown(value) || value.length > 120) {
459
- complexEntries.push([key, value]);
460
- } else {
461
- simpleEntries.push([key, value]);
462
- }
463
- } else {
464
- complexEntries.push([key, value]);
465
- }
466
- }
467
- return /* @__PURE__ */ jsxs(Stack, { gap: 10, children: [
468
- simpleEntries.length > 0 && /* @__PURE__ */ jsx(Stack, { gap: 6, children: simpleEntries.map(([key, value]) => /* @__PURE__ */ jsxs(Group, { gap: "sm", align: "flex-start", wrap: "nowrap", children: [
469
- /* @__PURE__ */ jsx(
470
- Text,
471
- {
472
- size: "sm",
473
- style: { minWidth: 140, flexShrink: 0, fontFamily: "var(--mantine-font-family-headings)" },
474
- children: formatLabel(key)
475
- }
476
- ),
477
- /* @__PURE__ */ jsx(PrimitiveValue, { value })
478
- ] }, key)) }),
479
- complexEntries.map(([key, value]) => /* @__PURE__ */ jsx(NestedSection, { title: formatLabel(key), children: /* @__PURE__ */ jsx(ContextNode, { data: value, depth: depth + 1 }) }, key))
480
- ] });
481
- }
482
- var TIME_RANGE_OPTIONS = [
483
- { value: "1h", label: "Last 1 hour" },
484
- { value: "24h", label: "Last 24 hours" },
485
- { value: "7d", label: "Last 7 days" },
486
- { value: "30d", label: "Last 30 days" }
487
- ];
488
- function TimeRangeSelector({ value, onChange, width = 180 }) {
489
- return /* @__PURE__ */ jsx(
490
- CustomSelector,
491
- {
492
- value,
493
- onChange: (newValue) => newValue && onChange(newValue),
494
- data: TIME_RANGE_OPTIONS,
495
- leftSection: /* @__PURE__ */ jsx(IconClock, { size: 16, color: "var(--color-text-subtle)" }),
496
- w: width,
497
- withCheckIcon: true
498
- }
499
- );
500
- }
501
- function PageNotFound() {
502
- const { currentPath, navigate } = useRouterContext();
503
- const { user, isLoading } = useAuthContext();
504
- const isAuthPage = currentPath === "/login" || currentPath === "/auth-redirect";
505
- const shouldShowSidebar = user && !isLoading && !isAuthPage;
506
- const height = shouldShowSidebar ? "100%" : "100vh";
507
- return /* @__PURE__ */ jsx(Center, { h: height, bg: "var(--color-background)", children: /* @__PURE__ */ jsxs(Stack, { align: "center", justify: "center", children: [
508
- /* @__PURE__ */ jsx(IconInfoCircle, { size: 60, color: "var(--color-text-subtle)" }),
509
- /* @__PURE__ */ jsx(Title, { order: 1, children: "Page Not Found" }),
510
- /* @__PURE__ */ jsx(Text, { c: "dimmed", size: "lg", children: "The page you are looking for does not exist." }),
511
- /* @__PURE__ */ jsx(Group, { justify: "center", children: /* @__PURE__ */ jsx(Button, { size: "md", onClick: () => navigate("/"), children: "Go Home" }) })
512
- ] }) });
513
- }
514
- function ResourceCard({
515
- resource,
516
- onClick,
517
- layout = "stack",
518
- rightSection,
519
- topSection,
520
- lastRunLabel,
521
- style,
522
- ...rest
523
- }) {
524
- const Icon = getResourceIcon(resource.type);
525
- if (!Icon) {
526
- return /* @__PURE__ */ jsx(Card, { shadow: "sm", withBorder: true, children: /* @__PURE__ */ jsxs(Text, { children: [
527
- "Invalid resource type: ",
528
- resource.type
529
- ] }) });
530
- }
531
- const cardStyle = {
532
- cursor: "pointer",
533
- ...layout === "grid" || layout === "card" ? { transition: "box-shadow var(--duration-fast) var(--easing)" } : {},
534
- ...style
535
- };
536
- const iconSize = layout === "grid" ? 28 : 20;
537
- const details = /* @__PURE__ */ jsxs(Group, { gap: "sm", wrap: "nowrap", children: [
538
- /* @__PURE__ */ jsx(Icon, { size: iconSize, color: "var(--color-primary)" }),
539
- /* @__PURE__ */ jsxs(Stack, { gap: 4, style: { flex: 1, minWidth: 0 }, children: [
540
- /* @__PURE__ */ jsxs(Group, { gap: "xs", align: "center", children: [
541
- /* @__PURE__ */ jsx(
542
- Text,
543
- {
544
- fw: 600,
545
- size: "sm",
546
- style: { fontFamily: "var(--elevasis-font-family-subtitle)" },
547
- ...layout === "stack" ? { lineClamp: 1 } : { truncate: true },
548
- children: resource.name
549
- }
550
- ),
551
- /* @__PURE__ */ jsx(Badge, { variant: "light", size: layout === "grid" ? "xs" : "sm", children: resource.type })
552
- ] }),
553
- resource.description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", ...layout === "stack" ? { lineClamp: 1 } : { truncate: true }, children: resource.description }),
554
- /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
555
- resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "outline", size: "xs", children: [
556
- "v",
557
- resource.version
558
- ] }),
559
- /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "outline", size: layout === "grid" ? "xs" : "sm", children: resource.status.toUpperCase() })
560
- ] }),
561
- lastRunLabel && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: lastRunLabel }),
562
- /* @__PURE__ */ jsx(Text, { size: layout === "grid" ? "sm" : "xs", c: "dimmed", ff: "monospace", children: resource.resourceId })
563
- ] })
564
- ] });
565
- if (layout === "card") {
566
- return /* @__PURE__ */ jsx(
567
- Card,
568
- {
569
- withBorder: true,
570
- padding: 0,
571
- style: cardStyle,
572
- onClick: () => onClick(resource),
573
- "data-resource-id": rest["data-resource-id"],
574
- children: /* @__PURE__ */ jsxs(Stack, { gap: 8, p: "sm", pb: "xs", children: [
575
- /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", justify: "space-between", children: [
576
- /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", style: { minWidth: 0 }, children: [
577
- /* @__PURE__ */ jsx(Icon, { size: 20, color: "var(--color-primary)", style: { flexShrink: 0 } }),
578
- /* @__PURE__ */ jsx(Text, { fw: 600, size: "md", style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, truncate: true, children: resource.name })
579
- ] }),
580
- /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", style: { flexShrink: 0 }, children: [
581
- resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "light", size: "sm", children: [
582
- "v",
583
- resource.version
584
- ] }),
585
- /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "light", size: "sm", children: resource.status.toUpperCase() })
586
- ] })
587
- ] }),
588
- resource.description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", truncate: true, children: resource.description }),
589
- /* @__PURE__ */ jsxs(Group, { gap: "xs", justify: "space-between", wrap: "nowrap", children: [
590
- rightSection || /* @__PURE__ */ jsx("span", {}),
591
- lastRunLabel && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { whiteSpace: "nowrap" }, children: lastRunLabel })
592
- ] }),
593
- topSection
594
- ] })
595
- }
596
- );
597
- }
598
- if (layout === "row") {
599
- const [hovered, setHovered] = useState(false);
600
- return /* @__PURE__ */ jsx(
601
- Card,
602
- {
603
- padding: 0,
604
- style: {
605
- cursor: "pointer",
606
- border: "1px solid var(--color-border)",
607
- transition: "background 150ms ease",
608
- background: hovered ? "var(--active-background)" : "var(--glass-background)",
609
- ...style
610
- },
611
- onClick: () => onClick(resource),
612
- onMouseEnter: () => setHovered(true),
613
- onMouseLeave: () => setHovered(false),
614
- "data-resource-id": rest["data-resource-id"],
615
- children: /* @__PURE__ */ jsxs(
616
- "div",
617
- {
618
- style: {
619
- display: "grid",
620
- gridTemplateColumns: "18px 200px 120px 1fr 180px 140px 14px",
621
- alignItems: "center",
622
- gap: "var(--mantine-spacing-sm)"
623
- },
624
- children: [
625
- /* @__PURE__ */ jsx(Icon, { size: 18, color: "var(--color-primary)" }),
626
- /* @__PURE__ */ jsx(Text, { fw: 600, size: "md", truncate: true, style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, children: resource.name }),
627
- /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", children: [
628
- resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "light", size: "sm", children: [
629
- "v",
630
- resource.version
631
- ] }),
632
- /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "light", size: "sm", children: resource.status.toUpperCase() })
633
- ] }),
634
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", truncate: true, style: { minWidth: 0 }, children: resource.description || "" }),
635
- /* @__PURE__ */ jsx("div", { style: { whiteSpace: "nowrap" }, children: rightSection }),
636
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { whiteSpace: "nowrap", textAlign: "right" }, children: lastRunLabel || "" }),
637
- /* @__PURE__ */ jsx(
638
- IconChevronRight,
639
- {
640
- size: 14,
641
- style: {
642
- opacity: hovered ? 0.7 : 0,
643
- transition: "opacity 150ms ease"
644
- }
645
- }
646
- )
647
- ]
648
- }
649
- )
650
- }
651
- );
652
- }
653
- if (layout === "grid") {
654
- return /* @__PURE__ */ jsx(
655
- Card,
656
- {
657
- withBorder: true,
658
- padding: "sm",
659
- style: cardStyle,
660
- onClick: () => onClick(resource),
661
- "data-resource-id": rest["data-resource-id"],
662
- children: /* @__PURE__ */ jsxs(Grid, { gutter: "sm", align: "center", children: [
663
- /* @__PURE__ */ jsx(Grid.Col, { span: 8, children: details }),
664
- rightSection && /* @__PURE__ */ jsx(Grid.Col, { span: 4, children: /* @__PURE__ */ jsx(Group, { justify: "flex-end", gap: "md", wrap: "nowrap", children: rightSection }) })
665
- ] })
666
- }
667
- );
668
- }
669
- return /* @__PURE__ */ jsx(
670
- Card,
671
- {
672
- shadow: "sm",
673
- withBorder: true,
674
- style: cardStyle,
675
- onClick: () => onClick(resource),
676
- "data-resource-id": rest["data-resource-id"],
677
- children: /* @__PURE__ */ jsx(Stack, { children: details })
678
- }
679
- );
680
- }
681
-
682
- // src/components/display/ResourceCardAdapters.ts
683
- function catalogItemToResourceDefinition(item) {
684
- return {
685
- resourceId: item.resourceId,
686
- name: item.resourceName,
687
- description: item.description || "",
688
- version: item.version,
689
- type: item.resourceType,
690
- status: item.status
691
- };
692
- }
693
- function CardHeader({ icon, title, subtitle, rightSection }) {
694
- return /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "md", children: [
695
- subtitle ? /* @__PURE__ */ jsxs("div", { children: [
696
- /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
697
- icon,
698
- /* @__PURE__ */ jsx(Title, { order: 3, children: title })
699
- ] }),
700
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", mt: 2, children: subtitle })
701
- ] }) : /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
702
- icon,
703
- /* @__PURE__ */ jsx(Title, { order: 3, children: title })
704
- ] }),
705
- rightSection
706
- ] });
707
- }
708
38
  var CustomModal = ({ children, opened, onClose, loading, style, size }) => {
709
39
  const canClose = loading === true ? false : true;
710
40
  return /* @__PURE__ */ jsx(
@@ -1020,6 +350,64 @@ function ResourceHealthChart({
1020
350
  }
1021
351
  ) });
1022
352
  }
353
+ function ResourceHealthPanel({ resourceId, resourceType, timeRange }) {
354
+ const colors = useCyberColors();
355
+ const { startDate, endDate } = useMemo(() => getTimeRangeDates(timeRange), [timeRange]);
356
+ const granularity = ["1h", "24h"].includes(timeRange) ? "hour" : "day";
357
+ const { data, isLoading } = useResourcesHealth({
358
+ resources: [{ entityType: resourceType, entityId: resourceId }],
359
+ startDate,
360
+ endDate,
361
+ granularity
362
+ });
363
+ const resourceHealth = data?.resources?.[0];
364
+ const chartData = useMemo(() => {
365
+ if (!resourceHealth?.trendData) return [];
366
+ return resourceHealth.trendData.map((point) => ({
367
+ time: point.time,
368
+ Success: (point.success || 0) - (point.warning || 0),
369
+ Warning: point.warning || 0,
370
+ Failed: point.failure || 0
371
+ }));
372
+ }, [resourceHealth?.trendData]);
373
+ const xTickFormatter = useMemo(() => (value) => formatBucketTime(value, granularity), [granularity]);
374
+ if (isLoading) {
375
+ return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) });
376
+ }
377
+ const summary = resourceHealth?.summary;
378
+ return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
379
+ /* @__PURE__ */ jsx(Group, { justify: "space-between", mb: "md", children: /* @__PURE__ */ jsxs("div", { children: [
380
+ /* @__PURE__ */ jsx(Title, { order: 3, children: "Execution Health" }),
381
+ /* @__PURE__ */ jsxs(Text, { size: "sm", c: "dimmed", children: [
382
+ summary?.total || 0,
383
+ " executions, ",
384
+ summary?.successRate?.toFixed(1) || 0,
385
+ "% success rate"
386
+ ] })
387
+ ] }) }),
388
+ chartData.length === 0 ? /* @__PURE__ */ jsx(EmptyState, { icon: IconChartBar, title: "No execution data for this time range" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
389
+ /* @__PURE__ */ jsxs(Group, { gap: "lg", justify: "center", mb: "xs", h: 24, align: "center", children: [
390
+ /* @__PURE__ */ jsx(CyberLegendItem, { color: colors.green, label: "Success" }),
391
+ /* @__PURE__ */ jsx(CyberLegendItem, { color: colors.yellow, label: "Warning" }),
392
+ /* @__PURE__ */ jsx(CyberLegendItem, { color: colors.red, label: "Failed" })
393
+ ] }),
394
+ /* @__PURE__ */ jsx(
395
+ CyberAreaChart,
396
+ {
397
+ data: chartData,
398
+ series: [
399
+ { dataKey: "Success", color: "green", name: "Success" },
400
+ { dataKey: "Warning", color: "yellow", name: "Warning" },
401
+ { dataKey: "Failed", color: "red", name: "Failed" }
402
+ ],
403
+ height: 200,
404
+ yDomain: [0, "auto"],
405
+ xTickFormatter
406
+ }
407
+ )
408
+ ] })
409
+ ] });
410
+ }
1023
411
  var categoryColors = {
1024
412
  info: "blue",
1025
413
  queue: "cyan",
@@ -2323,7 +1711,7 @@ var iconMap = {
2323
1711
  IconRocket,
2324
1712
  IconMessageCircle,
2325
1713
  IconArrowUp,
2326
- IconClock: IconClock,
1714
+ IconClock,
2327
1715
  IconFileText,
2328
1716
  IconSend,
2329
1717
  IconMail
@@ -3347,4 +2735,4 @@ var showApiErrorNotification = (error) => {
3347
2735
  });
3348
2736
  };
3349
2737
 
3350
- export { APIErrorAlert, ActionModal, AgentDefinitionDisplay, AgentExecutionTimeline, AgentExecutionVisualizer, AgentIterationEdge, AgentIterationNode, BaseEdge, BaseNode, CardHeader, CollapsibleJsonSection, CollapsibleSection, ConfigCard, ConfirmationInputModal, ConfirmationModal, ContentSections, ContextViewer, ContractDisplay, CustomModal, CustomSelector, DetailCardSkeleton, EmptyState, EmptyVisualizer, ExecutionLogsTable, ExecutionStats, ExecutionStatusBadge, FilterBar, FormFieldRenderer, GraphBackground, GraphContainer, GraphFitViewButton, GraphFitViewHandler, GraphLegend, JsonViewer, ListSkeleton, NewKnowledgeMapEdge, NewKnowledgeMapGraph, NewKnowledgeMapNode, NotificationBell, NotificationItem, NotificationList, NotificationPanel, PageNotFound, PageTitleCaption, ResourceCard, ResourceDefinitionSection, ResourceHealthChart, SortableHeader, StatCard, StatCardSkeleton, StatsCardSkeleton, StyledMarkdown, TabCountBadge, TableSelectionToolbar, TaskCard, TimeRangeSelector, TimelineAxis, TimelineBar, TimelineContainer, TimelineRow, ToolsListDisplay, TrendIndicator, UnifiedWorkflowEdge, UnifiedWorkflowGraph, UnifiedWorkflowNode, VisualizerContainer, WorkflowDefinitionDisplay, WorkflowExecutionTimeline, catalogItemToResourceDefinition, getGraphBackgroundStyles, getHealthColor, getIcon, iconMap, showApiErrorNotification, showErrorNotification, showInfoNotification, showSuccessNotification, showWarningNotification, useGraphBackgroundStyles, useGraphTheme, useNewKnowledgeMapLayout };
2738
+ export { ActionModal, AgentDefinitionDisplay, AgentExecutionTimeline, AgentExecutionVisualizer, AgentIterationEdge, AgentIterationNode, BaseEdge, BaseNode, CollapsibleJsonSection, ConfigCard, ConfirmationInputModal, ConfirmationModal, ContentSections, ContractDisplay, CustomModal, EmptyVisualizer, ExecutionLogsTable, ExecutionStats, ExecutionStatusBadge, FilterBar, FormFieldRenderer, GraphBackground, GraphContainer, GraphFitViewButton, GraphFitViewHandler, GraphLegend, NewKnowledgeMapEdge, NewKnowledgeMapGraph, NewKnowledgeMapNode, NotificationBell, NotificationItem, NotificationList, NotificationPanel, ResourceDefinitionSection, ResourceHealthChart, ResourceHealthPanel, SortableHeader, TableSelectionToolbar, TaskCard, TimelineAxis, TimelineBar, TimelineContainer, TimelineRow, ToolsListDisplay, UnifiedWorkflowEdge, UnifiedWorkflowGraph, UnifiedWorkflowNode, VisualizerContainer, WorkflowDefinitionDisplay, WorkflowExecutionTimeline, getGraphBackgroundStyles, getHealthColor, getIcon, iconMap, showApiErrorNotification, showErrorNotification, showInfoNotification, showSuccessNotification, showWarningNotification, useGraphBackgroundStyles, useGraphTheme, useNewKnowledgeMapLayout };