@lunora/studio 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (60) hide show
  1. package/__assets__/package-og.svg +1 -1
  2. package/dist/index.d.ts +23 -17
  3. package/dist/index.js +34 -34
  4. package/dist/mount.d.ts +1 -1
  5. package/dist/mount.js +1 -1
  6. package/dist/packem_shared/{ADMIN_FUNCTION_PREFIX-DmBqMZ-z.js → ADMIN_FUNCTIONS-CdaxLGkE.js} +3 -0
  7. package/dist/packem_shared/{ApiDocsPanel-DpRjJhG5.js → ApiDocsPanel-BgrN4kml.js} +3 -3
  8. package/dist/packem_shared/{ApiReferencePanel-DMIUp-kK.js → ApiReferencePanel-1vubqG5s.js} +2 -2
  9. package/dist/packem_shared/{ApiTab-DURGU15e.js → ApiTab-CHkX49o_.js} +4 -4
  10. package/dist/packem_shared/{AuditPanel-BC59Nhst.js → AuditPanel-CP9HM9nq.js} +19 -31
  11. package/dist/packem_shared/{CommandPalette-Dx_CoB9i.js → CommandPalette-BtgkBzZI.js} +2 -2
  12. package/dist/packem_shared/{ConfirmButton-WQVUoGFb.js → ConfirmButton-C2eVi2Qv.js} +1 -1
  13. package/dist/packem_shared/{ConnectionBadge-Bxagrip8.js → ConnectionBadge-B2DDM2Tn.js} +1 -1
  14. package/dist/packem_shared/{createStudioI18n-CgvlmDkN.js → DEFAULT_LOCALE-CiX4W7Kr.js} +1 -1
  15. package/dist/packem_shared/{DataBrowser-Coz6jJE6.js → DataBrowser-Bb1gTQ6c.js} +182 -249
  16. package/dist/packem_shared/{ExportImportPanel-WO34fJxy.js → ExportImportPanel-Dj87tRa5.js} +9 -5
  17. package/dist/packem_shared/{FileBrowser-Zcr-Qgxo.js → FileBrowser-CWvxp_is.js} +7 -7
  18. package/dist/packem_shared/{FunctionRunner-j0Rd5m9t.js → FunctionRunner-DlWApMCH.js} +4 -4
  19. package/dist/packem_shared/{FunctionStatsPanel-DboBl-XL.js → FunctionStatsPanel-CuO2Tmw-.js} +141 -198
  20. package/dist/packem_shared/{GlobalDataBrowser-9MhPEfgN.js → GlobalDataBrowser-3X9uRfdO.js} +37 -66
  21. package/dist/packem_shared/{HealthPanel-DOIgbUtx.js → HealthPanel-Dj0GRo5P.js} +31 -23
  22. package/dist/packem_shared/{HomePanel-bdOCNA-p.js → HomePanel-BewOCuag.js} +450 -389
  23. package/dist/packem_shared/{InsightsPanel-DaZPnSgt.js → InsightsPanel-y_Q-xdPY.js} +104 -66
  24. package/dist/packem_shared/{LogsPanel-CWdqAGpQ.js → LogsPanel-C7crgYoS.js} +35 -47
  25. package/dist/packem_shared/{MailPanel-D_EGtDnS.js → MailPanel-PILidruz.js} +31 -38
  26. package/dist/packem_shared/{MetricsPanel-E4Gv6wTO.js → MetricsPanel-DioILzgf.js} +34 -48
  27. package/dist/packem_shared/{MigrationsPanel-DQdPY9io.js → MigrationsPanel-DkIcRoE5.js} +31 -38
  28. package/dist/packem_shared/{OpenRpcReferencePanel-j2p3HB0s.js → OpenRpcReferencePanel-vbcYbv3V.js} +2 -2
  29. package/dist/packem_shared/{PitrPanel-BbBkQR6t.js → PitrPanel-yKJ1JPPk.js} +4 -4
  30. package/dist/packem_shared/{ScheduledJobs-Ok1CYYwI.js → ScheduledJobs-BWNwIN3I.js} +164 -61
  31. package/dist/packem_shared/{SchemaViewer-D8XGnp-X.js → SchemaViewer-CNr8Wame.js} +4 -4
  32. package/dist/packem_shared/{SecurityAdvisorPanel-Cdm2IxLW.js → SecurityAdvisorPanel-BBzv7L3c.js} +44 -31
  33. package/dist/packem_shared/SettingsPanel-BKSKl8tl.js +390 -0
  34. package/dist/packem_shared/{ShardInput-DNCsT1KW.js → ShardInput-gx_DZXXn.js} +1 -1
  35. package/dist/packem_shared/SqlEditorPanel-CkemCQvy.js +13 -0
  36. package/dist/packem_shared/Studio-QkOjc2NS.js +33 -0
  37. package/dist/packem_shared/{StudioApp-dvywkJ8I.js → StudioApp-TEElspKL.js} +278 -4
  38. package/dist/packem_shared/{StudioI18nProvider-Dcajsznk.js → StudioI18nProvider-B-tDCZIi.js} +1 -1
  39. package/dist/packem_shared/TableEditor-JS3sXYgS.js +11 -0
  40. package/dist/packem_shared/{advisor-view-DBlzJi6C.js → advisor-view-CGcfMiPq.js} +1 -1
  41. package/dist/packem_shared/{app.d-CCmwDEVs.d.ts → app.d-Cnij4Zp5.d.ts} +1 -1
  42. package/dist/packem_shared/{cf-links-BZfRdxSE.js → cf-links-2cktDedA.js} +1 -1
  43. package/dist/packem_shared/{data-grid-CCh2Couo.js → data-grid-B5CaV3wS.js} +2 -2
  44. package/dist/packem_shared/{grid-features-DTjG6Sex.js → grid-features-CzUfqgsM.js} +3 -3
  45. package/dist/packem_shared/{internal-BBZYexre.js → internal-rXJEAhXS.js} +1 -1
  46. package/dist/packem_shared/{live-status-bPff1O7Y.js → live-status-FZ0psC1z.js} +1 -1
  47. package/dist/packem_shared/{reference-view-BCKIoai7.js → reference-view-B4E49Lip.js} +3 -3
  48. package/dist/packem_shared/{sql-editor-panel-CW2y2x9h.js → sql-editor-panel-CUJoYF1Z.js} +6 -6
  49. package/dist/packem_shared/{studio-BDVd7rIV.js → studio-c5Vf7kSh.js} +2897 -1668
  50. package/dist/packem_shared/{TableEditor-DIVDk3vT.js → table-editor-9fhJ4hMJ.js} +43 -7
  51. package/dist/packem_shared/{table-list-sidebar-aZHLq70w.js → table-list-sidebar-Bg7uzbvC.js} +2 -2
  52. package/dist/packem_shared/use-admin-query-BkbdNFNz.js +105 -0
  53. package/dist/standalone/studio.js +198 -176
  54. package/dist/styles.css +1 -1
  55. package/package.json +13 -12
  56. package/dist/packem_shared/SettingsPanel-D3WF2mBU.js +0 -176
  57. package/dist/packem_shared/SqlEditorPanel-BuQ7f2Hs.js +0 -13
  58. package/dist/packem_shared/Studio-D36od9Oz.js +0 -33
  59. package/dist/packem_shared/use-live-admin-D1h1Fzsd.js +0 -73
  60. package/dist/packem_shared/use-live-shard-seed-B74RYcOy.js +0 -76
@@ -2,12 +2,12 @@ import { useLunora } from '@lunora/react';
2
2
  import { useState, useRef, useCallback, useEffect } from 'react';
3
3
  import { E as EmptyState } from './empty-state-DY_oe0k6.js';
4
4
  import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as TableBody, e as TableCell } from './table-_RzNvy3R.js';
5
+ import { b as useClientQuery } from './use-admin-query-BkbdNFNz.js';
5
6
  import { useAutoRefresh } from './DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
6
- import { useT } from './createStudioI18n-CgvlmDkN.js';
7
- import { C as CLOUDFLARE_D1_URL } from './cf-links-BZfRdxSE.js';
8
- import { e as errorMessage, f as fireAndForget } from './internal-BBZYexre.js';
9
- import { u as useFacets, T as TableListSidebar, G as GridPagination, D as DataFacets } from './table-list-sidebar-aZHLq70w.js';
10
- import { G as GridContainer, C as CellValue } from './data-grid-CCh2Couo.js';
7
+ import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
8
+ import { b as CLOUDFLARE_D1_URL } from './cf-links-2cktDedA.js';
9
+ import { u as useFacets, T as TableListSidebar, G as GridPagination, D as DataFacets } from './table-list-sidebar-Bg7uzbvC.js';
10
+ import { G as GridContainer, C as CellValue } from './data-grid-B5CaV3wS.js';
11
11
  import { jsxDEV } from 'react/jsx-dev-runtime';
12
12
 
13
13
  const DEFAULT_PAGE_SIZE = 50;
@@ -37,13 +37,9 @@ const GlobalDataBrowser = ({
37
37
  } = {}) => {
38
38
  const client = useLunora();
39
39
  const t = useT();
40
- const [tables, setTables] = useState(null);
41
- const [tablesError, setTablesError] = useState(null);
42
40
  const [selectedTable, setSelectedTable] = useState(initialTable ?? null);
43
41
  const [offset, setOffset] = useState(0);
44
42
  const [pageSize, setPageSize] = useState(initialPageSize);
45
- const [page, setPage] = useState(null);
46
- const [pageError, setPageError] = useState(null);
47
43
  const [filters, setFilters] = useState([]);
48
44
  const filtersRef = useRef(filters);
49
45
  filtersRef.current = filters;
@@ -53,76 +49,53 @@ const GlobalDataBrowser = ({
53
49
  refetchFacets: refetchFacetsViaHook,
54
50
  toggleFacet
55
51
  } = useFacets();
56
- const fetchTables = useCallback(async () => {
57
- setTablesError(null);
58
- try {
59
- setTables(await client.listGlobalTables());
60
- } catch (error) {
61
- setTables(null);
62
- setTablesError(errorMessage(error));
63
- }
64
- }, [client]);
65
- const fetchSeqRef = useRef(0);
66
- const fetchPage = useCallback(async (table, nextOffset, limit = pageSize, activeFilters = filtersRef.current) => {
67
- fetchSeqRef.current += 1;
68
- const seq = fetchSeqRef.current;
69
- setPageError(null);
70
- try {
71
- const result = await client.readGlobalTablePage({
72
- filters: activeFilters,
73
- limit,
74
- offset: nextOffset,
75
- table
76
- });
77
- if (fetchSeqRef.current !== seq) {
78
- return;
79
- }
80
- setPage(result);
81
- setOffset(nextOffset);
82
- } catch (error_0) {
83
- if (fetchSeqRef.current !== seq) {
84
- return;
85
- }
86
- setPage(null);
87
- setPageError(errorMessage(error_0));
88
- }
89
- }, [client, pageSize]);
90
- const facetFetcher = (table_0, activeFilters_0) => (column) => client.facetGlobalColumn({
52
+ const tablesQuery = useClientQuery(["lunora-global-tables"], () => client.listGlobalTables());
53
+ const tables = tablesQuery.data ?? null;
54
+ const tablesError = tablesQuery.error;
55
+ const pageQuery = useClientQuery(["lunora-global-page", selectedTable ?? "", offset, pageSize, JSON.stringify(filters)], () => client.readGlobalTablePage({
56
+ filters,
57
+ limit: pageSize,
58
+ offset,
59
+ table: selectedTable ?? ""
60
+ }), {
61
+ enabled: selectedTable !== null,
62
+ keepPreviousData: false
63
+ });
64
+ const page = pageQuery.data ?? null;
65
+ const pageError = pageQuery.error;
66
+ const facetFetcher = (table, activeFilters) => (column) => client.facetGlobalColumn({
91
67
  column,
92
- filters: activeFilters_0,
93
- table: table_0
68
+ filters: activeFilters,
69
+ table
94
70
  });
95
- const refetchFacets = (table_1, activeFilters_1) => {
96
- refetchFacetsViaHook(facetFetcher(table_1, activeFilters_1));
71
+ const refetchFacets = (table_0, activeFilters_0) => {
72
+ refetchFacetsViaHook(facetFetcher(table_0, activeFilters_0));
97
73
  };
98
- useEffect(() => {
99
- fireAndForget(fetchTables());
100
- }, [fetchTables]);
101
74
  useAutoRefresh(() => {
102
- fireAndForget(fetchTables());
75
+ tablesQuery.refetch();
103
76
  if (selectedTable !== null) {
104
- fireAndForget(fetchPage(selectedTable, offset));
77
+ pageQuery.refetch();
105
78
  refetchFacets(selectedTable, filtersRef.current);
106
79
  }
107
80
  }, true);
108
81
  const appliedInitialTable = useRef(void 0);
109
- const selectTable = useCallback((table_2) => {
110
- setSelectedTable(table_2);
111
- appliedInitialTable.current = table_2;
82
+ const selectTable = useCallback((table_1) => {
83
+ setSelectedTable(table_1);
84
+ appliedInitialTable.current = table_1;
112
85
  setFilters([]);
113
86
  filtersRef.current = [];
114
87
  clearFacets();
115
- fireAndForget(fetchPage(table_2, 0, pageSize, []));
116
- onSelectTable?.(table_2);
117
- }, [clearFacets, fetchPage, onSelectTable, pageSize]);
88
+ setOffset(0);
89
+ onSelectTable?.(table_1);
90
+ }, [clearFacets, onSelectTable]);
118
91
  const onToggleFacet = (column_0) => {
119
92
  toggleFacet(column_0, selectedTable === null ? null : facetFetcher(selectedTable, filtersRef.current));
120
93
  };
121
94
  const applyFilters = (next) => {
122
95
  setFilters(next);
123
96
  filtersRef.current = next;
97
+ setOffset(0);
124
98
  if (selectedTable !== null) {
125
- fireAndForget(fetchPage(selectedTable, 0, pageSize, next));
126
99
  refetchFacets(selectedTable, next);
127
100
  }
128
101
  };
@@ -146,11 +119,11 @@ const GlobalDataBrowser = ({
146
119
  selectTable(target);
147
120
  });
148
121
  }, [initialTable, selectTable]);
149
- const goToPage = (nextOffset_0) => {
122
+ const goToPage = (nextOffset) => {
150
123
  if (selectedTable === null) {
151
124
  return;
152
125
  }
153
- fireAndForget(fetchPage(selectedTable, Math.max(0, nextOffset_0)));
126
+ setOffset(Math.max(0, nextOffset));
154
127
  };
155
128
  const total = page?.total ?? 0;
156
129
  const hasPrevious = offset > 0;
@@ -158,7 +131,7 @@ const GlobalDataBrowser = ({
158
131
  const rangeStart = page === null || page.rows.length === 0 ? 0 : offset + 1;
159
132
  const rangeEnd = page === null ? 0 : offset + page.rows.length;
160
133
  const reloadTables = () => {
161
- fireAndForget(fetchTables());
134
+ tablesQuery.refetch();
162
135
  };
163
136
  const goPrevious = () => {
164
137
  goToPage(offset - pageSize);
@@ -171,9 +144,7 @@ const GlobalDataBrowser = ({
171
144
  };
172
145
  const changePageSize = (size) => {
173
146
  setPageSize(size);
174
- if (selectedTable !== null) {
175
- fireAndForget(fetchPage(selectedTable, 0, size));
176
- }
147
+ setOffset(0);
177
148
  };
178
149
  return /* @__PURE__ */ jsxDEV("div", {
179
150
  className: "flex h-full min-w-0",
@@ -1,14 +1,14 @@
1
1
  import { c } from 'react/compiler-runtime';
2
2
  import { useLunora } from '@lunora/react';
3
3
  import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
4
- import ConnectionBadge from './ConnectionBadge-Bxagrip8.js';
5
- import { L as LiveError } from './live-status-bPff1O7Y.js';
4
+ import ConnectionBadge from './ConnectionBadge-B2DDM2Tn.js';
5
+ import { L as LiveError } from './live-status-FZ0psC1z.js';
6
6
  import { B as Badge } from './badge-B2PKA1-5.js';
7
7
  import { C as Card } from './card-DURq3ElK.js';
8
- import { u as useLiveAdmin } from './use-live-admin-D1h1Fzsd.js';
9
- import { useT } from './createStudioI18n-CgvlmDkN.js';
10
- import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTION_PREFIX-DmBqMZ-z.js';
11
- import { f as fireAndForget, d as formatTimestamp, c as callOptions, e as errorMessage, a as adminRef } from './internal-BBZYexre.js';
8
+ import { u as useAdminQuery } from './use-admin-query-BkbdNFNz.js';
9
+ import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
10
+ import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-CdaxLGkE.js';
11
+ import { f as fireAndForget, b as formatTimestamp, c as callOptions, e as errorMessage, a as adminRef } from './internal-rXJEAhXS.js';
12
12
  import { l as loadRecentShards } from './shard-history-DyebH1R5.js';
13
13
  import { c as cn } from './utils-B05Dmz_H.js';
14
14
  import { shardsToAggregate } from './aggregateMetrics-D4nUHEKU.js';
@@ -333,7 +333,6 @@ const HealthPanel = ({
333
333
  const [auth, setAuth] = useState(null);
334
334
  const [scheduler, setScheduler] = useState(null);
335
335
  const [migrations, setMigrations] = useState([]);
336
- const [liveError, setLiveError] = useState(void 0);
337
336
  const [recentShards] = useState(loadRecentShards);
338
337
  const inFlightRef = useRef(false);
339
338
  const mountedRef = useRef(true);
@@ -387,10 +386,19 @@ const HealthPanel = ({
387
386
  clearTimeout(trailingTimerRef.current);
388
387
  }
389
388
  }, []);
390
- useLiveAdmin(ADMIN_FUNCTIONS.getMetrics, {}, rootShard, () => {
391
- setLiveError(void 0);
389
+ const {
390
+ data: liveMetrics,
391
+ liveError
392
+ } = useAdminQuery(ADMIN_FUNCTIONS.getMetrics, {}, {
393
+ live: true,
394
+ shardKey: rootShard
395
+ });
396
+ useEffect(() => {
397
+ if (liveMetrics === void 0) {
398
+ return;
399
+ }
392
400
  scheduleFanOut();
393
- }, true, setLiveError);
401
+ }, [liveMetrics]);
394
402
  const recentErrors = entries.filter((entry) => entry.level === "error");
395
403
  const topErrors = recentErrors.slice(0, RECENT_ERROR_LIMIT);
396
404
  const trend = requestErrorSeries(totals?.history);
@@ -398,7 +406,7 @@ const HealthPanel = ({
398
406
  const buckets = auth?.history ?? [];
399
407
  return {
400
408
  attempts: buckets.map((bucket) => bucket.attempts),
401
- failures: buckets.map((bucket_0) => bucket_0.failures)
409
+ failures: buckets.map((bucket) => bucket.failures)
402
410
  };
403
411
  }, [auth?.history]);
404
412
  const worstFunctions = functions.filter((stat) => stat.calls > 0).toSorted((a, b) => b.errors / b.calls - a.errors / a.calls || b.calls - a.calls).slice(0, TOP_FUNCTION_LIMIT);
@@ -549,25 +557,25 @@ const HealthPanel = ({
549
557
  children: t("No function activity yet.")
550
558
  }, void 0, false) : /* @__PURE__ */ jsxDEV("ul", {
551
559
  className: "divide-y divide-border",
552
- children: worstFunctions.map((stat_0) => /* @__PURE__ */ jsxDEV("li", {
560
+ children: worstFunctions.map((stat) => /* @__PURE__ */ jsxDEV("li", {
553
561
  className: "flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs",
554
562
  "data-testid": "hl-fn-row",
555
563
  children: [/* @__PURE__ */ jsxDEV("span", {
556
564
  className: "truncate font-mono text-foreground",
557
- children: stat_0.path
565
+ children: stat.path
558
566
  }, void 0, false), /* @__PURE__ */ jsxDEV("span", {
559
567
  className: "flex shrink-0 items-center gap-2",
560
568
  children: [/* @__PURE__ */ jsxDEV("span", {
561
569
  className: "tabular-nums text-muted-foreground",
562
570
  children: t("{count} calls", {
563
- count: stat_0.calls.toString()
571
+ count: stat.calls.toString()
564
572
  })
565
573
  }, void 0, false), /* @__PURE__ */ jsxDEV(Badge, {
566
- variant: LEVEL_VARIANT[rateLevel(stat_0.errors / stat_0.calls, REQUEST_ERROR_WARN, REQUEST_ERROR_CRIT)],
567
- children: ratePercent(stat_0.errors, stat_0.calls)
574
+ variant: LEVEL_VARIANT[rateLevel(stat.errors / stat.calls, REQUEST_ERROR_WARN, REQUEST_ERROR_CRIT)],
575
+ children: ratePercent(stat.errors, stat.calls)
568
576
  }, void 0, false)]
569
577
  }, void 0, true)]
570
- }, stat_0.path, true))
578
+ }, stat.path, true))
571
579
  }, void 0, false)]
572
580
  }, void 0, true), /* @__PURE__ */ jsxDEV(Card, {
573
581
  className: "gap-0 py-0",
@@ -592,23 +600,23 @@ const HealthPanel = ({
592
600
  children: t("No recent errors.")
593
601
  }, void 0, false), topErrors.length > 0 && /* @__PURE__ */ jsxDEV("ul", {
594
602
  className: "divide-y divide-border",
595
- children: topErrors.map((entry_0, index) => /* @__PURE__ */ jsxDEV("li", {
603
+ children: topErrors.map((entry, index) => /* @__PURE__ */ jsxDEV("li", {
596
604
  className: "flex flex-col gap-0.5 px-4 py-2 text-xs",
597
605
  "data-testid": "hl-error-row",
598
606
  children: [/* @__PURE__ */ jsxDEV("span", {
599
607
  className: "flex items-center gap-2",
600
608
  children: [/* @__PURE__ */ jsxDEV("time", {
601
609
  className: "shrink-0 text-muted-foreground",
602
- children: formatTimestamp(entry_0.timestamp)
603
- }, void 0, false), entry_0.functionPath !== void 0 && /* @__PURE__ */ jsxDEV("span", {
610
+ children: formatTimestamp(entry.timestamp)
611
+ }, void 0, false), entry.functionPath !== void 0 && /* @__PURE__ */ jsxDEV("span", {
604
612
  className: "truncate font-mono text-foreground",
605
- children: entry_0.functionPath
613
+ children: entry.functionPath
606
614
  }, void 0, false)]
607
615
  }, void 0, true), /* @__PURE__ */ jsxDEV("span", {
608
616
  className: "text-destructive",
609
- children: entry_0.message
617
+ children: entry.message
610
618
  }, void 0, false)]
611
- }, `${entry_0.timestamp.toString()}-${index.toString()}`, true))
619
+ }, `${entry.timestamp.toString()}-${index.toString()}`, true))
612
620
  }, void 0, false)]
613
621
  }, void 0, true)]
614
622
  }, void 0, true), /* @__PURE__ */ jsxDEV(Card, {