@truefoundry/trueforge-ui 0.3.0-rc.5 → 0.3.0-rc.7
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.
- package/CHANGELOG.md +28 -0
- package/dist/{AgentCodeSnippets-V5A56M7R.js → AgentCodeSnippets-T7PR6PDP.js} +7 -7
- package/dist/AgentMetricChart-J3RCSCAG.js +15 -0
- package/dist/{AgentOverview-NPC4P2EY.js → AgentOverview-WC7WMNMS.js} +11 -9
- package/dist/AgentOverview-WC7WMNMS.js.map +1 -0
- package/dist/{AgentSessionEventTimeline-UUXOJXTC.js → AgentSessionEventTimeline-SETKGGCI.js} +7 -7
- package/dist/{AgentSessionEventTimelineChart-FIAQCYJC.js → AgentSessionEventTimelineChart-4Y7PY5SJ.js} +7 -7
- package/dist/{AgentSessions-WHODEG2M.js → AgentSessions-YCAPM5GK.js} +8 -8
- package/dist/{ConnectorSettings-QTAI4TQX.js → ConnectorSettings-PXWRCFAL.js} +7 -7
- package/dist/{DockLayout-TATYU5SV.js → DockLayout-JRKCKAG2.js} +10 -10
- package/dist/{DrawerLayout-DXHNV33K.js → DrawerLayout-U7YPUZBR.js} +11 -11
- package/dist/{ModelSettings-UWTBHQRG.js → ModelSettings-VXYMJEMO.js} +7 -7
- package/dist/OpenUiFenceBlock-KPZFLUSC.js +9 -0
- package/dist/{SandboxSettings-BITQONS3.js → SandboxSettings-6DRUH72J.js} +7 -7
- package/dist/SchedulesPage-2G6F4XO6.js +15 -0
- package/dist/{SettingsBuilder-3OA4UCIM.js → SettingsBuilder-6FJVZLJT.js} +9 -9
- package/dist/{SettingsBuilder-3OA4UCIM.js.map → SettingsBuilder-6FJVZLJT.js.map} +1 -1
- package/dist/{ShellRouteSync-J74MV23Q.js → ShellRouteSync-SJXFKUAJ.js} +4 -4
- package/dist/{SidebarLayout-EQXQPYIU.js → SidebarLayout-EQ7EYCWR.js} +12 -12
- package/dist/{SkillSettings-KQ6GQ7JW.js → SkillSettings-IHVI7FDM.js} +7 -7
- package/dist/{TrueForgeUIWithRouter-R3UXQZRY.js → TrueForgeUIWithRouter-5OJFI3PF.js} +9 -9
- package/dist/{WidgetLayout-YWZTYFZL.js → WidgetLayout-PN5ZDOLM.js} +10 -10
- package/dist/{chunk-TAABBM7F.js → chunk-2GIZY3JJ.js} +3 -1
- package/dist/chunk-2GIZY3JJ.js.map +1 -0
- package/dist/{chunk-4MCIDE2C.js → chunk-2QTH6JHX.js} +3 -3
- package/dist/{chunk-ZZB3JIBQ.js → chunk-2UBSLCKB.js} +9 -9
- package/dist/{chunk-IIHJ32YH.js → chunk-3ZW74FHC.js} +3 -3
- package/dist/{chunk-CFGLAGWH.js → chunk-CG75X77Q.js} +2 -2
- package/dist/{chunk-TFFTZB26.js → chunk-E33DFTVN.js} +8 -8
- package/dist/chunk-E33DFTVN.js.map +1 -0
- package/dist/{chunk-ERIIJKJY.js → chunk-F7YRYFAF.js} +4 -4
- package/dist/chunk-JCL3Q7RW.js +587 -0
- package/dist/{chunk-OWDH67NY.js.map → chunk-JCL3Q7RW.js.map} +1 -1
- package/dist/{chunk-IVDIBAVH.js → chunk-L7HNKKS2.js} +2 -2
- package/dist/{chunk-INY3J2BV.js → chunk-OWXPMQ7N.js} +10 -10
- package/dist/{chunk-7NYDADYN.js → chunk-PX6MNNN3.js} +5 -5
- package/dist/{chunk-3QWUHGNL.js → chunk-T6QQV5LK.js} +55 -12
- package/dist/chunk-T6QQV5LK.js.map +1 -0
- package/dist/{chunk-DCVKW445.js → chunk-TMIILLHB.js} +478 -268
- package/dist/chunk-TMIILLHB.js.map +1 -0
- package/dist/{chunk-MMU55KCW.js → chunk-XANC4F2H.js} +318 -166
- package/dist/chunk-XANC4F2H.js.map +1 -0
- package/dist/index.d.ts +15 -11
- package/dist/index.js +12 -12
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +2 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.js +65 -14
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/AgentMetricChart-GEADURES.js +0 -15
- package/dist/AgentOverview-NPC4P2EY.js.map +0 -1
- package/dist/OpenUiFenceBlock-FHEYXZEQ.js +0 -9
- package/dist/SchedulesPage-JIUWNYUH.js +0 -15
- package/dist/chunk-3QWUHGNL.js.map +0 -1
- package/dist/chunk-DCVKW445.js.map +0 -1
- package/dist/chunk-MMU55KCW.js.map +0 -1
- package/dist/chunk-OWDH67NY.js +0 -587
- package/dist/chunk-TAABBM7F.js.map +0 -1
- package/dist/chunk-TFFTZB26.js.map +0 -1
- /package/dist/{AgentCodeSnippets-V5A56M7R.js.map → AgentCodeSnippets-T7PR6PDP.js.map} +0 -0
- /package/dist/{AgentMetricChart-GEADURES.js.map → AgentMetricChart-J3RCSCAG.js.map} +0 -0
- /package/dist/{AgentSessionEventTimeline-UUXOJXTC.js.map → AgentSessionEventTimeline-SETKGGCI.js.map} +0 -0
- /package/dist/{AgentSessionEventTimelineChart-FIAQCYJC.js.map → AgentSessionEventTimelineChart-4Y7PY5SJ.js.map} +0 -0
- /package/dist/{AgentSessions-WHODEG2M.js.map → AgentSessions-YCAPM5GK.js.map} +0 -0
- /package/dist/{ConnectorSettings-QTAI4TQX.js.map → ConnectorSettings-PXWRCFAL.js.map} +0 -0
- /package/dist/{DockLayout-TATYU5SV.js.map → DockLayout-JRKCKAG2.js.map} +0 -0
- /package/dist/{DrawerLayout-DXHNV33K.js.map → DrawerLayout-U7YPUZBR.js.map} +0 -0
- /package/dist/{ModelSettings-UWTBHQRG.js.map → ModelSettings-VXYMJEMO.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-FHEYXZEQ.js.map → OpenUiFenceBlock-KPZFLUSC.js.map} +0 -0
- /package/dist/{SandboxSettings-BITQONS3.js.map → SandboxSettings-6DRUH72J.js.map} +0 -0
- /package/dist/{SchedulesPage-JIUWNYUH.js.map → SchedulesPage-2G6F4XO6.js.map} +0 -0
- /package/dist/{ShellRouteSync-J74MV23Q.js.map → ShellRouteSync-SJXFKUAJ.js.map} +0 -0
- /package/dist/{SidebarLayout-EQXQPYIU.js.map → SidebarLayout-EQ7EYCWR.js.map} +0 -0
- /package/dist/{SkillSettings-KQ6GQ7JW.js.map → SkillSettings-IHVI7FDM.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-R3UXQZRY.js.map → TrueForgeUIWithRouter-5OJFI3PF.js.map} +0 -0
- /package/dist/{WidgetLayout-YWZTYFZL.js.map → WidgetLayout-PN5ZDOLM.js.map} +0 -0
- /package/dist/{chunk-4MCIDE2C.js.map → chunk-2QTH6JHX.js.map} +0 -0
- /package/dist/{chunk-ZZB3JIBQ.js.map → chunk-2UBSLCKB.js.map} +0 -0
- /package/dist/{chunk-IIHJ32YH.js.map → chunk-3ZW74FHC.js.map} +0 -0
- /package/dist/{chunk-CFGLAGWH.js.map → chunk-CG75X77Q.js.map} +0 -0
- /package/dist/{chunk-ERIIJKJY.js.map → chunk-F7YRYFAF.js.map} +0 -0
- /package/dist/{chunk-IVDIBAVH.js.map → chunk-L7HNKKS2.js.map} +0 -0
- /package/dist/{chunk-INY3J2BV.js.map → chunk-OWXPMQ7N.js.map} +0 -0
- /package/dist/{chunk-7NYDADYN.js.map → chunk-PX6MNNN3.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/atoms/schedules/SchedulesPage.tsx","../src/atoms/AgentSearchPicker.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 { AgentSearchPicker } from '../AgentSearchPicker.js';\nimport { CreatedByCell } from '../CreatedByCell.js';\nimport { EmptyScreen } from '../EmptyScreen.js';\nimport { auiButtonClass } from '../lib/buttonClasses.js';\nimport { cn } from '../lib/cn.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 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 /** Names learned from picker picks; no mount-time catalog drain. */\n const [agentLabelById, setAgentLabelById] = useState<Record<string, string>>({});\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 // Specific agent (filter or embedded): gate Create on USE. Filter \"all\": enable and let the drawer enforce USE.\n const permissionAgentId = agentId ?? (agentFilter === 'all' ? null : agentFilter);\n const { allows: allowsAgent } = useResourcePermissions({\n resourceType: 'agent',\n resourceIds: permissionAgentId == null ? [] : [permissionAgentId],\n });\n const canCreateSchedule =\n server.permissions == null || permissionAgentId == null || 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 // 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-60\">\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 <AgentSearchPicker\n value={agentFilter}\n selectedLabel={agentFilter === 'all' ? 'All agents' : (agentLabelById[agentFilter] ?? agentFilter)}\n onValueChange={value => {\n setAgentFilter(value);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n onAgentPicked={agent => {\n setAgentLabelById(current => ({\n ...current,\n [libraryAgentId(agent)]: agent.name,\n }));\n }}\n allOption={{ value: 'all', label: 'All agents' }}\n className=\"sm:w-48\"\n aria-label=\"Filter by agent\"\n placeholder=\"Search 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 ?? agentLabelById[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","'use client';\n\nimport { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Icon } from '../icons/Icon.js';\nimport { libraryAgentId } from '../server/ShellModeContext.js';\nimport type { AgentLibraryEntry } from '../server/types.js';\nimport { cn } from './lib/cn.js';\nimport { auiSelectMenuClass, auiSelectOptionClass, auiSelectTriggerClass } from './lib/selectClasses.js';\nimport { themePortalRoot } from './lib/themePortalRoot.js';\nimport { useSearchAgentsList } from './lib/useSearchAgentsList.js';\nimport { Button } from './primitives/Button.js';\n\nexport type AgentSearchPickerProps = {\n value: string;\n selectedLabel: string;\n onValueChange: (agentId: string) => void;\n onAgentPicked?: (agent: AgentLibraryEntry) => void;\n disabled?: boolean;\n onBuildAgent?: () => void;\n /** When set, shows this option above results while the query is empty (e.g. filter \"All agents\"). */\n allOption?: { value: string; label: string };\n 'aria-label'?: string;\n placeholder?: string;\n className?: string;\n};\n\n/**\n * Combobox agent picker: type in the field to filter via debounced `searchAgents`.\n */\nexport function AgentSearchPicker({\n value,\n selectedLabel,\n onValueChange,\n onAgentPicked,\n disabled = false,\n onBuildAgent,\n allOption,\n 'aria-label': ariaLabel = 'Agent',\n placeholder = 'Search agent',\n className,\n}: AgentSearchPickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [pos, setPos] = useState<{ top: number; left: number; width: number } | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n\n const { agents, isInitialLoading, isSearching, loadingMore, hasMore, error, listRef, sentinelRef } =\n useSearchAgentsList({\n enabled: open && !disabled,\n query,\n });\n\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n\n const update = () => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n setPos({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n };\n\n update();\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n\n const handlePointerDown = (event: MouseEvent) => {\n if (!(event.target instanceof Node)) return;\n if (rootRef.current?.contains(event.target)) return;\n if (menuRef.current?.contains(event.target)) return;\n setOpen(false);\n };\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [open]);\n\n const close = () => {\n setOpen(false);\n setQuery('');\n inputRef.current?.blur();\n };\n\n const pick = (agent: AgentLibraryEntry) => {\n const id = libraryAgentId(agent);\n onValueChange(id);\n onAgentPicked?.(agent);\n close();\n };\n\n const pickAll = () => {\n if (allOption == null) return;\n onValueChange(allOption.value);\n close();\n };\n\n const inputValue = open ? query : selectedLabel;\n const queryTrimmed = query.trim();\n const showError = !isInitialLoading && error != null;\n const showEmptyCatalog = !isInitialLoading && error == null && agents.length === 0 && queryTrimmed === '';\n const showNoMatch = !isInitialLoading && error == null && agents.length === 0 && queryTrimmed !== '';\n\n const menu =\n open && pos != null && !disabled\n ? createPortal(\n <div\n ref={menuRef}\n className={auiSelectMenuClass('fixed z-[200] flex max-h-64 flex-col overflow-hidden')}\n style={{\n top: pos.top,\n left: pos.left,\n width: pos.width,\n }}\n onMouseDown={event => event.stopPropagation()}\n >\n <div\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={ariaLabel}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {allOption != null && queryTrimmed === '' ? (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={value === allOption.value}\n className={auiSelectOptionClass()}\n onClick={pickAll}\n >\n <span className=\"min-w-0 flex-1 truncate\">{allOption.label}</span>\n <Icon\n name=\"check\"\n className={cn('ml-auto size-4 shrink-0', value === allOption.value ? 'opacity-100' : 'opacity-0')}\n />\n </button>\n ) : null}\n {isInitialLoading ? (\n <p className=\"text-text-secondary px-3 py-5 text-center text-sm\" role=\"status\">\n Loading…\n </p>\n ) : showError ? (\n <p className=\"text-failure-bg px-3 py-5 text-center text-sm\" role=\"alert\">\n {error}\n </p>\n ) : showEmptyCatalog ? (\n <p className=\"text-text-secondary px-3 py-5 text-center text-sm\">No Agents created yet</p>\n ) : showNoMatch ? (\n <p className=\"text-text-secondary px-3 py-5 text-center text-sm\" role=\"status\">\n No agents match "{queryTrimmed}".\n </p>\n ) : (\n <>\n {isSearching ? (\n <p className=\"sr-only\" role=\"status\">\n Searching…\n </p>\n ) : null}\n {agents.map(agent => {\n const id = libraryAgentId(agent);\n const selected = value === id;\n return (\n <button\n key={id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={auiSelectOptionClass()}\n onClick={() => pick(agent)}\n >\n <span className=\"min-w-0 flex-1 truncate\">{agent.name}</span>\n <Icon\n name=\"check\"\n className={cn('ml-auto size-4 shrink-0', selected ? 'opacity-100' : 'opacity-0')}\n />\n </button>\n );\n })}\n {hasMore ? (\n <div ref={sentinelRef} className=\"flex h-6 shrink-0 items-center justify-center\" aria-hidden>\n {loadingMore ? (\n <span className=\"text-text-secondary text-[11px]\" role=\"status\">\n Loading more…\n </span>\n ) : null}\n </div>\n ) : null}\n </>\n )}\n </div>\n {showEmptyCatalog && 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 </div>,\n themePortalRoot(rootRef.current),\n )\n : null;\n\n return (\n <div ref={rootRef} className={cn('relative', className)}>\n <div\n ref={triggerRef}\n className={auiSelectTriggerClass(disabled ? 'cursor-not-allowed opacity-50' : 'cursor-text')}\n >\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-autocomplete=\"list\"\n disabled={disabled}\n placeholder={placeholder}\n value={inputValue}\n className=\"min-w-0 flex-1 bg-transparent outline-none placeholder:text-text-secondary/70 disabled:cursor-not-allowed\"\n onFocus={() => {\n if (!disabled) setOpen(true);\n }}\n onChange={event => {\n if (disabled) return;\n setQuery(event.target.value);\n setOpen(true);\n }}\n onKeyDown={event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n inputRef.current?.blur();\n return;\n }\n if (event.key === 'ArrowDown' && !open && !disabled) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n />\n <Icon name=\"chevron-down\" className=\"size-4 shrink-0 text-text-secondary\" />\n </div>\n {menu}\n </div>\n );\n}\n","export type RecurrenceKind = 'hourly' | 'daily' | 'weekly' | 'custom';\n\nexport type ScheduleFormValues = {\n name: string;\n task: string;\n recurrence: RecurrenceKind;\n hour: number;\n minute: number;\n /** Cron DOW: 0=Sun … 6=Sat. Used when recurrence is weekly. */\n weekdays: number[];\n customCron: string;\n timezone: string;\n};\n\nexport const TIMEZONE_OPTIONS = [\n { value: 'America/New_York', label: 'America/New_York (ET)' },\n { value: 'America/Chicago', label: 'America/Chicago (CT)' },\n { value: 'America/Denver', label: 'America/Denver (MT)' },\n { value: 'America/Los_Angeles', label: 'America/Los_Angeles (PT)' },\n { value: 'UTC', label: 'UTC' },\n { value: 'Europe/London', label: 'Europe/London (GMT/BST)' },\n { value: 'Europe/Berlin', label: 'Europe/Berlin (CET)' },\n { value: 'Asia/Kolkata', label: 'Asia/Kolkata (IST)' },\n { value: 'Asia/Tokyo', label: 'Asia/Tokyo (JST)' },\n] as const;\n\nexport function resolveLocalTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nexport function getTimezoneOptions(selectedTimezone?: string): Array<{ value: string; label: string }> {\n const localTimezone = resolveLocalTimezone();\n const knownTimezones = new Set<string>(TIMEZONE_OPTIONS.map(option => option.value));\n // Keep both browser-local and persisted zones selectable even when they are\n // outside the curated common-timezone list.\n const additionalTimezones = [localTimezone, selectedTimezone].flatMap(timezone => {\n if (timezone == null || timezone.length === 0 || knownTimezones.has(timezone)) return [];\n knownTimezones.add(timezone);\n return [{ value: timezone, label: timezone === localTimezone ? `${timezone} (Local)` : timezone }];\n });\n return [...additionalTimezones, ...TIMEZONE_OPTIONS];\n}\n\nexport const WEEKDAY_OPTIONS = [\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' },\n { value: 0, label: 'Sun' },\n] as const;\n\nconst TZ_ABBR: Record<string, string> = {\n 'America/New_York': 'ET',\n 'America/Chicago': 'CT',\n 'America/Denver': 'MT',\n 'America/Los_Angeles': 'PT',\n UTC: 'UTC',\n 'Europe/London': 'GMT',\n 'Europe/Berlin': 'CET',\n 'Asia/Kolkata': 'IST',\n 'Asia/Tokyo': 'JST',\n};\n\nexport function defaultScheduleFormValues(): ScheduleFormValues {\n return {\n name: '',\n task: '',\n recurrence: 'daily',\n hour: 9,\n minute: 0,\n weekdays: [1],\n customCron: '0 9 * * *',\n timezone: resolveLocalTimezone(),\n };\n}\n\nexport function timezoneAbbrev(timezone: string): string {\n return TZ_ABBR[timezone] ?? timezone.split('/').pop() ?? timezone;\n}\n\nfunction pad2(n: number): string {\n return n.toString().padStart(2, '0');\n}\n\nfunction formatClock({ hour, minute }: { hour: number; minute: number }): string {\n const period = hour >= 12 ? 'PM' : 'AM';\n const h12 = hour % 12 === 0 ? 12 : hour % 12;\n return `${String(h12)}:${pad2(minute)} ${period}`;\n}\n\nexport function valuesToCron(values: ScheduleFormValues): string {\n const minute = values.minute;\n const hour = values.hour;\n switch (values.recurrence) {\n case 'hourly':\n return `${String(minute)} * * * *`;\n case 'daily':\n return `${String(minute)} ${String(hour)} * * *`;\n case 'weekly': {\n const days = [...values.weekdays].sort((a, b) => a - b);\n const dow = days.length > 0 ? days.join(',') : '*';\n return `${String(minute)} ${String(hour)} * * ${dow}`;\n }\n case 'custom':\n return values.customCron.trim();\n }\n}\n\nexport function formatCadenceSummary(input: { cron: string; timezone: string }): string {\n const abbr = timezoneAbbrev(input.timezone);\n const parts = input.cron.trim().split(/\\s+/);\n if (parts.length !== 5) return input.cron;\n\n const [minuteRaw, hourRaw, dayOfMonthRaw, monthRaw, dowRaw] = parts;\n if (dayOfMonthRaw !== '*' || monthRaw !== '*') return input.cron;\n\n const minute = Number(minuteRaw);\n const hour = Number(hourRaw);\n\n if (hourRaw === '*' && dowRaw === '*' && minuteRaw !== undefined && !Number.isNaN(minute)) {\n return `Hourly at :${pad2(minute)} ${abbr}`;\n }\n\n if (\n dowRaw === '*' &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n return `Daily ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n if (\n dowRaw === '1-5' &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n return `Weekdays ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n if (\n dowRaw != null &&\n /^\\d(?:,\\d)*$/.test(dowRaw) &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n const labels = dowRaw.split(',').map(d => WEEKDAY_OPTIONS.find(w => w.value === Number(d))?.label ?? d);\n if (labels.length === 1) {\n const day = labels[0] === 'Mon' ? 'Monday' : labels[0];\n return `Every ${day} ${formatClock({ hour, minute })} ${abbr}`;\n }\n return `${labels.join(', ')} ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n return input.cron;\n}\n\n/** Best-effort parse of known patterns into form values for edit. */\nexport function cronToFormValues(input: {\n name: string;\n task: string;\n cron: string;\n timezone: string;\n}): ScheduleFormValues {\n const base = defaultScheduleFormValues();\n const parts = input.cron.trim().split(/\\s+/);\n if (parts.length !== 5) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n };\n }\n\n const [minuteRaw, hourRaw, dom, month, dowRaw] = parts;\n const minute = Number(minuteRaw);\n const hour = Number(hourRaw);\n\n if (dom !== '*' || month !== '*') {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n };\n }\n\n if (hourRaw === '*' && dowRaw === '*' && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'hourly',\n minute,\n customCron: input.cron,\n };\n }\n\n if (dowRaw === '*' && !Number.isNaN(hour) && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'daily',\n hour,\n minute,\n customCron: input.cron,\n };\n }\n\n if (dowRaw != null && /^\\d(?:,\\d)*$/.test(dowRaw) && !Number.isNaN(hour) && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'weekly',\n hour,\n minute,\n weekdays: dowRaw.split(',').map(Number),\n customCron: input.cron,\n };\n }\n\n // Weekdays 1-5 → treat as custom so the cron string is preserved on save.\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n hour: Number.isNaN(hour) ? base.hour : hour,\n minute: Number.isNaN(minute) ? base.minute : minute,\n };\n}\n\nexport function formatRelativeTime(iso: string | null, nowMs = Date.now()): string {\n if (iso == null) return 'Never';\n const then = Date.parse(iso);\n if (Number.isNaN(then)) return 'Never';\n const deltaSec = Math.round((nowMs - then) / 1000);\n if (deltaSec < 60) return 'just now';\n const mins = Math.round(deltaSec / 60);\n if (mins < 60) return `${String(mins)} min ago`;\n const hours = Math.round(mins / 60);\n if (hours < 48) return `${String(hours)} hour${hours === 1 ? '' : 's'} ago`;\n const days = Math.round(hours / 24);\n return `${String(days)} day${days === 1 ? '' : 's'} ago`;\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, 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 { findLibraryAgent } 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 [selectedAgent, setSelectedAgent] = useState<AgentLibraryEntry | null>(null);\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 const agentIdRef = useRef(agentId);\n agentIdRef.current = agentId;\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) {\n setForm(defaultScheduleFormValues());\n setAgentId(initialAgentId);\n setSelectedAgent(null);\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 setSelectedAgent(null);\n setView({ kind: 'form' });\n return;\n }\n setForm(defaultScheduleFormValues());\n setAgentId(initialAgentId);\n setSelectedAgent(null);\n setView({ kind: 'form' });\n }, [open, mode, schedule, initialAgentId]);\n\n // Prefill create with a known agent id or exact name.\n useEffect(() => {\n if (!open || mode !== 'create' || initialAgentId.length === 0) return;\n let cancelled = false;\n const requestedId = initialAgentId;\n void findLibraryAgent({ server, agentKey: requestedId })\n .then(agent => {\n if (cancelled || agent == null) return;\n // Skip if the user already picked a different agent while this was in flight.\n if (agentIdRef.current !== requestedId) return;\n setSelectedAgent(agent);\n setAgentId(libraryAgentId(agent));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [open, mode, initialAgentId, server]);\n\n const agentLabel =\n selectedAgent?.name ?? savedFromCreate?.agentName ?? schedule?.agentName ?? (agentId.length > 0 ? 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 agentLabel={agentLabel}\n onAgentIdChange={\n isExternalEdit || isCreatedEdit\n ? undefined\n : nextId => {\n setAgentId(nextId);\n if (nextId.length === 0) setSelectedAgent(null);\n }\n }\n onAgentPicked={setSelectedAgent}\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 type { AgentLibraryEntry } from '../../server/types.js';\nimport { AgentSearchPicker } from '../AgentSearchPicker.js';\nimport { cn } from '../lib/cn.js';\nimport { auiInputClass } from '../lib/inputClasses.js';\nimport { PopoverSelect } from '../primitives/PopoverSelect.js';\nimport {\n WEEKDAY_OPTIONS,\n formatCadenceSummary,\n getTimezoneOptions,\n valuesToCron,\n type RecurrenceKind,\n type ScheduleFormValues,\n} from './cadence.js';\n\nexport const RECURRENCE_OPTIONS: Array<{ value: RecurrenceKind; label: string }> = [\n { value: 'hourly', label: 'Hourly' },\n { value: 'daily', label: 'Daily' },\n { value: 'weekly', label: 'Weekly' },\n];\n\nconst HOUR_OPTIONS = Array.from({ length: 24 }, (_, hour) => ({\n value: String(hour),\n label: hour.toString().padStart(2, '0'),\n}));\nconst MINUTE_OPTIONS = [0, 15, 30, 45].map(minute => ({\n value: String(minute),\n label: `:${minute.toString().padStart(2, '0')}`,\n}));\n\nexport type ScheduleFormFieldsProps = {\n values: ScheduleFormValues;\n onChange: (next: ScheduleFormValues) => void;\n agentId: string;\n agentLabel: string;\n onAgentIdChange?: (agentId: string) => void;\n onAgentPicked?: (agent: AgentLibraryEntry) => void;\n agentPickerDisabled?: boolean;\n onBuildAgent?: () => void;\n};\n\nexport function ScheduleFormFields({\n values,\n onChange,\n agentId,\n agentLabel,\n onAgentIdChange,\n onAgentPicked,\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 <AgentSearchPicker\n aria-label=\"Agent\"\n placeholder=\"Search agent\"\n value={agentId}\n selectedLabel={agentLabel}\n onValueChange={value => onAgentIdChange?.(value)}\n onAgentPicked={onAgentPicked}\n disabled={agentPickerDisabled || onAgentIdChange == null}\n onBuildAgent={onBuildAgent}\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","useRef","useState","useEffect","useRef","useState","jsx","jsxs","useEffect","useState","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useRef","useEffect","saved","jsx","Fragment","jsx","jsxs","useState","useRef","agentId","useEffect","useMemo"]}
|