adonisjs-server-stats 1.17.0 → 1.18.0

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 (66) hide show
  1. package/README.md +11 -6
  2. package/dist/core/core/define-config-helpers.d.ts +1 -0
  3. package/dist/core/core/types-diagnostics.d.ts +2 -0
  4. package/dist/core/debug/types.d.ts +2 -0
  5. package/dist/core/types.d.ts +31 -3
  6. package/dist/react/{CacheSection-C-X2Tnca.js → CacheSection-B-lSIN8Q.js} +1 -1
  7. package/dist/react/{CacheTab-D55mfmeE.js → CacheTab-BN0QgPXz.js} +1 -1
  8. package/dist/react/{ConfigSection-C-HGnZfd.js → ConfigSection-u_TSfb9f.js} +1 -1
  9. package/dist/react/{ConfigTab-CNnsOXBh.js → ConfigTab-au26s-ON.js} +1 -1
  10. package/dist/react/{CustomPaneTab-D-267UVd.js → CustomPaneTab-qvMnh8ss.js} +1 -1
  11. package/dist/react/{EmailsSection-Bqw4DI4r.js → EmailsSection-HfEMeRex.js} +1 -1
  12. package/dist/react/{EmailsTab-CkHOhj2F.js → EmailsTab-BWwq-CxB.js} +1 -1
  13. package/dist/react/{EventsSection-CMeyjzVC.js → EventsSection-CA9b15dJ.js} +1 -1
  14. package/dist/react/{EventsTab-DgS2v1HX.js → EventsTab-CgSdHbKU.js} +1 -1
  15. package/dist/react/{InternalsContent-C9lIA92C.js → InternalsContent-CI7HvBtH.js} +51 -47
  16. package/dist/react/{InternalsSection-lOv_UcSV.js → InternalsSection-IEeWXJqP.js} +1 -1
  17. package/dist/react/{InternalsTab-BygoSorC.js → InternalsTab-CoVLHQbF.js} +1 -1
  18. package/dist/react/{JobsSection-oWH6pbrG.js → JobsSection-DgsS_VwU.js} +1 -1
  19. package/dist/react/{JobsTab-zdxX_as-.js → JobsTab-CzwLSRUC.js} +1 -1
  20. package/dist/react/{LogEntryRow-Cn8Ee_X0.js → LogEntryRow-VCCzwD1H.js} +1 -1
  21. package/dist/react/{LogsSection-XmiI2MMs.js → LogsSection-BujNn_cO.js} +2 -2
  22. package/dist/react/{LogsTab-ixusY4v7.js → LogsTab-BtD1h7DM.js} +2 -2
  23. package/dist/react/{OverviewSection-CvhObTLP.js → OverviewSection-B28em0gQ.js} +1 -1
  24. package/dist/react/{QueriesSection-BvledwBI.js → QueriesSection-B0tFn_Dc.js} +1 -1
  25. package/dist/react/{QueriesTab-smQQJvJa.js → QueriesTab-DJY7aavR.js} +1 -1
  26. package/dist/react/{RequestsSection-DKuYpViv.js → RequestsSection-DPmYM7tq.js} +2 -2
  27. package/dist/react/{RoutesSection-5RNVurQ6.js → RoutesSection-Ck-RcFVS.js} +1 -1
  28. package/dist/react/{RoutesTab-CpXNO-Rx.js → RoutesTab-Ch3PDLzo.js} +1 -1
  29. package/dist/react/{SplitPaneWrapper-DQvJnsuk.js → SplitPaneWrapper-BZ6VrBr-.js} +1 -1
  30. package/dist/react/{TimelineTab-LHQHHKkO.js → TimelineTab-_byxh2mJ.js} +2 -2
  31. package/dist/react/{index-LlFvooUN.js → index-De7nsWBN.js} +2 -2
  32. package/dist/react/index.js +1 -1
  33. package/dist/src/dashboard/dashboard_store.js +4 -12
  34. package/dist/src/dashboard/knex_factory.js +8 -0
  35. package/dist/src/dashboard/migrator.d.ts +7 -2
  36. package/dist/src/dashboard/migrator.js +140 -6
  37. package/dist/src/dashboard/migrator_tables.js +4 -0
  38. package/dist/src/dashboard/storage_stats.d.ts +5 -0
  39. package/dist/src/dashboard/storage_stats.js +15 -1
  40. package/dist/src/debug/types.d.ts +2 -0
  41. package/dist/src/define_config.js +2 -0
  42. package/dist/src/edge/client/dashboard.js +2 -2
  43. package/dist/src/edge/client/debug-panel-deferred.js +1 -1
  44. package/dist/src/edge/client-vue/dashboard.js +3 -3
  45. package/dist/src/edge/client-vue/debug-panel-deferred.js +2 -2
  46. package/dist/src/provider/dashboard_setup.js +14 -0
  47. package/dist/src/provider/diagnostics.d.ts +2 -0
  48. package/dist/src/provider/diagnostics.js +1 -0
  49. package/dist/src/provider/server_stats_provider.d.ts +1 -0
  50. package/dist/src/stubs/config.stub +4 -0
  51. package/dist/src/types.d.ts +31 -3
  52. package/dist/vue/{CacheSection-Bm0goqX6.js → CacheSection-z2TQRez9.js} +1 -1
  53. package/dist/vue/{ConfigSection-BrYslIMN.js → ConfigSection-CFEaig69.js} +1 -1
  54. package/dist/vue/{EmailsSection-B8N5vaWA.js → EmailsSection-CYohBo62.js} +1 -1
  55. package/dist/vue/{EventsSection-D2Y_xt0m.js → EventsSection-B_TuVrGj.js} +1 -1
  56. package/dist/vue/{InternalsSection-jhTCuK3j.js → InternalsSection-B1P2kNT-.js} +92 -84
  57. package/dist/vue/{InternalsTab-Z3c82glB.js → InternalsTab-CRI-IFTo.js} +155 -147
  58. package/dist/vue/{JobsSection-cEKqELLC.js → JobsSection-AjkEzyiv.js} +1 -1
  59. package/dist/vue/{LogsSection-C3H2c0S3.js → LogsSection-DZD0CCDi.js} +1 -1
  60. package/dist/vue/{OverviewSection-I2swuHDa.js → OverviewSection-BEc4Gktf.js} +1 -1
  61. package/dist/vue/{QueriesSection-CF1IE3SN.js → QueriesSection-BMImGXTn.js} +1 -1
  62. package/dist/vue/{RequestsSection-CuwgXzmU.js → RequestsSection-DOI2MUFX.js} +1 -1
  63. package/dist/vue/{RoutesSection-BhJCF7Rn.js → RoutesSection-C1sxt-AW.js} +1 -1
  64. package/dist/vue/{index-DUsImuIN.js → index-BfPAAjL5.js} +2 -2
  65. package/dist/vue/index.js +1 -1
  66. package/package.json +1 -1
package/README.md CHANGED
@@ -203,10 +203,11 @@ All fields are optional. `defineConfig({})` works with zero configuration.
203
203
 
204
204
  ### `DashboardConfig`
205
205
 
206
- | Option | Type | Default | Description |
207
- | --------------- | -------- | ------------ | -------------------------------------- |
208
- | `path` | `string` | `'/__stats'` | URL path for the dashboard page |
209
- | `retentionDays` | `number` | `7` | Days to keep historical data in SQLite |
206
+ | Option | Type | Default | Description |
207
+ | --------------- | -------- | ------------ | --------------------------------------------------------------------------------- |
208
+ | `path` | `string` | `'/__stats'` | URL path for the dashboard page |
209
+ | `retentionDays` | `number` | `7` | Days to keep historical data in SQLite |
210
+ | `maxDbSizeMb` | `number` | `500` | Size cap for the SQLite database -- oldest rows are pruned when exceeded; `0` disables |
210
211
 
211
212
  ### `ProductionConfig`
212
213
 
@@ -215,6 +216,7 @@ All fields are optional. `defineConfig({})` works with zero configuration.
215
216
  | `enabled` | `boolean` | `false` | Register routes and build the dashboard when `NODE_ENV=production` |
216
217
  | `capture` | `CaptureConfig` | all off | Which capture subsystems to switch on -- opt in one at a time |
217
218
  | `retentionDays` | `number` | `3` | SQLite history to keep in production (the usual default is 7) |
219
+ | `maxDbSizeMb` | `number` | `500` | Size cap for the SQLite database in production; `0` disables |
218
220
 
219
221
  `CaptureConfig` fields, each `boolean` and each defaulting to `false` in production: `queries`, `events`, `emails`, `traces`, `logs`.
220
222
 
@@ -264,6 +266,7 @@ The following field names still work but will show deprecation warnings at boot.
264
266
  | `dashboard` | `boolean` | `false` | Enable the full-page dashboard (requires `better-sqlite3`) |
265
267
  | `dashboardPath` | `string` | `'/__stats'` | URL path for the dashboard page |
266
268
  | `retentionDays` | `number` | `7` | Days to keep historical data in SQLite |
269
+ | `maxDbSizeMb` | `number` | `500` | Size cap for the SQLite database's live data. When exceeded, the cleanup deletes the oldest records regardless of age. `0` disables the cap. |
267
270
  | `dbPath` | `string` | `'.adonisjs/server-stats/dashboard.sqlite3'` | Path to the SQLite database file (relative to app root) |
268
271
  | `debugEndpoint` | `string` | `'/admin/api/debug'` | Base path for the debug toolbar API endpoints |
269
272
  | `excludeFromTracing` | `string[]` | `['/admin/api/debug', '/admin/api/server-stats']` | URL prefixes to exclude from tracing and dashboard persistence. Requests still count toward HTTP metrics but won't appear in the timeline or be stored. The stats endpoint is always excluded automatically. |
@@ -461,9 +464,11 @@ A disabled subsystem is never subscribed, so it costs nothing -- its dashboard p
461
464
 
462
465
  ### Disk
463
466
 
464
- Retention prunes rows older than `retentionDays` on boot and hourly. It does **not** run `VACUUM`, so the `.sqlite3` file reuses freed pages rather than shrinking -- expect the file to plateau, not shrink. Watch real numbers in the dashboard's storage panel (`GET {dashboardPath}/api/storage`), which reports file size, WAL size, and per-table row counts.
467
+ Retention prunes rows older than `retentionDays` on boot and hourly, and returns freed pages to the OS incrementally, so the `.sqlite3` file genuinely shrinks after cleanup. Watch real numbers in the dashboard's storage panel (`GET {dashboardPath}/api/storage`), which reports file size, WAL size, and per-table row counts.
465
468
 
466
- There is no sampling and no hard size cap. On a high-traffic app, enable capture deliberately and keep `retentionDays` short.
469
+ `maxDbSizeMb` (default 500) additionally caps the database's live data size. When write volume outruns what `retentionDays` alone would keep small -- tracing plus persistence on a busy app can write hundreds of MB per day -- the cleanup deletes the globally oldest records, regardless of age, until usage drops below the cap. In other words, the retention window shortens dynamically instead of the file growing without bound. Set `maxDbSizeMb: 0` to disable the cap.
470
+
471
+ There is no sampling. On a high-traffic app, enable capture deliberately and keep `retentionDays` short.
467
472
 
468
473
  ### Async guards and the toolbar
469
474
 
@@ -14,6 +14,7 @@ export declare function applyToolbarSetting(toolbar: boolean | ToolbarConfig, re
14
14
  export declare function applyDashboardSetting(dashboard: boolean | {
15
15
  path?: string;
16
16
  retentionDays?: number;
17
+ maxDbSizeMb?: number;
17
18
  }, result: DevToolbarOptions): void;
18
19
  /**
19
20
  * Apply advanced config fields onto the result DevToolbarOptions.
@@ -51,6 +51,7 @@ export interface DiagnosticsResponse {
51
51
  dashboardPath: string;
52
52
  debugEndpoint: string;
53
53
  retentionDays: number;
54
+ maxDbSizeMb: number;
54
55
  dbPath: string;
55
56
  persistDebugData: boolean | string;
56
57
  renderer: string;
@@ -77,6 +78,7 @@ export interface DiagnosticsResponse {
77
78
  fileSizeMb: number;
78
79
  walSizeMb: number;
79
80
  retentionDays: number;
81
+ maxDbSizeMb: number;
80
82
  tables: Array<{
81
83
  name: string;
82
84
  rowCount: number;
@@ -284,6 +284,8 @@ export interface DevToolbarConfig {
284
284
  dashboardPath: string;
285
285
  /** Data retention period in days for historical persistence. */
286
286
  retentionDays: number;
287
+ /** Size cap in MB for the SQLite database's live data; `0` disables it. */
288
+ maxDbSizeMb: number;
287
289
  /** Path to the SQLite database file for historical persistence. */
288
290
  dbPath: string;
289
291
  /** Base path for the debug toolbar API endpoints. */
@@ -263,6 +263,15 @@ export interface DevToolbarOptions {
263
263
  * @default 7
264
264
  */
265
265
  retentionDays?: number;
266
+ /**
267
+ * Size cap in MB for the SQLite database's live data. When exceeded,
268
+ * the hourly cleanup deletes the oldest records — regardless of age —
269
+ * until usage drops below the cap, effectively shortening the retention
270
+ * window when write volume outruns `retentionDays`. Set to `0` to
271
+ * disable the cap.
272
+ * @default 500
273
+ */
274
+ maxDbSizeMb?: number;
266
275
  /**
267
276
  * Path to the SQLite database file for historical persistence.
268
277
  * Relative to app root.
@@ -434,6 +443,17 @@ export interface DashboardConfig {
434
443
  * @default 7
435
444
  */
436
445
  retentionDays?: number;
446
+ /**
447
+ * Size cap in MB for the SQLite database's live data.
448
+ *
449
+ * When exceeded, the cleanup deletes the oldest records — regardless
450
+ * of age — until usage drops below the cap. This bounds disk usage
451
+ * when write volume (tracing, verbose query logging) outruns what
452
+ * `retentionDays` alone would keep small. Set to `0` to disable.
453
+ *
454
+ * @default 500
455
+ */
456
+ maxDbSizeMb?: number;
437
457
  }
438
458
  /**
439
459
  * Access-control callback signature.
@@ -515,13 +535,21 @@ export interface ProductionConfig {
515
535
  capture?: CaptureConfig;
516
536
  /**
517
537
  * How many days of history to keep in SQLite, overriding the usual default
518
- * of 7. Retention deletes rows hourly but never runs `VACUUM`, so the
519
- * database file reuses pages rather than shrinking — watch actual size via
520
- * the dashboard's storage panel.
538
+ * of 7. Retention deletes rows hourly and returns freed pages to the OS
539
+ * incrementally — watch actual size via the dashboard's storage panel.
521
540
  *
522
541
  * @default 3
523
542
  */
524
543
  retentionDays?: number;
544
+ /**
545
+ * Size cap in MB for the SQLite database's live data in production,
546
+ * overriding the usual default. When exceeded, the hourly cleanup deletes
547
+ * the oldest records — regardless of age — until usage drops below the
548
+ * cap. Set to `0` to disable.
549
+ *
550
+ * @default 500
551
+ */
552
+ maxDbSizeMb?: number;
525
553
  }
526
554
  /**
527
555
  * Advanced options that most users never need to touch.
@@ -1,7 +1,7 @@
1
1
  import { jsxs as u, jsx as t } from "react/jsx-runtime";
2
2
  import { useState as d, useRef as N, useCallback as v, useEffect as V } from "react";
3
3
  import { formatCacheSize as L, formatTtl as R } from "adonisjs-server-stats/core";
4
- import { a as E, J as F } from "./index-LlFvooUN.js";
4
+ import { a as E, J as F } from "./index-De7nsWBN.js";
5
5
  import { C as T } from "./CacheStatsBar-CRodCOeP.js";
6
6
  import { F as A } from "./FilterBar-CQ7bD669.js";
7
7
  import { D as z } from "./DataTable-YyShr5B-.js";
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
2
  import { useState as p, useRef as z, useMemo as A, useCallback as K, useEffect as L } from "react";
3
3
  import { formatTtl as $, formatCacheSize as j } from "adonisjs-server-stats/core";
4
4
  import { u as F } from "./useDashboardApiBase-Bi36pJ2L.js";
5
- import { u as D, J as E } from "./index-LlFvooUN.js";
5
+ import { u as D, J as E } from "./index-De7nsWBN.js";
6
6
  import { u as V } from "./useResizableTable-CNJmACdt.js";
7
7
  import { C as J } from "./CacheStatsBar-CRodCOeP.js";
8
8
  import { F as M } from "./FilterBar-CQ7bD669.js";
@@ -1,5 +1,5 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
- import { a as i } from "./index-LlFvooUN.js";
2
+ import { a as i } from "./index-De7nsWBN.js";
3
3
  import { C as n } from "./ConfigContent-Bwvfl_G7.js";
4
4
  function m({ options: o = {} }) {
5
5
  const { data: a, isLoading: s } = i("config", o);
@@ -1,6 +1,6 @@
1
1
  import { jsxs as i, jsx as n } from "react/jsx-runtime";
2
2
  import { u as f } from "./useDashboardApiBase-Bi36pJ2L.js";
3
- import { u as m } from "./index-LlFvooUN.js";
3
+ import { u as m } from "./index-De7nsWBN.js";
4
4
  import { C as d } from "./ConfigContent-Bwvfl_G7.js";
5
5
  function b({ options: r, dashboardPath: o }) {
6
6
  const { resolvedOptions: a } = f(o, r), { data: e, isLoading: t, error: s } = m("config", a);
@@ -1,7 +1,7 @@
1
1
  import { jsxs as l, jsx as r } from "react/jsx-runtime";
2
2
  import { useState as w, useMemo as f } from "react";
3
3
  import { compactPreview as k, formatDuration as x, durationClassName as M } from "adonisjs-server-stats/core";
4
- import { u as L, B as A, M as B } from "./index-LlFvooUN.js";
4
+ import { u as L, B as A, M as B } from "./index-De7nsWBN.js";
5
5
  import { T as b } from "./TimeAgoCell-o3KigGfM.js";
6
6
  import { u as D } from "./useResizableTable-CNJmACdt.js";
7
7
  import { F as P } from "./FilterBar-CQ7bD669.js";
@@ -1,7 +1,7 @@
1
1
  import { jsx as s, jsxs as b, Fragment as E } from "react/jsx-runtime";
2
2
  import { useState as o, useRef as N, useEffect as y, useCallback as F } from "react";
3
3
  import { resolveCcAddr as _, resolveToAddr as g, resolveFromAddr as x, resolveAttachmentCount as $, resolveTimestamp as D } from "adonisjs-server-stats/core";
4
- import { a as O } from "./index-LlFvooUN.js";
4
+ import { a as O } from "./index-De7nsWBN.js";
5
5
  import { E as R } from "./EmailPreviewOverlay-BmXOAvqG.js";
6
6
  import { F as B } from "./FilterBar-CQ7bD669.js";
7
7
  import { T as H } from "./TimeAgoCell-o3KigGfM.js";
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as i } from "react/jsx-runtime";
2
2
  import { useState as c, useRef as A, useMemo as v, useCallback as y, useEffect as S } from "react";
3
3
  import { resolveTimestamp as j } from "adonisjs-server-stats/core";
4
4
  import { T as q } from "./TimeAgoCell-o3KigGfM.js";
5
- import { u as $ } from "./index-LlFvooUN.js";
5
+ import { u as $ } from "./index-De7nsWBN.js";
6
6
  import { u as F } from "./useResizableTable-CNJmACdt.js";
7
7
  import { F as R } from "./FilterBar-CQ7bD669.js";
8
8
  import { E as M } from "./EmailPreviewOverlay-BmXOAvqG.js";
@@ -2,7 +2,7 @@ import { jsxs as i, jsx as e, Fragment as g } from "react/jsx-runtime";
2
2
  import { useState as m, useEffect as f } from "react";
3
3
  import { resolveEventName as y, resolveTimestamp as u } from "adonisjs-server-stats/core";
4
4
  import { T as w } from "./TimeAgoCell-o3KigGfM.js";
5
- import { a as b, J as N } from "./index-LlFvooUN.js";
5
+ import { a as b, J as N } from "./index-De7nsWBN.js";
6
6
  import { D as x } from "./DataTable-YyShr5B-.js";
7
7
  import { F as P } from "./FilterBar-CQ7bD669.js";
8
8
  import { P as k } from "./Pagination-BkmzUDY8.js";
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
2
  import { useState as p, useMemo as u } from "react";
3
3
  import { resolveTimestamp as g } from "adonisjs-server-stats/core";
4
4
  import { T as b } from "./TimeAgoCell-o3KigGfM.js";
5
- import { u as f, J as v } from "./index-LlFvooUN.js";
5
+ import { u as f, J as v } from "./index-De7nsWBN.js";
6
6
  import { u as w } from "./useResizableTable-CNJmACdt.js";
7
7
  import { F as y } from "./FilterBar-CQ7bD669.js";
8
8
  function E({ options: c }) {
@@ -1,33 +1,33 @@
1
- import { useState as f, useRef as T, useCallback as x, useEffect as M } from "react";
2
- import { UnauthorizedError as E, formatConfigVal as I, isSecretKey as C, formatUptime as R, timeAgo as N, getTimerLabel as j, formatDuration as w, getIntegrationLabel as z, TAB_ICONS as y, classifyStatus as D } from "adonisjs-server-stats/core";
1
+ import { useState as f, useRef as z, useCallback as x, useEffect as A } from "react";
2
+ import { UnauthorizedError as T, formatConfigVal as C, isSecretKey as I, formatUptime as D, timeAgo as N, getTimerLabel as E, formatDuration as w, getIntegrationLabel as R, TAB_ICONS as S, classifyStatus as j } from "adonisjs-server-stats/core";
3
3
  import { u as B } from "./useApiClient-CtEG7rHs.js";
4
- import { jsx as e, jsxs as n, Fragment as $ } from "react/jsx-runtime";
4
+ import { jsx as e, jsxs as n, Fragment as y } from "react/jsx-runtime";
5
5
  function H(t = {}) {
6
6
  const {
7
7
  baseUrl: c = "",
8
- debugEndpoint: s = "/admin/api/debug",
8
+ debugEndpoint: d = "/admin/api/debug",
9
9
  authToken: i,
10
- refreshInterval: d = 3e3
11
- } = t, [u, b] = f(null), [v, g] = f(!0), [S, r] = f(null), l = T(null), a = B(c, i), h = x(async () => {
10
+ refreshInterval: s = 3e3
11
+ } = t, [u, b] = f(null), [v, g] = f(!0), [$, r] = f(null), l = z(null), a = B(c, i), h = x(async () => {
12
12
  try {
13
- const A = await a().get(`${s}/diagnostics`);
14
- b(A), r(null), g(!1);
13
+ const M = await a().get(`${d}/diagnostics`);
14
+ b(M), r(null), g(!1);
15
15
  } catch (o) {
16
- if (o instanceof E) {
16
+ if (o instanceof T) {
17
17
  r(o), g(!1), l.current && (clearInterval(l.current), l.current = null);
18
18
  return;
19
19
  }
20
20
  r(o instanceof Error ? o : new Error(String(o))), g(!1);
21
21
  }
22
- }, [s, a]);
23
- return M(() => (g(!0), r(null), h(), l.current = setInterval(h, d), () => {
22
+ }, [d, a]);
23
+ return A(() => (g(!0), r(null), h(), l.current = setInterval(h, s), () => {
24
24
  l.current && (clearInterval(l.current), l.current = null);
25
- }), [h, d]), { data: u, isLoading: v, error: S };
25
+ }), [h, s]), { data: u, isLoading: v, error: $ };
26
26
  }
27
27
  function p({ status: t, prefix: c }) {
28
- const s = D(t);
28
+ const d = j(t);
29
29
  let i = `${c}-dot`;
30
- return s === "ok" ? i += ` ${c}-dot-ok` : s === "err" && (i += ` ${c}-dot-err`), /* @__PURE__ */ e("span", { className: i });
30
+ return d === "ok" ? i += ` ${c}-dot-ok` : d === "err" && (i += ` ${c}-dot-err`), /* @__PURE__ */ e("span", { className: i });
31
31
  }
32
32
  const L = () => /* @__PURE__ */ e(
33
33
  "svg",
@@ -35,13 +35,13 @@ const L = () => /* @__PURE__ */ e(
35
35
  xmlns: "http://www.w3.org/2000/svg",
36
36
  width: "12",
37
37
  height: "12",
38
- viewBox: y.eye.viewBox,
38
+ viewBox: S.eye.viewBox,
39
39
  fill: "none",
40
40
  stroke: "currentColor",
41
41
  strokeWidth: "2",
42
42
  strokeLinecap: "round",
43
43
  strokeLinejoin: "round",
44
- dangerouslySetInnerHTML: { __html: y.eye.elements.join("") }
44
+ dangerouslySetInnerHTML: { __html: S.eye.elements.join("") }
45
45
  }
46
46
  ), k = () => /* @__PURE__ */ e(
47
47
  "svg",
@@ -49,17 +49,17 @@ const L = () => /* @__PURE__ */ e(
49
49
  xmlns: "http://www.w3.org/2000/svg",
50
50
  width: "12",
51
51
  height: "12",
52
- viewBox: y["eye-off"].viewBox,
52
+ viewBox: S["eye-off"].viewBox,
53
53
  fill: "none",
54
54
  stroke: "currentColor",
55
55
  strokeWidth: "2",
56
56
  strokeLinecap: "round",
57
57
  strokeLinejoin: "round",
58
- dangerouslySetInnerHTML: { __html: y["eye-off"].elements.join("") }
58
+ dangerouslySetInnerHTML: { __html: S["eye-off"].elements.join("") }
59
59
  }
60
60
  );
61
61
  function V({ value: t }) {
62
- const [c, s] = f(!1);
62
+ const [c, d] = f(!1);
63
63
  return /* @__PURE__ */ n("span", { children: [
64
64
  c ? t : "••••••••",
65
65
  " ",
@@ -67,7 +67,7 @@ function V({ value: t }) {
67
67
  "button",
68
68
  {
69
69
  type: "button",
70
- onClick: () => s((i) => !i),
70
+ onClick: () => d((i) => !i),
71
71
  style: {
72
72
  background: "none",
73
73
  border: "1px solid var(--ss-border)",
@@ -83,39 +83,39 @@ function V({ value: t }) {
83
83
  )
84
84
  ] });
85
85
  }
86
- function O({ current: t, max: c, prefix: s }) {
87
- const i = c > 0 ? Math.min(100, Math.round(t / c * 100)) : 0, d = i >= 100;
88
- return /* @__PURE__ */ n("div", { className: `${s}-bar`, children: [
89
- /* @__PURE__ */ e("div", { className: `${s}-bar-track`, children: /* @__PURE__ */ e(
86
+ function O({ current: t, max: c, prefix: d }) {
87
+ const i = c > 0 ? Math.min(100, Math.round(t / c * 100)) : 0, s = i >= 100;
88
+ return /* @__PURE__ */ n("div", { className: `${d}-bar`, children: [
89
+ /* @__PURE__ */ e("div", { className: `${d}-bar-track`, children: /* @__PURE__ */ e(
90
90
  "div",
91
91
  {
92
- className: `${s}-bar-fill${d ? ` ${s}-bar-fill-warn` : ""}`,
92
+ className: `${d}-bar-fill${s ? ` ${d}-bar-fill-warn` : ""}`,
93
93
  style: { width: `${i}%` }
94
94
  }
95
95
  ) }),
96
- /* @__PURE__ */ n("span", { className: `${s}-bar-pct${d ? ` ${s}-bar-pct-warn` : ""}`, children: [
96
+ /* @__PURE__ */ n("span", { className: `${d}-bar-pct${s ? ` ${d}-bar-pct-warn` : ""}`, children: [
97
97
  i,
98
98
  "%"
99
99
  ] })
100
100
  ] });
101
101
  }
102
102
  function P({ config: t, prefix: c }) {
103
- const s = Object.entries(t);
104
- return s.length === 0 ? /* @__PURE__ */ e("span", { className: `${c}-c-dim`, children: "-" }) : /* @__PURE__ */ e("span", { className: `${c}-c-muted`, children: s.map(([i, d], u) => /* @__PURE__ */ n("span", { children: [
103
+ const d = Object.entries(t);
104
+ return d.length === 0 ? /* @__PURE__ */ e("span", { className: `${c}-c-dim`, children: "-" }) : /* @__PURE__ */ e("span", { className: `${c}-c-muted`, children: d.map(([i, s], u) => /* @__PURE__ */ n("span", { children: [
105
105
  u > 0 && ", ",
106
106
  /* @__PURE__ */ e("span", { className: `${c}-c-dim`, children: i }),
107
107
  "=",
108
- C(i) && typeof d == "string" ? /* @__PURE__ */ e(V, { value: d }) : /* @__PURE__ */ e("span", { children: I(d) })
108
+ I(i) && typeof s == "string" ? /* @__PURE__ */ e(V, { value: s }) : /* @__PURE__ */ e("span", { children: C(s) })
109
109
  ] }, i)) });
110
110
  }
111
- function m({ label: t, value: c, prefix: s }) {
112
- return /* @__PURE__ */ n("div", { className: `${s}-info-card`, children: [
113
- /* @__PURE__ */ e("span", { className: `${s}-info-card-label`, children: t }),
114
- /* @__PURE__ */ e("span", { className: `${s}-info-card-value`, children: c })
111
+ function m({ label: t, value: c, prefix: d }) {
112
+ return /* @__PURE__ */ n("div", { className: `${d}-info-card`, children: [
113
+ /* @__PURE__ */ e("span", { className: `${d}-info-card-label`, children: t }),
114
+ /* @__PURE__ */ e("span", { className: `${d}-info-card-value`, children: c })
115
115
  ] });
116
116
  }
117
- function W({ data: t, tableClassName: c, classPrefix: s }) {
118
- const i = s || "ss-dash", [d, u] = f(/* @__PURE__ */ new Set()), b = x((r) => {
117
+ function W({ data: t, tableClassName: c, classPrefix: d }) {
118
+ const i = d || "ss-dash", [s, u] = f(/* @__PURE__ */ new Set()), b = x((r) => {
119
119
  u((l) => {
120
120
  const a = new Set(l);
121
121
  return a.has(r) ? a.delete(r) : a.add(r), a;
@@ -126,9 +126,9 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
126
126
  if (typeof l == "boolean")
127
127
  return /* @__PURE__ */ e("span", { className: l ? `${i}-c-green` : `${i}-c-red`, children: String(l) });
128
128
  if (Array.isArray(l)) return /* @__PURE__ */ e("span", { children: l.join(", ") || "-" });
129
- const a = I(l);
130
- if (C(r)) {
131
- const h = d.has(r);
129
+ const a = C(l);
130
+ if (I(r)) {
131
+ const h = s.has(r);
132
132
  return /* @__PURE__ */ n("span", { children: [
133
133
  h ? a : "••••••••",
134
134
  " ",
@@ -154,10 +154,10 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
154
154
  }
155
155
  return /* @__PURE__ */ e("span", { children: a });
156
156
  },
157
- [d, b, i]
158
- ), S = t.collectors?.some((r) => r.name === "db_pool" || r.name === "app") && Array.isArray(t.lucidDebugConnections) && t.lucidDebugConnections.length === 0;
157
+ [s, b, i]
158
+ ), $ = t.collectors?.some((r) => r.name === "db_pool" || r.name === "app") && Array.isArray(t.lucidDebugConnections) && t.lucidDebugConnections.length === 0;
159
159
  return /* @__PURE__ */ n("div", { children: [
160
- S && /* @__PURE__ */ n(
160
+ $ && /* @__PURE__ */ n(
161
161
  "div",
162
162
  {
163
163
  style: {
@@ -185,10 +185,10 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
185
185
  /* @__PURE__ */ e(m, { label: "Version", value: t.package.version || "-", prefix: i }),
186
186
  /* @__PURE__ */ e(m, { label: "Node.js", value: t.package.nodeVersion || "-", prefix: i }),
187
187
  /* @__PURE__ */ e(m, { label: "AdonisJS", value: t.package.adonisVersion || "-", prefix: i }),
188
- /* @__PURE__ */ e(m, { label: "Uptime", value: R(t.package.uptime), prefix: i }),
188
+ /* @__PURE__ */ e(m, { label: "Uptime", value: D(t.package.uptime), prefix: i }),
189
189
  /* @__PURE__ */ e(m, { label: "Renderer", value: t.devToolbar?.renderer || "preact", prefix: i })
190
190
  ] }),
191
- t.collectors.length > 0 && /* @__PURE__ */ n($, { children: [
191
+ t.collectors.length > 0 && /* @__PURE__ */ n(y, { children: [
192
192
  /* @__PURE__ */ e("h3", { className: `${i}-internals-title`, children: "Collectors" }),
193
193
  /* @__PURE__ */ n("table", { className: c, children: [
194
194
  /* @__PURE__ */ e("thead", { children: /* @__PURE__ */ n("tr", { children: [
@@ -209,7 +209,7 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
209
209
  /* @__PURE__ */ e(p, { status: r.status, prefix: i }),
210
210
  r.status
211
211
  ] }),
212
- /* @__PURE__ */ e("td", { className: r.lastError ? `${i}-c-red` : `${i}-c-dim`, children: r.lastError ? /* @__PURE__ */ n($, { children: [
212
+ /* @__PURE__ */ e("td", { className: r.lastError ? `${i}-c-red` : `${i}-c-dim`, children: r.lastError ? /* @__PURE__ */ n(y, { children: [
213
213
  r.lastError,
214
214
  r.lastErrorAt && /* @__PURE__ */ e("span", { className: `${i}-c-dim`, style: { fontSize: "10px" }, children: N(r.lastErrorAt) })
215
215
  ] }) : "-" }),
@@ -242,7 +242,7 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
242
242
  /* @__PURE__ */ e("th", { children: "Interval" })
243
243
  ] }) }),
244
244
  /* @__PURE__ */ e("tbody", { children: Object.entries(t.timers).map(([r, l]) => /* @__PURE__ */ n("tr", { children: [
245
- /* @__PURE__ */ e("td", { children: j(r) }),
245
+ /* @__PURE__ */ e("td", { children: E(r) }),
246
246
  /* @__PURE__ */ n("td", { children: [
247
247
  /* @__PURE__ */ e(p, { status: l.active ? "active" : "inactive", prefix: i }),
248
248
  /* @__PURE__ */ e("span", { className: l.active ? `${i}-c-green` : `${i}-c-dim`, children: l.active ? "active" : "inactive" })
@@ -270,7 +270,7 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
270
270
  const a = l.active ?? l.available ?? !1, h = l.active ? "active" : l.available ? "available" : "unavailable";
271
271
  let o = l.mode ? `Mode: ${l.mode}` : "-";
272
272
  return r === "edgePlugin" && l.active ? o = "@serverStats() tag registered" : r === "cacheInspector" && l.available ? o = "Redis dependency detected" : r === "queueInspector" && l.available && (o = "Queue dependency detected"), /* @__PURE__ */ n("tr", { children: [
273
- /* @__PURE__ */ e("td", { children: z(r) }),
273
+ /* @__PURE__ */ e("td", { children: R(r) }),
274
274
  /* @__PURE__ */ n("td", { children: [
275
275
  /* @__PURE__ */ e(p, { status: a ? "active" : "inactive", prefix: i }),
276
276
  h
@@ -280,7 +280,7 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
280
280
  })
281
281
  ] })
282
282
  ] }),
283
- t.storage && /* @__PURE__ */ n($, { children: [
283
+ t.storage && /* @__PURE__ */ n(y, { children: [
284
284
  /* @__PURE__ */ e("h3", { className: `${i}-internals-title`, children: "Storage (SQLite)" }),
285
285
  /* @__PURE__ */ n("table", { className: c, children: [
286
286
  /* @__PURE__ */ e("thead", { children: /* @__PURE__ */ n("tr", { children: [
@@ -320,6 +320,10 @@ function W({ data: t, tableClassName: c, classPrefix: s }) {
320
320
  " days"
321
321
  ] })
322
322
  ] }),
323
+ /* @__PURE__ */ n("tr", { children: [
324
+ /* @__PURE__ */ e("td", { children: "Size Cap" }),
325
+ /* @__PURE__ */ e("td", { children: t.storage.maxDbSizeMb > 0 ? `${t.storage.maxDbSizeMb} MB` : "off" })
326
+ ] }),
323
327
  /* @__PURE__ */ n("tr", { children: [
324
328
  /* @__PURE__ */ e("td", { children: "Last Cleanup" }),
325
329
  /* @__PURE__ */ e("td", { children: t.storage.lastCleanupAt ? N(t.storage.lastCleanupAt) : "-" })
@@ -1,6 +1,6 @@
1
1
  import { jsx as a, jsxs as n } from "react/jsx-runtime";
2
2
  import { SECTION_REFRESH_MS as o } from "adonisjs-server-stats/core";
3
- import { u as d, I as l } from "./InternalsContent-C9lIA92C.js";
3
+ import { u as d, I as l } from "./InternalsContent-CI7HvBtH.js";
4
4
  function u({
5
5
  options: e = {},
6
6
  debugEndpoint: t = "/admin/api/debug"
@@ -1,5 +1,5 @@
1
1
  import { jsx as e, jsxs as n } from "react/jsx-runtime";
2
- import { u as i, I as d } from "./InternalsContent-C9lIA92C.js";
2
+ import { u as i, I as d } from "./InternalsContent-CI7HvBtH.js";
3
3
  function b({ options: s }) {
4
4
  const { data: a, isLoading: t, error: r } = i({
5
5
  baseUrl: s?.baseUrl,
@@ -1,7 +1,7 @@
1
1
  import { jsxs as y, jsx as t, Fragment as T } from "react/jsx-runtime";
2
2
  import { useState as l, useCallback as C } from "react";
3
3
  import { extractJobs as D, extractJobStats as F, JOB_STATUS_FILTERS as j, getJobStatusBadgeColor as B, formatDuration as A, resolveJobTimestamp as L } from "adonisjs-server-stats/core";
4
- import { a as R, B as _, J as $ } from "./index-LlFvooUN.js";
4
+ import { a as R, B as _, J as $ } from "./index-De7nsWBN.js";
5
5
  import { J as M } from "./JobStatsBar-C7RslAFE.js";
6
6
  import { T as O } from "./TimeAgoCell-o3KigGfM.js";
7
7
  import { D as U } from "./DataTable-YyShr5B-.js";
@@ -3,7 +3,7 @@ import { useState as m, useMemo as C, useCallback as A } from "react";
3
3
  import { extractJobs as B, extractJobStats as $, JOB_STATUS_FILTERS as D, getJobStatusCssClass as F, formatDuration as L, resolveJobTimestamp as R } from "adonisjs-server-stats/core";
4
4
  import { T as P } from "./TimeAgoCell-o3KigGfM.js";
5
5
  import { u as k } from "./useDashboardApiBase-Bi36pJ2L.js";
6
- import { u as E, J as O } from "./index-LlFvooUN.js";
6
+ import { u as E, J as O } from "./index-De7nsWBN.js";
7
7
  import { u as q } from "./useResizableTable-CNJmACdt.js";
8
8
  import { F as z } from "./FilterBar-CQ7bD669.js";
9
9
  import { J as M } from "./JobStatsBar-C7RslAFE.js";
@@ -2,7 +2,7 @@ import { jsxs as i, jsx as s } from "react/jsx-runtime";
2
2
  import g from "react";
3
3
  import { T as v } from "./TimeAgoCell-o3KigGfM.js";
4
4
  import { resolveLogLevel as u, resolveLogMessage as f, resolveLogTimestamp as h, resolveLogRequestId as L, getStructuredData as x, getLogLevelCssClass as N } from "adonisjs-server-stats/core";
5
- import { J as y } from "./index-LlFvooUN.js";
5
+ import { J as y } from "./index-De7nsWBN.js";
6
6
  function $({ log: o, index: c, expanded: l, onToggleExpand: m, onReqIdClick: e }) {
7
7
  const n = u(o), d = f(o), p = h(o), a = L(o), t = x(o);
8
8
  return /* @__PURE__ */ i(g.Fragment, { children: [
@@ -1,9 +1,9 @@
1
1
  import { jsxs as l, jsx as t } from "react/jsx-runtime";
2
2
  import { useState as a, useCallback as c } from "react";
3
3
  import { LOG_LEVELS as B } from "adonisjs-server-stats/core";
4
- import { a as G } from "./index-LlFvooUN.js";
4
+ import { a as G } from "./index-De7nsWBN.js";
5
5
  import { F as T } from "./FilterBar-CQ7bD669.js";
6
- import { L as z } from "./LogEntryRow-Cn8Ee_X0.js";
6
+ import { L as z } from "./LogEntryRow-VCCzwD1H.js";
7
7
  import { P as H } from "./Pagination-BkmzUDY8.js";
8
8
  function Z({ options: L = {} }) {
9
9
  const [E, i] = a(1), [b, x] = a(""), [r, q] = a("all"), [n, h] = a(""), [u, p] = a(""), [m, y] = a([]), [v, R] = a("level"), [g, $] = a("equals"), [f, C] = a(""), [F, P] = a(null), o = {};
@@ -1,9 +1,9 @@
1
1
  import { jsx as o, jsxs as i } from "react/jsx-runtime";
2
2
  import { useState as n, useMemo as x, useCallback as C } from "react";
3
3
  import { filterLogsByLevel as N, resolveLogRequestId as F, resolveLogMessage as k, LOG_LEVELS as w } from "adonisjs-server-stats/core";
4
- import { u as E } from "./index-LlFvooUN.js";
4
+ import { u as E } from "./index-De7nsWBN.js";
5
5
  import { F as q } from "./FilterBar-CQ7bD669.js";
6
- import { L as R } from "./LogEntryRow-Cn8Ee_X0.js";
6
+ import { L as R } from "./LogEntryRow-VCCzwD1H.js";
7
7
  function K({ options: f }) {
8
8
  const { data: r, isLoading: p, error: g } = E("logs", f), [d, L] = n("all"), [a, h] = n(""), [l, m] = n(""), [b, y] = n(null), c = x(() => {
9
9
  let e = Array.isArray(r) ? r : r?.logs || r?.entries || [];
@@ -1,7 +1,7 @@
1
1
  import { jsx as s, jsxs as e } from "react/jsx-runtime";
2
2
  import { useContext as rs, useState as A, useId as ts, useRef as ls, useEffect as ds, useCallback as z } from "react";
3
3
  import { resolveMetric as k, formatDuration as S, durationClassName as G, resolveEventName as is, resolveNormalizedSql as ns } from "adonisjs-server-stats/core";
4
- import { O as cs, a as Y, b as D } from "./index-LlFvooUN.js";
4
+ import { O as cs, a as Y, b as D } from "./index-De7nsWBN.js";
5
5
  import { T as os } from "./TimeAgoCell-o3KigGfM.js";
6
6
  const hs = [
7
7
  { value: "5m", label: "5m" },
@@ -1,7 +1,7 @@
1
1
  import { jsx as f, jsxs as T } from "react/jsx-runtime";
2
2
  import { useState as S, useRef as V, useCallback as i, useEffect as q, useMemo as b } from "react";
3
3
  import { QueriesController as F, resolveField as l, computeDashboardQuerySummary as O } from "adonisjs-server-stats/core";
4
- import { a as P } from "./index-LlFvooUN.js";
4
+ import { a as P } from "./index-De7nsWBN.js";
5
5
  import { Q as R } from "./QueriesContent-BDIx8zFn.js";
6
6
  function K({ options: $ = {} }) {
7
7
  const [y, d] = S(1), t = V(new F("list")), [x, D] = S(t.current.state), o = i(() => {
@@ -1,7 +1,7 @@
1
1
  import { jsx as S, jsxs as w, Fragment as L } from "react/jsx-runtime";
2
2
  import { useRef as M, useState as R, useCallback as o, useMemo as l } from "react";
3
3
  import { QueriesController as q, filterQueries as z, countDuplicateQueries as A, computeQuerySummary as B, formatDuration as F } from "adonisjs-server-stats/core";
4
- import { u as U } from "./index-LlFvooUN.js";
4
+ import { u as U } from "./index-De7nsWBN.js";
5
5
  import { Q as _ } from "./QueriesContent-BDIx8zFn.js";
6
6
  function V({ options: m }) {
7
7
  const { baseUrl: d = "", debugEndpoint: g = "/admin/api/debug", authToken: c } = m || {}, { data: u, isLoading: Q, error: h } = U("queries", m), e = M(new q("list")), [f, $] = R(e.current.state), n = o(() => {
@@ -3,8 +3,8 @@ import { useMemo as R, useState as g, useRef as W, useEffect as L, useCallback a
3
3
  import { normalizeTraceFields as z, resolveStatusCode as G, resolveDuration as I, durationClassName as U, resolveSpanCount as Y, resolveWarningCount as K, resolveTimestamp as V } from "adonisjs-server-stats/core";
4
4
  import { T as H } from "./TimeAgoCell-o3KigGfM.js";
5
5
  import { u as J } from "./useApiClient-CtEG7rHs.js";
6
- import { a as Q, M as A, S as F } from "./index-LlFvooUN.js";
7
- import { S as X, R as Z } from "./SplitPaneWrapper-DQvJnsuk.js";
6
+ import { a as Q, M as A, S as F } from "./index-De7nsWBN.js";
7
+ import { S as X, R as Z } from "./SplitPaneWrapper-BZ6VrBr-.js";
8
8
  import { D as ee } from "./DataTable-YyShr5B-.js";
9
9
  import { F as te } from "./FilterBar-CQ7bD669.js";
10
10
  import { P as se } from "./Pagination-BkmzUDY8.js";
@@ -1,6 +1,6 @@
1
1
  import { jsxs as m, jsx as r, Fragment as p } from "react/jsx-runtime";
2
2
  import { useState as y } from "react";
3
- import { a as u, M as f } from "./index-LlFvooUN.js";
3
+ import { a as u, M as f } from "./index-De7nsWBN.js";
4
4
  import { D as w } from "./DataTable-YyShr5B-.js";
5
5
  import { F as b } from "./FilterBar-CQ7bD669.js";
6
6
  function A({ options: n = {} }) {
@@ -1,6 +1,6 @@
1
1
  import { jsx as e, jsxs as d } from "react/jsx-runtime";
2
2
  import { useState as g, useMemo as p } from "react";
3
- import { u as b, M as f } from "./index-LlFvooUN.js";
3
+ import { u as b, M as f } from "./index-De7nsWBN.js";
4
4
  import { u as w } from "./useResizableTable-CNJmACdt.js";
5
5
  import { F as N } from "./FilterBar-CQ7bD669.js";
6
6
  function R({ options: o, currentPath: n }) {
@@ -1,6 +1,6 @@
1
1
  import { jsxs as c, jsx as l } from "react/jsx-runtime";
2
2
  import { useState as d, useRef as o, useEffect as u } from "react";
3
- import { L as p } from "./LogEntryRow-Cn8Ee_X0.js";
3
+ import { L as p } from "./LogEntryRow-VCCzwD1H.js";
4
4
  import { initSplitPane as f } from "adonisjs-server-stats/core";
5
5
  function v({ logs: n, onReqIdClick: a }) {
6
6
  const [t, s] = d(null);