@truefoundry/trueforge-ui 0.1.0-rc.0 → 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/{ConnectorSettings-CLBEWGQJ.js → ConnectorSettings-ADACLWQI.js} +6 -6
  3. package/dist/{DockLayout-WRF7EQLD.js → DockLayout-BH5XX2AQ.js} +8 -8
  4. package/dist/{DrawerLayout-X2UXYTOS.js → DrawerLayout-O2XZQCG4.js} +8 -8
  5. package/dist/{ModelSettings-IJ55QJQO.js → ModelSettings-LKFJVUYQ.js} +8 -8
  6. package/dist/{ModelSettings-IJ55QJQO.js.map → ModelSettings-LKFJVUYQ.js.map} +1 -1
  7. package/dist/OpenUiFenceBlock-A2CWCPOP.js +9 -0
  8. package/dist/{SandboxSettings-S5XGZWOL.js → SandboxSettings-H5MDAE47.js} +6 -6
  9. package/dist/{SettingsBuilder-64Y33NP3.js → SettingsBuilder-3JOLC56Z.js} +25 -17
  10. package/dist/SettingsBuilder-3JOLC56Z.js.map +1 -0
  11. package/dist/{SidebarLayout-M7HEOZVK.js → SidebarLayout-G6BGD7EY.js} +8 -8
  12. package/dist/{SkillSettings-MXK4ZEI7.js → SkillSettings-4VB42CVG.js} +6 -6
  13. package/dist/{WidgetLayout-7MDOKLHU.js → WidgetLayout-ABSXZUSQ.js} +8 -8
  14. package/dist/{chunk-UXZOL5GO.js → chunk-3PTFNAQK.js} +5 -5
  15. package/dist/{chunk-NBMP2XNL.js → chunk-EFGSH3MO.js} +7 -7
  16. package/dist/{chunk-42GF723P.js → chunk-FDBJNXH2.js} +2 -2
  17. package/dist/{chunk-UHGSHDBM.js → chunk-U5GBGEGN.js} +159 -4
  18. package/dist/chunk-U5GBGEGN.js.map +1 -0
  19. package/dist/{chunk-WFC3W4C3.js → chunk-VJTCFZNM.js} +4 -4
  20. package/dist/chunk-WMRZSULD.js +567 -0
  21. package/dist/chunk-WMRZSULD.js.map +1 -0
  22. package/dist/{chunk-XSHXH6EI.js → chunk-Z27F4LBZ.js} +380 -461
  23. package/dist/chunk-Z27F4LBZ.js.map +1 -0
  24. package/dist/index.d.ts +5 -1
  25. package/dist/index.js +12 -12
  26. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +5 -9
  27. package/dist/plugins/trueforge-agent-server-adapter/index.js +52 -31
  28. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  29. package/dist/styles.css +1 -1
  30. package/package.json +3 -3
  31. package/dist/OpenUiFenceBlock-SLLZSTMJ.js +0 -9
  32. package/dist/SettingsBuilder-64Y33NP3.js.map +0 -1
  33. package/dist/chunk-UBOFEI77.js +0 -567
  34. package/dist/chunk-UBOFEI77.js.map +0 -1
  35. package/dist/chunk-UHGSHDBM.js.map +0 -1
  36. package/dist/chunk-XSHXH6EI.js.map +0 -1
  37. /package/dist/{ConnectorSettings-CLBEWGQJ.js.map → ConnectorSettings-ADACLWQI.js.map} +0 -0
  38. /package/dist/{DockLayout-WRF7EQLD.js.map → DockLayout-BH5XX2AQ.js.map} +0 -0
  39. /package/dist/{DrawerLayout-X2UXYTOS.js.map → DrawerLayout-O2XZQCG4.js.map} +0 -0
  40. /package/dist/{OpenUiFenceBlock-SLLZSTMJ.js.map → OpenUiFenceBlock-A2CWCPOP.js.map} +0 -0
  41. /package/dist/{SandboxSettings-S5XGZWOL.js.map → SandboxSettings-H5MDAE47.js.map} +0 -0
  42. /package/dist/{SidebarLayout-M7HEOZVK.js.map → SidebarLayout-G6BGD7EY.js.map} +0 -0
  43. /package/dist/{SkillSettings-MXK4ZEI7.js.map → SkillSettings-4VB42CVG.js.map} +0 -0
  44. /package/dist/{WidgetLayout-7MDOKLHU.js.map → WidgetLayout-ABSXZUSQ.js.map} +0 -0
  45. /package/dist/{chunk-UXZOL5GO.js.map → chunk-3PTFNAQK.js.map} +0 -0
  46. /package/dist/{chunk-NBMP2XNL.js.map → chunk-EFGSH3MO.js.map} +0 -0
  47. /package/dist/{chunk-42GF723P.js.map → chunk-FDBJNXH2.js.map} +0 -0
  48. /package/dist/{chunk-WFC3W4C3.js.map → chunk-VJTCFZNM.js.map} +0 -0
@@ -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-UHGSHDBM.js";
11
+ } from "./chunk-U5GBGEGN.js";
10
12
  import {
11
13
  cn
12
- } from "./chunk-UBOFEI77.js";
14
+ } from "./chunk-WMRZSULD.js";
13
15
 
14
16
  // src/containers/SettingsBuilder/index.tsx
15
- import { lazy, Suspense, useEffect, useMemo, useState } from "react";
17
+ import { lazy, Suspense, useCallback, useEffect, useMemo } from "react";
16
18
  import { jsx, jsxs } from "react/jsx-runtime";
17
- var ModelSettings = lazy(() => import("./ModelSettings-IJ55QJQO.js"));
18
- var ConnectorSettings = lazy(() => import("./ConnectorSettings-CLBEWGQJ.js"));
19
- var SkillSettings = lazy(() => import("./SkillSettings-MXK4ZEI7.js"));
20
- var SandboxSettings = lazy(() => import("./SandboxSettings-S5XGZWOL.js"));
19
+ var ModelSettings = lazy(() => import("./ModelSettings-LKFJVUYQ.js"));
20
+ var ConnectorSettings = lazy(() => import("./ConnectorSettings-ADACLWQI.js"));
21
+ var SkillSettings = lazy(() => import("./SkillSettings-4VB42CVG.js"));
22
+ var SandboxSettings = lazy(() => import("./SandboxSettings-H5MDAE47.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
- setSection("models");
44
+ setSettingsOpen(settingsOpen, "models");
37
45
  }
38
46
  if (!hasSandbox && section === "sandbox") {
39
- setSection("models");
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
- setSettingsOpen(false);
55
+ closeSettings();
48
56
  };
49
57
  window.addEventListener("keydown", onKeyDown, true);
50
58
  return () => window.removeEventListener("keydown", onKeyDown, true);
51
- }, [settingsOpen, setSettingsOpen]);
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: () => setSettingsOpen(false),
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
- setSection(item.id);
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-64Y33NP3.js.map
136
+ //# sourceMappingURL=SettingsBuilder-3JOLC56Z.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-WFC3W4C3.js";
5
+ } from "./chunk-VJTCFZNM.js";
6
6
  import {
7
7
  Thread,
8
8
  ThreadListContainer
9
- } from "./chunk-UXZOL5GO.js";
9
+ } from "./chunk-3PTFNAQK.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-XSHXH6EI.js";
17
+ } from "./chunk-Z27F4LBZ.js";
18
18
  import {
19
19
  Icon,
20
20
  Spinner,
21
21
  auiButtonClass,
22
22
  useOptionalShellMode
23
- } from "./chunk-UHGSHDBM.js";
24
- import "./chunk-42GF723P.js";
23
+ } from "./chunk-U5GBGEGN.js";
24
+ import "./chunk-FDBJNXH2.js";
25
25
  import {
26
26
  cn
27
- } from "./chunk-UBOFEI77.js";
27
+ } from "./chunk-WMRZSULD.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-64Y33NP3.js"));
32
+ var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-3JOLC56Z.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-M7HEOZVK.js.map
236
+ //# sourceMappingURL=SidebarLayout-G6BGD7EY.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-XSHXH6EI.js";
8
+ } from "./chunk-Z27F4LBZ.js";
10
9
  import {
11
10
  Icon,
11
+ getErrorMessage,
12
12
  useCatalogServer
13
- } from "./chunk-UHGSHDBM.js";
14
- import "./chunk-42GF723P.js";
15
- import "./chunk-UBOFEI77.js";
13
+ } from "./chunk-U5GBGEGN.js";
14
+ import "./chunk-FDBJNXH2.js";
15
+ import "./chunk-WMRZSULD.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-MXK4ZEI7.js.map
389
+ //# sourceMappingURL=SkillSettings-4VB42CVG.js.map
@@ -1,22 +1,22 @@
1
1
  "use client";
2
2
  import {
3
3
  StackChatPanel
4
- } from "./chunk-NBMP2XNL.js";
5
- import "./chunk-WFC3W4C3.js";
6
- import "./chunk-UXZOL5GO.js";
4
+ } from "./chunk-EFGSH3MO.js";
5
+ import "./chunk-VJTCFZNM.js";
6
+ import "./chunk-3PTFNAQK.js";
7
7
  import "./chunk-M6MHLVSO.js";
8
8
  import {
9
9
  useSlot
10
- } from "./chunk-XSHXH6EI.js";
10
+ } from "./chunk-Z27F4LBZ.js";
11
11
  import {
12
12
  CompactLayoutProvider,
13
13
  Icon,
14
14
  auiButtonClass
15
- } from "./chunk-UHGSHDBM.js";
16
- import "./chunk-42GF723P.js";
15
+ } from "./chunk-U5GBGEGN.js";
16
+ import "./chunk-FDBJNXH2.js";
17
17
  import {
18
18
  cn
19
- } from "./chunk-UBOFEI77.js";
19
+ } from "./chunk-WMRZSULD.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-7MDOKLHU.js.map
101
+ //# sourceMappingURL=WidgetLayout-ABSXZUSQ.js.map
@@ -6,7 +6,6 @@ import {
6
6
  ASK_USER_CUSTOM_OPTION,
7
7
  BottomSheet,
8
8
  Button,
9
- DraftCatalogProvider,
10
9
  SearchInput_default,
11
10
  SlotsProvider,
12
11
  USER_MESSAGE_ATTACHMENT_PREVIEW_REM,
@@ -20,18 +19,19 @@ import {
20
19
  useSlot,
21
20
  useSlotIsDefault,
22
21
  useToasterOptional
23
- } from "./chunk-XSHXH6EI.js";
22
+ } from "./chunk-Z27F4LBZ.js";
24
23
  import {
24
+ DraftCatalogProvider,
25
25
  Icon,
26
26
  auiButtonClass,
27
27
  libraryAgentId,
28
28
  useCompactLayout,
29
29
  useOptionalServer,
30
30
  useOptionalShellMode
31
- } from "./chunk-UHGSHDBM.js";
31
+ } from "./chunk-U5GBGEGN.js";
32
32
  import {
33
33
  cn
34
- } from "./chunk-UBOFEI77.js";
34
+ } from "./chunk-WMRZSULD.js";
35
35
 
36
36
  // src/containers/AgentStepsContainer.tsx
37
37
  import { useEffect, useRef, useState } from "react";
@@ -2085,4 +2085,4 @@ export {
2085
2085
  Thread,
2086
2086
  ThreadListContainer
2087
2087
  };
2088
- //# sourceMappingURL=chunk-UXZOL5GO.js.map
2088
+ //# sourceMappingURL=chunk-3PTFNAQK.js.map
@@ -1,31 +1,31 @@
1
1
  import {
2
2
  NamedAgentHeaderLabel,
3
3
  ShellActions
4
- } from "./chunk-WFC3W4C3.js";
4
+ } from "./chunk-VJTCFZNM.js";
5
5
  import {
6
6
  Thread,
7
7
  ThreadListContainer
8
- } from "./chunk-UXZOL5GO.js";
8
+ } from "./chunk-3PTFNAQK.js";
9
9
  import {
10
10
  useAui
11
11
  } from "./chunk-M6MHLVSO.js";
12
12
  import {
13
13
  useSlot
14
- } from "./chunk-XSHXH6EI.js";
14
+ } from "./chunk-Z27F4LBZ.js";
15
15
  import {
16
16
  Icon,
17
17
  Spinner,
18
18
  auiButtonClass,
19
19
  useOptionalShellMode
20
- } from "./chunk-UHGSHDBM.js";
20
+ } from "./chunk-U5GBGEGN.js";
21
21
  import {
22
22
  cn
23
- } from "./chunk-UBOFEI77.js";
23
+ } from "./chunk-WMRZSULD.js";
24
24
 
25
25
  // src/layouts/StackChatPanel.tsx
26
26
  import { lazy, Suspense, useEffect, useState } from "react";
27
27
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
28
- var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-64Y33NP3.js"));
28
+ var TruefoundrySettingsBuilder = lazy(() => import("./SettingsBuilder-3JOLC56Z.js"));
29
29
  function StackChatPanel({ className, threadHeaderEnd }) {
30
30
  const [view, setView] = useState("thread");
31
31
  const aui = useAui();
@@ -86,4 +86,4 @@ function StackChatPanel({ className, threadHeaderEnd }) {
86
86
  export {
87
87
  StackChatPanel
88
88
  };
89
- //# sourceMappingURL=chunk-NBMP2XNL.js.map
89
+ //# sourceMappingURL=chunk-EFGSH3MO.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  useOptionalContentClassNames
4
- } from "./chunk-UBOFEI77.js";
4
+ } from "./chunk-WMRZSULD.js";
5
5
 
6
6
  // src/atoms/OpenUiFenceBlock.tsx
7
7
  import { Renderer } from "@openuidev/react-lang";
@@ -21,4 +21,4 @@ function OpenUiFenceBlock({ content, isStreaming, darkTheme }) {
21
21
  export {
22
22
  OpenUiFenceBlock
23
23
  };
24
- //# sourceMappingURL=chunk-42GF723P.js.map
24
+ //# sourceMappingURL=chunk-FDBJNXH2.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ThemeContext,
3
3
  cn
4
- } from "./chunk-UBOFEI77.js";
4
+ } from "./chunk-WMRZSULD.js";
5
5
 
6
6
  // src/icons/Icon.tsx
7
7
  import { createElement, isValidElement, useContext } from "react";
@@ -379,12 +379,16 @@ function ShellModeProvider({
379
379
  const [clearEpoch, setClearEpoch] = useState2(0);
380
380
  const [agentsListEpoch, setAgentsListEpoch] = useState2(0);
381
381
  const [settingsOpenState, setSettingsOpenState] = useState2(initialSettingsOpen);
382
+ const [settingsSection, setSettingsSection] = useState2("models");
382
383
  const [historyAgentFilter, setHistoryAgentFilter] = useState2(null);
383
384
  const [pendingSessionId, setPendingSessionId] = useState2(void 0);
384
385
  const settingsEnabled = capabilities?.settings?.enabled !== false;
385
386
  const settingsOpen = settingsEnabled && settingsOpenState;
386
387
  const setSettingsOpen = useCallback2(
387
- (open) => {
388
+ (open, section) => {
389
+ if (section !== void 0) {
390
+ setSettingsSection(section);
391
+ }
388
392
  setSettingsOpenState(settingsEnabled && open);
389
393
  },
390
394
  [settingsEnabled]
@@ -546,6 +550,7 @@ function ShellModeProvider({
546
550
  isComposerEnabled,
547
551
  isNewChatEnabled,
548
552
  settingsOpen,
553
+ settingsSection,
549
554
  setSettingsOpen,
550
555
  selectLibraryAgent,
551
556
  bindMutableAgent,
@@ -568,6 +573,7 @@ function ShellModeProvider({
568
573
  isComposerEnabled,
569
574
  isNewChatEnabled,
570
575
  settingsOpen,
576
+ settingsSection,
571
577
  setSettingsOpen,
572
578
  selectLibraryAgent,
573
579
  bindMutableAgent,
@@ -599,6 +605,57 @@ function shellIsMutable(mode) {
599
605
  return mode.status === "active" && mode.isMutable;
600
606
  }
601
607
 
608
+ // src/utils/getErrorMessage.ts
609
+ function isRecord(value) {
610
+ return value != null && typeof value === "object";
611
+ }
612
+ function readNonEmptyString(value) {
613
+ return typeof value === "string" && value.trim() !== "" ? value : void 0;
614
+ }
615
+ function messageFromErrorShaped(value) {
616
+ if (!isRecord(value)) return void 0;
617
+ const direct = readNonEmptyString(value.message);
618
+ if (direct != null) return direct;
619
+ if (isRecord(value.error)) {
620
+ return readNonEmptyString(value.error.message);
621
+ }
622
+ return void 0;
623
+ }
624
+ function stringifyError(error) {
625
+ if (typeof error === "string") return error;
626
+ if (isRecord(error)) {
627
+ try {
628
+ return JSON.stringify(error);
629
+ } catch {
630
+ return Object.prototype.toString.call(error);
631
+ }
632
+ }
633
+ return String(error);
634
+ }
635
+ function getErrorMessage(error, fallback) {
636
+ if (typeof error === "string") {
637
+ const trimmed = error.trim();
638
+ if (trimmed !== "") return error;
639
+ return fallback ?? error;
640
+ }
641
+ if (isRecord(error) && "body" in error) {
642
+ const fromBody = messageFromErrorShaped(error.body);
643
+ if (fromBody != null) return fromBody;
644
+ if (error.body != null) {
645
+ if (typeof error.body === "string") {
646
+ const trimmed = error.body.trim();
647
+ if (trimmed !== "") return error.body;
648
+ } else {
649
+ return stringifyError(error.body);
650
+ }
651
+ }
652
+ }
653
+ const fromShape = messageFromErrorShaped(error);
654
+ if (fromShape != null) return fromShape;
655
+ if (fallback != null) return fallback;
656
+ return stringifyError(error);
657
+ }
658
+
602
659
  // src/atoms/lib/CompactLayoutContext.tsx
603
660
  import { createContext as createContext3, useContext as useContext4 } from "react";
604
661
  import { jsx as jsx6 } from "react/jsx-runtime";
@@ -610,6 +667,100 @@ function useCompactLayout() {
610
667
  return useContext4(CompactLayoutContext);
611
668
  }
612
669
 
670
+ // src/atoms/draft/DraftCatalogProvider.tsx
671
+ import { createContext as createContext4, useCallback as useCallback3, useContext as useContext5, useEffect as useEffect3, useMemo as useMemo3, useState as useState3 } from "react";
672
+ import { jsx as jsx7 } from "react/jsx-runtime";
673
+ var DraftCatalogContext = createContext4(null);
674
+ var IDLE_ENSURE = () => void 0;
675
+ var IDLE_REFRESH = async () => void 0;
676
+ function DraftCatalogProvider({ children }) {
677
+ const server = useOptionalServer();
678
+ const existing = useContext5(DraftCatalogContext);
679
+ if (existing?.server === server) {
680
+ return children;
681
+ }
682
+ return /* @__PURE__ */ jsx7(DraftCatalogStore, { server, children });
683
+ }
684
+ function DraftCatalogStore({ server, children }) {
685
+ const [requestEpoch, setRequestEpoch] = useState3(null);
686
+ const [models, setModels] = useState3([]);
687
+ const [skills, setSkills] = useState3([]);
688
+ const [connectors, setConnectors] = useState3([]);
689
+ const [loading, setLoading] = useState3(false);
690
+ const [error, setError] = useState3(null);
691
+ const ensureLoaded = useCallback3(() => {
692
+ setRequestEpoch((current) => current ?? 0);
693
+ }, []);
694
+ const refresh = useCallback3(() => {
695
+ setRequestEpoch((current) => (current ?? -1) + 1);
696
+ }, []);
697
+ const refreshConnectors = useCallback3(async () => {
698
+ if (!server) return;
699
+ setLoading(true);
700
+ setError(null);
701
+ try {
702
+ const nextConnectors = await server.getMcp();
703
+ setConnectors(nextConnectors);
704
+ } catch (reason) {
705
+ setError(getErrorMessage(reason, "Failed to load connectors."));
706
+ } finally {
707
+ setLoading(false);
708
+ }
709
+ }, [server]);
710
+ useEffect3(() => {
711
+ if (requestEpoch === null || !server) return;
712
+ let cancelled = false;
713
+ setLoading(true);
714
+ setError(null);
715
+ void Promise.allSettled([server.getModels(), server.getSkills(), server.getMcp()]).then(([modelsResult, skillsResult, mcpResult]) => {
716
+ if (cancelled) return;
717
+ const errors = [];
718
+ if (modelsResult.status === "fulfilled") {
719
+ setModels(modelsResult.value);
720
+ } else {
721
+ errors.push(getErrorMessage(modelsResult.reason, "Failed to load models."));
722
+ }
723
+ if (skillsResult.status === "fulfilled") {
724
+ setSkills(skillsResult.value);
725
+ } else {
726
+ errors.push(getErrorMessage(skillsResult.reason, "Failed to load skills."));
727
+ }
728
+ if (mcpResult.status === "fulfilled") {
729
+ setConnectors(mcpResult.value);
730
+ } else {
731
+ errors.push(getErrorMessage(mcpResult.reason, "Failed to load connectors."));
732
+ }
733
+ setError(errors[0] ?? null);
734
+ }).finally(() => {
735
+ if (!cancelled) setLoading(false);
736
+ });
737
+ return () => {
738
+ cancelled = true;
739
+ };
740
+ }, [requestEpoch, server]);
741
+ const value = useMemo3(
742
+ () => ({ server, models, skills, connectors, loading, error, ensureLoaded, refresh, refreshConnectors }),
743
+ [server, models, skills, connectors, loading, error, ensureLoaded, refresh, refreshConnectors]
744
+ );
745
+ return /* @__PURE__ */ jsx7(DraftCatalogContext.Provider, { value, children });
746
+ }
747
+ function useDraftCatalog() {
748
+ const ctx = useContext5(DraftCatalogContext);
749
+ if (ctx == null) {
750
+ return {
751
+ models: [],
752
+ skills: [],
753
+ connectors: [],
754
+ loading: false,
755
+ error: null,
756
+ ensureLoaded: IDLE_ENSURE,
757
+ refresh: IDLE_ENSURE,
758
+ refreshConnectors: IDLE_REFRESH
759
+ };
760
+ }
761
+ return ctx;
762
+ }
763
+
613
764
  export {
614
765
  registerIcons,
615
766
  Icon,
@@ -619,6 +770,7 @@ export {
619
770
  useServer,
620
771
  useOptionalServer,
621
772
  useServerCapabilities,
773
+ useOptionalRefreshServerCapabilities,
622
774
  useCatalogServer,
623
775
  useOptionalCatalogServer,
624
776
  DEFAULT_AGENT_CONFIG,
@@ -627,7 +779,10 @@ export {
627
779
  useShellMode,
628
780
  useOptionalShellMode,
629
781
  shellIsMutable,
782
+ getErrorMessage,
630
783
  CompactLayoutProvider,
631
- useCompactLayout
784
+ useCompactLayout,
785
+ DraftCatalogProvider,
786
+ useDraftCatalog
632
787
  };
633
- //# sourceMappingURL=chunk-UHGSHDBM.js.map
788
+ //# sourceMappingURL=chunk-U5GBGEGN.js.map