adonisjs-server-stats 1.13.0 → 1.14.1

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 (150) hide show
  1. package/README.md +3 -2
  2. package/dist/configure.js +6 -1
  3. package/dist/core/collectors/collector.d.ts +83 -0
  4. package/dist/core/core/types.d.ts +186 -0
  5. package/dist/core/debug/types.d.ts +467 -0
  6. package/dist/core/index.js +184 -169
  7. package/dist/core/types.d.ts +855 -167
  8. package/dist/react/{CacheSection-CX2duJuc.js → CacheSection-DkLtukWz.js} +1 -1
  9. package/dist/react/{CacheTab-CgT4t0oZ.js → CacheTab-DWeXnEBI.js} +51 -46
  10. package/dist/react/ConfigContent-Bwvfl_G7.js +350 -0
  11. package/dist/react/{ConfigSection-Dt0FyeaW.js → ConfigSection-DaVbFPDg.js} +2 -2
  12. package/dist/react/{ConfigTab-KtiTtsrj.js → ConfigTab-D4640WJZ.js} +2 -2
  13. package/dist/react/{CustomPaneTab-15QoEplP.js → CustomPaneTab-DglmAVMC.js} +1 -1
  14. package/dist/react/{EmailsSection-YcJYR5eA.js → EmailsSection-vYx6ExTb.js} +1 -1
  15. package/dist/react/{EmailsTab-CUjubln_.js → EmailsTab-DKDrRmRH.js} +54 -49
  16. package/dist/react/{EventsSection-GGPoYSNv.js → EventsSection-CapH5xut.js} +1 -1
  17. package/dist/react/{EventsTab-Wdwr0_ny.js → EventsTab-BNVEySAm.js} +1 -1
  18. package/dist/react/{InternalsContent-BNOnSoi9.js → InternalsContent-C9lIA92C.js} +1 -1
  19. package/dist/react/{InternalsSection-BwrTfpjA.js → InternalsSection-lOv_UcSV.js} +1 -1
  20. package/dist/react/{InternalsTab--RD-L1dX.js → InternalsTab-BygoSorC.js} +1 -1
  21. package/dist/react/{JobsSection-BqqIh_DR.js → JobsSection-ZIQsJWid.js} +1 -1
  22. package/dist/react/{JobsTab-CBrU-ryL.js → JobsTab-DXQzXrDt.js} +1 -1
  23. package/dist/react/{LogEntryRow-BOrRkhRU.js → LogEntryRow-BWkHE51-.js} +1 -1
  24. package/dist/react/{LogsSection-Cm_lphM6.js → LogsSection-ConXdBkL.js} +2 -2
  25. package/dist/react/LogsTab-CJM47LPn.js +82 -0
  26. package/dist/react/{OverviewSection-XF7bakyM.js → OverviewSection-DOMu2qvl.js} +131 -131
  27. package/dist/react/{QueriesSection-DsQBKrNK.js → QueriesSection-DFsaOSJI.js} +1 -1
  28. package/dist/react/{QueriesTab-CxCC1GVq.js → QueriesTab-CY9CG_7L.js} +1 -1
  29. package/dist/react/RequestsSection-CC-eVHsl.js +326 -0
  30. package/dist/react/{RoutesSection-D0y5JQP4.js → RoutesSection-p1DMq41y.js} +1 -1
  31. package/dist/react/{RoutesTab-Y_alJVMV.js → RoutesTab-Cnqy8UcK.js} +1 -1
  32. package/dist/react/{SplitPaneWrapper-CZl1ouIT.js → SplitPaneWrapper-XgkA0QxE.js} +1 -1
  33. package/dist/react/{TimelineTab-HyqZpfbp.js → TimelineTab-1YOERxe5.js} +3 -3
  34. package/dist/react/index-DOSlCpZ9.js +1159 -0
  35. package/dist/react/index.js +1 -1
  36. package/dist/react/useApiClient-CtEG7rHs.js +11 -0
  37. package/dist/src/collectors/queue_collector.js +22 -6
  38. package/dist/src/config/deprecation_migration.js +11 -0
  39. package/dist/src/dashboard/cache_handlers.js +22 -2
  40. package/dist/src/dashboard/flush_manager.d.ts +2 -0
  41. package/dist/src/dashboard/flush_manager.js +17 -0
  42. package/dist/src/dashboard/integrations/config_inspector.d.ts +0 -1
  43. package/dist/src/dashboard/integrations/config_inspector.js +4 -2
  44. package/dist/src/dashboard/paginate_helper.d.ts +5 -0
  45. package/dist/src/dashboard/paginate_helper.js +16 -4
  46. package/dist/src/dashboard/query_explain_handler.d.ts +6 -1
  47. package/dist/src/dashboard/query_explain_handler.js +12 -2
  48. package/dist/src/dashboard/write_queue.d.ts +13 -0
  49. package/dist/src/dashboard/write_queue.js +34 -2
  50. package/dist/src/debug/debug_store.js +8 -1
  51. package/dist/src/debug/event_collector.js +4 -0
  52. package/dist/src/debug/query_collector.js +2 -0
  53. package/dist/src/debug/ring_buffer.js +8 -1
  54. package/dist/src/debug/trace_collector.js +34 -10
  55. package/dist/src/debug/types.d.ts +2 -0
  56. package/dist/src/define_config.js +1 -0
  57. package/dist/src/edge/client/dashboard.js +2 -2
  58. package/dist/src/edge/client/debug-panel-deferred.js +1 -1
  59. package/dist/src/edge/client/stats-bar.js +1 -1
  60. package/dist/src/edge/client-vue/dashboard.js +5 -5
  61. package/dist/src/edge/client-vue/debug-panel-deferred.js +2 -2
  62. package/dist/src/engine/request_metrics.js +8 -10
  63. package/dist/src/log_stream/log_stream_service.d.ts +1 -0
  64. package/dist/src/log_stream/log_stream_service.js +7 -5
  65. package/dist/src/prometheus/prometheus_collector.d.ts +9 -0
  66. package/dist/src/prometheus/prometheus_collector.js +11 -0
  67. package/dist/src/provider/dashboard_init.js +15 -0
  68. package/dist/src/provider/dashboard_setup.js +9 -2
  69. package/dist/src/provider/email_bridge.js +6 -2
  70. package/dist/src/provider/email_helpers.d.ts +9 -1
  71. package/dist/src/provider/email_helpers.js +32 -4
  72. package/dist/src/provider/pino_hook.d.ts +8 -0
  73. package/dist/src/provider/pino_hook.js +19 -1
  74. package/dist/src/provider/provider_helpers_extra.d.ts +2 -0
  75. package/dist/src/provider/provider_helpers_extra.js +17 -2
  76. package/dist/src/provider/server_stats_provider.js +19 -1
  77. package/dist/src/provider/shutdown_helpers.js +2 -0
  78. package/dist/src/provider/toolbar_setup.js +17 -14
  79. package/dist/src/routes/dashboard_routes.js +96 -62
  80. package/dist/src/routes/debug_routes.js +45 -35
  81. package/dist/src/routes/no_session_middleware.d.ts +6 -3
  82. package/dist/src/routes/no_session_middleware.js +7 -3
  83. package/dist/src/routes/register_routes.d.ts +8 -0
  84. package/dist/src/routes/register_routes.js +19 -0
  85. package/dist/src/types.d.ts +31 -0
  86. package/dist/src/utils/app_import.js +12 -4
  87. package/dist/vue/CacheSection-CxEBVVkF.js +156 -0
  88. package/dist/vue/ConfigSection-BiRAiaHj.js +415 -0
  89. package/dist/vue/EmailsSection-Dl44qyqY.js +208 -0
  90. package/dist/vue/{EmailsTab-CwIF1fik.js → EmailsTab-Diya54CP.js} +6 -5
  91. package/dist/vue/{EventsSection-BpgkWIwM.js → EventsSection-CWjeitjU.js} +1 -1
  92. package/dist/vue/{InternalsTab-521fxYYj.js → InternalsTab-Z3c82glB.js} +15 -15
  93. package/dist/vue/{JobsSection-DrghFEKL.js → JobsSection-DOBb4LjZ.js} +1 -1
  94. package/dist/vue/LogsSection-CXx-HOWJ.js +260 -0
  95. package/dist/vue/{OverviewSection-BAgZTPjY.js → OverviewSection-CyfNQ8uV.js} +318 -302
  96. package/dist/vue/{QueriesSection-CUpwhp7u.js → QueriesSection-CXBsFp-y.js} +1 -1
  97. package/dist/vue/{RequestsSection-D8P2xpF2.js → RequestsSection-YTIaZGZd.js} +151 -145
  98. package/dist/vue/{RoutesSection-0qB81hTT.js → RoutesSection-CDKMey49.js} +1 -1
  99. package/dist/vue/composables/useApiClient.d.ts +8 -1
  100. package/dist/vue/index-14x39RI_.js +1239 -0
  101. package/dist/vue/index.js +1 -1
  102. package/dist/vue/style.css +1 -1
  103. package/package.json +13 -9
  104. package/dist/react/ConfigContent-CnsEI4j3.js +0 -397
  105. package/dist/react/LogsTab-jKwv9G7Q.js +0 -79
  106. package/dist/react/RequestsSection-D8cMbZU0.js +0 -321
  107. package/dist/react/index-CsprmgzI.js +0 -1121
  108. package/dist/react/useApiClient-BVtNCmnL.js +0 -9
  109. package/dist/vue/CacheSection-DRqV3YX2.js +0 -149
  110. package/dist/vue/ConfigSection-C6pQCHAL.js +0 -576
  111. package/dist/vue/EmailsSection-BTNw3ZU2.js +0 -206
  112. package/dist/vue/LogsSection-BDxx9Bfi.js +0 -258
  113. package/dist/vue/index-30jLw-_w.js +0 -1232
  114. /package/dist/core/{api-client.d.ts → core/api-client.d.ts} +0 -0
  115. /package/dist/core/{config-utils.d.ts → core/config-utils.d.ts} +0 -0
  116. /package/dist/core/{constants.d.ts → core/constants.d.ts} +0 -0
  117. /package/dist/core/{dashboard-api.d.ts → core/dashboard-api.d.ts} +0 -0
  118. /package/dist/core/{dashboard-data-controller.d.ts → core/dashboard-data-controller.d.ts} +0 -0
  119. /package/dist/core/{dashboard-data-helpers.d.ts → core/dashboard-data-helpers.d.ts} +0 -0
  120. /package/dist/core/{debug-data-controller.d.ts → core/debug-data-controller.d.ts} +0 -0
  121. /package/dist/core/{define-config-helpers.d.ts → core/define-config-helpers.d.ts} +0 -0
  122. /package/dist/core/{explain-utils.d.ts → core/explain-utils.d.ts} +0 -0
  123. /package/dist/core/{feature-detect-helpers.d.ts → core/feature-detect-helpers.d.ts} +0 -0
  124. /package/dist/core/{feature-detect.d.ts → core/feature-detect.d.ts} +0 -0
  125. /package/dist/core/{field-resolvers.d.ts → core/field-resolvers.d.ts} +0 -0
  126. /package/dist/core/{formatters-helpers.d.ts → core/formatters-helpers.d.ts} +0 -0
  127. /package/dist/core/{formatters.d.ts → core/formatters.d.ts} +0 -0
  128. /package/dist/core/{history-buffer.d.ts → core/history-buffer.d.ts} +0 -0
  129. /package/dist/core/{icons.d.ts → core/icons.d.ts} +0 -0
  130. /package/dist/core/{index.d.ts → core/index.d.ts} +0 -0
  131. /package/dist/core/{internals-utils.d.ts → core/internals-utils.d.ts} +0 -0
  132. /package/dist/core/{job-utils.d.ts → core/job-utils.d.ts} +0 -0
  133. /package/dist/core/{log-utils-helpers.d.ts → core/log-utils-helpers.d.ts} +0 -0
  134. /package/dist/core/{log-utils.d.ts → core/log-utils.d.ts} +0 -0
  135. /package/dist/core/{metrics.d.ts → core/metrics.d.ts} +0 -0
  136. /package/dist/core/{pagination.d.ts → core/pagination.d.ts} +0 -0
  137. /package/dist/core/{queries-columns.d.ts → core/queries-columns.d.ts} +0 -0
  138. /package/dist/core/{queries-controller.d.ts → core/queries-controller.d.ts} +0 -0
  139. /package/dist/core/{query-utils.d.ts → core/query-utils.d.ts} +0 -0
  140. /package/dist/core/{resizable-columns.d.ts → core/resizable-columns.d.ts} +0 -0
  141. /package/dist/core/{routes.d.ts → core/routes.d.ts} +0 -0
  142. /package/dist/core/{server-stats-controller.d.ts → core/server-stats-controller.d.ts} +0 -0
  143. /package/dist/core/{sparkline.d.ts → core/sparkline.d.ts} +0 -0
  144. /package/dist/core/{split-pane.d.ts → core/split-pane.d.ts} +0 -0
  145. /package/dist/core/{theme.d.ts → core/theme.d.ts} +0 -0
  146. /package/dist/core/{trace-utils.d.ts → core/trace-utils.d.ts} +0 -0
  147. /package/dist/core/{transmit-adapter.d.ts → core/transmit-adapter.d.ts} +0 -0
  148. /package/dist/core/{transmit-helpers.d.ts → core/transmit-helpers.d.ts} +0 -0
  149. /package/dist/core/{types-dashboard.d.ts → core/types-dashboard.d.ts} +0 -0
  150. /package/dist/core/{types-diagnostics.d.ts → core/types-diagnostics.d.ts} +0 -0
@@ -0,0 +1,1159 @@
1
+ import { jsx as s, jsxs as c, Fragment as P } from "react/jsx-runtime";
2
+ import V, { useState as w, useRef as O, useEffect as B, useCallback as x, useMemo as D, Suspense as z, lazy as T } from "react";
3
+ import { DEFAULT_FEATURES as G, detectFeatures as Q, ServerStatsController as X, getTheme as Y, onThemeChange as Z, toggleTheme as ee, buildSparklineData as se, computeStats as te, formatStatNum as U, detectMetricGroupsFromStats as ne, getVisibleMetricGroups as re, METRIC_DEFINITIONS as oe, TAB_ICONS as C, DashboardDataController as ae, subscribeToChannel as ie, DebugDataController as le, compactPreview as ce } from "adonisjs-server-stats/core";
4
+ import { createPortal as de } from "react-dom";
5
+ function q(e = {}) {
6
+ const { baseUrl: r = "", debugEndpoint: t = "/admin/api/debug", authToken: n } = e, [o, l] = w(G), [b, a] = w(!0), [v, m] = w(null), u = O(!1);
7
+ return B(() => {
8
+ if (u.current) return;
9
+ u.current = !0;
10
+ let d = !1;
11
+ return (async () => {
12
+ try {
13
+ const g = await Q({ baseUrl: r, debugEndpoint: t, authToken: n });
14
+ d || (l(g), a(!1));
15
+ } catch (g) {
16
+ d || (m(g instanceof Error ? g : new Error(String(g))), a(!1));
17
+ }
18
+ })(), () => {
19
+ d = !0, u.current = !1;
20
+ };
21
+ }, [r, t, n]), { features: o, isLoading: b, error: v };
22
+ }
23
+ function ue(e = {}) {
24
+ const {
25
+ baseUrl: r = "",
26
+ endpoint: t = "/admin/api/server-stats",
27
+ channelName: n = "admin/server-stats",
28
+ authToken: o,
29
+ pollInterval: l = 3e3
30
+ } = e, [b, a] = w(null), [v, m] = w(!1), [u, d] = w(!1), [f, g] = w(null), [p, S] = w(!1), R = O(null);
31
+ B(() => {
32
+ S(!1);
33
+ }, [r, o]), B(() => {
34
+ if (p) return;
35
+ const k = new X({
36
+ baseUrl: r,
37
+ endpoint: t,
38
+ channelName: n,
39
+ authToken: o,
40
+ pollInterval: l,
41
+ onStatsUpdate: (y) => a(y),
42
+ onConnectionChange: (y) => m(y),
43
+ onStaleChange: (y) => d(y),
44
+ onError: (y) => g(y),
45
+ onUnauthorizedChange: (y) => S(y)
46
+ });
47
+ return R.current = k, k.start(), () => {
48
+ k.stop(), R.current = null;
49
+ };
50
+ }, [r, n, o, l, p]);
51
+ const I = x((k) => R.current?.getHistory(k) ?? [], []);
52
+ return {
53
+ stats: b,
54
+ history: R.current?.getAllHistory() ?? {},
55
+ getHistory: I,
56
+ isConnected: v,
57
+ isStale: u,
58
+ error: f,
59
+ unauthorized: p
60
+ };
61
+ }
62
+ function F() {
63
+ const [e, r] = w(() => Y());
64
+ B(() => Z((o) => {
65
+ r(o);
66
+ }), []);
67
+ const t = x(() => {
68
+ const n = ee();
69
+ return r(n), n;
70
+ }, []);
71
+ return { theme: e, toggleTheme: t };
72
+ }
73
+ function he({
74
+ data: e,
75
+ color: r = "#34d399",
76
+ width: t = 120,
77
+ height: n = 32,
78
+ className: o = ""
79
+ }) {
80
+ const l = D(
81
+ () => se(e, { width: t, height: n }),
82
+ [e, t, n]
83
+ ), b = D(() => "ss-grad-" + Math.random().toString(36).slice(2, 8), []), a = { "--ss-accent": r };
84
+ if (!l)
85
+ return /* @__PURE__ */ s("div", { className: `ss-dash-sparkline ${o}`, style: a, children: /* @__PURE__ */ s(
86
+ "svg",
87
+ {
88
+ width: t,
89
+ height: n,
90
+ viewBox: `0 0 ${t} ${n}`,
91
+ style: { display: "block" },
92
+ children: /* @__PURE__ */ c("text", { x: t / 2, y: n / 2 + 3, textAnchor: "middle", fill: "#737373", fontSize: "9", children: [
93
+ "collecting",
94
+ "…"
95
+ ] })
96
+ }
97
+ ) });
98
+ const v = r || "var(--ss-accent)";
99
+ return /* @__PURE__ */ s("div", { className: `ss-dash-sparkline ${o}`, style: a, children: /* @__PURE__ */ c(
100
+ "svg",
101
+ {
102
+ width: t,
103
+ height: n,
104
+ viewBox: `0 0 ${t} ${n}`,
105
+ style: { display: "block" },
106
+ children: [
107
+ /* @__PURE__ */ s("defs", { children: /* @__PURE__ */ c("linearGradient", { id: b, x1: "0", y1: "0", x2: "0", y2: "1", children: [
108
+ /* @__PURE__ */ s("stop", { offset: "0%", stopColor: v, stopOpacity: "0.25" }),
109
+ /* @__PURE__ */ s("stop", { offset: "100%", stopColor: v, stopOpacity: "0.02" })
110
+ ] }) }),
111
+ /* @__PURE__ */ s("path", { d: l.areaPath, fill: `url(#${b})` }),
112
+ /* @__PURE__ */ s(
113
+ "path",
114
+ {
115
+ className: "ss-dash-sparkline-line",
116
+ d: "M" + l.points.replace(/ /g, " L"),
117
+ fill: "none",
118
+ stroke: v,
119
+ strokeWidth: "1.5",
120
+ strokeLinejoin: "round",
121
+ strokeLinecap: "round"
122
+ }
123
+ )
124
+ ]
125
+ }
126
+ ) });
127
+ }
128
+ const pe = {
129
+ "ss-red": "#f87171",
130
+ "ss-amber": "#fbbf24",
131
+ "ss-green": "#34d399",
132
+ "ss-muted": "#737373"
133
+ };
134
+ function be(e, r, t) {
135
+ const [n, o] = w({
136
+ position: "absolute",
137
+ bottom: "100%",
138
+ left: 0,
139
+ marginBottom: "10px",
140
+ zIndex: 180
141
+ });
142
+ return B(() => {
143
+ if (!t) return;
144
+ const l = () => {
145
+ const a = e.current, v = r.current;
146
+ if (!a || !v) return;
147
+ const m = a.closest(".ss-bar");
148
+ if (!m) return;
149
+ const u = a.getBoundingClientRect(), d = m.getBoundingClientRect(), f = u.left - d.left + u.width / 2;
150
+ o({
151
+ position: "absolute",
152
+ bottom: "100%",
153
+ left: `${f}px`,
154
+ transform: "translateX(-50%)",
155
+ marginBottom: "10px",
156
+ zIndex: 180
157
+ }), requestAnimationFrame(() => {
158
+ const g = v.getBoundingClientRect();
159
+ let p = 0;
160
+ g.left < 8 ? p = 8 - g.left : g.right > window.innerWidth - 8 && (p = window.innerWidth - 8 - g.right), p && o((S) => ({
161
+ ...S,
162
+ transform: `translateX(calc(-50% + ${p}px))`
163
+ }));
164
+ });
165
+ };
166
+ l();
167
+ const b = e.current?.closest(".ss-bar-scroll");
168
+ return b?.addEventListener("scroll", l), window.addEventListener("resize", l), () => {
169
+ b?.removeEventListener("scroll", l), window.removeEventListener("resize", l);
170
+ };
171
+ }, [t, e, r]), n;
172
+ }
173
+ function ge({ metric: e, stats: r, history: t, className: n = "" }) {
174
+ const [o, l] = w(!1), [b, a] = w(!1), v = O(null), m = O(null);
175
+ if (e.show && !e.show(r))
176
+ return null;
177
+ const u = e.value ? e.value(r) : e.format(r), d = e.color ? e.color(r) : "", f = d && pe[d] || "#34d399", g = typeof e.detail == "function" ? e.detail(r) : e.detail, p = D(() => te(t), [t]), S = o || b, R = be(v, m, S), I = x(($) => {
178
+ $.stopPropagation(), l((_) => !_);
179
+ }, []);
180
+ B(() => {
181
+ if (!o) return;
182
+ const $ = (N) => {
183
+ const i = N.target;
184
+ v.current && !v.current.contains(i) && m.current && !m.current.contains(i) && l(!1);
185
+ }, _ = (N) => {
186
+ N.key === "Escape" && l(!1);
187
+ };
188
+ return document.addEventListener("click", $), document.addEventListener("keydown", _), () => {
189
+ document.removeEventListener("click", $), document.removeEventListener("keydown", _);
190
+ };
191
+ }, [o]);
192
+ const k = v.current?.closest(".ss-bar"), y = S && k ? de(
193
+ /* @__PURE__ */ c(
194
+ "div",
195
+ {
196
+ ref: m,
197
+ className: `ss-tooltip ${o ? "ss-pinned" : ""}`,
198
+ style: R,
199
+ children: [
200
+ /* @__PURE__ */ c("div", { className: "ss-tooltip-inner", style: { position: "relative" }, children: [
201
+ o && /* @__PURE__ */ s(
202
+ "button",
203
+ {
204
+ className: "ss-tooltip-close",
205
+ onClick: ($) => {
206
+ $.stopPropagation(), l(!1);
207
+ },
208
+ type: "button",
209
+ children: "×"
210
+ }
211
+ ),
212
+ /* @__PURE__ */ c("div", { className: "ss-tooltip-header", children: [
213
+ /* @__PURE__ */ s("span", { className: "ss-tooltip-title", children: e.title }),
214
+ e.unit && /* @__PURE__ */ s("span", { className: "ss-tooltip-unit", children: e.unit })
215
+ ] }),
216
+ /* @__PURE__ */ c("div", { className: "ss-tooltip-current", children: [
217
+ /* @__PURE__ */ s("span", { className: "ss-tooltip-current-label", children: "Current: " }),
218
+ /* @__PURE__ */ s("span", { className: "ss-tooltip-current-value", children: u })
219
+ ] }),
220
+ p && /* @__PURE__ */ c("div", { className: "ss-tooltip-stats", children: [
221
+ /* @__PURE__ */ c("span", { children: [
222
+ "Min: ",
223
+ U(p.min, e.unit)
224
+ ] }),
225
+ /* @__PURE__ */ c("span", { children: [
226
+ "Max: ",
227
+ U(p.max, e.unit)
228
+ ] }),
229
+ /* @__PURE__ */ c("span", { children: [
230
+ "Avg: ",
231
+ U(p.avg, e.unit)
232
+ ] })
233
+ ] }),
234
+ g && /* @__PURE__ */ s("div", { className: "ss-tooltip-details", children: g }),
235
+ t.length > 0 && /* @__PURE__ */ c(P, { children: [
236
+ /* @__PURE__ */ s("div", { className: "ss-tooltip-sparkline", children: /* @__PURE__ */ s(he, { data: t, color: f }) }),
237
+ /* @__PURE__ */ c("div", { className: "ss-tooltip-samples", children: [
238
+ "Last ",
239
+ Math.min(t.length, 60),
240
+ " samples (~",
241
+ Math.round(Math.min(t.length, 60) * 3 / 60),
242
+ " min)"
243
+ ] })
244
+ ] })
245
+ ] }),
246
+ /* @__PURE__ */ s("div", { className: "ss-tooltip-arrow" })
247
+ ]
248
+ }
249
+ ),
250
+ k
251
+ ) : null;
252
+ return /* @__PURE__ */ c(P, { children: [
253
+ /* @__PURE__ */ c(
254
+ "div",
255
+ {
256
+ ref: v,
257
+ className: `ss-badge ${o ? "ss-pinned" : ""} ${n}`,
258
+ onClick: I,
259
+ onMouseEnter: () => !o && a(!0),
260
+ onMouseLeave: () => a(!1),
261
+ role: "button",
262
+ tabIndex: 0,
263
+ onKeyDown: ($) => $.key === "Enter" && I($),
264
+ children: [
265
+ /* @__PURE__ */ s("span", { className: "ss-label", children: e.label }),
266
+ /* @__PURE__ */ s("span", { className: `ss-value ${d}`, children: u })
267
+ ]
268
+ }
269
+ ),
270
+ y
271
+ ] });
272
+ }
273
+ function Qe(e) {
274
+ const {
275
+ featureOptions: r,
276
+ autoHideOnUnauthorized: t = !0,
277
+ onOpenDebugPanel: n,
278
+ debugPanelOpen: o = !1,
279
+ onConnectionChange: l,
280
+ ...b
281
+ } = e, { stats: a, getHistory: v, isConnected: m, isStale: u, unauthorized: d } = ue(b);
282
+ B(() => {
283
+ l?.(m);
284
+ }, [m, l]);
285
+ const { features: f } = q(r), { theme: g } = F(), [p, S] = w(() => typeof window > "u" ? !0 : localStorage.getItem("admin:stats-bar") !== "hidden"), R = O(null), I = O(null);
286
+ B(() => {
287
+ t && d && S(!1);
288
+ }, [t, d]);
289
+ const k = x(() => {
290
+ S((N) => {
291
+ const i = !N;
292
+ return localStorage.setItem("admin:stats-bar", i ? "visible" : "hidden"), i;
293
+ });
294
+ }, []);
295
+ B(() => {
296
+ const N = I.current;
297
+ if (!N) return;
298
+ const i = (L) => {
299
+ Math.abs(L.deltaX) > Math.abs(L.deltaY) || (L.preventDefault(), N.scrollLeft += L.deltaY);
300
+ };
301
+ return N.addEventListener("wheel", i, { passive: !1 }), () => N.removeEventListener("wheel", i);
302
+ }, []);
303
+ const y = D(() => a ? ne(a) : re(f), [a, f]), $ = D(
304
+ () => oe.filter((N) => y.has(N.group || "core")),
305
+ [y]
306
+ ), _ = D(() => {
307
+ const N = [];
308
+ let i = "";
309
+ for (const L of $) {
310
+ const M = L.group || "core";
311
+ M !== i && (i = M, N.push({ group: i, metrics: [] })), N[N.length - 1].metrics.push(L);
312
+ }
313
+ return N;
314
+ }, [$]);
315
+ return t && d ? null : /* @__PURE__ */ c(P, { children: [
316
+ /* @__PURE__ */ c(
317
+ "button",
318
+ {
319
+ type: "button",
320
+ className: `ss-toggle ${p ? "ss-visible" : "ss-collapsed"}`,
321
+ onClick: k,
322
+ title: p ? "Hide stats bar" : "Show stats bar",
323
+ "data-ss-theme": g,
324
+ children: [
325
+ !p && a && /* @__PURE__ */ c("span", { className: "ss-toggle-summary", style: { display: "flex" }, children: [
326
+ y.has("process") && /* @__PURE__ */ c(P, { children: [
327
+ /* @__PURE__ */ c(
328
+ "span",
329
+ {
330
+ className: `ss-value ${a.cpuPercent > 80 ? "ss-red" : a.cpuPercent > 50 ? "ss-amber" : "ss-green"}`,
331
+ children: [
332
+ a.cpuPercent.toFixed(0),
333
+ "%"
334
+ ]
335
+ }
336
+ ),
337
+ /* @__PURE__ */ s("span", { className: "ss-value ss-green", children: a.memHeapUsed !== void 0 ? Math.round(a.memHeapUsed / (1024 * 1024)) + "M" : "-" })
338
+ ] }),
339
+ y.has("redis") && a.redisOk !== void 0 && /* @__PURE__ */ s("span", { className: `ss-value ${a.redisOk ? "ss-green" : "ss-red"}`, children: a.redisOk ? "✓" : "✗" })
340
+ ] }),
341
+ p && /* @__PURE__ */ s("span", { className: "ss-toggle-label", style: { color: "#737373" }, children: "hide stats" }),
342
+ /* @__PURE__ */ s("span", { className: "ss-toggle-arrow", children: p ? "▼" : "▲" })
343
+ ]
344
+ }
345
+ ),
346
+ /* @__PURE__ */ c("div", { ref: R, className: p ? "ss-bar" : "ss-bar ss-hidden", "data-ss-theme": g, children: [
347
+ /* @__PURE__ */ c("div", { className: "ss-bar-left", children: [
348
+ n && /* @__PURE__ */ s(
349
+ "button",
350
+ {
351
+ type: "button",
352
+ className: `ss-dbg-btn ${o ? "ss-dbg-active" : ""}`,
353
+ onClick: n,
354
+ title: "Toggle debug panel",
355
+ id: "ss-dbg-wrench",
356
+ children: /* @__PURE__ */ s(
357
+ "svg",
358
+ {
359
+ width: "14",
360
+ height: "14",
361
+ viewBox: C.wrench.viewBox,
362
+ fill: "none",
363
+ stroke: "currentColor",
364
+ strokeWidth: "2",
365
+ strokeLinecap: "round",
366
+ strokeLinejoin: "round",
367
+ dangerouslySetInnerHTML: { __html: C.wrench.elements.join("") }
368
+ }
369
+ )
370
+ }
371
+ ),
372
+ /* @__PURE__ */ s("div", { className: u ? "ss-dot ss-stale" : "ss-dot" })
373
+ ] }),
374
+ /* @__PURE__ */ s("div", { ref: I, className: "ss-bar-scroll", id: "ss-bar-scroll", children: a && _.map((N, i) => /* @__PURE__ */ c(V.Fragment, { children: [
375
+ i > 0 && /* @__PURE__ */ s("div", { className: "ss-group-sep" }),
376
+ /* @__PURE__ */ s("div", { className: "ss-group", children: N.metrics.map((L) => /* @__PURE__ */ s(
377
+ ge,
378
+ {
379
+ metric: L,
380
+ stats: a,
381
+ history: v(L.historyKey || "")
382
+ },
383
+ L.id
384
+ )) })
385
+ ] }, N.group)) })
386
+ ] })
387
+ ] });
388
+ }
389
+ function A({
390
+ theme: e,
391
+ onToggle: r,
392
+ className: t = "",
393
+ classPrefix: n = "ss-dash"
394
+ }) {
395
+ const o = e === "dark";
396
+ return /* @__PURE__ */ s(
397
+ "button",
398
+ {
399
+ type: "button",
400
+ className: `${n === "ss-dbg" ? "ss-dbg-theme-toggle" : "ss-dash-theme-btn"} ${t}`,
401
+ onClick: r,
402
+ title: o ? "Switch to light theme" : "Switch to dark theme",
403
+ "aria-label": o ? "Switch to light theme" : "Switch to dark theme",
404
+ children: o ? (
405
+ // Sun icon
406
+ /* @__PURE__ */ s(
407
+ "svg",
408
+ {
409
+ width: "16",
410
+ height: "16",
411
+ viewBox: C.sun.viewBox,
412
+ fill: "none",
413
+ stroke: "currentColor",
414
+ strokeWidth: "2",
415
+ strokeLinecap: "round",
416
+ strokeLinejoin: "round",
417
+ dangerouslySetInnerHTML: { __html: C.sun.elements.join("") }
418
+ }
419
+ )
420
+ ) : (
421
+ // Moon icon
422
+ /* @__PURE__ */ s(
423
+ "svg",
424
+ {
425
+ width: "16",
426
+ height: "16",
427
+ viewBox: C.moon.viewBox,
428
+ fill: "none",
429
+ stroke: "currentColor",
430
+ strokeWidth: "2",
431
+ strokeLinecap: "round",
432
+ strokeLinejoin: "round",
433
+ dangerouslySetInnerHTML: { __html: C.moon.elements.join("") }
434
+ }
435
+ )
436
+ )
437
+ }
438
+ );
439
+ }
440
+ const me = T(() => import("./QueriesTab-CY9CG_7L.js")), ve = T(() => import("./EventsTab-BNVEySAm.js")), fe = T(() => import("./EmailsTab-DKDrRmRH.js")), we = T(() => import("./RoutesTab-Cnqy8UcK.js")), ke = T(() => import("./LogsTab-CJM47LPn.js")), ye = T(() => import("./TimelineTab-1YOERxe5.js")), Ne = T(() => import("./CacheTab-DWeXnEBI.js")), Ce = T(() => import("./JobsTab-DXQzXrDt.js")), Se = T(() => import("./ConfigTab-D4640WJZ.js")), Le = T(() => import("./InternalsTab-BygoSorC.js")), Te = T(() => import("./CustomPaneTab-DglmAVMC.js"));
441
+ function Xe(e) {
442
+ const {
443
+ defaultOpen: r = !1,
444
+ dashboardPath: t,
445
+ isOpen: n,
446
+ onOpenChange: o,
447
+ isLive: l = !1,
448
+ ...b
449
+ } = e, [a, v] = w(r), m = n !== void 0 ? n : a, u = (i) => {
450
+ o ? o(i) : v(i);
451
+ }, [d, f] = w("queries"), g = D(
452
+ () => b,
453
+ // eslint-disable-next-line react-hooks/exhaustive-deps
454
+ [b.baseUrl, b.debugEndpoint, b.authToken]
455
+ ), { features: p } = q(g), { theme: S, toggleTheme: R } = F(), I = p.customPanes || [];
456
+ B(() => {
457
+ const i = (L) => {
458
+ L.key === "Escape" && m && u(!1);
459
+ };
460
+ return document.addEventListener("keydown", i), () => document.removeEventListener("keydown", i);
461
+ }, [m]);
462
+ const k = D(
463
+ () => [
464
+ { id: "queries", label: "Queries", visible: !0 },
465
+ { id: "events", label: "Events", visible: !0 },
466
+ { id: "emails", label: "Emails", visible: !0 },
467
+ { id: "routes", label: "Routes", visible: !0 },
468
+ { id: "logs", label: "Logs", visible: !0 },
469
+ { id: "timeline", label: "Requests", visible: p.tracing },
470
+ { id: "cache", label: "Cache", visible: p.cache },
471
+ { id: "jobs", label: "Jobs", visible: p.queues },
472
+ { id: "config", label: "Config", visible: !0 },
473
+ { id: "internals", label: "Internals", visible: !0 }
474
+ ],
475
+ [p]
476
+ ), y = D(() => k.filter((i) => i.visible), [k]);
477
+ B(() => {
478
+ const i = [
479
+ ...y.map((L) => L.id),
480
+ ...I.map((L) => L.id)
481
+ ];
482
+ !i.includes(d) && i.length > 0 && f(i[0]);
483
+ }, [y, I, d]);
484
+ const $ = x(() => {
485
+ u(!m);
486
+ }, [m]), _ = D(() => {
487
+ const i = { options: g }, L = I.find((M) => M.id === d);
488
+ if (L)
489
+ return /* @__PURE__ */ s(Te, { pane: L, options: g });
490
+ switch (d) {
491
+ case "queries":
492
+ return /* @__PURE__ */ s(me, { ...i });
493
+ case "events":
494
+ return /* @__PURE__ */ s(ve, { ...i });
495
+ case "emails":
496
+ return /* @__PURE__ */ s(fe, { ...i });
497
+ case "routes":
498
+ return /* @__PURE__ */ s(
499
+ we,
500
+ {
501
+ ...i,
502
+ currentPath: typeof window < "u" ? window.location.pathname : ""
503
+ }
504
+ );
505
+ case "logs":
506
+ return /* @__PURE__ */ s(ke, { ...i });
507
+ case "timeline":
508
+ return /* @__PURE__ */ s(ye, { ...i });
509
+ case "cache":
510
+ return /* @__PURE__ */ s(Ne, { ...i, dashboardPath: t });
511
+ case "jobs":
512
+ return /* @__PURE__ */ s(Ce, { ...i, dashboardPath: t });
513
+ case "config":
514
+ return /* @__PURE__ */ s(Se, { ...i, dashboardPath: t });
515
+ case "internals":
516
+ return /* @__PURE__ */ s(Le, { ...i });
517
+ default:
518
+ return /* @__PURE__ */ s("div", { className: "ss-dbg-empty", children: "Unknown tab" });
519
+ }
520
+ }, [d, g, I, t]), N = x(
521
+ () => /* @__PURE__ */ s(z, { fallback: /* @__PURE__ */ s("div", { className: "ss-dbg-empty", children: "Loading..." }), children: _ }),
522
+ [_]
523
+ );
524
+ return /* @__PURE__ */ c(P, { children: [
525
+ n === void 0 && /* @__PURE__ */ s(
526
+ "button",
527
+ {
528
+ type: "button",
529
+ className: `ss-dbg-btn ${m ? "ss-dbg-active" : ""}`,
530
+ onClick: $,
531
+ title: "Toggle debug panel",
532
+ id: "ss-dbg-wrench",
533
+ children: /* @__PURE__ */ s(
534
+ "svg",
535
+ {
536
+ width: "14",
537
+ height: "14",
538
+ viewBox: C.wrench.viewBox,
539
+ fill: "none",
540
+ stroke: "currentColor",
541
+ strokeWidth: "2",
542
+ strokeLinecap: "round",
543
+ strokeLinejoin: "round",
544
+ dangerouslySetInnerHTML: { __html: C.wrench.elements.join("") }
545
+ }
546
+ )
547
+ }
548
+ ),
549
+ /* @__PURE__ */ c(
550
+ "div",
551
+ {
552
+ className: `ss-dbg-panel ${m ? "ss-dbg-open" : ""}`,
553
+ "data-ss-theme": S,
554
+ id: "ss-dbg-panel",
555
+ children: [
556
+ /* @__PURE__ */ c("div", { className: "ss-dbg-tabs", children: [
557
+ /* @__PURE__ */ c("div", { className: "ss-dbg-tabs-scroll", role: "tablist", children: [
558
+ y.map((i) => /* @__PURE__ */ c(
559
+ "button",
560
+ {
561
+ type: "button",
562
+ role: "tab",
563
+ "aria-selected": d === i.id,
564
+ className: `ss-dbg-tab ${d === i.id ? "ss-dbg-active" : ""}`,
565
+ onClick: () => f(i.id),
566
+ children: [
567
+ C[i.id] ? /* @__PURE__ */ s(
568
+ "svg",
569
+ {
570
+ className: "ss-dbg-tab-icon",
571
+ viewBox: C[i.id].viewBox,
572
+ dangerouslySetInnerHTML: { __html: C[i.id].elements.join("") }
573
+ }
574
+ ) : null,
575
+ i.label
576
+ ]
577
+ },
578
+ i.id
579
+ )),
580
+ I.map((i) => /* @__PURE__ */ s(
581
+ "button",
582
+ {
583
+ type: "button",
584
+ role: "tab",
585
+ "aria-selected": d === i.id,
586
+ className: `ss-dbg-tab ${d === i.id ? "ss-dbg-active" : ""}`,
587
+ onClick: () => f(i.id),
588
+ children: i.label
589
+ },
590
+ i.id
591
+ ))
592
+ ] }),
593
+ /* @__PURE__ */ c("div", { className: "ss-dbg-tabs-right", children: [
594
+ /* @__PURE__ */ s(
595
+ "span",
596
+ {
597
+ className: `ss-dbg-conn-mode ${l ? "ss-dbg-conn-live" : "ss-dbg-conn-polling"}`,
598
+ title: l ? "Connected via Transmit (SSE) — real-time updates" : "Polling every 3s",
599
+ children: l ? "live" : "polling"
600
+ }
601
+ ),
602
+ /* @__PURE__ */ s(A, { theme: S, onToggle: R, classPrefix: "ss-dbg" }),
603
+ t && /* @__PURE__ */ s(
604
+ "a",
605
+ {
606
+ href: t,
607
+ target: "_blank",
608
+ rel: "noopener noreferrer",
609
+ className: "ss-dbg-dashboard-link",
610
+ title: "Open dashboard",
611
+ children: /* @__PURE__ */ s(
612
+ "svg",
613
+ {
614
+ width: "14",
615
+ height: "14",
616
+ viewBox: C["external-link"].viewBox,
617
+ fill: "none",
618
+ stroke: "currentColor",
619
+ strokeWidth: "2",
620
+ strokeLinecap: "round",
621
+ strokeLinejoin: "round",
622
+ dangerouslySetInnerHTML: { __html: C["external-link"].elements.join("") }
623
+ }
624
+ )
625
+ }
626
+ ),
627
+ /* @__PURE__ */ s(
628
+ "button",
629
+ {
630
+ type: "button",
631
+ className: "ss-dbg-close",
632
+ onClick: () => u(!1),
633
+ title: "Close panel",
634
+ children: "×"
635
+ }
636
+ )
637
+ ] })
638
+ ] }),
639
+ /* @__PURE__ */ s("div", { className: "ss-dbg-content", children: m && N() })
640
+ ]
641
+ }
642
+ )
643
+ ] });
644
+ }
645
+ function Ee(e, r) {
646
+ return new ae({
647
+ baseUrl: r.baseUrl,
648
+ endpoint: r.dashboardEndpoint,
649
+ authToken: r.authToken,
650
+ section: e,
651
+ perPage: r.perPage,
652
+ callbacks: {
653
+ onData: (t) => r.setData(t),
654
+ onPagination: (t) => r.setMeta(t),
655
+ onLoading: (t) => r.setIsLoading(t),
656
+ onError: (t) => r.setError(t),
657
+ onUnauthorized: () => {
658
+ }
659
+ }
660
+ });
661
+ }
662
+ function $e(e, r) {
663
+ e.ctrl.configure(r);
664
+ const t = e.prevSection !== e.section;
665
+ return t || !e.hasFetched ? (t ? e.ctrl.setSection(e.section) : e.ctrl.start(), !0) : (e.ctrl.start(), e.hasFetched);
666
+ }
667
+ function xe() {
668
+ const [e, r] = w(null), [t, n] = w(null), [o, l] = w(!0), [b, a] = w(null);
669
+ return { data: e, setData: r, meta: t, setMeta: n, isLoading: o, setIsLoading: l, error: b, setError: a };
670
+ }
671
+ function Ie(e) {
672
+ const r = x(() => {
673
+ e.current?.fetch(!0);
674
+ }, [e]), t = x(
675
+ async (o, l = "post", b) => {
676
+ const a = e.current;
677
+ if (!a) throw new Error("Dashboard controller not initialized");
678
+ return a.mutate(o, l, b);
679
+ },
680
+ [e]
681
+ ), n = x(() => {
682
+ const o = e.current;
683
+ if (!o) throw new Error("Dashboard controller not initialized");
684
+ return o.getApi();
685
+ }, [e]);
686
+ return { refresh: r, mutate: t, getApi: n };
687
+ }
688
+ function Me(e, r, t, n) {
689
+ e.current || (e.current = Ee(r, {
690
+ ...t,
691
+ setData: (o) => n.setData(o),
692
+ setMeta: n.setMeta,
693
+ setIsLoading: n.setIsLoading,
694
+ setError: n.setError
695
+ }));
696
+ }
697
+ function Be(e) {
698
+ return {
699
+ baseUrl: e.baseUrl ?? "",
700
+ dashboardEndpoint: e.dashboardEndpoint ?? "/__stats/api",
701
+ authToken: e.authToken,
702
+ page: e.page ?? 1,
703
+ perPage: e.perPage ?? 50,
704
+ search: e.search,
705
+ sort: e.sort,
706
+ sortDir: e.sortDir,
707
+ filters: e.filters,
708
+ timeRange: e.timeRange,
709
+ refreshKey: e.refreshKey
710
+ };
711
+ }
712
+ function De(e, r = {}) {
713
+ const t = Be(r), n = xe(), o = O(null), l = O(e), b = O(!1);
714
+ Me(o, e, t, n), B(() => {
715
+ const v = l.current;
716
+ return l.current = e, b.current = $e(
717
+ {
718
+ ctrl: o.current,
719
+ section: e,
720
+ prevSection: v,
721
+ hasFetched: b.current
722
+ },
723
+ t
724
+ ), () => {
725
+ o.current.stop();
726
+ };
727
+ }, [
728
+ e,
729
+ t.page,
730
+ t.perPage,
731
+ t.search,
732
+ t.sort,
733
+ t.sortDir,
734
+ t.filters,
735
+ t.timeRange,
736
+ t.refreshKey
737
+ ]);
738
+ const a = Ie(o);
739
+ return {
740
+ data: n.data,
741
+ meta: n.meta,
742
+ isLoading: n.isLoading,
743
+ error: n.error,
744
+ ...a
745
+ };
746
+ }
747
+ const Re = [
748
+ "overview",
749
+ "requests",
750
+ "queries",
751
+ "events",
752
+ "routes",
753
+ "logs",
754
+ "emails",
755
+ "cache",
756
+ "jobs",
757
+ "config",
758
+ "internals"
759
+ ], Oe = T(() => import("./OverviewSection-DOMu2qvl.js")), _e = T(() => import("./RequestsSection-CC-eVHsl.js")), je = T(() => import("./QueriesSection-DFsaOSJI.js")), Pe = T(() => import("./EventsSection-CapH5xut.js")), He = T(() => import("./RoutesSection-p1DMq41y.js")), Ue = T(() => import("./LogsSection-ConXdBkL.js")), qe = T(() => import("./EmailsSection-vYx6ExTb.js")), Fe = T(() => import("./CacheSection-DkLtukWz.js")), ze = T(() => import("./JobsSection-ZIQsJWid.js")), Ae = T(() => import("./ConfigSection-DaVbFPDg.js")), We = T(() => import("./InternalsSection-lOv_UcSV.js"));
760
+ function Ye(e) {
761
+ const {
762
+ baseUrl: r = "",
763
+ dashboardEndpoint: t = "/__stats/api",
764
+ debugEndpoint: n,
765
+ authToken: o,
766
+ backUrl: l = "/",
767
+ channelName: b = "server-stats/dashboard"
768
+ } = e, { features: a } = q({ baseUrl: r, debugEndpoint: n, authToken: o }), { theme: v, toggleTheme: m } = F(), [u, d] = w("overview"), f = O(u);
769
+ f.current = u;
770
+ const [g, p] = w(() => typeof window > "u" ? !1 : localStorage.getItem("ss-dash-sidebar") === "collapsed"), [S, R] = w(!1), [I, k] = w(0), y = O(0);
771
+ B(() => {
772
+ if (!b) return;
773
+ const h = ie({
774
+ baseUrl: r,
775
+ channelName: b,
776
+ authToken: o,
777
+ onMessage: () => {
778
+ y.current += 1, k(y.current);
779
+ },
780
+ onConnect: () => R(!0),
781
+ onDisconnect: () => R(!1),
782
+ onError: () => R(!1)
783
+ });
784
+ return () => h.unsubscribe();
785
+ }, [r, b, o]);
786
+ const $ = a.customPanes || [], _ = x(
787
+ (h) => {
788
+ const E = h.replace("#", "").split("?")[0];
789
+ return E && [...Re, ...$.map((J) => J.id)].includes(E) ? E : "overview";
790
+ },
791
+ [$]
792
+ );
793
+ B(() => {
794
+ if (typeof window > "u") return;
795
+ const h = _(window.location.hash);
796
+ (h !== "overview" || window.location.hash) && d(h);
797
+ }, [_]), B(() => {
798
+ const h = () => {
799
+ const E = _(window.location.hash);
800
+ E !== f.current && d(E);
801
+ };
802
+ return window.addEventListener("hashchange", h), () => window.removeEventListener("hashchange", h);
803
+ }, [_]), B(() => {
804
+ typeof window > "u" || (window.location.hash = u);
805
+ }, [u]);
806
+ const N = x(() => {
807
+ p((h) => {
808
+ const E = !h;
809
+ return localStorage.setItem("ss-dash-sidebar", E ? "collapsed" : "expanded"), E;
810
+ });
811
+ }, []), i = D(
812
+ () => [
813
+ { id: "overview", label: "Overview", visible: !0 },
814
+ { id: "requests", label: "Requests", visible: !0 },
815
+ { id: "queries", label: "Queries", visible: !0 },
816
+ { id: "events", label: "Events", visible: !0 },
817
+ { id: "routes", label: "Routes", visible: !0 },
818
+ { id: "logs", label: "Logs", visible: !0 },
819
+ { id: "emails", label: "Emails", visible: !0 },
820
+ { id: "cache", label: "Cache", visible: a.cache },
821
+ { id: "jobs", label: "Jobs", visible: a.queues },
822
+ { id: "config", label: "Config", visible: !0 },
823
+ { id: "internals", label: "Internals", visible: !0 }
824
+ ],
825
+ [a]
826
+ ), L = D(() => i.filter((h) => h.visible), [i]), M = D(
827
+ () => ({ baseUrl: r, dashboardEndpoint: t, authToken: o, refreshKey: I }),
828
+ [r, t, o, I]
829
+ ), { data: j } = De("overview", M), W = D(() => {
830
+ if (!j) return {};
831
+ const h = {};
832
+ if (j.totalRequests > 0 && (h.requests = { count: j.totalRequests }), j.queryStats?.total > 0 && (h.queries = { count: j.queryStats.total }), j.logLevelBreakdown) {
833
+ const E = j.logLevelBreakdown, H = E.error + E.warn + E.info + E.debug;
834
+ H > 0 && (h.logs = { count: H });
835
+ }
836
+ return h;
837
+ }, [j]), K = x(() => {
838
+ const h = {
839
+ overview: /* @__PURE__ */ s(Oe, { options: M }),
840
+ requests: /* @__PURE__ */ s(_e, { options: M }),
841
+ queries: /* @__PURE__ */ s(je, { options: M }),
842
+ events: /* @__PURE__ */ s(Pe, { options: M }),
843
+ routes: /* @__PURE__ */ s(He, { options: M }),
844
+ logs: /* @__PURE__ */ s(Ue, { options: M }),
845
+ emails: /* @__PURE__ */ s(qe, { options: M }),
846
+ cache: /* @__PURE__ */ s(Fe, { options: M }),
847
+ jobs: /* @__PURE__ */ s(ze, { options: M }),
848
+ config: /* @__PURE__ */ s(Ae, { options: M }),
849
+ internals: /* @__PURE__ */ s(We, { options: M, debugEndpoint: n })
850
+ };
851
+ return /* @__PURE__ */ s("div", { className: "ss-dash-pane ss-dash-active", id: `ss-dash-pane-${u}`, children: /* @__PURE__ */ s("div", { className: "ss-dash-pane-inner", children: /* @__PURE__ */ s(z, { fallback: /* @__PURE__ */ s("div", { className: "ss-dash-empty", children: "Loading..." }), children: h[u] || /* @__PURE__ */ s("div", { className: "ss-dash-empty", children: "Unknown section" }) }) }) });
852
+ }, [u, M]);
853
+ return /* @__PURE__ */ c("div", { className: "ss-dash", "data-theme": v, id: "ss-dash", children: [
854
+ /* @__PURE__ */ c("div", { className: "ss-dash-header", children: [
855
+ /* @__PURE__ */ c("div", { className: "ss-dash-header-left", children: [
856
+ /* @__PURE__ */ s("span", { className: "ss-dash-logo", children: "Server Stats" }),
857
+ /* @__PURE__ */ s("span", { className: "ss-dash-logo-sub", children: "Dashboard" })
858
+ ] }),
859
+ /* @__PURE__ */ c("div", { className: "ss-dash-header-center", children: [
860
+ /* @__PURE__ */ s(
861
+ "span",
862
+ {
863
+ className: `ss-dash-live-dot ${S ? "ss-dash-connected" : ""}`,
864
+ id: "ss-dash-live-dot"
865
+ }
866
+ ),
867
+ /* @__PURE__ */ s(
868
+ "span",
869
+ {
870
+ className: `ss-dash-live-label ${S ? "ss-dash-connected" : ""}`,
871
+ id: "ss-dash-live-label",
872
+ children: S ? "Live" : "Polling"
873
+ }
874
+ )
875
+ ] }),
876
+ /* @__PURE__ */ c("div", { className: "ss-dash-header-right", children: [
877
+ /* @__PURE__ */ s(A, { theme: v, onToggle: m }),
878
+ l && /* @__PURE__ */ s("a", { href: l, className: "ss-dash-back-link", title: "Back to app", children: "← App" })
879
+ ] })
880
+ ] }),
881
+ /* @__PURE__ */ c("div", { className: "ss-dash-body", children: [
882
+ /* @__PURE__ */ c(
883
+ "div",
884
+ {
885
+ className: `ss-dash-sidebar ${g ? "ss-dash-collapsed" : ""}`,
886
+ id: "ss-dash-sidebar",
887
+ children: [
888
+ /* @__PURE__ */ c("nav", { className: "ss-dash-nav", role: "tablist", children: [
889
+ L.map((h) => {
890
+ const E = W[h.id];
891
+ return /* @__PURE__ */ c(
892
+ "button",
893
+ {
894
+ type: "button",
895
+ role: "tab",
896
+ "aria-selected": u === h.id,
897
+ className: `ss-dash-nav-item ${u === h.id ? "ss-dash-active" : ""}`,
898
+ "data-ss-section": h.id,
899
+ onClick: () => {
900
+ h.id !== u && d(h.id);
901
+ },
902
+ title: g ? h.label : void 0,
903
+ children: [
904
+ /* @__PURE__ */ s("span", { className: "ss-dash-nav-icon", children: /* @__PURE__ */ s(
905
+ "svg",
906
+ {
907
+ width: "20",
908
+ height: "20",
909
+ viewBox: (C[h.id] || C.config).viewBox,
910
+ fill: "none",
911
+ stroke: "currentColor",
912
+ strokeWidth: "2",
913
+ strokeLinecap: "round",
914
+ strokeLinejoin: "round",
915
+ dangerouslySetInnerHTML: {
916
+ __html: (C[h.id] || C.config).elements.join("")
917
+ }
918
+ }
919
+ ) }),
920
+ /* @__PURE__ */ s("span", { className: "ss-dash-nav-label", children: h.label }),
921
+ E && E.count > 0 && /* @__PURE__ */ s(
922
+ "span",
923
+ {
924
+ className: `ss-dash-nav-badge${E.variant ? " " + E.variant : ""}`,
925
+ children: E.count
926
+ }
927
+ )
928
+ ]
929
+ },
930
+ h.id
931
+ );
932
+ }),
933
+ $.length > 0 && /* @__PURE__ */ s("div", { className: "ss-dash-nav-sep" }),
934
+ $.map((h) => /* @__PURE__ */ c(
935
+ "button",
936
+ {
937
+ type: "button",
938
+ role: "tab",
939
+ "aria-selected": u === h.id,
940
+ className: `ss-dash-nav-item ${u === h.id ? "ss-dash-active" : ""}`,
941
+ onClick: () => d(h.id),
942
+ title: g ? h.label : void 0,
943
+ children: [
944
+ /* @__PURE__ */ s("span", { className: "ss-dash-nav-icon", children: /* @__PURE__ */ s(
945
+ "svg",
946
+ {
947
+ width: "20",
948
+ height: "20",
949
+ viewBox: C["custom-pane"].viewBox,
950
+ fill: "none",
951
+ stroke: "currentColor",
952
+ strokeWidth: "2",
953
+ strokeLinecap: "round",
954
+ strokeLinejoin: "round",
955
+ dangerouslySetInnerHTML: { __html: C["custom-pane"].elements.join("") }
956
+ }
957
+ ) }),
958
+ /* @__PURE__ */ s("span", { className: "ss-dash-nav-label", children: h.label })
959
+ ]
960
+ },
961
+ h.id
962
+ ))
963
+ ] }),
964
+ /* @__PURE__ */ s(
965
+ "button",
966
+ {
967
+ type: "button",
968
+ className: "ss-dash-sidebar-toggle",
969
+ id: "ss-dash-sidebar-toggle",
970
+ onClick: N,
971
+ title: g ? "Expand sidebar" : "Collapse sidebar",
972
+ children: g ? /* @__PURE__ */ s(
973
+ "svg",
974
+ {
975
+ width: "16",
976
+ height: "16",
977
+ viewBox: C["chevron-right"].viewBox,
978
+ fill: "none",
979
+ stroke: "currentColor",
980
+ strokeWidth: "1.5",
981
+ dangerouslySetInnerHTML: { __html: C["chevron-right"].elements.join("") }
982
+ }
983
+ ) : /* @__PURE__ */ s(
984
+ "svg",
985
+ {
986
+ width: "16",
987
+ height: "16",
988
+ viewBox: C["chevron-left"].viewBox,
989
+ fill: "none",
990
+ stroke: "currentColor",
991
+ strokeWidth: "1.5",
992
+ dangerouslySetInnerHTML: { __html: C["chevron-left"].elements.join("") }
993
+ }
994
+ )
995
+ }
996
+ )
997
+ ]
998
+ }
999
+ ),
1000
+ /* @__PURE__ */ s("div", { className: "ss-dash-main", children: K() })
1001
+ ] })
1002
+ ] });
1003
+ }
1004
+ function Ze(e, r = {}) {
1005
+ const { baseUrl: t = "", debugEndpoint: n = "/admin/api/debug", authToken: o } = r, [l, b] = w(null), [a, v] = w(!0), [m, u] = w(null), d = O(null), f = O(null), g = () => new le({
1006
+ baseUrl: t,
1007
+ endpoint: n,
1008
+ authToken: o,
1009
+ onData: (k) => b(k),
1010
+ onLoading: (k) => v(k),
1011
+ onError: (k) => u(k),
1012
+ onUnauthorized: (k) => u(k)
1013
+ }), p = `${t}\0${n}\0${o ?? ""}`;
1014
+ (!d.current || f.current !== p) && (d.current?.stop(), d.current = g(), f.current = p), B(() => {
1015
+ const k = d.current;
1016
+ return k.start(e), () => k.stop();
1017
+ }, [e, p]);
1018
+ const S = x(() => {
1019
+ d.current?.refresh();
1020
+ }, []), R = x(() => {
1021
+ b(null);
1022
+ }, []), I = x((k, y) => {
1023
+ d.current?.cacheForTab(k, y);
1024
+ }, []);
1025
+ return { data: l, isLoading: a, error: m, refresh: S, clearData: R, cacheForTab: I };
1026
+ }
1027
+ function es({
1028
+ color: e = "muted",
1029
+ children: r,
1030
+ className: t = "",
1031
+ classPrefix: n = "ss-dash"
1032
+ }) {
1033
+ return /* @__PURE__ */ s("span", { className: `${n}-badge ${n}-badge-${e} ${t}`, children: r });
1034
+ }
1035
+ function ss({ method: e, className: r = "", classPrefix: t = "ss-dash" }) {
1036
+ return /* @__PURE__ */ s(
1037
+ "span",
1038
+ {
1039
+ className: `${t}-method ${t}-method-${e.toLowerCase()} ${r}`,
1040
+ children: e
1041
+ }
1042
+ );
1043
+ }
1044
+ function ts({ code: e, className: r = "", classPrefix: t = "ss-dash" }) {
1045
+ let n = `${t}-status-2xx`;
1046
+ return e >= 500 ? n = `${t}-status-5xx` : e >= 400 ? n = `${t}-status-4xx` : e >= 300 && (n = `${t}-status-3xx`), /* @__PURE__ */ s("span", { className: `${t}-status ${n} ${r}`, children: e });
1047
+ }
1048
+ function ns({
1049
+ data: e,
1050
+ maxPreviewLength: r = 100,
1051
+ className: t = "",
1052
+ classPrefix: n = "ss-dash",
1053
+ defaultExpanded: o = !1
1054
+ }) {
1055
+ const [l, b] = w(o), a = D(() => {
1056
+ if (typeof e == "string")
1057
+ try {
1058
+ return JSON.parse(e);
1059
+ } catch {
1060
+ return e;
1061
+ }
1062
+ return e;
1063
+ }, [e]), v = D(() => typeof a == "object" && a !== null ? ce(a, r) : String(a ?? "-"), [a, r]), m = D(() => typeof a == "object" && a !== null ? JSON.stringify(a, null, 2) : String(a), [a]), u = x(() => {
1064
+ b((f) => !f);
1065
+ }, []), d = x(async () => {
1066
+ try {
1067
+ await navigator.clipboard.writeText(m);
1068
+ } catch {
1069
+ }
1070
+ }, [m]);
1071
+ return !e && e !== 0 && e !== !1 ? /* @__PURE__ */ s("span", { className: `ss-dim ${n}-c-dim`, children: "-" }) : /* @__PURE__ */ c("div", { className: `${n}-data-cell ${t}`, children: [
1072
+ !l && /* @__PURE__ */ s(
1073
+ "span",
1074
+ {
1075
+ className: `${n}-data-preview`,
1076
+ onClick: u,
1077
+ role: "button",
1078
+ tabIndex: 0,
1079
+ onKeyDown: (f) => f.key === "Enter" && u(),
1080
+ children: v
1081
+ }
1082
+ ),
1083
+ l && /* @__PURE__ */ c("div", { className: `${n}-data-full`, onClick: u, children: [
1084
+ /* @__PURE__ */ s(
1085
+ "button",
1086
+ {
1087
+ className: `${n}-copy-btn`,
1088
+ onClick: (f) => {
1089
+ f.stopPropagation(), d();
1090
+ },
1091
+ title: "Copy to clipboard",
1092
+ type: "button",
1093
+ children: "Copy"
1094
+ }
1095
+ ),
1096
+ /* @__PURE__ */ s("pre", { children: m })
1097
+ ] })
1098
+ ] });
1099
+ }
1100
+ function rs({ content: e, children: r, position: t = "top", className: n = "" }) {
1101
+ const [o, l] = w(!1), [b, a] = w({ left: 0, bottom: 0 }), v = O(null), m = O(null), u = x(() => {
1102
+ l(!0);
1103
+ }, []), d = x(() => {
1104
+ l(!1);
1105
+ }, []);
1106
+ return B(() => {
1107
+ if (!o || !v.current || !m.current) return;
1108
+ const f = v.current.getBoundingClientRect(), g = m.current.getBoundingClientRect();
1109
+ let p = f.left + f.width / 2 - g.width / 2, S;
1110
+ p < 8 && (p = 8), p + g.width > window.innerWidth - 8 && (p = window.innerWidth - 8 - g.width), t === "top" && (S = window.innerHeight - f.top + 8), a({ left: p, bottom: S ?? 0 });
1111
+ }, [o, t]), /* @__PURE__ */ c(
1112
+ "div",
1113
+ {
1114
+ ref: v,
1115
+ className: `ss-tooltip-trigger ${n}`,
1116
+ onMouseEnter: u,
1117
+ onMouseLeave: d,
1118
+ style: { display: "inline-flex", position: "relative" },
1119
+ children: [
1120
+ r,
1121
+ o && /* @__PURE__ */ c(
1122
+ "div",
1123
+ {
1124
+ ref: m,
1125
+ className: "ss-tooltip",
1126
+ style: {
1127
+ position: "fixed",
1128
+ left: `${b.left}px`,
1129
+ bottom: t === "top" ? `${b.bottom}px` : void 0,
1130
+ zIndex: 200,
1131
+ pointerEvents: "none"
1132
+ },
1133
+ children: [
1134
+ /* @__PURE__ */ s("div", { className: "ss-tooltip-inner", children: e }),
1135
+ /* @__PURE__ */ s("div", { className: "ss-tooltip-arrow" })
1136
+ ]
1137
+ }
1138
+ )
1139
+ ]
1140
+ }
1141
+ );
1142
+ }
1143
+ export {
1144
+ es as B,
1145
+ Ye as D,
1146
+ ns as J,
1147
+ ss as M,
1148
+ ts as S,
1149
+ A as T,
1150
+ De as a,
1151
+ he as b,
1152
+ Xe as c,
1153
+ Qe as d,
1154
+ rs as e,
1155
+ q as f,
1156
+ ue as g,
1157
+ F as h,
1158
+ Ze as u
1159
+ };