@lunora/studio 1.0.0-alpha.26 → 1.0.0-alpha.28

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/index.d.ts +9 -4
  2. package/dist/index.js +28 -28
  3. package/dist/mount.d.ts +1 -1
  4. package/dist/mount.js +1 -1
  5. package/dist/packem_shared/{ApiDocsPanel-BgrN4kml.js → ApiDocsPanel-BSSgtcVf.js} +1 -1
  6. package/dist/packem_shared/{ApiReferencePanel-1vubqG5s.js → ApiReferencePanel-D24xOjCw.js} +1 -1
  7. package/dist/packem_shared/{ApiTab-CHkX49o_.js → ApiTab-vo8uhE29.js} +3 -3
  8. package/dist/packem_shared/{AuditPanel-CP9HM9nq.js → AuditPanel-CBjYR6S5.js} +3 -3
  9. package/dist/packem_shared/{CommandPalette-BtgkBzZI.js → CommandPalette-L-CuSRUc.js} +1 -1
  10. package/dist/packem_shared/{DataBrowser-Bb1gTQ6c.js → DataBrowser-DBKOIVKS.js} +23 -6
  11. package/dist/packem_shared/{ExportImportPanel-Dj87tRa5.js → ExportImportPanel-DtDEy4OD.js} +2 -2
  12. package/dist/packem_shared/{FileBrowser-CWvxp_is.js → FileBrowser-DqLRjqsM.js} +3 -3
  13. package/dist/packem_shared/{FunctionRunner-DlWApMCH.js → FunctionRunner-BmRkCvT4.js} +1 -1
  14. package/dist/packem_shared/{FunctionStatsPanel-CuO2Tmw-.js → FunctionStatsPanel-Bi3kyQvu.js} +3 -3
  15. package/dist/packem_shared/{GlobalDataBrowser-3X9uRfdO.js → GlobalDataBrowser-DOjhvhKa.js} +4 -4
  16. package/dist/packem_shared/{HealthPanel-Dj0GRo5P.js → HealthPanel-C7IPO6Ts.js} +2 -2
  17. package/dist/packem_shared/HomePanel-dJIkHY_i.js +14 -0
  18. package/dist/packem_shared/{InsightsPanel-y_Q-xdPY.js → InsightsPanel-BD29GXXd.js} +3 -3
  19. package/dist/packem_shared/{LogsPanel-C7crgYoS.js → LogsPanel-2JhE1qep.js} +1 -1
  20. package/dist/packem_shared/{MailPanel-PILidruz.js → MailPanel-DwNsuFJC.js} +2 -2
  21. package/dist/packem_shared/MetricsPanel-CRa4ITlq.js +19 -0
  22. package/dist/packem_shared/{MigrationsPanel-DkIcRoE5.js → MigrationsPanel-Z1DmSSzf.js} +3 -3
  23. package/dist/packem_shared/{OpenRpcReferencePanel-vbcYbv3V.js → OpenRpcReferencePanel-Dq0yyVWz.js} +1 -1
  24. package/dist/packem_shared/{PitrPanel-yKJ1JPPk.js → PitrPanel-3mec0LTF.js} +1 -1
  25. package/dist/packem_shared/{ScheduledJobs-BWNwIN3I.js → ScheduledJobs--Z9GTmKb.js} +3 -3
  26. package/dist/packem_shared/{SchemaViewer-CNr8Wame.js → SchemaViewer-nxDV7dZJ.js} +1 -1
  27. package/dist/packem_shared/{SecurityAdvisorPanel-BBzv7L3c.js → SecurityAdvisorPanel-5tYrJdvn.js} +2 -2
  28. package/dist/packem_shared/{SettingsPanel-BKSKl8tl.js → SettingsPanel-SijRekVc.js} +2 -2
  29. package/dist/packem_shared/{SqlEditorPanel-CkemCQvy.js → SqlEditorPanel-DI4obotI.js} +5 -5
  30. package/dist/packem_shared/Studio-B_L5Q2-X.js +33 -0
  31. package/dist/packem_shared/{StudioApp-sRWTipvw.js → StudioApp-wxioPfiP.js} +1 -1
  32. package/dist/packem_shared/{TableEditor-JS3sXYgS.js → TableEditor-1T-5KYtr.js} +4 -4
  33. package/dist/packem_shared/{advisor-view-CGcfMiPq.js → advisor-view-DzqyvUU3.js} +1 -1
  34. package/dist/packem_shared/{app.d-Cnij4Zp5.d.ts → app.d-B6MyY_al.d.ts} +1 -1
  35. package/dist/packem_shared/{data-grid-B5CaV3wS.js → data-grid-CrapHxR-.js} +1 -1
  36. package/dist/packem_shared/{grid-features-CzUfqgsM.js → grid-features-DnTbXXNb.js} +1 -1
  37. package/dist/packem_shared/{HomePanel-BewOCuag.js → home-panel-VdQI_8oX.js} +504 -138
  38. package/dist/packem_shared/{internal-rXJEAhXS.js → internal-CvMZCVd6.js} +1 -1
  39. package/dist/packem_shared/{MetricsPanel-DioILzgf.js → metrics-panel-3FSfzgEX.js} +4 -4
  40. package/dist/packem_shared/{reference-view-B4E49Lip.js → reference-view-DVyk5kXj.js} +1 -1
  41. package/dist/packem_shared/{sql-editor-panel-CUJoYF1Z.js → sql-editor-panel-DBuIpCXk.js} +4 -4
  42. package/dist/packem_shared/{studio-r7cJPJ__.js → studio-Dm6H5DHS.js} +2459 -606
  43. package/dist/packem_shared/{table-_RzNvy3R.js → table-DsCa9Qp9.js} +1 -1
  44. package/dist/packem_shared/{table-editor-9fhJ4hMJ.js → table-editor-7iSgi3te.js} +3 -3
  45. package/dist/packem_shared/{table-list-sidebar-Bg7uzbvC.js → table-list-sidebar-BbSgfLJ2.js} +1 -1
  46. package/dist/packem_shared/{use-admin-query-BkbdNFNz.js → use-admin-query-CFl5GUg_.js} +1 -1
  47. package/dist/standalone/studio.js +171 -171
  48. package/dist/styles.css +1 -1
  49. package/package.json +5 -5
  50. package/dist/packem_shared/Studio-CkKjUl2u.js +0 -33
@@ -2,16 +2,375 @@ import { c } from 'react/compiler-runtime';
2
2
  import { useNavigate } from '@tanstack/react-router';
3
3
  import { B as Bar, E as EvilBarChart } from './bar-chart-CzJAgqkp.js';
4
4
  import { B as Badge } from './badge-B2PKA1-5.js';
5
- import { C as Card, a as CardContent } from './card-DURq3ElK.js';
5
+ import { a as CardContent, C as Card } from './card-DURq3ElK.js';
6
6
  import { E as EmptyState } from './empty-state-DY_oe0k6.js';
7
- import { u as useAdminQuery } from './use-admin-query-BkbdNFNz.js';
7
+ import { u as useAdminQuery } from './use-admin-query-CFl5GUg_.js';
8
8
  import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
9
9
  import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-CdaxLGkE.js';
10
- import { d as formatBytes, f as fireAndForget } from './internal-rXJEAhXS.js';
10
+ import { f as fireAndForget, c as callOptions, a as adminRef, h as formatBytes } from './internal-CvMZCVd6.js';
11
11
  import { c as cn } from './utils-B05Dmz_H.js';
12
12
  import { deriveInsights } from './DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js';
13
+ import { useLunora } from '@lunora/react';
14
+ import { useState, useEffect } from 'react';
13
15
  import { jsxDEV } from 'react/jsx-dev-runtime';
14
16
 
17
+ const STUDIO_FEATURES = adminRef(ADMIN_FUNCTIONS.studioFeatures);
18
+ const DEFAULT_STUDIO_FEATURES = {
19
+ analytics: true,
20
+ auth: true,
21
+ flags: true,
22
+ kv: true,
23
+ mail: true,
24
+ payments: true,
25
+ queues: true,
26
+ scheduler: true,
27
+ storage: true,
28
+ vectors: true,
29
+ workflows: true
30
+ };
31
+ const coerceFeatures = (raw) => {
32
+ if (raw === null || typeof raw !== "object") {
33
+ return DEFAULT_STUDIO_FEATURES;
34
+ }
35
+ const record = raw;
36
+ const flag = (key) => typeof record[key] === "boolean" ? record[key] : true;
37
+ return {
38
+ analytics: flag("analytics"),
39
+ auth: flag("auth"),
40
+ flags: flag("flags"),
41
+ kv: flag("kv"),
42
+ mail: flag("mail"),
43
+ payments: flag("payments"),
44
+ queues: flag("queues"),
45
+ scheduler: flag("scheduler"),
46
+ storage: flag("storage"),
47
+ vectors: flag("vectors"),
48
+ workflows: flag("workflows")
49
+ };
50
+ };
51
+ const useStudioFeatures = () => {
52
+ const $ = c(3);
53
+ const client = useLunora();
54
+ const [features, setFeatures] = useState(DEFAULT_STUDIO_FEATURES);
55
+ let t0;
56
+ let t1;
57
+ if ($[0] !== client) {
58
+ t0 = () => {
59
+ fireAndForget((async () => {
60
+ try {
61
+ setFeatures(coerceFeatures(await client.query(STUDIO_FEATURES, {}, callOptions(""))));
62
+ } catch {
63
+ }
64
+ })());
65
+ };
66
+ t1 = [client];
67
+ $[0] = client;
68
+ $[1] = t0;
69
+ $[2] = t1;
70
+ } else {
71
+ t0 = $[1];
72
+ t1 = $[2];
73
+ }
74
+ useEffect(t0, t1);
75
+ return features;
76
+ };
77
+
78
+ const ChevronRight$1 = () => {
79
+ const $ = c(1);
80
+ let t0;
81
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
82
+ t0 = /* @__PURE__ */ jsxDEV("svg", {
83
+ "aria-hidden": "true",
84
+ className: "size-4 text-muted-foreground",
85
+ fill: "none",
86
+ stroke: "currentColor",
87
+ strokeWidth: 1.6,
88
+ viewBox: "0 0 24 24",
89
+ children: /* @__PURE__ */ jsxDEV("path", {
90
+ d: "m9 6 6 6-6 6",
91
+ strokeLinecap: "round",
92
+ strokeLinejoin: "round"
93
+ }, void 0, false)
94
+ }, void 0, false);
95
+ $[0] = t0;
96
+ } else {
97
+ t0 = $[0];
98
+ }
99
+ return t0;
100
+ };
101
+ const BindingCard = (t0) => {
102
+ const $ = c(24);
103
+ const {
104
+ group
105
+ } = t0;
106
+ const t = useT();
107
+ const navigate = useNavigate();
108
+ let t1;
109
+ if ($[0] !== group.tab || $[1] !== navigate) {
110
+ t1 = () => {
111
+ fireAndForget(navigate({
112
+ to: `/${group.tab}`
113
+ }));
114
+ };
115
+ $[0] = group.tab;
116
+ $[1] = navigate;
117
+ $[2] = t1;
118
+ } else {
119
+ t1 = $[2];
120
+ }
121
+ const onOpen = t1;
122
+ const count = group.bindings.length;
123
+ let t2;
124
+ if ($[3] !== group.label) {
125
+ t2 = /* @__PURE__ */ jsxDEV("span", {
126
+ className: "text-sm font-medium text-foreground",
127
+ children: group.label
128
+ }, void 0, false);
129
+ $[3] = group.label;
130
+ $[4] = t2;
131
+ } else {
132
+ t2 = $[4];
133
+ }
134
+ let t3;
135
+ if ($[5] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
136
+ t3 = /* @__PURE__ */ jsxDEV(ChevronRight$1, {}, void 0, false);
137
+ $[5] = t3;
138
+ } else {
139
+ t3 = $[5];
140
+ }
141
+ let t4;
142
+ if ($[6] !== t2) {
143
+ t4 = /* @__PURE__ */ jsxDEV("div", {
144
+ className: "flex items-center justify-between",
145
+ children: [t2, t3]
146
+ }, void 0, true);
147
+ $[6] = t2;
148
+ $[7] = t4;
149
+ } else {
150
+ t4 = $[7];
151
+ }
152
+ let t5;
153
+ if ($[8] !== count || $[9] !== t) {
154
+ t5 = count === 1 ? t("1 binding") : t("{count} bindings", {
155
+ count
156
+ });
157
+ $[8] = count;
158
+ $[9] = t;
159
+ $[10] = t5;
160
+ } else {
161
+ t5 = $[10];
162
+ }
163
+ let t6;
164
+ if ($[11] !== t5) {
165
+ t6 = /* @__PURE__ */ jsxDEV("span", {
166
+ className: "text-xs text-muted-foreground",
167
+ children: t5
168
+ }, void 0, false);
169
+ $[11] = t5;
170
+ $[12] = t6;
171
+ } else {
172
+ t6 = $[12];
173
+ }
174
+ let t7;
175
+ if ($[13] !== count || $[14] !== group.bindings) {
176
+ t7 = count > 0 && /* @__PURE__ */ jsxDEV("div", {
177
+ className: "flex flex-wrap gap-1.5",
178
+ children: group.bindings.map(_temp$1)
179
+ }, void 0, false);
180
+ $[13] = count;
181
+ $[14] = group.bindings;
182
+ $[15] = t7;
183
+ } else {
184
+ t7 = $[15];
185
+ }
186
+ let t8;
187
+ if ($[16] !== t4 || $[17] !== t6 || $[18] !== t7) {
188
+ t8 = /* @__PURE__ */ jsxDEV(CardContent, {
189
+ className: "flex flex-col gap-2 py-4",
190
+ children: [t4, t6, t7]
191
+ }, void 0, true);
192
+ $[16] = t4;
193
+ $[17] = t6;
194
+ $[18] = t7;
195
+ $[19] = t8;
196
+ } else {
197
+ t8 = $[19];
198
+ }
199
+ let t9;
200
+ if ($[20] !== group.testId || $[21] !== onOpen || $[22] !== t8) {
201
+ t9 = /* @__PURE__ */ jsxDEV(Card, {
202
+ className: "cursor-pointer gap-0 py-0 transition-colors hover:bg-muted/40",
203
+ "data-testid": group.testId,
204
+ onClick: onOpen,
205
+ children: t8
206
+ }, void 0, false);
207
+ $[20] = group.testId;
208
+ $[21] = onOpen;
209
+ $[22] = t8;
210
+ $[23] = t9;
211
+ } else {
212
+ t9 = $[23];
213
+ }
214
+ return t9;
215
+ };
216
+ const TAB_ORDER = ["kv", "files", "vectors"];
217
+ const upsertCard = (current, card) => [...current.filter((group) => group.tab !== card.tab), card].toSorted((a, b) => TAB_ORDER.indexOf(a.tab) - TAB_ORDER.indexOf(b.tab));
218
+ const BindingsOverview = () => {
219
+ const $ = c(19);
220
+ const client = useLunora();
221
+ const features = useStudioFeatures();
222
+ const t = useT();
223
+ let t0;
224
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
225
+ t0 = [];
226
+ $[0] = t0;
227
+ } else {
228
+ t0 = $[0];
229
+ }
230
+ const [groups, setGroups] = useState(t0);
231
+ let t1;
232
+ let t2;
233
+ if ($[1] !== client || $[2] !== features.kv || $[3] !== features.storage || $[4] !== features.vectors || $[5] !== t) {
234
+ t1 = () => {
235
+ const token = {
236
+ cancelled: false
237
+ };
238
+ const sources = [{
239
+ enabled: features.kv,
240
+ label: t("KV Namespaces"),
241
+ load: async () => {
242
+ const namespaces = await client.listKvNamespaces();
243
+ return namespaces.map(_temp2$1);
244
+ },
245
+ tab: "kv",
246
+ testId: "home-binding-kv"
247
+ }, {
248
+ enabled: features.storage,
249
+ label: t("R2 Buckets"),
250
+ load: () => client.listStorageBuckets(),
251
+ tab: "files",
252
+ testId: "home-binding-r2"
253
+ }, {
254
+ enabled: features.vectors,
255
+ label: t("Vectorize Indexes"),
256
+ load: async () => {
257
+ const indexes = await client.listVectorIndexes();
258
+ return indexes.map(_temp3$1);
259
+ },
260
+ tab: "vectors",
261
+ testId: "home-binding-vectors"
262
+ }];
263
+ for (const source of sources) {
264
+ if (!source.enabled) {
265
+ continue;
266
+ }
267
+ fireAndForget((async () => {
268
+ try {
269
+ const bindings = await source.load();
270
+ if (!token.cancelled) {
271
+ const card = {
272
+ bindings,
273
+ label: source.label,
274
+ tab: source.tab,
275
+ testId: source.testId
276
+ };
277
+ setGroups((current) => upsertCard(current, card));
278
+ }
279
+ } catch {
280
+ }
281
+ })());
282
+ }
283
+ return () => {
284
+ token.cancelled = true;
285
+ };
286
+ };
287
+ t2 = [client, features.kv, features.storage, features.vectors, t];
288
+ $[1] = client;
289
+ $[2] = features.kv;
290
+ $[3] = features.storage;
291
+ $[4] = features.vectors;
292
+ $[5] = t;
293
+ $[6] = t1;
294
+ $[7] = t2;
295
+ } else {
296
+ t1 = $[6];
297
+ t2 = $[7];
298
+ }
299
+ useEffect(t1, t2);
300
+ if (groups.length === 0) {
301
+ return null;
302
+ }
303
+ let t3;
304
+ if ($[8] !== t) {
305
+ t3 = t("Bindings");
306
+ $[8] = t;
307
+ $[9] = t3;
308
+ } else {
309
+ t3 = $[9];
310
+ }
311
+ let t4;
312
+ if ($[10] !== t3) {
313
+ t4 = /* @__PURE__ */ jsxDEV("h2", {
314
+ className: "text-sm font-semibold tracking-tight text-foreground",
315
+ children: t3
316
+ }, void 0, false);
317
+ $[10] = t3;
318
+ $[11] = t4;
319
+ } else {
320
+ t4 = $[11];
321
+ }
322
+ let t5;
323
+ if ($[12] !== groups) {
324
+ t5 = groups.map(_temp4$1);
325
+ $[12] = groups;
326
+ $[13] = t5;
327
+ } else {
328
+ t5 = $[13];
329
+ }
330
+ let t6;
331
+ if ($[14] !== t5) {
332
+ t6 = /* @__PURE__ */ jsxDEV("div", {
333
+ className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3",
334
+ children: t5
335
+ }, void 0, false);
336
+ $[14] = t5;
337
+ $[15] = t6;
338
+ } else {
339
+ t6 = $[15];
340
+ }
341
+ let t7;
342
+ if ($[16] !== t4 || $[17] !== t6) {
343
+ t7 = /* @__PURE__ */ jsxDEV("section", {
344
+ className: "flex flex-col gap-3",
345
+ "data-testid": "home-bindings",
346
+ children: [t4, t6]
347
+ }, void 0, true);
348
+ $[16] = t4;
349
+ $[17] = t6;
350
+ $[18] = t7;
351
+ } else {
352
+ t7 = $[18];
353
+ }
354
+ return t7;
355
+ };
356
+ function _temp$1(binding) {
357
+ return /* @__PURE__ */ jsxDEV(Badge, {
358
+ variant: "secondary",
359
+ children: binding
360
+ }, binding, false);
361
+ }
362
+ function _temp2$1(ns) {
363
+ return ns.binding;
364
+ }
365
+ function _temp3$1(index) {
366
+ return index.name;
367
+ }
368
+ function _temp4$1(group) {
369
+ return /* @__PURE__ */ jsxDEV(BindingCard, {
370
+ group
371
+ }, group.tab, false);
372
+ }
373
+
15
374
  const formatMs = (ms) => {
16
375
  if (ms < 1e3) {
17
376
  return `${String(Math.round(ms))}ms`;
@@ -676,7 +1035,7 @@ const averageLatencyMs = (functions) => {
676
1035
  return functions.reduce((sum, function_) => sum + function_.totalDurationMs, 0) / calls;
677
1036
  };
678
1037
  const HomePanel = (t0) => {
679
- const $ = c(149);
1038
+ const $ = c(150);
680
1039
  const {
681
1040
  initialShardKey
682
1041
  } = t0;
@@ -1048,84 +1407,91 @@ const HomePanel = (t0) => {
1048
1407
  t26 = $[93];
1049
1408
  }
1050
1409
  let t27;
1051
- if ($[94] !== functions) {
1052
- t27 = /* @__PURE__ */ jsxDEV("div", {
1410
+ if ($[94] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
1411
+ t27 = /* @__PURE__ */ jsxDEV(BindingsOverview, {}, void 0, false);
1412
+ $[94] = t27;
1413
+ } else {
1414
+ t27 = $[94];
1415
+ }
1416
+ let t28;
1417
+ if ($[95] !== functions) {
1418
+ t28 = /* @__PURE__ */ jsxDEV("div", {
1053
1419
  className: "lg:col-span-2",
1054
1420
  children: /* @__PURE__ */ jsxDEV(TopFunctionsCard, {
1055
1421
  functions
1056
1422
  }, void 0, false)
1057
1423
  }, void 0, false);
1058
- $[94] = functions;
1059
- $[95] = t27;
1424
+ $[95] = functions;
1425
+ $[96] = t28;
1060
1426
  } else {
1061
- t27 = $[95];
1427
+ t28 = $[96];
1062
1428
  }
1063
- let t28;
1064
- if ($[96] !== subscriptions) {
1065
- t28 = /* @__PURE__ */ jsxDEV(LiveConnectionsCard, {
1429
+ let t29;
1430
+ if ($[97] !== subscriptions) {
1431
+ t29 = /* @__PURE__ */ jsxDEV(LiveConnectionsCard, {
1066
1432
  subs: subscriptions
1067
1433
  }, void 0, false);
1068
- $[96] = subscriptions;
1069
- $[97] = t28;
1434
+ $[97] = subscriptions;
1435
+ $[98] = t29;
1070
1436
  } else {
1071
- t28 = $[97];
1437
+ t29 = $[98];
1072
1438
  }
1073
- let t29;
1074
- if ($[98] !== activity) {
1075
- t29 = /* @__PURE__ */ jsxDEV(RecentActivityCard, {
1439
+ let t30;
1440
+ if ($[99] !== activity) {
1441
+ t30 = /* @__PURE__ */ jsxDEV(RecentActivityCard, {
1076
1442
  entries: activity
1077
1443
  }, void 0, false);
1078
- $[98] = activity;
1079
- $[99] = t29;
1444
+ $[99] = activity;
1445
+ $[100] = t30;
1080
1446
  } else {
1081
- t29 = $[99];
1447
+ t30 = $[100];
1082
1448
  }
1083
- let t30;
1084
- if ($[100] !== t28 || $[101] !== t29) {
1085
- t30 = /* @__PURE__ */ jsxDEV("div", {
1449
+ let t31;
1450
+ if ($[101] !== t29 || $[102] !== t30) {
1451
+ t31 = /* @__PURE__ */ jsxDEV("div", {
1086
1452
  className: "flex flex-col gap-3",
1087
- children: [t28, t29]
1453
+ children: [t29, t30]
1088
1454
  }, void 0, true);
1089
- $[100] = t28;
1090
1455
  $[101] = t29;
1091
1456
  $[102] = t30;
1457
+ $[103] = t31;
1092
1458
  } else {
1093
- t30 = $[102];
1459
+ t31 = $[103];
1094
1460
  }
1095
- let t31;
1096
- if ($[103] !== t27 || $[104] !== t30) {
1097
- t31 = /* @__PURE__ */ jsxDEV("div", {
1461
+ let t32;
1462
+ if ($[104] !== t28 || $[105] !== t31) {
1463
+ t32 = /* @__PURE__ */ jsxDEV("div", {
1098
1464
  className: "grid gap-3 lg:grid-cols-3",
1099
- children: [t27, t30]
1465
+ children: [t28, t31]
1100
1466
  }, void 0, true);
1101
- $[103] = t27;
1102
- $[104] = t30;
1467
+ $[104] = t28;
1103
1468
  $[105] = t31;
1469
+ $[106] = t32;
1104
1470
  } else {
1105
- t31 = $[105];
1471
+ t32 = $[106];
1106
1472
  }
1107
- let t32;
1108
- if ($[106] !== t) {
1109
- t32 = t("Advisors");
1110
- $[106] = t;
1111
- $[107] = t32;
1473
+ let t33;
1474
+ if ($[107] !== t) {
1475
+ t33 = t("Advisors");
1476
+ $[107] = t;
1477
+ $[108] = t33;
1112
1478
  } else {
1113
- t32 = $[107];
1479
+ t33 = $[108];
1114
1480
  }
1115
- let t33;
1116
- if ($[108] !== t32) {
1117
- t33 = /* @__PURE__ */ jsxDEV("h2", {
1481
+ let t34;
1482
+ if ($[109] !== t33) {
1483
+ t34 = /* @__PURE__ */ jsxDEV("h2", {
1118
1484
  className: "text-sm font-semibold tracking-tight text-foreground",
1119
- children: t32
1485
+ children: t33
1120
1486
  }, void 0, false);
1121
- $[108] = t32;
1122
1487
  $[109] = t33;
1488
+ $[110] = t34;
1123
1489
  } else {
1124
- t33 = $[109];
1490
+ t34 = $[110];
1125
1491
  }
1126
- let t34;
1127
- if ($[110] !== performanceCount || $[111] !== securityCount || $[112] !== t || $[113] !== viewPerformance || $[114] !== viewSecurity) {
1128
- t34 = securityCount === 0 && performanceCount === 0 ? /* @__PURE__ */ jsxDEV(EmptyState, {
1492
+ let t35;
1493
+ if ($[111] !== performanceCount || $[112] !== securityCount || $[113] !== t || $[114] !== viewPerformance || $[115] !== viewSecurity) {
1494
+ t35 = securityCount === 0 && performanceCount === 0 ? /* @__PURE__ */ jsxDEV(EmptyState, {
1129
1495
  description: t("No security or performance issues detected."),
1130
1496
  icon: /* @__PURE__ */ jsxDEV("svg", {
1131
1497
  "aria-hidden": "true",
@@ -1157,148 +1523,148 @@ const HomePanel = (t0) => {
1157
1523
  title: t("Performance issues")
1158
1524
  }, void 0, false)]
1159
1525
  }, void 0, true);
1160
- $[110] = performanceCount;
1161
- $[111] = securityCount;
1162
- $[112] = t;
1163
- $[113] = viewPerformance;
1164
- $[114] = viewSecurity;
1165
- $[115] = t34;
1526
+ $[111] = performanceCount;
1527
+ $[112] = securityCount;
1528
+ $[113] = t;
1529
+ $[114] = viewPerformance;
1530
+ $[115] = viewSecurity;
1531
+ $[116] = t35;
1166
1532
  } else {
1167
- t34 = $[115];
1533
+ t35 = $[116];
1168
1534
  }
1169
- let t35;
1170
- if ($[116] !== t33 || $[117] !== t34) {
1171
- t35 = /* @__PURE__ */ jsxDEV("section", {
1535
+ let t36;
1536
+ if ($[117] !== t34 || $[118] !== t35) {
1537
+ t36 = /* @__PURE__ */ jsxDEV("section", {
1172
1538
  className: "flex flex-col gap-3",
1173
1539
  "data-testid": "home-advisors",
1174
- children: [t33, t34]
1540
+ children: [t34, t35]
1175
1541
  }, void 0, true);
1176
- $[116] = t33;
1177
1542
  $[117] = t34;
1178
1543
  $[118] = t35;
1544
+ $[119] = t36;
1179
1545
  } else {
1180
- t35 = $[118];
1546
+ t36 = $[119];
1181
1547
  }
1182
- let t36;
1183
- if ($[119] !== t) {
1184
- t36 = t("Get connected");
1185
- $[119] = t;
1186
- $[120] = t36;
1548
+ let t37;
1549
+ if ($[120] !== t) {
1550
+ t37 = t("Get connected");
1551
+ $[120] = t;
1552
+ $[121] = t37;
1187
1553
  } else {
1188
- t36 = $[120];
1554
+ t37 = $[121];
1189
1555
  }
1190
- let t37;
1191
- if ($[121] !== t36) {
1192
- t37 = /* @__PURE__ */ jsxDEV("h2", {
1556
+ let t38;
1557
+ if ($[122] !== t37) {
1558
+ t38 = /* @__PURE__ */ jsxDEV("h2", {
1193
1559
  className: "text-sm font-semibold tracking-tight text-foreground",
1194
- children: t36
1560
+ children: t37
1195
1561
  }, void 0, false);
1196
- $[121] = t36;
1197
1562
  $[122] = t37;
1563
+ $[123] = t38;
1198
1564
  } else {
1199
- t37 = $[122];
1565
+ t38 = $[123];
1200
1566
  }
1201
- let t38;
1202
- if ($[123] !== t) {
1203
- t38 = t("Client SDK");
1204
- $[123] = t;
1205
- $[124] = t38;
1567
+ let t39;
1568
+ if ($[124] !== t) {
1569
+ t39 = t("Client SDK");
1570
+ $[124] = t;
1571
+ $[125] = t39;
1206
1572
  } else {
1207
- t38 = $[124];
1573
+ t39 = $[125];
1208
1574
  }
1209
- let t39;
1210
- if ($[125] !== t38) {
1211
- t39 = /* @__PURE__ */ jsxDEV(ConnectCard, {
1575
+ let t40;
1576
+ if ($[126] !== t39) {
1577
+ t40 = /* @__PURE__ */ jsxDEV(ConnectCard, {
1212
1578
  command: "npm i @lunora/client",
1213
- label: t38
1579
+ label: t39
1214
1580
  }, void 0, false);
1215
- $[125] = t38;
1216
1581
  $[126] = t39;
1582
+ $[127] = t40;
1217
1583
  } else {
1218
- t39 = $[126];
1584
+ t40 = $[127];
1219
1585
  }
1220
- let t40;
1221
- if ($[127] !== t) {
1222
- t40 = t("React");
1223
- $[127] = t;
1224
- $[128] = t40;
1586
+ let t41;
1587
+ if ($[128] !== t) {
1588
+ t41 = t("React");
1589
+ $[128] = t;
1590
+ $[129] = t41;
1225
1591
  } else {
1226
- t40 = $[128];
1592
+ t41 = $[129];
1227
1593
  }
1228
- let t41;
1229
- if ($[129] !== t40) {
1230
- t41 = /* @__PURE__ */ jsxDEV(ConnectCard, {
1594
+ let t42;
1595
+ if ($[130] !== t41) {
1596
+ t42 = /* @__PURE__ */ jsxDEV(ConnectCard, {
1231
1597
  command: "npm i @lunora/react",
1232
- label: t40
1598
+ label: t41
1233
1599
  }, void 0, false);
1234
- $[129] = t40;
1235
1600
  $[130] = t41;
1601
+ $[131] = t42;
1236
1602
  } else {
1237
- t41 = $[130];
1603
+ t42 = $[131];
1238
1604
  }
1239
- let t42;
1240
- if ($[131] !== t) {
1241
- t42 = t("CLI");
1242
- $[131] = t;
1243
- $[132] = t42;
1605
+ let t43;
1606
+ if ($[132] !== t) {
1607
+ t43 = t("CLI");
1608
+ $[132] = t;
1609
+ $[133] = t43;
1244
1610
  } else {
1245
- t42 = $[132];
1611
+ t43 = $[133];
1246
1612
  }
1247
- let t43;
1248
- if ($[133] !== t42) {
1249
- t43 = /* @__PURE__ */ jsxDEV(ConnectCard, {
1613
+ let t44;
1614
+ if ($[134] !== t43) {
1615
+ t44 = /* @__PURE__ */ jsxDEV(ConnectCard, {
1250
1616
  command: "lunora dev",
1251
- label: t42
1617
+ label: t43
1252
1618
  }, void 0, false);
1253
- $[133] = t42;
1254
1619
  $[134] = t43;
1620
+ $[135] = t44;
1255
1621
  } else {
1256
- t43 = $[134];
1622
+ t44 = $[135];
1257
1623
  }
1258
- let t44;
1259
- if ($[135] !== t39 || $[136] !== t41 || $[137] !== t43) {
1260
- t44 = /* @__PURE__ */ jsxDEV("div", {
1624
+ let t45;
1625
+ if ($[136] !== t40 || $[137] !== t42 || $[138] !== t44) {
1626
+ t45 = /* @__PURE__ */ jsxDEV("div", {
1261
1627
  className: "grid gap-3 sm:grid-cols-3",
1262
- children: [t39, t41, t43]
1628
+ children: [t40, t42, t44]
1263
1629
  }, void 0, true);
1264
- $[135] = t39;
1265
- $[136] = t41;
1266
- $[137] = t43;
1630
+ $[136] = t40;
1631
+ $[137] = t42;
1267
1632
  $[138] = t44;
1633
+ $[139] = t45;
1268
1634
  } else {
1269
- t44 = $[138];
1635
+ t45 = $[139];
1270
1636
  }
1271
- let t45;
1272
- if ($[139] !== t37 || $[140] !== t44) {
1273
- t45 = /* @__PURE__ */ jsxDEV("section", {
1637
+ let t46;
1638
+ if ($[140] !== t38 || $[141] !== t45) {
1639
+ t46 = /* @__PURE__ */ jsxDEV("section", {
1274
1640
  className: "flex flex-col gap-3",
1275
1641
  "data-testid": "home-get-connected",
1276
- children: [t37, t44]
1642
+ children: [t38, t45]
1277
1643
  }, void 0, true);
1278
- $[139] = t37;
1279
- $[140] = t44;
1644
+ $[140] = t38;
1280
1645
  $[141] = t45;
1646
+ $[142] = t46;
1281
1647
  } else {
1282
- t45 = $[141];
1648
+ t46 = $[142];
1283
1649
  }
1284
- let t46;
1285
- if ($[142] !== t18 || $[143] !== t19 || $[144] !== t26 || $[145] !== t31 || $[146] !== t35 || $[147] !== t45) {
1286
- t46 = /* @__PURE__ */ jsxDEV("div", {
1650
+ let t47;
1651
+ if ($[143] !== t18 || $[144] !== t19 || $[145] !== t26 || $[146] !== t32 || $[147] !== t36 || $[148] !== t46) {
1652
+ t47 = /* @__PURE__ */ jsxDEV("div", {
1287
1653
  className: t18,
1288
1654
  "data-testid": t19,
1289
- children: [t26, t31, t35, t45]
1655
+ children: [t26, t27, t32, t36, t46]
1290
1656
  }, void 0, true);
1291
- $[142] = t18;
1292
- $[143] = t19;
1293
- $[144] = t26;
1294
- $[145] = t31;
1295
- $[146] = t35;
1296
- $[147] = t45;
1657
+ $[143] = t18;
1658
+ $[144] = t19;
1659
+ $[145] = t26;
1660
+ $[146] = t32;
1661
+ $[147] = t36;
1297
1662
  $[148] = t46;
1663
+ $[149] = t47;
1298
1664
  } else {
1299
- t46 = $[148];
1665
+ t47 = $[149];
1300
1666
  }
1301
- return t46;
1667
+ return t47;
1302
1668
  };
1303
1669
  function _temp(value, index) {
1304
1670
  return {
@@ -1331,4 +1697,4 @@ function _temp4(function_) {
1331
1697
  return function_.maxDurationMs;
1332
1698
  }
1333
1699
 
1334
- export { HomePanel };
1700
+ export { HomePanel as H, useStudioFeatures as u };