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

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 (85) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/{AgentCodeSnippets-U6KQWVBJ.js → AgentCodeSnippets-UWKIJI6U.js} +7 -7
  3. package/dist/AgentMetricChart-4ZJJED5Q.js +15 -0
  4. package/dist/{AgentOverview-RLJ6HZCN.js → AgentOverview-UZBCVNMP.js} +11 -9
  5. package/dist/AgentOverview-UZBCVNMP.js.map +1 -0
  6. package/dist/{AgentSessionEventTimeline-CDXRRUZQ.js → AgentSessionEventTimeline-N4RXG2NU.js} +7 -7
  7. package/dist/{AgentSessionEventTimelineChart-S2WX6ZEA.js → AgentSessionEventTimelineChart-EMWNJMMK.js} +7 -7
  8. package/dist/{AgentSessions-UI3L7XY2.js → AgentSessions-CD7JAQTC.js} +8 -8
  9. package/dist/{ConnectorSettings-OIGAC2HU.js → ConnectorSettings-GEI4S6SD.js} +7 -7
  10. package/dist/{DockLayout-J5BRKMJZ.js → DockLayout-JZ4DKDOR.js} +10 -10
  11. package/dist/{DrawerLayout-65YHGHIF.js → DrawerLayout-AV4FJTGV.js} +11 -11
  12. package/dist/{ModelSettings-VP6WCMGT.js → ModelSettings-4TNETPJJ.js} +7 -7
  13. package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
  14. package/dist/{SandboxSettings-GTZT7LD6.js → SandboxSettings-IEIWFKQW.js} +7 -7
  15. package/dist/SchedulesPage-ZG5IMQI3.js +15 -0
  16. package/dist/{SettingsBuilder-A4BPYIFZ.js → SettingsBuilder-B2ULQPIT.js} +9 -9
  17. package/dist/{SettingsBuilder-A4BPYIFZ.js.map → SettingsBuilder-B2ULQPIT.js.map} +1 -1
  18. package/dist/{ShellRouteSync-SSLGM35F.js → ShellRouteSync-SJXFKUAJ.js} +4 -4
  19. package/dist/{SidebarLayout-MFDOGAVJ.js → SidebarLayout-XUM2Y6PA.js} +12 -12
  20. package/dist/{SkillSettings-WQPUQ5TE.js → SkillSettings-NHBL5ZXU.js} +7 -7
  21. package/dist/{TrueForgeUIWithRouter-5CDICMCE.js → TrueForgeUIWithRouter-NVV7IXXP.js} +9 -9
  22. package/dist/{WidgetLayout-HE7E4UL5.js → WidgetLayout-T7DBLKV3.js} +10 -10
  23. package/dist/{chunk-F7ZAQIRE.js → chunk-22A4HHBQ.js} +27 -16
  24. package/dist/{chunk-F7ZAQIRE.js.map → chunk-22A4HHBQ.js.map} +1 -1
  25. package/dist/{chunk-6CFZHEYH.js → chunk-2GIZY3JJ.js} +32 -3
  26. package/dist/chunk-2GIZY3JJ.js.map +1 -0
  27. package/dist/{chunk-2BDTG544.js → chunk-2QTH6JHX.js} +3 -3
  28. package/dist/{chunk-TGKQRK3S.js → chunk-3R62ISBR.js} +5 -5
  29. package/dist/{chunk-KCYBMKQL.js → chunk-3TV6SKGW.js} +4 -4
  30. package/dist/{chunk-MAA7U4RF.js → chunk-3ZW74FHC.js} +3 -3
  31. package/dist/{chunk-GTTMLDCI.js → chunk-CG75X77Q.js} +2 -2
  32. package/dist/{chunk-2OKGEU6X.js → chunk-DNOQ4WYH.js} +360 -217
  33. package/dist/chunk-DNOQ4WYH.js.map +1 -0
  34. package/dist/{chunk-IOPHQEUY.js → chunk-GA4AC4XL.js} +2 -2
  35. package/dist/chunk-JCL3Q7RW.js +587 -0
  36. package/dist/chunk-JCL3Q7RW.js.map +1 -0
  37. package/dist/{chunk-VXKNS7FH.js → chunk-NFUX2ESW.js} +9 -9
  38. package/dist/{chunk-XO3FYN2W.js → chunk-NYMNCYWL.js} +8 -8
  39. package/dist/chunk-NYMNCYWL.js.map +1 -0
  40. package/dist/{chunk-E4GVP6PM.js → chunk-T6QQV5LK.js} +55 -12
  41. package/dist/chunk-T6QQV5LK.js.map +1 -0
  42. package/dist/{chunk-MJULWIPI.js → chunk-TDG7GHXE.js} +478 -268
  43. package/dist/chunk-TDG7GHXE.js.map +1 -0
  44. package/dist/index.d.ts +27 -15
  45. package/dist/index.js +12 -12
  46. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +2 -1
  47. package/dist/plugins/trueforge-agent-server-adapter/index.js +65 -14
  48. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  49. package/dist/styles.css +1 -1
  50. package/package.json +4 -3
  51. package/dist/AgentMetricChart-3D6FUFO6.js +0 -15
  52. package/dist/AgentOverview-RLJ6HZCN.js.map +0 -1
  53. package/dist/OpenUiFenceBlock-UTDCTNTM.js +0 -9
  54. package/dist/SchedulesPage-ARWU7BZF.js +0 -15
  55. package/dist/chunk-2OKGEU6X.js.map +0 -1
  56. package/dist/chunk-6CFZHEYH.js.map +0 -1
  57. package/dist/chunk-E4GVP6PM.js.map +0 -1
  58. package/dist/chunk-MJULWIPI.js.map +0 -1
  59. package/dist/chunk-P7J2ABEP.js +0 -587
  60. package/dist/chunk-P7J2ABEP.js.map +0 -1
  61. package/dist/chunk-XO3FYN2W.js.map +0 -1
  62. /package/dist/{AgentCodeSnippets-U6KQWVBJ.js.map → AgentCodeSnippets-UWKIJI6U.js.map} +0 -0
  63. /package/dist/{AgentMetricChart-3D6FUFO6.js.map → AgentMetricChart-4ZJJED5Q.js.map} +0 -0
  64. /package/dist/{AgentSessionEventTimeline-CDXRRUZQ.js.map → AgentSessionEventTimeline-N4RXG2NU.js.map} +0 -0
  65. /package/dist/{AgentSessionEventTimelineChart-S2WX6ZEA.js.map → AgentSessionEventTimelineChart-EMWNJMMK.js.map} +0 -0
  66. /package/dist/{AgentSessions-UI3L7XY2.js.map → AgentSessions-CD7JAQTC.js.map} +0 -0
  67. /package/dist/{ConnectorSettings-OIGAC2HU.js.map → ConnectorSettings-GEI4S6SD.js.map} +0 -0
  68. /package/dist/{DockLayout-J5BRKMJZ.js.map → DockLayout-JZ4DKDOR.js.map} +0 -0
  69. /package/dist/{DrawerLayout-65YHGHIF.js.map → DrawerLayout-AV4FJTGV.js.map} +0 -0
  70. /package/dist/{ModelSettings-VP6WCMGT.js.map → ModelSettings-4TNETPJJ.js.map} +0 -0
  71. /package/dist/{OpenUiFenceBlock-UTDCTNTM.js.map → OpenUiFenceBlock-KPZFLUSC.js.map} +0 -0
  72. /package/dist/{SandboxSettings-GTZT7LD6.js.map → SandboxSettings-IEIWFKQW.js.map} +0 -0
  73. /package/dist/{SchedulesPage-ARWU7BZF.js.map → SchedulesPage-ZG5IMQI3.js.map} +0 -0
  74. /package/dist/{ShellRouteSync-SSLGM35F.js.map → ShellRouteSync-SJXFKUAJ.js.map} +0 -0
  75. /package/dist/{SidebarLayout-MFDOGAVJ.js.map → SidebarLayout-XUM2Y6PA.js.map} +0 -0
  76. /package/dist/{SkillSettings-WQPUQ5TE.js.map → SkillSettings-NHBL5ZXU.js.map} +0 -0
  77. /package/dist/{TrueForgeUIWithRouter-5CDICMCE.js.map → TrueForgeUIWithRouter-NVV7IXXP.js.map} +0 -0
  78. /package/dist/{WidgetLayout-HE7E4UL5.js.map → WidgetLayout-T7DBLKV3.js.map} +0 -0
  79. /package/dist/{chunk-2BDTG544.js.map → chunk-2QTH6JHX.js.map} +0 -0
  80. /package/dist/{chunk-TGKQRK3S.js.map → chunk-3R62ISBR.js.map} +0 -0
  81. /package/dist/{chunk-KCYBMKQL.js.map → chunk-3TV6SKGW.js.map} +0 -0
  82. /package/dist/{chunk-MAA7U4RF.js.map → chunk-3ZW74FHC.js.map} +0 -0
  83. /package/dist/{chunk-GTTMLDCI.js.map → chunk-CG75X77Q.js.map} +0 -0
  84. /package/dist/{chunk-IOPHQEUY.js.map → chunk-GA4AC4XL.js.map} +0 -0
  85. /package/dist/{chunk-VXKNS7FH.js.map → chunk-NFUX2ESW.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/ServerContext.tsx","../src/utils/sessionShareUrl.ts","../src/server/serverChrome.ts","../src/server/ShellModeContext.tsx","../src/server/draftSpecPreferences.ts","../src/utils/getErrorMessage.ts"],"sourcesContent":["'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport type {\n AgentBuilderCapabilitiesResponse,\n AgentMetricsServer,\n AgentSessionsServer,\n AgentUIServer,\n CatalogServer,\n PermissionsServer,\n ScheduleServer,\n} from './types.js';\n\nconst ServerContext = createContext<AgentUIServer | null>(null);\nconst ServerCapabilitiesContext = createContext<{\n capabilities: AgentBuilderCapabilitiesResponse['data'] | null;\n settled: boolean;\n refresh: () => void;\n} | null>(null);\n\nexport function ServerProvider({ server, children }: { server: AgentUIServer; children: ReactNode }) {\n const [capabilities, setCapabilities] = useState<AgentBuilderCapabilitiesResponse['data'] | null>(null);\n const [capabilitiesSettled, setCapabilitiesSettled] = useState(false);\n const cancelActiveRequestRef = useRef<(() => void) | null>(null);\n const refreshCapabilities = useCallback(() => {\n cancelActiveRequestRef.current?.();\n let cancelled = false;\n cancelActiveRequestRef.current = () => {\n cancelled = true;\n };\n void server\n .getCapabilities()\n .then(response => {\n if (!cancelled) setCapabilities(response.data);\n })\n .catch(() => {\n // Preserve the last known capabilities when a refresh fails.\n })\n .finally(() => {\n if (!cancelled) setCapabilitiesSettled(true);\n });\n }, [server]);\n\n useEffect(() => {\n setCapabilities(null);\n setCapabilitiesSettled(false);\n refreshCapabilities();\n return () => {\n cancelActiveRequestRef.current?.();\n };\n }, [refreshCapabilities]);\n\n const capabilitiesValue = useMemo(\n () => ({ capabilities, settled: capabilitiesSettled, refresh: refreshCapabilities }),\n [capabilities, capabilitiesSettled, refreshCapabilities],\n );\n\n return (\n <ServerContext.Provider value={server}>\n <ServerCapabilitiesContext.Provider value={capabilitiesValue}>{children}</ServerCapabilitiesContext.Provider>\n </ServerContext.Provider>\n );\n}\n\nexport function useServer(): AgentUIServer {\n const server = useContext(ServerContext);\n if (server == null) {\n throw new Error('useServer must be used within a ServerProvider.');\n }\n return server;\n}\n\nexport function useOptionalServer(): AgentUIServer | null {\n return useContext(ServerContext);\n}\n\nexport function useServerCapabilities(): AgentBuilderCapabilitiesResponse['data'] | null {\n return useContext(ServerCapabilitiesContext)?.capabilities ?? null;\n}\n\nexport function useServerCapabilitiesSettled(): boolean {\n return useContext(ServerCapabilitiesContext)?.settled ?? false;\n}\n\nexport function useOptionalRefreshServerCapabilities(): (() => void) | null {\n return useContext(ServerCapabilitiesContext)?.refresh ?? null;\n}\n\nexport function useCatalogServer(): CatalogServer {\n const server = useServer();\n if (server.catalog == null) {\n throw new Error('useCatalogServer requires AgentUIServer.catalog. Pass catalog to 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\nexport function useOptionalPermissionsServer(): PermissionsServer | null {\n return useOptionalServer()?.permissions ?? null;\n}\n","export const SESSION_ID_QUERY = 'sessionId';\nexport const AGENT_ID_QUERY = 'agentId';\nexport const AGENT_TAB_QUERY = 'tab';\nexport const SESSIONS_VIEW_QUERY = 'view';\nexport const SESSIONS_VIEW_VALUE = 'sessions';\nexport const SESSION_START_TIME_QUERY = 's_sts';\nexport const SESSION_END_TIME_QUERY = 's_ets';\nexport const SESSION_TIME_WINDOW_QUERY = 's_tw';\nexport const SESSION_TIME_BUFFER_MS = 5 * 60 * 1000;\nexport const SESSION_CUSTOM_RANGE_MAX_DAYS = 70;\nexport const DEFAULT_SESSION_TIME_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport type LibraryAgentTab = 'overview' | 'sessions' | 'schedules' | 'code' | 'metrics';\n\nexport type SessionTimeRange = {\n startTs: number;\n endTs: number;\n timeWindowMs?: number;\n};\n\nexport type SessionShareSearch = {\n sessionId: string | null;\n agentId: string | null;\n tab: LibraryAgentTab | null;\n view: typeof SESSIONS_VIEW_VALUE | null;\n timeRange: SessionTimeRange | null;\n};\n\nexport type SessionShareWrite = {\n sessionId?: string | null;\n agentId?: string | null;\n tab?: LibraryAgentTab | null;\n view?: typeof SESSIONS_VIEW_VALUE | null;\n timeRange?: SessionTimeRange | null;\n};\n\nfunction parseLibraryAgentTab(value: string | null): LibraryAgentTab | null {\n if (\n value === 'overview' ||\n value === 'sessions' ||\n value === 'schedules' ||\n value === 'code' ||\n value === 'metrics'\n ) {\n return value;\n }\n return null;\n}\n\nfunction nonEmpty(value: string | null): string | null {\n return value != null && value.length > 0 ? value : null;\n}\n\nfunction parseMs(value: string | null): number | null {\n if (value == null || value.length === 0) return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function defaultSessionTimeRange(now = Date.now()): SessionTimeRange {\n return {\n startTs: now - DEFAULT_SESSION_TIME_WINDOW_MS,\n endTs: now,\n timeWindowMs: DEFAULT_SESSION_TIME_WINDOW_MS,\n };\n}\n\nexport function sessionTimeRangeFromCreatedAt(createdAt: string): SessionTimeRange | null {\n const createdAtMs = new Date(createdAt).getTime();\n if (Number.isNaN(createdAtMs)) return null;\n return {\n startTs: createdAtMs - SESSION_TIME_BUFFER_MS,\n endTs: createdAtMs + SESSION_TIME_BUFFER_MS,\n };\n}\n\nexport function resolveSessionTimeRange(range: SessionTimeRange, now = Date.now()): { startTs: number; endTs: number } {\n if (range.timeWindowMs != null) {\n return { startTs: now - range.timeWindowMs, endTs: now };\n }\n return { startTs: range.startTs, endTs: range.endTs };\n}\n\nexport function readSessionShareSearch(search: string): SessionShareSearch {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n const startTs = parseMs(params.get(SESSION_START_TIME_QUERY));\n const endTs = parseMs(params.get(SESSION_END_TIME_QUERY));\n const timeWindowMs = parseMs(params.get(SESSION_TIME_WINDOW_QUERY));\n const view = params.get(SESSIONS_VIEW_QUERY);\n const now = Date.now();\n return {\n sessionId: nonEmpty(params.get(SESSION_ID_QUERY)),\n agentId: nonEmpty(params.get(AGENT_ID_QUERY)),\n tab: parseLibraryAgentTab(params.get(AGENT_TAB_QUERY)),\n view: view === SESSIONS_VIEW_VALUE ? SESSIONS_VIEW_VALUE : null,\n timeRange:\n startTs != null && endTs != null\n ? { startTs, endTs }\n : timeWindowMs != null\n ? { startTs: now - timeWindowMs, endTs: now, timeWindowMs }\n : null,\n };\n}\n\n/** Library details tab: `tab=` wins; a matching share `sessionId` still opens Sessions. */\nexport function libraryAgentTabFromSearch(share: SessionShareSearch, agentId: string): LibraryAgentTab {\n if (share.tab != null) return share.tab;\n return share.sessionId != null && share.agentId === agentId ? 'sessions' : 'overview';\n}\n\nexport function writeSessionShareSearch(params: URLSearchParams, next: SessionShareWrite): void {\n if (next.sessionId === null) params.delete(SESSION_ID_QUERY);\n else if (next.sessionId != null) params.set(SESSION_ID_QUERY, next.sessionId);\n if (next.agentId === null) params.delete(AGENT_ID_QUERY);\n else if (next.agentId != null) params.set(AGENT_ID_QUERY, next.agentId);\n if (next.tab === null) params.delete(AGENT_TAB_QUERY);\n else if (next.tab != null) params.set(AGENT_TAB_QUERY, next.tab);\n if (next.view === null) params.delete(SESSIONS_VIEW_QUERY);\n else if (next.view != null) params.set(SESSIONS_VIEW_QUERY, next.view);\n if (next.timeRange === null) {\n params.delete(SESSION_START_TIME_QUERY);\n params.delete(SESSION_END_TIME_QUERY);\n params.delete(SESSION_TIME_WINDOW_QUERY);\n } else if (next.timeRange != null) {\n if (next.timeRange.timeWindowMs != null) {\n params.set(SESSION_TIME_WINDOW_QUERY, String(next.timeRange.timeWindowMs));\n params.delete(SESSION_START_TIME_QUERY);\n params.delete(SESSION_END_TIME_QUERY);\n } else {\n params.set(SESSION_START_TIME_QUERY, String(next.timeRange.startTs));\n params.set(SESSION_END_TIME_QUERY, String(next.timeRange.endTs));\n params.delete(SESSION_TIME_WINDOW_QUERY);\n }\n }\n}\n\n/** Share link for a library or global session. Works with or without `withRouter`. */\nexport function buildAgentSessionShareUrl({\n sessionId,\n agentId,\n createdAt,\n view,\n href = typeof window === 'undefined' ? '' : window.location.href,\n}: {\n sessionId: string;\n agentId?: string;\n createdAt?: string;\n view?: typeof SESSIONS_VIEW_VALUE | null;\n href?: string;\n}): string {\n const url = new URL(href);\n writeSessionShareSearch(url.searchParams, {\n sessionId,\n agentId: agentId == null || agentId.length === 0 ? null : agentId,\n ...(view === undefined ? {} : { view }),\n timeRange: createdAt == null ? undefined : sessionTimeRangeFromCreatedAt(createdAt),\n });\n return url.toString();\n}\n\nexport const SESSION_SHARE_CHANGE_EVENT = 'trueforge-session-share';\n\nexport function replaceSessionShareSearch(next: SessionShareWrite): string {\n const url = new URL(window.location.href);\n writeSessionShareSearch(url.searchParams, next);\n window.history.replaceState(window.history.state, '', url);\n window.dispatchEvent(new Event(SESSION_SHARE_CHANGE_EVENT));\n return url.search;\n}\n","import type { ResolvedRoutes } from '../routing/types.js';\nimport type { AgentMetricsServer, AgentSessionsServer, CatalogServer, ScheduleServer } from './types.js';\n\n/**\n * Whether Settings chrome is available: sidebar button and `/settings` route.\n * Matches the gate in {@link ShellActions}.\n */\nexport function isSettingsChromeEnabled({\n catalog,\n capabilities,\n}: {\n catalog: CatalogServer | null | undefined;\n capabilities: { settings?: { enabled?: boolean } } | null | undefined;\n}): boolean {\n return catalog != null && capabilities?.settings?.enabled === true;\n}\n\n/** Sessions browser + agent-detail surfaces (Overview / sessions / code). */\nexport function isSessionsChromeEnabled({ sessions }: { sessions: AgentSessionsServer | null | undefined }): boolean {\n return sessions != null;\n}\n\n/** Schedules page + library schedules column. */\nexport function isSchedulesChromeEnabled({ schedules }: { schedules: ScheduleServer | null | undefined }): boolean {\n return schedules != null;\n}\n\n/** Agent-details Metrics tab (no top-level path). */\nexport function isMetricsChromeEnabled({ metrics }: { metrics: AgentMetricsServer | null | undefined }): boolean {\n return metrics != null;\n}\n\n/**\n * Unregister path-backed places whose optional server port is absent.\n * Chrome gates and route gates must stay in lockstep.\n */\nexport function toEffectiveRoutes({\n routes,\n catalog,\n capabilities,\n sessions,\n schedules,\n}: {\n routes: ResolvedRoutes;\n catalog: CatalogServer | null | undefined;\n capabilities: { settings?: { enabled?: boolean } } | null | undefined;\n sessions: AgentSessionsServer | null | undefined;\n schedules: ScheduleServer | null | undefined;\n}): ResolvedRoutes {\n const sessionsEnabled = isSessionsChromeEnabled({ sessions });\n return {\n ...routes,\n settings: isSettingsChromeEnabled({ catalog, capabilities }) ? routes.settings : null,\n sessionsBrowser: sessionsEnabled ? routes.sessionsBrowser : null,\n libraryAgent: sessionsEnabled ? routes.libraryAgent : null,\n schedules: isSchedulesChromeEnabled({ schedules }) ? routes.schedules : null,\n };\n}\n","'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport type { HistoryAgentIntent } from '../utils/historyAgentSearch.js';\nimport { replaceSessionShareSearch } from '../utils/sessionShareUrl.js';\nimport {\n readDraftSpecPreferences,\n selectDraftSpecPreferences,\n withCapabilitiesSandbox,\n 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\nexport type HistoryAgentFilter = {\n agentId?: string;\n agentName: string;\n intent: HistoryAgentIntent;\n};\n\ntype ShellModeContextValue = {\n mode: ShellMode;\n /** Host agentConfig mode (capabilities source). */\n agentConfigMode: AgentConfig['mode'];\n /** Agents chrome. */\n isLibraryEnabled: boolean;\n /** Mutable composer / Save Agent chrome (host capability). */\n isComposerEnabled: boolean;\n /** Sidebar / list New Chat control. */\n isNewChatEnabled: boolean;\n settingsOpen: boolean;\n settingsSection: SettingsSection;\n setSettingsOpen: (open: boolean, section?: SettingsSection) => void;\n agentConfigOpen: boolean;\n setAgentConfigOpen: (open: boolean) => void;\n /** Agents main-pane overlay (sidebar layout). */\n libraryOpen: boolean;\n libraryAgentId: string | null;\n setLibraryAgentId: (id: string | null) => void;\n setLibraryOpen: (open: boolean) => void;\n /** All-user sessions browser (includes drafts). */\n sessionsOpen: boolean;\n setSessionsOpen: (open: boolean) => void;\n openLibraryAgent: (agentId: string) => void;\n closeLibraryAgent: () => void;\n schedulesOpen: boolean;\n setSchedulesOpen: (open: boolean) => void;\n /**\n * Bind from Agents (Try = immutable, Edit = mutable + agentSpec).\n * Prefer this over `selectAgent` / `openDraft` when both fields are available.\n */\n selectLibraryAgent: (req: SelectLibraryAgentRequest) => void;\n /**\n * Attach identity + agentSpec to the *current* mutable chat without remounting.\n * Used after `saveAgent` so the same draft session continues as an editable agent.\n */\n bindMutableAgent: (req: { agentId: string; agentName: string; agentSpec: AgentSpec }) => void;\n /** @deprecated Prefer `selectLibraryAgent({ isMutable: false, agentName })`. */\n selectAgent: (agentName: string) => void;\n /** Open a simple New Chat (mutable, no agent-builder chrome). */\n openDraft: () => void;\n /** Open New Agent builder (mutable + Agent Config drawer). */\n openAgentBuilder: () => void;\n /** Remember plain-draft composer choices as the seed for future New Chat / New Agent. */\n rememberDraftSpec: (agentSpec: AgentSpec, kind?: DraftPreferenceKind) => void;\n /**\n * Open a history session without remounting the runtime.\n * Prefer explicit `isMutable`; otherwise agentName means immutable.\n */\n openHistorySession: (req: {\n sessionId: string;\n agentName?: string;\n isMutable?: boolean;\n isCreateAgent?: boolean;\n }) => void;\n /** Reset current chat; no-op when idle. */\n clearChat: () => void;\n /** Return library-only mode to its idle landing; no-op in other modes. */\n openLibraryHome: () => void;\n /** Changes only when the chat runtime must reset. */\n runtimeKey: string;\n /**\n * History list filter forwarded as `listSessions({ agentId })`.\n * `null` = All chats. Only meaningful when `isLibraryEnabled`.\n */\n historyAgentFilter: HistoryAgentFilter | null;\n setHistoryAgentFilter: (filter: HistoryAgentFilter | null) => void;\n /** Effective `listSessionsAgentId` for the runtime (SingleAgent locks to name). */\n listSessionsAgentId: string | undefined;\n /** Session selected from history. */\n pendingSessionId: string | undefined;\n /** Distinguishes repeated selections of the same session. */\n pendingSessionEpoch: number;\n /**\n * Bumped when the Agents catalog may have changed (e.g. after saveAgent).\n * Library chrome should re-fetch when this changes.\n */\n agentsListEpoch: number;\n invalidateAgentsList: () => void;\n};\n\nconst ShellModeContext = createContext<ShellModeContextValue | null>(null);\n\nconst FALLBACK_MUTABLE_SPEC: AgentSpec = {\n model: { name: 'openai-main/gpt-4.1' },\n};\n\nfunction mutableSeedFromConfig(config: AgentConfig): AgentSpec {\n if (config.mode === 'AgentComposer' || config.mode === 'AgentLibraryWithComposer') {\n return config.defaultAgentSpec ?? FALLBACK_MUTABLE_SPEC;\n }\n return FALLBACK_MUTABLE_SPEC;\n}\n\nfunction initialMode(config: AgentConfig, mutableSeed: AgentSpec): ShellMode {\n switch (config.mode) {\n case 'SingleAgent':\n return {\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n agentId: config.name,\n agentName: config.name,\n locked: true,\n };\n case 'AgentLibrary':\n return { status: 'idle' };\n case 'AgentComposer':\n case 'AgentLibraryWithComposer':\n return {\n status: 'active',\n isMutable: true,\n isCreateAgent: false,\n agentSpec: mutableSeed,\n locked: false,\n };\n }\n}\n\nfunction resolveMutableIsCreateAgent(req: SelectLibraryAgentRequest): boolean {\n if (req.isCreateAgent !== undefined) return req.isCreateAgent;\n return req.agentId != null || req.agentName != null;\n}\n\nfunction libraryAgentId(agent: Pick<AgentLibraryEntry, 'agentId' | 'name'>): string {\n return agent.agentId ?? agent.name;\n}\n\nexport function ShellModeProvider({\n agentConfig = DEFAULT_AGENT_CONFIG,\n initialSettingsOpen = false,\n children,\n}: {\n agentConfig?: AgentConfig;\n /** Open settings on first paint (e.g. host boot with no models). Does not re-open later. */\n initialSettingsOpen?: boolean;\n children: ReactNode;\n}) {\n const capabilities = useServerCapabilities();\n const catalog = useOptionalCatalogServer();\n const refreshCapabilities = useOptionalRefreshServerCapabilities();\n const sessionsServer = useOptionalAgentSessionsServer();\n const scheduleServer = useOptionalScheduleServer();\n const chatSeedRef = useRef(\n readDraftSpecPreferences('chat') ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), 'chat'),\n );\n const agentSeedRef = useRef(\n readDraftSpecPreferences('agent') ?? selectDraftSpecPreferences(mutableSeedFromConfig(agentConfig), 'agent'),\n );\n\n const isLibraryEnabled = agentConfig.mode === 'AgentLibrary' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isComposerEnabled = agentConfig.mode === 'AgentComposer' || agentConfig.mode === 'AgentLibraryWithComposer';\n const isNewChatEnabled = agentConfig.mode !== 'AgentLibrary';\n const locked = agentConfig.mode === 'SingleAgent';\n\n const [mode, setMode] = useState<ShellMode>(() => initialMode(agentConfig, chatSeedRef.current));\n const [mutableEpoch, setMutableEpoch] = useState(0);\n const [clearEpoch, setClearEpoch] = useState(0);\n const [agentsListEpoch, setAgentsListEpoch] = useState(0);\n const [settingsOpenState, setSettingsOpenState] = useState(initialSettingsOpen);\n const [settingsSection, setSettingsSection] = useState<SettingsSection>('models');\n const [agentConfigOpenState, setAgentConfigOpenState] = useState(false);\n const [libraryOpenState, setLibraryOpenState] = useState(false);\n const [sessionsOpenState, setSessionsOpenState] = useState(false);\n const [libraryAgentId, setLibraryAgentId] = useState<string | null>(null);\n const [schedulesOpenState, setSchedulesOpenState] = useState(false);\n const [historyAgentFilter, setHistoryAgentFilter] = useState<HistoryAgentFilter | null>(null);\n const [pendingSessionId, setPendingSessionId] = useState<string | undefined>(undefined);\n const [pendingSessionEpoch, setPendingSessionEpoch] = useState(0);\n const settingsEnabled = isSettingsChromeEnabled({ catalog, capabilities });\n const settingsOpen = settingsEnabled && settingsOpenState;\n const sessionsEnabled = isSessionsChromeEnabled({ sessions: sessionsServer });\n const schedulesEnabled = isSchedulesChromeEnabled({ schedules: scheduleServer });\n const schedulesOpen = schedulesEnabled && schedulesOpenState;\n const libraryOpen = isLibraryEnabled && libraryOpenState;\n const sessionsOpen = sessionsEnabled && sessionsOpenState;\n const setSessionsOpen = useCallback(\n (open: boolean) => {\n if (open) {\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSchedulesOpenState(false);\n } else {\n replaceSessionShareSearch({ view: null });\n }\n setSessionsOpenState(sessionsEnabled && open);\n },\n [sessionsEnabled],\n );\n const setLibraryOpen = useCallback(\n (open: boolean) => {\n if (!isLibraryEnabled) return;\n if (open) {\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n }\n setLibraryAgentId(null);\n setLibraryOpenState(open);\n },\n [isLibraryEnabled, setSessionsOpen],\n );\n const openLibraryAgent = useCallback(\n (agentId: string) => {\n if (!isLibraryEnabled || !sessionsEnabled) return;\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n setLibraryOpenState(true);\n setLibraryAgentId(agentId);\n },\n [isLibraryEnabled, sessionsEnabled, setSessionsOpen],\n );\n const closeLibraryAgent = useCallback(() => {\n setLibraryAgentId(null);\n }, []);\n const setSettingsOpen = useCallback(\n (open: boolean, section?: SettingsSection) => {\n if (section !== undefined) {\n setSettingsSection(section);\n }\n if (open) {\n setAgentConfigOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n }\n setSettingsOpenState(settingsEnabled && open);\n },\n [setSessionsOpen, settingsEnabled],\n );\n const setAgentConfigOpen = useCallback(\n (open: boolean) => {\n if (open) {\n setSettingsOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpenState(false);\n }\n setAgentConfigOpenState(open);\n },\n [setSessionsOpen],\n );\n const setSchedulesOpen = useCallback(\n (open: boolean) => {\n if (open) {\n setSettingsOpenState(false);\n setAgentConfigOpenState(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n }\n setSchedulesOpenState(schedulesEnabled && open);\n },\n [schedulesEnabled, setSessionsOpen],\n );\n\n useEffect(() => {\n if (catalog == null || capabilities?.settings?.enabled === false) {\n setSettingsOpenState(false);\n }\n }, [capabilities?.settings?.enabled, catalog]);\n\n useEffect(() => {\n if (!sessionsEnabled) {\n setSessionsOpenState(false);\n setLibraryAgentId(null);\n }\n }, [sessionsEnabled]);\n\n useEffect(() => {\n if (!schedulesEnabled) {\n setSchedulesOpenState(false);\n }\n }, [schedulesEnabled]);\n\n const invalidateAgentsList = useCallback(() => {\n setAgentsListEpoch(n => n + 1);\n }, []);\n\n const lockedAgentName = agentConfig.mode === 'SingleAgent' ? agentConfig.name : '';\n const effectiveMode: ShellMode = useMemo(() => {\n if (!locked) return mode;\n return {\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n agentId: lockedAgentName,\n agentName: lockedAgentName,\n locked: true,\n };\n }, [locked, lockedAgentName, mode]);\n const agentConfigOpen =\n effectiveMode.status === 'active' && effectiveMode.isMutable && effectiveMode.isCreateAgent && agentConfigOpenState;\n\n useEffect(() => {\n if (effectiveMode.status !== 'active' || !effectiveMode.isMutable || !effectiveMode.isCreateAgent) {\n setAgentConfigOpenState(false);\n }\n }, [effectiveMode]);\n\n const listSessionsAgentId = useMemo(() => {\n if (locked) return lockedAgentName;\n if (!isLibraryEnabled) return undefined;\n return historyAgentFilter?.agentId;\n }, [locked, lockedAgentName, isLibraryEnabled, historyAgentFilter]);\n\n const bumpEpoch = useCallback((isMutable: boolean) => {\n if (isMutable) setMutableEpoch(n => n + 1);\n else setClearEpoch(n => n + 1);\n }, []);\n\n const selectLibraryAgent = useCallback(\n (req: SelectLibraryAgentRequest) => {\n if (req.isMutable) {\n if (!isComposerEnabled) return;\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(undefined);\n const isCreateAgent = resolveMutableIsCreateAgent(req);\n const kind: DraftPreferenceKind = isCreateAgent ? 'agent' : 'chat';\n setMode({\n status: 'active',\n isMutable: true,\n isCreateAgent,\n agentId: req.agentId,\n agentName: req.agentName,\n agentSpec: req.agentSpec ?? (kind === 'agent' ? agentSeedRef.current : chatSeedRef.current),\n locked: false,\n });\n setAgentConfigOpenState(isCreateAgent);\n bumpEpoch(true);\n return;\n }\n if (!isLibraryEnabled) return;\n const agentName = req.agentName ?? req.agentId;\n if (agentName == null) return;\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(undefined);\n setAgentConfigOpenState(false);\n setMode({\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n agentId: req.agentId ?? agentName,\n agentName,\n locked: false,\n });\n if (req.agentId != null) {\n setHistoryAgentFilter({\n agentId: req.agentId,\n agentName,\n intent: 'try-agent',\n });\n } else {\n setHistoryAgentFilter(null);\n }\n bumpEpoch(false);\n },\n [isComposerEnabled, isLibraryEnabled, bumpEpoch, setSettingsOpen, setSessionsOpen, setSchedulesOpen],\n );\n\n const bindMutableAgent = useCallback(\n (req: { agentId: string; agentName: string; 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 setHistoryAgentFilter(null);\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 const isMutable = isMutableOpt ?? agentName == null;\n if (isMutable) {\n if (!isComposerEnabled) return;\n } else if (locked) {\n if (agentName == null || lockedAgentName !== agentName) return;\n } else if (!isLibraryEnabled) {\n return;\n }\n\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSessionsOpen(false);\n setSchedulesOpen(false);\n setPendingSessionId(sessionId);\n setPendingSessionEpoch(n => n + 1);\n if (isMutable) {\n const isCreateAgent = isCreateAgentOpt === true;\n setMode({\n status: 'active',\n isMutable: true,\n isCreateAgent,\n agentSpec: isCreateAgent ? agentSeedRef.current : chatSeedRef.current,\n locked: false,\n });\n setAgentConfigOpenState(isCreateAgent);\n return;\n }\n setAgentConfigOpenState(false);\n setMode({\n status: 'active',\n isMutable: false,\n isCreateAgent: false,\n locked: false,\n ...(agentName != null ? { agentId: agentName, agentName } : {}),\n });\n },\n [isLibraryEnabled, isComposerEnabled, locked, lockedAgentName, setSettingsOpen, setSessionsOpen, setSchedulesOpen],\n );\n\n const clearChat = useCallback(() => {\n if (effectiveMode.status === 'idle') return;\n setPendingSessionId(undefined);\n if (effectiveMode.isMutable) {\n // Preserve Edit / builder vs chat intent; blank drafts fall back to host seed.\n const kind: DraftPreferenceKind = effectiveMode.isCreateAgent ? 'agent' : 'chat';\n setMode({\n status: 'active',\n isMutable: true,\n isCreateAgent: effectiveMode.isCreateAgent,\n agentId: effectiveMode.agentId,\n agentName: effectiveMode.agentName,\n agentSpec: effectiveMode.agentSpec ?? (kind === 'agent' ? agentSeedRef.current : chatSeedRef.current),\n locked: false,\n });\n setAgentConfigOpenState(effectiveMode.isCreateAgent);\n bumpEpoch(true);\n return;\n }\n bumpEpoch(false);\n }, [effectiveMode, bumpEpoch]);\n\n const openLibraryHome = useCallback(() => {\n // Only library-only mode has an idle landing; other modes root via openDraft / clearChat.\n if (!isLibraryEnabled || isComposerEnabled) return;\n setPendingSessionId(undefined);\n setSettingsOpen(false);\n setLibraryOpenState(false);\n setLibraryAgentId(null);\n setSchedulesOpen(false);\n setMode({ status: 'idle' });\n bumpEpoch(false);\n }, [isLibraryEnabled, isComposerEnabled, setSettingsOpen, setSchedulesOpen, bumpEpoch]);\n\n // Only explicit resets remount the runtime; history and identity changes happen in place.\n const runtimeKey = useMemo(() => {\n if (effectiveMode.status === 'idle') return 'idle';\n return `chat:${mutableEpoch}:${clearEpoch}`;\n }, [effectiveMode.status, mutableEpoch, clearEpoch]);\n\n const value = useMemo<ShellModeContextValue>(\n () => ({\n mode: effectiveMode,\n agentConfigMode: agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n agentConfigOpen,\n setAgentConfigOpen,\n libraryOpen,\n libraryAgentId,\n setLibraryAgentId,\n setLibraryOpen,\n sessionsOpen,\n setSessionsOpen,\n openLibraryAgent,\n closeLibraryAgent,\n schedulesOpen,\n setSchedulesOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n openAgentBuilder,\n rememberDraftSpec,\n openHistorySession,\n clearChat,\n openLibraryHome,\n runtimeKey,\n historyAgentFilter,\n setHistoryAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n pendingSessionEpoch,\n agentsListEpoch,\n invalidateAgentsList,\n }),\n [\n effectiveMode,\n agentConfig.mode,\n isLibraryEnabled,\n isComposerEnabled,\n isNewChatEnabled,\n settingsOpen,\n settingsSection,\n setSettingsOpen,\n agentConfigOpen,\n setAgentConfigOpen,\n libraryOpen,\n libraryAgentId,\n setLibraryOpen,\n sessionsOpen,\n setSessionsOpen,\n openLibraryAgent,\n closeLibraryAgent,\n schedulesOpen,\n setSchedulesOpen,\n selectLibraryAgent,\n bindMutableAgent,\n selectAgent,\n openDraft,\n openAgentBuilder,\n rememberDraftSpec,\n openHistorySession,\n clearChat,\n openLibraryHome,\n runtimeKey,\n historyAgentFilter,\n listSessionsAgentId,\n pendingSessionId,\n pendingSessionEpoch,\n agentsListEpoch,\n invalidateAgentsList,\n ],\n );\n\n return <ShellModeContext.Provider value={value}>{children}</ShellModeContext.Provider>;\n}\n\nexport function useShellMode(): ShellModeContextValue {\n const ctx = useContext(ShellModeContext);\n if (ctx == null) {\n throw new Error('useShellMode must be used within a ShellModeProvider.');\n }\n return ctx;\n}\n\nexport function useOptionalShellMode(): ShellModeContextValue | null {\n return useContext(ShellModeContext);\n}\n\n/** True when the shell is bound to a mutable (editable) agentSpec. */\nexport function shellIsMutable(mode: ShellMode): boolean {\n return mode.status === 'active' && mode.isMutable;\n}\n\n/** True when the shell is in New Agent / Edit builder chrome. */\nexport function shellIsCreateAgent(mode: ShellMode): boolean {\n return mode.status === 'active' && mode.isMutable && mode.isCreateAgent;\n}\n\nexport { libraryAgentId };\n","import type { AgentSpec } from './types.js';\n\n/** @deprecated Migrated into chat/agent keys on first read. */\nexport const DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-draft-spec-preferences';\nexport const CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-chat-draft-spec-preferences';\nexport const AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY = 'tfy-aui-agent-draft-spec-preferences';\n\nexport type DraftPreferenceKind = 'chat' | 'agent';\n\ntype StoredDraftSpecPreferences = {\n version: 1;\n spec: AgentSpec;\n};\n\nfunction isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isMountList(value: unknown): boolean {\n return Array.isArray(value) && value.every(isObject);\n}\n\nfunction isAgentSpec(value: unknown): value is AgentSpec {\n if (!isObject(value)) return false;\n const model = Reflect.get(value, 'model');\n if (!isObject(model) || typeof Reflect.get(model, 'name') !== 'string') return false;\n\n const params = Reflect.get(model, 'params');\n if (params !== undefined && !isObject(params)) return false;\n\n const skills = Reflect.get(value, 'skills');\n if (skills !== undefined && !isMountList(skills)) return false;\n\n const mcpServers = Reflect.get(value, 'mcpServers');\n if (mcpServers !== undefined && !isMountList(mcpServers)) return false;\n\n const config = Reflect.get(value, 'config');\n return config === undefined || isObject(config);\n}\n\nfunction isStoredDraftSpecPreferences(value: unknown): value is StoredDraftSpecPreferences {\n return isObject(value) && Reflect.get(value, 'version') === 1 && isAgentSpec(Reflect.get(value, 'spec'));\n}\n\nfunction storageKeyForKind(kind: DraftPreferenceKind): string {\n return kind === 'chat' ? CHAT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY : AGENT_DRAFT_SPEC_PREFERENCES_STORAGE_KEY;\n}\n\n/** New Chat: model (+ reasoning params), skills, and MCP only — no runtime config. */\nexport function selectChatDraftSpecPreferences(spec: AgentSpec): AgentSpec {\n return {\n model: spec.model,\n ...(spec.skills !== undefined ? { skills: spec.skills } : {}),\n ...(spec.mcpServers !== undefined ? { mcpServers: spec.mcpServers } : {}),\n };\n}\n\n/** New Agent: full composer seed including runtime config (sandbox, ask-user, …). */\nexport function selectAgentDraftSpecPreferences(spec: AgentSpec): AgentSpec {\n return {\n ...selectChatDraftSpecPreferences(spec),\n ...(spec.config !== undefined ? { config: spec.config } : {}),\n };\n}\n\nexport function selectDraftSpecPreferences(spec: AgentSpec, kind: DraftPreferenceKind): AgentSpec {\n return kind === 'chat' ? selectChatDraftSpecPreferences(spec) : selectAgentDraftSpecPreferences(spec);\n}\n\nfunction readSandboxEnabled(spec: AgentSpec): boolean | undefined {\n if (spec.config === undefined) return undefined;\n // `sandbox` is persisted on draft config but is not part of AgentRuntimeConfig.\n const sandbox = Reflect.get(spec.config, 'sandbox');\n if (!isObject(sandbox)) return undefined;\n const enabled = Reflect.get(sandbox, 'enabled');\n return typeof enabled === 'boolean' ? enabled : undefined;\n}\n\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","function isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object';\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value : undefined;\n}\n\nconst LITERAL_ESCAPE_PATTERN = /\\\\(?:[nrtbfv0'\"\\\\]|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/; // literal escape sequences like \\n, \\t, \\b, \\f, \\v, \\uXXXX, \\xHH\nconst REAL_CONTROL_PATTERN = /[\\n\\t\\b\\f\\v]/; // real control characters like \\n, \\t, \\b, \\f, \\v\n\nfunction decodeLiteralEscapes(text: string): string {\n let out = '';\n for (let i = 0; i < text.length; i += 1) {\n const char = text[i];\n if (char !== '\\\\' || i + 1 >= text.length) {\n out += char;\n continue;\n }\n\n const next = text[i + 1];\n switch (next) {\n case 'n':\n out += '\\n';\n i += 1;\n break;\n case 't':\n out += '\\t';\n i += 1;\n break;\n case 'r':\n out += '\\r';\n i += 1;\n break;\n case 'b':\n out += '\\b';\n i += 1;\n break;\n case 'f':\n out += '\\f';\n i += 1;\n break;\n case 'v':\n out += '\\v';\n i += 1;\n break;\n case '0':\n out += '\\0';\n i += 1;\n break;\n case '\\\\':\n out += '\\\\';\n i += 1;\n break;\n case '\"':\n out += '\"';\n i += 1;\n break;\n case \"'\":\n out += \"'\";\n i += 1;\n break;\n case 'u': {\n const hex = text.slice(i + 2, i + 6);\n if (/^[0-9a-fA-F]{4}$/.test(hex)) {\n out += String.fromCharCode(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += char;\n }\n break;\n }\n case 'x': {\n const hex = text.slice(i + 2, i + 4);\n if (/^[0-9a-fA-F]{2}$/.test(hex)) {\n out += String.fromCharCode(Number.parseInt(hex, 16));\n i += 3;\n } else {\n out += char;\n }\n break;\n }\n default:\n out += char;\n break;\n }\n }\n return out;\n}\n\n// Decodes JSON/C-style escape sequences (e.g., \\n, \\t) in error messages, preserving real control characters and normalizing line endings.\nexport function decodeErrorMessageEscapes(text: string): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (REAL_CONTROL_PATTERN.test(normalized) || !LITERAL_ESCAPE_PATTERN.test(normalized)) {\n // If the string contains real control characters or no literal escape sequences, return the normalized string.\n return normalized;\n }\n // else decode the literal escape sequences and normalize line endings\n return decodeLiteralEscapes(normalized).replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\n/**\n * Reads a display string from API-shaped errors: `message`, then nested\n * `error.message`. When neither exists, stringifies the value.\n */\nfunction messageFromErrorShaped(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n const direct = readNonEmptyString(value.message);\n if (direct != null) return direct;\n if (isRecord(value.error)) {\n return readNonEmptyString(value.error.message);\n }\n return undefined;\n}\n\nfunction stringifyError(error: unknown): string {\n if (typeof error === 'string') return error;\n if (isRecord(error)) {\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n }\n return String(error);\n}\n\n/**\n * User-facing error text. Prefers HTTP body `{ error: { message } }` when\n * present (e.g. TrueForgeError), then `error.message` / `error.error.message`,\n * then `fallback`, then a string form of the value.\n *\n * Escape sequences (`\\n`, `\\t`, `\\r`, `\\uXXXX`, …) are decoded for display when\n * still present as literal text.\n */\nexport function getErrorMessage(error: unknown, fallback?: string): string {\n if (typeof error === 'string') {\n const trimmed = error.trim();\n if (trimmed !== '') return decodeErrorMessageEscapes(error);\n return fallback != null ? decodeErrorMessageEscapes(fallback) : decodeErrorMessageEscapes(error);\n }\n\n if (isRecord(error) && 'body' in error) {\n const fromBody = messageFromErrorShaped(error.body);\n if (fromBody != null) return decodeErrorMessageEscapes(fromBody);\n if (error.body != null) {\n if (typeof error.body === 'string') {\n const trimmed = error.body.trim();\n if (trimmed !== '') return decodeErrorMessageEscapes(error.body);\n } else {\n return stringifyError(error.body);\n }\n }\n }\n\n const fromShape = messageFromErrorShaped(error);\n if (fromShape != null) return decodeErrorMessageEscapes(fromShape);\n\n if (fallback != null) return decodeErrorMessageEscapes(fallback);\n return stringifyError(error);\n}\n"],"mappings":"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","names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useRef","useState","libraryAgentId","useCallback","useEffect","useMemo","useContext"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/atoms/lib/useSearchAgentsList.ts","../src/atoms/lib/useDebouncedValue.ts","../src/utils/scheduleShareUrl.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useOptionalServer } from '../../server/ServerContext.js';\nimport type { AgentBuilderServer, AgentLibraryEntry } from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { useDebouncedValue } from './useDebouncedValue.js';\n\nexport const SEARCH_AGENTS_PAGE_SIZE = 50;\nconst DEFAULT_DEBOUNCE_MS = 300;\nconst LOAD_MORE_ROOT_MARGIN = '48px';\n\n/** Drain every `searchAgents` page (offset pagination). */\nexport async function searchAllAgents(\n server: Pick<AgentBuilderServer, 'searchAgents'>,\n offset = 0,\n): Promise<AgentLibraryEntry[]> {\n const rows = await server.searchAgents({ limit: SEARCH_AGENTS_PAGE_SIZE, offset });\n if (rows.length < SEARCH_AGENTS_PAGE_SIZE) return rows;\n return [...rows, ...(await searchAllAgents(server, offset + rows.length))];\n}\n\n/** Exact-name queries can still span multiple server-filtered pages. */\nexport async function findAgentByName({\n server,\n agentName,\n offset = 0,\n}: {\n server: Pick<AgentBuilderServer, 'searchAgents'>;\n agentName: string;\n offset?: number;\n}): Promise<AgentLibraryEntry | undefined> {\n const rows = await server.searchAgents({ query: agentName, limit: SEARCH_AGENTS_PAGE_SIZE, offset });\n const match = rows.find(agent => agent.name === agentName);\n if (match != null || rows.length < SEARCH_AGENTS_PAGE_SIZE) return match;\n return findAgentByName({ server, agentName, offset: offset + rows.length });\n}\n\nexport type UseSearchAgentsListOptions = {\n /** When false, no fetches run. */\n enabled: boolean;\n query: string;\n /** Bump to force a replace fetch (e.g. agentsListEpoch). */\n refreshKey?: number;\n limit?: number;\n debounceMs?: number;\n};\n\nexport type UseSearchAgentsListResult = {\n agents: AgentLibraryEntry[];\n /** True while the replace fetch is in flight and the list is still empty. */\n isInitialLoading: boolean;\n /** True while replacing results that are already on screen (softer than a skeleton wipe). */\n isSearching: boolean;\n loadingMore: boolean;\n error: string | null;\n hasMore: boolean;\n listRef: (node: HTMLElement | null) => void;\n sentinelRef: (node: HTMLElement | null) => void;\n};\n\n/**\n * Debounced `searchAgents` with offset pagination and an IntersectionObserver sentinel.\n * Attach `listRef` to the scroll container and `sentinelRef` to a footer element.\n */\nexport function useSearchAgentsList({\n enabled,\n query,\n refreshKey = 0,\n limit = SEARCH_AGENTS_PAGE_SIZE,\n debounceMs = DEFAULT_DEBOUNCE_MS,\n}: UseSearchAgentsListOptions): UseSearchAgentsListResult {\n const server = useOptionalServer();\n // While closed, sync immediately so reopen never fetches a stale query.\n const debouncedQuery = useDebouncedValue(query, enabled ? debounceMs : 0);\n\n const [agents, setAgents] = useState<AgentLibraryEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n\n const genRef = useRef(0);\n const loadMoreInflightRef = useRef(false);\n const hasMoreRef = useRef(false);\n const agentsLenRef = useRef(0);\n const listElRef = useRef<HTMLElement | null>(null);\n const sentinelElRef = useRef<HTMLElement | null>(null);\n const [listEl, setListEl] = useState<HTMLElement | null>(null);\n const [sentinelEl, setSentinelEl] = useState<HTMLElement | null>(null);\n\n hasMoreRef.current = hasMore;\n agentsLenRef.current = agents.length;\n\n const listRef = useCallback((node: HTMLElement | null) => {\n listElRef.current = node;\n setListEl(node);\n }, []);\n\n const sentinelRef = useCallback((node: HTMLElement | null) => {\n sentinelElRef.current = node;\n setSentinelEl(node);\n }, []);\n\n const searchQuery = debouncedQuery.trim() || undefined;\n\n useEffect(() => {\n if (!enabled || server == null) return;\n\n const gen = ++genRef.current;\n loadMoreInflightRef.current = false;\n setLoading(true);\n setError(null);\n\n void server\n .searchAgents({ query: searchQuery, limit, offset: 0 })\n .then(rows => {\n if (gen !== genRef.current) return;\n setAgents(rows);\n setHasMore(rows.length >= limit);\n })\n .catch((err: unknown) => {\n if (gen !== genRef.current) return;\n setAgents([]);\n setHasMore(false);\n setError(getErrorMessage(err, 'Failed to load agents.'));\n })\n .finally(() => {\n if (gen === genRef.current) setLoading(false);\n });\n\n return () => {\n genRef.current += 1;\n };\n }, [enabled, server, searchQuery, limit, refreshKey]);\n\n const loadMore = useCallback(() => {\n if (!enabled || server == null || !hasMoreRef.current || loadMoreInflightRef.current || loading) {\n return;\n }\n\n const gen = genRef.current;\n const offset = agentsLenRef.current;\n loadMoreInflightRef.current = true;\n setLoadingMore(true);\n\n void server\n .searchAgents({ query: searchQuery, limit, offset })\n .then(rows => {\n if (gen !== genRef.current) return;\n setAgents(prev => [...prev, ...rows]);\n setHasMore(rows.length >= limit);\n })\n .catch(() => {\n if (gen !== genRef.current) return;\n setHasMore(false);\n })\n .finally(() => {\n loadMoreInflightRef.current = false;\n if (gen === genRef.current) setLoadingMore(false);\n });\n }, [enabled, server, searchQuery, limit, loading]);\n\n useEffect(() => {\n if (!enabled || !hasMore || listEl == null || sentinelEl == null) return;\n\n const observer = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n loadMore();\n }\n },\n { root: listEl, rootMargin: LOAD_MORE_ROOT_MARGIN },\n );\n observer.observe(sentinelEl);\n return () => observer.disconnect();\n }, [enabled, hasMore, listEl, sentinelEl, loadMore, agents.length]);\n\n return {\n agents,\n isInitialLoading: loading && agents.length === 0,\n isSearching: loading && agents.length > 0,\n loadingMore,\n error,\n hasMore,\n listRef,\n sentinelRef,\n };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\n/** Returns `value` immediately on first render; subsequent changes apply after `delayMs`. */\nexport function useDebouncedValue<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const id = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(id);\n }, [value, delayMs]);\n\n return debounced;\n}\n","import type { ScheduleStatus } from '../server/types.js';\nimport { writeSessionShareSearch } from './sessionShareUrl.js';\n\nexport const SCHEDULE_AGENT_QUERY = 'agent';\nexport const SCHEDULE_STATUS_QUERY = 'status';\nexport const SCHEDULE_NAME_QUERY = 'q';\nexport const SCHEDULE_IS_NEW_QUERY = 'isNew';\n\nexport const SCHEDULE_SHARE_CHANGE_EVENT = 'trueforge-schedule-share';\n\nexport type ScheduleShareSearch = {\n /** Agent id filter; `null` means all agents. */\n agent: string | null;\n /** Status filter; `null` means all statuses. */\n status: ScheduleStatus | null;\n /** Name search; `null` when empty. */\n q: string | null;\n /** One-shot flag to open the create schedule drawer. */\n isNew: boolean;\n};\n\nexport type ScheduleShareWrite = {\n agent?: string | null;\n status?: ScheduleStatus | null;\n q?: string | null;\n isNew?: boolean | null;\n};\n\nfunction nonEmpty(value: string | null): string | null {\n return value != null && value.length > 0 ? value : null;\n}\n\nfunction parseStatus(value: string | null): ScheduleStatus | null {\n if (value === 'active' || value === 'paused') return value;\n return null;\n}\n\nexport function readScheduleShareSearch(search: string): ScheduleShareSearch {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n return {\n agent: nonEmpty(params.get(SCHEDULE_AGENT_QUERY)),\n status: parseStatus(params.get(SCHEDULE_STATUS_QUERY)),\n q: nonEmpty(params.get(SCHEDULE_NAME_QUERY)),\n isNew: params.get(SCHEDULE_IS_NEW_QUERY) === 'true',\n };\n}\n\nexport function writeScheduleShareSearch(params: URLSearchParams, next: ScheduleShareWrite): void {\n if (next.agent === null) params.delete(SCHEDULE_AGENT_QUERY);\n else if (next.agent != null) params.set(SCHEDULE_AGENT_QUERY, next.agent);\n if (next.status === null) params.delete(SCHEDULE_STATUS_QUERY);\n else if (next.status != null) params.set(SCHEDULE_STATUS_QUERY, next.status);\n if (next.q === null) params.delete(SCHEDULE_NAME_QUERY);\n else if (next.q != null) params.set(SCHEDULE_NAME_QUERY, next.q);\n if (next.isNew === null || next.isNew === false) params.delete(SCHEDULE_IS_NEW_QUERY);\n else if (next.isNew === true) params.set(SCHEDULE_IS_NEW_QUERY, 'true');\n}\n\n/** Drop all schedules-owned query keys (used when leaving the schedules place). */\nexport function clearScheduleShareSearch(params: URLSearchParams): void {\n params.delete(SCHEDULE_AGENT_QUERY);\n params.delete(SCHEDULE_STATUS_QUERY);\n params.delete(SCHEDULE_NAME_QUERY);\n params.delete(SCHEDULE_IS_NEW_QUERY);\n}\n\nexport function replaceScheduleShareSearch(next: ScheduleShareWrite): string {\n const url = new URL(window.location.href);\n writeScheduleShareSearch(url.searchParams, next);\n window.history.replaceState(window.history.state, '', url);\n window.dispatchEvent(new Event(SCHEDULE_SHARE_CHANGE_EVENT));\n return url.search;\n}\n\n/**\n * Point the address bar at schedules filtered to `agentId` (clears library agent\n * share keys). Caller still opens the schedules place via shell.\n */\nexport function writeOpenSchedulesForAgentSearch({ agentId, isNew }: { agentId: string; isNew?: boolean }): void {\n const url = new URL(window.location.href);\n writeSessionShareSearch(url.searchParams, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n writeScheduleShareSearch(url.searchParams, {\n agent: agentId,\n status: null,\n q: null,\n isNew: isNew === true ? true : null,\n });\n window.history.replaceState(window.history.state, '', url);\n}\n"],"mappings":";;;;;;AAEA,SAAS,aAAa,aAAAA,YAAW,QAAQ,YAAAC,iBAAgB;;;ACAzD,SAAS,WAAW,gBAAgB;AAG7B,SAAS,kBAAqB,OAAU,SAAoB;AACjE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,YAAU,MAAM;AACd,UAAM,KAAK,OAAO,WAAW,MAAM,aAAa,KAAK,GAAG,OAAO;AAC/D,WAAO,MAAM,OAAO,aAAa,EAAE;AAAA,EACrC,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,SAAO;AACT;;;ADLO,IAAM,0BAA0B;AACvC,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAG9B,eAAsB,gBACpB,QACA,SAAS,GACqB;AAC9B,QAAM,OAAO,MAAM,OAAO,aAAa,EAAE,OAAO,yBAAyB,OAAO,CAAC;AACjF,MAAI,KAAK,SAAS,wBAAyB,QAAO;AAClD,SAAO,CAAC,GAAG,MAAM,GAAI,MAAM,gBAAgB,QAAQ,SAAS,KAAK,MAAM,CAAE;AAC3E;AAGA,eAAsB,gBAAgB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAI2C;AACzC,QAAM,OAAO,MAAM,OAAO,aAAa,EAAE,OAAO,WAAW,OAAO,yBAAyB,OAAO,CAAC;AACnG,QAAM,QAAQ,KAAK,KAAK,WAAS,MAAM,SAAS,SAAS;AACzD,MAAI,SAAS,QAAQ,KAAK,SAAS,wBAAyB,QAAO;AACnE,SAAO,gBAAgB,EAAE,QAAQ,WAAW,QAAQ,SAAS,KAAK,OAAO,CAAC;AAC5E;AA6BO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,aAAa;AACf,GAA0D;AACxD,QAAM,SAAS,kBAAkB;AAEjC,QAAM,iBAAiB,kBAAkB,OAAO,UAAU,aAAa,CAAC;AAExE,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAA8B,CAAC,CAAC;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,SAAS,OAAO,CAAC;AACvB,QAAM,sBAAsB,OAAO,KAAK;AACxC,QAAM,aAAa,OAAO,KAAK;AAC/B,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,YAAY,OAA2B,IAAI;AACjD,QAAM,gBAAgB,OAA2B,IAAI;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA6B,IAAI;AAC7D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA6B,IAAI;AAErE,aAAW,UAAU;AACrB,eAAa,UAAU,OAAO;AAE9B,QAAM,UAAU,YAAY,CAAC,SAA6B;AACxD,cAAU,UAAU;AACpB,cAAU,IAAI;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,CAAC,SAA6B;AAC5D,kBAAc,UAAU;AACxB,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,eAAe,KAAK,KAAK;AAE7C,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,UAAU,KAAM;AAEhC,UAAM,MAAM,EAAE,OAAO;AACrB,wBAAoB,UAAU;AAC9B,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,SAAK,OACF,aAAa,EAAE,OAAO,aAAa,OAAO,QAAQ,EAAE,CAAC,EACrD,KAAK,UAAQ;AACZ,UAAI,QAAQ,OAAO,QAAS;AAC5B,gBAAU,IAAI;AACd,iBAAW,KAAK,UAAU,KAAK;AAAA,IACjC,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,UAAI,QAAQ,OAAO,QAAS;AAC5B,gBAAU,CAAC,CAAC;AACZ,iBAAW,KAAK;AAChB,eAAS,gBAAgB,KAAK,wBAAwB,CAAC;AAAA,IACzD,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,QAAQ,OAAO,QAAS,YAAW,KAAK;AAAA,IAC9C,CAAC;AAEH,WAAO,MAAM;AACX,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,aAAa,OAAO,UAAU,CAAC;AAEpD,QAAM,WAAW,YAAY,MAAM;AACjC,QAAI,CAAC,WAAW,UAAU,QAAQ,CAAC,WAAW,WAAW,oBAAoB,WAAW,SAAS;AAC/F;AAAA,IACF;AAEA,UAAM,MAAM,OAAO;AACnB,UAAM,SAAS,aAAa;AAC5B,wBAAoB,UAAU;AAC9B,mBAAe,IAAI;AAEnB,SAAK,OACF,aAAa,EAAE,OAAO,aAAa,OAAO,OAAO,CAAC,EAClD,KAAK,UAAQ;AACZ,UAAI,QAAQ,OAAO,QAAS;AAC5B,gBAAU,UAAQ,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AACpC,iBAAW,KAAK,UAAU,KAAK;AAAA,IACjC,CAAC,EACA,MAAM,MAAM;AACX,UAAI,QAAQ,OAAO,QAAS;AAC5B,iBAAW,KAAK;AAAA,IAClB,CAAC,EACA,QAAQ,MAAM;AACb,0BAAoB,UAAU;AAC9B,UAAI,QAAQ,OAAO,QAAS,gBAAe,KAAK;AAAA,IAClD,CAAC;AAAA,EACL,GAAG,CAAC,SAAS,QAAQ,aAAa,OAAO,OAAO,CAAC;AAEjD,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,WAAW,UAAU,QAAQ,cAAc,KAAM;AAElE,UAAM,WAAW,IAAI;AAAA,MACnB,aAAW;AACT,YAAI,QAAQ,KAAK,WAAS,MAAM,cAAc,GAAG;AAC/C,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,EAAE,MAAM,QAAQ,YAAY,sBAAsB;AAAA,IACpD;AACA,aAAS,QAAQ,UAAU;AAC3B,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,SAAS,SAAS,QAAQ,YAAY,UAAU,OAAO,MAAM,CAAC;AAElE,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,WAAW,OAAO,WAAW;AAAA,IAC/C,aAAa,WAAW,OAAO,SAAS;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AE1LO,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAE9B,IAAM,8BAA8B;AAoB3C,SAAS,SAAS,OAAqC;AACrD,SAAO,SAAS,QAAQ,MAAM,SAAS,IAAI,QAAQ;AACrD;AAEA,SAAS,YAAY,OAA6C;AAChE,MAAI,UAAU,YAAY,UAAU,SAAU,QAAO;AACrD,SAAO;AACT;AAEO,SAAS,wBAAwB,QAAqC;AAC3E,QAAM,SAAS,IAAI,gBAAgB,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM;AACpF,SAAO;AAAA,IACL,OAAO,SAAS,OAAO,IAAI,oBAAoB,CAAC;AAAA,IAChD,QAAQ,YAAY,OAAO,IAAI,qBAAqB,CAAC;AAAA,IACrD,GAAG,SAAS,OAAO,IAAI,mBAAmB,CAAC;AAAA,IAC3C,OAAO,OAAO,IAAI,qBAAqB,MAAM;AAAA,EAC/C;AACF;AAEO,SAAS,yBAAyB,QAAyB,MAAgC;AAChG,MAAI,KAAK,UAAU,KAAM,QAAO,OAAO,oBAAoB;AAAA,WAClD,KAAK,SAAS,KAAM,QAAO,IAAI,sBAAsB,KAAK,KAAK;AACxE,MAAI,KAAK,WAAW,KAAM,QAAO,OAAO,qBAAqB;AAAA,WACpD,KAAK,UAAU,KAAM,QAAO,IAAI,uBAAuB,KAAK,MAAM;AAC3E,MAAI,KAAK,MAAM,KAAM,QAAO,OAAO,mBAAmB;AAAA,WAC7C,KAAK,KAAK,KAAM,QAAO,IAAI,qBAAqB,KAAK,CAAC;AAC/D,MAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,MAAO,QAAO,OAAO,qBAAqB;AAAA,WAC3E,KAAK,UAAU,KAAM,QAAO,IAAI,uBAAuB,MAAM;AACxE;AAGO,SAAS,yBAAyB,QAA+B;AACtE,SAAO,OAAO,oBAAoB;AAClC,SAAO,OAAO,qBAAqB;AACnC,SAAO,OAAO,mBAAmB;AACjC,SAAO,OAAO,qBAAqB;AACrC;AAEO,SAAS,2BAA2B,MAAkC;AAC3E,QAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,2BAAyB,IAAI,cAAc,IAAI;AAC/C,SAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,GAAG;AACzD,SAAO,cAAc,IAAI,MAAM,2BAA2B,CAAC;AAC3D,SAAO,IAAI;AACb;","names":["useEffect","useState","useState","useEffect"]}
@@ -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, type ComponentType } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { useResourcePermissions } from '../../hooks/useResourcePermissions.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 { useSlot } from '../../theme/SlotsProvider.js';\nimport { hasCreatedBySubject } from '../../utils/createdBySubject.js';\nimport { readScheduleShareSearch, replaceScheduleShareSearch } from '../../utils/scheduleShareUrl.js';\nimport { CreatedByCell } from '../CreatedByCell.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\nexport type SchedulesPageProps = {\n /** Lock the page to one agent when embedded in Agent Details. */\n agentId?: string;\n};\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 initialDrawerState(agentId?: string): DrawerState {\n const share = readScheduleShareSearch(window.location.search);\n if (!share.isNew) return { kind: 'closed' };\n const initialAgentId = agentId ?? share.agent;\n return {\n kind: 'create',\n ...(initialAgentId == null ? {} : { agentId: initialAgentId }),\n };\n}\n\nfunction ScheduleRowActions({\n schedule,\n running,\n canManage,\n canDelete,\n onRunNow,\n onEdit,\n onTogglePause,\n onDelete,\n}: {\n schedule: Schedule;\n running: boolean;\n canManage: boolean;\n canDelete: boolean;\n onRunNow: () => void;\n onEdit: () => void;\n onTogglePause: () => void;\n onDelete: () => void;\n}) {\n const PermissionGuard = useSlot('PermissionGuard');\n return (\n <div className=\"inline-flex items-center justify-end gap-1.5\">\n <PermissionGuard allowed={canManage}>\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 </PermissionGuard>\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 <PermissionGuard allowed={canManage}>\n <DropdownMenuItem onClick={onEdit}>\n <Icon name=\"pencil\" className=\"size-3.5\" />\n Edit\n </DropdownMenuItem>\n </PermissionGuard>\n <PermissionGuard allowed={canManage}>\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 </PermissionGuard>\n <PermissionGuard allowed={canDelete}>\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 </PermissionGuard>\n </DropdownMenu>\n </div>\n );\n}\n\nexport function SchedulesPage({ agentId }: SchedulesPageProps) {\n const scheduleServer = useScheduleServer();\n const server = useServer();\n const toaster = useToasterOptional();\n\n const [schedules, setSchedules] = useState<Schedule[]>([]);\n const { allows } = useResourcePermissions({\n resourceType: 'schedule',\n resourceIds: schedules.map(schedule => schedule.id),\n });\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(\n () => agentId ?? filtersFromSearch(window.location.search).agentFilter,\n );\n const permissionAgentId = agentId ?? (agentFilter === 'all' ? null : agentFilter);\n const permissionAgentIds = useMemo(\n () => (permissionAgentId == null ? agentOptions.map(option => option.agentId) : [permissionAgentId]),\n [agentOptions, permissionAgentId],\n );\n const { allows: allowsAgent } = useResourcePermissions({\n resourceType: 'agent',\n resourceIds: permissionAgentIds,\n });\n const canCreateSchedule =\n server.permissions == null ||\n (permissionAgentId == null\n ? agentOptions.some(option => allowsAgent(option.agentId, 'USE'))\n : allowsAgent(permissionAgentId, 'USE'));\n const [drawer, setDrawer] = useState<DrawerState>(() => initialDrawerState(agentId));\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: agentId === undefined && agentFilter !== 'all' ? agentFilter : null,\n status: statusFilter === 'all' ? null : statusFilter,\n q: nameQuery.trim().length === 0 ? null : nameQuery,\n });\n }, [agentFilter, agentId, statusFilter, nameQuery]);\n\n useEffect(() => {\n if (agentId === undefined) return;\n setAgentFilter(current => {\n if (current === agentId) return current;\n setPageToken(undefined);\n setPrevTokenStack([]);\n return agentId;\n });\n }, [agentId]);\n\n // One-shot: the initial state opens create synchronously; then strip the URL 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 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 const nextAgentFilter = agentId ?? next.agentFilter;\n if (current === nextAgentFilter) return current;\n setPageToken(undefined);\n setPrevTokenStack([]);\n return nextAgentFilter;\n });\n };\n window.addEventListener('popstate', syncFromUrl);\n return () => {\n window.removeEventListener('popstate', syncFromUrl);\n };\n }, [agentId]);\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 // Key off page data, not client filters — filtering must not toggle the column.\n const showCreatedByColumn = hasCreatedBySubject(schedules);\n const hasPageNav = prevTokenStack.length > 0 || nextPageToken != null;\n\n const handleTogglePause = async (schedule: Schedule) => {\n if (!allows(schedule.id, 'MANAGE')) return;\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 if (!allows(schedule.id, 'MANAGE')) return;\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 if (!allows(schedule.id, 'DELETE')) return;\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={agentId === undefined ? 'Scheduled Agents' : undefined}\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 {agentId === undefined ? (\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 ) : null}\n <Button.Primary\n type=\"button\"\n disabled={!canCreateSchedule}\n onClick={() =>\n canCreateSchedule &&\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\">\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 {showCreatedByColumn ? <TableHead>Created by</TableHead> : null}\n <TableHead>Frequency</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 <span className=\"text-left !no-underline\">{schedule.name}</span>\n </TableCell>\n <TableCell>{agentLabel}</TableCell>\n {showCreatedByColumn ? (\n <TableCell>\n <CreatedByCell subject={schedule.createdBySubject} />\n </TableCell>\n ) : null}\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 canManage={allows(schedule.id, 'MANAGE')}\n canDelete={allows(schedule.id, 'DELETE')}\n onRunNow={() => void handleRunNow(schedule)}\n onEdit={() => {\n if (allows(schedule.id, 'MANAGE')) setDrawer({ kind: 'edit', schedule });\n }}\n onTogglePause={() => void handleTogglePause(schedule)}\n onDelete={() => {\n if (allows(schedule.id, 'DELETE')) setPendingDelete(schedule);\n }}\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\n type=\"button\"\n disabled={!allows(pendingDelete.id, 'DELETE')}\n onClick={() => void handleDelete(pendingDelete)}\n >\n Delete\n </Button.Destructive>\n </DialogFooter>\n </Dialog>\n ) : null}\n </div>\n );\n}\n\ndeclare module '../../theme/SlotsProvider.js' {\n interface AtomSlots {\n SchedulesPage: ComponentType<SchedulesPageProps>;\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 { useResourcePermissions } from '../../hooks/useResourcePermissions.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useScheduleServer, useServer } from '../../server/ServerContext.js';\nimport { libraryAgentId, useOptionalShellMode } 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 shell = useOptionalShellMode();\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 [agentsLoaded, setAgentsLoaded] = useState(false);\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 const isInitialCreate = mode === 'create' && view.kind === 'form' && view.saved == null;\n const { allows: allowsAgent } = useResourcePermissions({\n resourceType: 'agent',\n resourceIds: agentId.length === 0 ? [] : [agentId],\n });\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n setAgentsLoaded(false);\n void searchAllAgents(server)\n .then(rows => {\n if (cancelled) return;\n setAgents(rows);\n setAgentsLoaded(true);\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 (\n form.name.trim().length > 0 &&\n form.task.trim().length > 0 &&\n cron.length > 0 &&\n agentId.length > 0 &&\n (!isInitialCreate || allowsAgent(agentId, 'USE'))\n );\n }, [agentId, allowsAgent, form, isInitialCreate]);\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 Schedule\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=\"xl\"\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 agentOptionsLoaded={agentsLoaded}\n agentPickerDisabled={isExternalEdit || isCreatedEdit}\n onBuildAgent={\n mode === 'create' && shell?.isComposerEnabled === true\n ? () => {\n onOpenChange(false);\n shell.openAgentBuilder();\n }\n : undefined\n }\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 { Icon } from '../../icons/Icon.js';\nimport { cn } from '../lib/cn.js';\nimport { auiInputClass } from '../lib/inputClasses.js';\nimport { Button } from '../primitives/Button.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 agentOptionsLoaded?: boolean;\n agentPickerDisabled?: boolean;\n onBuildAgent?: () => void;\n};\n\nexport function ScheduleFormFields({\n values,\n onChange,\n agentId,\n onAgentIdChange,\n agentOptions,\n agentOptionsLoaded = true,\n agentPickerDisabled = false,\n onBuildAgent,\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 emptyContent={\n agentOptionsLoaded ? (\n <p className=\"text-text-secondary px-3 py-5 text-center text-sm\">No Agents created yet</p>\n ) : null\n }\n footer={\n agentOptionsLoaded && agentOptions.length === 0 && onBuildAgent != null ? (\n <div className=\"flex justify-end border-t border-border px-2 pt-2\">\n <Button.Ghost type=\"button\" onClick={onBuildAgent}>\n <Icon name=\"plus\" className=\"size-3.5\" />\n Build Agent\n </Button.Ghost>\n </div>\n ) : null\n }\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\">Frequency</legend>\n <div className=\"rounded-t-lg border border-border p-4\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"grid grid-cols-3 gap-1 rounded-lg border border-border bg-primary-bg 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 border px-2 py-2 text-sm font-medium transition-colors',\n selected\n ? 'border-primary-button-bg/40 bg-primary-button-bg/10 font-semibold text-primary-button-bg'\n : 'border-transparent text-text-secondary hover:bg-ghost-button-hover',\n )}\n aria-pressed={selected}\n onClick={() => set('recurrence', opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n\n {values.recurrence === 'custom' ? (\n <div className=\"rounded-md border border-border bg-secondary-bg/40 px-3 py-2\">\n <span className=\"block text-xs text-text-secondary\">Existing custom schedule</span>\n <code className=\"mt-1 block font-mono text-sm text-text-primary\">{values.customCron}</code>\n <span className=\"mt-1 block text-xs text-text-secondary\">\n Select Hourly, Daily, or Weekly to replace this schedule.\n </span>\n </div>\n ) : null}\n\n {values.recurrence === 'weekly' ? (\n <fieldset>\n <legend className=\"mb-2 text-sm font-medium\">Days</legend>\n <div className=\"flex gap-2\">\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 'min-w-0 flex-1 rounded-md border px-3 py-2 text-[0.8125rem] font-medium',\n selected\n ? 'border-primary-button-bg/40 bg-primary-button-bg/10 font-semibold 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 <div className=\"flex gap-4\">\n {values.recurrence === 'daily' || values.recurrence === 'weekly' ? (\n <div className=\"min-w-0 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 ) : null}\n {values.recurrence !== 'custom' ? (\n <div className=\"min-w-0 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 ) : null}\n <div className=\"min-w-0 flex-1\">\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 menuClassName=\"w-full min-w-0\"\n />\n </div>\n </div>\n </div>\n </div>\n <div className=\"rounded-b-lg border border-t-0 border-border bg-primary-button-bg/10 px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Icon name=\"clock\" className=\"size-4 shrink-0 text-primary-button-bg\" />\n <span className=\"shrink-0 text-xs font-medium text-text-secondary\">Schedule</span>\n <p className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">{cadence || '—'}</p>\n <code className=\"shrink-0 whitespace-nowrap font-mono text-[0.8125rem] font-bold text-text-secondary\">\n {cron || '—'}\n </code>\n </div>\n </div>\n </fieldset>\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=\"Status\">\n <ScheduleStatusBadge status={schedule.status} />\n </DetailRow>\n <DetailRow label=\"Task\">\n <span className=\"whitespace-pre-wrap break-words\">{schedule.task}</span>\n </DetailRow>\n <DetailRow label=\"Frequency\">\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 <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-amber-600/30 bg-amber-500/10 text-amber-800 dark:border-amber-400/35 dark:bg-amber-500/15 dark:text-amber-300',\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-amber-600 dark:bg-amber-400',\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","useMemo","agentId","useEffect"]}