@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.
Files changed (193) hide show
  1. package/agent/AgentPicker.d.ts +10 -1
  2. package/agent/AgentPicker.d.ts.map +1 -1
  3. package/agent/AgentPicker.js +2 -2
  4. package/agent/AgentPicker.js.map +1 -1
  5. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  6. package/channel/AgentChannelsPanel.js +22 -5
  7. package/channel/AgentChannelsPanel.js.map +1 -1
  8. package/channel/ChannelTemplatesDialog.d.ts +53 -0
  9. package/channel/ChannelTemplatesDialog.d.ts.map +1 -0
  10. package/channel/ChannelTemplatesDialog.js +150 -0
  11. package/channel/ChannelTemplatesDialog.js.map +1 -0
  12. package/channel/index.d.ts +8 -0
  13. package/channel/index.d.ts.map +1 -1
  14. package/channel/index.js +4 -0
  15. package/channel/index.js.map +1 -1
  16. package/channel/providers.d.ts +12 -0
  17. package/channel/providers.d.ts.map +1 -1
  18. package/channel/providers.js +14 -2
  19. package/channel/providers.js.map +1 -1
  20. package/channel/templatePresentation.d.ts +37 -0
  21. package/channel/templatePresentation.d.ts.map +1 -0
  22. package/channel/templatePresentation.js +69 -0
  23. package/channel/templatePresentation.js.map +1 -0
  24. package/channel/useChannelTemplateList.d.ts +64 -0
  25. package/channel/useChannelTemplateList.d.ts.map +1 -0
  26. package/channel/useChannelTemplateList.js +69 -0
  27. package/channel/useChannelTemplateList.js.map +1 -0
  28. package/channel/useChannelTemplateReadiness.d.ts +53 -0
  29. package/channel/useChannelTemplateReadiness.d.ts.map +1 -0
  30. package/channel/useChannelTemplateReadiness.js +42 -0
  31. package/channel/useChannelTemplateReadiness.js.map +1 -0
  32. package/dashboard/useDashboardFailedRuns.d.ts.map +1 -1
  33. package/dashboard/useDashboardFailedRuns.js +2 -0
  34. package/dashboard/useDashboardFailedRuns.js.map +1 -1
  35. package/index.d.ts +4 -2
  36. package/index.d.ts.map +1 -1
  37. package/index.js +9 -1
  38. package/index.js.map +1 -1
  39. package/library/useExportResource.d.ts +4 -3
  40. package/library/useExportResource.d.ts.map +1 -1
  41. package/library/useExportResource.js +1 -1
  42. package/library/useExportResource.js.map +1 -1
  43. package/organization/OrgProvider.d.ts +11 -4
  44. package/organization/OrgProvider.d.ts.map +1 -1
  45. package/organization/OrgProvider.js +28 -4
  46. package/organization/OrgProvider.js.map +1 -1
  47. package/package.json +4 -4
  48. package/resource-detail/useDeleteResource.d.ts +1 -1
  49. package/resource-detail/useDeleteResource.d.ts.map +1 -1
  50. package/resource-detail/useDeleteResource.js +5 -0
  51. package/resource-detail/useDeleteResource.js.map +1 -1
  52. package/resource-workbench/components/ResourceWorkbench.d.ts +10 -1
  53. package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -1
  54. package/resource-workbench/components/ResourceWorkbench.js +6 -2
  55. package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
  56. package/resource-workbench/hooks/useResourceCollection.d.ts +8 -0
  57. package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -1
  58. package/resource-workbench/hooks/useResourceCollection.js +2 -2
  59. package/resource-workbench/hooks/useResourceCollection.js.map +1 -1
  60. package/schedule/CadenceField.d.ts +31 -0
  61. package/schedule/CadenceField.d.ts.map +1 -0
  62. package/schedule/CadenceField.js +116 -0
  63. package/schedule/CadenceField.js.map +1 -0
  64. package/schedule/ScheduleDetailView.d.ts +58 -0
  65. package/schedule/ScheduleDetailView.d.ts.map +1 -0
  66. package/schedule/ScheduleDetailView.js +236 -0
  67. package/schedule/ScheduleDetailView.js.map +1 -0
  68. package/schedule/ScheduleForm.d.ts +43 -0
  69. package/schedule/ScheduleForm.d.ts.map +1 -0
  70. package/schedule/ScheduleForm.js +129 -0
  71. package/schedule/ScheduleForm.js.map +1 -0
  72. package/schedule/ScheduleRowActions.d.ts +20 -0
  73. package/schedule/ScheduleRowActions.d.ts.map +1 -0
  74. package/schedule/ScheduleRowActions.js +54 -0
  75. package/schedule/ScheduleRowActions.js.map +1 -0
  76. package/schedule/TimeZoneField.d.ts +32 -0
  77. package/schedule/TimeZoneField.d.ts.map +1 -0
  78. package/schedule/TimeZoneField.js +104 -0
  79. package/schedule/TimeZoneField.js.map +1 -0
  80. package/schedule/cadence.d.ts +95 -0
  81. package/schedule/cadence.d.ts.map +1 -0
  82. package/schedule/cadence.js +242 -0
  83. package/schedule/cadence.js.map +1 -0
  84. package/schedule/index.d.ts +31 -0
  85. package/schedule/index.d.ts.map +1 -0
  86. package/schedule/index.js +16 -0
  87. package/schedule/index.js.map +1 -0
  88. package/schedule/scheduleColumns.d.ts +26 -0
  89. package/schedule/scheduleColumns.d.ts.map +1 -0
  90. package/schedule/scheduleColumns.js +77 -0
  91. package/schedule/scheduleColumns.js.map +1 -0
  92. package/schedule/scheduleListFn.d.ts +50 -0
  93. package/schedule/scheduleListFn.d.ts.map +1 -0
  94. package/schedule/scheduleListFn.js +65 -0
  95. package/schedule/scheduleListFn.js.map +1 -0
  96. package/schedule/scheduleState.d.ts +43 -0
  97. package/schedule/scheduleState.d.ts.map +1 -0
  98. package/schedule/scheduleState.js +67 -0
  99. package/schedule/scheduleState.js.map +1 -0
  100. package/schedule/useCreateSchedule.d.ts +57 -0
  101. package/schedule/useCreateSchedule.d.ts.map +1 -0
  102. package/schedule/useCreateSchedule.js +61 -0
  103. package/schedule/useCreateSchedule.js.map +1 -0
  104. package/schedule/useResumeSchedule.d.ts +30 -0
  105. package/schedule/useResumeSchedule.d.ts.map +1 -0
  106. package/schedule/useResumeSchedule.js +45 -0
  107. package/schedule/useResumeSchedule.js.map +1 -0
  108. package/schedule/useSchedule.d.ts +39 -0
  109. package/schedule/useSchedule.d.ts.map +1 -0
  110. package/schedule/useSchedule.js +44 -0
  111. package/schedule/useSchedule.js.map +1 -0
  112. package/schedule/useScheduleCount.d.ts +38 -0
  113. package/schedule/useScheduleCount.d.ts.map +1 -0
  114. package/schedule/useScheduleCount.js +30 -0
  115. package/schedule/useScheduleCount.js.map +1 -0
  116. package/schedule/useScheduleList.d.ts +48 -0
  117. package/schedule/useScheduleList.d.ts.map +1 -0
  118. package/schedule/useScheduleList.js +43 -0
  119. package/schedule/useScheduleList.js.map +1 -0
  120. package/schedule/useSetScheduleEnabled.d.ts +31 -0
  121. package/schedule/useSetScheduleEnabled.d.ts.map +1 -0
  122. package/schedule/useSetScheduleEnabled.js +53 -0
  123. package/schedule/useSetScheduleEnabled.js.map +1 -0
  124. package/schedule/useTriggerSchedule.d.ts +28 -0
  125. package/schedule/useTriggerSchedule.d.ts.map +1 -0
  126. package/schedule/useTriggerSchedule.js +43 -0
  127. package/schedule/useTriggerSchedule.js.map +1 -0
  128. package/search/useResourceCount.d.ts +2 -1
  129. package/search/useResourceCount.d.ts.map +1 -1
  130. package/search/useResourceCount.js +6 -1
  131. package/search/useResourceCount.js.map +1 -1
  132. package/src/agent/AgentPicker.tsx +13 -1
  133. package/src/channel/AgentChannelsPanel.tsx +43 -1
  134. package/src/channel/ChannelTemplatesDialog.tsx +433 -0
  135. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +73 -0
  136. package/src/channel/__tests__/ChannelTemplatesDialog.test.tsx +292 -0
  137. package/src/channel/__tests__/providers.test.ts +9 -0
  138. package/src/channel/__tests__/templatePresentation.test.ts +96 -0
  139. package/src/channel/__tests__/useChannelTemplateList.test.tsx +216 -0
  140. package/src/channel/__tests__/useChannelTemplateReadiness.test.tsx +124 -0
  141. package/src/channel/index.ts +15 -0
  142. package/src/channel/providers.ts +26 -2
  143. package/src/channel/templatePresentation.ts +82 -0
  144. package/src/channel/useChannelTemplateList.ts +123 -0
  145. package/src/channel/useChannelTemplateReadiness.ts +69 -0
  146. package/src/dashboard/__tests__/useDashboardFailedRuns.test.tsx +106 -0
  147. package/src/dashboard/useDashboardFailedRuns.ts +2 -0
  148. package/src/execution/__tests__/PlanArtifactCard.test.tsx +23 -2
  149. package/src/index.ts +65 -0
  150. package/src/library/useExportResource.ts +4 -3
  151. package/src/organization/OrgProvider.tsx +29 -4
  152. package/src/organization/__tests__/OrgProvider.orgSwitch.test.tsx +89 -0
  153. package/src/resource-detail/useDeleteResource.ts +11 -1
  154. package/src/resource-workbench/__tests__/ResourceWorkbench.test.tsx +112 -0
  155. package/src/resource-workbench/components/ResourceWorkbench.tsx +32 -15
  156. package/src/resource-workbench/hooks/useResourceCollection.ts +11 -1
  157. package/src/schedule/CadenceField.tsx +365 -0
  158. package/src/schedule/ScheduleDetailView.tsx +583 -0
  159. package/src/schedule/ScheduleForm.tsx +405 -0
  160. package/src/schedule/ScheduleRowActions.tsx +124 -0
  161. package/src/schedule/TimeZoneField.tsx +199 -0
  162. package/src/schedule/__tests__/ScheduleDetailView.test.tsx +260 -0
  163. package/src/schedule/__tests__/cadence.test.ts +278 -0
  164. package/src/schedule/__tests__/scheduleColumnsRowActions.test.tsx +176 -0
  165. package/src/schedule/__tests__/scheduleCreation.test.tsx +340 -0
  166. package/src/schedule/__tests__/scheduleHooks.test.tsx +312 -0
  167. package/src/schedule/__tests__/scheduleListFn.test.ts +128 -0
  168. package/src/schedule/__tests__/scheduleState.test.ts +133 -0
  169. package/src/schedule/cadence.ts +298 -0
  170. package/src/schedule/index.ts +57 -0
  171. package/src/schedule/scheduleColumns.tsx +118 -0
  172. package/src/schedule/scheduleListFn.ts +108 -0
  173. package/src/schedule/scheduleState.ts +96 -0
  174. package/src/schedule/useCreateSchedule.ts +88 -0
  175. package/src/schedule/useResumeSchedule.ts +67 -0
  176. package/src/schedule/useSchedule.ts +67 -0
  177. package/src/schedule/useScheduleCount.ts +57 -0
  178. package/src/schedule/useScheduleList.ts +83 -0
  179. package/src/schedule/useSetScheduleEnabled.ts +84 -0
  180. package/src/schedule/useTriggerSchedule.ts +65 -0
  181. package/src/search/__tests__/useResourceCount.test.tsx +89 -0
  182. package/src/search/useResourceCount.ts +8 -2
  183. package/src/workflow/WorkflowDashboard.tsx +1 -0
  184. package/src/workflow/useWorkflowExecutionList.ts +13 -2
  185. package/styles.css +1 -1
  186. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  187. package/workflow/WorkflowDashboard.d.ts.map +1 -1
  188. package/workflow/WorkflowDashboard.js +1 -0
  189. package/workflow/WorkflowDashboard.js.map +1 -1
  190. package/workflow/useWorkflowExecutionList.d.ts +10 -0
  191. package/workflow/useWorkflowExecutionList.d.ts.map +1 -1
  192. package/workflow/useWorkflowExecutionList.js +3 -2
  193. 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"}