@truefoundry/trueforge-ui 0.3.0-rc.0 → 0.3.0-rc.10
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/CHANGELOG.md +191 -0
- package/README.md +35 -12
- package/dist/AgentCodeSnippets-RJBB4DDE.js +89 -0
- package/dist/AgentCodeSnippets-RJBB4DDE.js.map +1 -0
- package/dist/AgentMetricChart-UPGSJ2WP.js +15 -0
- package/dist/AgentOverview-U5WIQXZN.js +169 -0
- package/dist/AgentOverview-U5WIQXZN.js.map +1 -0
- package/dist/AgentSessionEventTimeline-GRGIQTRE.js +88 -0
- package/dist/AgentSessionEventTimeline-GRGIQTRE.js.map +1 -0
- package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js +591 -0
- package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js.map +1 -0
- package/dist/AgentSessions-5OTF2BUW.js +323 -0
- package/dist/AgentSessions-5OTF2BUW.js.map +1 -0
- package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-HDKGLDCY.js} +163 -125
- package/dist/ConnectorSettings-HDKGLDCY.js.map +1 -0
- package/dist/{DockLayout-LBNQJZNF.js → DockLayout-D2FPQCAL.js} +11 -10
- package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-D2FPQCAL.js.map} +1 -1
- package/dist/DrawerLayout-HUV7RAWL.js +186 -0
- package/dist/DrawerLayout-HUV7RAWL.js.map +1 -0
- package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-VNQ7HPKH.js} +23 -27
- package/dist/ModelSettings-VNQ7HPKH.js.map +1 -0
- package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
- package/dist/OpenUiFenceBlock-KPZFLUSC.js.map +1 -0
- package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-ZLXGMFBF.js} +18 -20
- package/dist/SandboxSettings-ZLXGMFBF.js.map +1 -0
- package/dist/SchedulesPage-QKYI2Z3A.js +15 -0
- package/dist/SchedulesPage-QKYI2Z3A.js.map +1 -0
- package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-RVVYXOJW.js} +27 -23
- package/dist/SettingsBuilder-RVVYXOJW.js.map +1 -0
- package/dist/ShellRouteSync-SJXFKUAJ.js +390 -0
- package/dist/ShellRouteSync-SJXFKUAJ.js.map +1 -0
- package/dist/SidebarLayout-KYA76FQ7.js +330 -0
- package/dist/SidebarLayout-KYA76FQ7.js.map +1 -0
- package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-7OHT7FPI.js} +25 -21
- package/dist/SkillSettings-7OHT7FPI.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-LKG4XLW6.js} +14 -10
- package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-LKG4XLW6.js.map} +1 -1
- package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-W2RGGOQ3.js} +17 -13
- package/dist/WidgetLayout-W2RGGOQ3.js.map +1 -0
- package/dist/chunk-2GIZY3JJ.js +1062 -0
- package/dist/chunk-2GIZY3JJ.js.map +1 -0
- package/dist/chunk-2QTH6JHX.js +217 -0
- package/dist/chunk-2QTH6JHX.js.map +1 -0
- package/dist/{chunk-FJ5RSSMA.js → chunk-3ZW74FHC.js} +118 -164
- package/dist/chunk-3ZW74FHC.js.map +1 -0
- package/dist/chunk-67ZO7Z2W.js +184 -0
- package/dist/chunk-67ZO7Z2W.js.map +1 -0
- package/dist/{chunk-CFLVPV5M.js → chunk-7AAO4UDQ.js} +8 -2
- package/dist/chunk-7AAO4UDQ.js.map +1 -0
- package/dist/{chunk-B52K63AW.js → chunk-CG75X77Q.js} +2 -2
- package/dist/chunk-DJUFS2BW.js +27 -0
- package/dist/chunk-DJUFS2BW.js.map +1 -0
- package/dist/chunk-DPPOEFBD.js +517 -0
- package/dist/chunk-DPPOEFBD.js.map +1 -0
- package/dist/chunk-EPAL2HD5.js +1629 -0
- package/dist/chunk-EPAL2HD5.js.map +1 -0
- package/dist/chunk-GG23N2GW.js +15018 -0
- package/dist/chunk-GG23N2GW.js.map +1 -0
- package/dist/chunk-JCL3Q7RW.js +587 -0
- package/dist/chunk-JCL3Q7RW.js.map +1 -0
- package/dist/chunk-JKEBMGLH.js +682 -0
- package/dist/chunk-JKEBMGLH.js.map +1 -0
- package/dist/chunk-KSGNKS2D.js +296 -0
- package/dist/chunk-KSGNKS2D.js.map +1 -0
- package/dist/{chunk-WREC7D54.js → chunk-PCI6VMB5.js} +268 -48
- package/dist/chunk-PCI6VMB5.js.map +1 -0
- package/dist/chunk-PQ7VWBQQ.js +121 -0
- package/dist/chunk-PQ7VWBQQ.js.map +1 -0
- package/dist/chunk-RDXBMTP5.js +32 -0
- package/dist/chunk-RDXBMTP5.js.map +1 -0
- package/dist/chunk-T6QQV5LK.js +238 -0
- package/dist/chunk-T6QQV5LK.js.map +1 -0
- package/dist/chunk-Y6S4OVVQ.js +16 -0
- package/dist/chunk-Y6S4OVVQ.js.map +1 -0
- package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +18 -4
- package/dist/index.d.ts +1287 -46
- package/dist/index.js +266 -63
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +590 -11
- package/dist/plugins/trueforge-agent-server-adapter/index.js +607 -204
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +10 -8
- package/dist/ConnectorSettings-FXQ5B7TN.js.map +0 -1
- package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
- package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
- package/dist/ModelSettings-4L4LOQJA.js.map +0 -1
- package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
- package/dist/SandboxSettings-Z4ZG6ZX4.js.map +0 -1
- package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
- package/dist/ShellRouteSync-T4WLY57Q.js +0 -172
- package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
- package/dist/SidebarLayout-3WZ3CVON.js +0 -256
- package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
- package/dist/SkillSettings-3EPPC3IT.js.map +0 -1
- package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
- package/dist/chunk-36KOSC2J.js +0 -567
- package/dist/chunk-36KOSC2J.js.map +0 -1
- package/dist/chunk-3S6KHO7H.js +0 -2121
- package/dist/chunk-3S6KHO7H.js.map +0 -1
- package/dist/chunk-7L63OK3O.js +0 -91
- package/dist/chunk-7L63OK3O.js.map +0 -1
- package/dist/chunk-CFLVPV5M.js.map +0 -1
- package/dist/chunk-FJ5RSSMA.js.map +0 -1
- package/dist/chunk-OSV3HI5M.js +0 -6891
- package/dist/chunk-OSV3HI5M.js.map +0 -1
- package/dist/chunk-WQULF5AT.js +0 -460
- package/dist/chunk-WQULF5AT.js.map +0 -1
- package/dist/chunk-WREC7D54.js.map +0 -1
- package/dist/chunk-YIWUG6MC.js +0 -101
- package/dist/chunk-YIWUG6MC.js.map +0 -1
- package/dist/chunk-ZXOADNF3.js +0 -75
- package/dist/chunk-ZXOADNF3.js.map +0 -1
- /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-UPGSJ2WP.js.map} +0 -0
- /package/dist/{chunk-B52K63AW.js.map → chunk-CG75X77Q.js.map} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
+
getErrorMessage,
|
|
2
3
|
useOptionalServer
|
|
3
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2GIZY3JJ.js";
|
|
4
5
|
import {
|
|
5
6
|
ThemeContext,
|
|
6
7
|
cn
|
|
7
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JCL3Q7RW.js";
|
|
8
9
|
|
|
9
10
|
// src/icons/Icon.tsx
|
|
10
11
|
import { createElement, isValidElement, useContext } from "react";
|
|
@@ -19,10 +20,14 @@ import {
|
|
|
19
20
|
Bot,
|
|
20
21
|
Box,
|
|
21
22
|
Brain,
|
|
23
|
+
Calendar,
|
|
24
|
+
CalendarClock,
|
|
25
|
+
CalendarPlus,
|
|
22
26
|
Check,
|
|
23
27
|
ChevronDown,
|
|
24
28
|
ChevronLeft,
|
|
25
29
|
ChevronRight,
|
|
30
|
+
ChevronsUpDown,
|
|
26
31
|
CircleAlert,
|
|
27
32
|
CircleCheck,
|
|
28
33
|
CircleX,
|
|
@@ -30,14 +35,20 @@ import {
|
|
|
30
35
|
Code2,
|
|
31
36
|
Copy,
|
|
32
37
|
Cpu,
|
|
38
|
+
DollarSign,
|
|
33
39
|
Download,
|
|
34
40
|
Ellipsis,
|
|
41
|
+
EllipsisVertical,
|
|
35
42
|
ExternalLink,
|
|
36
43
|
File,
|
|
37
44
|
Github,
|
|
45
|
+
GripVertical,
|
|
38
46
|
History,
|
|
39
47
|
Info,
|
|
48
|
+
LibraryBig,
|
|
40
49
|
Lightbulb,
|
|
50
|
+
LineChart,
|
|
51
|
+
Link2,
|
|
41
52
|
ListChecks,
|
|
42
53
|
ListFilter,
|
|
43
54
|
ListOrdered,
|
|
@@ -46,11 +57,13 @@ import {
|
|
|
46
57
|
LogOut,
|
|
47
58
|
Maximize2,
|
|
48
59
|
Menu,
|
|
60
|
+
MessageSquareText,
|
|
49
61
|
Minimize2,
|
|
50
62
|
Moon,
|
|
51
63
|
PanelLeftClose,
|
|
52
64
|
PanelLeftOpen,
|
|
53
65
|
Paperclip,
|
|
66
|
+
Pause,
|
|
54
67
|
Pencil,
|
|
55
68
|
Play,
|
|
56
69
|
Plug,
|
|
@@ -59,7 +72,9 @@ import {
|
|
|
59
72
|
Save,
|
|
60
73
|
Search,
|
|
61
74
|
Settings,
|
|
75
|
+
SlidersHorizontal,
|
|
62
76
|
Sparkle,
|
|
77
|
+
SquareArrowOutUpRight,
|
|
63
78
|
SquarePen,
|
|
64
79
|
Sun,
|
|
65
80
|
Terminal,
|
|
@@ -111,10 +126,16 @@ var defaults = {
|
|
|
111
126
|
check: Check,
|
|
112
127
|
pencil: Pencil,
|
|
113
128
|
play: Play,
|
|
129
|
+
pause: Pause,
|
|
130
|
+
calendar: Calendar,
|
|
131
|
+
"calendar-clock": CalendarClock,
|
|
132
|
+
"calendar-plus": CalendarPlus,
|
|
133
|
+
"grip-vertical": GripVertical,
|
|
114
134
|
"square-pen": SquarePen,
|
|
115
135
|
"rotate-right": RotateCw,
|
|
116
136
|
broom: Broom,
|
|
117
137
|
ellipsis: Ellipsis,
|
|
138
|
+
"ellipsis-vertical": EllipsisVertical,
|
|
118
139
|
trash: Trash2,
|
|
119
140
|
"box-archive": Archive,
|
|
120
141
|
"clock-rotate-left": History,
|
|
@@ -124,10 +145,12 @@ var defaults = {
|
|
|
124
145
|
"chevron-down": ChevronDown,
|
|
125
146
|
"chevron-left": ChevronLeft,
|
|
126
147
|
"chevron-right": ChevronRight,
|
|
148
|
+
"chevrons-up-down": ChevronsUpDown,
|
|
127
149
|
loader: Loader2,
|
|
128
150
|
file: File,
|
|
129
151
|
clone: Copy,
|
|
130
152
|
copy: Copy,
|
|
153
|
+
"dollar-sign": DollarSign,
|
|
131
154
|
bars: Menu,
|
|
132
155
|
"panel-left-close": PanelLeftClose,
|
|
133
156
|
"panel-left-open": PanelLeftOpen,
|
|
@@ -135,6 +158,7 @@ var defaults = {
|
|
|
135
158
|
sun: Sun,
|
|
136
159
|
moon: Moon,
|
|
137
160
|
settings: Settings,
|
|
161
|
+
sliders: SlidersHorizontal,
|
|
138
162
|
"log-out": LogOut,
|
|
139
163
|
search: Search,
|
|
140
164
|
clock: Clock,
|
|
@@ -145,12 +169,16 @@ var defaults = {
|
|
|
145
169
|
"oauth-loading": Loader2,
|
|
146
170
|
"welcome-sparkle": Sparkle,
|
|
147
171
|
robot: Bot,
|
|
172
|
+
bot: Bot,
|
|
173
|
+
"library-big": LibraryBig,
|
|
174
|
+
"message-square-text": MessageSquareText,
|
|
148
175
|
"book-open": BookOpen,
|
|
149
176
|
funnel: ListFilter,
|
|
150
177
|
plug: Plug,
|
|
151
178
|
"list-check": ListChecks,
|
|
152
179
|
lock: Lock,
|
|
153
180
|
lightbulb: Lightbulb,
|
|
181
|
+
link: Link2,
|
|
154
182
|
wrench: Wrench,
|
|
155
183
|
cpu: Cpu,
|
|
156
184
|
cube: Box,
|
|
@@ -160,10 +188,12 @@ var defaults = {
|
|
|
160
188
|
brain: Brain,
|
|
161
189
|
terminal: Terminal,
|
|
162
190
|
code: Code2,
|
|
191
|
+
chart: LineChart,
|
|
163
192
|
expand: Maximize2,
|
|
164
193
|
"expand-alt": Maximize2,
|
|
165
194
|
compress: Minimize2,
|
|
166
195
|
"external-link": ExternalLink,
|
|
196
|
+
"square-arrow-out-up-right": SquareArrowOutUpRight,
|
|
167
197
|
github: Github
|
|
168
198
|
};
|
|
169
199
|
for (const [name, icon] of Object.entries(defaults)) {
|
|
@@ -244,170 +274,54 @@ function Spinner({ size = 16, className, ...props }) {
|
|
|
244
274
|
|
|
245
275
|
// src/atoms/lib/buttonClasses.ts
|
|
246
276
|
var variantClasses = {
|
|
247
|
-
|
|
248
|
-
secondary: "border border-input-border bg-secondary-button-bg text-secondary-button-text
|
|
277
|
+
primary: "bg-primary-button-bg text-primary-button-text shadow hover:bg-primary-button-hover",
|
|
278
|
+
secondary: "border border-input-border bg-secondary-button-bg text-secondary-button-text hover:bg-secondary-button-hover",
|
|
249
279
|
ghost: "bg-ghost-button-bg text-ghost-button-text hover:bg-ghost-button-hover",
|
|
250
|
-
destructive: "bg-failure-bg text-failure-text shadow-sm hover:bg-failure-bg/90"
|
|
251
|
-
outline: "border border-input-border bg-secondary-button-bg text-secondary-button-text shadow-sm hover:bg-secondary-button-hover"
|
|
280
|
+
destructive: "bg-failure-bg text-failure-text shadow-sm hover:bg-failure-bg/90"
|
|
252
281
|
};
|
|
253
282
|
var sizeClasses = {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
icon: "h-8 w-8"
|
|
283
|
+
large: "h-8 gap-2 px-2.5 text-sm [&_svg]:size-3.5",
|
|
284
|
+
small: "h-6 gap-1 px-1.5 text-xs [&_svg]:size-3",
|
|
285
|
+
icon: "h-8 w-8 shrink-0 gap-0 p-0 [&_svg]:size-3.5"
|
|
258
286
|
};
|
|
259
|
-
var baseClasses = "inline-flex cursor-pointer items-center justify-center
|
|
287
|
+
var baseClasses = "inline-flex cursor-pointer items-center justify-center whitespace-nowrap rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50";
|
|
288
|
+
var sidebarButtonRadiusClassName = "rounded-[0.75rem]";
|
|
289
|
+
var sidebarRailButtonClassName = cn(
|
|
290
|
+
sidebarButtonRadiusClassName,
|
|
291
|
+
"h-[3.375rem] w-[4rem] shrink-0 flex-col gap-1 whitespace-normal px-0.5 text-[0.625rem] font-normal leading-tight !justify-center shadow-none hover:bg-secondary-button-hover hover:text-ghost-button-text [&_svg]:size-3.5"
|
|
292
|
+
);
|
|
260
293
|
function auiButtonClass({
|
|
261
|
-
variant = "
|
|
262
|
-
size = "
|
|
294
|
+
variant = "primary",
|
|
295
|
+
size = "large",
|
|
263
296
|
className
|
|
264
297
|
} = {}) {
|
|
265
298
|
return cn(baseClasses, variantClasses[variant], sizeClasses[size], className);
|
|
266
299
|
}
|
|
267
300
|
|
|
268
|
-
// src/
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
out += char;
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
const next = text[i + 1];
|
|
286
|
-
switch (next) {
|
|
287
|
-
case "n":
|
|
288
|
-
out += "\n";
|
|
289
|
-
i += 1;
|
|
290
|
-
break;
|
|
291
|
-
case "t":
|
|
292
|
-
out += " ";
|
|
293
|
-
i += 1;
|
|
294
|
-
break;
|
|
295
|
-
case "r":
|
|
296
|
-
out += "\r";
|
|
297
|
-
i += 1;
|
|
298
|
-
break;
|
|
299
|
-
case "b":
|
|
300
|
-
out += "\b";
|
|
301
|
-
i += 1;
|
|
302
|
-
break;
|
|
303
|
-
case "f":
|
|
304
|
-
out += "\f";
|
|
305
|
-
i += 1;
|
|
306
|
-
break;
|
|
307
|
-
case "v":
|
|
308
|
-
out += "\v";
|
|
309
|
-
i += 1;
|
|
310
|
-
break;
|
|
311
|
-
case "0":
|
|
312
|
-
out += "\0";
|
|
313
|
-
i += 1;
|
|
314
|
-
break;
|
|
315
|
-
case "\\":
|
|
316
|
-
out += "\\";
|
|
317
|
-
i += 1;
|
|
318
|
-
break;
|
|
319
|
-
case '"':
|
|
320
|
-
out += '"';
|
|
321
|
-
i += 1;
|
|
322
|
-
break;
|
|
323
|
-
case "'":
|
|
324
|
-
out += "'";
|
|
325
|
-
i += 1;
|
|
326
|
-
break;
|
|
327
|
-
case "u": {
|
|
328
|
-
const hex = text.slice(i + 2, i + 6);
|
|
329
|
-
if (/^[0-9a-fA-F]{4}$/.test(hex)) {
|
|
330
|
-
out += String.fromCharCode(Number.parseInt(hex, 16));
|
|
331
|
-
i += 5;
|
|
332
|
-
} else {
|
|
333
|
-
out += char;
|
|
334
|
-
}
|
|
335
|
-
break;
|
|
336
|
-
}
|
|
337
|
-
case "x": {
|
|
338
|
-
const hex = text.slice(i + 2, i + 4);
|
|
339
|
-
if (/^[0-9a-fA-F]{2}$/.test(hex)) {
|
|
340
|
-
out += String.fromCharCode(Number.parseInt(hex, 16));
|
|
341
|
-
i += 3;
|
|
342
|
-
} else {
|
|
343
|
-
out += char;
|
|
344
|
-
}
|
|
345
|
-
break;
|
|
346
|
-
}
|
|
347
|
-
default:
|
|
348
|
-
out += char;
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return out;
|
|
353
|
-
}
|
|
354
|
-
function decodeErrorMessageEscapes(text) {
|
|
355
|
-
const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
356
|
-
if (REAL_CONTROL_PATTERN.test(normalized) || !LITERAL_ESCAPE_PATTERN.test(normalized)) {
|
|
357
|
-
return normalized;
|
|
358
|
-
}
|
|
359
|
-
return decodeLiteralEscapes(normalized).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
360
|
-
}
|
|
361
|
-
function messageFromErrorShaped(value) {
|
|
362
|
-
if (!isRecord(value)) return void 0;
|
|
363
|
-
const direct = readNonEmptyString(value.message);
|
|
364
|
-
if (direct != null) return direct;
|
|
365
|
-
if (isRecord(value.error)) {
|
|
366
|
-
return readNonEmptyString(value.error.message);
|
|
367
|
-
}
|
|
368
|
-
return void 0;
|
|
369
|
-
}
|
|
370
|
-
function stringifyError(error) {
|
|
371
|
-
if (typeof error === "string") return error;
|
|
372
|
-
if (isRecord(error)) {
|
|
373
|
-
try {
|
|
374
|
-
return JSON.stringify(error);
|
|
375
|
-
} catch {
|
|
376
|
-
return Object.prototype.toString.call(error);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
return String(error);
|
|
380
|
-
}
|
|
381
|
-
function getErrorMessage(error, fallback) {
|
|
382
|
-
if (typeof error === "string") {
|
|
383
|
-
const trimmed = error.trim();
|
|
384
|
-
if (trimmed !== "") return decodeErrorMessageEscapes(error);
|
|
385
|
-
return fallback != null ? decodeErrorMessageEscapes(fallback) : decodeErrorMessageEscapes(error);
|
|
386
|
-
}
|
|
387
|
-
if (isRecord(error) && "body" in error) {
|
|
388
|
-
const fromBody = messageFromErrorShaped(error.body);
|
|
389
|
-
if (fromBody != null) return decodeErrorMessageEscapes(fromBody);
|
|
390
|
-
if (error.body != null) {
|
|
391
|
-
if (typeof error.body === "string") {
|
|
392
|
-
const trimmed = error.body.trim();
|
|
393
|
-
if (trimmed !== "") return decodeErrorMessageEscapes(error.body);
|
|
394
|
-
} else {
|
|
395
|
-
return stringifyError(error.body);
|
|
396
|
-
}
|
|
301
|
+
// src/atoms/PageHeader.tsx
|
|
302
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
303
|
+
var pageHeaderTitleClassName = "text-text-primary min-w-0 truncate text-md font-semibold";
|
|
304
|
+
function PageHeader({ title, start, end, children, className }) {
|
|
305
|
+
return /* @__PURE__ */ jsxs2(
|
|
306
|
+
"header",
|
|
307
|
+
{
|
|
308
|
+
className: cn("flex min-h-14 shrink-0 flex-wrap items-center gap-2 border-b border-border px-4", className),
|
|
309
|
+
children: [
|
|
310
|
+
start,
|
|
311
|
+
typeof title === "string" ? /* @__PURE__ */ jsx4("h1", { className: pageHeaderTitleClassName, children: title }) : title,
|
|
312
|
+
children,
|
|
313
|
+
end != null ? /* @__PURE__ */ jsx4("div", { className: "ml-auto flex min-w-0 flex-wrap items-center gap-2", children: end }) : null
|
|
314
|
+
]
|
|
397
315
|
}
|
|
398
|
-
|
|
399
|
-
const fromShape = messageFromErrorShaped(error);
|
|
400
|
-
if (fromShape != null) return decodeErrorMessageEscapes(fromShape);
|
|
401
|
-
if (fallback != null) return decodeErrorMessageEscapes(fallback);
|
|
402
|
-
return stringifyError(error);
|
|
316
|
+
);
|
|
403
317
|
}
|
|
404
318
|
|
|
405
319
|
// src/atoms/lib/CompactLayoutContext.tsx
|
|
406
320
|
import { createContext, useContext as useContext2 } from "react";
|
|
407
|
-
import { jsx as
|
|
321
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
408
322
|
var CompactLayoutContext = createContext(false);
|
|
409
323
|
function CompactLayoutProvider({ children }) {
|
|
410
|
-
return /* @__PURE__ */
|
|
324
|
+
return /* @__PURE__ */ jsx5(CompactLayoutContext.Provider, { value: true, children });
|
|
411
325
|
}
|
|
412
326
|
function useCompactLayout() {
|
|
413
327
|
return useContext2(CompactLayoutContext);
|
|
@@ -415,23 +329,32 @@ function useCompactLayout() {
|
|
|
415
329
|
|
|
416
330
|
// src/atoms/draft/DraftCatalogProvider.tsx
|
|
417
331
|
import { createContext as createContext2, useCallback, useContext as useContext3, useEffect, useMemo, useState } from "react";
|
|
418
|
-
import { jsx as
|
|
332
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
419
333
|
var DraftCatalogContext = createContext2(null);
|
|
420
334
|
var IDLE_ENSURE = () => void 0;
|
|
421
335
|
var IDLE_REFRESH = async () => void 0;
|
|
336
|
+
var EMPTY_LOGOS = {};
|
|
337
|
+
function toConnectorLogos(entries) {
|
|
338
|
+
const logos = {};
|
|
339
|
+
for (const entry of entries) {
|
|
340
|
+
if (entry.logo) logos[entry.name] = entry.logo;
|
|
341
|
+
}
|
|
342
|
+
return logos;
|
|
343
|
+
}
|
|
422
344
|
function DraftCatalogProvider({ children }) {
|
|
423
345
|
const server = useOptionalServer();
|
|
424
346
|
const existing = useContext3(DraftCatalogContext);
|
|
425
347
|
if (existing?.server === server) {
|
|
426
348
|
return children;
|
|
427
349
|
}
|
|
428
|
-
return /* @__PURE__ */
|
|
350
|
+
return /* @__PURE__ */ jsx6(DraftCatalogStore, { server, children });
|
|
429
351
|
}
|
|
430
352
|
function DraftCatalogStore({ server, children }) {
|
|
431
353
|
const [requestEpoch, setRequestEpoch] = useState(null);
|
|
432
354
|
const [models, setModels] = useState([]);
|
|
433
355
|
const [skills, setSkills] = useState([]);
|
|
434
356
|
const [connectors, setConnectors] = useState([]);
|
|
357
|
+
const [connectorLogos, setConnectorLogos] = useState(EMPTY_LOGOS);
|
|
435
358
|
const [completedEpoch, setCompletedEpoch] = useState(null);
|
|
436
359
|
const [loading, setLoading] = useState(false);
|
|
437
360
|
const [error, setError] = useState(null);
|
|
@@ -446,8 +369,7 @@ function DraftCatalogStore({ server, children }) {
|
|
|
446
369
|
setLoading(true);
|
|
447
370
|
setError(null);
|
|
448
371
|
try {
|
|
449
|
-
|
|
450
|
-
setConnectors(nextConnectors);
|
|
372
|
+
setConnectors(await server.getMcp());
|
|
451
373
|
} catch (reason) {
|
|
452
374
|
setError(getErrorMessage(reason, "Failed to load connectors."));
|
|
453
375
|
} finally {
|
|
@@ -459,8 +381,15 @@ function DraftCatalogStore({ server, children }) {
|
|
|
459
381
|
let cancelled = false;
|
|
460
382
|
setLoading(true);
|
|
461
383
|
setError(null);
|
|
462
|
-
|
|
384
|
+
const connectorCatalog = server.catalog?.connectorCatalog;
|
|
385
|
+
void Promise.allSettled([
|
|
386
|
+
server.getModels(),
|
|
387
|
+
server.getSkills(),
|
|
388
|
+
server.getMcp(),
|
|
389
|
+
connectorCatalog ? connectorCatalog.getConnectorCatalog() : Promise.resolve([])
|
|
390
|
+
]).then(([modelsResult, skillsResult, mcpResult, catalogResult]) => {
|
|
463
391
|
if (cancelled) return;
|
|
392
|
+
setConnectorLogos(catalogResult.status === "fulfilled" ? toConnectorLogos(catalogResult.value) : EMPTY_LOGOS);
|
|
464
393
|
const errors = [];
|
|
465
394
|
if (modelsResult.status === "fulfilled") {
|
|
466
395
|
setModels(modelsResult.value);
|
|
@@ -478,11 +407,8 @@ function DraftCatalogStore({ server, children }) {
|
|
|
478
407
|
errors.push(getErrorMessage(mcpResult.reason, "Failed to load connectors."));
|
|
479
408
|
}
|
|
480
409
|
setError(errors[0] ?? null);
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
setCompletedEpoch(requestEpoch);
|
|
484
|
-
setLoading(false);
|
|
485
|
-
}
|
|
410
|
+
setCompletedEpoch(requestEpoch);
|
|
411
|
+
setLoading(false);
|
|
486
412
|
});
|
|
487
413
|
return () => {
|
|
488
414
|
cancelled = true;
|
|
@@ -490,10 +416,34 @@ function DraftCatalogStore({ server, children }) {
|
|
|
490
416
|
}, [requestEpoch, server]);
|
|
491
417
|
const loaded = requestEpoch !== null && completedEpoch === requestEpoch;
|
|
492
418
|
const value = useMemo(
|
|
493
|
-
() => ({
|
|
494
|
-
|
|
419
|
+
() => ({
|
|
420
|
+
server,
|
|
421
|
+
models,
|
|
422
|
+
skills,
|
|
423
|
+
connectors,
|
|
424
|
+
connectorLogos,
|
|
425
|
+
loaded,
|
|
426
|
+
loading,
|
|
427
|
+
error,
|
|
428
|
+
ensureLoaded,
|
|
429
|
+
refresh,
|
|
430
|
+
refreshConnectors
|
|
431
|
+
}),
|
|
432
|
+
[
|
|
433
|
+
server,
|
|
434
|
+
models,
|
|
435
|
+
skills,
|
|
436
|
+
connectors,
|
|
437
|
+
connectorLogos,
|
|
438
|
+
loaded,
|
|
439
|
+
loading,
|
|
440
|
+
error,
|
|
441
|
+
ensureLoaded,
|
|
442
|
+
refresh,
|
|
443
|
+
refreshConnectors
|
|
444
|
+
]
|
|
495
445
|
);
|
|
496
|
-
return /* @__PURE__ */
|
|
446
|
+
return /* @__PURE__ */ jsx6(DraftCatalogContext.Provider, { value, children });
|
|
497
447
|
}
|
|
498
448
|
function useDraftCatalog() {
|
|
499
449
|
const ctx = useContext3(DraftCatalogContext);
|
|
@@ -502,6 +452,7 @@ function useDraftCatalog() {
|
|
|
502
452
|
models: [],
|
|
503
453
|
skills: [],
|
|
504
454
|
connectors: [],
|
|
455
|
+
connectorLogos: EMPTY_LOGOS,
|
|
505
456
|
loaded: false,
|
|
506
457
|
loading: false,
|
|
507
458
|
error: null,
|
|
@@ -517,11 +468,14 @@ export {
|
|
|
517
468
|
registerIcons,
|
|
518
469
|
Icon,
|
|
519
470
|
Spinner,
|
|
471
|
+
sidebarButtonRadiusClassName,
|
|
472
|
+
sidebarRailButtonClassName,
|
|
520
473
|
auiButtonClass,
|
|
521
|
-
|
|
474
|
+
pageHeaderTitleClassName,
|
|
475
|
+
PageHeader,
|
|
522
476
|
CompactLayoutProvider,
|
|
523
477
|
useCompactLayout,
|
|
524
478
|
DraftCatalogProvider,
|
|
525
479
|
useDraftCatalog
|
|
526
480
|
};
|
|
527
|
-
//# sourceMappingURL=chunk-
|
|
481
|
+
//# sourceMappingURL=chunk-3ZW74FHC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/icons/Icon.tsx","../src/icons/IconRegistry.tsx","../src/atoms/primitives/Spinner.tsx","../src/atoms/lib/buttonClasses.ts","../src/atoms/PageHeader.tsx","../src/atoms/lib/CompactLayoutContext.tsx","../src/atoms/draft/DraftCatalogProvider.tsx"],"sourcesContent":["import { createElement, isValidElement, useContext, type CSSProperties, type ReactNode } from 'react';\n\nimport { cn } from '../atoms/lib/cn.js';\nimport { ThemeContext } from '../theme/ThemeProvider.js';\nimport type { IconComponent, IconEntry, IconProps as ThemeIconProps } from '../theme/types.js';\nimport { lookupIcon, resolveIconName } from './IconRegistry.js';\n\nexport type IconProps = ThemeIconProps & {\n name: string | readonly string[];\n};\n\ntype IconRenderProps = {\n className?: string;\n style?: CSSProperties;\n size?: string | number;\n width?: string | number;\n height?: string | number;\n role?: string;\n} & Pick<IconProps, 'aria-hidden' | 'aria-label' | 'data-testid'>;\n\nfunction isComponent(entry: IconEntry): entry is IconComponent {\n if (typeof entry === 'function') return true;\n // Lucide (and other) icons are forwardRef objects, not functions\n return (\n typeof entry === 'object' &&\n entry !== null &&\n !isValidElement(entry) &&\n !Array.isArray(entry) &&\n '$$typeof' in entry\n );\n}\n\nfunction renderEntry(entry: IconEntry, props: IconRenderProps): ReactNode {\n if (isComponent(entry)) {\n const { size, className, style, ...aria } = props;\n return createElement(entry, {\n className: cn('inline-block shrink-0', className),\n style,\n size,\n width: size,\n height: size,\n 'aria-hidden': aria['aria-label'] ? undefined : (aria['aria-hidden'] ?? true),\n 'aria-label': aria['aria-label'],\n ...(aria['data-testid'] === undefined ? {} : { 'data-testid': aria['data-testid'] }),\n role: aria['aria-label'] ? 'img' : undefined,\n });\n }\n return entry;\n}\n\nexport function Icon({ name, className, style, size = '1em', ...aria }: IconProps) {\n const themeIcons = useContext(ThemeContext)?.icons;\n const resolved = resolveIconName(name);\n const entry = lookupIcon(resolved, themeIcons);\n if (!entry) return null;\n return <>{renderEntry(entry, { className, style, size, ...aria })}</>;\n}\n\nexport function useIcon(name: string | readonly string[]): IconEntry | undefined {\n const themeIcons = useContext(ThemeContext)?.icons;\n return lookupIcon(resolveIconName(name), themeIcons);\n}\n","import {\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowUp,\n BookOpen,\n Bot,\n Box,\n Brain,\n Calendar,\n CalendarClock,\n CalendarPlus,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronsUpDown,\n CircleAlert,\n CircleCheck,\n CircleX,\n Clock,\n Code2,\n Copy,\n Cpu,\n DollarSign,\n Download,\n Ellipsis,\n EllipsisVertical,\n ExternalLink,\n File,\n Github,\n GripVertical,\n History,\n Info,\n LibraryBig,\n Lightbulb,\n LineChart,\n Link2,\n ListChecks,\n ListFilter,\n ListOrdered,\n Loader2,\n Lock,\n LogOut,\n Maximize2,\n Menu,\n MessageSquareText,\n Minimize2,\n Moon,\n PanelLeftClose,\n PanelLeftOpen,\n Paperclip,\n Pause,\n Pencil,\n Play,\n Plug,\n Plus,\n RotateCw,\n Save,\n Search,\n Settings,\n SlidersHorizontal,\n Sparkle,\n SquareArrowOutUpRight,\n SquarePen,\n Sun,\n Terminal,\n Trash2,\n TriangleAlert,\n Wrench,\n X,\n} from 'lucide-react';\nimport type { SVGProps } from 'react';\n\nimport type { IconEntry, IconMap } from '../theme/types.js';\n\n/** Lucide `broom` (https://lucide.dev/icons/broom) — not in lucide-react 0.x. */\nfunction Broom({ size = 24, ...props }: SVGProps<SVGSVGElement> & { size?: string | number }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M13.5 10.5 22 2\" />\n <path d=\"M14.734 13.841a2 2 0 00-.314-2.42L12.58 9.58a2 2 0 00-2.421-.314l-7.657 4.461A1 1 0 002.3 15.3l6.403 6.403a1 1 0 001.571-.204z\" />\n <path d=\"m5 18 2-2\" />\n <path d=\"m7.699 10.7 5.602 5.601\" />\n </svg>\n );\n}\n\nconst registry = new Map<string, IconEntry>();\n\nexport function registerIcon(name: string, icon: IconEntry): void {\n registry.set(name, icon);\n}\n\nexport function registerIcons(icons: IconMap): void {\n for (const [name, icon] of Object.entries(icons)) {\n registry.set(name, icon);\n }\n}\n\nexport function getIcon(name: string): IconEntry | undefined {\n return registry.get(name);\n}\n\nexport function resolveIconName(icon: string | readonly string[]): string {\n if (typeof icon === 'string') return icon;\n // e.g. [\"far\", \"clone\"] → \"clone\"\n return icon[icon.length - 1] ?? '';\n}\n\nconst defaults: Record<string, IconEntry> = {\n paperclip: Paperclip,\n 'arrow-up': ArrowUp,\n 'arrow-down': ArrowDown,\n 'arrow-left': ArrowLeft,\n xmark: X,\n check: Check,\n pencil: Pencil,\n play: Play,\n pause: Pause,\n calendar: Calendar,\n 'calendar-clock': CalendarClock,\n 'calendar-plus': CalendarPlus,\n 'grip-vertical': GripVertical,\n 'square-pen': SquarePen,\n 'rotate-right': RotateCw,\n broom: Broom,\n ellipsis: Ellipsis,\n 'ellipsis-vertical': EllipsisVertical,\n trash: Trash2,\n 'box-archive': Archive,\n 'clock-rotate-left': History,\n 'circle-exclamation': CircleAlert,\n info: Info,\n 'triangle-exclamation': TriangleAlert,\n 'chevron-down': ChevronDown,\n 'chevron-left': ChevronLeft,\n 'chevron-right': ChevronRight,\n 'chevrons-up-down': ChevronsUpDown,\n loader: Loader2,\n file: File,\n clone: Copy,\n copy: Copy,\n 'dollar-sign': DollarSign,\n bars: Menu,\n 'panel-left-close': PanelLeftClose,\n 'panel-left-open': PanelLeftOpen,\n plus: Plus,\n sun: Sun,\n moon: Moon,\n settings: Settings,\n sliders: SlidersHorizontal,\n 'log-out': LogOut,\n search: Search,\n clock: Clock,\n 'circle-check': CircleCheck,\n 'circle-xmark': CircleX,\n 'oauth-success': CircleCheck,\n 'oauth-error': CircleX,\n 'oauth-loading': Loader2,\n 'welcome-sparkle': Sparkle,\n robot: Bot,\n bot: Bot,\n 'library-big': LibraryBig,\n 'message-square-text': MessageSquareText,\n 'book-open': BookOpen,\n funnel: ListFilter,\n plug: Plug,\n 'list-check': ListChecks,\n lock: Lock,\n lightbulb: Lightbulb,\n link: Link2,\n wrench: Wrench,\n cpu: Cpu,\n cube: Box,\n 'list-ol': ListOrdered,\n download: Download,\n save: Save,\n brain: Brain,\n terminal: Terminal,\n code: Code2,\n chart: LineChart,\n expand: Maximize2,\n 'expand-alt': Maximize2,\n compress: Minimize2,\n 'external-link': ExternalLink,\n 'square-arrow-out-up-right': SquareArrowOutUpRight,\n github: Github,\n};\n\nfor (const [name, icon] of Object.entries(defaults)) {\n registry.set(name, icon);\n}\n\n/** Merge host `theme.icons` over the registry for a single lookup (does not mutate). */\nexport function lookupIcon(name: string, themeIcons?: IconMap): IconEntry | undefined {\n if (themeIcons && name in themeIcons) {\n return themeIcons[name];\n }\n return registry.get(name);\n}\n","import React from 'react';\n\nimport { cn } from '../lib/cn.js';\n\nexport type SpinnerProps = React.SVGProps<SVGSVGElement> & {\n size?: number;\n};\n\nexport function Spinner({ size = 16, className, ...props }: SpinnerProps) {\n const r = (size / 2) * 0.75;\n const cx = size / 2;\n const circumference = 2 * Math.PI * r;\n\n return (\n <svg\n role=\"status\"\n aria-label=\"Loading\"\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n fill=\"none\"\n className={cn('animate-spin', className)}\n {...props}\n >\n <circle\n cx={cx}\n cy={cx}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference * 0.75} ${circumference * 0.25}`}\n opacity={0.8}\n />\n </svg>\n );\n}\n","import { cn } from './cn.js';\n\nexport type AuiButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';\nexport type AuiButtonSize = 'large' | 'small' | 'icon';\n\nconst variantClasses: Record<AuiButtonVariant, string> = {\n primary: 'bg-primary-button-bg text-primary-button-text shadow hover:bg-primary-button-hover',\n secondary:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text hover:bg-secondary-button-hover',\n ghost: 'bg-ghost-button-bg text-ghost-button-text hover:bg-ghost-button-hover',\n destructive: 'bg-failure-bg text-failure-text shadow-sm hover:bg-failure-bg/90',\n};\n\n/** Glyph sizes match the shared design-system Button (`iconSizeMap`: large 0.875rem, small 0.75rem). */\nconst sizeClasses: Record<AuiButtonSize, string> = {\n large: 'h-8 gap-2 px-2.5 text-sm [&_svg]:size-3.5',\n small: 'h-6 gap-1 px-1.5 text-xs [&_svg]:size-3',\n icon: 'h-8 w-8 shrink-0 gap-0 p-0 [&_svg]:size-3.5',\n};\n\nconst baseClasses =\n 'inline-flex cursor-pointer items-center justify-center whitespace-nowrap rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50';\n\n/** Sidebar / rail nav control corner radius: 12px. */\nexport const sidebarButtonRadiusClassName = 'rounded-[0.75rem]';\n\n/** Compact sidebar rail control: 66×54px → 4.125rem × 3.375rem. */\nexport const sidebarRailButtonClassName = cn(\n sidebarButtonRadiusClassName,\n 'h-[3.375rem] w-[4rem] shrink-0 flex-col gap-1 whitespace-normal px-0.5 text-[0.625rem] font-normal leading-tight !justify-center shadow-none hover:bg-secondary-button-hover hover:text-ghost-button-text [&_svg]:size-3.5',\n);\n\n/** Shared Button / native `<button>` className helper (SDK utilities are layered). */\nexport function auiButtonClass({\n variant = 'primary',\n size = 'large',\n className,\n}: {\n variant?: AuiButtonVariant;\n size?: AuiButtonSize;\n className?: string;\n} = {}): string {\n return cn(baseClasses, variantClasses[variant], sizeClasses[size], className);\n}\n","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { cn } from './lib/cn.js';\n\n/** Shared title styles for page / chat chrome headers. */\nexport const pageHeaderTitleClassName = 'text-text-primary min-w-0 truncate text-md font-semibold';\n\nexport type PageHeaderProps = {\n /** Page name, or a custom title node (e.g. `NamedAgentHeaderLabel`). Strings use the shared h1 styles. */\n title?: ReactNode;\n /** Leading chrome (back / menu). */\n start?: ReactNode;\n /** Trailing actions; pushed to the end. */\n end?: ReactNode;\n /** Extra content between title and end (prefer `start` / `end` when possible). */\n children?: ReactNode;\n className?: string;\n};\n\n/** Shared shell/page header bar used by chat chrome and list pages.\n * `min-h-14` keeps a single-row bar aligned with Agent Config; wrapping end actions can grow the bar.\n */\nexport function PageHeader({ title, start, end, children, className }: PageHeaderProps) {\n return (\n <header\n className={cn('flex min-h-14 shrink-0 flex-wrap items-center gap-2 border-b border-border px-4', className)}\n >\n {start}\n {typeof title === 'string' ? <h1 className={pageHeaderTitleClassName}>{title}</h1> : title}\n {children}\n {end != null ? <div className=\"ml-auto flex min-w-0 flex-wrap items-center gap-2\">{end}</div> : null}\n </header>\n );\n}\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\nconst CompactLayoutContext = createContext(false);\n\nexport function CompactLayoutProvider({ children }: { children: ReactNode }) {\n return <CompactLayoutContext.Provider value>{children}</CompactLayoutContext.Provider>;\n}\n\nexport function useCompactLayout() {\n return useContext(CompactLayoutContext);\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';\n\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type {\n AgentSkill,\n AgentUIServer,\n ConnectorCatalogEntry,\n ConnectorState,\n ModelSelection,\n} from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\n\ntype DraftCatalogValue = {\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n /** Connector logo URL keyed by connector name, sourced from the discovery catalog. */\n connectorLogos: Record<string, string>;\n loaded: boolean;\n loading: boolean;\n error: string | null;\n /** Kick off catalog fetch (idempotent). Call when a picker opens. */\n ensureLoaded: () => void;\n /** Reload all collections after settings mutate catalog-backed configuration. */\n refresh: () => void;\n /** Refresh connector auth state without reloading unrelated catalogs. */\n refreshConnectors: () => Promise<void>;\n};\n\ntype DraftCatalogContextValue = DraftCatalogValue & {\n server: AgentUIServer | null;\n};\n\nconst DraftCatalogContext = createContext<DraftCatalogContextValue | null>(null);\n\nconst IDLE_ENSURE = () => undefined;\nconst IDLE_REFRESH = async () => undefined;\nconst EMPTY_LOGOS: Record<string, string> = {};\n\nfunction toConnectorLogos(entries: ConnectorCatalogEntry[]): Record<string, string> {\n const logos: Record<string, string> = {};\n for (const entry of entries) {\n if (entry.logo) logos[entry.name] = entry.logo;\n }\n return logos;\n}\n\nexport function DraftCatalogProvider({ children }: { children: ReactNode }) {\n const server = useOptionalServer();\n const existing = useContext(DraftCatalogContext);\n if (existing?.server === server) {\n return children;\n }\n return <DraftCatalogStore server={server}>{children}</DraftCatalogStore>;\n}\n\nfunction DraftCatalogStore({ server, children }: { server: AgentUIServer | null; children: ReactNode }) {\n const [requestEpoch, setRequestEpoch] = useState<number | null>(null);\n const [models, setModels] = useState<ModelSelection[]>([]);\n const [skills, setSkills] = useState<AgentSkill[]>([]);\n const [connectors, setConnectors] = useState<ConnectorState[]>([]);\n const [connectorLogos, setConnectorLogos] = useState<Record<string, string>>(EMPTY_LOGOS);\n const [completedEpoch, setCompletedEpoch] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const ensureLoaded = useCallback(() => {\n setRequestEpoch(current => current ?? 0);\n }, []);\n\n const refresh = useCallback(() => {\n setRequestEpoch(current => (current ?? -1) + 1);\n }, []);\n\n const refreshConnectors = useCallback(async () => {\n if (!server) return;\n setLoading(true);\n setError(null);\n try {\n setConnectors(await server.getMcp());\n } catch (reason: unknown) {\n setError(getErrorMessage(reason, 'Failed to load connectors.'));\n } finally {\n setLoading(false);\n }\n }, [server]);\n\n useEffect(() => {\n if (requestEpoch === null || !server) return;\n let cancelled = false;\n setLoading(true);\n setError(null);\n // Settle each list alone so one failing picker does not blank the others.\n // Logos are cosmetic: a missing catalog port or a failed fetch just falls back to icons.\n const connectorCatalog = server.catalog?.connectorCatalog;\n void Promise.allSettled([\n server.getModels(),\n server.getSkills(),\n server.getMcp(),\n connectorCatalog ? connectorCatalog.getConnectorCatalog() : Promise.resolve([]),\n ]).then(([modelsResult, skillsResult, mcpResult, catalogResult]) => {\n if (cancelled) return;\n setConnectorLogos(catalogResult.status === 'fulfilled' ? toConnectorLogos(catalogResult.value) : EMPTY_LOGOS);\n const errors: string[] = [];\n if (modelsResult.status === 'fulfilled') {\n setModels(modelsResult.value);\n } else {\n errors.push(getErrorMessage(modelsResult.reason, 'Failed to load models.'));\n }\n if (skillsResult.status === 'fulfilled') {\n setSkills(skillsResult.value);\n } else {\n errors.push(getErrorMessage(skillsResult.reason, 'Failed to load skills.'));\n }\n if (mcpResult.status === 'fulfilled') {\n setConnectors(mcpResult.value);\n } else {\n errors.push(getErrorMessage(mcpResult.reason, 'Failed to load connectors.'));\n }\n setError(errors[0] ?? null);\n setCompletedEpoch(requestEpoch);\n setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [requestEpoch, server]);\n\n const loaded = requestEpoch !== null && completedEpoch === requestEpoch;\n const value = useMemo(\n () => ({\n server,\n models,\n skills,\n connectors,\n connectorLogos,\n loaded,\n loading,\n error,\n ensureLoaded,\n refresh,\n refreshConnectors,\n }),\n [\n server,\n models,\n skills,\n connectors,\n connectorLogos,\n loaded,\n loading,\n error,\n ensureLoaded,\n refresh,\n refreshConnectors,\n ],\n );\n\n return <DraftCatalogContext.Provider value={value}>{children}</DraftCatalogContext.Provider>;\n}\n\nexport function useDraftCatalog(): DraftCatalogValue {\n const ctx = useContext(DraftCatalogContext);\n if (ctx == null) {\n return {\n models: [],\n skills: [],\n connectors: [],\n connectorLogos: EMPTY_LOGOS,\n loaded: false,\n loading: false,\n error: null,\n ensureLoaded: IDLE_ENSURE,\n refresh: IDLE_ENSURE,\n refreshConnectors: IDLE_REFRESH,\n };\n }\n return ctx;\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","jsxs","useContext","jsx","createContext","useContext","jsx","createContext","useContext"]}
|