@ucdjs/pipelines-ui 0.0.1-beta.1

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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/components/detail/execution-result.d.mts +49 -0
  4. package/dist/components/detail/execution-result.mjs +366 -0
  5. package/dist/components/detail/version-selector.d.mts +21 -0
  6. package/dist/components/detail/version-selector.mjs +132 -0
  7. package/dist/components/graph/details.d.mts +14 -0
  8. package/dist/components/graph/details.mjs +369 -0
  9. package/dist/components/graph/filters.d.mts +14 -0
  10. package/dist/components/graph/filters.mjs +183 -0
  11. package/dist/components/graph/node-types.d.mts +10 -0
  12. package/dist/components/graph/node-types.mjs +13 -0
  13. package/dist/components/graph/nodes.d.mts +14 -0
  14. package/dist/components/graph/nodes.mjs +264 -0
  15. package/dist/components/graph/pipeline-graph.d.mts +15 -0
  16. package/dist/components/graph/pipeline-graph.mjs +241 -0
  17. package/dist/components/logs/execution-log-payload.d.mts +12 -0
  18. package/dist/components/logs/execution-log-payload.mjs +79 -0
  19. package/dist/components/logs/execution-log-table.d.mts +16 -0
  20. package/dist/components/logs/execution-log-table.mjs +121 -0
  21. package/dist/components/logs/execution-span-drawer.d.mts +16 -0
  22. package/dist/components/logs/execution-span-drawer.mjs +208 -0
  23. package/dist/components/logs/execution-waterfall.d.mts +18 -0
  24. package/dist/components/logs/execution-waterfall.mjs +354 -0
  25. package/dist/components/pipeline-sidebar.d.mts +6 -0
  26. package/dist/components/pipeline-sidebar.mjs +190 -0
  27. package/dist/components/status-badge.d.mts +11 -0
  28. package/dist/components/status-badge.mjs +50 -0
  29. package/dist/components/status-icon.d.mts +11 -0
  30. package/dist/components/status-icon.mjs +46 -0
  31. package/dist/hooks/index.d.mts +7 -0
  32. package/dist/hooks/index.mjs +8 -0
  33. package/dist/hooks/use-event-view.d.mts +19 -0
  34. package/dist/hooks/use-event-view.mjs +112 -0
  35. package/dist/hooks/use-execute.d.mts +20 -0
  36. package/dist/hooks/use-execute.mjs +68 -0
  37. package/dist/hooks/use-pipeline-file.d.mts +20 -0
  38. package/dist/hooks/use-pipeline-file.mjs +39 -0
  39. package/dist/hooks/use-pipeline-versions.d.mts +10 -0
  40. package/dist/hooks/use-pipeline-versions.mjs +137 -0
  41. package/dist/hooks/use-pipeline.d.mts +21 -0
  42. package/dist/hooks/use-pipeline.mjs +46 -0
  43. package/dist/hooks/use-pipelines.d.mts +26 -0
  44. package/dist/hooks/use-pipelines.mjs +38 -0
  45. package/dist/index.d.mts +31 -0
  46. package/dist/index.mjs +29 -0
  47. package/dist/lib/adapter.d.mts +26 -0
  48. package/dist/lib/adapter.mjs +74 -0
  49. package/dist/lib/colors.d.mts +7 -0
  50. package/dist/lib/colors.mjs +15 -0
  51. package/dist/lib/execution-logs.d.mts +19 -0
  52. package/dist/lib/execution-logs.mjs +74 -0
  53. package/dist/lib/format-time.d.mts +4 -0
  54. package/dist/lib/format-time.mjs +7 -0
  55. package/dist/lib/index.d.mts +5 -0
  56. package/dist/lib/index.mjs +6 -0
  57. package/dist/lib/layout.d.mts +8 -0
  58. package/dist/lib/layout.mjs +71 -0
  59. package/dist/lib/pipeline-utils.d.mts +9 -0
  60. package/dist/lib/pipeline-utils.mjs +49 -0
  61. package/dist/lib/utils.d.mts +6 -0
  62. package/dist/lib/utils.mjs +10 -0
  63. package/dist/styles/globals.css +3 -0
  64. package/dist/types.d.mts +143 -0
  65. package/package.json +95 -0
@@ -0,0 +1,121 @@
1
+ import { cn } from "../../lib/utils.mjs";
2
+ import { ExecutionLogPayloadPanel } from "./execution-log-payload.mjs";
3
+ import { formatTimestamp } from "../../lib/execution-logs.mjs";
4
+ import { c } from "react/compiler-runtime";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Fragment as Fragment$1 } from "react";
7
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@ucdjs-internal/shared-ui/ui/table";
8
+
9
+ //#region src/components/logs/execution-log-table.tsx
10
+ function getStreamAccent(stream) {
11
+ return stream === "stderr" ? "bg-red-500" : "bg-sky-500";
12
+ }
13
+ function ExecutionLogTable(t0) {
14
+ const $ = c(22);
15
+ const { logs, expandedLogId, onToggle } = t0;
16
+ const hasLogs = logs.length > 0;
17
+ const t1 = hasLogs && "hidden";
18
+ let t2;
19
+ if ($[0] !== t1) {
20
+ t2 = cn("border border-dashed border-border rounded-lg p-6 text-sm text-muted-foreground", t1);
21
+ $[0] = t1;
22
+ $[1] = t2;
23
+ } else t2 = $[1];
24
+ let t3;
25
+ if ($[2] !== t2) {
26
+ t3 = /* @__PURE__ */ jsx("div", {
27
+ className: t2,
28
+ children: "No logs captured for this execution."
29
+ });
30
+ $[2] = t2;
31
+ $[3] = t3;
32
+ } else t3 = $[3];
33
+ const t4 = !hasLogs && "hidden";
34
+ let t5;
35
+ if ($[4] !== t4) {
36
+ t5 = cn("border border-border rounded-lg overflow-hidden", t4);
37
+ $[4] = t4;
38
+ $[5] = t5;
39
+ } else t5 = $[5];
40
+ let t6;
41
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
42
+ t6 = /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
43
+ /* @__PURE__ */ jsx(TableHead, { className: "w-6" }),
44
+ /* @__PURE__ */ jsx(TableHead, {
45
+ className: "w-56",
46
+ children: "Timestamp"
47
+ }),
48
+ /* @__PURE__ */ jsx(TableHead, { children: "Message" })
49
+ ] }) });
50
+ $[6] = t6;
51
+ } else t6 = $[6];
52
+ let t7;
53
+ if ($[7] !== expandedLogId || $[8] !== logs || $[9] !== onToggle) {
54
+ let t8;
55
+ if ($[11] !== expandedLogId || $[12] !== onToggle) {
56
+ t8 = (log) => {
57
+ const isExpanded = expandedLogId === log.id;
58
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(TableRow, {
59
+ className: cn("cursor-pointer", log.stream === "stderr" && "bg-red-500/5", isExpanded && "bg-muted"),
60
+ onClick: () => onToggle(log.id),
61
+ children: [
62
+ /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: cn("block h-6 w-1 rounded-full", getStreamAccent(log.stream)) }) }),
63
+ /* @__PURE__ */ jsx(TableCell, {
64
+ className: "text-xs font-mono text-muted-foreground",
65
+ children: formatTimestamp(log.timestamp)
66
+ }),
67
+ /* @__PURE__ */ jsx(TableCell, {
68
+ className: "text-sm",
69
+ children: /* @__PURE__ */ jsx("span", {
70
+ className: "line-clamp-1",
71
+ children: log.payload?.message ?? log.message
72
+ })
73
+ })
74
+ ]
75
+ }), isExpanded && /* @__PURE__ */ jsx(TableRow, {
76
+ className: "bg-muted/30",
77
+ children: /* @__PURE__ */ jsx(TableCell, {
78
+ colSpan: 3,
79
+ className: "p-4",
80
+ children: /* @__PURE__ */ jsx(ExecutionLogPayloadPanel, { log })
81
+ })
82
+ })] }, log.id);
83
+ };
84
+ $[11] = expandedLogId;
85
+ $[12] = onToggle;
86
+ $[13] = t8;
87
+ } else t8 = $[13];
88
+ t7 = logs.map(t8);
89
+ $[7] = expandedLogId;
90
+ $[8] = logs;
91
+ $[9] = onToggle;
92
+ $[10] = t7;
93
+ } else t7 = $[10];
94
+ let t8;
95
+ if ($[14] !== t7) {
96
+ t8 = /* @__PURE__ */ jsxs(Table, { children: [t6, /* @__PURE__ */ jsx(TableBody, { children: t7 })] });
97
+ $[14] = t7;
98
+ $[15] = t8;
99
+ } else t8 = $[15];
100
+ let t9;
101
+ if ($[16] !== t5 || $[17] !== t8) {
102
+ t9 = /* @__PURE__ */ jsx("div", {
103
+ className: t5,
104
+ children: t8
105
+ });
106
+ $[16] = t5;
107
+ $[17] = t8;
108
+ $[18] = t9;
109
+ } else t9 = $[18];
110
+ let t10;
111
+ if ($[19] !== t3 || $[20] !== t9) {
112
+ t10 = /* @__PURE__ */ jsxs("div", { children: [t3, t9] });
113
+ $[19] = t3;
114
+ $[20] = t9;
115
+ $[21] = t10;
116
+ } else t10 = $[21];
117
+ return t10;
118
+ }
119
+
120
+ //#endregion
121
+ export { ExecutionLogTable };
@@ -0,0 +1,16 @@
1
+ import { ExecutionSpan } from "../../lib/execution-logs.mjs";
2
+ import * as react from "react";
3
+
4
+ //#region src/components/logs/execution-span-drawer.d.ts
5
+ interface ExecutionSpanDrawerProps {
6
+ span: ExecutionSpan | null;
7
+ baseTime: number;
8
+ onClose: () => void;
9
+ }
10
+ declare function ExecutionSpanDrawer({
11
+ span,
12
+ baseTime,
13
+ onClose
14
+ }: ExecutionSpanDrawerProps): react.JSX.Element;
15
+ //#endregion
16
+ export { ExecutionSpanDrawer, ExecutionSpanDrawerProps };
@@ -0,0 +1,208 @@
1
+ import { cn } from "../../lib/utils.mjs";
2
+ import { formatDuration } from "../../lib/execution-logs.mjs";
3
+ import { c } from "react/compiler-runtime";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Sheet, SheetContent, SheetHeader, SheetTitle } from "@ucdjs-internal/shared-ui/ui/sheet";
6
+
7
+ //#region src/components/logs/execution-span-drawer.tsx
8
+ function getPhaseColor(phase) {
9
+ switch (phase) {
10
+ case "Pipeline": return "bg-sky-400/70";
11
+ case "Version": return "bg-emerald-400/70";
12
+ case "Parse": return "bg-amber-400/70";
13
+ case "Resolve": return "bg-violet-400/70";
14
+ case "Artifact": return "bg-rose-400/70";
15
+ case "File": return "bg-cyan-400/70";
16
+ case "Cache": return "bg-lime-400/70";
17
+ case "Error": return "bg-red-500/80";
18
+ default: return "bg-slate-400/70";
19
+ }
20
+ }
21
+ function ExecutionSpanDrawer(t0) {
22
+ const $ = c(44);
23
+ const { span, baseTime, onClose } = t0;
24
+ const open = Boolean(span);
25
+ const offsetStart = span ? Math.max(0, span.start - baseTime) : 0;
26
+ const offsetEnd = span ? Math.max(0, span.end - baseTime) : 0;
27
+ let t1;
28
+ if ($[0] !== onClose) {
29
+ t1 = (nextOpen) => {
30
+ if (!nextOpen) onClose();
31
+ };
32
+ $[0] = onClose;
33
+ $[1] = t1;
34
+ } else t1 = $[1];
35
+ let t2;
36
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
37
+ t2 = /* @__PURE__ */ jsx(SheetHeader, { children: /* @__PURE__ */ jsx(SheetTitle, { children: "Span Details" }) });
38
+ $[2] = t2;
39
+ } else t2 = $[2];
40
+ let t3;
41
+ if ($[3] !== span) {
42
+ t3 = cn("h-2 w-2 rounded-full", span ? getPhaseColor(span.phase) : "bg-muted");
43
+ $[3] = span;
44
+ $[4] = t3;
45
+ } else t3 = $[4];
46
+ let t4;
47
+ if ($[5] !== t3) {
48
+ t4 = /* @__PURE__ */ jsx("span", { className: t3 });
49
+ $[5] = t3;
50
+ $[6] = t4;
51
+ } else t4 = $[6];
52
+ const t5 = span?.label ?? "No span selected";
53
+ let t6;
54
+ if ($[7] !== t5) {
55
+ t6 = /* @__PURE__ */ jsx("span", {
56
+ className: "text-sm font-medium truncate",
57
+ children: t5
58
+ });
59
+ $[7] = t5;
60
+ $[8] = t6;
61
+ } else t6 = $[8];
62
+ let t7;
63
+ if ($[9] !== t4 || $[10] !== t6) {
64
+ t7 = /* @__PURE__ */ jsxs("div", {
65
+ className: "flex items-center gap-2",
66
+ children: [t4, t6]
67
+ });
68
+ $[9] = t4;
69
+ $[10] = t6;
70
+ $[11] = t7;
71
+ } else t7 = $[11];
72
+ let t8;
73
+ if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
74
+ t8 = /* @__PURE__ */ jsx("span", { children: "Phase" });
75
+ $[12] = t8;
76
+ } else t8 = $[12];
77
+ const t9 = span?.phase ?? "-";
78
+ let t10;
79
+ if ($[13] !== t9) {
80
+ t10 = /* @__PURE__ */ jsxs("div", {
81
+ className: "flex items-center justify-between",
82
+ children: [t8, /* @__PURE__ */ jsx("span", {
83
+ className: "text-foreground",
84
+ children: t9
85
+ })]
86
+ });
87
+ $[13] = t9;
88
+ $[14] = t10;
89
+ } else t10 = $[14];
90
+ let t11;
91
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
92
+ t11 = /* @__PURE__ */ jsx("span", { children: "Duration" });
93
+ $[15] = t11;
94
+ } else t11 = $[15];
95
+ let t12;
96
+ if ($[16] !== span) {
97
+ t12 = span ? formatDuration(span.durationMs) : "-";
98
+ $[16] = span;
99
+ $[17] = t12;
100
+ } else t12 = $[17];
101
+ let t13;
102
+ if ($[18] !== t12) {
103
+ t13 = /* @__PURE__ */ jsxs("div", {
104
+ className: "flex items-center justify-between",
105
+ children: [t11, /* @__PURE__ */ jsx("span", {
106
+ className: "text-foreground",
107
+ children: t12
108
+ })]
109
+ });
110
+ $[18] = t12;
111
+ $[19] = t13;
112
+ } else t13 = $[19];
113
+ let t14;
114
+ if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
115
+ t14 = /* @__PURE__ */ jsx("span", { children: "Start offset" });
116
+ $[20] = t14;
117
+ } else t14 = $[20];
118
+ let t15;
119
+ if ($[21] !== offsetStart || $[22] !== span) {
120
+ t15 = span ? formatDuration(offsetStart) : "-";
121
+ $[21] = offsetStart;
122
+ $[22] = span;
123
+ $[23] = t15;
124
+ } else t15 = $[23];
125
+ let t16;
126
+ if ($[24] !== t15) {
127
+ t16 = /* @__PURE__ */ jsxs("div", {
128
+ className: "flex items-center justify-between",
129
+ children: [t14, /* @__PURE__ */ jsx("span", {
130
+ className: "text-foreground",
131
+ children: t15
132
+ })]
133
+ });
134
+ $[24] = t15;
135
+ $[25] = t16;
136
+ } else t16 = $[25];
137
+ let t17;
138
+ if ($[26] === Symbol.for("react.memo_cache_sentinel")) {
139
+ t17 = /* @__PURE__ */ jsx("span", { children: "End offset" });
140
+ $[26] = t17;
141
+ } else t17 = $[26];
142
+ let t18;
143
+ if ($[27] !== offsetEnd || $[28] !== span) {
144
+ t18 = span ? formatDuration(offsetEnd) : "-";
145
+ $[27] = offsetEnd;
146
+ $[28] = span;
147
+ $[29] = t18;
148
+ } else t18 = $[29];
149
+ let t19;
150
+ if ($[30] !== t18) {
151
+ t19 = /* @__PURE__ */ jsxs("div", {
152
+ className: "flex items-center justify-between",
153
+ children: [t17, /* @__PURE__ */ jsx("span", {
154
+ className: "text-foreground",
155
+ children: t18
156
+ })]
157
+ });
158
+ $[30] = t18;
159
+ $[31] = t19;
160
+ } else t19 = $[31];
161
+ let t20;
162
+ if ($[32] !== t10 || $[33] !== t13 || $[34] !== t16 || $[35] !== t19) {
163
+ t20 = /* @__PURE__ */ jsxs("div", {
164
+ className: "grid gap-3 text-xs text-muted-foreground",
165
+ children: [
166
+ t10,
167
+ t13,
168
+ t16,
169
+ t19
170
+ ]
171
+ });
172
+ $[32] = t10;
173
+ $[33] = t13;
174
+ $[34] = t16;
175
+ $[35] = t19;
176
+ $[36] = t20;
177
+ } else t20 = $[36];
178
+ let t21;
179
+ if ($[37] !== t20 || $[38] !== t7) {
180
+ t21 = /* @__PURE__ */ jsxs(SheetContent, {
181
+ side: "right",
182
+ className: "w-[380px]",
183
+ children: [t2, /* @__PURE__ */ jsxs("div", {
184
+ className: "px-4 pb-4 space-y-4",
185
+ children: [t7, t20]
186
+ })]
187
+ });
188
+ $[37] = t20;
189
+ $[38] = t7;
190
+ $[39] = t21;
191
+ } else t21 = $[39];
192
+ let t22;
193
+ if ($[40] !== open || $[41] !== t1 || $[42] !== t21) {
194
+ t22 = /* @__PURE__ */ jsx(Sheet, {
195
+ open,
196
+ onOpenChange: t1,
197
+ children: t21
198
+ });
199
+ $[40] = open;
200
+ $[41] = t1;
201
+ $[42] = t21;
202
+ $[43] = t22;
203
+ } else t22 = $[43];
204
+ return t22;
205
+ }
206
+
207
+ //#endregion
208
+ export { ExecutionSpanDrawer };
@@ -0,0 +1,18 @@
1
+ import { ExecutionSpan } from "../../lib/execution-logs.mjs";
2
+ import * as react from "react";
3
+
4
+ //#region src/components/logs/execution-waterfall.d.ts
5
+ interface ExecutionWaterfallProps {
6
+ spans: ExecutionSpan[];
7
+ selectedSpanId: string | null;
8
+ onSelect: (spanId: string | null) => void;
9
+ onSpanClick?: (span: ExecutionSpan) => void;
10
+ }
11
+ declare function ExecutionWaterfall({
12
+ spans,
13
+ selectedSpanId,
14
+ onSelect,
15
+ onSpanClick
16
+ }: ExecutionWaterfallProps): react.JSX.Element;
17
+ //#endregion
18
+ export { ExecutionWaterfall, ExecutionWaterfallProps };