@burdenoff/microfe-cosmicintersection 2026.704.1 → 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 (59) hide show
  1. package/dist/cosmicintersection/CosmicIntersectionRoutes.js +45 -25
  2. package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
  3. package/dist/cosmicintersection/api/cosmicApi.js +137 -66
  4. package/dist/cosmicintersection/api/cosmicApi.js.map +1 -1
  5. package/dist/cosmicintersection/components/ActivityFeedPanel.js +68 -0
  6. package/dist/cosmicintersection/components/ActivityFeedPanel.js.map +1 -0
  7. package/dist/cosmicintersection/components/DiscussionPanel.js +57 -0
  8. package/dist/cosmicintersection/components/DiscussionPanel.js.map +1 -0
  9. package/dist/cosmicintersection/components/FacetPanel.js +66 -0
  10. package/dist/cosmicintersection/components/FacetPanel.js.map +1 -0
  11. package/dist/cosmicintersection/components/LineageGraph.js +388 -0
  12. package/dist/cosmicintersection/components/LineageGraph.js.map +1 -0
  13. package/dist/cosmicintersection/components/ResultsChart.js +329 -0
  14. package/dist/cosmicintersection/components/ResultsChart.js.map +1 -0
  15. package/dist/cosmicintersection/components/StepDAG.js +104 -0
  16. package/dist/cosmicintersection/components/StepDAG.js.map +1 -0
  17. package/dist/cosmicintersection/components/index.js +5 -3
  18. package/dist/cosmicintersection/pages/access/AccessPage.js +220 -161
  19. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  20. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +332 -172
  21. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  22. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +167 -109
  23. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -1
  24. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +87 -61
  25. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -1
  26. package/dist/cosmicintersection/pages/collections/CollectionsPage.js +51 -42
  27. package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
  28. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +31 -18
  29. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
  30. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +330 -184
  31. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
  32. package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +7 -7
  33. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +321 -163
  34. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
  35. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +358 -0
  36. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -0
  37. package/dist/cosmicintersection/pages/lineage/LineagePage.js +171 -0
  38. package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -0
  39. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +339 -260
  40. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -1
  41. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +143 -82
  42. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
  43. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +286 -142
  44. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -1
  45. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +305 -103
  46. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -1
  47. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +183 -79
  48. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
  49. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +346 -204
  50. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  51. package/dist/cosmicintersection/pages/runs/RunDetailPage.js +184 -136
  52. package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -1
  53. package/dist/cosmicintersection/pages/runs/RunsPage.js +182 -120
  54. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
  55. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +234 -0
  56. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js.map +1 -0
  57. package/dist/cosmicintersection/pages/sources/SourcesPage.js +250 -133
  58. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
  59. package/package.json +1 -1
@@ -1,23 +1,25 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
- import { useCosAddSchemaFieldMutation as n, useCosArchiveDatasetMutation as r, useCosDatasetQuery as i, useCosPublishDatasetMutation as ee, useCosUpdateDatasetMutation as te } from "../../api/cosmicApi.js";
4
- import ne from "../../components/ActionMenu.js";
3
+ import { useCosAddSchemaFieldMutation as n, useCosAnalysesQuery as r, useCosArchiveDatasetMutation as i, useCosDatasetQuery as ee, useCosNotebooksQuery as te, useCosPublishDatasetMutation as ne, useCosReleasesQuery as re, useCosRunsQuery as ie, useCosUpdateDatasetMutation as ae } from "../../api/cosmicApi.js";
4
+ import oe from "../../components/ActionMenu.js";
5
5
  import a from "../../components/EmptyState.js";
6
- import re from "../../components/EntityTagsField.js";
7
- import ie from "../../components/ErrorState.js";
8
- import { useFileDownloadUrl as ae } from "../../components/FileUploadField.js";
9
- import oe from "../../components/LoadingState.js";
10
- import o from "../../components/PageLayout.js";
11
- import s from "../../components/SafeLink.js";
6
+ import se from "../../components/ErrorState.js";
7
+ import o from "../../components/LoadingState.js";
8
+ import ce from "../../components/ActivityFeedPanel.js";
9
+ import le from "../../components/DiscussionPanel.js";
10
+ import ue from "../../components/EntityTagsField.js";
11
+ import { useFileDownloadUrl as de } from "../../components/FileUploadField.js";
12
+ import s from "../../components/PageLayout.js";
12
13
  import c, { formatEnumLabel as l } from "../../components/StatusBadge.js";
13
14
  import "../../components/index.js";
14
- import { useState as u } from "react";
15
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
16
- import { useParams as se } from "react-router-dom";
17
- import { Boxes as ce, Columns3 as p, Database as m, Download as le, MessagesSquare as ue, Pencil as de, Plus as fe, Radar as pe } from "lucide-react";
18
- import { Badge as h, Button as g, Checkbox as me, Dialog as he, DialogContent as ge, DialogDescription as _e, DialogFooter as ve, DialogHeader as ye, DialogTitle as be, Input as _, Label as v, Select as xe, SelectContent as Se, SelectItem as Ce, SelectTrigger as we, SelectValue as Te, Table as Ee, TableBody as De, TableCell as y, TableHead as b, TableHeader as x, TableRow as S, Textarea as C } from "@burdenoff/fe-libs/ui";
15
+ import fe, { buildDatasetLineage as pe } from "../../components/LineageGraph.js";
16
+ import { useMemo as me, useState as u } from "react";
17
+ import { Fragment as he, jsx as d, jsxs as f } from "react/jsx-runtime";
18
+ import { useParams as ge } from "react-router-dom";
19
+ import { ArrowRight as _e, Boxes as ve, Columns3 as p, Database as ye, Download as be, GitBranch as xe, History as Se, MessagesSquare as Ce, Pencil as we, Plus as Te, Radar as Ee, Share2 as De } from "lucide-react";
20
+ import { Badge as m, Button as h, Checkbox as Oe, Dialog as ke, DialogContent as Ae, DialogDescription as je, DialogFooter as Me, DialogHeader as Ne, DialogTitle as Pe, Input as g, Label as _, Select as Fe, SelectContent as Ie, SelectItem as Le, SelectTrigger as Re, SelectValue as ze, Table as Be, TableBody as Ve, TableCell as v, TableHead as y, TableHeader as He, TableRow as b, Textarea as Ue } from "@burdenoff/fe-libs/ui";
19
21
  //#region src/cosmicintersection/pages/datasets/DatasetDetailPage.tsx
20
- var w = [
22
+ var We = [
21
23
  "STRING",
22
24
  "INTEGER",
23
25
  "FLOAT",
@@ -29,7 +31,7 @@ var w = [
29
31
  "IMAGE_REF",
30
32
  "JSON"
31
33
  ];
32
- function T(e) {
34
+ function Ge(e) {
33
35
  if (!e) return "—";
34
36
  let t = Number(e);
35
37
  if (!Number.isFinite(t) || t <= 0) return "—";
@@ -44,12 +46,12 @@ function T(e) {
44
46
  for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1;
45
47
  return `${r >= 10 || i === 0 ? Math.round(r) : r.toFixed(1)} ${n[i]}`;
46
48
  }
47
- function E(e) {
49
+ function x(e) {
48
50
  if (!e) return "—";
49
51
  let t = new Date(e);
50
52
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
51
53
  }
52
- function D({ label: e, value: t }) {
54
+ function S({ label: e, value: t }) {
53
55
  return /* @__PURE__ */ f("div", {
54
56
  className: "rounded-card border border-border-default bg-bg-elevated p-4",
55
57
  children: [/* @__PURE__ */ d("p", {
@@ -61,91 +63,125 @@ function D({ label: e, value: t }) {
61
63
  })]
62
64
  });
63
65
  }
64
- function O() {
65
- let { id: O = "" } = se(), { navigate: k } = e(), { data: Oe, loading: ke, error: Ae, refetch: A } = i(O), j = Oe?.cosDataset ?? null, M = ae(j?.file?.id).data?.getFileDownloadUrl ?? null, [je, { loading: N }] = ee(), [Me] = r(), [Ne, { loading: P }] = te(), [Pe, { loading: F }] = n(), [I, L] = u([]), [Fe, Ie] = u(null), R = j ? `${j.id}:${j.updatedAt}` : null;
66
- R && R !== Fe && (Ie(R), L(j?.tags ?? []));
67
- let Le = j != null && (I.length !== j.tags.length || I.some((e, t) => e !== j.tags[t])), [Re, ze] = u(!1), [z, B] = u(""), [V, H] = u("STRING"), [U, W] = u(""), [G, K] = u(""), [q, J] = u(""), [Y, X] = u(!0), Be = () => {
68
- B(""), H("STRING"), W(""), K(""), J(""), X(!0);
69
- }, Z = (e) => {
70
- ze(e), e || Be();
66
+ function C() {
67
+ let { id: C = "" } = ge(), { navigate: w } = e(), { data: T, loading: Ke, error: qe, refetch: E } = ee(C), D = T?.cosDataset ?? null, O = de(D?.file?.id).data?.getFileDownloadUrl ?? null, [Je, { loading: Ye }] = ne(), [Xe] = i(), [Ze, { loading: k }] = ae(), [Qe, { loading: A }] = n(), j = r({ datasetId: C }), M = ie({ pagination: {
68
+ limit: 100,
69
+ offset: 0
70
+ } }), N = te({ pagination: {
71
+ limit: 100,
72
+ offset: 0
73
+ } }), P = re({ pagination: {
74
+ limit: 100,
75
+ offset: 0
76
+ } }), F = T?.cosDataset ?? null, I = me(() => {
77
+ if (!F) return {
78
+ nodes: [],
79
+ edges: []
80
+ };
81
+ let e = /* @__PURE__ */ new Map();
82
+ F.source && e.set(F.source.id, F.source);
83
+ let t = /* @__PURE__ */ new Map();
84
+ F.collection && t.set(F.collection.id, F.collection);
85
+ let n = {
86
+ datasetsById: new Map([[F.id, F]]),
87
+ sourcesById: e,
88
+ collectionsById: t,
89
+ runs: (M.data?.cosListRuns?.items ?? []).filter((e) => e.datasetId === F.id),
90
+ notebooks: (N.data?.cosListNotebooks?.items ?? []).filter((e) => e.datasetIds.includes(F.id)),
91
+ analyses: j.data?.cosListAnalyses ?? [],
92
+ releases: (P.data?.cosListReleases?.items ?? []).filter((e) => e.datasetIds.includes(F.id))
93
+ };
94
+ return pe(F.id, n);
95
+ }, [
96
+ F,
97
+ M.data,
98
+ N.data,
99
+ j.data,
100
+ P.data
101
+ ]), $e = M.loading || N.loading || j.loading || P.loading, [L, R] = u([]), [et, tt] = u(null), z = D ? `${D.id}:${D.updatedAt}` : null;
102
+ z && z !== et && (tt(z), R(D?.tags ?? []));
103
+ let nt = D != null && (L.length !== D.tags.length || L.some((e, t) => e !== D.tags[t])), [rt, it] = u(!1), [B, V] = u(""), [H, U] = u("STRING"), [W, G] = u(""), [K, q] = u(""), [J, Y] = u(""), [X, Z] = u(!0), at = () => {
104
+ V(""), U("STRING"), G(""), q(""), Y(""), Z(!0);
105
+ }, Q = (e) => {
106
+ it(e), e || at();
71
107
  };
72
- if (ke) return /* @__PURE__ */ d(o, {
108
+ if (Ke) return /* @__PURE__ */ d(s, {
73
109
  title: "Dataset",
74
110
  backPath: "datasets",
75
- children: /* @__PURE__ */ d(oe, { label: "Loading dataset…" })
111
+ children: /* @__PURE__ */ d(o, { label: "Loading dataset…" })
76
112
  });
77
- if (Ae) return /* @__PURE__ */ d(o, {
113
+ if (qe) return /* @__PURE__ */ d(s, {
78
114
  title: "Dataset",
79
115
  backPath: "datasets",
80
- children: /* @__PURE__ */ d(ie, {
116
+ children: /* @__PURE__ */ d(se, {
81
117
  message: "We could not load this dataset.",
82
- onRetry: () => void A()
118
+ onRetry: () => void E()
83
119
  })
84
120
  });
85
- if (!j) return /* @__PURE__ */ d(o, {
121
+ if (!D) return /* @__PURE__ */ d(s, {
86
122
  title: "Dataset",
87
123
  backPath: "datasets",
88
124
  children: /* @__PURE__ */ d(a, {
89
- icon: m,
125
+ icon: ye,
90
126
  title: "Dataset not found.",
91
127
  description: "This dataset may have been removed or is outside your current scope.",
92
- action: /* @__PURE__ */ d(g, {
128
+ action: /* @__PURE__ */ d(h, {
93
129
  type: "button",
94
- onClick: () => k("datasets"),
130
+ onClick: () => w("datasets"),
95
131
  children: "Back to datasets"
96
132
  })
97
133
  })
98
134
  });
99
- let Q = [...j.schemaFields ?? []].sort((e, t) => e.position - t.position), $ = j.status !== "AVAILABLE" && j.status !== "ARCHIVED", Ve = async () => {
100
- (await je({ variables: { id: j.id } })).data?.cosPublishDataset && (t.success("Dataset published", `“${j.name}” is now available.`), await A());
101
- }, He = async () => {
102
- let e = await Me({ variables: { id: j.id } });
135
+ let $ = [...D.schemaFields ?? []].sort((e, t) => e.position - t.position), ot = D.status !== "AVAILABLE" && D.status !== "ARCHIVED", st = async () => {
136
+ (await Je({ variables: { id: D.id } })).data?.cosPublishDataset && (t.success("Dataset published", `“${D.name}” is now available.`), await E());
137
+ }, ct = async () => {
138
+ let e = await Xe({ variables: { id: D.id } });
103
139
  if (e.error) throw Error(e.error.message);
104
140
  if (!e.data?.cosArchiveDataset) throw t.error("Could not archive dataset", "The server did not confirm the change."), Error("Archive not confirmed");
105
- t.success("Dataset archived"), k("datasets");
106
- }, Ue = async () => {
107
- (await Ne({ variables: {
108
- id: j.id,
109
- input: { tags: I }
110
- } })).data?.cosUpdateDataset && (t.success("Tags updated"), await A());
111
- }, We = async () => {
112
- if (!z.trim()) {
141
+ t.success("Dataset archived"), w("datasets");
142
+ }, lt = async () => {
143
+ (await Ze({ variables: {
144
+ id: D.id,
145
+ input: { tags: L }
146
+ } })).data?.cosUpdateDataset && (t.success("Tags updated"), await E());
147
+ }, ut = async () => {
148
+ if (!B.trim()) {
113
149
  t.error("Field name is required");
114
150
  return;
115
151
  }
116
- (await Pe({ variables: { input: {
117
- datasetId: j.id,
118
- name: z.trim(),
119
- fieldType: V,
120
- unit: U.trim() || void 0,
121
- description: G.trim() || void 0,
122
- provenance: q.trim() || void 0,
123
- nullable: Y
124
- } } })).data?.cosAddSchemaField && (t.success("Schema field added"), Z(!1), await A());
152
+ (await Qe({ variables: { input: {
153
+ datasetId: D.id,
154
+ name: B.trim(),
155
+ fieldType: H,
156
+ unit: W.trim() || void 0,
157
+ description: K.trim() || void 0,
158
+ provenance: J.trim() || void 0,
159
+ nullable: X
160
+ } } })).data?.cosAddSchemaField && (t.success("Schema field added"), Q(!1), await E());
125
161
  };
126
- return /* @__PURE__ */ f(o, {
127
- title: j.name,
128
- description: j.description ?? void 0,
162
+ return /* @__PURE__ */ f(s, {
163
+ title: D.name,
164
+ description: D.description ?? void 0,
129
165
  backPath: "datasets",
130
166
  actions: /* @__PURE__ */ f("div", {
131
- className: "flex items-center gap-2",
167
+ className: "flex flex-wrap items-center justify-end gap-2",
132
168
  children: [
133
- /* @__PURE__ */ f(g, {
169
+ /* @__PURE__ */ f(h, {
134
170
  type: "button",
135
171
  variant: "outline",
136
- onClick: () => k(`datasets/${j.id}/edit`),
137
- children: [/* @__PURE__ */ d(de, { className: "size-4" }), "Edit"]
172
+ onClick: () => w(`datasets/${D.id}/edit`),
173
+ children: [/* @__PURE__ */ d(we, { className: "size-4" }), "Edit"]
138
174
  }),
139
- $ ? /* @__PURE__ */ d(g, {
175
+ ot ? /* @__PURE__ */ d(h, {
140
176
  type: "button",
141
- onClick: () => void Ve(),
142
- disabled: N,
143
- children: N ? "Publishing…" : "Publish"
177
+ onClick: () => void st(),
178
+ disabled: Ye,
179
+ children: Ye ? "Publishing…" : "Publish"
144
180
  }) : null,
145
- /* @__PURE__ */ d(ne, {
146
- ariaLabel: `Actions for ${j.name}`,
147
- entityName: j.name,
148
- onDelete: () => He(),
181
+ /* @__PURE__ */ d(oe, {
182
+ ariaLabel: `Actions for ${D.name}`,
183
+ entityName: D.name,
184
+ onDelete: () => ct(),
149
185
  deleteLabel: "Archive dataset"
150
186
  })
151
187
  ]
@@ -156,93 +192,103 @@ function O() {
156
192
  /* @__PURE__ */ f("div", {
157
193
  className: "flex flex-wrap items-center gap-2",
158
194
  children: [
159
- /* @__PURE__ */ d(c, { status: j.status }),
195
+ /* @__PURE__ */ d(c, { status: D.status }),
160
196
  /* @__PURE__ */ d(c, {
161
- status: j.accessLevel,
162
- label: l(j.accessLevel)
197
+ status: D.accessLevel,
198
+ label: l(D.accessLevel)
163
199
  }),
164
- j.lineageCaptured ? /* @__PURE__ */ d(h, {
165
- variant: "secondary",
166
- children: "Lineage captured"
167
- }) : null,
168
- /* @__PURE__ */ f(h, {
169
- variant: "secondary",
170
- children: ["v", j.version]
200
+ /* @__PURE__ */ f("span", {
201
+ 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 font-medium",
202
+ title: "Current dataset version",
203
+ children: [
204
+ /* @__PURE__ */ d(xe, {
205
+ className: "size-3.5 text-text-tertiary",
206
+ "aria-hidden": "true"
207
+ }),
208
+ /* @__PURE__ */ f("span", {
209
+ className: "text-text-primary",
210
+ children: ["v", D.version]
211
+ }),
212
+ /* @__PURE__ */ d("span", {
213
+ className: "text-text-tertiary",
214
+ children: "· current"
215
+ })
216
+ ]
171
217
  })
172
218
  ]
173
219
  }),
174
220
  /* @__PURE__ */ f("div", {
175
221
  className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
176
222
  children: [
177
- /* @__PURE__ */ d(D, {
223
+ /* @__PURE__ */ d(S, {
178
224
  label: "Source",
179
- value: j.source ? /* @__PURE__ */ f("button", {
225
+ value: D.source ? /* @__PURE__ */ f("button", {
180
226
  type: "button",
181
- onClick: () => k(`sources/${j.source?.id}/edit`),
227
+ onClick: () => w(`sources/${D.source?.id}`),
182
228
  className: "inline-flex items-center gap-1.5 text-text-primary underline-offset-2 hover:underline",
183
- children: [/* @__PURE__ */ d(pe, {
229
+ children: [/* @__PURE__ */ d(Ee, {
184
230
  className: "size-4 text-text-secondary",
185
231
  "aria-hidden": "true"
186
- }), j.source.name]
232
+ }), D.source.name]
187
233
  }) : /* @__PURE__ */ d("span", {
188
234
  className: "text-text-secondary",
189
235
  children: "Not linked"
190
236
  })
191
237
  }),
192
- /* @__PURE__ */ d(D, {
238
+ /* @__PURE__ */ d(S, {
193
239
  label: "Collection",
194
- value: j.collection ? /* @__PURE__ */ f("button", {
240
+ value: D.collection ? /* @__PURE__ */ f("button", {
195
241
  type: "button",
196
- onClick: () => k(`collections/${j.collection?.id}`),
242
+ onClick: () => w(`collections/${D.collection?.id}`),
197
243
  className: "inline-flex items-center gap-1.5 text-text-primary underline-offset-2 hover:underline",
198
- children: [/* @__PURE__ */ d(ce, {
244
+ children: [/* @__PURE__ */ d(ve, {
199
245
  className: "size-4 text-text-secondary",
200
246
  "aria-hidden": "true"
201
- }), j.collection.name]
247
+ }), D.collection.name]
202
248
  }) : /* @__PURE__ */ d("span", {
203
249
  className: "text-text-secondary",
204
250
  children: "Not in a collection"
205
251
  })
206
252
  }),
207
- /* @__PURE__ */ d(D, {
253
+ /* @__PURE__ */ d(S, {
208
254
  label: "Format",
209
- value: /* @__PURE__ */ d("span", { children: j.format || "Not specified" })
255
+ value: /* @__PURE__ */ d("span", { children: D.format || "Not specified" })
210
256
  }),
211
- /* @__PURE__ */ d(D, {
257
+ /* @__PURE__ */ d(S, {
212
258
  label: "Size",
213
259
  value: /* @__PURE__ */ f("span", {
214
260
  className: "tabular-nums",
215
- children: [T(j.sizeBytes), Number(j.rowCount) > 0 ? /* @__PURE__ */ f("span", {
261
+ children: [Ge(D.sizeBytes), Number(D.rowCount) > 0 ? /* @__PURE__ */ f("span", {
216
262
  className: "text-text-secondary",
217
263
  children: [
218
264
  " ",
219
265
  "· ",
220
- Number(j.rowCount).toLocaleString(),
266
+ Number(D.rowCount).toLocaleString(),
221
267
  " rows"
222
268
  ]
223
269
  }) : null]
224
270
  })
225
271
  }),
226
- /* @__PURE__ */ d(D, {
272
+ /* @__PURE__ */ d(S, {
227
273
  label: "Ingested",
228
- value: /* @__PURE__ */ d("span", { children: E(j.ingestedAt) })
274
+ value: /* @__PURE__ */ d("span", { children: x(D.ingestedAt) })
229
275
  }),
230
- /* @__PURE__ */ d(D, {
276
+ /* @__PURE__ */ d(S, {
231
277
  label: "Created",
232
- value: /* @__PURE__ */ d("span", { children: E(j.createdAt) })
278
+ value: /* @__PURE__ */ d("span", { children: x(D.createdAt) })
233
279
  }),
234
- /* @__PURE__ */ d(D, {
280
+ /* @__PURE__ */ d(S, {
235
281
  label: "Updated",
236
- value: /* @__PURE__ */ d("span", { children: E(j.updatedAt) })
282
+ value: /* @__PURE__ */ d("span", { children: x(D.updatedAt) })
237
283
  }),
238
- /* @__PURE__ */ d(D, {
284
+ /* @__PURE__ */ d(S, {
239
285
  label: "Artifact",
240
- value: j.file ? M ? /* @__PURE__ */ f("a", {
241
- href: M,
286
+ value: D.file ? O ? /* @__PURE__ */ f("a", {
287
+ href: O,
242
288
  target: "_blank",
243
289
  rel: "noopener noreferrer",
244
290
  className: "inline-flex items-center gap-1.5 text-text-primary underline-offset-2 hover:underline",
245
- children: [/* @__PURE__ */ d(le, {
291
+ children: [/* @__PURE__ */ d(be, {
246
292
  className: "size-4",
247
293
  "aria-hidden": "true"
248
294
  }), "Download file"]
@@ -256,6 +302,37 @@ function O() {
256
302
  })
257
303
  ]
258
304
  }),
305
+ /* @__PURE__ */ f("section", {
306
+ className: "space-y-3",
307
+ children: [/* @__PURE__ */ f("div", {
308
+ className: "flex items-center justify-between gap-3",
309
+ children: [/* @__PURE__ */ f("div", {
310
+ className: "flex items-center gap-2",
311
+ children: [/* @__PURE__ */ d(De, {
312
+ className: "size-5 text-text-secondary",
313
+ "aria-hidden": "true"
314
+ }), /* @__PURE__ */ d("h2", {
315
+ className: "text-lg font-semibold text-text-primary",
316
+ children: "Lineage"
317
+ })]
318
+ }), /* @__PURE__ */ f("button", {
319
+ type: "button",
320
+ onClick: () => w(`lineage/${D.id}`),
321
+ className: "inline-flex items-center gap-1 rounded-button text-sm font-medium text-text-link underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus",
322
+ children: ["View full lineage", /* @__PURE__ */ d(_e, {
323
+ className: "size-4",
324
+ "aria-hidden": "true"
325
+ })]
326
+ })]
327
+ }), $e && I.nodes.length <= 1 ? /* @__PURE__ */ d(o, { label: "Building lineage…" }) : I.nodes.length <= 1 ? /* @__PURE__ */ d("div", {
328
+ className: "rounded-card border border-dashed border-border-default bg-bg-sunken p-6 text-sm text-text-secondary",
329
+ children: "No upstream or downstream provenance is linked to this dataset yet. Connect a source, run a pipeline, attach a notebook, or publish a release to build its lineage."
330
+ }) : /* @__PURE__ */ d(fe, {
331
+ model: I,
332
+ mode: "compact",
333
+ onNavigate: w
334
+ })]
335
+ }),
259
336
  /* @__PURE__ */ f("section", {
260
337
  className: "space-y-3",
261
338
  children: [/* @__PURE__ */ f("div", {
@@ -269,92 +346,161 @@ function O() {
269
346
  className: "text-lg font-semibold text-text-primary",
270
347
  children: "Schema fields"
271
348
  })]
272
- }), /* @__PURE__ */ f(g, {
349
+ }), /* @__PURE__ */ f(h, {
273
350
  type: "button",
274
351
  variant: "outline",
275
352
  size: "sm",
276
- onClick: () => Z(!0),
277
- children: [/* @__PURE__ */ d(fe, { className: "size-4" }), "Add field"]
353
+ onClick: () => Q(!0),
354
+ children: [/* @__PURE__ */ d(Te, { className: "size-4" }), "Add field"]
278
355
  })]
279
- }), Q.length === 0 ? /* @__PURE__ */ d(a, {
356
+ }), $.length === 0 ? /* @__PURE__ */ d(a, {
280
357
  icon: p,
281
358
  title: "No schema fields yet.",
282
359
  description: "Describe the columns in this dataset so consumers know what each field means."
283
- }) : /* @__PURE__ */ d("div", {
284
- className: "rounded-card border border-border-default bg-bg-elevated",
285
- children: /* @__PURE__ */ f(Ee, { children: [/* @__PURE__ */ d(x, { children: /* @__PURE__ */ f(S, { children: [
286
- /* @__PURE__ */ d(b, { children: "Name" }),
287
- /* @__PURE__ */ d(b, { children: "Type" }),
288
- /* @__PURE__ */ d(b, { children: "Unit" }),
289
- /* @__PURE__ */ d(b, { children: "Nullable" }),
290
- /* @__PURE__ */ d(b, { children: "Provenance" })
291
- ] }) }), /* @__PURE__ */ d(De, { children: Q.map((e) => /* @__PURE__ */ f(S, { children: [
292
- /* @__PURE__ */ f(y, { children: [/* @__PURE__ */ d("span", {
360
+ }) : /* @__PURE__ */ f(he, { children: [/* @__PURE__ */ d("div", {
361
+ className: "hidden rounded-card border border-border-default bg-bg-elevated md:block",
362
+ children: /* @__PURE__ */ f(Be, { children: [/* @__PURE__ */ d(He, { children: /* @__PURE__ */ f(b, { children: [
363
+ /* @__PURE__ */ d(y, { children: "Name" }),
364
+ /* @__PURE__ */ d(y, { children: "Type" }),
365
+ /* @__PURE__ */ d(y, { children: "Unit" }),
366
+ /* @__PURE__ */ d(y, { children: "Nullable" }),
367
+ /* @__PURE__ */ d(y, { children: "Provenance" })
368
+ ] }) }), /* @__PURE__ */ d(Ve, { children: $.map((e) => /* @__PURE__ */ f(b, { children: [
369
+ /* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d("span", {
293
370
  className: "font-medium text-text-primary",
294
371
  children: e.name
295
372
  }), e.description ? /* @__PURE__ */ d("p", {
296
373
  className: "mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary",
297
374
  children: e.description
298
375
  }) : null] }),
299
- /* @__PURE__ */ d(y, { children: /* @__PURE__ */ d(h, {
376
+ /* @__PURE__ */ d(v, { children: /* @__PURE__ */ d(m, {
300
377
  variant: "secondary",
301
378
  children: l(e.fieldType)
302
379
  }) }),
303
- /* @__PURE__ */ d(y, {
380
+ /* @__PURE__ */ d(v, {
304
381
  className: "text-sm text-text-secondary",
305
382
  children: e.unit || "—"
306
383
  }),
307
- /* @__PURE__ */ d(y, {
384
+ /* @__PURE__ */ d(v, {
308
385
  className: "text-sm text-text-secondary",
309
386
  children: e.nullable ? "Yes" : "No"
310
387
  }),
311
- /* @__PURE__ */ d(y, {
388
+ /* @__PURE__ */ d(v, {
312
389
  className: "text-sm text-text-secondary",
313
390
  children: e.provenance || "—"
314
391
  })
315
392
  ] }, e.id)) })] })
316
- })]
393
+ }), /* @__PURE__ */ d("div", {
394
+ className: "space-y-2 md:hidden",
395
+ children: $.map((e) => /* @__PURE__ */ f("div", {
396
+ className: "rounded-card border border-border-default bg-bg-elevated p-3",
397
+ children: [
398
+ /* @__PURE__ */ f("div", {
399
+ className: "flex items-start justify-between gap-2",
400
+ children: [/* @__PURE__ */ d("span", {
401
+ className: "font-medium text-text-primary",
402
+ children: e.name
403
+ }), /* @__PURE__ */ d(m, {
404
+ variant: "secondary",
405
+ children: l(e.fieldType)
406
+ })]
407
+ }),
408
+ e.description ? /* @__PURE__ */ d("p", {
409
+ className: "mt-1 text-xs text-text-secondary",
410
+ children: e.description
411
+ }) : null,
412
+ /* @__PURE__ */ f("dl", {
413
+ className: "mt-2 grid grid-cols-2 gap-2 text-xs",
414
+ children: [
415
+ /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("dt", {
416
+ className: "text-text-tertiary",
417
+ children: "Unit"
418
+ }), /* @__PURE__ */ d("dd", {
419
+ className: "text-text-secondary",
420
+ children: e.unit || "—"
421
+ })] }),
422
+ /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("dt", {
423
+ className: "text-text-tertiary",
424
+ children: "Nullable"
425
+ }), /* @__PURE__ */ d("dd", {
426
+ className: "text-text-secondary",
427
+ children: e.nullable ? "Yes" : "No"
428
+ })] }),
429
+ /* @__PURE__ */ f("div", {
430
+ className: "col-span-2",
431
+ children: [/* @__PURE__ */ d("dt", {
432
+ className: "text-text-tertiary",
433
+ children: "Provenance"
434
+ }), /* @__PURE__ */ d("dd", {
435
+ className: "text-text-secondary",
436
+ children: e.provenance || "—"
437
+ })]
438
+ })
439
+ ]
440
+ })
441
+ ]
442
+ }, e.id))
443
+ })] })]
317
444
  }),
318
445
  /* @__PURE__ */ f("section", {
319
446
  className: "space-y-3 rounded-card border border-border-default bg-bg-elevated p-5",
320
- children: [/* @__PURE__ */ d(re, {
321
- value: I,
322
- onChange: L,
447
+ children: [/* @__PURE__ */ d(ue, {
448
+ value: L,
449
+ onChange: R,
323
450
  label: "Dataset tags"
324
- }), Le ? /* @__PURE__ */ d("div", {
451
+ }), nt ? /* @__PURE__ */ d("div", {
325
452
  className: "flex justify-end",
326
- children: /* @__PURE__ */ d(g, {
453
+ children: /* @__PURE__ */ d(h, {
327
454
  type: "button",
328
455
  size: "sm",
329
- onClick: () => void Ue(),
330
- disabled: P,
331
- children: P ? "Saving…" : "Save tags"
456
+ onClick: () => void lt(),
457
+ disabled: k,
458
+ children: k ? "Saving…" : "Save tags"
332
459
  })
333
460
  }) : null]
334
461
  }),
335
- /* @__PURE__ */ f("div", {
336
- className: "flex items-center gap-2 text-sm text-text-secondary",
337
- children: [
338
- /* @__PURE__ */ d(ue, {
339
- className: "size-4",
462
+ /* @__PURE__ */ f("section", {
463
+ className: "space-y-3",
464
+ children: [/* @__PURE__ */ f("div", {
465
+ className: "flex items-center gap-2",
466
+ children: [/* @__PURE__ */ d(Se, {
467
+ className: "size-5 text-text-secondary",
340
468
  "aria-hidden": "true"
341
- }),
342
- /* @__PURE__ */ d("span", { children: "Questions about this dataset?" }),
343
- /* @__PURE__ */ d(s, {
344
- href: "/conversations",
345
- className: "text-text-primary underline-offset-2 hover:underline",
346
- children: "Discuss in conversations"
347
- })
348
- ]
469
+ }), /* @__PURE__ */ d("h2", {
470
+ className: "text-lg font-semibold text-text-primary",
471
+ children: "Activity"
472
+ })]
473
+ }), /* @__PURE__ */ d(ce, {
474
+ resourceId: D.id,
475
+ resourceType: "cosmicintersection-dataset"
476
+ })]
477
+ }),
478
+ /* @__PURE__ */ f("section", {
479
+ className: "space-y-3",
480
+ children: [/* @__PURE__ */ f("div", {
481
+ className: "flex items-center gap-2",
482
+ children: [/* @__PURE__ */ d(Ce, {
483
+ className: "size-5 text-text-secondary",
484
+ "aria-hidden": "true"
485
+ }), /* @__PURE__ */ d("h2", {
486
+ className: "text-lg font-semibold text-text-primary",
487
+ children: "Discussion"
488
+ })]
489
+ }), /* @__PURE__ */ d(le, {
490
+ entityType: "cosmicintersection-dataset",
491
+ entityId: D.id,
492
+ title: D.name,
493
+ widgetKey: "dataset-discussion"
494
+ })]
349
495
  })
350
496
  ]
351
- }), /* @__PURE__ */ d(he, {
352
- open: Re,
353
- onOpenChange: Z,
354
- children: /* @__PURE__ */ f(ge, { children: [
355
- /* @__PURE__ */ f(ye, { children: [/* @__PURE__ */ d(be, { children: "Add schema field" }), /* @__PURE__ */ f(_e, { children: [
497
+ }), /* @__PURE__ */ d(ke, {
498
+ open: rt,
499
+ onOpenChange: Q,
500
+ children: /* @__PURE__ */ f(Ae, { children: [
501
+ /* @__PURE__ */ f(Ne, { children: [/* @__PURE__ */ d(Pe, { children: "Add schema field" }), /* @__PURE__ */ f(je, { children: [
356
502
  "Document a column in “",
357
- j.name,
503
+ D.name,
358
504
  "” — its type, unit and provenance."
359
505
  ] })] }),
360
506
  /* @__PURE__ */ f("div", {
@@ -362,13 +508,13 @@ function O() {
362
508
  children: [
363
509
  /* @__PURE__ */ f("div", {
364
510
  className: "space-y-1.5",
365
- children: [/* @__PURE__ */ d(v, {
511
+ children: [/* @__PURE__ */ d(_, {
366
512
  htmlFor: "cos-field-name",
367
513
  children: "Name"
368
- }), /* @__PURE__ */ d(_, {
514
+ }), /* @__PURE__ */ d(g, {
369
515
  id: "cos-field-name",
370
- value: z,
371
- onChange: (e) => B(e.target.value),
516
+ value: B,
517
+ onChange: (e) => V(e.target.value),
372
518
  placeholder: "e.g. right_ascension",
373
519
  required: !0
374
520
  })]
@@ -377,84 +523,84 @@ function O() {
377
523
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
378
524
  children: [/* @__PURE__ */ f("div", {
379
525
  className: "space-y-1.5",
380
- children: [/* @__PURE__ */ d(v, {
526
+ children: [/* @__PURE__ */ d(_, {
381
527
  htmlFor: "cos-field-type",
382
528
  children: "Type"
383
- }), /* @__PURE__ */ f(xe, {
384
- value: V,
385
- onValueChange: (e) => H(e),
386
- children: [/* @__PURE__ */ d(we, {
529
+ }), /* @__PURE__ */ f(Fe, {
530
+ value: H,
531
+ onValueChange: (e) => U(e),
532
+ children: [/* @__PURE__ */ d(Re, {
387
533
  id: "cos-field-type",
388
534
  "aria-label": "Field type",
389
- children: /* @__PURE__ */ d(Te, {})
390
- }), /* @__PURE__ */ d(Se, { children: w.map((e) => /* @__PURE__ */ d(Ce, {
535
+ children: /* @__PURE__ */ d(ze, {})
536
+ }), /* @__PURE__ */ d(Ie, { children: We.map((e) => /* @__PURE__ */ d(Le, {
391
537
  value: e,
392
538
  children: l(e)
393
539
  }, e)) })]
394
540
  })]
395
541
  }), /* @__PURE__ */ f("div", {
396
542
  className: "space-y-1.5",
397
- children: [/* @__PURE__ */ d(v, {
543
+ children: [/* @__PURE__ */ d(_, {
398
544
  htmlFor: "cos-field-unit",
399
545
  children: "Unit"
400
- }), /* @__PURE__ */ d(_, {
546
+ }), /* @__PURE__ */ d(g, {
401
547
  id: "cos-field-unit",
402
- value: U,
403
- onChange: (e) => W(e.target.value),
548
+ value: W,
549
+ onChange: (e) => G(e.target.value),
404
550
  placeholder: "e.g. deg, mag, Jy"
405
551
  })]
406
552
  })]
407
553
  }),
408
554
  /* @__PURE__ */ f("div", {
409
555
  className: "space-y-1.5",
410
- children: [/* @__PURE__ */ d(v, {
556
+ children: [/* @__PURE__ */ d(_, {
411
557
  htmlFor: "cos-field-desc",
412
558
  children: "Description"
413
- }), /* @__PURE__ */ d(C, {
559
+ }), /* @__PURE__ */ d(Ue, {
414
560
  id: "cos-field-desc",
415
- value: G,
416
- onChange: (e) => K(e.target.value),
561
+ value: K,
562
+ onChange: (e) => q(e.target.value),
417
563
  rows: 2
418
564
  })]
419
565
  }),
420
566
  /* @__PURE__ */ f("div", {
421
567
  className: "space-y-1.5",
422
- children: [/* @__PURE__ */ d(v, {
568
+ children: [/* @__PURE__ */ d(_, {
423
569
  htmlFor: "cos-field-prov",
424
570
  children: "Provenance"
425
- }), /* @__PURE__ */ d(_, {
571
+ }), /* @__PURE__ */ d(g, {
426
572
  id: "cos-field-prov",
427
- value: q,
428
- onChange: (e) => J(e.target.value),
573
+ value: J,
574
+ onChange: (e) => Y(e.target.value),
429
575
  placeholder: "Where this field comes from"
430
576
  })]
431
577
  }),
432
578
  /* @__PURE__ */ f("label", {
433
579
  className: "flex items-center gap-2 text-sm text-text-primary",
434
- children: [/* @__PURE__ */ d(me, {
435
- checked: Y,
436
- onCheckedChange: (e) => X(e === !0)
580
+ children: [/* @__PURE__ */ d(Oe, {
581
+ checked: X,
582
+ onCheckedChange: (e) => Z(e === !0)
437
583
  }), "Nullable (may contain empty values)"]
438
584
  })
439
585
  ]
440
586
  }),
441
- /* @__PURE__ */ f(ve, { children: [/* @__PURE__ */ d(g, {
587
+ /* @__PURE__ */ f(Me, { children: [/* @__PURE__ */ d(h, {
442
588
  type: "button",
443
589
  variant: "outline",
444
- onClick: () => Z(!1),
445
- disabled: F,
590
+ onClick: () => Q(!1),
591
+ disabled: A,
446
592
  children: "Cancel"
447
- }), /* @__PURE__ */ d(g, {
593
+ }), /* @__PURE__ */ d(h, {
448
594
  type: "button",
449
- onClick: () => void We(),
450
- disabled: F,
451
- children: F ? "Adding…" : "Add field"
595
+ onClick: () => void ut(),
596
+ disabled: A,
597
+ children: A ? "Adding…" : "Add field"
452
598
  })] })
453
599
  ] })
454
600
  })]
455
601
  });
456
602
  }
457
603
  //#endregion
458
- export { O as default };
604
+ export { C as default };
459
605
 
460
606
  //# sourceMappingURL=DatasetDetailPage.js.map