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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +17 -9
  3. package/dist/{AgentCodeSnippets-637HQUXD.js → AgentCodeSnippets-N546FNNS.js} +38 -23
  4. package/dist/AgentCodeSnippets-N546FNNS.js.map +1 -0
  5. package/dist/AgentMetricChart-YWJYVYYA.js +15 -0
  6. package/dist/{AgentOverview-3FJ5EE6N.js → AgentOverview-VF74XC7I.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-VELWUYPR.js → AgentSessionEventTimeline-RFR6LQMY.js} +8 -8
  8. package/dist/{AgentSessionEventTimeline-VELWUYPR.js.map → AgentSessionEventTimeline-RFR6LQMY.js.map} +1 -1
  9. package/dist/{AgentSessionEventTimelineChart-CUKETHWM.js → AgentSessionEventTimelineChart-27CQF6FX.js} +12 -12
  10. package/dist/AgentSessionEventTimelineChart-27CQF6FX.js.map +1 -0
  11. package/dist/{AgentSessions-T7MOGOTZ.js → AgentSessions-4IVX2SGD.js} +36 -12
  12. package/dist/AgentSessions-4IVX2SGD.js.map +1 -0
  13. package/dist/{ConnectorSettings-ESZ2RSRG.js → ConnectorSettings-R5VEP7BO.js} +156 -116
  14. package/dist/ConnectorSettings-R5VEP7BO.js.map +1 -0
  15. package/dist/{DockLayout-NLFNU6F2.js → DockLayout-F44RWGEY.js} +10 -10
  16. package/dist/{DrawerLayout-PR3SMKA6.js → DrawerLayout-SQ323AVM.js} +13 -11
  17. package/dist/DrawerLayout-SQ323AVM.js.map +1 -0
  18. package/dist/{ModelSettings-LYW64IRR.js → ModelSettings-6QLS63HM.js} +10 -10
  19. package/dist/{ModelSettings-LYW64IRR.js.map → ModelSettings-6QLS63HM.js.map} +1 -1
  20. package/dist/OpenUiFenceBlock-4ROX3G4X.js +9 -0
  21. package/dist/{SandboxSettings-DF64LHYI.js → SandboxSettings-OLKDXIQS.js} +9 -9
  22. package/dist/SchedulesPage-TMOTK6DR.js +15 -0
  23. package/dist/{SettingsBuilder-LSXK2VN4.js → SettingsBuilder-GISAH2WU.js} +8 -8
  24. package/dist/{ShellRouteSync-B22IAV2W.js → ShellRouteSync-EN33DUQ7.js} +157 -22
  25. package/dist/ShellRouteSync-EN33DUQ7.js.map +1 -0
  26. package/dist/{SidebarLayout-XW6LXB7R.js → SidebarLayout-35K4AKTC.js} +74 -53
  27. package/dist/SidebarLayout-35K4AKTC.js.map +1 -0
  28. package/dist/{SkillSettings-64VXUO6J.js → SkillSettings-JSX2BTII.js} +18 -13
  29. package/dist/SkillSettings-JSX2BTII.js.map +1 -0
  30. package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js → TrueForgeUIWithRouter-6VCR7ES3.js} +9 -9
  31. package/dist/{WidgetLayout-Q5P7PYSJ.js → WidgetLayout-RKBSN2FZ.js} +10 -10
  32. package/dist/{chunk-YQO2NMJ3.js → chunk-2O5EJ6QS.js} +4096 -2825
  33. package/dist/chunk-2O5EJ6QS.js.map +1 -0
  34. package/dist/chunk-6WCIL3H2.js +517 -0
  35. package/dist/chunk-6WCIL3H2.js.map +1 -0
  36. package/dist/{chunk-SQGT43Z3.js → chunk-73FQVITT.js} +21 -4
  37. package/dist/chunk-73FQVITT.js.map +1 -0
  38. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  39. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  40. package/dist/{chunk-LGRHHFHN.js → chunk-F5QVQIBH.js} +166 -45
  41. package/dist/chunk-F5QVQIBH.js.map +1 -0
  42. package/dist/{chunk-I3AL54MA.js → chunk-GIPFF6FZ.js} +28 -24
  43. package/dist/chunk-GIPFF6FZ.js.map +1 -0
  44. package/dist/{chunk-GXYAOAK5.js → chunk-GSJAYYLR.js} +219 -162
  45. package/dist/chunk-GSJAYYLR.js.map +1 -0
  46. package/dist/{chunk-VJ7BZGAF.js → chunk-J5BPHEDT.js} +2 -2
  47. package/dist/chunk-KR7WYHVF.js +195 -0
  48. package/dist/chunk-KR7WYHVF.js.map +1 -0
  49. package/dist/{chunk-VUMGMGKZ.js → chunk-LUG7E6BL.js} +52 -8
  50. package/dist/chunk-LUG7E6BL.js.map +1 -0
  51. package/dist/chunk-LXJMINS6.js +587 -0
  52. package/dist/chunk-LXJMINS6.js.map +1 -0
  53. package/dist/{chunk-FQK2XVVE.js → chunk-PT4EENB3.js} +224 -72
  54. package/dist/chunk-PT4EENB3.js.map +1 -0
  55. package/dist/{chunk-H6WTY5PM.js → chunk-Q6TCT7ZJ.js} +17 -227
  56. package/dist/chunk-Q6TCT7ZJ.js.map +1 -0
  57. package/dist/{chunk-5I2COQNL.js → chunk-XLFOXQKZ.js} +13 -11
  58. package/dist/chunk-XLFOXQKZ.js.map +1 -0
  59. package/dist/{chunk-G2TUAD65.js → chunk-XY6LZQES.js} +235 -108
  60. package/dist/chunk-XY6LZQES.js.map +1 -0
  61. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  62. package/dist/index.d.ts +291 -89
  63. package/dist/index.js +63 -488
  64. package/dist/index.js.map +1 -1
  65. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +36 -13
  66. package/dist/plugins/trueforge-agent-server-adapter/index.js +69 -35
  67. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  68. package/dist/styles.css +1 -1
  69. package/package.json +3 -3
  70. package/dist/AgentCodeSnippets-637HQUXD.js.map +0 -1
  71. package/dist/AgentMetricChart-4FYECRIN.js +0 -15
  72. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +0 -1
  73. package/dist/AgentSessions-T7MOGOTZ.js.map +0 -1
  74. package/dist/ConnectorSettings-ESZ2RSRG.js.map +0 -1
  75. package/dist/DrawerLayout-PR3SMKA6.js.map +0 -1
  76. package/dist/OpenUiFenceBlock-JEPNPJ7U.js +0 -9
  77. package/dist/SchedulesPage-WQU4H25F.js +0 -15
  78. package/dist/ShellRouteSync-B22IAV2W.js.map +0 -1
  79. package/dist/SidebarLayout-XW6LXB7R.js.map +0 -1
  80. package/dist/SkillSettings-64VXUO6J.js.map +0 -1
  81. package/dist/chunk-5I2COQNL.js.map +0 -1
  82. package/dist/chunk-BWHOZFIV.js +0 -587
  83. package/dist/chunk-BWHOZFIV.js.map +0 -1
  84. package/dist/chunk-FQK2XVVE.js.map +0 -1
  85. package/dist/chunk-G2TUAD65.js.map +0 -1
  86. package/dist/chunk-GXYAOAK5.js.map +0 -1
  87. package/dist/chunk-H6WTY5PM.js.map +0 -1
  88. package/dist/chunk-I3AL54MA.js.map +0 -1
  89. package/dist/chunk-LGRHHFHN.js.map +0 -1
  90. package/dist/chunk-NHHSZB5N.js +0 -74
  91. package/dist/chunk-NHHSZB5N.js.map +0 -1
  92. package/dist/chunk-QC42MLAK.js.map +0 -1
  93. package/dist/chunk-SFZNIO6U.js +0 -18
  94. package/dist/chunk-SFZNIO6U.js.map +0 -1
  95. package/dist/chunk-SQGT43Z3.js.map +0 -1
  96. package/dist/chunk-VUMGMGKZ.js.map +0 -1
  97. package/dist/chunk-YQO2NMJ3.js.map +0 -1
  98. /package/dist/{AgentMetricChart-4FYECRIN.js.map → AgentMetricChart-YWJYVYYA.js.map} +0 -0
  99. /package/dist/{AgentOverview-3FJ5EE6N.js.map → AgentOverview-VF74XC7I.js.map} +0 -0
  100. /package/dist/{DockLayout-NLFNU6F2.js.map → DockLayout-F44RWGEY.js.map} +0 -0
  101. /package/dist/{OpenUiFenceBlock-JEPNPJ7U.js.map → OpenUiFenceBlock-4ROX3G4X.js.map} +0 -0
  102. /package/dist/{SandboxSettings-DF64LHYI.js.map → SandboxSettings-OLKDXIQS.js.map} +0 -0
  103. /package/dist/{SchedulesPage-WQU4H25F.js.map → SchedulesPage-TMOTK6DR.js.map} +0 -0
  104. /package/dist/{SettingsBuilder-LSXK2VN4.js.map → SettingsBuilder-GISAH2WU.js.map} +0 -0
  105. /package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js.map → TrueForgeUIWithRouter-6VCR7ES3.js.map} +0 -0
  106. /package/dist/{WidgetLayout-Q5P7PYSJ.js.map → WidgetLayout-RKBSN2FZ.js.map} +0 -0
  107. /package/dist/{chunk-VJ7BZGAF.js.map → chunk-J5BPHEDT.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/serverChrome.ts","../src/server/ServerContext.tsx","../src/utils/sessionShareUrl.ts","../src/server/ShellModeContext.tsx","../src/server/draftSpecPreferences.ts"],"sourcesContent":["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 !== false;\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 {\n AgentBuilderCapabilitiesResponse,\n AgentMetricsServer,\n AgentSessionsServer,\n AgentUIServer,\n CatalogServer,\n ScheduleServer,\n} from './types.js';\n\nconst ServerContext = createContext<AgentUIServer | null>(null);\nconst ServerCapabilitiesContext = createContext<{\n capabilities: AgentBuilderCapabilitiesResponse['data'] | null;\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 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 }, [server]);\n\n useEffect(() => {\n setCapabilities(null);\n refreshCapabilities();\n return () => {\n cancelActiveRequestRef.current?.();\n };\n }, [refreshCapabilities]);\n\n const capabilitiesValue = useMemo(\n () => ({ capabilities, refresh: refreshCapabilities }),\n [capabilities, 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 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 createTrueFoundryServer.');\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 createTrueFoundryServer.');\n }\n return server.schedules;\n}\n\nexport function useOptionalScheduleServer(): ScheduleServer | null {\n return useOptionalServer()?.schedules ?? 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;\n\nexport type LibraryAgentTab = 'overview' | 'sessions' | '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 (value === 'overview' || value === 'sessions' || value === 'code' || value === 'metrics') return value;\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 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 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: Date.now() - timeWindowMs, endTs: Date.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","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport { replaceSessionShareSearch } from '../utils/sessionShareUrl.js';\nimport {\n readDraftSpecPreferences,\n selectDraftSpecPreferences,\n withCapabilitiesSandbox,\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 /** 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 agentSpec?: AgentSpec;\n};\n\nexport type SettingsSection = 'models' | 'connectors' | 'skills' | 'sandbox';\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; 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, remounting when mutability/identity changes.\n * Prefer explicit `isMutable` from the session row; when omitted, agentName\n * present → immutable and agentName absent → mutable. Immutable rows may omit\n * `agentName` when the registry agent was deleted.\n * `isCreateAgent` is only applied when mutable (default false when omitted).\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 /** Remount key for the chat runtime when binding changes. */\n runtimeKey: string;\n /**\n * History list filter forwarded as `listSessions({ agentId })`.\n * `null` = All chats. Only meaningful when `isLibraryEnabled`.\n */\n historyAgentFilter: string | null;\n setHistoryAgentFilter: (agentId: string | null) => void;\n /** Effective `listSessionsAgentId` for the runtime (SingleAgent locks to name). */\n listSessionsAgentId: string | undefined;\n /** Session to open after a binding remount (history click across mutability). */\n pendingSessionId: string | undefined;\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<string | null>(null);\n const [pendingSessionId, setPendingSessionId] = useState<string | undefined>(undefined);\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 (!settingsEnabled) {\n setSettingsOpenState(false);\n }\n }, [settingsEnabled]);\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 ?? undefined;\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 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 bumpEpoch(false);\n },\n [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen, setSessionsOpen, setSchedulesOpen],\n );\n\n const bindMutableAgent = useCallback(\n (req: { agentId: string; agentName: 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 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 selectLibraryAgent({ isMutable: true, isCreateAgent: false, agentSpec: chatSeedRef.current });\n }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);\n\n const openAgentBuilder = useCallback(() => {\n if (!isComposerEnabled) return;\n refreshCapabilities?.();\n selectLibraryAgent({ isMutable: true, isCreateAgent: true, agentSpec: agentSeedRef.current });\n }, [isComposerEnabled, refreshCapabilities, selectLibraryAgent]);\n\n const sandboxEnabled = capabilities?.sandbox.enabled;\n const rememberDraftSpec = useCallback(\n (agentSpec: AgentSpec, kind: DraftPreferenceKind = 'chat') => {\n const selected = selectDraftSpecPreferences(agentSpec, kind);\n const preferences = kind === 'agent' ? withCapabilitiesSandbox(selected, sandboxEnabled) : selected;\n if (kind === 'chat') {\n chatSeedRef.current = preferences;\n } else {\n agentSeedRef.current = preferences;\n }\n writeDraftSpecPreferences(kind, preferences);\n },\n [sandboxEnabled],\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 setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(sessionId);\n const isMutable = isMutableOpt ?? agentName == null;\n if (isMutable) {\n if (!isComposerEnabled) return;\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 bumpEpoch(true);\n return;\n }\n // Immutable: allow orphaned refs (deleted agent → no agentName).\n if (locked) {\n if (agentName == null || lockedAgentName !== agentName) return;\n } else if (!isLibraryEnabled) {\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 bumpEpoch(false);\n },\n [\n isLibraryEnabled,\n isComposerEnabled,\n locked,\n lockedAgentName,\n bumpEpoch,\n setSettingsOpen,\n setSessionsOpen,\n setSchedulesOpen,\n ],\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 // Mutable remounts are driven only by mutableEpoch (library Edit / New Chat / Clear).\n // Agent id and model must not be in the key — saveAgent binds those onto the same draft.\n const runtimeKey = useMemo(() => {\n if (effectiveMode.status === 'idle') return 'idle';\n if (effectiveMode.isMutable) {\n return `mut:${pendingSessionId ?? ''}:${mutableEpoch}`;\n }\n const id = effectiveMode.agentId ?? effectiveMode.agentName ?? '';\n return `immut:${id}:${pendingSessionId ?? ''}:${clearEpoch}`;\n }, [effectiveMode, mutableEpoch, clearEpoch, pendingSessionId]);\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 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 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\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\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"],"mappings":"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","names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","libraryAgentId","useCallback","useEffect","useMemo","useContext"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/containers/AskUserContainer.tsx","../src/hooks/useComposerPauseView.ts","../src/containers/CustomActionContainer.tsx","../src/containers/McpAuthContainer.tsx","../src/containers/ComposerContainer.tsx","../src/containers/HistoryLoaderContainer.tsx","../src/containers/ResumeUnavailableContainer.tsx","../src/containers/UserEditComposerContainer.tsx","../src/containers/ThreadContainer.tsx","../src/hooks/useSyncSessionTitle.ts","../src/containers/Thread.tsx"],"sourcesContent":["'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ASK_USER_CUSTOM_OPTION,\n type AskUserAnswerDraft,\n type Question,\n} from '../atoms/adapters/AskUserPromptAdapter.js';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nconst EMPTY_ANSWER: AskUserAnswerDraft = { radioValue: '', custom: '' };\n\nexport function AskUserContainer() {\n const AskUserPrompt = useSlot('AskUserPrompt');\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const questions = useMemo<Question[]>(\n () =>\n item == null\n ? []\n : [\n {\n id: item.toolCallId,\n question: item.question ?? 'Answer required',\n options: item.options ?? [],\n },\n ],\n [item],\n );\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0);\n const [answers, setAnswers] = useState<Record<string, AskUserAnswerDraft>>({});\n\n useEffect(() => {\n setCurrentQuestionIndex(0);\n setAnswers({});\n }, [item?.toolCallId]);\n\n const safeIndex = Math.min(currentQuestionIndex, Math.max(questions.length - 1, 0));\n const currentQuestion = questions[safeIndex];\n const currentAnswer = currentQuestion == null ? EMPTY_ANSWER : (answers[currentQuestion.id] ?? EMPTY_ANSWER);\n const getResponseForQuestion = useCallback(\n (questionId: string) => {\n const answer = answers[questionId] ?? EMPTY_ANSWER;\n return answer.radioValue === ASK_USER_CUSTOM_OPTION ? answer.custom.trim() : answer.radioValue.trim();\n },\n [answers],\n );\n const allQuestionsAnswered = useMemo(\n () => questions.every(question => getResponseForQuestion(question.id)),\n [getResponseForQuestion, questions],\n );\n const selectedResponse =\n currentAnswer.radioValue === ASK_USER_CUSTOM_OPTION ? currentAnswer.custom.trim() : currentAnswer.radioValue.trim();\n const isSubmitDisabled = isRunning || currentQuestion == null || selectedResponse.length === 0;\n const isSubmitAllDisabled = isSubmitDisabled || !allQuestionsAnswered;\n\n const onCurrentAnswerChange = useCallback((questionId: string, update: Partial<AskUserAnswerDraft>) => {\n setAnswers(previous => ({\n ...previous,\n [questionId]: {\n ...(previous[questionId] ?? EMPTY_ANSWER),\n ...update,\n },\n }));\n }, []);\n\n const onSubmit = useCallback(() => {\n if (item == null || !allQuestionsAnswered) return;\n const content = getResponseForQuestion(item.toolCallId);\n if (!content) return;\n respond({ toolCallId: item.toolCallId, content });\n }, [allQuestionsAnswered, getResponseForQuestion, item, respond]);\n\n if (item == null || currentQuestion == null) return null;\n\n return (\n <AskUserPrompt\n questions={questions}\n readOnly={isRunning}\n currentQuestion={currentQuestion}\n currentQuestionIndex={safeIndex}\n currentAnswer={currentAnswer}\n totalQuestions={questions.length}\n isMultiQuestion={questions.length > 1}\n isLastQuestion={safeIndex === questions.length - 1}\n allQuestionsAnswered={allQuestionsAnswered}\n isSubmitDisabled={isSubmitDisabled}\n isSubmitAllDisabled={isSubmitAllDisabled}\n onCurrentQuestionIndexChange={setCurrentQuestionIndex}\n onCurrentAnswerChange={onCurrentAnswerChange}\n onSubmit={onSubmit}\n />\n );\n}\n","'use client';\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\n\nimport { useOptionalCustomActionRenderers } from '../server/CustomActionRenderersContext.js';\n\nexport type ThreadPauseState = {\n thread: {\n messages: readonly {\n role: string;\n status?: { type: string };\n metadata?: { custom?: unknown };\n }[];\n };\n};\n\n/** Returns true when the latest assistant message is paused for MCP authorization. */\nexport function threadHasPendingMcpAuth(s: ThreadPauseState): boolean {\n const messages = s.thread.messages;\n const last = messages[messages.length - 1];\n if (last?.role !== 'assistant') return false;\n if (last.status?.type !== 'requires-action') return false;\n return (last.metadata?.custom as { pendingMcpAuth?: boolean } | undefined)?.pendingMcpAuth === true;\n}\n\nexport type ComposerPauseView =\n { kind: 'mcp' } | { kind: 'custom'; toolName: string } | { kind: 'ask-user' } | { kind: 'compose' };\n\n/** Shared composer pause detection for default and custom composer containers. */\nexport function useComposerPauseView(): ComposerPauseView {\n const mcpPending = useAuiState(threadHasPendingMcpAuth);\n const { pending: toolResponsesPending } = useTrueFoundryToolResponses();\n const customActionRenderers = useOptionalCustomActionRenderers();\n\n if (mcpPending) {\n return { kind: 'mcp' };\n }\n\n const firstPending = toolResponsesPending[0];\n if (firstPending != null) {\n const toolName = firstPending.toolName;\n if (toolName != null && customActionRenderers?.[toolName] != null) {\n return { kind: 'custom', toolName };\n }\n return { kind: 'ask-user' };\n }\n\n return { kind: 'compose' };\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryToolResponses } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback } from 'react';\n\nimport { useOptionalCustomActionRenderers } from '../server/CustomActionRenderersContext.js';\n\n/** Host custom-action UI for a pending client-side tool response. */\nexport function CustomActionContainer() {\n const renderers = useOptionalCustomActionRenderers();\n const { pending, respond } = useTrueFoundryToolResponses();\n const isRunning = useThreadIsRunning();\n const item = pending[0];\n\n const onSubmit = useCallback(\n (content: string) => {\n if (item == null) return;\n const trimmed = content.trim();\n if (!trimmed) return;\n respond({ toolCallId: item.toolCallId, content: trimmed });\n },\n [item, respond],\n );\n\n if (item == null || item.toolName == null) return null;\n const Renderer = renderers?.[item.toolName];\n if (Renderer == null) return null;\n\n return <Renderer args={item.args ?? {}} disabled={isRunning} onSubmit={onSubmit} />;\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useTrueFoundryMcpAuth } from '@truefoundry/assistant-ui-runtime';\n\nimport { useDraftCatalog } from '@/atoms/draft/DraftCatalogProvider.js';\nimport { useMCPAuth } from '@/hooks/useMcpAuth.js';\nimport { useOptionalCatalogServer } from '@/server/ServerContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\n\ntype McpAuthPromptProps = {\n servers: NonNullable<ReturnType<typeof useTrueFoundryMcpAuth>['pending']>['mcpServers'];\n onContinue: () => void;\n readOnly: boolean;\n};\n\nfunction CatalogMcpAuthPrompt({ servers, onContinue, readOnly }: McpAuthPromptProps) {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { handleAuthorize } = useMCPAuth();\n const { refreshConnectors } = useDraftCatalog();\n\n const handleConnect = (serverId: string) => {\n void handleAuthorize(serverId, isSuccess => {\n if (isSuccess) {\n void refreshConnectors();\n }\n });\n };\n\n return <McpAuthPrompt servers={servers} onConnect={handleConnect} onContinue={onContinue} readOnly={readOnly} />;\n}\n\nexport function McpAuthContainer() {\n const McpAuthPrompt = useSlot('McpAuthPrompt');\n const { pending, resume } = useTrueFoundryMcpAuth();\n const isRunning = useThreadIsRunning();\n const catalog = useOptionalCatalogServer();\n\n if (!pending) return null;\n\n if (catalog) {\n return <CatalogMcpAuthPrompt servers={pending.mcpServers} onContinue={() => void resume()} readOnly={isRunning} />;\n }\n\n const handleConnect = (serverId: string) => {\n const server = pending.mcpServers.find(s => s.id === serverId);\n if (server?.authUrl) {\n window.open(server.authUrl, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <McpAuthPrompt\n servers={pending.mcpServers}\n onConnect={handleConnect}\n onContinue={() => void resume()}\n readOnly={isRunning}\n />\n );\n}\n","'use client';\n\nimport { ComposerPrimitive, useAui, useAuiState } from '@assistant-ui/react';\nimport { useTrueFoundryAgentSpec, useTrueFoundryCancel } from '@truefoundry/assistant-ui-runtime';\nimport { useRef } from 'react';\n\nimport { DraftCatalogProvider } from '../atoms/draft/DraftCatalogProvider.js';\nimport { useComposerBusyState } from '../hooks/useComposerBusyState.js';\nimport { useComposerPauseView } from '../hooks/useComposerPauseView.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { SlotsProvider, useSlot, useSlotIsDefault } from '../theme/SlotsProvider.js';\nimport { AskUserContainer } from './AskUserContainer.js';\nimport { ComposerAttachmentsContainer } from './AttachmentsContainer.js';\nimport { CustomActionContainer } from './CustomActionContainer.js';\nimport { McpAuthContainer } from './McpAuthContainer.js';\n\nexport type ComposerContainerProps = {\n placeholder?: string;\n};\n\nfunction ComposerBody({ placeholder }: { placeholder: string }) {\n const ComposerShell = useSlot('ComposerShell');\n const aui = useAui();\n const shell = useOptionalShellMode();\n const hasText = useAuiState(s => s.composer.text.trim().length > 0);\n const { agentSpec } = useTrueFoundryAgentSpec();\n // Named (immutable) agents use a server-side model; only draft/mutable composers pick one here.\n const requiresModel = shell == null || (shell.mode.status === 'active' && shell.mode.isMutable);\n const hasModel = Boolean(agentSpec?.model?.name?.trim());\n const { isBusy, send, resetBusy } = useComposerBusyState();\n const cancel = useTrueFoundryCancel();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const canSubmit = !isBusy && hasText && (!requiresModel || hasModel);\n const submit = () => {\n if (!canSubmit) return;\n send(() => aui.composer().send());\n };\n\n return (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n hidden\n onChange={event => {\n const files = event.target.files;\n if (files) {\n for (const file of files) {\n void aui.composer().addAttachment(file);\n }\n }\n event.target.value = '';\n }}\n />\n <ComposerPrimitive.AttachmentDropzone\n disabled={isBusy}\n data-slot=\"aui_composer-attachment-dropzone\"\n className=\"w-full rounded-[0.75rem] transition-[box-shadow] data-[dragging=true]:ring-focus-ring/20 data-[dragging=true]:ring-3\"\n >\n <ComposerPrimitive.Root\n data-slot=\"aui_composer-root\"\n className=\"w-full\"\n onSubmit={event => {\n // Suppresses the primitive's own send so submits route through the busy-state wrapper.\n event.preventDefault();\n submit();\n }}\n >\n <ComposerShell\n attachments={<ComposerAttachmentsContainer />}\n input={\n <ComposerPrimitive.Input\n data-slot=\"aui_composer-input\"\n placeholder={placeholder}\n disabled={isBusy}\n submitMode=\"enter\"\n aria-label=\"Message input\"\n className=\"text-text-primary placeholder:text-text-secondary/80 max-h-[10lh] min-h-10 w-full resize-none overflow-y-auto rounded-lg border-none bg-transparent px-1 py-1 text-base leading-normal shadow-none outline-none disabled:cursor-not-allowed\"\n />\n }\n disabled={isBusy}\n canSubmit={canSubmit}\n isRunning={isBusy}\n onSubmit={submit}\n onCancel={() => {\n resetBusy();\n void cancel();\n }}\n onAttach={() => fileInputRef.current?.click()}\n />\n </ComposerPrimitive.Root>\n </ComposerPrimitive.AttachmentDropzone>\n </>\n );\n}\n\nexport function ComposerContainer({\n placeholder = 'Ask anything... (Shift+Enter for new line)',\n}: ComposerContainerProps) {\n const pauseView = useComposerPauseView();\n const shell = useOptionalShellMode();\n const parentLeftSection = useSlot('ComposerLeftSection');\n const parentRightSection = useSlot('ComposerRightSection');\n const usesDefaultLeftSection = useSlotIsDefault('ComposerLeftSection');\n const usesDefaultRightSection = useSlotIsDefault('ComposerRightSection');\n const DraftComposerLeftSection = useSlot('DraftComposerLeftSection');\n const DraftComposerRightSection = useSlot('DraftComposerRightSection');\n const canMutateSpec = shell?.mode.status === 'active' && shell.mode.isMutable;\n\n if (pauseView.kind === 'mcp') {\n return <McpAuthContainer />;\n }\n if (pauseView.kind === 'custom') {\n return <CustomActionContainer />;\n }\n if (pauseView.kind === 'ask-user') {\n return <AskUserContainer />;\n }\n\n if (canMutateSpec) {\n return (\n <DraftCatalogProvider>\n <SlotsProvider\n overrides={{\n ComposerLeftSection: usesDefaultLeftSection ? DraftComposerLeftSection : parentLeftSection,\n ComposerRightSection: usesDefaultRightSection ? DraftComposerRightSection : parentRightSection,\n }}\n >\n <ComposerBody placeholder={placeholder} />\n </SlotsProvider>\n </DraftCatalogProvider>\n );\n }\n\n return <ComposerBody placeholder={placeholder} />;\n}\n","'use client';\n\nimport { useTrueFoundryHistoryPagination } from '@truefoundry/assistant-ui-runtime';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\n/** How close to the viewport top (px) before the next older page is fetched. */\nconst TOP_THRESHOLD_PX = 200;\n\nconst VIEWPORT_SELECTOR = '[data-slot=\"aui_thread-viewport\"]';\n\n/**\n * Renders `HistoryLoader` at the top of the message list and fetches\n * the next older history page when the user scrolls near it. Scroll position\n * is preserved across the prepend so the list doesn't jump.\n *\n * Must be rendered inside `ThreadViewportShell` (it locates the scroll root\n * via the `aui_thread-viewport` data-slot on its nearest scrollable ancestor).\n */\nexport function HistoryLoaderContainer() {\n const HistoryLoader = useSlot('HistoryLoader');\n const { hasOlderHistory, isLoadingOlderHistory, loadOlderHistory } = useTrueFoundryHistoryPagination();\n\n const [sentinel, setSentinel] = useState<HTMLDivElement | null>(null);\n const inflightRef = useRef(false);\n\n const maybeLoadOlder = useCallback(async () => {\n if (inflightRef.current) return;\n inflightRef.current = true;\n\n const viewport = sentinel?.closest<HTMLElement>(VIEWPORT_SELECTOR) ?? null;\n const prevScrollHeight = viewport?.scrollHeight ?? 0;\n const prevScrollTop = viewport?.scrollTop ?? 0;\n\n try {\n await loadOlderHistory();\n // Wait for React to commit the prepended messages, then restore the\n // user's anchor so the list doesn't jump to the oldest message.\n requestAnimationFrame(() => {\n if (viewport == null) return;\n const delta = viewport.scrollHeight - prevScrollHeight;\n if (delta > 0) {\n viewport.scrollTo({ top: prevScrollTop + delta, behavior: 'instant' });\n }\n });\n } catch {\n // Runtime surfaces the error via onError; the sentinel stays retryable.\n } finally {\n inflightRef.current = false;\n }\n }, [sentinel, loadOlderHistory]);\n\n useEffect(() => {\n if (sentinel == null || !hasOlderHistory) return;\n\n const viewport = sentinel.closest<HTMLElement>(VIEWPORT_SELECTOR);\n const observer = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n void maybeLoadOlder();\n }\n },\n { root: viewport, rootMargin: `${TOP_THRESHOLD_PX}px 0px 0px 0px` },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [sentinel, hasOlderHistory, maybeLoadOlder]);\n\n if (!hasOlderHistory) return null;\n\n return <HistoryLoader ref={setSentinel} isLoading={isLoadingOlderHistory} />;\n}\n","'use client';\n\nimport { useTrueFoundryResumeUnavailable } from '@truefoundry/assistant-ui-runtime';\n\nimport { useSlot } from '../theme/SlotsProvider.js';\n\nexport function ResumeUnavailableContainer() {\n const ResumeUnavailable = useSlot('ResumeUnavailable');\n const resumeUnavailable = useTrueFoundryResumeUnavailable();\n\n if (!resumeUnavailable) return null;\n\n return <ResumeUnavailable />;\n}\n","'use client';\n\nimport { useComposerCancel, useComposerSend, useThreadIsRunning } from '@assistant-ui/core/react';\nimport { ComposerPrimitive, MessagePrimitive, useAuiState } from '@assistant-ui/react';\n\nimport { Button } from '../atoms/primitives/Button.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { MessageAttachmentsContainer } from './AttachmentsContainer.js';\n\nfunction ReadOnlyMessageAttachments() {\n const hasAttachments = useAuiState(s => (s.message.attachments?.length ?? 0) > 0);\n if (!hasAttachments) {\n return null;\n }\n return (\n <div className=\"pointer-events-none mb-2 opacity-90\">\n <MessageAttachmentsContainer />\n </div>\n );\n}\n\nexport function UserEditComposerContainer() {\n const UserMessageEdit = useSlot('UserMessageEdit');\n const MessageTimestamp = useSlot('MessageTimestamp');\n const isRunning = useThreadIsRunning();\n const createdAt = useAuiState(s => s.message.createdAt);\n const { cancel, disabled: cancelDisabled } = useComposerCancel();\n const { disabled: sendDisabled } = useComposerSend();\n\n return (\n <MessagePrimitive.Root data-role=\"user\">\n <ComposerPrimitive.Root\n data-slot=\"aui_user-edit-composer-root\"\n className=\"fade-in slide-in-from-bottom-1 animate-in flex w-full justify-end px-2 duration-150\"\n >\n <UserMessageEdit\n timestamp={<MessageTimestamp createdAt={createdAt} />}\n attachments={<ReadOnlyMessageAttachments />}\n input={\n <div className=\"mt-1 rounded border border-border bg-secondary-bg p-2 text-text-primary\">\n <ComposerPrimitive.Input\n data-slot=\"aui_user-edit-input\"\n disabled={isRunning}\n submitMode=\"enter\"\n aria-label=\"Edit message\"\n className=\"max-h-32 min-h-10 w-full resize-none border-none bg-transparent p-0 text-base leading-[1.34] outline-none focus:shadow-none\"\n />\n </div>\n }\n footer={\n <div className=\"flex items-center justify-end gap-2\">\n <Button.Secondary type=\"button\" disabled={cancelDisabled} onClick={cancel}>\n Cancel\n </Button.Secondary>\n <ComposerPrimitive.Send asChild>\n <Button.Primary type=\"submit\" disabled={sendDisabled || isRunning}>\n Save &amp; Rerun\n </Button.Primary>\n </ComposerPrimitive.Send>\n </div>\n }\n />\n </ComposerPrimitive.Root>\n </MessagePrimitive.Root>\n );\n}\n","'use client';\n\nimport { ThreadPrimitive, useAuiState } from '@assistant-ui/react';\nimport { useEffect, type ReactNode } from 'react';\nimport { preloadMarkdownOpenUI } from '../atoms/Markdown.js';\nimport { ComposerBusyProvider } from '../hooks/useComposerBusyState.js';\nimport { useSyncSessionTitle } from '../hooks/useSyncSessionTitle.js';\nimport { useOptionalShellMode } from '../server/ShellModeContext.js';\nimport { useSlot } from '../theme/SlotsProvider.js';\nimport { isNewChatView } from '../utils/isNewChatView.js';\nimport { AssistantMessageContainer } from './AssistantMessageContainer.js';\nimport { HistoryLoaderContainer } from './HistoryLoaderContainer.js';\nimport { ResumeUnavailableContainer } from './ResumeUnavailableContainer.js';\nimport { UserEditComposerContainer } from './UserEditComposerContainer.js';\nimport { UserMessageContainer } from './UserMessageContainer.js';\n\nexport { isNewChatView } from '../utils/isNewChatView.js';\n\n/** Mount-only lift. Keyed by message.id via ThreadPrimitive.Messages — not content (streaming). */\nfunction AnimatedMessageShell({ children }: { children: ReactNode }) {\n return <div className=\"animate-in fade-in slide-in-from-bottom-1 fill-mode-both duration-200\">{children}</div>;\n}\n\nfunction ThreadMessage({ isEditing }: { isEditing: boolean }) {\n const role = useAuiState(s => s.message.role);\n if (role === 'user') {\n if (isEditing) {\n return <UserEditComposerContainer />;\n }\n return <UserMessageContainer />;\n }\n return <AssistantMessageContainer />;\n}\n\nexport type ThreadContainerProps = {\n /** Composer for the empty-welcome and docked bottom areas. `<Thread />` passes `<ComposerContainer />`. */\n composer?: ReactNode;\n};\n\nexport function ThreadContainer({ composer }: ThreadContainerProps) {\n useEffect(() => {\n void preloadMarkdownOpenUI();\n }, []);\n useSyncSessionTitle();\n\n const shell = useOptionalShellMode();\n const WelcomeScreen = useSlot('WelcomeScreen');\n const MessageListSkeleton = useSlot('MessageListSkeleton');\n const ScrollToBottomButton = useSlot('ScrollToBottomButton');\n const MessageGroup = useSlot('MessageGroup');\n const ThreadComposerAreaShell = useSlot('ThreadComposerAreaShell');\n const ThreadRootShell = useSlot('ThreadRootShell');\n const ThreadViewportShell = useSlot('ThreadViewportShell');\n\n const isEmpty = useAuiState(isNewChatView);\n const isLoading = useAuiState(s => s.thread.isLoading);\n const welcomeHeading =\n shell?.mode.status === 'active'\n ? shell.mode.agentName != null && shell.mode.agentName.length > 0\n ? shell.mode.agentName\n : shell.mode.isMutable && shell.mode.isCreateAgent\n ? 'Start building a new Agent'\n : undefined\n : undefined;\n\n return (\n <ComposerBusyProvider>\n <ThreadPrimitive.Root asChild>\n <ThreadRootShell>\n <ThreadPrimitive.Viewport asChild autoScroll>\n <ThreadViewportShell isEmpty={isEmpty}>\n {isEmpty && <WelcomeScreen heading={welcomeHeading} />}\n {isEmpty && !isLoading && composer}\n {isLoading ? (\n <MessageListSkeleton />\n ) : (\n !isEmpty && (\n <>\n <HistoryLoaderContainer />\n <MessageGroup>\n <ThreadPrimitive.Messages>\n {({ message }) => (\n <AnimatedMessageShell>\n <ThreadMessage isEditing={message.role === 'user' && message.composer.isEditing} />\n </AnimatedMessageShell>\n )}\n </ThreadPrimitive.Messages>\n <ResumeUnavailableContainer />\n </MessageGroup>\n </>\n )\n )}\n </ThreadViewportShell>\n </ThreadPrimitive.Viewport>\n\n {!isLoading && !isEmpty && (\n <ThreadComposerAreaShell isEmpty={isEmpty}>\n <ThreadPrimitive.ScrollToBottom asChild>\n <ScrollToBottomButton />\n </ThreadPrimitive.ScrollToBottom>\n {composer}\n </ThreadComposerAreaShell>\n )}\n </ThreadRootShell>\n </ThreadPrimitive.Root>\n </ComposerBusyProvider>\n );\n}\n","'use client';\n\nimport { useThreadIsRunning } from '@assistant-ui/core/react';\nimport { useEffect, useRef } from 'react';\n\nimport { useAui, useAuiState } from '../assistant-ui.js';\nimport { useOptionalServer } from '../server/ServerContext.js';\n\n/**\n * After a turn ends, read `session.title` from GET /sessions/{id} and rename the\n * thread-list row. Initialize only stores `remoteId`, so first chats stay\n * \"New Chat\" until this runs.\n */\nexport function useSyncSessionTitle(): void {\n const server = useOptionalServer();\n const aui = useAui();\n const remoteId = useAuiState(s => s.threadListItem.remoteId);\n const title = useAuiState(s => s.threadListItem.title);\n const isRunning = useThreadIsRunning();\n const wasRunningRef = useRef(false);\n const syncedRemoteIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n syncedRemoteIdRef.current = undefined;\n }, [remoteId]);\n\n useEffect(() => {\n const finishedTurn = wasRunningRef.current && !isRunning;\n wasRunningRef.current = isRunning;\n\n if (!finishedTurn || server == null || remoteId == null) {\n return;\n }\n if (syncedRemoteIdRef.current === remoteId) {\n return;\n }\n // History rows already carry a title; only fill blank / \"new\" local rows.\n if (title != null && title.trim() !== '') {\n syncedRemoteIdRef.current = remoteId;\n return;\n }\n\n let cancelled = false;\n void server\n .getSession({ sessionId: remoteId })\n .then(session => {\n if (cancelled) return;\n const nextTitle = typeof session.title === 'string' ? session.title.trim() : '';\n if (nextTitle.length === 0) return;\n syncedRemoteIdRef.current = remoteId;\n return aui.threadListItem().rename(nextTitle);\n })\n .catch(() => undefined);\n\n return () => {\n cancelled = true;\n };\n }, [aui, isRunning, remoteId, server, title]);\n}\n","'use client';\n\nimport { ComposerContainer } from './ComposerContainer.js';\nimport { ThreadContainer } from './ThreadContainer.js';\n\n/** The full assembled thread view: message list + composer. */\nexport function Thread() {\n return <ThreadContainer composer={<ComposerContainer />} />;\n}\n"],"mappings":"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","names":["useAuiState","useTrueFoundryToolResponses","useAuiState","useTrueFoundryToolResponses","useThreadIsRunning","useTrueFoundryToolResponses","useCallback","jsx","useTrueFoundryToolResponses","useThreadIsRunning","useCallback","useThreadIsRunning","jsx","useThreadIsRunning","useAui","useAuiState","jsx","useAui","useAuiState","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useCallback","useEffect","jsx","useThreadIsRunning","ComposerPrimitive","useAuiState","jsx","jsxs","useAuiState","useThreadIsRunning","ComposerPrimitive","useAuiState","useEffect","useThreadIsRunning","useEffect","useRef","useThreadIsRunning","useRef","useEffect","Fragment","jsx","jsxs","useAuiState","useEffect","jsx"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/atoms/schedules/SchedulesPage.tsx","../src/atoms/schedules/cadence.ts","../src/atoms/schedules/ScheduleFormDrawer.tsx","../src/atoms/schedules/ScheduleFormFields.tsx","../src/atoms/schedules/TestScheduleScreen.tsx","../src/atoms/schedules/scheduleRuns.ts","../src/atoms/schedules/ScheduleRunTooltip.tsx","../src/atoms/schedules/ScheduleRunChip.tsx","../src/atoms/schedules/ScheduleStatusBadge.tsx","../src/atoms/schedules/ScheduleLastRunsCell.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useScheduleServer, useServer } from '../../server/ServerContext.js';\nimport { libraryAgentId } from '../../server/ShellModeContext.js';\nimport type { Schedule, ScheduleRun, ScheduleStatus } from '../../server/types.js';\nimport { readScheduleShareSearch, replaceScheduleShareSearch } from '../../utils/scheduleShareUrl.js';\nimport { EmptyScreen } from '../EmptyScreen.js';\nimport { auiButtonClass } from '../lib/buttonClasses.js';\nimport { cn } from '../lib/cn.js';\nimport { searchAllAgents } from '../lib/useSearchAgentsList.js';\nimport { PageHeader } from '../PageHeader.js';\nimport { Button } from '../primitives/Button.js';\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../primitives/Dialog.js';\nimport { DropdownMenu, DropdownMenuItem } from '../primitives/DropdownMenu.js';\nimport { PopoverSelect } from '../primitives/PopoverSelect.js';\nimport SearchInput from '../primitives/SearchInput.js';\nimport { Skeleton } from '../primitives/Skeleton.js';\nimport {\n DEFAULT_TABLE_PAGE_SIZE,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableTokenPagination,\n} from '../primitives/Table.js';\nimport { formatCadenceSummary } from './cadence.js';\nimport { ScheduleFormDrawer } from './ScheduleFormDrawer.js';\nimport { ScheduleLastRunsCell } from './ScheduleLastRunsCell.js';\nimport { ScheduleStatusBadge } from './ScheduleStatusBadge.js';\n\ntype AgentOption = { agentId: string; name: string };\n\ntype DrawerState = { kind: 'closed' } | { kind: 'create'; agentId?: string } | { kind: 'edit'; schedule: Schedule };\n\nconst STATUS_FILTER_OPTIONS: Array<{ value: 'all' | ScheduleStatus; label: string }> = [\n { value: 'all', label: 'All statuses' },\n { value: 'active', label: 'Active' },\n { value: 'paused', label: 'Paused' },\n];\n\n/** API max page size for schedules list. */\nconst SCHEDULES_PAGE_SIZE_OPTIONS = [10, 25] as const;\n\nfunction clampPageSize(size: number): number {\n return Math.min(Math.max(size, 1), 25);\n}\n\nfunction filtersFromSearch(search: string): {\n nameQuery: string;\n statusFilter: 'all' | ScheduleStatus;\n agentFilter: string;\n} {\n const share = readScheduleShareSearch(search);\n return {\n nameQuery: share.q ?? '',\n statusFilter: share.status ?? 'all',\n agentFilter: share.agent ?? 'all',\n };\n}\n\nfunction ScheduleRowActions({\n schedule,\n running,\n onRunNow,\n onEdit,\n onTogglePause,\n onDelete,\n}: {\n schedule: Schedule;\n running: boolean;\n onRunNow: () => void;\n onEdit: () => void;\n onTogglePause: () => void;\n onDelete: () => void;\n}) {\n return (\n <div className=\"inline-flex items-center justify-end gap-1.5\">\n <Button.Secondary\n type=\"button\"\n disabled={running}\n aria-label={`Run now ${schedule.name}`}\n size=\"large\"\n onClick={onRunNow}\n >\n <Icon name={running ? 'loader' : 'play'} className={cn('size-3.5', running && 'animate-spin')} />\n Run now\n </Button.Secondary>\n <DropdownMenu\n align=\"end\"\n trigger={\n <button\n type=\"button\"\n className={auiButtonClass({ variant: 'ghost', size: 'icon' })}\n aria-label={`Actions for ${schedule.name}`}\n >\n <Icon name=\"ellipsis\" />\n </button>\n }\n >\n <DropdownMenuItem onClick={onEdit}>\n <Icon name=\"pencil\" className=\"size-3.5\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onTogglePause}>\n <Icon name={schedule.status === 'active' ? 'pause' : 'play'} className=\"size-3.5\" />\n {schedule.status === 'active' ? 'Pause' : 'Resume'}\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-failure-bg focus:text-failure-bg\" onClick={onDelete}>\n <Icon name=\"trash\" className=\"size-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenu>\n </div>\n );\n}\n\nexport function SchedulesPage() {\n const scheduleServer = useScheduleServer();\n const server = useServer();\n const toaster = useToasterOptional();\n\n const [schedules, setSchedules] = useState<Schedule[]>([]);\n const [runsByScheduleId, setRunsByScheduleId] = useState<Record<string, ScheduleRun[]>>({});\n const [runsLoading, setRunsLoading] = useState(false);\n const [runningScheduleIds, setRunningScheduleIds] = useState<ReadonlySet<string>>(() => new Set());\n const [agentOptions, setAgentOptions] = useState<AgentOption[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [nameQuery, setNameQuery] = useState(() => filtersFromSearch(window.location.search).nameQuery);\n const [statusFilter, setStatusFilter] = useState<'all' | ScheduleStatus>(\n () => filtersFromSearch(window.location.search).statusFilter,\n );\n const [agentFilter, setAgentFilter] = useState(() => filtersFromSearch(window.location.search).agentFilter);\n const [drawer, setDrawer] = useState<DrawerState>({ kind: 'closed' });\n const [pendingDelete, setPendingDelete] = useState<Schedule | null>(null);\n const [pageSize, setPageSize] = useState(() => clampPageSize(DEFAULT_TABLE_PAGE_SIZE));\n const [pageToken, setPageToken] = useState<string | undefined>(undefined);\n const [nextPageToken, setNextPageToken] = useState<string | undefined>(undefined);\n const [prevTokenStack, setPrevTokenStack] = useState<string[]>([]);\n const loadGenRef = useRef(0);\n const didConsumeIsNewRef = useRef(false);\n\n const loadRunsForSchedules = useCallback(\n async ({ rows, gen }: { rows: Schedule[]; gen: number }) => {\n if (rows.length === 0) {\n if (gen === loadGenRef.current) setRunsByScheduleId({});\n return;\n }\n setRunsLoading(true);\n try {\n const results = await Promise.allSettled(\n rows.map(schedule => scheduleServer.listScheduleRuns({ scheduleId: schedule.id })),\n );\n if (gen !== loadGenRef.current) return;\n setRunsByScheduleId(\n Object.fromEntries(\n rows.map((schedule, index) => {\n const result = results[index];\n const runs = result?.status === 'fulfilled' ? result.value : [];\n return [schedule.id, runs] as const;\n }),\n ),\n );\n } finally {\n if (gen === loadGenRef.current) setRunsLoading(false);\n }\n },\n [scheduleServer],\n );\n\n const loadSchedules = useCallback(\n async ({ token, size, agentId }: { token: string | undefined; size: number; agentId: string }) => {\n const gen = ++loadGenRef.current;\n setLoading(true);\n setError(null);\n try {\n const page = await scheduleServer.listSchedules({\n limit: clampPageSize(size),\n ...(token === undefined || token === '' ? {} : { pageToken: token }),\n ...(agentId === 'all' ? {} : { agentIds: [agentId] }),\n });\n if (gen !== loadGenRef.current) return;\n setSchedules(page.data);\n setNextPageToken(page.nextPageToken);\n void loadRunsForSchedules({ rows: page.data, gen });\n } catch (caught) {\n if (gen !== loadGenRef.current) return;\n const message = caught instanceof Error ? caught.message : 'Failed to load schedules';\n setError(message);\n setSchedules([]);\n setRunsByScheduleId({});\n setNextPageToken(undefined);\n } finally {\n if (gen === loadGenRef.current) setLoading(false);\n }\n },\n [scheduleServer, loadRunsForSchedules],\n );\n\n const resetToFirstPage = useCallback(\n (next?: { size?: number; agentId?: string }) => {\n const size = next?.size ?? pageSize;\n const agentId = next?.agentId ?? agentFilter;\n setPageToken(undefined);\n setPrevTokenStack([]);\n void loadSchedules({ token: undefined, size, agentId });\n },\n [agentFilter, loadSchedules, pageSize],\n );\n\n // Keep filters in the URL so deep links and Agents → Schedules work.\n useEffect(() => {\n replaceScheduleShareSearch({\n agent: agentFilter === 'all' ? null : agentFilter,\n status: statusFilter === 'all' ? null : statusFilter,\n q: nameQuery.trim().length === 0 ? null : nameQuery,\n });\n }, [agentFilter, statusFilter, nameQuery]);\n\n // One-shot: Agents \"+ Schedule\" lands with isNew=true; open create then strip the flag.\n useEffect(() => {\n if (didConsumeIsNewRef.current) return;\n const share = readScheduleShareSearch(window.location.search);\n if (!share.isNew) return;\n didConsumeIsNewRef.current = true;\n setDrawer({\n kind: 'create',\n ...(share.agent != null ? { agentId: share.agent } : {}),\n });\n replaceScheduleShareSearch({ isNew: null });\n }, []);\n\n useEffect(() => {\n const syncFromUrl = () => {\n const next = filtersFromSearch(window.location.search);\n setNameQuery(next.nameQuery);\n setStatusFilter(next.statusFilter);\n setAgentFilter(current => {\n if (current === next.agentFilter) return current;\n setPageToken(undefined);\n setPrevTokenStack([]);\n return next.agentFilter;\n });\n };\n window.addEventListener('popstate', syncFromUrl);\n return () => {\n window.removeEventListener('popstate', syncFromUrl);\n };\n }, []);\n\n useEffect(() => {\n void loadSchedules({ token: pageToken, size: pageSize, agentId: agentFilter });\n }, [agentFilter, pageSize, pageToken, loadSchedules]);\n\n useEffect(() => {\n let cancelled = false;\n void searchAllAgents(server)\n .then(rows => {\n if (cancelled) return;\n setAgentOptions(rows.map(agent => ({ agentId: libraryAgentId(agent), name: agent.name })));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [server]);\n\n const agentNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const agent of agentOptions) {\n map.set(agent.agentId, agent.name);\n }\n return map;\n }, [agentOptions]);\n\n // Name + status are client-side on the current server page only.\n const filtered = useMemo(() => {\n const q = nameQuery.trim().toLowerCase();\n return schedules.filter(schedule => {\n if (statusFilter !== 'all' && schedule.status !== statusFilter) return false;\n if (q.length > 0 && !schedule.name.toLowerCase().includes(q)) return false;\n return true;\n });\n }, [schedules, nameQuery, statusFilter]);\n\n const hasPageNav = prevTokenStack.length > 0 || nextPageToken != null;\n\n const handleTogglePause = async (schedule: Schedule) => {\n const nextStatus: ScheduleStatus = schedule.status === 'active' ? 'paused' : 'active';\n try {\n await scheduleServer.updateSchedule({ ...schedule, status: nextStatus });\n await loadSchedules({ token: pageToken, size: pageSize, agentId: agentFilter });\n } catch (caught) {\n toaster?.showError(caught);\n }\n };\n\n const handleRunNow = async (schedule: Schedule) => {\n setRunningScheduleIds(prev => new Set(prev).add(schedule.id));\n try {\n await scheduleServer.createScheduleRun({ scheduleId: schedule.id });\n toaster?.showSuccess({ title: 'Run started' });\n const runs = await scheduleServer.listScheduleRuns({ scheduleId: schedule.id });\n setRunsByScheduleId(prev => ({ ...prev, [schedule.id]: runs }));\n } catch (caught) {\n toaster?.showError(caught);\n } finally {\n setRunningScheduleIds(prev => {\n const next = new Set(prev);\n next.delete(schedule.id);\n return next;\n });\n }\n };\n\n const handleDelete = async (schedule: Schedule) => {\n setPendingDelete(null);\n try {\n await scheduleServer.deleteSchedule({ id: schedule.id });\n resetToFirstPage();\n } catch (caught) {\n toaster?.showError(caught);\n }\n };\n\n const goNext = () => {\n if (nextPageToken == null) return;\n setPrevTokenStack(stack => [...stack, pageToken ?? '']);\n setPageToken(nextPageToken);\n };\n\n const goPrev = () => {\n if (prevTokenStack.length === 0) return;\n const stack = [...prevTokenStack];\n const prev = stack.pop();\n setPrevTokenStack(stack);\n setPageToken(prev === '' ? undefined : prev);\n };\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-primary-bg\">\n <PageHeader\n title=\"Scheduled Agents\"\n end={\n <>\n <div className=\"w-full sm:w-56\">\n <SearchInput query={nameQuery} setQuery={setNameQuery} placeholder=\"Search schedules by name\" />\n </div>\n <PopoverSelect\n value={statusFilter}\n onValueChange={setStatusFilter}\n options={STATUS_FILTER_OPTIONS}\n className=\"sm:w-40\"\n aria-label=\"Filter by status\"\n />\n <PopoverSelect\n value={agentFilter}\n onValueChange={value => {\n setAgentFilter(value);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n options={[\n { value: 'all', label: 'All agents' },\n ...agentOptions.map(agent => ({ value: agent.agentId, label: agent.name })),\n ]}\n className=\"sm:w-40\"\n aria-label=\"Filter by agent\"\n />\n <Button.Primary\n type=\"button\"\n onClick={() =>\n setDrawer({\n kind: 'create',\n agentId: agentFilter !== 'all' ? agentFilter : undefined,\n })\n }\n >\n <Icon name=\"plus\" className=\"size-3.5\" />\n Create Schedule\n </Button.Primary>\n </>\n }\n />\n\n <div className=\"min-h-0 flex-1 overflow-auto px-4 py-4 md:px-6\">\n {loading ? (\n <div className=\"flex flex-col gap-2\" role=\"status\" aria-label=\"Loading schedules\">\n {Array.from({ length: 5 }, (_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n ) : error != null ? (\n <p className=\"text-failure-bg px-3 py-8 text-center text-sm\">{error}</p>\n ) : schedules.length === 0 ? (\n <EmptyScreen title=\"No Schedules Found\" description=\"Create one to get started.\" className=\"min-h-full\" />\n ) : filtered.length === 0 ? (\n <div className=\"flex min-h-full flex-col\">\n <EmptyScreen title=\"No Schedules Found\" description=\"No schedules match your filters.\" className=\"flex-1\" />\n {hasPageNav ? (\n <TableTokenPagination\n pageSize={pageSize}\n rowCount={0}\n canPrev={prevTokenStack.length > 0}\n canNext={nextPageToken != null}\n onPrev={goPrev}\n onNext={goNext}\n pageSizeOptions={SCHEDULES_PAGE_SIZE_OPTIONS}\n onPageSizeChange={size => {\n const next = clampPageSize(size);\n setPageSize(next);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n />\n ) : null}\n </div>\n ) : (\n <div className=\"overflow-hidden rounded-lg border border-border\">\n <Table className=\"min-w-[48rem]\">\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead>Name</TableHead>\n <TableHead>Agent</TableHead>\n <TableHead>Cadence</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Last 5 runs</TableHead>\n <TableHead>\n <span className=\"sr-only\">Actions</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filtered.map(schedule => {\n const cadence = formatCadenceSummary({ cron: schedule.cron, timezone: schedule.timezone });\n const agentLabel = schedule.agentName ?? agentNameById.get(schedule.agentId) ?? schedule.agentId;\n return (\n <TableRow key={schedule.id}>\n <TableCell className=\"text-text-primary font-medium\">\n <button\n type=\"button\"\n className=\"cursor-pointer text-left\"\n onClick={() => setDrawer({ kind: 'edit', schedule })}\n >\n {schedule.name}\n </button>\n </TableCell>\n <TableCell>{agentLabel}</TableCell>\n <TableCell>{cadence}</TableCell>\n <TableCell>\n <ScheduleStatusBadge status={schedule.status} />\n </TableCell>\n <TableCell>\n {runsLoading ? (\n <span className=\"text-text-secondary text-sm\">…</span>\n ) : (\n <ScheduleLastRunsCell runs={runsByScheduleId[schedule.id] ?? []} />\n )}\n </TableCell>\n <TableCell className=\"text-right\">\n <ScheduleRowActions\n schedule={schedule}\n running={runningScheduleIds.has(schedule.id)}\n onRunNow={() => void handleRunNow(schedule)}\n onEdit={() => setDrawer({ kind: 'edit', schedule })}\n onTogglePause={() => void handleTogglePause(schedule)}\n onDelete={() => setPendingDelete(schedule)}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n {(filtered.length > 0 || hasPageNav) && (\n <TableTokenPagination\n pageSize={pageSize}\n rowCount={filtered.length}\n canPrev={prevTokenStack.length > 0}\n canNext={nextPageToken != null}\n onPrev={goPrev}\n onNext={goNext}\n pageSizeOptions={SCHEDULES_PAGE_SIZE_OPTIONS}\n onPageSizeChange={size => {\n const next = clampPageSize(size);\n setPageSize(next);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n />\n )}\n </div>\n )}\n </div>\n\n {drawer.kind === 'create' ? (\n <ScheduleFormDrawer\n open\n mode=\"create\"\n initialAgentId={drawer.agentId ?? ''}\n onOpenChange={open => {\n if (!open) setDrawer({ kind: 'closed' });\n }}\n onSaved={() => resetToFirstPage()}\n />\n ) : null}\n {drawer.kind === 'edit' ? (\n <ScheduleFormDrawer\n open\n mode=\"edit\"\n schedule={drawer.schedule}\n onOpenChange={open => {\n if (!open) setDrawer({ kind: 'closed' });\n }}\n onSaved={() => void loadSchedules({ token: pageToken, size: pageSize, agentId: agentFilter })}\n />\n ) : null}\n {pendingDelete != null ? (\n <Dialog\n open\n onOpenChange={open => {\n if (!open) setPendingDelete(null);\n }}\n aria-label=\"Delete schedule\"\n className=\"max-w-md\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete schedule</DialogTitle>\n <p className=\"text-text-secondary text-sm\">\n “{pendingDelete.name}” will stop running. This cannot be undone.\n </p>\n </DialogHeader>\n </DialogContent>\n <DialogFooter>\n <Button.Secondary type=\"button\" onClick={() => setPendingDelete(null)}>\n Cancel\n </Button.Secondary>\n <Button.Destructive type=\"button\" onClick={() => void handleDelete(pendingDelete)}>\n Delete\n </Button.Destructive>\n </DialogFooter>\n </Dialog>\n ) : null}\n </div>\n );\n}\n","export type RecurrenceKind = 'hourly' | 'daily' | 'weekly' | 'custom';\n\nexport type ScheduleFormValues = {\n name: string;\n task: string;\n recurrence: RecurrenceKind;\n hour: number;\n minute: number;\n /** Cron DOW: 0=Sun … 6=Sat. Used when recurrence is weekly. */\n weekdays: number[];\n customCron: string;\n timezone: string;\n};\n\nexport const TIMEZONE_OPTIONS = [\n { value: 'America/New_York', label: 'America/New_York (ET)' },\n { value: 'America/Chicago', label: 'America/Chicago (CT)' },\n { value: 'America/Denver', label: 'America/Denver (MT)' },\n { value: 'America/Los_Angeles', label: 'America/Los_Angeles (PT)' },\n { value: 'UTC', label: 'UTC' },\n { value: 'Europe/London', label: 'Europe/London (GMT/BST)' },\n { value: 'Europe/Berlin', label: 'Europe/Berlin (CET)' },\n { value: 'Asia/Kolkata', label: 'Asia/Kolkata (IST)' },\n { value: 'Asia/Tokyo', label: 'Asia/Tokyo (JST)' },\n] as const;\n\nexport function resolveLocalTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nexport function getTimezoneOptions(selectedTimezone?: string): Array<{ value: string; label: string }> {\n const localTimezone = resolveLocalTimezone();\n const knownTimezones = new Set<string>(TIMEZONE_OPTIONS.map(option => option.value));\n // Keep both browser-local and persisted zones selectable even when they are\n // outside the curated common-timezone list.\n const additionalTimezones = [localTimezone, selectedTimezone].flatMap(timezone => {\n if (timezone == null || timezone.length === 0 || knownTimezones.has(timezone)) return [];\n knownTimezones.add(timezone);\n return [{ value: timezone, label: timezone === localTimezone ? `${timezone} (Local)` : timezone }];\n });\n return [...additionalTimezones, ...TIMEZONE_OPTIONS];\n}\n\nexport const WEEKDAY_OPTIONS = [\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' },\n { value: 0, label: 'Sun' },\n] as const;\n\nconst TZ_ABBR: Record<string, string> = {\n 'America/New_York': 'ET',\n 'America/Chicago': 'CT',\n 'America/Denver': 'MT',\n 'America/Los_Angeles': 'PT',\n UTC: 'UTC',\n 'Europe/London': 'GMT',\n 'Europe/Berlin': 'CET',\n 'Asia/Kolkata': 'IST',\n 'Asia/Tokyo': 'JST',\n};\n\nexport function defaultScheduleFormValues(): ScheduleFormValues {\n return {\n name: '',\n task: '',\n recurrence: 'daily',\n hour: 9,\n minute: 0,\n weekdays: [1],\n customCron: '0 9 * * *',\n timezone: resolveLocalTimezone(),\n };\n}\n\nexport function timezoneAbbrev(timezone: string): string {\n return TZ_ABBR[timezone] ?? timezone.split('/').pop() ?? timezone;\n}\n\nfunction pad2(n: number): string {\n return n.toString().padStart(2, '0');\n}\n\nfunction formatClock({ hour, minute }: { hour: number; minute: number }): string {\n const period = hour >= 12 ? 'PM' : 'AM';\n const h12 = hour % 12 === 0 ? 12 : hour % 12;\n return `${String(h12)}:${pad2(minute)} ${period}`;\n}\n\nexport function valuesToCron(values: ScheduleFormValues): string {\n const minute = values.minute;\n const hour = values.hour;\n switch (values.recurrence) {\n case 'hourly':\n return `${String(minute)} * * * *`;\n case 'daily':\n return `${String(minute)} ${String(hour)} * * *`;\n case 'weekly': {\n const days = [...values.weekdays].sort((a, b) => a - b);\n const dow = days.length > 0 ? days.join(',') : '*';\n return `${String(minute)} ${String(hour)} * * ${dow}`;\n }\n case 'custom':\n return values.customCron.trim();\n }\n}\n\nexport function formatCadenceSummary(input: { cron: string; timezone: string }): string {\n const abbr = timezoneAbbrev(input.timezone);\n const parts = input.cron.trim().split(/\\s+/);\n if (parts.length !== 5) return input.cron;\n\n const [minuteRaw, hourRaw, dayOfMonthRaw, monthRaw, dowRaw] = parts;\n if (dayOfMonthRaw !== '*' || monthRaw !== '*') return input.cron;\n\n const minute = Number(minuteRaw);\n const hour = Number(hourRaw);\n\n if (hourRaw === '*' && dowRaw === '*' && minuteRaw !== undefined && !Number.isNaN(minute)) {\n return `Hourly at :${pad2(minute)} ${abbr}`;\n }\n\n if (\n dowRaw === '*' &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n return `Daily ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n if (\n dowRaw === '1-5' &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n return `Weekdays ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n if (\n dowRaw != null &&\n /^\\d(?:,\\d)*$/.test(dowRaw) &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n const labels = dowRaw.split(',').map(d => WEEKDAY_OPTIONS.find(w => w.value === Number(d))?.label ?? d);\n if (labels.length === 1) {\n const day = labels[0] === 'Mon' ? 'Monday' : labels[0];\n return `Every ${day} ${formatClock({ hour, minute })} ${abbr}`;\n }\n return `${labels.join(', ')} ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n return input.cron;\n}\n\n/** Best-effort parse of known patterns into form values for edit. */\nexport function cronToFormValues(input: {\n name: string;\n task: string;\n cron: string;\n timezone: string;\n}): ScheduleFormValues {\n const base = defaultScheduleFormValues();\n const parts = input.cron.trim().split(/\\s+/);\n if (parts.length !== 5) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n };\n }\n\n const [minuteRaw, hourRaw, dom, month, dowRaw] = parts;\n const minute = Number(minuteRaw);\n const hour = Number(hourRaw);\n\n if (dom !== '*' || month !== '*') {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n };\n }\n\n if (hourRaw === '*' && dowRaw === '*' && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'hourly',\n minute,\n customCron: input.cron,\n };\n }\n\n if (dowRaw === '*' && !Number.isNaN(hour) && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'daily',\n hour,\n minute,\n customCron: input.cron,\n };\n }\n\n if (dowRaw != null && /^\\d(?:,\\d)*$/.test(dowRaw) && !Number.isNaN(hour) && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'weekly',\n hour,\n minute,\n weekdays: dowRaw.split(',').map(Number),\n customCron: input.cron,\n };\n }\n\n // Weekdays 1-5 → treat as custom so the cron string is preserved on save.\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n hour: Number.isNaN(hour) ? base.hour : hour,\n minute: Number.isNaN(minute) ? base.minute : minute,\n };\n}\n\nexport function formatRelativeTime(iso: string | null, nowMs = Date.now()): string {\n if (iso == null) return 'Never';\n const then = Date.parse(iso);\n if (Number.isNaN(then)) return 'Never';\n const deltaSec = Math.round((nowMs - then) / 1000);\n if (deltaSec < 60) return 'just now';\n const mins = Math.round(deltaSec / 60);\n if (mins < 60) return `${String(mins)} min ago`;\n const hours = Math.round(mins / 60);\n if (hours < 48) return `${String(hours)} hour${hours === 1 ? '' : 's'} ago`;\n const days = Math.round(hours / 24);\n return `${String(days)} day${days === 1 ? '' : 's'} ago`;\n}\n","'use client';\n\nimport { useEffect, useMemo, useState, type FormEvent, type ReactNode } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useScheduleServer, useServer } from '../../server/ServerContext.js';\nimport { libraryAgentId } from '../../server/ShellModeContext.js';\nimport type { AgentLibraryEntry, Schedule } from '../../server/types.js';\nimport { DraftCatalogProvider } from '../draft/DraftCatalogProvider.js';\nimport { mountName } from '../lib/mountName.js';\nimport { searchAllAgents } from '../lib/useSearchAgentsList.js';\nimport { Button } from '../primitives/Button.js';\nimport { SideDrawer } from '../primitives/SideDrawer.js';\nimport {\n cronToFormValues,\n defaultScheduleFormValues,\n formatCadenceSummary,\n valuesToCron,\n type ScheduleFormValues,\n} from './cadence.js';\nimport { ScheduleFormFields } from './ScheduleFormFields.js';\nimport { TestScheduleScreen } from './TestScheduleScreen.js';\n\nexport type ScheduleFormDrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mode: 'create' | 'edit';\n schedule?: Schedule;\n initialAgentId?: string;\n onSaved?: () => void;\n};\n\ntype DrawerView = { kind: 'form'; saved?: Schedule } | { kind: 'test'; schedule: Schedule };\n\nfunction ScheduleFormDrawerBody({\n open,\n onOpenChange,\n mode,\n schedule,\n initialAgentId = '',\n onSaved,\n}: ScheduleFormDrawerProps) {\n const scheduleServer = useScheduleServer();\n const server = useServer();\n const toaster = useToasterOptional();\n const [form, setForm] = useState<ScheduleFormValues>(defaultScheduleFormValues);\n const [agentId, setAgentId] = useState(initialAgentId);\n const [agents, setAgents] = useState<AgentLibraryEntry[]>([]);\n const [view, setView] = useState<DrawerView>({ kind: 'form' });\n const [saving, setSaving] = useState(false);\n const [activating, setActivating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const savedFromCreate = view.kind === 'form' ? view.saved : view.schedule;\n const isExternalEdit = mode === 'edit' && view.kind === 'form' && view.saved == null && schedule != null;\n const isCreatedEdit = view.kind === 'form' && view.saved != null;\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n void searchAllAgents(server)\n .then(rows => {\n if (cancelled) return;\n setAgents(rows);\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [open, server]);\n\n useEffect(() => {\n if (!open) {\n setForm(defaultScheduleFormValues());\n setAgentId(initialAgentId);\n setError(null);\n setView({ kind: 'form' });\n setActivating(false);\n return;\n }\n if (mode === 'edit' && schedule != null) {\n setForm(\n cronToFormValues({\n name: schedule.name,\n task: schedule.task,\n cron: schedule.cron,\n timezone: schedule.timezone,\n }),\n );\n setAgentId(schedule.agentId);\n setView({ kind: 'form' });\n return;\n }\n setForm(defaultScheduleFormValues());\n setAgentId(initialAgentId);\n setView({ kind: 'form' });\n }, [open, mode, schedule, initialAgentId]);\n\n const agentOptions = useMemo(\n () => agents.map(agent => ({ agentId: libraryAgentId(agent), name: agent.name })),\n [agents],\n );\n\n const selectedAgent = useMemo(\n () => agents.find(agent => libraryAgentId(agent) === agentId) ?? null,\n [agents, agentId],\n );\n\n const agentLabel =\n selectedAgent?.name ??\n savedFromCreate?.agentName ??\n schedule?.agentName ??\n agentOptions.find(option => option.agentId === agentId)?.name ??\n agentId;\n\n const mcpMounts = useMemo(() => {\n const mounts = selectedAgent?.agentSpec?.mcpServers ?? [];\n return mounts\n .map(mountName)\n .filter((name: string | null): name is string => name != null)\n .map(name => ({ name }));\n }, [selectedAgent]);\n\n const canSubmit = useMemo(() => {\n const cron = valuesToCron(form);\n return form.name.trim().length > 0 && form.task.trim().length > 0 && cron.length > 0 && agentId.length > 0;\n }, [form, agentId]);\n\n const enterTestView = (saved: Schedule) => {\n setView({ kind: 'test', schedule: saved });\n setForm(\n cronToFormValues({\n name: saved.name,\n task: saved.task,\n cron: saved.cron,\n timezone: saved.timezone,\n }),\n );\n setAgentId(saved.agentId);\n };\n\n const handleSave = async (event: FormEvent) => {\n event.preventDefault();\n if (!canSubmit) return;\n const cron = valuesToCron(form);\n setSaving(true);\n setError(null);\n try {\n if (isExternalEdit && schedule != null) {\n await scheduleServer.updateSchedule({\n id: schedule.id,\n name: form.name.trim(),\n task: form.task.trim(),\n cron,\n timezone: form.timezone,\n status: schedule.status,\n });\n onSaved?.();\n onOpenChange(false);\n return;\n }\n\n if (isCreatedEdit && view.kind === 'form' && view.saved != null) {\n const saved = await scheduleServer.updateSchedule({\n id: view.saved.id,\n name: form.name.trim(),\n task: form.task.trim(),\n cron,\n timezone: form.timezone,\n status: 'paused',\n });\n onSaved?.();\n enterTestView(saved);\n toaster?.showSuccess({\n title: 'Schedule saved as paused',\n description: formatCadenceSummary({ cron: saved.cron, timezone: saved.timezone }),\n });\n return;\n }\n\n const saved = await scheduleServer.createSchedule({\n agentId,\n name: form.name.trim(),\n task: form.task.trim(),\n cron,\n timezone: form.timezone,\n status: 'paused',\n });\n onSaved?.();\n enterTestView(saved);\n toaster?.showSuccess({\n title: 'Schedule saved as paused',\n description: formatCadenceSummary({ cron: saved.cron, timezone: saved.timezone }),\n });\n } catch (caught) {\n const message = caught instanceof Error ? caught.message : 'Failed to save schedule';\n setError(message);\n } finally {\n setSaving(false);\n }\n };\n\n const handleActivate = async () => {\n if (view.kind !== 'test') return;\n setActivating(true);\n setError(null);\n try {\n await scheduleServer.updateSchedule({\n id: view.schedule.id,\n name: view.schedule.name,\n task: view.schedule.task,\n cron: view.schedule.cron,\n timezone: view.schedule.timezone,\n status: 'active',\n });\n onSaved?.();\n toaster?.showSuccess({ title: 'Schedule activated' });\n onOpenChange(false);\n } catch (caught) {\n const message = caught instanceof Error ? caught.message : 'Failed to activate schedule';\n setError(message);\n toaster?.showError(caught);\n } finally {\n setActivating(false);\n }\n };\n\n const title =\n view.kind === 'test' ? 'Test Schedule' : isExternalEdit || isCreatedEdit ? 'Edit Schedule' : 'New Schedule';\n const description =\n view.kind === 'test'\n ? `Recurring unattended runs of ${agentLabel}.`\n : isExternalEdit || isCreatedEdit\n ? 'Update cadence and task for this schedule.'\n : 'Create a recurring unattended run for an agent.';\n\n let footer: ReactNode;\n if (view.kind === 'test') {\n footer = (\n <div className=\"flex flex-col gap-2\">\n {error != null ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Secondary type=\"button\" className=\"w-full\" disabled={activating} onClick={() => void handleActivate()}>\n Activate Anyway\n </Button.Secondary>\n </div>\n );\n } else {\n footer = (\n <div className=\"flex flex-col gap-2\">\n {error != null ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <div className=\"flex justify-end gap-2\">\n <Button.Secondary type=\"button\" onClick={() => onOpenChange(false)} disabled={saving}>\n Cancel\n </Button.Secondary>\n <Button.Primary type=\"submit\" form=\"schedule-form\" disabled={!canSubmit || saving}>\n Save\n </Button.Primary>\n </div>\n </div>\n );\n }\n\n return (\n <SideDrawer\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={description}\n anchor=\"right\"\n size=\"lg\"\n headerIcon={\n <span className=\"text-primary-button-bg inline-flex size-8 items-center justify-center\">\n <Icon\n name={view.kind === 'test' || isExternalEdit || isCreatedEdit ? 'calendar' : 'calendar-plus'}\n className=\"size-5\"\n />\n </span>\n }\n footer={footer}\n >\n {view.kind === 'test' ? (\n <TestScheduleScreen\n schedule={view.schedule}\n agentName={agentLabel}\n mcpMounts={mcpMounts}\n onEditConfiguration={() => {\n setError(null);\n setView({ kind: 'form', saved: view.schedule });\n }}\n />\n ) : (\n <form id=\"schedule-form\" onSubmit={event => void handleSave(event)}>\n <ScheduleFormFields\n values={form}\n onChange={setForm}\n agentId={agentId}\n onAgentIdChange={isExternalEdit || isCreatedEdit ? undefined : setAgentId}\n agentOptions={agentOptions}\n agentPickerDisabled={isExternalEdit || isCreatedEdit}\n />\n </form>\n )}\n </SideDrawer>\n );\n}\n\nexport function ScheduleFormDrawer(props: ScheduleFormDrawerProps) {\n return (\n <DraftCatalogProvider>\n <ScheduleFormDrawerBody {...props} />\n </DraftCatalogProvider>\n );\n}\n","'use client';\n\nimport { cn } from '../lib/cn.js';\nimport { auiInputClass } from '../lib/inputClasses.js';\nimport { PopoverSelect } from '../primitives/PopoverSelect.js';\nimport {\n WEEKDAY_OPTIONS,\n formatCadenceSummary,\n getTimezoneOptions,\n valuesToCron,\n type RecurrenceKind,\n type ScheduleFormValues,\n} from './cadence.js';\n\nexport const RECURRENCE_OPTIONS: Array<{ value: RecurrenceKind; label: string }> = [\n { value: 'hourly', label: 'Hourly' },\n { value: 'daily', label: 'Daily' },\n { value: 'weekly', label: 'Weekly' },\n];\n\nconst HOUR_OPTIONS = Array.from({ length: 24 }, (_, hour) => ({\n value: String(hour),\n label: hour.toString().padStart(2, '0'),\n}));\nconst MINUTE_OPTIONS = [0, 15, 30, 45].map(minute => ({\n value: String(minute),\n label: `:${minute.toString().padStart(2, '0')}`,\n}));\n\nexport type ScheduleFormFieldsProps = {\n values: ScheduleFormValues;\n onChange: (next: ScheduleFormValues) => void;\n agentId: string;\n onAgentIdChange?: (agentId: string) => void;\n agentOptions: Array<{ agentId: string; name: string }>;\n agentPickerDisabled?: boolean;\n};\n\nexport function ScheduleFormFields({\n values,\n onChange,\n agentId,\n onAgentIdChange,\n agentOptions,\n agentPickerDisabled = false,\n}: ScheduleFormFieldsProps) {\n const cron = valuesToCron(values);\n const cadence = formatCadenceSummary({ cron, timezone: values.timezone });\n const timezoneOptions = getTimezoneOptions(values.timezone);\n\n const set = <K extends keyof ScheduleFormValues>(key: K, value: ScheduleFormValues[K]) => {\n onChange({ ...values, [key]: value });\n };\n\n const toggleWeekday = (day: number) => {\n const has = values.weekdays.includes(day);\n const weekdays = has ? values.weekdays.filter(d => d !== day) : [...values.weekdays, day];\n onChange({ ...values, weekdays: weekdays.length > 0 ? weekdays : [day] });\n };\n\n return (\n <div className=\"flex flex-col gap-4 px-5 py-4\">\n <div className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Agent</span>\n <PopoverSelect\n aria-label=\"Agent\"\n placeholder=\"Select an agent\"\n value={agentId}\n options={agentOptions.map(agent => ({ value: agent.agentId, label: agent.name }))}\n onValueChange={value => onAgentIdChange?.(value)}\n disabled={agentPickerDisabled || onAgentIdChange == null}\n />\n </div>\n\n <label className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Name</span>\n <input\n value={values.name}\n onChange={e => set('name', e.target.value)}\n placeholder=\"harness-daily-digest\"\n className={auiInputClass('h-8')}\n required\n />\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Task</span>\n <textarea\n value={values.task}\n onChange={e => set('task', e.target.value)}\n rows={3}\n placeholder=\"Summarise yesterday's harness runs and post the digest…\"\n className={auiInputClass('resize-y py-2')}\n required\n />\n </label>\n\n <fieldset>\n <legend className=\"mb-1.5 text-sm font-medium\">Recurrence</legend>\n <div className=\"grid grid-cols-3 gap-1 rounded-lg border border-border p-1\">\n {RECURRENCE_OPTIONS.map(opt => {\n const selected = values.recurrence === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={cn(\n 'rounded-md px-2 py-1.5 text-xs font-medium transition-colors',\n selected\n ? 'border border-primary-button-bg/40 bg-primary-button-bg/10 text-primary-button-bg'\n : 'text-text-secondary hover:bg-ghost-button-hover border border-transparent',\n )}\n aria-pressed={selected}\n onClick={() => set('recurrence', opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </fieldset>\n\n {values.recurrence === 'hourly' ? (\n <div className=\"block max-w-[8rem]\">\n <span className=\"mb-1.5 block text-sm font-medium\">Minute</span>\n <PopoverSelect\n aria-label=\"Minute\"\n value={String(values.minute)}\n options={MINUTE_OPTIONS}\n onValueChange={value => set('minute', Number(value))}\n />\n </div>\n ) : null}\n\n {values.recurrence === 'daily' || values.recurrence === 'weekly' ? (\n <div className=\"flex flex-wrap gap-3\">\n <div className=\"block min-w-[7rem] flex-1\">\n <span className=\"mb-1.5 block text-sm font-medium\">Hour</span>\n <PopoverSelect\n aria-label=\"Hour\"\n value={String(values.hour)}\n options={HOUR_OPTIONS}\n onValueChange={value => set('hour', Number(value))}\n />\n </div>\n <div className=\"block min-w-[7rem] flex-1\">\n <span className=\"mb-1.5 block text-sm font-medium\">Minute</span>\n <PopoverSelect\n aria-label=\"Minute\"\n value={String(values.minute)}\n options={MINUTE_OPTIONS}\n onValueChange={value => set('minute', Number(value))}\n />\n </div>\n </div>\n ) : null}\n\n {values.recurrence === 'weekly' ? (\n <fieldset>\n <legend className=\"mb-1.5 text-sm font-medium\">Days</legend>\n <div className=\"flex flex-wrap gap-1.5\">\n {WEEKDAY_OPTIONS.map(day => {\n const selected = values.weekdays.includes(day.value);\n return (\n <button\n key={day.value}\n type=\"button\"\n className={cn(\n 'rounded-md border px-2.5 py-1 text-xs font-medium',\n selected\n ? 'border-primary-button-bg/40 bg-primary-button-bg/10 text-primary-button-bg'\n : 'border-border text-text-secondary hover:bg-ghost-button-hover',\n )}\n aria-pressed={selected}\n onClick={() => toggleWeekday(day.value)}\n >\n {day.label}\n </button>\n );\n })}\n </div>\n </fieldset>\n ) : null}\n\n {values.recurrence === 'custom' ? (\n <div className=\"rounded-md border border-border bg-secondary-bg/40 px-3 py-2\">\n <span className=\"text-text-secondary block text-xs\">Existing custom schedule</span>\n <code className=\"text-text-primary mt-1 block font-mono text-sm\">{values.customCron}</code>\n <span className=\"text-text-secondary mt-1 block text-xs\">\n Select Hourly, Daily, or Weekly to replace this schedule.\n </span>\n </div>\n ) : null}\n\n <div className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Timezone</span>\n <PopoverSelect\n aria-label=\"Timezone\"\n value={values.timezone}\n options={timezoneOptions}\n onValueChange={value => set('timezone', value)}\n menuPlacement=\"top\"\n />\n </div>\n\n <div className=\"rounded-lg border border-border bg-secondary-bg/40 px-3 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <span className=\"text-text-secondary text-[10px] font-semibold tracking-wide uppercase\">Frequency</span>\n <code className=\"text-text-secondary font-mono text-xs\">{cron || '—'}</code>\n </div>\n <p className=\"text-text-primary mt-1 text-sm font-semibold\">{cadence || '—'}</p>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState, type ReactNode } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useOptionalCatalogServer, useScheduleServer } from '../../server/ServerContext.js';\nimport type { ConnectorState, Schedule, ScheduleRun } from '../../server/types.js';\nimport { useDraftCatalog } from '../draft/DraftCatalogProvider.js';\nimport { ConnectorConnectButton } from '../draft/DraftCompositeSelector.js';\nimport { cn } from '../lib/cn.js';\nimport { Button } from '../primitives/Button.js';\nimport { formatCadenceSummary, formatRelativeTime } from './cadence.js';\nimport { ScheduleRunChip } from './ScheduleRunChip.js';\nimport { runTypeLabel } from './scheduleRuns.js';\nimport { ScheduleStatusBadge } from './ScheduleStatusBadge.js';\n\nexport type ScheduleMcpMount = {\n name: string;\n};\n\nexport type TestScheduleScreenProps = {\n schedule: Schedule;\n agentName: string;\n mcpMounts: readonly ScheduleMcpMount[];\n onEditConfiguration: () => void;\n};\n\nfunction mountConnector(connectors: ConnectorState[], name: string): ConnectorState | null {\n return connectors.find(connector => connector.name === name || connector.id === name) ?? null;\n}\n\nfunction ScheduleMcpConnect({\n connector,\n onConnected,\n}: {\n connector: ConnectorState;\n onConnected: () => Promise<void>;\n}) {\n const catalog = useOptionalCatalogServer();\n if (catalog == null) return null;\n return <ConnectorConnectButton connector={connector} onConnected={onConnected} />;\n}\n\nfunction DetailRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-3 border-b border-border px-3 py-2.5 last:border-b-0\">\n <span className=\"text-text-secondary shrink-0 text-[10px] font-semibold tracking-wide uppercase\">{label}</span>\n <div className=\"min-w-0 text-right text-sm text-text-primary\">{children}</div>\n </div>\n );\n}\n\nexport function TestScheduleScreen({ schedule, agentName, mcpMounts, onEditConfiguration }: TestScheduleScreenProps) {\n const scheduleServer = useScheduleServer();\n const toaster = useToasterOptional();\n const { connectors, ensureLoaded, refreshConnectors, loading, error } = useDraftCatalog();\n const [running, setRunning] = useState(false);\n const [lastTestRun, setLastTestRun] = useState<ScheduleRun | null>(null);\n const cadence = formatCadenceSummary({ cron: schedule.cron, timezone: schedule.timezone });\n\n const handleRunTest = async () => {\n setRunning(true);\n try {\n const run = await scheduleServer.createScheduleRun({ scheduleId: schedule.id });\n setLastTestRun(run);\n toaster?.showSuccess({ title: 'Test run started' });\n } catch (caught) {\n toaster?.showError(caught);\n } finally {\n setRunning(false);\n }\n };\n\n useEffect(() => {\n ensureLoaded();\n }, [ensureLoaded]);\n\n useEffect(() => {\n if (error != null) toaster?.showError(error);\n }, [error, toaster]);\n\n return (\n <div className=\"flex flex-col gap-4 px-5 py-4\">\n <section className=\"overflow-hidden rounded-lg border border-border bg-card-bg\">\n <DetailRow label=\"Agent\">{agentName}</DetailRow>\n <DetailRow label=\"Name\">{schedule.name}</DetailRow>\n <DetailRow label=\"Task\">\n <span className=\"whitespace-pre-wrap break-words\">{schedule.task}</span>\n </DetailRow>\n <DetailRow label=\"Cadence\">\n <div className=\"flex flex-wrap items-center justify-end gap-1.5\">\n <span>{cadence}</span>\n <code className=\"text-text-secondary font-mono text-xs\">{schedule.cron}</code>\n </div>\n </DetailRow>\n <DetailRow label=\"Status\">\n <ScheduleStatusBadge status={schedule.status} />\n </DetailRow>\n <div className=\"flex justify-end px-3 py-2.5\">\n <Button.Secondary type=\"button\" size=\"small\" onClick={onEditConfiguration}>\n <Icon name=\"pencil\" className=\"size-3.5\" />\n Edit Configuration\n </Button.Secondary>\n </div>\n </section>\n\n <section className=\"overflow-hidden rounded-lg border border-border bg-card-bg\">\n <div className=\"border-b border-border px-3 py-2\">\n <h3 className=\"text-text-secondary text-[10px] font-semibold tracking-wide uppercase\">Tool Authorization</h3>\n </div>\n {mcpMounts.length === 0 ? (\n <p className=\"text-text-secondary px-3 py-3 text-sm\">No MCP connectors configured for this agent.</p>\n ) : (\n <ul className=\"divide-y divide-border\">\n {mcpMounts.map(mount => {\n const connector = mountConnector(connectors, mount.name);\n const authenticated = connector?.authenticated === true;\n const unavailable = connector == null && !loading;\n return (\n <li key={mount.name} className=\"flex items-center gap-2 px-3 py-2.5\">\n <span\n className={cn(\n 'inline-flex size-4 shrink-0 items-center justify-center rounded-full border',\n authenticated\n ? 'border-emerald-600/40 bg-emerald-500/15 text-emerald-700 dark:text-emerald-300'\n : 'border-border text-transparent',\n )}\n aria-hidden\n >\n {authenticated ? <Icon name=\"check\" className=\"size-3\" /> : null}\n </span>\n <span className=\"text-text-primary min-w-0 flex-1 truncate text-sm\">{mount.name}</span>\n {authenticated ? (\n <span className=\"text-success-bg text-xs font-medium\">Connected</span>\n ) : unavailable ? (\n <span className=\"text-text-secondary text-xs\">Unavailable</span>\n ) : connector != null && connector.authenticated === false ? (\n <ScheduleMcpConnect connector={connector} onConnected={refreshConnectors} />\n ) : loading ? (\n <span className=\"text-text-secondary text-xs\">Loading…</span>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n\n <section className=\"overflow-hidden rounded-lg border border-border bg-card-bg\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border px-3 py-2\">\n <h3 className=\"text-text-secondary text-[10px] font-semibold tracking-wide uppercase\">Test Run</h3>\n <Button.Primary type=\"button\" disabled={running} size=\"small\" onClick={() => void handleRunTest()}>\n <Icon name={running ? 'loader' : 'play'} className={cn('size-3.5', running && 'animate-spin')} />\n Run Test\n </Button.Primary>\n </div>\n {lastTestRun == null ? (\n <p className=\"text-text-secondary px-3 py-3 text-sm\">\n Run a one-off test using the schedule task. This does not change the cron pending run.\n </p>\n ) : (\n <div className=\"flex items-center gap-3 px-3 py-3\">\n <ScheduleRunChip run={lastTestRun} />\n <div className=\"min-w-0 text-sm\">\n <p className=\"text-text-primary font-medium\">{runTypeLabel(lastTestRun.name)}</p>\n <p className=\"text-text-secondary\">\n {formatRelativeTime(lastTestRun.triggeredAt ?? lastTestRun.scheduledFor)}\n </p>\n </div>\n </div>\n )}\n </section>\n </div>\n );\n}\n","import type { ScheduleRun, ScheduleRunStatus } from '../../server/types.js';\n\nexport function isManualRun(name: string): boolean {\n return name.startsWith('manual-');\n}\n\nexport function runChipKind(status: ScheduleRunStatus): 'success' | 'failed' {\n if (status === 'failed') return 'failed';\n return 'success';\n}\n\nexport function runStatusLabel(status: ScheduleRunStatus): string {\n if (status === 'failed') return 'Failed';\n if (status === 'triggered') return 'Triggered';\n return 'Scheduled';\n}\n\nexport function runTypeLabel(name: string): string {\n return isManualRun(name) ? 'Manual test' : 'Cron';\n}\n\n/** Newest-first API rows → up to `limit` historical runs, oldest on the left. */\nexport function lastHistoricalRuns(runs: readonly ScheduleRun[], limit = 5): ScheduleRun[] {\n const historical = runs.filter(run => run.status !== 'scheduled');\n return historical.slice(0, limit).reverse();\n}\n\nexport function formatScheduleRunInstant(iso: string | null): string {\n if (iso == null) return '—';\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return '—';\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n}\n","'use client';\n\nimport type { ScheduleRun } from '../../server/types.js';\nimport { formatScheduleRunInstant, runStatusLabel, runTypeLabel } from './scheduleRuns.js';\n\nexport function ScheduleRunTooltip({ run }: { run: ScheduleRun }) {\n return (\n <div className=\"flex flex-col gap-1 text-left text-xs\">\n <p className=\"text-text-primary font-medium\">{runStatusLabel(run.status)}</p>\n <p className=\"text-text-secondary\">{runTypeLabel(run.name)}</p>\n <p className=\"text-text-secondary\">Scheduled for: {formatScheduleRunInstant(run.scheduledFor)}</p>\n {run.triggeredAt != null ? (\n <p className=\"text-text-secondary\">Triggered at: {formatScheduleRunInstant(run.triggeredAt)}</p>\n ) : null}\n <p className=\"text-text-secondary\">Triggered by: {run.triggeredBy}</p>\n </div>\n );\n}\n","'use client';\n\nimport { Icon } from '../../icons/Icon.js';\nimport type { ScheduleRun } from '../../server/types.js';\nimport { cn } from '../lib/cn.js';\nimport { Tooltip } from '../primitives/Tooltip.js';\nimport { formatScheduleRunInstant, runChipKind, runStatusLabel } from './scheduleRuns.js';\nimport { ScheduleRunTooltip } from './ScheduleRunTooltip.js';\n\nconst CHIP_STYLES = {\n success:\n 'border-emerald-600/30 bg-emerald-500/10 text-emerald-700 dark:border-emerald-400/35 dark:bg-emerald-500/15 dark:text-emerald-300',\n failed: 'border-red-600/30 bg-red-500/10 text-red-700 dark:border-red-400/35 dark:bg-red-500/15 dark:text-red-300',\n} as const;\n\nexport function ScheduleRunChip({ run }: { run: ScheduleRun }) {\n const kind = runChipKind(run.status);\n const when = formatScheduleRunInstant(run.triggeredAt ?? run.scheduledFor);\n return (\n <Tooltip content={<ScheduleRunTooltip run={run} />} side=\"top\">\n <span\n className={cn('inline-flex size-6 shrink-0 items-center justify-center rounded-md border', CHIP_STYLES[kind])}\n aria-label={`${runStatusLabel(run.status)} run at ${when}`}\n >\n <Icon name={kind === 'failed' ? 'triangle-exclamation' : 'check'} className=\"size-3.5\" />\n </span>\n </Tooltip>\n );\n}\n","'use client';\n\nimport type { ScheduleStatus } from '../../server/types.js';\nimport { cn } from '../lib/cn.js';\n\nexport function ScheduleStatusBadge({ status }: { status: ScheduleStatus }) {\n const active = status === 'active';\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium',\n active\n ? 'border-emerald-600/30 bg-emerald-500/10 text-emerald-700 dark:border-emerald-400/35 dark:bg-emerald-500/15 dark:text-emerald-300'\n : 'border-border bg-secondary-bg text-text-secondary',\n )}\n >\n <span\n className={cn(\n 'size-1.5 shrink-0 rounded-full',\n active ? 'bg-emerald-600 dark:bg-emerald-400' : 'bg-text-secondary',\n )}\n aria-hidden\n />\n {active ? 'Active' : 'Paused'}\n </span>\n );\n}\n","'use client';\n\nimport type { ScheduleRun } from '../../server/types.js';\nimport { ScheduleRunChip } from './ScheduleRunChip.js';\nimport { lastHistoricalRuns } from './scheduleRuns.js';\n\nexport function ScheduleLastRunsCell({ runs }: { runs: readonly ScheduleRun[] }) {\n const history = lastHistoricalRuns(runs);\n if (history.length === 0) {\n return <span className=\"text-text-secondary text-sm\">—</span>;\n }\n return (\n <div className=\"flex items-center gap-1\">\n {history.map(run => (\n <ScheduleRunChip key={run.id} run={run} />\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useMemo","useState","useEffect","useState","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","saved","jsx","jsx","jsxs","useState","useEffect","useMemo"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/icons/Icon.tsx","../src/icons/IconRegistry.tsx","../src/atoms/primitives/Spinner.tsx","../src/atoms/lib/buttonClasses.ts","../src/utils/getErrorMessage.ts","../src/atoms/PageHeader.tsx","../src/atoms/lib/CompactLayoutContext.tsx","../src/atoms/draft/DraftCatalogProvider.tsx"],"sourcesContent":["import { createElement, isValidElement, useContext, type CSSProperties, type ReactNode } from 'react';\n\nimport { cn } from '../atoms/lib/cn.js';\nimport { ThemeContext } from '../theme/ThemeProvider.js';\nimport type { IconComponent, IconEntry, IconProps as ThemeIconProps } from '../theme/types.js';\nimport { lookupIcon, resolveIconName } from './IconRegistry.js';\n\nexport type IconProps = ThemeIconProps & {\n name: string | readonly string[];\n};\n\ntype IconRenderProps = {\n className?: string;\n style?: CSSProperties;\n size?: string | number;\n width?: string | number;\n height?: string | number;\n role?: string;\n} & Pick<IconProps, 'aria-hidden' | 'aria-label' | 'data-testid'>;\n\nfunction isComponent(entry: IconEntry): entry is IconComponent {\n if (typeof entry === 'function') return true;\n // Lucide (and other) icons are forwardRef objects, not functions\n return (\n typeof entry === 'object' &&\n entry !== null &&\n !isValidElement(entry) &&\n !Array.isArray(entry) &&\n '$$typeof' in entry\n );\n}\n\nfunction renderEntry(entry: IconEntry, props: IconRenderProps): ReactNode {\n if (isComponent(entry)) {\n const { size, className, style, ...aria } = props;\n return createElement(entry, {\n className: cn('inline-block shrink-0', className),\n style,\n size,\n width: size,\n height: size,\n 'aria-hidden': aria['aria-label'] ? undefined : (aria['aria-hidden'] ?? true),\n 'aria-label': aria['aria-label'],\n ...(aria['data-testid'] === undefined ? {} : { 'data-testid': aria['data-testid'] }),\n role: aria['aria-label'] ? 'img' : undefined,\n });\n }\n return entry;\n}\n\nexport function Icon({ name, className, style, size = '1em', ...aria }: IconProps) {\n const themeIcons = useContext(ThemeContext)?.icons;\n const resolved = resolveIconName(name);\n const entry = lookupIcon(resolved, themeIcons);\n if (!entry) return null;\n return <>{renderEntry(entry, { className, style, size, ...aria })}</>;\n}\n\nexport function useIcon(name: string | readonly string[]): IconEntry | undefined {\n const themeIcons = useContext(ThemeContext)?.icons;\n return lookupIcon(resolveIconName(name), themeIcons);\n}\n","import {\n Archive,\n ArrowDown,\n ArrowLeft,\n ArrowUp,\n BookOpen,\n Bot,\n Box,\n Brain,\n Calendar,\n CalendarClock,\n CalendarPlus,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n CircleAlert,\n CircleCheck,\n CircleX,\n Clock,\n Code2,\n Copy,\n Cpu,\n Download,\n Ellipsis,\n EllipsisVertical,\n ExternalLink,\n File,\n Github,\n GripVertical,\n History,\n Info,\n LibraryBig,\n Lightbulb,\n LineChart,\n Link2,\n ListChecks,\n ListFilter,\n ListOrdered,\n Loader2,\n Lock,\n LogOut,\n Maximize2,\n Menu,\n MessageSquareText,\n Minimize2,\n Moon,\n PanelLeftClose,\n PanelLeftOpen,\n Paperclip,\n Pause,\n Pencil,\n Play,\n Plug,\n Plus,\n RotateCw,\n Save,\n Search,\n Settings,\n SlidersHorizontal,\n Sparkle,\n SquareArrowOutUpRight,\n SquarePen,\n Sun,\n Terminal,\n Trash2,\n TriangleAlert,\n Wrench,\n X,\n} from 'lucide-react';\nimport type { SVGProps } from 'react';\n\nimport type { IconEntry, IconMap } from '../theme/types.js';\n\n/** Lucide `broom` (https://lucide.dev/icons/broom) — not in lucide-react 0.x. */\nfunction Broom({ size = 24, ...props }: SVGProps<SVGSVGElement> & { size?: string | number }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M13.5 10.5 22 2\" />\n <path d=\"M14.734 13.841a2 2 0 00-.314-2.42L12.58 9.58a2 2 0 00-2.421-.314l-7.657 4.461A1 1 0 002.3 15.3l6.403 6.403a1 1 0 001.571-.204z\" />\n <path d=\"m5 18 2-2\" />\n <path d=\"m7.699 10.7 5.602 5.601\" />\n </svg>\n );\n}\n\nconst registry = new Map<string, IconEntry>();\n\nexport function registerIcon(name: string, icon: IconEntry): void {\n registry.set(name, icon);\n}\n\nexport function registerIcons(icons: IconMap): void {\n for (const [name, icon] of Object.entries(icons)) {\n registry.set(name, icon);\n }\n}\n\nexport function getIcon(name: string): IconEntry | undefined {\n return registry.get(name);\n}\n\nexport function resolveIconName(icon: string | readonly string[]): string {\n if (typeof icon === 'string') return icon;\n // e.g. [\"far\", \"clone\"] → \"clone\"\n return icon[icon.length - 1] ?? '';\n}\n\nconst defaults: Record<string, IconEntry> = {\n paperclip: Paperclip,\n 'arrow-up': ArrowUp,\n 'arrow-down': ArrowDown,\n 'arrow-left': ArrowLeft,\n xmark: X,\n check: Check,\n pencil: Pencil,\n play: Play,\n pause: Pause,\n calendar: Calendar,\n 'calendar-clock': CalendarClock,\n 'calendar-plus': CalendarPlus,\n 'grip-vertical': GripVertical,\n 'square-pen': SquarePen,\n 'rotate-right': RotateCw,\n broom: Broom,\n ellipsis: Ellipsis,\n 'ellipsis-vertical': EllipsisVertical,\n trash: Trash2,\n 'box-archive': Archive,\n 'clock-rotate-left': History,\n 'circle-exclamation': CircleAlert,\n info: Info,\n 'triangle-exclamation': TriangleAlert,\n 'chevron-down': ChevronDown,\n 'chevron-left': ChevronLeft,\n 'chevron-right': ChevronRight,\n loader: Loader2,\n file: File,\n clone: Copy,\n copy: Copy,\n bars: Menu,\n 'panel-left-close': PanelLeftClose,\n 'panel-left-open': PanelLeftOpen,\n plus: Plus,\n sun: Sun,\n moon: Moon,\n settings: Settings,\n sliders: SlidersHorizontal,\n 'log-out': LogOut,\n search: Search,\n clock: Clock,\n 'circle-check': CircleCheck,\n 'circle-xmark': CircleX,\n 'oauth-success': CircleCheck,\n 'oauth-error': CircleX,\n 'oauth-loading': Loader2,\n 'welcome-sparkle': Sparkle,\n robot: Bot,\n bot: Bot,\n 'library-big': LibraryBig,\n 'message-square-text': MessageSquareText,\n 'book-open': BookOpen,\n funnel: ListFilter,\n plug: Plug,\n 'list-check': ListChecks,\n lock: Lock,\n lightbulb: Lightbulb,\n link: Link2,\n wrench: Wrench,\n cpu: Cpu,\n cube: Box,\n 'list-ol': ListOrdered,\n download: Download,\n save: Save,\n brain: Brain,\n terminal: Terminal,\n code: Code2,\n chart: LineChart,\n expand: Maximize2,\n 'expand-alt': Maximize2,\n compress: Minimize2,\n 'external-link': ExternalLink,\n 'square-arrow-out-up-right': SquareArrowOutUpRight,\n github: Github,\n};\n\nfor (const [name, icon] of Object.entries(defaults)) {\n registry.set(name, icon);\n}\n\n/** Merge host `theme.icons` over the registry for a single lookup (does not mutate). */\nexport function lookupIcon(name: string, themeIcons?: IconMap): IconEntry | undefined {\n if (themeIcons && name in themeIcons) {\n return themeIcons[name];\n }\n return registry.get(name);\n}\n","import React from 'react';\n\nimport { cn } from '../lib/cn.js';\n\nexport type SpinnerProps = React.SVGProps<SVGSVGElement> & {\n size?: number;\n};\n\nexport function Spinner({ size = 16, className, ...props }: SpinnerProps) {\n const r = (size / 2) * 0.75;\n const cx = size / 2;\n const circumference = 2 * Math.PI * r;\n\n return (\n <svg\n role=\"status\"\n aria-label=\"Loading\"\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n fill=\"none\"\n className={cn('animate-spin', className)}\n {...props}\n >\n <circle\n cx={cx}\n cy={cx}\n r={r}\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference * 0.75} ${circumference * 0.25}`}\n opacity={0.8}\n />\n </svg>\n );\n}\n","import { cn } from './cn.js';\n\nexport type AuiButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';\nexport type AuiButtonSize = 'large' | 'small' | 'icon';\n\nconst variantClasses: Record<AuiButtonVariant, string> = {\n primary: 'bg-primary-button-bg text-primary-button-text shadow hover:bg-primary-button-hover',\n secondary:\n 'border border-input-border bg-secondary-button-bg text-secondary-button-text hover:bg-secondary-button-hover',\n ghost: 'bg-ghost-button-bg text-ghost-button-text hover:bg-ghost-button-hover',\n destructive: 'bg-failure-bg text-failure-text shadow-sm hover:bg-failure-bg/90',\n};\n\n/** Glyph sizes match the shared design-system Button (`iconSizeMap`: large 0.875rem, small 0.75rem). */\nconst sizeClasses: Record<AuiButtonSize, string> = {\n large: 'h-8 gap-2 px-2.5 text-sm [&_svg]:size-3.5',\n small: 'h-6 gap-1 px-1.5 text-xs [&_svg]:size-3',\n icon: 'h-8 w-8 shrink-0 gap-0 p-0 [&_svg]:size-3.5',\n};\n\nconst baseClasses =\n 'inline-flex cursor-pointer items-center justify-center whitespace-nowrap rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50';\n\n/** Sidebar / rail nav control corner radius: 12px. */\nexport const sidebarButtonRadiusClassName = 'rounded-[0.75rem]';\n\n/** Compact sidebar rail control: 58×54px → 3.625rem × 3.375rem. */\nexport const sidebarRailButtonClassName = cn(\n sidebarButtonRadiusClassName,\n 'h-[3.375rem] w-[3.625rem] shrink-0 flex-col gap-1 whitespace-normal px-0.5 text-[0.625rem] font-normal leading-tight !justify-center shadow-none hover:bg-secondary-button-hover hover:text-ghost-button-text [&_svg]:size-3.5',\n);\n\n/** Shared Button / native `<button>` className helper (SDK utilities are layered). */\nexport function auiButtonClass({\n variant = 'primary',\n size = 'large',\n className,\n}: {\n variant?: AuiButtonVariant;\n size?: AuiButtonSize;\n className?: string;\n} = {}): string {\n return cn(baseClasses, variantClasses[variant], sizeClasses[size], className);\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","'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { cn } from './lib/cn.js';\n\n/** Shared title styles for page / chat chrome headers. */\nexport const pageHeaderTitleClassName = 'text-text-primary min-w-0 truncate text-md font-semibold';\n\nexport type PageHeaderProps = {\n /** Page name, or a custom title node (e.g. `NamedAgentHeaderLabel`). Strings use the shared h1 styles. */\n title?: ReactNode;\n /** Leading chrome (back / menu). */\n start?: ReactNode;\n /** Trailing actions; pushed to the end. */\n end?: ReactNode;\n /** Extra content between title and end (prefer `start` / `end` when possible). */\n children?: ReactNode;\n className?: string;\n};\n\n/** Shared shell/page header bar used by chat chrome and list pages.\n * `min-h-14` keeps a single-row bar aligned with Agent Config; wrapping end actions can grow the bar.\n */\nexport function PageHeader({ title, start, end, children, className }: PageHeaderProps) {\n return (\n <header\n className={cn(\n 'flex min-h-14 shrink-0 flex-wrap items-center gap-2 border-b border-border px-4 md:px-6',\n className,\n )}\n >\n {start}\n {typeof title === 'string' ? <h1 className={pageHeaderTitleClassName}>{title}</h1> : title}\n {children}\n {end != null ? <div className=\"ml-auto flex min-w-0 flex-wrap items-center gap-2\">{end}</div> : null}\n </header>\n );\n}\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\nconst CompactLayoutContext = createContext(false);\n\nexport function CompactLayoutProvider({ children }: { children: ReactNode }) {\n return <CompactLayoutContext.Provider value>{children}</CompactLayoutContext.Provider>;\n}\n\nexport function useCompactLayout() {\n return useContext(CompactLayoutContext);\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type {\n AgentSkill,\n AgentUIServer,\n ConnectorCatalogEntry,\n ConnectorState,\n ListResult,\n ModelSelection,\n} from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\n\n/** Picker page size for MCP infinite scroll. */\nexport const MCP_CONNECTORS_PAGE_SIZE = 50;\n\ntype DraftCatalogValue = {\n models: ModelSelection[];\n skills: AgentSkill[];\n connectors: ConnectorState[];\n /** Connector logo URL keyed by connector name, sourced from the discovery catalog. */\n connectorLogos: Record<string, string>;\n connectorsHasMore: boolean;\n connectorsLoadMoreFailed: boolean;\n connectorsLoadingMore: boolean;\n loaded: boolean;\n loading: boolean;\n error: string | null;\n /** Kick off catalog fetch (idempotent). Call when a picker opens. */\n ensureLoaded: () => void;\n /** Reload all collections after settings mutate catalog-backed configuration. */\n refresh: () => void;\n /** Refresh connector auth state without reloading unrelated catalogs. */\n refreshConnectors: () => Promise<void>;\n /** Append the next MCP page when `connectorsHasMore`. */\n loadMoreConnectors: () => void;\n};\n\ntype DraftCatalogContextValue = DraftCatalogValue & {\n server: AgentUIServer | null;\n};\n\nconst DraftCatalogContext = createContext<DraftCatalogContextValue | null>(null);\n\nconst IDLE_ENSURE = () => undefined;\nconst IDLE_REFRESH = async () => undefined;\nconst EMPTY_LOGOS: Record<string, string> = {};\n\nfunction toConnectorLogos(entries: ConnectorCatalogEntry[]): Record<string, string> {\n const logos: Record<string, string> = {};\n for (const entry of entries) {\n if (entry.logo) logos[entry.name] = entry.logo;\n }\n return logos;\n}\n\nfunction appendConnectors({\n previous,\n next,\n}: {\n previous: ConnectorState[];\n next: ConnectorState[];\n}): ConnectorState[] {\n if (next.length === 0) return previous;\n const seen = new Set(previous.map(connector => connector.id));\n const appended = next.filter(connector => !seen.has(connector.id));\n return appended.length === 0 ? previous : [...previous, ...appended];\n}\n\nasync function fetchMcpPage({\n server,\n pageToken,\n}: {\n server: AgentUIServer;\n pageToken?: string;\n}): Promise<ListResult<ConnectorState>> {\n if (server.listMcp != null) {\n return server.listMcp({\n limit: MCP_CONNECTORS_PAGE_SIZE,\n ...(pageToken === undefined ? {} : { pageToken }),\n });\n }\n const data = await server.getMcp();\n return { data };\n}\n\nexport function DraftCatalogProvider({ children }: { children: ReactNode }) {\n const server = useOptionalServer();\n const existing = useContext(DraftCatalogContext);\n if (existing?.server === server) {\n return children;\n }\n return <DraftCatalogStore server={server}>{children}</DraftCatalogStore>;\n}\n\nfunction DraftCatalogStore({ server, children }: { server: AgentUIServer | null; children: ReactNode }) {\n const [requestEpoch, setRequestEpoch] = useState<number | null>(null);\n const [models, setModels] = useState<ModelSelection[]>([]);\n const [skills, setSkills] = useState<AgentSkill[]>([]);\n const [connectors, setConnectors] = useState<ConnectorState[]>([]);\n const [connectorLogos, setConnectorLogos] = useState<Record<string, string>>(EMPTY_LOGOS);\n const [connectorsNextPageToken, setConnectorsNextPageToken] = useState<string | undefined>(undefined);\n const [connectorsLoadMoreFailed, setConnectorsLoadMoreFailed] = useState(false);\n const [connectorsLoadingMore, setConnectorsLoadingMore] = useState(false);\n const [completedEpoch, setCompletedEpoch] = useState<number | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const connectorsNextPageTokenRef = useRef(connectorsNextPageToken);\n const connectorsLoadingMoreRef = useRef(connectorsLoadingMore);\n const loadMoreFailedRef = useRef(false);\n connectorsNextPageTokenRef.current = connectorsNextPageToken;\n connectorsLoadingMoreRef.current = connectorsLoadingMore;\n\n const ensureLoaded = useCallback(() => {\n setRequestEpoch(current => current ?? 0);\n }, []);\n\n const refresh = useCallback(() => {\n loadMoreFailedRef.current = false;\n setConnectorsLoadMoreFailed(false);\n setRequestEpoch(current => (current ?? -1) + 1);\n }, []);\n\n const refreshConnectors = useCallback(async () => {\n if (!server) return;\n setLoading(true);\n setError(null);\n loadMoreFailedRef.current = false;\n setConnectorsLoadMoreFailed(false);\n try {\n const page = await fetchMcpPage({ server });\n setConnectors(page.data);\n setConnectorsNextPageToken(page.nextPageToken);\n } catch (reason: unknown) {\n setError(getErrorMessage(reason, 'Failed to load connectors.'));\n } finally {\n setLoading(false);\n }\n }, [server]);\n\n const loadMoreConnectors = useCallback(() => {\n if (!server) return;\n const pageToken = connectorsNextPageTokenRef.current;\n if (pageToken == null || pageToken.length === 0 || connectorsLoadingMoreRef.current) return;\n\n setConnectorsLoadMoreFailed(false);\n setConnectorsLoadingMore(true);\n void fetchMcpPage({ server, pageToken })\n .then(page => {\n setConnectors(previous => appendConnectors({ previous, next: page.data }));\n setConnectorsNextPageToken(page.nextPageToken);\n // Clear a stale load-more failure once a retry succeeds.\n if (loadMoreFailedRef.current) {\n loadMoreFailedRef.current = false;\n setError(null);\n }\n })\n .catch((reason: unknown) => {\n loadMoreFailedRef.current = true;\n setConnectorsLoadMoreFailed(true);\n setError(getErrorMessage(reason, 'Failed to load more connectors.'));\n })\n .finally(() => {\n setConnectorsLoadingMore(false);\n });\n }, [server]);\n\n useEffect(() => {\n if (requestEpoch === null || !server) return;\n let cancelled = false;\n setLoading(true);\n setError(null);\n loadMoreFailedRef.current = false;\n setConnectorsLoadMoreFailed(false);\n // Settle each list alone so one failing picker does not blank the others.\n // Logos are cosmetic: a missing catalog port or a failed fetch just falls back to icons.\n const connectorCatalog = server.catalog?.connectorCatalog;\n void Promise.allSettled([\n server.getModels(),\n server.getSkills(),\n fetchMcpPage({ server }),\n connectorCatalog ? connectorCatalog.getConnectorCatalog() : Promise.resolve([]),\n ]).then(([modelsResult, skillsResult, mcpResult, catalogResult]) => {\n if (cancelled) return;\n setConnectorLogos(catalogResult.status === 'fulfilled' ? toConnectorLogos(catalogResult.value) : EMPTY_LOGOS);\n const errors: string[] = [];\n if (modelsResult.status === 'fulfilled') {\n setModels(modelsResult.value);\n } else {\n errors.push(getErrorMessage(modelsResult.reason, 'Failed to load models.'));\n }\n if (skillsResult.status === 'fulfilled') {\n setSkills(skillsResult.value);\n } else {\n errors.push(getErrorMessage(skillsResult.reason, 'Failed to load skills.'));\n }\n if (mcpResult.status === 'fulfilled') {\n setConnectors(mcpResult.value.data);\n setConnectorsNextPageToken(mcpResult.value.nextPageToken);\n } else {\n errors.push(getErrorMessage(mcpResult.reason, 'Failed to load connectors.'));\n }\n setError(errors[0] ?? null);\n setCompletedEpoch(requestEpoch);\n setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [requestEpoch, server]);\n\n const connectorsHasMore = connectorsNextPageToken != null && connectorsNextPageToken.length > 0;\n const loaded = requestEpoch !== null && completedEpoch === requestEpoch;\n const value = useMemo(\n () => ({\n server,\n models,\n skills,\n connectors,\n connectorLogos,\n connectorsHasMore,\n connectorsLoadMoreFailed,\n connectorsLoadingMore,\n loaded,\n loading,\n error,\n ensureLoaded,\n refresh,\n refreshConnectors,\n loadMoreConnectors,\n }),\n [\n server,\n models,\n skills,\n connectors,\n connectorLogos,\n connectorsHasMore,\n connectorsLoadMoreFailed,\n connectorsLoadingMore,\n loaded,\n loading,\n error,\n ensureLoaded,\n refresh,\n refreshConnectors,\n loadMoreConnectors,\n ],\n );\n\n return <DraftCatalogContext.Provider value={value}>{children}</DraftCatalogContext.Provider>;\n}\n\nexport function useDraftCatalog(): DraftCatalogValue {\n const ctx = useContext(DraftCatalogContext);\n if (ctx == null) {\n return {\n models: [],\n skills: [],\n connectors: [],\n connectorLogos: EMPTY_LOGOS,\n connectorsHasMore: false,\n connectorsLoadMoreFailed: false,\n connectorsLoadingMore: false,\n loaded: false,\n loading: false,\n error: null,\n ensureLoaded: IDLE_ENSURE,\n refresh: IDLE_ENSURE,\n refreshConnectors: IDLE_REFRESH,\n loadMoreConnectors: IDLE_ENSURE,\n };\n }\n return ctx;\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","jsxs","useContext","jsx","createContext","useContext","jsx","createContext","useContext"]}