@stigmer/react 3.5.3 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/agent/AgentPicker.d.ts +10 -1
  2. package/agent/AgentPicker.d.ts.map +1 -1
  3. package/agent/AgentPicker.js +2 -2
  4. package/agent/AgentPicker.js.map +1 -1
  5. package/billing/CreditLedgerTable.d.ts.map +1 -1
  6. package/billing/CreditLedgerTable.js +2 -7
  7. package/billing/CreditLedgerTable.js.map +1 -1
  8. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  9. package/channel/AgentChannelsPanel.js +22 -5
  10. package/channel/AgentChannelsPanel.js.map +1 -1
  11. package/channel/ChannelTemplatesDialog.d.ts +53 -0
  12. package/channel/ChannelTemplatesDialog.d.ts.map +1 -0
  13. package/channel/ChannelTemplatesDialog.js +150 -0
  14. package/channel/ChannelTemplatesDialog.js.map +1 -0
  15. package/channel/index.d.ts +8 -0
  16. package/channel/index.d.ts.map +1 -1
  17. package/channel/index.js +4 -0
  18. package/channel/index.js.map +1 -1
  19. package/channel/providers.d.ts +12 -0
  20. package/channel/providers.d.ts.map +1 -1
  21. package/channel/providers.js +14 -2
  22. package/channel/providers.js.map +1 -1
  23. package/channel/templatePresentation.d.ts +37 -0
  24. package/channel/templatePresentation.d.ts.map +1 -0
  25. package/channel/templatePresentation.js +69 -0
  26. package/channel/templatePresentation.js.map +1 -0
  27. package/channel/useChannelTemplateList.d.ts +64 -0
  28. package/channel/useChannelTemplateList.d.ts.map +1 -0
  29. package/channel/useChannelTemplateList.js +69 -0
  30. package/channel/useChannelTemplateList.js.map +1 -0
  31. package/channel/useChannelTemplateReadiness.d.ts +53 -0
  32. package/channel/useChannelTemplateReadiness.d.ts.map +1 -0
  33. package/channel/useChannelTemplateReadiness.js +42 -0
  34. package/channel/useChannelTemplateReadiness.js.map +1 -0
  35. package/composer/ComposerToolbar.d.ts +6 -1
  36. package/composer/ComposerToolbar.d.ts.map +1 -1
  37. package/composer/ComposerToolbar.js +2 -2
  38. package/composer/ComposerToolbar.js.map +1 -1
  39. package/composer/SessionComposer.d.ts +9 -0
  40. package/composer/SessionComposer.d.ts.map +1 -1
  41. package/composer/SessionComposer.js +13 -2
  42. package/composer/SessionComposer.js.map +1 -1
  43. package/dashboard/useDashboardFailedRuns.d.ts.map +1 -1
  44. package/dashboard/useDashboardFailedRuns.js +2 -0
  45. package/dashboard/useDashboardFailedRuns.js.map +1 -1
  46. package/execution/useCreateAgentExecution.d.ts +14 -0
  47. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  48. package/execution/useCreateAgentExecution.js +5 -0
  49. package/execution/useCreateAgentExecution.js.map +1 -1
  50. package/index.d.ts +4 -2
  51. package/index.d.ts.map +1 -1
  52. package/index.js +10 -1
  53. package/index.js.map +1 -1
  54. package/internal/Pagination.d.ts +15 -0
  55. package/internal/Pagination.d.ts.map +1 -0
  56. package/internal/Pagination.js +20 -0
  57. package/internal/Pagination.js.map +1 -0
  58. package/library/useExportResource.d.ts +4 -3
  59. package/library/useExportResource.d.ts.map +1 -1
  60. package/library/useExportResource.js +1 -1
  61. package/library/useExportResource.js.map +1 -1
  62. package/models/ModelSelector.d.ts +26 -1
  63. package/models/ModelSelector.d.ts.map +1 -1
  64. package/models/ModelSelector.js +27 -6
  65. package/models/ModelSelector.js.map +1 -1
  66. package/models/index.d.ts +2 -0
  67. package/models/index.d.ts.map +1 -1
  68. package/models/index.js +1 -0
  69. package/models/index.js.map +1 -1
  70. package/models/registry.d.ts +10 -0
  71. package/models/registry.d.ts.map +1 -1
  72. package/models/registry.js +3 -0
  73. package/models/registry.js.map +1 -1
  74. package/models/service-tier.d.ts +27 -0
  75. package/models/service-tier.d.ts.map +1 -0
  76. package/models/service-tier.js +34 -0
  77. package/models/service-tier.js.map +1 -0
  78. package/organization/OrgProvider.d.ts +11 -4
  79. package/organization/OrgProvider.d.ts.map +1 -1
  80. package/organization/OrgProvider.js +28 -4
  81. package/organization/OrgProvider.js.map +1 -1
  82. package/package.json +4 -4
  83. package/resource-detail/useDeleteResource.d.ts +1 -1
  84. package/resource-detail/useDeleteResource.d.ts.map +1 -1
  85. package/resource-detail/useDeleteResource.js +5 -0
  86. package/resource-detail/useDeleteResource.js.map +1 -1
  87. package/resource-workbench/components/ResourceWorkbench.d.ts +10 -1
  88. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
  89. package/resource-workbench/components/ResourceWorkbench.js +6 -2
  90. package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
  91. package/resource-workbench/hooks/useResourceCollection.d.ts +8 -0
  92. package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -1
  93. package/resource-workbench/hooks/useResourceCollection.js +2 -2
  94. package/resource-workbench/hooks/useResourceCollection.js.map +1 -1
  95. package/schedule/CadenceField.d.ts +31 -0
  96. package/schedule/CadenceField.d.ts.map +1 -0
  97. package/schedule/CadenceField.js +116 -0
  98. package/schedule/CadenceField.js.map +1 -0
  99. package/schedule/ScheduleDetailView.d.ts +81 -0
  100. package/schedule/ScheduleDetailView.d.ts.map +1 -0
  101. package/schedule/ScheduleDetailView.js +648 -0
  102. package/schedule/ScheduleDetailView.js.map +1 -0
  103. package/schedule/ScheduleForm.d.ts +46 -0
  104. package/schedule/ScheduleForm.d.ts.map +1 -0
  105. package/schedule/ScheduleForm.js +214 -0
  106. package/schedule/ScheduleForm.js.map +1 -0
  107. package/schedule/ScheduleRowActions.d.ts +20 -0
  108. package/schedule/ScheduleRowActions.d.ts.map +1 -0
  109. package/schedule/ScheduleRowActions.js +54 -0
  110. package/schedule/ScheduleRowActions.js.map +1 -0
  111. package/schedule/ScheduleRunsTable.d.ts +72 -0
  112. package/schedule/ScheduleRunsTable.d.ts.map +1 -0
  113. package/schedule/ScheduleRunsTable.js +161 -0
  114. package/schedule/ScheduleRunsTable.js.map +1 -0
  115. package/schedule/TimeZoneField.d.ts +32 -0
  116. package/schedule/TimeZoneField.d.ts.map +1 -0
  117. package/schedule/TimeZoneField.js +104 -0
  118. package/schedule/TimeZoneField.js.map +1 -0
  119. package/schedule/cadence.d.ts +95 -0
  120. package/schedule/cadence.d.ts.map +1 -0
  121. package/schedule/cadence.js +242 -0
  122. package/schedule/cadence.js.map +1 -0
  123. package/schedule/index.d.ts +37 -0
  124. package/schedule/index.d.ts.map +1 -0
  125. package/schedule/index.js +19 -0
  126. package/schedule/index.js.map +1 -0
  127. package/schedule/scheduleColumns.d.ts +26 -0
  128. package/schedule/scheduleColumns.d.ts.map +1 -0
  129. package/schedule/scheduleColumns.js +77 -0
  130. package/schedule/scheduleColumns.js.map +1 -0
  131. package/schedule/scheduleListFn.d.ts +50 -0
  132. package/schedule/scheduleListFn.d.ts.map +1 -0
  133. package/schedule/scheduleListFn.js +65 -0
  134. package/schedule/scheduleListFn.js.map +1 -0
  135. package/schedule/scheduleState.d.ts +43 -0
  136. package/schedule/scheduleState.d.ts.map +1 -0
  137. package/schedule/scheduleState.js +67 -0
  138. package/schedule/scheduleState.js.map +1 -0
  139. package/schedule/useCreateSchedule.d.ts +57 -0
  140. package/schedule/useCreateSchedule.d.ts.map +1 -0
  141. package/schedule/useCreateSchedule.js +61 -0
  142. package/schedule/useCreateSchedule.js.map +1 -0
  143. package/schedule/useResumeSchedule.d.ts +30 -0
  144. package/schedule/useResumeSchedule.d.ts.map +1 -0
  145. package/schedule/useResumeSchedule.js +45 -0
  146. package/schedule/useResumeSchedule.js.map +1 -0
  147. package/schedule/useSchedule.d.ts +39 -0
  148. package/schedule/useSchedule.d.ts.map +1 -0
  149. package/schedule/useSchedule.js +44 -0
  150. package/schedule/useSchedule.js.map +1 -0
  151. package/schedule/useScheduleCount.d.ts +38 -0
  152. package/schedule/useScheduleCount.d.ts.map +1 -0
  153. package/schedule/useScheduleCount.js +30 -0
  154. package/schedule/useScheduleCount.js.map +1 -0
  155. package/schedule/useScheduleList.d.ts +48 -0
  156. package/schedule/useScheduleList.d.ts.map +1 -0
  157. package/schedule/useScheduleList.js +43 -0
  158. package/schedule/useScheduleList.js.map +1 -0
  159. package/schedule/useScheduleRuns.d.ts +44 -0
  160. package/schedule/useScheduleRuns.d.ts.map +1 -0
  161. package/schedule/useScheduleRuns.js +48 -0
  162. package/schedule/useScheduleRuns.js.map +1 -0
  163. package/schedule/useSetScheduleEnabled.d.ts +31 -0
  164. package/schedule/useSetScheduleEnabled.d.ts.map +1 -0
  165. package/schedule/useSetScheduleEnabled.js +53 -0
  166. package/schedule/useSetScheduleEnabled.js.map +1 -0
  167. package/schedule/useTriggerSchedule.d.ts +41 -0
  168. package/schedule/useTriggerSchedule.d.ts.map +1 -0
  169. package/schedule/useTriggerSchedule.js +62 -0
  170. package/schedule/useTriggerSchedule.js.map +1 -0
  171. package/schedule/useUpdateScheduleSpec.d.ts +49 -0
  172. package/schedule/useUpdateScheduleSpec.d.ts.map +1 -0
  173. package/schedule/useUpdateScheduleSpec.js +70 -0
  174. package/schedule/useUpdateScheduleSpec.js.map +1 -0
  175. package/search/useResourceCount.d.ts +2 -1
  176. package/search/useResourceCount.d.ts.map +1 -1
  177. package/search/useResourceCount.js +6 -1
  178. package/search/useResourceCount.js.map +1 -1
  179. package/session/useNewSessionFlow.d.ts.map +1 -1
  180. package/session/useNewSessionFlow.js +1 -0
  181. package/session/useNewSessionFlow.js.map +1 -1
  182. package/session/useSessionConversation.d.ts +11 -0
  183. package/session/useSessionConversation.d.ts.map +1 -1
  184. package/session/useSessionConversation.js +1 -0
  185. package/session/useSessionConversation.js.map +1 -1
  186. package/session/useSessionPageFlow.d.ts.map +1 -1
  187. package/session/useSessionPageFlow.js +1 -0
  188. package/session/useSessionPageFlow.js.map +1 -1
  189. package/src/agent/AgentPicker.tsx +13 -1
  190. package/src/billing/CreditLedgerTable.tsx +3 -42
  191. package/src/channel/AgentChannelsPanel.tsx +43 -1
  192. package/src/channel/ChannelTemplatesDialog.tsx +433 -0
  193. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +73 -0
  194. package/src/channel/__tests__/ChannelTemplatesDialog.test.tsx +292 -0
  195. package/src/channel/__tests__/providers.test.ts +9 -0
  196. package/src/channel/__tests__/templatePresentation.test.ts +96 -0
  197. package/src/channel/__tests__/useChannelTemplateList.test.tsx +216 -0
  198. package/src/channel/__tests__/useChannelTemplateReadiness.test.tsx +124 -0
  199. package/src/channel/index.ts +15 -0
  200. package/src/channel/providers.ts +26 -2
  201. package/src/channel/templatePresentation.ts +82 -0
  202. package/src/channel/useChannelTemplateList.ts +123 -0
  203. package/src/channel/useChannelTemplateReadiness.ts +69 -0
  204. package/src/composer/ComposerToolbar.tsx +9 -0
  205. package/src/composer/SessionComposer.tsx +24 -1
  206. package/src/composer/__tests__/SessionComposer-serviceTier.test.tsx +156 -0
  207. package/src/dashboard/__tests__/useDashboardFailedRuns.test.tsx +106 -0
  208. package/src/dashboard/useDashboardFailedRuns.ts +2 -0
  209. package/src/execution/useCreateAgentExecution.ts +18 -0
  210. package/src/index.ts +70 -0
  211. package/src/internal/Pagination.tsx +72 -0
  212. package/src/library/useExportResource.ts +4 -3
  213. package/src/models/ModelSelector.tsx +100 -3
  214. package/src/models/__tests__/ModelSelector-serviceTier.test.tsx +172 -0
  215. package/src/models/__tests__/useModelRegistry.test.tsx +15 -0
  216. package/src/models/index.ts +2 -0
  217. package/src/models/registry.ts +16 -0
  218. package/src/models/service-tier.ts +49 -0
  219. package/src/organization/OrgProvider.tsx +29 -4
  220. package/src/organization/__tests__/OrgProvider.orgSwitch.test.tsx +89 -0
  221. package/src/resource-detail/useDeleteResource.ts +11 -1
  222. package/src/resource-workbench/__tests__/ResourceWorkbench.test.tsx +112 -0
  223. package/src/resource-workbench/components/ResourceWorkbench.tsx +32 -15
  224. package/src/resource-workbench/hooks/useResourceCollection.ts +11 -1
  225. package/src/schedule/CadenceField.tsx +365 -0
  226. package/src/schedule/ScheduleDetailView.tsx +1651 -0
  227. package/src/schedule/ScheduleForm.tsx +615 -0
  228. package/src/schedule/ScheduleRowActions.tsx +124 -0
  229. package/src/schedule/ScheduleRunsTable.tsx +424 -0
  230. package/src/schedule/TimeZoneField.tsx +199 -0
  231. package/src/schedule/__tests__/ScheduleDetailView.test.tsx +683 -0
  232. package/src/schedule/__tests__/cadence.test.ts +278 -0
  233. package/src/schedule/__tests__/scheduleColumnsRowActions.test.tsx +176 -0
  234. package/src/schedule/__tests__/scheduleCreation.test.tsx +537 -0
  235. package/src/schedule/__tests__/scheduleHooks.test.tsx +399 -0
  236. package/src/schedule/__tests__/scheduleListFn.test.ts +128 -0
  237. package/src/schedule/__tests__/scheduleState.test.ts +133 -0
  238. package/src/schedule/cadence.ts +298 -0
  239. package/src/schedule/index.ts +69 -0
  240. package/src/schedule/scheduleColumns.tsx +118 -0
  241. package/src/schedule/scheduleListFn.ts +108 -0
  242. package/src/schedule/scheduleState.ts +96 -0
  243. package/src/schedule/useCreateSchedule.ts +88 -0
  244. package/src/schedule/useResumeSchedule.ts +67 -0
  245. package/src/schedule/useSchedule.ts +67 -0
  246. package/src/schedule/useScheduleCount.ts +57 -0
  247. package/src/schedule/useScheduleList.ts +83 -0
  248. package/src/schedule/useScheduleRuns.ts +93 -0
  249. package/src/schedule/useSetScheduleEnabled.ts +84 -0
  250. package/src/schedule/useTriggerSchedule.ts +90 -0
  251. package/src/schedule/useUpdateScheduleSpec.ts +108 -0
  252. package/src/search/__tests__/useResourceCount.test.tsx +89 -0
  253. package/src/search/useResourceCount.ts +8 -2
  254. package/src/session/useNewSessionFlow.ts +1 -0
  255. package/src/session/useSessionConversation.ts +12 -0
  256. package/src/session/useSessionPageFlow.ts +1 -0
  257. package/src/workflow/WorkflowDashboard.tsx +1 -0
  258. package/src/workflow/__tests__/inspector-forms.test.tsx +119 -2
  259. package/src/workflow/inspector/forms/AgentCallForm.tsx +260 -37
  260. package/src/workflow/inspector/tabs/RuntimeTab.tsx +72 -33
  261. package/src/workflow/starter-workflow-yaml.ts +2 -1
  262. package/src/workflow/useWorkflowExecutionList.ts +13 -2
  263. package/styles.css +1 -1
  264. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  265. package/workflow/WorkflowDashboard.d.ts.map +1 -1
  266. package/workflow/WorkflowDashboard.js +1 -0
  267. package/workflow/WorkflowDashboard.js.map +1 -1
  268. package/workflow/inspector/forms/AgentCallForm.d.ts +18 -2
  269. package/workflow/inspector/forms/AgentCallForm.d.ts.map +1 -1
  270. package/workflow/inspector/forms/AgentCallForm.js +87 -9
  271. package/workflow/inspector/forms/AgentCallForm.js.map +1 -1
  272. package/workflow/inspector/tabs/RuntimeTab.d.ts +2 -1
  273. package/workflow/inspector/tabs/RuntimeTab.d.ts.map +1 -1
  274. package/workflow/inspector/tabs/RuntimeTab.js +31 -5
  275. package/workflow/inspector/tabs/RuntimeTab.js.map +1 -1
  276. package/workflow/starter-workflow-yaml.d.ts +1 -1
  277. package/workflow/starter-workflow-yaml.d.ts.map +1 -1
  278. package/workflow/starter-workflow-yaml.js +2 -1
  279. package/workflow/starter-workflow-yaml.js.map +1 -1
  280. package/workflow/useWorkflowExecutionList.d.ts +10 -0
  281. package/workflow/useWorkflowExecutionList.d.ts.map +1 -1
  282. package/workflow/useWorkflowExecutionList.js +3 -2
  283. package/workflow/useWorkflowExecutionList.js.map +1 -1
@@ -0,0 +1,161 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
6
+ import { ScheduleRunOrigin, ScheduleRunOutcome, } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/io_pb";
7
+ import { formatRelativeTime } from "../activity/format-relative-time.js";
8
+ import { ErrorMessage } from "../error/ErrorMessage.js";
9
+ import { Pagination } from "../internal/Pagination.js";
10
+ import { useScheduleRuns } from "./useScheduleRuns.js";
11
+ /**
12
+ * Paginated run-history table for a schedule — the fire ledger,
13
+ * rendered in full (project DD-017 D-7).
14
+ *
15
+ * Every fire leaves a row, INCLUDING fires that created no execution (a
16
+ * refused launch gate, a missing target agent), carrying the refusing
17
+ * gate's copy verbatim. Columns: outcome, origin, fired time (relative,
18
+ * with the absolute instant on hover), duration (recorded → completed;
19
+ * "—" while a run is in flight or when no run was created), and the
20
+ * execution reference.
21
+ *
22
+ * Owns its data: give it a `scheduleId` and it fetches via
23
+ * {@link useScheduleRuns} with internal page state. To force a refresh
24
+ * from outside (e.g. after triggering a manual run), remount with a
25
+ * React `key` — the standard reset idiom (DD-014); the remount also
26
+ * returns to page 1, where the new run appears.
27
+ *
28
+ * Handles loading, error, and empty states automatically.
29
+ * Zero Console dependencies — safe for platform builder embedding.
30
+ * All visual properties flow through `--stgm-*` design tokens.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * <ScheduleRunsTable
35
+ * scheduleId={schedule.metadata.id}
36
+ * onNavigateToExecution={(id) => router.push(`/executions/${id}`)}
37
+ * />
38
+ * ```
39
+ */
40
+ export function ScheduleRunsTable({ scheduleId, onNavigateToExecution, now, pageSize = 25, className, }) {
41
+ const [pageNum, setPageNum] = useState(1);
42
+ const { runs, totalCount, isLoading, error, refetch } = useScheduleRuns(scheduleId, { page: pageNum, pageSize });
43
+ if (error) {
44
+ return _jsx(ErrorMessage, { error: error, retry: refetch, className: className });
45
+ }
46
+ if (isLoading && runs.length === 0) {
47
+ return (_jsx("div", { className: cn("space-y-2", className), "aria-busy": "true", children: Array.from({ length: 5 }, (_, i) => (_jsx("div", { className: "h-9 animate-pulse rounded-lg bg-muted-subtle" }, i))) }));
48
+ }
49
+ if (runs.length === 0) {
50
+ return (_jsx("div", { className: className, children: _jsx(EmptyRuns, {}) }));
51
+ }
52
+ const renderNow = now ?? new Date();
53
+ const totalPages = Math.ceil(totalCount / pageSize);
54
+ return (_jsxs("div", { className: className, children: [_jsxs("div", { role: "table", "aria-label": "Run history", className: "overflow-hidden rounded-lg border border-border", children: [_jsxs("div", { role: "row", className: cn(rowGridClasses, "border-b border-border px-3.5 py-2 text-[0.65rem] font-medium uppercase tracking-wider text-muted-foreground"), children: [_jsx("span", { role: "columnheader", children: "Outcome" }), _jsx("span", { role: "columnheader", className: "hidden sm:block", children: "Origin" }), _jsx("span", { role: "columnheader", children: "Fired" }), _jsx("span", { role: "columnheader", className: "hidden sm:block", children: "Duration" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Execution" })] }), runs.map((run, i) => (_jsx(RunTableRow, { run: run, now: renderNow, onNavigateToExecution: onNavigateToExecution }, runKey(run, i))))] }), totalPages > 1 && (_jsx(Pagination, { pageNum: pageNum, totalPages: totalPages, onPageChange: setPageNum, ariaLabel: "Run history pagination", className: "mt-3" }))] }));
55
+ }
56
+ // Mobile keeps the three load-bearing columns (outcome, fired,
57
+ // execution); origin and duration join at the sm breakpoint.
58
+ const rowGridClasses = "grid grid-cols-[7rem_1fr_auto] items-center gap-x-4 sm:grid-cols-[7rem_5.5rem_1fr_5rem_minmax(0,12rem)]";
59
+ function RunTableRow({ run, now, onNavigateToExecution, }) {
60
+ const fireDate = run.nominalFireTime
61
+ ? timestampDate(run.nominalFireTime)
62
+ : null;
63
+ const badge = runOutcomeBadge(run.outcome);
64
+ return (_jsxs("div", { role: "row", className: cn(rowGridClasses, "border-b border-border-muted px-3.5 py-2.5 last:border-b-0"), children: [_jsx("span", { role: "cell", children: _jsx("span", { className: cn("inline-flex items-center rounded-full px-2 py-0.5 text-[0.65rem] font-medium", badge.className), children: badge.label }) }), _jsx("span", { role: "cell", className: "hidden text-xs text-muted-foreground sm:block", children: runOriginLabel(run.origin) }), _jsx("span", { role: "cell", className: "text-xs text-muted-foreground", title: fireDate ? fireDate.toLocaleString() : undefined, children: fireDate ? formatRelativeTime(fireDate, now) : "—" }), _jsx("span", { role: "cell", className: "hidden text-xs tabular-nums text-muted-foreground sm:block", children: formatRunDuration(run) ?? "—" }), _jsx("span", { role: "cell", className: "min-w-0 text-right", children: run.executionId ? (onNavigateToExecution ? (_jsx("button", { type: "button", onClick: () => onNavigateToExecution(run.executionId), className: cn("max-w-full truncate font-mono text-[0.65rem] text-primary underline-offset-2 hover:underline", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"), children: run.executionId })) : (_jsx("span", { className: "font-mono text-[0.65rem] text-muted-foreground", children: run.executionId }))) : (_jsx("span", { className: "text-xs text-muted-foreground", children: "\u2014" })) }), run.reason && (_jsx("p", { role: "cell", className: "col-span-full mt-1 whitespace-pre-wrap break-words text-xs text-muted-foreground", children: run.reason }))] }));
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Compact list — the Overview tab's "recent runs" strip
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Compact run list: badge, origin, relative time, refusal reason, and
71
+ * execution link per row — the at-a-glance form used by the detail
72
+ * view's Overview tab. Presentational: runs come in as props (the
73
+ * caller owns the fetch, so one hook can also feed the Runs tab badge).
74
+ *
75
+ * Not barrel-exported: the public run-history surface is
76
+ * {@link ScheduleRunsTable}; this exists for the detail view's strip.
77
+ */
78
+ export function ScheduleRunsCompactList({ runs, isLoading, now, onNavigateToExecution, }) {
79
+ if (isLoading && runs.length === 0) {
80
+ return (_jsxs("div", { className: "space-y-2 px-4 py-3", "aria-busy": "true", children: [_jsx("div", { className: "h-4 w-full animate-pulse rounded bg-muted" }), _jsx("div", { className: "h-4 w-3/4 animate-pulse rounded bg-muted" })] }));
81
+ }
82
+ if (runs.length === 0) {
83
+ return _jsx(EmptyRuns, {});
84
+ }
85
+ return (_jsx("ul", { className: "divide-y divide-border", children: runs.map((run, i) => (_jsx(CompactRunRow, { run: run, now: now, onNavigateToExecution: onNavigateToExecution }, runKey(run, i)))) }));
86
+ }
87
+ function CompactRunRow({ run, now, onNavigateToExecution, }) {
88
+ const fireDate = run.nominalFireTime
89
+ ? timestampDate(run.nominalFireTime)
90
+ : null;
91
+ const badge = runOutcomeBadge(run.outcome);
92
+ return (_jsxs("li", { className: "flex flex-col gap-1 px-4 py-2.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: cn("inline-flex items-center rounded-full px-2 py-0.5 text-[0.65rem] font-medium", badge.className), children: badge.label }), _jsx("span", { className: "text-xs text-muted-foreground", children: runOriginLabel(run.origin) }), _jsx("span", { className: "text-xs text-muted-foreground-subtle", children: "\u00B7" }), _jsx("span", { className: "text-xs text-muted-foreground", title: fireDate ? fireDate.toLocaleString() : undefined, children: fireDate ? formatRelativeTime(fireDate, now) : "—" })] }), run.reason && (_jsx("p", { className: "whitespace-pre-wrap break-words text-xs text-muted-foreground", children: run.reason })), run.executionId &&
93
+ (onNavigateToExecution ? (_jsx("button", { type: "button", onClick: () => onNavigateToExecution(run.executionId), className: cn("self-start font-mono text-[0.65rem] text-primary underline-offset-2 hover:underline", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"), children: run.executionId })) : (_jsx("span", { className: "self-start font-mono text-[0.65rem] text-muted-foreground", children: run.executionId })))] }));
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Shared pieces
97
+ // ---------------------------------------------------------------------------
98
+ function EmptyRuns() {
99
+ return (_jsx("p", { className: "px-4 py-6 text-center text-xs text-muted-foreground", children: "No runs yet. Use \u201CRun now\u201D to fire a test run \u2014 every fire, including a refused one, is recorded here." }));
100
+ }
101
+ /**
102
+ * Stable row key from the fire ledger's natural identity
103
+ * (nominal fire time + origin), with the index as a collision tail.
104
+ */
105
+ function runKey(run, index) {
106
+ const fireMs = run.nominalFireTime
107
+ ? timestampDate(run.nominalFireTime).getTime()
108
+ : "no-time";
109
+ return `${fireMs}-${run.origin}-${index}`;
110
+ }
111
+ function runOriginLabel(origin) {
112
+ return origin === ScheduleRunOrigin.MANUAL ? "Manual" : "Scheduled";
113
+ }
114
+ /** Verbatim-label badges for a run outcome, colored by health. */
115
+ export function runOutcomeBadge(outcome) {
116
+ switch (outcome) {
117
+ case ScheduleRunOutcome.STARTED:
118
+ return { label: "Started", className: "bg-info/10 text-info" };
119
+ case ScheduleRunOutcome.COMPLETED:
120
+ return { label: "Completed", className: "bg-success/10 text-success" };
121
+ case ScheduleRunOutcome.REFUSED:
122
+ return { label: "Refused", className: "bg-warning/10 text-warning" };
123
+ case ScheduleRunOutcome.TARGET_MISSING:
124
+ return { label: "Target missing", className: "bg-warning/10 text-warning" };
125
+ case ScheduleRunOutcome.SKIPPED:
126
+ return { label: "Skipped", className: "bg-muted text-muted-foreground" };
127
+ case ScheduleRunOutcome.FAILED:
128
+ return { label: "Failed", className: "bg-destructive/10 text-destructive" };
129
+ case ScheduleRunOutcome.TIMED_OUT:
130
+ return { label: "Timed out", className: "bg-destructive/10 text-destructive" };
131
+ default:
132
+ return { label: "Unknown", className: "bg-muted text-muted-foreground" };
133
+ }
134
+ }
135
+ /**
136
+ * Wall-clock duration of a run, `recorded_at` → `completed_at`, in the
137
+ * compact unit style the schedule views use elsewhere (`42s`, `5m 12s`,
138
+ * `2h 3m`). `null` while the run is in flight or when the fire created
139
+ * no run at all — the caller renders the em-dash.
140
+ */
141
+ function formatRunDuration(run) {
142
+ if (!run.recordedAt || !run.completedAt)
143
+ return null;
144
+ const ms = timestampDate(run.completedAt).getTime() -
145
+ timestampDate(run.recordedAt).getTime();
146
+ if (ms < 0)
147
+ return null;
148
+ const totalSeconds = Math.round(ms / 1000);
149
+ if (totalSeconds < 1)
150
+ return "<1s";
151
+ if (totalSeconds < 60)
152
+ return `${totalSeconds}s`;
153
+ const minutes = Math.floor(totalSeconds / 60);
154
+ const seconds = totalSeconds % 60;
155
+ if (minutes < 60)
156
+ return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
157
+ const hours = Math.floor(minutes / 60);
158
+ const remMinutes = minutes % 60;
159
+ return remMinutes > 0 ? `${hours}h ${remMinutes}m` : `${hours}h`;
160
+ }
161
+ //# sourceMappingURL=ScheduleRunsTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleRunsTable.js","sourceRoot":"","sources":["../../src/schedule/ScheduleRunsTable.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAEnB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAuBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,UAAU,EACV,qBAAqB,EACrB,GAAG,EACH,QAAQ,GAAG,EAAE,EACb,SAAS,GACc;IACvB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,eAAe,CACrE,UAAU,EACV,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAC5B,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAI,CAAC;IAC9E,CAAC;IACD,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,eAAY,MAAM,YACzD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACnC,cAAa,SAAS,EAAC,8CAA8C,IAA3D,CAAC,CAA6D,CACzE,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,YACvB,KAAC,SAAS,KAAG,GACT,CACP,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IAEpD,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,aACvB,eACE,IAAI,EAAC,OAAO,gBACD,aAAa,EACxB,SAAS,EAAC,iDAAiD,aAE3D,eACE,IAAI,EAAC,KAAK,EACV,SAAS,EAAE,EAAE,CACX,cAAc,EACd,8GAA8G,CAC/G,aAED,eAAM,IAAI,EAAC,cAAc,wBAAe,EACxC,eAAM,IAAI,EAAC,cAAc,EAAC,SAAS,EAAC,iBAAiB,uBAE9C,EACP,eAAM,IAAI,EAAC,cAAc,sBAAa,EACtC,eAAM,IAAI,EAAC,cAAc,EAAC,SAAS,EAAC,iBAAiB,yBAE9C,EACP,eAAM,IAAI,EAAC,cAAc,EAAC,SAAS,EAAC,YAAY,0BAEzC,IACH,EACL,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,KAAC,WAAW,IAEV,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,SAAS,EACd,qBAAqB,EAAE,qBAAqB,IAHvC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAInB,CACH,CAAC,IACE,EAEL,UAAU,GAAG,CAAC,IAAI,CACjB,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,UAAU,EACxB,SAAS,EAAC,wBAAwB,EAClC,SAAS,EAAC,MAAM,GAChB,CACH,IACG,CACP,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,6DAA6D;AAC7D,MAAM,cAAc,GAClB,yGAAyG,CAAC;AAE5G,SAAS,WAAW,CAAC,EACnB,GAAG,EACH,GAAG,EACH,qBAAqB,GAKtB;IACC,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe;QAClC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,CACL,eACE,IAAI,EAAC,KAAK,EACV,SAAS,EAAE,EAAE,CACX,cAAc,EACd,4DAA4D,CAC7D,aAED,eAAM,IAAI,EAAC,MAAM,YACf,eACE,SAAS,EAAE,EAAE,CACX,8EAA8E,EAC9E,KAAK,CAAC,SAAS,CAChB,YAEA,KAAK,CAAC,KAAK,GACP,GACF,EACP,eAAM,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,+CAA+C,YACxE,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GACtB,EACP,eACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,YAEtD,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAC9C,EACP,eACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,4DAA4D,YAErE,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,GACzB,EACP,eAAM,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,oBAAoB,YAC7C,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CACjB,qBAAqB,CAAC,CAAC,CAAC,CACtB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,EACrD,SAAS,EAAE,EAAE,CACX,8FAA8F,EAC9F,oFAAoF,CACrF,YAEA,GAAG,CAAC,WAAW,GACT,CACV,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,gDAAgD,YAC7D,GAAG,CAAC,WAAW,GACX,CACR,CACF,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,+BAA+B,uBAAS,CACzD,GACI,EACN,GAAG,CAAC,MAAM,IAAI,CACb,YACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,kFAAkF,YAE3F,GAAG,CAAC,MAAM,GACT,CACL,IACG,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,IAAI,EACJ,SAAS,EACT,GAAG,EACH,qBAAqB,GAMtB;IACC,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,eAAW,MAAM,aACnD,cAAK,SAAS,EAAC,2CAA2C,GAAG,EAC7D,cAAK,SAAS,EAAC,0CAA0C,GAAG,IACxD,CACP,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAC,SAAS,KAAG,CAAC;IACvB,CAAC;IACD,OAAO,CACL,aAAI,SAAS,EAAC,wBAAwB,YACnC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,KAAC,aAAa,IAEZ,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,qBAAqB,EAAE,qBAAqB,IAHvC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAInB,CACH,CAAC,GACC,CACN,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,GAAG,EACH,GAAG,EACH,qBAAqB,GAKtB;IACC,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe;QAClC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO,CACL,cAAI,SAAS,EAAC,iCAAiC,aAC7C,eAAK,SAAS,EAAC,yBAAyB,aACtC,eACE,SAAS,EAAE,EAAE,CACX,8EAA8E,EAC9E,KAAK,CAAC,SAAS,CAChB,YAEA,KAAK,CAAC,KAAK,GACP,EACP,eAAM,SAAS,EAAC,+BAA+B,YAC5C,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GACtB,EACP,eAAM,SAAS,EAAC,sCAAsC,uBAAS,EAC/D,eACE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,YAEtD,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAC9C,IACH,EACL,GAAG,CAAC,MAAM,IAAI,CACb,YAAG,SAAS,EAAC,+DAA+D,YACzE,GAAG,CAAC,MAAM,GACT,CACL,EACA,GAAG,CAAC,WAAW;gBACd,CAAC,qBAAqB,CAAC,CAAC,CAAC,CACvB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,EACrD,SAAS,EAAE,EAAE,CACX,qFAAqF,EACrF,oFAAoF,CACrF,YAEA,GAAG,CAAC,WAAW,GACT,CACV,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,2DAA2D,YACxE,GAAG,CAAC,WAAW,GACX,CACR,CAAC,IACD,CACN,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,SAAS;IAChB,OAAO,CACL,YAAG,SAAS,EAAC,qDAAqD,sIAG9D,CACL,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,GAAgB,EAAE,KAAa;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe;QAChC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;QAC9C,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,MAAyB;IAC/C,OAAO,MAAM,KAAK,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;AACtE,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,OAA2B;IAIzD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,kBAAkB,CAAC,OAAO;YAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC;QACjE,KAAK,kBAAkB,CAAC,SAAS;YAC/B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;QACzE,KAAK,kBAAkB,CAAC,OAAO;YAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;QACvE,KAAK,kBAAkB,CAAC,cAAc;YACpC,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;QAC9E,KAAK,kBAAkB,CAAC,OAAO;YAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,gCAAgC,EAAE,CAAC;QAC3E,KAAK,kBAAkB,CAAC,MAAM;YAC5B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,oCAAoC,EAAE,CAAC;QAC9E,KAAK,kBAAkB,CAAC,SAAS;YAC/B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,oCAAoC,EAAE,CAAC;QACjF;YACE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,gCAAgC,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,GAAgB;IACzC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,EAAE,GACN,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;QACxC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1C,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,YAAY,GAAG,EAAE;QAAE,OAAO,GAAG,YAAY,GAAG,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE,CAAC;IAChC,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACnE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /** Props for {@link TimeZoneField}. */
2
+ export interface TimeZoneFieldProps {
3
+ /** Element ID, for association with an external `<label htmlFor>`. */
4
+ readonly id?: string;
5
+ /** The selected IANA time zone name. */
6
+ readonly value: string;
7
+ /** Called with the new zone when the user picks one. */
8
+ readonly onChange: (timeZone: string) => void;
9
+ /** Prevents interaction when `true`. */
10
+ readonly disabled?: boolean;
11
+ }
12
+ /**
13
+ * Searchable IANA time zone selector for the schedule form.
14
+ *
15
+ * The IANA database has ~400 zones — far too many for a plain
16
+ * `<select>` — so this follows the SDK's searchable-picker idiom
17
+ * (search input + listbox, as in `AgentPicker`): the input shows the
18
+ * selected zone; typing filters the list; Enter or click selects.
19
+ *
20
+ * The zone list comes from the runtime's own tz database
21
+ * (`Intl.supportedValuesOf`), which is also what {@link validateTimeZone}
22
+ * checks against — the offered choices and the accepted choices cannot
23
+ * drift.
24
+ *
25
+ * Internal to the schedule folder by design: public API surface is a
26
+ * contract, and this earns a barrel export only when a second consumer
27
+ * appears.
28
+ */
29
+ export declare function TimeZoneField({ id, value, onChange, disabled, }: TimeZoneFieldProps): import("react/jsx-runtime").JSX.Element;
30
+ /** The browser's own IANA time zone — the form's default. */
31
+ export declare function browserTimeZone(): string;
32
+ //# sourceMappingURL=TimeZoneField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeZoneField.d.ts","sourceRoot":"","sources":["../../src/schedule/TimeZoneField.tsx"],"names":[],"mappings":"AAWA,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAKD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,kBAAkB,2CAsIpB;AAaD,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,104 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useMemo, useRef, useState, } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ const LIST_ID = "stgm-timezone-list";
6
+ const MAX_VISIBLE = 100;
7
+ /**
8
+ * Searchable IANA time zone selector for the schedule form.
9
+ *
10
+ * The IANA database has ~400 zones — far too many for a plain
11
+ * `<select>` — so this follows the SDK's searchable-picker idiom
12
+ * (search input + listbox, as in `AgentPicker`): the input shows the
13
+ * selected zone; typing filters the list; Enter or click selects.
14
+ *
15
+ * The zone list comes from the runtime's own tz database
16
+ * (`Intl.supportedValuesOf`), which is also what {@link validateTimeZone}
17
+ * checks against — the offered choices and the accepted choices cannot
18
+ * drift.
19
+ *
20
+ * Internal to the schedule folder by design: public API surface is a
21
+ * contract, and this earns a barrel export only when a second consumer
22
+ * appears.
23
+ */
24
+ export function TimeZoneField({ id, value, onChange, disabled, }) {
25
+ const zones = useMemo(() => allTimeZones(), []);
26
+ const [query, setQuery] = useState(null);
27
+ const [focusIndex, setFocusIndex] = useState(-1);
28
+ const listRef = useRef(null);
29
+ const isOpen = query !== null;
30
+ const filtered = useMemo(() => {
31
+ if (query === null)
32
+ return [];
33
+ const needle = query.trim().toLowerCase().replace(/\s+/g, "_");
34
+ const matches = needle
35
+ ? zones.filter((z) => z.toLowerCase().includes(needle))
36
+ : zones;
37
+ return matches.slice(0, MAX_VISIBLE);
38
+ }, [zones, query]);
39
+ const close = useCallback(() => {
40
+ setQuery(null);
41
+ setFocusIndex(-1);
42
+ }, []);
43
+ const select = useCallback((zone) => {
44
+ onChange(zone);
45
+ close();
46
+ }, [onChange, close]);
47
+ const handleKeyDown = useCallback((e) => {
48
+ if (e.key === "Escape") {
49
+ e.preventDefault();
50
+ close();
51
+ return;
52
+ }
53
+ if (!isOpen)
54
+ return;
55
+ if (e.key === "ArrowDown") {
56
+ e.preventDefault();
57
+ setFocusIndex((prev) => (prev < filtered.length - 1 ? prev + 1 : prev));
58
+ }
59
+ else if (e.key === "ArrowUp") {
60
+ e.preventDefault();
61
+ setFocusIndex((prev) => (prev > 0 ? prev - 1 : -1));
62
+ }
63
+ else if (e.key === "Enter") {
64
+ e.preventDefault();
65
+ if (focusIndex >= 0 && focusIndex < filtered.length) {
66
+ select(filtered[focusIndex]);
67
+ }
68
+ else if (filtered.length === 1) {
69
+ select(filtered[0]);
70
+ }
71
+ }
72
+ }, [isOpen, filtered, focusIndex, select, close]);
73
+ return (_jsxs("div", { className: "relative", children: [_jsx("input", { id: id, type: "text", role: "combobox", "aria-expanded": isOpen, "aria-controls": LIST_ID, "aria-activedescendant": focusIndex >= 0 ? `stgm-timezone-${focusIndex}` : undefined, "aria-label": "Time zone", placeholder: "Search time zones\u2026", value: query ?? value, onChange: (e) => {
74
+ setQuery(e.target.value);
75
+ setFocusIndex(-1);
76
+ }, onFocus: () => setQuery(""),
77
+ // Closing on blur reverts the input to the committed value —
78
+ // free-typed text is never submitted, only list selections.
79
+ onBlur: close, onKeyDown: handleKeyDown, disabled: disabled, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") }), isOpen && (_jsx("div", { ref: listRef, id: LIST_ID, role: "listbox", "aria-label": "Time zones", className: cn("absolute z-popover mt-1 max-h-52 w-full overflow-y-auto rounded-md border border-border", "bg-popover p-1 text-popover-foreground shadow-md"), children: filtered.length === 0 ? (_jsx("div", { className: "py-3 text-center text-xs text-muted-foreground", children: "No time zones match" })) : (filtered.map((zone, idx) => (_jsx("button", { id: `stgm-timezone-${idx}`, type: "button", role: "option", "aria-selected": zone === value,
80
+ // Runs before the input's blur, so selection wins over
81
+ // the close-on-blur revert.
82
+ onMouseDown: (e) => {
83
+ e.preventDefault();
84
+ select(zone);
85
+ }, className: cn("flex w-full items-center rounded-sm px-2 py-1.5 text-left text-xs transition-colors", idx === focusIndex
86
+ ? "bg-accent text-foreground"
87
+ : "text-popover-foreground hover:bg-accent-hover", zone === value && "font-medium"), children: zone }, zone)))) }))] }));
88
+ }
89
+ function allTimeZones() {
90
+ try {
91
+ return Intl.supportedValuesOf("timeZone");
92
+ }
93
+ catch {
94
+ // Pre-2022 runtimes without supportedValuesOf: offer the browser's
95
+ // own zone plus UTC rather than an empty list.
96
+ const own = Intl.DateTimeFormat().resolvedOptions().timeZone;
97
+ return own && own !== "UTC" ? [own, "UTC"] : ["UTC"];
98
+ }
99
+ }
100
+ /** The browser's own IANA time zone — the form's default. */
101
+ export function browserTimeZone() {
102
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC";
103
+ }
104
+ //# sourceMappingURL=TimeZoneField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeZoneField.js","sourceRoot":"","sources":["../../src/schedule/TimeZoneField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * The cadence model behind {@link CadenceField} — a pure, dependency-free
3
+ * bridge between human-friendly schedule presets and the 5-field cron
4
+ * grammar the Schedule spec stores.
5
+ *
6
+ * Deliberately NOT a cron parser. The platform owns no cron parsing in
7
+ * either edition — calendar and DST semantics live in the Temporal server
8
+ * (see stigmer-server's schedule/controller/cron.go, DD-008 D2). This
9
+ * module only:
10
+ *
11
+ * 1. GENERATES cron strings from presets (`cadenceToCron`) — trivial
12
+ * string construction, always valid by construction.
13
+ * 2. RECOGNIZES the exact shapes the builder emits (`cronToCadence`)
14
+ * so a stored cron round-trips back into the preset UI; anything
15
+ * else falls back to the `custom` preset showing the raw string.
16
+ * 3. MIRRORS the server's purely lexical validation (`validateCron`,
17
+ * `validateTimeZone`) with the same user-facing wording, so the
18
+ * form can reject bad input instantly. The server remains the
19
+ * authority — its errors surface verbatim on submit.
20
+ */
21
+ /** A human-friendly cadence, convertible to/from a cron expression. */
22
+ export type CadencePreset = {
23
+ readonly kind: "hourly";
24
+ readonly minute: number;
25
+ } | {
26
+ readonly kind: "daily";
27
+ readonly hour: number;
28
+ readonly minute: number;
29
+ } | {
30
+ readonly kind: "weekly";
31
+ /** Days of week, cron numbering: 0 = Sunday … 6 = Saturday. */
32
+ readonly days: readonly number[];
33
+ readonly hour: number;
34
+ readonly minute: number;
35
+ } | {
36
+ readonly kind: "monthly";
37
+ /** Day of month, 1–31. Days 29–31 skip months without that day. */
38
+ readonly day: number;
39
+ readonly hour: number;
40
+ readonly minute: number;
41
+ } | {
42
+ readonly kind: "custom";
43
+ readonly cron: string;
44
+ };
45
+ /** Discriminant of {@link CadencePreset}. */
46
+ export type CadenceKind = CadencePreset["kind"];
47
+ /** Day-of-week labels indexed by cron numbering (0 = Sunday). */
48
+ export declare const WEEKDAY_LABELS: readonly ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
49
+ /**
50
+ * Build the 5-field cron expression for a preset.
51
+ *
52
+ * Output is always valid by construction: numeric fields only,
53
+ * day-of-week in cron numbering (0 = Sunday). For `custom`, the raw
54
+ * string is returned as-is — validate it with {@link validateCron}.
55
+ */
56
+ export declare function cadenceToCron(preset: CadencePreset): string;
57
+ /**
58
+ * Recognize a cron expression as one of the builder's presets.
59
+ *
60
+ * Only the exact shapes {@link cadenceToCron} emits (plus the
61
+ * calendar shorthands `@hourly`/`@daily`/`@weekly`/`@monthly`) map to a
62
+ * structured preset. Everything else — ranges, steps, names, `@yearly`
63
+ * — is a perfectly valid schedule that this UI simply cannot decompose,
64
+ * so it round-trips as `custom` with the raw string intact.
65
+ */
66
+ export declare function cronToCadence(cron: string): CadencePreset;
67
+ /**
68
+ * Human-readable summary of a cadence, e.g.
69
+ * `"Every day at 09:00 (Asia/Kolkata)"`.
70
+ *
71
+ * This is a description of the chosen preset, not a computed fire-time
72
+ * forecast — the platform's next fire time is published by the server
73
+ * as `status.next_fire_at` after apply.
74
+ */
75
+ export declare function describeCadence(preset: CadencePreset, timeZone?: string): string;
76
+ /** `9, 5` → `"09:05"` (24-hour clock, zero-padded). */
77
+ export declare function formatTime(hour: number, minute: number): string;
78
+ /**
79
+ * Validate a cron expression against the platform's lexical grammar.
80
+ *
81
+ * Returns the user-facing error message (identical wording to the
82
+ * server's) or `null` when the expression is acceptable. Purely
83
+ * lexical — it does not evaluate calendar semantics.
84
+ */
85
+ export declare function validateCron(cron: string): string | null;
86
+ /**
87
+ * Validate an IANA time zone name using the runtime's own tz database
88
+ * (`Intl`), mirroring the server's check against the platform tz
89
+ * database. Returns the user-facing error message or `null`.
90
+ *
91
+ * `"Local"` is rejected explicitly for the same reason the server
92
+ * rejects it: it is host-dependent, not a zone.
93
+ */
94
+ export declare function validateTimeZone(timeZone: string): string | null;
95
+ //# sourceMappingURL=cadence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cadence.d.ts","sourceRoot":"","sources":["../../src/schedule/cadence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,uEAAuE;AACvE,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1E;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAEhD,iEAAiE;AACjE,eAAO,MAAM,cAAc,yFAQjB,CAAC;AAMX;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAiB3D;AAWD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAsDzD;AAcD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAoBR;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/D;AA2BD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiCxD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE"}