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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +22 -7
  3. package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-N546FNNS.js} +38 -23
  4. package/dist/AgentCodeSnippets-N546FNNS.js.map +1 -0
  5. package/dist/AgentMetricChart-YWJYVYYA.js +15 -0
  6. package/dist/{AgentOverview-EEBHJC32.js → AgentOverview-VF74XC7I.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-RFR6LQMY.js} +19 -10
  8. package/dist/AgentSessionEventTimeline-RFR6LQMY.js.map +1 -0
  9. package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-27CQF6FX.js} +144 -57
  10. package/dist/AgentSessionEventTimelineChart-27CQF6FX.js.map +1 -0
  11. package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-4IVX2SGD.js} +36 -12
  12. package/dist/AgentSessions-4IVX2SGD.js.map +1 -0
  13. package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-R5VEP7BO.js} +162 -126
  14. package/dist/ConnectorSettings-R5VEP7BO.js.map +1 -0
  15. package/dist/{DockLayout-LM4AFMFY.js → DockLayout-F44RWGEY.js} +10 -10
  16. package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-SQ323AVM.js} +14 -12
  17. package/dist/DrawerLayout-SQ323AVM.js.map +1 -0
  18. package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-6QLS63HM.js} +22 -28
  19. package/dist/ModelSettings-6QLS63HM.js.map +1 -0
  20. package/dist/OpenUiFenceBlock-4ROX3G4X.js +9 -0
  21. package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-OLKDXIQS.js} +17 -21
  22. package/dist/SandboxSettings-OLKDXIQS.js.map +1 -0
  23. package/dist/SchedulesPage-TMOTK6DR.js +15 -0
  24. package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-GISAH2WU.js} +8 -8
  25. package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-EN33DUQ7.js} +171 -26
  26. package/dist/ShellRouteSync-EN33DUQ7.js.map +1 -0
  27. package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-35K4AKTC.js} +80 -58
  28. package/dist/SidebarLayout-35K4AKTC.js.map +1 -0
  29. package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-JSX2BTII.js} +24 -22
  30. package/dist/SkillSettings-JSX2BTII.js.map +1 -0
  31. package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-6VCR7ES3.js} +9 -9
  32. package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-RKBSN2FZ.js} +10 -10
  33. package/dist/{chunk-ZTMKFZQ3.js → chunk-2O5EJ6QS.js} +4440 -3042
  34. package/dist/chunk-2O5EJ6QS.js.map +1 -0
  35. package/dist/chunk-6WCIL3H2.js +517 -0
  36. package/dist/chunk-6WCIL3H2.js.map +1 -0
  37. package/dist/{chunk-WVE3F724.js → chunk-73FQVITT.js} +21 -4
  38. package/dist/chunk-73FQVITT.js.map +1 -0
  39. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  40. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  41. package/dist/{chunk-CYHJDKFB.js → chunk-F5QVQIBH.js} +172 -46
  42. package/dist/chunk-F5QVQIBH.js.map +1 -0
  43. package/dist/{chunk-FJW36PD7.js → chunk-GIPFF6FZ.js} +28 -24
  44. package/dist/chunk-GIPFF6FZ.js.map +1 -0
  45. package/dist/{chunk-6O6FWUDW.js → chunk-GSJAYYLR.js} +233 -195
  46. package/dist/chunk-GSJAYYLR.js.map +1 -0
  47. package/dist/{chunk-MPNSO7E6.js → chunk-J5BPHEDT.js} +2 -2
  48. package/dist/chunk-KR7WYHVF.js +195 -0
  49. package/dist/chunk-KR7WYHVF.js.map +1 -0
  50. package/dist/{chunk-DMMZSZTN.js → chunk-LUG7E6BL.js} +60 -16
  51. package/dist/chunk-LUG7E6BL.js.map +1 -0
  52. package/dist/chunk-LXJMINS6.js +587 -0
  53. package/dist/chunk-LXJMINS6.js.map +1 -0
  54. package/dist/{chunk-U7KURWW3.js → chunk-PT4EENB3.js} +244 -52
  55. package/dist/chunk-PT4EENB3.js.map +1 -0
  56. package/dist/{chunk-XAU7QFG3.js → chunk-Q6TCT7ZJ.js} +68 -256
  57. package/dist/chunk-Q6TCT7ZJ.js.map +1 -0
  58. package/dist/{chunk-ZKNUMH2M.js → chunk-XLFOXQKZ.js} +13 -11
  59. package/dist/chunk-XLFOXQKZ.js.map +1 -0
  60. package/dist/{chunk-M62XY4NC.js → chunk-XY6LZQES.js} +235 -108
  61. package/dist/chunk-XY6LZQES.js.map +1 -0
  62. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  63. package/dist/index.d.ts +316 -94
  64. package/dist/index.js +65 -488
  65. package/dist/index.js.map +1 -1
  66. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +36 -13
  67. package/dist/plugins/trueforge-agent-server-adapter/index.js +69 -34
  68. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  69. package/dist/styles.css +1 -1
  70. package/package.json +4 -4
  71. package/dist/AgentCodeSnippets-NZOFJE57.js.map +0 -1
  72. package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
  73. package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
  74. package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
  75. package/dist/AgentSessions-3MPDZASK.js.map +0 -1
  76. package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
  77. package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
  78. package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
  79. package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
  80. package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
  81. package/dist/SchedulesPage-KKLUDO6B.js +0 -15
  82. package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
  83. package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
  84. package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
  85. package/dist/chunk-2XPPBEYF.js +0 -74
  86. package/dist/chunk-2XPPBEYF.js.map +0 -1
  87. package/dist/chunk-6O6FWUDW.js.map +0 -1
  88. package/dist/chunk-7Z2C2K7F.js +0 -578
  89. package/dist/chunk-7Z2C2K7F.js.map +0 -1
  90. package/dist/chunk-CYHJDKFB.js.map +0 -1
  91. package/dist/chunk-DMMZSZTN.js.map +0 -1
  92. package/dist/chunk-FJW36PD7.js.map +0 -1
  93. package/dist/chunk-M62XY4NC.js.map +0 -1
  94. package/dist/chunk-QC42MLAK.js.map +0 -1
  95. package/dist/chunk-SFZNIO6U.js +0 -18
  96. package/dist/chunk-SFZNIO6U.js.map +0 -1
  97. package/dist/chunk-U7KURWW3.js.map +0 -1
  98. package/dist/chunk-WVE3F724.js.map +0 -1
  99. package/dist/chunk-XAU7QFG3.js.map +0 -1
  100. package/dist/chunk-ZKNUMH2M.js.map +0 -1
  101. package/dist/chunk-ZTMKFZQ3.js.map +0 -1
  102. /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-YWJYVYYA.js.map} +0 -0
  103. /package/dist/{AgentOverview-EEBHJC32.js.map → AgentOverview-VF74XC7I.js.map} +0 -0
  104. /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-F44RWGEY.js.map} +0 -0
  105. /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-4ROX3G4X.js.map} +0 -0
  106. /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-TMOTK6DR.js.map} +0 -0
  107. /package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-GISAH2WU.js.map} +0 -0
  108. /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-6VCR7ES3.js.map} +0 -0
  109. /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-RKBSN2FZ.js.map} +0 -0
  110. /package/dist/{chunk-MPNSO7E6.js.map → chunk-J5BPHEDT.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/atoms/schedules/SchedulesPage.tsx","../src/atoms/schedules/cadence.ts","../src/atoms/schedules/ScheduleFormDrawer.tsx","../src/atoms/schedules/ScheduleFormFields.tsx","../src/atoms/schedules/TestScheduleScreen.tsx","../src/atoms/schedules/scheduleRuns.ts","../src/atoms/schedules/ScheduleRunTooltip.tsx","../src/atoms/schedules/ScheduleRunChip.tsx","../src/atoms/schedules/ScheduleStatusBadge.tsx","../src/atoms/schedules/ScheduleLastRunsCell.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useScheduleServer, useServer } from '../../server/ServerContext.js';\nimport { libraryAgentId } from '../../server/ShellModeContext.js';\nimport type { Schedule, ScheduleRun, ScheduleStatus } from '../../server/types.js';\nimport { readScheduleShareSearch, replaceScheduleShareSearch } from '../../utils/scheduleShareUrl.js';\nimport { EmptyScreen } from '../EmptyScreen.js';\nimport { auiButtonClass } from '../lib/buttonClasses.js';\nimport { cn } from '../lib/cn.js';\nimport { searchAllAgents } from '../lib/useSearchAgentsList.js';\nimport { PageHeader } from '../PageHeader.js';\nimport { Button } from '../primitives/Button.js';\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../primitives/Dialog.js';\nimport { DropdownMenu, DropdownMenuItem } from '../primitives/DropdownMenu.js';\nimport { PopoverSelect } from '../primitives/PopoverSelect.js';\nimport SearchInput from '../primitives/SearchInput.js';\nimport { Skeleton } from '../primitives/Skeleton.js';\nimport {\n DEFAULT_TABLE_PAGE_SIZE,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableTokenPagination,\n} from '../primitives/Table.js';\nimport { formatCadenceSummary } from './cadence.js';\nimport { ScheduleFormDrawer } from './ScheduleFormDrawer.js';\nimport { ScheduleLastRunsCell } from './ScheduleLastRunsCell.js';\nimport { ScheduleStatusBadge } from './ScheduleStatusBadge.js';\n\ntype AgentOption = { agentId: string; name: string };\n\ntype DrawerState = { kind: 'closed' } | { kind: 'create'; agentId?: string } | { kind: 'edit'; schedule: Schedule };\n\nconst STATUS_FILTER_OPTIONS: Array<{ value: 'all' | ScheduleStatus; label: string }> = [\n { value: 'all', label: 'All statuses' },\n { value: 'active', label: 'Active' },\n { value: 'paused', label: 'Paused' },\n];\n\n/** API max page size for schedules list. */\nconst SCHEDULES_PAGE_SIZE_OPTIONS = [10, 25] as const;\n\nfunction clampPageSize(size: number): number {\n return Math.min(Math.max(size, 1), 25);\n}\n\nfunction filtersFromSearch(search: string): {\n nameQuery: string;\n statusFilter: 'all' | ScheduleStatus;\n agentFilter: string;\n} {\n const share = readScheduleShareSearch(search);\n return {\n nameQuery: share.q ?? '',\n statusFilter: share.status ?? 'all',\n agentFilter: share.agent ?? 'all',\n };\n}\n\nfunction ScheduleRowActions({\n schedule,\n running,\n onRunNow,\n onEdit,\n onTogglePause,\n onDelete,\n}: {\n schedule: Schedule;\n running: boolean;\n onRunNow: () => void;\n onEdit: () => void;\n onTogglePause: () => void;\n onDelete: () => void;\n}) {\n return (\n <div className=\"inline-flex items-center justify-end gap-1.5\">\n <button\n type=\"button\"\n disabled={running}\n aria-label={`Run now ${schedule.name}`}\n className={auiButtonClass({ variant: 'outline', size: 'sm' })}\n onClick={onRunNow}\n >\n <Icon name={running ? 'loader' : 'play'} className={cn('size-3.5', running && 'animate-spin')} />\n Run now\n </button>\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\" className=\"size-4\" />\n </button>\n }\n >\n <DropdownMenuItem onClick={onEdit}>\n <Icon name=\"pencil\" className=\"size-3.5\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onTogglePause}>\n <Icon name={schedule.status === 'active' ? 'pause' : 'play'} className=\"size-3.5\" />\n {schedule.status === 'active' ? 'Pause' : 'Resume'}\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-failure-bg focus:text-failure-bg\" onClick={onDelete}>\n <Icon name=\"trash\" className=\"size-3.5\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenu>\n </div>\n );\n}\n\nexport function SchedulesPage() {\n const scheduleServer = useScheduleServer();\n const server = useServer();\n const toaster = useToasterOptional();\n\n const [schedules, setSchedules] = useState<Schedule[]>([]);\n const [runsByScheduleId, setRunsByScheduleId] = useState<Record<string, ScheduleRun[]>>({});\n const [runsLoading, setRunsLoading] = useState(false);\n const [runningScheduleIds, setRunningScheduleIds] = useState<ReadonlySet<string>>(() => new Set());\n const [agentOptions, setAgentOptions] = useState<AgentOption[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [nameQuery, setNameQuery] = useState(() => filtersFromSearch(window.location.search).nameQuery);\n const [statusFilter, setStatusFilter] = useState<'all' | ScheduleStatus>(\n () => filtersFromSearch(window.location.search).statusFilter,\n );\n const [agentFilter, setAgentFilter] = useState(() => filtersFromSearch(window.location.search).agentFilter);\n const [drawer, setDrawer] = useState<DrawerState>({ kind: 'closed' });\n const [pendingDelete, setPendingDelete] = useState<Schedule | null>(null);\n const [pageSize, setPageSize] = useState(() => clampPageSize(DEFAULT_TABLE_PAGE_SIZE));\n const [pageToken, setPageToken] = useState<string | undefined>(undefined);\n const [nextPageToken, setNextPageToken] = useState<string | undefined>(undefined);\n const [prevTokenStack, setPrevTokenStack] = useState<string[]>([]);\n const loadGenRef = useRef(0);\n const didConsumeIsNewRef = useRef(false);\n\n const loadRunsForSchedules = useCallback(\n async ({ rows, gen }: { rows: Schedule[]; gen: number }) => {\n if (rows.length === 0) {\n if (gen === loadGenRef.current) setRunsByScheduleId({});\n return;\n }\n setRunsLoading(true);\n try {\n const results = await Promise.allSettled(\n rows.map(schedule => scheduleServer.listScheduleRuns({ scheduleId: schedule.id })),\n );\n if (gen !== loadGenRef.current) return;\n setRunsByScheduleId(\n Object.fromEntries(\n rows.map((schedule, index) => {\n const result = results[index];\n const runs = result?.status === 'fulfilled' ? result.value : [];\n return [schedule.id, runs] as const;\n }),\n ),\n );\n } finally {\n if (gen === loadGenRef.current) setRunsLoading(false);\n }\n },\n [scheduleServer],\n );\n\n const loadSchedules = useCallback(\n async ({ token, size, agentId }: { token: string | undefined; size: number; agentId: string }) => {\n const gen = ++loadGenRef.current;\n setLoading(true);\n setError(null);\n try {\n const page = await scheduleServer.listSchedules({\n limit: clampPageSize(size),\n ...(token === undefined || token === '' ? {} : { pageToken: token }),\n ...(agentId === 'all' ? {} : { agentIds: [agentId] }),\n });\n if (gen !== loadGenRef.current) return;\n setSchedules(page.data);\n setNextPageToken(page.nextPageToken);\n void loadRunsForSchedules({ rows: page.data, gen });\n } catch (caught) {\n if (gen !== loadGenRef.current) return;\n const message = caught instanceof Error ? caught.message : 'Failed to load schedules';\n setError(message);\n setSchedules([]);\n setRunsByScheduleId({});\n setNextPageToken(undefined);\n } finally {\n if (gen === loadGenRef.current) setLoading(false);\n }\n },\n [scheduleServer, loadRunsForSchedules],\n );\n\n const resetToFirstPage = useCallback(\n (next?: { size?: number; agentId?: string }) => {\n const size = next?.size ?? pageSize;\n const agentId = next?.agentId ?? agentFilter;\n setPageToken(undefined);\n setPrevTokenStack([]);\n void loadSchedules({ token: undefined, size, agentId });\n },\n [agentFilter, loadSchedules, pageSize],\n );\n\n // Keep filters in the URL so deep links and Agents → Schedules work.\n useEffect(() => {\n replaceScheduleShareSearch({\n agent: agentFilter === 'all' ? null : agentFilter,\n status: statusFilter === 'all' ? null : statusFilter,\n q: nameQuery.trim().length === 0 ? null : nameQuery,\n });\n }, [agentFilter, statusFilter, nameQuery]);\n\n // One-shot: Agents \"+ Schedule\" lands with isNew=true; open create then strip the flag.\n useEffect(() => {\n if (didConsumeIsNewRef.current) return;\n const share = readScheduleShareSearch(window.location.search);\n if (!share.isNew) return;\n didConsumeIsNewRef.current = true;\n setDrawer({\n kind: 'create',\n ...(share.agent != null ? { agentId: share.agent } : {}),\n });\n replaceScheduleShareSearch({ isNew: null });\n }, []);\n\n useEffect(() => {\n const syncFromUrl = () => {\n const next = filtersFromSearch(window.location.search);\n setNameQuery(next.nameQuery);\n setStatusFilter(next.statusFilter);\n setAgentFilter(current => {\n if (current === next.agentFilter) return current;\n setPageToken(undefined);\n setPrevTokenStack([]);\n return next.agentFilter;\n });\n };\n window.addEventListener('popstate', syncFromUrl);\n return () => {\n window.removeEventListener('popstate', syncFromUrl);\n };\n }, []);\n\n useEffect(() => {\n void loadSchedules({ token: pageToken, size: pageSize, agentId: agentFilter });\n }, [agentFilter, pageSize, pageToken, loadSchedules]);\n\n useEffect(() => {\n let cancelled = false;\n void searchAllAgents(server)\n .then(rows => {\n if (cancelled) return;\n setAgentOptions(rows.map(agent => ({ agentId: libraryAgentId(agent), name: agent.name })));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [server]);\n\n const agentNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const agent of agentOptions) {\n map.set(agent.agentId, agent.name);\n }\n return map;\n }, [agentOptions]);\n\n // Name + status are client-side on the current server page only.\n const filtered = useMemo(() => {\n const q = nameQuery.trim().toLowerCase();\n return schedules.filter(schedule => {\n if (statusFilter !== 'all' && schedule.status !== statusFilter) return false;\n if (q.length > 0 && !schedule.name.toLowerCase().includes(q)) return false;\n return true;\n });\n }, [schedules, nameQuery, statusFilter]);\n\n const hasPageNav = prevTokenStack.length > 0 || nextPageToken != null;\n\n const handleTogglePause = async (schedule: Schedule) => {\n const nextStatus: ScheduleStatus = schedule.status === 'active' ? 'paused' : 'active';\n try {\n await scheduleServer.updateSchedule({ ...schedule, status: nextStatus });\n await loadSchedules({ token: pageToken, size: pageSize, agentId: agentFilter });\n } catch (caught) {\n toaster?.showError(caught);\n }\n };\n\n const handleRunNow = async (schedule: Schedule) => {\n setRunningScheduleIds(prev => new Set(prev).add(schedule.id));\n try {\n await scheduleServer.createScheduleRun({ scheduleId: schedule.id });\n toaster?.showSuccess({ title: 'Run started' });\n const runs = await scheduleServer.listScheduleRuns({ scheduleId: schedule.id });\n setRunsByScheduleId(prev => ({ ...prev, [schedule.id]: runs }));\n } catch (caught) {\n toaster?.showError(caught);\n } finally {\n setRunningScheduleIds(prev => {\n const next = new Set(prev);\n next.delete(schedule.id);\n return next;\n });\n }\n };\n\n const handleDelete = async (schedule: Schedule) => {\n setPendingDelete(null);\n try {\n await scheduleServer.deleteSchedule({ id: schedule.id });\n resetToFirstPage();\n } catch (caught) {\n toaster?.showError(caught);\n }\n };\n\n const goNext = () => {\n if (nextPageToken == null) return;\n setPrevTokenStack(stack => [...stack, pageToken ?? '']);\n setPageToken(nextPageToken);\n };\n\n const goPrev = () => {\n if (prevTokenStack.length === 0) return;\n const stack = [...prevTokenStack];\n const prev = stack.pop();\n setPrevTokenStack(stack);\n setPageToken(prev === '' ? undefined : prev);\n };\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-primary-bg\">\n <PageHeader\n title=\"Scheduled Agents\"\n end={\n <>\n <div className=\"w-full sm:w-56\">\n <SearchInput query={nameQuery} setQuery={setNameQuery} placeholder=\"Search schedules by name\" />\n </div>\n <PopoverSelect\n value={statusFilter}\n onValueChange={setStatusFilter}\n options={STATUS_FILTER_OPTIONS}\n className=\"sm:w-40\"\n aria-label=\"Filter by status\"\n />\n <PopoverSelect\n value={agentFilter}\n onValueChange={value => {\n setAgentFilter(value);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n options={[\n { value: 'all', label: 'All agents' },\n ...agentOptions.map(agent => ({ value: agent.agentId, label: agent.name })),\n ]}\n className=\"sm:w-40\"\n aria-label=\"Filter by agent\"\n />\n <Button\n type=\"button\"\n onClick={() =>\n setDrawer({\n kind: 'create',\n agentId: agentFilter !== 'all' ? agentFilter : undefined,\n })\n }\n >\n <Icon name=\"plus\" className=\"size-3.5\" />\n Create Schedule\n </Button>\n </>\n }\n />\n\n <div className=\"min-h-0 flex-1 overflow-auto px-4 py-4 md:px-6\">\n {loading ? (\n <div className=\"flex flex-col gap-2\" role=\"status\" aria-label=\"Loading schedules\">\n {Array.from({ length: 5 }, (_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n ) : error != null ? (\n <p className=\"text-failure-bg px-3 py-8 text-center text-sm\">{error}</p>\n ) : schedules.length === 0 ? (\n <EmptyScreen title=\"No Schedules Found\" description=\"Create one to get started.\" className=\"min-h-full\" />\n ) : filtered.length === 0 ? (\n <div className=\"flex min-h-full flex-col\">\n <EmptyScreen title=\"No Schedules Found\" description=\"No schedules match your filters.\" className=\"flex-1\" />\n {hasPageNav ? (\n <TableTokenPagination\n pageSize={pageSize}\n rowCount={0}\n canPrev={prevTokenStack.length > 0}\n canNext={nextPageToken != null}\n onPrev={goPrev}\n onNext={goNext}\n pageSizeOptions={SCHEDULES_PAGE_SIZE_OPTIONS}\n onPageSizeChange={size => {\n const next = clampPageSize(size);\n setPageSize(next);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n />\n ) : null}\n </div>\n ) : (\n <div className=\"rounded-lg border border-border\">\n <Table className=\"min-w-[48rem]\">\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead>Name</TableHead>\n <TableHead>Agent</TableHead>\n <TableHead>Cadence</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Last 5 runs</TableHead>\n <TableHead>\n <span className=\"sr-only\">Actions</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filtered.map(schedule => {\n const cadence = formatCadenceSummary({ cron: schedule.cron, timezone: schedule.timezone });\n const agentLabel = schedule.agentName ?? agentNameById.get(schedule.agentId) ?? schedule.agentId;\n return (\n <TableRow key={schedule.id}>\n <TableCell className=\"text-text-primary font-medium\">\n <button\n type=\"button\"\n className=\"text-primary-button-bg hover:underline text-left\"\n onClick={() => setDrawer({ kind: 'edit', schedule })}\n >\n {schedule.name}\n </button>\n </TableCell>\n <TableCell>{agentLabel}</TableCell>\n <TableCell>{cadence}</TableCell>\n <TableCell>\n <ScheduleStatusBadge status={schedule.status} />\n </TableCell>\n <TableCell>\n {runsLoading ? (\n <span className=\"text-text-secondary text-sm\">…</span>\n ) : (\n <ScheduleLastRunsCell runs={runsByScheduleId[schedule.id] ?? []} />\n )}\n </TableCell>\n <TableCell className=\"text-right\">\n <ScheduleRowActions\n schedule={schedule}\n running={runningScheduleIds.has(schedule.id)}\n onRunNow={() => void handleRunNow(schedule)}\n onEdit={() => setDrawer({ kind: 'edit', schedule })}\n onTogglePause={() => void handleTogglePause(schedule)}\n onDelete={() => setPendingDelete(schedule)}\n />\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n {(filtered.length > 0 || hasPageNav) && (\n <TableTokenPagination\n pageSize={pageSize}\n rowCount={filtered.length}\n canPrev={prevTokenStack.length > 0}\n canNext={nextPageToken != null}\n onPrev={goPrev}\n onNext={goNext}\n pageSizeOptions={SCHEDULES_PAGE_SIZE_OPTIONS}\n onPageSizeChange={size => {\n const next = clampPageSize(size);\n setPageSize(next);\n setPageToken(undefined);\n setPrevTokenStack([]);\n }}\n />\n )}\n </div>\n )}\n </div>\n\n {drawer.kind === 'create' ? (\n <ScheduleFormDrawer\n open\n mode=\"create\"\n initialAgentId={drawer.agentId ?? ''}\n onOpenChange={open => {\n if (!open) setDrawer({ kind: 'closed' });\n }}\n onSaved={() => resetToFirstPage()}\n />\n ) : null}\n {drawer.kind === 'edit' ? (\n <ScheduleFormDrawer\n open\n mode=\"edit\"\n schedule={drawer.schedule}\n onOpenChange={open => {\n if (!open) setDrawer({ kind: 'closed' });\n }}\n onSaved={() => void loadSchedules({ token: pageToken, size: pageSize, agentId: agentFilter })}\n />\n ) : null}\n {pendingDelete != null ? (\n <Dialog\n open\n onOpenChange={open => {\n if (!open) setPendingDelete(null);\n }}\n aria-label=\"Delete schedule\"\n className=\"max-w-md\"\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete schedule</DialogTitle>\n <p className=\"text-text-secondary text-sm\">\n “{pendingDelete.name}” will stop running. This cannot be undone.\n </p>\n </DialogHeader>\n </DialogContent>\n <DialogFooter>\n <Button type=\"button\" variant=\"secondary\" onClick={() => setPendingDelete(null)}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={() => void handleDelete(pendingDelete)}>\n Delete\n </Button>\n </DialogFooter>\n </Dialog>\n ) : null}\n </div>\n );\n}\n","export type RecurrenceKind = 'hourly' | 'daily' | 'weekly' | 'custom';\n\nexport type ScheduleFormValues = {\n name: string;\n task: string;\n recurrence: RecurrenceKind;\n hour: number;\n minute: number;\n /** Cron DOW: 0=Sun … 6=Sat. Used when recurrence is weekly. */\n weekdays: number[];\n customCron: string;\n timezone: string;\n};\n\nexport const TIMEZONE_OPTIONS = [\n { value: 'America/New_York', label: 'America/New_York (ET)' },\n { value: 'America/Chicago', label: 'America/Chicago (CT)' },\n { value: 'America/Denver', label: 'America/Denver (MT)' },\n { value: 'America/Los_Angeles', label: 'America/Los_Angeles (PT)' },\n { value: 'UTC', label: 'UTC' },\n { value: 'Europe/London', label: 'Europe/London (GMT/BST)' },\n { value: 'Europe/Berlin', label: 'Europe/Berlin (CET)' },\n { value: 'Asia/Kolkata', label: 'Asia/Kolkata (IST)' },\n { value: 'Asia/Tokyo', label: 'Asia/Tokyo (JST)' },\n] as const;\n\nexport function resolveLocalTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nexport function getTimezoneOptions(selectedTimezone?: string): Array<{ value: string; label: string }> {\n const localTimezone = resolveLocalTimezone();\n const knownTimezones = new Set<string>(TIMEZONE_OPTIONS.map(option => option.value));\n // Keep both browser-local and persisted zones selectable even when they are\n // outside the curated common-timezone list.\n const additionalTimezones = [localTimezone, selectedTimezone].flatMap(timezone => {\n if (timezone == null || timezone.length === 0 || knownTimezones.has(timezone)) return [];\n knownTimezones.add(timezone);\n return [{ value: timezone, label: timezone === localTimezone ? `${timezone} (Local)` : timezone }];\n });\n return [...additionalTimezones, ...TIMEZONE_OPTIONS];\n}\n\nexport const WEEKDAY_OPTIONS = [\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' },\n { value: 0, label: 'Sun' },\n] as const;\n\nconst TZ_ABBR: Record<string, string> = {\n 'America/New_York': 'ET',\n 'America/Chicago': 'CT',\n 'America/Denver': 'MT',\n 'America/Los_Angeles': 'PT',\n UTC: 'UTC',\n 'Europe/London': 'GMT',\n 'Europe/Berlin': 'CET',\n 'Asia/Kolkata': 'IST',\n 'Asia/Tokyo': 'JST',\n};\n\nexport function defaultScheduleFormValues(): ScheduleFormValues {\n return {\n name: '',\n task: '',\n recurrence: 'daily',\n hour: 9,\n minute: 0,\n weekdays: [1],\n customCron: '0 9 * * *',\n timezone: resolveLocalTimezone(),\n };\n}\n\nexport function timezoneAbbrev(timezone: string): string {\n return TZ_ABBR[timezone] ?? timezone.split('/').pop() ?? timezone;\n}\n\nfunction pad2(n: number): string {\n return n.toString().padStart(2, '0');\n}\n\nfunction formatClock({ hour, minute }: { hour: number; minute: number }): string {\n const period = hour >= 12 ? 'PM' : 'AM';\n const h12 = hour % 12 === 0 ? 12 : hour % 12;\n return `${String(h12)}:${pad2(minute)} ${period}`;\n}\n\nexport function valuesToCron(values: ScheduleFormValues): string {\n const minute = values.minute;\n const hour = values.hour;\n switch (values.recurrence) {\n case 'hourly':\n return `${String(minute)} * * * *`;\n case 'daily':\n return `${String(minute)} ${String(hour)} * * *`;\n case 'weekly': {\n const days = [...values.weekdays].sort((a, b) => a - b);\n const dow = days.length > 0 ? days.join(',') : '*';\n return `${String(minute)} ${String(hour)} * * ${dow}`;\n }\n case 'custom':\n return values.customCron.trim();\n }\n}\n\nexport function formatCadenceSummary(input: { cron: string; timezone: string }): string {\n const abbr = timezoneAbbrev(input.timezone);\n const parts = input.cron.trim().split(/\\s+/);\n if (parts.length !== 5) return input.cron;\n\n const [minuteRaw, hourRaw, dayOfMonthRaw, monthRaw, dowRaw] = parts;\n if (dayOfMonthRaw !== '*' || monthRaw !== '*') return input.cron;\n\n const minute = Number(minuteRaw);\n const hour = Number(hourRaw);\n\n if (hourRaw === '*' && dowRaw === '*' && minuteRaw !== undefined && !Number.isNaN(minute)) {\n return `Hourly at :${pad2(minute)} ${abbr}`;\n }\n\n if (\n dowRaw === '*' &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n return `Daily ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n if (\n dowRaw === '1-5' &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n return `Weekdays ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n if (\n dowRaw != null &&\n /^\\d(?:,\\d)*$/.test(dowRaw) &&\n hourRaw !== undefined &&\n minuteRaw !== undefined &&\n !Number.isNaN(hour) &&\n !Number.isNaN(minute)\n ) {\n const labels = dowRaw.split(',').map(d => WEEKDAY_OPTIONS.find(w => w.value === Number(d))?.label ?? d);\n if (labels.length === 1) {\n const day = labels[0] === 'Mon' ? 'Monday' : labels[0];\n return `Every ${day} ${formatClock({ hour, minute })} ${abbr}`;\n }\n return `${labels.join(', ')} ${formatClock({ hour, minute })} ${abbr}`;\n }\n\n return input.cron;\n}\n\n/** Best-effort parse of known patterns into form values for edit. */\nexport function cronToFormValues(input: {\n name: string;\n task: string;\n cron: string;\n timezone: string;\n}): ScheduleFormValues {\n const base = defaultScheduleFormValues();\n const parts = input.cron.trim().split(/\\s+/);\n if (parts.length !== 5) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n };\n }\n\n const [minuteRaw, hourRaw, dom, month, dowRaw] = parts;\n const minute = Number(minuteRaw);\n const hour = Number(hourRaw);\n\n if (dom !== '*' || month !== '*') {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n };\n }\n\n if (hourRaw === '*' && dowRaw === '*' && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'hourly',\n minute,\n customCron: input.cron,\n };\n }\n\n if (dowRaw === '*' && !Number.isNaN(hour) && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'daily',\n hour,\n minute,\n customCron: input.cron,\n };\n }\n\n if (dowRaw != null && /^\\d(?:,\\d)*$/.test(dowRaw) && !Number.isNaN(hour) && !Number.isNaN(minute)) {\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'weekly',\n hour,\n minute,\n weekdays: dowRaw.split(',').map(Number),\n customCron: input.cron,\n };\n }\n\n // Weekdays 1-5 → treat as custom so the cron string is preserved on save.\n return {\n ...base,\n name: input.name,\n task: input.task,\n timezone: input.timezone,\n recurrence: 'custom',\n customCron: input.cron,\n hour: Number.isNaN(hour) ? base.hour : hour,\n minute: Number.isNaN(minute) ? base.minute : minute,\n };\n}\n\nexport function formatRelativeTime(iso: string | null, nowMs = Date.now()): string {\n if (iso == null) return 'Never';\n const then = Date.parse(iso);\n if (Number.isNaN(then)) return 'Never';\n const deltaSec = Math.round((nowMs - then) / 1000);\n if (deltaSec < 60) return 'just now';\n const mins = Math.round(deltaSec / 60);\n if (mins < 60) return `${String(mins)} min ago`;\n const hours = Math.round(mins / 60);\n if (hours < 48) return `${String(hours)} hour${hours === 1 ? '' : 's'} ago`;\n const days = Math.round(hours / 24);\n return `${String(days)} day${days === 1 ? '' : 's'} ago`;\n}\n","'use client';\n\nimport { useEffect, useMemo, useState, type FormEvent, type ReactNode } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useScheduleServer, useServer } from '../../server/ServerContext.js';\nimport { libraryAgentId } from '../../server/ShellModeContext.js';\nimport type { AgentLibraryEntry, Schedule } from '../../server/types.js';\nimport { DraftCatalogProvider } from '../draft/DraftCatalogProvider.js';\nimport { mountName } from '../lib/mountName.js';\nimport { searchAllAgents } from '../lib/useSearchAgentsList.js';\nimport { Button } from '../primitives/Button.js';\nimport { SideDrawer } from '../primitives/SideDrawer.js';\nimport {\n cronToFormValues,\n defaultScheduleFormValues,\n formatCadenceSummary,\n valuesToCron,\n type ScheduleFormValues,\n} from './cadence.js';\nimport { ScheduleFormFields } from './ScheduleFormFields.js';\nimport { TestScheduleScreen } from './TestScheduleScreen.js';\n\nexport type ScheduleFormDrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mode: 'create' | 'edit';\n schedule?: Schedule;\n initialAgentId?: string;\n onSaved?: () => void;\n};\n\ntype DrawerView = { kind: 'form'; saved?: Schedule } | { kind: 'test'; schedule: Schedule };\n\nfunction ScheduleFormDrawerBody({\n open,\n onOpenChange,\n mode,\n schedule,\n initialAgentId = '',\n onSaved,\n}: ScheduleFormDrawerProps) {\n const scheduleServer = useScheduleServer();\n const server = useServer();\n const toaster = useToasterOptional();\n const [form, setForm] = useState<ScheduleFormValues>(defaultScheduleFormValues);\n const [agentId, setAgentId] = useState(initialAgentId);\n const [agents, setAgents] = useState<AgentLibraryEntry[]>([]);\n const [view, setView] = useState<DrawerView>({ kind: 'form' });\n const [saving, setSaving] = useState(false);\n const [activating, setActivating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const savedFromCreate = view.kind === 'form' ? view.saved : view.schedule;\n const isExternalEdit = mode === 'edit' && view.kind === 'form' && view.saved == null && schedule != null;\n const isCreatedEdit = view.kind === 'form' && view.saved != null;\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n void searchAllAgents(server)\n .then(rows => {\n if (cancelled) return;\n setAgents(rows);\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [open, server]);\n\n useEffect(() => {\n if (!open) {\n setForm(defaultScheduleFormValues());\n setAgentId(initialAgentId);\n setError(null);\n setView({ kind: 'form' });\n setActivating(false);\n return;\n }\n if (mode === 'edit' && schedule != null) {\n setForm(\n cronToFormValues({\n name: schedule.name,\n task: schedule.task,\n cron: schedule.cron,\n timezone: schedule.timezone,\n }),\n );\n setAgentId(schedule.agentId);\n setView({ kind: 'form' });\n return;\n }\n setForm(defaultScheduleFormValues());\n setAgentId(initialAgentId);\n setView({ kind: 'form' });\n }, [open, mode, schedule, initialAgentId]);\n\n const agentOptions = useMemo(\n () => agents.map(agent => ({ agentId: libraryAgentId(agent), name: agent.name })),\n [agents],\n );\n\n const selectedAgent = useMemo(\n () => agents.find(agent => libraryAgentId(agent) === agentId) ?? null,\n [agents, agentId],\n );\n\n const agentLabel =\n selectedAgent?.name ??\n savedFromCreate?.agentName ??\n schedule?.agentName ??\n agentOptions.find(option => option.agentId === agentId)?.name ??\n agentId;\n\n const mcpMounts = useMemo(() => {\n const mounts = selectedAgent?.agentSpec?.mcpServers ?? [];\n return mounts\n .map(mountName)\n .filter((name: string | null): name is string => name != null)\n .map(name => ({ name }));\n }, [selectedAgent]);\n\n const canSubmit = useMemo(() => {\n const cron = valuesToCron(form);\n return form.name.trim().length > 0 && form.task.trim().length > 0 && cron.length > 0 && agentId.length > 0;\n }, [form, agentId]);\n\n const enterTestView = (saved: Schedule) => {\n setView({ kind: 'test', schedule: saved });\n setForm(\n cronToFormValues({\n name: saved.name,\n task: saved.task,\n cron: saved.cron,\n timezone: saved.timezone,\n }),\n );\n setAgentId(saved.agentId);\n };\n\n const handleSave = async (event: FormEvent) => {\n event.preventDefault();\n if (!canSubmit) return;\n const cron = valuesToCron(form);\n setSaving(true);\n setError(null);\n try {\n if (isExternalEdit && schedule != null) {\n await scheduleServer.updateSchedule({\n id: schedule.id,\n name: form.name.trim(),\n task: form.task.trim(),\n cron,\n timezone: form.timezone,\n status: schedule.status,\n });\n onSaved?.();\n onOpenChange(false);\n return;\n }\n\n if (isCreatedEdit && view.kind === 'form' && view.saved != null) {\n const saved = await scheduleServer.updateSchedule({\n id: view.saved.id,\n name: form.name.trim(),\n task: form.task.trim(),\n cron,\n timezone: form.timezone,\n status: 'paused',\n });\n onSaved?.();\n enterTestView(saved);\n toaster?.showSuccess({\n title: 'Schedule saved as paused',\n description: formatCadenceSummary({ cron: saved.cron, timezone: saved.timezone }),\n });\n return;\n }\n\n const saved = await scheduleServer.createSchedule({\n agentId,\n name: form.name.trim(),\n task: form.task.trim(),\n cron,\n timezone: form.timezone,\n status: 'paused',\n });\n onSaved?.();\n enterTestView(saved);\n toaster?.showSuccess({\n title: 'Schedule saved as paused',\n description: formatCadenceSummary({ cron: saved.cron, timezone: saved.timezone }),\n });\n } catch (caught) {\n const message = caught instanceof Error ? caught.message : 'Failed to save schedule';\n setError(message);\n } finally {\n setSaving(false);\n }\n };\n\n const handleActivate = async () => {\n if (view.kind !== 'test') return;\n setActivating(true);\n setError(null);\n try {\n await scheduleServer.updateSchedule({\n id: view.schedule.id,\n name: view.schedule.name,\n task: view.schedule.task,\n cron: view.schedule.cron,\n timezone: view.schedule.timezone,\n status: 'active',\n });\n onSaved?.();\n toaster?.showSuccess({ title: 'Schedule activated' });\n onOpenChange(false);\n } catch (caught) {\n const message = caught instanceof Error ? caught.message : 'Failed to activate schedule';\n setError(message);\n toaster?.showError(caught);\n } finally {\n setActivating(false);\n }\n };\n\n const title =\n view.kind === 'test' ? 'Test Schedule' : isExternalEdit || isCreatedEdit ? 'Edit Schedule' : 'New Schedule';\n const description =\n view.kind === 'test'\n ? `Recurring unattended runs of ${agentLabel}.`\n : isExternalEdit || isCreatedEdit\n ? 'Update cadence and task for this schedule.'\n : 'Create a recurring unattended run for an agent.';\n\n let footer: ReactNode;\n if (view.kind === 'test') {\n footer = (\n <div className=\"flex flex-col gap-2\">\n {error != null ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"w-full\"\n disabled={activating}\n onClick={() => void handleActivate()}\n >\n Activate Anyway\n </Button>\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 type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)} disabled={saving}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"schedule-form\" disabled={!canSubmit || saving}>\n Save\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <SideDrawer\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={description}\n anchor=\"right\"\n size=\"lg\"\n headerIcon={\n <span className=\"text-primary-button-bg inline-flex size-8 items-center justify-center\">\n <Icon\n name={view.kind === 'test' || isExternalEdit || isCreatedEdit ? 'calendar' : 'calendar-plus'}\n className=\"size-5\"\n />\n </span>\n }\n footer={footer}\n >\n {view.kind === 'test' ? (\n <TestScheduleScreen\n schedule={view.schedule}\n agentName={agentLabel}\n mcpMounts={mcpMounts}\n onEditConfiguration={() => {\n setError(null);\n setView({ kind: 'form', saved: view.schedule });\n }}\n />\n ) : (\n <form id=\"schedule-form\" onSubmit={event => void handleSave(event)}>\n <ScheduleFormFields\n values={form}\n onChange={setForm}\n agentId={agentId}\n onAgentIdChange={isExternalEdit || isCreatedEdit ? undefined : setAgentId}\n agentOptions={agentOptions}\n agentPickerDisabled={isExternalEdit || isCreatedEdit}\n />\n </form>\n )}\n </SideDrawer>\n );\n}\n\nexport function ScheduleFormDrawer(props: ScheduleFormDrawerProps) {\n return (\n <DraftCatalogProvider>\n <ScheduleFormDrawerBody {...props} />\n </DraftCatalogProvider>\n );\n}\n","'use client';\n\nimport { cn } from '../lib/cn.js';\nimport { auiInputClass } from '../lib/inputClasses.js';\nimport { PopoverSelect } from '../primitives/PopoverSelect.js';\nimport {\n WEEKDAY_OPTIONS,\n formatCadenceSummary,\n getTimezoneOptions,\n valuesToCron,\n type RecurrenceKind,\n type ScheduleFormValues,\n} from './cadence.js';\n\nexport const RECURRENCE_OPTIONS: Array<{ value: RecurrenceKind; label: string }> = [\n { value: 'hourly', label: 'Hourly' },\n { value: 'daily', label: 'Daily' },\n { value: 'weekly', label: 'Weekly' },\n];\n\nconst HOUR_OPTIONS = Array.from({ length: 24 }, (_, hour) => ({\n value: String(hour),\n label: hour.toString().padStart(2, '0'),\n}));\nconst MINUTE_OPTIONS = [0, 15, 30, 45].map(minute => ({\n value: String(minute),\n label: `:${minute.toString().padStart(2, '0')}`,\n}));\n\nexport type ScheduleFormFieldsProps = {\n values: ScheduleFormValues;\n onChange: (next: ScheduleFormValues) => void;\n agentId: string;\n onAgentIdChange?: (agentId: string) => void;\n agentOptions: Array<{ agentId: string; name: string }>;\n agentPickerDisabled?: boolean;\n};\n\nexport function ScheduleFormFields({\n values,\n onChange,\n agentId,\n onAgentIdChange,\n agentOptions,\n agentPickerDisabled = false,\n}: ScheduleFormFieldsProps) {\n const cron = valuesToCron(values);\n const cadence = formatCadenceSummary({ cron, timezone: values.timezone });\n const timezoneOptions = getTimezoneOptions(values.timezone);\n\n const set = <K extends keyof ScheduleFormValues>(key: K, value: ScheduleFormValues[K]) => {\n onChange({ ...values, [key]: value });\n };\n\n const toggleWeekday = (day: number) => {\n const has = values.weekdays.includes(day);\n const weekdays = has ? values.weekdays.filter(d => d !== day) : [...values.weekdays, day];\n onChange({ ...values, weekdays: weekdays.length > 0 ? weekdays : [day] });\n };\n\n return (\n <div className=\"flex flex-col gap-4 px-5 py-4\">\n <div className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Agent</span>\n <PopoverSelect\n aria-label=\"Agent\"\n placeholder=\"Select an agent\"\n value={agentId}\n options={agentOptions.map(agent => ({ value: agent.agentId, label: agent.name }))}\n onValueChange={value => onAgentIdChange?.(value)}\n disabled={agentPickerDisabled || onAgentIdChange == null}\n />\n </div>\n\n <label className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Name</span>\n <input\n value={values.name}\n onChange={e => set('name', e.target.value)}\n placeholder=\"harness-daily-digest\"\n className={auiInputClass('h-9')}\n required\n />\n </label>\n\n <label className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Task</span>\n <textarea\n value={values.task}\n onChange={e => set('task', e.target.value)}\n rows={3}\n placeholder=\"Summarise yesterday's harness runs and post the digest…\"\n className={auiInputClass('resize-y py-2')}\n required\n />\n </label>\n\n <fieldset>\n <legend className=\"mb-1.5 text-sm font-medium\">Recurrence</legend>\n <div className=\"grid grid-cols-3 gap-1 rounded-lg border border-border p-1\">\n {RECURRENCE_OPTIONS.map(opt => {\n const selected = values.recurrence === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={cn(\n 'rounded-md px-2 py-1.5 text-xs font-medium transition-colors',\n selected\n ? 'border border-primary-button-bg/40 bg-primary-button-bg/10 text-primary-button-bg'\n : 'text-text-secondary hover:bg-ghost-button-hover border border-transparent',\n )}\n aria-pressed={selected}\n onClick={() => set('recurrence', opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </fieldset>\n\n {values.recurrence === 'hourly' ? (\n <div className=\"block max-w-[8rem]\">\n <span className=\"mb-1.5 block text-sm font-medium\">Minute</span>\n <PopoverSelect\n aria-label=\"Minute\"\n value={String(values.minute)}\n options={MINUTE_OPTIONS}\n onValueChange={value => set('minute', Number(value))}\n />\n </div>\n ) : null}\n\n {values.recurrence === 'daily' || values.recurrence === 'weekly' ? (\n <div className=\"flex flex-wrap gap-3\">\n <div className=\"block min-w-[7rem] flex-1\">\n <span className=\"mb-1.5 block text-sm font-medium\">Hour</span>\n <PopoverSelect\n aria-label=\"Hour\"\n value={String(values.hour)}\n options={HOUR_OPTIONS}\n onValueChange={value => set('hour', Number(value))}\n />\n </div>\n <div className=\"block min-w-[7rem] flex-1\">\n <span className=\"mb-1.5 block text-sm font-medium\">Minute</span>\n <PopoverSelect\n aria-label=\"Minute\"\n value={String(values.minute)}\n options={MINUTE_OPTIONS}\n onValueChange={value => set('minute', Number(value))}\n />\n </div>\n </div>\n ) : null}\n\n {values.recurrence === 'weekly' ? (\n <fieldset>\n <legend className=\"mb-1.5 text-sm font-medium\">Days</legend>\n <div className=\"flex flex-wrap gap-1.5\">\n {WEEKDAY_OPTIONS.map(day => {\n const selected = values.weekdays.includes(day.value);\n return (\n <button\n key={day.value}\n type=\"button\"\n className={cn(\n 'rounded-md border px-2.5 py-1 text-xs font-medium',\n selected\n ? 'border-primary-button-bg/40 bg-primary-button-bg/10 text-primary-button-bg'\n : 'border-border text-text-secondary hover:bg-ghost-button-hover',\n )}\n aria-pressed={selected}\n onClick={() => toggleWeekday(day.value)}\n >\n {day.label}\n </button>\n );\n })}\n </div>\n </fieldset>\n ) : null}\n\n {values.recurrence === 'custom' ? (\n <div className=\"rounded-md border border-border bg-secondary-bg/40 px-3 py-2\">\n <span className=\"text-text-secondary block text-xs\">Existing custom schedule</span>\n <code className=\"text-text-primary mt-1 block font-mono text-sm\">{values.customCron}</code>\n <span className=\"text-text-secondary mt-1 block text-xs\">\n Select Hourly, Daily, or Weekly to replace this schedule.\n </span>\n </div>\n ) : null}\n\n <div className=\"block\">\n <span className=\"mb-1.5 block text-sm font-medium\">Timezone</span>\n <PopoverSelect\n aria-label=\"Timezone\"\n value={values.timezone}\n options={timezoneOptions}\n onValueChange={value => set('timezone', value)}\n menuPlacement=\"top\"\n />\n </div>\n\n <div className=\"rounded-lg border border-border bg-secondary-bg/40 px-3 py-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <span className=\"text-text-secondary text-[10px] font-semibold tracking-wide uppercase\">Frequency</span>\n <code className=\"text-text-secondary font-mono text-xs\">{cron || '—'}</code>\n </div>\n <p className=\"text-text-primary mt-1 text-sm font-semibold\">{cadence || '—'}</p>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState, type ReactNode } from 'react';\n\nimport { useToasterOptional } from '../../containers/ToasterContainer.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useOptionalCatalogServer, useScheduleServer } from '../../server/ServerContext.js';\nimport type { ConnectorState, Schedule, ScheduleRun } from '../../server/types.js';\nimport { useDraftCatalog } from '../draft/DraftCatalogProvider.js';\nimport { ConnectorConnectButton } from '../draft/DraftCompositeSelector.js';\nimport { auiButtonClass } from '../lib/buttonClasses.js';\nimport { cn } from '../lib/cn.js';\nimport { Button } from '../primitives/Button.js';\nimport { formatCadenceSummary, formatRelativeTime } from './cadence.js';\nimport { ScheduleRunChip } from './ScheduleRunChip.js';\nimport { runTypeLabel } from './scheduleRuns.js';\nimport { ScheduleStatusBadge } from './ScheduleStatusBadge.js';\n\nexport type ScheduleMcpMount = {\n name: string;\n};\n\nexport type TestScheduleScreenProps = {\n schedule: Schedule;\n agentName: string;\n mcpMounts: readonly ScheduleMcpMount[];\n onEditConfiguration: () => void;\n};\n\nfunction mountConnector(connectors: ConnectorState[], name: string): ConnectorState | null {\n return connectors.find(connector => connector.name === name || connector.id === name) ?? null;\n}\n\nfunction ScheduleMcpConnect({\n connector,\n onConnected,\n}: {\n connector: ConnectorState;\n onConnected: () => Promise<void>;\n}) {\n const catalog = useOptionalCatalogServer();\n if (catalog == null) return null;\n return <ConnectorConnectButton connector={connector} onConnected={onConnected} />;\n}\n\nfunction DetailRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-3 border-b border-border px-3 py-2.5 last:border-b-0\">\n <span className=\"text-text-secondary shrink-0 text-[10px] font-semibold tracking-wide uppercase\">{label}</span>\n <div className=\"min-w-0 text-right text-sm text-text-primary\">{children}</div>\n </div>\n );\n}\n\nexport function TestScheduleScreen({ schedule, agentName, mcpMounts, onEditConfiguration }: TestScheduleScreenProps) {\n const scheduleServer = useScheduleServer();\n const toaster = useToasterOptional();\n const { connectors, ensureLoaded, refreshConnectors, loading, error } = useDraftCatalog();\n const [running, setRunning] = useState(false);\n const [lastTestRun, setLastTestRun] = useState<ScheduleRun | null>(null);\n const cadence = formatCadenceSummary({ cron: schedule.cron, timezone: schedule.timezone });\n\n const handleRunTest = async () => {\n setRunning(true);\n try {\n const run = await scheduleServer.createScheduleRun({ scheduleId: schedule.id });\n setLastTestRun(run);\n toaster?.showSuccess({ title: 'Test run started' });\n } catch (caught) {\n toaster?.showError(caught);\n } finally {\n setRunning(false);\n }\n };\n\n useEffect(() => {\n ensureLoaded();\n }, [ensureLoaded]);\n\n useEffect(() => {\n if (error != null) toaster?.showError(error);\n }, [error, toaster]);\n\n return (\n <div className=\"flex flex-col gap-4 px-5 py-4\">\n <section className=\"overflow-hidden rounded-lg border border-border bg-card-bg\">\n <DetailRow label=\"Agent\">{agentName}</DetailRow>\n <DetailRow label=\"Name\">{schedule.name}</DetailRow>\n <DetailRow label=\"Task\">\n <span className=\"whitespace-pre-wrap break-words\">{schedule.task}</span>\n </DetailRow>\n <DetailRow label=\"Cadence\">\n <div className=\"flex flex-wrap items-center justify-end gap-1.5\">\n <span>{cadence}</span>\n <code className=\"text-text-secondary font-mono text-xs\">{schedule.cron}</code>\n </div>\n </DetailRow>\n <DetailRow label=\"Status\">\n <ScheduleStatusBadge status={schedule.status} />\n </DetailRow>\n <div className=\"flex justify-end px-3 py-2.5\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onEditConfiguration}>\n <Icon name=\"pencil\" className=\"size-3.5\" />\n Edit Configuration\n </Button>\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\n type=\"button\"\n disabled={running}\n onClick={() => void handleRunTest()}\n className={auiButtonClass({ variant: 'default', size: 'sm' })}\n >\n <Icon name={running ? 'loader' : 'play'} className={cn('size-3.5', running && 'animate-spin')} />\n Run Test\n </button>\n </div>\n {lastTestRun == null ? (\n <p className=\"text-text-secondary px-3 py-3 text-sm\">\n Run a one-off test using the schedule task. This does not change the cron pending run.\n </p>\n ) : (\n <div className=\"flex items-center gap-3 px-3 py-3\">\n <ScheduleRunChip run={lastTestRun} />\n <div className=\"min-w-0 text-sm\">\n <p className=\"text-text-primary font-medium\">{runTypeLabel(lastTestRun.name)}</p>\n <p className=\"text-text-secondary\">\n {formatRelativeTime(lastTestRun.triggeredAt ?? lastTestRun.scheduledFor)}\n </p>\n </div>\n </div>\n )}\n </section>\n </div>\n );\n}\n","import type { ScheduleRun, ScheduleRunStatus } from '../../server/types.js';\n\nexport function isManualRun(name: string): boolean {\n return name.startsWith('manual-');\n}\n\nexport function runChipKind(status: ScheduleRunStatus): 'success' | 'failed' {\n if (status === 'failed') return 'failed';\n return 'success';\n}\n\nexport function runStatusLabel(status: ScheduleRunStatus): string {\n if (status === 'failed') return 'Failed';\n if (status === 'triggered') return 'Triggered';\n return 'Scheduled';\n}\n\nexport function runTypeLabel(name: string): string {\n return isManualRun(name) ? 'Manual test' : 'Cron';\n}\n\n/** Newest-first API rows → up to `limit` historical runs, oldest on the left. */\nexport function lastHistoricalRuns(runs: readonly ScheduleRun[], limit = 5): ScheduleRun[] {\n const historical = runs.filter(run => run.status !== 'scheduled');\n return historical.slice(0, limit).reverse();\n}\n\nexport function formatScheduleRunInstant(iso: string | null): string {\n if (iso == null) return '—';\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return '—';\n return new Intl.DateTimeFormat(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n}\n","'use client';\n\nimport type { ScheduleRun } from '../../server/types.js';\nimport { formatScheduleRunInstant, runStatusLabel, runTypeLabel } from './scheduleRuns.js';\n\nexport function ScheduleRunTooltip({ run }: { run: ScheduleRun }) {\n return (\n <div className=\"flex flex-col gap-1 text-left text-xs\">\n <p className=\"text-text-primary font-medium\">{runStatusLabel(run.status)}</p>\n <p className=\"text-text-secondary\">{runTypeLabel(run.name)}</p>\n <p className=\"text-text-secondary\">Scheduled for: {formatScheduleRunInstant(run.scheduledFor)}</p>\n {run.triggeredAt != null ? (\n <p className=\"text-text-secondary\">Triggered at: {formatScheduleRunInstant(run.triggeredAt)}</p>\n ) : null}\n <p className=\"text-text-secondary\">Triggered by: {run.triggeredBy}</p>\n </div>\n );\n}\n","'use client';\n\nimport { Icon } from '../../icons/Icon.js';\nimport type { ScheduleRun } from '../../server/types.js';\nimport { cn } from '../lib/cn.js';\nimport { Tooltip } from '../primitives/Tooltip.js';\nimport { formatScheduleRunInstant, runChipKind, runStatusLabel } from './scheduleRuns.js';\nimport { ScheduleRunTooltip } from './ScheduleRunTooltip.js';\n\nconst CHIP_STYLES = {\n success:\n 'border-emerald-600/30 bg-emerald-500/10 text-emerald-700 dark:border-emerald-400/35 dark:bg-emerald-500/15 dark:text-emerald-300',\n failed: 'border-red-600/30 bg-red-500/10 text-red-700 dark:border-red-400/35 dark:bg-red-500/15 dark:text-red-300',\n} as const;\n\nexport function ScheduleRunChip({ run }: { run: ScheduleRun }) {\n const kind = runChipKind(run.status);\n const when = formatScheduleRunInstant(run.triggeredAt ?? run.scheduledFor);\n return (\n <Tooltip content={<ScheduleRunTooltip run={run} />} side=\"top\">\n <span\n className={cn('inline-flex size-6 shrink-0 items-center justify-center rounded-md border', CHIP_STYLES[kind])}\n aria-label={`${runStatusLabel(run.status)} run at ${when}`}\n >\n <Icon name={kind === 'failed' ? 'triangle-exclamation' : 'check'} className=\"size-3.5\" />\n </span>\n </Tooltip>\n );\n}\n","'use client';\n\nimport type { ScheduleStatus } from '../../server/types.js';\nimport { cn } from '../lib/cn.js';\n\nexport function ScheduleStatusBadge({ status }: { status: ScheduleStatus }) {\n const active = status === 'active';\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium',\n active\n ? 'border-emerald-600/30 bg-emerald-500/10 text-emerald-700 dark:border-emerald-400/35 dark:bg-emerald-500/15 dark:text-emerald-300'\n : 'border-border bg-secondary-bg text-text-secondary',\n )}\n >\n <span\n className={cn(\n 'size-1.5 shrink-0 rounded-full',\n active ? 'bg-emerald-600 dark:bg-emerald-400' : 'bg-text-secondary',\n )}\n aria-hidden\n />\n {active ? 'Active' : 'Paused'}\n </span>\n );\n}\n","'use client';\n\nimport type { ScheduleRun } from '../../server/types.js';\nimport { ScheduleRunChip } from './ScheduleRunChip.js';\nimport { lastHistoricalRuns } from './scheduleRuns.js';\n\nexport function ScheduleLastRunsCell({ runs }: { runs: readonly ScheduleRun[] }) {\n const history = lastHistoricalRuns(runs);\n if (history.length === 0) {\n return <span className=\"text-text-secondary text-sm\">—</span>;\n }\n return (\n <div className=\"flex items-center gap-1\">\n {history.map(run => (\n <ScheduleRunChip key={run.id} run={run} />\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useMemo","useState","useEffect","useState","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","saved","jsx","jsx","jsxs","useState","useEffect","useMemo"]}