@truefoundry/trueforge-ui 0.3.0-rc.1 → 0.3.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/README.md +23 -8
  3. package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-RJBB4DDE.js} +38 -23
  4. package/dist/AgentCodeSnippets-RJBB4DDE.js.map +1 -0
  5. package/dist/AgentMetricChart-UPGSJ2WP.js +15 -0
  6. package/dist/{AgentOverview-EEBHJC32.js → AgentOverview-U5WIQXZN.js} +11 -9
  7. package/dist/AgentOverview-U5WIQXZN.js.map +1 -0
  8. package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-GRGIQTRE.js} +19 -10
  9. package/dist/AgentSessionEventTimeline-GRGIQTRE.js.map +1 -0
  10. package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-GNF4VOUT.js} +144 -57
  11. package/dist/AgentSessionEventTimelineChart-GNF4VOUT.js.map +1 -0
  12. package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-5OTF2BUW.js} +72 -24
  13. package/dist/AgentSessions-5OTF2BUW.js.map +1 -0
  14. package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-HDKGLDCY.js} +162 -126
  15. package/dist/ConnectorSettings-HDKGLDCY.js.map +1 -0
  16. package/dist/{DockLayout-LM4AFMFY.js → DockLayout-D2FPQCAL.js} +10 -10
  17. package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-HUV7RAWL.js} +14 -12
  18. package/dist/DrawerLayout-HUV7RAWL.js.map +1 -0
  19. package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-VNQ7HPKH.js} +22 -28
  20. package/dist/ModelSettings-VNQ7HPKH.js.map +1 -0
  21. package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
  22. package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-ZLXGMFBF.js} +17 -21
  23. package/dist/SandboxSettings-ZLXGMFBF.js.map +1 -0
  24. package/dist/SchedulesPage-QKYI2Z3A.js +15 -0
  25. package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-RVVYXOJW.js} +9 -9
  26. package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-RVVYXOJW.js.map} +1 -1
  27. package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-SJXFKUAJ.js} +171 -26
  28. package/dist/ShellRouteSync-SJXFKUAJ.js.map +1 -0
  29. package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-KYA76FQ7.js} +80 -58
  30. package/dist/SidebarLayout-KYA76FQ7.js.map +1 -0
  31. package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-7OHT7FPI.js} +24 -22
  32. package/dist/SkillSettings-7OHT7FPI.js.map +1 -0
  33. package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-LKG4XLW6.js} +9 -9
  34. package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-W2RGGOQ3.js} +10 -10
  35. package/dist/{chunk-U7KURWW3.js → chunk-2GIZY3JJ.js} +276 -54
  36. package/dist/chunk-2GIZY3JJ.js.map +1 -0
  37. package/dist/{chunk-WVE3F724.js → chunk-2QTH6JHX.js} +21 -4
  38. package/dist/chunk-2QTH6JHX.js.map +1 -0
  39. package/dist/{chunk-XAU7QFG3.js → chunk-3ZW74FHC.js} +68 -256
  40. package/dist/chunk-3ZW74FHC.js.map +1 -0
  41. package/dist/{chunk-FJW36PD7.js → chunk-67ZO7Z2W.js} +28 -24
  42. package/dist/chunk-67ZO7Z2W.js.map +1 -0
  43. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  44. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  45. package/dist/{chunk-MPNSO7E6.js → chunk-CG75X77Q.js} +2 -2
  46. package/dist/chunk-DPPOEFBD.js +517 -0
  47. package/dist/chunk-DPPOEFBD.js.map +1 -0
  48. package/dist/{chunk-6O6FWUDW.js → chunk-EPAL2HD5.js} +641 -388
  49. package/dist/chunk-EPAL2HD5.js.map +1 -0
  50. package/dist/{chunk-ZTMKFZQ3.js → chunk-GG23N2GW.js} +5099 -3295
  51. package/dist/chunk-GG23N2GW.js.map +1 -0
  52. package/dist/chunk-JCL3Q7RW.js +587 -0
  53. package/dist/chunk-JCL3Q7RW.js.map +1 -0
  54. package/dist/{chunk-M62XY4NC.js → chunk-JKEBMGLH.js} +235 -108
  55. package/dist/chunk-JKEBMGLH.js.map +1 -0
  56. package/dist/{chunk-DMMZSZTN.js → chunk-KSGNKS2D.js} +60 -16
  57. package/dist/chunk-KSGNKS2D.js.map +1 -0
  58. package/dist/{chunk-CYHJDKFB.js → chunk-PCI6VMB5.js} +189 -52
  59. package/dist/chunk-PCI6VMB5.js.map +1 -0
  60. package/dist/{chunk-ZKNUMH2M.js → chunk-PQ7VWBQQ.js} +13 -11
  61. package/dist/chunk-PQ7VWBQQ.js.map +1 -0
  62. package/dist/chunk-T6QQV5LK.js +238 -0
  63. package/dist/chunk-T6QQV5LK.js.map +1 -0
  64. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  65. package/dist/index.d.ts +369 -108
  66. package/dist/index.js +69 -488
  67. package/dist/index.js.map +1 -1
  68. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +49 -14
  69. package/dist/plugins/trueforge-agent-server-adapter/index.js +138 -50
  70. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  71. package/dist/styles.css +1 -1
  72. package/package.json +5 -4
  73. package/dist/AgentCodeSnippets-NZOFJE57.js.map +0 -1
  74. package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
  75. package/dist/AgentOverview-EEBHJC32.js.map +0 -1
  76. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
  77. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
  78. package/dist/AgentSessions-3MPDZASK.js.map +0 -1
  79. package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
  80. package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
  81. package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
  82. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
  83. package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
  84. package/dist/SchedulesPage-KKLUDO6B.js +0 -15
  85. package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
  86. package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
  87. package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
  88. package/dist/chunk-2XPPBEYF.js +0 -74
  89. package/dist/chunk-2XPPBEYF.js.map +0 -1
  90. package/dist/chunk-6O6FWUDW.js.map +0 -1
  91. package/dist/chunk-7Z2C2K7F.js +0 -578
  92. package/dist/chunk-7Z2C2K7F.js.map +0 -1
  93. package/dist/chunk-CYHJDKFB.js.map +0 -1
  94. package/dist/chunk-DMMZSZTN.js.map +0 -1
  95. package/dist/chunk-FJW36PD7.js.map +0 -1
  96. package/dist/chunk-M62XY4NC.js.map +0 -1
  97. package/dist/chunk-QC42MLAK.js.map +0 -1
  98. package/dist/chunk-SFZNIO6U.js +0 -18
  99. package/dist/chunk-SFZNIO6U.js.map +0 -1
  100. package/dist/chunk-U7KURWW3.js.map +0 -1
  101. package/dist/chunk-WVE3F724.js.map +0 -1
  102. package/dist/chunk-XAU7QFG3.js.map +0 -1
  103. package/dist/chunk-ZKNUMH2M.js.map +0 -1
  104. package/dist/chunk-ZTMKFZQ3.js.map +0 -1
  105. /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-UPGSJ2WP.js.map} +0 -0
  106. /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-D2FPQCAL.js.map} +0 -0
  107. /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-KPZFLUSC.js.map} +0 -0
  108. /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-QKYI2Z3A.js.map} +0 -0
  109. /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-LKG4XLW6.js.map} +0 -0
  110. /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-W2RGGOQ3.js.map} +0 -0
  111. /package/dist/{chunk-MPNSO7E6.js.map → chunk-CG75X77Q.js.map} +0 -0
@@ -5,6 +5,7 @@ var ServerContext = createContext(null);
5
5
  var ServerCapabilitiesContext = createContext(null);
6
6
  function ServerProvider({ server, children }) {
7
7
  const [capabilities, setCapabilities] = useState(null);
8
+ const [capabilitiesSettled, setCapabilitiesSettled] = useState(false);
8
9
  const cancelActiveRequestRef = useRef(null);
9
10
  const refreshCapabilities = useCallback(() => {
10
11
  cancelActiveRequestRef.current?.();
@@ -15,18 +16,21 @@ function ServerProvider({ server, children }) {
15
16
  void server.getCapabilities().then((response) => {
16
17
  if (!cancelled) setCapabilities(response.data);
17
18
  }).catch(() => {
19
+ }).finally(() => {
20
+ if (!cancelled) setCapabilitiesSettled(true);
18
21
  });
19
22
  }, [server]);
20
23
  useEffect(() => {
21
24
  setCapabilities(null);
25
+ setCapabilitiesSettled(false);
22
26
  refreshCapabilities();
23
27
  return () => {
24
28
  cancelActiveRequestRef.current?.();
25
29
  };
26
30
  }, [refreshCapabilities]);
27
31
  const capabilitiesValue = useMemo(
28
- () => ({ capabilities, refresh: refreshCapabilities }),
29
- [capabilities, refreshCapabilities]
32
+ () => ({ capabilities, settled: capabilitiesSettled, refresh: refreshCapabilities }),
33
+ [capabilities, capabilitiesSettled, refreshCapabilities]
30
34
  );
31
35
  return /* @__PURE__ */ jsx(ServerContext.Provider, { value: server, children: /* @__PURE__ */ jsx(ServerCapabilitiesContext.Provider, { value: capabilitiesValue, children }) });
32
36
  }
@@ -43,6 +47,9 @@ function useOptionalServer() {
43
47
  function useServerCapabilities() {
44
48
  return useContext(ServerCapabilitiesContext)?.capabilities ?? null;
45
49
  }
50
+ function useServerCapabilitiesSettled() {
51
+ return useContext(ServerCapabilitiesContext)?.settled ?? false;
52
+ }
46
53
  function useOptionalRefreshServerCapabilities() {
47
54
  return useContext(ServerCapabilitiesContext)?.refresh ?? null;
48
55
  }
@@ -86,6 +93,9 @@ function useScheduleServer() {
86
93
  function useOptionalScheduleServer() {
87
94
  return useOptionalServer()?.schedules ?? null;
88
95
  }
96
+ function useOptionalPermissionsServer() {
97
+ return useOptionalServer()?.permissions ?? null;
98
+ }
89
99
 
90
100
  // src/utils/sessionShareUrl.ts
91
101
  var SESSION_ID_QUERY = "sessionId";
@@ -99,8 +109,11 @@ var SESSION_TIME_WINDOW_QUERY = "s_tw";
99
109
  var SESSION_TIME_BUFFER_MS = 5 * 60 * 1e3;
100
110
  var SESSION_CUSTOM_RANGE_MAX_DAYS = 70;
101
111
  var DEFAULT_SESSION_TIME_WINDOW_MS = 30 * 24 * 60 * 60 * 1e3;
112
+ var DEFAULT_METRICS_TIME_WINDOW_MS = 24 * 60 * 60 * 1e3;
102
113
  function parseLibraryAgentTab(value) {
103
- if (value === "overview" || value === "sessions" || value === "code" || value === "metrics") return value;
114
+ if (value === "overview" || value === "sessions" || value === "schedules" || value === "code" || value === "metrics") {
115
+ return value;
116
+ }
104
117
  return null;
105
118
  }
106
119
  function nonEmpty(value) {
@@ -118,6 +131,13 @@ function defaultSessionTimeRange(now = Date.now()) {
118
131
  timeWindowMs: DEFAULT_SESSION_TIME_WINDOW_MS
119
132
  };
120
133
  }
134
+ function defaultMetricsTimeRange(now = Date.now()) {
135
+ return {
136
+ startTs: now - DEFAULT_METRICS_TIME_WINDOW_MS,
137
+ endTs: now,
138
+ timeWindowMs: DEFAULT_METRICS_TIME_WINDOW_MS
139
+ };
140
+ }
121
141
  function sessionTimeRangeFromCreatedAt(createdAt) {
122
142
  const createdAtMs = new Date(createdAt).getTime();
123
143
  if (Number.isNaN(createdAtMs)) return null;
@@ -138,12 +158,13 @@ function readSessionShareSearch(search) {
138
158
  const endTs = parseMs(params.get(SESSION_END_TIME_QUERY));
139
159
  const timeWindowMs = parseMs(params.get(SESSION_TIME_WINDOW_QUERY));
140
160
  const view = params.get(SESSIONS_VIEW_QUERY);
161
+ const now = Date.now();
141
162
  return {
142
163
  sessionId: nonEmpty(params.get(SESSION_ID_QUERY)),
143
164
  agentId: nonEmpty(params.get(AGENT_ID_QUERY)),
144
165
  tab: parseLibraryAgentTab(params.get(AGENT_TAB_QUERY)),
145
166
  view: view === SESSIONS_VIEW_VALUE ? SESSIONS_VIEW_VALUE : null,
146
- timeRange: startTs != null && endTs != null ? { startTs, endTs } : timeWindowMs != null ? { startTs: Date.now() - timeWindowMs, endTs: Date.now(), timeWindowMs } : null
167
+ timeRange: startTs != null && endTs != null ? { startTs, endTs } : timeWindowMs != null ? { startTs: now - timeWindowMs, endTs: now, timeWindowMs } : null
147
168
  };
148
169
  }
149
170
  function libraryAgentTabFromSearch(share, agentId) {
@@ -200,12 +221,37 @@ function replaceSessionShareSearch(next) {
200
221
  return url.search;
201
222
  }
202
223
 
203
- // src/server/settingsChrome.ts
224
+ // src/server/serverChrome.ts
204
225
  function isSettingsChromeEnabled({
205
226
  catalog,
206
227
  capabilities
207
228
  }) {
208
- return catalog != null && capabilities?.settings?.enabled !== false;
229
+ return catalog != null && capabilities?.settings?.enabled === true;
230
+ }
231
+ function isSessionsChromeEnabled({ sessions }) {
232
+ return sessions != null;
233
+ }
234
+ function isSchedulesChromeEnabled({ schedules }) {
235
+ return schedules != null;
236
+ }
237
+ function isMetricsChromeEnabled({ metrics }) {
238
+ return metrics != null;
239
+ }
240
+ function toEffectiveRoutes({
241
+ routes,
242
+ catalog,
243
+ capabilities,
244
+ sessions,
245
+ schedules
246
+ }) {
247
+ const sessionsEnabled = isSessionsChromeEnabled({ sessions });
248
+ return {
249
+ ...routes,
250
+ settings: isSettingsChromeEnabled({ catalog, capabilities }) ? routes.settings : null,
251
+ sessionsBrowser: sessionsEnabled ? routes.sessionsBrowser : null,
252
+ libraryAgent: sessionsEnabled ? routes.libraryAgent : null,
253
+ schedules: isSchedulesChromeEnabled({ schedules }) ? routes.schedules : null
254
+ };
209
255
  }
210
256
 
211
257
  // src/server/ShellModeContext.tsx
@@ -368,6 +414,7 @@ function ShellModeProvider({
368
414
  const capabilities = useServerCapabilities();
369
415
  const catalog = useOptionalCatalogServer();
370
416
  const refreshCapabilities = useOptionalRefreshServerCapabilities();
417
+ const sessionsServer = useOptionalAgentSessionsServer();
371
418
  const scheduleServer = useOptionalScheduleServer();
372
419
  const chatSeedRef = useRef2(
373
420
  readDraftSpecPreferences("chat") ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), "chat")
@@ -392,24 +439,29 @@ function ShellModeProvider({
392
439
  const [schedulesOpenState, setSchedulesOpenState] = useState2(false);
393
440
  const [historyAgentFilter, setHistoryAgentFilter] = useState2(null);
394
441
  const [pendingSessionId, setPendingSessionId] = useState2(void 0);
442
+ const [pendingSessionEpoch, setPendingSessionEpoch] = useState2(0);
395
443
  const settingsEnabled = isSettingsChromeEnabled({ catalog, capabilities });
396
444
  const settingsOpen = settingsEnabled && settingsOpenState;
397
- const schedulesEnabled = scheduleServer != null;
445
+ const sessionsEnabled = isSessionsChromeEnabled({ sessions: sessionsServer });
446
+ const schedulesEnabled = isSchedulesChromeEnabled({ schedules: scheduleServer });
398
447
  const schedulesOpen = schedulesEnabled && schedulesOpenState;
399
448
  const libraryOpen = isLibraryEnabled && libraryOpenState;
400
- const sessionsOpen = sessionsOpenState;
401
- const setSessionsOpen = useCallback2((open) => {
402
- if (open) {
403
- setSettingsOpenState(false);
404
- setAgentConfigOpenState(false);
405
- setLibraryOpenState(false);
406
- setLibraryAgentId(null);
407
- setSchedulesOpenState(false);
408
- } else {
409
- replaceSessionShareSearch({ view: null });
410
- }
411
- setSessionsOpenState(open);
412
- }, []);
449
+ const sessionsOpen = sessionsEnabled && sessionsOpenState;
450
+ const setSessionsOpen = useCallback2(
451
+ (open) => {
452
+ if (open) {
453
+ setSettingsOpenState(false);
454
+ setAgentConfigOpenState(false);
455
+ setLibraryOpenState(false);
456
+ setLibraryAgentId(null);
457
+ setSchedulesOpenState(false);
458
+ } else {
459
+ replaceSessionShareSearch({ view: null });
460
+ }
461
+ setSessionsOpenState(sessionsEnabled && open);
462
+ },
463
+ [sessionsEnabled]
464
+ );
413
465
  const setLibraryOpen = useCallback2(
414
466
  (open) => {
415
467
  if (!isLibraryEnabled) return;
@@ -426,7 +478,7 @@ function ShellModeProvider({
426
478
  );
427
479
  const openLibraryAgent = useCallback2(
428
480
  (agentId) => {
429
- if (!isLibraryEnabled) return;
481
+ if (!isLibraryEnabled || !sessionsEnabled) return;
430
482
  setSettingsOpenState(false);
431
483
  setAgentConfigOpenState(false);
432
484
  setSessionsOpen(false);
@@ -434,7 +486,7 @@ function ShellModeProvider({
434
486
  setLibraryOpenState(true);
435
487
  setLibraryAgentId(agentId);
436
488
  },
437
- [isLibraryEnabled, setSessionsOpen]
489
+ [isLibraryEnabled, sessionsEnabled, setSessionsOpen]
438
490
  );
439
491
  const closeLibraryAgent = useCallback2(() => {
440
492
  setLibraryAgentId(null);
@@ -482,10 +534,16 @@ function ShellModeProvider({
482
534
  [schedulesEnabled, setSessionsOpen]
483
535
  );
484
536
  useEffect2(() => {
485
- if (!settingsEnabled) {
537
+ if (catalog == null || capabilities?.settings?.enabled === false) {
486
538
  setSettingsOpenState(false);
487
539
  }
488
- }, [settingsEnabled]);
540
+ }, [capabilities?.settings?.enabled, catalog]);
541
+ useEffect2(() => {
542
+ if (!sessionsEnabled) {
543
+ setSessionsOpenState(false);
544
+ setLibraryAgentId(null);
545
+ }
546
+ }, [sessionsEnabled]);
489
547
  useEffect2(() => {
490
548
  if (!schedulesEnabled) {
491
549
  setSchedulesOpenState(false);
@@ -515,7 +573,7 @@ function ShellModeProvider({
515
573
  const listSessionsAgentId = useMemo2(() => {
516
574
  if (locked) return lockedAgentName;
517
575
  if (!isLibraryEnabled) return void 0;
518
- return historyAgentFilter ?? void 0;
576
+ return historyAgentFilter?.agentId;
519
577
  }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);
520
578
  const bumpEpoch = useCallback2((isMutable) => {
521
579
  if (isMutable) setMutableEpoch((n) => n + 1);
@@ -539,6 +597,7 @@ function ShellModeProvider({
539
597
  isCreateAgent,
540
598
  agentId: req.agentId,
541
599
  agentName: req.agentName,
600
+ description: req.description,
542
601
  agentSpec: req.agentSpec ?? (kind === "agent" ? agentSeedRef.current : chatSeedRef.current),
543
602
  locked: false
544
603
  });
@@ -564,6 +623,15 @@ function ShellModeProvider({
564
623
  agentName,
565
624
  locked: false
566
625
  });
626
+ if (req.agentId != null) {
627
+ setHistoryAgentFilter({
628
+ agentId: req.agentId,
629
+ agentName,
630
+ intent: "try-agent"
631
+ });
632
+ } else {
633
+ setHistoryAgentFilter(null);
634
+ }
567
635
  bumpEpoch(false);
568
636
  },
569
637
  [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen, setSessionsOpen, setSchedulesOpen]
@@ -579,6 +647,7 @@ function ShellModeProvider({
579
647
  isCreateAgent: true,
580
648
  agentId: req.agentId,
581
649
  agentName: req.agentName,
650
+ description: req.description,
582
651
  agentSpec: req.agentSpec,
583
652
  locked: false
584
653
  };
@@ -595,13 +664,32 @@ function ShellModeProvider({
595
664
  const openDraft = useCallback2(() => {
596
665
  if (!isComposerEnabled) return;
597
666
  refreshCapabilities?.();
667
+ setHistoryAgentFilter(null);
598
668
  selectLibraryAgent({ isMutable: true, isCreateAgent: false, agentSpec: chatSeedRef.current });
599
669
  }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
670
+ const isActiveAgentBuilder = effectiveMode.status === "active" && effectiveMode.isMutable && effectiveMode.isCreateAgent;
600
671
  const openAgentBuilder = useCallback2(() => {
601
672
  if (!isComposerEnabled) return;
602
673
  refreshCapabilities?.();
674
+ if (isActiveAgentBuilder) {
675
+ setSettingsOpen(false);
676
+ setLibraryOpenState(false);
677
+ setLibraryAgentId(null);
678
+ setSessionsOpen(false);
679
+ setSchedulesOpen(false);
680
+ setAgentConfigOpenState(true);
681
+ return;
682
+ }
603
683
  selectLibraryAgent({ isMutable: true, isCreateAgent: true, agentSpec: agentSeedRef.current });
604
- }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
684
+ }, [
685
+ isActiveAgentBuilder,
686
+ isComposerEnabled,
687
+ refreshCapabilities,
688
+ selectLibraryAgent,
689
+ setSchedulesOpen,
690
+ setSessionsOpen,
691
+ setSettingsOpen
692
+ ]);
605
693
  const sandboxEnabled = capabilities?.sandbox.enabled;
606
694
  const rememberDraftSpec = useCallback2(
607
695
  (agentSpec, kind = "chat") => {
@@ -610,7 +698,7 @@ function ShellModeProvider({
610
698
  if (kind === "chat") {
611
699
  chatSeedRef.current = preferences;
612
700
  } else {
613
- agentSeedRef.current = preferences;
701
+ agentSeedRef.current = withCapabilitiesSandbox(agentSpec, sandboxEnabled);
614
702
  }
615
703
  writeDraftSpecPreferences(kind, preferences);
616
704
  },
@@ -623,15 +711,22 @@ function ShellModeProvider({
623
711
  isMutable: isMutableOpt,
624
712
  isCreateAgent: isCreateAgentOpt
625
713
  }) => {
714
+ const isMutable = isMutableOpt ?? agentName == null;
715
+ if (isMutable) {
716
+ if (!isComposerEnabled) return;
717
+ } else if (locked) {
718
+ if (agentName == null || lockedAgentName !== agentName) return;
719
+ } else if (!isLibraryEnabled) {
720
+ return;
721
+ }
626
722
  setSettingsOpen(false);
627
723
  setLibraryOpenState(false);
628
724
  setLibraryAgentId(null);
629
725
  setSessionsOpen(false);
630
726
  setSchedulesOpen(false);
631
727
  setPendingSessionId(sessionId);
632
- const isMutable = isMutableOpt ?? agentName == null;
728
+ setPendingSessionEpoch((n) => n + 1);
633
729
  if (isMutable) {
634
- if (!isComposerEnabled) return;
635
730
  const isCreateAgent = isCreateAgentOpt === true;
636
731
  setMode({
637
732
  status: "active",
@@ -641,12 +736,6 @@ function ShellModeProvider({
641
736
  locked: false
642
737
  });
643
738
  setAgentConfigOpenState(isCreateAgent);
644
- bumpEpoch(true);
645
- return;
646
- }
647
- if (locked) {
648
- if (agentName == null || lockedAgentName !== agentName) return;
649
- } else if (!isLibraryEnabled) {
650
739
  return;
651
740
  }
652
741
  setAgentConfigOpenState(false);
@@ -657,18 +746,8 @@ function ShellModeProvider({
657
746
  locked: false,
658
747
  ...agentName != null ? { agentId: agentName, agentName } : {}
659
748
  });
660
- bumpEpoch(false);
661
749
  },
662
- [
663
- isLibraryEnabled,
664
- isComposerEnabled,
665
- locked,
666
- lockedAgentName,
667
- bumpEpoch,
668
- setSettingsOpen,
669
- setSessionsOpen,
670
- setSchedulesOpen
671
- ]
750
+ [isLibraryEnabled, isComposerEnabled, locked, lockedAgentName, setSettingsOpen, setSessionsOpen, setSchedulesOpen]
672
751
  );
673
752
  const clearChat = useCallback2(() => {
674
753
  if (effectiveMode.status === "idle") return;
@@ -702,12 +781,8 @@ function ShellModeProvider({
702
781
  }, [isLibraryEnabled, isComposerEnabled, setSettingsOpen, setSchedulesOpen, bumpEpoch]);
703
782
  const runtimeKey = useMemo2(() => {
704
783
  if (effectiveMode.status === "idle") return "idle";
705
- if (effectiveMode.isMutable) {
706
- return `mut:${pendingSessionId ?? ""}:${mutableEpoch}`;
707
- }
708
- const id = effectiveMode.agentId ?? effectiveMode.agentName ?? "";
709
- return `immut:${id}:${pendingSessionId ?? ""}:${clearEpoch}`;
710
- }, [effectiveMode, mutableEpoch, clearEpoch, pendingSessionId]);
784
+ return `chat:${mutableEpoch}:${clearEpoch}`;
785
+ }, [effectiveMode.status, mutableEpoch, clearEpoch]);
711
786
  const value = useMemo2(
712
787
  () => ({
713
788
  mode: effectiveMode,
@@ -744,6 +819,7 @@ function ShellModeProvider({
744
819
  setHistoryAgentFilter,
745
820
  listSessionsAgentId,
746
821
  pendingSessionId,
822
+ pendingSessionEpoch,
747
823
  agentsListEpoch,
748
824
  invalidateAgentsList
749
825
  }),
@@ -780,6 +856,7 @@ function ShellModeProvider({
780
856
  historyAgentFilter,
781
857
  listSessionsAgentId,
782
858
  pendingSessionId,
859
+ pendingSessionEpoch,
783
860
  agentsListEpoch,
784
861
  invalidateAgentsList
785
862
  ]
@@ -803,11 +880,149 @@ function shellIsCreateAgent(mode) {
803
880
  return mode.status === "active" && mode.isMutable && mode.isCreateAgent;
804
881
  }
805
882
 
883
+ // src/utils/getErrorMessage.ts
884
+ function isRecord(value) {
885
+ return value != null && typeof value === "object";
886
+ }
887
+ function readNonEmptyString(value) {
888
+ return typeof value === "string" && value.trim() !== "" ? value : void 0;
889
+ }
890
+ var LITERAL_ESCAPE_PATTERN = /\\(?:[nrtbfv0'"\\]|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/;
891
+ var REAL_CONTROL_PATTERN = /[\n\t\b\f\v]/;
892
+ function decodeLiteralEscapes(text) {
893
+ let out = "";
894
+ for (let i = 0; i < text.length; i += 1) {
895
+ const char = text[i];
896
+ if (char !== "\\" || i + 1 >= text.length) {
897
+ out += char;
898
+ continue;
899
+ }
900
+ const next = text[i + 1];
901
+ switch (next) {
902
+ case "n":
903
+ out += "\n";
904
+ i += 1;
905
+ break;
906
+ case "t":
907
+ out += " ";
908
+ i += 1;
909
+ break;
910
+ case "r":
911
+ out += "\r";
912
+ i += 1;
913
+ break;
914
+ case "b":
915
+ out += "\b";
916
+ i += 1;
917
+ break;
918
+ case "f":
919
+ out += "\f";
920
+ i += 1;
921
+ break;
922
+ case "v":
923
+ out += "\v";
924
+ i += 1;
925
+ break;
926
+ case "0":
927
+ out += "\0";
928
+ i += 1;
929
+ break;
930
+ case "\\":
931
+ out += "\\";
932
+ i += 1;
933
+ break;
934
+ case '"':
935
+ out += '"';
936
+ i += 1;
937
+ break;
938
+ case "'":
939
+ out += "'";
940
+ i += 1;
941
+ break;
942
+ case "u": {
943
+ const hex = text.slice(i + 2, i + 6);
944
+ if (/^[0-9a-fA-F]{4}$/.test(hex)) {
945
+ out += String.fromCharCode(Number.parseInt(hex, 16));
946
+ i += 5;
947
+ } else {
948
+ out += char;
949
+ }
950
+ break;
951
+ }
952
+ case "x": {
953
+ const hex = text.slice(i + 2, i + 4);
954
+ if (/^[0-9a-fA-F]{2}$/.test(hex)) {
955
+ out += String.fromCharCode(Number.parseInt(hex, 16));
956
+ i += 3;
957
+ } else {
958
+ out += char;
959
+ }
960
+ break;
961
+ }
962
+ default:
963
+ out += char;
964
+ break;
965
+ }
966
+ }
967
+ return out;
968
+ }
969
+ function decodeErrorMessageEscapes(text) {
970
+ const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
971
+ if (REAL_CONTROL_PATTERN.test(normalized) || !LITERAL_ESCAPE_PATTERN.test(normalized)) {
972
+ return normalized;
973
+ }
974
+ return decodeLiteralEscapes(normalized).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
975
+ }
976
+ function messageFromErrorShaped(value) {
977
+ if (!isRecord(value)) return void 0;
978
+ const direct = readNonEmptyString(value.message);
979
+ if (direct != null) return direct;
980
+ if (isRecord(value.error)) {
981
+ return readNonEmptyString(value.error.message);
982
+ }
983
+ return void 0;
984
+ }
985
+ function stringifyError(error) {
986
+ if (typeof error === "string") return error;
987
+ if (isRecord(error)) {
988
+ try {
989
+ return JSON.stringify(error);
990
+ } catch {
991
+ return Object.prototype.toString.call(error);
992
+ }
993
+ }
994
+ return String(error);
995
+ }
996
+ function getErrorMessage(error, fallback) {
997
+ if (typeof error === "string") {
998
+ const trimmed = error.trim();
999
+ if (trimmed !== "") return decodeErrorMessageEscapes(error);
1000
+ return fallback != null ? decodeErrorMessageEscapes(fallback) : decodeErrorMessageEscapes(error);
1001
+ }
1002
+ if (isRecord(error) && "body" in error) {
1003
+ const fromBody = messageFromErrorShaped(error.body);
1004
+ if (fromBody != null) return decodeErrorMessageEscapes(fromBody);
1005
+ if (error.body != null) {
1006
+ if (typeof error.body === "string") {
1007
+ const trimmed = error.body.trim();
1008
+ if (trimmed !== "") return decodeErrorMessageEscapes(error.body);
1009
+ } else {
1010
+ return stringifyError(error.body);
1011
+ }
1012
+ }
1013
+ }
1014
+ const fromShape = messageFromErrorShaped(error);
1015
+ if (fromShape != null) return decodeErrorMessageEscapes(fromShape);
1016
+ if (fallback != null) return decodeErrorMessageEscapes(fallback);
1017
+ return stringifyError(error);
1018
+ }
1019
+
806
1020
  export {
807
1021
  ServerProvider,
808
1022
  useServer,
809
1023
  useOptionalServer,
810
1024
  useServerCapabilities,
1025
+ useServerCapabilitiesSettled,
811
1026
  useOptionalRefreshServerCapabilities,
812
1027
  useCatalogServer,
813
1028
  useOptionalCatalogServer,
@@ -817,8 +1032,10 @@ export {
817
1032
  useOptionalAgentMetricsServer,
818
1033
  useScheduleServer,
819
1034
  useOptionalScheduleServer,
1035
+ useOptionalPermissionsServer,
820
1036
  SESSION_CUSTOM_RANGE_MAX_DAYS,
821
1037
  defaultSessionTimeRange,
1038
+ defaultMetricsTimeRange,
822
1039
  sessionTimeRangeFromCreatedAt,
823
1040
  resolveSessionTimeRange,
824
1041
  readSessionShareSearch,
@@ -829,12 +1046,17 @@ export {
829
1046
  replaceSessionShareSearch,
830
1047
  withCapabilitiesSandbox,
831
1048
  isSettingsChromeEnabled,
1049
+ isSessionsChromeEnabled,
1050
+ isSchedulesChromeEnabled,
1051
+ isMetricsChromeEnabled,
1052
+ toEffectiveRoutes,
832
1053
  DEFAULT_AGENT_CONFIG,
833
1054
  libraryAgentId,
834
1055
  ShellModeProvider,
835
1056
  useShellMode,
836
1057
  useOptionalShellMode,
837
1058
  shellIsMutable,
838
- shellIsCreateAgent
1059
+ shellIsCreateAgent,
1060
+ getErrorMessage
839
1061
  };
840
- //# sourceMappingURL=chunk-U7KURWW3.js.map
1062
+ //# sourceMappingURL=chunk-2GIZY3JJ.js.map