@truefoundry/trueforge-ui 0.3.0-rc.1 → 0.3.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +143 -0
- package/README.md +23 -8
- package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-RJBB4DDE.js} +38 -23
- package/dist/AgentCodeSnippets-RJBB4DDE.js.map +1 -0
- package/dist/AgentMetricChart-UPGSJ2WP.js +15 -0
- package/dist/{AgentOverview-EEBHJC32.js → AgentOverview-U5WIQXZN.js} +11 -9
- package/dist/AgentOverview-U5WIQXZN.js.map +1 -0
- package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-GRGIQTRE.js} +19 -10
- package/dist/AgentSessionEventTimeline-GRGIQTRE.js.map +1 -0
- package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-GNF4VOUT.js} +144 -57
- package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js.map +1 -0
- package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-5OTF2BUW.js} +72 -24
- package/dist/AgentSessions-5OTF2BUW.js.map +1 -0
- package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-HDKGLDCY.js} +162 -126
- package/dist/ConnectorSettings-HDKGLDCY.js.map +1 -0
- package/dist/{DockLayout-LM4AFMFY.js → DockLayout-D2FPQCAL.js} +10 -10
- package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-HUV7RAWL.js} +14 -12
- package/dist/DrawerLayout-HUV7RAWL.js.map +1 -0
- package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-VNQ7HPKH.js} +22 -28
- package/dist/ModelSettings-VNQ7HPKH.js.map +1 -0
- package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
- package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-ZLXGMFBF.js} +17 -21
- package/dist/SandboxSettings-ZLXGMFBF.js.map +1 -0
- package/dist/SchedulesPage-QKYI2Z3A.js +15 -0
- package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-RVVYXOJW.js} +9 -9
- package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-RVVYXOJW.js.map} +1 -1
- package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-SJXFKUAJ.js} +171 -26
- package/dist/ShellRouteSync-SJXFKUAJ.js.map +1 -0
- package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-KYA76FQ7.js} +80 -58
- package/dist/SidebarLayout-KYA76FQ7.js.map +1 -0
- package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-7OHT7FPI.js} +24 -22
- package/dist/SkillSettings-7OHT7FPI.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-LKG4XLW6.js} +9 -9
- package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-W2RGGOQ3.js} +10 -10
- package/dist/{chunk-U7KURWW3.js → chunk-2GIZY3JJ.js} +276 -54
- package/dist/chunk-2GIZY3JJ.js.map +1 -0
- package/dist/{chunk-WVE3F724.js → chunk-2QTH6JHX.js} +21 -4
- package/dist/chunk-2QTH6JHX.js.map +1 -0
- package/dist/{chunk-XAU7QFG3.js → chunk-3ZW74FHC.js} +68 -256
- package/dist/chunk-3ZW74FHC.js.map +1 -0
- package/dist/{chunk-FJW36PD7.js → chunk-67ZO7Z2W.js} +28 -24
- package/dist/chunk-67ZO7Z2W.js.map +1 -0
- package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
- package/dist/chunk-7AAO4UDQ.js.map +1 -0
- package/dist/{chunk-MPNSO7E6.js → chunk-CG75X77Q.js} +2 -2
- package/dist/chunk-DPPOEFBD.js +517 -0
- package/dist/chunk-DPPOEFBD.js.map +1 -0
- package/dist/{chunk-6O6FWUDW.js → chunk-EPAL2HD5.js} +641 -388
- package/dist/chunk-EPAL2HD5.js.map +1 -0
- package/dist/{chunk-ZTMKFZQ3.js → chunk-GG23N2GW.js} +5099 -3295
- package/dist/chunk-GG23N2GW.js.map +1 -0
- package/dist/chunk-JCL3Q7RW.js +587 -0
- package/dist/chunk-JCL3Q7RW.js.map +1 -0
- package/dist/{chunk-M62XY4NC.js → chunk-JKEBMGLH.js} +235 -108
- package/dist/chunk-JKEBMGLH.js.map +1 -0
- package/dist/{chunk-DMMZSZTN.js → chunk-KSGNKS2D.js} +60 -16
- package/dist/chunk-KSGNKS2D.js.map +1 -0
- package/dist/{chunk-CYHJDKFB.js → chunk-PCI6VMB5.js} +189 -52
- package/dist/chunk-PCI6VMB5.js.map +1 -0
- package/dist/{chunk-ZKNUMH2M.js → chunk-PQ7VWBQQ.js} +13 -11
- package/dist/chunk-PQ7VWBQQ.js.map +1 -0
- package/dist/chunk-T6QQV5LK.js +238 -0
- package/dist/chunk-T6QQV5LK.js.map +1 -0
- package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
- package/dist/index.d.ts +369 -108
- package/dist/index.js +69 -488
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +49 -14
- package/dist/plugins/trueforge-agent-server-adapter/index.js +138 -50
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -4
- package/dist/AgentCodeSnippets-NZOFJE57.js.map +0 -1
- package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
- package/dist/AgentOverview-EEBHJC32.js.map +0 -1
- package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
- package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
- package/dist/AgentSessions-3MPDZASK.js.map +0 -1
- package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
- package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
- package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
- package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
- package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
- package/dist/SchedulesPage-KKLUDO6B.js +0 -15
- package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
- package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
- package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
- package/dist/chunk-2XPPBEYF.js +0 -74
- package/dist/chunk-2XPPBEYF.js.map +0 -1
- package/dist/chunk-6O6FWUDW.js.map +0 -1
- package/dist/chunk-7Z2C2K7F.js +0 -578
- package/dist/chunk-7Z2C2K7F.js.map +0 -1
- package/dist/chunk-CYHJDKFB.js.map +0 -1
- package/dist/chunk-DMMZSZTN.js.map +0 -1
- package/dist/chunk-FJW36PD7.js.map +0 -1
- package/dist/chunk-M62XY4NC.js.map +0 -1
- package/dist/chunk-QC42MLAK.js.map +0 -1
- package/dist/chunk-SFZNIO6U.js +0 -18
- package/dist/chunk-SFZNIO6U.js.map +0 -1
- package/dist/chunk-U7KURWW3.js.map +0 -1
- package/dist/chunk-WVE3F724.js.map +0 -1
- package/dist/chunk-XAU7QFG3.js.map +0 -1
- package/dist/chunk-ZKNUMH2M.js.map +0 -1
- package/dist/chunk-ZTMKFZQ3.js.map +0 -1
- /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-UPGSJ2WP.js.map} +0 -0
- /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-D2FPQCAL.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-KPZFLUSC.js.map} +0 -0
- /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-QKYI2Z3A.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-LKG4XLW6.js.map} +0 -0
- /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-W2RGGOQ3.js.map} +0 -0
- /package/dist/{chunk-MPNSO7E6.js.map → chunk-CG75X77Q.js.map} +0 -0
|
@@ -10,46 +10,87 @@ import {
|
|
|
10
10
|
} from "./chunk-Y6S4OVVQ.js";
|
|
11
11
|
import {
|
|
12
12
|
IS_CREATE_AGENT_METADATA_KEY,
|
|
13
|
-
isCreateAgentMetadataValue
|
|
13
|
+
isCreateAgentMetadataValue,
|
|
14
|
+
sessionIsCreateAgent
|
|
14
15
|
} from "./chunk-RDXBMTP5.js";
|
|
15
16
|
import {
|
|
17
|
+
ActiveSessionPermissionsProvider,
|
|
16
18
|
AgentConfigInstructionsProvider,
|
|
19
|
+
CurrentUserProvider,
|
|
17
20
|
SlotsProvider,
|
|
18
21
|
ToasterProvider,
|
|
19
22
|
modelPatchWithReasoningEffort,
|
|
20
23
|
mountName,
|
|
24
|
+
useThemeMode,
|
|
21
25
|
useToaster
|
|
22
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-GG23N2GW.js";
|
|
23
27
|
import {
|
|
24
28
|
DraftCatalogProvider,
|
|
25
|
-
Spinner,
|
|
26
|
-
getErrorMessage,
|
|
27
29
|
useDraftCatalog
|
|
28
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-3ZW74FHC.js";
|
|
29
31
|
import {
|
|
30
32
|
DEFAULT_AGENT_CONFIG,
|
|
31
33
|
ServerProvider,
|
|
32
34
|
ShellModeProvider,
|
|
35
|
+
getErrorMessage,
|
|
36
|
+
isSessionsChromeEnabled,
|
|
33
37
|
readSessionShareSearch,
|
|
38
|
+
useOptionalAgentSessionsServer,
|
|
39
|
+
useOptionalShellMode,
|
|
34
40
|
useServerCapabilities,
|
|
35
41
|
useShellMode,
|
|
36
42
|
withCapabilitiesSandbox
|
|
37
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-2GIZY3JJ.js";
|
|
38
44
|
import {
|
|
45
|
+
useAui,
|
|
39
46
|
useAuiState
|
|
40
47
|
} from "./chunk-M6MHLVSO.js";
|
|
41
48
|
import {
|
|
42
49
|
cn
|
|
43
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-JCL3Q7RW.js";
|
|
44
51
|
|
|
45
52
|
// src/containers/TrueFoundryChatProvider.tsx
|
|
46
|
-
import { AssistantRuntimeProvider } from "@assistant-ui/react";
|
|
53
|
+
import { AssistantRuntimeProvider, useAuiState as useAuiState2 } from "@assistant-ui/react";
|
|
47
54
|
import {
|
|
48
55
|
trueFoundryAttachmentAdapter,
|
|
49
56
|
useTrueFoundryAgentRuntime
|
|
50
57
|
} from "@truefoundry/assistant-ui-runtime";
|
|
51
58
|
import { useCallback, useMemo } from "react";
|
|
52
59
|
import { jsx } from "react/jsx-runtime";
|
|
60
|
+
function ActiveSessionPermissionScope({
|
|
61
|
+
locallyCreatedSessionIds,
|
|
62
|
+
children
|
|
63
|
+
}) {
|
|
64
|
+
const remoteId = useAuiState2((state) => state.threadListItem.remoteId);
|
|
65
|
+
return /* @__PURE__ */ jsx(
|
|
66
|
+
ActiveSessionPermissionsProvider,
|
|
67
|
+
{
|
|
68
|
+
sessionId: remoteId,
|
|
69
|
+
assumeManage: remoteId != null && locallyCreatedSessionIds.has(remoteId),
|
|
70
|
+
children
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
function runtimeServer({
|
|
75
|
+
server,
|
|
76
|
+
locallyCreatedSessionIds
|
|
77
|
+
}) {
|
|
78
|
+
return {
|
|
79
|
+
...server,
|
|
80
|
+
async createSession(request) {
|
|
81
|
+
const session = await server.createSession(request);
|
|
82
|
+
locallyCreatedSessionIds.add(session.id);
|
|
83
|
+
return session;
|
|
84
|
+
},
|
|
85
|
+
async listSessions(request) {
|
|
86
|
+
const result = await server.listSessions(request);
|
|
87
|
+
return {
|
|
88
|
+
...result,
|
|
89
|
+
data: result.data.filter((session) => !sessionIsCreateAgent(session))
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
53
94
|
function ChatRuntimeScope({
|
|
54
95
|
server,
|
|
55
96
|
agent,
|
|
@@ -62,6 +103,12 @@ function ChatRuntimeScope({
|
|
|
62
103
|
}) {
|
|
63
104
|
const { showError } = useToaster();
|
|
64
105
|
const reportError = onError ?? showError;
|
|
106
|
+
const localSessionState = useMemo(() => ({ server, ids: /* @__PURE__ */ new Set() }), [server]);
|
|
107
|
+
const locallyCreatedSessionIds = localSessionState.ids;
|
|
108
|
+
const historyServer = useMemo(
|
|
109
|
+
() => runtimeServer({ server, locallyCreatedSessionIds }),
|
|
110
|
+
[locallyCreatedSessionIds, server]
|
|
111
|
+
);
|
|
65
112
|
const resolvedOnError = useCallback(
|
|
66
113
|
(error) => {
|
|
67
114
|
notifyComposerBusyFailure();
|
|
@@ -70,10 +117,11 @@ function ChatRuntimeScope({
|
|
|
70
117
|
[reportError]
|
|
71
118
|
);
|
|
72
119
|
const runtime = useTrueFoundryAgentRuntime({
|
|
73
|
-
server,
|
|
120
|
+
server: historyServer,
|
|
74
121
|
agent,
|
|
75
122
|
agentName,
|
|
76
123
|
listSessionsAgentId,
|
|
124
|
+
listSessionsCreatedByMe: true,
|
|
77
125
|
initialSessionId,
|
|
78
126
|
onError: resolvedOnError,
|
|
79
127
|
adapters: {
|
|
@@ -81,7 +129,7 @@ function ChatRuntimeScope({
|
|
|
81
129
|
attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter
|
|
82
130
|
}
|
|
83
131
|
});
|
|
84
|
-
return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children });
|
|
132
|
+
return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx(ActiveSessionPermissionScope, { locallyCreatedSessionIds, children }) });
|
|
85
133
|
}
|
|
86
134
|
function TrueFoundryChatProvider(props) {
|
|
87
135
|
const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;
|
|
@@ -103,6 +151,7 @@ function TrueFoundryChatProvider(props) {
|
|
|
103
151
|
|
|
104
152
|
// src/containers/TrueForgeUIShell.tsx
|
|
105
153
|
import { lazy, Suspense, useCallback as useCallback2, useMemo as useMemo2, useState as useState2 } from "react";
|
|
154
|
+
import { ThinkingOrb } from "thinking-orbs";
|
|
106
155
|
|
|
107
156
|
// src/atoms/draft/DraftSpecPreferenceBridge.tsx
|
|
108
157
|
import { useTrueFoundryAgentSpec, useTrueFoundryUpdateAgentSpec } from "@truefoundry/assistant-ui-runtime";
|
|
@@ -127,7 +176,6 @@ function reconcileDraftSpecPreferences({
|
|
|
127
176
|
models,
|
|
128
177
|
skills,
|
|
129
178
|
connectors,
|
|
130
|
-
connectorsHasMore = false,
|
|
131
179
|
skillsEnabled
|
|
132
180
|
}) {
|
|
133
181
|
const update = {};
|
|
@@ -142,11 +190,9 @@ function reconcileDraftSpecPreferences({
|
|
|
142
190
|
);
|
|
143
191
|
}
|
|
144
192
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
update.mcpServers = nextMcpServers;
|
|
149
|
-
}
|
|
193
|
+
const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
|
|
194
|
+
if (nextMcpServers !== agentSpec.mcpServers) {
|
|
195
|
+
update.mcpServers = nextMcpServers;
|
|
150
196
|
}
|
|
151
197
|
if (skillsEnabled === false) {
|
|
152
198
|
if (agentSpec.skills !== void 0 && agentSpec.skills.length > 0) {
|
|
@@ -195,7 +241,7 @@ function DraftSpecPreferenceBridge() {
|
|
|
195
241
|
const updateAgentSpec = useTrueFoundryUpdateAgentSpec();
|
|
196
242
|
const capabilities = useServerCapabilities();
|
|
197
243
|
const sandboxEnabled = capabilities?.sandbox.enabled;
|
|
198
|
-
const { models, skills, connectors,
|
|
244
|
+
const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();
|
|
199
245
|
const isPlainDraft = mode.status === "active" && mode.isMutable && mode.agentId == null && pendingSessionId == null;
|
|
200
246
|
const preferenceKind = mode.status === "active" && mode.isMutable && mode.isCreateAgent ? "agent" : "chat";
|
|
201
247
|
useEffect(() => {
|
|
@@ -220,7 +266,6 @@ function DraftSpecPreferenceBridge() {
|
|
|
220
266
|
models,
|
|
221
267
|
skills,
|
|
222
268
|
connectors,
|
|
223
|
-
connectorsHasMore,
|
|
224
269
|
skillsEnabled: capabilities?.skill.enabled
|
|
225
270
|
});
|
|
226
271
|
if (Object.keys(update).length > 0) {
|
|
@@ -230,7 +275,6 @@ function DraftSpecPreferenceBridge() {
|
|
|
230
275
|
agentSpec,
|
|
231
276
|
capabilities?.skill.enabled,
|
|
232
277
|
connectors,
|
|
233
|
-
connectorsHasMore,
|
|
234
278
|
error,
|
|
235
279
|
isPlainDraft,
|
|
236
280
|
loaded,
|
|
@@ -241,11 +285,28 @@ function DraftSpecPreferenceBridge() {
|
|
|
241
285
|
return null;
|
|
242
286
|
}
|
|
243
287
|
|
|
244
|
-
// src/routing/
|
|
288
|
+
// src/routing/HistorySessionSwitchBridge.tsx
|
|
245
289
|
import { useEffect as useEffect2 } from "react";
|
|
290
|
+
function HistorySessionSwitchBridge() {
|
|
291
|
+
const shell = useOptionalShellMode();
|
|
292
|
+
const aui = useAui();
|
|
293
|
+
const pendingSessionId = shell?.pendingSessionId;
|
|
294
|
+
const pendingSessionEpoch = shell?.pendingSessionEpoch ?? 0;
|
|
295
|
+
useEffect2(() => {
|
|
296
|
+
if (pendingSessionId == null) return;
|
|
297
|
+
void Promise.resolve(aui.threads().switchToThread(pendingSessionId)).catch(() => void 0);
|
|
298
|
+
}, [aui, pendingSessionId, pendingSessionEpoch]);
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// src/routing/LibrarySessionShareBoot.tsx
|
|
303
|
+
import { useEffect as useEffect3 } from "react";
|
|
246
304
|
function LibrarySessionShareBoot() {
|
|
247
305
|
const { openLibraryAgent, setSessionsOpen } = useShellMode();
|
|
248
|
-
|
|
306
|
+
const sessions = useOptionalAgentSessionsServer();
|
|
307
|
+
const sessionsEnabled = isSessionsChromeEnabled({ sessions });
|
|
308
|
+
useEffect3(() => {
|
|
309
|
+
if (!sessionsEnabled) return;
|
|
249
310
|
const share = readSessionShareSearch(window.location.search);
|
|
250
311
|
if (share.view === "sessions") {
|
|
251
312
|
setSessionsOpen(true);
|
|
@@ -253,23 +314,71 @@ function LibrarySessionShareBoot() {
|
|
|
253
314
|
}
|
|
254
315
|
if (share.agentId == null) return;
|
|
255
316
|
openLibraryAgent(share.agentId);
|
|
256
|
-
}, [openLibraryAgent, setSessionsOpen]);
|
|
317
|
+
}, [openLibraryAgent, sessionsEnabled, setSessionsOpen]);
|
|
257
318
|
return null;
|
|
258
319
|
}
|
|
259
320
|
|
|
260
321
|
// src/routing/RemoteIdRouteBridge.tsx
|
|
261
|
-
import { useEffect as
|
|
322
|
+
import { useEffect as useEffect4 } from "react";
|
|
262
323
|
function RemoteIdRouteBridge({ onRemoteIdChange }) {
|
|
263
324
|
const remoteId = useAuiState((s) => s.threadListItem.remoteId);
|
|
264
|
-
|
|
325
|
+
useEffect4(() => {
|
|
265
326
|
onRemoteIdChange(remoteId ?? void 0);
|
|
266
327
|
}, [remoteId, onRemoteIdChange]);
|
|
267
328
|
return null;
|
|
268
329
|
}
|
|
269
330
|
|
|
331
|
+
// src/server/sessionListCache.ts
|
|
332
|
+
var SESSION_LIST_TTL_MS = 3e4;
|
|
333
|
+
function createSessionListCache() {
|
|
334
|
+
return /* @__PURE__ */ new Map();
|
|
335
|
+
}
|
|
336
|
+
function cacheKey(request) {
|
|
337
|
+
const rest = { ...request };
|
|
338
|
+
delete rest.startTimestamp;
|
|
339
|
+
return JSON.stringify(rest, Object.keys(rest).sort());
|
|
340
|
+
}
|
|
341
|
+
function withSessionListCache({
|
|
342
|
+
server,
|
|
343
|
+
cache
|
|
344
|
+
}) {
|
|
345
|
+
const { deleteSession } = server;
|
|
346
|
+
return {
|
|
347
|
+
...server,
|
|
348
|
+
listSessions(request) {
|
|
349
|
+
const key = cacheKey(request);
|
|
350
|
+
const now = Date.now();
|
|
351
|
+
const entry = cache.get(key);
|
|
352
|
+
if (entry !== void 0 && now - entry.at < SESSION_LIST_TTL_MS) return entry.page;
|
|
353
|
+
const page = server.listSessions(request);
|
|
354
|
+
cache.set(key, { at: now, page });
|
|
355
|
+
void page.catch(() => {
|
|
356
|
+
if (cache.get(key)?.page === page) cache.delete(key);
|
|
357
|
+
});
|
|
358
|
+
return page;
|
|
359
|
+
},
|
|
360
|
+
async createSession(request) {
|
|
361
|
+
const result = await server.createSession(request);
|
|
362
|
+
cache.clear();
|
|
363
|
+
return result;
|
|
364
|
+
},
|
|
365
|
+
async updateSession(request) {
|
|
366
|
+
const result = await server.updateSession(request);
|
|
367
|
+
cache.clear();
|
|
368
|
+
return result;
|
|
369
|
+
},
|
|
370
|
+
...deleteSession != null ? {
|
|
371
|
+
deleteSession: async (request) => {
|
|
372
|
+
await deleteSession.call(server, request);
|
|
373
|
+
cache.clear();
|
|
374
|
+
}
|
|
375
|
+
} : {}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
|
|
270
379
|
// src/containers/useResolvedServer.ts
|
|
271
380
|
import { createTrueFoundryAgentUIServer } from "@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter";
|
|
272
|
-
import { useEffect as
|
|
381
|
+
import { useEffect as useEffect5, useState } from "react";
|
|
273
382
|
var DEFAULT_CAPABILITIES = {
|
|
274
383
|
data: {
|
|
275
384
|
sandbox: { enabled: true },
|
|
@@ -283,14 +392,18 @@ function isBuiltInConfig(config) {
|
|
|
283
392
|
function hasGetCapabilities(server) {
|
|
284
393
|
return typeof Reflect.get(server, "getCapabilities") === "function";
|
|
285
394
|
}
|
|
286
|
-
function toAgentUIServer(server, catalog) {
|
|
395
|
+
function toAgentUIServer(server, catalog, permissions) {
|
|
287
396
|
const getCapabilities = hasGetCapabilities(server) ? () => server.getCapabilities() : async () => DEFAULT_CAPABILITIES;
|
|
288
397
|
const withCapabilities = { ...server, getCapabilities };
|
|
289
|
-
const
|
|
290
|
-
|
|
398
|
+
const withOptionalPorts = {
|
|
399
|
+
...withCapabilities,
|
|
400
|
+
...catalog == null ? {} : { catalog },
|
|
401
|
+
...permissions == null ? {} : { permissions }
|
|
402
|
+
};
|
|
403
|
+
if (!isAgentUIServer(withOptionalPorts)) {
|
|
291
404
|
throw new Error("TrueForgeUI: runtime adapter returned an incomplete AgentUIServer");
|
|
292
405
|
}
|
|
293
|
-
return
|
|
406
|
+
return withOptionalPorts;
|
|
294
407
|
}
|
|
295
408
|
function isAgentUIServer(value) {
|
|
296
409
|
return typeof Reflect.get(value, "createSession") === "function" && typeof Reflect.get(value, "listSessions") === "function" && typeof Reflect.get(value, "getSession") === "function" && typeof Reflect.get(value, "updateSession") === "function" && typeof Reflect.get(value, "createTurn") === "function" && typeof Reflect.get(value, "cancelSession") === "function" && typeof Reflect.get(value, "listTurns") === "function" && typeof Reflect.get(value, "getTurn") === "function" && typeof Reflect.get(value, "listEvents") === "function" && typeof Reflect.get(value, "getCapabilities") === "function" && typeof Reflect.get(value, "getModels") === "function" && typeof Reflect.get(value, "getSkills") === "function" && typeof Reflect.get(value, "getMcp") === "function" && typeof Reflect.get(value, "searchAgents") === "function" && typeof Reflect.get(value, "saveAgent") === "function";
|
|
@@ -306,13 +419,14 @@ function useResolvedServer(config, onError) {
|
|
|
306
419
|
const trueforgeToken = builtIn?.type === "trueforge" ? builtIn.token ?? "" : "";
|
|
307
420
|
const trueforgeFetch = builtIn?.type === "trueforge" ? builtIn.fetch : void 0;
|
|
308
421
|
const catalog = builtIn?.catalog;
|
|
422
|
+
const permissions = builtIn?.permissions;
|
|
309
423
|
const [state, setState] = useState(() => {
|
|
310
424
|
if (directServer) {
|
|
311
425
|
return { status: "ready", server: directServer, error: null };
|
|
312
426
|
}
|
|
313
427
|
return { status: "loading", server: null, error: null };
|
|
314
428
|
});
|
|
315
|
-
|
|
429
|
+
useEffect5(() => {
|
|
316
430
|
if (directServer) {
|
|
317
431
|
setState({ status: "ready", server: directServer, error: null });
|
|
318
432
|
return;
|
|
@@ -326,22 +440,23 @@ function useResolvedServer(config, onError) {
|
|
|
326
440
|
...trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {},
|
|
327
441
|
...trueforgeToken ? { token: trueforgeToken } : {},
|
|
328
442
|
...trueforgeFetch !== void 0 ? { fetch: trueforgeFetch } : {},
|
|
329
|
-
...catalog != null ? { catalog } : {}
|
|
443
|
+
...catalog != null ? { catalog } : {},
|
|
444
|
+
...permissions != null ? { permissions } : {}
|
|
330
445
|
});
|
|
331
446
|
}
|
|
332
|
-
const
|
|
447
|
+
const runtimeServer2 = await createTrueFoundryAgentUIServer({
|
|
333
448
|
apiKey,
|
|
334
449
|
cpURL: controlPlaneURL,
|
|
335
450
|
...gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}
|
|
336
451
|
});
|
|
337
|
-
return toAgentUIServer(
|
|
452
|
+
return toAgentUIServer(runtimeServer2, catalog, permissions);
|
|
338
453
|
};
|
|
339
454
|
void resolve().then((server) => {
|
|
340
455
|
if (cancelled) return;
|
|
341
456
|
try {
|
|
342
457
|
setState({
|
|
343
458
|
status: "ready",
|
|
344
|
-
server: type === "trueforge" ? toAgentUIServer(server, void 0) : server,
|
|
459
|
+
server: type === "trueforge" ? toAgentUIServer(server, void 0, void 0) : server,
|
|
345
460
|
error: null
|
|
346
461
|
});
|
|
347
462
|
} catch (error) {
|
|
@@ -366,6 +481,7 @@ function useResolvedServer(config, onError) {
|
|
|
366
481
|
trueforgeToken,
|
|
367
482
|
trueforgeFetch,
|
|
368
483
|
catalog,
|
|
484
|
+
permissions,
|
|
369
485
|
onError
|
|
370
486
|
]);
|
|
371
487
|
return state;
|
|
@@ -373,11 +489,11 @@ function useResolvedServer(config, onError) {
|
|
|
373
489
|
|
|
374
490
|
// src/containers/TrueForgeUIShell.tsx
|
|
375
491
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
376
|
-
var SidebarLayout = lazy(() => import("./SidebarLayout-
|
|
377
|
-
var DrawerLayout = lazy(() => import("./DrawerLayout-
|
|
378
|
-
var DockLayout = lazy(() => import("./DockLayout-
|
|
379
|
-
var WidgetLayout = lazy(() => import("./WidgetLayout-
|
|
380
|
-
var ShellRouteSync = lazy(() => import("./ShellRouteSync-
|
|
492
|
+
var SidebarLayout = lazy(() => import("./SidebarLayout-KYA76FQ7.js").then((m) => ({ default: m.SidebarLayout })));
|
|
493
|
+
var DrawerLayout = lazy(() => import("./DrawerLayout-HUV7RAWL.js").then((m) => ({ default: m.DrawerLayout })));
|
|
494
|
+
var DockLayout = lazy(() => import("./DockLayout-D2FPQCAL.js").then((m) => ({ default: m.DockLayout })));
|
|
495
|
+
var WidgetLayout = lazy(() => import("./WidgetLayout-W2RGGOQ3.js").then((m) => ({ default: m.WidgetLayout })));
|
|
496
|
+
var ShellRouteSync = lazy(() => import("./ShellRouteSync-SJXFKUAJ.js").then((m) => ({ default: m.ShellRouteSync })));
|
|
381
497
|
function LayoutFallback({ className }) {
|
|
382
498
|
return /* @__PURE__ */ jsx2(
|
|
383
499
|
"div",
|
|
@@ -395,20 +511,30 @@ function LayoutFallback({ className }) {
|
|
|
395
511
|
);
|
|
396
512
|
}
|
|
397
513
|
function ServerInitLoader({ className }) {
|
|
398
|
-
|
|
514
|
+
const themeMode = useThemeMode();
|
|
515
|
+
return /* @__PURE__ */ jsx2(
|
|
399
516
|
"div",
|
|
400
517
|
{
|
|
401
518
|
role: "status",
|
|
519
|
+
"aria-label": "Loading",
|
|
402
520
|
"aria-live": "polite",
|
|
403
521
|
"aria-busy": "true",
|
|
404
522
|
className: cn(
|
|
405
523
|
"flex h-full min-h-48 w-full flex-1 items-center justify-center bg-primary-bg text-text-secondary",
|
|
406
524
|
className
|
|
407
525
|
),
|
|
408
|
-
children:
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
526
|
+
children: /* @__PURE__ */ jsx2(
|
|
527
|
+
ThinkingOrb,
|
|
528
|
+
{
|
|
529
|
+
state: "connecting",
|
|
530
|
+
speed: 1,
|
|
531
|
+
theme: themeMode,
|
|
532
|
+
paused: false,
|
|
533
|
+
"aria-hidden": true,
|
|
534
|
+
size: 64,
|
|
535
|
+
style: { width: "4.5rem", height: "4.5rem" }
|
|
536
|
+
}
|
|
537
|
+
)
|
|
412
538
|
}
|
|
413
539
|
);
|
|
414
540
|
}
|
|
@@ -455,8 +581,9 @@ function ChatProviderFromShell({
|
|
|
455
581
|
server,
|
|
456
582
|
...providerRest
|
|
457
583
|
}) {
|
|
458
|
-
const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();
|
|
584
|
+
const { mode, runtimeKey, historyAgentFilter, listSessionsAgentId, pendingSessionId } = useShellMode();
|
|
459
585
|
const isCreateAgent = mode.status === "active" && mode.isMutable && mode.isCreateAgent;
|
|
586
|
+
const [sessionListCache] = useState2(createSessionListCache);
|
|
460
587
|
const serverWithCreateIntent = useMemo2(() => {
|
|
461
588
|
return {
|
|
462
589
|
...server,
|
|
@@ -474,6 +601,14 @@ function ChatProviderFromShell({
|
|
|
474
601
|
}
|
|
475
602
|
};
|
|
476
603
|
}, [server, isCreateAgent]);
|
|
604
|
+
const cachedRuntimeServer = useMemo2(
|
|
605
|
+
() => withSessionListCache({ server: serverWithCreateIntent, cache: sessionListCache }),
|
|
606
|
+
[serverWithCreateIntent, sessionListCache]
|
|
607
|
+
);
|
|
608
|
+
const runtimeServer2 = useMemo2(() => {
|
|
609
|
+
if (historyAgentFilter == null || historyAgentFilter.agentId != null) return cachedRuntimeServer;
|
|
610
|
+
return { ...cachedRuntimeServer, listSessions: async () => ({ data: [] }) };
|
|
611
|
+
}, [cachedRuntimeServer, historyAgentFilter]);
|
|
477
612
|
const draftDefaultAgentSpec = useMemo2(() => {
|
|
478
613
|
if (mode.status === "active" && mode.isMutable) {
|
|
479
614
|
return mode.agentSpec ?? { model: { name: "openai-main/gpt-4.1" } };
|
|
@@ -502,22 +637,23 @@ function ChatProviderFromShell({
|
|
|
502
637
|
defaultAgentSpec: draftDefaultAgentSpec
|
|
503
638
|
};
|
|
504
639
|
}, [mode, draftDefaultAgentSpec, pendingSessionId]);
|
|
505
|
-
return /* @__PURE__ */ jsx2(
|
|
640
|
+
return /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsx2(
|
|
506
641
|
TrueFoundryChatProvider,
|
|
507
642
|
{
|
|
508
643
|
...providerRest,
|
|
509
|
-
server:
|
|
644
|
+
server: runtimeServer2,
|
|
510
645
|
agent,
|
|
511
646
|
listSessionsAgentId,
|
|
512
647
|
initialSessionId: pendingSessionId ?? hostInitialSessionId,
|
|
513
|
-
children: /* @__PURE__ */
|
|
648
|
+
children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
|
|
514
649
|
/* @__PURE__ */ jsx2(DraftSpecPreferenceBridge, {}),
|
|
650
|
+
/* @__PURE__ */ jsx2(HistorySessionSwitchBridge, {}),
|
|
515
651
|
onRemoteIdChange != null ? /* @__PURE__ */ jsx2(RemoteIdRouteBridge, { onRemoteIdChange }) : null,
|
|
516
652
|
children
|
|
517
|
-
] })
|
|
653
|
+
] })
|
|
518
654
|
},
|
|
519
655
|
runtimeKey
|
|
520
|
-
);
|
|
656
|
+
) });
|
|
521
657
|
}
|
|
522
658
|
function TrueForgeUIShell(props) {
|
|
523
659
|
const {
|
|
@@ -530,6 +666,7 @@ function TrueForgeUIShell(props) {
|
|
|
530
666
|
server: serverConfig,
|
|
531
667
|
onError,
|
|
532
668
|
customActionRenderers,
|
|
669
|
+
currentUser,
|
|
533
670
|
resolvedRoutes,
|
|
534
671
|
routes: _routes,
|
|
535
672
|
...providerRest
|
|
@@ -567,7 +704,7 @@ function TrueForgeUIShell(props) {
|
|
|
567
704
|
)
|
|
568
705
|
] });
|
|
569
706
|
const visibilityTree = layout === "widget" ? /* @__PURE__ */ jsx2(WidgetVisibilityProvider, { children: shellTree }) : shellTree;
|
|
570
|
-
return /* @__PURE__ */ jsx2(SlotsProvider, { overrides, theme, children: /* @__PURE__ */ jsx2(CustomActionRenderersProvider, { renderers: customActionRenderers, children: /* @__PURE__ */ jsx2(ServerProvider, { server, children: resolvedRoutes != null ? /* @__PURE__ */ jsx2(ResolvedRoutesProvider, { routes: resolvedRoutes, children: visibilityTree }) : visibilityTree }) }) });
|
|
707
|
+
return /* @__PURE__ */ jsx2(SlotsProvider, { overrides, theme, children: /* @__PURE__ */ jsx2(CurrentUserProvider, { currentUser, children: /* @__PURE__ */ jsx2(CustomActionRenderersProvider, { renderers: customActionRenderers, children: /* @__PURE__ */ jsx2(ServerProvider, { server, children: resolvedRoutes != null ? /* @__PURE__ */ jsx2(ResolvedRoutesProvider, { routes: resolvedRoutes, children: visibilityTree }) : visibilityTree }) }) }) });
|
|
571
708
|
}
|
|
572
709
|
|
|
573
710
|
export {
|
|
@@ -575,4 +712,4 @@ export {
|
|
|
575
712
|
ServerInitLoader,
|
|
576
713
|
TrueForgeUIShell
|
|
577
714
|
};
|
|
578
|
-
//# sourceMappingURL=chunk-
|
|
715
|
+
//# sourceMappingURL=chunk-PCI6VMB5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/TrueFoundryChatProvider.tsx","../src/containers/TrueForgeUIShell.tsx","../src/atoms/draft/DraftSpecPreferenceBridge.tsx","../src/routing/HistorySessionSwitchBridge.tsx","../src/routing/LibrarySessionShareBoot.tsx","../src/routing/RemoteIdRouteBridge.tsx","../src/server/sessionListCache.ts","../src/containers/useResolvedServer.ts"],"sourcesContent":["'use client';\n\nimport { AssistantRuntimeProvider, useAuiState } 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 { sessionIsCreateAgent } from '../atoms/lib/sessionCreateAgent.js';\nimport { notifyComposerBusyFailure } from '../hooks/useComposerBusyState.js';\nimport { ActiveSessionPermissionsProvider } from '../hooks/useResourcePermissions.js';\nimport type { AgentUIServer } from '../server/types.js';\nimport { ToasterProvider, useToaster } from './ToasterContainer.js';\n\ntype RuntimeAdapters = NonNullable<UseTrueFoundryAgentRuntimeOptions['adapters']>;\n\nfunction ActiveSessionPermissionScope({\n locallyCreatedSessionIds,\n children,\n}: {\n locallyCreatedSessionIds: ReadonlySet<string>;\n children: ReactNode;\n}) {\n const remoteId = useAuiState(state => state.threadListItem.remoteId);\n return (\n <ActiveSessionPermissionsProvider\n sessionId={remoteId}\n assumeManage={remoteId != null && locallyCreatedSessionIds.has(remoteId)}\n >\n {children}\n </ActiveSessionPermissionsProvider>\n );\n}\n\nfunction runtimeServer({\n server,\n locallyCreatedSessionIds,\n}: {\n server: AgentUIServer;\n locallyCreatedSessionIds: Set<string>;\n}): AgentUIServer {\n return {\n ...server,\n async createSession(request) {\n const session = await server.createSession(request);\n locallyCreatedSessionIds.add(session.id);\n return session;\n },\n async listSessions(request) {\n const result = await server.listSessions(request);\n return {\n ...result,\n data: result.data.filter(session => !sessionIsCreateAgent(session)),\n };\n },\n };\n}\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 const localSessionState = useMemo(() => ({ server, ids: new Set<string>() }), [server]);\n const locallyCreatedSessionIds = localSessionState.ids;\n const historyServer = useMemo(\n () => runtimeServer({ server, locallyCreatedSessionIds }),\n [locallyCreatedSessionIds, server],\n );\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: historyServer as never,\n agent,\n agentName,\n listSessionsAgentId,\n listSessionsCreatedByMe: true,\n initialSessionId,\n onError: resolvedOnError,\n adapters: {\n ...adapters,\n attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter,\n },\n });\n\n return (\n <AssistantRuntimeProvider runtime={runtime as never}>\n <ActiveSessionPermissionScope locallyCreatedSessionIds={locallyCreatedSessionIds}>\n {children}\n </ActiveSessionPermissionScope>\n </AssistantRuntimeProvider>\n );\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';\nimport { ThinkingOrb } from 'thinking-orbs';\n\nimport { AgentConfigInstructionsProvider } from '../atoms/draft/AgentConfigInstructionsContext.js';\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { DraftSpecPreferenceBridge } from '../atoms/draft/DraftSpecPreferenceBridge.js';\nimport { cn } from '../atoms/lib/cn.js';\nimport { IS_CREATE_AGENT_METADATA_KEY, isCreateAgentMetadataValue } from '../atoms/lib/sessionCreateAgent.js';\nimport { CurrentUserProvider, type CurrentUser } from '../contexts/CurrentUserContext.js';\nimport { WidgetVisibilityProvider } from '../layouts/WidgetVisibilityContext.js';\nimport { HistorySessionSwitchBridge } from '../routing/HistorySessionSwitchBridge.js';\nimport { LibrarySessionShareBoot } from '../routing/LibrarySessionShareBoot.js';\nimport { RemoteIdRouteBridge } from '../routing/RemoteIdRouteBridge.js';\nimport { ResolvedRoutesProvider } from '../routing/ResolvedRoutesContext.js';\nimport type { ResolvedRoutes, RoutesConfig } from '../routing/types.js';\nimport { CustomActionRenderersProvider, type CustomActionRenderers } from '../server/CustomActionRenderersContext.js';\nimport { ServerProvider } from '../server/ServerContext.js';\nimport { createSessionListCache, withSessionListCache } from '../server/sessionListCache.js';\nimport { DEFAULT_AGENT_CONFIG, ShellModeProvider, useShellMode, type AgentConfig } from '../server/ShellModeContext.js';\nimport type { TrueForgeServerConfig } from '../server/TrueForgeServerConfig.js';\nimport type { AgentUIServer, CreateSessionRequest } from '../server/types.js';\nimport { SlotsProvider, useThemeMode, 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 /** Optional identity rendered by the default `UserAvatar` slot. */\n currentUser?: CurrentUser;\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 // Outside ThemeProvider (Suspense), useThemeMode falls back to light.\n const themeMode = useThemeMode();\n return (\n <div\n role=\"status\"\n aria-label=\"Loading\"\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 <ThinkingOrb\n state=\"connecting\"\n speed={1}\n theme={themeMode}\n paused={false}\n aria-hidden\n size={64}\n style={{ width: '4.5rem', height: '4.5rem' }}\n />\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 server,\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, historyAgentFilter, listSessionsAgentId, pendingSessionId } = useShellMode();\n\n const isCreateAgent = mode.status === 'active' && mode.isMutable && mode.isCreateAgent;\n\n // Keep one isolated cache per shell, preserved across chat runtime remounts.\n const [sessionListCache] = useState(createSessionListCache);\n\n const serverWithCreateIntent = useMemo((): AgentUIServer => {\n return {\n ...server,\n createSession: request => {\n if (request.agentSpec === undefined) {\n return server.createSession(request);\n }\n const withMetadata: CreateSessionRequest & { metadata: Record<string, string> } = {\n ...request,\n metadata: {\n [IS_CREATE_AGENT_METADATA_KEY]: isCreateAgentMetadataValue(isCreateAgent),\n },\n };\n return server.createSession(withMetadata);\n },\n };\n }, [server, isCreateAgent]);\n\n const cachedRuntimeServer = useMemo(\n () => withSessionListCache({ server: serverWithCreateIntent, cache: sessionListCache }),\n [serverWithCreateIntent, sessionListCache],\n );\n const runtimeServer = useMemo<AgentUIServer>(() => {\n if (historyAgentFilter == null || historyAgentFilter.agentId != null) return cachedRuntimeServer;\n // Do not expose an unfiltered page under a filter label while its backend id resolves.\n return { ...cachedRuntimeServer, listSessions: async () => ({ data: [] }) };\n }, [cachedRuntimeServer, historyAgentFilter]);\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 <DraftCatalogProvider>\n <TrueFoundryChatProvider\n key={runtimeKey}\n {...providerRest}\n server={runtimeServer}\n agent={agent}\n listSessionsAgentId={listSessionsAgentId}\n initialSessionId={pendingSessionId ?? hostInitialSessionId}\n >\n <AgentConfigInstructionsProvider>\n <DraftSpecPreferenceBridge />\n <HistorySessionSwitchBridge />\n {onRemoteIdChange != null ? <RemoteIdRouteBridge onRemoteIdChange={onRemoteIdChange} /> : null}\n {children}\n </AgentConfigInstructionsProvider>\n </TrueFoundryChatProvider>\n </DraftCatalogProvider>\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 currentUser,\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 const shellTree = (\n <ShellModeProvider agentConfig={agentConfig} initialSettingsOpen={initialSettingsOpen}>\n <LibrarySessionShareBoot />\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 );\n // Widget visibility provider is used to control the visibility of the widget with isolated state\n const visibilityTree =\n layout === 'widget' ? <WidgetVisibilityProvider>{shellTree}</WidgetVisibilityProvider> : shellTree;\n\n return (\n <SlotsProvider overrides={overrides} theme={theme}>\n <CurrentUserProvider currentUser={currentUser}>\n <CustomActionRenderersProvider renderers={customActionRenderers}>\n <ServerProvider server={server}>\n {resolvedRoutes != null ? (\n <ResolvedRoutesProvider routes={resolvedRoutes}>{visibilityTree}</ResolvedRoutesProvider>\n ) : (\n visibilityTree\n )}\n </ServerProvider>\n </CustomActionRenderersProvider>\n </CurrentUserProvider>\n </SlotsProvider>\n );\n}\n","'use client';\n\nimport { useTrueFoundryAgentSpec, useTrueFoundryUpdateAgentSpec } from '@truefoundry/assistant-ui-runtime';\nimport { useEffect } from 'react';\n\nimport { type DraftPreferenceKind, 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 { mountName } from '../lib/mountName.js';\nimport { useDraftCatalog } from './DraftCatalogProvider.js';\nimport { modelPatchWithReasoningEffort } from './reasoningEffort.js';\n\nfunction readDraftSandboxEnabled(spec: AgentSpec): boolean | undefined {\n if (spec.config === undefined) return undefined;\n // `sandbox` is draft runtime config and may be absent from AgentRuntimeConfig typings.\n const sandbox = Reflect.get(spec.config, 'sandbox');\n if (typeof sandbox !== 'object' || sandbox === null) return undefined;\n const enabled = Reflect.get(sandbox, 'enabled');\n return typeof enabled === 'boolean' ? enabled : undefined;\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 kind = 'agent',\n}: {\n agentSpec: AgentSpec;\n sandboxEnabled: boolean | null | undefined;\n kind?: DraftPreferenceKind;\n}): Partial<AgentSpec> {\n if (kind === 'chat') {\n if (sandboxEnabled == null) return {};\n const current = readDraftSandboxEnabled(agentSpec);\n if (sandboxEnabled === true && current !== true) {\n return {\n config: {\n ...agentSpec.config,\n sandbox: { ...agentSpec.config?.sandbox, enabled: true },\n },\n };\n }\n if (sandboxEnabled === false && current === true) {\n return {\n config: {\n ...agentSpec.config,\n sandbox: { ...agentSpec.config?.sandbox, enabled: false },\n },\n };\n }\n return {};\n }\n\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 * New Chat and New Agent keep separate seeds; chat never persists runtime config.\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 const preferenceKind = mode.status === 'active' && mode.isMutable && mode.isCreateAgent ? 'agent' : 'chat';\n\n useEffect(() => {\n if (isPlainDraft) ensureLoaded();\n }, [ensureLoaded, isPlainDraft]);\n\n useEffect(() => {\n if (isPlainDraft && agentSpec != null) {\n rememberDraftSpec(agentSpec, preferenceKind);\n }\n }, [agentSpec, isPlainDraft, preferenceKind, rememberDraftSpec]);\n\n useEffect(() => {\n // New Chat mirrors capabilities onto the live draft; New Agent only disables when unavailable.\n if (!isPlainDraft || agentSpec == null || updateAgentSpec == null) return;\n const update = reconcileDraftSandbox({ agentSpec, sandboxEnabled, kind: preferenceKind });\n if (Object.keys(update).length > 0) {\n updateAgentSpec(update);\n }\n }, [agentSpec, isPlainDraft, preferenceKind, 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 { useAui } from '../assistant-ui.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\n\n/** Switches history sessions in place to preserve mounted chat state to prevent flickering */\nexport function HistorySessionSwitchBridge() {\n const shell = useOptionalShellMode();\n const aui = useAui();\n const pendingSessionId = shell?.pendingSessionId;\n const pendingSessionEpoch = shell?.pendingSessionEpoch ?? 0;\n\n useEffect(() => {\n if (pendingSessionId == null) return;\n void Promise.resolve(aui.threads().switchToThread(pendingSessionId)).catch(() => undefined);\n }, [aui, pendingSessionId, pendingSessionEpoch]);\n\n return null;\n}\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { useOptionalAgentSessionsServer } from '../server/ServerContext.js';\nimport { useShellMode } from '../server/ShellModeContext.js';\nimport { isSessionsChromeEnabled } from '../server/serverChrome.js';\nimport { readSessionShareSearch } from '../utils/sessionShareUrl.js';\n\n/** Open the sessions browser or a library agent from the share query — with or without `withRouter`. */\nexport function LibrarySessionShareBoot() {\n const { openLibraryAgent, setSessionsOpen } = useShellMode();\n const sessions = useOptionalAgentSessionsServer();\n const sessionsEnabled = isSessionsChromeEnabled({ sessions });\n\n useEffect(() => {\n if (!sessionsEnabled) return;\n const share = readSessionShareSearch(window.location.search);\n if (share.view === 'sessions') {\n setSessionsOpen(true);\n return;\n }\n if (share.agentId == null) return;\n openLibraryAgent(share.agentId);\n }, [openLibraryAgent, sessionsEnabled, setSessionsOpen]);\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","import type { AgentUIServer, ListSessionsParams } from './types.js';\n\n/** Cached pages go stale after this window so external session changes surface. */\nconst SESSION_LIST_TTL_MS = 30_000;\n\ntype SessionListPage = ReturnType<AgentUIServer['listSessions']>;\n\ntype CacheEntry = { at: number; page: SessionListPage };\n\nexport type SessionListCache = Map<string, CacheEntry>;\n\nexport function createSessionListCache(): SessionListCache {\n return new Map();\n}\n\n// `startTimestamp` is a rolling \"now − 1 year\" that differs on every call;\n// keying on it would make each request unique and defeat the cache.\nfunction cacheKey(request: ListSessionsParams | undefined): string {\n const rest: ListSessionsParams = { ...request };\n delete rest.startTimestamp;\n return JSON.stringify(rest, Object.keys(rest).sort());\n}\n\n/** Deduplicates session pages and invalidates them after mutations or TTL expiry. */\nexport function withSessionListCache({\n server,\n cache,\n}: {\n server: AgentUIServer;\n cache: SessionListCache;\n}): AgentUIServer {\n const { deleteSession } = server;\n return {\n ...server,\n listSessions(request) {\n const key = cacheKey(request);\n const now = Date.now();\n const entry = cache.get(key);\n if (entry !== undefined && now - entry.at < SESSION_LIST_TTL_MS) return entry.page;\n const page = server.listSessions(request);\n cache.set(key, { at: now, page });\n // Allow failed pages to be retried.\n void page.catch(() => {\n if (cache.get(key)?.page === page) cache.delete(key);\n });\n return page;\n },\n async createSession(request) {\n const result = await server.createSession(request);\n cache.clear();\n return result;\n },\n async updateSession(request) {\n const result = await server.updateSession(request);\n cache.clear();\n return result;\n },\n ...(deleteSession != null\n ? {\n deleteSession: async (request: { sessionId: string }) => {\n await deleteSession.call(server, request);\n cache.clear();\n },\n }\n : {}),\n };\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 {\n AgentBuilderCapabilitiesResponse,\n AgentUIServer,\n CatalogServer,\n PermissionsServer,\n} 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 host ports and ensure `getCapabilities` exists on the composed port.\n */\nfunction toAgentUIServer(\n server: object,\n catalog: CatalogServer | undefined,\n permissions: PermissionsServer | undefined,\n): AgentUIServer {\n const getCapabilities = hasGetCapabilities(server)\n ? () => server.getCapabilities()\n : async () => DEFAULT_CAPABILITIES;\n const withCapabilities = { ...server, getCapabilities };\n const withOptionalPorts = {\n ...withCapabilities,\n ...(catalog == null ? {} : { catalog }),\n ...(permissions == null ? {} : { permissions }),\n };\n if (!isAgentUIServer(withOptionalPorts)) {\n throw new Error('TrueForgeUI: runtime adapter returned an incomplete AgentUIServer');\n }\n return withOptionalPorts;\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 const permissions = builtIn?.permissions;\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 ...(permissions != null ? { permissions } : {}),\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, permissions);\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, 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 permissions,\n onError,\n ]);\n\n return state;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,0BAA0B,eAAAA,oBAAmB;AACtD;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,aAAa,eAA+B;AAmBjD;AATJ,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,QAAM,WAAWC,aAAY,WAAS,MAAM,eAAe,QAAQ;AACnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,cAAc,YAAY,QAAQ,yBAAyB,IAAI,QAAQ;AAAA,MAEtE;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGkB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,cAAc,SAAS;AAC3B,YAAM,UAAU,MAAM,OAAO,cAAc,OAAO;AAClD,+BAAyB,IAAI,QAAQ,EAAE;AACvC,aAAO;AAAA,IACT;AAAA,IACA,MAAM,aAAa,SAAS;AAC1B,YAAM,SAAS,MAAM,OAAO,aAAa,OAAO;AAChD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,OAAO,KAAK,OAAO,aAAW,CAAC,qBAAqB,OAAO,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF;AAgBA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,QAAM,EAAE,UAAU,IAAI,WAAW;AACjC,QAAM,cAAc,WAAW;AAC/B,QAAM,oBAAoB,QAAQ,OAAO,EAAE,QAAQ,KAAK,oBAAI,IAAY,EAAE,IAAI,CAAC,MAAM,CAAC;AACtF,QAAM,2BAA2B,kBAAkB;AACnD,QAAM,gBAAgB;AAAA,IACpB,MAAM,cAAc,EAAE,QAAQ,yBAAyB,CAAC;AAAA,IACxD,CAAC,0BAA0B,MAAM;AAAA,EACnC;AAGA,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAAmB;AAClB,gCAA0B;AAC1B,kBAAY,KAAK;AAAA,IACnB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,UAAU,2BAA2B;AAAA,IACzC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,MACR,GAAG;AAAA,MACH,aAAa,UAAU,eAAe;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SACE,oBAAC,4BAAyB,SACxB,8BAAC,gCAA6B,0BAC3B,UACH,GACF;AAEJ;AAMO,SAAS,wBAAwB,OAAqC;AAC3E,QAAM,EAAE,QAAQ,kBAAkB,UAAU,SAAS,UAAU,OAAO,WAAW,oBAAoB,IAAI;AAEzG,QAAM,eAAe,QAAQ,MAAM,QAAQ,CAAC,MAAM,CAAC;AAEnD,SACE,oBAAC,mBACC;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH,GACF;AAEJ;;;AC5JA,SAAS,MAAM,UAAU,eAAAC,cAAa,WAAAC,UAAS,YAAAC,iBAAgC;AAC/E,SAAS,mBAAmB;;;ACF5B,SAAS,yBAAyB,qCAAqC;AACvE,SAAS,iBAAiB;AAU1B,SAAS,wBAAwB,MAAsC;AACrE,MAAI,KAAK,WAAW,OAAW,QAAO;AAEtC,QAAM,UAAU,QAAQ,IAAI,KAAK,QAAQ,SAAS;AAClD,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO;AAC5D,QAAM,UAAU,QAAQ,IAAI,SAAS,SAAS;AAC9C,SAAO,OAAO,YAAY,YAAY,UAAU;AAClD;AAEA,SAAS,aAA+B,QAAyB,gBAA8C;AAC7G,MAAI,WAAW,OAAW,QAAO;AACjC,QAAM,WAAW,OAAO,OAAO,WAAS;AACtC,UAAM,OAAO,UAAU,KAAK;AAC5B,WAAO,SAAS,QAAQ,eAAe,IAAI,IAAI;AAAA,EACjD,CAAC;AACD,SAAO,SAAS,WAAW,OAAO,SAAS,SAAS;AACtD;AAEO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMuB;AACrB,QAAM,SAA6B,CAAC;AACpC,QAAM,gBAAgB,UAAU,MAAM,KAAK,KAAK;AAChD,MAAI,CAAC,OAAO,KAAK,WAAS,MAAM,SAAS,aAAa,GAAG;AACvD,UAAM,WAAW,OAAO,CAAC;AACzB,QAAI,aAAa,QAAW;AAC1B,aAAO,QAAQ;AAAA,QACb,SAAS;AAAA,QACT,UAAU,MAAM;AAAA,QAChB,SAAS,WAAW;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,aAAa,UAAU,YAAY,IAAI,IAAI,WAAW,IAAI,eAAa,UAAU,IAAI,CAAC,CAAC;AAC9G,MAAI,mBAAmB,UAAU,YAAY;AAC3C,WAAO,aAAa;AAAA,EACtB;AAEA,MAAI,kBAAkB,OAAO;AAG3B,QAAI,UAAU,WAAW,UAAa,UAAU,OAAO,SAAS,GAAG;AACjE,aAAO,SAAS,CAAC;AAAA,IACnB;AAAA,EACF,OAAO;AACL,UAAM,aAAa,aAAa,UAAU,QAAQ,IAAI,IAAI,OAAO,IAAI,WAAS,MAAM,IAAI,CAAC,CAAC;AAC1F,QAAI,eAAe,UAAU,QAAQ;AACnC,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAIuB;AACrB,MAAI,SAAS,QAAQ;AACnB,QAAI,kBAAkB,KAAM,QAAO,CAAC;AACpC,UAAM,UAAU,wBAAwB,SAAS;AACjD,QAAI,mBAAmB,QAAQ,YAAY,MAAM;AAC/C,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,GAAG,UAAU;AAAA,UACb,SAAS,EAAE,GAAG,UAAU,QAAQ,SAAS,SAAS,KAAK;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AACA,QAAI,mBAAmB,SAAS,YAAY,MAAM;AAChD,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,GAAG,UAAU;AAAA,UACb,SAAS,EAAE,GAAG,UAAU,QAAQ,SAAS,SAAS,MAAM;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,wBAAwB,WAAW,cAAc;AAClE,SAAO,aAAa,YAAY,CAAC,IAAI,EAAE,QAAQ,SAAS,OAAO;AACjE;AAOO,SAAS,4BAA4B;AAC1C,QAAM,EAAE,MAAM,kBAAkB,kBAAkB,IAAI,aAAa;AACnE,QAAM,EAAE,UAAU,IAAI,wBAAwB;AAC9C,QAAM,kBAAkB,8BAA8B;AACtD,QAAM,eAAe,sBAAsB;AAC3C,QAAM,iBAAiB,cAAc,QAAQ;AAC7C,QAAM,EAAE,QAAQ,QAAQ,YAAY,QAAQ,OAAO,aAAa,IAAI,gBAAgB;AACpF,QAAM,eAAe,KAAK,WAAW,YAAY,KAAK,aAAa,KAAK,WAAW,QAAQ,oBAAoB;AAC/G,QAAM,iBAAiB,KAAK,WAAW,YAAY,KAAK,aAAa,KAAK,gBAAgB,UAAU;AAEpG,YAAU,MAAM;AACd,QAAI,aAAc,cAAa;AAAA,EACjC,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,YAAU,MAAM;AACd,QAAI,gBAAgB,aAAa,MAAM;AACrC,wBAAkB,WAAW,cAAc;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,WAAW,cAAc,gBAAgB,iBAAiB,CAAC;AAE/D,YAAU,MAAM;AAEd,QAAI,CAAC,gBAAgB,aAAa,QAAQ,mBAAmB,KAAM;AACnE,UAAM,SAAS,sBAAsB,EAAE,WAAW,gBAAgB,MAAM,eAAe,CAAC;AACxF,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,WAAW,cAAc,gBAAgB,gBAAgB,eAAe,CAAC;AAE7E,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,aAAa,QAAQ,mBAAmB,QAAQ,CAAC,UAAU,SAAS,KAAM;AAE/F,UAAM,SAAS,8BAA8B;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,cAAc,MAAM;AAAA,IACrC,CAAC;AACD,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,cAAc,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AC3KA,SAAS,aAAAC,kBAAiB;AAMnB,SAAS,6BAA6B;AAC3C,QAAM,QAAQ,qBAAqB;AACnC,QAAM,MAAM,OAAO;AACnB,QAAM,mBAAmB,OAAO;AAChC,QAAM,sBAAsB,OAAO,uBAAuB;AAE1D,EAAAC,WAAU,MAAM;AACd,QAAI,oBAAoB,KAAM;AAC9B,SAAK,QAAQ,QAAQ,IAAI,QAAQ,EAAE,eAAe,gBAAgB,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC5F,GAAG,CAAC,KAAK,kBAAkB,mBAAmB,CAAC;AAE/C,SAAO;AACT;;;AClBA,SAAS,aAAAC,kBAAiB;AAQnB,SAAS,0BAA0B;AACxC,QAAM,EAAE,kBAAkB,gBAAgB,IAAI,aAAa;AAC3D,QAAM,WAAW,+BAA+B;AAChD,QAAM,kBAAkB,wBAAwB,EAAE,SAAS,CAAC;AAE5D,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,UAAM,QAAQ,uBAAuB,OAAO,SAAS,MAAM;AAC3D,QAAI,MAAM,SAAS,YAAY;AAC7B,sBAAgB,IAAI;AACpB;AAAA,IACF;AACA,QAAI,MAAM,WAAW,KAAM;AAC3B,qBAAiB,MAAM,OAAO;AAAA,EAChC,GAAG,CAAC,kBAAkB,iBAAiB,eAAe,CAAC;AAEvD,SAAO;AACT;;;ACzBA,SAAS,aAAAC,kBAAiB;AAUnB,SAAS,oBAAoB,EAAE,iBAAiB,GAA2D;AAChH,QAAM,WAAW,YAAY,OAAK,EAAE,eAAe,QAAQ;AAC3D,EAAAC,WAAU,MAAM;AACd,qBAAiB,YAAY,MAAS;AAAA,EACxC,GAAG,CAAC,UAAU,gBAAgB,CAAC;AAC/B,SAAO;AACT;;;ACfA,IAAM,sBAAsB;AAQrB,SAAS,yBAA2C;AACzD,SAAO,oBAAI,IAAI;AACjB;AAIA,SAAS,SAAS,SAAiD;AACjE,QAAM,OAA2B,EAAE,GAAG,QAAQ;AAC9C,SAAO,KAAK;AACZ,SAAO,KAAK,UAAU,MAAM,OAAO,KAAK,IAAI,EAAE,KAAK,CAAC;AACtD;AAGO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGkB;AAChB,QAAM,EAAE,cAAc,IAAI;AAC1B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,SAAS;AACpB,YAAM,MAAM,SAAS,OAAO;AAC5B,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,UAAI,UAAU,UAAa,MAAM,MAAM,KAAK,oBAAqB,QAAO,MAAM;AAC9E,YAAM,OAAO,OAAO,aAAa,OAAO;AACxC,YAAM,IAAI,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC;AAEhC,WAAK,KAAK,MAAM,MAAM;AACpB,YAAI,MAAM,IAAI,GAAG,GAAG,SAAS,KAAM,OAAM,OAAO,GAAG;AAAA,MACrD,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,cAAc,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,cAAc,OAAO;AACjD,YAAM,MAAM;AACZ,aAAO;AAAA,IACT;AAAA,IACA,MAAM,cAAc,SAAS;AAC3B,YAAM,SAAS,MAAM,OAAO,cAAc,OAAO;AACjD,YAAM,MAAM;AACZ,aAAO;AAAA,IACT;AAAA,IACA,GAAI,iBAAiB,OACjB;AAAA,MACE,eAAe,OAAO,YAAmC;AACvD,cAAM,cAAc,KAAK,QAAQ,OAAO;AACxC,cAAM,MAAM;AAAA,MACd;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;;;AChEA,SAAS,sCAAsC;AAC/C,SAAS,aAAAC,YAAW,gBAAgB;AAgBpC,IAAM,uBAAuB;AAAA,EAC3B,MAAM;AAAA,IACJ,SAAS,EAAE,SAAS,KAAK;AAAA,IACzB,OAAO,EAAE,SAAS,KAAK;AAAA,IACvB,UAAU,EAAE,SAAS,KAAK;AAAA,EAC5B;AACF;AAEA,SAAS,gBAAgB,QAAuE;AAC9F,SACE,OAAO,WAAW,YAClB,WAAW,QACX,UAAU,WACT,OAAO,SAAS,iBAAiB,OAAO,SAAS;AAEtD;AAEA,SAAS,mBACP,QACgF;AAChF,SAAO,OAAO,QAAQ,IAAI,QAAQ,iBAAiB,MAAM;AAC3D;AAKA,SAAS,gBACP,QACA,SACA,aACe;AACf,QAAM,kBAAkB,mBAAmB,MAAM,IAC7C,MAAM,OAAO,gBAAgB,IAC7B,YAAY;AAChB,QAAM,mBAAmB,EAAE,GAAG,QAAQ,gBAAgB;AACtD,QAAM,oBAAoB;AAAA,IACxB,GAAG;AAAA,IACH,GAAI,WAAW,OAAO,CAAC,IAAI,EAAE,QAAQ;AAAA,IACrC,GAAI,eAAe,OAAO,CAAC,IAAI,EAAE,YAAY;AAAA,EAC/C;AACA,MAAI,CAAC,gBAAgB,iBAAiB,GAAG;AACvC,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAuC;AAC9D,SACE,OAAO,QAAQ,IAAI,OAAO,eAAe,MAAM,cAC/C,OAAO,QAAQ,IAAI,OAAO,cAAc,MAAM,cAC9C,OAAO,QAAQ,IAAI,OAAO,YAAY,MAAM,cAC5C,OAAO,QAAQ,IAAI,OAAO,eAAe,MAAM,cAC/C,OAAO,QAAQ,IAAI,OAAO,YAAY,MAAM,cAC5C,OAAO,QAAQ,IAAI,OAAO,eAAe,MAAM,cAC/C,OAAO,QAAQ,IAAI,OAAO,WAAW,MAAM,cAC3C,OAAO,QAAQ,IAAI,OAAO,SAAS,MAAM,cACzC,OAAO,QAAQ,IAAI,OAAO,YAAY,MAAM,cAC5C,OAAO,QAAQ,IAAI,OAAO,iBAAiB,MAAM,cACjD,OAAO,QAAQ,IAAI,OAAO,WAAW,MAAM,cAC3C,OAAO,QAAQ,IAAI,OAAO,WAAW,MAAM,cAC3C,OAAO,QAAQ,IAAI,OAAO,QAAQ,MAAM,cACxC,OAAO,QAAQ,IAAI,OAAO,cAAc,MAAM,cAC9C,OAAO,QAAQ,IAAI,OAAO,WAAW,MAAM;AAE/C;AAQO,SAAS,kBACd,QACA,SACqB;AACrB,QAAM,UAAU,gBAAgB,MAAM,IAAI,SAAS;AACnD,QAAM,eAAqC,gBAAgB,MAAM,IAAI,OAAO;AAC5E,QAAM,OAAO,SAAS;AACtB,QAAM,SAAS,SAAS,SAAS,gBAAgB,QAAQ,SAAS;AAClE,QAAM,kBAAkB,SAAS,SAAS,gBAAgB,QAAQ,kBAAkB;AACpF,QAAM,kBAAkB,SAAS,SAAS,gBAAiB,QAAQ,mBAAmB,KAAM;AAC5F,QAAM,mBAAmB,SAAS,SAAS,cAAe,QAAQ,WAAW,KAAM;AACnF,QAAM,iBAAiB,SAAS,SAAS,cAAe,QAAQ,SAAS,KAAM;AAC/E,QAAM,iBAAiB,SAAS,SAAS,cAAc,QAAQ,QAAQ;AACvE,QAAM,UAAU,SAAS;AACzB,QAAM,cAAc,SAAS;AAE7B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8B,MAAM;AAC5D,QAAI,cAAc;AAChB,aAAO,EAAE,QAAQ,SAAS,QAAQ,cAAc,OAAO,KAAK;AAAA,IAC9D;AACA,WAAO,EAAE,QAAQ,WAAW,QAAQ,MAAM,OAAO,KAAK;AAAA,EACxD,CAAC;AAED,EAAAA,WAAU,MAAM;AACd,QAAI,cAAc;AAChB,eAAS,EAAE,QAAQ,SAAS,QAAQ,cAAc,OAAO,KAAK,CAAC;AAC/D;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,aAAS,EAAE,QAAQ,WAAW,QAAQ,MAAM,OAAO,KAAK,CAAC;AAEzD,UAAM,UAAU,YAAoC;AAClD,UAAI,SAAS,aAAa;AACxB,cAAM,EAAE,6BAA6B,IAAI,MAAM,OAAO,mDAAoD;AAC1G,eAAO,6BAA6B;AAAA,UAClC,GAAI,mBAAmB,EAAE,SAAS,iBAAiB,IAAI,CAAC;AAAA,UACxD,GAAI,iBAAiB,EAAE,OAAO,eAAe,IAAI,CAAC;AAAA,UAClD,GAAI,mBAAmB,SAAY,EAAE,OAAO,eAAe,IAAI,CAAC;AAAA,UAChE,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;AAAA,UACrC,GAAI,eAAe,OAAO,EAAE,YAAY,IAAI,CAAC;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,YAAMC,iBAAgB,MAAM,+BAA+B;AAAA,QACzD;AAAA,QACA,OAAO;AAAA,QACP,GAAI,kBAAkB,EAAE,YAAY,gBAAgB,IAAI,CAAC;AAAA,MAC3D,CAAC;AAED,aAAO,gBAAgBA,gBAAe,SAAS,WAAW;AAAA,IAC5D;AAEA,SAAK,QAAQ,EACV,KAAK,YAAU;AACd,UAAI,UAAW;AACf,UAAI;AAEF,iBAAS;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,SAAS,cAAc,gBAAgB,QAAQ,QAAW,MAAS,IAAI;AAAA,UAC/E,OAAO;AAAA,QACT,CAAC;AAAA,MACH,SAAS,OAAgB;AACvB,kBAAU,KAAK;AACf,iBAAS,EAAE,QAAQ,SAAS,QAAQ,MAAM,MAAM,CAAC;AAAA,MACnD;AAAA,IACF,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,UAAI,UAAW;AACf,gBAAU,KAAK;AACf,eAAS,EAAE,QAAQ,SAAS,QAAQ,MAAM,MAAM,CAAC;AAAA,IACnD,CAAC;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ANzGI,gBAAAC,MAqLI,YArLJ;AAhDJ,IAAM,gBAAgB,KAAK,MAAM,OAAO,6BAA6B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAChH,IAAM,eAAe,KAAK,MAAM,OAAO,4BAA4B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAC7G,IAAM,aAAa,KAAK,MAAM,OAAO,0BAA0B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACvG,IAAM,eAAe,KAAK,MAAM,OAAO,4BAA4B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAC7G,IAAM,iBAAiB,KAAK,MAAM,OAAO,8BAA8B,EAAE,KAAK,QAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AA0CnH,SAAS,eAAe,EAAE,UAAU,GAA2B;AAC7D,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,YACE;AAAA,QACF,gBAAgB;AAAA,QAChB,WAAW;AAAA,MACb;AAAA,MACA,eAAW;AAAA;AAAA,EACb;AAEJ;AAGO,SAAS,iBAAiB,EAAE,UAAU,GAA2B;AAEtE,QAAM,YAAY,aAAa;AAC/B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,aAAU;AAAA,MACV,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,eAAW;AAAA,UACX,MAAM;AAAA,UACN,OAAO,EAAE,OAAO,UAAU,QAAQ,SAAS;AAAA;AAAA,MAC7C;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,gBAAgB,EAAE,OAAO,UAAU,GAA2C;AACrF,QAAM,UAAU,gBAAgB,OAAO,6BAA6B;AACpE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,gBAAgB,QAA0C;AACjE,SAAO,WAAW,aAAa,WAAW,YAAY,WAAW,UAAU,WAAW;AACxF;AAEA,SAAS,kBAAkB,EAAE,QAAQ,UAAU,GAA+C;AAC5F,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,gBAAAA,KAAC,iBAAc,WAAsB;AAAA,IAC9C,KAAK;AACH,aAAO,gBAAAA,KAAC,gBAAa,WAAsB;AAAA,IAC7C,KAAK;AACH,aAAO,gBAAAA,KAAC,cAAW,WAAsB;AAAA,IAC3C,KAAK;AACH,aAAO,gBAAAA,KAAC,gBAAa,WAAsB;AAAA,EAC/C;AACF;AAEA,SAAS,eAAe,EAAE,QAAQ,UAAU,GAA+C;AACzF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WACE,gBAAAA,KAAC,YAAS,UAAU,gBAAAA,KAAC,kBAAe,WAAsB,GACxD,0BAAAA,KAAC,qBAAkB,QAAgB,WAAsB,GAC3D;AAAA,EAEJ;AACA,QAAM,aAAa;AACnB,SAAO,gBAAAA,KAAC,cAAW,WAAsB;AAC3C;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAIoG;AAClG,QAAM,EAAE,MAAM,YAAY,oBAAoB,qBAAqB,iBAAiB,IAAI,aAAa;AAErG,QAAM,gBAAgB,KAAK,WAAW,YAAY,KAAK,aAAa,KAAK;AAGzE,QAAM,CAAC,gBAAgB,IAAIC,UAAS,sBAAsB;AAE1D,QAAM,yBAAyBC,SAAQ,MAAqB;AAC1D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,eAAe,aAAW;AACxB,YAAI,QAAQ,cAAc,QAAW;AACnC,iBAAO,OAAO,cAAc,OAAO;AAAA,QACrC;AACA,cAAM,eAA4E;AAAA,UAChF,GAAG;AAAA,UACH,UAAU;AAAA,YACR,CAAC,4BAA4B,GAAG,2BAA2B,aAAa;AAAA,UAC1E;AAAA,QACF;AACA,eAAO,OAAO,cAAc,YAAY;AAAA,MAC1C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,QAAM,sBAAsBA;AAAA,IAC1B,MAAM,qBAAqB,EAAE,QAAQ,wBAAwB,OAAO,iBAAiB,CAAC;AAAA,IACtF,CAAC,wBAAwB,gBAAgB;AAAA,EAC3C;AACA,QAAMC,iBAAgBD,SAAuB,MAAM;AACjD,QAAI,sBAAsB,QAAQ,mBAAmB,WAAW,KAAM,QAAO;AAE7E,WAAO,EAAE,GAAG,qBAAqB,cAAc,aAAa,EAAE,MAAM,CAAC,EAAE,GAAG;AAAA,EAC5E,GAAG,CAAC,qBAAqB,kBAAkB,CAAC;AAI5C,QAAM,wBAAwBA,SAAQ,MAAM;AAC1C,QAAI,KAAK,WAAW,YAAY,KAAK,WAAW;AAC9C,aAAO,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,sBAAsB,EAAE;AAAA,IACpE;AACA,WAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,EAAE;AAAA,EAGlD,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,QAAgCA,SAAQ,MAAM;AAGlD,QAAI,KAAK,WAAW,QAAQ;AAC1B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,kBAAkB,EAAE,OAAO,EAAE,MAAM,sBAAsB,EAAE;AAAA,MAC7D;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,YAAY,KAAK,aAAa,KAAK,WAAW;AACpD,UAAI,aAAa,MAAM;AAErB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,kBAAkB,EAAE,OAAO,EAAE,MAAM,sBAAsB,EAAE;AAAA,QAC7D;AAAA,MACF;AACA,aAAO,EAAE,MAAM,SAAS,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,kBAAkB;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,uBAAuB,gBAAgB,CAAC;AAElD,SACE,gBAAAF,KAAC,wBACC,0BAAAA;AAAA,IAAC;AAAA;AAAA,MAEE,GAAG;AAAA,MACJ,QAAQG;AAAA,MACR;AAAA,MACA;AAAA,MACA,kBAAkB,oBAAoB;AAAA,MAEtC,+BAAC,mCACC;AAAA,wBAAAH,KAAC,6BAA0B;AAAA,QAC3B,gBAAAA,KAAC,8BAA2B;AAAA,QAC3B,oBAAoB,OAAO,gBAAAA,KAAC,uBAAoB,kBAAoC,IAAK;AAAA,QACzF;AAAA,SACH;AAAA;AAAA,IAZK;AAAA,EAaP,GACF;AAEJ;AAGO,SAAS,iBAAiB,OAA8B;AAC7D,QAAM;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,WAAW,kBAAkB,cAAc,OAAO;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAA6B,MAAS;AAClF,QAAM,uBAAuBG,aAAY,CAAC,OAA2B,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAE9F,MAAI,SAAS,WAAW,WAAW;AACjC,WACE,gBAAAJ,KAAC,iBAAc,WAAsB,OACnC,0BAAAA,KAAC,oBAAiB,WAAsB,GAC1C;AAAA,EAEJ;AAEA,MAAI,SAAS,WAAW,SAAS;AAC/B,WACE,gBAAAA,KAAC,iBAAc,WAAsB,OACnC,0BAAAA,KAAC,mBAAgB,OAAO,SAAS,OAAO,WAAsB,GAChE;AAAA,EAEJ;AAEA,QAAM,SAAS,SAAS;AACxB,QAAM,aAAa,gBAAAA,KAAC,kBAAe,QAAgB,WAAsB;AAEzE,QAAM,YACJ,qBAAC,qBAAkB,aAA0B,qBAC3C;AAAA,oBAAAA,KAAC,2BAAwB;AAAA,IACxB,kBAAkB,OACjB,gBAAAA,KAAC,YAAS,UAAU,MAClB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA;AAAA,IACF,GACF,IACE;AAAA,IACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,kBAAkB,kBAAkB,OAAO,uBAAuB;AAAA,QACjE,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,KACF;AAGF,QAAM,iBACJ,WAAW,WAAW,gBAAAA,KAAC,4BAA0B,qBAAU,IAA8B;AAE3F,SACE,gBAAAA,KAAC,iBAAc,WAAsB,OACnC,0BAAAA,KAAC,uBAAoB,aACnB,0BAAAA,KAAC,iCAA8B,WAAW,uBACxC,0BAAAA,KAAC,kBAAe,QACb,4BAAkB,OACjB,gBAAAA,KAAC,0BAAuB,QAAQ,gBAAiB,0BAAe,IAEhE,gBAEJ,GACF,GACF,GACF;AAEJ;","names":["useAuiState","useAuiState","useCallback","useMemo","useState","useEffect","useEffect","useEffect","useEffect","useEffect","useEffect","useEffect","runtimeServer","jsx","useState","useMemo","runtimeServer","useCallback"]}
|