@truefoundry/trueforge-ui 0.1.0-rc.0 → 0.1.0-rc.2
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 +48 -0
- package/dist/{ConnectorSettings-CLBEWGQJ.js → ConnectorSettings-H37ZFC6Z.js} +36 -13
- package/dist/ConnectorSettings-H37ZFC6Z.js.map +1 -0
- package/dist/{DockLayout-WRF7EQLD.js → DockLayout-KEMFRWIR.js} +8 -8
- package/dist/{DrawerLayout-X2UXYTOS.js → DrawerLayout-ZVWCKEIS.js} +8 -8
- package/dist/{ModelSettings-IJ55QJQO.js → ModelSettings-QJMYHCMD.js} +8 -8
- package/dist/{ModelSettings-IJ55QJQO.js.map → ModelSettings-QJMYHCMD.js.map} +1 -1
- package/dist/OpenUiFenceBlock-XFBUGPKQ.js +9 -0
- package/dist/{SandboxSettings-S5XGZWOL.js → SandboxSettings-BUBMLW7Q.js} +160 -66
- package/dist/SandboxSettings-BUBMLW7Q.js.map +1 -0
- package/dist/{SettingsBuilder-64Y33NP3.js → SettingsBuilder-26XSGIHK.js} +25 -17
- package/dist/SettingsBuilder-26XSGIHK.js.map +1 -0
- package/dist/{SidebarLayout-M7HEOZVK.js → SidebarLayout-F3XFXW7B.js} +8 -8
- package/dist/{SkillSettings-MXK4ZEI7.js → SkillSettings-IRMGDFRG.js} +6 -6
- package/dist/{WidgetLayout-7MDOKLHU.js → WidgetLayout-SZMABKIR.js} +8 -8
- package/dist/{chunk-NBMP2XNL.js → chunk-7EEOWDLE.js} +7 -7
- package/dist/chunk-DTF7ZMUJ.js +567 -0
- package/dist/chunk-DTF7ZMUJ.js.map +1 -0
- package/dist/{chunk-UXZOL5GO.js → chunk-H7DR64W3.js} +47 -32
- package/dist/chunk-H7DR64W3.js.map +1 -0
- package/dist/{chunk-42GF723P.js → chunk-HT5HKQXE.js} +2 -2
- package/dist/{chunk-WFC3W4C3.js → chunk-LRQHHZDX.js} +4 -4
- package/dist/{chunk-XSHXH6EI.js → chunk-QGNLP2EE.js} +530 -519
- package/dist/chunk-QGNLP2EE.js.map +1 -0
- package/dist/{chunk-UHGSHDBM.js → chunk-XAZ5HJXV.js} +237 -8
- package/dist/chunk-XAZ5HJXV.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.js +115 -20
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +47 -37
- package/dist/plugins/trueforge-agent-server-adapter/index.js +74 -42
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/ConnectorSettings-CLBEWGQJ.js.map +0 -1
- package/dist/OpenUiFenceBlock-SLLZSTMJ.js +0 -9
- package/dist/SandboxSettings-S5XGZWOL.js.map +0 -1
- package/dist/SettingsBuilder-64Y33NP3.js.map +0 -1
- package/dist/chunk-UBOFEI77.js +0 -567
- package/dist/chunk-UBOFEI77.js.map +0 -1
- package/dist/chunk-UHGSHDBM.js.map +0 -1
- package/dist/chunk-UXZOL5GO.js.map +0 -1
- package/dist/chunk-XSHXH6EI.js.map +0 -1
- /package/dist/{DockLayout-WRF7EQLD.js.map → DockLayout-KEMFRWIR.js.map} +0 -0
- /package/dist/{DrawerLayout-X2UXYTOS.js.map → DrawerLayout-ZVWCKEIS.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-SLLZSTMJ.js.map → OpenUiFenceBlock-XFBUGPKQ.js.map} +0 -0
- /package/dist/{SidebarLayout-M7HEOZVK.js.map → SidebarLayout-F3XFXW7B.js.map} +0 -0
- /package/dist/{SkillSettings-MXK4ZEI7.js.map → SkillSettings-IRMGDFRG.js.map} +0 -0
- /package/dist/{WidgetLayout-7MDOKLHU.js.map → WidgetLayout-SZMABKIR.js.map} +0 -0
- /package/dist/{chunk-NBMP2XNL.js.map → chunk-7EEOWDLE.js.map} +0 -0
- /package/dist/{chunk-42GF723P.js.map → chunk-HT5HKQXE.js.map} +0 -0
- /package/dist/{chunk-WFC3W4C3.js.map → chunk-LRQHHZDX.js.map} +0 -0
|
@@ -5,18 +5,20 @@ import {
|
|
|
5
5
|
AccordionSummary,
|
|
6
6
|
Button,
|
|
7
7
|
CenteredModal,
|
|
8
|
+
Tooltip,
|
|
8
9
|
auiInputClass,
|
|
9
|
-
getErrorMessage,
|
|
10
10
|
useToasterOptional
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-QGNLP2EE.js";
|
|
12
12
|
import {
|
|
13
13
|
Icon,
|
|
14
|
+
Spinner,
|
|
15
|
+
getErrorMessage,
|
|
14
16
|
useCatalogServer
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-XAZ5HJXV.js";
|
|
18
|
+
import "./chunk-HT5HKQXE.js";
|
|
17
19
|
import {
|
|
18
20
|
cn
|
|
19
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-DTF7ZMUJ.js";
|
|
20
22
|
|
|
21
23
|
// src/containers/SettingsBuilder/SandboxSettings.tsx
|
|
22
24
|
import { useCallback, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
|
|
@@ -26,7 +28,6 @@ import { useEffect, useState } from "react";
|
|
|
26
28
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
27
29
|
var EMPTY_CONFIG = {
|
|
28
30
|
// Snapshot/image is release-owned now; kept only to satisfy the external SandboxProviderConfig type.
|
|
29
|
-
snapshotName: "",
|
|
30
31
|
execTimeoutMs: 3e5,
|
|
31
32
|
autoStopIntervalInMinutes: 15,
|
|
32
33
|
autoArchiveIntervalInMinutes: 10080,
|
|
@@ -92,7 +93,6 @@ var ConfigureSandboxForm = ({
|
|
|
92
93
|
try {
|
|
93
94
|
await onSave({
|
|
94
95
|
// Snapshot/image is release-owned; the field is retained only for the external type.
|
|
95
|
-
snapshotName: "",
|
|
96
96
|
execTimeoutMs: execTimeout,
|
|
97
97
|
autoStopIntervalInMinutes: autoStop,
|
|
98
98
|
autoArchiveIntervalInMinutes: autoArchive,
|
|
@@ -253,19 +253,42 @@ var ConfigureSandboxForm_default = ConfigureSandboxForm;
|
|
|
253
253
|
|
|
254
254
|
// src/containers/SettingsBuilder/SandboxSettings.tsx
|
|
255
255
|
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
256
|
+
var SNAPSHOT_STATUS_POLL_INTERVAL_MS = 1e4;
|
|
256
257
|
var configFrom = ({
|
|
257
|
-
snapshotName,
|
|
258
258
|
execTimeoutMs,
|
|
259
259
|
autoStopIntervalInMinutes,
|
|
260
260
|
autoArchiveIntervalInMinutes,
|
|
261
261
|
autoDeleteIntervalInMinutes
|
|
262
262
|
}) => ({
|
|
263
|
-
snapshotName,
|
|
264
263
|
execTimeoutMs,
|
|
265
264
|
autoStopIntervalInMinutes,
|
|
266
265
|
autoArchiveIntervalInMinutes,
|
|
267
266
|
autoDeleteIntervalInMinutes
|
|
268
267
|
});
|
|
268
|
+
var statusPresentation = (status) => {
|
|
269
|
+
switch (status) {
|
|
270
|
+
case "pending":
|
|
271
|
+
return {
|
|
272
|
+
label: "Syncing image...",
|
|
273
|
+
className: "text-warning-bg"
|
|
274
|
+
};
|
|
275
|
+
case "ready":
|
|
276
|
+
return {
|
|
277
|
+
label: "Connected",
|
|
278
|
+
className: "text-success-bg"
|
|
279
|
+
};
|
|
280
|
+
case "failed":
|
|
281
|
+
return {
|
|
282
|
+
label: "Sync failed",
|
|
283
|
+
className: "text-failure-bg"
|
|
284
|
+
};
|
|
285
|
+
default:
|
|
286
|
+
return {
|
|
287
|
+
label: status,
|
|
288
|
+
className: "text-text-secondary"
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
};
|
|
269
292
|
var SandboxSettings = () => {
|
|
270
293
|
const { sandboxCatalog } = useCatalogServer();
|
|
271
294
|
const toaster = useToasterOptional();
|
|
@@ -300,10 +323,44 @@ var SandboxSettings = () => {
|
|
|
300
323
|
useEffect2(() => {
|
|
301
324
|
void refresh();
|
|
302
325
|
}, [refresh]);
|
|
326
|
+
const hasPendingProvider = providers.some((entry) => entry.snapshotSyncStatus.status === "pending");
|
|
327
|
+
useEffect2(() => {
|
|
328
|
+
if (!sandboxCatalog || !hasPendingProvider) return;
|
|
329
|
+
const activeSandboxCatalog = sandboxCatalog;
|
|
330
|
+
let cancelled = false;
|
|
331
|
+
let timeoutId;
|
|
332
|
+
function schedulePoll() {
|
|
333
|
+
timeoutId = window.setTimeout(() => {
|
|
334
|
+
void poll();
|
|
335
|
+
}, SNAPSHOT_STATUS_POLL_INTERVAL_MS);
|
|
336
|
+
}
|
|
337
|
+
async function poll() {
|
|
338
|
+
try {
|
|
339
|
+
const listed = await activeSandboxCatalog.listSandboxProviders();
|
|
340
|
+
if (cancelled) return;
|
|
341
|
+
setProviders(listed);
|
|
342
|
+
setError(null);
|
|
343
|
+
if (listed.some((entry) => entry.snapshotSyncStatus.status === "pending")) {
|
|
344
|
+
schedulePoll();
|
|
345
|
+
}
|
|
346
|
+
} catch (err) {
|
|
347
|
+
if (cancelled) return;
|
|
348
|
+
setError(getErrorMessage(err, "Failed to refresh sandbox providers"));
|
|
349
|
+
schedulePoll();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
schedulePoll();
|
|
353
|
+
return () => {
|
|
354
|
+
cancelled = true;
|
|
355
|
+
if (timeoutId !== void 0) {
|
|
356
|
+
window.clearTimeout(timeoutId);
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
}, [sandboxCatalog, hasPendingProvider]);
|
|
303
360
|
const hasConfiguredProvider = providers.length > 0;
|
|
304
361
|
const availableEntries = useMemo(() => {
|
|
305
362
|
if (hasConfiguredProvider) return [];
|
|
306
|
-
const connectedCatalogIds = new Set(providers.map((provider) => provider.catalogId));
|
|
363
|
+
const connectedCatalogIds = new Set(providers.map((provider) => provider.data.catalogId));
|
|
307
364
|
return catalog.filter((entry) => !connectedCatalogIds.has(entry.id));
|
|
308
365
|
}, [catalog, providers, hasConfiguredProvider]);
|
|
309
366
|
const formInitialConfig = useMemo(
|
|
@@ -358,6 +415,15 @@ var SandboxSettings = () => {
|
|
|
358
415
|
toaster?.showSuccess({ title: `${updateProvider.name} updated` });
|
|
359
416
|
}, 0);
|
|
360
417
|
};
|
|
418
|
+
const handleRetry = (provider) => {
|
|
419
|
+
void runMutation(async () => {
|
|
420
|
+
await sandboxCatalog.updateSandboxProvider({
|
|
421
|
+
id: provider.id,
|
|
422
|
+
...configFrom(provider)
|
|
423
|
+
});
|
|
424
|
+
}).catch(() => {
|
|
425
|
+
});
|
|
426
|
+
};
|
|
361
427
|
const handleRemove = (provider) => {
|
|
362
428
|
const deleteSandboxProvider = sandboxCatalog.deleteSandboxProvider;
|
|
363
429
|
if (!deleteSandboxProvider) return;
|
|
@@ -379,61 +445,89 @@ var SandboxSettings = () => {
|
|
|
379
445
|
"Configured \xB7 ",
|
|
380
446
|
providers.length
|
|
381
447
|
] }),
|
|
382
|
-
/* @__PURE__ */ jsx2("div", { className: "overflow-hidden rounded-xl border border-border bg-card-bg", children: providers.map((
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
448
|
+
/* @__PURE__ */ jsx2("div", { className: "overflow-hidden rounded-xl border border-border bg-card-bg", children: providers.map((entry) => {
|
|
449
|
+
const provider = entry.data;
|
|
450
|
+
const status = statusPresentation(entry.snapshotSyncStatus.status);
|
|
451
|
+
const statusReason = entry.snapshotSyncStatus.statusReason;
|
|
452
|
+
const statusIndicator = /* @__PURE__ */ jsxs2("span", { className: `inline-flex items-center gap-1.5 text-sm font-medium ${status.className}`, children: [
|
|
453
|
+
entry.snapshotSyncStatus.status === "pending" ? /* @__PURE__ */ jsx2(Spinner, { size: 16, "aria-label": "Syncing snapshot image" }) : entry.snapshotSyncStatus.status === "ready" ? /* @__PURE__ */ jsx2("span", { className: "size-2 rounded-full bg-success-bg", "aria-hidden": true }) : entry.snapshotSyncStatus.status === "failed" ? /* @__PURE__ */ jsx2(Icon, { name: "triangle-exclamation", className: "size-4" }) : null,
|
|
454
|
+
status.label
|
|
455
|
+
] });
|
|
456
|
+
return /* @__PURE__ */ jsxs2(
|
|
457
|
+
"article",
|
|
458
|
+
{
|
|
459
|
+
className: "flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center",
|
|
460
|
+
children: [
|
|
461
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
|
|
462
|
+
/* @__PURE__ */ jsx2(
|
|
463
|
+
"span",
|
|
464
|
+
{
|
|
465
|
+
className: "flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary",
|
|
466
|
+
"aria-hidden": true,
|
|
467
|
+
children: /* @__PURE__ */ jsx2(Icon, { name: "cube", className: "size-4.5" })
|
|
468
|
+
}
|
|
469
|
+
),
|
|
470
|
+
/* @__PURE__ */ jsx2("div", { className: "min-w-0", children: /* @__PURE__ */ jsx2("h5", { className: "truncate text-sm font-medium text-text-primary", children: provider.name }) })
|
|
471
|
+
] }),
|
|
472
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center gap-2.5 sm:justify-end", children: [
|
|
473
|
+
statusIndicator,
|
|
474
|
+
statusReason ? /* @__PURE__ */ jsx2(Tooltip, { content: statusReason, children: /* @__PURE__ */ jsx2(
|
|
475
|
+
"button",
|
|
476
|
+
{
|
|
477
|
+
type: "button",
|
|
478
|
+
"aria-label": "Snapshot sync status details",
|
|
479
|
+
className: "inline-flex text-text-secondary transition-colors hover:text-text-primary",
|
|
480
|
+
children: /* @__PURE__ */ jsx2(Icon, { name: "info", className: "size-4" })
|
|
481
|
+
}
|
|
482
|
+
) }) : null,
|
|
483
|
+
entry.snapshotSyncStatus.status === "failed" ? /* @__PURE__ */ jsx2(
|
|
484
|
+
Button,
|
|
485
|
+
{
|
|
486
|
+
variant: "ghost",
|
|
487
|
+
size: "sm",
|
|
488
|
+
type: "button",
|
|
489
|
+
disabled: busy,
|
|
490
|
+
onClick: () => {
|
|
491
|
+
handleRetry(provider);
|
|
492
|
+
},
|
|
493
|
+
children: "Retry"
|
|
494
|
+
}
|
|
495
|
+
) : null,
|
|
496
|
+
/* @__PURE__ */ jsx2(
|
|
497
|
+
Button,
|
|
498
|
+
{
|
|
499
|
+
variant: "secondary",
|
|
500
|
+
size: "sm",
|
|
501
|
+
type: "button",
|
|
502
|
+
disabled: busy,
|
|
503
|
+
onClick: () => {
|
|
504
|
+
setFormError(null);
|
|
505
|
+
setCreateEntry(null);
|
|
506
|
+
setUpdateProvider(provider);
|
|
507
|
+
},
|
|
508
|
+
children: "Update"
|
|
509
|
+
}
|
|
510
|
+
),
|
|
511
|
+
sandboxCatalog.deleteSandboxProvider ? /* @__PURE__ */ jsx2(
|
|
512
|
+
Button,
|
|
513
|
+
{
|
|
514
|
+
variant: "ghost",
|
|
515
|
+
size: "sm",
|
|
516
|
+
className: "text-text-secondary",
|
|
517
|
+
type: "button",
|
|
518
|
+
disabled: busy,
|
|
519
|
+
onClick: () => {
|
|
520
|
+
handleRemove(provider);
|
|
521
|
+
},
|
|
522
|
+
children: "Remove"
|
|
523
|
+
}
|
|
524
|
+
) : null
|
|
525
|
+
] })
|
|
526
|
+
]
|
|
527
|
+
},
|
|
528
|
+
provider.id
|
|
529
|
+
);
|
|
530
|
+
}) })
|
|
437
531
|
] }) : null,
|
|
438
532
|
!hasConfiguredProvider ? /* @__PURE__ */ jsxs2("section", { children: [
|
|
439
533
|
/* @__PURE__ */ jsxs2("h4", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary", children: [
|
|
@@ -502,4 +596,4 @@ var SandboxSettings_default = SandboxSettings;
|
|
|
502
596
|
export {
|
|
503
597
|
SandboxSettings_default as default
|
|
504
598
|
};
|
|
505
|
-
//# sourceMappingURL=SandboxSettings-
|
|
599
|
+
//# sourceMappingURL=SandboxSettings-BUBMLW7Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/SettingsBuilder/SandboxSettings.tsx","../src/containers/SettingsBuilder/ConfigureSandboxForm.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Spinner } from '@/atoms/primitives/Spinner.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { Tooltip } from '../../atoms/primitives/Tooltip.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useCatalogServer } from '../../server/ServerContext.js';\nimport type {\n SandboxProviderBase,\n SandboxProviderCatalogEntry,\n SandboxProviderConfig,\n SandboxProviderListEntry,\n SandboxSnapshotSyncStatus,\n} from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { useToasterOptional } from '../ToasterContainer.js';\nimport ConfigureSandboxForm, { type SandboxConfigDraft } from './ConfigureSandboxForm.js';\n\nconst SNAPSHOT_STATUS_POLL_INTERVAL_MS = 10000;\n\nconst configFrom = ({\n execTimeoutMs,\n autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes,\n}: SandboxProviderConfig): SandboxProviderConfig => ({\n execTimeoutMs,\n autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes,\n});\n\nconst statusPresentation = (status: SandboxSnapshotSyncStatus['status']): { label: string; className: string } => {\n switch (status) {\n case 'pending':\n return {\n label: 'Syncing image...',\n className: 'text-warning-bg',\n };\n case 'ready':\n return {\n label: 'Connected',\n className: 'text-success-bg',\n };\n case 'failed':\n return {\n label: 'Sync failed',\n className: 'text-failure-bg',\n };\n default:\n return {\n label: status,\n className: 'text-text-secondary',\n };\n }\n};\n\nconst SandboxSettings = () => {\n const { sandboxCatalog } = useCatalogServer();\n const toaster = useToasterOptional();\n\n const [providers, setProviders] = useState<SandboxProviderListEntry[]>([]);\n const [catalog, setCatalog] = useState<SandboxProviderCatalogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const [createEntry, setCreateEntry] = useState<SandboxProviderCatalogEntry | null>(null);\n const [updateProvider, setUpdateProvider] = useState<SandboxProviderBase | null>(null);\n\n const refresh = useCallback(\n async ({ quiet = false }: { quiet?: boolean } = {}) => {\n if (!sandboxCatalog) return;\n if (!quiet) setLoading(true);\n setError(null);\n try {\n const [listed, available] = await Promise.all([\n sandboxCatalog.listSandboxProviders(),\n sandboxCatalog.getSandboxProviderCatalog(),\n ]);\n setProviders(listed);\n setCatalog(available);\n } catch (err) {\n setError(getErrorMessage(err, 'Failed to load sandbox providers'));\n } finally {\n if (!quiet) setLoading(false);\n }\n },\n [sandboxCatalog],\n );\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const hasPendingProvider = providers.some(entry => entry.snapshotSyncStatus.status === 'pending');\n\n useEffect(() => {\n if (!sandboxCatalog || !hasPendingProvider) return;\n const activeSandboxCatalog = sandboxCatalog;\n\n let cancelled = false;\n let timeoutId: number | undefined;\n\n function schedulePoll() {\n timeoutId = window.setTimeout(() => {\n void poll();\n }, SNAPSHOT_STATUS_POLL_INTERVAL_MS);\n }\n\n async function poll() {\n try {\n const listed = await activeSandboxCatalog.listSandboxProviders();\n if (cancelled) return;\n setProviders(listed);\n setError(null);\n if (listed.some(entry => entry.snapshotSyncStatus.status === 'pending')) {\n schedulePoll();\n }\n } catch (err) {\n if (cancelled) return;\n setError(getErrorMessage(err, 'Failed to refresh sandbox providers'));\n schedulePoll();\n }\n }\n\n schedulePoll();\n return () => {\n cancelled = true;\n if (timeoutId !== undefined) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [sandboxCatalog, hasPendingProvider]);\n\n // Tenant/UI-wide: only one sandbox provider may be configured at a time.\n const hasConfiguredProvider = providers.length > 0;\n const availableEntries = useMemo(() => {\n if (hasConfiguredProvider) return [];\n const connectedCatalogIds = new Set(providers.map(provider => provider.data.catalogId));\n return catalog.filter(entry => !connectedCatalogIds.has(entry.id));\n }, [catalog, providers, hasConfiguredProvider]);\n\n const formInitialConfig = useMemo(\n () => (updateProvider ? configFrom(updateProvider) : createEntry ? configFrom(createEntry) : null),\n [updateProvider, createEntry],\n );\n\n if (!sandboxCatalog) {\n return <p className=\"text-sm text-text-secondary\">Sandbox provider catalog is not available.</p>;\n }\n\n const runMutation = async (fn: () => Promise<void>, setMutationError = setError) => {\n setBusy(true);\n setError(null);\n try {\n await fn();\n await refresh({ quiet: true });\n } catch (err) {\n setMutationError(getErrorMessage(err, 'Request failed'));\n throw err;\n } finally {\n setBusy(false);\n }\n };\n\n const handleCreate = async (draft: SandboxConfigDraft) => {\n if (!createEntry) return;\n setFormError(null);\n await runMutation(async () => {\n await sandboxCatalog.createSandboxProvider({\n catalogId: createEntry.id,\n name: createEntry.name,\n type: createEntry.type,\n ...configFrom(draft),\n apiKey: draft.apiKey,\n });\n }, setFormError);\n setCreateEntry(null);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${createEntry.name} configured` });\n }, 0);\n };\n\n const handleUpdate = async (draft: SandboxConfigDraft) => {\n if (!updateProvider) return;\n setFormError(null);\n await runMutation(async () => {\n await sandboxCatalog.updateSandboxProvider({\n id: updateProvider.id,\n ...configFrom(draft),\n ...(draft.apiKey ? { apiKey: draft.apiKey } : {}),\n });\n }, setFormError);\n setUpdateProvider(null);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${updateProvider.name} updated` });\n }, 0);\n };\n\n const handleRetry = (provider: SandboxProviderBase) => {\n void runMutation(async () => {\n await sandboxCatalog.updateSandboxProvider({\n id: provider.id,\n ...configFrom(provider),\n });\n }).catch(() => {});\n };\n\n const handleRemove = (provider: SandboxProviderBase) => {\n const deleteSandboxProvider = sandboxCatalog.deleteSandboxProvider;\n if (!deleteSandboxProvider) return;\n void runMutation(async () => {\n await deleteSandboxProvider({ id: provider.id });\n }).catch(() => {});\n };\n\n const formOpen = createEntry != null || updateProvider != null;\n const isUpdate = updateProvider != null;\n const formTitle = updateProvider\n ? `Update ${updateProvider.name}`\n : createEntry\n ? `Configure ${createEntry.name}`\n : 'Configure sandbox provider';\n\n return (\n <>\n <h3 className=\"text-xl font-semibold tracking-tight text-text-primary\">Sandbox providers</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Choose a provider that runs sandboxes for code, files and shell commands. Only one can be active at a time.\n </p>\n\n {error ? (\n <p className=\"mt-3 rounded-md border border-failure-bg/30 bg-failure-bg/10 px-3 py-2 text-sm text-failure-bg\">\n {error}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex-1 overflow-y-auto\">\n {loading ? (\n <p className=\"text-sm text-text-secondary\">Loading sandbox providers…</p>\n ) : (\n <div className=\"space-y-6\">\n {providers.length > 0 ? (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Configured · {providers.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {providers.map(entry => {\n const provider = entry.data;\n const status = statusPresentation(entry.snapshotSyncStatus.status);\n const statusReason = entry.snapshotSyncStatus.statusReason;\n const statusIndicator = (\n <span className={`inline-flex items-center gap-1.5 text-sm font-medium ${status.className}`}>\n {entry.snapshotSyncStatus.status === 'pending' ? (\n <Spinner size={16} aria-label=\"Syncing snapshot image\" />\n ) : entry.snapshotSyncStatus.status === 'ready' ? (\n <span className=\"size-2 rounded-full bg-success-bg\" aria-hidden />\n ) : entry.snapshotSyncStatus.status === 'failed' ? (\n <Icon name=\"triangle-exclamation\" className=\"size-4\" />\n ) : null}\n {status.label}\n </span>\n );\n return (\n <article\n key={provider.id}\n className=\"flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"cube\" className=\"size-4.5\" />\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{provider.name}</h5>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2.5 sm:justify-end\">\n {statusIndicator}\n {statusReason ? (\n <Tooltip content={statusReason}>\n <button\n type=\"button\"\n aria-label=\"Snapshot sync status details\"\n className=\"inline-flex text-text-secondary transition-colors hover:text-text-primary\"\n >\n <Icon name=\"info\" className=\"size-4\" />\n </button>\n </Tooltip>\n ) : null}\n {entry.snapshotSyncStatus.status === 'failed' ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleRetry(provider);\n }}\n >\n Retry\n </Button>\n ) : null}\n <Button\n variant=\"secondary\"\n size=\"sm\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setFormError(null);\n setCreateEntry(null);\n setUpdateProvider(provider);\n }}\n >\n Update\n </Button>\n\n {sandboxCatalog.deleteSandboxProvider ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-text-secondary\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleRemove(provider);\n }}\n >\n Remove\n </Button>\n ) : null}\n </div>\n </article>\n );\n })}\n </div>\n </section>\n ) : null}\n\n {!hasConfiguredProvider ? (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Available · {availableEntries.length}\n </h4>\n {availableEntries.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {catalog.length > 0\n ? 'All catalog providers are configured.'\n : 'No sandbox providers in the catalog.'}\n </p>\n ) : (\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {availableEntries.map(entry => (\n <article\n key={entry.id}\n className=\"flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"cube\" className=\"size-4.5\" />\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{entry.name}</h5>\n </div>\n </div>\n\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setFormError(null);\n setUpdateProvider(null);\n setCreateEntry(entry);\n }}\n >\n Configure\n </Button>\n </article>\n ))}\n </div>\n )}\n </section>\n ) : null}\n </div>\n )}\n </div>\n\n <ConfigureSandboxForm\n open={formOpen}\n onOpenChange={open => {\n if (!open) {\n setFormError(null);\n setCreateEntry(null);\n setUpdateProvider(null);\n }\n }}\n onSave={isUpdate ? handleUpdate : handleCreate}\n title={formTitle}\n description={\n isUpdate\n ? 'Update this sandbox provider. Leave API key blank to keep the existing key.'\n : 'Configure this sandbox provider. API key is never stored in the catalog.'\n }\n initialConfig={formInitialConfig}\n requireApiKey={!isUpdate}\n busy={busy}\n error={formError}\n />\n </>\n );\n};\n\nexport default SandboxSettings;\n","'use client';\n\nimport { useEffect, useState, type FormEvent } from 'react';\n\nimport { cn } from '../../atoms/lib/cn.js';\nimport { auiInputClass } from '../../atoms/lib/inputClasses.js';\nimport { Accordion, AccordionDetails, AccordionSummary } from '../../atoms/primitives/Accordion.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { CenteredModal } from '../../atoms/primitives/CenteredModal.js';\nimport { Icon } from '../../icons/Icon.js';\nimport type { SandboxProviderConfig } from '../../server/types.js';\n\nexport type SandboxConfigDraft = SandboxProviderConfig & {\n apiKey: string;\n};\n\ntype ConfigureSandboxFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (draft: SandboxConfigDraft) => void | Promise<void>;\n title: string;\n description?: string;\n /** Prefills config fields; apiKey is never autofilled. */\n initialConfig?: SandboxProviderConfig | null;\n /** When false (updates), empty apiKey means keep the existing key. */\n requireApiKey?: boolean;\n busy?: boolean;\n error?: string | null;\n};\n\n/** Sensible defaults so the advanced fields are never blank, even without a catalog preset. */\nconst EMPTY_CONFIG: SandboxProviderConfig = {\n // Snapshot/image is release-owned now; kept only to satisfy the external SandboxProviderConfig type.\n execTimeoutMs: 300000,\n autoStopIntervalInMinutes: 15,\n autoArchiveIntervalInMinutes: 10080,\n autoDeleteIntervalInMinutes: 43200,\n};\n\nconst inputClassName = auiInputClass('h-11 shadow-sm');\n\nfunction parseNonNegInt(raw: string): number | null {\n if (raw.trim() === '') return null;\n const n = Number(raw);\n if (!Number.isFinite(n) || n < 0) return null;\n return n;\n}\n\nconst ConfigureSandboxForm = ({\n open,\n onOpenChange,\n onSave,\n title,\n description,\n initialConfig = null,\n requireApiKey = true,\n busy = false,\n error,\n}: ConfigureSandboxFormProps) => {\n const [execTimeoutMs, setExecTimeoutMs] = useState('');\n const [autoStopIntervalInMinutes, setAutoStopIntervalInMinutes] = useState('');\n const [autoArchiveIntervalInMinutes, setAutoArchiveIntervalInMinutes] = useState('');\n const [autoDeleteIntervalInMinutes, setAutoDeleteIntervalInMinutes] = useState('');\n const [apiKey, setApiKey] = useState('');\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n const resetForm = () => {\n setExecTimeoutMs('');\n setAutoStopIntervalInMinutes('');\n setAutoArchiveIntervalInMinutes('');\n setAutoDeleteIntervalInMinutes('');\n setApiKey('');\n setAdvancedOpen(false);\n };\n\n useEffect(() => {\n if (!open) return;\n const config = initialConfig ?? EMPTY_CONFIG;\n setExecTimeoutMs(String(config.execTimeoutMs));\n setAutoStopIntervalInMinutes(String(config.autoStopIntervalInMinutes));\n setAutoArchiveIntervalInMinutes(String(config.autoArchiveIntervalInMinutes));\n setAutoDeleteIntervalInMinutes(String(config.autoDeleteIntervalInMinutes));\n setApiKey('');\n setAdvancedOpen(false);\n }, [open, initialConfig]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen) resetForm();\n onOpenChange(nextOpen);\n };\n\n const execTimeout = parseNonNegInt(execTimeoutMs);\n const autoStop = parseNonNegInt(autoStopIntervalInMinutes);\n const autoArchive = parseNonNegInt(autoArchiveIntervalInMinutes);\n const autoDelete = parseNonNegInt(autoDeleteIntervalInMinutes);\n const trimmedKey = apiKey.trim();\n\n const isValid =\n (!requireApiKey || !!trimmedKey) &&\n execTimeout != null &&\n autoStop != null &&\n autoArchive != null &&\n autoDelete != null;\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!isValid || busy || execTimeout == null || autoStop == null || autoArchive == null || autoDelete == null) {\n return;\n }\n\n try {\n await onSave({\n // Snapshot/image is release-owned; the field is retained only for the external type.\n execTimeoutMs: execTimeout,\n autoStopIntervalInMinutes: autoStop,\n autoArchiveIntervalInMinutes: autoArchive,\n autoDeleteIntervalInMinutes: autoDelete,\n apiKey: trimmedKey,\n });\n resetForm();\n onOpenChange(false);\n } catch {\n // Parent surfaces error; keep form open.\n }\n };\n\n return (\n <CenteredModal\n open={open}\n onOpenChange={handleOpenChange}\n title={title}\n description={description}\n contentSized\n headerIcon={\n <span\n className=\"flex size-11 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"cube\" className=\"size-6\" />\n </span>\n }\n >\n <form className=\"flex flex-col overflow-y-auto p-5 md:p-6\" onSubmit={handleSubmit}>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"sandbox-api-key\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n API key\n {!requireApiKey ? <span className=\"font-normal text-text-secondary\"> (optional)</span> : null}\n </label>\n <input\n id=\"sandbox-api-key\"\n type=\"password\"\n required={requireApiKey}\n value={apiKey}\n onChange={event => {\n setApiKey(event.target.value);\n }}\n placeholder={requireApiKey ? 'dtn_...' : 'Leave blank to keep existing'}\n autoFocus\n className={inputClassName}\n />\n </div>\n\n <Accordion\n expanded={advancedOpen}\n onChange={(_event, next) => setAdvancedOpen(next)}\n className=\"rounded-md border border-border\"\n >\n <AccordionSummary className=\"px-3 py-2.5\">\n <span className=\"flex w-full items-center justify-between text-sm font-medium text-text-primary\">\n Advanced settings\n <Icon\n name=\"chevron-down\"\n className={cn(\n 'size-4 shrink-0 text-text-secondary transition-transform duration-200',\n advancedOpen ? 'rotate-0' : '-rotate-90',\n )}\n />\n </span>\n </AccordionSummary>\n <AccordionDetails className=\"space-y-4 border-t border-border px-3 pb-3 pt-4\">\n <div>\n <label htmlFor=\"sandbox-exec-timeout\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Exec timeout (ms)\n </label>\n <input\n id=\"sandbox-exec-timeout\"\n type=\"number\"\n min={0}\n required\n value={execTimeoutMs}\n onChange={event => {\n setExecTimeoutMs(event.target.value);\n }}\n placeholder=\"300000\"\n className={inputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"sandbox-auto-stop\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Auto-stop interval (minutes)\n </label>\n <input\n id=\"sandbox-auto-stop\"\n type=\"number\"\n min={0}\n required\n value={autoStopIntervalInMinutes}\n onChange={event => {\n setAutoStopIntervalInMinutes(event.target.value);\n }}\n placeholder=\"15\"\n className={inputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"sandbox-auto-archive\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Auto-archive interval (minutes)\n </label>\n <input\n id=\"sandbox-auto-archive\"\n type=\"number\"\n min={0}\n required\n value={autoArchiveIntervalInMinutes}\n onChange={event => {\n setAutoArchiveIntervalInMinutes(event.target.value);\n }}\n placeholder=\"10080\"\n className={inputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"sandbox-auto-delete\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Auto-delete interval (minutes)\n </label>\n <input\n id=\"sandbox-auto-delete\"\n type=\"number\"\n min={0}\n required\n value={autoDeleteIntervalInMinutes}\n onChange={event => {\n setAutoDeleteIntervalInMinutes(event.target.value);\n }}\n placeholder=\"43200\"\n className={inputClassName}\n />\n </div>\n </AccordionDetails>\n </Accordion>\n </div>\n\n <div className=\"mt-6 space-y-3\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button type=\"submit\" size=\"lg\" disabled={!isValid || busy} className=\"w-full shrink-0\">\n Save\n </Button>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default ConfigureSandboxForm;\n"],"mappings":"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","names":["useEffect","useState","jsx","jsxs","useState","useEffect"]}
|
|
@@ -4,20 +4,22 @@ import {
|
|
|
4
4
|
Spinner,
|
|
5
5
|
auiButtonClass,
|
|
6
6
|
useCompactLayout,
|
|
7
|
+
useDraftCatalog,
|
|
7
8
|
useOptionalCatalogServer,
|
|
9
|
+
useOptionalRefreshServerCapabilities,
|
|
8
10
|
useShellMode
|
|
9
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-XAZ5HJXV.js";
|
|
10
12
|
import {
|
|
11
13
|
cn
|
|
12
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DTF7ZMUJ.js";
|
|
13
15
|
|
|
14
16
|
// src/containers/SettingsBuilder/index.tsx
|
|
15
|
-
import { lazy, Suspense, useEffect, useMemo
|
|
17
|
+
import { lazy, Suspense, useCallback, useEffect, useMemo } from "react";
|
|
16
18
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
-
var ModelSettings = lazy(() => import("./ModelSettings-
|
|
18
|
-
var ConnectorSettings = lazy(() => import("./ConnectorSettings-
|
|
19
|
-
var SkillSettings = lazy(() => import("./SkillSettings-
|
|
20
|
-
var SandboxSettings = lazy(() => import("./SandboxSettings-
|
|
19
|
+
var ModelSettings = lazy(() => import("./ModelSettings-QJMYHCMD.js"));
|
|
20
|
+
var ConnectorSettings = lazy(() => import("./ConnectorSettings-H37ZFC6Z.js"));
|
|
21
|
+
var SkillSettings = lazy(() => import("./SkillSettings-IRMGDFRG.js"));
|
|
22
|
+
var SandboxSettings = lazy(() => import("./SandboxSettings-BUBMLW7Q.js"));
|
|
21
23
|
function SettingsSectionFallback() {
|
|
22
24
|
return /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center justify-center py-8", role: "status", "aria-live": "polite", "aria-busy": "true", children: [
|
|
23
25
|
/* @__PURE__ */ jsx(Spinner, { size: 20, className: "text-text-secondary" }),
|
|
@@ -25,30 +27,36 @@ function SettingsSectionFallback() {
|
|
|
25
27
|
] });
|
|
26
28
|
}
|
|
27
29
|
var TruefoundrySettingsBuilder = () => {
|
|
28
|
-
const { settingsOpen, setSettingsOpen } = useShellMode();
|
|
30
|
+
const { settingsOpen, settingsSection: section, setSettingsOpen } = useShellMode();
|
|
29
31
|
const catalog = useOptionalCatalogServer();
|
|
32
|
+
const refreshServerCapabilities = useOptionalRefreshServerCapabilities();
|
|
33
|
+
const { refresh: refreshDraftCatalog } = useDraftCatalog();
|
|
30
34
|
const compact = useCompactLayout();
|
|
31
|
-
const [section, setSection] = useState("models");
|
|
32
35
|
const hasSkills = catalog?.skillCatalog != null;
|
|
33
36
|
const hasSandbox = catalog?.sandboxCatalog != null;
|
|
37
|
+
const closeSettings = useCallback(() => {
|
|
38
|
+
setSettingsOpen(false);
|
|
39
|
+
refreshDraftCatalog();
|
|
40
|
+
refreshServerCapabilities?.();
|
|
41
|
+
}, [refreshDraftCatalog, refreshServerCapabilities, setSettingsOpen]);
|
|
34
42
|
useEffect(() => {
|
|
35
43
|
if (!hasSkills && section === "skills") {
|
|
36
|
-
|
|
44
|
+
setSettingsOpen(settingsOpen, "models");
|
|
37
45
|
}
|
|
38
46
|
if (!hasSandbox && section === "sandbox") {
|
|
39
|
-
|
|
47
|
+
setSettingsOpen(settingsOpen, "models");
|
|
40
48
|
}
|
|
41
|
-
}, [hasSkills, hasSandbox, section]);
|
|
49
|
+
}, [hasSkills, hasSandbox, section, settingsOpen, setSettingsOpen]);
|
|
42
50
|
useEffect(() => {
|
|
43
51
|
if (!settingsOpen) return;
|
|
44
52
|
const onKeyDown = (event) => {
|
|
45
53
|
if (event.key !== "Escape") return;
|
|
46
54
|
event.stopImmediatePropagation();
|
|
47
|
-
|
|
55
|
+
closeSettings();
|
|
48
56
|
};
|
|
49
57
|
window.addEventListener("keydown", onKeyDown, true);
|
|
50
58
|
return () => window.removeEventListener("keydown", onKeyDown, true);
|
|
51
|
-
}, [
|
|
59
|
+
}, [closeSettings, settingsOpen]);
|
|
52
60
|
const sections = useMemo(() => {
|
|
53
61
|
const baseSections = [
|
|
54
62
|
{ id: "models", label: "Models", icon: "cpu" },
|
|
@@ -72,7 +80,7 @@ var TruefoundrySettingsBuilder = () => {
|
|
|
72
80
|
"aria-label": "Back",
|
|
73
81
|
title: "Back",
|
|
74
82
|
className: auiButtonClass({ variant: "ghost", size: "icon" }),
|
|
75
|
-
onClick:
|
|
83
|
+
onClick: closeSettings,
|
|
76
84
|
children: /* @__PURE__ */ jsx(Icon, { name: "arrow-left" })
|
|
77
85
|
}
|
|
78
86
|
),
|
|
@@ -101,7 +109,7 @@ var TruefoundrySettingsBuilder = () => {
|
|
|
101
109
|
section === item.id ? "bg-primary-button-bg text-primary-button-text" : "text-text-secondary hover:bg-ghost-button-hover/60 hover:text-text-primary"
|
|
102
110
|
),
|
|
103
111
|
onClick: () => {
|
|
104
|
-
|
|
112
|
+
setSettingsOpen(true, item.id);
|
|
105
113
|
},
|
|
106
114
|
children: [
|
|
107
115
|
/* @__PURE__ */ jsx(Icon, { name: item.icon, className: "h-4 w-4 shrink-0" }),
|
|
@@ -125,4 +133,4 @@ var SettingsBuilder_default = TruefoundrySettingsBuilder;
|
|
|
125
133
|
export {
|
|
126
134
|
SettingsBuilder_default as default
|
|
127
135
|
};
|
|
128
|
-
//# sourceMappingURL=SettingsBuilder-
|
|
136
|
+
//# sourceMappingURL=SettingsBuilder-26XSGIHK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/SettingsBuilder/index.tsx"],"sourcesContent":["'use client';\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo } from 'react';\n\nimport { useDraftCatalog } from '@/atoms/draft/DraftCatalogProvider.js';\nimport { auiButtonClass } from '@/atoms/lib/buttonClasses.js';\nimport { cn } from '@/atoms/lib/cn.js';\nimport { useCompactLayout } from '@/atoms/lib/CompactLayoutContext.js';\nimport { Spinner } from '@/atoms/primitives/Spinner.js';\nimport { Icon } from '@/icons/Icon.js';\nimport { useOptionalCatalogServer, useOptionalRefreshServerCapabilities } from '@/server/ServerContext.js';\nimport { useShellMode, type SettingsSection } from '@/server/ShellModeContext.js';\n\n// Section modules (and their list/catalog APIs) load only when that tab mounts.\nconst ModelSettings = lazy(() => import('./ModelSettings.js'));\nconst ConnectorSettings = lazy(() => import('./ConnectorSettings.js'));\nconst SkillSettings = lazy(() => import('./SkillSettings.js'));\nconst SandboxSettings = lazy(() => import('./SandboxSettings.js'));\n\nfunction SettingsSectionFallback() {\n return (\n <div className=\"flex flex-1 items-center justify-center py-8\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} className=\"text-text-secondary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n );\n}\n\nconst TruefoundrySettingsBuilder = () => {\n const { settingsOpen, settingsSection: section, setSettingsOpen } = useShellMode();\n const catalog = useOptionalCatalogServer();\n const refreshServerCapabilities = useOptionalRefreshServerCapabilities();\n const { refresh: refreshDraftCatalog } = useDraftCatalog();\n // dock/widget panels are ~mobile width even on a wide viewport — keep Settings stacked.\n const compact = useCompactLayout();\n const hasSkills = catalog?.skillCatalog != null;\n const hasSandbox = catalog?.sandboxCatalog != null;\n\n const closeSettings = useCallback(() => {\n setSettingsOpen(false);\n refreshDraftCatalog();\n refreshServerCapabilities?.();\n }, [refreshDraftCatalog, refreshServerCapabilities, setSettingsOpen]);\n\n useEffect(() => {\n if (!hasSkills && section === 'skills') {\n setSettingsOpen(settingsOpen, 'models');\n }\n if (!hasSandbox && section === 'sandbox') {\n setSettingsOpen(settingsOpen, 'models');\n }\n }, [hasSkills, hasSandbox, section, settingsOpen, setSettingsOpen]);\n\n useEffect(() => {\n if (!settingsOpen) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n event.stopImmediatePropagation();\n closeSettings();\n };\n // Capture so layout Escape handlers (sessions drawer / widget) do not also fire.\n window.addEventListener('keydown', onKeyDown, true);\n return () => window.removeEventListener('keydown', onKeyDown, true);\n }, [closeSettings, settingsOpen]);\n\n const sections = useMemo<\n Array<{\n id: SettingsSection;\n label: string;\n icon: 'cpu' | 'plug' | 'lightbulb' | 'cube';\n }>\n >(() => {\n const baseSections: Array<{\n id: SettingsSection;\n label: string;\n icon: 'cpu' | 'plug' | 'lightbulb' | 'cube';\n }> = [\n { id: 'models', label: 'Models', icon: 'cpu' },\n { id: 'connectors', label: 'Connectors', icon: 'plug' },\n ];\n if (hasSkills) {\n baseSections.push({ id: 'skills', label: 'Skills', icon: 'lightbulb' });\n }\n if (hasSandbox) {\n baseSections.push({ id: 'sandbox', label: 'Sandbox providers', icon: 'cube' });\n }\n return baseSections;\n }, [hasSkills, hasSandbox]);\n\n if (!settingsOpen || !catalog) return null;\n\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col bg-primary-bg\">\n <header className=\"flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5\">\n <button\n type=\"button\"\n aria-label=\"Back\"\n title=\"Back\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n onClick={closeSettings}\n >\n <Icon name=\"arrow-left\" />\n </button>\n <h1 className=\"text-lg font-semibold tracking-tight text-text-primary\">Settings</h1>\n </header>\n\n <div className={cn('flex min-h-0 flex-1 flex-col', !compact && 'md:flex-row')}>\n <nav\n aria-label=\"Settings sections\"\n className={cn(\n 'flex w-full gap-1 border-b border-border bg-secondary-bg/40 p-2',\n compact ? 'min-w-0' : 'justify-center md:w-48 md:flex-col md:justify-start md:border-b-0 md:border-r',\n )}\n >\n {sections.map(item => (\n <button\n key={item.id}\n type=\"button\"\n aria-current={section === item.id ? 'page' : undefined}\n {...(compact ? { title: item.label } : {})}\n className={cn(\n 'flex min-h-9 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring',\n // Narrow panels cannot fit fixed-width tabs, so tabs split the row instead.\n compact ? 'min-w-0 flex-1 justify-center gap-1.5 px-1.5' : 'shrink-0',\n section === item.id\n ? 'bg-primary-button-bg text-primary-button-text'\n : 'text-text-secondary hover:bg-ghost-button-hover/60 hover:text-text-primary',\n )}\n onClick={() => {\n setSettingsOpen(true, item.id);\n }}\n >\n <Icon name={item.icon} className=\"h-4 w-4 shrink-0\" />\n {compact ? <span className=\"truncate\">{item.label}</span> : item.label}\n </button>\n ))}\n </nav>\n\n <section className=\"flex flex-col h-full flex-1 overflow-y-hidden px-6 py-4\">\n <div className=\"w-full max-w-210 h-full min-h-0 flex flex-col mx-auto\">\n <Suspense fallback={<SettingsSectionFallback />}>\n {section === 'models' ? <ModelSettings /> : null}\n {section === 'connectors' ? <ConnectorSettings /> : null}\n {section === 'skills' && hasSkills ? <SkillSettings /> : null}\n {section === 'sandbox' && hasSandbox ? <SandboxSettings /> : null}\n </Suspense>\n </div>\n </section>\n </div>\n </div>\n );\n};\n\nexport default TruefoundrySettingsBuilder;\n"],"mappings":"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","names":[]}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
NamedAgentHeaderLabel,
|
|
4
4
|
ShellActions
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LRQHHZDX.js";
|
|
6
6
|
import {
|
|
7
7
|
Thread,
|
|
8
8
|
ThreadListContainer
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-H7DR64W3.js";
|
|
10
10
|
import {
|
|
11
11
|
useAui
|
|
12
12
|
} from "./chunk-M6MHLVSO.js";
|
|
@@ -14,22 +14,22 @@ import {
|
|
|
14
14
|
useBrandName,
|
|
15
15
|
useChatHeaderContentVisible,
|
|
16
16
|
useSlot
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-QGNLP2EE.js";
|
|
18
18
|
import {
|
|
19
19
|
Icon,
|
|
20
20
|
Spinner,
|
|
21
21
|
auiButtonClass,
|
|
22
22
|
useOptionalShellMode
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-XAZ5HJXV.js";
|
|
24
|
+
import "./chunk-HT5HKQXE.js";
|
|
25
25
|
import {
|
|
26
26
|
cn
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-DTF7ZMUJ.js";
|
|
28
28
|
|
|
29
29
|
// src/layouts/SidebarLayout.tsx
|
|
30
30
|
import { lazy, Suspense, useEffect, useRef, useState } from "react";
|
|
31
31
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
32
|
-
var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-
|
|
32
|
+
var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-26XSGIHK.js"));
|
|
33
33
|
var desktopCollapsed = false;
|
|
34
34
|
function SidebarLayout({ className }) {
|
|
35
35
|
const aui = useAui();
|
|
@@ -233,4 +233,4 @@ function SidebarLayout({ className }) {
|
|
|
233
233
|
export {
|
|
234
234
|
SidebarLayout
|
|
235
235
|
};
|
|
236
|
-
//# sourceMappingURL=SidebarLayout-
|
|
236
|
+
//# sourceMappingURL=SidebarLayout-F3XFXW7B.js.map
|
|
@@ -4,15 +4,15 @@ import {
|
|
|
4
4
|
CenteredModal,
|
|
5
5
|
SearchInput_default,
|
|
6
6
|
auiInputClass,
|
|
7
|
-
getErrorMessage,
|
|
8
7
|
useToasterOptional
|
|
9
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-QGNLP2EE.js";
|
|
10
9
|
import {
|
|
11
10
|
Icon,
|
|
11
|
+
getErrorMessage,
|
|
12
12
|
useCatalogServer
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-XAZ5HJXV.js";
|
|
14
|
+
import "./chunk-HT5HKQXE.js";
|
|
15
|
+
import "./chunk-DTF7ZMUJ.js";
|
|
16
16
|
|
|
17
17
|
// src/containers/SettingsBuilder/SkillSettings.tsx
|
|
18
18
|
import { useCallback, useEffect, useMemo, useState as useState2 } from "react";
|
|
@@ -386,4 +386,4 @@ var SkillSettings_default = SkillSettings;
|
|
|
386
386
|
export {
|
|
387
387
|
SkillSettings_default as default
|
|
388
388
|
};
|
|
389
|
-
//# sourceMappingURL=SkillSettings-
|
|
389
|
+
//# sourceMappingURL=SkillSettings-IRMGDFRG.js.map
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
StackChatPanel
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-7EEOWDLE.js";
|
|
5
|
+
import "./chunk-LRQHHZDX.js";
|
|
6
|
+
import "./chunk-H7DR64W3.js";
|
|
7
7
|
import "./chunk-M6MHLVSO.js";
|
|
8
8
|
import {
|
|
9
9
|
useSlot
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-QGNLP2EE.js";
|
|
11
11
|
import {
|
|
12
12
|
CompactLayoutProvider,
|
|
13
13
|
Icon,
|
|
14
14
|
auiButtonClass
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-XAZ5HJXV.js";
|
|
16
|
+
import "./chunk-HT5HKQXE.js";
|
|
17
17
|
import {
|
|
18
18
|
cn
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-DTF7ZMUJ.js";
|
|
20
20
|
|
|
21
21
|
// src/layouts/WidgetLayout.tsx
|
|
22
22
|
import { useEffect, useRef, useState } from "react";
|
|
@@ -98,4 +98,4 @@ function WidgetLayout({ className }) {
|
|
|
98
98
|
export {
|
|
99
99
|
WidgetLayout
|
|
100
100
|
};
|
|
101
|
-
//# sourceMappingURL=WidgetLayout-
|
|
101
|
+
//# sourceMappingURL=WidgetLayout-SZMABKIR.js.map
|