@stigmer/react 3.5.3 → 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/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,242 @@
|
|
|
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
|
+
/** Day-of-week labels indexed by cron numbering (0 = Sunday). */
|
|
22
|
+
export const WEEKDAY_LABELS = [
|
|
23
|
+
"Sunday",
|
|
24
|
+
"Monday",
|
|
25
|
+
"Tuesday",
|
|
26
|
+
"Wednesday",
|
|
27
|
+
"Thursday",
|
|
28
|
+
"Friday",
|
|
29
|
+
"Saturday",
|
|
30
|
+
];
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Preset → cron
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
/**
|
|
35
|
+
* Build the 5-field cron expression for a preset.
|
|
36
|
+
*
|
|
37
|
+
* Output is always valid by construction: numeric fields only,
|
|
38
|
+
* day-of-week in cron numbering (0 = Sunday). For `custom`, the raw
|
|
39
|
+
* string is returned as-is — validate it with {@link validateCron}.
|
|
40
|
+
*/
|
|
41
|
+
export function cadenceToCron(preset) {
|
|
42
|
+
switch (preset.kind) {
|
|
43
|
+
case "hourly":
|
|
44
|
+
return `${preset.minute} * * * *`;
|
|
45
|
+
case "daily":
|
|
46
|
+
return `${preset.minute} ${preset.hour} * * *`;
|
|
47
|
+
case "weekly": {
|
|
48
|
+
// Sorted, deduplicated day list keeps the output canonical so
|
|
49
|
+
// cronToCadence round-trips regardless of selection order.
|
|
50
|
+
const days = [...new Set(preset.days)].sort((a, b) => a - b);
|
|
51
|
+
return `${preset.minute} ${preset.hour} * * ${days.join(",")}`;
|
|
52
|
+
}
|
|
53
|
+
case "monthly":
|
|
54
|
+
return `${preset.minute} ${preset.hour} ${preset.day} * *`;
|
|
55
|
+
case "custom":
|
|
56
|
+
return preset.cron;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Cron → preset (recognition, not parsing)
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
const HOURLY_RE = /^(\d{1,2}) \* \* \* \*$/;
|
|
63
|
+
const DAILY_RE = /^(\d{1,2}) (\d{1,2}) \* \* \*$/;
|
|
64
|
+
const WEEKLY_RE = /^(\d{1,2}) (\d{1,2}) \* \* (\d(?:,\d)*)$/;
|
|
65
|
+
const MONTHLY_RE = /^(\d{1,2}) (\d{1,2}) (\d{1,2}) \* \*$/;
|
|
66
|
+
/**
|
|
67
|
+
* Recognize a cron expression as one of the builder's presets.
|
|
68
|
+
*
|
|
69
|
+
* Only the exact shapes {@link cadenceToCron} emits (plus the
|
|
70
|
+
* calendar shorthands `@hourly`/`@daily`/`@weekly`/`@monthly`) map to a
|
|
71
|
+
* structured preset. Everything else — ranges, steps, names, `@yearly`
|
|
72
|
+
* — is a perfectly valid schedule that this UI simply cannot decompose,
|
|
73
|
+
* so it round-trips as `custom` with the raw string intact.
|
|
74
|
+
*/
|
|
75
|
+
export function cronToCadence(cron) {
|
|
76
|
+
const normalized = cron.trim().replace(/\s+/g, " ");
|
|
77
|
+
switch (normalized) {
|
|
78
|
+
case "@hourly":
|
|
79
|
+
return { kind: "hourly", minute: 0 };
|
|
80
|
+
case "@daily":
|
|
81
|
+
return { kind: "daily", hour: 0, minute: 0 };
|
|
82
|
+
case "@weekly":
|
|
83
|
+
return { kind: "weekly", days: [0], hour: 0, minute: 0 };
|
|
84
|
+
case "@monthly":
|
|
85
|
+
return { kind: "monthly", day: 1, hour: 0, minute: 0 };
|
|
86
|
+
}
|
|
87
|
+
let m = HOURLY_RE.exec(normalized);
|
|
88
|
+
if (m) {
|
|
89
|
+
const minute = Number(m[1]);
|
|
90
|
+
if (isMinute(minute))
|
|
91
|
+
return { kind: "hourly", minute };
|
|
92
|
+
}
|
|
93
|
+
m = DAILY_RE.exec(normalized);
|
|
94
|
+
if (m) {
|
|
95
|
+
const minute = Number(m[1]);
|
|
96
|
+
const hour = Number(m[2]);
|
|
97
|
+
if (isMinute(minute) && isHour(hour))
|
|
98
|
+
return { kind: "daily", hour, minute };
|
|
99
|
+
}
|
|
100
|
+
m = WEEKLY_RE.exec(normalized);
|
|
101
|
+
if (m) {
|
|
102
|
+
const minute = Number(m[1]);
|
|
103
|
+
const hour = Number(m[2]);
|
|
104
|
+
const days = m[3].split(",").map(Number);
|
|
105
|
+
if (isMinute(minute) &&
|
|
106
|
+
isHour(hour) &&
|
|
107
|
+
days.length > 0 &&
|
|
108
|
+
days.every((d) => d >= 0 && d <= 6) &&
|
|
109
|
+
new Set(days).size === days.length) {
|
|
110
|
+
return { kind: "weekly", days: [...days].sort((a, b) => a - b), hour, minute };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
m = MONTHLY_RE.exec(normalized);
|
|
114
|
+
if (m) {
|
|
115
|
+
const minute = Number(m[1]);
|
|
116
|
+
const hour = Number(m[2]);
|
|
117
|
+
const day = Number(m[3]);
|
|
118
|
+
if (isMinute(minute) && isHour(hour) && day >= 1 && day <= 31) {
|
|
119
|
+
return { kind: "monthly", day, hour, minute };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { kind: "custom", cron };
|
|
123
|
+
}
|
|
124
|
+
function isMinute(n) {
|
|
125
|
+
return Number.isInteger(n) && n >= 0 && n <= 59;
|
|
126
|
+
}
|
|
127
|
+
function isHour(n) {
|
|
128
|
+
return Number.isInteger(n) && n >= 0 && n <= 23;
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Plain-English summary
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Human-readable summary of a cadence, e.g.
|
|
135
|
+
* `"Every day at 09:00 (Asia/Kolkata)"`.
|
|
136
|
+
*
|
|
137
|
+
* This is a description of the chosen preset, not a computed fire-time
|
|
138
|
+
* forecast — the platform's next fire time is published by the server
|
|
139
|
+
* as `status.next_fire_at` after apply.
|
|
140
|
+
*/
|
|
141
|
+
export function describeCadence(preset, timeZone) {
|
|
142
|
+
const zone = timeZone ? ` (${timeZone})` : "";
|
|
143
|
+
switch (preset.kind) {
|
|
144
|
+
case "hourly":
|
|
145
|
+
return `Every hour at minute ${preset.minute}${zone}`;
|
|
146
|
+
case "daily":
|
|
147
|
+
return `Every day at ${formatTime(preset.hour, preset.minute)}${zone}`;
|
|
148
|
+
case "weekly": {
|
|
149
|
+
const days = [...new Set(preset.days)].sort((a, b) => a - b);
|
|
150
|
+
const names = days.length === 7
|
|
151
|
+
? "day"
|
|
152
|
+
: listWithAnd(days.map((d) => WEEKDAY_LABELS[d]));
|
|
153
|
+
return `Every ${names} at ${formatTime(preset.hour, preset.minute)}${zone}`;
|
|
154
|
+
}
|
|
155
|
+
case "monthly":
|
|
156
|
+
return `On day ${preset.day} of every month at ${formatTime(preset.hour, preset.minute)}${zone}`;
|
|
157
|
+
case "custom":
|
|
158
|
+
return `Cron “${preset.cron.trim()}”${zone}`;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** `9, 5` → `"09:05"` (24-hour clock, zero-padded). */
|
|
162
|
+
export function formatTime(hour, minute) {
|
|
163
|
+
return `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
|
|
164
|
+
}
|
|
165
|
+
function listWithAnd(items) {
|
|
166
|
+
if (items.length === 1)
|
|
167
|
+
return items[0];
|
|
168
|
+
return `${items.slice(0, -1).join(", ")} and ${items[items.length - 1]}`;
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Lexical validation — mirrors stigmer-server schedule/controller/cron.go
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// The accepted @-shorthands, the field character set, the rejection
|
|
174
|
+
// cases AND the message wording below mirror the server byte-for-byte
|
|
175
|
+
// (Go: cron.go / cron_test.go; Java: ValidateScheduleSpec). A change on
|
|
176
|
+
// any side must change all three, or the instant client feedback drifts
|
|
177
|
+
// from what the server enforces on submit.
|
|
178
|
+
const CRON_SHORTHANDS = new Set([
|
|
179
|
+
"@hourly",
|
|
180
|
+
"@daily",
|
|
181
|
+
"@weekly",
|
|
182
|
+
"@monthly",
|
|
183
|
+
"@yearly",
|
|
184
|
+
]);
|
|
185
|
+
const CRON_FIELD_PATTERN = /^[0-9A-Za-z*,/-]+$/;
|
|
186
|
+
/**
|
|
187
|
+
* Validate a cron expression against the platform's lexical grammar.
|
|
188
|
+
*
|
|
189
|
+
* Returns the user-facing error message (identical wording to the
|
|
190
|
+
* server's) or `null` when the expression is acceptable. Purely
|
|
191
|
+
* lexical — it does not evaluate calendar semantics.
|
|
192
|
+
*/
|
|
193
|
+
export function validateCron(cron) {
|
|
194
|
+
if (cron.startsWith("CRON_TZ=") || cron.startsWith("TZ=")) {
|
|
195
|
+
return "spec.cron must not carry a timezone prefix (CRON_TZ=/TZ=) — spec.time_zone is the single timezone authority";
|
|
196
|
+
}
|
|
197
|
+
if (cron.includes("#")) {
|
|
198
|
+
return "spec.cron must not contain a comment (#)";
|
|
199
|
+
}
|
|
200
|
+
if (cron.startsWith("@")) {
|
|
201
|
+
if (cron.startsWith("@every")) {
|
|
202
|
+
return "spec.cron must be a calendar expression — @every intervals are not supported";
|
|
203
|
+
}
|
|
204
|
+
if (!CRON_SHORTHANDS.has(cron)) {
|
|
205
|
+
return `spec.cron shorthand "${cron}" is not supported — use @hourly, @daily, @weekly, @monthly, or @yearly, or a 5-field cron expression`;
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
// Matches Go's strings.Fields: split on runs of whitespace, so
|
|
210
|
+
// surrounding/duplicate whitespace never produces empty fields.
|
|
211
|
+
const fields = cron.split(/\s+/).filter((f) => f.length > 0);
|
|
212
|
+
if (fields.length !== 5) {
|
|
213
|
+
return `spec.cron must have exactly 5 fields (minute hour day-of-month month day-of-week); got ${fields.length}`;
|
|
214
|
+
}
|
|
215
|
+
for (const field of fields) {
|
|
216
|
+
if (!CRON_FIELD_PATTERN.test(field)) {
|
|
217
|
+
return `spec.cron field "${field}" contains unsupported characters — allowed: digits, names, '*', ',', '-', '/'`;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Validate an IANA time zone name using the runtime's own tz database
|
|
224
|
+
* (`Intl`), mirroring the server's check against the platform tz
|
|
225
|
+
* database. Returns the user-facing error message or `null`.
|
|
226
|
+
*
|
|
227
|
+
* `"Local"` is rejected explicitly for the same reason the server
|
|
228
|
+
* rejects it: it is host-dependent, not a zone.
|
|
229
|
+
*/
|
|
230
|
+
export function validateTimeZone(timeZone) {
|
|
231
|
+
const invalid = `spec.time_zone "${timeZone}" is not a valid IANA time zone (e.g. "Asia/Kolkata")`;
|
|
232
|
+
if (timeZone === "Local")
|
|
233
|
+
return invalid;
|
|
234
|
+
try {
|
|
235
|
+
new Intl.DateTimeFormat("en-US", { timeZone });
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return invalid;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=cadence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cadence.js","sourceRoot":"","sources":["../../src/schedule/cadence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export { deriveScheduleState, formatNextFire } from "./scheduleState.js";
|
|
2
|
+
export type { ScheduleState, ScheduleStateInfo } from "./scheduleState.js";
|
|
3
|
+
export { createScheduleListFn, listSchedulesPage } from "./scheduleListFn.js";
|
|
4
|
+
export type { ScheduleListClient, SchedulePage } from "./scheduleListFn.js";
|
|
5
|
+
export { useSchedule } from "./useSchedule.js";
|
|
6
|
+
export type { UseScheduleReturn } from "./useSchedule.js";
|
|
7
|
+
export { useScheduleList } from "./useScheduleList.js";
|
|
8
|
+
export type { UseScheduleListOptions, UseScheduleListReturn, } from "./useScheduleList.js";
|
|
9
|
+
export { useScheduleCount } from "./useScheduleCount.js";
|
|
10
|
+
export type { UseScheduleCountOptions, UseScheduleCountReturn, } from "./useScheduleCount.js";
|
|
11
|
+
export { useResumeSchedule } from "./useResumeSchedule.js";
|
|
12
|
+
export type { UseResumeScheduleReturn } from "./useResumeSchedule.js";
|
|
13
|
+
export { useTriggerSchedule } from "./useTriggerSchedule.js";
|
|
14
|
+
export type { UseTriggerScheduleReturn } from "./useTriggerSchedule.js";
|
|
15
|
+
export { useSetScheduleEnabled } from "./useSetScheduleEnabled.js";
|
|
16
|
+
export type { UseSetScheduleEnabledReturn } from "./useSetScheduleEnabled.js";
|
|
17
|
+
export { createScheduleColumns } from "./scheduleColumns.js";
|
|
18
|
+
export type { ScheduleColumnsOptions } from "./scheduleColumns.js";
|
|
19
|
+
export { ScheduleRowActions } from "./ScheduleRowActions.js";
|
|
20
|
+
export type { ScheduleRowActionsProps } from "./ScheduleRowActions.js";
|
|
21
|
+
export { ScheduleDetailView, ScheduleIcon } from "./ScheduleDetailView.js";
|
|
22
|
+
export type { ScheduleDetailViewProps } from "./ScheduleDetailView.js";
|
|
23
|
+
export { cadenceToCron, cronToCadence, describeCadence, validateCron, validateTimeZone, WEEKDAY_LABELS, } from "./cadence.js";
|
|
24
|
+
export type { CadencePreset, CadenceKind } from "./cadence.js";
|
|
25
|
+
export { useCreateSchedule } from "./useCreateSchedule.js";
|
|
26
|
+
export type { UseCreateScheduleReturn } from "./useCreateSchedule.js";
|
|
27
|
+
export { CadenceField } from "./CadenceField.js";
|
|
28
|
+
export type { CadenceFieldProps } from "./CadenceField.js";
|
|
29
|
+
export { ScheduleForm } from "./ScheduleForm.js";
|
|
30
|
+
export type { ScheduleFormProps } from "./ScheduleForm.js";
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schedule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAE9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { deriveScheduleState, formatNextFire } from "./scheduleState.js";
|
|
2
|
+
export { createScheduleListFn, listSchedulesPage } from "./scheduleListFn.js";
|
|
3
|
+
export { useSchedule } from "./useSchedule.js";
|
|
4
|
+
export { useScheduleList } from "./useScheduleList.js";
|
|
5
|
+
export { useScheduleCount } from "./useScheduleCount.js";
|
|
6
|
+
export { useResumeSchedule } from "./useResumeSchedule.js";
|
|
7
|
+
export { useTriggerSchedule } from "./useTriggerSchedule.js";
|
|
8
|
+
export { useSetScheduleEnabled } from "./useSetScheduleEnabled.js";
|
|
9
|
+
export { createScheduleColumns } from "./scheduleColumns.js";
|
|
10
|
+
export { ScheduleRowActions } from "./ScheduleRowActions.js";
|
|
11
|
+
export { ScheduleDetailView, ScheduleIcon } from "./ScheduleDetailView.js";
|
|
12
|
+
export { cadenceToCron, cronToCadence, describeCadence, validateCron, validateTimeZone, WEEKDAY_LABELS, } from "./cadence.js";
|
|
13
|
+
export { useCreateSchedule } from "./useCreateSchedule.js";
|
|
14
|
+
export { CadenceField } from "./CadenceField.js";
|
|
15
|
+
export { ScheduleForm } from "./ScheduleForm.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schedule/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG3E,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Schedule } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/api_pb";
|
|
2
|
+
import type { WorkbenchColumnDef } from "../resource-workbench/types.js";
|
|
3
|
+
/** Options for {@link createScheduleColumns}. */
|
|
4
|
+
export interface ScheduleColumnsOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Clock provider for the "next fire" and "last run" columns.
|
|
7
|
+
* Injectable for deterministic tests and Scenar fixtures.
|
|
8
|
+
* @default () => new Date()
|
|
9
|
+
*/
|
|
10
|
+
readonly now?: () => Date;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Column set for a schedule workbench — shared by every console so the
|
|
14
|
+
* list renders identically everywhere (DD-016).
|
|
15
|
+
*
|
|
16
|
+
* The columns exist because schedules are listed via the direct query:
|
|
17
|
+
* each row is a full `Schedule` proto, so the operational fields the
|
|
18
|
+
* issue calls for (next fire, last run, enabled/paused state) render
|
|
19
|
+
* straight from the row — no generic `SearchResult` limitations.
|
|
20
|
+
*
|
|
21
|
+
* Columns are not sortable: the direct query has one fixed server-side
|
|
22
|
+
* order (newest first), and a sort affordance that silently does
|
|
23
|
+
* nothing would lie.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createScheduleColumns(options?: ScheduleColumnsOptions): WorkbenchColumnDef<Schedule>[];
|
|
26
|
+
//# sourceMappingURL=scheduleColumns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduleColumns.d.ts","sourceRoot":"","sources":["../../src/schedule/scheduleColumns.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uDAAuD,CAAC;AAGtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAmFhC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
4
|
+
import { formatRelativeTime } from "../activity/format-relative-time.js";
|
|
5
|
+
import { StatusBadge } from "../resource-workbench/components/StatusBadge.js";
|
|
6
|
+
import { deriveScheduleState, formatNextFire } from "./scheduleState.js";
|
|
7
|
+
/**
|
|
8
|
+
* Column set for a schedule workbench — shared by every console so the
|
|
9
|
+
* list renders identically everywhere (DD-016).
|
|
10
|
+
*
|
|
11
|
+
* The columns exist because schedules are listed via the direct query:
|
|
12
|
+
* each row is a full `Schedule` proto, so the operational fields the
|
|
13
|
+
* issue calls for (next fire, last run, enabled/paused state) render
|
|
14
|
+
* straight from the row — no generic `SearchResult` limitations.
|
|
15
|
+
*
|
|
16
|
+
* Columns are not sortable: the direct query has one fixed server-side
|
|
17
|
+
* order (newest first), and a sort affordance that silently does
|
|
18
|
+
* nothing would lie.
|
|
19
|
+
*/
|
|
20
|
+
export function createScheduleColumns(options) {
|
|
21
|
+
const now = options?.now ?? (() => new Date());
|
|
22
|
+
return [
|
|
23
|
+
{
|
|
24
|
+
id: "name",
|
|
25
|
+
header: "Name",
|
|
26
|
+
cell: (item) => (_jsx("span", { className: "font-medium text-foreground", children: item.metadata?.name || item.metadata?.slug })),
|
|
27
|
+
flex: 2,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "state",
|
|
31
|
+
header: "State",
|
|
32
|
+
cell: (item) => {
|
|
33
|
+
const info = deriveScheduleState(item.spec, item.status);
|
|
34
|
+
return _jsx(StatusBadge, { phase: info.phase, label: info.label });
|
|
35
|
+
},
|
|
36
|
+
flex: 1,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "cron",
|
|
40
|
+
header: "Cadence",
|
|
41
|
+
cell: (item) => (_jsxs("span", { className: "inline-flex items-baseline gap-1.5", children: [_jsx("code", { className: "font-mono text-xs text-foreground", children: item.spec?.cron || "—" }), _jsx("span", { className: "text-xs text-muted-foreground", children: item.spec?.timeZone })] })),
|
|
42
|
+
flex: 1.5,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "next-fire",
|
|
46
|
+
header: "Next fire",
|
|
47
|
+
cell: (item) => {
|
|
48
|
+
const info = deriveScheduleState(item.spec, item.status);
|
|
49
|
+
const nextFireAt = item.status?.nextFireAt;
|
|
50
|
+
return (_jsx("span", { className: "text-muted-foreground", children: info.state === "active" && nextFireAt
|
|
51
|
+
? formatNextFire(timestampDate(nextFireAt), now())
|
|
52
|
+
: "—" }));
|
|
53
|
+
},
|
|
54
|
+
flex: 1,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "last-run",
|
|
58
|
+
header: "Last run",
|
|
59
|
+
cell: (item) => (_jsx("span", { className: "text-muted-foreground", children: item.status?.lastFireAt
|
|
60
|
+
? formatRelativeTime(timestampDate(item.status.lastFireAt), now())
|
|
61
|
+
: "Never" })),
|
|
62
|
+
flex: 1,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "target",
|
|
66
|
+
header: "Target agent",
|
|
67
|
+
cell: (item) => {
|
|
68
|
+
const target = item.spec?.target?.case === "agent" ? item.spec.target.value : undefined;
|
|
69
|
+
return (_jsx("span", { className: "text-muted-foreground", children: target?.agentRef
|
|
70
|
+
? `${target.agentRef.org}/${target.agentRef.slug}`
|
|
71
|
+
: "—" }));
|
|
72
|
+
},
|
|
73
|
+
flex: 1.5,
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=scheduleColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduleColumns.js","sourceRoot":"","sources":["../../src/schedule/scheduleColumns.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Schedule } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/api_pb";
|
|
2
|
+
import { type ListSchedulesRequest, type ScheduleList } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/io_pb";
|
|
3
|
+
import type { ListParams, ListResult } from "@stigmer/sdk";
|
|
4
|
+
/** The slice of the Stigmer client this module needs (mockable in tests). */
|
|
5
|
+
export interface ScheduleListClient {
|
|
6
|
+
readonly schedule: {
|
|
7
|
+
list(input: ListSchedulesRequest): Promise<ScheduleList>;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
/** One page of schedules, with pagination totals. */
|
|
11
|
+
export interface SchedulePage {
|
|
12
|
+
/** Full `Schedule` protos (spec + status) for the requested page. */
|
|
13
|
+
readonly items: readonly Schedule[];
|
|
14
|
+
/** Total schedules in the org (across all pages). */
|
|
15
|
+
readonly totalCount: number;
|
|
16
|
+
/** Total pages at the requested page size. */
|
|
17
|
+
readonly totalPages: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetch one page of an organization's schedules via the direct query.
|
|
21
|
+
*
|
|
22
|
+
* Handles a verified split between the two server editions: cloud slices
|
|
23
|
+
* pages server-side, while the OSS server documents that it ignores
|
|
24
|
+
* `page_info` and returns every matching schedule. A server that
|
|
25
|
+
* paginated can never return more rows than the requested size, so an
|
|
26
|
+
* overflowing response is the tell that the server ignored pagination —
|
|
27
|
+
* only then is the page sliced locally (absolute indices into the full
|
|
28
|
+
* list). A cloud page passes through untouched.
|
|
29
|
+
*/
|
|
30
|
+
export declare function listSchedulesPage(client: ScheduleListClient, org: string, page?: {
|
|
31
|
+
readonly num?: number;
|
|
32
|
+
readonly size?: number;
|
|
33
|
+
}): Promise<SchedulePage>;
|
|
34
|
+
/**
|
|
35
|
+
* Build a `ResourceWorkbench`-compatible `listFn` over the direct
|
|
36
|
+
* schedule query.
|
|
37
|
+
*
|
|
38
|
+
* The returned entries are full `Schedule` protos occupying the
|
|
39
|
+
* `SearchResult` slot of `ListResult` — `ResourceWorkbench` is generic
|
|
40
|
+
* over its row type (`useResourceCollection` casts entries through to
|
|
41
|
+
* `TData`), and this is the one documented place where that cast
|
|
42
|
+
* happens. Consumers type their workbench as
|
|
43
|
+
* `ResourceWorkbench<Schedule>` and pass `getItemId={(s) => s.metadata?.id}`.
|
|
44
|
+
*
|
|
45
|
+
* `params.query` and `params.crossOrgPublic` are ignored: schedules have
|
|
46
|
+
* no server-side text search (render the workbench with
|
|
47
|
+
* `searchable={false}`) and are never public/cross-org.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createScheduleListFn(client: ScheduleListClient): (params: ListParams) => Promise<ListResult>;
|
|
50
|
+
//# sourceMappingURL=scheduleListFn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduleListFn.d.ts","sourceRoot":"","sources":["../../src/schedule/scheduleListFn.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uDAAuD,CAAC;AACtF,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAClB,MAAM,sDAAsD,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE;QACjB,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;KAC1D,CAAC;CACH;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,qDAAqD;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3D,OAAO,CAAC,YAAY,CAAC,CAqBvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,GACzB,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAa7C"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Schedule list fetching — the direct-query core plus the workbench adapter.
|
|
2
|
+
//
|
|
3
|
+
// Schedules are the one Library kind NOT backed by the search service: the
|
|
4
|
+
// generic `SearchResult` summary cannot carry the operational fields a
|
|
5
|
+
// schedule list exists to show (`next_fire_at`, enabled/paused state, last
|
|
6
|
+
// run), while the direct `listSchedules` query returns full `Schedule`
|
|
7
|
+
// protos and was explicitly shaped for "the org-context view a console tab
|
|
8
|
+
// needs". Both consoles consume this single implementation — inlining it
|
|
9
|
+
// per-app would duplicate correctness-bearing pagination logic (DD-016).
|
|
10
|
+
import { create } from "@bufbuild/protobuf";
|
|
11
|
+
import { ListSchedulesRequestSchema, } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/io_pb";
|
|
12
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
13
|
+
/**
|
|
14
|
+
* Fetch one page of an organization's schedules via the direct query.
|
|
15
|
+
*
|
|
16
|
+
* Handles a verified split between the two server editions: cloud slices
|
|
17
|
+
* pages server-side, while the OSS server documents that it ignores
|
|
18
|
+
* `page_info` and returns every matching schedule. A server that
|
|
19
|
+
* paginated can never return more rows than the requested size, so an
|
|
20
|
+
* overflowing response is the tell that the server ignored pagination —
|
|
21
|
+
* only then is the page sliced locally (absolute indices into the full
|
|
22
|
+
* list). A cloud page passes through untouched.
|
|
23
|
+
*/
|
|
24
|
+
export async function listSchedulesPage(client, org, page = {}) {
|
|
25
|
+
const size = page.size && page.size > 0 ? page.size : DEFAULT_PAGE_SIZE;
|
|
26
|
+
const num = page.num && page.num > 0 ? page.num : 1;
|
|
27
|
+
const result = await client.schedule.list(create(ListSchedulesRequestSchema, {
|
|
28
|
+
org,
|
|
29
|
+
pageInfo: { num, size },
|
|
30
|
+
}));
|
|
31
|
+
const items = result.items.length > size
|
|
32
|
+
? result.items.slice((num - 1) * size, num * size)
|
|
33
|
+
: result.items;
|
|
34
|
+
return {
|
|
35
|
+
items,
|
|
36
|
+
totalCount: result.totalCount,
|
|
37
|
+
totalPages: Math.ceil(result.totalCount / size),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build a `ResourceWorkbench`-compatible `listFn` over the direct
|
|
42
|
+
* schedule query.
|
|
43
|
+
*
|
|
44
|
+
* The returned entries are full `Schedule` protos occupying the
|
|
45
|
+
* `SearchResult` slot of `ListResult` — `ResourceWorkbench` is generic
|
|
46
|
+
* over its row type (`useResourceCollection` casts entries through to
|
|
47
|
+
* `TData`), and this is the one documented place where that cast
|
|
48
|
+
* happens. Consumers type their workbench as
|
|
49
|
+
* `ResourceWorkbench<Schedule>` and pass `getItemId={(s) => s.metadata?.id}`.
|
|
50
|
+
*
|
|
51
|
+
* `params.query` and `params.crossOrgPublic` are ignored: schedules have
|
|
52
|
+
* no server-side text search (render the workbench with
|
|
53
|
+
* `searchable={false}`) and are never public/cross-org.
|
|
54
|
+
*/
|
|
55
|
+
export function createScheduleListFn(client) {
|
|
56
|
+
return async (params) => {
|
|
57
|
+
const { items, totalCount, totalPages } = await listSchedulesPage(client, params.org, params.page ?? {});
|
|
58
|
+
return {
|
|
59
|
+
entries: items,
|
|
60
|
+
totalCount,
|
|
61
|
+
totalPages,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=scheduleListFn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduleListFn.js","sourceRoot":"","sources":["../../src/schedule/scheduleListFn.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,2EAA2E;AAC3E,uEAAuE;AACvE,2EAA2E;AAC3E,yEAAyE;AACzE,yEAAyE;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EACL,0BAA0B,GAG3B,MAAM,sDAAsD,CAAC;AAqB9D,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA0B,EAC1B,GAAW,EACX,OAA0D,EAAE;IAE5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CACvC,MAAM,CAAC,0BAA0B,EAAE;QACjC,GAAG;QACH,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;KACxB,CAAC,CACH,CAAC;IAEF,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI;QACxB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;QAClD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAEnB,OAAO;QACL,KAAK;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;KAChD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA0B;IAE1B,OAAO,KAAK,EAAE,MAAkB,EAAuB,EAAE;QACvD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,iBAAiB,CAC/D,MAAM,EACN,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,IAAI,IAAI,EAAE,CAClB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAkC;YAC3C,UAAU;YACV,UAAU;SACX,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ScheduleSpec } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/spec_pb";
|
|
2
|
+
import type { ScheduleStatus } from "@stigmer/protos/ai/stigmer/agentic/schedule/v1/status_pb";
|
|
3
|
+
import type { StatusPhase } from "../resource-workbench/types.js";
|
|
4
|
+
/** The three mutually-exclusive display states of a schedule. */
|
|
5
|
+
export type ScheduleState = "active" | "disabled" | "paused";
|
|
6
|
+
/** Derived display state: the tri-state plus its shared-badge rendering. */
|
|
7
|
+
export interface ScheduleStateInfo {
|
|
8
|
+
/** The display state ("disabled" wins when both levers are set). */
|
|
9
|
+
readonly state: ScheduleState;
|
|
10
|
+
/** `StatusPhase` for the shared `StatusBadge` (`--stgm-status-*` tokens). */
|
|
11
|
+
readonly phase: StatusPhase;
|
|
12
|
+
/** Human-readable badge label. */
|
|
13
|
+
readonly label: string;
|
|
14
|
+
/**
|
|
15
|
+
* `true` when the platform pause latch is set — independent of the
|
|
16
|
+
* display state, so a disabled-AND-paused schedule can still surface
|
|
17
|
+
* its `status.pausedReason`.
|
|
18
|
+
*/
|
|
19
|
+
readonly isPaused: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Derive a schedule's display state from its spec and status.
|
|
23
|
+
*
|
|
24
|
+
* A missing spec derives as "disabled" — the same fail-closed reading the
|
|
25
|
+
* server applies to a manifest that omits `enabled`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function deriveScheduleState(spec: ScheduleSpec | undefined, status: ScheduleStatus | undefined): ScheduleStateInfo;
|
|
28
|
+
/**
|
|
29
|
+
* Compact future-instant formatter for a schedule's next fire time:
|
|
30
|
+
* `now`, `in 5m`, `in 3h`, `in 6d`, then a short date once "days from
|
|
31
|
+
* now" stops being how people think about it.
|
|
32
|
+
*
|
|
33
|
+
* The schedule-local sibling of the activity module's past-only
|
|
34
|
+
* `formatRelativeTime` (same compact units, same date tail) — kept
|
|
35
|
+
* separate because that util's contract is deliberately past-only.
|
|
36
|
+
* A fire time slightly in the past (a tick mid-flight, clock skew)
|
|
37
|
+
* renders as `now` rather than a nonsense negative countdown.
|
|
38
|
+
*
|
|
39
|
+
* `now` is injected, never read from the live clock — required for
|
|
40
|
+
* deterministic tests and Scenar fixtures.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatNextFire(date: Date, now: Date): string;
|
|
43
|
+
//# sourceMappingURL=scheduleState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduleState.d.ts","sourceRoot":"","sources":["../../src/schedule/scheduleState.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wDAAwD,CAAC;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,iEAAiE;AACjE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE7D,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,iBAAiB,CAUnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAoB5D"}
|