@stigmer/react 3.5.2 → 3.6.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/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/dashboard/useDashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/useDashboardFailedRuns.js +2 -0
- package/dashboard/useDashboardFailedRuns.js.map +1 -1
- package/index.d.ts +4 -2
- package/index.d.ts.map +1 -1
- package/index.js +9 -1
- package/index.js.map +1 -1
- 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/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 +58 -0
- package/schedule/ScheduleDetailView.d.ts.map +1 -0
- package/schedule/ScheduleDetailView.js +236 -0
- package/schedule/ScheduleDetailView.js.map +1 -0
- package/schedule/ScheduleForm.d.ts +43 -0
- package/schedule/ScheduleForm.d.ts.map +1 -0
- package/schedule/ScheduleForm.js +129 -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/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 +31 -0
- package/schedule/index.d.ts.map +1 -0
- package/schedule/index.js +16 -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/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 +28 -0
- package/schedule/useTriggerSchedule.d.ts.map +1 -0
- package/schedule/useTriggerSchedule.js +43 -0
- package/schedule/useTriggerSchedule.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/src/agent/AgentPicker.tsx +13 -1
- 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/dashboard/__tests__/useDashboardFailedRuns.test.tsx +106 -0
- package/src/dashboard/useDashboardFailedRuns.ts +2 -0
- package/src/execution/__tests__/PlanArtifactCard.test.tsx +23 -2
- package/src/index.ts +65 -0
- package/src/library/useExportResource.ts +4 -3
- 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 +583 -0
- package/src/schedule/ScheduleForm.tsx +405 -0
- package/src/schedule/ScheduleRowActions.tsx +124 -0
- package/src/schedule/TimeZoneField.tsx +199 -0
- package/src/schedule/__tests__/ScheduleDetailView.test.tsx +260 -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 +340 -0
- package/src/schedule/__tests__/scheduleHooks.test.tsx +312 -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 +57 -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/useSetScheduleEnabled.ts +84 -0
- package/src/schedule/useTriggerSchedule.ts +65 -0
- package/src/search/__tests__/useResourceCount.test.tsx +89 -0
- package/src/search/useResourceCount.ts +8 -2
- package/src/workflow/WorkflowDashboard.tsx +1 -0
- 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/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,116 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useId } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { cadenceToCron, describeCadence, formatTime, validateCron, WEEKDAY_LABELS, } from "./cadence.js";
|
|
6
|
+
const KIND_OPTIONS = [
|
|
7
|
+
{ kind: "hourly", label: "Hourly" },
|
|
8
|
+
{ kind: "daily", label: "Daily" },
|
|
9
|
+
{ kind: "weekly", label: "Weekly" },
|
|
10
|
+
{ kind: "monthly", label: "Monthly" },
|
|
11
|
+
{ kind: "custom", label: "Custom cron" },
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Human-friendly cadence builder for schedules.
|
|
15
|
+
*
|
|
16
|
+
* Presents preset cadences (hourly / daily / weekly / monthly) with
|
|
17
|
+
* plain time-and-day inputs, generating the 5-field cron expression by
|
|
18
|
+
* construction — the user never writes cron unless they choose the
|
|
19
|
+
* Custom escape hatch, where the raw expression is validated instantly
|
|
20
|
+
* with the platform's own lexical rules ({@link validateCron}).
|
|
21
|
+
*
|
|
22
|
+
* A live plain-English summary ({@link describeCadence}) always states
|
|
23
|
+
* what was chosen. It describes the preset, not a computed fire-time
|
|
24
|
+
* forecast — the authoritative next fire time is published by the
|
|
25
|
+
* server as `status.next_fire_at` after apply.
|
|
26
|
+
*
|
|
27
|
+
* Controlled component over {@link CadencePreset}; convert to the spec
|
|
28
|
+
* string with {@link cadenceToCron} at submit time.
|
|
29
|
+
*/
|
|
30
|
+
export function CadenceField({ value, onChange, timeZone, disabled, }) {
|
|
31
|
+
const groupId = useId();
|
|
32
|
+
const switchKind = useCallback((kind) => {
|
|
33
|
+
if (kind === value.kind)
|
|
34
|
+
return;
|
|
35
|
+
onChange(presetForKind(kind, value));
|
|
36
|
+
}, [value, onChange]);
|
|
37
|
+
const cronError = value.kind === "custom" && value.cron.trim() !== ""
|
|
38
|
+
? validateCron(value.cron.trim())
|
|
39
|
+
: null;
|
|
40
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { role: "radiogroup", "aria-label": "Cadence", "aria-disabled": disabled || undefined, className: cn("inline-flex flex-wrap rounded-md bg-muted p-0.5", disabled && "pointer-events-none opacity-50"), children: KIND_OPTIONS.map((option) => {
|
|
41
|
+
const isSelected = value.kind === option.kind;
|
|
42
|
+
return (_jsx("button", { type: "button", role: "radio", "aria-checked": isSelected, tabIndex: isSelected ? 0 : -1, disabled: disabled, onClick: () => switchKind(option.kind), onKeyDown: (e) => {
|
|
43
|
+
if (e.key === "ArrowRight" || e.key === "ArrowLeft") {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
const idx = KIND_OPTIONS.findIndex((o) => o.kind === value.kind);
|
|
46
|
+
const delta = e.key === "ArrowRight" ? 1 : -1;
|
|
47
|
+
const next = KIND_OPTIONS[(idx + delta + KIND_OPTIONS.length) % KIND_OPTIONS.length];
|
|
48
|
+
switchKind(next.kind);
|
|
49
|
+
}
|
|
50
|
+
}, className: cn("inline-flex cursor-pointer items-center rounded-sm px-2.5 py-1 text-xs font-medium transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", isSelected
|
|
51
|
+
? "bg-background text-foreground shadow-sm"
|
|
52
|
+
: "text-muted-foreground hover:text-foreground"), children: option.label }, option.kind));
|
|
53
|
+
}) }), value.kind === "hourly" && (_jsxs("div", { className: "flex items-center gap-2 text-xs text-foreground", children: [_jsx("label", { htmlFor: `${groupId}-minute`, children: "At minute" }), _jsx("input", { id: `${groupId}-minute`, type: "number", min: 0, max: 59, value: value.minute, onChange: (e) => onChange({
|
|
54
|
+
kind: "hourly",
|
|
55
|
+
minute: clampInt(e.target.value, 0, 59, value.minute),
|
|
56
|
+
}), disabled: disabled, className: numberInputClasses })] })), value.kind === "daily" && (_jsx(TimeInput, { id: `${groupId}-time`, hour: value.hour, minute: value.minute, disabled: disabled, onChange: (hour, minute) => onChange({ kind: "daily", hour, minute }) })), value.kind === "weekly" && (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { role: "group", "aria-label": "Days of week", className: "flex flex-wrap gap-1", children: WEEKDAY_LABELS.map((label, day) => {
|
|
57
|
+
const isOn = value.days.includes(day);
|
|
58
|
+
// The last selected day cannot be removed — a weekly
|
|
59
|
+
// schedule with zero days is not expressible in cron.
|
|
60
|
+
const isLastSelected = isOn && value.days.length === 1;
|
|
61
|
+
return (_jsx("button", { type: "button", "aria-pressed": isOn, "aria-label": label, title: label, disabled: disabled || isLastSelected, onClick: () => onChange({
|
|
62
|
+
...value,
|
|
63
|
+
days: isOn
|
|
64
|
+
? value.days.filter((d) => d !== day)
|
|
65
|
+
: [...value.days, day].sort((a, b) => a - b),
|
|
66
|
+
}), className: cn("inline-flex h-7 w-9 items-center justify-center rounded-md border text-xs font-medium transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:pointer-events-none", isOn
|
|
67
|
+
? "border-primary bg-primary text-primary-foreground"
|
|
68
|
+
: "border-input bg-background text-muted-foreground hover:text-foreground", isLastSelected && "opacity-70"), children: label.slice(0, 3) }, label));
|
|
69
|
+
}) }), _jsx(TimeInput, { id: `${groupId}-time`, hour: value.hour, minute: value.minute, disabled: disabled, onChange: (hour, minute) => onChange({ ...value, hour, minute }) })] })), value.kind === "monthly" && (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs text-foreground", children: [_jsx("label", { htmlFor: `${groupId}-day`, children: "On day" }), _jsx("input", { id: `${groupId}-day`, type: "number", min: 1, max: 31, value: value.day, onChange: (e) => onChange({
|
|
70
|
+
...value,
|
|
71
|
+
day: clampInt(e.target.value, 1, 31, value.day),
|
|
72
|
+
}), disabled: disabled, className: numberInputClasses }), _jsx("span", { className: "text-muted-foreground", children: "of every month" })] }), value.day >= 29 && (_jsxs("p", { className: "text-[0.65rem] text-muted-foreground", children: ["Months without day ", value.day, " are skipped \u2014 February never fires a day-", value.day, " schedule", value.day === 29 ? " except in leap years" : "", "."] })), _jsx(TimeInput, { id: `${groupId}-time`, hour: value.hour, minute: value.minute, disabled: disabled, onChange: (hour, minute) => onChange({ ...value, hour, minute }) })] })), value.kind === "custom" && (_jsxs("div", { className: "space-y-1", children: [_jsx("input", { type: "text", "aria-label": "Cron expression", placeholder: "e.g. 0 9 * * MON-FRI", value: value.cron, onChange: (e) => onChange({ kind: "custom", cron: e.target.value }), disabled: disabled, className: cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 font-mono text-xs text-foreground", "placeholder:font-sans placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50", cronError && "border-destructive") }), cronError ? (_jsx("p", { className: "text-[0.65rem] text-destructive", role: "alert", children: cronError })) : (_jsx("p", { className: "text-[0.65rem] text-muted-foreground", children: "5 fields (minute hour day-of-month month day-of-week) or @hourly, @daily, @weekly, @monthly, @yearly." }))] })), !(value.kind === "custom" && (cronError || value.cron.trim() === "")) && (_jsx("p", { className: "text-xs text-muted-foreground", "data-testid": "cadence-summary", children: describeCadence(value, timeZone) }))] }));
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Private helpers
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
const numberInputClasses = cn("w-16 rounded-md border border-input bg-background px-2 py-1 text-xs text-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50");
|
|
78
|
+
function TimeInput({ id, hour, minute, disabled, onChange, }) {
|
|
79
|
+
return (_jsxs("div", { className: "flex items-center gap-2 text-xs text-foreground", children: [_jsx("label", { htmlFor: id, children: "At" }), _jsx("input", { id: id, type: "time", value: formatTime(hour, minute), onChange: (e) => {
|
|
80
|
+
const [h, m] = e.target.value.split(":").map(Number);
|
|
81
|
+
if (Number.isInteger(h) && Number.isInteger(m))
|
|
82
|
+
onChange(h, m);
|
|
83
|
+
}, disabled: disabled, className: cn("rounded-md border border-input bg-background px-2 py-1 text-xs text-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50") })] }));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Next preset when the user switches kind, carrying the time of day
|
|
87
|
+
* across so "Daily at 09:30" → Weekly keeps 09:30. Switching to Custom
|
|
88
|
+
* prefills the generated cron from the outgoing preset — the escape
|
|
89
|
+
* hatch starts from what the user already built, not a blank box.
|
|
90
|
+
*/
|
|
91
|
+
function presetForKind(kind, previous) {
|
|
92
|
+
const hour = "hour" in previous ? previous.hour : 9;
|
|
93
|
+
const minute = "minute" in previous ? previous.minute : 0;
|
|
94
|
+
switch (kind) {
|
|
95
|
+
case "hourly":
|
|
96
|
+
return { kind, minute };
|
|
97
|
+
case "daily":
|
|
98
|
+
return { kind, hour, minute };
|
|
99
|
+
case "weekly":
|
|
100
|
+
return { kind, days: [1], hour, minute };
|
|
101
|
+
case "monthly":
|
|
102
|
+
return { kind, day: 1, hour, minute };
|
|
103
|
+
case "custom":
|
|
104
|
+
return {
|
|
105
|
+
kind,
|
|
106
|
+
cron: previous.kind === "custom" ? previous.cron : cadenceToCron(previous),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function clampInt(raw, min, max, fallback) {
|
|
111
|
+
const n = Number(raw);
|
|
112
|
+
if (!Number.isInteger(n))
|
|
113
|
+
return fallback;
|
|
114
|
+
return Math.min(max, Math.max(min, n));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=CadenceField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CadenceField.js","sourceRoot":"","sources":["../../src/schedule/CadenceField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Schedule } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/api_pb";
|
|
2
|
+
/** Props for {@link ScheduleDetailView}. */
|
|
3
|
+
export interface ScheduleDetailViewProps {
|
|
4
|
+
/** Organization slug. */
|
|
5
|
+
readonly org: string;
|
|
6
|
+
/** Schedule slug. */
|
|
7
|
+
readonly slug: string;
|
|
8
|
+
/**
|
|
9
|
+
* Called when the user activates the target-agent reference.
|
|
10
|
+
* Navigation is the consumer's concern (DD-004) — the Console pushes
|
|
11
|
+
* a Library route; an embedding host does whatever fits.
|
|
12
|
+
*/
|
|
13
|
+
readonly onNavigateToAgent?: (org: string, slug: string) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Called when the user activates the last-execution reference
|
|
16
|
+
* (`aex_…`). When omitted, the id renders as plain text.
|
|
17
|
+
*/
|
|
18
|
+
readonly onNavigateToExecution?: (executionId: string) => void;
|
|
19
|
+
/** Called after a successful delete (navigate back to the list). */
|
|
20
|
+
readonly onDeleted?: () => void;
|
|
21
|
+
/** Called when the schedule loads or reloads (e.g. breadcrumb label sync). */
|
|
22
|
+
readonly onResourceLoad?: (schedule: Schedule) => void;
|
|
23
|
+
/**
|
|
24
|
+
* The instant "next fire" countdowns are computed against.
|
|
25
|
+
* Injectable for deterministic tests and Scenar fixtures.
|
|
26
|
+
* @default new Date() at render
|
|
27
|
+
*/
|
|
28
|
+
readonly now?: Date;
|
|
29
|
+
/** Additional CSS classes for the root container. */
|
|
30
|
+
readonly className?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Self-contained detail view for a Schedule (stigmer/stigmer#352).
|
|
34
|
+
*
|
|
35
|
+
* The view's one non-negotiable is rendering the two stop-levers
|
|
36
|
+
* distinctly, each with its inline remedy:
|
|
37
|
+
*
|
|
38
|
+
* - **Disabled** (owner's `spec.enabled` switch) — banner with an
|
|
39
|
+
* Enable action (a lossless full-proto re-apply).
|
|
40
|
+
* - **Paused** (platform's failure-streak latch,
|
|
41
|
+
* `status.paused_reason`) — banner showing the reason with a Resume
|
|
42
|
+
* action (the one path that clears the pause).
|
|
43
|
+
*
|
|
44
|
+
* Trigger ("Run now") starts a real, billable execution and is gated
|
|
45
|
+
* behind a confirmation; it is disabled while the schedule cannot fire
|
|
46
|
+
* (the banner names the remedy). Edit YAML, Export, and Delete round
|
|
47
|
+
* out the action set.
|
|
48
|
+
*
|
|
49
|
+
* Handles loading, error, and not-found states automatically.
|
|
50
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
51
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
52
|
+
*/
|
|
53
|
+
export declare function ScheduleDetailView({ org, slug, onNavigateToAgent, onNavigateToExecution, onDeleted, onResourceLoad, now, className, }: ScheduleDetailViewProps): import("react/jsx-runtime").JSX.Element;
|
|
54
|
+
/** Clock-with-arrow icon shared by the schedule views. */
|
|
55
|
+
export declare function ScheduleIcon({ className }: {
|
|
56
|
+
readonly className?: string;
|
|
57
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
//# sourceMappingURL=ScheduleDetailView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleDetailView.d.ts","sourceRoot":"","sources":["../../src/schedule/ScheduleDetailView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uDAAuD,CAAC;AAkBtF,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IACpB,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,IAAI,EACJ,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,GAAG,EACH,SAAS,GACV,EAAE,uBAAuB,2CAqTzB;AAwJD,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAiB1E"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
import { formatRelativeTime } from "../activity/format-relative-time.js";
|
|
7
|
+
import { ErrorMessage } from "../error/ErrorMessage.js";
|
|
8
|
+
import { EditResourceYamlDialog } from "../manifest/EditResourceYamlDialog.js";
|
|
9
|
+
import { ConfirmDialog } from "../resource-detail/ConfirmDialog.js";
|
|
10
|
+
import { ResourceDetailShell } from "../resource-detail/ResourceDetailShell.js";
|
|
11
|
+
import { Section } from "../resource-detail/Section.js";
|
|
12
|
+
import { useConfirmAction } from "../resource-detail/useConfirmAction.js";
|
|
13
|
+
import { useCopyResource } from "../resource-detail/useCopyResource.js";
|
|
14
|
+
import { useDeleteResource } from "../resource-detail/useDeleteResource.js";
|
|
15
|
+
import { useExportResource } from "../library/useExportResource.js";
|
|
16
|
+
import { deriveScheduleState, formatNextFire } from "./scheduleState.js";
|
|
17
|
+
import { useSchedule } from "./useSchedule.js";
|
|
18
|
+
import { useResumeSchedule } from "./useResumeSchedule.js";
|
|
19
|
+
import { useSetScheduleEnabled } from "./useSetScheduleEnabled.js";
|
|
20
|
+
import { useTriggerSchedule } from "./useTriggerSchedule.js";
|
|
21
|
+
/**
|
|
22
|
+
* Self-contained detail view for a Schedule (stigmer/stigmer#352).
|
|
23
|
+
*
|
|
24
|
+
* The view's one non-negotiable is rendering the two stop-levers
|
|
25
|
+
* distinctly, each with its inline remedy:
|
|
26
|
+
*
|
|
27
|
+
* - **Disabled** (owner's `spec.enabled` switch) — banner with an
|
|
28
|
+
* Enable action (a lossless full-proto re-apply).
|
|
29
|
+
* - **Paused** (platform's failure-streak latch,
|
|
30
|
+
* `status.paused_reason`) — banner showing the reason with a Resume
|
|
31
|
+
* action (the one path that clears the pause).
|
|
32
|
+
*
|
|
33
|
+
* Trigger ("Run now") starts a real, billable execution and is gated
|
|
34
|
+
* behind a confirmation; it is disabled while the schedule cannot fire
|
|
35
|
+
* (the banner names the remedy). Edit YAML, Export, and Delete round
|
|
36
|
+
* out the action set.
|
|
37
|
+
*
|
|
38
|
+
* Handles loading, error, and not-found states automatically.
|
|
39
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
40
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
41
|
+
*/
|
|
42
|
+
export function ScheduleDetailView({ org, slug, onNavigateToAgent, onNavigateToExecution, onDeleted, onResourceLoad, now, className, }) {
|
|
43
|
+
const { schedule, isLoading, error, refetch } = useSchedule(org, slug);
|
|
44
|
+
const { resumeSchedule, isResuming } = useResumeSchedule();
|
|
45
|
+
const { triggerSchedule, isTriggering } = useTriggerSchedule();
|
|
46
|
+
const { setEnabled, isPending: isToggling } = useSetScheduleEnabled();
|
|
47
|
+
const { deleteResource, isDeleting } = useDeleteResource("schedule", schedule?.metadata?.id ?? null, schedule?.metadata?.name);
|
|
48
|
+
const { confirmState, confirm, handleConfirm, handleCancel } = useConfirmAction();
|
|
49
|
+
const { copyId, copyQualifiedSlug } = useCopyResource();
|
|
50
|
+
const [editOpen, setEditOpen] = useState(false);
|
|
51
|
+
const { copyYaml, downloadYaml } = useExportResource({
|
|
52
|
+
kind: "Schedule",
|
|
53
|
+
resource: schedule,
|
|
54
|
+
});
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (schedule)
|
|
57
|
+
onResourceLoad?.(schedule);
|
|
58
|
+
}, [schedule, onResourceLoad]);
|
|
59
|
+
if (isLoading)
|
|
60
|
+
return _jsx(LoadingSkeleton, { className: className });
|
|
61
|
+
if (error)
|
|
62
|
+
return _jsx(ErrorMessage, { error: error, retry: refetch, className: className });
|
|
63
|
+
if (!schedule)
|
|
64
|
+
return _jsx(NotFoundState, { className: className });
|
|
65
|
+
const meta = schedule.metadata;
|
|
66
|
+
const spec = schedule.spec;
|
|
67
|
+
const status = schedule.status;
|
|
68
|
+
const specAudit = status?.audit?.specAudit;
|
|
69
|
+
const stateInfo = deriveScheduleState(spec, status);
|
|
70
|
+
const renderNow = now ?? new Date();
|
|
71
|
+
const scheduleId = meta?.id ?? "";
|
|
72
|
+
const target = spec?.target?.case === "agent" ? spec.target.value : undefined;
|
|
73
|
+
const handleResume = async () => {
|
|
74
|
+
await resumeSchedule(scheduleId);
|
|
75
|
+
refetch();
|
|
76
|
+
};
|
|
77
|
+
const handleToggleEnabled = async () => {
|
|
78
|
+
await setEnabled(schedule, !spec?.enabled);
|
|
79
|
+
refetch();
|
|
80
|
+
};
|
|
81
|
+
const handleTrigger = async () => {
|
|
82
|
+
const confirmed = await confirm({
|
|
83
|
+
title: "Run this schedule now?",
|
|
84
|
+
description: "This starts a real agent execution immediately, outside the cron " +
|
|
85
|
+
"cadence. The run appears as the schedule's last execution.",
|
|
86
|
+
confirmLabel: "Start run",
|
|
87
|
+
variant: "default",
|
|
88
|
+
});
|
|
89
|
+
if (!confirmed)
|
|
90
|
+
return;
|
|
91
|
+
await triggerSchedule(scheduleId);
|
|
92
|
+
refetch();
|
|
93
|
+
};
|
|
94
|
+
const handleDelete = async () => {
|
|
95
|
+
const confirmed = await confirm({
|
|
96
|
+
title: "Delete this schedule?",
|
|
97
|
+
description: `"${meta?.name ?? slug}" will stop firing and be permanently ` +
|
|
98
|
+
"removed. Past executions are not affected. This cannot be undone.",
|
|
99
|
+
confirmLabel: "Delete",
|
|
100
|
+
variant: "destructive",
|
|
101
|
+
});
|
|
102
|
+
if (!confirmed)
|
|
103
|
+
return;
|
|
104
|
+
await deleteResource();
|
|
105
|
+
onDeleted?.();
|
|
106
|
+
};
|
|
107
|
+
const primaryAction = {
|
|
108
|
+
id: "trigger",
|
|
109
|
+
label: "Run now",
|
|
110
|
+
onAction: () => void handleTrigger(),
|
|
111
|
+
// A disabled or paused schedule refuses to trigger server-side; the
|
|
112
|
+
// banner above names the remedy, so the button reflects it too
|
|
113
|
+
// (error prevention over error recovery).
|
|
114
|
+
disabled: stateInfo.state !== "active" || isTriggering,
|
|
115
|
+
};
|
|
116
|
+
const actions = [
|
|
117
|
+
...(stateInfo.isPaused
|
|
118
|
+
? [
|
|
119
|
+
{
|
|
120
|
+
id: "resume",
|
|
121
|
+
label: "Resume schedule",
|
|
122
|
+
onAction: () => void handleResume(),
|
|
123
|
+
disabled: isResuming,
|
|
124
|
+
group: "state",
|
|
125
|
+
},
|
|
126
|
+
]
|
|
127
|
+
: []),
|
|
128
|
+
{
|
|
129
|
+
id: "toggle-enabled",
|
|
130
|
+
label: spec?.enabled ? "Disable schedule" : "Enable schedule",
|
|
131
|
+
onAction: () => void handleToggleEnabled(),
|
|
132
|
+
disabled: isToggling,
|
|
133
|
+
group: "state",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: "copy-id",
|
|
137
|
+
label: "Copy ID",
|
|
138
|
+
onAction: () => void copyId(scheduleId),
|
|
139
|
+
group: "clipboard",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: "copy-slug",
|
|
143
|
+
label: "Copy slug",
|
|
144
|
+
onAction: () => void copyQualifiedSlug(org, slug),
|
|
145
|
+
group: "clipboard",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "edit-yaml",
|
|
149
|
+
label: "Edit YAML",
|
|
150
|
+
onAction: () => setEditOpen(true),
|
|
151
|
+
group: "edit",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "copy-yaml",
|
|
155
|
+
label: "Copy YAML",
|
|
156
|
+
onAction: () => void copyYaml(),
|
|
157
|
+
group: "export",
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: "download-yaml",
|
|
161
|
+
label: "Download YAML",
|
|
162
|
+
onAction: downloadYaml,
|
|
163
|
+
group: "export",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: "delete",
|
|
167
|
+
label: "Delete",
|
|
168
|
+
variant: "destructive",
|
|
169
|
+
onAction: () => void handleDelete(),
|
|
170
|
+
disabled: isDeleting,
|
|
171
|
+
group: "danger",
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
const headerMeta = {
|
|
175
|
+
name: meta?.name || meta?.slug || "Untitled",
|
|
176
|
+
id: scheduleId,
|
|
177
|
+
org: meta?.org,
|
|
178
|
+
slug: meta?.slug,
|
|
179
|
+
icon: _jsx(ScheduleIcon, { className: "size-6 text-muted-foreground" }),
|
|
180
|
+
createdAt: specAudit?.createdAt ? timestampDate(specAudit.createdAt) : null,
|
|
181
|
+
updatedAt: specAudit?.updatedAt ? timestampDate(specAudit.updatedAt) : null,
|
|
182
|
+
status: stateInfo.phase,
|
|
183
|
+
statusLabel: stateInfo.label,
|
|
184
|
+
};
|
|
185
|
+
const headerBanner = stateInfo.state === "disabled" ? (_jsxs(StateBanner, { title: "Schedule is disabled", onAction: () => void handleToggleEnabled(), actionLabel: "Enable schedule", actionBusy: isToggling, children: ["The owner switch (", _jsx("code", { className: "font-mono", children: "spec.enabled" }), ") is off \u2014 this schedule will not fire.", stateInfo.isPaused && (_jsxs(_Fragment, { children: [" ", "It is also paused by the platform (", status?.pausedReason, "); after enabling, use Resume to clear the pause."] }))] })) : stateInfo.state === "paused" ? (_jsxs(StateBanner, { title: "Paused by the platform", onAction: () => void handleResume(), actionLabel: "Resume schedule", actionBusy: isResuming, children: [status?.pausedReason, " \u2014 resuming clears the pause and the failure streak. Re-applying the manifest does not."] })) : undefined;
|
|
186
|
+
return (_jsxs(_Fragment, { children: [_jsx(ResourceDetailShell, { header: headerMeta, headerBanner: headerBanner, primaryAction: primaryAction, actions: actions, className: className, children: _jsxs("div", { className: "flex flex-col gap-6", children: [_jsx(Section, { title: "Definition", children: _jsxs("dl", { className: "divide-y divide-border", children: [_jsx(DetailRow, { label: "Cron", children: _jsx("code", { className: "font-mono text-sm text-foreground", children: spec?.cron || "—" }) }), _jsx(DetailRow, { label: "Time zone", children: _jsx("span", { className: "text-sm text-foreground", children: spec?.timeZone || "—" }) }), _jsx(DetailRow, { label: "Target agent", children: target?.agentRef ? (_jsx(ReferenceLink, { label: `${target.agentRef.org}/${target.agentRef.slug}`, onNavigate: onNavigateToAgent
|
|
187
|
+
? () => onNavigateToAgent(target.agentRef.org, target.agentRef.slug)
|
|
188
|
+
: undefined })) : (_jsx("span", { className: "text-sm text-muted-foreground", children: "\u2014" })) }), _jsx(DetailRow, { label: "Message", children: _jsx("p", { className: "whitespace-pre-wrap break-words text-sm text-foreground", children: target?.message || "—" }) })] }) }), _jsx(Section, { title: "Status", children: _jsxs("dl", { className: "divide-y divide-border", children: [_jsx(DetailRow, { label: "Next fire", children: _jsx("span", { className: "text-sm text-foreground", children: stateInfo.state === "active" && status?.nextFireAt
|
|
189
|
+
? formatNextFire(timestampDate(status.nextFireAt), renderNow)
|
|
190
|
+
: "—" }) }), _jsx(DetailRow, { label: "Last fired", children: _jsx("span", { className: "text-sm text-foreground", children: status?.lastFireAt
|
|
191
|
+
? formatRelativeTime(timestampDate(status.lastFireAt), renderNow)
|
|
192
|
+
: "Never" }) }), _jsx(DetailRow, { label: "Last execution", children: status?.lastExecutionId ? (_jsx(ReferenceLink, { label: status.lastExecutionId, mono: true, onNavigate: onNavigateToExecution
|
|
193
|
+
? () => onNavigateToExecution(status.lastExecutionId)
|
|
194
|
+
: undefined })) : (_jsx("span", { className: "text-sm text-muted-foreground", children: "\u2014" })) }), _jsx(DetailRow, { label: "Consecutive failures", children: _jsx("span", { className: cn("text-sm", (status?.consecutiveFailures ?? 0) > 0
|
|
195
|
+
? "font-medium text-warning"
|
|
196
|
+
: "text-foreground"), children: status?.consecutiveFailures ?? 0 }) })] }) })] }) }), _jsx(ConfirmDialog, { state: confirmState, onConfirm: handleConfirm, onCancel: handleCancel }), editOpen && (_jsx(EditResourceYamlDialog, { open: editOpen, onOpenChange: setEditOpen, resource: schedule, onApplied: () => refetch() }))] }));
|
|
197
|
+
}
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// State banner — one lever, one remedy, inline
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
function StateBanner({ title, children, actionLabel, onAction, actionBusy, }) {
|
|
202
|
+
return (_jsxs("div", { role: "status", className: "flex items-start gap-2.5 rounded-lg border border-warning/30 bg-warning/5 px-4 py-3", children: [_jsx(WarningIcon, { className: "mt-0.5 size-4 shrink-0 text-warning" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: title }), _jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: children })] }), _jsx("button", { type: "button", onClick: onAction, disabled: actionBusy, className: cn("shrink-0 rounded-md border border-input bg-background px-3 py-1.5 text-xs font-medium text-foreground", "hover:bg-accent hover:text-accent-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50"), children: actionLabel })] }));
|
|
203
|
+
}
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// Detail rows and references
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
function DetailRow({ label, children, }) {
|
|
208
|
+
return (_jsxs("div", { className: "flex items-start gap-4 px-4 py-2.5", children: [_jsx("dt", { className: "w-40 shrink-0 pt-0.5 text-xs font-medium text-muted-foreground", children: label }), _jsx("dd", { className: "min-w-0 flex-1", children: children })] }));
|
|
209
|
+
}
|
|
210
|
+
function ReferenceLink({ label, onNavigate, mono, }) {
|
|
211
|
+
const textClass = cn("text-sm", mono && "font-mono text-xs");
|
|
212
|
+
if (!onNavigate) {
|
|
213
|
+
return _jsx("span", { className: cn(textClass, "text-foreground"), children: label });
|
|
214
|
+
}
|
|
215
|
+
return (_jsx("button", { type: "button", onClick: onNavigate, className: cn(textClass, "text-primary underline-offset-2 hover:underline", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"), children: label }));
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Non-happy states
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
function LoadingSkeleton({ className }) {
|
|
221
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-6", className), "aria-busy": "true", "aria-label": "Loading schedule details", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1 size-6 shrink-0 animate-pulse rounded bg-muted" }), _jsxs("div", { className: "flex-1 space-y-2", children: [_jsx("div", { className: "h-5 w-48 animate-pulse rounded bg-muted" }), _jsx("div", { className: "h-3 w-64 animate-pulse rounded bg-muted" })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "h-3 w-28 animate-pulse rounded bg-muted" }), _jsx("div", { className: "animate-pulse rounded-lg border border-border bg-muted-faint", style: { height: "160px" } })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "h-3 w-20 animate-pulse rounded bg-muted" }), _jsx("div", { className: "animate-pulse rounded-lg border border-border bg-muted-faint", style: { height: "160px" } })] })] }));
|
|
222
|
+
}
|
|
223
|
+
function NotFoundState({ className }) {
|
|
224
|
+
return (_jsxs("div", { role: "status", className: cn("flex flex-col items-center gap-2 py-12 text-center", className), children: [_jsx(ScheduleIcon, { className: "size-10 text-muted-foreground-faint" }), _jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Schedule not found" }), _jsx("p", { className: "text-xs text-muted-foreground-subtle", children: "This schedule doesn't exist or you don't have access to it." })] }));
|
|
225
|
+
}
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// Icons (inline SVG — no icon-library dependency)
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
/** Clock-with-arrow icon shared by the schedule views. */
|
|
230
|
+
export function ScheduleIcon({ className }) {
|
|
231
|
+
return (_jsxs("svg", { className: className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M21 12a9 9 0 1 1-2.64-6.36" }), _jsx("path", { d: "M21 3v5h-5" }), _jsx("path", { d: "M12 7v5l3 3" })] }));
|
|
232
|
+
}
|
|
233
|
+
function WarningIcon({ className }) {
|
|
234
|
+
return (_jsxs("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M8 1.5 15 14H1L8 1.5Z" }), _jsx("path", { d: "M8 6v4" }), _jsx("path", { d: "M8 12.2v.05" })] }));
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=ScheduleDetailView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleDetailView.js","sourceRoot":"","sources":["../../src/schedule/ScheduleDetailView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Schedule } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/api_pb";
|
|
2
|
+
/** Props for {@link ScheduleForm}. */
|
|
3
|
+
export interface ScheduleFormProps {
|
|
4
|
+
/**
|
|
5
|
+
* Organization slug. Schedules are org-local: the server requires the
|
|
6
|
+
* target agent to live in this same org, so the agent picker is
|
|
7
|
+
* locked to org scope.
|
|
8
|
+
*/
|
|
9
|
+
readonly org: string;
|
|
10
|
+
/** Fired with the created schedule after a successful submit. */
|
|
11
|
+
readonly onComplete?: (schedule: Schedule) => void;
|
|
12
|
+
/** Fired when the user cancels. */
|
|
13
|
+
readonly onCancel?: () => void;
|
|
14
|
+
/** Additional CSS class names for the root form element. */
|
|
15
|
+
readonly className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Single-page form for creating a {@link Schedule}.
|
|
19
|
+
*
|
|
20
|
+
* Collects the four things a user decides about a schedule — which
|
|
21
|
+
* agent, what message, when ({@link CadenceField}, generating the cron
|
|
22
|
+
* expression from human-friendly presets), and whether it starts
|
|
23
|
+
* enabled — then creates it via {@link useCreateSchedule}.
|
|
24
|
+
*
|
|
25
|
+
* Enabled defaults to OFF, deliberately: it matches the proto/YAML
|
|
26
|
+
* default (an omitted `enabled` is false) and the platform's
|
|
27
|
+
* recommended workflow — create staged-disabled, validate with
|
|
28
|
+
* "Run now" on the detail page, then enable.
|
|
29
|
+
*
|
|
30
|
+
* Creation only. Editing an existing schedule must not flow through
|
|
31
|
+
* this form's curated input — see the note on {@link useCreateSchedule}.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <ScheduleForm
|
|
36
|
+
* org="acme"
|
|
37
|
+
* onComplete={(s) => navigate(`/library/schedules/${s.metadata?.org}/${s.metadata?.slug}`)}
|
|
38
|
+
* onCancel={() => navigate("/library/schedules")}
|
|
39
|
+
* />
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function ScheduleForm({ org, onComplete, onCancel, className, }: ScheduleFormProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
//# sourceMappingURL=ScheduleForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScheduleForm.d.ts","sourceRoot":"","sources":["../../src/schedule/ScheduleForm.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uDAAuD,CAAC;AActF,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnD,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAOD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,GAAG,EACH,UAAU,EACV,QAAQ,EACR,SAAS,GACV,EAAE,iBAAiB,2CAkPnB"}
|