@burdenoff/microfe-cosmicintersection 2026.704.2 → 2026.704.3

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 (50) hide show
  1. package/dist/cosmicintersection/CosmicIntersectionRoutes.js +39 -27
  2. package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
  3. package/dist/cosmicintersection/api/cosmicApi.js +6 -0
  4. package/dist/cosmicintersection/api/cosmicApi.js.map +1 -1
  5. package/dist/cosmicintersection/components/FacetPanel.js +66 -0
  6. package/dist/cosmicintersection/components/FacetPanel.js.map +1 -0
  7. package/dist/cosmicintersection/components/LineageGraph.js +388 -0
  8. package/dist/cosmicintersection/components/LineageGraph.js.map +1 -0
  9. package/dist/cosmicintersection/components/ResultsChart.js +329 -0
  10. package/dist/cosmicintersection/components/ResultsChart.js.map +1 -0
  11. package/dist/cosmicintersection/components/StepDAG.js +104 -0
  12. package/dist/cosmicintersection/components/StepDAG.js.map +1 -0
  13. package/dist/cosmicintersection/pages/access/AccessPage.js +207 -155
  14. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  15. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +325 -165
  16. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  17. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +138 -93
  18. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -1
  19. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -1
  20. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +26 -15
  21. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
  22. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +345 -219
  23. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
  24. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +321 -163
  25. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
  26. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +358 -0
  27. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -0
  28. package/dist/cosmicintersection/pages/lineage/LineagePage.js +171 -0
  29. package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -0
  30. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +232 -162
  31. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -1
  32. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +143 -82
  33. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
  34. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +286 -142
  35. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -1
  36. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +305 -103
  37. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -1
  38. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +183 -79
  39. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
  40. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +262 -170
  41. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  42. package/dist/cosmicintersection/pages/runs/RunDetailPage.js +179 -136
  43. package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -1
  44. package/dist/cosmicintersection/pages/runs/RunsPage.js +124 -47
  45. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
  46. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +114 -85
  47. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js.map +1 -1
  48. package/dist/cosmicintersection/pages/sources/SourcesPage.js +263 -152
  49. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
  50. package/package.json +1 -1
@@ -1,244 +1,388 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
- import { useCosArchivePipelineMutation as n, useCosPipelineQuery as ee, useCosRunsQuery as te, useCosStartRunMutation as r } from "../../api/cosmicApi.js";
4
- import i from "../../components/EmptyState.js";
5
- import a from "../../components/ErrorState.js";
6
- import o from "../../components/LoadingState.js";
7
- import s from "../../components/PageLayout.js";
8
- import ne, { usePagination as re } from "../../components/Pagination.js";
9
- import c, { formatEnumLabel as l } from "../../components/StatusBadge.js";
3
+ import { useCosArchivePipelineMutation as n, useCosPipelineQuery as r, useCosRunStepsQuery as i, useCosRunsQuery as ee, useCosStartRunMutation as te } from "../../api/cosmicApi.js";
4
+ import a from "../../components/EmptyState.js";
5
+ import o from "../../components/ErrorState.js";
6
+ import s from "../../components/LoadingState.js";
7
+ import c from "../../components/PageLayout.js";
8
+ import l, { usePagination as u } from "../../components/Pagination.js";
9
+ import d, { formatEnumLabel as f } from "../../components/StatusBadge.js";
10
10
  import "../../components/index.js";
11
- import { mutationSucceeded as u } from "../../lib/mutationResult.js";
12
- import { useMemo as d, useState as f } from "react";
13
- import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
14
- import { useParams as g } from "react-router-dom";
15
- import { Archive as ie, Pencil as ae, Play as _ } from "lucide-react";
16
- import { AlertDialog as oe, AlertDialogAction as se, AlertDialogCancel as v, AlertDialogContent as y, AlertDialogDescription as b, AlertDialogFooter as ce, AlertDialogHeader as x, AlertDialogTitle as S, Button as C, Card as w, CardContent as T, CardHeader as E, CardTitle as D, Table as le, TableBody as O, TableCell as k, TableHead as A, TableHeader as j, TableRow as M, buttonVariants as N } from "@burdenoff/fe-libs/ui";
11
+ import ne from "../../components/StepDAG.js";
12
+ import { mutationSucceeded as p } from "../../lib/mutationResult.js";
13
+ import { useMemo as m, useState as re } from "react";
14
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
15
+ import { useParams as ie } from "react-router-dom";
16
+ import { Archive as ae, Clock as oe, Hash as se, Pencil as v, Play as y } from "lucide-react";
17
+ import { AlertDialog as ce, AlertDialogAction as le, AlertDialogCancel as ue, AlertDialogContent as de, AlertDialogDescription as fe, AlertDialogFooter as pe, AlertDialogHeader as me, AlertDialogTitle as he, Button as b, Card as x, CardContent as S, CardHeader as C, CardTitle as w, Table as ge, TableBody as _e, TableCell as T, TableHead as E, TableHeader as ve, TableRow as D, buttonVariants as ye } from "@burdenoff/fe-libs/ui";
17
18
  //#region src/cosmicintersection/pages/pipelines/PipelineDetailPage.tsx
18
- function P(e) {
19
+ var O = [
20
+ "INGEST",
21
+ "CALIBRATE",
22
+ "TRANSFORM",
23
+ "ANALYZE",
24
+ "EXPORT",
25
+ "NOTIFY"
26
+ ];
27
+ function k(e) {
28
+ return typeof e == "string" && O.includes(e);
29
+ }
30
+ function A(e) {
31
+ if (!e) return [];
32
+ let t = e.steps;
33
+ if (!Array.isArray(t)) return [];
34
+ let n = [];
35
+ for (let e of t) if (e && typeof e == "object" && !Array.isArray(e)) {
36
+ let t = e.kind, r = e.name;
37
+ k(t) && n.push({
38
+ kind: t,
39
+ name: typeof r == "string" ? r : void 0
40
+ });
41
+ }
42
+ return n;
43
+ }
44
+ function j(e) {
19
45
  if (!e) return "—";
20
46
  let t = new Date(e);
21
47
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
22
48
  }
23
- function F(e) {
49
+ function M(e) {
24
50
  if (e == null) return "—";
25
51
  if (e < 1e3) return `${e} ms`;
26
52
  let t = e / 1e3;
27
53
  return t < 60 ? `${t.toFixed(1)} s` : `${Math.floor(t / 60)}m ${Math.round(t % 60)}s`;
28
54
  }
29
- function I({ label: e, children: t }) {
30
- return /* @__PURE__ */ h("div", {
55
+ function N({ label: e, children: t }) {
56
+ return /* @__PURE__ */ _("div", {
31
57
  className: "flex flex-col gap-1 border-b border-border-seam py-3 last:border-0 sm:flex-row sm:items-start sm:gap-4",
32
- children: [/* @__PURE__ */ m("span", {
58
+ children: [/* @__PURE__ */ g("span", {
33
59
  className: "w-40 shrink-0 text-sm font-medium text-text-secondary",
34
60
  children: e
35
- }), /* @__PURE__ */ m("span", {
61
+ }), /* @__PURE__ */ g("span", {
36
62
  className: "min-w-0 text-sm text-text-primary",
37
63
  children: t
38
64
  })]
39
65
  });
40
66
  }
41
- function L() {
42
- let { id: L = "" } = g(), { navigate: R } = e(), { data: z, loading: B, error: V, refetch: H } = ee(L), U = re({
67
+ function P({ icon: e, children: t }) {
68
+ return /* @__PURE__ */ _("span", {
69
+ className: "inline-flex items-center gap-1.5 rounded-full border border-border-default bg-bg-elevated px-2.5 py-0.5 text-xs text-text-secondary",
70
+ children: [e ? /* @__PURE__ */ g(e, {
71
+ className: "size-3.5",
72
+ "aria-hidden": "true"
73
+ }) : null, t]
74
+ });
75
+ }
76
+ function F() {
77
+ let { id: O = "" } = ie(), { navigate: k } = e(), { data: F, loading: be, error: xe, refetch: I } = r(O), L = u({
43
78
  pageSize: 10,
44
- resetKey: L
45
- }), { data: W, loading: G, error: ue, refetch: K } = te({
46
- pipelineId: L,
79
+ resetKey: O
80
+ }), { data: R, loading: z, error: Se, refetch: B } = ee({
81
+ pipelineId: O,
47
82
  pagination: {
48
- limit: U.limit,
49
- offset: U.offset
83
+ limit: L.limit,
84
+ offset: L.offset
50
85
  }
51
- }), [de, { loading: q }] = r(), [fe, { loading: J }] = n(), [pe, Y] = f(!1), X = z?.cosPipeline, Z = d(() => W?.cosListRuns.items ?? [], [W]), me = W?.cosListRuns.pageInfo, Q = async () => {
52
- if (!X) return;
53
- let e = await de({ variables: { input: { pipelineId: X.id } } }), n = e.data?.cosStartRun?.id;
54
- u(e, n, "Could not start a run") && (t.success("Run started", "A new run was queued."), await Promise.all([H(), K()]), n && R(`runs/${n}`));
55
- }, he = async () => {
56
- if (!X) return;
57
- let e = await fe({ variables: { id: X.id } });
58
- u(e, e.data?.cosArchivePipeline, "Could not archive pipeline") && (Y(!1), t.success("Pipeline archived", `“${X.name}” was archived.`), R("pipelines"));
86
+ }), V = F?.cosPipeline, H = m(() => R?.cosListRuns.items ?? [], [R]), Ce = R?.cosListRuns.pageInfo, U = m(() => A(V?.definition), [V?.definition]), W = H[0]?.id ?? "", { data: G } = i(V && U.length === 0 && W ? W : ""), K = m(() => [...G?.cosListRunSteps ?? []].sort((e, t) => e.position - t.position).map((e) => ({
87
+ kind: e.kind,
88
+ name: e.name,
89
+ status: e.status
90
+ })), [G]), q = U.length > 0 ? U : K, we = U.length === 0 && K.length > 0, [J, { loading: Y }] = te(), [Te, { loading: X }] = n(), [Ee, Z] = re(!1), Q = async () => {
91
+ if (!V) return;
92
+ let e = await J({ variables: { input: { pipelineId: V.id } } }), n = e.data?.cosStartRun?.id;
93
+ p(e, n, "Could not start a run") && (t.success("Run started", "A new run was queued."), await Promise.all([I(), B()]), n && k(`runs/${n}`));
94
+ }, De = async () => {
95
+ if (!V) return;
96
+ let e = await Te({ variables: { id: V.id } });
97
+ p(e, e.data?.cosArchivePipeline, "Could not archive pipeline") && (Z(!1), t.success("Pipeline archived", `“${V.name}” was archived.`), k("pipelines"));
59
98
  };
60
- if (B) return /* @__PURE__ */ m(s, {
99
+ if (be) return /* @__PURE__ */ g(c, {
61
100
  title: "Pipeline",
62
101
  backPath: "pipelines",
63
- children: /* @__PURE__ */ m(o, { label: "Loading pipeline…" })
102
+ children: /* @__PURE__ */ g(s, { label: "Loading pipeline…" })
64
103
  });
65
- if (V) return /* @__PURE__ */ m(s, {
104
+ if (xe) return /* @__PURE__ */ g(c, {
66
105
  title: "Pipeline",
67
106
  backPath: "pipelines",
68
- children: /* @__PURE__ */ m(a, { onRetry: () => void H() })
107
+ children: /* @__PURE__ */ g(o, { onRetry: () => void I() })
69
108
  });
70
- if (!X) return /* @__PURE__ */ m(s, {
109
+ if (!V) return /* @__PURE__ */ g(c, {
71
110
  title: "Pipeline",
72
111
  backPath: "pipelines",
73
- children: /* @__PURE__ */ m(i, {
112
+ children: /* @__PURE__ */ g(a, {
74
113
  title: "Pipeline not found",
75
114
  description: "This pipeline may have been archived or you may not have access to it.",
76
- action: /* @__PURE__ */ m(C, {
115
+ action: /* @__PURE__ */ g(b, {
77
116
  type: "button",
78
117
  variant: "outline",
79
- onClick: () => R("pipelines"),
118
+ onClick: () => k("pipelines"),
80
119
  children: "Back to pipelines"
81
120
  })
82
121
  })
83
122
  });
84
- let $ = X.status === "ARCHIVED";
85
- return /* @__PURE__ */ h(s, {
86
- title: X.name,
87
- description: X.description ?? void 0,
123
+ let $ = V.status === "ARCHIVED", Oe = !!(V.definition && Object.keys(V.definition).length > 0);
124
+ return /* @__PURE__ */ _(c, {
125
+ title: V.name,
126
+ description: V.description ?? void 0,
88
127
  backPath: "pipelines",
89
- actions: /* @__PURE__ */ h("div", {
128
+ actions: /* @__PURE__ */ _("div", {
90
129
  className: "flex flex-wrap items-center gap-2",
91
130
  children: [
92
- /* @__PURE__ */ h(C, {
131
+ /* @__PURE__ */ _(b, {
93
132
  type: "button",
94
133
  onClick: () => void Q(),
95
- disabled: q || $,
96
- children: [/* @__PURE__ */ m(_, { className: "size-4" }), q ? "Starting…" : "Start run"]
134
+ disabled: Y || $,
135
+ children: [/* @__PURE__ */ g(y, { className: "size-4" }), Y ? "Starting…" : "Start run"]
97
136
  }),
98
- /* @__PURE__ */ h(C, {
137
+ /* @__PURE__ */ _(b, {
99
138
  type: "button",
100
139
  variant: "outline",
101
- onClick: () => R(`pipelines/${X.id}/edit`),
102
- children: [/* @__PURE__ */ m(ae, { className: "size-4" }), "Edit"]
140
+ onClick: () => k(`pipelines/${V.id}/edit`),
141
+ children: [/* @__PURE__ */ g(v, { className: "size-4" }), "Edit"]
103
142
  }),
104
- $ ? null : /* @__PURE__ */ h(C, {
143
+ $ ? null : /* @__PURE__ */ _(b, {
105
144
  type: "button",
106
145
  variant: "outline",
107
- onClick: () => Y(!0),
108
- children: [/* @__PURE__ */ m(ie, { className: "size-4" }), "Archive"]
146
+ onClick: () => Z(!0),
147
+ children: [/* @__PURE__ */ g(ae, { className: "size-4" }), "Archive"]
109
148
  })
110
149
  ]
111
150
  }),
112
- children: [/* @__PURE__ */ h("div", {
151
+ children: [/* @__PURE__ */ _("div", {
113
152
  className: "space-y-6",
114
153
  children: [
115
- /* @__PURE__ */ h(w, { children: [/* @__PURE__ */ m(E, { children: /* @__PURE__ */ m(D, { children: "Overview" }) }), /* @__PURE__ */ h(T, { children: [
116
- /* @__PURE__ */ m(I, {
154
+ /* @__PURE__ */ _("div", {
155
+ className: "flex flex-wrap items-center gap-2",
156
+ children: [
157
+ /* @__PURE__ */ g(d, { status: V.status }),
158
+ /* @__PURE__ */ g(P, {
159
+ icon: oe,
160
+ children: f(V.trigger)
161
+ }),
162
+ V.schedule ? /* @__PURE__ */ g(P, { children: /* @__PURE__ */ g("span", {
163
+ className: "font-mono",
164
+ children: V.schedule
165
+ }) }) : null,
166
+ /* @__PURE__ */ _(P, {
167
+ icon: se,
168
+ children: ["v", V.version]
169
+ })
170
+ ]
171
+ }),
172
+ /* @__PURE__ */ _(x, { children: [/* @__PURE__ */ g(C, { children: /* @__PURE__ */ g(w, { children: "Overview" }) }), /* @__PURE__ */ _(S, {
173
+ className: "space-y-4",
174
+ children: [
175
+ /* @__PURE__ */ _("div", {
176
+ className: "flex flex-wrap items-baseline justify-between gap-2",
177
+ children: [/* @__PURE__ */ g("span", {
178
+ className: "text-sm font-medium text-text-secondary",
179
+ children: "Step flow"
180
+ }), we ? /* @__PURE__ */ g("span", {
181
+ className: "text-xs text-text-secondary",
182
+ children: "Derived from the latest run."
183
+ }) : null]
184
+ }),
185
+ q.length > 0 ? /* @__PURE__ */ g(ne, { steps: q }) : /* @__PURE__ */ _("div", {
186
+ className: "rounded-card border border-dashed border-border-default bg-bg-sunken px-4 py-8 text-center",
187
+ children: [/* @__PURE__ */ g("p", {
188
+ className: "text-sm text-text-secondary",
189
+ children: "No steps defined yet. Edit the pipeline to add ingest, calibrate, transform, analyze or export steps."
190
+ }), /* @__PURE__ */ _(b, {
191
+ type: "button",
192
+ variant: "outline",
193
+ size: "sm",
194
+ className: "mt-3",
195
+ onClick: () => k(`pipelines/${V.id}/edit`),
196
+ children: [/* @__PURE__ */ g(v, { className: "size-4" }), "Add steps"]
197
+ })]
198
+ }),
199
+ Oe ? /* @__PURE__ */ _("details", {
200
+ className: "group rounded-card border border-border-default bg-bg-sunken",
201
+ children: [/* @__PURE__ */ _("summary", {
202
+ className: "flex cursor-pointer list-none items-center justify-between px-4 py-2.5 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary",
203
+ children: ["Advanced — raw definition JSON", /* @__PURE__ */ g("span", {
204
+ className: "text-xs text-text-secondary transition-transform group-open:rotate-180",
205
+ children: "▾"
206
+ })]
207
+ }), /* @__PURE__ */ g("pre", {
208
+ className: "overflow-x-auto border-t border-border-seam p-4 font-mono text-xs text-text-primary",
209
+ children: JSON.stringify(V.definition, null, 2)
210
+ })]
211
+ }) : null
212
+ ]
213
+ })] }),
214
+ /* @__PURE__ */ _(x, { children: [/* @__PURE__ */ g(C, { children: /* @__PURE__ */ g(w, { children: "Details" }) }), /* @__PURE__ */ _(S, { children: [
215
+ /* @__PURE__ */ g(N, {
117
216
  label: "Status",
118
- children: /* @__PURE__ */ m(c, { status: X.status })
217
+ children: /* @__PURE__ */ g(d, { status: V.status })
119
218
  }),
120
- /* @__PURE__ */ m(I, {
219
+ /* @__PURE__ */ g(N, {
121
220
  label: "Trigger",
122
- children: l(X.trigger)
221
+ children: f(V.trigger)
123
222
  }),
124
- /* @__PURE__ */ m(I, {
223
+ /* @__PURE__ */ g(N, {
125
224
  label: "Schedule",
126
- children: X.schedule ? /* @__PURE__ */ m("span", {
225
+ children: V.schedule ? /* @__PURE__ */ g("span", {
127
226
  className: "font-mono text-xs",
128
- children: X.schedule
227
+ children: V.schedule
129
228
  }) : "—"
130
229
  }),
131
- /* @__PURE__ */ h(I, {
230
+ /* @__PURE__ */ _(N, {
132
231
  label: "Version",
133
- children: ["v", X.version]
232
+ children: ["v", V.version]
134
233
  }),
135
- /* @__PURE__ */ m(I, {
234
+ /* @__PURE__ */ g(N, {
136
235
  label: "Last run",
137
- children: P(X.lastRunAt)
236
+ children: j(V.lastRunAt)
138
237
  }),
139
- /* @__PURE__ */ m(I, {
238
+ /* @__PURE__ */ g(N, {
140
239
  label: "Created",
141
- children: P(X.createdAt)
240
+ children: j(V.createdAt)
142
241
  }),
143
- /* @__PURE__ */ m(I, {
242
+ /* @__PURE__ */ g(N, {
144
243
  label: "Tags",
145
- children: X.tags.length === 0 ? "—" : /* @__PURE__ */ m("span", {
244
+ children: V.tags.length === 0 ? "—" : /* @__PURE__ */ g("span", {
146
245
  className: "flex flex-wrap gap-1",
147
- children: X.tags.map((e) => /* @__PURE__ */ m("span", {
246
+ children: V.tags.map((e) => /* @__PURE__ */ g("span", {
148
247
  className: "rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary",
149
248
  children: e
150
249
  }, e))
151
250
  })
152
251
  })
153
252
  ] })] }),
154
- /* @__PURE__ */ h(w, { children: [/* @__PURE__ */ m(E, { children: /* @__PURE__ */ m(D, { children: "Definition" }) }), /* @__PURE__ */ m(T, { children: X.definition && Object.keys(X.definition).length > 0 ? /* @__PURE__ */ m("pre", {
155
- className: "overflow-x-auto rounded-card border border-border-default bg-bg-sunken p-4 font-mono text-xs text-text-primary",
156
- children: JSON.stringify(X.definition, null, 2)
157
- }) : /* @__PURE__ */ m("p", {
158
- className: "text-sm text-text-secondary",
159
- children: "No definition configured yet. Edit the pipeline to describe its steps."
160
- }) })] }),
161
- /* @__PURE__ */ h(w, { children: [/* @__PURE__ */ m(E, { children: /* @__PURE__ */ m(D, { children: "Runs" }) }), /* @__PURE__ */ m(T, { children: G ? /* @__PURE__ */ m(o, {
253
+ /* @__PURE__ */ _(x, { children: [/* @__PURE__ */ g(C, { children: /* @__PURE__ */ g(w, { children: "Runs" }) }), /* @__PURE__ */ g(S, { children: z ? /* @__PURE__ */ g(s, {
162
254
  variant: "rows",
163
255
  rows: 4,
164
256
  label: "Loading runs…"
165
- }) : ue ? /* @__PURE__ */ m(a, {
257
+ }) : Se ? /* @__PURE__ */ g(o, {
166
258
  message: "Could not load runs.",
167
- onRetry: () => void K()
168
- }) : Z.length === 0 ? /* @__PURE__ */ m(i, {
169
- icon: _,
259
+ onRetry: () => void B()
260
+ }) : H.length === 0 ? /* @__PURE__ */ g(a, {
261
+ icon: y,
170
262
  title: "No runs yet",
171
263
  description: "Start a run to process data through this pipeline.",
172
- action: /* @__PURE__ */ h(C, {
264
+ action: /* @__PURE__ */ _(b, {
173
265
  type: "button",
174
266
  onClick: () => void Q(),
175
267
  disabled: $,
176
- children: [/* @__PURE__ */ m(_, { className: "size-4" }), "Start run"]
268
+ children: [/* @__PURE__ */ g(y, { className: "size-4" }), "Start run"]
269
+ })
270
+ }) : /* @__PURE__ */ _(h, { children: [
271
+ /* @__PURE__ */ g("div", {
272
+ className: "hidden rounded-card border border-border-default md:block",
273
+ children: /* @__PURE__ */ _(ge, { children: [/* @__PURE__ */ g(ve, { children: /* @__PURE__ */ _(D, { children: [
274
+ /* @__PURE__ */ g(E, { children: "Run" }),
275
+ /* @__PURE__ */ g(E, { children: "Status" }),
276
+ /* @__PURE__ */ g(E, { children: "Started" }),
277
+ /* @__PURE__ */ g(E, { children: "Duration" }),
278
+ /* @__PURE__ */ g(E, { children: "Triggered by" })
279
+ ] }) }), /* @__PURE__ */ g(_e, { children: H.map((e) => /* @__PURE__ */ _(D, {
280
+ className: "cursor-pointer",
281
+ onClick: () => k(`runs/${e.id}`),
282
+ children: [
283
+ /* @__PURE__ */ _(T, {
284
+ className: "font-medium text-text-primary",
285
+ children: ["#", e.runNumber]
286
+ }),
287
+ /* @__PURE__ */ g(T, { children: /* @__PURE__ */ g(d, { status: e.status }) }),
288
+ /* @__PURE__ */ g(T, {
289
+ className: "whitespace-nowrap text-text-secondary",
290
+ children: j(e.startedAt)
291
+ }),
292
+ /* @__PURE__ */ g(T, {
293
+ className: "tabular-nums text-text-secondary",
294
+ children: M(e.durationMs)
295
+ }),
296
+ /* @__PURE__ */ g(T, {
297
+ className: "text-text-secondary",
298
+ children: e.triggeredBy || "—"
299
+ })
300
+ ]
301
+ }, e.id)) })] })
302
+ }),
303
+ /* @__PURE__ */ g("ul", {
304
+ className: "space-y-3 md:hidden",
305
+ children: H.map((e) => /* @__PURE__ */ g("li", { children: /* @__PURE__ */ _("button", {
306
+ type: "button",
307
+ onClick: () => k(`runs/${e.id}`),
308
+ className: "flex w-full flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 text-left transition-colors hover:border-border-strong",
309
+ children: [/* @__PURE__ */ _("div", {
310
+ className: "flex items-center justify-between gap-2",
311
+ children: [/* @__PURE__ */ _("span", {
312
+ className: "font-medium text-text-primary",
313
+ children: ["#", e.runNumber]
314
+ }), /* @__PURE__ */ g(d, { status: e.status })]
315
+ }), /* @__PURE__ */ _("dl", {
316
+ className: "grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-text-secondary",
317
+ children: [
318
+ /* @__PURE__ */ _("div", {
319
+ className: "flex flex-col",
320
+ children: [/* @__PURE__ */ g("dt", {
321
+ className: "text-text-secondary",
322
+ children: "Started"
323
+ }), /* @__PURE__ */ g("dd", {
324
+ className: "text-text-primary",
325
+ children: j(e.startedAt)
326
+ })]
327
+ }),
328
+ /* @__PURE__ */ _("div", {
329
+ className: "flex flex-col",
330
+ children: [/* @__PURE__ */ g("dt", {
331
+ className: "text-text-secondary",
332
+ children: "Duration"
333
+ }), /* @__PURE__ */ g("dd", {
334
+ className: "tabular-nums text-text-primary",
335
+ children: M(e.durationMs)
336
+ })]
337
+ }),
338
+ /* @__PURE__ */ _("div", {
339
+ className: "col-span-2 flex flex-col",
340
+ children: [/* @__PURE__ */ g("dt", {
341
+ className: "text-text-secondary",
342
+ children: "Triggered by"
343
+ }), /* @__PURE__ */ g("dd", {
344
+ className: "text-text-primary",
345
+ children: e.triggeredBy || "—"
346
+ })]
347
+ })
348
+ ]
349
+ })]
350
+ }) }, e.id))
351
+ }),
352
+ /* @__PURE__ */ g(l, {
353
+ offset: L.offset,
354
+ limit: L.limit,
355
+ loadedCount: H.length,
356
+ hasMore: Ce?.hasMore ?? !1,
357
+ onPrev: L.prevPage,
358
+ onNext: L.nextPage,
359
+ itemLabel: "runs",
360
+ loading: z
177
361
  })
178
- }) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
179
- className: "overflow-x-auto rounded-card border border-border-default",
180
- children: /* @__PURE__ */ h(le, { children: [/* @__PURE__ */ m(j, { children: /* @__PURE__ */ h(M, { children: [
181
- /* @__PURE__ */ m(A, { children: "Run" }),
182
- /* @__PURE__ */ m(A, { children: "Status" }),
183
- /* @__PURE__ */ m(A, { children: "Started" }),
184
- /* @__PURE__ */ m(A, { children: "Duration" }),
185
- /* @__PURE__ */ m(A, { children: "Triggered by" })
186
- ] }) }), /* @__PURE__ */ m(O, { children: Z.map((e) => /* @__PURE__ */ h(M, {
187
- className: "cursor-pointer",
188
- onClick: () => R(`runs/${e.id}`),
189
- children: [
190
- /* @__PURE__ */ h(k, {
191
- className: "font-medium text-text-primary",
192
- children: ["#", e.runNumber]
193
- }),
194
- /* @__PURE__ */ m(k, { children: /* @__PURE__ */ m(c, { status: e.status }) }),
195
- /* @__PURE__ */ m(k, {
196
- className: "whitespace-nowrap text-text-secondary",
197
- children: P(e.startedAt)
198
- }),
199
- /* @__PURE__ */ m(k, {
200
- className: "tabular-nums text-text-secondary",
201
- children: F(e.durationMs)
202
- }),
203
- /* @__PURE__ */ m(k, {
204
- className: "text-text-secondary",
205
- children: e.triggeredBy || "—"
206
- })
207
- ]
208
- }, e.id)) })] })
209
- }), /* @__PURE__ */ m(ne, {
210
- offset: U.offset,
211
- limit: U.limit,
212
- loadedCount: Z.length,
213
- hasMore: me?.hasMore ?? !1,
214
- onPrev: U.prevPage,
215
- onNext: U.nextPage,
216
- itemLabel: "runs",
217
- loading: G
218
- })] }) })] })
362
+ ] }) })] })
219
363
  ]
220
- }), /* @__PURE__ */ m(oe, {
221
- open: pe,
222
- onOpenChange: (e) => J ? void 0 : Y(e),
223
- children: /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ h(x, { children: [/* @__PURE__ */ h(S, { children: [
364
+ }), /* @__PURE__ */ g(ce, {
365
+ open: Ee,
366
+ onOpenChange: (e) => X ? void 0 : Z(e),
367
+ children: /* @__PURE__ */ _(de, { children: [/* @__PURE__ */ _(me, { children: [/* @__PURE__ */ _(he, { children: [
224
368
  "Archive “",
225
- X.name,
369
+ V.name,
226
370
  "”?"
227
- ] }), /* @__PURE__ */ m(b, { children: "Archiving stops the pipeline from being triggered. Existing runs are kept for reference." })] }), /* @__PURE__ */ h(ce, { children: [/* @__PURE__ */ m(v, {
228
- disabled: J,
371
+ ] }), /* @__PURE__ */ g(fe, { children: "Archiving stops the pipeline from being triggered. Existing runs are kept for reference." })] }), /* @__PURE__ */ _(pe, { children: [/* @__PURE__ */ g(ue, {
372
+ disabled: X,
229
373
  children: "Cancel"
230
- }), /* @__PURE__ */ m(se, {
374
+ }), /* @__PURE__ */ g(le, {
231
375
  onClick: (e) => {
232
- e.preventDefault(), he();
376
+ e.preventDefault(), De();
233
377
  },
234
- disabled: J,
235
- className: N({ variant: "destructive" }),
236
- children: J ? "Archiving…" : "Archive pipeline"
378
+ disabled: X,
379
+ className: ye({ variant: "destructive" }),
380
+ children: X ? "Archiving…" : "Archive pipeline"
237
381
  })] })] })
238
382
  })]
239
383
  });
240
384
  }
241
385
  //#endregion
242
- export { L as default };
386
+ export { F as default };
243
387
 
244
388
  //# sourceMappingURL=PipelineDetailPage.js.map