@truefoundry/trueforge-ui 0.3.0-rc.0 → 0.3.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 (115) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +21 -6
  3. package/dist/AgentCodeSnippets-637HQUXD.js +74 -0
  4. package/dist/AgentCodeSnippets-637HQUXD.js.map +1 -0
  5. package/dist/AgentMetricChart-4FYECRIN.js +15 -0
  6. package/dist/AgentOverview-3FJ5EE6N.js +167 -0
  7. package/dist/AgentOverview-3FJ5EE6N.js.map +1 -0
  8. package/dist/AgentSessionEventTimeline-VELWUYPR.js +88 -0
  9. package/dist/AgentSessionEventTimeline-VELWUYPR.js.map +1 -0
  10. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js +591 -0
  11. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +1 -0
  12. package/dist/AgentSessions-T7MOGOTZ.js +275 -0
  13. package/dist/AgentSessions-T7MOGOTZ.js.map +1 -0
  14. package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-ESZ2RSRG.js} +19 -21
  15. package/dist/ConnectorSettings-ESZ2RSRG.js.map +1 -0
  16. package/dist/{DockLayout-LBNQJZNF.js → DockLayout-NLFNU6F2.js} +11 -10
  17. package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-NLFNU6F2.js.map} +1 -1
  18. package/dist/DrawerLayout-PR3SMKA6.js +184 -0
  19. package/dist/DrawerLayout-PR3SMKA6.js.map +1 -0
  20. package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-LYW64IRR.js} +20 -24
  21. package/dist/ModelSettings-LYW64IRR.js.map +1 -0
  22. package/dist/OpenUiFenceBlock-JEPNPJ7U.js +9 -0
  23. package/dist/OpenUiFenceBlock-JEPNPJ7U.js.map +1 -0
  24. package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-DF64LHYI.js} +16 -18
  25. package/dist/SandboxSettings-DF64LHYI.js.map +1 -0
  26. package/dist/SchedulesPage-WQU4H25F.js +15 -0
  27. package/dist/SchedulesPage-WQU4H25F.js.map +1 -0
  28. package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-LSXK2VN4.js} +26 -22
  29. package/dist/SettingsBuilder-LSXK2VN4.js.map +1 -0
  30. package/dist/ShellRouteSync-B22IAV2W.js +255 -0
  31. package/dist/ShellRouteSync-B22IAV2W.js.map +1 -0
  32. package/dist/SidebarLayout-XW6LXB7R.js +309 -0
  33. package/dist/SidebarLayout-XW6LXB7R.js.map +1 -0
  34. package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-64VXUO6J.js} +14 -15
  35. package/dist/SkillSettings-64VXUO6J.js.map +1 -0
  36. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-3TSLV22Q.js} +14 -10
  37. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-3TSLV22Q.js.map} +1 -1
  38. package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-Q5P7PYSJ.js} +17 -13
  39. package/dist/WidgetLayout-Q5P7PYSJ.js.map +1 -0
  40. package/dist/chunk-5I2COQNL.js +119 -0
  41. package/dist/chunk-5I2COQNL.js.map +1 -0
  42. package/dist/chunk-BWHOZFIV.js +587 -0
  43. package/dist/chunk-BWHOZFIV.js.map +1 -0
  44. package/dist/chunk-DJUFS2BW.js +27 -0
  45. package/dist/chunk-DJUFS2BW.js.map +1 -0
  46. package/dist/chunk-FQK2XVVE.js +880 -0
  47. package/dist/chunk-FQK2XVVE.js.map +1 -0
  48. package/dist/chunk-G2TUAD65.js +555 -0
  49. package/dist/chunk-G2TUAD65.js.map +1 -0
  50. package/dist/chunk-GXYAOAK5.js +1357 -0
  51. package/dist/chunk-GXYAOAK5.js.map +1 -0
  52. package/dist/{chunk-FJ5RSSMA.js → chunk-H6WTY5PM.js} +196 -32
  53. package/dist/chunk-H6WTY5PM.js.map +1 -0
  54. package/dist/chunk-I3AL54MA.js +180 -0
  55. package/dist/chunk-I3AL54MA.js.map +1 -0
  56. package/dist/{chunk-WREC7D54.js → chunk-LGRHHFHN.js} +120 -32
  57. package/dist/chunk-LGRHHFHN.js.map +1 -0
  58. package/dist/chunk-NHHSZB5N.js +74 -0
  59. package/dist/chunk-NHHSZB5N.js.map +1 -0
  60. package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
  61. package/dist/chunk-QC42MLAK.js.map +1 -0
  62. package/dist/chunk-RDXBMTP5.js +32 -0
  63. package/dist/chunk-RDXBMTP5.js.map +1 -0
  64. package/dist/chunk-SFZNIO6U.js +18 -0
  65. package/dist/chunk-SFZNIO6U.js.map +1 -0
  66. package/dist/chunk-SQGT43Z3.js +200 -0
  67. package/dist/chunk-SQGT43Z3.js.map +1 -0
  68. package/dist/{chunk-B52K63AW.js → chunk-VJ7BZGAF.js} +2 -2
  69. package/dist/chunk-VUMGMGKZ.js +252 -0
  70. package/dist/chunk-VUMGMGKZ.js.map +1 -0
  71. package/dist/chunk-Y6S4OVVQ.js +16 -0
  72. package/dist/chunk-Y6S4OVVQ.js.map +1 -0
  73. package/dist/chunk-YQO2NMJ3.js +13341 -0
  74. package/dist/chunk-YQO2NMJ3.js.map +1 -0
  75. package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
  76. package/dist/index.d.ts +1024 -24
  77. package/dist/index.js +691 -67
  78. package/dist/index.js.map +1 -1
  79. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -8
  80. package/dist/plugins/trueforge-agent-server-adapter/index.js +504 -188
  81. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  82. package/dist/styles.css +1 -1
  83. package/package.json +9 -8
  84. package/dist/ConnectorSettings-FXQ5B7TN.js.map +0 -1
  85. package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
  86. package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
  87. package/dist/ModelSettings-4L4LOQJA.js.map +0 -1
  88. package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
  89. package/dist/SandboxSettings-Z4ZG6ZX4.js.map +0 -1
  90. package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
  91. package/dist/ShellRouteSync-T4WLY57Q.js +0 -172
  92. package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
  93. package/dist/SidebarLayout-3WZ3CVON.js +0 -256
  94. package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
  95. package/dist/SkillSettings-3EPPC3IT.js.map +0 -1
  96. package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
  97. package/dist/chunk-36KOSC2J.js +0 -567
  98. package/dist/chunk-36KOSC2J.js.map +0 -1
  99. package/dist/chunk-3S6KHO7H.js +0 -2121
  100. package/dist/chunk-3S6KHO7H.js.map +0 -1
  101. package/dist/chunk-7L63OK3O.js +0 -91
  102. package/dist/chunk-7L63OK3O.js.map +0 -1
  103. package/dist/chunk-CFLVPV5M.js.map +0 -1
  104. package/dist/chunk-FJ5RSSMA.js.map +0 -1
  105. package/dist/chunk-OSV3HI5M.js +0 -6891
  106. package/dist/chunk-OSV3HI5M.js.map +0 -1
  107. package/dist/chunk-WQULF5AT.js +0 -460
  108. package/dist/chunk-WQULF5AT.js.map +0 -1
  109. package/dist/chunk-WREC7D54.js.map +0 -1
  110. package/dist/chunk-YIWUG6MC.js +0 -101
  111. package/dist/chunk-YIWUG6MC.js.map +0 -1
  112. package/dist/chunk-ZXOADNF3.js +0 -75
  113. package/dist/chunk-ZXOADNF3.js.map +0 -1
  114. /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-4FYECRIN.js.map} +0 -0
  115. /package/dist/{chunk-B52K63AW.js.map → chunk-VJ7BZGAF.js.map} +0 -0
@@ -1,460 +0,0 @@
1
- // src/server/ServerContext.tsx
2
- import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
3
- import { jsx } from "react/jsx-runtime";
4
- var ServerContext = createContext(null);
5
- var ServerCapabilitiesContext = createContext(null);
6
- function ServerProvider({ server, children }) {
7
- const [capabilities, setCapabilities] = useState(null);
8
- const cancelActiveRequestRef = useRef(null);
9
- const refreshCapabilities = useCallback(() => {
10
- cancelActiveRequestRef.current?.();
11
- let cancelled = false;
12
- cancelActiveRequestRef.current = () => {
13
- cancelled = true;
14
- };
15
- void server.getCapabilities().then((response) => {
16
- if (!cancelled) setCapabilities(response.data);
17
- }).catch(() => {
18
- });
19
- }, [server]);
20
- useEffect(() => {
21
- setCapabilities(null);
22
- refreshCapabilities();
23
- return () => {
24
- cancelActiveRequestRef.current?.();
25
- };
26
- }, [refreshCapabilities]);
27
- const capabilitiesValue = useMemo(
28
- () => ({ capabilities, refresh: refreshCapabilities }),
29
- [capabilities, refreshCapabilities]
30
- );
31
- return /* @__PURE__ */ jsx(ServerContext.Provider, { value: server, children: /* @__PURE__ */ jsx(ServerCapabilitiesContext.Provider, { value: capabilitiesValue, children }) });
32
- }
33
- function useServer() {
34
- const server = useContext(ServerContext);
35
- if (server == null) {
36
- throw new Error("useServer must be used within a ServerProvider.");
37
- }
38
- return server;
39
- }
40
- function useOptionalServer() {
41
- return useContext(ServerContext);
42
- }
43
- function useServerCapabilities() {
44
- return useContext(ServerCapabilitiesContext)?.capabilities ?? null;
45
- }
46
- function useOptionalRefreshServerCapabilities() {
47
- return useContext(ServerCapabilitiesContext)?.refresh ?? null;
48
- }
49
- function useCatalogServer() {
50
- const server = useServer();
51
- if (server.catalog == null) {
52
- throw new Error("useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueFoundryServer.");
53
- }
54
- return server.catalog;
55
- }
56
- function useOptionalCatalogServer() {
57
- return useOptionalServer()?.catalog ?? null;
58
- }
59
-
60
- // src/server/ShellModeContext.tsx
61
- import { createContext as createContext2, useCallback as useCallback2, useContext as useContext2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
62
-
63
- // src/server/draftSpecPreferences.ts
64
- var DRAFT_SPEC_PREFERENCES_STORAGE_KEY = "tfy-aui-draft-spec-preferences";
65
- function isObject(value) {
66
- return typeof value === "object" && value !== null;
67
- }
68
- function isMountList(value) {
69
- return Array.isArray(value) && value.every(isObject);
70
- }
71
- function isAgentSpec(value) {
72
- if (!isObject(value)) return false;
73
- const model = Reflect.get(value, "model");
74
- if (!isObject(model) || typeof Reflect.get(model, "name") !== "string") return false;
75
- const params = Reflect.get(model, "params");
76
- if (params !== void 0 && !isObject(params)) return false;
77
- const skills = Reflect.get(value, "skills");
78
- if (skills !== void 0 && !isMountList(skills)) return false;
79
- const mcpServers = Reflect.get(value, "mcpServers");
80
- if (mcpServers !== void 0 && !isMountList(mcpServers)) return false;
81
- const config = Reflect.get(value, "config");
82
- return config === void 0 || isObject(config);
83
- }
84
- function isStoredDraftSpecPreferences(value) {
85
- return isObject(value) && Reflect.get(value, "version") === 1 && isAgentSpec(Reflect.get(value, "spec"));
86
- }
87
- function selectDraftSpecPreferences(spec) {
88
- return {
89
- model: spec.model,
90
- ...spec.skills !== void 0 ? { skills: spec.skills } : {},
91
- ...spec.mcpServers !== void 0 ? { mcpServers: spec.mcpServers } : {},
92
- ...spec.config !== void 0 ? { config: spec.config } : {}
93
- };
94
- }
95
- function readSandboxEnabled(spec) {
96
- if (spec.config === void 0) return void 0;
97
- const sandbox = Reflect.get(spec.config, "sandbox");
98
- if (!isObject(sandbox)) return void 0;
99
- const enabled = Reflect.get(sandbox, "enabled");
100
- return typeof enabled === "boolean" ? enabled : void 0;
101
- }
102
- function withCapabilitiesSandbox(spec, sandboxEnabled) {
103
- if (sandboxEnabled == null) return spec;
104
- if (readSandboxEnabled(spec) === sandboxEnabled) return spec;
105
- const config = {
106
- ...spec.config,
107
- sandbox: { enabled: sandboxEnabled }
108
- };
109
- return {
110
- ...spec,
111
- config
112
- };
113
- }
114
- function readDraftSpecPreferences() {
115
- if (typeof window === "undefined") return null;
116
- try {
117
- const stored = JSON.parse(window.localStorage.getItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY) ?? "null");
118
- return isStoredDraftSpecPreferences(stored) ? stored.spec : null;
119
- } catch {
120
- return null;
121
- }
122
- }
123
- function writeDraftSpecPreferences(spec) {
124
- if (typeof window === "undefined") return;
125
- try {
126
- const stored = {
127
- version: 1,
128
- spec: selectDraftSpecPreferences(spec)
129
- };
130
- window.localStorage.setItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY, JSON.stringify(stored));
131
- } catch {
132
- }
133
- }
134
-
135
- // src/server/ShellModeContext.tsx
136
- import { jsx as jsx2 } from "react/jsx-runtime";
137
- var DEFAULT_AGENT_CONFIG = {
138
- mode: "AgentLibraryWithComposer"
139
- };
140
- var ShellModeContext = createContext2(null);
141
- var FALLBACK_MUTABLE_SPEC = {
142
- model: { name: "openai-main/gpt-4.1" }
143
- };
144
- function mutableSeedFromConfig(config) {
145
- if (config.mode === "AgentComposer" || config.mode === "AgentLibraryWithComposer") {
146
- return config.defaultAgentSpec ?? FALLBACK_MUTABLE_SPEC;
147
- }
148
- return FALLBACK_MUTABLE_SPEC;
149
- }
150
- function initialMode(config, mutableSeed) {
151
- switch (config.mode) {
152
- case "SingleAgent":
153
- return {
154
- status: "active",
155
- isMutable: false,
156
- agentId: config.name,
157
- agentName: config.name,
158
- locked: true
159
- };
160
- case "AgentLibrary":
161
- return { status: "idle" };
162
- case "AgentComposer":
163
- case "AgentLibraryWithComposer":
164
- return {
165
- status: "active",
166
- isMutable: true,
167
- agentSpec: mutableSeed,
168
- locked: false
169
- };
170
- }
171
- }
172
- function libraryAgentId(agent) {
173
- return agent.agentId ?? agent.name;
174
- }
175
- function ShellModeProvider({
176
- agentConfig = DEFAULT_AGENT_CONFIG,
177
- initialSettingsOpen = false,
178
- children
179
- }) {
180
- const capabilities = useServerCapabilities();
181
- const refreshCapabilities = useOptionalRefreshServerCapabilities();
182
- const rememberedSpecRef = useRef2(readDraftSpecPreferences());
183
- const mutableSeedRef = useRef2(rememberedSpecRef.current ?? mutableSeedFromConfig(agentConfig));
184
- if (rememberedSpecRef.current == null && (agentConfig.mode === "AgentComposer" || agentConfig.mode === "AgentLibraryWithComposer") && agentConfig.defaultAgentSpec != null) {
185
- mutableSeedRef.current = agentConfig.defaultAgentSpec;
186
- }
187
- const mutableSeed = mutableSeedRef.current;
188
- const isLibraryEnabled = agentConfig.mode === "AgentLibrary" || agentConfig.mode === "AgentLibraryWithComposer";
189
- const isComposerEnabled = agentConfig.mode === "AgentComposer" || agentConfig.mode === "AgentLibraryWithComposer";
190
- const isNewChatEnabled = agentConfig.mode !== "AgentLibrary";
191
- const locked = agentConfig.mode === "SingleAgent";
192
- const [mode, setMode] = useState2(() => initialMode(agentConfig, mutableSeed));
193
- const [mutableEpoch, setMutableEpoch] = useState2(0);
194
- const [clearEpoch, setClearEpoch] = useState2(0);
195
- const [agentsListEpoch, setAgentsListEpoch] = useState2(0);
196
- const [settingsOpenState, setSettingsOpenState] = useState2(initialSettingsOpen);
197
- const [settingsSection, setSettingsSection] = useState2("models");
198
- const [historyAgentFilter, setHistoryAgentFilter] = useState2(null);
199
- const [pendingSessionId, setPendingSessionId] = useState2(void 0);
200
- const settingsEnabled = capabilities?.settings?.enabled !== false;
201
- const settingsOpen = settingsEnabled && settingsOpenState;
202
- const setSettingsOpen = useCallback2(
203
- (open, section) => {
204
- if (section !== void 0) {
205
- setSettingsSection(section);
206
- }
207
- setSettingsOpenState(settingsEnabled && open);
208
- },
209
- [settingsEnabled]
210
- );
211
- useEffect2(() => {
212
- if (!settingsEnabled) {
213
- setSettingsOpenState(false);
214
- }
215
- }, [settingsEnabled]);
216
- const invalidateAgentsList = useCallback2(() => {
217
- setAgentsListEpoch((n) => n + 1);
218
- }, []);
219
- const lockedAgentName = agentConfig.mode === "SingleAgent" ? agentConfig.name : "";
220
- const effectiveMode = useMemo2(() => {
221
- if (!locked) return mode;
222
- return {
223
- status: "active",
224
- isMutable: false,
225
- agentId: lockedAgentName,
226
- agentName: lockedAgentName,
227
- locked: true
228
- };
229
- }, [locked, lockedAgentName, mode]);
230
- const listSessionsAgentId = useMemo2(() => {
231
- if (locked) return lockedAgentName;
232
- if (!isLibraryEnabled) return void 0;
233
- return historyAgentFilter ?? void 0;
234
- }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);
235
- const bumpEpoch = useCallback2((isMutable) => {
236
- if (isMutable) setMutableEpoch((n) => n + 1);
237
- else setClearEpoch((n) => n + 1);
238
- }, []);
239
- const selectLibraryAgent = useCallback2(
240
- (req) => {
241
- if (req.isMutable) {
242
- if (!isComposerEnabled) return;
243
- setSettingsOpen(false);
244
- setPendingSessionId(void 0);
245
- setMode({
246
- status: "active",
247
- isMutable: true,
248
- agentId: req.agentId,
249
- agentName: req.agentName,
250
- agentSpec: req.agentSpec ?? mutableSeedRef.current,
251
- locked: false
252
- });
253
- bumpEpoch(true);
254
- return;
255
- }
256
- if (!isLibraryEnabled) return;
257
- const agentName = req.agentName ?? req.agentId;
258
- if (agentName == null) return;
259
- setSettingsOpen(false);
260
- setPendingSessionId(void 0);
261
- setMode({
262
- status: "active",
263
- isMutable: false,
264
- agentId: req.agentId ?? agentName,
265
- agentName,
266
- locked: false
267
- });
268
- bumpEpoch(false);
269
- },
270
- [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen]
271
- );
272
- const bindMutableAgent = useCallback2(
273
- (req) => {
274
- if (!isComposerEnabled) return;
275
- setMode((prev) => {
276
- if (prev.status !== "active" || !prev.isMutable) return prev;
277
- return {
278
- status: "active",
279
- isMutable: true,
280
- agentId: req.agentId,
281
- agentName: req.agentName,
282
- agentSpec: req.agentSpec,
283
- locked: false
284
- };
285
- });
286
- },
287
- [isComposerEnabled]
288
- );
289
- const selectAgent = useCallback2(
290
- (name) => {
291
- selectLibraryAgent({ isMutable: false, agentId: name, agentName: name });
292
- },
293
- [selectLibraryAgent]
294
- );
295
- const openDraft = useCallback2(() => {
296
- if (!isComposerEnabled) return;
297
- refreshCapabilities?.();
298
- selectLibraryAgent({ isMutable: true, agentSpec: mutableSeedRef.current });
299
- }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
300
- const sandboxEnabled = capabilities?.sandbox.enabled;
301
- const rememberDraftSpec = useCallback2(
302
- (agentSpec) => {
303
- const preferences = withCapabilitiesSandbox(selectDraftSpecPreferences(agentSpec), sandboxEnabled);
304
- rememberedSpecRef.current = preferences;
305
- mutableSeedRef.current = preferences;
306
- writeDraftSpecPreferences(preferences);
307
- },
308
- [sandboxEnabled]
309
- );
310
- const openHistorySession = useCallback2(
311
- ({
312
- sessionId,
313
- agentName,
314
- isMutable: isMutableOpt
315
- }) => {
316
- setSettingsOpen(false);
317
- setPendingSessionId(sessionId);
318
- const isMutable = isMutableOpt ?? agentName == null;
319
- if (isMutable) {
320
- if (!isComposerEnabled) return;
321
- setMode({
322
- status: "active",
323
- isMutable: true,
324
- agentSpec: mutableSeedRef.current,
325
- locked: false
326
- });
327
- bumpEpoch(true);
328
- return;
329
- }
330
- if (locked) {
331
- if (agentName == null || lockedAgentName !== agentName) return;
332
- } else if (!isLibraryEnabled) {
333
- return;
334
- }
335
- setMode({
336
- status: "active",
337
- isMutable: false,
338
- locked: false,
339
- ...agentName != null ? { agentId: agentName, agentName } : {}
340
- });
341
- bumpEpoch(false);
342
- },
343
- [isLibraryEnabled, isComposerEnabled, locked, lockedAgentName, bumpEpoch, setSettingsOpen]
344
- );
345
- const clearChat = useCallback2(() => {
346
- if (effectiveMode.status === "idle") return;
347
- setPendingSessionId(void 0);
348
- if (effectiveMode.isMutable) {
349
- setMode({
350
- status: "active",
351
- isMutable: true,
352
- agentId: effectiveMode.agentId,
353
- agentName: effectiveMode.agentName,
354
- agentSpec: effectiveMode.agentSpec ?? mutableSeedRef.current,
355
- locked: false
356
- });
357
- bumpEpoch(true);
358
- return;
359
- }
360
- bumpEpoch(false);
361
- }, [effectiveMode, bumpEpoch]);
362
- const openLibraryHome = useCallback2(() => {
363
- if (!isLibraryEnabled || isComposerEnabled) return;
364
- setPendingSessionId(void 0);
365
- setSettingsOpen(false);
366
- setMode({ status: "idle" });
367
- bumpEpoch(false);
368
- }, [isLibraryEnabled, isComposerEnabled, setSettingsOpen, bumpEpoch]);
369
- const runtimeKey = useMemo2(() => {
370
- if (effectiveMode.status === "idle") return "idle";
371
- if (effectiveMode.isMutable) {
372
- return `mut:${pendingSessionId ?? ""}:${mutableEpoch}`;
373
- }
374
- const id = effectiveMode.agentId ?? effectiveMode.agentName ?? "";
375
- return `immut:${id}:${pendingSessionId ?? ""}:${clearEpoch}`;
376
- }, [effectiveMode, mutableEpoch, clearEpoch, pendingSessionId]);
377
- const value = useMemo2(
378
- () => ({
379
- mode: effectiveMode,
380
- agentConfigMode: agentConfig.mode,
381
- isLibraryEnabled,
382
- isComposerEnabled,
383
- isNewChatEnabled,
384
- settingsOpen,
385
- settingsSection,
386
- setSettingsOpen,
387
- selectLibraryAgent,
388
- bindMutableAgent,
389
- selectAgent,
390
- openDraft,
391
- rememberDraftSpec,
392
- openHistorySession,
393
- clearChat,
394
- openLibraryHome,
395
- runtimeKey,
396
- historyAgentFilter,
397
- setHistoryAgentFilter,
398
- listSessionsAgentId,
399
- pendingSessionId,
400
- agentsListEpoch,
401
- invalidateAgentsList
402
- }),
403
- [
404
- effectiveMode,
405
- agentConfig.mode,
406
- isLibraryEnabled,
407
- isComposerEnabled,
408
- isNewChatEnabled,
409
- settingsOpen,
410
- settingsSection,
411
- setSettingsOpen,
412
- selectLibraryAgent,
413
- bindMutableAgent,
414
- selectAgent,
415
- openDraft,
416
- rememberDraftSpec,
417
- openHistorySession,
418
- clearChat,
419
- openLibraryHome,
420
- runtimeKey,
421
- historyAgentFilter,
422
- listSessionsAgentId,
423
- pendingSessionId,
424
- agentsListEpoch,
425
- invalidateAgentsList
426
- ]
427
- );
428
- return /* @__PURE__ */ jsx2(ShellModeContext.Provider, { value, children });
429
- }
430
- function useShellMode() {
431
- const ctx = useContext2(ShellModeContext);
432
- if (ctx == null) {
433
- throw new Error("useShellMode must be used within a ShellModeProvider.");
434
- }
435
- return ctx;
436
- }
437
- function useOptionalShellMode() {
438
- return useContext2(ShellModeContext);
439
- }
440
- function shellIsMutable(mode) {
441
- return mode.status === "active" && mode.isMutable;
442
- }
443
-
444
- export {
445
- withCapabilitiesSandbox,
446
- ServerProvider,
447
- useServer,
448
- useOptionalServer,
449
- useServerCapabilities,
450
- useOptionalRefreshServerCapabilities,
451
- useCatalogServer,
452
- useOptionalCatalogServer,
453
- DEFAULT_AGENT_CONFIG,
454
- libraryAgentId,
455
- ShellModeProvider,
456
- useShellMode,
457
- useOptionalShellMode,
458
- shellIsMutable
459
- };
460
- //# sourceMappingURL=chunk-WQULF5AT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/ServerContext.tsx","../src/server/ShellModeContext.tsx","../src/server/draftSpecPreferences.ts"],"sourcesContent":["'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 withCapabilitiesSandbox,\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 /** Return pure Agents Library to its idle landing; no-op in other modes. */\n openLibraryHome: () => 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 sandboxEnabled = capabilities?.sandbox.enabled;\n const rememberDraftSpec = useCallback(\n (agentSpec: AgentSpec) => {\n const preferences = withCapabilitiesSandbox(selectDraftSpecPreferences(agentSpec), sandboxEnabled);\n rememberedSpecRef.current = preferences;\n mutableSeedRef.current = preferences;\n writeDraftSpecPreferences(preferences);\n },\n [sandboxEnabled],\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 const openLibraryHome = useCallback(() => {\n // Only pure Agents Library has an idle landing; other modes root via openDraft / clearChat.\n if (!isLibraryEnabled || isComposerEnabled) return;\n setPendingSessionId(undefined);\n setSettingsOpen(false);\n setMode({ status: 'idle' });\n bumpEpoch(false);\n }, [isLibraryEnabled, isComposerEnabled, setSettingsOpen, 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 openLibraryHome,\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 openLibraryHome,\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\nfunction readSandboxEnabled(spec: AgentSpec): boolean | undefined {\n if (spec.config === undefined) return undefined;\n // `sandbox` is persisted on draft config but is not part of AgentRuntimeConfig.\n const sandbox = Reflect.get(spec.config, 'sandbox');\n if (!isObject(sandbox)) return undefined;\n const enabled = Reflect.get(sandbox, 'enabled');\n return typeof enabled === 'boolean' ? enabled : undefined;\n}\n\n/** Align draft `config.sandbox.enabled` with loaded server capabilities; no-op while unknown. */\nexport function withCapabilitiesSandbox(spec: AgentSpec, sandboxEnabled: boolean | null | undefined): AgentSpec {\n if (sandboxEnabled == null) return spec;\n if (readSandboxEnabled(spec) === sandboxEnabled) return spec;\n const config = {\n ...spec.config,\n sandbox: { enabled: sandboxEnabled },\n };\n return {\n ...spec,\n 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"],"mappings":"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","names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","useCallback","useEffect","useMemo","useContext"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/containers/TrueFoundryChatProvider.tsx","../src/containers/TrueForgeUIShell.tsx","../src/atoms/draft/DraftSpecPreferenceBridge.tsx","../src/routing/RemoteIdRouteBridge.tsx","../src/containers/useResolvedServer.ts"],"sourcesContent":["'use client';\n\nimport { AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n trueFoundryAttachmentAdapter,\n useTrueFoundryAgentRuntime,\n type TrueFoundryAgentConfig,\n type UseTrueFoundryAgentRuntimeOptions,\n} from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useMemo, type ReactNode } from 'react';\n\nimport { notifyComposerBusyFailure } from '../hooks/useComposerBusyState.js';\nimport type { AgentUIServer } from '../server/types.js';\nimport { ToasterProvider, useToaster } from './ToasterContainer.js';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nexport type TrueFoundryChatProviderProps = {\n server: AgentUIServer;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n children: ReactNode;\n /** Discriminated agent source. Prefer over legacy `agentName`. */\n agent?: TrueFoundryAgentConfig;\n /** Legacy named-agent shorthand. Prefer `agent: { mode: \"named\", agentName }`. */\n agentName?: string;\n /** Forwarded to `listSessions({ agentId })` for history filtering. */\n listSessionsAgentId?: string;\n};\n\nfunction ChatRuntimeScope({\n server,\n agent,\n agentName,\n listSessionsAgentId,\n initialSessionId,\n adapters,\n onError,\n children,\n}: {\n server: AgentUIServer;\n agent?: TrueFoundryAgentConfig;\n agentName?: string;\n listSessionsAgentId?: string;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n children: ReactNode;\n}) {\n const { showError } = useToaster();\n const reportError = onError ?? showError;\n // composer().send() is void and swallows onNew rejections; clear optimistic\n // busy when the runtime reports a pre-stream failure (e.g. createSession).\n const resolvedOnError = useCallback(\n (error: unknown) => {\n notifyComposerBusyFailure();\n reportError(error);\n },\n [reportError],\n );\n\n const runtime = useTrueFoundryAgentRuntime({\n server: server as never,\n agent,\n agentName,\n listSessionsAgentId,\n initialSessionId,\n onError: resolvedOnError,\n adapters: {\n ...adapters,\n attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter,\n },\n });\n\n return <AssistantRuntimeProvider runtime={runtime as never}>{children}</AssistantRuntimeProvider>;\n}\n\n/**\n * Chat shell: wires `useTrueFoundryAgentRuntime` from `server` and provides\n * assistant-ui + error toasts.\n */\nexport function TrueFoundryChatProvider(props: TrueFoundryChatProviderProps) {\n const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;\n\n const stableServer = useMemo(() => server, [server]);\n\n return (\n <ToasterProvider>\n <ChatRuntimeScope\n server={stableServer}\n agent={agent}\n agentName={agentName}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={initialSessionId}\n adapters={adapters}\n onError={onError}\n >\n {children}\n </ChatRuntimeScope>\n </ToasterProvider>\n );\n}\n","'use client';\n\nimport type { TrueFoundryAgentConfig, UseTrueFoundryAgentRuntimeOptions } from '@truefoundry/assistant-ui-runtime';\nimport { lazy, Suspense, useCallback, useMemo, useState, type ReactNode } from 'react';\n\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { DraftSpecPreferenceBridge } from '../atoms/draft/DraftSpecPreferenceBridge.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { Spinner } from '../atoms/primitives/Spinner.js';\nimport { RemoteIdRouteBridge } from '../routing/RemoteIdRouteBridge.js';\nimport type { ResolvedRoutes, RoutesConfig } from '../routing/types.js';\nimport { CustomActionRenderersProvider, type CustomActionRenderers } from '../server/CustomActionRenderersContext.js';\nimport { ServerProvider } from '../server/ServerContext.js';\nimport { DEFAULT_AGENT_CONFIG, ShellModeProvider, useShellMode, type AgentConfig } from '../server/ShellModeContext.js';\nimport type { TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport { SlotsProvider, type SlotOverrides } from '../theme/SlotsProvider.js';\nimport type { LayoutProp, ThemeConfig } from '../theme/types.js';\nimport { getErrorMessage } from '../utils/getErrorMessage.js';\nimport { TrueFoundryChatProvider, type TrueFoundryChatProviderProps } from './TrueFoundryChatProvider.js';\nimport { useResolvedServer } from './useResolvedServer.js';\n\nconst SidebarLayout = lazy(() => import('../layouts/SidebarLayout.js').then(m => ({ default: m.SidebarLayout })));\nconst DrawerLayout = lazy(() => import('../layouts/DrawerLayout.js').then(m => ({ default: m.DrawerLayout })));\nconst DockLayout = lazy(() => import('../layouts/DockLayout.js').then(m => ({ default: m.DockLayout })));\nconst WidgetLayout = lazy(() => import('../layouts/WidgetLayout.js').then(m => ({ default: m.WidgetLayout })));\nconst ShellRouteSync = lazy(() => import('../routing/ShellRouteSync.js').then(m => ({ default: m.ShellRouteSync })));\n\nexport type ChatLayout = 'sidebar' | 'drawer' | 'dock' | 'widget';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nexport type TrueForgeUIProps = {\n server: TrueForgeServerConfig;\n /** Built-in layout string or a custom layout component. Defaults to `\"sidebar\"`. */\n layout?: LayoutProp;\n overrides?: SlotOverrides;\n theme?: ThemeConfig;\n className?: string;\n initialSessionId?: string;\n adapters?: RuntimeAdapters;\n onError?: (error: unknown) => void;\n /**\n * Agent / library / composer shell mode.\n * Defaults to `{ mode: \"AgentLibraryWithComposer\" }`.\n */\n agentConfig?: AgentConfig;\n /** Open settings on first paint only (host boot with no models configured). */\n initialSettingsOpen?: boolean;\n /**\n * Host UI for pending client-side tools, keyed by tool name.\n * When a pending tool matches, the composer mounts that component instead of Ask User.\n */\n customActionRenderers?: CustomActionRenderers;\n /**\n * Sync shell navigation to the browser URL via react-router (opt-in).\n * Requires `react-router-dom` in the host. Leave off for dock/widget embeds\n * and hosts that own their own router. Defaults to `false`.\n */\n withRouter?: boolean;\n /** URL path customization; only honored when `withRouter`. */\n routes?: RoutesConfig;\n};\n\nexport type TrueForgeUIShellProps = Omit<TrueForgeUIProps, 'withRouter'> & { resolvedRoutes?: ResolvedRoutes };\n\nfunction LayoutFallback({ className }: { className?: string }) {\n return (\n <div\n className={className}\n style={{\n height: '100%',\n minHeight: '12rem',\n background:\n 'linear-gradient(90deg, color-mix(in oklab, var(--secondary-bg) 55%, transparent) 25%, color-mix(in oklab, var(--secondary-bg) 25%, transparent) 50%, color-mix(in oklab, var(--secondary-bg) 55%, transparent) 75%)',\n backgroundSize: '200% 100%',\n animation: 'tfy-aui-pulse 1.2s ease-in-out infinite',\n }}\n aria-hidden\n />\n );\n}\n\n/** Shown while `type: \"truefoundry\"` resolves the agent UI server. */\nexport function ServerInitLoader({ className }: { className?: string }) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n className={cn(\n 'flex h-full min-h-48 w-full flex-1 items-center justify-center bg-primary-bg text-text-secondary',\n className,\n )}\n >\n <Spinner size={28} className=\"text-text-primary\" />\n <span className=\"sr-only\">Loading</span>\n </div>\n );\n}\n\nfunction ServerInitError({ error, className }: { error: unknown; className?: string }) {\n const message = getErrorMessage(error, 'Failed to initialize server');\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex h-full min-h-48 items-center justify-center bg-primary-bg px-6 text-center text-sm text-failure-bg',\n className,\n )}\n >\n {message}\n </div>\n );\n}\n\nfunction isBuiltInLayout(layout: LayoutProp): layout is ChatLayout {\n return layout === 'sidebar' || layout === 'drawer' || layout === 'dock' || layout === 'widget';\n}\n\nfunction BuiltInLayoutView({ layout, className }: { layout: ChatLayout; className?: string }) {\n switch (layout) {\n case 'sidebar':\n return <SidebarLayout className={className} />;\n case 'drawer':\n return <DrawerLayout className={className} />;\n case 'dock':\n return <DockLayout className={className} />;\n case 'widget':\n return <WidgetLayout className={className} />;\n }\n}\n\nfunction LayoutChildren({ layout, className }: { layout: LayoutProp; className?: string }) {\n if (isBuiltInLayout(layout)) {\n return (\n <Suspense fallback={<LayoutFallback className={className} />}>\n <BuiltInLayoutView layout={layout} className={className} />\n </Suspense>\n );\n }\n const HostLayout = layout;\n return <HostLayout className={className} />;\n}\n\nfunction ChatProviderFromShell({\n children,\n initialSessionId: hostInitialSessionId,\n onRemoteIdChange,\n ...providerRest\n}: {\n children: ReactNode;\n /** When routing, reports the active thread's remote id up to `ShellRouteSync`. */\n onRemoteIdChange?: (id: string | undefined) => void;\n} & Omit<TrueFoundryChatProviderProps, 'agent' | 'agentName' | 'listSessionsAgentId' | 'children'>) {\n const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();\n\n // Freeze draft seed for the life of this runtimeKey so bindMutableAgent (identity /\n // instructions on shell) does not push a new defaultAgentSpec into the runtime.\n const draftDefaultAgentSpec = useMemo(() => {\n if (mode.status === 'active' && mode.isMutable) {\n return mode.agentSpec ?? { model: { name: 'openai-main/gpt-4.1' } };\n }\n return { model: { name: 'openai-main/gpt-4.1' } };\n // runtimeKey is the remount boundary for mutable chats.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally keyed on runtimeKey only\n }, [runtimeKey]);\n\n const agent: TrueFoundryAgentConfig = useMemo(() => {\n // idle uses a placeholder draft so layout chrome (useAui) still mounts;\n // layouts render an empty CTA instead of the thread.\n if (mode.status === 'idle') {\n return {\n mode: 'draft',\n defaultAgentSpec: { model: { name: 'openai-main/gpt-4.1' } },\n };\n }\n // Runtime still uses named|draft; shell mutability maps onto that adapter.\n if (!mode.isMutable) {\n const agentName = mode.agentName ?? mode.agentId ?? pendingSessionId;\n if (agentName == null) {\n // Active immutable without identity should not happen; keep chrome mounted.\n return {\n mode: 'draft',\n defaultAgentSpec: { model: { name: 'openai-main/gpt-4.1' } },\n };\n }\n return { mode: 'named', agentName };\n }\n return {\n mode: 'draft',\n defaultAgentSpec: draftDefaultAgentSpec,\n };\n }, [mode, draftDefaultAgentSpec, pendingSessionId]);\n\n return (\n <TrueFoundryChatProvider\n key={runtimeKey}\n {...providerRest}\n agent={agent}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={pendingSessionId ?? hostInitialSessionId}\n >\n <DraftCatalogProvider>\n <DraftSpecPreferenceBridge />\n {onRemoteIdChange != null ? <RemoteIdRouteBridge onRemoteIdChange={onRemoteIdChange} /> : null}\n {children}\n </DraftCatalogProvider>\n </TrueFoundryChatProvider>\n );\n}\n\n/** Internal shell. `resolvedRoutes` present iff mounted under `TrueForgeUIWithRouter`. */\nexport function TrueForgeUIShell(props: TrueForgeUIShellProps) {\n const {\n layout = 'sidebar',\n overrides,\n theme,\n className,\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n server: serverConfig,\n onError,\n customActionRenderers,\n resolvedRoutes,\n routes: _routes,\n ...providerRest\n } = props;\n\n const resolved = useResolvedServer(serverConfig, onError);\n const [activeRemoteId, setActiveRemoteId] = useState<string | undefined>(undefined);\n const handleRemoteIdChange = useCallback((id: string | undefined) => setActiveRemoteId(id), []);\n\n if (resolved.status === 'loading') {\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerInitLoader className={className} />\n </SlotsProvider>\n );\n }\n\n if (resolved.status === 'error') {\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <ServerInitError error={resolved.error} className={className} />\n </SlotsProvider>\n );\n }\n\n const server = resolved.server;\n const layoutTree = <LayoutChildren layout={layout} className={className} />;\n\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <CustomActionRenderersProvider renderers={customActionRenderers}>\n <ServerProvider server={server}>\n <ShellModeProvider agentConfig={agentConfig} initialSettingsOpen={initialSettingsOpen}>\n {resolvedRoutes != null ? (\n <Suspense fallback={null}>\n <ShellRouteSync\n routes={resolvedRoutes}\n activeRemoteId={activeRemoteId}\n initialSettingsOpen={initialSettingsOpen}\n />\n </Suspense>\n ) : null}\n <ChatProviderFromShell\n server={server}\n onError={onError}\n onRemoteIdChange={resolvedRoutes != null ? handleRemoteIdChange : undefined}\n {...providerRest}\n >\n {layoutTree}\n </ChatProviderFromShell>\n </ShellModeProvider>\n </ServerProvider>\n </CustomActionRenderersProvider>\n </SlotsProvider>\n );\n}\n","'use client';\n\nimport { useTrueFoundryAgentSpec, useTrueFoundryUpdateAgentSpec } from '@truefoundry/assistant-ui-runtime';\nimport { useEffect } from 'react';\n\nimport { withCapabilitiesSandbox } from '../../server/draftSpecPreferences.js';\nimport { useServerCapabilities } from '../../server/ServerContext.js';\nimport { useShellMode } from '../../server/ShellModeContext.js';\nimport type { AgentSkill, AgentSpec, ConnectorState, ModelSelection } from '../../server/types.js';\nimport { useDraftCatalog } from './DraftCatalogProvider.js';\nimport { modelPatchWithReasoningEffort } from './reasoningEffort.js';\n\nfunction mountName(mount: object): string | null {\n const name = Reflect.get(mount, 'name');\n return typeof name === 'string' ? name : null;\n}\n\nfunction filterMounts<T extends object>(mounts: T[] | undefined, availableNames: Set<string>): T[] | undefined {\n if (mounts === undefined) return undefined;\n const filtered = mounts.filter(mount => {\n const name = mountName(mount);\n return name !== null && availableNames.has(name);\n });\n return filtered.length === mounts.length ? mounts : filtered;\n}\n\nexport function reconcileDraftSpecPreferences({\n agentSpec,\n models,\n skills,\n connectors,\n skillsEnabled,\n}: {\n agentSpec: AgentSpec;\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n skillsEnabled: boolean | undefined;\n}): Partial<AgentSpec> {\n const update: Partial<AgentSpec> = {};\n const selectedModel = agentSpec.model.name.trim();\n if (!models.some(model => model.name === selectedModel)) {\n const fallback = models[0];\n if (fallback !== undefined) {\n update.model = modelPatchWithReasoningEffort(\n fallback.name,\n agentSpec.model.params,\n fallback.properties.reasoningEfforts,\n );\n }\n }\n\n const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map(connector => connector.name)));\n if (nextMcpServers !== agentSpec.mcpServers) {\n update.mcpServers = nextMcpServers;\n }\n\n if (skillsEnabled === false) {\n // Only clear when there is something to clear — a fresh `[]` each call would\n // fail reference equality and loop `updateAgentSpec` forever.\n if (agentSpec.skills !== undefined && agentSpec.skills.length > 0) {\n update.skills = [];\n }\n } else {\n const nextSkills = filterMounts(agentSpec.skills, new Set(skills.map(skill => skill.name)));\n if (nextSkills !== agentSpec.skills) {\n update.skills = nextSkills;\n }\n }\n\n return update;\n}\n\nexport function reconcileDraftSandbox({\n agentSpec,\n sandboxEnabled,\n}: {\n agentSpec: AgentSpec;\n sandboxEnabled: boolean | null | undefined;\n}): Partial<AgentSpec> {\n const nextSpec = withCapabilitiesSandbox(agentSpec, sandboxEnabled);\n return nextSpec === agentSpec ? {} : { config: nextSpec.config };\n}\n\n/**\n * Mirrors plain-draft composer choices into the shell seed and removes catalog\n * entries that disappeared since those choices were stored.\n */\nexport function DraftSpecPreferenceBridge() {\n const { mode, pendingSessionId, rememberDraftSpec } = useShellMode();\n const { agentSpec } = useTrueFoundryAgentSpec();\n const updateAgentSpec = useTrueFoundryUpdateAgentSpec();\n const capabilities = useServerCapabilities();\n const sandboxEnabled = capabilities?.sandbox.enabled;\n const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();\n const isPlainDraft = mode.status === 'active' && mode.isMutable && mode.agentId == null && pendingSessionId == null;\n\n useEffect(() => {\n if (isPlainDraft) ensureLoaded();\n }, [ensureLoaded, isPlainDraft]);\n\n useEffect(() => {\n if (isPlainDraft && agentSpec != null) {\n rememberDraftSpec(agentSpec);\n }\n }, [agentSpec, isPlainDraft, rememberDraftSpec]);\n\n useEffect(() => {\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null) return;\n const update = reconcileDraftSandbox({ agentSpec, sandboxEnabled });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [agentSpec, isPlainDraft, sandboxEnabled, updateAgentSpec]);\n\n useEffect(() => {\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null || !loaded || error != null) return;\n\n const update = reconcileDraftSpecPreferences({\n agentSpec,\n models,\n skills,\n connectors,\n skillsEnabled: capabilities?.skill.enabled,\n });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [\n agentSpec,\n capabilities?.skill.enabled,\n connectors,\n error,\n isPlainDraft,\n loaded,\n models,\n skills,\n updateAgentSpec,\n ]);\n\n return null;\n}\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { useAuiState } from '../assistant-ui.js';\n\n/**\n * Observes the active thread's remote id (assigned once a fresh chat persists)\n * and lifts it to the parent so `ShellRouteSync` can mirror it to `/sessions/:id`.\n * Lives inside the chat runtime, so it remounts with `runtimeKey`; reporting is\n * idempotent, so that is harmless. Carries no react-router dependency.\n */\nexport function RemoteIdRouteBridge({ onRemoteIdChange }: { onRemoteIdChange: (id: string | undefined) => void }) {\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n useEffect(() => {\n onRemoteIdChange(remoteId ?? undefined);\n }, [remoteId, onRemoteIdChange]);\n return null;\n}\n","'use client';\n\nimport { createTrueFoundryAgentUIServer } from '@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter';\nimport { useEffect, useState } from 'react';\n\nimport type { TrueForgeBuiltInServerConfig, TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport type { AgentBuilderCapabilitiesResponse, AgentUIServer, CatalogServer } from '../server/types.js';\n\nexport type ResolvedServerState =\n | { status: 'loading'; server: null; error: null }\n | { status: 'ready'; server: AgentUIServer; error: null }\n | { status: 'error'; server: null; error: unknown };\n\n/** Fallback when an older runtime adapter omits `getCapabilities`. */\nconst DEFAULT_CAPABILITIES = {\n data: {\n sandbox: { enabled: true },\n skill: { enabled: true },\n settings: { enabled: true },\n },\n} satisfies AgentBuilderCapabilitiesResponse;\n\nfunction isBuiltInConfig(config: TrueForgeServerConfig): config is TrueForgeBuiltInServerConfig {\n return (\n typeof config === 'object' &&\n config !== null &&\n 'type' in config &&\n (config.type === 'truefoundry' || config.type === 'trueforge')\n );\n}\n\nfunction hasGetCapabilities(\n server: object,\n): server is { getCapabilities: () => Promise<AgentBuilderCapabilitiesResponse> } {\n return typeof Reflect.get(server, 'getCapabilities') === 'function';\n}\n\n/**\n * Attach optional catalog and ensure `getCapabilities` exists on the composed port.\n */\nfunction toAgentUIServer(server: object, catalog: CatalogServer | undefined): AgentUIServer {\n const getCapabilities = hasGetCapabilities(server)\n ? () => server.getCapabilities()\n : async () => DEFAULT_CAPABILITIES;\n const withCapabilities = { ...server, getCapabilities };\n const withCatalog = catalog != null ? { ...withCapabilities, catalog } : withCapabilities;\n if (!isAgentUIServer(withCatalog)) {\n throw new Error('TrueForgeUI: runtime adapter returned an incomplete AgentUIServer');\n }\n return withCatalog;\n}\n\nfunction isAgentUIServer(value: object): value is AgentUIServer {\n return (\n typeof Reflect.get(value, 'createSession') === 'function' &&\n typeof Reflect.get(value, 'listSessions') === 'function' &&\n typeof Reflect.get(value, 'getSession') === 'function' &&\n typeof Reflect.get(value, 'updateSession') === 'function' &&\n typeof Reflect.get(value, 'createTurn') === 'function' &&\n typeof Reflect.get(value, 'cancelSession') === 'function' &&\n typeof Reflect.get(value, 'listTurns') === 'function' &&\n typeof Reflect.get(value, 'getTurn') === 'function' &&\n typeof Reflect.get(value, 'listEvents') === 'function' &&\n typeof Reflect.get(value, 'getCapabilities') === 'function' &&\n typeof Reflect.get(value, 'getModels') === 'function' &&\n typeof Reflect.get(value, 'getSkills') === 'function' &&\n typeof Reflect.get(value, 'getMcp') === 'function' &&\n typeof Reflect.get(value, 'searchAgents') === 'function' &&\n typeof Reflect.get(value, 'saveAgent') === 'function'\n );\n}\n\n/**\n * Resolves a {@link TrueForgeServerConfig} to an {@link AgentUIServer}.\n * - `AgentUIServer` — sync passthrough\n * - `truefoundry` — async via `createTrueFoundryAgentUIServer`\n * - `trueforge` — via dynamic import of the Harness plugin adapter\n */\nexport function useResolvedServer(\n config: TrueForgeServerConfig,\n onError?: (error: unknown) => void,\n): ResolvedServerState {\n const builtIn = isBuiltInConfig(config) ? config : null;\n const directServer: AgentUIServer | null = isBuiltInConfig(config) ? null : config;\n const type = builtIn?.type;\n const apiKey = builtIn?.type === 'truefoundry' ? builtIn.apiKey : '';\n const controlPlaneURL = builtIn?.type === 'truefoundry' ? builtIn.controlPlaneURL : '';\n const gatewayPlaneURL = builtIn?.type === 'truefoundry' ? (builtIn.gatewayPlaneURL ?? '') : '';\n const trueforgeBaseUrl = builtIn?.type === 'trueforge' ? (builtIn.baseUrl ?? '') : '';\n const trueforgeToken = builtIn?.type === 'trueforge' ? (builtIn.token ?? '') : '';\n const trueforgeFetch = builtIn?.type === 'trueforge' ? builtIn.fetch : undefined;\n const catalog = builtIn?.catalog;\n\n const [state, setState] = useState<ResolvedServerState>(() => {\n if (directServer) {\n return { status: 'ready', server: directServer, error: null };\n }\n return { status: 'loading', server: null, error: null };\n });\n\n useEffect(() => {\n if (directServer) {\n setState({ status: 'ready', server: directServer, error: null });\n return;\n }\n\n let cancelled = false;\n setState({ status: 'loading', server: null, error: null });\n\n const resolve = async (): Promise<AgentUIServer> => {\n if (type === 'trueforge') {\n const { createTrueForgeAgentUIServer } = await import('../plugins/trueforge-agent-server-adapter/index.js');\n return createTrueForgeAgentUIServer({\n ...(trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {}),\n ...(trueforgeToken ? { token: trueforgeToken } : {}),\n ...(trueforgeFetch !== undefined ? { fetch: trueforgeFetch } : {}),\n ...(catalog != null ? { catalog } : {}),\n });\n }\n\n const runtimeServer = await createTrueFoundryAgentUIServer({\n apiKey,\n cpURL: controlPlaneURL,\n ...(gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}),\n });\n // TrueFoundry adapter may omit catalog; attach host-supplied catalog here.\n return toAgentUIServer(runtimeServer, catalog);\n };\n\n void resolve()\n .then(server => {\n if (cancelled) return;\n try {\n // trueforge factory already includes catalog; still normalize capabilities.\n setState({\n status: 'ready',\n server: type === 'trueforge' ? toAgentUIServer(server, undefined) : server,\n error: null,\n });\n } catch (error: unknown) {\n onError?.(error);\n setState({ status: 'error', server: null, error });\n }\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n onError?.(error);\n setState({ status: 'error', server: null, error });\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n type,\n directServer,\n apiKey,\n controlPlaneURL,\n gatewayPlaneURL,\n trueforgeBaseUrl,\n trueforgeToken,\n trueforgeFetch,\n catalog,\n onError,\n ]);\n\n return state;\n}\n"],"mappings":"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","names":["useCallback","useMemo","useState","useEffect","useEffect","useEffect","jsx","useMemo","useState","useCallback"]}