@truefoundry/trueforge-ui 0.3.0-rc.2 → 0.3.0-rc.4

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 (107) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +18 -10
  3. package/dist/{AgentCodeSnippets-637HQUXD.js → AgentCodeSnippets-U6KQWVBJ.js} +38 -23
  4. package/dist/AgentCodeSnippets-U6KQWVBJ.js.map +1 -0
  5. package/dist/AgentMetricChart-3D6FUFO6.js +15 -0
  6. package/dist/{AgentOverview-3FJ5EE6N.js → AgentOverview-RLJ6HZCN.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-VELWUYPR.js → AgentSessionEventTimeline-CDXRRUZQ.js} +8 -8
  8. package/dist/{AgentSessionEventTimeline-VELWUYPR.js.map → AgentSessionEventTimeline-CDXRRUZQ.js.map} +1 -1
  9. package/dist/{AgentSessionEventTimelineChart-CUKETHWM.js → AgentSessionEventTimelineChart-S2WX6ZEA.js} +12 -12
  10. package/dist/AgentSessionEventTimelineChart-S2WX6ZEA.js.map +1 -0
  11. package/dist/{AgentSessions-T7MOGOTZ.js → AgentSessions-UI3L7XY2.js} +72 -24
  12. package/dist/AgentSessions-UI3L7XY2.js.map +1 -0
  13. package/dist/{ConnectorSettings-ESZ2RSRG.js → ConnectorSettings-OIGAC2HU.js} +156 -116
  14. package/dist/ConnectorSettings-OIGAC2HU.js.map +1 -0
  15. package/dist/{DockLayout-NLFNU6F2.js → DockLayout-J5BRKMJZ.js} +10 -10
  16. package/dist/{DrawerLayout-PR3SMKA6.js → DrawerLayout-65YHGHIF.js} +13 -11
  17. package/dist/DrawerLayout-65YHGHIF.js.map +1 -0
  18. package/dist/{ModelSettings-LYW64IRR.js → ModelSettings-VP6WCMGT.js} +10 -10
  19. package/dist/{ModelSettings-LYW64IRR.js.map → ModelSettings-VP6WCMGT.js.map} +1 -1
  20. package/dist/OpenUiFenceBlock-UTDCTNTM.js +9 -0
  21. package/dist/{SandboxSettings-DF64LHYI.js → SandboxSettings-GTZT7LD6.js} +9 -9
  22. package/dist/SchedulesPage-ARWU7BZF.js +15 -0
  23. package/dist/{SettingsBuilder-LSXK2VN4.js → SettingsBuilder-A4BPYIFZ.js} +8 -8
  24. package/dist/{ShellRouteSync-B22IAV2W.js → ShellRouteSync-SSLGM35F.js} +157 -22
  25. package/dist/ShellRouteSync-SSLGM35F.js.map +1 -0
  26. package/dist/{SidebarLayout-XW6LXB7R.js → SidebarLayout-MFDOGAVJ.js} +74 -53
  27. package/dist/SidebarLayout-MFDOGAVJ.js.map +1 -0
  28. package/dist/{SkillSettings-64VXUO6J.js → SkillSettings-WQPUQ5TE.js} +18 -13
  29. package/dist/SkillSettings-WQPUQ5TE.js.map +1 -0
  30. package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js → TrueForgeUIWithRouter-5CDICMCE.js} +9 -9
  31. package/dist/{WidgetLayout-Q5P7PYSJ.js → WidgetLayout-HE7E4UL5.js} +10 -10
  32. package/dist/{chunk-SQGT43Z3.js → chunk-2BDTG544.js} +21 -4
  33. package/dist/chunk-2BDTG544.js.map +1 -0
  34. package/dist/{chunk-YQO2NMJ3.js → chunk-2OKGEU6X.js} +4425 -2982
  35. package/dist/chunk-2OKGEU6X.js.map +1 -0
  36. package/dist/{chunk-FQK2XVVE.js → chunk-6CFZHEYH.js} +225 -72
  37. package/dist/chunk-6CFZHEYH.js.map +1 -0
  38. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  39. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  40. package/dist/chunk-E4GVP6PM.js +195 -0
  41. package/dist/chunk-E4GVP6PM.js.map +1 -0
  42. package/dist/{chunk-LGRHHFHN.js → chunk-F7ZAQIRE.js} +166 -45
  43. package/dist/chunk-F7ZAQIRE.js.map +1 -0
  44. package/dist/{chunk-VJ7BZGAF.js → chunk-GTTMLDCI.js} +2 -2
  45. package/dist/{chunk-5I2COQNL.js → chunk-IOPHQEUY.js} +13 -11
  46. package/dist/chunk-IOPHQEUY.js.map +1 -0
  47. package/dist/{chunk-G2TUAD65.js → chunk-KCYBMKQL.js} +235 -108
  48. package/dist/chunk-KCYBMKQL.js.map +1 -0
  49. package/dist/{chunk-H6WTY5PM.js → chunk-MAA7U4RF.js} +17 -227
  50. package/dist/chunk-MAA7U4RF.js.map +1 -0
  51. package/dist/{chunk-GXYAOAK5.js → chunk-MJULWIPI.js} +224 -162
  52. package/dist/chunk-MJULWIPI.js.map +1 -0
  53. package/dist/chunk-P7J2ABEP.js +587 -0
  54. package/dist/chunk-P7J2ABEP.js.map +1 -0
  55. package/dist/{chunk-VUMGMGKZ.js → chunk-TGKQRK3S.js} +52 -8
  56. package/dist/chunk-TGKQRK3S.js.map +1 -0
  57. package/dist/{chunk-I3AL54MA.js → chunk-VXKNS7FH.js} +28 -24
  58. package/dist/chunk-VXKNS7FH.js.map +1 -0
  59. package/dist/chunk-XO3FYN2W.js +517 -0
  60. package/dist/chunk-XO3FYN2W.js.map +1 -0
  61. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  62. package/dist/index.d.ts +300 -89
  63. package/dist/index.js +65 -488
  64. package/dist/index.js.map +1 -1
  65. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +44 -13
  66. package/dist/plugins/trueforge-agent-server-adapter/index.js +73 -37
  67. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  68. package/dist/styles.css +1 -1
  69. package/package.json +3 -3
  70. package/dist/AgentCodeSnippets-637HQUXD.js.map +0 -1
  71. package/dist/AgentMetricChart-4FYECRIN.js +0 -15
  72. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +0 -1
  73. package/dist/AgentSessions-T7MOGOTZ.js.map +0 -1
  74. package/dist/ConnectorSettings-ESZ2RSRG.js.map +0 -1
  75. package/dist/DrawerLayout-PR3SMKA6.js.map +0 -1
  76. package/dist/OpenUiFenceBlock-JEPNPJ7U.js +0 -9
  77. package/dist/SchedulesPage-WQU4H25F.js +0 -15
  78. package/dist/ShellRouteSync-B22IAV2W.js.map +0 -1
  79. package/dist/SidebarLayout-XW6LXB7R.js.map +0 -1
  80. package/dist/SkillSettings-64VXUO6J.js.map +0 -1
  81. package/dist/chunk-5I2COQNL.js.map +0 -1
  82. package/dist/chunk-BWHOZFIV.js +0 -587
  83. package/dist/chunk-BWHOZFIV.js.map +0 -1
  84. package/dist/chunk-FQK2XVVE.js.map +0 -1
  85. package/dist/chunk-G2TUAD65.js.map +0 -1
  86. package/dist/chunk-GXYAOAK5.js.map +0 -1
  87. package/dist/chunk-H6WTY5PM.js.map +0 -1
  88. package/dist/chunk-I3AL54MA.js.map +0 -1
  89. package/dist/chunk-LGRHHFHN.js.map +0 -1
  90. package/dist/chunk-NHHSZB5N.js +0 -74
  91. package/dist/chunk-NHHSZB5N.js.map +0 -1
  92. package/dist/chunk-QC42MLAK.js.map +0 -1
  93. package/dist/chunk-SFZNIO6U.js +0 -18
  94. package/dist/chunk-SFZNIO6U.js.map +0 -1
  95. package/dist/chunk-SQGT43Z3.js.map +0 -1
  96. package/dist/chunk-VUMGMGKZ.js.map +0 -1
  97. package/dist/chunk-YQO2NMJ3.js.map +0 -1
  98. /package/dist/{AgentMetricChart-4FYECRIN.js.map → AgentMetricChart-3D6FUFO6.js.map} +0 -0
  99. /package/dist/{AgentOverview-3FJ5EE6N.js.map → AgentOverview-RLJ6HZCN.js.map} +0 -0
  100. /package/dist/{DockLayout-NLFNU6F2.js.map → DockLayout-J5BRKMJZ.js.map} +0 -0
  101. /package/dist/{OpenUiFenceBlock-JEPNPJ7U.js.map → OpenUiFenceBlock-UTDCTNTM.js.map} +0 -0
  102. /package/dist/{SandboxSettings-DF64LHYI.js.map → SandboxSettings-GTZT7LD6.js.map} +0 -0
  103. /package/dist/{SchedulesPage-WQU4H25F.js.map → SchedulesPage-ARWU7BZF.js.map} +0 -0
  104. /package/dist/{SettingsBuilder-LSXK2VN4.js.map → SettingsBuilder-A4BPYIFZ.js.map} +0 -0
  105. /package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js.map → TrueForgeUIWithRouter-5CDICMCE.js.map} +0 -0
  106. /package/dist/{WidgetLayout-Q5P7PYSJ.js.map → WidgetLayout-HE7E4UL5.js.map} +0 -0
  107. /package/dist/{chunk-VJ7BZGAF.js.map → chunk-GTTMLDCI.js.map} +0 -0
@@ -10,48 +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,
21
24
  useToaster
22
- } from "./chunk-YQO2NMJ3.js";
25
+ } from "./chunk-2OKGEU6X.js";
23
26
  import {
24
27
  DraftCatalogProvider,
25
28
  Spinner,
26
- getErrorMessage,
27
29
  useDraftCatalog
28
- } from "./chunk-H6WTY5PM.js";
30
+ } from "./chunk-MAA7U4RF.js";
29
31
  import {
30
32
  DEFAULT_AGENT_CONFIG,
31
33
  ServerProvider,
32
34
  ShellModeProvider,
35
+ getErrorMessage,
33
36
  isSessionsChromeEnabled,
34
37
  readSessionShareSearch,
35
38
  useOptionalAgentSessionsServer,
39
+ useOptionalShellMode,
36
40
  useServerCapabilities,
37
41
  useShellMode,
38
42
  withCapabilitiesSandbox
39
- } from "./chunk-FQK2XVVE.js";
43
+ } from "./chunk-6CFZHEYH.js";
40
44
  import {
45
+ useAui,
41
46
  useAuiState
42
47
  } from "./chunk-M6MHLVSO.js";
43
48
  import {
44
49
  cn
45
- } from "./chunk-BWHOZFIV.js";
50
+ } from "./chunk-P7J2ABEP.js";
46
51
 
47
52
  // src/containers/TrueFoundryChatProvider.tsx
48
- import { AssistantRuntimeProvider } from "@assistant-ui/react";
53
+ import { AssistantRuntimeProvider, useAuiState as useAuiState2 } from "@assistant-ui/react";
49
54
  import {
50
55
  trueFoundryAttachmentAdapter,
51
56
  useTrueFoundryAgentRuntime
52
57
  } from "@truefoundry/assistant-ui-runtime";
53
58
  import { useCallback, useMemo } from "react";
54
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
+ }
55
94
  function ChatRuntimeScope({
56
95
  server,
57
96
  agent,
@@ -64,6 +103,12 @@ function ChatRuntimeScope({
64
103
  }) {
65
104
  const { showError } = useToaster();
66
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
+ );
67
112
  const resolvedOnError = useCallback(
68
113
  (error) => {
69
114
  notifyComposerBusyFailure();
@@ -72,10 +117,11 @@ function ChatRuntimeScope({
72
117
  [reportError]
73
118
  );
74
119
  const runtime = useTrueFoundryAgentRuntime({
75
- server,
120
+ server: historyServer,
76
121
  agent,
77
122
  agentName,
78
123
  listSessionsAgentId,
124
+ listSessionsCreatedByMe: true,
79
125
  initialSessionId,
80
126
  onError: resolvedOnError,
81
127
  adapters: {
@@ -83,7 +129,7 @@ function ChatRuntimeScope({
83
129
  attachments: adapters?.attachments ?? trueFoundryAttachmentAdapter
84
130
  }
85
131
  });
86
- return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children });
132
+ return /* @__PURE__ */ jsx(AssistantRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx(ActiveSessionPermissionScope, { locallyCreatedSessionIds, children }) });
87
133
  }
88
134
  function TrueFoundryChatProvider(props) {
89
135
  const { server, initialSessionId, adapters, onError, children, agent, agentName, listSessionsAgentId } = props;
@@ -129,7 +175,6 @@ function reconcileDraftSpecPreferences({
129
175
  models,
130
176
  skills,
131
177
  connectors,
132
- connectorsHasMore = false,
133
178
  skillsEnabled
134
179
  }) {
135
180
  const update = {};
@@ -144,11 +189,9 @@ function reconcileDraftSpecPreferences({
144
189
  );
145
190
  }
146
191
  }
147
- if (!connectorsHasMore) {
148
- const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
149
- if (nextMcpServers !== agentSpec.mcpServers) {
150
- update.mcpServers = nextMcpServers;
151
- }
192
+ const nextMcpServers = filterMounts(agentSpec.mcpServers, new Set(connectors.map((connector) => connector.name)));
193
+ if (nextMcpServers !== agentSpec.mcpServers) {
194
+ update.mcpServers = nextMcpServers;
152
195
  }
153
196
  if (skillsEnabled === false) {
154
197
  if (agentSpec.skills !== void 0 && agentSpec.skills.length > 0) {
@@ -197,7 +240,7 @@ function DraftSpecPreferenceBridge() {
197
240
  const updateAgentSpec = useTrueFoundryUpdateAgentSpec();
198
241
  const capabilities = useServerCapabilities();
199
242
  const sandboxEnabled = capabilities?.sandbox.enabled;
200
- const { models, skills, connectors, connectorsHasMore, loaded, error, ensureLoaded } = useDraftCatalog();
243
+ const { models, skills, connectors, loaded, error, ensureLoaded } = useDraftCatalog();
201
244
  const isPlainDraft = mode.status === "active" && mode.isMutable && mode.agentId == null && pendingSessionId == null;
202
245
  const preferenceKind = mode.status === "active" && mode.isMutable && mode.isCreateAgent ? "agent" : "chat";
203
246
  useEffect(() => {
@@ -222,7 +265,6 @@ function DraftSpecPreferenceBridge() {
222
265
  models,
223
266
  skills,
224
267
  connectors,
225
- connectorsHasMore,
226
268
  skillsEnabled: capabilities?.skill.enabled
227
269
  });
228
270
  if (Object.keys(update).length > 0) {
@@ -232,7 +274,6 @@ function DraftSpecPreferenceBridge() {
232
274
  agentSpec,
233
275
  capabilities?.skill.enabled,
234
276
  connectors,
235
- connectorsHasMore,
236
277
  error,
237
278
  isPlainDraft,
238
279
  loaded,
@@ -243,13 +284,27 @@ function DraftSpecPreferenceBridge() {
243
284
  return null;
244
285
  }
245
286
 
246
- // src/routing/LibrarySessionShareBoot.tsx
287
+ // src/routing/HistorySessionSwitchBridge.tsx
247
288
  import { useEffect as useEffect2 } from "react";
289
+ function HistorySessionSwitchBridge() {
290
+ const shell = useOptionalShellMode();
291
+ const aui = useAui();
292
+ const pendingSessionId = shell?.pendingSessionId;
293
+ const pendingSessionEpoch = shell?.pendingSessionEpoch ?? 0;
294
+ useEffect2(() => {
295
+ if (pendingSessionId == null) return;
296
+ void Promise.resolve(aui.threads().switchToThread(pendingSessionId)).catch(() => void 0);
297
+ }, [aui, pendingSessionId, pendingSessionEpoch]);
298
+ return null;
299
+ }
300
+
301
+ // src/routing/LibrarySessionShareBoot.tsx
302
+ import { useEffect as useEffect3 } from "react";
248
303
  function LibrarySessionShareBoot() {
249
304
  const { openLibraryAgent, setSessionsOpen } = useShellMode();
250
305
  const sessions = useOptionalAgentSessionsServer();
251
306
  const sessionsEnabled = isSessionsChromeEnabled({ sessions });
252
- useEffect2(() => {
307
+ useEffect3(() => {
253
308
  if (!sessionsEnabled) return;
254
309
  const share = readSessionShareSearch(window.location.search);
255
310
  if (share.view === "sessions") {
@@ -263,18 +318,66 @@ function LibrarySessionShareBoot() {
263
318
  }
264
319
 
265
320
  // src/routing/RemoteIdRouteBridge.tsx
266
- import { useEffect as useEffect3 } from "react";
321
+ import { useEffect as useEffect4 } from "react";
267
322
  function RemoteIdRouteBridge({ onRemoteIdChange }) {
268
323
  const remoteId = useAuiState((s) => s.threadListItem.remoteId);
269
- useEffect3(() => {
324
+ useEffect4(() => {
270
325
  onRemoteIdChange(remoteId ?? void 0);
271
326
  }, [remoteId, onRemoteIdChange]);
272
327
  return null;
273
328
  }
274
329
 
330
+ // src/server/sessionListCache.ts
331
+ var SESSION_LIST_TTL_MS = 3e4;
332
+ function createSessionListCache() {
333
+ return /* @__PURE__ */ new Map();
334
+ }
335
+ function cacheKey(request) {
336
+ const rest = { ...request };
337
+ delete rest.startTimestamp;
338
+ return JSON.stringify(rest, Object.keys(rest).sort());
339
+ }
340
+ function withSessionListCache({
341
+ server,
342
+ cache
343
+ }) {
344
+ const { deleteSession } = server;
345
+ return {
346
+ ...server,
347
+ listSessions(request) {
348
+ const key = cacheKey(request);
349
+ const now = Date.now();
350
+ const entry = cache.get(key);
351
+ if (entry !== void 0 && now - entry.at < SESSION_LIST_TTL_MS) return entry.page;
352
+ const page = server.listSessions(request);
353
+ cache.set(key, { at: now, page });
354
+ void page.catch(() => {
355
+ if (cache.get(key)?.page === page) cache.delete(key);
356
+ });
357
+ return page;
358
+ },
359
+ async createSession(request) {
360
+ const result = await server.createSession(request);
361
+ cache.clear();
362
+ return result;
363
+ },
364
+ async updateSession(request) {
365
+ const result = await server.updateSession(request);
366
+ cache.clear();
367
+ return result;
368
+ },
369
+ ...deleteSession != null ? {
370
+ deleteSession: async (request) => {
371
+ await deleteSession.call(server, request);
372
+ cache.clear();
373
+ }
374
+ } : {}
375
+ };
376
+ }
377
+
275
378
  // src/containers/useResolvedServer.ts
276
379
  import { createTrueFoundryAgentUIServer } from "@truefoundry/assistant-ui-runtime/plugins/truefoundry-agent-server-adapter";
277
- import { useEffect as useEffect4, useState } from "react";
380
+ import { useEffect as useEffect5, useState } from "react";
278
381
  var DEFAULT_CAPABILITIES = {
279
382
  data: {
280
383
  sandbox: { enabled: true },
@@ -288,14 +391,18 @@ function isBuiltInConfig(config) {
288
391
  function hasGetCapabilities(server) {
289
392
  return typeof Reflect.get(server, "getCapabilities") === "function";
290
393
  }
291
- function toAgentUIServer(server, catalog) {
394
+ function toAgentUIServer(server, catalog, permissions) {
292
395
  const getCapabilities = hasGetCapabilities(server) ? () => server.getCapabilities() : async () => DEFAULT_CAPABILITIES;
293
396
  const withCapabilities = { ...server, getCapabilities };
294
- const withCatalog = catalog != null ? { ...withCapabilities, catalog } : withCapabilities;
295
- if (!isAgentUIServer(withCatalog)) {
397
+ const withOptionalPorts = {
398
+ ...withCapabilities,
399
+ ...catalog == null ? {} : { catalog },
400
+ ...permissions == null ? {} : { permissions }
401
+ };
402
+ if (!isAgentUIServer(withOptionalPorts)) {
296
403
  throw new Error("TrueForgeUI: runtime adapter returned an incomplete AgentUIServer");
297
404
  }
298
- return withCatalog;
405
+ return withOptionalPorts;
299
406
  }
300
407
  function isAgentUIServer(value) {
301
408
  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";
@@ -311,13 +418,14 @@ function useResolvedServer(config, onError) {
311
418
  const trueforgeToken = builtIn?.type === "trueforge" ? builtIn.token ?? "" : "";
312
419
  const trueforgeFetch = builtIn?.type === "trueforge" ? builtIn.fetch : void 0;
313
420
  const catalog = builtIn?.catalog;
421
+ const permissions = builtIn?.permissions;
314
422
  const [state, setState] = useState(() => {
315
423
  if (directServer) {
316
424
  return { status: "ready", server: directServer, error: null };
317
425
  }
318
426
  return { status: "loading", server: null, error: null };
319
427
  });
320
- useEffect4(() => {
428
+ useEffect5(() => {
321
429
  if (directServer) {
322
430
  setState({ status: "ready", server: directServer, error: null });
323
431
  return;
@@ -331,22 +439,23 @@ function useResolvedServer(config, onError) {
331
439
  ...trueforgeBaseUrl ? { baseUrl: trueforgeBaseUrl } : {},
332
440
  ...trueforgeToken ? { token: trueforgeToken } : {},
333
441
  ...trueforgeFetch !== void 0 ? { fetch: trueforgeFetch } : {},
334
- ...catalog != null ? { catalog } : {}
442
+ ...catalog != null ? { catalog } : {},
443
+ ...permissions != null ? { permissions } : {}
335
444
  });
336
445
  }
337
- const runtimeServer = await createTrueFoundryAgentUIServer({
446
+ const runtimeServer2 = await createTrueFoundryAgentUIServer({
338
447
  apiKey,
339
448
  cpURL: controlPlaneURL,
340
449
  ...gatewayPlaneURL ? { gatewayURL: gatewayPlaneURL } : {}
341
450
  });
342
- return toAgentUIServer(runtimeServer, catalog);
451
+ return toAgentUIServer(runtimeServer2, catalog, permissions);
343
452
  };
344
453
  void resolve().then((server) => {
345
454
  if (cancelled) return;
346
455
  try {
347
456
  setState({
348
457
  status: "ready",
349
- server: type === "trueforge" ? toAgentUIServer(server, void 0) : server,
458
+ server: type === "trueforge" ? toAgentUIServer(server, void 0, void 0) : server,
350
459
  error: null
351
460
  });
352
461
  } catch (error) {
@@ -371,6 +480,7 @@ function useResolvedServer(config, onError) {
371
480
  trueforgeToken,
372
481
  trueforgeFetch,
373
482
  catalog,
483
+ permissions,
374
484
  onError
375
485
  ]);
376
486
  return state;
@@ -378,11 +488,11 @@ function useResolvedServer(config, onError) {
378
488
 
379
489
  // src/containers/TrueForgeUIShell.tsx
380
490
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
381
- var SidebarLayout = lazy(() => import("./SidebarLayout-XW6LXB7R.js").then((m) => ({ default: m.SidebarLayout })));
382
- var DrawerLayout = lazy(() => import("./DrawerLayout-PR3SMKA6.js").then((m) => ({ default: m.DrawerLayout })));
383
- var DockLayout = lazy(() => import("./DockLayout-NLFNU6F2.js").then((m) => ({ default: m.DockLayout })));
384
- var WidgetLayout = lazy(() => import("./WidgetLayout-Q5P7PYSJ.js").then((m) => ({ default: m.WidgetLayout })));
385
- var ShellRouteSync = lazy(() => import("./ShellRouteSync-B22IAV2W.js").then((m) => ({ default: m.ShellRouteSync })));
491
+ var SidebarLayout = lazy(() => import("./SidebarLayout-MFDOGAVJ.js").then((m) => ({ default: m.SidebarLayout })));
492
+ var DrawerLayout = lazy(() => import("./DrawerLayout-65YHGHIF.js").then((m) => ({ default: m.DrawerLayout })));
493
+ var DockLayout = lazy(() => import("./DockLayout-J5BRKMJZ.js").then((m) => ({ default: m.DockLayout })));
494
+ var WidgetLayout = lazy(() => import("./WidgetLayout-HE7E4UL5.js").then((m) => ({ default: m.WidgetLayout })));
495
+ var ShellRouteSync = lazy(() => import("./ShellRouteSync-SSLGM35F.js").then((m) => ({ default: m.ShellRouteSync })));
386
496
  function LayoutFallback({ className }) {
387
497
  return /* @__PURE__ */ jsx2(
388
498
  "div",
@@ -460,8 +570,9 @@ function ChatProviderFromShell({
460
570
  server,
461
571
  ...providerRest
462
572
  }) {
463
- const { mode, runtimeKey, listSessionsAgentId, pendingSessionId } = useShellMode();
573
+ const { mode, runtimeKey, historyAgentFilter, listSessionsAgentId, pendingSessionId } = useShellMode();
464
574
  const isCreateAgent = mode.status === "active" && mode.isMutable && mode.isCreateAgent;
575
+ const [sessionListCache] = useState2(createSessionListCache);
465
576
  const serverWithCreateIntent = useMemo2(() => {
466
577
  return {
467
578
  ...server,
@@ -479,6 +590,14 @@ function ChatProviderFromShell({
479
590
  }
480
591
  };
481
592
  }, [server, isCreateAgent]);
593
+ const cachedRuntimeServer = useMemo2(
594
+ () => withSessionListCache({ server: serverWithCreateIntent, cache: sessionListCache }),
595
+ [serverWithCreateIntent, sessionListCache]
596
+ );
597
+ const runtimeServer2 = useMemo2(() => {
598
+ if (historyAgentFilter == null || historyAgentFilter.agentId != null) return cachedRuntimeServer;
599
+ return { ...cachedRuntimeServer, listSessions: async () => ({ data: [] }) };
600
+ }, [cachedRuntimeServer, historyAgentFilter]);
482
601
  const draftDefaultAgentSpec = useMemo2(() => {
483
602
  if (mode.status === "active" && mode.isMutable) {
484
603
  return mode.agentSpec ?? { model: { name: "openai-main/gpt-4.1" } };
@@ -507,22 +626,23 @@ function ChatProviderFromShell({
507
626
  defaultAgentSpec: draftDefaultAgentSpec
508
627
  };
509
628
  }, [mode, draftDefaultAgentSpec, pendingSessionId]);
510
- return /* @__PURE__ */ jsx2(
629
+ return /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsx2(
511
630
  TrueFoundryChatProvider,
512
631
  {
513
632
  ...providerRest,
514
- server: serverWithCreateIntent,
633
+ server: runtimeServer2,
515
634
  agent,
516
635
  listSessionsAgentId,
517
636
  initialSessionId: pendingSessionId ?? hostInitialSessionId,
518
- children: /* @__PURE__ */ jsx2(DraftCatalogProvider, { children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
637
+ children: /* @__PURE__ */ jsxs(AgentConfigInstructionsProvider, { children: [
519
638
  /* @__PURE__ */ jsx2(DraftSpecPreferenceBridge, {}),
639
+ /* @__PURE__ */ jsx2(HistorySessionSwitchBridge, {}),
520
640
  onRemoteIdChange != null ? /* @__PURE__ */ jsx2(RemoteIdRouteBridge, { onRemoteIdChange }) : null,
521
641
  children
522
- ] }) })
642
+ ] })
523
643
  },
524
644
  runtimeKey
525
- );
645
+ ) });
526
646
  }
527
647
  function TrueForgeUIShell(props) {
528
648
  const {
@@ -535,6 +655,7 @@ function TrueForgeUIShell(props) {
535
655
  server: serverConfig,
536
656
  onError,
537
657
  customActionRenderers,
658
+ currentUser,
538
659
  resolvedRoutes,
539
660
  routes: _routes,
540
661
  ...providerRest
@@ -572,7 +693,7 @@ function TrueForgeUIShell(props) {
572
693
  )
573
694
  ] });
574
695
  const visibilityTree = layout === "widget" ? /* @__PURE__ */ jsx2(WidgetVisibilityProvider, { children: shellTree }) : shellTree;
575
- 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 }) }) });
696
+ 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 }) }) }) });
576
697
  }
577
698
 
578
699
  export {
@@ -580,4 +701,4 @@ export {
580
701
  ServerInitLoader,
581
702
  TrueForgeUIShell
582
703
  };
583
- //# sourceMappingURL=chunk-LGRHHFHN.js.map
704
+ //# sourceMappingURL=chunk-F7ZAQIRE.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';\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 { Spinner } from '../atoms/primitives/Spinner.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, 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 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 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;;;ACD/E,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,MAkBA,YAlBA;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;AACtE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,wBAAAA,KAAC,WAAQ,MAAM,IAAI,WAAU,qBAAoB;AAAA,QACjD,gBAAAA,KAAC,UAAK,WAAU,WAAU,qBAAO;AAAA;AAAA;AAAA,EACnC;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"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  useOptionalContentClassNames
4
- } from "./chunk-BWHOZFIV.js";
4
+ } from "./chunk-P7J2ABEP.js";
5
5
 
6
6
  // src/atoms/OpenUiFenceBlock.tsx
7
7
  import { Renderer } from "@openuidev/react-lang";
@@ -21,4 +21,4 @@ function OpenUiFenceBlock({ content, isStreaming, darkTheme }) {
21
21
  export {
22
22
  OpenUiFenceBlock
23
23
  };
24
- //# sourceMappingURL=chunk-VJ7BZGAF.js.map
24
+ //# sourceMappingURL=chunk-GTTMLDCI.js.map
@@ -2,7 +2,7 @@ import {
2
2
  formatCostUsd,
3
3
  formatDurationMs,
4
4
  useThemeMode
5
- } from "./chunk-YQO2NMJ3.js";
5
+ } from "./chunk-2OKGEU6X.js";
6
6
 
7
7
  // src/atoms/agent-details/AgentMetricChart.tsx
8
8
  import {
@@ -18,8 +18,8 @@ import { useMemo } from "react";
18
18
  import { Line } from "react-chartjs-2";
19
19
  import { jsx, jsxs } from "react/jsx-runtime";
20
20
  ChartJS.register(CategoryScale, LinearScale, LineElement, PointElement, Legend, Tooltip);
21
- var LIGHT_COLORS = ["#2563eb", "#16a34a", "#9333ea", "#ea580c", "#0891b2"];
22
- var DARK_COLORS = ["#60a5fa", "#4ade80", "#c084fc", "#fb923c", "#22d3ee"];
21
+ var LIGHT_COLORS = ["#6366F1", "#2563eb", "#0EA5E9"];
22
+ var DARK_COLORS = ["#6366F1", "#60a5fa", "#38BDF8"];
23
23
  var numberFormatter = new Intl.NumberFormat(void 0, { maximumFractionDigits: 4 });
24
24
  var timestampFormatter = new Intl.DateTimeFormat(void 0, {
25
25
  month: "short",
@@ -36,10 +36,10 @@ function formatTimestamp(timestamp) {
36
36
  const date = new Date(timestamp);
37
37
  return Number.isNaN(date.getTime()) ? timestamp : timestampFormatter.format(date);
38
38
  }
39
- function AgentMetricChart({ graph, definition, error }) {
39
+ function AgentMetricChart({ graph, definition, error, colorIndex = 0 }) {
40
40
  const mode = useThemeMode();
41
41
  const colors = mode === "dark" ? DARK_COLORS : LIGHT_COLORS;
42
- const axisColor = mode === "dark" ? "#a1a1aa" : "#71717a";
42
+ const axisColor = mode === "dark" ? "#71717a" : "#a1a1aa";
43
43
  const gridColor = mode === "dark" ? "#27272a" : "#e4e4e7";
44
44
  const labels = useMemo(
45
45
  () => graph == null ? [] : [...new Set(graph.graphLines.flatMap((line) => line.values.map((point) => point.timestamp)))].sort(),
@@ -50,21 +50,23 @@ function AgentMetricChart({ graph, definition, error }) {
50
50
  labels: labels.map(formatTimestamp),
51
51
  datasets: graph?.graphLines.map((line, index) => {
52
52
  const valuesByTimestamp = new Map(line.values.map((point) => [point.timestamp, point.value]));
53
- const color = colors[index % colors.length];
53
+ const color = colors[(colorIndex + index) % colors.length];
54
54
  return {
55
55
  label: line.name,
56
56
  data: labels.map((timestamp) => valuesByTimestamp.get(timestamp) ?? null),
57
57
  borderColor: color,
58
58
  backgroundColor: color,
59
- pointRadius: 2,
60
- pointHoverRadius: 4,
59
+ pointRadius: 0,
60
+ pointHoverRadius: 0,
61
61
  borderWidth: 2,
62
- tension: 0.25,
62
+ borderCapStyle: "butt",
63
+ borderJoinStyle: "miter",
64
+ tension: 0,
63
65
  spanGaps: true
64
66
  };
65
67
  }) ?? []
66
68
  }),
67
- [colors, graph, labels]
69
+ [colorIndex, colors, graph, labels]
68
70
  );
69
71
  const options = useMemo(
70
72
  () => ({
@@ -116,4 +118,4 @@ function AgentMetricChart({ graph, definition, error }) {
116
118
  export {
117
119
  AgentMetricChart
118
120
  };
119
- //# sourceMappingURL=chunk-5I2COQNL.js.map
121
+ //# sourceMappingURL=chunk-IOPHQEUY.js.map