@lunora/studio 1.0.0-alpha.55 → 1.0.0-alpha.56

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 (89) hide show
  1. package/dist/index.d.ts +5 -1
  2. package/dist/index.js +6 -6
  3. package/dist/mount.js +1 -1
  4. package/dist/packem_chunks/ApiTab.js +1 -1
  5. package/dist/packem_chunks/AuditPanel.js +1 -1
  6. package/dist/packem_chunks/ExportImportPanel.js +1 -1
  7. package/dist/packem_chunks/FileBrowser.js +1 -1
  8. package/dist/packem_chunks/FunctionRunner.js +1 -1
  9. package/dist/packem_chunks/FunctionStatsPanel.js +1 -1
  10. package/dist/packem_chunks/HealthPanel.js +1 -1
  11. package/dist/packem_chunks/InsightsPanel.js +1 -1
  12. package/dist/packem_chunks/LogsPanel.js +1 -1
  13. package/dist/packem_chunks/MailPanel.js +1 -1
  14. package/dist/packem_chunks/MetricsPanel.js +2 -2
  15. package/dist/packem_chunks/MigrationsPanel.js +1 -1
  16. package/dist/packem_chunks/PitrPanel.js +1 -1
  17. package/dist/packem_chunks/SchemaViewer.js +1 -1
  18. package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -1
  19. package/dist/packem_chunks/SettingsPanel.js +1 -1
  20. package/dist/packem_chunks/SqlEditorPanel.js +1 -1
  21. package/dist/packem_chunks/TableEditor.js +1 -1
  22. package/dist/packem_chunks/agents-panel.js +1 -1
  23. package/dist/packem_chunks/containers-panel.js +1 -1
  24. package/dist/packem_chunks/dashboards-panel.js +1 -1
  25. package/dist/packem_chunks/fanout-panel.js +1 -1
  26. package/dist/packem_chunks/flags-panel.js +1 -1
  27. package/dist/packem_chunks/issues-panel.js +320 -81
  28. package/dist/packem_chunks/kv-browser.js +2 -2
  29. package/dist/packem_chunks/payments-panel.js +1 -1
  30. package/dist/packem_chunks/permissions-panel.js +1 -1
  31. package/dist/packem_chunks/queues-panel.js +1 -1
  32. package/dist/packem_chunks/rls-panel.js +1 -1
  33. package/dist/packem_chunks/storage-rules-panel.js +1 -1
  34. package/dist/packem_chunks/subscriptions-panel.js +1 -1
  35. package/dist/packem_chunks/traces-panel.js +1 -1
  36. package/dist/packem_chunks/workflows-panel.js +1 -1
  37. package/dist/packem_shared/{ADMIN_FUNCTIONS-C6TEeUiJ.js → ADMIN_FUNCTIONS-C1LXrovV.js} +4 -0
  38. package/dist/packem_shared/{ApiDocsPanel-CcC6ucbp.js → ApiDocsPanel-cYkYKjK3.js} +1 -1
  39. package/dist/packem_shared/{DataBrowser-BuFEPTiv.js → DataBrowser-CowupumK.js} +1 -1
  40. package/dist/packem_shared/{HomePanel-2I1YZm0A.js → HomePanel-B12QgvIn.js} +2 -2
  41. package/dist/packem_shared/{Studio-CCJBI2wP.js → Studio-DV1PhCIl.js} +2 -2
  42. package/dist/packem_shared/{StudioApp-Daeqxw2h.js → StudioApp-BF2rK77z.js} +1 -1
  43. package/dist/packem_shared/{home-panel-DHHUtnKU.js → home-panel-DDo_fi19.js} +1 -1
  44. package/dist/packem_shared/{select-UkNYCT3s.js → select-D9OwHEch.js} +1 -1
  45. package/dist/packem_shared/{studio-0479nrrm.js → studio-CuNuEnSJ.js} +1 -1
  46. package/dist/standalone/{chunk-G5CMK5GY.js → chunk-25CDYYNE.js} +1 -1
  47. package/dist/standalone/{chunk-AE3AKGOW.js → chunk-2DCA6LV7.js} +1 -1
  48. package/dist/standalone/{chunk-EOE5NDMK.js → chunk-2TJVFKD2.js} +1 -1
  49. package/dist/standalone/{chunk-RG4HLPM2.js → chunk-2U3KE6IP.js} +1 -1
  50. package/dist/standalone/{chunk-DVBY6YQK.js → chunk-2XJ3WRKW.js} +1 -1
  51. package/dist/standalone/{chunk-4AZYW2PI.js → chunk-3BYY75EO.js} +1 -1
  52. package/dist/standalone/chunk-3HGNPZBN.js +1 -0
  53. package/dist/standalone/{chunk-VQ3YOUZB.js → chunk-4A7VE2UO.js} +1 -1
  54. package/dist/standalone/{chunk-TTEEPVCN.js → chunk-5SXQWGTH.js} +1 -1
  55. package/dist/standalone/{chunk-OVSBLTAA.js → chunk-6LQ3FXP2.js} +1 -1
  56. package/dist/standalone/{chunk-FPKTXKPE.js → chunk-6RW37KKD.js} +1 -1
  57. package/dist/standalone/{chunk-W7ND56KZ.js → chunk-6ZGXWDSY.js} +1 -1
  58. package/dist/standalone/{chunk-XG4TZSP4.js → chunk-AL5UKM6M.js} +1 -1
  59. package/dist/standalone/{chunk-N5FMEYSL.js → chunk-BZ5BHTVF.js} +1 -1
  60. package/dist/standalone/{chunk-RDA4VTHI.js → chunk-D54HL2MW.js} +1 -1
  61. package/dist/standalone/chunk-DBCP55V6.js +1 -0
  62. package/dist/standalone/{chunk-PIB7VUVM.js → chunk-DGWFJ3GW.js} +1 -1
  63. package/dist/standalone/{chunk-FBGC3RSU.js → chunk-DOLG4V3A.js} +1 -1
  64. package/dist/standalone/{chunk-MWH5LBNF.js → chunk-E5Z2TAAR.js} +1 -1
  65. package/dist/standalone/{chunk-CW7LZ4SR.js → chunk-EGANQQLW.js} +1 -1
  66. package/dist/standalone/{chunk-JHR3HKT5.js → chunk-ILGPO3PK.js} +2 -2
  67. package/dist/standalone/{chunk-JQPHZL2A.js → chunk-JWCCDDLY.js} +1 -1
  68. package/dist/standalone/{chunk-S5NTGHCG.js → chunk-JZLGLG4T.js} +1 -1
  69. package/dist/standalone/{chunk-ZUTFDG76.js → chunk-LJ3KEIPO.js} +1 -1
  70. package/dist/standalone/{chunk-Q3X7IMLF.js → chunk-LYAWJGSH.js} +1 -1
  71. package/dist/standalone/chunk-MHGJUKCZ.js +1 -0
  72. package/dist/standalone/{chunk-YNSFQKMM.js → chunk-N3V74RBP.js} +1 -1
  73. package/dist/standalone/{chunk-IKVZUVHJ.js → chunk-OBFYFJYZ.js} +1 -1
  74. package/dist/standalone/{chunk-YRE6TGXH.js → chunk-OEIBZ5AI.js} +1 -1
  75. package/dist/standalone/{chunk-FXNS5NBY.js → chunk-OOLK6C5I.js} +1 -1
  76. package/dist/standalone/{chunk-SP7GSPKX.js → chunk-RVVADT2N.js} +1 -1
  77. package/dist/standalone/{chunk-NAFKYFBZ.js → chunk-S7BCXJWD.js} +1 -1
  78. package/dist/standalone/{chunk-6LLFTVEI.js → chunk-ULOBAURC.js} +1 -1
  79. package/dist/standalone/{chunk-LTCX3QOE.js → chunk-VDOUWYIZ.js} +1 -1
  80. package/dist/standalone/{chunk-EIZG4GOM.js → chunk-VJABWVPW.js} +1 -1
  81. package/dist/standalone/{chunk-EPDC422O.js → chunk-WQC5IIF7.js} +1 -1
  82. package/dist/standalone/{chunk-WA3DGSC2.js → chunk-XFINDIAB.js} +1 -1
  83. package/dist/standalone/{chunk-JGCRBFFO.js → chunk-XTOCLVRS.js} +1 -1
  84. package/dist/standalone/studio.js +1 -1
  85. package/dist/styles.css +1 -1
  86. package/package.json +1 -1
  87. package/dist/standalone/chunk-DWDILV2E.js +0 -1
  88. package/dist/standalone/chunk-EBTLTGG3.js +0 -1
  89. package/dist/standalone/chunk-G5RC7USY.js +0 -1
@@ -1,26 +1,56 @@
1
1
  import { c } from 'react/compiler-runtime';
2
+ import { useLunora } from '@lunora/react';
2
3
  import { useState } from 'react';
3
4
  import { L as LiveError } from '../packem_shared/live-status-FZ0psC1z.js';
4
5
  import { ShardInput } from '../packem_shared/ShardInput-CZnpHILL.js';
5
6
  import { B as Badge } from '../packem_shared/badge-B2PKA1-5.js';
7
+ import { B as Button } from '../packem_shared/button-BhsN2uZH.js';
6
8
  import { C as Card, a as CardContent } from '../packem_shared/card-F2vH_aj2.js';
7
9
  import { E as EmptyState } from '../packem_shared/empty-state-DY_oe0k6.js';
10
+ import { I as Input } from '../packem_shared/input-XH4r1Pt1.js';
11
+ import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from '../packem_shared/select-D9OwHEch.js';
8
12
  import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as TableBody, e as TableCell } from '../packem_shared/table-DsCa9Qp9.js';
9
13
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
10
14
  import useDebounced from '../packem_shared/useDebounced-Dxncpg6z.js';
11
15
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
12
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
13
- import { i as formatTimestamp } from '../packem_shared/internal-zwBoOv24.js';
16
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
17
+ import { i as formatTimestamp, f as fireAndForget, a as adminRef, c as callOptions, e as errorMessage } from '../packem_shared/internal-zwBoOv24.js';
14
18
  import { jsxDEV } from 'react/jsx-dev-runtime';
15
19
 
20
+ const SEVERITY_NONE = "none";
21
+ const STATUS_FILTERS = ["all", "open", "resolved", "ignored"];
22
+ const SEVERITY_OPTIONS = ["critical", "high", "medium", "low"];
23
+ const RESOLVE_ISSUE = adminRef(ADMIN_FUNCTIONS.resolveIssue);
24
+ const IGNORE_ISSUE = adminRef(ADMIN_FUNCTIONS.ignoreIssue);
25
+ const ASSIGN_ISSUE = adminRef(ADMIN_FUNCTIONS.assignIssue);
26
+ const SET_ISSUE_SEVERITY = adminRef(ADMIN_FUNCTIONS.setIssueSeverity);
16
27
  const issuesOf = (result) => Array.isArray(result?.issues) ? result.issues : [];
28
+ const statusVariant = (status) => {
29
+ if (status === "resolved") {
30
+ return "success";
31
+ }
32
+ return status === "ignored" ? "secondary" : "warning";
33
+ };
34
+ const severityVariant = (severity) => {
35
+ if (severity === "critical") {
36
+ return "destructive";
37
+ }
38
+ if (severity === "high") {
39
+ return "warning";
40
+ }
41
+ return severity === "medium" ? "info" : "secondary";
42
+ };
17
43
  const IssuesPanel = (t0) => {
18
- const $ = c(21);
44
+ const $ = c(44);
19
45
  const {
20
46
  initialShardKey
21
47
  } = t0;
22
48
  const t = useT();
49
+ const client = useLunora();
23
50
  const [shardKey, setShardKey] = useState(initialShardKey ?? "");
51
+ const [statusFilter, setStatusFilter] = useState("all");
52
+ const [busyHash, setBusyHash] = useState(null);
53
+ const [actionError, setActionError] = useState(null);
24
54
  let t1;
25
55
  if ($[0] !== shardKey) {
26
56
  t1 = shardKey.trim();
@@ -31,22 +61,25 @@ const IssuesPanel = (t0) => {
31
61
  }
32
62
  const debouncedShard = useDebounced(t1, 400);
33
63
  let t2;
34
- if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
35
- t2 = {};
36
- $[2] = t2;
64
+ if ($[2] !== statusFilter) {
65
+ t2 = statusFilter === "all" ? {} : {
66
+ status: statusFilter
67
+ };
68
+ $[2] = statusFilter;
69
+ $[3] = t2;
37
70
  } else {
38
- t2 = $[2];
71
+ t2 = $[3];
39
72
  }
40
73
  let t3;
41
- if ($[3] !== debouncedShard) {
74
+ if ($[4] !== debouncedShard) {
42
75
  t3 = {
43
76
  live: true,
44
77
  shardKey: debouncedShard
45
78
  };
46
- $[3] = debouncedShard;
47
- $[4] = t3;
79
+ $[4] = debouncedShard;
80
+ $[5] = t3;
48
81
  } else {
49
- t3 = $[4];
82
+ t3 = $[5];
50
83
  }
51
84
  const {
52
85
  data,
@@ -55,60 +88,179 @@ const IssuesPanel = (t0) => {
55
88
  } = useAdminQuery(ADMIN_FUNCTIONS.getIssues, t2, t3);
56
89
  const loaded = data !== void 0;
57
90
  let t4;
58
- if ($[5] !== data || $[6] !== error || $[7] !== liveError || $[8] !== loaded || $[9] !== shardKey || $[10] !== t) {
91
+ if ($[6] !== actionError || $[7] !== busyHash || $[8] !== client || $[9] !== data || $[10] !== debouncedShard || $[11] !== error || $[12] !== liveError || $[13] !== loaded || $[14] !== shardKey || $[15] !== statusFilter || $[16] !== t) {
59
92
  const issues = issuesOf(data);
60
93
  let t5;
61
- if ($[12] !== error) {
62
- t5 = error !== null && /* @__PURE__ */ jsxDEV("p", {
94
+ if ($[18] !== client || $[19] !== debouncedShard) {
95
+ t5 = async (hash, reference, args) => {
96
+ setActionError(null);
97
+ setBusyHash(hash);
98
+ try {
99
+ await client.query(reference, {
100
+ ...args,
101
+ hash
102
+ }, callOptions(debouncedShard));
103
+ } catch (t62) {
104
+ const error_ = t62;
105
+ setActionError(errorMessage(error_));
106
+ }
107
+ setBusyHash(null);
108
+ };
109
+ $[18] = client;
110
+ $[19] = debouncedShard;
111
+ $[20] = t5;
112
+ } else {
113
+ t5 = $[20];
114
+ }
115
+ const runTriage = t5;
116
+ let t6;
117
+ if ($[21] !== runTriage) {
118
+ t6 = (issue) => (event) => {
119
+ if (event.key !== "Enter") {
120
+ return;
121
+ }
122
+ const next = event.currentTarget.value.trim();
123
+ fireAndForget(runTriage(issue.hash, ASSIGN_ISSUE, {
124
+ assignee: next === "" ? null : next
125
+ }));
126
+ };
127
+ $[21] = runTriage;
128
+ $[22] = t6;
129
+ } else {
130
+ t6 = $[22];
131
+ }
132
+ const onAssignKeyDown = t6;
133
+ let t7;
134
+ if ($[23] !== runTriage) {
135
+ t7 = (issue_0) => (value) => {
136
+ const severity = value === null || value === SEVERITY_NONE ? null : value;
137
+ fireAndForget(runTriage(issue_0.hash, SET_ISSUE_SEVERITY, {
138
+ severity
139
+ }));
140
+ };
141
+ $[23] = runTriage;
142
+ $[24] = t7;
143
+ } else {
144
+ t7 = $[24];
145
+ }
146
+ const onSeverityChange = t7;
147
+ let t8;
148
+ if ($[25] !== t) {
149
+ t8 = (value_0) => {
150
+ if (value_0 === "all") {
151
+ return t("All");
152
+ }
153
+ if (value_0 === "open") {
154
+ return t("Open");
155
+ }
156
+ if (value_0 === "resolved") {
157
+ return t("Resolved");
158
+ }
159
+ return t("Ignored");
160
+ };
161
+ $[25] = t;
162
+ $[26] = t8;
163
+ } else {
164
+ t8 = $[26];
165
+ }
166
+ const statusFilterLabel = t8;
167
+ let t9;
168
+ if ($[27] !== error) {
169
+ t9 = error !== null && /* @__PURE__ */ jsxDEV("p", {
63
170
  className: "text-sm text-destructive",
64
171
  "data-testid": "issues-error",
65
172
  role: "alert",
66
173
  children: error
67
174
  }, void 0, false);
68
- $[12] = error;
69
- $[13] = t5;
175
+ $[27] = error;
176
+ $[28] = t9;
70
177
  } else {
71
- t5 = $[13];
178
+ t9 = $[28];
72
179
  }
73
- let t6;
74
- if ($[14] !== shardKey) {
75
- t6 = /* @__PURE__ */ jsxDEV(ShardInput, {
180
+ let t10;
181
+ if ($[29] !== actionError) {
182
+ t10 = actionError !== null && /* @__PURE__ */ jsxDEV("p", {
183
+ className: "text-sm text-destructive",
184
+ "data-testid": "issues-action-error",
185
+ role: "alert",
186
+ children: actionError
187
+ }, void 0, false);
188
+ $[29] = actionError;
189
+ $[30] = t10;
190
+ } else {
191
+ t10 = $[30];
192
+ }
193
+ let t11;
194
+ if ($[31] !== shardKey) {
195
+ t11 = /* @__PURE__ */ jsxDEV(ShardInput, {
76
196
  onChange: setShardKey,
77
197
  testId: "issues-shard-input",
78
198
  value: shardKey
79
199
  }, void 0, false);
80
- $[14] = shardKey;
81
- $[15] = t6;
200
+ $[31] = shardKey;
201
+ $[32] = t11;
82
202
  } else {
83
- t6 = $[15];
203
+ t11 = $[32];
84
204
  }
85
- let t7;
86
- if ($[16] !== liveError) {
87
- t7 = /* @__PURE__ */ jsxDEV(LiveError, {
205
+ let t12;
206
+ if ($[33] !== liveError) {
207
+ t12 = /* @__PURE__ */ jsxDEV(LiveError, {
88
208
  message: liveError,
89
209
  prefix: "issues"
90
210
  }, void 0, false);
91
- $[16] = liveError;
92
- $[17] = t7;
211
+ $[33] = liveError;
212
+ $[34] = t12;
93
213
  } else {
94
- t7 = $[17];
214
+ t12 = $[34];
95
215
  }
96
- let t8;
97
- if ($[18] !== t6 || $[19] !== t7) {
98
- t8 = /* @__PURE__ */ jsxDEV("div", {
216
+ let t13;
217
+ if ($[35] !== statusFilter || $[36] !== statusFilterLabel) {
218
+ t13 = STATUS_FILTERS.map((value_1) => /* @__PURE__ */ jsxDEV(Button, {
219
+ "data-active": statusFilter === value_1 ? "" : void 0,
220
+ "data-testid": `issues-filter-${value_1}`,
221
+ onClick: () => {
222
+ setStatusFilter(value_1);
223
+ },
224
+ size: "xs",
225
+ variant: statusFilter === value_1 ? "default" : "outline",
226
+ children: statusFilterLabel(value_1)
227
+ }, value_1, false));
228
+ $[35] = statusFilter;
229
+ $[36] = statusFilterLabel;
230
+ $[37] = t13;
231
+ } else {
232
+ t13 = $[37];
233
+ }
234
+ let t14;
235
+ if ($[38] !== t13) {
236
+ t14 = /* @__PURE__ */ jsxDEV("div", {
237
+ className: "ms-auto flex items-center gap-1",
238
+ "data-testid": "issues-status-filter",
239
+ role: "group",
240
+ children: t13
241
+ }, void 0, false);
242
+ $[38] = t13;
243
+ $[39] = t14;
244
+ } else {
245
+ t14 = $[39];
246
+ }
247
+ let t15;
248
+ if ($[40] !== t11 || $[41] !== t12 || $[42] !== t14) {
249
+ t15 = /* @__PURE__ */ jsxDEV("div", {
99
250
  className: "flex flex-wrap items-center gap-2",
100
- children: [t6, t7]
251
+ children: [t11, t12, t14]
101
252
  }, void 0, true);
102
- $[18] = t6;
103
- $[19] = t7;
104
- $[20] = t8;
253
+ $[40] = t11;
254
+ $[41] = t12;
255
+ $[42] = t14;
256
+ $[43] = t15;
105
257
  } else {
106
- t8 = $[20];
258
+ t15 = $[43];
107
259
  }
108
260
  t4 = /* @__PURE__ */ jsxDEV("div", {
109
261
  className: "flex flex-col gap-6",
110
262
  "data-testid": "lunora-issues-panel",
111
- children: [t5, t8, loaded && issues.length === 0 ? /* @__PURE__ */ jsxDEV(EmptyState, {
263
+ children: [t9, t10, t15, loaded && issues.length === 0 ? /* @__PURE__ */ jsxDEV(EmptyState, {
112
264
  description: t("No grouped errors yet. When a function throws or a container crashes, matching errors fold into a single issue here."),
113
265
  testId: "issues-empty",
114
266
  title: t("No issues")
@@ -123,66 +275,153 @@ const IssuesPanel = (t0) => {
123
275
  children: [/* @__PURE__ */ jsxDEV(TableHead, {
124
276
  children: t("Issue")
125
277
  }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
126
- children: t("Source")
278
+ children: t("Status")
279
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
280
+ children: t("Severity")
281
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
282
+ children: t("Assignee")
127
283
  }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
128
284
  className: "text-right",
129
285
  children: t("Events")
130
- }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
131
- children: t("First seen")
132
286
  }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
133
287
  children: t("Last seen")
288
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableHead, {
289
+ className: "text-right",
290
+ children: t("Actions")
134
291
  }, void 0, false)]
135
292
  }, void 0, true)
136
293
  }, void 0, false), /* @__PURE__ */ jsxDEV(TableBody, {
137
- children: issues.map(_temp)
294
+ children: issues.map((issue_1) => {
295
+ const busy = busyHash === issue_1.hash;
296
+ return /* @__PURE__ */ jsxDEV(TableRow, {
297
+ "data-testid": `issues-row-${issue_1.hash}`,
298
+ children: [/* @__PURE__ */ jsxDEV(TableCell, {
299
+ className: "max-w-80",
300
+ children: [/* @__PURE__ */ jsxDEV("div", {
301
+ className: "truncate font-medium",
302
+ title: issue_1.title,
303
+ children: issue_1.title
304
+ }, void 0, false), /* @__PURE__ */ jsxDEV("div", {
305
+ className: "truncate font-mono text-xs text-muted-foreground",
306
+ title: issue_1.culprit,
307
+ children: issue_1.culprit
308
+ }, void 0, false)]
309
+ }, void 0, true), /* @__PURE__ */ jsxDEV(TableCell, {
310
+ children: /* @__PURE__ */ jsxDEV(Badge, {
311
+ "data-testid": `issues-status-${issue_1.hash}`,
312
+ variant: statusVariant(issue_1.status),
313
+ children: issue_1.status
314
+ }, void 0, false)
315
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
316
+ children: /* @__PURE__ */ jsxDEV(Select, {
317
+ disabled: busy,
318
+ onValueChange: onSeverityChange(issue_1),
319
+ value: issue_1.severity ?? SEVERITY_NONE,
320
+ children: [/* @__PURE__ */ jsxDEV(SelectTrigger, {
321
+ "aria-label": t("Set severity"),
322
+ className: "h-7 w-[110px]",
323
+ "data-testid": `issues-severity-${issue_1.hash}`,
324
+ children: /* @__PURE__ */ jsxDEV(SelectValue, {
325
+ placeholder: t("—"),
326
+ children: issue_1.severity === void 0 ? /* @__PURE__ */ jsxDEV("span", {
327
+ className: "text-muted-foreground",
328
+ children: t("—")
329
+ }, void 0, false) : /* @__PURE__ */ jsxDEV(Badge, {
330
+ variant: severityVariant(issue_1.severity),
331
+ children: issue_1.severity
332
+ }, void 0, false)
333
+ }, void 0, false)
334
+ }, void 0, false), /* @__PURE__ */ jsxDEV(SelectContent, {
335
+ children: [SEVERITY_OPTIONS.map(_temp), /* @__PURE__ */ jsxDEV(SelectItem, {
336
+ value: SEVERITY_NONE,
337
+ children: t("Clear")
338
+ }, void 0, false)]
339
+ }, void 0, true)]
340
+ }, void 0, true)
341
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
342
+ children: /* @__PURE__ */ jsxDEV(Input, {
343
+ "aria-label": t("Assignee"),
344
+ className: "h-7 w-32",
345
+ "data-testid": `issues-assignee-${issue_1.hash}`,
346
+ defaultValue: issue_1.assignee ?? "",
347
+ disabled: busy,
348
+ onKeyDown: onAssignKeyDown(issue_1),
349
+ placeholder: t("Unassigned")
350
+ }, issue_1.assignee ?? "", false)
351
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
352
+ className: "text-right",
353
+ children: /* @__PURE__ */ jsxDEV(Badge, {
354
+ variant: "secondary",
355
+ children: issue_1.count
356
+ }, void 0, false)
357
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
358
+ className: "text-xs tabular-nums text-muted-foreground",
359
+ children: formatTimestamp(issue_1.lastSeen)
360
+ }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
361
+ className: "text-right",
362
+ children: /* @__PURE__ */ jsxDEV("div", {
363
+ className: "flex justify-end gap-1",
364
+ children: [issue_1.status !== "resolved" && /* @__PURE__ */ jsxDEV(Button, {
365
+ "data-testid": `issues-resolve-${issue_1.hash}`,
366
+ disabled: busy,
367
+ onClick: () => {
368
+ fireAndForget(runTriage(issue_1.hash, RESOLVE_ISSUE, {}));
369
+ },
370
+ size: "xs",
371
+ variant: "outline",
372
+ children: t("Resolve")
373
+ }, void 0, false), issue_1.status !== "ignored" && /* @__PURE__ */ jsxDEV(Button, {
374
+ "data-testid": `issues-ignore-${issue_1.hash}`,
375
+ disabled: busy,
376
+ onClick: () => {
377
+ fireAndForget(runTriage(issue_1.hash, IGNORE_ISSUE, {}));
378
+ },
379
+ size: "xs",
380
+ variant: "ghost",
381
+ children: t("Ignore")
382
+ }, void 0, false), issue_1.status !== "open" && /* @__PURE__ */ jsxDEV(Button, {
383
+ "data-testid": `issues-reopen-${issue_1.hash}`,
384
+ disabled: busy,
385
+ onClick: () => {
386
+ fireAndForget(runTriage(issue_1.hash, ASSIGN_ISSUE, {
387
+ assignee: issue_1.assignee ?? null
388
+ }));
389
+ },
390
+ size: "xs",
391
+ variant: "ghost",
392
+ children: t("Reopen")
393
+ }, void 0, false)]
394
+ }, void 0, true)
395
+ }, void 0, false)]
396
+ }, issue_1.hash, true);
397
+ })
138
398
  }, void 0, false)]
139
399
  }, void 0, true)
140
400
  }, void 0, false)
141
401
  }, void 0, false)]
142
402
  }, void 0, true);
143
- $[5] = data;
144
- $[6] = error;
145
- $[7] = liveError;
146
- $[8] = loaded;
147
- $[9] = shardKey;
148
- $[10] = t;
149
- $[11] = t4;
403
+ $[6] = actionError;
404
+ $[7] = busyHash;
405
+ $[8] = client;
406
+ $[9] = data;
407
+ $[10] = debouncedShard;
408
+ $[11] = error;
409
+ $[12] = liveError;
410
+ $[13] = loaded;
411
+ $[14] = shardKey;
412
+ $[15] = statusFilter;
413
+ $[16] = t;
414
+ $[17] = t4;
150
415
  } else {
151
- t4 = $[11];
416
+ t4 = $[17];
152
417
  }
153
418
  return t4;
154
419
  };
155
- function _temp(issue) {
156
- return /* @__PURE__ */ jsxDEV(TableRow, {
157
- "data-testid": `issues-row-${issue.hash}`,
158
- children: [/* @__PURE__ */ jsxDEV(TableCell, {
159
- className: "max-w-96",
160
- children: [/* @__PURE__ */ jsxDEV("div", {
161
- className: "truncate font-medium",
162
- title: issue.title,
163
- children: issue.title
164
- }, void 0, false), /* @__PURE__ */ jsxDEV("div", {
165
- className: "truncate text-xs text-muted-foreground",
166
- title: issue.sampleMessage,
167
- children: issue.sampleMessage
168
- }, void 0, false)]
169
- }, void 0, true), /* @__PURE__ */ jsxDEV(TableCell, {
170
- className: "font-mono text-xs text-muted-foreground",
171
- children: issue.culprit
172
- }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
173
- className: "text-right",
174
- children: /* @__PURE__ */ jsxDEV(Badge, {
175
- variant: "secondary",
176
- children: issue.count
177
- }, void 0, false)
178
- }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
179
- className: "text-xs tabular-nums text-muted-foreground",
180
- children: formatTimestamp(issue.firstSeen)
181
- }, void 0, false), /* @__PURE__ */ jsxDEV(TableCell, {
182
- className: "text-xs tabular-nums text-muted-foreground",
183
- children: formatTimestamp(issue.lastSeen)
184
- }, void 0, false)]
185
- }, issue.hash, true);
420
+ function _temp(value_2) {
421
+ return /* @__PURE__ */ jsxDEV(SelectItem, {
422
+ value: value_2,
423
+ children: value_2
424
+ }, value_2, false);
186
425
  }
187
426
 
188
427
  export { IssuesPanel };
@@ -8,11 +8,11 @@ import { f as fireAndForget, e as errorMessage, k as formatBytes, g as copyToCli
8
8
  import { B as Button } from '../packem_shared/button-BhsN2uZH.js';
9
9
  import { C as Checkbox } from '../packem_shared/checkbox-UNkzAxl-.js';
10
10
  import { I as Input } from '../packem_shared/input-XH4r1Pt1.js';
11
- import { b as Sheet, c as SheetContent, d as SheetHeader, e as SheetTitle } from '../packem_shared/studio-0479nrrm.js';
11
+ import { b as Sheet, c as SheetContent, d as SheetHeader, e as SheetTitle } from '../packem_shared/studio-CuNuEnSJ.js';
12
12
  import { c } from 'react/compiler-runtime';
13
13
  import { L as Label } from '../packem_shared/label-D8ykjn5J.js';
14
14
  import { T as Textarea } from '../packem_shared/textarea-D3gaCU_-.js';
15
- import { S as SelectValue, a as SelectTrigger, b as SelectItem, c as SelectContent, d as Select } from '../packem_shared/select-UkNYCT3s.js';
15
+ import { b as SelectValue, a as SelectTrigger, d as SelectItem, c as SelectContent, S as Select } from '../packem_shared/select-D9OwHEch.js';
16
16
  import { jsxDEV, Fragment } from 'react/jsx-dev-runtime';
17
17
  import { B as Badge } from '../packem_shared/badge-B2PKA1-5.js';
18
18
 
@@ -6,7 +6,7 @@ import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as Table
6
6
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
7
7
  import { useAutoRefresh } from '../packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
8
8
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
9
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
9
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
10
10
  import { i as formatTimestamp } from '../packem_shared/internal-zwBoOv24.js';
11
11
  import { jsxDEV } from 'react/jsx-dev-runtime';
12
12
 
@@ -9,7 +9,7 @@ import { B as Button } from '../packem_shared/button-BhsN2uZH.js';
9
9
  import { E as EmptyState } from '../packem_shared/empty-state-DY_oe0k6.js';
10
10
  import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as TableBody, e as TableCell } from '../packem_shared/table-DsCa9Qp9.js';
11
11
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
12
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
12
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
13
13
  import { jsxDEV } from 'react/jsx-dev-runtime';
14
14
  import { useLunora } from '@lunora/react';
15
15
  import { ShardInput } from '../packem_shared/ShardInput-CZnpHILL.js';
@@ -14,7 +14,7 @@ import { T as Textarea } from '../packem_shared/textarea-D3gaCU_-.js';
14
14
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
15
15
  import { useAutoRefresh } from '../packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
16
16
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
17
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
17
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
18
18
  import { c as callOptions, e as errorMessage, a as adminRef, f as fireAndForget, i as formatTimestamp } from '../packem_shared/internal-zwBoOv24.js';
19
19
  import { jsxDEV, Fragment } from 'react/jsx-dev-runtime';
20
20
 
@@ -6,7 +6,7 @@ import { E as EmptyState } from '../packem_shared/empty-state-DY_oe0k6.js';
6
6
  import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as TableBody, e as TableCell } from '../packem_shared/table-DsCa9Qp9.js';
7
7
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
8
8
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
9
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
9
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
10
10
  import { jsxDEV } from 'react/jsx-dev-runtime';
11
11
 
12
12
  const OPERATIONS = ["read", "insert", "update", "delete"];
@@ -6,7 +6,7 @@ import { E as EmptyState } from '../packem_shared/empty-state-DY_oe0k6.js';
6
6
  import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as TableBody, e as TableCell } from '../packem_shared/table-DsCa9Qp9.js';
7
7
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
8
8
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
9
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
9
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
10
10
  import { jsxDEV } from 'react/jsx-dev-runtime';
11
11
 
12
12
  const operationLabel = (t, operation) => ({
@@ -10,7 +10,7 @@ import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js
10
10
  import { useAutoRefresh } from '../packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
11
11
  import useDebounced from '../packem_shared/useDebounced-Dxncpg6z.js';
12
12
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
13
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
13
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
14
14
  import { jsxDEV } from 'react/jsx-dev-runtime';
15
15
 
16
16
  const ARGS_MAX = 80;
@@ -10,7 +10,7 @@ import { I as Input } from '../packem_shared/input-XH4r1Pt1.js';
10
10
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
11
11
  import useDebounced from '../packem_shared/useDebounced-Dxncpg6z.js';
12
12
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
13
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
13
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
14
14
  import { i as formatTimestamp } from '../packem_shared/internal-zwBoOv24.js';
15
15
  import { r as recordShard } from '../packem_shared/shard-history-AxiJ1WPP.js';
16
16
  import { c as cn } from '../packem_shared/utils-B05Dmz_H.js';
@@ -8,7 +8,7 @@ import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as Table
8
8
  import { T as Textarea } from '../packem_shared/textarea-D3gaCU_-.js';
9
9
  import { u as useAdminQuery } from '../packem_shared/use-admin-query-BGJ010yZ.js';
10
10
  import { useT } from '../packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
11
- import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C6TEeUiJ.js';
11
+ import { ADMIN_FUNCTIONS } from '../packem_shared/ADMIN_FUNCTIONS-C1LXrovV.js';
12
12
  import { f as fireAndForget, e as errorMessage, c as callOptions, a as adminRef } from '../packem_shared/internal-zwBoOv24.js';
13
13
  import { jsxDEV } from 'react/jsx-dev-runtime';
14
14
 
@@ -1,5 +1,6 @@
1
1
  const ADMIN_FUNCTION_PREFIX = "__lunora_admin__:";
2
2
  const ADMIN_FUNCTIONS = {
3
+ assignIssue: "__lunora_admin__:assignIssue",
3
4
  clearCapturedMail: "__lunora_admin__:clearCapturedMail",
4
5
  clearQueueMessages: "__lunora_admin__:clearQueueMessages",
5
6
  clearTable: "__lunora_admin__:clearTable",
@@ -32,6 +33,7 @@ const ADMIN_FUNCTIONS = {
32
33
  getTraces: "__lunora_admin__:getTraces",
33
34
  // eslint-disable-next-line no-secrets/no-secrets -- reserved admin RPC path constant, not a credential
34
35
  getWorkflowInstanceStatus: "__lunora_admin__:getWorkflowInstanceStatus",
36
+ ignoreIssue: "__lunora_admin__:ignoreIssue",
35
37
  importShard: "__lunora_admin__:importShard",
36
38
  listTables: "__lunora_admin__:listTables",
37
39
  maskPolicies: "__lunora_admin__:maskPolicies",
@@ -39,12 +41,14 @@ const ADMIN_FUNCTIONS = {
39
41
  pitrRestore: "__lunora_admin__:pitrRestore",
40
42
  readTablePage: "__lunora_admin__:readTablePage",
41
43
  replayQueueMessage: "__lunora_admin__:replayQueueMessage",
44
+ resolveIssue: "__lunora_admin__:resolveIssue",
42
45
  rlsPolicies: "__lunora_admin__:rlsPolicies",
43
46
  runAs: "__lunora_admin__:runAs",
44
47
  runMigration: "__lunora_admin__:runMigration",
45
48
  runSql: "__lunora_admin__:runSql",
46
49
  sendQueueMessage: "__lunora_admin__:sendQueueMessage",
47
50
  sendTestMail: "__lunora_admin__:sendTestMail",
51
+ setIssueSeverity: "__lunora_admin__:setIssueSeverity",
48
52
  storageOrphans: "__lunora_admin__:storageOrphans",
49
53
  storageReferences: "__lunora_admin__:storageReferences",
50
54
  storageRules: "__lunora_admin__:storageRules",
@@ -4,7 +4,7 @@ import { useState, useEffect } from 'react';
4
4
  import { B as Button } from './button-BhsN2uZH.js';
5
5
  import { E as EmptyState } from './empty-state-DY_oe0k6.js';
6
6
  import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
7
- import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-C6TEeUiJ.js';
7
+ import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-C1LXrovV.js';
8
8
  import { c as callOptions, a as adminRef, g as copyToClipboard } from './internal-zwBoOv24.js';
9
9
  import { jsxDEV } from 'react/jsx-dev-runtime';
10
10
 
@@ -5,7 +5,7 @@ import { ConfirmButton } from './ConfirmButton-C2eVi2Qv.js';
5
5
  import { ShardInput } from './ShardInput-CZnpHILL.js';
6
6
  import { E as EmptyState } from './empty-state-DY_oe0k6.js';
7
7
  import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
8
- import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-C6TEeUiJ.js';
8
+ import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-C1LXrovV.js';
9
9
  import { h as formatCell, f as fireAndForget, c as callOptions, a as adminRef, i as formatTimestamp } from './internal-zwBoOv24.js';
10
10
  import { useReactTable, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
11
11
  import { useVirtualizer } from '@tanstack/react-virtual';
@@ -6,9 +6,9 @@ import './card-F2vH_aj2.js';
6
6
  import './empty-state-DY_oe0k6.js';
7
7
  import './use-admin-query-BGJ010yZ.js';
8
8
  import './DEFAULT_LOCALE-CiX4W7Kr.js';
9
- import './ADMIN_FUNCTIONS-C6TEeUiJ.js';
9
+ import './ADMIN_FUNCTIONS-C1LXrovV.js';
10
10
  import './internal-zwBoOv24.js';
11
11
  import './utils-B05Dmz_H.js';
12
12
  import './DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js';
13
- export { H as HomePanel } from './home-panel-DHHUtnKU.js';
13
+ export { H as HomePanel } from './home-panel-DDo_fi19.js';
14
14
  import 'react/jsx-dev-runtime';