@voyantjs/workflows-react 0.106.0 → 0.107.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 (63) hide show
  1. package/README.md +43 -0
  2. package/dist/client.d.ts +2 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +1 -0
  5. package/dist/components/common.d.ts +30 -0
  6. package/dist/components/common.d.ts.map +1 -0
  7. package/dist/components/common.js +108 -0
  8. package/dist/components/workflow-run-actions.d.ts +7 -0
  9. package/dist/components/workflow-run-actions.d.ts.map +1 -0
  10. package/dist/components/workflow-run-actions.js +72 -0
  11. package/dist/components/workflow-run-detail-page.d.ts +10 -0
  12. package/dist/components/workflow-run-detail-page.d.ts.map +1 -0
  13. package/dist/components/workflow-run-detail-page.js +96 -0
  14. package/dist/components/workflow-runs-filters.d.ts +32 -0
  15. package/dist/components/workflow-runs-filters.d.ts.map +1 -0
  16. package/dist/components/workflow-runs-filters.js +97 -0
  17. package/dist/components/workflow-runs-page.d.ts +12 -0
  18. package/dist/components/workflow-runs-page.d.ts.map +1 -0
  19. package/dist/components/workflow-runs-page.js +132 -0
  20. package/dist/components/workflow-schedules-page.d.ts +21 -0
  21. package/dist/components/workflow-schedules-page.d.ts.map +1 -0
  22. package/dist/components/workflow-schedules-page.js +144 -0
  23. package/dist/i18n/en.d.ts +4 -0
  24. package/dist/i18n/en.d.ts.map +1 -0
  25. package/dist/i18n/en.js +135 -0
  26. package/dist/i18n/index.d.ts +5 -0
  27. package/dist/i18n/index.d.ts.map +1 -0
  28. package/dist/i18n/index.js +3 -0
  29. package/dist/i18n/messages.d.ts +125 -0
  30. package/dist/i18n/messages.d.ts.map +1 -0
  31. package/dist/i18n/messages.js +1 -0
  32. package/dist/i18n/provider.d.ts +26 -0
  33. package/dist/i18n/provider.d.ts.map +1 -0
  34. package/dist/i18n/provider.js +44 -0
  35. package/dist/i18n/ro.d.ts +4 -0
  36. package/dist/i18n/ro.d.ts.map +1 -0
  37. package/dist/i18n/ro.js +137 -0
  38. package/dist/schedules-client.d.ts +2 -0
  39. package/dist/schedules-client.d.ts.map +1 -0
  40. package/dist/schedules-client.js +1 -0
  41. package/dist/types.d.ts +2 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +1 -0
  44. package/dist/ui.d.ts +9 -0
  45. package/dist/ui.d.ts.map +1 -0
  46. package/dist/ui.js +6 -0
  47. package/package.json +69 -21
  48. package/src/client.ts +4 -0
  49. package/src/components/common.tsx +182 -0
  50. package/src/components/workflow-run-actions.tsx +160 -0
  51. package/src/components/workflow-run-detail-page.tsx +393 -0
  52. package/src/components/workflow-runs-filters.tsx +349 -0
  53. package/src/components/workflow-runs-page.tsx +357 -0
  54. package/src/components/workflow-schedules-page.tsx +398 -0
  55. package/src/i18n/en.ts +142 -0
  56. package/src/i18n/index.ts +26 -0
  57. package/src/i18n/messages.ts +125 -0
  58. package/src/i18n/provider.tsx +96 -0
  59. package/src/i18n/ro.ts +144 -0
  60. package/src/schedules-client.ts +8 -0
  61. package/src/styles.css +11 -0
  62. package/src/types.ts +14 -0
  63. package/src/ui.ts +63 -0
@@ -0,0 +1,132 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Button } from "@voyantjs/ui/components/button";
4
+ import { Card, CardContent } from "@voyantjs/ui/components/card";
5
+ import { Clock, Workflow } from "lucide-react";
6
+ import { useEffect, useMemo, useState } from "react";
7
+ import { useWorkflowRunsUiMessagesOrDefault } from "../i18n/index.js";
8
+ import { formatDuration, formatRelative, StatusBadge, StatusIcon, TagChip } from "./common.js";
9
+ import { WorkflowRunDetailPage } from "./workflow-run-detail-page.js";
10
+ import { buildFilterOptions, WorkflowRunsFilters } from "./workflow-runs-filters.js";
11
+ export function WorkflowRunsPage({ api, selectedRunId, onOpenRun, initialFilters, pollIntervalMs = 5000, className, }) {
12
+ const messages = useWorkflowRunsUiMessagesOrDefault();
13
+ const [filters, setFilters] = useState(initialFilters ?? { limit: 50 });
14
+ const [statusFilters, setStatusFilters] = useState(initialFilters?.status ? [initialFilters.status] : []);
15
+ const [tagFilters, setTagFilters] = useState(initialFilters?.tag ? [initialFilters.tag] : []);
16
+ const [searchQuery, setSearchQuery] = useState("");
17
+ const [timeRange, setTimeRange] = useState("24h");
18
+ const [live, setLive] = useState(false);
19
+ const [runs, setRuns] = useState([]);
20
+ const [error, setError] = useState(null);
21
+ const [loading, setLoading] = useState(false);
22
+ const [localSelectedRunId, setLocalSelectedRunId] = useState(null);
23
+ const activeRunId = selectedRunId !== undefined ? selectedRunId : localSelectedRunId;
24
+ const serverFilters = useMemo(() => ({
25
+ ...filters,
26
+ status: statusFilters.length === 1 ? statusFilters[0] : undefined,
27
+ tag: tagFilters.length === 1 ? tagFilters[0] : undefined,
28
+ }), [filters, statusFilters, tagFilters]);
29
+ useEffect(() => {
30
+ let cancelled = false;
31
+ const refresh = async () => {
32
+ if (typeof document !== "undefined" && document.hidden)
33
+ return;
34
+ setLoading(true);
35
+ try {
36
+ const res = await api.listRuns(serverFilters);
37
+ if (!cancelled) {
38
+ setRuns(res.data);
39
+ setError(null);
40
+ }
41
+ }
42
+ catch (err) {
43
+ if (!cancelled)
44
+ setError(err instanceof Error ? err.message : messages.page.loadError);
45
+ }
46
+ finally {
47
+ if (!cancelled)
48
+ setLoading(false);
49
+ }
50
+ };
51
+ void refresh();
52
+ const interval = setInterval(() => void refresh(), live ? 1000 : pollIntervalMs);
53
+ return () => {
54
+ cancelled = true;
55
+ clearInterval(interval);
56
+ };
57
+ }, [api, live, messages.page.loadError, pollIntervalMs, serverFilters]);
58
+ const filterOptions = useMemo(() => buildFilterOptions(runs, filters.workflowName), [filters.workflowName, runs]);
59
+ const filteredRuns = useMemo(() => filterRuns({ runs, statusFilters, tagFilters, searchQuery, timeRange }), [runs, searchQuery, statusFilters, tagFilters, timeRange]);
60
+ const openRun = (id) => {
61
+ setLocalSelectedRunId(id);
62
+ onOpenRun?.(id);
63
+ };
64
+ const toggleStatus = (status) => {
65
+ setStatusFilters((current) => current.includes(status) ? current.filter((item) => item !== status) : [...current, status]);
66
+ };
67
+ const addTagFilter = (tag) => {
68
+ const trimmed = tag.trim();
69
+ if (!trimmed)
70
+ return;
71
+ setTagFilters((current) => (current.includes(trimmed) ? current : [...current, trimmed]));
72
+ };
73
+ const removeTagFilter = (tag) => setTagFilters((current) => current.filter((item) => item !== tag));
74
+ return (_jsxs("div", { className: `flex min-h-screen flex-col bg-background ${className ?? ""}`, children: [_jsx("header", { className: "sticky top-0 z-10 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: _jsxs("div", { className: "container mx-auto flex items-center gap-3 px-4 py-3", children: [_jsx(Workflow, { className: "h-5 w-5" }), _jsxs("div", { className: "min-w-0", children: [_jsx("h1", { className: "font-semibold text-base", children: messages.page.title }), _jsx("p", { className: "text-muted-foreground text-xs", children: messages.page.subtitle })] }), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [_jsxs(Button, { type: "button", variant: live ? "default" : "outline", size: "sm", onClick: () => setLive((value) => !value), "aria-pressed": live, children: [_jsx(Clock, { "data-icon": "inline-start", "aria-hidden": "true" }), messages.page.live] }), _jsx("span", { className: "text-muted-foreground text-xs", children: messages.page.filteredRunCount(filteredRuns.length, runs.length) })] })] }) }), _jsxs("main", { className: "container mx-auto flex flex-1 flex-col gap-6 px-4 py-6 md:flex-row", children: [_jsxs("aside", { className: "space-y-3 md:w-96 md:shrink-0", children: [_jsx(WorkflowRunsFilters, { filters: filters, workflowOptions: filterOptions.workflows, tagOptions: filterOptions.tags, statusFilters: statusFilters, tagFilters: tagFilters, searchQuery: searchQuery, timeRange: timeRange, onChange: setFilters, onToggleStatus: toggleStatus, onAddTagFilter: addTagFilter, onRemoveTagFilter: removeTagFilter, onSearchChange: setSearchQuery, onTimeRangeChange: setTimeRange, onClear: () => {
75
+ setFilters({ limit: filters.limit ?? 50 });
76
+ setStatusFilters([]);
77
+ setTagFilters([]);
78
+ setSearchQuery("");
79
+ setTimeRange("24h");
80
+ } }), error ? (_jsx(Card, { className: "border-destructive/40", children: _jsx(CardContent, { className: "pt-4 text-destructive text-sm", children: error }) })) : null, _jsxs("div", { className: "space-y-2", children: [filteredRuns.length === 0 && !loading ? (_jsx(Card, { children: _jsx(CardContent, { className: "pt-4 text-muted-foreground text-sm", children: messages.page.empty }) })) : null, filteredRuns.map((run) => (_jsx(RunListItem, { run: run, selected: activeRunId === run.id, activeTagFilters: tagFilters, activeStatusFilters: statusFilters, onSelect: () => openRun(run.id), onToggleStatus: toggleStatus, onToggleTag: (tag) => tagFilters.includes(tag) ? removeTagFilter(tag) : addTagFilter(tag) }, run.id)))] })] }), _jsx("section", { className: "min-w-0 flex-1", children: activeRunId ? (_jsx(WorkflowRunDetailPage, { api: api, runId: activeRunId, onOpenRun: openRun })) : (_jsx(SelectPrompt, {})) })] })] }));
81
+ }
82
+ export function WorkflowRunsPageSkeleton() {
83
+ const messages = useWorkflowRunsUiMessagesOrDefault();
84
+ return (_jsxs("div", { className: "flex min-h-screen flex-col bg-background", children: [_jsx("header", { className: "border-b px-4 py-3", children: _jsx("div", { className: "h-5 w-40 rounded bg-muted", role: "status", "aria-label": messages.page.loading }) }), _jsxs("main", { className: "container mx-auto flex flex-1 flex-col gap-6 px-4 py-6 md:flex-row", children: [_jsxs("aside", { className: "space-y-3 md:w-96 md:shrink-0", children: [_jsx("div", { className: "h-56 rounded-md bg-muted" }), _jsx("div", { className: "h-20 rounded-md bg-muted" }), _jsx("div", { className: "h-20 rounded-md bg-muted" })] }), _jsx("section", { className: "min-h-[24rem] flex-1 rounded-md bg-muted" })] })] }));
85
+ }
86
+ function RunListItem({ run, selected, activeTagFilters, activeStatusFilters, onSelect, onToggleStatus, onToggleTag, }) {
87
+ const messages = useWorkflowRunsUiMessagesOrDefault();
88
+ return (_jsxs("div", { className: `rounded-md border bg-card p-3 text-sm transition-colors hover:bg-muted/50 ${selected ? "border-primary bg-primary/5" : "" // i18n-literal-ok: CSS classes
89
+ }`, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("button", { type: "button", onClick: onSelect, className: "flex min-w-0 flex-1 items-center gap-2 text-left", children: [_jsx(StatusIcon, { status: run.status }), _jsx("span", { className: "truncate font-medium", children: run.workflowName }), _jsx("span", { className: "ml-auto whitespace-nowrap text-muted-foreground text-xs", children: formatRelative(run.startedAt, messages) })] }), _jsx("button", { type: "button", onClick: () => onToggleStatus(run.status), "aria-pressed": activeStatusFilters.includes(run.status), children: _jsx(StatusBadge, { status: run.status, messages: messages }) })] }), run.durationMs != null ? (_jsx("div", { className: "mt-1 text-muted-foreground text-xs", children: formatDuration(run.durationMs) })) : null, run.tags.length > 0 ? (_jsxs("div", { className: "mt-2 flex flex-wrap gap-1", children: [run.tags.slice(0, 3).map((tag) => (_jsx("button", { type: "button", onClick: () => onToggleTag(tag), "aria-pressed": activeTagFilters.includes(tag), className: activeTagFilters.includes(tag) ? "rounded-full ring-2 ring-primary/40" : undefined, children: _jsx(TagChip, { tag: tag }) }, tag))), run.tags.length > 3 ? (_jsx("span", { className: "text-muted-foreground text-xs", children: `+${run.tags.length - 3}` })) : null] })) : null] }));
90
+ }
91
+ function SelectPrompt() {
92
+ const messages = useWorkflowRunsUiMessagesOrDefault();
93
+ return (_jsx(Card, { children: _jsx(CardContent, { className: "flex min-h-[24rem] items-center justify-center text-muted-foreground text-sm", children: messages.page.selectPrompt }) }));
94
+ }
95
+ function filterRuns({ runs, statusFilters, tagFilters, searchQuery, timeRange, }) {
96
+ const search = searchQuery.trim().toLowerCase();
97
+ const cutoff = rangeCutoff(timeRange);
98
+ return runs.filter((run) => {
99
+ if (statusFilters.length > 0 && !statusFilters.includes(run.status))
100
+ return false;
101
+ if (tagFilters.length > 0 && !tagFilters.every((tag) => run.tags.includes(tag)))
102
+ return false;
103
+ if (cutoff && new Date(run.startedAt).getTime() < cutoff)
104
+ return false;
105
+ if (!search)
106
+ return true;
107
+ return runSearchText(run).includes(search);
108
+ });
109
+ }
110
+ function rangeCutoff(range) {
111
+ if (range === "all")
112
+ return null;
113
+ const minutes = range === "15m" ? 15 : range === "1h" ? 60 : range === "24h" ? 24 * 60 : 7 * 24 * 60;
114
+ return Date.now() - minutes * 60_000;
115
+ }
116
+ function runSearchText(run) {
117
+ return [
118
+ run.id,
119
+ run.workflowName,
120
+ run.trigger,
121
+ run.correlationId,
122
+ run.status,
123
+ ...run.tags,
124
+ run.error?.message,
125
+ run.error?.code,
126
+ run.input ? JSON.stringify(run.input) : null,
127
+ run.result ? JSON.stringify(run.result) : null,
128
+ ]
129
+ .filter(Boolean)
130
+ .join(" ")
131
+ .toLowerCase();
132
+ }
@@ -0,0 +1,21 @@
1
+ import type { WorkflowSchedulesApi } from "../schedules-client.js";
2
+ import type { WorkflowRunsApi } from "../types.js";
3
+ export interface WorkflowSchedulesPageProps {
4
+ /** Schedules API — backed by `/api/schedules/:env`. */
5
+ schedulesApi: WorkflowSchedulesApi;
6
+ /** Optional runs API — when provided, the page joins each row with the most recent matching run. */
7
+ runsApi?: WorkflowRunsApi;
8
+ /**
9
+ * Optional trigger callback. When provided, each row renders a
10
+ * "Trigger now" button that calls this with the workflow id + the
11
+ * schedule's recorded `input` payload (if any).
12
+ */
13
+ onTriggerNow?: (workflowId: string, input: unknown) => Promise<void>;
14
+ /** Manifest environment to inspect. Defaults to "production". */
15
+ environment?: "production" | "preview" | "development";
16
+ /** Auto-refresh interval (ms). Defaults to 30s. Pass 0 to disable. */
17
+ pollIntervalMs?: number;
18
+ className?: string;
19
+ }
20
+ export declare function WorkflowSchedulesPage({ schedulesApi, runsApi, onTriggerNow, environment, pollIntervalMs, className, }: WorkflowSchedulesPageProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=workflow-schedules-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-schedules-page.d.ts","sourceRoot":"","sources":["../../src/components/workflow-schedules-page.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,oBAAoB,EACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAkC,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlF,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,YAAY,EAAE,oBAAoB,CAAA;IAClC,oGAAoG;IACpG,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,iEAAiE;IACjE,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,aAAa,CAAA;IACtD,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,WAA0B,EAC1B,cAAuB,EACvB,SAAS,GACV,EAAE,0BAA0B,2CA0L5B"}
@@ -0,0 +1,144 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Badge } from "@voyantjs/ui/components/badge";
4
+ import { Button } from "@voyantjs/ui/components/button";
5
+ import { Card, CardContent } from "@voyantjs/ui/components/card";
6
+ import { AlertTriangle, CalendarClock, RefreshCw } from "lucide-react";
7
+ import { useCallback, useEffect, useMemo, useState } from "react";
8
+ import { useWorkflowRunsUiMessagesOrDefault } from "../i18n/index.js";
9
+ import { formatRelative, StatusIcon } from "./common.js";
10
+ export function WorkflowSchedulesPage({ schedulesApi, runsApi, onTriggerNow, environment = "production", pollIntervalMs = 30_000, className, }) {
11
+ const rootMessages = useWorkflowRunsUiMessagesOrDefault();
12
+ const messages = rootMessages.schedules;
13
+ const [response, setResponse] = useState(null);
14
+ const [lastRuns, setLastRuns] = useState({});
15
+ const [loading, setLoading] = useState(false);
16
+ const [error, setError] = useState(null);
17
+ const [triggering, setTriggering] = useState({});
18
+ const [triggerNotice, setTriggerNotice] = useState(null);
19
+ const refresh = useCallback(async () => {
20
+ setLoading(true);
21
+ try {
22
+ const next = await schedulesApi.listSchedules(environment);
23
+ setResponse(next);
24
+ setError(null);
25
+ if (runsApi) {
26
+ const uniqueIds = Array.from(new Set(next.data.map((entry) => entry.workflowId)));
27
+ const results = await Promise.all(uniqueIds.map(async (workflowId) => {
28
+ try {
29
+ const runs = await runsApi.listRuns({ workflowName: workflowId, limit: 1 });
30
+ return [workflowId, runs.data[0] ?? null];
31
+ }
32
+ catch {
33
+ return [workflowId, null];
34
+ }
35
+ }));
36
+ setLastRuns(Object.fromEntries(results));
37
+ }
38
+ }
39
+ catch (err) {
40
+ setError(err instanceof Error ? err.message : messages.loadError);
41
+ }
42
+ finally {
43
+ setLoading(false);
44
+ }
45
+ }, [environment, messages.loadError, runsApi, schedulesApi]);
46
+ useEffect(() => {
47
+ void refresh();
48
+ if (!pollIntervalMs)
49
+ return;
50
+ const interval = setInterval(() => void refresh(), pollIntervalMs);
51
+ return () => clearInterval(interval);
52
+ }, [pollIntervalMs, refresh]);
53
+ const showEnvFlag = response?.schedulesEnabledByEnv !== undefined;
54
+ const envFlagOn = response?.schedulesEnabledByEnv === true;
55
+ const triggerRow = useCallback(async (entry) => {
56
+ if (!onTriggerNow)
57
+ return;
58
+ setTriggering((prev) => ({ ...prev, [entry.scheduleId]: true }));
59
+ setTriggerNotice(null);
60
+ try {
61
+ await onTriggerNow(entry.workflowId, entry.schedule.input);
62
+ setTriggerNotice({ kind: "success", text: messages.triggerSuccess });
63
+ }
64
+ catch (err) {
65
+ setTriggerNotice({
66
+ kind: "error",
67
+ text: err instanceof Error ? err.message : messages.triggerFailed,
68
+ });
69
+ }
70
+ finally {
71
+ setTriggering((prev) => ({ ...prev, [entry.scheduleId]: false }));
72
+ }
73
+ }, [messages.triggerFailed, messages.triggerSuccess, onTriggerNow]);
74
+ const rows = useMemo(() => response?.data ?? [], [response]);
75
+ return (_jsxs("div", { className: `flex min-h-screen flex-col bg-background ${className ?? ""}`, children: [_jsx("header", { className: "sticky top-0 z-10 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60", children: _jsxs("div", { className: "container mx-auto flex flex-wrap items-center gap-3 px-4 py-3", children: [_jsx(CalendarClock, { className: "h-5 w-5" }), _jsxs("div", { className: "min-w-0", children: [_jsx("h1", { className: "font-semibold text-base", children: messages.title }), _jsx("p", { className: "text-muted-foreground text-xs", children: messages.subtitle })] }), _jsxs("div", { className: "ml-auto flex items-center gap-2 text-muted-foreground text-xs", children: [_jsxs("span", { children: [messages.environmentLabel, ": ", _jsx("span", { className: "font-mono", children: environment })] }), response?.versionId ? (_jsxs("span", { children: [messages.versionLabel, ":", " ", _jsx("span", { className: "font-mono", children: response.versionId.slice(0, 12) })] })) : null, _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => void refresh(), disabled: loading, children: [_jsx(RefreshCw, { className: `h-3.5 w-3.5 ${loading ? "animate-spin" : ""}`, "aria-hidden": "true" }), messages.refresh] })] })] }) }), _jsxs("main", { className: "container mx-auto flex flex-1 flex-col gap-4 px-4 py-6", children: [showEnvFlag && !envFlagOn ? (_jsx(Card, { className: "border-amber-500/40 bg-amber-500/5", children: _jsxs(CardContent, { className: "flex items-center gap-2 pt-4 text-amber-700 text-sm dark:text-amber-300", children: [_jsx(AlertTriangle, { className: "h-4 w-4", "aria-hidden": "true" }), messages.envFlagOff] }) })) : null, triggerNotice ? (_jsx(Card, { className: triggerNotice.kind === "success"
76
+ ? "border-emerald-500/40 bg-emerald-500/5"
77
+ : "border-destructive/40 bg-destructive/5", children: _jsx(CardContent, { className: `pt-4 text-sm ${triggerNotice.kind === "success"
78
+ ? "text-emerald-600 dark:text-emerald-300"
79
+ : "text-destructive"}`, children: triggerNotice.text }) })) : null, error ? (_jsx(Card, { className: "border-destructive/40", children: _jsx(CardContent, { className: "pt-4 text-destructive text-sm", children: error }) })) : null, !error && rows.length === 0 && !loading ? (_jsx(Card, { children: _jsx(CardContent, { className: "pt-4 text-muted-foreground text-sm", children: messages.empty }) })) : null, rows.length > 0 ? (_jsx("div", { className: "overflow-hidden rounded-md border", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/40 text-left text-xs uppercase", children: _jsxs("tr", { children: [_jsx("th", { className: "px-3 py-2 font-medium", children: messages.workflowColumn }), _jsx("th", { className: "px-3 py-2 font-medium", children: messages.scheduleColumn }), _jsx("th", { className: "px-3 py-2 font-medium", children: messages.nextRunColumn }), _jsx("th", { className: "px-3 py-2 font-medium", children: messages.lastRunColumn }), _jsx("th", { className: "px-3 py-2 font-medium", children: messages.statusColumn }), onTriggerNow ? (_jsx("th", { className: "px-3 py-2 font-medium", children: messages.actionsColumn })) : null] }) }), _jsx("tbody", { children: rows.map((row) => (_jsx(ScheduleRow, { row: row, lastRun: lastRuns[row.workflowId] ?? null, triggering: !!triggering[row.scheduleId], onTriggerNow: onTriggerNow ? () => void triggerRow(row) : undefined, envFlagDisabled: showEnvFlag && !envFlagOn, rootMessages: rootMessages }, row.scheduleId))) })] }) })) : null] })] }));
80
+ }
81
+ function ScheduleRow({ row, lastRun, triggering, onTriggerNow, envFlagDisabled, rootMessages, }) {
82
+ const messages = rootMessages.schedules;
83
+ return (_jsxs("tr", { className: "border-t", children: [_jsx("td", { className: "px-3 py-2 font-mono text-xs", children: row.workflowId }), _jsx("td", { className: "px-3 py-2 font-mono text-xs", children: formatScheduleDecl(row.schedule, messages) }), _jsx("td", { className: "px-3 py-2 text-xs text-muted-foreground", children: formatNextRun(row, messages, rootMessages) }), _jsx("td", { className: "px-3 py-2 text-xs", children: formatLastRun(lastRun, row, messages, rootMessages) }), _jsx("td", { className: "px-3 py-2", children: _jsx(StatusPill, { row: row, envFlagDisabled: envFlagDisabled, messages: messages }) }), onTriggerNow ? (_jsx("td", { className: "px-3 py-2", children: _jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: onTriggerNow, disabled: triggering, children: triggering ? messages.triggering : messages.triggerNow }) })) : null] }));
84
+ }
85
+ function StatusPill({ row, envFlagDisabled, messages, }) {
86
+ if (envFlagDisabled) {
87
+ return (_jsx(Badge, { variant: "outline", className: "border-muted-foreground/30 text-muted-foreground", children: messages.disabledByEnvFlag }));
88
+ }
89
+ if (row.disabledReason === "registration_disabled") {
90
+ return (_jsx(Badge, { variant: "outline", className: "border-muted-foreground/30 text-muted-foreground", children: messages.disabledByRegistration }));
91
+ }
92
+ if (row.disabledReason === "env_filtered") {
93
+ return (_jsx(Badge, { variant: "outline", className: "border-muted-foreground/30 text-muted-foreground", children: messages.disabledByEnvironment }));
94
+ }
95
+ return (_jsx(Badge, { variant: "outline", className: "border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-300", children: messages.enabled }));
96
+ }
97
+ function formatScheduleDecl(decl, messages) {
98
+ if (decl.cron)
99
+ return messages.cron(decl.cron, decl.timezone ?? "UTC");
100
+ if (decl.every !== undefined)
101
+ return messages.every(String(decl.every));
102
+ if (decl.at)
103
+ return messages.at(decl.at);
104
+ return messages.eventDriven;
105
+ }
106
+ function formatNextRun(row, messages, rootMessages) {
107
+ if (!row.enabled || row.nextRunAt === null)
108
+ return messages.notScheduled;
109
+ const delta = row.nextRunAt - Date.now();
110
+ const relative = formatRelative(new Date(row.nextRunAt).toISOString(), rootMessages);
111
+ return delta >= 0 ? messages.inFuture(relative) : messages.inPast(relative);
112
+ }
113
+ function formatLastRun(lastRun, row, messages, rootMessages) {
114
+ if (lastRun) {
115
+ const relative = formatRelative(lastRun.startedAt, rootMessages);
116
+ const label = lastRunLabel(lastRun.status, relative, messages);
117
+ return (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(StatusIcon, { status: lastRun.status }), label] }));
118
+ }
119
+ if (row.lastError && row.lastFireAt !== undefined && row.lastFireAt !== null) {
120
+ const relative = formatRelative(new Date(row.lastFireAt).toISOString(), rootMessages);
121
+ return (_jsxs("span", { className: "inline-flex items-center gap-1.5", title: row.lastError, children: [_jsx(StatusIcon, { status: "failed" }), messages.lastRunFailed(relative)] }));
122
+ }
123
+ if (row.lastSuccessfulRunAt !== undefined && row.lastSuccessfulRunAt !== null) {
124
+ const relative = formatRelative(new Date(row.lastSuccessfulRunAt).toISOString(), rootMessages);
125
+ return (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(StatusIcon, { status: "succeeded" }), messages.lastRunSucceeded(relative)] }));
126
+ }
127
+ if (row.lastFireAt !== undefined && row.lastFireAt !== null) {
128
+ const relative = formatRelative(new Date(row.lastFireAt).toISOString(), rootMessages);
129
+ return (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(CalendarClock, { className: "h-3.5 w-3.5 text-muted-foreground", "aria-hidden": "true" }), messages.lastFireRecorded(relative)] }));
130
+ }
131
+ return _jsx("span", { className: "text-muted-foreground", children: messages.lastRunNone });
132
+ }
133
+ function lastRunLabel(status, relative, messages) {
134
+ switch (status) {
135
+ case "succeeded":
136
+ return messages.lastRunSucceeded(relative);
137
+ case "failed":
138
+ return messages.lastRunFailed(relative);
139
+ case "running":
140
+ return messages.lastRunRunning;
141
+ case "cancelled":
142
+ return messages.lastRunCancelled(relative);
143
+ }
144
+ }
@@ -0,0 +1,4 @@
1
+ import type { WorkflowRunsUiMessages } from "./messages.js";
2
+ export declare const workflowRunsUiEn: WorkflowRunsUiMessages;
3
+ export declare const workflowsUiEn: WorkflowRunsUiMessages;
4
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,eAAO,MAAM,gBAAgB,EAAE,sBAyI9B,CAAA;AAED,eAAO,MAAM,aAAa,wBAAmB,CAAA"}
@@ -0,0 +1,135 @@
1
+ export const workflowRunsUiEn = {
2
+ page: {
3
+ title: "Workflow runs",
4
+ subtitle: "Recent workflow executions and recorded steps.",
5
+ filterTitle: "Filter",
6
+ workflowLabel: "Workflow",
7
+ workflowPlaceholder: "checkout-finalize",
8
+ workflowEmpty: "No workflows in the visible runs.",
9
+ searchLabel: "Search",
10
+ searchPlaceholder: "Correlation, tag, error, input...",
11
+ statusLabel: "Status",
12
+ tagLabel: "Tag",
13
+ tagPlaceholder: "bookingId:bk_...",
14
+ tagEmpty: "No tags in the visible runs.",
15
+ addTag: "Add",
16
+ removeTag: "Remove tag",
17
+ timeRangeLabel: "Started",
18
+ live: "Live",
19
+ clearFilters: "Clear",
20
+ anyStatus: "Any",
21
+ empty: "No runs yet.",
22
+ selectPrompt: "Pick a run from the list to see its steps and payloads.",
23
+ loading: "Loading...",
24
+ loadError: "Could not load workflow runs.",
25
+ runCount: (count) => `${count} ${count === 1 ? "run" : "runs"}`,
26
+ filteredRunCount: (filtered, total) => filtered === total ? `${total} ${total === 1 ? "run" : "runs"}` : `${filtered}/${total} runs`,
27
+ timeRanges: {
28
+ "15m": "15m",
29
+ "1h": "1h",
30
+ "24h": "24h",
31
+ "7d": "7d",
32
+ all: "All",
33
+ },
34
+ },
35
+ status: {
36
+ running: "Running",
37
+ succeeded: "Succeeded",
38
+ failed: "Failed",
39
+ cancelled: "Cancelled",
40
+ },
41
+ stepStatus: {
42
+ running: "Running",
43
+ succeeded: "Succeeded",
44
+ failed: "Failed",
45
+ skipped: "Skipped",
46
+ compensated: "Compensated",
47
+ },
48
+ detail: {
49
+ trigger: "Trigger",
50
+ correlation: "Correlation",
51
+ parent: "Parent",
52
+ triggeredBy: "Triggered by",
53
+ tags: "Tags",
54
+ started: "Started",
55
+ finished: "Finished",
56
+ steps: "Steps",
57
+ noSteps: "No steps recorded.",
58
+ input: "Input",
59
+ output: "Output",
60
+ result: "Result",
61
+ runError: "Run error",
62
+ stackTrace: "Stack trace",
63
+ copy: "Copy",
64
+ copied: "Copied",
65
+ code: "code",
66
+ step: "step",
67
+ reruns: "Reruns of this run",
68
+ resumedAt: (step) => `resumed @ ${step}`,
69
+ durationUnavailable: "-",
70
+ },
71
+ actions: {
72
+ rerun: "Rerun",
73
+ rerunBusy: "Rerunning",
74
+ resume: "Resume from failed step",
75
+ resumeBusy: "Resuming",
76
+ waitForCompletion: "Wait for this run to finish before rerunning.",
77
+ rerunDescription: "Start a new run with the same recorded input.",
78
+ resumeDescription: "Skip already-completed steps and retry from the failed step.",
79
+ resumeUnavailable: "Resume is only available for failed runs.",
80
+ actionFailed: "Action failed.",
81
+ rerunStarted: "Rerun started; opening new run.",
82
+ resumeStarted: (step) => `Resumed from step "${step}"; opening new run.`,
83
+ runnerMissing: "No runner is registered for this workflow. Register a WorkflowRunner before rerun is available.",
84
+ rerunBlocked: "Rerun was blocked by the runner safety predicate.",
85
+ incompletePriorStep: "Cannot resume because an earlier step is incomplete.",
86
+ confirmTitle: "Confirm rerun",
87
+ confirmBody: "This workflow has side effects that re-fire on rerun. The new run starts from the first step with the same recorded input.",
88
+ confirmTip: "If the original failed mid-way, prefer Resume from failed step because it skips completed work.",
89
+ cancel: "Cancel",
90
+ rerunAnyway: "Rerun anyway",
91
+ },
92
+ format: {
93
+ relativeNow: "now",
94
+ },
95
+ schedules: {
96
+ title: "Workflow schedules",
97
+ subtitle: "Registered cron, interval, and one-shot schedules.",
98
+ environmentLabel: "Environment",
99
+ versionLabel: "Manifest",
100
+ workflowColumn: "Workflow",
101
+ scheduleColumn: "Schedule",
102
+ nextRunColumn: "Next run",
103
+ lastRunColumn: "Last run",
104
+ statusColumn: "Status",
105
+ actionsColumn: "Actions",
106
+ enabled: "Enabled",
107
+ disabledByRegistration: "Disabled",
108
+ disabledByEnvironment: "Disabled (env filtered)",
109
+ disabledByEnvFlag: "Disabled (env flag)",
110
+ envFlagOff: "Schedules disabled by environment flag — no schedules will fire.",
111
+ envFlagOn: "Schedules enabled.",
112
+ eventDriven: "event-driven",
113
+ cron: (expr, timezone) => `${expr} (${timezone})`,
114
+ every: (interval) => `every ${interval}`,
115
+ at: (timestamp) => `at ${timestamp}`,
116
+ triggerNow: "Trigger now",
117
+ triggering: "Triggering...",
118
+ triggerSuccess: "Run started.",
119
+ triggerFailed: "Trigger failed.",
120
+ refresh: "Refresh",
121
+ loading: "Loading schedules...",
122
+ loadError: "Could not load workflow schedules.",
123
+ empty: "No schedules registered for this environment.",
124
+ inFuture: (relative) => `in ${relative}`,
125
+ inPast: (relative) => `${relative} ago`,
126
+ notScheduled: "—",
127
+ lastRunSucceeded: (relative) => `succeeded ${relative} ago`,
128
+ lastRunFailed: (relative) => `failed ${relative} ago`,
129
+ lastRunRunning: "running",
130
+ lastRunCancelled: (relative) => `cancelled ${relative} ago`,
131
+ lastFireRecorded: (relative) => `fired ${relative} ago`,
132
+ lastRunNone: "never run",
133
+ },
134
+ };
135
+ export const workflowsUiEn = workflowRunsUiEn;
@@ -0,0 +1,5 @@
1
+ export { workflowRunsUiEn, workflowRunsUiEn as workflowsUiEn } from "./en.js";
2
+ export type { WorkflowRunsUiMessages, WorkflowRunsUiMessages as WorkflowsUiMessages, } from "./messages.js";
3
+ export { getWorkflowRunsUiI18n, getWorkflowRunsUiI18n as getWorkflowsUiI18n, resolveWorkflowRunsUiMessages, resolveWorkflowRunsUiMessages as resolveWorkflowsUiMessages, useWorkflowRunsUiI18n, useWorkflowRunsUiI18n as useWorkflowsUiI18n, useWorkflowRunsUiI18nOrDefault, useWorkflowRunsUiI18nOrDefault as useWorkflowsUiI18nOrDefault, useWorkflowRunsUiMessages, useWorkflowRunsUiMessages as useWorkflowsUiMessages, useWorkflowRunsUiMessagesOrDefault, useWorkflowRunsUiMessagesOrDefault as useWorkflowsUiMessagesOrDefault, type WorkflowRunsUiMessageOverrides, type WorkflowRunsUiMessageOverrides as WorkflowsUiMessageOverrides, WorkflowRunsUiMessagesProvider, WorkflowRunsUiMessagesProvider as WorkflowsUiMessagesProvider, workflowRunsUiMessageDefinitions, workflowRunsUiMessageDefinitions as workflowsUiMessageDefinitions, } from "./provider.js";
4
+ export { workflowRunsUiRo, workflowRunsUiRo as workflowsUiRo } from "./ro.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AAC7E,YAAY,EACV,sBAAsB,EACtB,sBAAsB,IAAI,mBAAmB,GAC9C,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,IAAI,kBAAkB,EAC3C,6BAA6B,EAC7B,6BAA6B,IAAI,0BAA0B,EAC3D,qBAAqB,EACrB,qBAAqB,IAAI,kBAAkB,EAC3C,8BAA8B,EAC9B,8BAA8B,IAAI,2BAA2B,EAC7D,yBAAyB,EACzB,yBAAyB,IAAI,sBAAsB,EACnD,kCAAkC,EAClC,kCAAkC,IAAI,+BAA+B,EACrE,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,IAAI,2BAA2B,EAClE,8BAA8B,EAC9B,8BAA8B,IAAI,2BAA2B,EAC7D,gCAAgC,EAChC,gCAAgC,IAAI,6BAA6B,GAClE,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { workflowRunsUiEn, workflowRunsUiEn as workflowsUiEn } from "./en.js";
2
+ export { getWorkflowRunsUiI18n, getWorkflowRunsUiI18n as getWorkflowsUiI18n, resolveWorkflowRunsUiMessages, resolveWorkflowRunsUiMessages as resolveWorkflowsUiMessages, useWorkflowRunsUiI18n, useWorkflowRunsUiI18n as useWorkflowsUiI18n, useWorkflowRunsUiI18nOrDefault, useWorkflowRunsUiI18nOrDefault as useWorkflowsUiI18nOrDefault, useWorkflowRunsUiMessages, useWorkflowRunsUiMessages as useWorkflowsUiMessages, useWorkflowRunsUiMessagesOrDefault, useWorkflowRunsUiMessagesOrDefault as useWorkflowsUiMessagesOrDefault, WorkflowRunsUiMessagesProvider, WorkflowRunsUiMessagesProvider as WorkflowsUiMessagesProvider, workflowRunsUiMessageDefinitions, workflowRunsUiMessageDefinitions as workflowsUiMessageDefinitions, } from "./provider.js";
3
+ export { workflowRunsUiRo, workflowRunsUiRo as workflowsUiRo } from "./ro.js";
@@ -0,0 +1,125 @@
1
+ import type { WorkflowRunStatus, WorkflowRunStepStatus } from "../types.js";
2
+ export type WorkflowRunsUiMessages = {
3
+ page: {
4
+ title: string;
5
+ subtitle: string;
6
+ filterTitle: string;
7
+ workflowLabel: string;
8
+ workflowPlaceholder: string;
9
+ workflowEmpty: string;
10
+ searchLabel: string;
11
+ searchPlaceholder: string;
12
+ statusLabel: string;
13
+ tagLabel: string;
14
+ tagPlaceholder: string;
15
+ tagEmpty: string;
16
+ addTag: string;
17
+ removeTag: string;
18
+ timeRangeLabel: string;
19
+ live: string;
20
+ clearFilters: string;
21
+ anyStatus: string;
22
+ empty: string;
23
+ selectPrompt: string;
24
+ loading: string;
25
+ loadError: string;
26
+ runCount: (count: number) => string;
27
+ filteredRunCount: (filtered: number, total: number) => string;
28
+ timeRanges: {
29
+ "15m": string;
30
+ "1h": string;
31
+ "24h": string;
32
+ "7d": string;
33
+ all: string;
34
+ };
35
+ };
36
+ status: Record<WorkflowRunStatus, string>;
37
+ stepStatus: Record<WorkflowRunStepStatus, string>;
38
+ detail: {
39
+ trigger: string;
40
+ correlation: string;
41
+ parent: string;
42
+ triggeredBy: string;
43
+ tags: string;
44
+ started: string;
45
+ finished: string;
46
+ steps: string;
47
+ noSteps: string;
48
+ input: string;
49
+ output: string;
50
+ result: string;
51
+ runError: string;
52
+ stackTrace: string;
53
+ copy: string;
54
+ copied: string;
55
+ code: string;
56
+ step: string;
57
+ reruns: string;
58
+ resumedAt: (step: string) => string;
59
+ durationUnavailable: string;
60
+ };
61
+ actions: {
62
+ rerun: string;
63
+ rerunBusy: string;
64
+ resume: string;
65
+ resumeBusy: string;
66
+ waitForCompletion: string;
67
+ rerunDescription: string;
68
+ resumeDescription: string;
69
+ resumeUnavailable: string;
70
+ actionFailed: string;
71
+ rerunStarted: string;
72
+ resumeStarted: (step: string) => string;
73
+ runnerMissing: string;
74
+ rerunBlocked: string;
75
+ incompletePriorStep: string;
76
+ confirmTitle: string;
77
+ confirmBody: string;
78
+ confirmTip: string;
79
+ cancel: string;
80
+ rerunAnyway: string;
81
+ };
82
+ format: {
83
+ relativeNow: string;
84
+ };
85
+ schedules: {
86
+ title: string;
87
+ subtitle: string;
88
+ environmentLabel: string;
89
+ versionLabel: string;
90
+ workflowColumn: string;
91
+ scheduleColumn: string;
92
+ nextRunColumn: string;
93
+ lastRunColumn: string;
94
+ statusColumn: string;
95
+ actionsColumn: string;
96
+ enabled: string;
97
+ disabledByRegistration: string;
98
+ disabledByEnvironment: string;
99
+ disabledByEnvFlag: string;
100
+ envFlagOff: string;
101
+ envFlagOn: string;
102
+ eventDriven: string;
103
+ cron: (expr: string, timezone: string) => string;
104
+ every: (interval: string) => string;
105
+ at: (timestamp: string) => string;
106
+ triggerNow: string;
107
+ triggering: string;
108
+ triggerSuccess: string;
109
+ triggerFailed: string;
110
+ refresh: string;
111
+ loading: string;
112
+ loadError: string;
113
+ empty: string;
114
+ inFuture: (relative: string) => string;
115
+ inPast: (relative: string) => string;
116
+ notScheduled: string;
117
+ lastRunSucceeded: (relative: string) => string;
118
+ lastRunFailed: (relative: string) => string;
119
+ lastRunRunning: string;
120
+ lastRunCancelled: (relative: string) => string;
121
+ lastFireRecorded: (relative: string) => string;
122
+ lastRunNone: string;
123
+ };
124
+ };
125
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { type LocaleMessageOverrides, type PackageI18nValue } from "@voyantjs/i18n";
2
+ import type { ReactNode } from "react";
3
+ import type { WorkflowRunsUiMessages } from "./messages.js";
4
+ export declare const workflowRunsUiMessageDefinitions: {
5
+ en: WorkflowRunsUiMessages;
6
+ ro: WorkflowRunsUiMessages;
7
+ };
8
+ export type WorkflowRunsUiMessageOverrides = LocaleMessageOverrides<WorkflowRunsUiMessages>;
9
+ export declare function resolveWorkflowRunsUiMessages({ locale, overrides, }: {
10
+ locale: string | null | undefined;
11
+ overrides?: WorkflowRunsUiMessageOverrides | null;
12
+ }): WorkflowRunsUiMessages;
13
+ export declare function getWorkflowRunsUiI18n({ locale, overrides, }: {
14
+ locale?: string | null | undefined;
15
+ overrides?: WorkflowRunsUiMessageOverrides | null;
16
+ }): PackageI18nValue<WorkflowRunsUiMessages>;
17
+ export declare function WorkflowRunsUiMessagesProvider({ children, locale, overrides, }: {
18
+ children: ReactNode;
19
+ locale: string | null | undefined;
20
+ overrides?: WorkflowRunsUiMessageOverrides | null;
21
+ }): import("react/jsx-runtime").JSX.Element;
22
+ export declare const useWorkflowRunsUiI18n: () => PackageI18nValue<WorkflowRunsUiMessages>;
23
+ export declare const useWorkflowRunsUiMessages: () => WorkflowRunsUiMessages;
24
+ export declare function useWorkflowRunsUiI18nOrDefault(): PackageI18nValue<WorkflowRunsUiMessages>;
25
+ export declare function useWorkflowRunsUiMessagesOrDefault(): WorkflowRunsUiMessages;
26
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/i18n/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAK3D,eAAO,MAAM,gCAAgC;;;CAGe,CAAA;AAE5D,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;AAU3F,wBAAgB,6BAA6B,CAAC,EAC5C,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAClD,0BAOA;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAClD,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,CAS3C;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAClD,2CAWA;AAED,eAAO,MAAM,qBAAqB,gDAAgC,CAAA;AAClE,eAAO,MAAM,yBAAyB,8BAAoC,CAAA;AAE1E,wBAAgB,8BAA8B,6CAE7C;AAED,wBAAgB,kCAAkC,2BAEjD"}