@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.
- package/agent/AgentPicker.d.ts +10 -1
- package/agent/AgentPicker.d.ts.map +1 -1
- package/agent/AgentPicker.js +2 -2
- package/agent/AgentPicker.js.map +1 -1
- package/billing/CreditLedgerTable.d.ts.map +1 -1
- package/billing/CreditLedgerTable.js +2 -7
- package/billing/CreditLedgerTable.js.map +1 -1
- package/channel/AgentChannelsPanel.d.ts.map +1 -1
- package/channel/AgentChannelsPanel.js +22 -5
- package/channel/AgentChannelsPanel.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts +53 -0
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -0
- package/channel/ChannelTemplatesDialog.js +150 -0
- package/channel/ChannelTemplatesDialog.js.map +1 -0
- package/channel/index.d.ts +8 -0
- package/channel/index.d.ts.map +1 -1
- package/channel/index.js +4 -0
- package/channel/index.js.map +1 -1
- package/channel/providers.d.ts +12 -0
- package/channel/providers.d.ts.map +1 -1
- package/channel/providers.js +14 -2
- package/channel/providers.js.map +1 -1
- package/channel/templatePresentation.d.ts +37 -0
- package/channel/templatePresentation.d.ts.map +1 -0
- package/channel/templatePresentation.js +69 -0
- package/channel/templatePresentation.js.map +1 -0
- package/channel/useChannelTemplateList.d.ts +64 -0
- package/channel/useChannelTemplateList.d.ts.map +1 -0
- package/channel/useChannelTemplateList.js +69 -0
- package/channel/useChannelTemplateList.js.map +1 -0
- package/channel/useChannelTemplateReadiness.d.ts +53 -0
- package/channel/useChannelTemplateReadiness.d.ts.map +1 -0
- package/channel/useChannelTemplateReadiness.js +42 -0
- package/channel/useChannelTemplateReadiness.js.map +1 -0
- package/composer/ComposerToolbar.d.ts +6 -1
- package/composer/ComposerToolbar.d.ts.map +1 -1
- package/composer/ComposerToolbar.js +2 -2
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +9 -0
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +13 -2
- package/composer/SessionComposer.js.map +1 -1
- package/dashboard/useDashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/useDashboardFailedRuns.js +2 -0
- package/dashboard/useDashboardFailedRuns.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +14 -0
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.js +5 -0
- package/execution/useCreateAgentExecution.js.map +1 -1
- package/index.d.ts +4 -2
- package/index.d.ts.map +1 -1
- package/index.js +10 -1
- package/index.js.map +1 -1
- package/internal/Pagination.d.ts +15 -0
- package/internal/Pagination.d.ts.map +1 -0
- package/internal/Pagination.js +20 -0
- package/internal/Pagination.js.map +1 -0
- package/library/useExportResource.d.ts +4 -3
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +1 -1
- package/library/useExportResource.js.map +1 -1
- package/models/ModelSelector.d.ts +26 -1
- package/models/ModelSelector.d.ts.map +1 -1
- package/models/ModelSelector.js +27 -6
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -0
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -0
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +10 -0
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +3 -0
- package/models/registry.js.map +1 -1
- package/models/service-tier.d.ts +27 -0
- package/models/service-tier.d.ts.map +1 -0
- package/models/service-tier.js +34 -0
- package/models/service-tier.js.map +1 -0
- package/organization/OrgProvider.d.ts +11 -4
- package/organization/OrgProvider.d.ts.map +1 -1
- package/organization/OrgProvider.js +28 -4
- package/organization/OrgProvider.js.map +1 -1
- package/package.json +4 -4
- package/resource-detail/useDeleteResource.d.ts +1 -1
- package/resource-detail/useDeleteResource.d.ts.map +1 -1
- package/resource-detail/useDeleteResource.js +5 -0
- package/resource-detail/useDeleteResource.js.map +1 -1
- package/resource-workbench/components/ResourceWorkbench.d.ts +10 -1
- package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
- package/resource-workbench/components/ResourceWorkbench.js +6 -2
- package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
- package/resource-workbench/hooks/useResourceCollection.d.ts +8 -0
- package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -1
- package/resource-workbench/hooks/useResourceCollection.js +2 -2
- package/resource-workbench/hooks/useResourceCollection.js.map +1 -1
- package/schedule/CadenceField.d.ts +31 -0
- package/schedule/CadenceField.d.ts.map +1 -0
- package/schedule/CadenceField.js +116 -0
- package/schedule/CadenceField.js.map +1 -0
- package/schedule/ScheduleDetailView.d.ts +81 -0
- package/schedule/ScheduleDetailView.d.ts.map +1 -0
- package/schedule/ScheduleDetailView.js +648 -0
- package/schedule/ScheduleDetailView.js.map +1 -0
- package/schedule/ScheduleForm.d.ts +46 -0
- package/schedule/ScheduleForm.d.ts.map +1 -0
- package/schedule/ScheduleForm.js +214 -0
- package/schedule/ScheduleForm.js.map +1 -0
- package/schedule/ScheduleRowActions.d.ts +20 -0
- package/schedule/ScheduleRowActions.d.ts.map +1 -0
- package/schedule/ScheduleRowActions.js +54 -0
- package/schedule/ScheduleRowActions.js.map +1 -0
- package/schedule/ScheduleRunsTable.d.ts +72 -0
- package/schedule/ScheduleRunsTable.d.ts.map +1 -0
- package/schedule/ScheduleRunsTable.js +161 -0
- package/schedule/ScheduleRunsTable.js.map +1 -0
- package/schedule/TimeZoneField.d.ts +32 -0
- package/schedule/TimeZoneField.d.ts.map +1 -0
- package/schedule/TimeZoneField.js +104 -0
- package/schedule/TimeZoneField.js.map +1 -0
- package/schedule/cadence.d.ts +95 -0
- package/schedule/cadence.d.ts.map +1 -0
- package/schedule/cadence.js +242 -0
- package/schedule/cadence.js.map +1 -0
- package/schedule/index.d.ts +37 -0
- package/schedule/index.d.ts.map +1 -0
- package/schedule/index.js +19 -0
- package/schedule/index.js.map +1 -0
- package/schedule/scheduleColumns.d.ts +26 -0
- package/schedule/scheduleColumns.d.ts.map +1 -0
- package/schedule/scheduleColumns.js +77 -0
- package/schedule/scheduleColumns.js.map +1 -0
- package/schedule/scheduleListFn.d.ts +50 -0
- package/schedule/scheduleListFn.d.ts.map +1 -0
- package/schedule/scheduleListFn.js +65 -0
- package/schedule/scheduleListFn.js.map +1 -0
- package/schedule/scheduleState.d.ts +43 -0
- package/schedule/scheduleState.d.ts.map +1 -0
- package/schedule/scheduleState.js +67 -0
- package/schedule/scheduleState.js.map +1 -0
- package/schedule/useCreateSchedule.d.ts +57 -0
- package/schedule/useCreateSchedule.d.ts.map +1 -0
- package/schedule/useCreateSchedule.js +61 -0
- package/schedule/useCreateSchedule.js.map +1 -0
- package/schedule/useResumeSchedule.d.ts +30 -0
- package/schedule/useResumeSchedule.d.ts.map +1 -0
- package/schedule/useResumeSchedule.js +45 -0
- package/schedule/useResumeSchedule.js.map +1 -0
- package/schedule/useSchedule.d.ts +39 -0
- package/schedule/useSchedule.d.ts.map +1 -0
- package/schedule/useSchedule.js +44 -0
- package/schedule/useSchedule.js.map +1 -0
- package/schedule/useScheduleCount.d.ts +38 -0
- package/schedule/useScheduleCount.d.ts.map +1 -0
- package/schedule/useScheduleCount.js +30 -0
- package/schedule/useScheduleCount.js.map +1 -0
- package/schedule/useScheduleList.d.ts +48 -0
- package/schedule/useScheduleList.d.ts.map +1 -0
- package/schedule/useScheduleList.js +43 -0
- package/schedule/useScheduleList.js.map +1 -0
- package/schedule/useScheduleRuns.d.ts +44 -0
- package/schedule/useScheduleRuns.d.ts.map +1 -0
- package/schedule/useScheduleRuns.js +48 -0
- package/schedule/useScheduleRuns.js.map +1 -0
- package/schedule/useSetScheduleEnabled.d.ts +31 -0
- package/schedule/useSetScheduleEnabled.d.ts.map +1 -0
- package/schedule/useSetScheduleEnabled.js +53 -0
- package/schedule/useSetScheduleEnabled.js.map +1 -0
- package/schedule/useTriggerSchedule.d.ts +41 -0
- package/schedule/useTriggerSchedule.d.ts.map +1 -0
- package/schedule/useTriggerSchedule.js +62 -0
- package/schedule/useTriggerSchedule.js.map +1 -0
- package/schedule/useUpdateScheduleSpec.d.ts +49 -0
- package/schedule/useUpdateScheduleSpec.d.ts.map +1 -0
- package/schedule/useUpdateScheduleSpec.js +70 -0
- package/schedule/useUpdateScheduleSpec.js.map +1 -0
- package/search/useResourceCount.d.ts +2 -1
- package/search/useResourceCount.d.ts.map +1 -1
- package/search/useResourceCount.js +6 -1
- package/search/useResourceCount.js.map +1 -1
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +1 -0
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +11 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +1 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +1 -0
- package/session/useSessionPageFlow.js.map +1 -1
- package/src/agent/AgentPicker.tsx +13 -1
- package/src/billing/CreditLedgerTable.tsx +3 -42
- package/src/channel/AgentChannelsPanel.tsx +43 -1
- package/src/channel/ChannelTemplatesDialog.tsx +433 -0
- package/src/channel/__tests__/AgentChannelsPanel.test.tsx +73 -0
- package/src/channel/__tests__/ChannelTemplatesDialog.test.tsx +292 -0
- package/src/channel/__tests__/providers.test.ts +9 -0
- package/src/channel/__tests__/templatePresentation.test.ts +96 -0
- package/src/channel/__tests__/useChannelTemplateList.test.tsx +216 -0
- package/src/channel/__tests__/useChannelTemplateReadiness.test.tsx +124 -0
- package/src/channel/index.ts +15 -0
- package/src/channel/providers.ts +26 -2
- package/src/channel/templatePresentation.ts +82 -0
- package/src/channel/useChannelTemplateList.ts +123 -0
- package/src/channel/useChannelTemplateReadiness.ts +69 -0
- package/src/composer/ComposerToolbar.tsx +9 -0
- package/src/composer/SessionComposer.tsx +24 -1
- package/src/composer/__tests__/SessionComposer-serviceTier.test.tsx +156 -0
- package/src/dashboard/__tests__/useDashboardFailedRuns.test.tsx +106 -0
- package/src/dashboard/useDashboardFailedRuns.ts +2 -0
- package/src/execution/useCreateAgentExecution.ts +18 -0
- package/src/index.ts +70 -0
- package/src/internal/Pagination.tsx +72 -0
- package/src/library/useExportResource.ts +4 -3
- package/src/models/ModelSelector.tsx +100 -3
- package/src/models/__tests__/ModelSelector-serviceTier.test.tsx +172 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +15 -0
- package/src/models/index.ts +2 -0
- package/src/models/registry.ts +16 -0
- package/src/models/service-tier.ts +49 -0
- package/src/organization/OrgProvider.tsx +29 -4
- package/src/organization/__tests__/OrgProvider.orgSwitch.test.tsx +89 -0
- package/src/resource-detail/useDeleteResource.ts +11 -1
- package/src/resource-workbench/__tests__/ResourceWorkbench.test.tsx +112 -0
- package/src/resource-workbench/components/ResourceWorkbench.tsx +32 -15
- package/src/resource-workbench/hooks/useResourceCollection.ts +11 -1
- package/src/schedule/CadenceField.tsx +365 -0
- package/src/schedule/ScheduleDetailView.tsx +1651 -0
- package/src/schedule/ScheduleForm.tsx +615 -0
- package/src/schedule/ScheduleRowActions.tsx +124 -0
- package/src/schedule/ScheduleRunsTable.tsx +424 -0
- package/src/schedule/TimeZoneField.tsx +199 -0
- package/src/schedule/__tests__/ScheduleDetailView.test.tsx +683 -0
- package/src/schedule/__tests__/cadence.test.ts +278 -0
- package/src/schedule/__tests__/scheduleColumnsRowActions.test.tsx +176 -0
- package/src/schedule/__tests__/scheduleCreation.test.tsx +537 -0
- package/src/schedule/__tests__/scheduleHooks.test.tsx +399 -0
- package/src/schedule/__tests__/scheduleListFn.test.ts +128 -0
- package/src/schedule/__tests__/scheduleState.test.ts +133 -0
- package/src/schedule/cadence.ts +298 -0
- package/src/schedule/index.ts +69 -0
- package/src/schedule/scheduleColumns.tsx +118 -0
- package/src/schedule/scheduleListFn.ts +108 -0
- package/src/schedule/scheduleState.ts +96 -0
- package/src/schedule/useCreateSchedule.ts +88 -0
- package/src/schedule/useResumeSchedule.ts +67 -0
- package/src/schedule/useSchedule.ts +67 -0
- package/src/schedule/useScheduleCount.ts +57 -0
- package/src/schedule/useScheduleList.ts +83 -0
- package/src/schedule/useScheduleRuns.ts +93 -0
- package/src/schedule/useSetScheduleEnabled.ts +84 -0
- package/src/schedule/useTriggerSchedule.ts +90 -0
- package/src/schedule/useUpdateScheduleSpec.ts +108 -0
- package/src/search/__tests__/useResourceCount.test.tsx +89 -0
- package/src/search/useResourceCount.ts +8 -2
- package/src/session/useNewSessionFlow.ts +1 -0
- package/src/session/useSessionConversation.ts +12 -0
- package/src/session/useSessionPageFlow.ts +1 -0
- package/src/workflow/WorkflowDashboard.tsx +1 -0
- package/src/workflow/__tests__/inspector-forms.test.tsx +119 -2
- package/src/workflow/inspector/forms/AgentCallForm.tsx +260 -37
- package/src/workflow/inspector/tabs/RuntimeTab.tsx +72 -33
- package/src/workflow/starter-workflow-yaml.ts +2 -1
- package/src/workflow/useWorkflowExecutionList.ts +13 -2
- package/styles.css +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/WorkflowDashboard.d.ts.map +1 -1
- package/workflow/WorkflowDashboard.js +1 -0
- package/workflow/WorkflowDashboard.js.map +1 -1
- package/workflow/inspector/forms/AgentCallForm.d.ts +18 -2
- package/workflow/inspector/forms/AgentCallForm.d.ts.map +1 -1
- package/workflow/inspector/forms/AgentCallForm.js +87 -9
- package/workflow/inspector/forms/AgentCallForm.js.map +1 -1
- package/workflow/inspector/tabs/RuntimeTab.d.ts +2 -1
- package/workflow/inspector/tabs/RuntimeTab.d.ts.map +1 -1
- package/workflow/inspector/tabs/RuntimeTab.js +31 -5
- package/workflow/inspector/tabs/RuntimeTab.js.map +1 -1
- package/workflow/starter-workflow-yaml.d.ts +1 -1
- package/workflow/starter-workflow-yaml.d.ts.map +1 -1
- package/workflow/starter-workflow-yaml.js +2 -1
- package/workflow/starter-workflow-yaml.js.map +1 -1
- package/workflow/useWorkflowExecutionList.d.ts +10 -0
- package/workflow/useWorkflowExecutionList.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionList.js +3 -2
- 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":"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"}
|
|
@@ -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"}
|