@payez/next-mvp 4.0.0 → 4.0.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 (459) hide show
  1. package/package.json +6 -16
  2. package/dist/api/auth-handler.d.ts +0 -66
  3. package/dist/api/auth-handler.js +0 -397
  4. package/dist/api/index.d.ts +0 -10
  5. package/dist/api/index.js +0 -19
  6. package/dist/api-handlers/account/change-password.d.ts +0 -9
  7. package/dist/api-handlers/account/change-password.js +0 -110
  8. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  9. package/dist/api-handlers/account/masked-info.js +0 -41
  10. package/dist/api-handlers/account/profile.d.ts +0 -3
  11. package/dist/api-handlers/account/profile.js +0 -63
  12. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  13. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  14. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  15. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  16. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  17. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  18. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  19. package/dist/api-handlers/account/reset-password.js +0 -26
  20. package/dist/api-handlers/account/send-code.d.ts +0 -24
  21. package/dist/api-handlers/account/send-code.js +0 -60
  22. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  23. package/dist/api-handlers/account/update-phone.js +0 -64
  24. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  25. package/dist/api-handlers/account/validate-password.js +0 -81
  26. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  27. package/dist/api-handlers/account/verify-email.js +0 -106
  28. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  29. package/dist/api-handlers/account/verify-sms.js +0 -106
  30. package/dist/api-handlers/admin/analytics.d.ts +0 -19
  31. package/dist/api-handlers/admin/analytics.js +0 -378
  32. package/dist/api-handlers/admin/audit.d.ts +0 -19
  33. package/dist/api-handlers/admin/audit.js +0 -213
  34. package/dist/api-handlers/admin/index.d.ts +0 -21
  35. package/dist/api-handlers/admin/index.js +0 -42
  36. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -35
  37. package/dist/api-handlers/admin/redis-sessions.js +0 -203
  38. package/dist/api-handlers/admin/sessions.d.ts +0 -20
  39. package/dist/api-handlers/admin/sessions.js +0 -283
  40. package/dist/api-handlers/admin/site-logs.d.ts +0 -45
  41. package/dist/api-handlers/admin/site-logs.js +0 -317
  42. package/dist/api-handlers/admin/stats.d.ts +0 -20
  43. package/dist/api-handlers/admin/stats.js +0 -239
  44. package/dist/api-handlers/admin/users.d.ts +0 -19
  45. package/dist/api-handlers/admin/users.js +0 -221
  46. package/dist/api-handlers/admin/vibe-data.d.ts +0 -79
  47. package/dist/api-handlers/admin/vibe-data.js +0 -267
  48. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  49. package/dist/api-handlers/anon/preferences.js +0 -96
  50. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  51. package/dist/api-handlers/auth/jwks.js +0 -24
  52. package/dist/api-handlers/auth/login.d.ts +0 -42
  53. package/dist/api-handlers/auth/login.js +0 -178
  54. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  55. package/dist/api-handlers/auth/refresh.js +0 -633
  56. package/dist/api-handlers/auth/signout.d.ts +0 -37
  57. package/dist/api-handlers/auth/signout.js +0 -186
  58. package/dist/api-handlers/auth/status.d.ts +0 -8
  59. package/dist/api-handlers/auth/status.js +0 -23
  60. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  61. package/dist/api-handlers/auth/update-session.js +0 -93
  62. package/dist/api-handlers/auth/validate.d.ts +0 -6
  63. package/dist/api-handlers/auth/validate.js +0 -43
  64. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  65. package/dist/api-handlers/auth/verify-code.js +0 -90
  66. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  67. package/dist/api-handlers/session/refresh-viability.js +0 -39
  68. package/dist/api-handlers/session/viability.d.ts +0 -13
  69. package/dist/api-handlers/session/viability.js +0 -114
  70. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  71. package/dist/api-handlers/test/force-expire.js +0 -59
  72. package/dist/auth/auth-decision.d.ts +0 -39
  73. package/dist/auth/auth-decision.js +0 -182
  74. package/dist/auth/auth-options.d.ts +0 -57
  75. package/dist/auth/auth-options.js +0 -213
  76. package/dist/auth/better-auth.d.ts +0 -79
  77. package/dist/auth/better-auth.js +0 -119
  78. package/dist/auth/callbacks/index.d.ts +0 -6
  79. package/dist/auth/callbacks/index.js +0 -12
  80. package/dist/auth/callbacks/jwt.d.ts +0 -45
  81. package/dist/auth/callbacks/jwt.js +0 -305
  82. package/dist/auth/callbacks/session.d.ts +0 -60
  83. package/dist/auth/callbacks/session.js +0 -170
  84. package/dist/auth/callbacks/signin.d.ts +0 -23
  85. package/dist/auth/callbacks/signin.js +0 -44
  86. package/dist/auth/events/index.d.ts +0 -4
  87. package/dist/auth/events/index.js +0 -8
  88. package/dist/auth/events/signout.d.ts +0 -17
  89. package/dist/auth/events/signout.js +0 -32
  90. package/dist/auth/providers/credentials.d.ts +0 -32
  91. package/dist/auth/providers/credentials.js +0 -223
  92. package/dist/auth/providers/index.d.ts +0 -5
  93. package/dist/auth/providers/index.js +0 -21
  94. package/dist/auth/providers/oauth.d.ts +0 -26
  95. package/dist/auth/providers/oauth.js +0 -105
  96. package/dist/auth/route-config.d.ts +0 -66
  97. package/dist/auth/route-config.js +0 -190
  98. package/dist/auth/types/auth-types.d.ts +0 -417
  99. package/dist/auth/types/auth-types.js +0 -53
  100. package/dist/auth/types/index.d.ts +0 -6
  101. package/dist/auth/types/index.js +0 -22
  102. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  103. package/dist/auth/unauthenticated-routes.js +0 -19
  104. package/dist/auth/utils/idp-client.d.ts +0 -94
  105. package/dist/auth/utils/idp-client.js +0 -384
  106. package/dist/auth/utils/index.d.ts +0 -5
  107. package/dist/auth/utils/index.js +0 -21
  108. package/dist/auth/utils/token-utils.d.ts +0 -83
  109. package/dist/auth/utils/token-utils.js +0 -218
  110. package/dist/client/AuthContext.d.ts +0 -19
  111. package/dist/client/AuthContext.js +0 -115
  112. package/dist/client/better-auth-client.d.ts +0 -1020
  113. package/dist/client/better-auth-client.js +0 -68
  114. package/dist/client/fetch-with-auth.d.ts +0 -11
  115. package/dist/client/fetch-with-auth.js +0 -44
  116. package/dist/client/fetchWithSession.d.ts +0 -3
  117. package/dist/client/fetchWithSession.js +0 -24
  118. package/dist/client/index.d.ts +0 -9
  119. package/dist/client/index.js +0 -20
  120. package/dist/client/useAnonSession.d.ts +0 -36
  121. package/dist/client/useAnonSession.js +0 -99
  122. package/dist/components/SessionSync.d.ts +0 -13
  123. package/dist/components/SessionSync.js +0 -121
  124. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  125. package/dist/components/SignalRHealthCheck.js +0 -97
  126. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  127. package/dist/components/account/MobileNavDrawer.js +0 -81
  128. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  129. package/dist/components/account/UserAvatarMenu.js +0 -91
  130. package/dist/components/account/index.d.ts +0 -9
  131. package/dist/components/account/index.js +0 -13
  132. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  133. package/dist/components/admin/AlertSettingsTab.js +0 -351
  134. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  135. package/dist/components/admin/AnalyticsTab.js +0 -167
  136. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  137. package/dist/components/admin/DataBrowserTab.js +0 -252
  138. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  139. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  140. package/dist/components/admin/SessionsTab.d.ts +0 -37
  141. package/dist/components/admin/SessionsTab.js +0 -165
  142. package/dist/components/admin/StatsTab.d.ts +0 -53
  143. package/dist/components/admin/StatsTab.js +0 -161
  144. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  145. package/dist/components/admin/VibeAdminContext.js +0 -38
  146. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  147. package/dist/components/admin/VibeAdminLayout.js +0 -71
  148. package/dist/components/admin/index.d.ts +0 -29
  149. package/dist/components/admin/index.js +0 -44
  150. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  151. package/dist/components/auth/FederatedAuthSection.js +0 -45
  152. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  153. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  154. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  155. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  156. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  157. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  158. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  159. package/dist/components/recovery/CompleteStep.js +0 -8
  160. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  161. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  162. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  163. package/dist/components/recovery/SelectMethodStep.js +0 -8
  164. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  165. package/dist/components/recovery/SetPasswordStep.js +0 -20
  166. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  167. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  168. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  169. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  170. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  171. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  172. package/dist/components/ui/BetaBadge.d.ts +0 -29
  173. package/dist/components/ui/BetaBadge.js +0 -38
  174. package/dist/components/ui/Footer.d.ts +0 -37
  175. package/dist/components/ui/Footer.js +0 -41
  176. package/dist/config/env.d.ts +0 -66
  177. package/dist/config/env.js +0 -57
  178. package/dist/config/logger.d.ts +0 -57
  179. package/dist/config/logger.js +0 -73
  180. package/dist/config/logging-config.d.ts +0 -30
  181. package/dist/config/logging-config.js +0 -122
  182. package/dist/config/unauthenticated-routes.d.ts +0 -17
  183. package/dist/config/unauthenticated-routes.js +0 -24
  184. package/dist/config/vibe-log-transport.d.ts +0 -81
  185. package/dist/config/vibe-log-transport.js +0 -212
  186. package/dist/edge/internal-api-url.d.ts +0 -53
  187. package/dist/edge/internal-api-url.js +0 -63
  188. package/dist/edge/middleware.d.ts +0 -14
  189. package/dist/edge/middleware.js +0 -32
  190. package/dist/hooks/useAuth.d.ts +0 -23
  191. package/dist/hooks/useAuth.js +0 -83
  192. package/dist/hooks/useAuthSettings.d.ts +0 -59
  193. package/dist/hooks/useAuthSettings.js +0 -93
  194. package/dist/hooks/useAvailableProviders.d.ts +0 -43
  195. package/dist/hooks/useAvailableProviders.js +0 -112
  196. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  197. package/dist/hooks/usePasswordValidation.js +0 -102
  198. package/dist/hooks/useProfile.d.ts +0 -15
  199. package/dist/hooks/useProfile.js +0 -59
  200. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  201. package/dist/hooks/usePublicAuthSettings.js +0 -131
  202. package/dist/hooks/useSessionExpiration.d.ts +0 -56
  203. package/dist/hooks/useSessionExpiration.js +0 -72
  204. package/dist/hooks/useViabilitySession.d.ts +0 -75
  205. package/dist/hooks/useViabilitySession.js +0 -269
  206. package/dist/index.d.ts +0 -12
  207. package/dist/index.js +0 -53
  208. package/dist/lib/anon-session.d.ts +0 -74
  209. package/dist/lib/anon-session.js +0 -169
  210. package/dist/lib/api-handler.d.ts +0 -123
  211. package/dist/lib/api-handler.js +0 -478
  212. package/dist/lib/app-slug.d.ts +0 -95
  213. package/dist/lib/app-slug.js +0 -172
  214. package/dist/lib/demo-mode.d.ts +0 -6
  215. package/dist/lib/demo-mode.js +0 -16
  216. package/dist/lib/geolocation.d.ts +0 -64
  217. package/dist/lib/geolocation.js +0 -235
  218. package/dist/lib/idp-client-config.d.ts +0 -75
  219. package/dist/lib/idp-client-config.js +0 -425
  220. package/dist/lib/idp-fetch.d.ts +0 -14
  221. package/dist/lib/idp-fetch.js +0 -91
  222. package/dist/lib/internal-api.d.ts +0 -87
  223. package/dist/lib/internal-api.js +0 -122
  224. package/dist/lib/jwt-decode-client.d.ts +0 -10
  225. package/dist/lib/jwt-decode-client.js +0 -46
  226. package/dist/lib/jwt-decode.d.ts +0 -48
  227. package/dist/lib/jwt-decode.js +0 -57
  228. package/dist/lib/nextauth-secret.d.ts +0 -10
  229. package/dist/lib/nextauth-secret.js +0 -100
  230. package/dist/lib/rate-limit-service.d.ts +0 -23
  231. package/dist/lib/rate-limit-service.js +0 -6
  232. package/dist/lib/redis.d.ts +0 -5
  233. package/dist/lib/redis.js +0 -28
  234. package/dist/lib/refresh-token-validator.d.ts +0 -13
  235. package/dist/lib/refresh-token-validator.js +0 -117
  236. package/dist/lib/roles.d.ts +0 -145
  237. package/dist/lib/roles.js +0 -168
  238. package/dist/lib/secret-validation.d.ts +0 -4
  239. package/dist/lib/secret-validation.js +0 -14
  240. package/dist/lib/session-store.d.ts +0 -170
  241. package/dist/lib/session-store.js +0 -545
  242. package/dist/lib/session.d.ts +0 -21
  243. package/dist/lib/session.js +0 -26
  244. package/dist/lib/site-logger.d.ts +0 -214
  245. package/dist/lib/site-logger.js +0 -210
  246. package/dist/lib/standardized-client-api.d.ts +0 -161
  247. package/dist/lib/standardized-client-api.js +0 -791
  248. package/dist/lib/startup-init.d.ts +0 -40
  249. package/dist/lib/startup-init.js +0 -257
  250. package/dist/lib/test-aware-get-token.d.ts +0 -2
  251. package/dist/lib/test-aware-get-token.js +0 -86
  252. package/dist/lib/token-expiry.d.ts +0 -14
  253. package/dist/lib/token-expiry.js +0 -39
  254. package/dist/lib/token-lifecycle.d.ts +0 -78
  255. package/dist/lib/token-lifecycle.js +0 -360
  256. package/dist/lib/types/api-responses.d.ts +0 -128
  257. package/dist/lib/types/api-responses.js +0 -171
  258. package/dist/lib/user-agent-parser.d.ts +0 -50
  259. package/dist/lib/user-agent-parser.js +0 -220
  260. package/dist/logging/api/admin-analytics.d.ts +0 -3
  261. package/dist/logging/api/admin-analytics.js +0 -45
  262. package/dist/logging/api/audit-log.d.ts +0 -3
  263. package/dist/logging/api/audit-log.js +0 -52
  264. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  265. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  266. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  267. package/dist/logging/components/AuditLogViewer.js +0 -51
  268. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  269. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  270. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  271. package/dist/logging/components/HealthMetricsCard.js +0 -19
  272. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  273. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  274. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  275. package/dist/logging/hooks/useAuditLog.js +0 -25
  276. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  277. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  278. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  279. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  280. package/dist/logging/index.d.ts +0 -11
  281. package/dist/logging/index.js +0 -40
  282. package/dist/logging/types/analytics.d.ts +0 -68
  283. package/dist/logging/types/analytics.js +0 -3
  284. package/dist/logging/types/audit.d.ts +0 -29
  285. package/dist/logging/types/audit.js +0 -2
  286. package/dist/logging/types/index.d.ts +0 -2
  287. package/dist/logging/types/index.js +0 -19
  288. package/dist/middleware/auth-decision.d.ts +0 -33
  289. package/dist/middleware/auth-decision.js +0 -65
  290. package/dist/middleware/create-middleware.d.ts +0 -102
  291. package/dist/middleware/create-middleware.js +0 -469
  292. package/dist/middleware/rbac-check.d.ts +0 -51
  293. package/dist/middleware/rbac-check.js +0 -219
  294. package/dist/middleware/twofa-presets.d.ts +0 -134
  295. package/dist/middleware/twofa-presets.js +0 -175
  296. package/dist/models/DecodedAccessToken.d.ts +0 -17
  297. package/dist/models/DecodedAccessToken.js +0 -2
  298. package/dist/models/SessionModel.d.ts +0 -122
  299. package/dist/models/SessionModel.js +0 -136
  300. package/dist/pages/admin-login/page.d.ts +0 -31
  301. package/dist/pages/admin-login/page.js +0 -73
  302. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  303. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  304. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  305. package/dist/pages/admin-page-permissions/index.js +0 -13
  306. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  307. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  308. package/dist/pages/admin-roles/index.d.ts +0 -8
  309. package/dist/pages/admin-roles/index.js +0 -15
  310. package/dist/pages/admin-roles/modals.d.ts +0 -72
  311. package/dist/pages/admin-roles/modals.js +0 -154
  312. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  313. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -179
  314. package/dist/pages/client-admin/index.d.ts +0 -32
  315. package/dist/pages/client-admin/index.js +0 -37
  316. package/dist/pages/coming-soon/page.d.ts +0 -8
  317. package/dist/pages/coming-soon/page.js +0 -28
  318. package/dist/pages/login/page.d.ts +0 -22
  319. package/dist/pages/login/page.js +0 -230
  320. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  321. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  322. package/dist/pages/profile/index.d.ts +0 -8
  323. package/dist/pages/profile/index.js +0 -16
  324. package/dist/pages/profile/page.d.ts +0 -19
  325. package/dist/pages/profile/page.js +0 -47
  326. package/dist/pages/profile/profile-patch.d.ts +0 -1
  327. package/dist/pages/profile/profile-patch.js +0 -281
  328. package/dist/pages/recovery/page.d.ts +0 -1
  329. package/dist/pages/recovery/page.js +0 -142
  330. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  331. package/dist/pages/roles/MyRolesPage.js +0 -71
  332. package/dist/pages/roles/components.d.ts +0 -63
  333. package/dist/pages/roles/components.js +0 -108
  334. package/dist/pages/roles/index.d.ts +0 -8
  335. package/dist/pages/roles/index.js +0 -19
  336. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  337. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  338. package/dist/pages/security/index.d.ts +0 -8
  339. package/dist/pages/security/index.js +0 -16
  340. package/dist/pages/security/page.d.ts +0 -21
  341. package/dist/pages/security/page.js +0 -212
  342. package/dist/pages/security/security-patch.d.ts +0 -1
  343. package/dist/pages/security/security-patch.js +0 -302
  344. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  345. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  346. package/dist/pages/settings/index.d.ts +0 -8
  347. package/dist/pages/settings/index.js +0 -16
  348. package/dist/pages/settings/page.d.ts +0 -7
  349. package/dist/pages/settings/page.js +0 -26
  350. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  351. package/dist/pages/showcase/ShowcasePage.js +0 -142
  352. package/dist/pages/showcase/index.d.ts +0 -12
  353. package/dist/pages/showcase/index.js +0 -17
  354. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  355. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -99
  356. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  357. package/dist/pages/test-env/JwtInspectPage.js +0 -116
  358. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  359. package/dist/pages/test-env/RefreshTokenPage.js +0 -93
  360. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  361. package/dist/pages/test-env/TestEnvPage.js +0 -51
  362. package/dist/pages/test-env/index.d.ts +0 -24
  363. package/dist/pages/test-env/index.js +0 -32
  364. package/dist/pages/verify-code/page.d.ts +0 -30
  365. package/dist/pages/verify-code/page.js +0 -412
  366. package/dist/routes/account/index.d.ts +0 -28
  367. package/dist/routes/account/index.js +0 -71
  368. package/dist/routes/account/masked-info.d.ts +0 -33
  369. package/dist/routes/account/masked-info.js +0 -39
  370. package/dist/routes/account/send-code.d.ts +0 -37
  371. package/dist/routes/account/send-code.js +0 -42
  372. package/dist/routes/account/update-phone.d.ts +0 -13
  373. package/dist/routes/account/update-phone.js +0 -17
  374. package/dist/routes/account/verify-email.d.ts +0 -38
  375. package/dist/routes/account/verify-email.js +0 -43
  376. package/dist/routes/account/verify-sms.d.ts +0 -38
  377. package/dist/routes/account/verify-sms.js +0 -43
  378. package/dist/routes/auth/index.d.ts +0 -19
  379. package/dist/routes/auth/index.js +0 -64
  380. package/dist/routes/auth/logout.d.ts +0 -31
  381. package/dist/routes/auth/logout.js +0 -98
  382. package/dist/routes/auth/nextauth.d.ts +0 -22
  383. package/dist/routes/auth/nextauth.js +0 -40
  384. package/dist/routes/auth/refresh.d.ts +0 -30
  385. package/dist/routes/auth/refresh.js +0 -51
  386. package/dist/routes/auth/session.d.ts +0 -43
  387. package/dist/routes/auth/session.js +0 -157
  388. package/dist/routes/auth/settings.d.ts +0 -25
  389. package/dist/routes/auth/settings.js +0 -55
  390. package/dist/routes/auth/viability.d.ts +0 -52
  391. package/dist/routes/auth/viability.js +0 -190
  392. package/dist/routes/index.d.ts +0 -12
  393. package/dist/routes/index.js +0 -54
  394. package/dist/routes/session/index.d.ts +0 -6
  395. package/dist/routes/session/index.js +0 -10
  396. package/dist/routes/session/refresh-viability.d.ts +0 -16
  397. package/dist/routes/session/refresh-viability.js +0 -20
  398. package/dist/server/auth-guard.d.ts +0 -46
  399. package/dist/server/auth-guard.js +0 -128
  400. package/dist/server/auth.d.ts +0 -50
  401. package/dist/server/auth.js +0 -62
  402. package/dist/server/decode-session.d.ts +0 -30
  403. package/dist/server/decode-session.js +0 -78
  404. package/dist/server/slim-middleware.d.ts +0 -23
  405. package/dist/server/slim-middleware.js +0 -89
  406. package/dist/server/with-auth.d.ts +0 -33
  407. package/dist/server/with-auth.js +0 -59
  408. package/dist/services/signalrActivityService.d.ts +0 -44
  409. package/dist/services/signalrActivityService.js +0 -257
  410. package/dist/stores/authStore.d.ts +0 -154
  411. package/dist/stores/authStore.js +0 -1527
  412. package/dist/theme/ThemeProvider.d.ts +0 -14
  413. package/dist/theme/ThemeProvider.js +0 -28
  414. package/dist/theme/default.d.ts +0 -8
  415. package/dist/theme/default.js +0 -33
  416. package/dist/theme/index.d.ts +0 -15
  417. package/dist/theme/index.js +0 -25
  418. package/dist/theme/types.d.ts +0 -56
  419. package/dist/theme/types.js +0 -8
  420. package/dist/theme/useTheme.d.ts +0 -60
  421. package/dist/theme/useTheme.js +0 -63
  422. package/dist/theme/utils.d.ts +0 -13
  423. package/dist/theme/utils.js +0 -39
  424. package/dist/types/api.d.ts +0 -134
  425. package/dist/types/api.js +0 -44
  426. package/dist/types/auth.d.ts +0 -19
  427. package/dist/types/auth.js +0 -2
  428. package/dist/types/logging.d.ts +0 -42
  429. package/dist/types/logging.js +0 -2
  430. package/dist/types/recovery.d.ts +0 -48
  431. package/dist/types/recovery.js +0 -2
  432. package/dist/types/security.d.ts +0 -1
  433. package/dist/types/security.js +0 -2
  434. package/dist/utils/api.d.ts +0 -85
  435. package/dist/utils/api.js +0 -287
  436. package/dist/utils/circuitBreaker.d.ts +0 -43
  437. package/dist/utils/circuitBreaker.js +0 -91
  438. package/dist/utils/error-message.d.ts +0 -1
  439. package/dist/utils/error-message.js +0 -103
  440. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  441. package/dist/utils/layout/reservedSpace.js +0 -102
  442. package/dist/utils/logout.d.ts +0 -14
  443. package/dist/utils/logout.js +0 -32
  444. package/dist/vibe/client.d.ts +0 -261
  445. package/dist/vibe/client.js +0 -445
  446. package/dist/vibe/enterprise-auth.d.ts +0 -106
  447. package/dist/vibe/enterprise-auth.js +0 -173
  448. package/dist/vibe/errors.d.ts +0 -83
  449. package/dist/vibe/errors.js +0 -146
  450. package/dist/vibe/generic.d.ts +0 -234
  451. package/dist/vibe/generic.js +0 -369
  452. package/dist/vibe/hooks/index.d.ts +0 -169
  453. package/dist/vibe/hooks/index.js +0 -252
  454. package/dist/vibe/index.d.ts +0 -25
  455. package/dist/vibe/index.js +0 -72
  456. package/dist/vibe/sessions.d.ts +0 -161
  457. package/dist/vibe/sessions.js +0 -391
  458. package/dist/vibe/types.d.ts +0 -353
  459. package/dist/vibe/types.js +0 -315
@@ -1,339 +0,0 @@
1
- "use strict";
2
- /**
3
- * =============================================================================
4
- * VIBE ADMIN LOGGING SETTINGS TAB
5
- * =============================================================================
6
- *
7
- * Admin UI for managing log levels, retention, and storage limits.
8
- * Provides environment presets, per-category levels, and manual pruning.
9
- *
10
- * =============================================================================
11
- */
12
- 'use client';
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.LoggingSettingsTab = LoggingSettingsTab;
15
- const jsx_runtime_1 = require("react/jsx-runtime");
16
- const react_1 = require("react");
17
- const lucide_react_1 = require("lucide-react");
18
- // -----------------------------------------------------------------------------
19
- // CONSTANTS
20
- // -----------------------------------------------------------------------------
21
- const LOG_LEVELS = [
22
- { value: 'debug', label: 'Debug', color: 'text-gray-400' },
23
- { value: 'info', label: 'Info', color: 'text-blue-400' },
24
- { value: 'warn', label: 'Warning', color: 'text-amber-400' },
25
- { value: 'error', label: 'Error', color: 'text-red-400' },
26
- { value: 'critical', label: 'Critical', color: 'text-red-500' },
27
- ];
28
- const PRESETS = [
29
- {
30
- id: 'development',
31
- label: 'Development',
32
- description: 'Verbose logging for debugging',
33
- levels: { api: 'debug', auth: 'debug', database: 'info', agent: 'debug', system: 'info' },
34
- },
35
- {
36
- id: 'production',
37
- label: 'Production',
38
- description: 'Minimal logging for performance',
39
- levels: { api: 'warn', auth: 'info', database: 'error', agent: 'info', system: 'warn' },
40
- },
41
- {
42
- id: 'troubleshooting',
43
- label: 'Troubleshooting',
44
- description: 'Maximum verbosity for issue diagnosis',
45
- levels: { api: 'debug', auth: 'debug', database: 'debug', agent: 'debug', system: 'debug' },
46
- },
47
- ];
48
- const CATEGORIES = [
49
- { id: 'api', label: 'API', description: 'Request/response logging' },
50
- { id: 'auth', label: 'Authentication', description: 'Login, logout, token events' },
51
- { id: 'database', label: 'Database', description: 'Query and connection logging' },
52
- { id: 'agent', label: 'Agent', description: 'AI agent execution logs' },
53
- { id: 'system', label: 'System', description: 'Infrastructure and health events' },
54
- ];
55
- const RETENTION_DEFAULTS = {
56
- debug_days: 7,
57
- info_days: 30,
58
- warn_days: 60,
59
- error_days: 90,
60
- critical_days: 180,
61
- };
62
- const PRUNE_OPTIONS = [
63
- { value: 'debug_all', label: 'Clear all Debug logs' },
64
- { value: 'older_7', label: 'Clear logs older than 7 days' },
65
- { value: 'older_30', label: 'Clear logs older than 30 days' },
66
- { value: 'all_keep_100', label: 'Clear all (keep last 100)' },
67
- ];
68
- // -----------------------------------------------------------------------------
69
- // COMPONENT
70
- // -----------------------------------------------------------------------------
71
- function LoggingSettingsTab({ isDark = true, apiBasePath = '/api/admin/logging', onSave, }) {
72
- const [settings, setSettings] = (0, react_1.useState)(null);
73
- const [usage, setUsage] = (0, react_1.useState)(null);
74
- const [loading, setLoading] = (0, react_1.useState)(true);
75
- const [saving, setSaving] = (0, react_1.useState)(false);
76
- const [pruning, setPruning] = (0, react_1.useState)(false);
77
- const [error, setError] = (0, react_1.useState)(null);
78
- const [successMessage, setSuccessMessage] = (0, react_1.useState)(null);
79
- const [hasChanges, setHasChanges] = (0, react_1.useState)(false);
80
- // Edited state (local changes before save)
81
- const [editedLevels, setEditedLevels] = (0, react_1.useState)(null);
82
- const [editedRetention, setEditedRetention] = (0, react_1.useState)(null);
83
- const [editedLimits, setEditedLimits] = (0, react_1.useState)(null);
84
- const themeClasses = {
85
- bg: isDark ? 'bg-slate-950' : 'bg-gray-50',
86
- cardBg: isDark ? 'bg-slate-800 border-slate-700' : 'bg-white border-gray-200 shadow-sm',
87
- textPrimary: isDark ? 'text-white' : 'text-gray-900',
88
- textSecondary: isDark ? 'text-gray-400' : 'text-gray-600',
89
- textMuted: isDark ? 'text-gray-500' : 'text-gray-500',
90
- inputBg: isDark ? 'bg-slate-900 border-slate-600' : 'bg-white border-gray-300',
91
- hoverBg: isDark ? 'hover:bg-slate-700' : 'hover:bg-gray-100',
92
- };
93
- // Fetch settings
94
- const fetchSettings = (0, react_1.useCallback)(async () => {
95
- setLoading(true);
96
- setError(null);
97
- try {
98
- const res = await fetch(`${apiBasePath}/settings`);
99
- if (res.ok) {
100
- const data = await res.json();
101
- setSettings(data);
102
- setEditedLevels(data.levels);
103
- setEditedRetention(data.retention);
104
- setEditedLimits(data.limits);
105
- if (data.current_usage) {
106
- setUsage(data.current_usage);
107
- }
108
- }
109
- else if (res.status === 404) {
110
- // Endpoint not ready - use defaults
111
- const defaults = {
112
- levels: PRESETS[1].levels, // Production defaults
113
- retention: RETENTION_DEFAULTS,
114
- limits: { max_size_mb: 10, max_rows: 20000 },
115
- };
116
- setSettings(defaults);
117
- setEditedLevels(defaults.levels);
118
- setEditedRetention(defaults.retention);
119
- setEditedLimits(defaults.limits);
120
- }
121
- else {
122
- throw new Error('Failed to fetch settings');
123
- }
124
- }
125
- catch (err) {
126
- setError(err.message);
127
- }
128
- finally {
129
- setLoading(false);
130
- }
131
- }, [apiBasePath]);
132
- // Fetch usage separately (can be more frequent)
133
- const fetchUsage = (0, react_1.useCallback)(async () => {
134
- try {
135
- const res = await fetch(`${apiBasePath}/usage`);
136
- if (res.ok) {
137
- const data = await res.json();
138
- setUsage(data);
139
- }
140
- }
141
- catch (err) {
142
- console.error('Failed to fetch usage:', err);
143
- }
144
- }, [apiBasePath]);
145
- (0, react_1.useEffect)(() => {
146
- fetchSettings();
147
- }, [fetchSettings]);
148
- // Check for changes
149
- (0, react_1.useEffect)(() => {
150
- if (!settings || !editedLevels || !editedRetention || !editedLimits) {
151
- setHasChanges(false);
152
- return;
153
- }
154
- const levelsChanged = JSON.stringify(settings.levels) !== JSON.stringify(editedLevels);
155
- const retentionChanged = JSON.stringify(settings.retention) !== JSON.stringify(editedRetention);
156
- const limitsChanged = JSON.stringify(settings.limits) !== JSON.stringify(editedLimits);
157
- setHasChanges(levelsChanged || retentionChanged || limitsChanged);
158
- }, [settings, editedLevels, editedRetention, editedLimits]);
159
- // Apply preset
160
- const applyPreset = async (presetId) => {
161
- const preset = PRESETS.find(p => p.id === presetId);
162
- if (!preset)
163
- return;
164
- setEditedLevels(preset.levels);
165
- try {
166
- const res = await fetch(`${apiBasePath}/preset`, {
167
- method: 'POST',
168
- headers: { 'Content-Type': 'application/json' },
169
- body: JSON.stringify({ preset: presetId }),
170
- });
171
- if (res.ok) {
172
- setSuccessMessage(`Applied ${preset.label} preset`);
173
- setTimeout(() => setSuccessMessage(null), 3000);
174
- fetchSettings();
175
- }
176
- }
177
- catch (err) {
178
- // Preset applied locally even if API fails
179
- console.error('Failed to apply preset:', err);
180
- }
181
- };
182
- // Save settings
183
- const saveSettings = async () => {
184
- if (!hasChanges || !editedLevels || !editedRetention || !editedLimits)
185
- return;
186
- setSaving(true);
187
- setError(null);
188
- try {
189
- const payload = {
190
- levels: editedLevels,
191
- retention: editedRetention,
192
- limits: editedLimits,
193
- };
194
- const res = await fetch(`${apiBasePath}/settings`, {
195
- method: 'PUT',
196
- headers: { 'Content-Type': 'application/json' },
197
- body: JSON.stringify(payload),
198
- });
199
- if (res.ok) {
200
- setSuccessMessage('Settings saved successfully');
201
- setTimeout(() => setSuccessMessage(null), 3000);
202
- onSave?.(payload);
203
- fetchSettings();
204
- }
205
- else if (res.status === 404) {
206
- // Endpoint not ready - simulate success
207
- setSettings({
208
- levels: editedLevels,
209
- retention: editedRetention,
210
- limits: editedLimits,
211
- });
212
- setSuccessMessage('Settings saved (demo mode)');
213
- setTimeout(() => setSuccessMessage(null), 3000);
214
- }
215
- else {
216
- throw new Error('Failed to save settings');
217
- }
218
- }
219
- catch (err) {
220
- setError(err.message);
221
- }
222
- finally {
223
- setSaving(false);
224
- }
225
- };
226
- // Manual prune
227
- const handlePrune = async (option) => {
228
- setPruning(true);
229
- setError(null);
230
- try {
231
- let body = {};
232
- switch (option) {
233
- case 'debug_all':
234
- body = { level: 'debug' };
235
- break;
236
- case 'older_7':
237
- body = { older_than_days: 7 };
238
- break;
239
- case 'older_30':
240
- body = { older_than_days: 30 };
241
- break;
242
- case 'all_keep_100':
243
- body = { older_than_days: 0 }; // Server interprets as "all"
244
- break;
245
- }
246
- const res = await fetch(`${apiBasePath}/prune`, {
247
- method: 'POST',
248
- headers: { 'Content-Type': 'application/json' },
249
- body: JSON.stringify(body),
250
- });
251
- if (res.ok) {
252
- const data = await res.json();
253
- setSuccessMessage(`Pruned ${data.deleted_rows?.toLocaleString() || 'some'} rows`);
254
- setTimeout(() => setSuccessMessage(null), 3000);
255
- fetchUsage();
256
- }
257
- else if (res.status === 404) {
258
- setSuccessMessage('Prune completed (demo mode)');
259
- setTimeout(() => setSuccessMessage(null), 3000);
260
- }
261
- else {
262
- throw new Error('Failed to prune logs');
263
- }
264
- }
265
- catch (err) {
266
- setError(err.message);
267
- }
268
- finally {
269
- setPruning(false);
270
- }
271
- };
272
- // Get active preset
273
- const getActivePreset = () => {
274
- if (!editedLevels)
275
- return null;
276
- return PRESETS.find(p => JSON.stringify(p.levels) === JSON.stringify(editedLevels))?.id || null;
277
- };
278
- if (loading) {
279
- return ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center py-12", children: (0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { className: "w-8 h-8 animate-spin text-indigo-500" }) }));
280
- }
281
- return ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-6", children: [error && ((0, jsx_runtime_1.jsxs)("div", { className: `flex items-center gap-3 p-4 rounded-lg ${isDark ? 'bg-red-900/30 border-red-700' : 'bg-red-50 border-red-300'} border`, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.AlertCircle, { className: isDark ? 'text-red-400' : 'text-red-500', size: 20 }), (0, jsx_runtime_1.jsx)("span", { className: isDark ? 'text-red-300' : 'text-red-700', children: error })] })), successMessage && ((0, jsx_runtime_1.jsxs)("div", { className: `flex items-center gap-3 p-4 rounded-lg ${isDark ? 'bg-green-900/30 border-green-700' : 'bg-green-50 border-green-300'} border`, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Check, { className: isDark ? 'text-green-400' : 'text-green-500', size: 20 }), (0, jsx_runtime_1.jsx)("span", { className: isDark ? 'text-green-300' : 'text-green-700', children: successMessage })] })), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl overflow-hidden`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-5 py-4 border-b ${isDark ? 'border-slate-700' : 'border-gray-200'}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Zap, { className: isDark ? 'text-amber-400' : 'text-amber-500', size: 20 }), (0, jsx_runtime_1.jsx)("h3", { className: `font-semibold ${themeClasses.textPrimary}`, children: "Quick Setup" })] }), (0, jsx_runtime_1.jsx)("p", { className: `text-sm ${themeClasses.textMuted} mt-1`, children: "Choose a preset to quickly configure log levels" })] }), (0, jsx_runtime_1.jsx)("div", { className: "p-5", children: (0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap gap-3", children: PRESETS.map((preset) => {
282
- const isActive = getActivePreset() === preset.id;
283
- return ((0, jsx_runtime_1.jsx)("button", { onClick: () => applyPreset(preset.id), className: `
284
- px-4 py-2.5 rounded-lg font-medium text-sm transition-all
285
- ${isActive
286
- ? 'bg-indigo-600 text-white ring-2 ring-indigo-500 ring-offset-2 ' + (isDark ? 'ring-offset-slate-800' : 'ring-offset-white')
287
- : (isDark ? 'bg-slate-700 text-white hover:bg-slate-600' : 'bg-gray-100 text-gray-700 hover:bg-gray-200')}
288
- `, children: preset.label }, preset.id));
289
- }) }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl overflow-hidden`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-5 py-4 border-b ${isDark ? 'border-slate-700' : 'border-gray-200'}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Bug, { className: isDark ? 'text-violet-400' : 'text-violet-500', size: 20 }), (0, jsx_runtime_1.jsx)("h3", { className: `font-semibold ${themeClasses.textPrimary}`, children: "Log Levels" })] }), (0, jsx_runtime_1.jsx)("p", { className: `text-sm ${themeClasses.textMuted} mt-1`, children: "Set verbosity per category" })] }), (0, jsx_runtime_1.jsx)("div", { className: "p-5", children: (0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: CATEGORIES.map((category) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("p", { className: `font-medium ${themeClasses.textPrimary}`, children: category.label }), (0, jsx_runtime_1.jsx)("p", { className: `text-xs ${themeClasses.textMuted}`, children: category.description })] }), (0, jsx_runtime_1.jsx)("select", { value: editedLevels?.[category.id] || 'info', onChange: (e) => {
290
- setEditedLevels(prev => prev ? { ...prev, [category.id]: e.target.value } : null);
291
- }, className: `
292
- px-3 py-2 rounded-lg text-sm font-medium cursor-pointer
293
- ${themeClasses.inputBg} ${themeClasses.textPrimary} border
294
- focus:outline-none focus:ring-2 focus:ring-indigo-500
295
- `, children: LOG_LEVELS.map((level) => ((0, jsx_runtime_1.jsx)("option", { value: level.value, children: level.label }, level.value))) })] }, category.id))) }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl overflow-hidden`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-5 py-4 border-b ${isDark ? 'border-slate-700' : 'border-gray-200'}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Clock, { className: isDark ? 'text-cyan-400' : 'text-cyan-500', size: 20 }), (0, jsx_runtime_1.jsx)("h3", { className: `font-semibold ${themeClasses.textPrimary}`, children: "Retention Settings" })] }), (0, jsx_runtime_1.jsx)("p", { className: `text-sm ${themeClasses.textMuted} mt-1`, children: "How long to keep logs by severity level" })] }), (0, jsx_runtime_1.jsx)("div", { className: "p-5", children: (0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-4", children: [
296
- { key: 'debug_days', label: 'Debug' },
297
- { key: 'info_days', label: 'Info' },
298
- { key: 'warn_days', label: 'Warnings' },
299
- { key: 'error_days', label: 'Errors' },
300
- { key: 'critical_days', label: 'Critical' },
301
- ].map((item) => ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm ${themeClasses.textSecondary} mb-1`, children: item.label }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("input", { type: "number", min: "1", max: "365", value: editedRetention?.[item.key] || 7, onChange: (e) => {
302
- setEditedRetention(prev => prev ? { ...prev, [item.key]: parseInt(e.target.value) || 7 } : null);
303
- }, className: `
304
- w-20 px-3 py-2 rounded-lg text-sm
305
- ${themeClasses.inputBg} ${themeClasses.textPrimary} border
306
- focus:outline-none focus:ring-2 focus:ring-indigo-500
307
- ` }), (0, jsx_runtime_1.jsx)("span", { className: `text-sm ${themeClasses.textMuted}`, children: "days" })] })] }, item.key))) }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl overflow-hidden`, children: [(0, jsx_runtime_1.jsx)("div", { className: `px-5 py-4 border-b ${isDark ? 'border-slate-700' : 'border-gray-200'}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.HardDrive, { className: isDark ? 'text-emerald-400' : 'text-emerald-500', size: 20 }), (0, jsx_runtime_1.jsx)("h3", { className: `font-semibold ${themeClasses.textPrimary}`, children: "Storage Limits" })] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "p-5 space-y-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap items-center gap-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("label", { className: `text-sm ${themeClasses.textSecondary}`, children: "Max size:" }), (0, jsx_runtime_1.jsx)("input", { type: "number", min: "1", max: "1000", value: editedLimits?.max_size_mb || 10, onChange: (e) => {
308
- setEditedLimits(prev => prev ? { ...prev, max_size_mb: parseInt(e.target.value) || 10 } : null);
309
- }, className: `
310
- w-20 px-3 py-2 rounded-lg text-sm
311
- ${themeClasses.inputBg} ${themeClasses.textPrimary} border
312
- focus:outline-none focus:ring-2 focus:ring-indigo-500
313
- ` }), (0, jsx_runtime_1.jsx)("span", { className: `text-sm ${themeClasses.textMuted}`, children: "MB" })] }), (0, jsx_runtime_1.jsx)("span", { className: themeClasses.textMuted, children: "or" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("input", { type: "number", min: "100", max: "1000000", step: "1000", value: editedLimits?.max_rows || 20000, onChange: (e) => {
314
- setEditedLimits(prev => prev ? { ...prev, max_rows: parseInt(e.target.value) || 20000 } : null);
315
- }, className: `
316
- w-28 px-3 py-2 rounded-lg text-sm
317
- ${themeClasses.inputBg} ${themeClasses.textPrimary} border
318
- focus:outline-none focus:ring-2 focus:ring-indigo-500
319
- ` }), (0, jsx_runtime_1.jsx)("span", { className: `text-sm ${themeClasses.textMuted}`, children: "rows" })] })] }), usage && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [(0, jsx_runtime_1.jsx)("span", { className: `text-sm ${themeClasses.textSecondary}`, children: "Current usage" }), (0, jsx_runtime_1.jsxs)("span", { className: `text-sm font-medium ${themeClasses.textPrimary}`, children: [usage.total_size_mb?.toFixed(1) || 0, " MB of ", usage.limits.max_size_mb, " MB (", usage.percent_used || 0, "%)"] })] }), (0, jsx_runtime_1.jsx)("div", { className: `h-3 rounded-full overflow-hidden ${isDark ? 'bg-slate-700' : 'bg-gray-200'}`, children: (0, jsx_runtime_1.jsx)("div", { className: `h-full rounded-full transition-all ${(usage.percent_used || 0) > 90 ? 'bg-red-500' :
320
- (usage.percent_used || 0) > 70 ? 'bg-amber-500' :
321
- 'bg-emerald-500'}`, style: { width: `${Math.min(usage.percent_used || 0, 100)}%` } }) }), (0, jsx_runtime_1.jsxs)("div", { className: `flex items-center justify-between mt-2 text-xs ${themeClasses.textMuted}`, children: [(0, jsx_runtime_1.jsxs)("span", { children: [(usage.total_rows || 0).toLocaleString(), " rows"] }), usage.oldest_entry && ((0, jsx_runtime_1.jsxs)("span", { children: ["Oldest: ", new Date(usage.oldest_entry).toLocaleDateString()] }))] })] })), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative", children: [(0, jsx_runtime_1.jsxs)("select", { disabled: pruning, onChange: (e) => {
322
- if (e.target.value) {
323
- handlePrune(e.target.value);
324
- e.target.value = '';
325
- }
326
- }, className: `
327
- px-4 py-2.5 pr-10 rounded-lg text-sm font-medium cursor-pointer appearance-none
328
- ${isDark ? 'bg-red-900/30 text-red-300 border-red-700 hover:bg-red-900/50' : 'bg-red-50 text-red-700 border-red-300 hover:bg-red-100'}
329
- border focus:outline-none focus:ring-2 focus:ring-red-500
330
- disabled:opacity-50 disabled:cursor-not-allowed
331
- `, children: [(0, jsx_runtime_1.jsx)("option", { value: "", children: "Prune Now..." }), PRUNE_OPTIONS.map((opt) => ((0, jsx_runtime_1.jsx)("option", { value: opt.value, children: opt.label }, opt.value)))] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { className: `absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 pointer-events-none ${isDark ? 'text-red-400' : 'text-red-500'}` })] }), pruning && ((0, jsx_runtime_1.jsxs)("span", { className: `flex items-center gap-2 text-sm ${themeClasses.textMuted}`, children: [(0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { className: "w-4 h-4 animate-spin" }), "Pruning..."] }))] })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-end gap-4", children: [hasChanges && ((0, jsx_runtime_1.jsx)("span", { className: `text-sm ${themeClasses.textMuted}`, children: "You have unsaved changes" })), (0, jsx_runtime_1.jsx)("button", { onClick: saveSettings, disabled: !hasChanges || saving, className: `
332
- px-6 py-2.5 rounded-lg font-medium text-sm transition-all
333
- ${hasChanges
334
- ? 'bg-indigo-600 text-white hover:bg-indigo-700'
335
- : (isDark ? 'bg-slate-700 text-slate-400' : 'bg-gray-200 text-gray-400')}
336
- disabled:cursor-not-allowed
337
- `, children: saving ? ((0, jsx_runtime_1.jsxs)("span", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { className: "w-4 h-4 animate-spin" }), "Saving..."] })) : ('Save Settings') })] })] }));
338
- }
339
- exports.default = LoggingSettingsTab;
@@ -1,37 +0,0 @@
1
- export interface LoginSession {
2
- id: number;
3
- idp_user_id: number;
4
- email: string;
5
- name?: string;
6
- status: 'active' | 'revoked' | 'expired';
7
- ip_address?: string;
8
- city?: string;
9
- region?: string;
10
- country_code?: string;
11
- device_type?: string;
12
- browser?: string;
13
- os?: string;
14
- created_at: string;
15
- last_activity?: string;
16
- revoked_at?: string;
17
- revoked_by?: string;
18
- country_flag?: string;
19
- }
20
- export interface SessionStats {
21
- totalActive: number;
22
- totalRevoked: number;
23
- uniqueUsers: number;
24
- recentLogins: number;
25
- byCountryWithFlags: Record<string, {
26
- count: number;
27
- flag: string;
28
- }>;
29
- byDevice: Record<string, number>;
30
- }
31
- export interface SessionsTabProps {
32
- isDark?: boolean;
33
- /** Base API path for sessions (default: /api/admin/sessions) */
34
- apiBasePath?: string;
35
- }
36
- export declare function SessionsTab({ isDark, apiBasePath }: SessionsTabProps): import("react/jsx-runtime").JSX.Element;
37
- export default SessionsTab;
@@ -1,165 +0,0 @@
1
- "use strict";
2
- 'use client';
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.SessionsTab = SessionsTab;
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const react_1 = require("react");
7
- // -----------------------------------------------------------------------------
8
- // COMPONENT
9
- // -----------------------------------------------------------------------------
10
- function SessionsTab({ isDark = true, apiBasePath = '/api/admin/sessions' }) {
11
- const [sessions, setSessions] = (0, react_1.useState)([]);
12
- const [isLoading, setIsLoading] = (0, react_1.useState)(false);
13
- const [error, setError] = (0, react_1.useState)(null);
14
- const [lastRefresh, setLastRefresh] = (0, react_1.useState)(null);
15
- const [filterStatus, setFilterStatus] = (0, react_1.useState)('all');
16
- const [filterEmail, setFilterEmail] = (0, react_1.useState)('');
17
- const [stats, setStats] = (0, react_1.useState)(null);
18
- const [revokingId, setRevokingId] = (0, react_1.useState)(null);
19
- const [revokingUserId, setRevokingUserId] = (0, react_1.useState)(null);
20
- const themeClasses = {
21
- cardBg: isDark ? 'bg-slate-800 border-slate-700' : 'bg-white border-gray-200 shadow-sm',
22
- inputBg: isDark ? 'bg-slate-900 border-slate-600 text-white' : 'bg-white border-gray-300 text-gray-900',
23
- textPrimary: isDark ? 'text-white' : 'text-gray-900',
24
- textSecondary: isDark ? 'text-gray-400' : 'text-gray-600',
25
- textMuted: isDark ? 'text-gray-500' : 'text-gray-500',
26
- };
27
- // Fetch sessions
28
- const fetchSessions = (0, react_1.useCallback)(async () => {
29
- setIsLoading(true);
30
- setError(null);
31
- try {
32
- const params = new URLSearchParams();
33
- if (filterStatus !== 'all')
34
- params.set('status', filterStatus);
35
- if (filterEmail)
36
- params.set('email', filterEmail);
37
- const response = await fetch(`${apiBasePath}?${params}`);
38
- const data = await response.json();
39
- if (response.ok) {
40
- setSessions(data.sessions || []);
41
- setLastRefresh(new Date());
42
- }
43
- else {
44
- setError(data.error || 'Failed to fetch sessions');
45
- }
46
- }
47
- catch (err) {
48
- setError('Network error. Please try again.');
49
- }
50
- finally {
51
- setIsLoading(false);
52
- }
53
- }, [filterStatus, filterEmail, apiBasePath]);
54
- // Fetch stats
55
- const fetchStats = (0, react_1.useCallback)(async () => {
56
- try {
57
- const response = await fetch(apiBasePath, {
58
- method: 'POST',
59
- headers: { 'Content-Type': 'application/json' },
60
- body: JSON.stringify({ action: 'stats' }),
61
- });
62
- const data = await response.json();
63
- if (response.ok) {
64
- setStats(data.stats);
65
- }
66
- }
67
- catch (err) {
68
- console.error('Failed to fetch stats:', err);
69
- }
70
- }, [apiBasePath]);
71
- // Initial fetch
72
- (0, react_1.useEffect)(() => {
73
- fetchSessions();
74
- fetchStats();
75
- }, [fetchSessions, fetchStats]);
76
- // Revoke single session
77
- const handleRevokeSession = async (sessionId) => {
78
- if (!confirm('Are you sure you want to revoke this session? The user will be logged out.')) {
79
- return;
80
- }
81
- setRevokingId(sessionId);
82
- try {
83
- const response = await fetch(`${apiBasePath}/${sessionId}/revoke`, {
84
- method: 'POST',
85
- headers: { 'Content-Type': 'application/json' },
86
- body: JSON.stringify({ reason: 'Revoked from admin dashboard' }),
87
- });
88
- const data = await response.json();
89
- if (response.ok) {
90
- await fetchSessions();
91
- await fetchStats();
92
- }
93
- else {
94
- alert(data.error || 'Failed to revoke session');
95
- }
96
- }
97
- catch (err) {
98
- alert('Network error. Please try again.');
99
- }
100
- finally {
101
- setRevokingId(null);
102
- }
103
- };
104
- // Revoke all sessions for a user
105
- const handleRevokeAllUserSessions = async (userId, userEmail) => {
106
- if (!confirm(`Are you sure you want to revoke ALL sessions for ${userEmail}? They will be logged out from all devices.`)) {
107
- return;
108
- }
109
- setRevokingUserId(userId);
110
- try {
111
- const response = await fetch(`${apiBasePath}/user/${userId}/revoke-all`, {
112
- method: 'POST',
113
- headers: { 'Content-Type': 'application/json' },
114
- body: JSON.stringify({ reason: 'All sessions revoked from admin dashboard' }),
115
- });
116
- const data = await response.json();
117
- if (response.ok) {
118
- alert(`Revoked ${data.revokedCount} session(s) for ${userEmail}`);
119
- await fetchSessions();
120
- await fetchStats();
121
- }
122
- else {
123
- alert(data.error || 'Failed to revoke sessions');
124
- }
125
- }
126
- catch (err) {
127
- alert('Network error. Please try again.');
128
- }
129
- finally {
130
- setRevokingUserId(null);
131
- }
132
- };
133
- // Format time ago
134
- const getTimeAgo = (dateStr) => {
135
- const now = new Date();
136
- const date = new Date(dateStr);
137
- const diffMs = now.getTime() - date.getTime();
138
- const diffSec = Math.floor(diffMs / 1000);
139
- const diffMin = Math.floor(diffSec / 60);
140
- const diffHour = Math.floor(diffMin / 60);
141
- const diffDay = Math.floor(diffHour / 24);
142
- if (diffSec < 60)
143
- return 'Just now';
144
- if (diffMin < 60)
145
- return `${diffMin}m ago`;
146
- if (diffHour < 24)
147
- return `${diffHour}h ago`;
148
- if (diffDay < 7)
149
- return `${diffDay}d ago`;
150
- return date.toLocaleDateString();
151
- };
152
- // Format location
153
- const formatLocation = (session) => {
154
- const parts = [session.city, session.region, session.country_code].filter(Boolean);
155
- return parts.length > 0 ? parts.join(', ') : 'Unknown';
156
- };
157
- return ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-6", children: [stats && ((0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: [(0, jsx_runtime_1.jsx)("div", { className: "text-2xl font-bold text-emerald-400", children: stats.totalActive }), (0, jsx_runtime_1.jsx)("div", { className: `text-sm ${themeClasses.textMuted}`, children: "Active Sessions" })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: [(0, jsx_runtime_1.jsx)("div", { className: "text-2xl font-bold text-red-400", children: stats.totalRevoked }), (0, jsx_runtime_1.jsx)("div", { className: `text-sm ${themeClasses.textMuted}`, children: "Revoked Sessions" })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: [(0, jsx_runtime_1.jsx)("div", { className: "text-2xl font-bold text-blue-400", children: stats.uniqueUsers }), (0, jsx_runtime_1.jsx)("div", { className: `text-sm ${themeClasses.textMuted}`, children: "Unique Users" })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: [(0, jsx_runtime_1.jsx)("div", { className: "text-2xl font-bold text-purple-400", children: stats.recentLogins }), (0, jsx_runtime_1.jsx)("div", { className: `text-sm ${themeClasses.textMuted}`, children: "Logins (24h)" })] })] })), (0, jsx_runtime_1.jsx)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap items-center gap-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex-1 min-w-[200px]", children: (0, jsx_runtime_1.jsx)("input", { type: "text", placeholder: "Filter by email...", value: filterEmail, onChange: (e) => setFilterEmail(e.target.value), onKeyDown: (e) => e.key === 'Enter' && fetchSessions(), className: `w-full px-4 py-2 rounded-lg border ${themeClasses.inputBg}` }) }), (0, jsx_runtime_1.jsxs)("select", { value: filterStatus, onChange: (e) => setFilterStatus(e.target.value), className: `px-4 py-2 rounded-lg border ${themeClasses.inputBg}`, children: [(0, jsx_runtime_1.jsx)("option", { value: "all", children: "All Status" }), (0, jsx_runtime_1.jsx)("option", { value: "active", children: "Active Only" }), (0, jsx_runtime_1.jsx)("option", { value: "revoked", children: "Revoked Only" })] }), (0, jsx_runtime_1.jsx)("button", { onClick: fetchSessions, disabled: isLoading, className: "px-4 py-2 rounded-lg bg-indigo-600 text-white hover:bg-indigo-500 disabled:opacity-50", children: isLoading ? 'Loading...' : 'Search' }), (0, jsx_runtime_1.jsx)("span", { className: `text-xs ${themeClasses.textMuted}`, children: lastRefresh ? `Last: ${lastRefresh.toLocaleTimeString()}` : '' })] }) }), error && ((0, jsx_runtime_1.jsx)("div", { className: "p-4 rounded-lg bg-red-500/20 border border-red-500 text-red-400", children: error })), (0, jsx_runtime_1.jsx)("div", { className: `${themeClasses.cardBg} border rounded-xl overflow-hidden`, children: (0, jsx_runtime_1.jsx)("div", { className: "overflow-x-auto", children: (0, jsx_runtime_1.jsxs)("table", { className: "w-full", children: [(0, jsx_runtime_1.jsx)("thead", { children: (0, jsx_runtime_1.jsxs)("tr", { className: `border-b ${isDark ? 'border-slate-700' : 'border-gray-200'} bg-opacity-50 ${isDark ? 'bg-slate-900' : 'bg-gray-50'}`, children: [(0, jsx_runtime_1.jsx)("th", { className: `text-left py-3 px-4 ${themeClasses.textSecondary} font-medium text-sm`, children: "User" }), (0, jsx_runtime_1.jsx)("th", { className: `text-left py-3 px-4 ${themeClasses.textSecondary} font-medium text-sm`, children: "Location" }), (0, jsx_runtime_1.jsx)("th", { className: `text-left py-3 px-4 ${themeClasses.textSecondary} font-medium text-sm`, children: "Device" }), (0, jsx_runtime_1.jsx)("th", { className: `text-left py-3 px-4 ${themeClasses.textSecondary} font-medium text-sm`, children: "Status" }), (0, jsx_runtime_1.jsx)("th", { className: `text-left py-3 px-4 ${themeClasses.textSecondary} font-medium text-sm`, children: "Created" }), (0, jsx_runtime_1.jsx)("th", { className: `text-left py-3 px-4 ${themeClasses.textSecondary} font-medium text-sm`, children: "Actions" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: sessions.length === 0 ? ((0, jsx_runtime_1.jsx)("tr", { children: (0, jsx_runtime_1.jsx)("td", { colSpan: 6, className: `text-center py-8 ${themeClasses.textMuted}`, children: isLoading ? 'Loading sessions...' : 'No sessions found' }) })) : (sessions.map((session) => ((0, jsx_runtime_1.jsxs)("tr", { className: `border-b ${isDark ? 'border-slate-700' : 'border-gray-100'} last:border-0`, children: [(0, jsx_runtime_1.jsx)("td", { className: "py-3 px-4", children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { className: `font-medium ${themeClasses.textPrimary}`, children: session.name || session.email.split('@')[0] }), (0, jsx_runtime_1.jsx)("div", { className: `text-xs ${themeClasses.textMuted}`, children: session.email }), (0, jsx_runtime_1.jsxs)("div", { className: `text-xs ${themeClasses.textMuted}`, children: ["ID: ", session.idp_user_id] })] }) }), (0, jsx_runtime_1.jsx)("td", { className: "py-3 px-4", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-lg", children: session.country_flag || '🌍' }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { className: themeClasses.textPrimary, children: formatLocation(session) }), (0, jsx_runtime_1.jsx)("div", { className: `text-xs font-mono ${themeClasses.textMuted}`, children: session.ip_address })] })] }) }), (0, jsx_runtime_1.jsx)("td", { className: "py-3 px-4", children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.textPrimary} capitalize`, children: [session.device_type === 'desktop' ? '💻' : session.device_type === 'mobile' ? '📱' : '📲', " ", session.device_type] }), (0, jsx_runtime_1.jsxs)("div", { className: `text-xs ${themeClasses.textMuted}`, children: [session.browser, " / ", session.os] })] }) }), (0, jsx_runtime_1.jsxs)("td", { className: "py-3 px-4", children: [(0, jsx_runtime_1.jsx)("span", { className: `px-2 py-1 rounded text-xs font-medium ${session.status === 'active'
158
- ? 'bg-emerald-500/20 text-emerald-400'
159
- : session.status === 'revoked'
160
- ? 'bg-red-500/20 text-red-400'
161
- : 'bg-gray-500/20 text-gray-400'}`, children: session.status }), session.status === 'revoked' && session.revoked_at && ((0, jsx_runtime_1.jsx)("div", { className: `text-xs ${themeClasses.textMuted} mt-1`, children: getTimeAgo(session.revoked_at) }))] }), (0, jsx_runtime_1.jsxs)("td", { className: `py-3 px-4 ${themeClasses.textMuted} text-sm`, children: [(0, jsx_runtime_1.jsx)("div", { children: getTimeAgo(session.created_at) }), session.last_activity && ((0, jsx_runtime_1.jsxs)("div", { className: `text-xs ${themeClasses.textMuted}`, children: ["Active: ", getTimeAgo(session.last_activity)] }))] }), (0, jsx_runtime_1.jsx)("td", { className: "py-3 px-4", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [session.status === 'active' && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => handleRevokeSession(session.id), disabled: revokingId === session.id, className: "px-3 py-1 rounded text-xs font-medium bg-red-500/20 text-red-400 hover:bg-red-500/30 disabled:opacity-50", title: "Revoke this session", children: revokingId === session.id ? '...' : 'Revoke' }), (0, jsx_runtime_1.jsx)("button", { onClick: () => handleRevokeAllUserSessions(session.idp_user_id, session.email), disabled: revokingUserId === session.idp_user_id, className: "px-3 py-1 rounded text-xs font-medium bg-orange-500/20 text-orange-400 hover:bg-orange-500/30 disabled:opacity-50", title: "Revoke all sessions for this user", children: revokingUserId === session.idp_user_id ? '...' : 'Revoke All' })] })), session.status === 'revoked' && ((0, jsx_runtime_1.jsxs)("span", { className: `text-xs ${themeClasses.textMuted}`, children: ["By: ", session.revoked_by?.split('@')[0]] }))] }) })] }, session.id)))) })] }) }) }), stats && ((0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: [(0, jsx_runtime_1.jsx)("h3", { className: `font-semibold ${themeClasses.textPrimary} mb-3`, children: "Sessions by Device" }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-2", children: Object.entries(stats.byDevice).map(([device, count]) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { className: `${themeClasses.textSecondary} capitalize`, children: [device === 'desktop' ? '💻' : device === 'mobile' ? '📱' : '📲', " ", device] }), (0, jsx_runtime_1.jsx)("span", { className: themeClasses.textPrimary, children: count })] }, device))) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${themeClasses.cardBg} border rounded-xl p-4`, children: [(0, jsx_runtime_1.jsx)("h3", { className: `font-semibold ${themeClasses.textPrimary} mb-3`, children: "Sessions by Country" }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-2 max-h-48 overflow-y-auto", children: Object.entries(stats.byCountryWithFlags)
162
- .sort((a, b) => b[1].count - a[1].count)
163
- .map(([code, data]) => ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { className: themeClasses.textSecondary, children: [data.flag, " ", code] }), (0, jsx_runtime_1.jsx)("span", { className: themeClasses.textPrimary, children: data.count })] }, code))) })] })] }))] }));
164
- }
165
- exports.default = SessionsTab;
@@ -1,53 +0,0 @@
1
- /**
2
- * =============================================================================
3
- * VIBE ADMIN STATS TAB
4
- * =============================================================================
5
- *
6
- * Generic dashboard stats overview tab.
7
- * Shows high-level metrics about users, sessions, and system health.
8
- *
9
- * =============================================================================
10
- */
11
- import { ReactNode } from 'react';
12
- import { type LucideIcon } from 'lucide-react';
13
- export interface StatCard {
14
- id: string;
15
- label: string;
16
- value: string | number;
17
- change?: string;
18
- changeType?: 'positive' | 'negative' | 'neutral';
19
- icon?: LucideIcon;
20
- color?: 'blue' | 'green' | 'purple' | 'orange' | 'red' | 'cyan';
21
- }
22
- export interface QuickAction {
23
- id: string;
24
- label: string;
25
- description: string;
26
- onClick: () => void;
27
- icon?: LucideIcon;
28
- }
29
- export interface RecentActivity {
30
- id: string;
31
- type: string;
32
- message: string;
33
- timestamp: string;
34
- user?: string;
35
- }
36
- export interface SystemStatus {
37
- service: string;
38
- status: 'healthy' | 'degraded' | 'down';
39
- latency?: number;
40
- }
41
- export interface StatsTabProps {
42
- isDark?: boolean;
43
- /** API endpoint to fetch stats (default: /api/admin/stats) */
44
- apiBasePath?: string;
45
- /** Custom stat cards to display */
46
- customStats?: StatCard[];
47
- /** Quick actions shown in the sidebar */
48
- quickActions?: QuickAction[];
49
- /** Additional content to render below stats */
50
- children?: ReactNode;
51
- }
52
- export declare function StatsTab({ isDark, apiBasePath, customStats, quickActions, children, }: StatsTabProps): import("react/jsx-runtime").JSX.Element;
53
- export default StatsTab;