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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +21 -6
  3. package/dist/AgentCodeSnippets-637HQUXD.js +74 -0
  4. package/dist/AgentCodeSnippets-637HQUXD.js.map +1 -0
  5. package/dist/AgentMetricChart-4FYECRIN.js +15 -0
  6. package/dist/AgentOverview-3FJ5EE6N.js +167 -0
  7. package/dist/AgentOverview-3FJ5EE6N.js.map +1 -0
  8. package/dist/AgentSessionEventTimeline-VELWUYPR.js +88 -0
  9. package/dist/AgentSessionEventTimeline-VELWUYPR.js.map +1 -0
  10. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js +591 -0
  11. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +1 -0
  12. package/dist/AgentSessions-T7MOGOTZ.js +275 -0
  13. package/dist/AgentSessions-T7MOGOTZ.js.map +1 -0
  14. package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-ESZ2RSRG.js} +19 -21
  15. package/dist/ConnectorSettings-ESZ2RSRG.js.map +1 -0
  16. package/dist/{DockLayout-LBNQJZNF.js → DockLayout-NLFNU6F2.js} +11 -10
  17. package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-NLFNU6F2.js.map} +1 -1
  18. package/dist/DrawerLayout-PR3SMKA6.js +184 -0
  19. package/dist/DrawerLayout-PR3SMKA6.js.map +1 -0
  20. package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-LYW64IRR.js} +20 -24
  21. package/dist/ModelSettings-LYW64IRR.js.map +1 -0
  22. package/dist/OpenUiFenceBlock-JEPNPJ7U.js +9 -0
  23. package/dist/OpenUiFenceBlock-JEPNPJ7U.js.map +1 -0
  24. package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-DF64LHYI.js} +16 -18
  25. package/dist/SandboxSettings-DF64LHYI.js.map +1 -0
  26. package/dist/SchedulesPage-WQU4H25F.js +15 -0
  27. package/dist/SchedulesPage-WQU4H25F.js.map +1 -0
  28. package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-LSXK2VN4.js} +26 -22
  29. package/dist/SettingsBuilder-LSXK2VN4.js.map +1 -0
  30. package/dist/ShellRouteSync-B22IAV2W.js +255 -0
  31. package/dist/ShellRouteSync-B22IAV2W.js.map +1 -0
  32. package/dist/SidebarLayout-XW6LXB7R.js +309 -0
  33. package/dist/SidebarLayout-XW6LXB7R.js.map +1 -0
  34. package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-64VXUO6J.js} +14 -15
  35. package/dist/SkillSettings-64VXUO6J.js.map +1 -0
  36. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-3TSLV22Q.js} +14 -10
  37. package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-3TSLV22Q.js.map} +1 -1
  38. package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-Q5P7PYSJ.js} +17 -13
  39. package/dist/WidgetLayout-Q5P7PYSJ.js.map +1 -0
  40. package/dist/chunk-5I2COQNL.js +119 -0
  41. package/dist/chunk-5I2COQNL.js.map +1 -0
  42. package/dist/chunk-BWHOZFIV.js +587 -0
  43. package/dist/chunk-BWHOZFIV.js.map +1 -0
  44. package/dist/chunk-DJUFS2BW.js +27 -0
  45. package/dist/chunk-DJUFS2BW.js.map +1 -0
  46. package/dist/chunk-FQK2XVVE.js +880 -0
  47. package/dist/chunk-FQK2XVVE.js.map +1 -0
  48. package/dist/chunk-G2TUAD65.js +555 -0
  49. package/dist/chunk-G2TUAD65.js.map +1 -0
  50. package/dist/chunk-GXYAOAK5.js +1357 -0
  51. package/dist/chunk-GXYAOAK5.js.map +1 -0
  52. package/dist/{chunk-FJ5RSSMA.js → chunk-H6WTY5PM.js} +196 -32
  53. package/dist/chunk-H6WTY5PM.js.map +1 -0
  54. package/dist/chunk-I3AL54MA.js +180 -0
  55. package/dist/chunk-I3AL54MA.js.map +1 -0
  56. package/dist/{chunk-WREC7D54.js → chunk-LGRHHFHN.js} +120 -32
  57. package/dist/chunk-LGRHHFHN.js.map +1 -0
  58. package/dist/chunk-NHHSZB5N.js +74 -0
  59. package/dist/chunk-NHHSZB5N.js.map +1 -0
  60. package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
  61. package/dist/chunk-QC42MLAK.js.map +1 -0
  62. package/dist/chunk-RDXBMTP5.js +32 -0
  63. package/dist/chunk-RDXBMTP5.js.map +1 -0
  64. package/dist/chunk-SFZNIO6U.js +18 -0
  65. package/dist/chunk-SFZNIO6U.js.map +1 -0
  66. package/dist/chunk-SQGT43Z3.js +200 -0
  67. package/dist/chunk-SQGT43Z3.js.map +1 -0
  68. package/dist/{chunk-B52K63AW.js → chunk-VJ7BZGAF.js} +2 -2
  69. package/dist/chunk-VUMGMGKZ.js +252 -0
  70. package/dist/chunk-VUMGMGKZ.js.map +1 -0
  71. package/dist/chunk-Y6S4OVVQ.js +16 -0
  72. package/dist/chunk-Y6S4OVVQ.js.map +1 -0
  73. package/dist/chunk-YQO2NMJ3.js +13341 -0
  74. package/dist/chunk-YQO2NMJ3.js.map +1 -0
  75. package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
  76. package/dist/index.d.ts +1024 -24
  77. package/dist/index.js +691 -67
  78. package/dist/index.js.map +1 -1
  79. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -8
  80. package/dist/plugins/trueforge-agent-server-adapter/index.js +504 -188
  81. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  82. package/dist/styles.css +1 -1
  83. package/package.json +9 -8
  84. package/dist/ConnectorSettings-FXQ5B7TN.js.map +0 -1
  85. package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
  86. package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
  87. package/dist/ModelSettings-4L4LOQJA.js.map +0 -1
  88. package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
  89. package/dist/SandboxSettings-Z4ZG6ZX4.js.map +0 -1
  90. package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
  91. package/dist/ShellRouteSync-T4WLY57Q.js +0 -172
  92. package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
  93. package/dist/SidebarLayout-3WZ3CVON.js +0 -256
  94. package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
  95. package/dist/SkillSettings-3EPPC3IT.js.map +0 -1
  96. package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
  97. package/dist/chunk-36KOSC2J.js +0 -567
  98. package/dist/chunk-36KOSC2J.js.map +0 -1
  99. package/dist/chunk-3S6KHO7H.js +0 -2121
  100. package/dist/chunk-3S6KHO7H.js.map +0 -1
  101. package/dist/chunk-7L63OK3O.js +0 -91
  102. package/dist/chunk-7L63OK3O.js.map +0 -1
  103. package/dist/chunk-CFLVPV5M.js.map +0 -1
  104. package/dist/chunk-FJ5RSSMA.js.map +0 -1
  105. package/dist/chunk-OSV3HI5M.js +0 -6891
  106. package/dist/chunk-OSV3HI5M.js.map +0 -1
  107. package/dist/chunk-WQULF5AT.js +0 -460
  108. package/dist/chunk-WQULF5AT.js.map +0 -1
  109. package/dist/chunk-WREC7D54.js.map +0 -1
  110. package/dist/chunk-YIWUG6MC.js +0 -101
  111. package/dist/chunk-YIWUG6MC.js.map +0 -1
  112. package/dist/chunk-ZXOADNF3.js +0 -75
  113. package/dist/chunk-ZXOADNF3.js.map +0 -1
  114. /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-4FYECRIN.js.map} +0 -0
  115. /package/dist/{chunk-B52K63AW.js.map → chunk-VJ7BZGAF.js.map} +0 -0
@@ -0,0 +1,880 @@
1
+ // src/server/serverChrome.ts
2
+ function isSettingsChromeEnabled({
3
+ catalog,
4
+ capabilities
5
+ }) {
6
+ return catalog != null && capabilities?.settings?.enabled !== false;
7
+ }
8
+ function isSessionsChromeEnabled({ sessions }) {
9
+ return sessions != null;
10
+ }
11
+ function isSchedulesChromeEnabled({ schedules }) {
12
+ return schedules != null;
13
+ }
14
+ function isMetricsChromeEnabled({ metrics }) {
15
+ return metrics != null;
16
+ }
17
+ function toEffectiveRoutes({
18
+ routes,
19
+ catalog,
20
+ capabilities,
21
+ sessions,
22
+ schedules
23
+ }) {
24
+ const sessionsEnabled = isSessionsChromeEnabled({ sessions });
25
+ return {
26
+ ...routes,
27
+ settings: isSettingsChromeEnabled({ catalog, capabilities }) ? routes.settings : null,
28
+ sessionsBrowser: sessionsEnabled ? routes.sessionsBrowser : null,
29
+ libraryAgent: sessionsEnabled ? routes.libraryAgent : null,
30
+ schedules: isSchedulesChromeEnabled({ schedules }) ? routes.schedules : null
31
+ };
32
+ }
33
+
34
+ // src/server/ServerContext.tsx
35
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
36
+ import { jsx } from "react/jsx-runtime";
37
+ var ServerContext = createContext(null);
38
+ var ServerCapabilitiesContext = createContext(null);
39
+ function ServerProvider({ server, children }) {
40
+ const [capabilities, setCapabilities] = useState(null);
41
+ const cancelActiveRequestRef = useRef(null);
42
+ const refreshCapabilities = useCallback(() => {
43
+ cancelActiveRequestRef.current?.();
44
+ let cancelled = false;
45
+ cancelActiveRequestRef.current = () => {
46
+ cancelled = true;
47
+ };
48
+ void server.getCapabilities().then((response) => {
49
+ if (!cancelled) setCapabilities(response.data);
50
+ }).catch(() => {
51
+ });
52
+ }, [server]);
53
+ useEffect(() => {
54
+ setCapabilities(null);
55
+ refreshCapabilities();
56
+ return () => {
57
+ cancelActiveRequestRef.current?.();
58
+ };
59
+ }, [refreshCapabilities]);
60
+ const capabilitiesValue = useMemo(
61
+ () => ({ capabilities, refresh: refreshCapabilities }),
62
+ [capabilities, refreshCapabilities]
63
+ );
64
+ return /* @__PURE__ */ jsx(ServerContext.Provider, { value: server, children: /* @__PURE__ */ jsx(ServerCapabilitiesContext.Provider, { value: capabilitiesValue, children }) });
65
+ }
66
+ function useServer() {
67
+ const server = useContext(ServerContext);
68
+ if (server == null) {
69
+ throw new Error("useServer must be used within a ServerProvider.");
70
+ }
71
+ return server;
72
+ }
73
+ function useOptionalServer() {
74
+ return useContext(ServerContext);
75
+ }
76
+ function useServerCapabilities() {
77
+ return useContext(ServerCapabilitiesContext)?.capabilities ?? null;
78
+ }
79
+ function useOptionalRefreshServerCapabilities() {
80
+ return useContext(ServerCapabilitiesContext)?.refresh ?? null;
81
+ }
82
+ function useCatalogServer() {
83
+ const server = useServer();
84
+ if (server.catalog == null) {
85
+ throw new Error("useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueFoundryServer.");
86
+ }
87
+ return server.catalog;
88
+ }
89
+ function useOptionalCatalogServer() {
90
+ return useOptionalServer()?.catalog ?? null;
91
+ }
92
+ function useAgentSessionsServer() {
93
+ const sessions = useServer().sessions;
94
+ if (sessions == null) {
95
+ throw new Error("useAgentSessionsServer requires AgentUIServer.sessions.");
96
+ }
97
+ return sessions;
98
+ }
99
+ function useOptionalAgentSessionsServer() {
100
+ return useOptionalServer()?.sessions ?? null;
101
+ }
102
+ function useAgentMetricsServer() {
103
+ const metrics = useServer().metrics;
104
+ if (metrics == null) {
105
+ throw new Error("useAgentMetricsServer requires AgentUIServer.metrics.");
106
+ }
107
+ return metrics;
108
+ }
109
+ function useOptionalAgentMetricsServer() {
110
+ return useOptionalServer()?.metrics ?? null;
111
+ }
112
+ function useScheduleServer() {
113
+ const server = useServer();
114
+ if (server.schedules == null) {
115
+ throw new Error("useScheduleServer requires AgentUIServer.schedules. Pass schedules to createTrueFoundryServer.");
116
+ }
117
+ return server.schedules;
118
+ }
119
+ function useOptionalScheduleServer() {
120
+ return useOptionalServer()?.schedules ?? null;
121
+ }
122
+
123
+ // src/utils/sessionShareUrl.ts
124
+ var SESSION_ID_QUERY = "sessionId";
125
+ var AGENT_ID_QUERY = "agentId";
126
+ var AGENT_TAB_QUERY = "tab";
127
+ var SESSIONS_VIEW_QUERY = "view";
128
+ var SESSIONS_VIEW_VALUE = "sessions";
129
+ var SESSION_START_TIME_QUERY = "s_sts";
130
+ var SESSION_END_TIME_QUERY = "s_ets";
131
+ var SESSION_TIME_WINDOW_QUERY = "s_tw";
132
+ var SESSION_TIME_BUFFER_MS = 5 * 60 * 1e3;
133
+ var SESSION_CUSTOM_RANGE_MAX_DAYS = 70;
134
+ var DEFAULT_SESSION_TIME_WINDOW_MS = 30 * 24 * 60 * 60 * 1e3;
135
+ function parseLibraryAgentTab(value) {
136
+ if (value === "overview" || value === "sessions" || value === "code" || value === "metrics") return value;
137
+ return null;
138
+ }
139
+ function nonEmpty(value) {
140
+ return value != null && value.length > 0 ? value : null;
141
+ }
142
+ function parseMs(value) {
143
+ if (value == null || value.length === 0) return null;
144
+ const parsed = Number(value);
145
+ return Number.isFinite(parsed) ? parsed : null;
146
+ }
147
+ function defaultSessionTimeRange(now = Date.now()) {
148
+ return {
149
+ startTs: now - DEFAULT_SESSION_TIME_WINDOW_MS,
150
+ endTs: now,
151
+ timeWindowMs: DEFAULT_SESSION_TIME_WINDOW_MS
152
+ };
153
+ }
154
+ function sessionTimeRangeFromCreatedAt(createdAt) {
155
+ const createdAtMs = new Date(createdAt).getTime();
156
+ if (Number.isNaN(createdAtMs)) return null;
157
+ return {
158
+ startTs: createdAtMs - SESSION_TIME_BUFFER_MS,
159
+ endTs: createdAtMs + SESSION_TIME_BUFFER_MS
160
+ };
161
+ }
162
+ function resolveSessionTimeRange(range, now = Date.now()) {
163
+ if (range.timeWindowMs != null) {
164
+ return { startTs: now - range.timeWindowMs, endTs: now };
165
+ }
166
+ return { startTs: range.startTs, endTs: range.endTs };
167
+ }
168
+ function readSessionShareSearch(search) {
169
+ const params = new URLSearchParams(search.startsWith("?") ? search.slice(1) : search);
170
+ const startTs = parseMs(params.get(SESSION_START_TIME_QUERY));
171
+ const endTs = parseMs(params.get(SESSION_END_TIME_QUERY));
172
+ const timeWindowMs = parseMs(params.get(SESSION_TIME_WINDOW_QUERY));
173
+ const view = params.get(SESSIONS_VIEW_QUERY);
174
+ return {
175
+ sessionId: nonEmpty(params.get(SESSION_ID_QUERY)),
176
+ agentId: nonEmpty(params.get(AGENT_ID_QUERY)),
177
+ tab: parseLibraryAgentTab(params.get(AGENT_TAB_QUERY)),
178
+ view: view === SESSIONS_VIEW_VALUE ? SESSIONS_VIEW_VALUE : null,
179
+ timeRange: startTs != null && endTs != null ? { startTs, endTs } : timeWindowMs != null ? { startTs: Date.now() - timeWindowMs, endTs: Date.now(), timeWindowMs } : null
180
+ };
181
+ }
182
+ function libraryAgentTabFromSearch(share, agentId) {
183
+ if (share.tab != null) return share.tab;
184
+ return share.sessionId != null && share.agentId === agentId ? "sessions" : "overview";
185
+ }
186
+ function writeSessionShareSearch(params, next) {
187
+ if (next.sessionId === null) params.delete(SESSION_ID_QUERY);
188
+ else if (next.sessionId != null) params.set(SESSION_ID_QUERY, next.sessionId);
189
+ if (next.agentId === null) params.delete(AGENT_ID_QUERY);
190
+ else if (next.agentId != null) params.set(AGENT_ID_QUERY, next.agentId);
191
+ if (next.tab === null) params.delete(AGENT_TAB_QUERY);
192
+ else if (next.tab != null) params.set(AGENT_TAB_QUERY, next.tab);
193
+ if (next.view === null) params.delete(SESSIONS_VIEW_QUERY);
194
+ else if (next.view != null) params.set(SESSIONS_VIEW_QUERY, next.view);
195
+ if (next.timeRange === null) {
196
+ params.delete(SESSION_START_TIME_QUERY);
197
+ params.delete(SESSION_END_TIME_QUERY);
198
+ params.delete(SESSION_TIME_WINDOW_QUERY);
199
+ } else if (next.timeRange != null) {
200
+ if (next.timeRange.timeWindowMs != null) {
201
+ params.set(SESSION_TIME_WINDOW_QUERY, String(next.timeRange.timeWindowMs));
202
+ params.delete(SESSION_START_TIME_QUERY);
203
+ params.delete(SESSION_END_TIME_QUERY);
204
+ } else {
205
+ params.set(SESSION_START_TIME_QUERY, String(next.timeRange.startTs));
206
+ params.set(SESSION_END_TIME_QUERY, String(next.timeRange.endTs));
207
+ params.delete(SESSION_TIME_WINDOW_QUERY);
208
+ }
209
+ }
210
+ }
211
+ function buildAgentSessionShareUrl({
212
+ sessionId,
213
+ agentId,
214
+ createdAt,
215
+ view,
216
+ href = typeof window === "undefined" ? "" : window.location.href
217
+ }) {
218
+ const url = new URL(href);
219
+ writeSessionShareSearch(url.searchParams, {
220
+ sessionId,
221
+ agentId: agentId == null || agentId.length === 0 ? null : agentId,
222
+ ...view === void 0 ? {} : { view },
223
+ timeRange: createdAt == null ? void 0 : sessionTimeRangeFromCreatedAt(createdAt)
224
+ });
225
+ return url.toString();
226
+ }
227
+ var SESSION_SHARE_CHANGE_EVENT = "trueforge-session-share";
228
+ function replaceSessionShareSearch(next) {
229
+ const url = new URL(window.location.href);
230
+ writeSessionShareSearch(url.searchParams, next);
231
+ window.history.replaceState(window.history.state, "", url);
232
+ window.dispatchEvent(new Event(SESSION_SHARE_CHANGE_EVENT));
233
+ return url.search;
234
+ }
235
+
236
+ // src/server/ShellModeContext.tsx
237
+ import { createContext as createContext2, useCallback as useCallback2, useContext as useContext2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
238
+
239
+ // src/server/draftSpecPreferences.ts
240
+ var DRAFT_SPEC_PREFERENCES_STORAGE_KEY = "tfy-aui-draft-spec-preferences";
241
+ var CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY = "tfy-aui-chat-draft-spec-preferences";
242
+ var AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY = "tfy-aui-agent-draft-spec-preferences";
243
+ function isObject(value) {
244
+ return typeof value === "object" && value !== null;
245
+ }
246
+ function isMountList(value) {
247
+ return Array.isArray(value) && value.every(isObject);
248
+ }
249
+ function isAgentSpec(value) {
250
+ if (!isObject(value)) return false;
251
+ const model = Reflect.get(value, "model");
252
+ if (!isObject(model) || typeof Reflect.get(model, "name") !== "string") return false;
253
+ const params = Reflect.get(model, "params");
254
+ if (params !== void 0 && !isObject(params)) return false;
255
+ const skills = Reflect.get(value, "skills");
256
+ if (skills !== void 0 && !isMountList(skills)) return false;
257
+ const mcpServers = Reflect.get(value, "mcpServers");
258
+ if (mcpServers !== void 0 && !isMountList(mcpServers)) return false;
259
+ const config = Reflect.get(value, "config");
260
+ return config === void 0 || isObject(config);
261
+ }
262
+ function isStoredDraftSpecPreferences(value) {
263
+ return isObject(value) && Reflect.get(value, "version") === 1 && isAgentSpec(Reflect.get(value, "spec"));
264
+ }
265
+ function storageKeyForKind(kind) {
266
+ return kind === "chat" ? CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY : AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY;
267
+ }
268
+ function selectChatDraftSpecPreferences(spec) {
269
+ return {
270
+ model: spec.model,
271
+ ...spec.skills !== void 0 ? { skills: spec.skills } : {},
272
+ ...spec.mcpServers !== void 0 ? { mcpServers: spec.mcpServers } : {}
273
+ };
274
+ }
275
+ function selectAgentDraftSpecPreferences(spec) {
276
+ return {
277
+ ...selectChatDraftSpecPreferences(spec),
278
+ ...spec.config !== void 0 ? { config: spec.config } : {}
279
+ };
280
+ }
281
+ function selectDraftSpecPreferences(spec, kind) {
282
+ return kind === "chat" ? selectChatDraftSpecPreferences(spec) : selectAgentDraftSpecPreferences(spec);
283
+ }
284
+ function readSandboxEnabled(spec) {
285
+ if (spec.config === void 0) return void 0;
286
+ const sandbox = Reflect.get(spec.config, "sandbox");
287
+ if (!isObject(sandbox)) return void 0;
288
+ const enabled = Reflect.get(sandbox, "enabled");
289
+ return typeof enabled === "boolean" ? enabled : void 0;
290
+ }
291
+ function withCapabilitiesSandbox(spec, sandboxEnabled) {
292
+ if (sandboxEnabled !== false || readSandboxEnabled(spec) === false) return spec;
293
+ const config = {
294
+ ...spec.config,
295
+ sandbox: { ...spec.config?.sandbox, enabled: false }
296
+ };
297
+ return {
298
+ ...spec,
299
+ config
300
+ };
301
+ }
302
+ function readStoredSpec(key) {
303
+ if (typeof window === "undefined") return null;
304
+ try {
305
+ const stored = JSON.parse(window.localStorage.getItem(key) ?? "null");
306
+ return isStoredDraftSpecPreferences(stored) ? stored.spec : null;
307
+ } catch {
308
+ return null;
309
+ }
310
+ }
311
+ function writeStoredSpec(key, spec) {
312
+ if (typeof window === "undefined") return false;
313
+ try {
314
+ const stored = { version: 1, spec };
315
+ window.localStorage.setItem(key, JSON.stringify(stored));
316
+ return true;
317
+ } catch {
318
+ return false;
319
+ }
320
+ }
321
+ function migrateLegacyDraftPreferences() {
322
+ if (typeof window === "undefined") return;
323
+ const legacy = readStoredSpec(DRAFT_SPEC_PREFERENCES_STORAGE_KEY);
324
+ if (legacy == null) return;
325
+ const chatReady = readStoredSpec(CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY) != null || writeStoredSpec(CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY, selectChatDraftSpecPreferences(legacy));
326
+ const agentReady = readStoredSpec(AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY) != null || writeStoredSpec(AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY, selectAgentDraftSpecPreferences(legacy));
327
+ if (!chatReady || !agentReady) return;
328
+ try {
329
+ window.localStorage.removeItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY);
330
+ } catch {
331
+ }
332
+ }
333
+ function readDraftSpecPreferences(kind) {
334
+ migrateLegacyDraftPreferences();
335
+ const stored = readStoredSpec(storageKeyForKind(kind));
336
+ return stored == null ? null : selectDraftSpecPreferences(stored, kind);
337
+ }
338
+ function writeDraftSpecPreferences(kind, spec) {
339
+ writeStoredSpec(storageKeyForKind(kind), selectDraftSpecPreferences(spec, kind));
340
+ }
341
+
342
+ // src/server/ShellModeContext.tsx
343
+ import { jsx as jsx2 } from "react/jsx-runtime";
344
+ var DEFAULT_AGENT_CONFIG = {
345
+ mode: "AgentLibraryWithComposer"
346
+ };
347
+ var ShellModeContext = createContext2(null);
348
+ var FALLBACK_MUTABLE_SPEC = {
349
+ model: { name: "openai-main/gpt-4.1" }
350
+ };
351
+ function mutableSeedFromConfig(config) {
352
+ if (config.mode === "AgentComposer" || config.mode === "AgentLibraryWithComposer") {
353
+ return config.defaultAgentSpec ?? FALLBACK_MUTABLE_SPEC;
354
+ }
355
+ return FALLBACK_MUTABLE_SPEC;
356
+ }
357
+ function initialMode(config, mutableSeed) {
358
+ switch (config.mode) {
359
+ case "SingleAgent":
360
+ return {
361
+ status: "active",
362
+ isMutable: false,
363
+ isCreateAgent: false,
364
+ agentId: config.name,
365
+ agentName: config.name,
366
+ locked: true
367
+ };
368
+ case "AgentLibrary":
369
+ return { status: "idle" };
370
+ case "AgentComposer":
371
+ case "AgentLibraryWithComposer":
372
+ return {
373
+ status: "active",
374
+ isMutable: true,
375
+ isCreateAgent: false,
376
+ agentSpec: mutableSeed,
377
+ locked: false
378
+ };
379
+ }
380
+ }
381
+ function resolveMutableIsCreateAgent(req) {
382
+ if (req.isCreateAgent !== void 0) return req.isCreateAgent;
383
+ return req.agentId != null || req.agentName != null;
384
+ }
385
+ function libraryAgentId(agent) {
386
+ return agent.agentId ?? agent.name;
387
+ }
388
+ function ShellModeProvider({
389
+ agentConfig = DEFAULT_AGENT_CONFIG,
390
+ initialSettingsOpen = false,
391
+ children
392
+ }) {
393
+ const capabilities = useServerCapabilities();
394
+ const catalog = useOptionalCatalogServer();
395
+ const refreshCapabilities = useOptionalRefreshServerCapabilities();
396
+ const sessionsServer = useOptionalAgentSessionsServer();
397
+ const scheduleServer = useOptionalScheduleServer();
398
+ const chatSeedRef = useRef2(
399
+ readDraftSpecPreferences("chat") ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), "chat")
400
+ );
401
+ const agentSeedRef = useRef2(
402
+ readDraftSpecPreferences("agent") ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), "agent")
403
+ );
404
+ const isLibraryEnabled = agentConfig.mode === "AgentLibrary" || agentConfig.mode === "AgentLibraryWithComposer";
405
+ const isComposerEnabled = agentConfig.mode === "AgentComposer" || agentConfig.mode === "AgentLibraryWithComposer";
406
+ const isNewChatEnabled = agentConfig.mode !== "AgentLibrary";
407
+ const locked = agentConfig.mode === "SingleAgent";
408
+ const [mode, setMode] = useState2(() => initialMode(agentConfig, chatSeedRef.current));
409
+ const [mutableEpoch, setMutableEpoch] = useState2(0);
410
+ const [clearEpoch, setClearEpoch] = useState2(0);
411
+ const [agentsListEpoch, setAgentsListEpoch] = useState2(0);
412
+ const [settingsOpenState, setSettingsOpenState] = useState2(initialSettingsOpen);
413
+ const [settingsSection, setSettingsSection] = useState2("models");
414
+ const [agentConfigOpenState, setAgentConfigOpenState] = useState2(false);
415
+ const [libraryOpenState, setLibraryOpenState] = useState2(false);
416
+ const [sessionsOpenState, setSessionsOpenState] = useState2(false);
417
+ const [libraryAgentId2, setLibraryAgentId] = useState2(null);
418
+ const [schedulesOpenState, setSchedulesOpenState] = useState2(false);
419
+ const [historyAgentFilter, setHistoryAgentFilter] = useState2(null);
420
+ const [pendingSessionId, setPendingSessionId] = useState2(void 0);
421
+ const settingsEnabled = isSettingsChromeEnabled({ catalog, capabilities });
422
+ const settingsOpen = settingsEnabled && settingsOpenState;
423
+ const sessionsEnabled = isSessionsChromeEnabled({ sessions: sessionsServer });
424
+ const schedulesEnabled = isSchedulesChromeEnabled({ schedules: scheduleServer });
425
+ const schedulesOpen = schedulesEnabled && schedulesOpenState;
426
+ const libraryOpen = isLibraryEnabled && libraryOpenState;
427
+ const sessionsOpen = sessionsEnabled && sessionsOpenState;
428
+ const setSessionsOpen = useCallback2(
429
+ (open) => {
430
+ if (open) {
431
+ setSettingsOpenState(false);
432
+ setAgentConfigOpenState(false);
433
+ setLibraryOpenState(false);
434
+ setLibraryAgentId(null);
435
+ setSchedulesOpenState(false);
436
+ } else {
437
+ replaceSessionShareSearch({ view: null });
438
+ }
439
+ setSessionsOpenState(sessionsEnabled && open);
440
+ },
441
+ [sessionsEnabled]
442
+ );
443
+ const setLibraryOpen = useCallback2(
444
+ (open) => {
445
+ if (!isLibraryEnabled) return;
446
+ if (open) {
447
+ setSettingsOpenState(false);
448
+ setAgentConfigOpenState(false);
449
+ setSessionsOpen(false);
450
+ setSchedulesOpenState(false);
451
+ }
452
+ setLibraryAgentId(null);
453
+ setLibraryOpenState(open);
454
+ },
455
+ [isLibraryEnabled, setSessionsOpen]
456
+ );
457
+ const openLibraryAgent = useCallback2(
458
+ (agentId) => {
459
+ if (!isLibraryEnabled || !sessionsEnabled) return;
460
+ setSettingsOpenState(false);
461
+ setAgentConfigOpenState(false);
462
+ setSessionsOpen(false);
463
+ setSchedulesOpenState(false);
464
+ setLibraryOpenState(true);
465
+ setLibraryAgentId(agentId);
466
+ },
467
+ [isLibraryEnabled, sessionsEnabled, setSessionsOpen]
468
+ );
469
+ const closeLibraryAgent = useCallback2(() => {
470
+ setLibraryAgentId(null);
471
+ }, []);
472
+ const setSettingsOpen = useCallback2(
473
+ (open, section) => {
474
+ if (section !== void 0) {
475
+ setSettingsSection(section);
476
+ }
477
+ if (open) {
478
+ setAgentConfigOpenState(false);
479
+ setLibraryOpenState(false);
480
+ setLibraryAgentId(null);
481
+ setSessionsOpen(false);
482
+ setSchedulesOpenState(false);
483
+ }
484
+ setSettingsOpenState(settingsEnabled && open);
485
+ },
486
+ [setSessionsOpen, settingsEnabled]
487
+ );
488
+ const setAgentConfigOpen = useCallback2(
489
+ (open) => {
490
+ if (open) {
491
+ setSettingsOpenState(false);
492
+ setLibraryOpenState(false);
493
+ setLibraryAgentId(null);
494
+ setSessionsOpen(false);
495
+ setSchedulesOpenState(false);
496
+ }
497
+ setAgentConfigOpenState(open);
498
+ },
499
+ [setSessionsOpen]
500
+ );
501
+ const setSchedulesOpen = useCallback2(
502
+ (open) => {
503
+ if (open) {
504
+ setSettingsOpenState(false);
505
+ setAgentConfigOpenState(false);
506
+ setLibraryOpenState(false);
507
+ setLibraryAgentId(null);
508
+ setSessionsOpen(false);
509
+ }
510
+ setSchedulesOpenState(schedulesEnabled && open);
511
+ },
512
+ [schedulesEnabled, setSessionsOpen]
513
+ );
514
+ useEffect2(() => {
515
+ if (!settingsEnabled) {
516
+ setSettingsOpenState(false);
517
+ }
518
+ }, [settingsEnabled]);
519
+ useEffect2(() => {
520
+ if (!sessionsEnabled) {
521
+ setSessionsOpenState(false);
522
+ setLibraryAgentId(null);
523
+ }
524
+ }, [sessionsEnabled]);
525
+ useEffect2(() => {
526
+ if (!schedulesEnabled) {
527
+ setSchedulesOpenState(false);
528
+ }
529
+ }, [schedulesEnabled]);
530
+ const invalidateAgentsList = useCallback2(() => {
531
+ setAgentsListEpoch((n) => n + 1);
532
+ }, []);
533
+ const lockedAgentName = agentConfig.mode === "SingleAgent" ? agentConfig.name : "";
534
+ const effectiveMode = useMemo2(() => {
535
+ if (!locked) return mode;
536
+ return {
537
+ status: "active",
538
+ isMutable: false,
539
+ isCreateAgent: false,
540
+ agentId: lockedAgentName,
541
+ agentName: lockedAgentName,
542
+ locked: true
543
+ };
544
+ }, [locked, lockedAgentName, mode]);
545
+ const agentConfigOpen = effectiveMode.status === "active" && effectiveMode.isMutable && effectiveMode.isCreateAgent && agentConfigOpenState;
546
+ useEffect2(() => {
547
+ if (effectiveMode.status !== "active" || !effectiveMode.isMutable || !effectiveMode.isCreateAgent) {
548
+ setAgentConfigOpenState(false);
549
+ }
550
+ }, [effectiveMode]);
551
+ const listSessionsAgentId = useMemo2(() => {
552
+ if (locked) return lockedAgentName;
553
+ if (!isLibraryEnabled) return void 0;
554
+ return historyAgentFilter ?? void 0;
555
+ }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);
556
+ const bumpEpoch = useCallback2((isMutable) => {
557
+ if (isMutable) setMutableEpoch((n) => n + 1);
558
+ else setClearEpoch((n) => n + 1);
559
+ }, []);
560
+ const selectLibraryAgent = useCallback2(
561
+ (req) => {
562
+ if (req.isMutable) {
563
+ if (!isComposerEnabled) return;
564
+ setSettingsOpen(false);
565
+ setLibraryOpenState(false);
566
+ setLibraryAgentId(null);
567
+ setSessionsOpen(false);
568
+ setSchedulesOpen(false);
569
+ setPendingSessionId(void 0);
570
+ const isCreateAgent = resolveMutableIsCreateAgent(req);
571
+ const kind = isCreateAgent ? "agent" : "chat";
572
+ setMode({
573
+ status: "active",
574
+ isMutable: true,
575
+ isCreateAgent,
576
+ agentId: req.agentId,
577
+ agentName: req.agentName,
578
+ agentSpec: req.agentSpec ?? (kind === "agent" ? agentSeedRef.current : chatSeedRef.current),
579
+ locked: false
580
+ });
581
+ setAgentConfigOpenState(isCreateAgent);
582
+ bumpEpoch(true);
583
+ return;
584
+ }
585
+ if (!isLibraryEnabled) return;
586
+ const agentName = req.agentName ?? req.agentId;
587
+ if (agentName == null) return;
588
+ setSettingsOpen(false);
589
+ setLibraryOpenState(false);
590
+ setLibraryAgentId(null);
591
+ setSessionsOpen(false);
592
+ setSchedulesOpen(false);
593
+ setPendingSessionId(void 0);
594
+ setAgentConfigOpenState(false);
595
+ setMode({
596
+ status: "active",
597
+ isMutable: false,
598
+ isCreateAgent: false,
599
+ agentId: req.agentId ?? agentName,
600
+ agentName,
601
+ locked: false
602
+ });
603
+ bumpEpoch(false);
604
+ },
605
+ [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen, setSessionsOpen, setSchedulesOpen]
606
+ );
607
+ const bindMutableAgent = useCallback2(
608
+ (req) => {
609
+ if (!isComposerEnabled) return;
610
+ setMode((prev) => {
611
+ if (prev.status !== "active" || !prev.isMutable) return prev;
612
+ return {
613
+ status: "active",
614
+ isMutable: true,
615
+ isCreateAgent: true,
616
+ agentId: req.agentId,
617
+ agentName: req.agentName,
618
+ agentSpec: req.agentSpec,
619
+ locked: false
620
+ };
621
+ });
622
+ },
623
+ [isComposerEnabled]
624
+ );
625
+ const selectAgent = useCallback2(
626
+ (name) => {
627
+ selectLibraryAgent({ isMutable: false, agentId: name, agentName: name });
628
+ },
629
+ [selectLibraryAgent]
630
+ );
631
+ const openDraft = useCallback2(() => {
632
+ if (!isComposerEnabled) return;
633
+ refreshCapabilities?.();
634
+ selectLibraryAgent({ isMutable: true, isCreateAgent: false, agentSpec: chatSeedRef.current });
635
+ }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
636
+ const openAgentBuilder = useCallback2(() => {
637
+ if (!isComposerEnabled) return;
638
+ refreshCapabilities?.();
639
+ selectLibraryAgent({ isMutable: true, isCreateAgent: true, agentSpec: agentSeedRef.current });
640
+ }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
641
+ const sandboxEnabled = capabilities?.sandbox.enabled;
642
+ const rememberDraftSpec = useCallback2(
643
+ (agentSpec, kind = "chat") => {
644
+ const selected = selectDraftSpecPreferences(agentSpec, kind);
645
+ const preferences = kind === "agent" ? withCapabilitiesSandbox(selected, sandboxEnabled) : selected;
646
+ if (kind === "chat") {
647
+ chatSeedRef.current = preferences;
648
+ } else {
649
+ agentSeedRef.current = preferences;
650
+ }
651
+ writeDraftSpecPreferences(kind, preferences);
652
+ },
653
+ [sandboxEnabled]
654
+ );
655
+ const openHistorySession = useCallback2(
656
+ ({
657
+ sessionId,
658
+ agentName,
659
+ isMutable: isMutableOpt,
660
+ isCreateAgent: isCreateAgentOpt
661
+ }) => {
662
+ setSettingsOpen(false);
663
+ setLibraryOpenState(false);
664
+ setLibraryAgentId(null);
665
+ setSessionsOpen(false);
666
+ setSchedulesOpen(false);
667
+ setPendingSessionId(sessionId);
668
+ const isMutable = isMutableOpt ?? agentName == null;
669
+ if (isMutable) {
670
+ if (!isComposerEnabled) return;
671
+ const isCreateAgent = isCreateAgentOpt === true;
672
+ setMode({
673
+ status: "active",
674
+ isMutable: true,
675
+ isCreateAgent,
676
+ agentSpec: isCreateAgent ? agentSeedRef.current : chatSeedRef.current,
677
+ locked: false
678
+ });
679
+ setAgentConfigOpenState(isCreateAgent);
680
+ bumpEpoch(true);
681
+ return;
682
+ }
683
+ if (locked) {
684
+ if (agentName == null || lockedAgentName !== agentName) return;
685
+ } else if (!isLibraryEnabled) {
686
+ return;
687
+ }
688
+ setAgentConfigOpenState(false);
689
+ setMode({
690
+ status: "active",
691
+ isMutable: false,
692
+ isCreateAgent: false,
693
+ locked: false,
694
+ ...agentName != null ? { agentId: agentName, agentName } : {}
695
+ });
696
+ bumpEpoch(false);
697
+ },
698
+ [
699
+ isLibraryEnabled,
700
+ isComposerEnabled,
701
+ locked,
702
+ lockedAgentName,
703
+ bumpEpoch,
704
+ setSettingsOpen,
705
+ setSessionsOpen,
706
+ setSchedulesOpen
707
+ ]
708
+ );
709
+ const clearChat = useCallback2(() => {
710
+ if (effectiveMode.status === "idle") return;
711
+ setPendingSessionId(void 0);
712
+ if (effectiveMode.isMutable) {
713
+ const kind = effectiveMode.isCreateAgent ? "agent" : "chat";
714
+ setMode({
715
+ status: "active",
716
+ isMutable: true,
717
+ isCreateAgent: effectiveMode.isCreateAgent,
718
+ agentId: effectiveMode.agentId,
719
+ agentName: effectiveMode.agentName,
720
+ agentSpec: effectiveMode.agentSpec ?? (kind === "agent" ? agentSeedRef.current : chatSeedRef.current),
721
+ locked: false
722
+ });
723
+ setAgentConfigOpenState(effectiveMode.isCreateAgent);
724
+ bumpEpoch(true);
725
+ return;
726
+ }
727
+ bumpEpoch(false);
728
+ }, [effectiveMode, bumpEpoch]);
729
+ const openLibraryHome = useCallback2(() => {
730
+ if (!isLibraryEnabled || isComposerEnabled) return;
731
+ setPendingSessionId(void 0);
732
+ setSettingsOpen(false);
733
+ setLibraryOpenState(false);
734
+ setLibraryAgentId(null);
735
+ setSchedulesOpen(false);
736
+ setMode({ status: "idle" });
737
+ bumpEpoch(false);
738
+ }, [isLibraryEnabled, isComposerEnabled, setSettingsOpen, setSchedulesOpen, bumpEpoch]);
739
+ const runtimeKey = useMemo2(() => {
740
+ if (effectiveMode.status === "idle") return "idle";
741
+ if (effectiveMode.isMutable) {
742
+ return `mut:${pendingSessionId ?? ""}:${mutableEpoch}`;
743
+ }
744
+ const id = effectiveMode.agentId ?? effectiveMode.agentName ?? "";
745
+ return `immut:${id}:${pendingSessionId ?? ""}:${clearEpoch}`;
746
+ }, [effectiveMode, mutableEpoch, clearEpoch, pendingSessionId]);
747
+ const value = useMemo2(
748
+ () => ({
749
+ mode: effectiveMode,
750
+ agentConfigMode: agentConfig.mode,
751
+ isLibraryEnabled,
752
+ isComposerEnabled,
753
+ isNewChatEnabled,
754
+ settingsOpen,
755
+ settingsSection,
756
+ setSettingsOpen,
757
+ agentConfigOpen,
758
+ setAgentConfigOpen,
759
+ libraryOpen,
760
+ libraryAgentId: libraryAgentId2,
761
+ setLibraryAgentId,
762
+ setLibraryOpen,
763
+ sessionsOpen,
764
+ setSessionsOpen,
765
+ openLibraryAgent,
766
+ closeLibraryAgent,
767
+ schedulesOpen,
768
+ setSchedulesOpen,
769
+ selectLibraryAgent,
770
+ bindMutableAgent,
771
+ selectAgent,
772
+ openDraft,
773
+ openAgentBuilder,
774
+ rememberDraftSpec,
775
+ openHistorySession,
776
+ clearChat,
777
+ openLibraryHome,
778
+ runtimeKey,
779
+ historyAgentFilter,
780
+ setHistoryAgentFilter,
781
+ listSessionsAgentId,
782
+ pendingSessionId,
783
+ agentsListEpoch,
784
+ invalidateAgentsList
785
+ }),
786
+ [
787
+ effectiveMode,
788
+ agentConfig.mode,
789
+ isLibraryEnabled,
790
+ isComposerEnabled,
791
+ isNewChatEnabled,
792
+ settingsOpen,
793
+ settingsSection,
794
+ setSettingsOpen,
795
+ agentConfigOpen,
796
+ setAgentConfigOpen,
797
+ libraryOpen,
798
+ libraryAgentId2,
799
+ setLibraryOpen,
800
+ sessionsOpen,
801
+ setSessionsOpen,
802
+ openLibraryAgent,
803
+ closeLibraryAgent,
804
+ schedulesOpen,
805
+ setSchedulesOpen,
806
+ selectLibraryAgent,
807
+ bindMutableAgent,
808
+ selectAgent,
809
+ openDraft,
810
+ openAgentBuilder,
811
+ rememberDraftSpec,
812
+ openHistorySession,
813
+ clearChat,
814
+ openLibraryHome,
815
+ runtimeKey,
816
+ historyAgentFilter,
817
+ listSessionsAgentId,
818
+ pendingSessionId,
819
+ agentsListEpoch,
820
+ invalidateAgentsList
821
+ ]
822
+ );
823
+ return /* @__PURE__ */ jsx2(ShellModeContext.Provider, { value, children });
824
+ }
825
+ function useShellMode() {
826
+ const ctx = useContext2(ShellModeContext);
827
+ if (ctx == null) {
828
+ throw new Error("useShellMode must be used within a ShellModeProvider.");
829
+ }
830
+ return ctx;
831
+ }
832
+ function useOptionalShellMode() {
833
+ return useContext2(ShellModeContext);
834
+ }
835
+ function shellIsMutable(mode) {
836
+ return mode.status === "active" && mode.isMutable;
837
+ }
838
+ function shellIsCreateAgent(mode) {
839
+ return mode.status === "active" && mode.isMutable && mode.isCreateAgent;
840
+ }
841
+
842
+ export {
843
+ isSettingsChromeEnabled,
844
+ isSessionsChromeEnabled,
845
+ isSchedulesChromeEnabled,
846
+ isMetricsChromeEnabled,
847
+ toEffectiveRoutes,
848
+ ServerProvider,
849
+ useServer,
850
+ useOptionalServer,
851
+ useServerCapabilities,
852
+ useOptionalRefreshServerCapabilities,
853
+ useCatalogServer,
854
+ useOptionalCatalogServer,
855
+ useAgentSessionsServer,
856
+ useOptionalAgentSessionsServer,
857
+ useAgentMetricsServer,
858
+ useOptionalAgentMetricsServer,
859
+ useScheduleServer,
860
+ useOptionalScheduleServer,
861
+ SESSION_CUSTOM_RANGE_MAX_DAYS,
862
+ defaultSessionTimeRange,
863
+ sessionTimeRangeFromCreatedAt,
864
+ resolveSessionTimeRange,
865
+ readSessionShareSearch,
866
+ libraryAgentTabFromSearch,
867
+ writeSessionShareSearch,
868
+ buildAgentSessionShareUrl,
869
+ SESSION_SHARE_CHANGE_EVENT,
870
+ replaceSessionShareSearch,
871
+ withCapabilitiesSandbox,
872
+ DEFAULT_AGENT_CONFIG,
873
+ libraryAgentId,
874
+ ShellModeProvider,
875
+ useShellMode,
876
+ useOptionalShellMode,
877
+ shellIsMutable,
878
+ shellIsCreateAgent
879
+ };
880
+ //# sourceMappingURL=chunk-FQK2XVVE.js.map