@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/{ConnectorSettings-CLBEWGQJ.js → ConnectorSettings-H37ZFC6Z.js} +36 -13
  3. package/dist/ConnectorSettings-H37ZFC6Z.js.map +1 -0
  4. package/dist/{DockLayout-WRF7EQLD.js → DockLayout-KEMFRWIR.js} +8 -8
  5. package/dist/{DrawerLayout-X2UXYTOS.js → DrawerLayout-ZVWCKEIS.js} +8 -8
  6. package/dist/{ModelSettings-IJ55QJQO.js → ModelSettings-QJMYHCMD.js} +8 -8
  7. package/dist/{ModelSettings-IJ55QJQO.js.map → ModelSettings-QJMYHCMD.js.map} +1 -1
  8. package/dist/OpenUiFenceBlock-XFBUGPKQ.js +9 -0
  9. package/dist/{SandboxSettings-S5XGZWOL.js → SandboxSettings-BUBMLW7Q.js} +160 -66
  10. package/dist/SandboxSettings-BUBMLW7Q.js.map +1 -0
  11. package/dist/{SettingsBuilder-64Y33NP3.js → SettingsBuilder-26XSGIHK.js} +25 -17
  12. package/dist/SettingsBuilder-26XSGIHK.js.map +1 -0
  13. package/dist/{SidebarLayout-M7HEOZVK.js → SidebarLayout-F3XFXW7B.js} +8 -8
  14. package/dist/{SkillSettings-MXK4ZEI7.js → SkillSettings-IRMGDFRG.js} +6 -6
  15. package/dist/{WidgetLayout-7MDOKLHU.js → WidgetLayout-SZMABKIR.js} +8 -8
  16. package/dist/{chunk-NBMP2XNL.js → chunk-7EEOWDLE.js} +7 -7
  17. package/dist/chunk-DTF7ZMUJ.js +567 -0
  18. package/dist/chunk-DTF7ZMUJ.js.map +1 -0
  19. package/dist/{chunk-UXZOL5GO.js → chunk-H7DR64W3.js} +47 -32
  20. package/dist/chunk-H7DR64W3.js.map +1 -0
  21. package/dist/{chunk-42GF723P.js → chunk-HT5HKQXE.js} +2 -2
  22. package/dist/{chunk-WFC3W4C3.js → chunk-LRQHHZDX.js} +4 -4
  23. package/dist/{chunk-XSHXH6EI.js → chunk-QGNLP2EE.js} +530 -519
  24. package/dist/chunk-QGNLP2EE.js.map +1 -0
  25. package/dist/{chunk-UHGSHDBM.js → chunk-XAZ5HJXV.js} +237 -8
  26. package/dist/chunk-XAZ5HJXV.js.map +1 -0
  27. package/dist/index.d.ts +11 -3
  28. package/dist/index.js +115 -20
  29. package/dist/index.js.map +1 -1
  30. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +47 -37
  31. package/dist/plugins/trueforge-agent-server-adapter/index.js +74 -42
  32. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  33. package/dist/styles.css +1 -1
  34. package/package.json +3 -3
  35. package/dist/ConnectorSettings-CLBEWGQJ.js.map +0 -1
  36. package/dist/OpenUiFenceBlock-SLLZSTMJ.js +0 -9
  37. package/dist/SandboxSettings-S5XGZWOL.js.map +0 -1
  38. package/dist/SettingsBuilder-64Y33NP3.js.map +0 -1
  39. package/dist/chunk-UBOFEI77.js +0 -567
  40. package/dist/chunk-UBOFEI77.js.map +0 -1
  41. package/dist/chunk-UHGSHDBM.js.map +0 -1
  42. package/dist/chunk-UXZOL5GO.js.map +0 -1
  43. package/dist/chunk-XSHXH6EI.js.map +0 -1
  44. /package/dist/{DockLayout-WRF7EQLD.js.map → DockLayout-KEMFRWIR.js.map} +0 -0
  45. /package/dist/{DrawerLayout-X2UXYTOS.js.map → DrawerLayout-ZVWCKEIS.js.map} +0 -0
  46. /package/dist/{OpenUiFenceBlock-SLLZSTMJ.js.map → OpenUiFenceBlock-XFBUGPKQ.js.map} +0 -0
  47. /package/dist/{SidebarLayout-M7HEOZVK.js.map → SidebarLayout-F3XFXW7B.js.map} +0 -0
  48. /package/dist/{SkillSettings-MXK4ZEI7.js.map → SkillSettings-IRMGDFRG.js.map} +0 -0
  49. /package/dist/{WidgetLayout-7MDOKLHU.js.map → WidgetLayout-SZMABKIR.js.map} +0 -0
  50. /package/dist/{chunk-NBMP2XNL.js.map → chunk-7EEOWDLE.js.map} +0 -0
  51. /package/dist/{chunk-42GF723P.js.map → chunk-HT5HKQXE.js.map} +0 -0
  52. /package/dist/{chunk-WFC3W4C3.js.map → chunk-LRQHHZDX.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ThemeContext,
3
3
  cn
4
- } from "./chunk-UBOFEI77.js";
4
+ } from "./chunk-DTF7ZMUJ.js";
5
5
 
6
6
  // src/icons/Icon.tsx
7
7
  import { createElement, isValidElement, useContext } from "react";
@@ -12,6 +12,7 @@ import {
12
12
  ArrowDown,
13
13
  ArrowLeft,
14
14
  ArrowUp,
15
+ BookOpen,
15
16
  Bot,
16
17
  Box,
17
18
  Brain,
@@ -60,6 +61,7 @@ import {
60
61
  Sun,
61
62
  Terminal,
62
63
  Trash2,
64
+ TriangleAlert,
63
65
  Wrench,
64
66
  X
65
67
  } from "lucide-react";
@@ -114,6 +116,8 @@ var defaults = {
114
116
  "box-archive": Archive,
115
117
  "clock-rotate-left": History,
116
118
  "circle-exclamation": CircleAlert,
119
+ info: Info,
120
+ "triangle-exclamation": TriangleAlert,
117
121
  "chevron-down": ChevronDown,
118
122
  "chevron-left": ChevronLeft,
119
123
  "chevron-right": ChevronRight,
@@ -138,6 +142,7 @@ var defaults = {
138
142
  "oauth-loading": Loader2,
139
143
  "welcome-sparkle": Sparkle,
140
144
  robot: Bot,
145
+ "book-open": BookOpen,
141
146
  funnel: ListFilter,
142
147
  plug: Plug,
143
148
  "list-check": ListChecks,
@@ -156,8 +161,7 @@ var defaults = {
156
161
  "expand-alt": Maximize2,
157
162
  compress: Minimize2,
158
163
  "external-link": ExternalLink,
159
- github: Github,
160
- info: Info
164
+ github: Github
161
165
  };
162
166
  for (const [name, icon] of Object.entries(defaults)) {
163
167
  registry.set(name, icon);
@@ -319,6 +323,61 @@ function useOptionalCatalogServer() {
319
323
 
320
324
  // src/server/ShellModeContext.tsx
321
325
  import { createContext as createContext2, useCallback as useCallback2, useContext as useContext3, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
326
+
327
+ // src/server/draftSpecPreferences.ts
328
+ var DRAFT_SPEC_PREFERENCES_STORAGE_KEY = "tfy-aui-draft-spec-preferences";
329
+ function isObject(value) {
330
+ return typeof value === "object" && value !== null;
331
+ }
332
+ function isMountList(value) {
333
+ return Array.isArray(value) && value.every(isObject);
334
+ }
335
+ function isAgentSpec(value) {
336
+ if (!isObject(value)) return false;
337
+ const model = Reflect.get(value, "model");
338
+ if (!isObject(model) || typeof Reflect.get(model, "name") !== "string") return false;
339
+ const params = Reflect.get(model, "params");
340
+ if (params !== void 0 && !isObject(params)) return false;
341
+ const skills = Reflect.get(value, "skills");
342
+ if (skills !== void 0 && !isMountList(skills)) return false;
343
+ const mcpServers = Reflect.get(value, "mcpServers");
344
+ if (mcpServers !== void 0 && !isMountList(mcpServers)) return false;
345
+ const config = Reflect.get(value, "config");
346
+ return config === void 0 || isObject(config);
347
+ }
348
+ function isStoredDraftSpecPreferences(value) {
349
+ return isObject(value) && Reflect.get(value, "version") === 1 && isAgentSpec(Reflect.get(value, "spec"));
350
+ }
351
+ function selectDraftSpecPreferences(spec) {
352
+ return {
353
+ model: spec.model,
354
+ ...spec.skills !== void 0 ? { skills: spec.skills } : {},
355
+ ...spec.mcpServers !== void 0 ? { mcpServers: spec.mcpServers } : {},
356
+ ...spec.config !== void 0 ? { config: spec.config } : {}
357
+ };
358
+ }
359
+ function readDraftSpecPreferences() {
360
+ if (typeof window === "undefined") return null;
361
+ try {
362
+ const stored = JSON.parse(window.localStorage.getItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY) ?? "null");
363
+ return isStoredDraftSpecPreferences(stored) ? stored.spec : null;
364
+ } catch {
365
+ return null;
366
+ }
367
+ }
368
+ function writeDraftSpecPreferences(spec) {
369
+ if (typeof window === "undefined") return;
370
+ try {
371
+ const stored = {
372
+ version: 1,
373
+ spec: selectDraftSpecPreferences(spec)
374
+ };
375
+ window.localStorage.setItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY, JSON.stringify(stored));
376
+ } catch {
377
+ }
378
+ }
379
+
380
+ // src/server/ShellModeContext.tsx
322
381
  import { jsx as jsx5 } from "react/jsx-runtime";
323
382
  var DEFAULT_AGENT_CONFIG = {
324
383
  mode: "AgentLibraryWithComposer"
@@ -365,8 +424,9 @@ function ShellModeProvider({
365
424
  }) {
366
425
  const capabilities = useServerCapabilities();
367
426
  const refreshCapabilities = useOptionalRefreshServerCapabilities();
368
- const mutableSeedRef = useRef2(mutableSeedFromConfig(agentConfig));
369
- if ((agentConfig.mode === "AgentComposer" || agentConfig.mode === "AgentLibraryWithComposer") && agentConfig.defaultAgentSpec != null) {
427
+ const rememberedSpecRef = useRef2(readDraftSpecPreferences());
428
+ const mutableSeedRef = useRef2(rememberedSpecRef.current ?? mutableSeedFromConfig(agentConfig));
429
+ if (rememberedSpecRef.current == null && (agentConfig.mode === "AgentComposer" || agentConfig.mode === "AgentLibraryWithComposer") && agentConfig.defaultAgentSpec != null) {
370
430
  mutableSeedRef.current = agentConfig.defaultAgentSpec;
371
431
  }
372
432
  const mutableSeed = mutableSeedRef.current;
@@ -379,12 +439,16 @@ function ShellModeProvider({
379
439
  const [clearEpoch, setClearEpoch] = useState2(0);
380
440
  const [agentsListEpoch, setAgentsListEpoch] = useState2(0);
381
441
  const [settingsOpenState, setSettingsOpenState] = useState2(initialSettingsOpen);
442
+ const [settingsSection, setSettingsSection] = useState2("models");
382
443
  const [historyAgentFilter, setHistoryAgentFilter] = useState2(null);
383
444
  const [pendingSessionId, setPendingSessionId] = useState2(void 0);
384
445
  const settingsEnabled = capabilities?.settings?.enabled !== false;
385
446
  const settingsOpen = settingsEnabled && settingsOpenState;
386
447
  const setSettingsOpen = useCallback2(
387
- (open) => {
448
+ (open, section) => {
449
+ if (section !== void 0) {
450
+ setSettingsSection(section);
451
+ }
388
452
  setSettingsOpenState(settingsEnabled && open);
389
453
  },
390
454
  [settingsEnabled]
@@ -478,6 +542,12 @@ function ShellModeProvider({
478
542
  refreshCapabilities?.();
479
543
  selectLibraryAgent({ isMutable: true, agentSpec: mutableSeedRef.current });
480
544
  }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
545
+ const rememberDraftSpec = useCallback2((agentSpec) => {
546
+ const preferences = selectDraftSpecPreferences(agentSpec);
547
+ rememberedSpecRef.current = preferences;
548
+ mutableSeedRef.current = preferences;
549
+ writeDraftSpecPreferences(preferences);
550
+ }, []);
481
551
  const openHistorySession = useCallback2(
482
552
  ({
483
553
  sessionId,
@@ -546,11 +616,13 @@ function ShellModeProvider({
546
616
  isComposerEnabled,
547
617
  isNewChatEnabled,
548
618
  settingsOpen,
619
+ settingsSection,
549
620
  setSettingsOpen,
550
621
  selectLibraryAgent,
551
622
  bindMutableAgent,
552
623
  selectAgent,
553
624
  openDraft,
625
+ rememberDraftSpec,
554
626
  openHistorySession,
555
627
  clearChat,
556
628
  runtimeKey,
@@ -568,11 +640,13 @@ function ShellModeProvider({
568
640
  isComposerEnabled,
569
641
  isNewChatEnabled,
570
642
  settingsOpen,
643
+ settingsSection,
571
644
  setSettingsOpen,
572
645
  selectLibraryAgent,
573
646
  bindMutableAgent,
574
647
  selectAgent,
575
648
  openDraft,
649
+ rememberDraftSpec,
576
650
  openHistorySession,
577
651
  clearChat,
578
652
  runtimeKey,
@@ -599,6 +673,57 @@ function shellIsMutable(mode) {
599
673
  return mode.status === "active" && mode.isMutable;
600
674
  }
601
675
 
676
+ // src/utils/getErrorMessage.ts
677
+ function isRecord(value) {
678
+ return value != null && typeof value === "object";
679
+ }
680
+ function readNonEmptyString(value) {
681
+ return typeof value === "string" && value.trim() !== "" ? value : void 0;
682
+ }
683
+ function messageFromErrorShaped(value) {
684
+ if (!isRecord(value)) return void 0;
685
+ const direct = readNonEmptyString(value.message);
686
+ if (direct != null) return direct;
687
+ if (isRecord(value.error)) {
688
+ return readNonEmptyString(value.error.message);
689
+ }
690
+ return void 0;
691
+ }
692
+ function stringifyError(error) {
693
+ if (typeof error === "string") return error;
694
+ if (isRecord(error)) {
695
+ try {
696
+ return JSON.stringify(error);
697
+ } catch {
698
+ return Object.prototype.toString.call(error);
699
+ }
700
+ }
701
+ return String(error);
702
+ }
703
+ function getErrorMessage(error, fallback) {
704
+ if (typeof error === "string") {
705
+ const trimmed = error.trim();
706
+ if (trimmed !== "") return error;
707
+ return fallback ?? error;
708
+ }
709
+ if (isRecord(error) && "body" in error) {
710
+ const fromBody = messageFromErrorShaped(error.body);
711
+ if (fromBody != null) return fromBody;
712
+ if (error.body != null) {
713
+ if (typeof error.body === "string") {
714
+ const trimmed = error.body.trim();
715
+ if (trimmed !== "") return error.body;
716
+ } else {
717
+ return stringifyError(error.body);
718
+ }
719
+ }
720
+ }
721
+ const fromShape = messageFromErrorShaped(error);
722
+ if (fromShape != null) return fromShape;
723
+ if (fallback != null) return fallback;
724
+ return stringifyError(error);
725
+ }
726
+
602
727
  // src/atoms/lib/CompactLayoutContext.tsx
603
728
  import { createContext as createContext3, useContext as useContext4 } from "react";
604
729
  import { jsx as jsx6 } from "react/jsx-runtime";
@@ -610,6 +735,106 @@ function useCompactLayout() {
610
735
  return useContext4(CompactLayoutContext);
611
736
  }
612
737
 
738
+ // src/atoms/draft/DraftCatalogProvider.tsx
739
+ import { createContext as createContext4, useCallback as useCallback3, useContext as useContext5, useEffect as useEffect3, useMemo as useMemo3, useState as useState3 } from "react";
740
+ import { jsx as jsx7 } from "react/jsx-runtime";
741
+ var DraftCatalogContext = createContext4(null);
742
+ var IDLE_ENSURE = () => void 0;
743
+ var IDLE_REFRESH = async () => void 0;
744
+ function DraftCatalogProvider({ children }) {
745
+ const server = useOptionalServer();
746
+ const existing = useContext5(DraftCatalogContext);
747
+ if (existing?.server === server) {
748
+ return children;
749
+ }
750
+ return /* @__PURE__ */ jsx7(DraftCatalogStore, { server, children });
751
+ }
752
+ function DraftCatalogStore({ server, children }) {
753
+ const [requestEpoch, setRequestEpoch] = useState3(null);
754
+ const [models, setModels] = useState3([]);
755
+ const [skills, setSkills] = useState3([]);
756
+ const [connectors, setConnectors] = useState3([]);
757
+ const [completedEpoch, setCompletedEpoch] = useState3(null);
758
+ const [loading, setLoading] = useState3(false);
759
+ const [error, setError] = useState3(null);
760
+ const ensureLoaded = useCallback3(() => {
761
+ setRequestEpoch((current) => current ?? 0);
762
+ }, []);
763
+ const refresh = useCallback3(() => {
764
+ setRequestEpoch((current) => (current ?? -1) + 1);
765
+ }, []);
766
+ const refreshConnectors = useCallback3(async () => {
767
+ if (!server) return;
768
+ setLoading(true);
769
+ setError(null);
770
+ try {
771
+ const nextConnectors = await server.getMcp();
772
+ setConnectors(nextConnectors);
773
+ } catch (reason) {
774
+ setError(getErrorMessage(reason, "Failed to load connectors."));
775
+ } finally {
776
+ setLoading(false);
777
+ }
778
+ }, [server]);
779
+ useEffect3(() => {
780
+ if (requestEpoch === null || !server) return;
781
+ let cancelled = false;
782
+ setLoading(true);
783
+ setError(null);
784
+ void Promise.allSettled([server.getModels(), server.getSkills(), server.getMcp()]).then(([modelsResult, skillsResult, mcpResult]) => {
785
+ if (cancelled) return;
786
+ const errors = [];
787
+ if (modelsResult.status === "fulfilled") {
788
+ setModels(modelsResult.value);
789
+ } else {
790
+ errors.push(getErrorMessage(modelsResult.reason, "Failed to load models."));
791
+ }
792
+ if (skillsResult.status === "fulfilled") {
793
+ setSkills(skillsResult.value);
794
+ } else {
795
+ errors.push(getErrorMessage(skillsResult.reason, "Failed to load skills."));
796
+ }
797
+ if (mcpResult.status === "fulfilled") {
798
+ setConnectors(mcpResult.value);
799
+ } else {
800
+ errors.push(getErrorMessage(mcpResult.reason, "Failed to load connectors."));
801
+ }
802
+ setError(errors[0] ?? null);
803
+ }).finally(() => {
804
+ if (!cancelled) {
805
+ setCompletedEpoch(requestEpoch);
806
+ setLoading(false);
807
+ }
808
+ });
809
+ return () => {
810
+ cancelled = true;
811
+ };
812
+ }, [requestEpoch, server]);
813
+ const loaded = requestEpoch !== null && completedEpoch === requestEpoch;
814
+ const value = useMemo3(
815
+ () => ({ server, models, skills, connectors, loaded, loading, error, ensureLoaded, refresh, refreshConnectors }),
816
+ [server, models, skills, connectors, loaded, loading, error, ensureLoaded, refresh, refreshConnectors]
817
+ );
818
+ return /* @__PURE__ */ jsx7(DraftCatalogContext.Provider, { value, children });
819
+ }
820
+ function useDraftCatalog() {
821
+ const ctx = useContext5(DraftCatalogContext);
822
+ if (ctx == null) {
823
+ return {
824
+ models: [],
825
+ skills: [],
826
+ connectors: [],
827
+ loaded: false,
828
+ loading: false,
829
+ error: null,
830
+ ensureLoaded: IDLE_ENSURE,
831
+ refresh: IDLE_ENSURE,
832
+ refreshConnectors: IDLE_REFRESH
833
+ };
834
+ }
835
+ return ctx;
836
+ }
837
+
613
838
  export {
614
839
  registerIcons,
615
840
  Icon,
@@ -619,6 +844,7 @@ export {
619
844
  useServer,
620
845
  useOptionalServer,
621
846
  useServerCapabilities,
847
+ useOptionalRefreshServerCapabilities,
622
848
  useCatalogServer,
623
849
  useOptionalCatalogServer,
624
850
  DEFAULT_AGENT_CONFIG,
@@ -627,7 +853,10 @@ export {
627
853
  useShellMode,
628
854
  useOptionalShellMode,
629
855
  shellIsMutable,
856
+ getErrorMessage,
630
857
  CompactLayoutProvider,
631
- useCompactLayout
858
+ useCompactLayout,
859
+ DraftCatalogProvider,
860
+ useDraftCatalog
632
861
  };
633
- //# sourceMappingURL=chunk-UHGSHDBM.js.map
862
+ //# sourceMappingURL=chunk-XAZ5HJXV.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/server/ServerContext.tsx","../src/server/ShellModeContext.tsx","../src/server/draftSpecPreferences.ts","../src/utils/getErrorMessage.ts","../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 Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n CircleAlert,\n CircleCheck,\n CircleX,\n Clock,\n Code2,\n Copy,\n Cpu,\n Download,\n Ellipsis,\n ExternalLink,\n File,\n Github,\n History,\n Info,\n Lightbulb,\n ListChecks,\n ListFilter,\n ListOrdered,\n Loader2,\n Lock,\n LogOut,\n Maximize2,\n Menu,\n Minimize2,\n Moon,\n PanelLeftClose,\n PanelLeftOpen,\n Paperclip,\n Pencil,\n Play,\n Plug,\n Plus,\n RotateCw,\n Save,\n Search,\n Settings,\n Sparkle,\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 'square-pen': SquarePen,\n 'rotate-right': RotateCw,\n broom: Broom,\n ellipsis: Ellipsis,\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 loader: Loader2,\n file: File,\n clone: Copy,\n copy: Copy,\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 '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 'book-open': BookOpen,\n funnel: ListFilter,\n plug: Plug,\n 'list-check': ListChecks,\n lock: Lock,\n lightbulb: Lightbulb,\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 expand: Maximize2,\n 'expand-alt': Maximize2,\n compress: Minimize2,\n 'external-link': ExternalLink,\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 = 'default' | 'secondary' | 'ghost' | 'destructive' | 'outline';\nexport type AuiButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nconst variantClasses: Record<AuiButtonVariant, string> = {\n default: '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 shadow-sm 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 outline:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text shadow-sm hover:bg-secondary-button-hover',\n};\n\nconst sizeClasses: Record<AuiButtonSize, string> = {\n default: 'h-9 px-4 py-2 text-sm',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8 text-base',\n icon: 'h-8 w-8',\n};\n\nconst baseClasses =\n 'inline-flex cursor-pointer items-center justify-center gap-2 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/** Shared Button / native `<button>` className helper (SDK utilities are layered). */\nexport function auiButtonClass({\n variant = 'default',\n size = 'default',\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 { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport type { AgentBuilderCapabilitiesResponse, AgentUIServer, CatalogServer } from './types.js';\n\nconst ServerContext = createContext<AgentUIServer | null>(null);\nconst ServerCapabilitiesContext = createContext<{\n capabilities: AgentBuilderCapabilitiesResponse['data'] | null;\n refresh: () => void;\n} | null>(null);\n\nexport function ServerProvider({ server, children }: { server: AgentUIServer; children: ReactNode }) {\n const [capabilities, setCapabilities] = useState<AgentBuilderCapabilitiesResponse['data'] | null>(null);\n const cancelActiveRequestRef = useRef<(() => void) | null>(null);\n const refreshCapabilities = useCallback(() => {\n cancelActiveRequestRef.current?.();\n let cancelled = false;\n cancelActiveRequestRef.current = () => {\n cancelled = true;\n };\n void server\n .getCapabilities()\n .then(response => {\n if (!cancelled) setCapabilities(response.data);\n })\n .catch(() => {\n // Preserve the last known capabilities when a refresh fails.\n });\n }, [server]);\n\n useEffect(() => {\n setCapabilities(null);\n refreshCapabilities();\n return () => {\n cancelActiveRequestRef.current?.();\n };\n }, [refreshCapabilities]);\n\n const capabilitiesValue = useMemo(\n () => ({ capabilities, refresh: refreshCapabilities }),\n [capabilities, refreshCapabilities],\n );\n\n return (\n <ServerContext.Provider value={server}>\n <ServerCapabilitiesContext.Provider value={capabilitiesValue}>{children}</ServerCapabilitiesContext.Provider>\n </ServerContext.Provider>\n );\n}\n\nexport function useServer(): AgentUIServer {\n const server = useContext(ServerContext);\n if (server == null) {\n throw new Error('useServer must be used within a ServerProvider.');\n }\n return server;\n}\n\nexport function useOptionalServer(): AgentUIServer | null {\n return useContext(ServerContext);\n}\n\nexport function useServerCapabilities(): AgentBuilderCapabilitiesResponse['data'] | null {\n return useContext(ServerCapabilitiesContext)?.capabilities ?? null;\n}\n\nexport function useOptionalRefreshServerCapabilities(): (() => void) | null {\n return useContext(ServerCapabilitiesContext)?.refresh ?? null;\n}\n\nexport function useCatalogServer(): CatalogServer {\n const server = useServer();\n if (server.catalog == null) {\n throw new Error('useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueFoundryServer.');\n }\n return server.catalog;\n}\n\nexport function useOptionalCatalogServer(): CatalogServer | null {\n return useOptionalServer()?.catalog ?? null;\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport {\n readDraftSpecPreferences,\n selectDraftSpecPreferences,\n writeDraftSpecPreferences,\n} from './draftSpecPreferences.js';\nimport { useOptionalRefreshServerCapabilities, useServerCapabilities } from './ServerContext.js';\nimport type { AgentLibraryEntry, AgentSpec } from './types.js';\n\n/** Host-facing shell configuration for agent / library / composer chrome. */\nexport type AgentConfig =\n | { mode: 'SingleAgent'; name: string }\n | { mode: 'AgentLibrary' }\n | { mode: 'AgentComposer'; defaultAgentSpec?: AgentSpec }\n | { mode: 'AgentLibraryWithComposer'; defaultAgentSpec?: AgentSpec };\n\nexport const DEFAULT_AGENT_CONFIG: AgentConfig = {\n mode: 'AgentLibraryWithComposer',\n};\n\n/**\n * Active chat binding. Mutability (`isMutable`) decides composer / Save / updateSession —\n * not a parallel draft|named shell type.\n */\nexport type ShellMode =\n | { status: 'idle' }\n | {\n status: 'active';\n isMutable: boolean;\n /** Identity for immutable bind + history filter. */\n agentId?: string;\n /** Display / welcome label (often same as agentId). */\n agentName?: string;\n /** Seed for mutable (draft) runtime. */\n agentSpec?: AgentSpec;\n locked: boolean;\n };\n\n/** Library / New Chat create intent. */\nexport type SelectLibraryAgentRequest = {\n isMutable: boolean;\n agentId?: string;\n agentName?: string;\n agentSpec?: AgentSpec;\n};\n\nexport type SettingsSection = 'models' | 'connectors' | 'skills' | 'sandbox';\n\ntype ShellModeContextValue = {\n mode: ShellMode;\n /** Host agentConfig mode (capabilities source). */\n agentConfigMode: AgentConfig['mode'];\n /** Agents Library chrome. */\n isLibraryEnabled: boolean;\n /** Mutable composer / Save Agent chrome (host capability). */\n isComposerEnabled: boolean;\n /** Sidebar / list New Chat control. */\n isNewChatEnabled: boolean;\n settingsOpen: boolean;\n settingsSection: SettingsSection;\n setSettingsOpen: (open: boolean, section?: SettingsSection) => void;\n /**\n * Bind from the Agents Library (Try = immutable, Edit = mutable + agentSpec).\n * Prefer this over `selectAgent` / `openDraft` when both fields are available.\n */\n selectLibraryAgent: (req: SelectLibraryAgentRequest) => void;\n /**\n * Attach identity + agentSpec to the *current* mutable chat without remounting.\n * Used after `saveAgent` so the same draft session continues as an editable agent.\n */\n bindMutableAgent: (req: { agentId: string; agentName: string; agentSpec: AgentSpec }) => void;\n /** @deprecated Prefer `selectLibraryAgent({ isMutable: false, agentName })`. */\n selectAgent: (agentName: string) => void;\n /** @deprecated Prefer `selectLibraryAgent({ isMutable: true, agentSpec })`. */\n openDraft: () => void;\n /** Remember plain-draft composer choices as the seed for future new chats. */\n rememberDraftSpec: (agentSpec: AgentSpec) => void;\n /**\n * Open a history session, remounting when mutability/identity changes.\n * Prefer explicit `isMutable` from the session row; when omitted, agentName\n * present → immutable and agentName absent → mutable. Immutable rows may omit\n * `agentName` when the registry agent was deleted.\n */\n openHistorySession: (req: { sessionId: string; agentName?: string; isMutable?: boolean }) => void;\n /** Reset current chat; no-op when idle. */\n clearChat: () => void;\n /** Remount key for the chat runtime when binding changes. */\n runtimeKey: string;\n /**\n * History list filter forwarded as `listSessions({ agentId })`.\n * `null` = All chats. Only meaningful when `isLibraryEnabled`.\n */\n historyAgentFilter: string | null;\n setHistoryAgentFilter: (agentId: string | null) => void;\n /** Effective `listSessionsAgentId` for the runtime (SingleAgent locks to name). */\n listSessionsAgentId: string | undefined;\n /** Session to open after a binding remount (history click across mutability). */\n pendingSessionId: string | undefined;\n /**\n * Bumped when the Agents Library catalog may have changed (e.g. after saveAgent).\n * Library chrome should re-fetch when this changes.\n */\n agentsListEpoch: number;\n invalidateAgentsList: () => void;\n};\n\nconst ShellModeContext = createContext<ShellModeContextValue | null>(null);\n\nconst FALLBACK_MUTABLE_SPEC: AgentSpec = {\n model: { name: 'openai-main/gpt-4.1' },\n};\n\nfunction mutableSeedFromConfig(config: AgentConfig): AgentSpec {\n if (config.mode === 'AgentComposer' || config.mode === 'AgentLibraryWithComposer') {\n return config.defaultAgentSpec ?? FALLBACK_MUTABLE_SPEC;\n }\n return FALLBACK_MUTABLE_SPEC;\n}\n\nfunction initialMode(config: AgentConfig, mutableSeed: AgentSpec): ShellMode {\n switch (config.mode) {\n case 'SingleAgent':\n return {\n status: 'active',\n isMutable: false,\n agentId: config.name,\n agentName: config.name,\n locked: true,\n };\n case 'AgentLibrary':\n return { status: 'idle' };\n case 'AgentComposer':\n case 'AgentLibraryWithComposer':\n return {\n status: 'active',\n isMutable: true,\n agentSpec: mutableSeed,\n locked: false,\n };\n }\n}\n\nfunction libraryAgentId(agent: Pick<AgentLibraryEntry, 'agentId' | 'name'>): string {\n return agent.agentId ?? agent.name;\n}\n\nexport function ShellModeProvider({\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n children,\n}: {\n agentConfig?: AgentConfig;\n /** Open settings on first paint (e.g. host boot with no models). Does not re-open later. */\n initialSettingsOpen?: boolean;\n children: ReactNode;\n}) {\n const capabilities = useServerCapabilities();\n const refreshCapabilities = useOptionalRefreshServerCapabilities();\n const rememberedSpecRef = useRef<AgentSpec | null>(readDraftSpecPreferences());\n const mutableSeedRef = useRef(rememberedSpecRef.current ?? mutableSeedFromConfig(agentConfig));\n if (\n rememberedSpecRef.current == null &&\n (agentConfig.mode === 'AgentComposer' || agentConfig.mode === 'AgentLibraryWithComposer') &&\n agentConfig.defaultAgentSpec != null\n ) {\n mutableSeedRef.current = agentConfig.defaultAgentSpec;\n }\n const mutableSeed = mutableSeedRef.current;\n\n const isLibraryEnabled = agentConfig.mode === 'AgentLibrary' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isComposerEnabled = agentConfig.mode === 'AgentComposer' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isNewChatEnabled = agentConfig.mode !== 'AgentLibrary';\n const locked = agentConfig.mode === 'SingleAgent';\n\n const [mode, setMode] = useState<ShellMode>(() => initialMode(agentConfig, mutableSeed));\n const [mutableEpoch, setMutableEpoch] = useState(0);\n const [clearEpoch, setClearEpoch] = useState(0);\n const [agentsListEpoch, setAgentsListEpoch] = useState(0);\n const [settingsOpenState, setSettingsOpenState] = useState(initialSettingsOpen);\n const [settingsSection, setSettingsSection] = useState<SettingsSection>('models');\n const [historyAgentFilter, setHistoryAgentFilter] = useState<string | null>(null);\n const [pendingSessionId, setPendingSessionId] = useState<string | undefined>(undefined);\n const settingsEnabled = capabilities?.settings?.enabled !== false;\n const settingsOpen = settingsEnabled && settingsOpenState;\n const setSettingsOpen = useCallback(\n (open: boolean, section?: SettingsSection) => {\n if (section !== undefined) {\n setSettingsSection(section);\n }\n setSettingsOpenState(settingsEnabled && open);\n },\n [settingsEnabled],\n );\n\n useEffect(() => {\n if (!settingsEnabled) {\n setSettingsOpenState(false);\n }\n }, [settingsEnabled]);\n\n const invalidateAgentsList = useCallback(() => {\n setAgentsListEpoch(n => n + 1);\n }, []);\n\n const lockedAgentName = agentConfig.mode === 'SingleAgent' ? agentConfig.name : '';\n const effectiveMode: ShellMode = useMemo(() => {\n if (!locked) return mode;\n return {\n status: 'active',\n isMutable: false,\n agentId: lockedAgentName,\n agentName: lockedAgentName,\n locked: true,\n };\n }, [locked, lockedAgentName, mode]);\n\n const listSessionsAgentId = useMemo(() => {\n if (locked) return lockedAgentName;\n if (!isLibraryEnabled) return undefined;\n return historyAgentFilter ?? undefined;\n }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);\n\n const bumpEpoch = useCallback((isMutable: boolean) => {\n if (isMutable) setMutableEpoch(n => n + 1);\n else setClearEpoch(n => n + 1);\n }, []);\n\n const selectLibraryAgent = useCallback(\n (req: SelectLibraryAgentRequest) => {\n if (req.isMutable) {\n if (!isComposerEnabled) return;\n setSettingsOpen(false);\n setPendingSessionId(undefined);\n setMode({\n status: 'active',\n isMutable: true,\n agentId: req.agentId,\n agentName: req.agentName,\n agentSpec: req.agentSpec ?? mutableSeedRef.current,\n locked: false,\n });\n bumpEpoch(true);\n return;\n }\n if (!isLibraryEnabled) return;\n const agentName = req.agentName ?? req.agentId;\n if (agentName == null) return;\n setSettingsOpen(false);\n setPendingSessionId(undefined);\n setMode({\n status: 'active',\n isMutable: false,\n agentId: req.agentId ?? agentName,\n agentName,\n locked: false,\n });\n bumpEpoch(false);\n },\n [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen],\n );\n\n const bindMutableAgent = useCallback(\n (req: { agentId: string; agentName: string; agentSpec: AgentSpec }) => {\n if (!isComposerEnabled) return;\n setMode(prev => {\n if (prev.status !== 'active' || !prev.isMutable) return prev;\n return {\n status: 'active',\n isMutable: true,\n agentId: req.agentId,\n agentName: req.agentName,\n agentSpec: req.agentSpec,\n locked: false,\n };\n });\n },\n [isComposerEnabled],\n );\n\n const selectAgent = useCallback(\n (name: string) => {\n selectLibraryAgent({ isMutable: false, agentId: name, agentName: name });\n },\n [selectLibraryAgent],\n );\n\n const openDraft = useCallback(() => {\n if (!isComposerEnabled) return;\n refreshCapabilities?.();\n selectLibraryAgent({ isMutable: true, agentSpec: mutableSeedRef.current });\n }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);\n\n const rememberDraftSpec = useCallback((agentSpec: AgentSpec) => {\n const preferences = selectDraftSpecPreferences(agentSpec);\n rememberedSpecRef.current = preferences;\n mutableSeedRef.current = preferences;\n writeDraftSpecPreferences(preferences);\n }, []);\n\n const openHistorySession = useCallback(\n ({\n sessionId,\n agentName,\n isMutable: isMutableOpt,\n }: {\n sessionId: string;\n agentName?: string;\n isMutable?: boolean;\n }) => {\n setSettingsOpen(false);\n setPendingSessionId(sessionId);\n const isMutable = isMutableOpt ?? agentName == null;\n if (isMutable) {\n if (!isComposerEnabled) return;\n setMode({\n status: 'active',\n isMutable: true,\n agentSpec: mutableSeedRef.current,\n locked: false,\n });\n bumpEpoch(true);\n return;\n }\n // Immutable: allow orphaned refs (deleted agent → no agentName).\n if (locked) {\n if (agentName == null || lockedAgentName !== agentName) return;\n } else if (!isLibraryEnabled) {\n return;\n }\n setMode({\n status: 'active',\n isMutable: false,\n locked: false,\n ...(agentName != null ? { agentId: agentName, agentName } : {}),\n });\n bumpEpoch(false);\n },\n [isLibraryEnabled, isComposerEnabled, locked, lockedAgentName, bumpEpoch, setSettingsOpen],\n );\n\n const clearChat = useCallback(() => {\n if (effectiveMode.status === 'idle') return;\n setPendingSessionId(undefined);\n if (effectiveMode.isMutable) {\n // Preserve Edit binding (name + seeded spec); blank drafts fall back to host seed.\n setMode({\n status: 'active',\n isMutable: true,\n agentId: effectiveMode.agentId,\n agentName: effectiveMode.agentName,\n agentSpec: effectiveMode.agentSpec ?? mutableSeedRef.current,\n locked: false,\n });\n bumpEpoch(true);\n return;\n }\n bumpEpoch(false);\n }, [effectiveMode, bumpEpoch]);\n\n // Mutable remounts are driven only by mutableEpoch (library Edit / New Chat / Clear).\n // Agent id and model must not be in the key — saveAgent binds those onto the same draft.\n const runtimeKey = useMemo(() => {\n if (effectiveMode.status === 'idle') return 'idle';\n if (effectiveMode.isMutable) {\n return `mut:${pendingSessionId ?? ''}:${mutableEpoch}`;\n }\n const id = effectiveMode.agentId ?? effectiveMode.agentName ?? '';\n return `immut:${id}:${pendingSessionId ?? ''}:${clearEpoch}`;\n }, [effectiveMode, mutableEpoch, clearEpoch, pendingSessionId]);\n\n const value = useMemo<ShellModeContextValue>(\n () => ({\n mode: effectiveMode,\n agentConfigMode: agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n rememberDraftSpec,\n openHistorySession,\n clearChat,\n runtimeKey,\n historyAgentFilter,\n setHistoryAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n agentsListEpoch,\n invalidateAgentsList,\n }),\n [\n effectiveMode,\n agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n rememberDraftSpec,\n openHistorySession,\n clearChat,\n runtimeKey,\n historyAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n agentsListEpoch,\n invalidateAgentsList,\n ],\n );\n\n return <ShellModeContext.Provider value={value}>{children}</ShellModeContext.Provider>;\n}\n\nexport function useShellMode(): ShellModeContextValue {\n const ctx = useContext(ShellModeContext);\n if (ctx == null) {\n throw new Error('useShellMode must be used within a ShellModeProvider.');\n }\n return ctx;\n}\n\nexport function useOptionalShellMode(): ShellModeContextValue | null {\n return useContext(ShellModeContext);\n}\n\n/** True when the shell is bound to a mutable (editable) agentSpec. */\nexport function shellIsMutable(mode: ShellMode): boolean {\n return mode.status === 'active' && mode.isMutable;\n}\n\nexport { libraryAgentId };\n","import type { AgentSpec } from './types.js';\n\nexport const DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-draft-spec-preferences';\n\ntype StoredDraftSpecPreferences = {\n version: 1;\n spec: AgentSpec;\n};\n\nfunction isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMountList(value: unknown): boolean {\n return Array.isArray(value) && value.every(isObject);\n}\n\nfunction isAgentSpec(value: unknown): value is AgentSpec {\n if (!isObject(value)) return false;\n const model = Reflect.get(value, 'model');\n if (!isObject(model) || typeof Reflect.get(model, 'name') !== 'string') return false;\n\n const params = Reflect.get(model, 'params');\n if (params !== undefined && !isObject(params)) return false;\n\n const skills = Reflect.get(value, 'skills');\n if (skills !== undefined && !isMountList(skills)) return false;\n\n const mcpServers = Reflect.get(value, 'mcpServers');\n if (mcpServers !== undefined && !isMountList(mcpServers)) return false;\n\n const config = Reflect.get(value, 'config');\n return config === undefined || isObject(config);\n}\n\nfunction isStoredDraftSpecPreferences(value: unknown): value is StoredDraftSpecPreferences {\n return isObject(value) && Reflect.get(value, 'version') === 1 && isAgentSpec(Reflect.get(value, 'spec'));\n}\n\n/** Keep only composer choices that should seed future new chats. */\nexport function selectDraftSpecPreferences(spec: AgentSpec): AgentSpec {\n return {\n model: spec.model,\n ...(spec.skills !== undefined ? { skills: spec.skills } : {}),\n ...(spec.mcpServers !== undefined ? { mcpServers: spec.mcpServers } : {}),\n ...(spec.config !== undefined ? { config: spec.config } : {}),\n };\n}\n\nexport function readDraftSpecPreferences(): AgentSpec | null {\n if (typeof window === 'undefined') return null;\n try {\n const stored: unknown = JSON.parse(window.localStorage.getItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY) ?? 'null');\n return isStoredDraftSpecPreferences(stored) ? stored.spec : null;\n } catch {\n return null;\n }\n}\n\nexport function writeDraftSpecPreferences(spec: AgentSpec): void {\n if (typeof window === 'undefined') return;\n try {\n const stored: StoredDraftSpecPreferences = {\n version: 1,\n spec: selectDraftSpecPreferences(spec),\n };\n window.localStorage.setItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY, JSON.stringify(stored));\n } catch {\n // Storage can be unavailable or full; in-memory carry-over still works.\n }\n}\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object';\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\n/**\n * Reads a display string from API-shaped errors: `message`, then nested\n * `error.message`. When neither exists, stringifies the value.\n */\nfunction messageFromErrorShaped(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n const direct = readNonEmptyString(value.message);\n if (direct != null) return direct;\n if (isRecord(value.error)) {\n return readNonEmptyString(value.error.message);\n }\n return undefined;\n}\n\nfunction stringifyError(error: unknown): string {\n if (typeof error === 'string') return error;\n if (isRecord(error)) {\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n }\n return String(error);\n}\n\n/**\n * User-facing error text. Prefers HTTP body `{ error: { message } }` when\n * present (e.g. TrueForgeError), then `error.message` / `error.error.message`,\n * then `fallback`, then a string form of the value.\n */\nexport function getErrorMessage(error: unknown, fallback?: string): string {\n if (typeof error === 'string') {\n const trimmed = error.trim();\n if (trimmed !== '') return error;\n return fallback ?? error;\n }\n\n if (isRecord(error) && 'body' in error) {\n const fromBody = messageFromErrorShaped(error.body);\n if (fromBody != null) return fromBody;\n if (error.body != null) {\n if (typeof error.body === 'string') {\n const trimmed = error.body.trim();\n if (trimmed !== '') return error.body;\n } else {\n return stringifyError(error.body);\n }\n }\n }\n\n const fromShape = messageFromErrorShaped(error);\n if (fromShape != null) return fromShape;\n\n if (fallback != null) return fallback;\n return stringifyError(error);\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 { AgentSkill, AgentUIServer, ConnectorState, ModelSelection } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\n\ntype DraftCatalogValue = {\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\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;\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 [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 const nextConnectors = await server.getMcp();\n setConnectors(nextConnectors);\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 void Promise.allSettled([server.getModels(), server.getSkills(), server.getMcp()])\n .then(([modelsResult, skillsResult, mcpResult]) => {\n if (cancelled) return;\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 })\n .finally(() => {\n if (!cancelled) {\n setCompletedEpoch(requestEpoch);\n setLoading(false);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [requestEpoch, server]);\n\n const loaded = requestEpoch !== null && completedEpoch === requestEpoch;\n const value = useMemo(\n () => ({ server, models, skills, connectors, loaded, loading, error, ensureLoaded, refresh, refreshConnectors }),\n [server, models, skills, connectors, loaded, loading, error, ensureLoaded, refresh, refreshConnectors],\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 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","useContext","jsx","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","useCallback","useEffect","useMemo","useContext","createContext","useContext","jsx","createContext","useCallback","useContext","useEffect","useMemo","useState","jsx","createContext","useContext","useState","useCallback","useEffect","useMemo"]}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export { AssistantState, useAui, useAuiState } from '@assistant-ui/react';
6
6
  import { UseTrueFoundryAgentRuntimeOptions, TrueFoundryAgentConfig } from '@truefoundry/assistant-ui-runtime';
7
7
  export { DraftAgentConfig, NamedAgentConfig, TrueFoundryAgentConfig, UseTrueFoundryAgentRuntimeOptions, mergeAgentSpec, trueFoundryAttachmentAdapter, useTrueFoundryAgentRuntime, useTrueFoundryAgentSpec, useTrueFoundryCancel, useTrueFoundryDownloadSandboxFile, useTrueFoundryHistoryPagination, useTrueFoundryMcpAuth, useTrueFoundryRespondToToolApproval, useTrueFoundryToolResponses, useTrueFoundryTurnId, useTrueFoundryUpdateAgentSpec } from '@truefoundry/assistant-ui-runtime';
8
8
  import { AgentSpec, AgentLibraryEntry, CatalogServer, AgentUIServer, AgentBuilderCapabilitiesResponse, ModelSelection, AgentSkill, ConnectorState } from '@truefoundry/assistant-ui-runtime/server';
9
- export { AgentBuilderCapabilitiesResponse, AgentBuilderServer, AgentChatServer, AgentLibraryEntry, AgentSkill, AgentSpec, AgentUIServer, ApprovalDecision, AuthenticateConnectorRequest, CatalogServer, ConnectorAuth, ConnectorAuthApiKey, ConnectorAuthNone, ConnectorAuthOAuth, ConnectorAuthPublic, ConnectorAuthPublicApiKey, ConnectorAuthPublicNone, ConnectorAuthPublicOAuth, ConnectorAuthType, ConnectorAuthenticationResult, ConnectorBase, ConnectorCatalogEntry, ConnectorCatalogServer, ConnectorConfigBase, ConnectorState, CreateConnectorRequest, CreateModelProviderRequest, CreateSandboxProviderRequest, CreateSessionRequest, CreateSkillRequest, CreateSkillRequestBase, DefinedSkill, GithubSkill, ImportGithubSkillRequest, ListResult, ListSessionsOrder, ListSessionsParams, McpServerMount, Model, ModelCatalogServer, ModelEntry, ModelParams, ModelProperties, ModelProviderBase, ModelProviderCatalogEntry, ModelProviderConfigBase, ModelSelection, ModelSelectorEntry, PageParams, PreviousTurnIdInput, ProviderEntry, ProviderType, RegistrySkill, SandboxCatalogServer, SandboxProviderBase, SandboxProviderCatalogEntry, SandboxProviderConfig, SaveAgentRequest, SaveAgentResult, SearchAgentsParams, SelectRegistrySkillRequest, Session, SessionEventItem, SkillBase, SkillCatalogEntry, SkillCatalogServer, SkillConfigBase, SkillMount, ToolBase, Turn, TurnInputItem, TurnState, TurnStreamData, TurnStreamingEvent, UpdateConnectorRequest, UpdateModelProviderRequest, UpdateSandboxProviderRequest, UpdateSessionRequest, UserMessage, UserMessageContent, UserToolApprovalEvent, UserToolResponseEvent } from '@truefoundry/assistant-ui-runtime/server';
9
+ export { AgentBuilderCapabilitiesResponse, AgentBuilderServer, AgentChatServer, AgentLibraryEntry, AgentSkill, AgentSpec, AgentUIServer, ApprovalDecision, AuthenticateConnectorRequest, CatalogServer, ConnectorAuth, ConnectorAuthApiKey, ConnectorAuthNone, ConnectorAuthOAuth, ConnectorAuthPublic, ConnectorAuthPublicApiKey, ConnectorAuthPublicNone, ConnectorAuthPublicOAuth, ConnectorAuthType, ConnectorAuthenticationResult, ConnectorBase, ConnectorCatalogEntry, ConnectorCatalogServer, ConnectorConfigBase, ConnectorState, CreateConnectorRequest, CreateModelProviderRequest, CreateSandboxProviderRequest, CreateSessionRequest, CreateSkillRequest, CreateSkillRequestBase, DefinedSkill, GithubSkill, ImportGithubSkillRequest, ListResult, ListSessionsOrder, ListSessionsParams, McpServerMount, Model, ModelCatalogServer, ModelEntry, ModelParams, ModelProperties, ModelProviderBase, ModelProviderCatalogEntry, ModelProviderConfigBase, ModelSelection, ModelSelectorEntry, PageParams, PreviousTurnIdInput, ProviderEntry, ProviderType, RegistrySkill, SandboxCatalogServer, SandboxProviderBase, SandboxProviderCatalogEntry, SandboxProviderConfig, SandboxProviderListEntry, SandboxSnapshotSyncStatus, SaveAgentRequest, SaveAgentResult, SearchAgentsParams, SelectRegistrySkillRequest, Session, SessionEventItem, SkillBase, SkillCatalogEntry, SkillCatalogServer, SkillConfigBase, SkillMount, ToolBase, Turn, TurnInputItem, TurnState, TurnStreamData, TurnStreamingEvent, UpdateConnectorRequest, UpdateModelProviderRequest, UpdateSandboxProviderRequest, UpdateSessionRequest, UserMessage, UserMessageContent, UserToolApprovalEvent, UserToolResponseEvent } from '@truefoundry/assistant-ui-runtime/server';
10
10
  export { C as CreateTrueFoundryServerOptions, T as TrueFoundryServer, c as createTrueFoundryServer } from './createTrueFoundryServer-B72bU-J7.js';
11
11
  import { PartState } from '@assistant-ui/core/react';
12
12
 
@@ -1311,6 +1311,7 @@ type SelectLibraryAgentRequest = {
1311
1311
  agentName?: string;
1312
1312
  agentSpec?: AgentSpec;
1313
1313
  };
1314
+ type SettingsSection = 'models' | 'connectors' | 'skills' | 'sandbox';
1314
1315
  type ShellModeContextValue = {
1315
1316
  mode: ShellMode;
1316
1317
  /** Host agentConfig mode (capabilities source). */
@@ -1322,7 +1323,8 @@ type ShellModeContextValue = {
1322
1323
  /** Sidebar / list New Chat control. */
1323
1324
  isNewChatEnabled: boolean;
1324
1325
  settingsOpen: boolean;
1325
- setSettingsOpen: (open: boolean) => void;
1326
+ settingsSection: SettingsSection;
1327
+ setSettingsOpen: (open: boolean, section?: SettingsSection) => void;
1326
1328
  /**
1327
1329
  * Bind from the Agents Library (Try = immutable, Edit = mutable + agentSpec).
1328
1330
  * Prefer this over `selectAgent` / `openDraft` when both fields are available.
@@ -1341,6 +1343,8 @@ type ShellModeContextValue = {
1341
1343
  selectAgent: (agentName: string) => void;
1342
1344
  /** @deprecated Prefer `selectLibraryAgent({ isMutable: true, agentSpec })`. */
1343
1345
  openDraft: () => void;
1346
+ /** Remember plain-draft composer choices as the seed for future new chats. */
1347
+ rememberDraftSpec: (agentSpec: AgentSpec) => void;
1344
1348
  /**
1345
1349
  * Open a history session, remounting when mutability/identity changes.
1346
1350
  * Prefer explicit `isMutable` from the session row; when omitted, agentName
@@ -1416,7 +1420,8 @@ type ChatLayout = 'sidebar' | 'drawer' | 'dock' | 'widget';
1416
1420
  type RuntimeAdapters$1 = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;
1417
1421
  type TrueforgeUIProps = {
1418
1422
  server: TrueforgeServerConfig;
1419
- layout: LayoutProp;
1423
+ /** Built-in layout string or a custom layout component. Defaults to `"sidebar"`. */
1424
+ layout?: LayoutProp;
1420
1425
  overrides?: SlotOverrides;
1421
1426
  theme?: ThemeConfig;
1422
1427
  className?: string;
@@ -1554,10 +1559,13 @@ type DraftCatalogValue = {
1554
1559
  models: ModelSelection[];
1555
1560
  skills: AgentSkill[];
1556
1561
  connectors: ConnectorState[];
1562
+ loaded: boolean;
1557
1563
  loading: boolean;
1558
1564
  error: string | null;
1559
1565
  /** Kick off catalog fetch (idempotent). Call when a picker opens. */
1560
1566
  ensureLoaded: () => void;
1567
+ /** Reload all collections after settings mutate catalog-backed configuration. */
1568
+ refresh: () => void;
1561
1569
  /** Refresh connector auth state without reloading unrelated catalogs. */
1562
1570
  refreshConnectors: () => Promise<void>;
1563
1571
  };