@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,29 +1,29 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
- import { useCosAddRunStepMutation as n, useCosRunQuery as r, useCosRunStepsQuery as ee, useCosTransitionRunMutation as i } from "../../api/cosmicApi.js";
3
+ import { useCosAddRunStepMutation as n, useCosRunQuery as r, useCosRunStepsQuery as i, useCosTransitionRunMutation as ee } from "../../api/cosmicApi.js";
4
4
  import a from "../../components/EmptyState.js";
5
5
  import o from "../../components/ErrorState.js";
6
6
  import s from "../../components/LoadingState.js";
7
- import c from "../../components/ActivityFeedPanel.js";
8
- import l from "../../components/SafeLink.js";
9
- import u from "../../components/PageLayout.js";
10
- import d, { formatEnumLabel as f } from "../../components/StatusBadge.js";
7
+ import te from "../../components/ActivityFeedPanel.js";
8
+ import ne from "../../components/SafeLink.js";
9
+ import c from "../../components/PageLayout.js";
10
+ import l, { formatEnumLabel as u } from "../../components/StatusBadge.js";
11
11
  import "../../components/index.js";
12
- import { describeError as te, mutationSucceeded as p } from "../../lib/mutationResult.js";
13
- import { useMemo as ne, useState as m } from "react";
14
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
15
- import { useParams as _ } from "react-router-dom";
16
- import { ListTree as re, Plus as v } from "lucide-react";
17
- import { Button as y, Card as b, CardContent as x, CardHeader as S, CardTitle as C, Dialog as ie, DialogContent as w, DialogDescription as ae, DialogFooter as oe, DialogHeader as T, DialogTitle as se, Input as E, Label as D, Select as ce, SelectContent as le, SelectItem as ue, SelectTrigger as de, SelectValue as fe, Textarea as pe } from "@burdenoff/fe-libs/ui";
12
+ import { describeError as d, mutationSucceeded as f } from "../../lib/mutationResult.js";
13
+ import { useMemo as re, useState as p } from "react";
14
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
15
+ import { useParams as g } from "react-router-dom";
16
+ import { Check as _, Circle as v, ListTree as ie, Loader2 as y, Plus as b, X as x } from "lucide-react";
17
+ import { Button as S, Card as C, CardContent as w, CardHeader as T, CardTitle as E, Dialog as ae, DialogContent as D, DialogDescription as O, DialogFooter as oe, DialogHeader as se, DialogTitle as ce, Input as k, Label as A, Select as le, SelectContent as ue, SelectItem as de, SelectTrigger as fe, SelectValue as pe, Textarea as me } from "@burdenoff/fe-libs/ui";
18
18
  //#region src/cosmicintersection/pages/runs/RunDetailPage.tsx
19
- var me = [
19
+ var he = [
20
20
  "INGEST",
21
21
  "CALIBRATE",
22
22
  "TRANSFORM",
23
23
  "ANALYZE",
24
24
  "EXPORT",
25
25
  "NOTIFY"
26
- ], he = {
26
+ ], ge = {
27
27
  QUEUED: ["RUNNING", "CANCELLED"],
28
28
  RUNNING: [
29
29
  "SUCCEEDED",
@@ -33,50 +33,76 @@ var me = [
33
33
  SUCCEEDED: [],
34
34
  FAILED: [],
35
35
  CANCELLED: []
36
+ }, j = {
37
+ SUCCEEDED: {
38
+ icon: _,
39
+ spin: !1,
40
+ wrap: "border-status-success-border bg-status-success-bg-subtle text-status-success-text"
41
+ },
42
+ RUNNING: {
43
+ icon: y,
44
+ spin: !0,
45
+ wrap: "border-status-warning-border bg-status-warning-bg-subtle text-status-warning-text"
46
+ },
47
+ FAILED: {
48
+ icon: x,
49
+ spin: !1,
50
+ wrap: "border-status-error-border bg-status-error-bg-subtle text-status-error-text"
51
+ },
52
+ QUEUED: {
53
+ icon: v,
54
+ spin: !1,
55
+ wrap: "border-status-info-border bg-status-info-bg-subtle text-status-info-text"
56
+ },
57
+ CANCELLED: {
58
+ icon: x,
59
+ spin: !1,
60
+ wrap: "border-border-default bg-bg-sunken text-text-secondary"
61
+ }
36
62
  };
37
- function O(e) {
63
+ function M(e) {
38
64
  if (!e) return "—";
39
65
  let t = new Date(e);
40
66
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
41
67
  }
42
- function k(e) {
68
+ function N(e) {
43
69
  if (e == null) return "—";
44
70
  if (e < 1e3) return `${e} ms`;
45
71
  let t = e / 1e3;
46
72
  return t < 60 ? `${t.toFixed(1)} s` : `${Math.floor(t / 60)}m ${Math.round(t % 60)}s`;
47
73
  }
48
- function A({ label: e, children: t }) {
49
- return /* @__PURE__ */ g("div", {
74
+ function P({ label: e, children: t }) {
75
+ return /* @__PURE__ */ h("div", {
50
76
  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",
51
- children: [/* @__PURE__ */ h("span", {
77
+ children: [/* @__PURE__ */ m("span", {
52
78
  className: "w-40 shrink-0 text-sm font-medium text-text-secondary",
53
79
  children: e
54
- }), /* @__PURE__ */ h("span", {
80
+ }), /* @__PURE__ */ m("span", {
55
81
  className: "min-w-0 text-sm text-text-primary",
56
82
  children: t
57
83
  })]
58
84
  });
59
85
  }
60
- function j({ value: e }) {
61
- return !e || Object.keys(e).length === 0 ? /* @__PURE__ */ h("span", {
86
+ function F({ value: e }) {
87
+ return !e || Object.keys(e).length === 0 ? /* @__PURE__ */ m("span", {
62
88
  className: "text-sm text-text-secondary",
63
89
  children: "—"
64
- }) : /* @__PURE__ */ h("pre", {
90
+ }) : /* @__PURE__ */ m("pre", {
65
91
  className: "overflow-x-auto rounded-card border border-border-default bg-bg-sunken p-3 font-mono text-xs text-text-primary",
66
92
  children: JSON.stringify(e, null, 2)
67
93
  });
68
94
  }
69
- function M() {
70
- let { id: M = "" } = _(), { navigate: N } = e(), { data: P, loading: F, error: I, refetch: L } = r(M), { data: R, loading: ge, error: _e, refetch: z } = ee(M), [ve, { loading: ye }] = i(), [be, { loading: B }] = n(), [xe, V] = m(!1), [H, U] = m(""), [W, G] = m("INGEST"), [K, q] = m(""), [J, Y] = m(""), X = P?.cosRun, Z = ne(() => [...R?.cosListRunSteps ?? []].sort((e, t) => e.position - t.position), [R]), Se = async (e) => {
95
+ function I() {
96
+ let { id: _ = "" } = g(), { navigate: v } = e(), { data: y, loading: x, error: I, refetch: L } = r(_), { data: R, loading: _e, error: ve, refetch: z } = i(_), [ye, { loading: be }] = ee(), [xe, { loading: B }] = n(), [Se, V] = p(!1), [H, U] = p(""), [W, G] = p("INGEST"), [K, q] = p(""), [J, Y] = p(""), X = y?.cosRun, Z = re(() => [...R?.cosListRunSteps ?? []].sort((e, t) => e.position - t.position), [R]), Ce = async (e) => {
71
97
  if (!X) return;
72
- let n = await ve({ variables: {
98
+ let n = await ye({ variables: {
73
99
  id: X.id,
74
100
  status: e
75
101
  } });
76
- p(n, n.data?.cosTransitionRun?.id, "Could not update the run") && (t.success("Run updated", `Run #${X.runNumber} moved to ${f(e)}.`), await Promise.all([L(), z()]));
102
+ f(n, n.data?.cosTransitionRun?.id, "Could not update the run") && (t.success("Run updated", `Run #${X.runNumber} moved to ${u(e)}.`), await Promise.all([L(), z()]));
77
103
  }, Q = () => {
78
104
  U(""), G("INGEST"), q(""), Y("");
79
- }, Ce = async () => {
105
+ }, we = async () => {
80
106
  if (!X) return;
81
107
  if (!H.trim()) {
82
108
  t.error("Step name is required", "Give the step a name before adding it.");
@@ -88,7 +114,7 @@ function M() {
88
114
  if (typeof t != "object" || !t || Array.isArray(t)) throw Error("Inputs must be a JSON object.");
89
115
  e = t;
90
116
  } catch (e) {
91
- t.error("Invalid inputs JSON", te(e) ?? "Please provide valid JSON.");
117
+ t.error("Invalid inputs JSON", d(e) ?? "Please provide valid JSON.");
92
118
  return;
93
119
  }
94
120
  let n = K.trim() ? Number(K.trim()) : void 0;
@@ -96,233 +122,250 @@ function M() {
96
122
  t.error("Invalid position", "Position must be a non-negative number.");
97
123
  return;
98
124
  }
99
- let r = await be({ variables: { input: {
125
+ let r = await xe({ variables: { input: {
100
126
  runId: X.id,
101
127
  name: H.trim(),
102
128
  kind: W,
103
129
  inputs: e,
104
130
  position: n
105
131
  } } });
106
- p(r, r.data?.cosAddRunStep?.id, "Could not add the step") && (t.success("Step added", `“${H.trim()}” was added to the run.`), V(!1), Q(), await z());
132
+ f(r, r.data?.cosAddRunStep?.id, "Could not add the step") && (t.success("Step added", `“${H.trim()}” was added to the run.`), V(!1), Q(), await z());
107
133
  };
108
- if (F) return /* @__PURE__ */ h(u, {
134
+ if (x) return /* @__PURE__ */ m(c, {
109
135
  title: "Run",
110
136
  backPath: "runs",
111
- children: /* @__PURE__ */ h(s, { label: "Loading run…" })
137
+ children: /* @__PURE__ */ m(s, { label: "Loading run…" })
112
138
  });
113
- if (I) return /* @__PURE__ */ h(u, {
139
+ if (I) return /* @__PURE__ */ m(c, {
114
140
  title: "Run",
115
141
  backPath: "runs",
116
- children: /* @__PURE__ */ h(o, { onRetry: () => void L() })
142
+ children: /* @__PURE__ */ m(o, { onRetry: () => void L() })
117
143
  });
118
- if (!X) return /* @__PURE__ */ h(u, {
144
+ if (!X) return /* @__PURE__ */ m(c, {
119
145
  title: "Run",
120
146
  backPath: "runs",
121
- children: /* @__PURE__ */ h(a, {
147
+ children: /* @__PURE__ */ m(a, {
122
148
  title: "Run not found",
123
149
  description: "This run may have been removed or you may not have access to it.",
124
- action: /* @__PURE__ */ h(y, {
150
+ action: /* @__PURE__ */ m(S, {
125
151
  type: "button",
126
152
  variant: "outline",
127
- onClick: () => N("runs"),
153
+ onClick: () => v("runs"),
128
154
  children: "Back to runs"
129
155
  })
130
156
  })
131
157
  });
132
- let $ = he[X.status] ?? [];
133
- return /* @__PURE__ */ g(u, {
158
+ let $ = ge[X.status] ?? [];
159
+ return /* @__PURE__ */ h(c, {
134
160
  title: `Run #${X.runNumber}`,
135
161
  description: X.pipeline ? `Pipeline: ${X.pipeline.name}` : void 0,
136
162
  backPath: "runs",
137
- actions: /* @__PURE__ */ g("div", {
163
+ actions: /* @__PURE__ */ h("div", {
138
164
  className: "flex flex-wrap items-center gap-2",
139
- children: [$.map((e) => /* @__PURE__ */ h(y, {
165
+ children: [$.map((e) => /* @__PURE__ */ m(S, {
140
166
  type: "button",
141
167
  variant: e === "CANCELLED" || e === "FAILED" ? "outline" : "default",
142
- onClick: () => void Se(e),
143
- disabled: ye,
144
- children: `Mark ${f(e)}`
145
- }, e)), /* @__PURE__ */ g(y, {
168
+ onClick: () => void Ce(e),
169
+ disabled: be,
170
+ children: `Mark ${u(e)}`
171
+ }, e)), /* @__PURE__ */ h(S, {
146
172
  type: "button",
147
173
  variant: "outline",
148
174
  onClick: () => V(!0),
149
- children: [/* @__PURE__ */ h(v, { className: "size-4" }), "Add step"]
175
+ children: [/* @__PURE__ */ m(b, { className: "size-4" }), "Add step"]
150
176
  })]
151
177
  }),
152
- children: [/* @__PURE__ */ g("div", {
178
+ children: [/* @__PURE__ */ h("div", {
153
179
  className: "space-y-6",
154
180
  children: [
155
- /* @__PURE__ */ g(b, { children: [/* @__PURE__ */ h(S, { children: /* @__PURE__ */ h(C, { children: "Overview" }) }), /* @__PURE__ */ g(x, { children: [
156
- /* @__PURE__ */ h(A, {
181
+ /* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(T, { children: /* @__PURE__ */ m(E, { children: "Overview" }) }), /* @__PURE__ */ h(w, { children: [
182
+ /* @__PURE__ */ m(P, {
157
183
  label: "Status",
158
- children: /* @__PURE__ */ h(d, { status: X.status })
184
+ children: /* @__PURE__ */ m(l, { status: X.status })
159
185
  }),
160
- /* @__PURE__ */ h(A, {
186
+ /* @__PURE__ */ m(P, {
161
187
  label: "Pipeline",
162
- children: X.pipeline ? /* @__PURE__ */ h("button", {
188
+ children: X.pipeline ? /* @__PURE__ */ m("button", {
163
189
  type: "button",
164
190
  className: "text-text-primary underline-offset-2 hover:underline",
165
- onClick: () => N(`pipelines/${X.pipelineId}`),
191
+ onClick: () => v(`pipelines/${X.pipelineId}`),
166
192
  children: X.pipeline.name
167
- }) : /* @__PURE__ */ h("span", {
193
+ }) : /* @__PURE__ */ m("span", {
168
194
  className: "font-mono text-xs",
169
195
  children: X.pipelineId
170
196
  })
171
197
  }),
172
- /* @__PURE__ */ h(A, {
198
+ /* @__PURE__ */ m(P, {
173
199
  label: "Dataset",
174
- children: X.datasetId ? /* @__PURE__ */ h("button", {
200
+ children: X.datasetId ? /* @__PURE__ */ m("button", {
175
201
  type: "button",
176
202
  className: "text-text-primary underline-offset-2 hover:underline",
177
- onClick: () => N(`datasets/${X.datasetId}`),
178
- children: /* @__PURE__ */ h("span", {
203
+ onClick: () => v(`datasets/${X.datasetId}`),
204
+ children: /* @__PURE__ */ m("span", {
179
205
  className: "font-mono text-xs",
180
206
  children: X.datasetId
181
207
  })
182
208
  }) : "—"
183
209
  }),
184
- /* @__PURE__ */ h(A, {
210
+ /* @__PURE__ */ m(P, {
185
211
  label: "Triggered by",
186
212
  children: X.triggeredBy || "—"
187
213
  }),
188
- /* @__PURE__ */ h(A, {
214
+ /* @__PURE__ */ m(P, {
189
215
  label: "Started",
190
- children: O(X.startedAt)
216
+ children: M(X.startedAt)
191
217
  }),
192
- /* @__PURE__ */ h(A, {
218
+ /* @__PURE__ */ m(P, {
193
219
  label: "Finished",
194
- children: O(X.finishedAt)
220
+ children: M(X.finishedAt)
195
221
  }),
196
- /* @__PURE__ */ h(A, {
222
+ /* @__PURE__ */ m(P, {
197
223
  label: "Duration",
198
- children: k(X.durationMs)
224
+ children: N(X.durationMs)
199
225
  }),
200
- X.errorMessage ? /* @__PURE__ */ h(A, {
226
+ X.errorMessage ? /* @__PURE__ */ m(P, {
201
227
  label: "Error",
202
- children: /* @__PURE__ */ h("span", {
228
+ children: /* @__PURE__ */ m("span", {
203
229
  className: "text-status-error-text",
204
230
  children: X.errorMessage
205
231
  })
206
232
  }) : null,
207
- $.length === 0 ? /* @__PURE__ */ h(A, {
233
+ $.length === 0 ? /* @__PURE__ */ m(P, {
208
234
  label: "Discuss",
209
- children: /* @__PURE__ */ h(l, {
235
+ children: /* @__PURE__ */ m(ne, {
210
236
  href: "/conversations",
211
237
  className: "text-text-primary underline-offset-2 hover:underline",
212
238
  children: "Open discussions"
213
239
  })
214
240
  }) : null
215
241
  ] })] }),
216
- /* @__PURE__ */ g("div", {
242
+ /* @__PURE__ */ h("div", {
217
243
  className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
218
- children: [/* @__PURE__ */ g(b, { children: [/* @__PURE__ */ h(S, { children: /* @__PURE__ */ h(C, { children: "Parameters" }) }), /* @__PURE__ */ h(x, { children: /* @__PURE__ */ h(j, { value: X.params }) })] }), /* @__PURE__ */ g(b, { children: [/* @__PURE__ */ h(S, { children: /* @__PURE__ */ h(C, { children: "Metrics" }) }), /* @__PURE__ */ h(x, { children: /* @__PURE__ */ h(j, { value: X.metrics }) })] })]
244
+ children: [/* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(T, { children: /* @__PURE__ */ m(E, { children: "Parameters" }) }), /* @__PURE__ */ m(w, { children: /* @__PURE__ */ m(F, { value: X.params }) })] }), /* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(T, { children: /* @__PURE__ */ m(E, { children: "Metrics" }) }), /* @__PURE__ */ m(w, { children: /* @__PURE__ */ m(F, { value: X.metrics }) })] })]
219
245
  }),
220
- /* @__PURE__ */ g(b, { children: [/* @__PURE__ */ h(S, { children: /* @__PURE__ */ h(C, { children: "Steps" }) }), /* @__PURE__ */ h(x, { children: ge ? /* @__PURE__ */ h(s, {
246
+ /* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(T, { children: /* @__PURE__ */ m(E, { children: "Steps" }) }), /* @__PURE__ */ m(w, { children: _e ? /* @__PURE__ */ m(s, {
221
247
  variant: "rows",
222
248
  rows: 4,
223
249
  label: "Loading steps…"
224
- }) : _e ? /* @__PURE__ */ h(o, {
250
+ }) : ve ? /* @__PURE__ */ m(o, {
225
251
  message: "Could not load steps.",
226
252
  onRetry: () => void z()
227
- }) : Z.length === 0 ? /* @__PURE__ */ h(a, {
228
- icon: re,
253
+ }) : Z.length === 0 ? /* @__PURE__ */ m(a, {
254
+ icon: ie,
229
255
  title: "No steps yet",
230
256
  description: "Add steps to record the ingest, calibration, transform, analyze or export stages of this run.",
231
- action: /* @__PURE__ */ g(y, {
257
+ action: /* @__PURE__ */ h(S, {
232
258
  type: "button",
233
259
  onClick: () => V(!0),
234
- children: [/* @__PURE__ */ h(v, { className: "size-4" }), "Add step"]
260
+ children: [/* @__PURE__ */ m(b, { className: "size-4" }), "Add step"]
235
261
  })
236
- }) : /* @__PURE__ */ h("ol", {
237
- className: "space-y-3",
238
- children: Z.map((e) => /* @__PURE__ */ g("li", {
239
- className: "flex flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 sm:flex-row sm:items-start sm:justify-between",
240
- children: [/* @__PURE__ */ g("div", {
241
- className: "flex min-w-0 items-start gap-3",
242
- children: [/* @__PURE__ */ h("span", {
243
- className: "mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-full bg-bg-sunken text-xs font-semibold tabular-nums text-text-secondary",
244
- children: e.position
245
- }), /* @__PURE__ */ g("div", {
246
- className: "min-w-0",
262
+ }) : /* @__PURE__ */ m("ol", {
263
+ className: "flex flex-col",
264
+ children: Z.map((e, t) => {
265
+ let n = j[e.status] ?? j.QUEUED, r = n.icon, i = t === Z.length - 1;
266
+ return /* @__PURE__ */ h("li", {
267
+ className: "flex gap-4",
268
+ children: [/* @__PURE__ */ h("div", {
269
+ className: "flex flex-col items-center",
270
+ children: [/* @__PURE__ */ m("span", {
271
+ className: `flex size-8 shrink-0 items-center justify-center rounded-full border ${n.wrap}`,
272
+ children: /* @__PURE__ */ m(r, {
273
+ className: `size-4 ${n.spin ? "animate-spin" : ""}`,
274
+ "aria-hidden": "true"
275
+ })
276
+ }), i ? null : /* @__PURE__ */ m("span", {
277
+ className: "w-px flex-1 bg-border-default",
278
+ "aria-hidden": "true"
279
+ })]
280
+ }), /* @__PURE__ */ h("div", {
281
+ className: `min-w-0 flex-1 rounded-card border border-border-default bg-bg-elevated p-4 ${i ? "" : "mb-4"}`,
247
282
  children: [
248
- /* @__PURE__ */ g("div", {
283
+ /* @__PURE__ */ h("div", {
249
284
  className: "flex flex-wrap items-center gap-2",
250
- children: [/* @__PURE__ */ h("span", {
251
- className: "font-medium text-text-primary",
252
- children: e.name
253
- }), /* @__PURE__ */ h(d, {
254
- status: e.kind,
255
- tone: "neutral"
256
- })]
285
+ children: [
286
+ /* @__PURE__ */ h("span", {
287
+ className: "text-xs font-semibold tabular-nums text-text-secondary",
288
+ children: [t + 1, "."]
289
+ }),
290
+ /* @__PURE__ */ m("span", {
291
+ className: "min-w-0 truncate font-medium text-text-primary",
292
+ children: e.name
293
+ }),
294
+ /* @__PURE__ */ m(l, {
295
+ status: e.kind,
296
+ tone: "neutral"
297
+ }),
298
+ /* @__PURE__ */ m(l, {
299
+ status: e.status,
300
+ className: "ml-auto"
301
+ })
302
+ ]
257
303
  }),
258
- e.errorMessage ? /* @__PURE__ */ h("p", {
259
- className: "mt-1 text-xs text-status-error-text",
304
+ e.errorMessage ? /* @__PURE__ */ m("p", {
305
+ className: "mt-1.5 text-xs text-status-error-text",
260
306
  children: e.errorMessage
261
307
  }) : null,
262
- /* @__PURE__ */ g("p", {
263
- className: "mt-1 text-xs text-text-secondary",
264
- children: ["Duration: ", k(e.durationMs)]
308
+ /* @__PURE__ */ h("p", {
309
+ className: "mt-1.5 text-xs text-text-secondary",
310
+ children: ["Duration: ", N(e.durationMs)]
265
311
  })
266
312
  ]
267
313
  })]
268
- }), /* @__PURE__ */ h("div", {
269
- className: "shrink-0",
270
- children: /* @__PURE__ */ h(d, { status: e.status })
271
- })]
272
- }, e.id))
314
+ }, e.id);
315
+ })
273
316
  }) })] }),
274
- /* @__PURE__ */ g(b, { children: [/* @__PURE__ */ h(S, { children: /* @__PURE__ */ h(C, { children: "Activity" }) }), /* @__PURE__ */ h(x, { children: /* @__PURE__ */ h(c, {
317
+ /* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(T, { children: /* @__PURE__ */ m(E, { children: "Activity" }) }), /* @__PURE__ */ m(w, { children: /* @__PURE__ */ m(te, {
275
318
  resourceId: X.id,
276
319
  resourceType: "cosmicintersection-run"
277
320
  }) })] })
278
321
  ]
279
- }), /* @__PURE__ */ h(ie, {
280
- open: xe,
322
+ }), /* @__PURE__ */ m(ae, {
323
+ open: Se,
281
324
  onOpenChange: (e) => {
282
325
  B || (V(e), e || Q());
283
326
  },
284
- children: /* @__PURE__ */ g(w, { children: [
285
- /* @__PURE__ */ g(T, { children: [/* @__PURE__ */ h(se, { children: "Add step" }), /* @__PURE__ */ h(ae, { children: "Record a stage of this run — its kind, order and optional inputs." })] }),
286
- /* @__PURE__ */ g("div", {
327
+ children: /* @__PURE__ */ h(D, { children: [
328
+ /* @__PURE__ */ h(se, { children: [/* @__PURE__ */ m(ce, { children: "Add step" }), /* @__PURE__ */ m(O, { children: "Record a stage of this run — its kind, order and optional inputs." })] }),
329
+ /* @__PURE__ */ h("div", {
287
330
  className: "space-y-4",
288
331
  children: [
289
- /* @__PURE__ */ g("div", {
332
+ /* @__PURE__ */ h("div", {
290
333
  className: "space-y-1",
291
- children: [/* @__PURE__ */ h(D, {
334
+ children: [/* @__PURE__ */ m(A, {
292
335
  htmlFor: "step-name",
293
336
  children: "Name"
294
- }), /* @__PURE__ */ h(E, {
337
+ }), /* @__PURE__ */ m(k, {
295
338
  id: "step-name",
296
339
  value: H,
297
340
  onChange: (e) => U(e.target.value),
298
341
  placeholder: "e.g. Calibrate flat fields"
299
342
  })]
300
343
  }),
301
- /* @__PURE__ */ g("div", {
344
+ /* @__PURE__ */ h("div", {
302
345
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
303
- children: [/* @__PURE__ */ g("div", {
346
+ children: [/* @__PURE__ */ h("div", {
304
347
  className: "space-y-1",
305
- children: [/* @__PURE__ */ h(D, {
348
+ children: [/* @__PURE__ */ m(A, {
306
349
  htmlFor: "step-kind",
307
350
  children: "Kind"
308
- }), /* @__PURE__ */ g(ce, {
351
+ }), /* @__PURE__ */ h(le, {
309
352
  value: W,
310
353
  onValueChange: (e) => G(e),
311
- children: [/* @__PURE__ */ h(de, {
354
+ children: [/* @__PURE__ */ m(fe, {
312
355
  id: "step-kind",
313
356
  "aria-label": "Step kind",
314
- children: /* @__PURE__ */ h(fe, {})
315
- }), /* @__PURE__ */ h(le, { children: me.map((e) => /* @__PURE__ */ h(ue, {
357
+ children: /* @__PURE__ */ m(pe, {})
358
+ }), /* @__PURE__ */ m(ue, { children: he.map((e) => /* @__PURE__ */ m(de, {
316
359
  value: e,
317
- children: f(e)
360
+ children: u(e)
318
361
  }, e)) })]
319
362
  })]
320
- }), /* @__PURE__ */ g("div", {
363
+ }), /* @__PURE__ */ h("div", {
321
364
  className: "space-y-1",
322
- children: [/* @__PURE__ */ h(D, {
365
+ children: [/* @__PURE__ */ m(A, {
323
366
  htmlFor: "step-position",
324
367
  children: "Position"
325
- }), /* @__PURE__ */ h(E, {
368
+ }), /* @__PURE__ */ m(k, {
326
369
  id: "step-position",
327
370
  type: "number",
328
371
  min: "0",
@@ -332,14 +375,14 @@ function M() {
332
375
  })]
333
376
  })]
334
377
  }),
335
- /* @__PURE__ */ g("div", {
378
+ /* @__PURE__ */ h("div", {
336
379
  className: "space-y-1",
337
380
  children: [
338
- /* @__PURE__ */ h(D, {
381
+ /* @__PURE__ */ m(A, {
339
382
  htmlFor: "step-inputs",
340
383
  children: "Inputs (JSON)"
341
384
  }),
342
- /* @__PURE__ */ h(pe, {
385
+ /* @__PURE__ */ m(me, {
343
386
  id: "step-inputs",
344
387
  value: J,
345
388
  onChange: (e) => Y(e.target.value),
@@ -348,7 +391,7 @@ function M() {
348
391
  className: "font-mono text-xs",
349
392
  placeholder: "{\n \"source\": \"raw-frames\"\n}"
350
393
  }),
351
- /* @__PURE__ */ h("p", {
394
+ /* @__PURE__ */ m("p", {
352
395
  className: "text-xs text-text-secondary",
353
396
  children: "Optional. A JSON object of step inputs."
354
397
  })
@@ -356,7 +399,7 @@ function M() {
356
399
  })
357
400
  ]
358
401
  }),
359
- /* @__PURE__ */ g(oe, { children: [/* @__PURE__ */ h(y, {
402
+ /* @__PURE__ */ h(oe, { children: [/* @__PURE__ */ m(S, {
360
403
  type: "button",
361
404
  variant: "outline",
362
405
  onClick: () => {
@@ -364,17 +407,17 @@ function M() {
364
407
  },
365
408
  disabled: B,
366
409
  children: "Cancel"
367
- }), /* @__PURE__ */ g(y, {
410
+ }), /* @__PURE__ */ h(S, {
368
411
  type: "button",
369
- onClick: () => void Ce(),
412
+ onClick: () => void we(),
370
413
  disabled: B,
371
- children: [/* @__PURE__ */ h(v, { className: "size-4" }), B ? "Adding…" : "Add step"]
414
+ children: [/* @__PURE__ */ m(b, { className: "size-4" }), B ? "Adding…" : "Add step"]
372
415
  })] })
373
416
  ] })
374
417
  })]
375
418
  });
376
419
  }
377
420
  //#endregion
378
- export { M as default };
421
+ export { I as default };
379
422
 
380
423
  //# sourceMappingURL=RunDetailPage.js.map