adonisjs-server-stats 1.11.2 → 1.11.4

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/core/index.d.ts +1 -0
  2. package/dist/core/index.js +358 -294
  3. package/dist/src/controller/debug_controller.js +2 -3
  4. package/package.json +1 -1
  5. /package/dist/react/{react/components → components}/Dashboard/DashboardPage.d.ts +0 -0
  6. /package/dist/react/{react/components → components}/Dashboard/sections/CacheSection.d.ts +0 -0
  7. /package/dist/react/{react/components → components}/Dashboard/sections/ConfigSection.d.ts +0 -0
  8. /package/dist/react/{react/components → components}/Dashboard/sections/EmailsSection.d.ts +0 -0
  9. /package/dist/react/{react/components → components}/Dashboard/sections/EventsSection.d.ts +0 -0
  10. /package/dist/react/{react/components → components}/Dashboard/sections/InternalsSection.d.ts +0 -0
  11. /package/dist/react/{react/components → components}/Dashboard/sections/JobsSection.d.ts +0 -0
  12. /package/dist/react/{react/components → components}/Dashboard/sections/LogsSection.d.ts +0 -0
  13. /package/dist/react/{react/components → components}/Dashboard/sections/OverviewSection.d.ts +0 -0
  14. /package/dist/react/{react/components → components}/Dashboard/sections/QueriesSection.d.ts +0 -0
  15. /package/dist/react/{react/components → components}/Dashboard/sections/RequestsSection.d.ts +0 -0
  16. /package/dist/react/{react/components → components}/Dashboard/sections/RoutesSection.d.ts +0 -0
  17. /package/dist/react/{react/components → components}/Dashboard/shared/DataTable.d.ts +0 -0
  18. /package/dist/react/{react/components → components}/Dashboard/shared/Pagination.d.ts +0 -0
  19. /package/dist/react/{react/components → components}/Dashboard/shared/TimeRangeSelector.d.ts +0 -0
  20. /package/dist/react/{react/components → components}/Dashboard/shared/WaterfallChart.d.ts +0 -0
  21. /package/dist/react/{react/components → components}/DebugPanel/DebugPanel.d.ts +0 -0
  22. /package/dist/react/{react/components → components}/DebugPanel/tabs/CacheTab.d.ts +0 -0
  23. /package/dist/react/{react/components → components}/DebugPanel/tabs/ConfigTab.d.ts +0 -0
  24. /package/dist/react/{react/components → components}/DebugPanel/tabs/CustomPaneTab.d.ts +0 -0
  25. /package/dist/react/{react/components → components}/DebugPanel/tabs/EmailsTab.d.ts +0 -0
  26. /package/dist/react/{react/components → components}/DebugPanel/tabs/EventsTab.d.ts +0 -0
  27. /package/dist/react/{react/components → components}/DebugPanel/tabs/InternalsTab.d.ts +0 -0
  28. /package/dist/react/{react/components → components}/DebugPanel/tabs/JobsTab.d.ts +0 -0
  29. /package/dist/react/{react/components → components}/DebugPanel/tabs/LogsTab.d.ts +0 -0
  30. /package/dist/react/{react/components → components}/DebugPanel/tabs/QueriesTab.d.ts +0 -0
  31. /package/dist/react/{react/components → components}/DebugPanel/tabs/RoutesTab.d.ts +0 -0
  32. /package/dist/react/{react/components → components}/DebugPanel/tabs/TimelineTab.d.ts +0 -0
  33. /package/dist/react/{react/components → components}/StatsBar/MetricCard.d.ts +0 -0
  34. /package/dist/react/{react/components → components}/StatsBar/Sparkline.d.ts +0 -0
  35. /package/dist/react/{react/components → components}/StatsBar/StatsBar.d.ts +0 -0
  36. /package/dist/react/{react/components → components}/shared/Badge.d.ts +0 -0
  37. /package/dist/react/{react/components → components}/shared/CacheStatsBar.d.ts +0 -0
  38. /package/dist/react/{react/components → components}/shared/ConfigContent.d.ts +0 -0
  39. /package/dist/react/{react/components → components}/shared/EmailPreviewOverlay.d.ts +0 -0
  40. /package/dist/react/{react/components → components}/shared/FilterBar.d.ts +0 -0
  41. /package/dist/react/{react/components → components}/shared/InternalsContent.d.ts +0 -0
  42. /package/dist/react/{react/components → components}/shared/JobStatsBar.d.ts +0 -0
  43. /package/dist/react/{react/components → components}/shared/JsonViewer.d.ts +0 -0
  44. /package/dist/react/{react/components → components}/shared/LogEntryRow.d.ts +0 -0
  45. /package/dist/react/{react/components → components}/shared/RelatedLogs.d.ts +0 -0
  46. /package/dist/react/{react/components → components}/shared/SplitPaneWrapper.d.ts +0 -0
  47. /package/dist/react/{react/components → components}/shared/ThemeToggle.d.ts +0 -0
  48. /package/dist/react/{react/components → components}/shared/TimeAgoCell.d.ts +0 -0
  49. /package/dist/react/{react/components → components}/shared/Tooltip.d.ts +0 -0
  50. /package/dist/react/{react/hooks → hooks}/useApiClient.d.ts +0 -0
  51. /package/dist/react/{react/hooks → hooks}/useDashboardApiBase.d.ts +0 -0
  52. /package/dist/react/{react/hooks → hooks}/useDashboardData.d.ts +0 -0
  53. /package/dist/react/{react/hooks → hooks}/useDebugData.d.ts +0 -0
  54. /package/dist/react/{react/hooks → hooks}/useDiagnosticsData.d.ts +0 -0
  55. /package/dist/react/{react/hooks → hooks}/useFeatures.d.ts +0 -0
  56. /package/dist/react/{react/hooks → hooks}/useResizableTable.d.ts +0 -0
  57. /package/dist/react/{react/hooks → hooks}/useServerStats.d.ts +0 -0
  58. /package/dist/react/{react/hooks → hooks}/useTheme.d.ts +0 -0
  59. /package/dist/react/{react/index.d.ts → index.d.ts} +0 -0
@@ -1,17 +1,17 @@
1
- class b extends Error {
1
+ class S extends Error {
2
2
  status;
3
3
  constructor(t = 403) {
4
4
  super(`Unauthorized (HTTP ${t})`), this.name = "UnauthorizedError", this.status = t;
5
5
  }
6
6
  }
7
- class B extends Error {
7
+ class H extends Error {
8
8
  status;
9
9
  body;
10
10
  constructor(t, r) {
11
11
  super(`API error (HTTP ${t})`), this.name = "ApiError", this.status = t, this.body = r;
12
12
  }
13
13
  }
14
- class v {
14
+ class E {
15
15
  baseUrl;
16
16
  authToken;
17
17
  constructor(t) {
@@ -39,10 +39,10 @@ class v {
39
39
  if (r?.signal?.aborted)
40
40
  throw new DOMException("The operation was aborted.", "AbortError");
41
41
  if (s.status === 401 || s.status === 403)
42
- throw new b(s.status);
42
+ throw new S(s.status);
43
43
  if (!s.ok) {
44
44
  const i = await s.text().catch(() => "");
45
- throw new B(s.status, i);
45
+ throw new H(s.status, i);
46
46
  }
47
47
  return s.json();
48
48
  }
@@ -84,7 +84,7 @@ class v {
84
84
  return this.fetch(t, { method: "DELETE" });
85
85
  }
86
86
  }
87
- function H(e, t) {
87
+ function N(e, t) {
88
88
  const r = e || (typeof window < "u" ? window.location.origin : "");
89
89
  if (!t)
90
90
  return { baseUrl: r };
@@ -99,7 +99,7 @@ function H(e, t) {
99
99
  }
100
100
  };
101
101
  }
102
- async function N() {
102
+ async function q() {
103
103
  if (typeof window < "u" && window.Transmit && typeof window.Transmit == "function")
104
104
  return window.Transmit;
105
105
  try {
@@ -109,17 +109,17 @@ async function N() {
109
109
  return null;
110
110
  }
111
111
  }
112
- function q(e) {
112
+ function z(e) {
113
113
  let t = null, r = null, n = !1;
114
114
  return { subscribe: async () => {
115
115
  try {
116
- const i = await N();
116
+ const i = await q();
117
117
  if (!i)
118
118
  throw new Error(
119
119
  "Transmit client not available (neither window.Transmit nor @adonisjs/transmit-client)"
120
120
  );
121
121
  if (n) return;
122
- t = new i(H(e.baseUrl, e.authToken)), r = t.subscription(e.channelName), r.onMessage((a) => {
122
+ t = new i(N(e.baseUrl, e.authToken)), r = t.subscription(e.channelName), r.onMessage((a) => {
123
123
  n || e.onMessage(a);
124
124
  }), await r.create();
125
125
  } catch (i) {
@@ -135,7 +135,7 @@ function q(e) {
135
135
  }
136
136
  function K(e) {
137
137
  let t = !1;
138
- const r = q({
138
+ const r = z({
139
139
  baseUrl: e.baseUrl,
140
140
  channelName: e.channelName,
141
141
  authToken: e.authToken,
@@ -155,18 +155,18 @@ function K(e) {
155
155
  }
156
156
  };
157
157
  }
158
- const S = "ss-dash-theme", k = "ss-theme-change";
159
- function U() {
158
+ const v = "ss-dash-theme", M = "ss-theme-change";
159
+ function D() {
160
160
  if (typeof window > "u") return "light";
161
- const e = localStorage.getItem(S);
161
+ const e = localStorage.getItem(v);
162
162
  return e === "dark" || e === "light" ? e : window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light";
163
163
  }
164
- function z(e) {
165
- typeof window > "u" || (localStorage.setItem(S, e), window.dispatchEvent(new CustomEvent(k, { detail: e })));
164
+ function j(e) {
165
+ typeof window > "u" || (localStorage.setItem(v, e), window.dispatchEvent(new CustomEvent(M, { detail: e })));
166
166
  }
167
- function qe() {
168
- const t = U() === "dark" ? "light" : "dark";
169
- return z(t), t;
167
+ function ze() {
168
+ const t = D() === "dark" ? "light" : "dark";
169
+ return j(t), t;
170
170
  }
171
171
  function Ke(e) {
172
172
  if (typeof window > "u") return () => {
@@ -175,18 +175,18 @@ function Ke(e) {
175
175
  const i = s.detail;
176
176
  (i === "dark" || i === "light") && e(i);
177
177
  }, r = (s) => {
178
- if (s.key === S) {
178
+ if (s.key === v) {
179
179
  const i = s.newValue;
180
- e(i === "dark" || i === "light" ? i : U());
180
+ e(i === "dark" || i === "light" ? i : D());
181
181
  }
182
182
  }, n = window.matchMedia("(prefers-color-scheme: dark)"), o = (s) => {
183
- localStorage.getItem(S) || e(s.matches ? "dark" : "light");
183
+ localStorage.getItem(v) || e(s.matches ? "dark" : "light");
184
184
  };
185
- return window.addEventListener(k, t), window.addEventListener("storage", r), n.addEventListener("change", o), () => {
186
- window.removeEventListener(k, t), window.removeEventListener("storage", r), n.removeEventListener("change", o);
185
+ return window.addEventListener(M, t), window.addEventListener("storage", r), n.addEventListener("change", o), () => {
186
+ window.removeEventListener(M, t), window.removeEventListener("storage", r), n.removeEventListener("change", o);
187
187
  };
188
188
  }
189
- const m = {
189
+ const y = {
190
190
  color: "#34d399",
191
191
  fillOpacityTop: 0.25,
192
192
  fillOpacityBottom: 0.02,
@@ -195,30 +195,30 @@ const m = {
195
195
  height: 32,
196
196
  padding: 2
197
197
  };
198
- function j(e) {
199
- return { ...m, ...e };
198
+ function W(e) {
199
+ return { ...y, ...e };
200
200
  }
201
- function ze(e, t = m.width, r = m.height, n = m.padding) {
201
+ function je(e, t = y.width, r = y.height, n = y.padding) {
202
202
  if (e.length < 2) return null;
203
203
  const o = t - n * 2, s = r - n * 2, i = Math.min(...e), c = Math.max(...e) - i || 1;
204
- return e.map((p, h) => {
205
- const d = n + h / (e.length - 1) * o, f = n + s - (p - i) / c * s;
206
- return `${d.toFixed(1)},${f.toFixed(1)}`;
204
+ return e.map((m, d) => {
205
+ const f = n + d / (e.length - 1) * o, p = n + s - (m - i) / c * s;
206
+ return `${f.toFixed(1)},${p.toFixed(1)}`;
207
207
  }).join(" ");
208
208
  }
209
- function je(e, t = m.width, r = m.height, n = m.padding) {
209
+ function We(e, t = y.width, r = y.height, n = y.padding) {
210
210
  if (e.length < 2) return null;
211
- const o = t - n * 2, s = r - n * 2, i = Math.min(...e), c = Math.max(...e) - i || 1, l = e.map((f, y) => {
212
- const u = n + y / (e.length - 1) * o, E = n + s - (f - i) / c * s;
213
- return `${u.toFixed(1)},${E.toFixed(1)}`;
214
- }), p = (n + o).toFixed(1), h = (n + s).toFixed(1), d = n.toFixed(1);
215
- return `M${l[0]} ` + l.slice(1).map((f) => `L${f}`).join(" ") + ` L${p},${h} L${d},${h} Z`;
211
+ const o = t - n * 2, s = r - n * 2, i = Math.min(...e), c = Math.max(...e) - i || 1, l = e.map((p, b) => {
212
+ const h = n + b / (e.length - 1) * o, T = n + s - (p - i) / c * s;
213
+ return `${h.toFixed(1)},${T.toFixed(1)}`;
214
+ }), m = (n + o).toFixed(1), d = (n + s).toFixed(1), f = n.toFixed(1);
215
+ return `M${l[0]} ` + l.slice(1).map((p) => `L${p}`).join(" ") + ` L${m},${d} L${f},${d} Z`;
216
216
  }
217
217
  let V = 0;
218
- function W() {
218
+ function G() {
219
219
  return `ss-grad-${V++}`;
220
220
  }
221
- function G(e) {
221
+ function Q(e) {
222
222
  if (e.length === 0) return null;
223
223
  let t = e[0], r = e[0], n = e[0];
224
224
  for (let o = 1; o < e.length; o++) {
@@ -229,30 +229,30 @@ function G(e) {
229
229
  }
230
230
  function Ve(e, t) {
231
231
  if (e.length < 2) return null;
232
- const r = j(t), n = G(e), o = n.max - n.min || 1, s = r.width - r.padding * 2, i = r.height - r.padding * 2, a = r.padding, c = e.length, l = Array.from({ length: c });
233
- for (let u = 0; u < c; u++) {
234
- const E = a + u / (c - 1) * s, _ = a + i - (e[u] - n.min) / o * i;
235
- l[u] = `${E.toFixed(1)},${_.toFixed(1)}`;
232
+ const r = W(t), n = Q(e), o = n.max - n.min || 1, s = r.width - r.padding * 2, i = r.height - r.padding * 2, a = r.padding, c = e.length, l = Array.from({ length: c });
233
+ for (let h = 0; h < c; h++) {
234
+ const T = a + h / (c - 1) * s, B = a + i - (e[h] - n.min) / o * i;
235
+ l[h] = `${T.toFixed(1)},${B.toFixed(1)}`;
236
236
  }
237
- const p = l.join(" "), h = (a + s).toFixed(1), d = (a + i).toFixed(1), f = a.toFixed(1), y = `M${l[0]} ` + l.slice(1).map((u) => `L${u}`).join(" ") + ` L${h},${d} L${f},${d} Z`;
237
+ const m = l.join(" "), d = (a + s).toFixed(1), f = (a + i).toFixed(1), p = a.toFixed(1), b = `M${l[0]} ` + l.slice(1).map((h) => `L${h}`).join(" ") + ` L${d},${f} L${p},${f} Z`;
238
238
  return {
239
- points: p,
240
- areaPath: y,
241
- gradientId: W(),
239
+ points: m,
240
+ areaPath: b,
241
+ gradientId: G(),
242
242
  options: r,
243
243
  stats: n
244
244
  };
245
245
  }
246
- const Q = 5e3, J = 1e4, Y = 3e3, X = 100, Z = 500, ee = 60, te = 1e4;
247
- function re(e) {
246
+ const J = 5e3, Y = 1e4, X = 3e3, Z = 100, ee = 500, te = 60, re = 1e4;
247
+ function ne(e) {
248
248
  return '"' + (e.length > 40 ? e.slice(0, 40) + "..." : e) + '"';
249
249
  }
250
- function ne(e, t, r) {
250
+ function se(e, t, r) {
251
251
  if (e.length === 0) return "[]";
252
252
  const n = e.slice(0, 3).map((i) => r(i, 30)), o = e.length > 3 ? ", ..." + e.length + " items" : "", s = "[" + n.join(", ") + o + "]";
253
253
  return s.length > t ? "[" + e.length + " items]" : s;
254
254
  }
255
- function se(e, t, r) {
255
+ function oe(e, t, r) {
256
256
  const n = Object.keys(e);
257
257
  if (n.length === 0) return "{}";
258
258
  const o = [];
@@ -261,30 +261,30 @@ function se(e, t, r) {
261
261
  const s = n.length > 4 ? ", ...+" + (n.length - 4) : "", i = "{ " + o.join(", ") + s + " }";
262
262
  return i.length <= t ? i : "{ " + (n.slice(0, 6).join(", ") + (n.length > 6 ? ", ..." : "")) + " }";
263
263
  }
264
- function oe(e) {
264
+ function ie(e) {
265
265
  if (!e && e !== 0) return "-";
266
266
  const t = Math.floor(e), r = Math.floor(t / 86400), n = Math.floor(t % 86400 / 3600), o = Math.floor(t % 3600 / 60);
267
267
  return r > 0 ? `${r}d ${n}h` : n > 0 ? `${n}h ${o}m` : o > 0 ? `${o}m ${t % 60}s` : `${t}s`;
268
268
  }
269
- function M(e) {
269
+ function P(e) {
270
270
  const t = e / 1048576;
271
271
  return t >= 1024 ? `${(t / 1024).toFixed(1)}G` : `${t.toFixed(0)}M`;
272
272
  }
273
- function A(e) {
273
+ function R(e) {
274
274
  return e >= 1024 ? `${(e / 1024).toFixed(1)}G` : `${e.toFixed(1)}M`;
275
275
  }
276
- function ie(e) {
276
+ function ae(e) {
277
277
  return e >= 1e6 ? `${(e / 1e6).toFixed(1)}M` : e >= 1e3 ? `${(e / 1e3).toFixed(1)}K` : `${e}`;
278
278
  }
279
- function We(e) {
279
+ function Ge(e) {
280
280
  return e >= 1e3 ? `${(e / 1e3).toFixed(2)}s` : e >= 1 ? `${e.toFixed(0)}ms` : `${e.toFixed(2)}ms`;
281
281
  }
282
- function D(e) {
282
+ function _(e) {
283
283
  return /([+-]\d{2}:?\d{2}|Z)\s*$/.test(e) ? e : e + "Z";
284
284
  }
285
- function Ge(e) {
285
+ function Qe(e) {
286
286
  if (!e) return "-";
287
- const t = typeof e == "string" ? new Date(D(e)) : new Date(e);
287
+ const t = typeof e == "string" ? new Date(_(e)) : new Date(e);
288
288
  return Number.isNaN(t.getTime()) ? "-" : t.toLocaleTimeString("en-US", {
289
289
  hour12: !1,
290
290
  hour: "2-digit",
@@ -292,12 +292,12 @@ function Ge(e) {
292
292
  second: "2-digit"
293
293
  }) + "." + String(t.getMilliseconds()).padStart(3, "0");
294
294
  }
295
- function Qe(e) {
295
+ function Je(e) {
296
296
  if (!e) return "-";
297
- const t = typeof e == "string" ? new Date(D(e)).getTime() : e, r = Math.floor((Date.now() - t) / 1e3);
297
+ const t = typeof e == "string" ? new Date(_(e)).getTime() : e, r = Math.floor((Date.now() - t) / 1e3);
298
298
  return r < 0 ? "just now" : r < 60 ? `${r}s ago` : r < 3600 ? `${Math.floor(r / 60)}m ago` : r < 86400 ? `${Math.floor(r / 3600)}h ago` : `${Math.floor(r / 86400)}d ago`;
299
299
  }
300
- function Je(e, t) {
300
+ function Ye(e, t) {
301
301
  switch (t) {
302
302
  case "%":
303
303
  return `${e.toFixed(1)}%`;
@@ -306,7 +306,7 @@ function Je(e, t) {
306
306
  case "MB":
307
307
  return `${e.toFixed(1)}M`;
308
308
  case "bytes":
309
- return M(e);
309
+ return P(e);
310
310
  case "/s":
311
311
  case "/m":
312
312
  return e.toFixed(1);
@@ -317,51 +317,51 @@ function Je(e, t) {
317
317
  function x(e, t, r) {
318
318
  return e > r ? "red" : e > t ? "amber" : "green";
319
319
  }
320
- function ae(e, t, r) {
320
+ function ce(e, t, r) {
321
321
  return e < r ? "red" : e < t ? "amber" : "green";
322
322
  }
323
- function R(e, t) {
323
+ function L(e, t) {
324
324
  if (t === 0) return "green";
325
325
  const r = e / t;
326
326
  return r > 0.8 ? "red" : r > 0.5 ? "amber" : "green";
327
327
  }
328
- const ce = {
328
+ const le = {
329
329
  green: "ss-green",
330
330
  amber: "ss-amber",
331
331
  red: "ss-red"
332
- }, Ye = {
332
+ }, Xe = {
333
333
  green: "#34d399",
334
334
  amber: "#fbbf24",
335
335
  red: "#f87171"
336
- }, Xe = {
336
+ }, Ze = {
337
337
  green: "--ss-accent",
338
338
  amber: "--ss-amber-fg",
339
339
  red: "--ss-red-fg"
340
340
  };
341
- function Ze(e) {
341
+ function et(e) {
342
342
  return e >= 500 ? "red" : e >= 400 ? "amber" : "green";
343
343
  }
344
- function le(e) {
345
- return e > Z ? "very-slow" : e > X ? "slow" : "normal";
344
+ function ue(e) {
345
+ return e > ee ? "very-slow" : e > Z ? "slow" : "normal";
346
346
  }
347
- function et(e, t = "ss-dash") {
348
- const r = le(e);
347
+ function tt(e, t = "ss-dash") {
348
+ const r = ue(e);
349
349
  return r === "very-slow" ? `${t}-very-slow` : r === "slow" ? `${t}-slow` : "";
350
350
  }
351
- function tt(e) {
351
+ function rt(e) {
352
352
  return e ? e.length <= 8 ? e : e.slice(0, 8) + "…" : "--";
353
353
  }
354
- function L(e, t = 100) {
355
- return e === null ? "null" : e === void 0 ? "-" : typeof e == "string" ? re(e) : typeof e == "number" || typeof e == "boolean" ? String(e) : Array.isArray(e) ? ne(e, t, L) : typeof e == "object" ? se(e, t, L) : String(e);
354
+ function F(e, t = 100) {
355
+ return e === null ? "null" : e === void 0 ? "-" : typeof e == "string" ? ne(e) : typeof e == "number" || typeof e == "boolean" ? String(e) : Array.isArray(e) ? se(e, t, F) : typeof e == "object" ? oe(e, t, F) : String(e);
356
356
  }
357
- function rt(e) {
357
+ function nt(e) {
358
358
  return e < 0 ? "no expiry" : e < 60 ? `${e}s` : e < 3600 ? `${Math.floor(e / 60)}m` : e < 86400 ? `${Math.floor(e / 3600)}h` : `${Math.floor(e / 86400)}d`;
359
359
  }
360
- function nt(e) {
360
+ function st(e) {
361
361
  return e < 1024 ? `${e}B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)}KB` : `${(e / (1024 * 1024)).toFixed(1)}MB`;
362
362
  }
363
363
  const O = 50;
364
- function st(e, t, r) {
364
+ function ot(e, t, r) {
365
365
  const n = new URLSearchParams();
366
366
  if (n.set("page", String(e.page)), n.set("perPage", String(e.perPage)), t) {
367
367
  t.search && n.set("search", t.search);
@@ -370,7 +370,7 @@ function st(e, t, r) {
370
370
  }
371
371
  return r && (n.set("sort", r.field), n.set("direction", r.direction)), n.toString();
372
372
  }
373
- function ot(e, t = O) {
373
+ function it(e, t = O) {
374
374
  const r = e.data ?? e.items ?? [], n = e.total ?? 0, o = e.page ?? 1, s = e.perPage ?? e.limit ?? t, i = e.totalPages ?? (Math.ceil(n / s) || 1);
375
375
  return {
376
376
  data: r,
@@ -382,7 +382,7 @@ function ot(e, t = O) {
382
382
  }
383
383
  };
384
384
  }
385
- function it(e = O) {
385
+ function at(e = O) {
386
386
  return {
387
387
  page: 1,
388
388
  perPage: e,
@@ -390,16 +390,16 @@ function it(e = O) {
390
390
  totalPages: 1
391
391
  };
392
392
  }
393
- function at() {
393
+ function ct() {
394
394
  return {
395
395
  search: "",
396
396
  filters: {}
397
397
  };
398
398
  }
399
- function ct(e = "id", t = "desc") {
399
+ function lt(e = "id", t = "desc") {
400
400
  return { field: e, direction: t };
401
401
  }
402
- const ue = [
402
+ const he = [
403
403
  { key: "page", param: "page", isNumeric: !0 },
404
404
  { key: "perPage", param: "perPage", isNumeric: !0 },
405
405
  { key: "search", param: "search" },
@@ -407,9 +407,9 @@ const ue = [
407
407
  { key: "sortDir", param: "direction" },
408
408
  { key: "timeRange", param: "range" }
409
409
  ];
410
- function he(e) {
410
+ function de(e) {
411
411
  const t = new URLSearchParams(), r = e;
412
- for (const { key: n, param: o, isNumeric: s } of ue) {
412
+ for (const { key: n, param: o, isNumeric: s } of he) {
413
413
  const i = r[n];
414
414
  (s ? i != null : i) && t.set(o, String(i));
415
415
  }
@@ -418,7 +418,7 @@ function he(e) {
418
418
  o && t.set(n, o);
419
419
  return t.toString();
420
420
  }
421
- function lt(e) {
421
+ function ut(e) {
422
422
  const t = Math.max(1, Math.ceil(e.total / e.perPage)), r = Math.min(e.page, t), n = e.total === 0 ? 0 : (r - 1) * e.perPage + 1, o = Math.min(r * e.perPage, e.total);
423
423
  return {
424
424
  page: r,
@@ -431,7 +431,7 @@ function lt(e) {
431
431
  hasNext: r < t
432
432
  };
433
433
  }
434
- function ut(e, t, r = 2) {
434
+ function ht(e, t, r = 2) {
435
435
  if (t <= 1) return [1];
436
436
  const n = [], o = Math.max(2, e - r), s = Math.min(t - 1, e + r);
437
437
  n.push(1), o > 2 && n.push("...");
@@ -439,7 +439,7 @@ function ut(e, t, r = 2) {
439
439
  n.push(i);
440
440
  return s < t - 1 && n.push("..."), t > 1 && n.push(t), n;
441
441
  }
442
- const de = [
442
+ const fe = [
443
443
  "tracing",
444
444
  "process",
445
445
  "system",
@@ -452,7 +452,7 @@ const de = [
452
452
  "log",
453
453
  "emails",
454
454
  "dashboard"
455
- ], fe = [
455
+ ], pe = [
456
456
  { flag: "process", group: "process" },
457
457
  { flag: "process", group: "memory" },
458
458
  { flag: "system", group: "memory" },
@@ -462,7 +462,7 @@ const de = [
462
462
  { flag: "queues", group: "queue" },
463
463
  { flag: "app", group: "app" },
464
464
  { flag: "log", group: "log" }
465
- ], pe = [
465
+ ], me = [
466
466
  { group: "process", fields: ["cpuPercent", "uptime", "nodeVersion"] },
467
467
  {
468
468
  group: "memory",
@@ -477,7 +477,7 @@ const de = [
477
477
  { group: "app", fields: ["onlineUsers", "pendingWebhooks", "pendingEmails"] },
478
478
  { group: "log", fields: ["logErrorsLast5m", "logEntriesPerMinute"] }
479
479
  ];
480
- function T(e) {
480
+ function C(e) {
481
481
  return typeof e == "number" && !Number.isNaN(e);
482
482
  }
483
483
  const I = "/admin/api/debug", ge = {
@@ -495,45 +495,45 @@ const I = "/admin/api/debug", ge = {
495
495
  dashboard: !1,
496
496
  customPanes: []
497
497
  };
498
- function me(e) {
498
+ function ye(e) {
499
499
  const t = { customPanes: e.customPanes ?? [] }, r = e.features;
500
- for (const n of de)
500
+ for (const n of fe)
501
501
  t[n] = r?.[n] ?? !1;
502
502
  return t;
503
503
  }
504
- async function ye(e, t = I) {
504
+ async function be(e, t = I) {
505
505
  const r = `${t.replace(/\/+$/, "")}/config`;
506
506
  return e.fetch(r);
507
507
  }
508
- async function ht(e) {
509
- const { baseUrl: t = "", debugEndpoint: r = I, authToken: n } = e, o = new v({ baseUrl: t, authToken: n });
508
+ async function dt(e) {
509
+ const { baseUrl: t = "", debugEndpoint: r = I, authToken: n } = e, o = new E({ baseUrl: t, authToken: n });
510
510
  try {
511
- const s = await ye(o, r);
512
- return me(s);
511
+ const s = await be(o, r);
512
+ return ye(s);
513
513
  } catch {
514
514
  return ge;
515
515
  }
516
516
  }
517
- function dt(e) {
517
+ function ft(e) {
518
518
  const t = /* @__PURE__ */ new Set(), n = "features" in e && typeof e.features == "object" && e.features !== null ? e.features : e;
519
- for (const { flag: o, group: s } of fe)
519
+ for (const { flag: o, group: s } of pe)
520
520
  n[o] && t.add(s);
521
521
  return t;
522
522
  }
523
- function ft(e) {
523
+ function pt(e) {
524
524
  const t = /* @__PURE__ */ new Set();
525
- (T(e.cpuPercent) || T(e.uptime) || be(e)) && t.add("process");
526
- for (const r of pe)
527
- r.fields.some((n) => T(e[n])) && t.add(r.group);
525
+ (C(e.cpuPercent) || C(e.uptime) || Se(e)) && t.add("process");
526
+ for (const r of me)
527
+ r.fields.some((n) => C(e[n])) && t.add(r.group);
528
528
  return e.redisOk !== void 0 && e.redisOk !== null && t.add("redis"), t;
529
529
  }
530
- function be(e) {
530
+ function Se(e) {
531
531
  return typeof e.nodeVersion == "string" && e.nodeVersion.length > 0;
532
532
  }
533
533
  function g(e) {
534
- return ce[e] || "";
534
+ return le[e] || "";
535
535
  }
536
- const P = [
536
+ const A = [
537
537
  // ── Process group ─────────────────────────────────────────────────────────
538
538
  // -- Node version ---------------------------------------------------------
539
539
  {
@@ -554,7 +554,7 @@ const P = [
554
554
  unit: "",
555
555
  group: "process",
556
556
  extract: (e) => e.uptime,
557
- format: (e) => oe(e.uptime),
557
+ format: (e) => ie(e.uptime),
558
558
  color: () => ""
559
559
  },
560
560
  // -- CPU ------------------------------------------------------------------
@@ -594,7 +594,7 @@ const P = [
594
594
  unit: "bytes",
595
595
  group: "memory",
596
596
  extract: (e) => e.memHeapUsed,
597
- format: (e) => M(e.memHeapUsed),
597
+ format: (e) => P(e.memHeapUsed),
598
598
  color: () => "",
599
599
  historyKey: "memHeapUsed"
600
600
  },
@@ -606,7 +606,7 @@ const P = [
606
606
  unit: "bytes",
607
607
  group: "memory",
608
608
  extract: (e) => e.memRss,
609
- format: (e) => M(e.memRss),
609
+ format: (e) => P(e.memRss),
610
610
  color: () => "",
611
611
  historyKey: "memRss"
612
612
  },
@@ -618,12 +618,12 @@ const P = [
618
618
  unit: "MB",
619
619
  group: "memory",
620
620
  extract: (e) => e.systemMemoryTotalMb - e.systemMemoryFreeMb,
621
- format: (e) => `${A(e.systemMemoryTotalMb - e.systemMemoryFreeMb)}/${A(e.systemMemoryTotalMb)}`,
621
+ format: (e) => `${R(e.systemMemoryTotalMb - e.systemMemoryFreeMb)}/${R(e.systemMemoryTotalMb)}`,
622
622
  color: (e) => {
623
623
  const t = e.systemMemoryTotalMb;
624
624
  if (t === 0) return "";
625
625
  const r = t - e.systemMemoryFreeMb;
626
- return g(R(r, t));
626
+ return g(L(r, t));
627
627
  },
628
628
  historyKey: "_sysMemUsed",
629
629
  show: (e) => e.systemMemoryTotalMb !== null && e.systemMemoryTotalMb !== void 0
@@ -691,7 +691,7 @@ const P = [
691
691
  group: "db",
692
692
  extract: (e) => e.dbPoolUsed,
693
693
  format: (e) => `${e.dbPoolUsed}/${e.dbPoolFree}/${e.dbPoolMax}`,
694
- color: (e) => g(R(e.dbPoolUsed, e.dbPoolMax)),
694
+ color: (e) => g(L(e.dbPoolUsed, e.dbPoolMax)),
695
695
  historyKey: "dbPoolUsed"
696
696
  },
697
697
  // ── Redis group ───────────────────────────────────────────────────────────
@@ -727,7 +727,7 @@ const P = [
727
727
  unit: "",
728
728
  group: "redis",
729
729
  extract: (e) => e.redisKeysCount,
730
- format: (e) => ie(e.redisKeysCount),
730
+ format: (e) => ae(e.redisKeysCount),
731
731
  color: () => "",
732
732
  historyKey: "redisKeysCount",
733
733
  show: (e) => e.redisOk
@@ -744,7 +744,7 @@ const P = [
744
744
  inverseThreshold: !0,
745
745
  extract: (e) => e.redisHitRate,
746
746
  format: (e) => `${e.redisHitRate.toFixed(0)}%`,
747
- color: (e) => g(ae(e.redisHitRate, 90, 70)),
747
+ color: (e) => g(ce(e.redisHitRate, 90, 70)),
748
748
  historyKey: "redisHitRate",
749
749
  show: (e) => e.redisOk
750
750
  },
@@ -835,12 +835,12 @@ const P = [
835
835
  historyKey: "logEntriesPerMinute"
836
836
  }
837
837
  ];
838
- function pt(e) {
839
- return P.find((t) => t.id === e);
838
+ function mt(e) {
839
+ return A.find((t) => t.id === e);
840
840
  }
841
841
  function gt() {
842
842
  const e = /* @__PURE__ */ new Map();
843
- for (const t of P) {
843
+ for (const t of A) {
844
844
  const r = t.group || "core";
845
845
  e.has(r) || e.set(r, []), e.get(r).push(t);
846
846
  }
@@ -858,7 +858,7 @@ const xe = {
858
858
  config: "/config",
859
859
  internals: "/diagnostics"
860
860
  };
861
- function Se(e) {
861
+ function ve(e) {
862
862
  return xe[e] || `/${e}`;
863
863
  }
864
864
  const we = {
@@ -874,10 +874,10 @@ const we = {
874
874
  jobs: "/jobs",
875
875
  config: "/config"
876
876
  };
877
- function ve(e) {
877
+ function Ee(e) {
878
878
  return we[e] || `/${e}`;
879
879
  }
880
- function Ee(e = ee) {
880
+ function Te(e = te) {
881
881
  const t = {}, r = {};
882
882
  let n = !1;
883
883
  function o(s) {
@@ -890,7 +890,7 @@ function Ee(e = ee) {
890
890
  return {
891
891
  push(s) {
892
892
  n = !1;
893
- for (const i of P) {
893
+ for (const i of A) {
894
894
  const a = i.historyKey;
895
895
  if (!a) continue;
896
896
  const c = i.extract(s);
@@ -912,7 +912,7 @@ function Ee(e = ee) {
912
912
  }
913
913
  };
914
914
  }
915
- class mt {
915
+ class yt {
916
916
  // -- Configuration --------------------------------------------------------
917
917
  baseUrl;
918
918
  endpoint;
@@ -941,7 +941,7 @@ class mt {
941
941
  isConnected = !1;
942
942
  isStale = !1;
943
943
  constructor(t = {}) {
944
- this.baseUrl = t.baseUrl ?? "", this.endpoint = t.endpoint ?? "/admin/api/server-stats", this.channelName = t.channelName ?? "admin/server-stats", this.authToken = t.authToken, this.pollInterval = t.pollInterval ?? 3e3, this.onStatsUpdate = t.onStatsUpdate, this.onConnectionChange = t.onConnectionChange, this.onStaleChange = t.onStaleChange, this.onError = t.onError, this.onUnauthorizedChange = t.onUnauthorizedChange, this.onHistoryChange = t.onHistoryChange, this.onSseActiveChange = t.onSseActiveChange, this.onPollActiveChange = t.onPollActiveChange, this.historyBuffer = Ee();
944
+ this.baseUrl = t.baseUrl ?? "", this.endpoint = t.endpoint ?? "/admin/api/server-stats", this.channelName = t.channelName ?? "admin/server-stats", this.authToken = t.authToken, this.pollInterval = t.pollInterval ?? 3e3, this.onStatsUpdate = t.onStatsUpdate, this.onConnectionChange = t.onConnectionChange, this.onStaleChange = t.onStaleChange, this.onError = t.onError, this.onUnauthorizedChange = t.onUnauthorizedChange, this.onHistoryChange = t.onHistoryChange, this.onSseActiveChange = t.onSseActiveChange, this.onPollActiveChange = t.onPollActiveChange, this.historyBuffer = Te();
945
945
  }
946
946
  // -- Public API -----------------------------------------------------------
947
947
  /**
@@ -1018,7 +1018,7 @@ class mt {
1018
1018
  /** Start the stale detection interval. */
1019
1019
  startStaleDetection() {
1020
1020
  this.staleTimer = setInterval(() => {
1021
- this.lastSuccess > 0 && Date.now() - this.lastSuccess > te && this.setStale(!0);
1021
+ this.lastSuccess > 0 && Date.now() - this.lastSuccess > re && this.setStale(!0);
1022
1022
  }, 2e3);
1023
1023
  }
1024
1024
  /** Process incoming stats data from either SSE or polling. */
@@ -1028,12 +1028,12 @@ class mt {
1028
1028
  /** Poll the HTTP endpoint once. */
1029
1029
  async poll() {
1030
1030
  if (!this.unauthorized) {
1031
- this.client || (this.client = new v({ baseUrl: this.baseUrl, authToken: this.authToken }));
1031
+ this.client || (this.client = new E({ baseUrl: this.baseUrl, authToken: this.authToken }));
1032
1032
  try {
1033
1033
  const t = await this.client.get(this.endpoint);
1034
1034
  this.processStats(t);
1035
1035
  } catch (t) {
1036
- t instanceof b && (this.unauthorized = !0, this.onUnauthorizedChange?.(!0), this.onError?.(t), this.stopPolling());
1036
+ t instanceof S && (this.unauthorized = !0, this.onUnauthorizedChange?.(!0), this.onError?.(t), this.stopPolling());
1037
1037
  }
1038
1038
  }
1039
1039
  }
@@ -1058,7 +1058,7 @@ class mt {
1058
1058
  this.isStale !== t && (this.isStale = t, this.onStaleChange?.(t));
1059
1059
  }
1060
1060
  }
1061
- class Te {
1061
+ class Ce {
1062
1062
  constructor(t, r) {
1063
1063
  this.client = t, this.basePath = r;
1064
1064
  }
@@ -1070,7 +1070,7 @@ class Te {
1070
1070
  * @param init - Optional `RequestInit` overrides (e.g. `{ signal }`).
1071
1071
  */
1072
1072
  async fetchSection(t, r, n) {
1073
- const o = ve(t), s = r ? `${this.basePath}${o}?${r}` : `${this.basePath}${o}`;
1073
+ const o = Ee(t), s = r ? `${this.basePath}${o}?${r}` : `${this.basePath}${o}`;
1074
1074
  return this.client.fetch(s, n);
1075
1075
  }
1076
1076
  /**
@@ -1139,15 +1139,15 @@ class Te {
1139
1139
  return this.client.fetch(`${this.basePath}/emails/${t}/preview`);
1140
1140
  }
1141
1141
  }
1142
- function Ce(e) {
1142
+ function ke(e) {
1143
1143
  if (!e || typeof e != "object") return !1;
1144
1144
  const t = e;
1145
1145
  return t.data !== void 0 && t.meta !== void 0;
1146
1146
  }
1147
- function ke(e, t) {
1147
+ function Me(e, t) {
1148
1148
  return t.aborted ? !0 : e instanceof DOMException && e.name === "AbortError";
1149
1149
  }
1150
- class yt {
1150
+ class bt {
1151
1151
  // -- Dependencies ---------------------------------------------------------
1152
1152
  client;
1153
1153
  api;
@@ -1176,7 +1176,7 @@ class yt {
1176
1176
  /** AbortController for the current in-flight fetch. */
1177
1177
  abortController = null;
1178
1178
  constructor(t) {
1179
- this.client = new v({ baseUrl: t.baseUrl, authToken: t.authToken }), this.api = new Te(this.client, t.endpoint), this.endpoint = t.endpoint, this.section = t.section, this.perPage = t.perPage, this.callbacks = t.callbacks;
1179
+ this.client = new E({ baseUrl: t.baseUrl, authToken: t.authToken }), this.api = new Ce(this.client, t.endpoint), this.endpoint = t.endpoint, this.section = t.section, this.perPage = t.perPage, this.callbacks = t.callbacks;
1180
1180
  }
1181
1181
  // -- Public API -----------------------------------------------------------
1182
1182
  /**
@@ -1325,12 +1325,12 @@ class yt {
1325
1325
  }
1326
1326
  /** Check if an error should be silently ignored (abort or stale). */
1327
1327
  shouldIgnoreError(t, r, n) {
1328
- return ke(t, r) ? !0 : this.isStaleResponse(n);
1328
+ return Me(t, r) ? !0 : this.isStaleResponse(n);
1329
1329
  }
1330
1330
  /** Build query string from current controller state. */
1331
1331
  buildCurrentQueryString() {
1332
1332
  const t = this.sort ? this.sort.replace(/[A-Z]/g, (n) => "_" + n.toLowerCase()) : void 0, r = this.filters;
1333
- return he({
1333
+ return de({
1334
1334
  page: this.page,
1335
1335
  perPage: this.perPage,
1336
1336
  search: this.search,
@@ -1342,11 +1342,11 @@ class yt {
1342
1342
  }
1343
1343
  /** Apply a successful fetch result to the callbacks. */
1344
1344
  applyFetchResult(t) {
1345
- Ce(t) ? (this.callbacks.onData(t.data), this.callbacks.onPagination(t.meta)) : (this.callbacks.onData(t), this.callbacks.onPagination(null)), this.callbacks.onError(null), this.callbacks.onLoading(!1), this.hasFetched = !0;
1345
+ ke(t) ? (this.callbacks.onData(t.data), this.callbacks.onPagination(t.meta)) : (this.callbacks.onData(t), this.callbacks.onPagination(null)), this.callbacks.onError(null), this.callbacks.onLoading(!1), this.hasFetched = !0;
1346
1346
  }
1347
1347
  /** Handle a fetch error (unauthorized, network, etc.). */
1348
1348
  handleFetchError(t, r) {
1349
- if (t instanceof b) {
1349
+ if (t instanceof S) {
1350
1350
  this.callbacks.onError(t), this.callbacks.onLoading(!1), this.stopRefreshTimer(), this.callbacks.onUnauthorized();
1351
1351
  return;
1352
1352
  }
@@ -1355,14 +1355,14 @@ class yt {
1355
1355
  // -- Timer management (private) -------------------------------------------
1356
1356
  startRefreshTimer() {
1357
1357
  this.stopRefreshTimer();
1358
- const t = this.section === "overview" ? Q : J;
1358
+ const t = this.section === "overview" ? J : Y;
1359
1359
  this.timer = setInterval(() => this.fetch(!0), t);
1360
1360
  }
1361
1361
  stopRefreshTimer() {
1362
1362
  this.timer && (clearInterval(this.timer), this.timer = null);
1363
1363
  }
1364
1364
  }
1365
- const bt = {
1365
+ const St = {
1366
1366
  // ---------------------------------------------------------------------------
1367
1367
  // Debug-panel tabs / Dashboard sidebar sections (shared)
1368
1368
  // ---------------------------------------------------------------------------
@@ -1554,7 +1554,7 @@ const bt = {
1554
1554
  viewBox: "0 0 16 16",
1555
1555
  elements: ['<path d="M6 3H3v10h10v-3M9 1h6v6M7 9L15 1"/>']
1556
1556
  }
1557
- }, Me = "ss-col-resize", F = "ss-resizing";
1557
+ }, Pe = "ss-col-resize", U = "ss-resizing";
1558
1558
  function xt(e) {
1559
1559
  const t = Array.from(e.querySelectorAll("thead th"));
1560
1560
  if (t.length === 0) return () => {
@@ -1572,20 +1572,20 @@ function xt(e) {
1572
1572
  for (const s of t) {
1573
1573
  let i = function(c) {
1574
1574
  c.preventDefault(), c.stopPropagation(), o();
1575
- const l = c.clientX, p = s.offsetWidth;
1576
- a.classList.add(F), a.setPointerCapture(c.pointerId);
1577
- function h(f) {
1578
- const y = f.clientX - l, u = Math.max(30, p + y);
1579
- s.style.width = u + "px";
1575
+ const l = c.clientX, m = s.offsetWidth;
1576
+ a.classList.add(U), a.setPointerCapture(c.pointerId);
1577
+ function d(p) {
1578
+ const b = p.clientX - l, h = Math.max(30, m + b);
1579
+ s.style.width = h + "px";
1580
1580
  }
1581
- function d() {
1582
- a.classList.remove(F), a.removeEventListener("pointermove", h), a.removeEventListener("pointerup", d);
1581
+ function f() {
1582
+ a.classList.remove(U), a.removeEventListener("pointermove", d), a.removeEventListener("pointerup", f);
1583
1583
  }
1584
- a.addEventListener("pointermove", h), a.addEventListener("pointerup", d);
1584
+ a.addEventListener("pointermove", d), a.addEventListener("pointerup", f);
1585
1585
  };
1586
1586
  if (!s.textContent?.trim()) continue;
1587
1587
  const a = document.createElement("div");
1588
- a.className = Me, s.appendChild(a), a.addEventListener("pointerdown", i), r.push(() => {
1588
+ a.className = Pe, s.appendChild(a), a.addEventListener("pointerdown", i), r.push(() => {
1589
1589
  a.removeEventListener("pointerdown", i), a.remove();
1590
1590
  });
1591
1591
  }
@@ -1593,7 +1593,7 @@ function xt(e) {
1593
1593
  for (const s of r) s();
1594
1594
  };
1595
1595
  }
1596
- class St {
1596
+ class vt {
1597
1597
  client;
1598
1598
  endpoint;
1599
1599
  refreshInterval;
@@ -1603,10 +1603,10 @@ class St {
1603
1603
  fetchOnceCache = {};
1604
1604
  abortController = null;
1605
1605
  constructor(t) {
1606
- this.client = new v({
1606
+ this.client = new E({
1607
1607
  baseUrl: t.baseUrl,
1608
1608
  authToken: t.authToken
1609
- }), this.endpoint = t.endpoint ?? "/admin/api/debug", this.refreshInterval = t.refreshInterval ?? Y, this.callbacks = {
1609
+ }), this.endpoint = t.endpoint ?? "/admin/api/debug", this.refreshInterval = t.refreshInterval ?? X, this.callbacks = {
1610
1610
  onData: t.onData,
1611
1611
  onLoading: t.onLoading,
1612
1612
  onError: t.onError,
@@ -1660,7 +1660,7 @@ class St {
1660
1660
  const n = await this.client.fetch(t);
1661
1661
  this.callbacks.onData(n), this.callbacks.onError(null), r && (this.fetchOnceCache[t] = n);
1662
1662
  } catch (n) {
1663
- if (n instanceof b) {
1663
+ if (n instanceof S) {
1664
1664
  this.callbacks.onUnauthorized(n);
1665
1665
  return;
1666
1666
  }
@@ -1693,7 +1693,7 @@ class St {
1693
1693
  const r = new AbortController();
1694
1694
  this.abortController = r;
1695
1695
  try {
1696
- const n = `${this.endpoint}${Se(t)}`, o = await this.client.fetch(n, { signal: r.signal });
1696
+ const n = `${this.endpoint}${ve(t)}`, o = await this.client.fetch(n, { signal: r.signal });
1697
1697
  if (r.signal.aborted) return;
1698
1698
  this.callbacks.onData(o), this.callbacks.onError(null), this.callbacks.onLoading(!1);
1699
1699
  } catch (n) {
@@ -1707,7 +1707,7 @@ class St {
1707
1707
  /** Handle errors from fetchData. */
1708
1708
  handleFetchError(t, r) {
1709
1709
  if (!(t instanceof DOMException && t.name === "AbortError") && !r.signal.aborted) {
1710
- if (t instanceof b) {
1710
+ if (t instanceof S) {
1711
1711
  this.callbacks.onError(t), this.callbacks.onLoading(!1), this.stop(), this.callbacks.onUnauthorized(t);
1712
1712
  return;
1713
1713
  }
@@ -1716,20 +1716,20 @@ class St {
1716
1716
  }
1717
1717
  }
1718
1718
  const wt = ["all", "error", "warn", "info", "debug"];
1719
- function Pe(e) {
1719
+ function Ae(e) {
1720
1720
  return (e.levelName || e.level_name || (typeof e.level == "string" ? e.level : "") || "info").toLowerCase();
1721
1721
  }
1722
- function vt(e) {
1722
+ function Et(e) {
1723
1723
  return e.msg || e.message || JSON.stringify(e);
1724
1724
  }
1725
- function Et(e) {
1725
+ function Tt(e) {
1726
1726
  return e.createdAt || e.created_at || e.time || e.timestamp || 0;
1727
1727
  }
1728
- function Tt(e) {
1728
+ function Ct(e) {
1729
1729
  const t = e.data || {};
1730
1730
  return e.requestId || e.request_id || e["x-request-id"] || t.requestId || t.request_id || t["x-request-id"] || "";
1731
1731
  }
1732
- function Ct(e, t = "ss-dbg-log-level") {
1732
+ function kt(e, t = "ss-dbg-log-level") {
1733
1733
  switch (e) {
1734
1734
  case "error":
1735
1735
  case "fatal":
@@ -1746,20 +1746,20 @@ function Ct(e, t = "ss-dbg-log-level") {
1746
1746
  return `${t}-info`;
1747
1747
  }
1748
1748
  }
1749
- function kt(e, t) {
1749
+ function Mt(e, t) {
1750
1750
  return t === "all" ? e : e.filter((r) => {
1751
- const n = Pe(r);
1751
+ const n = Ae(r);
1752
1752
  return t === "error" ? n === "error" || n === "fatal" : n === t;
1753
1753
  });
1754
1754
  }
1755
- function Mt(e, t) {
1755
+ function Pt(e, t) {
1756
1756
  if (!t) return e;
1757
1757
  const r = t.toLowerCase();
1758
1758
  return e.filter(
1759
1759
  (n) => n.sql.toLowerCase().includes(r) || n.model && n.model.toLowerCase().includes(r) || n.method.toLowerCase().includes(r)
1760
1760
  );
1761
1761
  }
1762
- function Pt(e) {
1762
+ function At(e) {
1763
1763
  const t = {};
1764
1764
  for (const r of e)
1765
1765
  t[r.sql] = (t[r.sql] || 0) + 1;
@@ -1769,7 +1769,7 @@ function $t(e, t) {
1769
1769
  const r = e.filter((s) => s.duration > 100).length, n = Object.values(t).filter((s) => s > 1).length, o = e.length > 0 ? e.reduce((s, i) => s + i.duration, 0) / e.length : 0;
1770
1770
  return { slowCount: r, dupCount: n, avgDuration: o, totalCount: e.length };
1771
1771
  }
1772
- const At = [
1772
+ const Rt = [
1773
1773
  "all",
1774
1774
  "active",
1775
1775
  "waiting",
@@ -1777,7 +1777,7 @@ const At = [
1777
1777
  "completed",
1778
1778
  "failed"
1779
1779
  ];
1780
- function Rt(e, t = "ss-dbg-job-status") {
1780
+ function Lt(e, t = "ss-dbg-job-status") {
1781
1781
  switch (e) {
1782
1782
  case "completed":
1783
1783
  case "failed":
@@ -1789,7 +1789,7 @@ function Rt(e, t = "ss-dbg-job-status") {
1789
1789
  return "ss-dbg-badge-muted";
1790
1790
  }
1791
1791
  }
1792
- function Lt(e) {
1792
+ function Ft(e) {
1793
1793
  switch (e) {
1794
1794
  case "active":
1795
1795
  return "blue";
@@ -1805,13 +1805,13 @@ function Lt(e) {
1805
1805
  return "muted";
1806
1806
  }
1807
1807
  }
1808
- function Ft(e) {
1808
+ function Ut(e) {
1809
1809
  if (!e) return [];
1810
1810
  if (Array.isArray(e)) return e;
1811
1811
  const t = e;
1812
1812
  return t.jobs || t.data || [];
1813
1813
  }
1814
- function Ut(e) {
1814
+ function Dt(e) {
1815
1815
  if (!e || Array.isArray(e)) return null;
1816
1816
  const t = e;
1817
1817
  return t.stats || t.overview || null;
@@ -1826,7 +1826,7 @@ function $e(e) {
1826
1826
  }
1827
1827
  return Array.isArray(e) ? e : [];
1828
1828
  }
1829
- function Ae(e) {
1829
+ function Re(e) {
1830
1830
  if (!e) return [];
1831
1831
  if (typeof e == "string")
1832
1832
  try {
@@ -1836,28 +1836,28 @@ function Ae(e) {
1836
1836
  }
1837
1837
  return Array.isArray(e) ? e : [];
1838
1838
  }
1839
- function C(e, t, r, n = 0) {
1839
+ function k(e, t, r, n = 0) {
1840
1840
  return e[t] ?? e[r] ?? n;
1841
1841
  }
1842
- function Dt(e) {
1842
+ function _t(e) {
1843
1843
  return {
1844
1844
  method: e.method || "",
1845
1845
  url: e.url || "",
1846
- statusCode: C(e, "status_code", "statusCode"),
1847
- totalDuration: C(e, "total_duration", "totalDuration") || e.duration || 0,
1848
- spanCount: C(e, "span_count", "spanCount"),
1846
+ statusCode: k(e, "status_code", "statusCode"),
1847
+ totalDuration: k(e, "total_duration", "totalDuration") || e.duration || 0,
1848
+ spanCount: k(e, "span_count", "spanCount"),
1849
1849
  spans: $e(e.spans),
1850
- warnings: Ae(e.warnings),
1850
+ warnings: Re(e.warnings),
1851
1851
  logs: e.logs || [],
1852
1852
  httpRequestId: e.httpRequestId || e.http_request_id || void 0
1853
1853
  };
1854
1854
  }
1855
- const Re = ["password", "secret", "token", "key", "credential", "auth"];
1856
- function Le(e) {
1855
+ const Le = ["password", "secret", "token", "key", "credential", "auth"];
1856
+ function Fe(e) {
1857
1857
  const t = e.toLowerCase();
1858
- return Re.some((r) => t.includes(r));
1858
+ return Le.some((r) => t.includes(r));
1859
1859
  }
1860
- function Fe(e) {
1860
+ function Ue(e) {
1861
1861
  if (e == null) return "-";
1862
1862
  if (typeof e == "string" || typeof e == "number" || typeof e == "boolean")
1863
1863
  return String(e);
@@ -1868,7 +1868,7 @@ function Fe(e) {
1868
1868
  return String(e);
1869
1869
  }
1870
1870
  }
1871
- const Ue = {
1871
+ const De = {
1872
1872
  collectionInterval: "Stats Collection",
1873
1873
  dashboardBroadcast: "Dashboard Broadcast",
1874
1874
  debugBroadcast: "Debug Broadcast",
@@ -1876,9 +1876,9 @@ const Ue = {
1876
1876
  retentionCleanup: "Retention Cleanup"
1877
1877
  };
1878
1878
  function Ot(e) {
1879
- return Ue[e] || e;
1879
+ return De[e] || e;
1880
1880
  }
1881
- const De = {
1881
+ const _e = {
1882
1882
  prometheus: "Prometheus",
1883
1883
  pinoHook: "Pino Log Hook",
1884
1884
  edgePlugin: "Edge Plugin",
@@ -1886,26 +1886,26 @@ const De = {
1886
1886
  queueInspector: "Queue Inspector"
1887
1887
  };
1888
1888
  function It(e) {
1889
- return De[e] || e;
1889
+ return _e[e] || e;
1890
1890
  }
1891
- function _t(e) {
1891
+ function Bt(e) {
1892
1892
  return "active" in e ? e.active ? "active" : "inactive" : "available" in e ? e.available ? "available" : "unavailable" : "unknown";
1893
1893
  }
1894
- function Bt(e, t) {
1894
+ function Ht(e, t) {
1895
1895
  return t.mode ? `Mode: ${t.mode}` : e === "edgePlugin" && t.active ? "@serverStats() tag registered" : e === "cacheInspector" ? t.available ? "Redis dependency detected" : "Redis not installed" : e === "queueInspector" ? t.available ? "Queue dependency detected" : "@rlanz/bull-queue not installed" : "-";
1896
1896
  }
1897
- function Ht(e) {
1897
+ function Nt(e) {
1898
1898
  return Object.entries(e).map(([t, r]) => ({
1899
1899
  key: t,
1900
- value: Fe(r),
1901
- secret: Le(t)
1900
+ value: Ue(r),
1901
+ secret: Fe(t)
1902
1902
  }));
1903
1903
  }
1904
- function Nt(e, t) {
1904
+ function qt(e, t) {
1905
1905
  return t ? Math.min(100, Math.round(e / t * 100)) : 0;
1906
1906
  }
1907
1907
  const Oe = ["healthy", "active", "connected", "available", "ready"], Ie = ["errored", "unavailable"];
1908
- function qt(e) {
1908
+ function zt(e) {
1909
1909
  return Oe.includes(e) ? "ok" : Ie.includes(e) ? "err" : "";
1910
1910
  }
1911
1911
  function $(e) {
@@ -1914,13 +1914,13 @@ function $(e) {
1914
1914
  function w(e) {
1915
1915
  return e != null && typeof e == "object" && !Array.isArray(e) && !$(e);
1916
1916
  }
1917
- function _e(e, t = "") {
1917
+ function Be(e, t = "") {
1918
1918
  if (!w(e))
1919
1919
  return [{ path: t, value: e }];
1920
1920
  const r = [];
1921
1921
  for (const n of Object.keys(e)) {
1922
1922
  const o = t ? `${t}.${n}` : n, s = e[n];
1923
- w(s) ? r.push(..._e(s, o)) : r.push({ path: o, value: s });
1923
+ w(s) ? r.push(...Be(s, o)) : r.push({ path: o, value: s });
1924
1924
  }
1925
1925
  return r;
1926
1926
  }
@@ -1930,22 +1930,22 @@ function Kt(e) {
1930
1930
  color: e ? "var(--ss-green-fg)" : "var(--ss-red-fg)"
1931
1931
  } : typeof e == "number" ? { text: String(e), color: "var(--ss-amber-fg)" } : Array.isArray(e) ? { text: `[${e.map((r) => r == null ? "null" : typeof r == "object" ? JSON.stringify(r) : String(r)).join(", ")}]`, color: "var(--ss-purple-fg)" } : typeof e == "object" ? { text: JSON.stringify(e), color: "var(--ss-dim)" } : { text: String(e) };
1932
1932
  }
1933
- function Be(e) {
1933
+ function He(e) {
1934
1934
  if (e == null || typeof e != "object" || Array.isArray(e) || $(e))
1935
1935
  return 1;
1936
1936
  let t = 0;
1937
1937
  for (const r of Object.keys(e))
1938
- t += Be(e[r]);
1938
+ t += He(e[r]);
1939
1939
  return t;
1940
1940
  }
1941
- function zt(e) {
1941
+ function jt(e) {
1942
1942
  if (!w(e)) return [];
1943
1943
  const t = [];
1944
1944
  for (const r of Object.keys(e))
1945
1945
  w(e[r]) && t.push(r);
1946
1946
  return t;
1947
1947
  }
1948
- function jt(e, t, r) {
1948
+ function Wt(e, t, r) {
1949
1949
  return !r || e.toLowerCase().includes(r) ? !0 : ($(t) ? t.display : t == null ? "" : String(t)).toLowerCase().includes(r);
1950
1950
  }
1951
1951
  function Vt(e, t, r) {
@@ -1957,7 +1957,7 @@ function Vt(e, t, r) {
1957
1957
  }).catch(() => {
1958
1958
  });
1959
1959
  }
1960
- const He = /* @__PURE__ */ new Set([
1960
+ const Ne = /* @__PURE__ */ new Set([
1961
1961
  "secret",
1962
1962
  "key",
1963
1963
  "token",
@@ -1971,7 +1971,7 @@ const He = /* @__PURE__ */ new Set([
1971
1971
  "private",
1972
1972
  "encryption"
1973
1973
  ]);
1974
- function Ne(e) {
1974
+ function qe(e) {
1975
1975
  const t = e.split(/[._-]/), r = [];
1976
1976
  for (const n of t) {
1977
1977
  const o = n.split(new RegExp("(?<=[a-z])(?=[A-Z])"));
@@ -1980,120 +1980,184 @@ function Ne(e) {
1980
1980
  }
1981
1981
  return r;
1982
1982
  }
1983
- function Wt(e) {
1984
- return Ne(e).some((r) => He.has(r.toLowerCase()));
1983
+ function Gt(e) {
1984
+ return qe(e).some((r) => Ne.has(r.toLowerCase()));
1985
+ }
1986
+ const Qt = new RegExp("secret|password|pass(?:word)?|pwd|token|(?:^|[._-])key(?:[._-]|$)|(?<=[a-z])Key|apikey|api_key|auth|credential|private|encryption", "i");
1987
+ function u(e, ...t) {
1988
+ for (const r of t) {
1989
+ const n = e[r];
1990
+ if (n != null) return n;
1991
+ }
1992
+ }
1993
+ function Jt(e) {
1994
+ return u(e, "createdAt", "created_at", "timestamp");
1995
+ }
1996
+ function Yt(e) {
1997
+ return u(e, "timestamp", "createdAt", "processedAt", "created_at");
1998
+ }
1999
+ function Xt(e) {
2000
+ return u(e, "statusCode", "status_code");
2001
+ }
2002
+ function Zt(e) {
2003
+ return u(e, "total_duration", "totalDuration", "duration") ?? 0;
2004
+ }
2005
+ function er(e) {
2006
+ return u(e, "span_count", "spanCount") ?? 0;
2007
+ }
2008
+ function tr(e) {
2009
+ return u(e, "warning_count", "warningCount") ?? 0;
2010
+ }
2011
+ function rr(e) {
2012
+ return u(e, "from_addr", "from") ?? "";
2013
+ }
2014
+ function nr(e) {
2015
+ return u(e, "to_addr", "to") ?? "";
2016
+ }
2017
+ function sr(e) {
2018
+ return u(e, "cc", "cc_addr") ?? "";
2019
+ }
2020
+ function or(e) {
2021
+ return u(e, "attachment_count", "attachmentCount") ?? 0;
2022
+ }
2023
+ function ir(e) {
2024
+ return u(e, "event_name", "eventName", "event") ?? "";
2025
+ }
2026
+ function ar(e) {
2027
+ return u(e, "method", "sql_method") ?? "";
2028
+ }
2029
+ function cr(e) {
2030
+ return u(e, "sqlNormalized", "normalizedSql", "sql_normalized", "sql") ?? "";
2031
+ }
2032
+ function lr(e, t, r) {
2033
+ const n = e[t];
2034
+ return n != null && n !== 0 ? Number(n) : Number(e[r]) || 0;
1985
2035
  }
1986
- const Gt = new RegExp("secret|password|pass(?:word)?|pwd|token|(?:^|[._-])key(?:[._-]|$)|(?<=[a-z])Key|apikey|api_key|auth|credential|private|encryption", "i");
1987
2036
  export {
1988
- v as ApiClient,
1989
- B as ApiError,
2037
+ E as ApiClient,
2038
+ H as ApiError,
1990
2039
  we as DASHBOARD_SECTION_PATHS,
1991
- Y as DEBUG_REFRESH_MS,
2040
+ X as DEBUG_REFRESH_MS,
1992
2041
  xe as DEBUG_TAB_PATHS,
1993
2042
  ge as DEFAULT_FEATURES,
1994
2043
  O as DEFAULT_PER_PAGE,
1995
- Te as DashboardApi,
1996
- yt as DashboardDataController,
1997
- St as DebugDataController,
2044
+ Ce as DashboardApi,
2045
+ bt as DashboardDataController,
2046
+ vt as DebugDataController,
1998
2047
  Ie as ERROR_STATUSES,
1999
- De as INTEGRATION_LABELS,
2000
- At as JOB_STATUS_FILTERS,
2048
+ _e as INTEGRATION_LABELS,
2049
+ Rt as JOB_STATUS_FILTERS,
2001
2050
  wt as LOG_LEVELS,
2002
- ee as MAX_HISTORY,
2003
- P as METRIC_DEFINITIONS,
2051
+ te as MAX_HISTORY,
2052
+ A as METRIC_DEFINITIONS,
2004
2053
  Oe as OK_STATUSES,
2005
- Q as OVERVIEW_REFRESH_MS,
2006
- Gt as REDACT_PATTERN,
2007
- J as SECTION_REFRESH_MS,
2008
- X as SLOW_DURATION_MS,
2009
- te as STALE_MS,
2010
- mt as ServerStatsController,
2011
- bt as TAB_ICONS,
2012
- ce as THRESHOLD_CSS_CLASS,
2013
- Xe as THRESHOLD_CSS_VAR,
2014
- Ye as THRESHOLD_HEX_FALLBACK,
2015
- Ue as TIMER_LABELS,
2016
- b as UnauthorizedError,
2017
- Z as VERY_SLOW_DURATION_MS,
2018
- he as buildQueryParams,
2019
- st as buildQueryString,
2054
+ J as OVERVIEW_REFRESH_MS,
2055
+ Qt as REDACT_PATTERN,
2056
+ Y as SECTION_REFRESH_MS,
2057
+ Z as SLOW_DURATION_MS,
2058
+ re as STALE_MS,
2059
+ yt as ServerStatsController,
2060
+ St as TAB_ICONS,
2061
+ le as THRESHOLD_CSS_CLASS,
2062
+ Ze as THRESHOLD_CSS_VAR,
2063
+ Xe as THRESHOLD_HEX_FALLBACK,
2064
+ De as TIMER_LABELS,
2065
+ S as UnauthorizedError,
2066
+ ee as VERY_SLOW_DURATION_MS,
2067
+ de as buildQueryParams,
2068
+ ot as buildQueryString,
2020
2069
  Ve as buildSparklineData,
2021
- qt as classifyStatus,
2022
- zt as collectTopLevelObjectKeys,
2023
- L as compactPreview,
2024
- lt as computePagination,
2070
+ zt as classifyStatus,
2071
+ jt as collectTopLevelObjectKeys,
2072
+ F as compactPreview,
2073
+ ut as computePagination,
2025
2074
  $t as computeQuerySummary,
2026
- G as computeStats,
2075
+ Q as computeStats,
2027
2076
  Vt as copyWithFeedback,
2028
- Pt as countDuplicateQueries,
2029
- Be as countLeaves,
2030
- at as createFilterState,
2031
- Ee as createHistoryBuffer,
2032
- it as createPaginationState,
2033
- ct as createSortState,
2034
- q as createTransmitSubscription,
2035
- ht as detectFeatures,
2036
- ft as detectMetricGroupsFromStats,
2037
- et as durationClassName,
2038
- le as durationSeverity,
2039
- Ut as extractJobStats,
2040
- Ft as extractJobs,
2041
- ye as fetchFeatures,
2042
- Nt as fillPercent,
2043
- kt as filterLogsByLevel,
2044
- Mt as filterQueries,
2045
- _e as flattenConfig,
2046
- M as formatBytes,
2047
- nt as formatCacheSize,
2048
- Ht as formatCollectorConfig,
2049
- Fe as formatConfigVal,
2050
- ie as formatCount,
2051
- We as formatDuration,
2077
+ At as countDuplicateQueries,
2078
+ He as countLeaves,
2079
+ ct as createFilterState,
2080
+ Te as createHistoryBuffer,
2081
+ at as createPaginationState,
2082
+ lt as createSortState,
2083
+ z as createTransmitSubscription,
2084
+ dt as detectFeatures,
2085
+ pt as detectMetricGroupsFromStats,
2086
+ tt as durationClassName,
2087
+ ue as durationSeverity,
2088
+ Dt as extractJobStats,
2089
+ Ut as extractJobs,
2090
+ be as fetchFeatures,
2091
+ qt as fillPercent,
2092
+ Mt as filterLogsByLevel,
2093
+ Pt as filterQueries,
2094
+ Be as flattenConfig,
2095
+ P as formatBytes,
2096
+ st as formatCacheSize,
2097
+ Nt as formatCollectorConfig,
2098
+ Ue as formatConfigVal,
2099
+ ae as formatCount,
2100
+ Ge as formatDuration,
2052
2101
  Kt as formatFlatValue,
2053
- A as formatMb,
2054
- Je as formatStatNum,
2055
- Ge as formatTime,
2056
- rt as formatTtl,
2057
- oe as formatUptime,
2058
- W as generateGradientId,
2059
- je as generateSparklinePath,
2060
- ze as generateSparklinePoints,
2061
- ve as getDashboardSectionPath,
2062
- Se as getDebugTabPath,
2063
- Bt as getIntegrationDetails,
2102
+ R as formatMb,
2103
+ Ye as formatStatNum,
2104
+ Qe as formatTime,
2105
+ nt as formatTtl,
2106
+ ie as formatUptime,
2107
+ G as generateGradientId,
2108
+ We as generateSparklinePath,
2109
+ je as generateSparklinePoints,
2110
+ Ee as getDashboardSectionPath,
2111
+ ve as getDebugTabPath,
2112
+ Ht as getIntegrationDetails,
2064
2113
  It as getIntegrationLabel,
2065
- _t as getIntegrationStatus,
2066
- Lt as getJobStatusBadgeColor,
2067
- Rt as getJobStatusCssClass,
2068
- Ct as getLogLevelCssClass,
2069
- pt as getMetricById,
2114
+ Bt as getIntegrationStatus,
2115
+ Ft as getJobStatusBadgeColor,
2116
+ Lt as getJobStatusCssClass,
2117
+ kt as getLogLevelCssClass,
2118
+ mt as getMetricById,
2070
2119
  gt as getMetricsByGroup,
2071
- ut as getPageNumbers,
2072
- R as getRatioColor,
2073
- U as getTheme,
2120
+ ht as getPageNumbers,
2121
+ L as getRatioColor,
2122
+ D as getTheme,
2074
2123
  x as getThresholdColor,
2075
- ae as getThresholdColorInverse,
2124
+ ce as getThresholdColorInverse,
2076
2125
  Ot as getTimerLabel,
2077
- dt as getVisibleMetricGroups,
2126
+ ft as getVisibleMetricGroups,
2078
2127
  xt as initResizableColumns,
2079
2128
  $ as isRedactedValue,
2080
- Le as isSecretKey,
2081
- jt as matchesConfigSearch,
2082
- Dt as normalizeTraceFields,
2129
+ Fe as isSecretKey,
2130
+ Wt as matchesConfigSearch,
2131
+ _t as normalizeTraceFields,
2083
2132
  Ke as onThemeChange,
2084
- ot as parsePaginatedResponse,
2133
+ it as parsePaginatedResponse,
2085
2134
  $e as parseTraceSpans,
2086
- Ae as parseTraceWarnings,
2087
- Pe as resolveLogLevel,
2088
- vt as resolveLogMessage,
2089
- Tt as resolveLogRequestId,
2090
- Et as resolveLogTimestamp,
2091
- C as resolveTraceField,
2092
- z as setTheme,
2093
- tt as shortReqId,
2094
- Wt as shouldRedact,
2095
- Ze as statusColor,
2135
+ Re as parseTraceWarnings,
2136
+ or as resolveAttachmentCount,
2137
+ sr as resolveCcAddr,
2138
+ Zt as resolveDuration,
2139
+ ir as resolveEventName,
2140
+ u as resolveField,
2141
+ rr as resolveFromAddr,
2142
+ Yt as resolveJobTimestamp,
2143
+ Ae as resolveLogLevel,
2144
+ Et as resolveLogMessage,
2145
+ Ct as resolveLogRequestId,
2146
+ Tt as resolveLogTimestamp,
2147
+ lr as resolveMetric,
2148
+ cr as resolveNormalizedSql,
2149
+ er as resolveSpanCount,
2150
+ ar as resolveSqlMethod,
2151
+ Xt as resolveStatusCode,
2152
+ Jt as resolveTimestamp,
2153
+ nr as resolveToAddr,
2154
+ k as resolveTraceField,
2155
+ tr as resolveWarningCount,
2156
+ j as setTheme,
2157
+ rt as shortReqId,
2158
+ Gt as shouldRedact,
2159
+ et as statusColor,
2096
2160
  K as subscribeToChannel,
2097
- Qe as timeAgo,
2098
- qe as toggleTheme
2161
+ Je as timeAgo,
2162
+ ze as toggleTheme
2099
2163
  };