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

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 (97) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/NOTICE +1 -1
  3. package/README.md +26 -89
  4. package/dist/{AgentCodeSnippets-EK7KMIY2.js → AgentCodeSnippets-BPC6TD7K.js} +7 -7
  5. package/dist/AgentMetricChart-T6DZZ37Y.js +15 -0
  6. package/dist/{AgentOverview-5UPMYHT2.js → AgentOverview-BFU7EO4Y.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-V6NPCYMW.js → AgentSessionEventTimeline-ATVBTYDF.js} +7 -7
  8. package/dist/{AgentSessionEventTimelineChart-YQWZBQCG.js → AgentSessionEventTimelineChart-H577STKW.js} +7 -7
  9. package/dist/{AgentSessions-WNYVVB6Q.js → AgentSessions-GDLBXFIK.js} +8 -8
  10. package/dist/{ConnectorSettings-O4I24244.js → ConnectorSettings-FYNF6J3F.js} +7 -7
  11. package/dist/{DockLayout-JMBZVMGB.js → DockLayout-SGUOMZ5E.js} +10 -10
  12. package/dist/{DrawerLayout-E6G3IF6R.js → DrawerLayout-MJJYQDCW.js} +11 -11
  13. package/dist/{ModelSettings-ZVXMXIU4.js → ModelSettings-6EW7U2MP.js} +9 -9
  14. package/dist/ModelSettings-6EW7U2MP.js.map +1 -0
  15. package/dist/OpenUiFenceBlock-BZPFNXWZ.js +9 -0
  16. package/dist/{SandboxSettings-H6BA2DJQ.js → SandboxSettings-HQVBGHXZ.js} +7 -7
  17. package/dist/SchedulesPage-ZO3PJY4J.js +15 -0
  18. package/dist/{SettingsBuilder-VA3VGWZC.js → SettingsBuilder-FODMI7HG.js} +20 -11
  19. package/dist/SettingsBuilder-FODMI7HG.js.map +1 -0
  20. package/dist/{ShellRouteSync-ZT4PBE6T.js → ShellRouteSync-4I5BP2VY.js} +4 -4
  21. package/dist/{SidebarLayout-ICXEN7ZL.js → SidebarLayout-ZLWG2YGO.js} +12 -12
  22. package/dist/{SkillSettings-F5JGGFXR.js → SkillSettings-AFSAOU6O.js} +7 -7
  23. package/dist/{TrueForgeUIWithRouter-MKJ7IEWG.js → TrueForgeUIWithRouter-RQX5XWGI.js} +9 -9
  24. package/dist/WebSearchSettings-BW4CWGRR.js +322 -0
  25. package/dist/WebSearchSettings-BW4CWGRR.js.map +1 -0
  26. package/dist/{WidgetLayout-J7ZRW3V3.js → WidgetLayout-WIPKUIL4.js} +10 -10
  27. package/dist/chunk-6UACSIIY.js +587 -0
  28. package/dist/chunk-6UACSIIY.js.map +1 -0
  29. package/dist/{chunk-U7WONUMR.js → chunk-7S7A3PNP.js} +6 -4
  30. package/dist/chunk-7S7A3PNP.js.map +1 -0
  31. package/dist/{chunk-VTOW2UIX.js → chunk-GHXA46A2.js} +78 -43
  32. package/dist/chunk-GHXA46A2.js.map +1 -0
  33. package/dist/{chunk-7AAO4UDQ.js → chunk-HCGDDQ4G.js} +5 -5
  34. package/dist/chunk-HCGDDQ4G.js.map +1 -0
  35. package/dist/{chunk-SCIEO6CF.js → chunk-HDMBSLDC.js} +2 -2
  36. package/dist/{chunk-KZK2PQ4A.js → chunk-MLMR26WQ.js} +244 -152
  37. package/dist/chunk-MLMR26WQ.js.map +1 -0
  38. package/dist/{chunk-BREN6OSX.js → chunk-Q22RHDYS.js} +42 -61
  39. package/dist/chunk-Q22RHDYS.js.map +1 -0
  40. package/dist/{chunk-WFIA627Q.js → chunk-QKFMAQ7O.js} +2 -2
  41. package/dist/{chunk-7VWUB5OV.js → chunk-TFQWCBFQ.js} +12 -12
  42. package/dist/chunk-TFQWCBFQ.js.map +1 -0
  43. package/dist/{chunk-JEAULQNF.js → chunk-TJGGIEF6.js} +3 -3
  44. package/dist/{chunk-KDCVFHPZ.js → chunk-TX6PB3DY.js} +3 -3
  45. package/dist/{chunk-MEW7WZ7Q.js → chunk-VBZXCX7Y.js} +253 -99
  46. package/dist/chunk-VBZXCX7Y.js.map +1 -0
  47. package/dist/{chunk-QI4HGU5E.js → chunk-Y47LJKXD.js} +13 -19
  48. package/dist/{chunk-QI4HGU5E.js.map → chunk-Y47LJKXD.js.map} +1 -1
  49. package/dist/{chunk-MB7Z5FPI.js → chunk-YN5ZBBQM.js} +9 -9
  50. package/dist/{chunk-UN7WPTTK.js → chunk-ZYJ2SBF7.js} +2 -2
  51. package/dist/createTrueForgeServer-DiSooQdh.d.ts +42 -0
  52. package/dist/index.d.ts +45 -39
  53. package/dist/index.js +43 -43
  54. package/dist/index.js.map +1 -1
  55. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +57 -894
  56. package/dist/plugins/trueforge-agent-server-adapter/index.js +110 -7
  57. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  58. package/dist/styles.css +1 -1
  59. package/package.json +8 -7
  60. package/dist/AgentMetricChart-UZCYOC4M.js +0 -15
  61. package/dist/ModelSettings-ZVXMXIU4.js.map +0 -1
  62. package/dist/OpenUiFenceBlock-F3YVDKAG.js +0 -9
  63. package/dist/SchedulesPage-FS2QZ5KB.js +0 -15
  64. package/dist/SettingsBuilder-VA3VGWZC.js.map +0 -1
  65. package/dist/chunk-7AAO4UDQ.js.map +0 -1
  66. package/dist/chunk-7VWUB5OV.js.map +0 -1
  67. package/dist/chunk-BREN6OSX.js.map +0 -1
  68. package/dist/chunk-KZK2PQ4A.js.map +0 -1
  69. package/dist/chunk-MEW7WZ7Q.js.map +0 -1
  70. package/dist/chunk-NXK4XW4U.js +0 -587
  71. package/dist/chunk-NXK4XW4U.js.map +0 -1
  72. package/dist/chunk-U7WONUMR.js.map +0 -1
  73. package/dist/chunk-VTOW2UIX.js.map +0 -1
  74. package/dist/createTrueFoundryServer-B_FYhSdn.d.ts +0 -42
  75. /package/dist/{AgentCodeSnippets-EK7KMIY2.js.map → AgentCodeSnippets-BPC6TD7K.js.map} +0 -0
  76. /package/dist/{AgentMetricChart-UZCYOC4M.js.map → AgentMetricChart-T6DZZ37Y.js.map} +0 -0
  77. /package/dist/{AgentOverview-5UPMYHT2.js.map → AgentOverview-BFU7EO4Y.js.map} +0 -0
  78. /package/dist/{AgentSessionEventTimeline-V6NPCYMW.js.map → AgentSessionEventTimeline-ATVBTYDF.js.map} +0 -0
  79. /package/dist/{AgentSessionEventTimelineChart-YQWZBQCG.js.map → AgentSessionEventTimelineChart-H577STKW.js.map} +0 -0
  80. /package/dist/{AgentSessions-WNYVVB6Q.js.map → AgentSessions-GDLBXFIK.js.map} +0 -0
  81. /package/dist/{ConnectorSettings-O4I24244.js.map → ConnectorSettings-FYNF6J3F.js.map} +0 -0
  82. /package/dist/{DockLayout-JMBZVMGB.js.map → DockLayout-SGUOMZ5E.js.map} +0 -0
  83. /package/dist/{DrawerLayout-E6G3IF6R.js.map → DrawerLayout-MJJYQDCW.js.map} +0 -0
  84. /package/dist/{OpenUiFenceBlock-F3YVDKAG.js.map → OpenUiFenceBlock-BZPFNXWZ.js.map} +0 -0
  85. /package/dist/{SandboxSettings-H6BA2DJQ.js.map → SandboxSettings-HQVBGHXZ.js.map} +0 -0
  86. /package/dist/{SchedulesPage-FS2QZ5KB.js.map → SchedulesPage-ZO3PJY4J.js.map} +0 -0
  87. /package/dist/{ShellRouteSync-ZT4PBE6T.js.map → ShellRouteSync-4I5BP2VY.js.map} +0 -0
  88. /package/dist/{SidebarLayout-ICXEN7ZL.js.map → SidebarLayout-ZLWG2YGO.js.map} +0 -0
  89. /package/dist/{SkillSettings-F5JGGFXR.js.map → SkillSettings-AFSAOU6O.js.map} +0 -0
  90. /package/dist/{TrueForgeUIWithRouter-MKJ7IEWG.js.map → TrueForgeUIWithRouter-RQX5XWGI.js.map} +0 -0
  91. /package/dist/{WidgetLayout-J7ZRW3V3.js.map → WidgetLayout-WIPKUIL4.js.map} +0 -0
  92. /package/dist/{chunk-SCIEO6CF.js.map → chunk-HDMBSLDC.js.map} +0 -0
  93. /package/dist/{chunk-WFIA627Q.js.map → chunk-QKFMAQ7O.js.map} +0 -0
  94. /package/dist/{chunk-JEAULQNF.js.map → chunk-TJGGIEF6.js.map} +0 -0
  95. /package/dist/{chunk-KDCVFHPZ.js.map → chunk-TX6PB3DY.js.map} +0 -0
  96. /package/dist/{chunk-MB7Z5FPI.js.map → chunk-YN5ZBBQM.js.map} +0 -0
  97. /package/dist/{chunk-UN7WPTTK.js.map → chunk-ZYJ2SBF7.js.map} +0 -0
@@ -56,7 +56,7 @@ function useOptionalRefreshServerCapabilities() {
56
56
  function useCatalogServer() {
57
57
  const server = useServer();
58
58
  if (server.catalog == null) {
59
- throw new Error("useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueFoundryServer.");
59
+ throw new Error("useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueForgeServer.");
60
60
  }
61
61
  return server.catalog;
62
62
  }
@@ -86,7 +86,7 @@ function useOptionalAgentMetricsServer() {
86
86
  function useScheduleServer() {
87
87
  const server = useServer();
88
88
  if (server.schedules == null) {
89
- throw new Error("useScheduleServer requires AgentUIServer.schedules. Pass schedules to createTrueFoundryServer.");
89
+ throw new Error("useScheduleServer requires AgentUIServer.schedules. Pass schedules to createTrueForgeServer.");
90
90
  }
91
91
  return server.schedules;
92
92
  }
@@ -708,10 +708,11 @@ function ShellModeProvider({
708
708
  selectLibraryAgent({ isMutable: true, isCreateAgent: false, agentSpec: chatSeedRef.current });
709
709
  }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);
710
710
  const isActiveAgentBuilder = effectiveMode.status === "active" && effectiveMode.isMutable && effectiveMode.isCreateAgent;
711
+ const isBoundAgentBuilder = isActiveAgentBuilder && effectiveMode.agentId != null;
711
712
  const openAgentBuilder = useCallback2(() => {
712
713
  if (!isComposerEnabled) return;
713
714
  refreshCapabilities?.();
714
- if (isActiveAgentBuilder) {
715
+ if (isActiveAgentBuilder && !isBoundAgentBuilder) {
715
716
  setSettingsOpen(false);
716
717
  setLibraryOpenState(false);
717
718
  setLibraryAgentId(null);
@@ -723,6 +724,7 @@ function ShellModeProvider({
723
724
  selectLibraryAgent({ isMutable: true, isCreateAgent: true, agentSpec: agentSeedRef.current });
724
725
  }, [
725
726
  isActiveAgentBuilder,
727
+ isBoundAgentBuilder,
726
728
  isComposerEnabled,
727
729
  refreshCapabilities,
728
730
  selectLibraryAgent,
@@ -1110,4 +1112,4 @@ export {
1110
1112
  shellIsCreateAgent,
1111
1113
  getErrorMessage
1112
1114
  };
1113
- //# sourceMappingURL=chunk-U7WONUMR.js.map
1115
+ //# sourceMappingURL=chunk-7S7A3PNP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/ServerContext.tsx","../src/utils/sessionShareUrl.ts","../src/server/serverChrome.ts","../src/server/ShellModeContext.tsx","../src/server/draftSpecPreferences.ts","../src/utils/getErrorMessage.ts"],"sourcesContent":["'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport type {\n AgentBuilderCapabilitiesResponse,\n AgentMetricsServer,\n AgentSessionsServer,\n AgentUIServer,\n CatalogServer,\n PermissionsServer,\n ScheduleServer,\n} from './types.js';\n\nconst ServerContext = createContext<AgentUIServer | null>(null);\nconst ServerCapabilitiesContext = createContext<{\n capabilities: AgentBuilderCapabilitiesResponse['data'] | null;\n settled: boolean;\n refresh: () => void;\n} | null>(null);\n\nexport function ServerProvider({ server, children }: { server: AgentUIServer; children: ReactNode }) {\n const [capabilities, setCapabilities] = useState<AgentBuilderCapabilitiesResponse['data'] | null>(null);\n const [capabilitiesSettled, setCapabilitiesSettled] = useState(false);\n const cancelActiveRequestRef = useRef<(() => void) | null>(null);\n const refreshCapabilities = useCallback(() => {\n cancelActiveRequestRef.current?.();\n let cancelled = false;\n cancelActiveRequestRef.current = () => {\n cancelled = true;\n };\n void server\n .getCapabilities()\n .then(response => {\n if (!cancelled) setCapabilities(response.data);\n })\n .catch(() => {\n // Preserve the last known capabilities when a refresh fails.\n })\n .finally(() => {\n if (!cancelled) setCapabilitiesSettled(true);\n });\n }, [server]);\n\n useEffect(() => {\n setCapabilities(null);\n setCapabilitiesSettled(false);\n refreshCapabilities();\n return () => {\n cancelActiveRequestRef.current?.();\n };\n }, [refreshCapabilities]);\n\n const capabilitiesValue = useMemo(\n () => ({ capabilities, settled: capabilitiesSettled, refresh: refreshCapabilities }),\n [capabilities, capabilitiesSettled, refreshCapabilities],\n );\n\n return (\n <ServerContext.Provider value={server}>\n <ServerCapabilitiesContext.Provider value={capabilitiesValue}>{children}</ServerCapabilitiesContext.Provider>\n </ServerContext.Provider>\n );\n}\n\nexport function useServer(): AgentUIServer {\n const server = useContext(ServerContext);\n if (server == null) {\n throw new Error('useServer must be used within a ServerProvider.');\n }\n return server;\n}\n\nexport function useOptionalServer(): AgentUIServer | null {\n return useContext(ServerContext);\n}\n\nexport function useServerCapabilities(): AgentBuilderCapabilitiesResponse['data'] | null {\n return useContext(ServerCapabilitiesContext)?.capabilities ?? null;\n}\n\nexport function useServerCapabilitiesSettled(): boolean {\n return useContext(ServerCapabilitiesContext)?.settled ?? false;\n}\n\nexport function useOptionalRefreshServerCapabilities(): (() => void) | null {\n return useContext(ServerCapabilitiesContext)?.refresh ?? null;\n}\n\nexport function useCatalogServer(): CatalogServer {\n const server = useServer();\n if (server.catalog == null) {\n throw new Error('useCatalogServer requires AgentUIServer.catalog. Pass catalog to createTrueForgeServer.');\n }\n return server.catalog;\n}\n\nexport function useOptionalCatalogServer(): CatalogServer | null {\n return useOptionalServer()?.catalog ?? null;\n}\n\nexport function useAgentSessionsServer(): AgentSessionsServer {\n const sessions = useServer().sessions;\n if (sessions == null) {\n throw new Error('useAgentSessionsServer requires AgentUIServer.sessions.');\n }\n return sessions;\n}\n\nexport function useOptionalAgentSessionsServer(): AgentSessionsServer | null {\n return useOptionalServer()?.sessions ?? null;\n}\n\nexport function useAgentMetricsServer(): AgentMetricsServer {\n const metrics = useServer().metrics;\n if (metrics == null) {\n throw new Error('useAgentMetricsServer requires AgentUIServer.metrics.');\n }\n return metrics;\n}\n\nexport function useOptionalAgentMetricsServer(): AgentMetricsServer | null {\n return useOptionalServer()?.metrics ?? null;\n}\n\nexport function useScheduleServer(): ScheduleServer {\n const server = useServer();\n if (server.schedules == null) {\n throw new Error('useScheduleServer requires AgentUIServer.schedules. Pass schedules to createTrueForgeServer.');\n }\n return server.schedules;\n}\n\nexport function useOptionalScheduleServer(): ScheduleServer | null {\n return useOptionalServer()?.schedules ?? null;\n}\n\nexport function useOptionalPermissionsServer(): PermissionsServer | null {\n return useOptionalServer()?.permissions ?? null;\n}\n","export const SESSION_ID_QUERY = 'sessionId';\nexport const AGENT_ID_QUERY = 'agentId';\nexport const AGENT_TAB_QUERY = 'tab';\nexport const SESSIONS_VIEW_QUERY = 'view';\nexport const SESSIONS_VIEW_VALUE = 'sessions';\nexport const SESSION_START_TIME_QUERY = 's_sts';\nexport const SESSION_END_TIME_QUERY = 's_ets';\nexport const SESSION_TIME_WINDOW_QUERY = 's_tw';\nexport const SESSION_TIME_BUFFER_MS = 5 * 60 * 1000;\nexport const SESSION_CUSTOM_RANGE_MAX_DAYS = 70;\nexport const DEFAULT_SESSION_TIME_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;\nexport const DEFAULT_METRICS_TIME_WINDOW_MS = 24 * 60 * 60 * 1000;\n\nexport type LibraryAgentTab = 'overview' | 'sessions' | 'schedules' | 'code' | 'metrics';\n\nexport type SessionTimeRange = {\n startTs: number;\n endTs: number;\n timeWindowMs?: number;\n};\n\nexport type SessionShareSearch = {\n sessionId: string | null;\n agentId: string | null;\n tab: LibraryAgentTab | null;\n view: typeof SESSIONS_VIEW_VALUE | null;\n timeRange: SessionTimeRange | null;\n};\n\nexport type SessionShareWrite = {\n sessionId?: string | null;\n agentId?: string | null;\n tab?: LibraryAgentTab | null;\n view?: typeof SESSIONS_VIEW_VALUE | null;\n timeRange?: SessionTimeRange | null;\n};\n\nfunction parseLibraryAgentTab(value: string | null): LibraryAgentTab | null {\n if (\n value === 'overview' ||\n value === 'sessions' ||\n value === 'schedules' ||\n value === 'code' ||\n value === 'metrics'\n ) {\n return value;\n }\n return null;\n}\n\nfunction nonEmpty(value: string | null): string | null {\n return value != null && value.length > 0 ? value : null;\n}\n\nfunction parseMs(value: string | null): number | null {\n if (value == null || value.length === 0) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function defaultSessionTimeRange(now = Date.now()): SessionTimeRange {\n return {\n startTs: now - DEFAULT_SESSION_TIME_WINDOW_MS,\n endTs: now,\n timeWindowMs: DEFAULT_SESSION_TIME_WINDOW_MS,\n };\n}\n\nexport function defaultMetricsTimeRange(now = Date.now()): SessionTimeRange {\n return {\n startTs: now - DEFAULT_METRICS_TIME_WINDOW_MS,\n endTs: now,\n timeWindowMs: DEFAULT_METRICS_TIME_WINDOW_MS,\n };\n}\n\nexport function sessionTimeRangeFromCreatedAt(createdAt: string): SessionTimeRange | null {\n const createdAtMs = new Date(createdAt).getTime();\n if (Number.isNaN(createdAtMs)) return null;\n return {\n startTs: createdAtMs - SESSION_TIME_BUFFER_MS,\n endTs: createdAtMs + SESSION_TIME_BUFFER_MS,\n };\n}\n\nexport function resolveSessionTimeRange(range: SessionTimeRange, now = Date.now()): { startTs: number; endTs: number } {\n if (range.timeWindowMs != null) {\n return { startTs: now - range.timeWindowMs, endTs: now };\n }\n return { startTs: range.startTs, endTs: range.endTs };\n}\n\nexport function readSessionShareSearch(search: string): SessionShareSearch {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n const startTs = parseMs(params.get(SESSION_START_TIME_QUERY));\n const endTs = parseMs(params.get(SESSION_END_TIME_QUERY));\n const timeWindowMs = parseMs(params.get(SESSION_TIME_WINDOW_QUERY));\n const view = params.get(SESSIONS_VIEW_QUERY);\n const now = Date.now();\n return {\n sessionId: nonEmpty(params.get(SESSION_ID_QUERY)),\n agentId: nonEmpty(params.get(AGENT_ID_QUERY)),\n tab: parseLibraryAgentTab(params.get(AGENT_TAB_QUERY)),\n view: view === SESSIONS_VIEW_VALUE ? SESSIONS_VIEW_VALUE : null,\n timeRange:\n startTs != null && endTs != null\n ? { startTs, endTs }\n : timeWindowMs != null\n ? { startTs: now - timeWindowMs, endTs: now, timeWindowMs }\n : null,\n };\n}\n\n/** Library details tab: `tab=` wins; a matching share `sessionId` still opens Sessions. */\nexport function libraryAgentTabFromSearch(share: SessionShareSearch, agentId: string): LibraryAgentTab {\n if (share.tab != null) return share.tab;\n return share.sessionId != null && share.agentId === agentId ? 'sessions' : 'overview';\n}\n\nexport function writeSessionShareSearch(params: URLSearchParams, next: SessionShareWrite): void {\n if (next.sessionId === null) params.delete(SESSION_ID_QUERY);\n else if (next.sessionId != null) params.set(SESSION_ID_QUERY, next.sessionId);\n if (next.agentId === null) params.delete(AGENT_ID_QUERY);\n else if (next.agentId != null) params.set(AGENT_ID_QUERY, next.agentId);\n if (next.tab === null) params.delete(AGENT_TAB_QUERY);\n else if (next.tab != null) params.set(AGENT_TAB_QUERY, next.tab);\n if (next.view === null) params.delete(SESSIONS_VIEW_QUERY);\n else if (next.view != null) params.set(SESSIONS_VIEW_QUERY, next.view);\n if (next.timeRange === null) {\n params.delete(SESSION_START_TIME_QUERY);\n params.delete(SESSION_END_TIME_QUERY);\n params.delete(SESSION_TIME_WINDOW_QUERY);\n } else if (next.timeRange != null) {\n if (next.timeRange.timeWindowMs != null) {\n params.set(SESSION_TIME_WINDOW_QUERY, String(next.timeRange.timeWindowMs));\n params.delete(SESSION_START_TIME_QUERY);\n params.delete(SESSION_END_TIME_QUERY);\n } else {\n params.set(SESSION_START_TIME_QUERY, String(next.timeRange.startTs));\n params.set(SESSION_END_TIME_QUERY, String(next.timeRange.endTs));\n params.delete(SESSION_TIME_WINDOW_QUERY);\n }\n }\n}\n\n/** Share link for a library or global session. Works with or without `withRouter`. */\nexport function buildAgentSessionShareUrl({\n sessionId,\n agentId,\n createdAt,\n view,\n href = typeof window === 'undefined' ? '' : window.location.href,\n}: {\n sessionId: string;\n agentId?: string;\n createdAt?: string;\n view?: typeof SESSIONS_VIEW_VALUE | null;\n href?: string;\n}): string {\n const url = new URL(href);\n writeSessionShareSearch(url.searchParams, {\n sessionId,\n agentId: agentId == null || agentId.length === 0 ? null : agentId,\n ...(view === undefined ? {} : { view }),\n timeRange: createdAt == null ? undefined : sessionTimeRangeFromCreatedAt(createdAt),\n });\n return url.toString();\n}\n\nexport const SESSION_SHARE_CHANGE_EVENT = 'trueforge-session-share';\n\nexport function replaceSessionShareSearch(next: SessionShareWrite): string {\n const url = new URL(window.location.href);\n writeSessionShareSearch(url.searchParams, next);\n window.history.replaceState(window.history.state, '', url);\n window.dispatchEvent(new Event(SESSION_SHARE_CHANGE_EVENT));\n return url.search;\n}\n","import type { ResolvedRoutes } from '../routing/types.js';\nimport type { AgentMetricsServer, AgentSessionsServer, CatalogServer, ScheduleServer } from './types.js';\n\n/**\n * Whether Settings chrome is available: sidebar button and `/settings` route.\n * Matches the gate in {@link ShellActions}.\n */\nexport function isSettingsChromeEnabled({\n catalog,\n capabilities,\n}: {\n catalog: CatalogServer | null | undefined;\n capabilities: { settings?: { enabled?: boolean } } | null | undefined;\n}): boolean {\n return catalog != null && capabilities?.settings?.enabled === true;\n}\n\n/** Sessions browser + agent-detail surfaces (Overview / sessions / code). */\nexport function isSessionsChromeEnabled({ sessions }: { sessions: AgentSessionsServer | null | undefined }): boolean {\n return sessions != null;\n}\n\n/** Schedules page + library schedules column. */\nexport function isSchedulesChromeEnabled({ schedules }: { schedules: ScheduleServer | null | undefined }): boolean {\n return schedules != null;\n}\n\n/** Agent-details Metrics tab (no top-level path). */\nexport function isMetricsChromeEnabled({ metrics }: { metrics: AgentMetricsServer | null | undefined }): boolean {\n return metrics != null;\n}\n\n/**\n * Unregister path-backed places whose optional server port is absent.\n * Chrome gates and route gates must stay in lockstep.\n */\nexport function toEffectiveRoutes({\n routes,\n catalog,\n capabilities,\n sessions,\n schedules,\n}: {\n routes: ResolvedRoutes;\n catalog: CatalogServer | null | undefined;\n capabilities: { settings?: { enabled?: boolean } } | null | undefined;\n sessions: AgentSessionsServer | null | undefined;\n schedules: ScheduleServer | null | undefined;\n}): ResolvedRoutes {\n const sessionsEnabled = isSessionsChromeEnabled({ sessions });\n return {\n ...routes,\n settings: isSettingsChromeEnabled({ catalog, capabilities }) ? routes.settings : null,\n sessionsBrowser: sessionsEnabled ? routes.sessionsBrowser : null,\n libraryAgent: sessionsEnabled ? routes.libraryAgent : null,\n schedules: isSchedulesChromeEnabled({ schedules }) ? routes.schedules : null,\n };\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport type { HistoryAgentIntent } from '../utils/historyAgentSearch.js';\nimport { replaceSessionShareSearch } from '../utils/sessionShareUrl.js';\nimport {\n readDraftSpecPreferences,\n selectDraftSpecPreferences,\n withCapabilitiesSandbox,\n withCapabilitiesWebSearch,\n writeDraftSpecPreferences,\n type DraftPreferenceKind,\n} from './draftSpecPreferences.js';\nimport { isSchedulesChromeEnabled, isSessionsChromeEnabled, isSettingsChromeEnabled } from './serverChrome.js';\nimport {\n useOptionalAgentSessionsServer,\n useOptionalCatalogServer,\n useOptionalRefreshServerCapabilities,\n useOptionalScheduleServer,\n useServerCapabilities,\n} from './ServerContext.js';\nimport type { AgentLibraryEntry, AgentSpec } from './types.js';\n\n/** Host-facing shell configuration for agent / library / composer chrome. */\nexport type AgentConfig =\n | { mode: 'SingleAgent'; name: string }\n | { mode: 'AgentLibrary' }\n | { mode: 'AgentComposer'; defaultAgentSpec?: AgentSpec }\n | { mode: 'AgentLibraryWithComposer'; defaultAgentSpec?: AgentSpec };\n\nexport const DEFAULT_AGENT_CONFIG: AgentConfig = {\n mode: 'AgentLibraryWithComposer',\n};\n\n/**\n * Active chat binding. Mutability (`isMutable`) decides draft vs named runtime.\n * `isCreateAgent` (mutable only) splits New Agent builder chrome from simple New Chat.\n */\nexport type ShellMode =\n | { status: 'idle' }\n | {\n status: 'active';\n isMutable: boolean;\n /**\n * Mutable only: true = Agent builder (config drawer + Save); false = simple chat.\n * Always false when `isMutable` is false (Try / named).\n */\n isCreateAgent: boolean;\n /** Identity for immutable bind + history filter. */\n agentId?: string;\n /** Display / welcome label (often same as agentId). */\n agentName?: string;\n /** Published-agent description, kept outside the executable agent spec. */\n description?: string;\n /** Seed for mutable (draft) runtime. */\n agentSpec?: AgentSpec;\n locked: boolean;\n };\n\n/** Library / New Chat / New Agent create intent. */\nexport type SelectLibraryAgentRequest = {\n isMutable: boolean;\n /**\n * Mutable only. When omitted: true if Edit identity is present, else false (New Chat).\n */\n isCreateAgent?: boolean;\n agentId?: string;\n agentName?: string;\n description?: string;\n agentSpec?: AgentSpec;\n};\n\nexport type SettingsSection = 'models' | 'connectors' | 'skills' | 'sandbox' | 'web-search';\n\nexport type HistoryAgentFilter = {\n agentId?: string;\n agentName: string;\n intent: HistoryAgentIntent;\n};\n\ntype ShellModeContextValue = {\n mode: ShellMode;\n /** Host agentConfig mode (capabilities source). */\n agentConfigMode: AgentConfig['mode'];\n /** Agents chrome. */\n isLibraryEnabled: boolean;\n /** Mutable composer / Save Agent chrome (host capability). */\n isComposerEnabled: boolean;\n /** Sidebar / list New Chat control. */\n isNewChatEnabled: boolean;\n settingsOpen: boolean;\n settingsSection: SettingsSection;\n setSettingsOpen: (open: boolean, section?: SettingsSection) => void;\n agentConfigOpen: boolean;\n setAgentConfigOpen: (open: boolean) => void;\n /** Agents main-pane overlay (sidebar layout). */\n libraryOpen: boolean;\n libraryAgentId: string | null;\n setLibraryAgentId: (id: string | null) => void;\n setLibraryOpen: (open: boolean) => void;\n /** All-user sessions browser (includes drafts). */\n sessionsOpen: boolean;\n setSessionsOpen: (open: boolean) => void;\n openLibraryAgent: (agentId: string) => void;\n closeLibraryAgent: () => void;\n schedulesOpen: boolean;\n setSchedulesOpen: (open: boolean) => void;\n /**\n * Bind from Agents (Try = immutable, Edit = mutable + agentSpec).\n * Prefer this over `selectAgent` / `openDraft` when both fields are available.\n */\n selectLibraryAgent: (req: SelectLibraryAgentRequest) => void;\n /**\n * Attach identity + agentSpec to the *current* mutable chat without remounting.\n * Used after `saveAgent` so the same draft session continues as an editable agent.\n */\n bindMutableAgent: (req: { agentId: string; agentName: string; description?: string; agentSpec: AgentSpec }) => void;\n /** @deprecated Prefer `selectLibraryAgent({ isMutable: false, agentName })`. */\n selectAgent: (agentName: string) => void;\n /** Open a simple New Chat (mutable, no agent-builder chrome). */\n openDraft: () => void;\n /** Open New Agent builder (mutable + Agent Config drawer). */\n openAgentBuilder: () => void;\n /** Remember plain-draft composer choices as the seed for future New Chat / New Agent. */\n rememberDraftSpec: (agentSpec: AgentSpec, kind?: DraftPreferenceKind) => void;\n /**\n * Open a history session without remounting the runtime.\n * Prefer explicit `isMutable`; otherwise agentName means immutable.\n */\n openHistorySession: (req: {\n sessionId: string;\n agentName?: string;\n isMutable?: boolean;\n isCreateAgent?: boolean;\n }) => void;\n /** Reset current chat; no-op when idle. */\n clearChat: () => void;\n /** Return library-only mode to its idle landing; no-op in other modes. */\n openLibraryHome: () => void;\n /** Changes only when the chat runtime must reset. */\n runtimeKey: string;\n /**\n * History list filter forwarded as `listSessions({ agentId })`.\n * `null` = All chats. Only meaningful when `isLibraryEnabled`.\n */\n historyAgentFilter: HistoryAgentFilter | null;\n setHistoryAgentFilter: (filter: HistoryAgentFilter | null) => void;\n /** Effective `listSessionsAgentId` for the runtime (SingleAgent locks to name). */\n listSessionsAgentId: string | undefined;\n /** Session selected from history. */\n pendingSessionId: string | undefined;\n /** Distinguishes repeated selections of the same session. */\n pendingSessionEpoch: number;\n /**\n * Bumped when the Agents catalog may have changed (e.g. after saveAgent).\n * Library chrome should re-fetch when this changes.\n */\n agentsListEpoch: number;\n invalidateAgentsList: () => void;\n};\n\nconst ShellModeContext = createContext<ShellModeContextValue | null>(null);\n\nconst FALLBACK_MUTABLE_SPEC: AgentSpec = {\n model: { name: 'openai-main/gpt-4.1' },\n};\n\nfunction mutableSeedFromConfig(config: AgentConfig): AgentSpec {\n if (config.mode === 'AgentComposer' || config.mode === 'AgentLibraryWithComposer') {\n return config.defaultAgentSpec ?? FALLBACK_MUTABLE_SPEC;\n }\n return FALLBACK_MUTABLE_SPEC;\n}\n\nfunction initialMode(config: AgentConfig, mutableSeed: AgentSpec): ShellMode {\n switch (config.mode) {\n case 'SingleAgent':\n return {\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n agentId: config.name,\n agentName: config.name,\n locked: true,\n };\n case 'AgentLibrary':\n return { status: 'idle' };\n case 'AgentComposer':\n case 'AgentLibraryWithComposer':\n return {\n status: 'active',\n isMutable: true,\n isCreateAgent: false,\n agentSpec: mutableSeed,\n locked: false,\n };\n }\n}\n\nfunction resolveMutableIsCreateAgent(req: SelectLibraryAgentRequest): boolean {\n if (req.isCreateAgent !== undefined) return req.isCreateAgent;\n return req.agentId != null || req.agentName != null;\n}\n\nfunction libraryAgentId(agent: Pick<AgentLibraryEntry, 'agentId' | 'name'>): string {\n return agent.agentId ?? agent.name;\n}\n\nexport function ShellModeProvider({\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n children,\n}: {\n agentConfig?: AgentConfig;\n /** Open settings on first paint (e.g. host boot with no models). Does not re-open later. */\n initialSettingsOpen?: boolean;\n children: ReactNode;\n}) {\n const capabilities = useServerCapabilities();\n const catalog = useOptionalCatalogServer();\n const refreshCapabilities = useOptionalRefreshServerCapabilities();\n const sessionsServer = useOptionalAgentSessionsServer();\n const scheduleServer = useOptionalScheduleServer();\n const chatSeedRef = useRef(\n readDraftSpecPreferences('chat') ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), 'chat'),\n );\n const agentSeedRef = useRef(\n readDraftSpecPreferences('agent') ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), 'agent'),\n );\n\n const isLibraryEnabled = agentConfig.mode === 'AgentLibrary' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isComposerEnabled = agentConfig.mode === 'AgentComposer' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isNewChatEnabled = agentConfig.mode !== 'AgentLibrary';\n const locked = agentConfig.mode === 'SingleAgent';\n\n const [mode, setMode] = useState<ShellMode>(() => initialMode(agentConfig, chatSeedRef.current));\n const [mutableEpoch, setMutableEpoch] = useState(0);\n const [clearEpoch, setClearEpoch] = useState(0);\n const [agentsListEpoch, setAgentsListEpoch] = useState(0);\n const [settingsOpenState, setSettingsOpenState] = useState(initialSettingsOpen);\n const [settingsSection, setSettingsSection] = useState<SettingsSection>('models');\n const [agentConfigOpenState, setAgentConfigOpenState] = useState(false);\n const [libraryOpenState, setLibraryOpenState] = useState(false);\n const [sessionsOpenState, setSessionsOpenState] = useState(false);\n const [libraryAgentId, setLibraryAgentId] = useState<string | null>(null);\n const [schedulesOpenState, setSchedulesOpenState] = useState(false);\n const [historyAgentFilter, setHistoryAgentFilter] = useState<HistoryAgentFilter | null>(null);\n const [pendingSessionId, setPendingSessionId] = useState<string | undefined>(undefined);\n const [pendingSessionEpoch, setPendingSessionEpoch] = useState(0);\n const settingsEnabled = isSettingsChromeEnabled({ catalog, capabilities });\n const settingsOpen = settingsEnabled && settingsOpenState;\n const sessionsEnabled = isSessionsChromeEnabled({ sessions: sessionsServer });\n const schedulesEnabled = isSchedulesChromeEnabled({ schedules: scheduleServer });\n const schedulesOpen = schedulesEnabled && schedulesOpenState;\n const libraryOpen = isLibraryEnabled && libraryOpenState;\n const sessionsOpen = sessionsEnabled && sessionsOpenState;\n const setSessionsOpen = useCallback(\n (open: boolean) => {\n if (open) {\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSchedulesOpenState(false);\n } else {\n replaceSessionShareSearch({ view: null });\n }\n setSessionsOpenState(sessionsEnabled && open);\n },\n [sessionsEnabled],\n );\n const setLibraryOpen = useCallback(\n (open: boolean) => {\n if (!isLibraryEnabled) return;\n if (open) {\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n }\n setLibraryAgentId(null);\n setLibraryOpenState(open);\n },\n [isLibraryEnabled, setSessionsOpen],\n );\n const openLibraryAgent = useCallback(\n (agentId: string) => {\n if (!isLibraryEnabled || !sessionsEnabled) return;\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n setLibraryOpenState(true);\n setLibraryAgentId(agentId);\n },\n [isLibraryEnabled, sessionsEnabled, setSessionsOpen],\n );\n const closeLibraryAgent = useCallback(() => {\n setLibraryAgentId(null);\n }, []);\n const setSettingsOpen = useCallback(\n (open: boolean, section?: SettingsSection) => {\n if (section !== undefined) {\n setSettingsSection(section);\n }\n if (open) {\n setAgentConfigOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n }\n setSettingsOpenState(settingsEnabled && open);\n },\n [setSessionsOpen, settingsEnabled],\n );\n const setAgentConfigOpen = useCallback(\n (open: boolean) => {\n if (open) {\n setSettingsOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n }\n setAgentConfigOpenState(open);\n },\n [setSessionsOpen],\n );\n const setSchedulesOpen = useCallback(\n (open: boolean) => {\n if (open) {\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n }\n setSchedulesOpenState(schedulesEnabled && open);\n },\n [schedulesEnabled, setSessionsOpen],\n );\n\n useEffect(() => {\n if (catalog == null || capabilities?.settings?.enabled === false) {\n setSettingsOpenState(false);\n }\n }, [capabilities?.settings?.enabled, catalog]);\n\n useEffect(() => {\n if (!sessionsEnabled) {\n setSessionsOpenState(false);\n setLibraryAgentId(null);\n }\n }, [sessionsEnabled]);\n\n useEffect(() => {\n if (!schedulesEnabled) {\n setSchedulesOpenState(false);\n }\n }, [schedulesEnabled]);\n\n const invalidateAgentsList = useCallback(() => {\n setAgentsListEpoch(n => n + 1);\n }, []);\n\n const lockedAgentName = agentConfig.mode === 'SingleAgent' ? agentConfig.name : '';\n const effectiveMode: ShellMode = useMemo(() => {\n if (!locked) return mode;\n return {\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n agentId: lockedAgentName,\n agentName: lockedAgentName,\n locked: true,\n };\n }, [locked, lockedAgentName, mode]);\n const agentConfigOpen =\n effectiveMode.status === 'active' && effectiveMode.isMutable && effectiveMode.isCreateAgent && agentConfigOpenState;\n\n useEffect(() => {\n if (effectiveMode.status !== 'active' || !effectiveMode.isMutable || !effectiveMode.isCreateAgent) {\n setAgentConfigOpenState(false);\n }\n }, [effectiveMode]);\n\n const listSessionsAgentId = useMemo(() => {\n if (locked) return lockedAgentName;\n if (!isLibraryEnabled) return undefined;\n return historyAgentFilter?.agentId;\n }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);\n\n const bumpEpoch = useCallback((isMutable: boolean) => {\n if (isMutable) setMutableEpoch(n => n + 1);\n else setClearEpoch(n => n + 1);\n }, []);\n\n const selectLibraryAgent = useCallback(\n (req: SelectLibraryAgentRequest) => {\n if (req.isMutable) {\n if (!isComposerEnabled) return;\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(undefined);\n const isCreateAgent = resolveMutableIsCreateAgent(req);\n const kind: DraftPreferenceKind = isCreateAgent ? 'agent' : 'chat';\n setMode({\n status: 'active',\n isMutable: true,\n isCreateAgent,\n agentId: req.agentId,\n agentName: req.agentName,\n description: req.description,\n agentSpec: req.agentSpec ?? (kind === 'agent' ? agentSeedRef.current : chatSeedRef.current),\n locked: false,\n });\n setAgentConfigOpenState(isCreateAgent);\n bumpEpoch(true);\n return;\n }\n if (!isLibraryEnabled) return;\n const agentName = req.agentName ?? req.agentId;\n if (agentName == null) return;\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(undefined);\n setAgentConfigOpenState(false);\n setMode({\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n agentId: req.agentId ?? agentName,\n agentName,\n locked: false,\n });\n if (req.agentId != null) {\n setHistoryAgentFilter({\n agentId: req.agentId,\n agentName,\n intent: 'try-agent',\n });\n } else {\n setHistoryAgentFilter(null);\n }\n bumpEpoch(false);\n },\n [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen, setSessionsOpen, setSchedulesOpen],\n );\n\n const bindMutableAgent = useCallback(\n (req: { agentId: string; agentName: string; description?: string; agentSpec: AgentSpec }) => {\n if (!isComposerEnabled) return;\n setMode(prev => {\n if (prev.status !== 'active' || !prev.isMutable) return prev;\n return {\n status: 'active',\n isMutable: true,\n isCreateAgent: true,\n agentId: req.agentId,\n agentName: req.agentName,\n description: req.description,\n agentSpec: req.agentSpec,\n locked: false,\n };\n });\n },\n [isComposerEnabled],\n );\n\n const selectAgent = useCallback(\n (name: string) => {\n selectLibraryAgent({ isMutable: false, agentId: name, agentName: name });\n },\n [selectLibraryAgent],\n );\n\n const openDraft = useCallback(() => {\n if (!isComposerEnabled) return;\n refreshCapabilities?.();\n setHistoryAgentFilter(null);\n selectLibraryAgent({ isMutable: true, isCreateAgent: false, agentSpec: chatSeedRef.current });\n }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);\n\n const isActiveAgentBuilder =\n effectiveMode.status === 'active' && effectiveMode.isMutable && effectiveMode.isCreateAgent;\n const isBoundAgentBuilder = isActiveAgentBuilder && effectiveMode.agentId != null;\n const openAgentBuilder = useCallback(() => {\n if (!isComposerEnabled) return;\n refreshCapabilities?.();\n // Preserve unsaved drafts, saved builders start fresh when revisited.\n if (isActiveAgentBuilder && !isBoundAgentBuilder) {\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setAgentConfigOpenState(true);\n return;\n }\n selectLibraryAgent({ isMutable: true, isCreateAgent: true, agentSpec: agentSeedRef.current });\n }, [\n isActiveAgentBuilder,\n isBoundAgentBuilder,\n isComposerEnabled,\n refreshCapabilities,\n selectLibraryAgent,\n setSchedulesOpen,\n setSessionsOpen,\n setSettingsOpen,\n ]);\n\n const sandboxEnabled = capabilities?.sandbox.enabled;\n const webSearchEnabled = capabilities?.webSearch?.enabled;\n const rememberDraftSpec = useCallback(\n (agentSpec: AgentSpec, kind: DraftPreferenceKind = 'chat') => {\n const selected = selectDraftSpecPreferences(agentSpec, kind);\n const withSandbox = kind === 'agent' ? withCapabilitiesSandbox(selected, sandboxEnabled) : selected;\n const preferences =\n kind === 'agent'\n ? withCapabilitiesWebSearch({\n spec: withSandbox,\n webSearchEnabled,\n kind: 'agent',\n })\n : withSandbox;\n if (kind === 'chat') {\n chatSeedRef.current = preferences;\n } else {\n // Keep the active builder intact in memory; storage remains limited to reusable preferences.\n agentSeedRef.current = withCapabilitiesWebSearch({\n spec: withCapabilitiesSandbox(agentSpec, sandboxEnabled),\n webSearchEnabled,\n kind: 'agent',\n });\n }\n writeDraftSpecPreferences(kind, preferences);\n },\n [sandboxEnabled, webSearchEnabled],\n );\n\n const openHistorySession = useCallback(\n ({\n sessionId,\n agentName,\n isMutable: isMutableOpt,\n isCreateAgent: isCreateAgentOpt,\n }: {\n sessionId: string;\n agentName?: string;\n isMutable?: boolean;\n isCreateAgent?: boolean;\n }) => {\n const isMutable = isMutableOpt ?? agentName == null;\n if (isMutable) {\n if (!isComposerEnabled) return;\n } else if (locked) {\n if (agentName == null || lockedAgentName !== agentName) return;\n } else if (!isLibraryEnabled) {\n return;\n }\n\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(sessionId);\n setPendingSessionEpoch(n => n + 1);\n if (isMutable) {\n const isCreateAgent = isCreateAgentOpt === true;\n setMode({\n status: 'active',\n isMutable: true,\n isCreateAgent,\n agentSpec: isCreateAgent ? agentSeedRef.current : chatSeedRef.current,\n locked: false,\n });\n setAgentConfigOpenState(isCreateAgent);\n return;\n }\n setAgentConfigOpenState(false);\n setMode({\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n locked: false,\n ...(agentName != null ? { agentId: agentName, agentName } : {}),\n });\n },\n [isLibraryEnabled, isComposerEnabled, locked, lockedAgentName, setSettingsOpen, setSessionsOpen, setSchedulesOpen],\n );\n\n const clearChat = useCallback(() => {\n if (effectiveMode.status === 'idle') return;\n setPendingSessionId(undefined);\n if (effectiveMode.isMutable) {\n // Preserve Edit / builder vs chat intent; blank drafts fall back to host seed.\n const kind: DraftPreferenceKind = effectiveMode.isCreateAgent ? 'agent' : 'chat';\n setMode({\n status: 'active',\n isMutable: true,\n isCreateAgent: effectiveMode.isCreateAgent,\n agentId: effectiveMode.agentId,\n agentName: effectiveMode.agentName,\n agentSpec: effectiveMode.agentSpec ?? (kind === 'agent' ? agentSeedRef.current : chatSeedRef.current),\n locked: false,\n });\n setAgentConfigOpenState(effectiveMode.isCreateAgent);\n bumpEpoch(true);\n return;\n }\n bumpEpoch(false);\n }, [effectiveMode, bumpEpoch]);\n\n const openLibraryHome = useCallback(() => {\n // Only library-only mode has an idle landing; other modes root via openDraft / clearChat.\n if (!isLibraryEnabled || isComposerEnabled) return;\n setPendingSessionId(undefined);\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSchedulesOpen(false);\n setMode({ status: 'idle' });\n bumpEpoch(false);\n }, [isLibraryEnabled, isComposerEnabled, setSettingsOpen, setSchedulesOpen, bumpEpoch]);\n\n // Only explicit resets remount the runtime; history and identity changes happen in place.\n const runtimeKey = useMemo(() => {\n if (effectiveMode.status === 'idle') return 'idle';\n return `chat:${mutableEpoch}:${clearEpoch}`;\n }, [effectiveMode.status, mutableEpoch, clearEpoch]);\n\n const value = useMemo<ShellModeContextValue>(\n () => ({\n mode: effectiveMode,\n agentConfigMode: agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n agentConfigOpen,\n setAgentConfigOpen,\n libraryOpen,\n libraryAgentId,\n setLibraryAgentId,\n setLibraryOpen,\n sessionsOpen,\n setSessionsOpen,\n openLibraryAgent,\n closeLibraryAgent,\n schedulesOpen,\n setSchedulesOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n openAgentBuilder,\n rememberDraftSpec,\n openHistorySession,\n clearChat,\n openLibraryHome,\n runtimeKey,\n historyAgentFilter,\n setHistoryAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n pendingSessionEpoch,\n agentsListEpoch,\n invalidateAgentsList,\n }),\n [\n effectiveMode,\n agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n agentConfigOpen,\n setAgentConfigOpen,\n libraryOpen,\n libraryAgentId,\n setLibraryOpen,\n sessionsOpen,\n setSessionsOpen,\n openLibraryAgent,\n closeLibraryAgent,\n schedulesOpen,\n setSchedulesOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n openAgentBuilder,\n rememberDraftSpec,\n openHistorySession,\n clearChat,\n openLibraryHome,\n runtimeKey,\n historyAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n pendingSessionEpoch,\n agentsListEpoch,\n invalidateAgentsList,\n ],\n );\n\n return <ShellModeContext.Provider value={value}>{children}</ShellModeContext.Provider>;\n}\n\nexport function useShellMode(): ShellModeContextValue {\n const ctx = useContext(ShellModeContext);\n if (ctx == null) {\n throw new Error('useShellMode must be used within a ShellModeProvider.');\n }\n return ctx;\n}\n\nexport function useOptionalShellMode(): ShellModeContextValue | null {\n return useContext(ShellModeContext);\n}\n\n/** True when the shell is bound to a mutable (editable) agentSpec. */\nexport function shellIsMutable(mode: ShellMode): boolean {\n return mode.status === 'active' && mode.isMutable;\n}\n\n/** True when the shell is in New Agent / Edit builder chrome. */\nexport function shellIsCreateAgent(mode: ShellMode): boolean {\n return mode.status === 'active' && mode.isMutable && mode.isCreateAgent;\n}\n\nexport { libraryAgentId };\n","import type { AgentSpec } from './types.js';\n\n/** @deprecated Migrated into chat/agent keys on first read. */\nexport const DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-draft-spec-preferences';\nexport const CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-chat-draft-spec-preferences';\nexport const AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-agent-draft-spec-preferences';\n\nexport type DraftPreferenceKind = 'chat' | 'agent';\n\ntype StoredDraftSpecPreferences = {\n version: 1;\n spec: AgentSpec;\n};\n\nfunction isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMountList(value: unknown): boolean {\n return Array.isArray(value) && value.every(isObject);\n}\n\nfunction isAgentSpec(value: unknown): value is AgentSpec {\n if (!isObject(value)) return false;\n const model = Reflect.get(value, 'model');\n if (!isObject(model) || typeof Reflect.get(model, 'name') !== 'string') return false;\n\n const params = Reflect.get(model, 'params');\n if (params !== undefined && !isObject(params)) return false;\n\n const skills = Reflect.get(value, 'skills');\n if (skills !== undefined && !isMountList(skills)) return false;\n\n const mcpServers = Reflect.get(value, 'mcpServers');\n if (mcpServers !== undefined && !isMountList(mcpServers)) return false;\n\n const config = Reflect.get(value, 'config');\n return config === undefined || isObject(config);\n}\n\nfunction isStoredDraftSpecPreferences(value: unknown): value is StoredDraftSpecPreferences {\n return isObject(value) && Reflect.get(value, 'version') === 1 && isAgentSpec(Reflect.get(value, 'spec'));\n}\n\nfunction storageKeyForKind(kind: DraftPreferenceKind): string {\n return kind === 'chat' ? CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY : AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY;\n}\n\n/** New Chat: model (+ reasoning params), skills, and MCP only — no runtime config. */\nexport function selectChatDraftSpecPreferences(spec: AgentSpec): AgentSpec {\n return {\n model: spec.model,\n ...(spec.skills !== undefined ? { skills: spec.skills } : {}),\n ...(spec.mcpServers !== undefined ? { mcpServers: spec.mcpServers } : {}),\n };\n}\n\n/** New Agent: full composer seed including runtime config (sandbox, ask-user, …). */\nexport function selectAgentDraftSpecPreferences(spec: AgentSpec): AgentSpec {\n return {\n ...selectChatDraftSpecPreferences(spec),\n ...(spec.config !== undefined ? { config: spec.config } : {}),\n };\n}\n\nexport function selectDraftSpecPreferences(spec: AgentSpec, kind: DraftPreferenceKind): AgentSpec {\n return kind === 'chat' ? selectChatDraftSpecPreferences(spec) : selectAgentDraftSpecPreferences(spec);\n}\n\nfunction readSandboxEnabled(spec: AgentSpec): boolean | undefined {\n if (spec.config === undefined) return undefined;\n // `sandbox` is persisted on draft config but is not part of AgentRuntimeConfig.\n const sandbox = Reflect.get(spec.config, 'sandbox');\n if (!isObject(sandbox)) return undefined;\n const enabled = Reflect.get(sandbox, 'enabled');\n return typeof enabled === 'boolean' ? enabled : undefined;\n}\n\nfunction readWebSearchEnabled(spec: AgentSpec): boolean | undefined {\n if (spec.config?.webSearch === undefined) return undefined;\n const enabled = spec.config.webSearch.enabled;\n return typeof enabled === 'boolean' ? enabled : undefined;\n}\n\n/** Disable sandbox when unavailable; availability must not override the user's runtime choice. */\nexport function withCapabilitiesSandbox(spec: AgentSpec, sandboxEnabled: boolean | null | undefined): AgentSpec {\n if (sandboxEnabled !== false || readSandboxEnabled(spec) === false) return spec;\n const config = {\n ...spec.config,\n sandbox: { ...spec.config?.sandbox, enabled: false },\n };\n return {\n ...spec,\n config,\n };\n}\n\n/**\n * Align `config.webSearch` with host capability.\n * - unavailable → force false\n * - chat + available → force true\n * - agent + available → fill true only when the key is absent (preserve explicit values)\n */\nexport function withCapabilitiesWebSearch({\n spec,\n webSearchEnabled,\n kind = 'agent',\n}: {\n spec: AgentSpec;\n webSearchEnabled: boolean | null | undefined;\n kind?: DraftPreferenceKind;\n}): AgentSpec {\n if (webSearchEnabled == null) return spec;\n\n if (webSearchEnabled === false) {\n if (readWebSearchEnabled(spec) === false) return spec;\n return {\n ...spec,\n config: {\n ...spec.config,\n webSearch: { ...spec.config?.webSearch, enabled: false },\n },\n };\n }\n\n if (kind === 'chat') {\n if (readWebSearchEnabled(spec) === true) return spec;\n return {\n ...spec,\n config: {\n ...spec.config,\n webSearch: { ...spec.config?.webSearch, enabled: true },\n },\n };\n }\n\n // Agent: only default true when the field is missing from the spec.\n if (spec.config?.webSearch !== undefined) return spec;\n return {\n ...spec,\n config: {\n ...spec.config,\n webSearch: { enabled: true },\n },\n };\n}\n\nfunction readStoredSpec(key: string): AgentSpec | null {\n if (typeof window === 'undefined') return null;\n try {\n const stored: unknown = JSON.parse(window.localStorage.getItem(key) ?? 'null');\n return isStoredDraftSpecPreferences(stored) ? stored.spec : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredSpec(key: string, spec: AgentSpec): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const stored: StoredDraftSpecPreferences = { version: 1, spec };\n window.localStorage.setItem(key, JSON.stringify(stored));\n return true;\n } catch {\n // Storage can be unavailable or full; in-memory carry-over still works.\n return false;\n }\n}\n\n/** One-shot split of the pre-split shared key into chat + agent stores. */\nfunction migrateLegacyDraftPreferences(): void {\n if (typeof window === 'undefined') return;\n const legacy = readStoredSpec(DRAFT_SPEC_PREFERENCES_STORAGE_KEY);\n if (legacy == null) return;\n\n const chatReady =\n readStoredSpec(CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY) != null ||\n writeStoredSpec(CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY, selectChatDraftSpecPreferences(legacy));\n const agentReady =\n readStoredSpec(AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY) != null ||\n writeStoredSpec(AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY, selectAgentDraftSpecPreferences(legacy));\n\n // Keep the legacy key if either destination write failed so a later read can retry.\n if (!chatReady || !agentReady) return;\n\n try {\n window.localStorage.removeItem(DRAFT_SPEC_PREFERENCES_STORAGE_KEY);\n } catch {\n // Ignore quota / private-mode failures; next read still prefers kind keys.\n }\n}\n\nexport function readDraftSpecPreferences(kind: DraftPreferenceKind): AgentSpec | null {\n migrateLegacyDraftPreferences();\n const stored = readStoredSpec(storageKeyForKind(kind));\n return stored == null ? null : selectDraftSpecPreferences(stored, kind);\n}\n\nexport function writeDraftSpecPreferences(kind: DraftPreferenceKind, spec: AgentSpec): void {\n writeStoredSpec(storageKeyForKind(kind), selectDraftSpecPreferences(spec, kind));\n}\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object';\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\nconst LITERAL_ESCAPE_PATTERN = /\\\\(?:[nrtbfv0'\"\\\\]|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/; // literal escape sequences like \\n, \\t, \\b, \\f, \\v, \\uXXXX, \\xHH\nconst REAL_CONTROL_PATTERN = /[\\n\\t\\b\\f\\v]/; // real control characters like \\n, \\t, \\b, \\f, \\v\n\nfunction decodeLiteralEscapes(text: string): string {\n let out = '';\n for (let i = 0; i < text.length; i += 1) {\n const char = text[i];\n if (char !== '\\\\' || i + 1 >= text.length) {\n out += char;\n continue;\n }\n\n const next = text[i + 1];\n switch (next) {\n case 'n':\n out += '\\n';\n i += 1;\n break;\n case 't':\n out += '\\t';\n i += 1;\n break;\n case 'r':\n out += '\\r';\n i += 1;\n break;\n case 'b':\n out += '\\b';\n i += 1;\n break;\n case 'f':\n out += '\\f';\n i += 1;\n break;\n case 'v':\n out += '\\v';\n i += 1;\n break;\n case '0':\n out += '\\0';\n i += 1;\n break;\n case '\\\\':\n out += '\\\\';\n i += 1;\n break;\n case '\"':\n out += '\"';\n i += 1;\n break;\n case \"'\":\n out += \"'\";\n i += 1;\n break;\n case 'u': {\n const hex = text.slice(i + 2, i + 6);\n if (/^[0-9a-fA-F]{4}$/.test(hex)) {\n out += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += char;\n }\n break;\n }\n case 'x': {\n const hex = text.slice(i + 2, i + 4);\n if (/^[0-9a-fA-F]{2}$/.test(hex)) {\n out += String.fromCharCode(Number.parseInt(hex, 16));\n i += 3;\n } else {\n out += char;\n }\n break;\n }\n default:\n out += char;\n break;\n }\n }\n return out;\n}\n\n// Decodes JSON/C-style escape sequences (e.g., \\n, \\t) in error messages, preserving real control characters and normalizing line endings.\nexport function decodeErrorMessageEscapes(text: string): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (REAL_CONTROL_PATTERN.test(normalized) || !LITERAL_ESCAPE_PATTERN.test(normalized)) {\n // If the string contains real control characters or no literal escape sequences, return the normalized string.\n return normalized;\n }\n // else decode the literal escape sequences and normalize line endings\n return decodeLiteralEscapes(normalized).replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\n/**\n * Reads a display string from API-shaped errors: `message`, then nested\n * `error.message`. When neither exists, stringifies the value.\n */\nfunction messageFromErrorShaped(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n const direct = readNonEmptyString(value.message);\n if (direct != null) return direct;\n if (isRecord(value.error)) {\n return readNonEmptyString(value.error.message);\n }\n return undefined;\n}\n\nfunction stringifyError(error: unknown): string {\n if (typeof error === 'string') return error;\n if (isRecord(error)) {\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n }\n return String(error);\n}\n\n/**\n * User-facing error text. Prefers HTTP body `{ error: { message } }` when\n * present (e.g. TrueForgeError), then `error.message` / `error.error.message`,\n * then `fallback`, then a string form of the value.\n *\n * Escape sequences (`\\n`, `\\t`, `\\r`, `\\uXXXX`, …) are decoded for display when\n * still present as literal text.\n */\nexport function getErrorMessage(error: unknown, fallback?: string): string {\n if (typeof error === 'string') {\n const trimmed = error.trim();\n if (trimmed !== '') return decodeErrorMessageEscapes(error);\n return fallback != null ? decodeErrorMessageEscapes(fallback) : decodeErrorMessageEscapes(error);\n }\n\n if (isRecord(error) && 'body' in error) {\n const fromBody = messageFromErrorShaped(error.body);\n if (fromBody != null) return decodeErrorMessageEscapes(fromBody);\n if (error.body != null) {\n if (typeof error.body === 'string') {\n const trimmed = error.body.trim();\n if (trimmed !== '') return decodeErrorMessageEscapes(error.body);\n } else {\n return stringifyError(error.body);\n }\n }\n }\n\n const fromShape = messageFromErrorShaped(error);\n if (fromShape != null) return decodeErrorMessageEscapes(fromShape);\n\n if (fallback != null) return decodeErrorMessageEscapes(fallback);\n return stringifyError(error);\n}\n"],"mappings":"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","names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","libraryAgentId","useCallback","useEffect","useMemo","useContext"]}
@@ -19,26 +19,26 @@ import {
19
19
  useOptionalApprovalFocus,
20
20
  useSlot,
21
21
  useSlotIsDefault
22
- } from "./chunk-KZK2PQ4A.js";
22
+ } from "./chunk-MLMR26WQ.js";
23
23
  import {
24
24
  DraftCatalogProvider,
25
25
  useDraftCatalog
26
- } from "./chunk-KDCVFHPZ.js";
26
+ } from "./chunk-TX6PB3DY.js";
27
27
  import {
28
28
  useOptionalCatalogServer,
29
29
  useOptionalServer,
30
30
  useOptionalShellMode
31
- } from "./chunk-U7WONUMR.js";
31
+ } from "./chunk-7S7A3PNP.js";
32
32
  import {
33
33
  useAui,
34
34
  useAuiState
35
35
  } from "./chunk-M6MHLVSO.js";
36
36
 
37
37
  // src/hooks/useApprovalNav.ts
38
- import { useTrueFoundryApprovals } from "@truefoundry/assistant-ui-runtime";
38
+ import { useTrueForgeApprovals } from "@truefoundry/trueforge-assistant-ui-runtime";
39
39
  import { useCallback, useEffect, useRef, useState } from "react";
40
40
  function useApprovalNav() {
41
- const { pending } = useTrueFoundryApprovals();
41
+ const { pending } = useTrueForgeApprovals();
42
42
  const focusApi = useOptionalApprovalFocus();
43
43
  const [selection, setSelection] = useState({
44
44
  approvalId: null,
@@ -108,13 +108,13 @@ function ApprovalNavContainer() {
108
108
 
109
109
  // src/containers/AskUserContainer.tsx
110
110
  import { useThreadIsRunning } from "@assistant-ui/core/react";
111
- import { useTrueFoundryToolResponses } from "@truefoundry/assistant-ui-runtime";
111
+ import { useTrueForgeToolResponses } from "@truefoundry/trueforge-assistant-ui-runtime";
112
112
  import { useCallback as useCallback2, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
113
113
  import { jsx as jsx2 } from "react/jsx-runtime";
114
114
  var EMPTY_ANSWER = { radioValue: "", custom: "" };
115
115
  function AskUserContainer({ disabled = false }) {
116
116
  const AskUserPrompt = useSlot("AskUserPrompt");
117
- const { pending, respond } = useTrueFoundryToolResponses();
117
+ const { pending, respond } = useTrueForgeToolResponses();
118
118
  const isRunning = useThreadIsRunning();
119
119
  const item = pending[0];
120
120
  const questions = useMemo(
@@ -189,7 +189,7 @@ function AskUserContainer({ disabled = false }) {
189
189
 
190
190
  // src/hooks/useComposerPauseView.ts
191
191
  import { useAuiState as useAuiState2 } from "@assistant-ui/react";
192
- import { useTrueFoundryApprovals as useTrueFoundryApprovals2, useTrueFoundryToolResponses as useTrueFoundryToolResponses2 } from "@truefoundry/assistant-ui-runtime";
192
+ import { useTrueForgeApprovals as useTrueForgeApprovals2, useTrueForgeToolResponses as useTrueForgeToolResponses2 } from "@truefoundry/trueforge-assistant-ui-runtime";
193
193
  function threadHasPendingMcpAuth(s) {
194
194
  const messages = s.thread.messages;
195
195
  const last = messages[messages.length - 1];
@@ -199,8 +199,8 @@ function threadHasPendingMcpAuth(s) {
199
199
  }
200
200
  function useComposerPauseView() {
201
201
  const mcpPending = useAuiState2(threadHasPendingMcpAuth);
202
- const { pending: toolResponsesPending } = useTrueFoundryToolResponses2();
203
- const { pending: approvalsPending } = useTrueFoundryApprovals2();
202
+ const { pending: toolResponsesPending } = useTrueForgeToolResponses2();
203
+ const { pending: approvalsPending } = useTrueForgeApprovals2();
204
204
  const customActionRenderers = useOptionalCustomActionRenderers();
205
205
  if (mcpPending) {
206
206
  return { kind: "mcp" };
@@ -221,12 +221,12 @@ function useComposerPauseView() {
221
221
 
222
222
  // src/containers/CustomActionContainer.tsx
223
223
  import { useThreadIsRunning as useThreadIsRunning2 } from "@assistant-ui/core/react";
224
- import { useTrueFoundryToolResponses as useTrueFoundryToolResponses3 } from "@truefoundry/assistant-ui-runtime";
224
+ import { useTrueForgeToolResponses as useTrueForgeToolResponses3 } from "@truefoundry/trueforge-assistant-ui-runtime";
225
225
  import { useCallback as useCallback3 } from "react";
226
226
  import { jsx as jsx3 } from "react/jsx-runtime";
227
227
  function CustomActionContainer({ disabled = false }) {
228
228
  const renderers = useOptionalCustomActionRenderers();
229
- const { pending, respond } = useTrueFoundryToolResponses3();
229
+ const { pending, respond } = useTrueForgeToolResponses3();
230
230
  const isRunning = useThreadIsRunning2();
231
231
  const item = pending[0];
232
232
  const onSubmit = useCallback3(
@@ -246,37 +246,72 @@ function CustomActionContainer({ disabled = false }) {
246
246
 
247
247
  // src/containers/McpAuthContainer.tsx
248
248
  import { useThreadIsRunning as useThreadIsRunning3 } from "@assistant-ui/core/react";
249
- import { useTrueFoundryMcpAuth } from "@truefoundry/assistant-ui-runtime";
249
+ import { useTrueForgeMcpAuth } from "@truefoundry/trueforge-assistant-ui-runtime";
250
+ import { useEffect as useEffect3, useRef as useRef2, useState as useState3 } from "react";
250
251
  import { jsx as jsx4 } from "react/jsx-runtime";
251
252
  function CatalogMcpAuthPrompt({ servers, onContinue, readOnly }) {
252
253
  const McpAuthPrompt = useSlot("McpAuthPrompt");
253
254
  const { handleAuthorize } = useMCPAuth();
254
255
  const { refreshConnectors } = useDraftCatalog();
256
+ const [connectedServerIds, setConnectedServerIds] = useState3(() => /* @__PURE__ */ new Set());
257
+ const connectedServerIdsRef = useRef2(connectedServerIds);
258
+ const [isResuming, setIsResuming] = useState3(false);
259
+ const resumedRef = useRef2(false);
260
+ const promptGenerationRef = useRef2(0);
261
+ useEffect3(
262
+ () => () => {
263
+ promptGenerationRef.current += 1;
264
+ },
265
+ []
266
+ );
267
+ const startResume = () => {
268
+ if (readOnly || resumedRef.current) return;
269
+ resumedRef.current = true;
270
+ setIsResuming(true);
271
+ void onContinue().catch(() => {
272
+ resumedRef.current = false;
273
+ setIsResuming(false);
274
+ });
275
+ };
255
276
  const handleConnect = (serverId) => {
277
+ const generation = promptGenerationRef.current;
256
278
  void handleAuthorize(serverId, (isSuccess) => {
257
- if (isSuccess) {
258
- void refreshConnectors();
259
- }
279
+ if (generation !== promptGenerationRef.current || !isSuccess) return;
280
+ const nextConnectedServerIds = /* @__PURE__ */ new Set([...connectedServerIdsRef.current, serverId]);
281
+ connectedServerIdsRef.current = nextConnectedServerIds;
282
+ setConnectedServerIds(nextConnectedServerIds);
283
+ void refreshConnectors();
284
+ if (servers.every((server) => nextConnectedServerIds.has(server.id))) startResume();
260
285
  });
261
286
  };
262
- return /* @__PURE__ */ jsx4(McpAuthPrompt, { servers, onConnect: handleConnect, onContinue, readOnly });
287
+ return /* @__PURE__ */ jsx4(
288
+ McpAuthPrompt,
289
+ {
290
+ servers,
291
+ connectedServerIds,
292
+ continueLoading: isResuming,
293
+ onConnect: handleConnect,
294
+ onContinue: startResume,
295
+ readOnly
296
+ }
297
+ );
263
298
  }
264
299
  function McpAuthContainer({ disabled = false }) {
265
300
  const McpAuthPrompt = useSlot("McpAuthPrompt");
266
- const { pending, resume } = useTrueFoundryMcpAuth();
301
+ const { pending, resume } = useTrueForgeMcpAuth();
267
302
  const isRunning = useThreadIsRunning3();
268
303
  const catalog = useOptionalCatalogServer();
269
304
  if (!pending) return null;
270
305
  if (catalog) {
306
+ const pendingServerKey = JSON.stringify(pending.mcpServers.map((server) => server.id));
271
307
  return /* @__PURE__ */ jsx4(
272
308
  CatalogMcpAuthPrompt,
273
309
  {
274
310
  servers: pending.mcpServers,
275
- onContinue: () => {
276
- if (!disabled) void resume();
277
- },
311
+ onContinue: resume,
278
312
  readOnly: isRunning || disabled
279
- }
313
+ },
314
+ pendingServerKey
280
315
  );
281
316
  }
282
317
  const handleConnect = (serverId) => {
@@ -300,8 +335,8 @@ function McpAuthContainer({ disabled = false }) {
300
335
 
301
336
  // src/containers/ComposerContainer.tsx
302
337
  import { ComposerPrimitive, useAui as useAui2, useAuiState as useAuiState3 } from "@assistant-ui/react";
303
- import { useTrueFoundryAgentSpec, useTrueFoundryCancel } from "@truefoundry/assistant-ui-runtime";
304
- import { useRef as useRef2 } from "react";
338
+ import { useTrueForgeAgentSpec, useTrueForgeCancel } from "@truefoundry/trueforge-assistant-ui-runtime";
339
+ import { useRef as useRef3 } from "react";
305
340
  import { Fragment, jsx as jsx5, jsxs } from "react/jsx-runtime";
306
341
  function canSubmitComposer({
307
342
  disabled,
@@ -322,13 +357,13 @@ function ComposerBody({
322
357
  const shell = useOptionalShellMode();
323
358
  const hasText = useAuiState3((s) => s.composer.text.trim().length > 0);
324
359
  const hasAttachments = useAuiState3((s) => s.composer.attachments.length > 0);
325
- const { agentSpec } = useTrueFoundryAgentSpec();
360
+ const { agentSpec } = useTrueForgeAgentSpec();
326
361
  const requiresModel = shell == null || shell.mode.status === "active" && shell.mode.isMutable;
327
362
  const hasModel = Boolean(agentSpec?.model?.name?.trim());
328
363
  const { isBusy, send, resetBusy } = useComposerBusyState();
329
364
  const canManageSession = useActiveSessionCanManage();
330
- const cancel = useTrueFoundryCancel();
331
- const fileInputRef = useRef2(null);
365
+ const cancel = useTrueForgeCancel();
366
+ const fileInputRef = useRef3(null);
332
367
  const disabled = isBusy || forceDisabled || !canManageSession;
333
368
  const canSubmit = canSubmitComposer({ disabled, hasText, hasAttachments, requiresModel, hasModel });
334
369
  const submit = () => {
@@ -456,16 +491,16 @@ function ComposerContainer({
456
491
  }
457
492
 
458
493
  // src/containers/HistoryLoaderContainer.tsx
459
- import { useTrueFoundryHistoryPagination } from "@truefoundry/assistant-ui-runtime";
460
- import { useCallback as useCallback4, useEffect as useEffect3, useRef as useRef3, useState as useState3 } from "react";
494
+ import { useTrueForgeHistoryPagination } from "@truefoundry/trueforge-assistant-ui-runtime";
495
+ import { useCallback as useCallback4, useEffect as useEffect4, useRef as useRef4, useState as useState4 } from "react";
461
496
  import { jsx as jsx6 } from "react/jsx-runtime";
462
497
  var TOP_THRESHOLD_PX = 200;
463
498
  var VIEWPORT_SELECTOR = '[data-slot="aui_thread-viewport"]';
464
499
  function HistoryLoaderContainer() {
465
500
  const HistoryLoader = useSlot("HistoryLoader");
466
- const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueFoundryHistoryPagination();
467
- const [sentinel, setSentinel] = useState3(null);
468
- const inflightRef = useRef3(false);
501
+ const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueForgeHistoryPagination();
502
+ const [sentinel, setSentinel] = useState4(null);
503
+ const inflightRef = useRef4(false);
469
504
  const maybeLoadOlder = useCallback4(async () => {
470
505
  if (inflightRef.current) return;
471
506
  inflightRef.current = true;
@@ -486,7 +521,7 @@ function HistoryLoaderContainer() {
486
521
  inflightRef.current = false;
487
522
  }
488
523
  }, [sentinel, loadOlderHistory]);
489
- useEffect3(() => {
524
+ useEffect4(() => {
490
525
  if (sentinel == null || !hasOlderHistory) return;
491
526
  const viewport = sentinel.closest(VIEWPORT_SELECTOR);
492
527
  const observer = new IntersectionObserver(
@@ -505,11 +540,11 @@ function HistoryLoaderContainer() {
505
540
  }
506
541
 
507
542
  // src/containers/ResumeUnavailableContainer.tsx
508
- import { useTrueFoundryResumeUnavailable } from "@truefoundry/assistant-ui-runtime";
543
+ import { useTrueForgeResumeUnavailable } from "@truefoundry/trueforge-assistant-ui-runtime";
509
544
  import { jsx as jsx7 } from "react/jsx-runtime";
510
545
  function ResumeUnavailableContainer() {
511
546
  const ResumeUnavailable = useSlot("ResumeUnavailable");
512
- const resumeUnavailable = useTrueFoundryResumeUnavailable();
547
+ const resumeUnavailable = useTrueForgeResumeUnavailable();
513
548
  if (!resumeUnavailable) return null;
514
549
  return /* @__PURE__ */ jsx7(ResumeUnavailable, {});
515
550
  }
@@ -565,23 +600,23 @@ function UserEditComposerContainer() {
565
600
 
566
601
  // src/containers/ThreadContainer.tsx
567
602
  import { ThreadPrimitive, useAuiState as useAuiState5 } from "@assistant-ui/react";
568
- import { useEffect as useEffect5 } from "react";
603
+ import { useEffect as useEffect6 } from "react";
569
604
 
570
605
  // src/hooks/useSyncSessionTitle.ts
571
606
  import { useThreadIsRunning as useThreadIsRunning5 } from "@assistant-ui/core/react";
572
- import { useEffect as useEffect4, useRef as useRef4 } from "react";
607
+ import { useEffect as useEffect5, useRef as useRef5 } from "react";
573
608
  function useSyncSessionTitle() {
574
609
  const server = useOptionalServer();
575
610
  const aui = useAui();
576
611
  const remoteId = useAuiState((s) => s.threadListItem.remoteId);
577
612
  const title = useAuiState((s) => s.threadListItem.title);
578
613
  const isRunning = useThreadIsRunning5();
579
- const wasRunningRef = useRef4(false);
580
- const syncedRemoteIdRef = useRef4(void 0);
581
- useEffect4(() => {
614
+ const wasRunningRef = useRef5(false);
615
+ const syncedRemoteIdRef = useRef5(void 0);
616
+ useEffect5(() => {
582
617
  syncedRemoteIdRef.current = void 0;
583
618
  }, [remoteId]);
584
- useEffect4(() => {
619
+ useEffect5(() => {
585
620
  const finishedTurn = wasRunningRef.current && !isRunning;
586
621
  wasRunningRef.current = isRunning;
587
622
  if (!finishedTurn || server == null || remoteId == null) {
@@ -624,7 +659,7 @@ function ThreadMessage({ isEditing }) {
624
659
  return /* @__PURE__ */ jsx9(AssistantMessageContainer, {});
625
660
  }
626
661
  function ThreadContainer({ composer }) {
627
- useEffect5(() => {
662
+ useEffect6(() => {
628
663
  void preloadMarkdownOpenUI();
629
664
  }, []);
630
665
  useSyncSessionTitle();
@@ -679,4 +714,4 @@ export {
679
714
  ThreadContainer,
680
715
  Thread
681
716
  };
682
- //# sourceMappingURL=chunk-VTOW2UIX.js.map
717
+ //# sourceMappingURL=chunk-GHXA46A2.js.map