@payez/next-mvp 3.9.1 → 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 (526) hide show
  1. package/package.json +6 -18
  2. package/src/api/auth-handler.ts +550 -549
  3. package/src/api-handlers/account/change-password.ts +5 -8
  4. package/src/api-handlers/admin/analytics.ts +4 -6
  5. package/src/api-handlers/admin/audit.ts +5 -7
  6. package/src/api-handlers/admin/index.ts +1 -2
  7. package/src/api-handlers/admin/redis-sessions.ts +6 -8
  8. package/src/api-handlers/admin/sessions.ts +5 -7
  9. package/src/api-handlers/admin/site-logs.ts +8 -10
  10. package/src/api-handlers/admin/stats.ts +4 -6
  11. package/src/api-handlers/admin/users.ts +5 -7
  12. package/src/api-handlers/admin/vibe-data.ts +10 -12
  13. package/src/api-handlers/auth/refresh.ts +5 -7
  14. package/src/api-handlers/auth/signout.ts +5 -6
  15. package/src/api-handlers/auth/status.ts +4 -7
  16. package/src/api-handlers/auth/update-session.ts +123 -125
  17. package/src/api-handlers/auth/verify-code.ts +9 -13
  18. package/src/api-handlers/session/viability.ts +10 -47
  19. package/src/api-handlers/test/force-expire.ts +4 -11
  20. package/src/auth/auth-decision.ts +1 -1
  21. package/src/auth/better-auth.ts +138 -141
  22. package/src/auth/route-config.ts +219 -219
  23. package/src/auth/utils/token-utils.ts +0 -1
  24. package/src/client/AuthContext.tsx +6 -2
  25. package/src/client/fetch-with-auth.ts +47 -47
  26. package/src/components/SessionSync.tsx +6 -5
  27. package/src/components/account/MobileNavDrawer.tsx +3 -3
  28. package/src/components/account/UserAvatarMenu.tsx +6 -3
  29. package/src/components/admin/VibeAdminLayout.tsx +4 -2
  30. package/src/config/logger.ts +1 -1
  31. package/src/hooks/useAuth.ts +117 -115
  32. package/src/hooks/useAuthSettings.ts +2 -2
  33. package/src/hooks/useAvailableProviders.ts +9 -5
  34. package/src/hooks/useSessionExpiration.ts +101 -102
  35. package/src/hooks/useViabilitySession.ts +336 -335
  36. package/src/index.ts +60 -63
  37. package/src/lib/api-handler.ts +0 -1
  38. package/src/lib/app-slug.ts +6 -6
  39. package/src/lib/standardized-client-api.ts +901 -895
  40. package/src/lib/startup-init.ts +243 -247
  41. package/src/lib/test-aware-get-token.ts +22 -12
  42. package/src/lib/token-lifecycle.ts +12 -53
  43. package/src/pages/admin-login/page.tsx +9 -17
  44. package/src/pages/client-admin/ClientSiteAdminPage.tsx +4 -2
  45. package/src/pages/login/page.tsx +21 -28
  46. package/src/pages/showcase/ShowcasePage.tsx +4 -2
  47. package/src/pages/test-env/EmergencyLogoutPage.tsx +7 -6
  48. package/src/pages/test-env/JwtInspectPage.tsx +5 -3
  49. package/src/pages/test-env/RefreshTokenPage.tsx +157 -155
  50. package/src/pages/test-env/TestEnvPage.tsx +4 -2
  51. package/src/pages/verify-code/page.tsx +10 -6
  52. package/src/routes/auth/logout.ts +7 -25
  53. package/src/routes/auth/nextauth.ts +45 -71
  54. package/src/routes/auth/session.ts +25 -50
  55. package/src/routes/auth/viability.ts +7 -19
  56. package/src/server/auth.ts +60 -0
  57. package/src/stores/authStore.ts +1899 -1904
  58. package/src/utils/logout.ts +30 -30
  59. package/dist/api/auth-handler.d.ts +0 -67
  60. package/dist/api/auth-handler.js +0 -397
  61. package/dist/api/index.d.ts +0 -10
  62. package/dist/api/index.js +0 -19
  63. package/dist/api-handlers/account/change-password.d.ts +0 -9
  64. package/dist/api-handlers/account/change-password.js +0 -112
  65. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  66. package/dist/api-handlers/account/masked-info.js +0 -41
  67. package/dist/api-handlers/account/profile.d.ts +0 -3
  68. package/dist/api-handlers/account/profile.js +0 -63
  69. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  70. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  71. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  72. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  73. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  74. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  75. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  76. package/dist/api-handlers/account/reset-password.js +0 -26
  77. package/dist/api-handlers/account/send-code.d.ts +0 -24
  78. package/dist/api-handlers/account/send-code.js +0 -60
  79. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  80. package/dist/api-handlers/account/update-phone.js +0 -64
  81. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  82. package/dist/api-handlers/account/validate-password.js +0 -81
  83. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  84. package/dist/api-handlers/account/verify-email.js +0 -106
  85. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  86. package/dist/api-handlers/account/verify-sms.js +0 -106
  87. package/dist/api-handlers/admin/analytics.d.ts +0 -20
  88. package/dist/api-handlers/admin/analytics.js +0 -379
  89. package/dist/api-handlers/admin/audit.d.ts +0 -20
  90. package/dist/api-handlers/admin/audit.js +0 -214
  91. package/dist/api-handlers/admin/index.d.ts +0 -22
  92. package/dist/api-handlers/admin/index.js +0 -43
  93. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -36
  94. package/dist/api-handlers/admin/redis-sessions.js +0 -204
  95. package/dist/api-handlers/admin/sessions.d.ts +0 -21
  96. package/dist/api-handlers/admin/sessions.js +0 -284
  97. package/dist/api-handlers/admin/site-logs.d.ts +0 -46
  98. package/dist/api-handlers/admin/site-logs.js +0 -318
  99. package/dist/api-handlers/admin/stats.d.ts +0 -21
  100. package/dist/api-handlers/admin/stats.js +0 -240
  101. package/dist/api-handlers/admin/users.d.ts +0 -20
  102. package/dist/api-handlers/admin/users.js +0 -222
  103. package/dist/api-handlers/admin/vibe-data.d.ts +0 -80
  104. package/dist/api-handlers/admin/vibe-data.js +0 -268
  105. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  106. package/dist/api-handlers/anon/preferences.js +0 -96
  107. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  108. package/dist/api-handlers/auth/jwks.js +0 -24
  109. package/dist/api-handlers/auth/login.d.ts +0 -42
  110. package/dist/api-handlers/auth/login.js +0 -178
  111. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  112. package/dist/api-handlers/auth/refresh.js +0 -635
  113. package/dist/api-handlers/auth/signout.d.ts +0 -37
  114. package/dist/api-handlers/auth/signout.js +0 -187
  115. package/dist/api-handlers/auth/status.d.ts +0 -8
  116. package/dist/api-handlers/auth/status.js +0 -26
  117. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  118. package/dist/api-handlers/auth/update-session.js +0 -95
  119. package/dist/api-handlers/auth/validate.d.ts +0 -6
  120. package/dist/api-handlers/auth/validate.js +0 -43
  121. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  122. package/dist/api-handlers/auth/verify-code.js +0 -94
  123. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  124. package/dist/api-handlers/session/refresh-viability.js +0 -39
  125. package/dist/api-handlers/session/viability.d.ts +0 -13
  126. package/dist/api-handlers/session/viability.js +0 -146
  127. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  128. package/dist/api-handlers/test/force-expire.js +0 -65
  129. package/dist/auth/auth-decision.d.ts +0 -39
  130. package/dist/auth/auth-decision.js +0 -182
  131. package/dist/auth/auth-options.d.ts +0 -57
  132. package/dist/auth/auth-options.js +0 -213
  133. package/dist/auth/better-auth.d.ts +0 -82
  134. package/dist/auth/better-auth.js +0 -122
  135. package/dist/auth/callbacks/index.d.ts +0 -6
  136. package/dist/auth/callbacks/index.js +0 -12
  137. package/dist/auth/callbacks/jwt.d.ts +0 -45
  138. package/dist/auth/callbacks/jwt.js +0 -305
  139. package/dist/auth/callbacks/session.d.ts +0 -60
  140. package/dist/auth/callbacks/session.js +0 -170
  141. package/dist/auth/callbacks/signin.d.ts +0 -23
  142. package/dist/auth/callbacks/signin.js +0 -44
  143. package/dist/auth/events/index.d.ts +0 -4
  144. package/dist/auth/events/index.js +0 -8
  145. package/dist/auth/events/signout.d.ts +0 -17
  146. package/dist/auth/events/signout.js +0 -32
  147. package/dist/auth/providers/credentials.d.ts +0 -32
  148. package/dist/auth/providers/credentials.js +0 -223
  149. package/dist/auth/providers/index.d.ts +0 -5
  150. package/dist/auth/providers/index.js +0 -21
  151. package/dist/auth/providers/oauth.d.ts +0 -26
  152. package/dist/auth/providers/oauth.js +0 -105
  153. package/dist/auth/route-config.d.ts +0 -66
  154. package/dist/auth/route-config.js +0 -190
  155. package/dist/auth/types/auth-types.d.ts +0 -417
  156. package/dist/auth/types/auth-types.js +0 -53
  157. package/dist/auth/types/index.d.ts +0 -6
  158. package/dist/auth/types/index.js +0 -22
  159. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  160. package/dist/auth/unauthenticated-routes.js +0 -19
  161. package/dist/auth/utils/idp-client.d.ts +0 -94
  162. package/dist/auth/utils/idp-client.js +0 -384
  163. package/dist/auth/utils/index.d.ts +0 -5
  164. package/dist/auth/utils/index.js +0 -21
  165. package/dist/auth/utils/token-utils.d.ts +0 -84
  166. package/dist/auth/utils/token-utils.js +0 -219
  167. package/dist/client/AuthContext.d.ts +0 -19
  168. package/dist/client/AuthContext.js +0 -112
  169. package/dist/client/better-auth-client.d.ts +0 -1020
  170. package/dist/client/better-auth-client.js +0 -68
  171. package/dist/client/fetch-with-auth.d.ts +0 -11
  172. package/dist/client/fetch-with-auth.js +0 -44
  173. package/dist/client/fetchWithSession.d.ts +0 -3
  174. package/dist/client/fetchWithSession.js +0 -24
  175. package/dist/client/index.d.ts +0 -9
  176. package/dist/client/index.js +0 -20
  177. package/dist/client/useAnonSession.d.ts +0 -36
  178. package/dist/client/useAnonSession.js +0 -99
  179. package/dist/components/SessionSync.d.ts +0 -13
  180. package/dist/components/SessionSync.js +0 -119
  181. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  182. package/dist/components/SignalRHealthCheck.js +0 -97
  183. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  184. package/dist/components/account/MobileNavDrawer.js +0 -81
  185. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  186. package/dist/components/account/UserAvatarMenu.js +0 -88
  187. package/dist/components/account/index.d.ts +0 -9
  188. package/dist/components/account/index.js +0 -13
  189. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  190. package/dist/components/admin/AlertSettingsTab.js +0 -351
  191. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  192. package/dist/components/admin/AnalyticsTab.js +0 -167
  193. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  194. package/dist/components/admin/DataBrowserTab.js +0 -252
  195. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  196. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  197. package/dist/components/admin/SessionsTab.d.ts +0 -37
  198. package/dist/components/admin/SessionsTab.js +0 -165
  199. package/dist/components/admin/StatsTab.d.ts +0 -53
  200. package/dist/components/admin/StatsTab.js +0 -161
  201. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  202. package/dist/components/admin/VibeAdminContext.js +0 -38
  203. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  204. package/dist/components/admin/VibeAdminLayout.js +0 -69
  205. package/dist/components/admin/index.d.ts +0 -29
  206. package/dist/components/admin/index.js +0 -44
  207. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  208. package/dist/components/auth/FederatedAuthSection.js +0 -45
  209. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  210. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  211. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  212. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  213. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  214. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  215. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  216. package/dist/components/recovery/CompleteStep.js +0 -8
  217. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  218. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  219. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  220. package/dist/components/recovery/SelectMethodStep.js +0 -8
  221. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  222. package/dist/components/recovery/SetPasswordStep.js +0 -20
  223. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  224. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  225. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  226. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  227. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  228. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  229. package/dist/components/ui/BetaBadge.d.ts +0 -29
  230. package/dist/components/ui/BetaBadge.js +0 -38
  231. package/dist/components/ui/Footer.d.ts +0 -37
  232. package/dist/components/ui/Footer.js +0 -41
  233. package/dist/config/env.d.ts +0 -66
  234. package/dist/config/env.js +0 -57
  235. package/dist/config/logger.d.ts +0 -57
  236. package/dist/config/logger.js +0 -73
  237. package/dist/config/logging-config.d.ts +0 -30
  238. package/dist/config/logging-config.js +0 -122
  239. package/dist/config/unauthenticated-routes.d.ts +0 -17
  240. package/dist/config/unauthenticated-routes.js +0 -24
  241. package/dist/config/vibe-log-transport.d.ts +0 -81
  242. package/dist/config/vibe-log-transport.js +0 -212
  243. package/dist/edge/internal-api-url.d.ts +0 -53
  244. package/dist/edge/internal-api-url.js +0 -63
  245. package/dist/edge/middleware.d.ts +0 -14
  246. package/dist/edge/middleware.js +0 -32
  247. package/dist/hooks/useAuth.d.ts +0 -23
  248. package/dist/hooks/useAuth.js +0 -81
  249. package/dist/hooks/useAuthSettings.d.ts +0 -59
  250. package/dist/hooks/useAuthSettings.js +0 -93
  251. package/dist/hooks/useAvailableProviders.d.ts +0 -45
  252. package/dist/hooks/useAvailableProviders.js +0 -108
  253. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  254. package/dist/hooks/usePasswordValidation.js +0 -102
  255. package/dist/hooks/useProfile.d.ts +0 -15
  256. package/dist/hooks/useProfile.js +0 -59
  257. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  258. package/dist/hooks/usePublicAuthSettings.js +0 -131
  259. package/dist/hooks/useSessionExpiration.d.ts +0 -57
  260. package/dist/hooks/useSessionExpiration.js +0 -72
  261. package/dist/hooks/useViabilitySession.d.ts +0 -75
  262. package/dist/hooks/useViabilitySession.js +0 -268
  263. package/dist/index.d.ts +0 -12
  264. package/dist/index.js +0 -55
  265. package/dist/lib/anon-session.d.ts +0 -74
  266. package/dist/lib/anon-session.js +0 -169
  267. package/dist/lib/api-handler.d.ts +0 -123
  268. package/dist/lib/api-handler.js +0 -478
  269. package/dist/lib/app-slug.d.ts +0 -95
  270. package/dist/lib/app-slug.js +0 -172
  271. package/dist/lib/demo-mode.d.ts +0 -6
  272. package/dist/lib/demo-mode.js +0 -16
  273. package/dist/lib/geolocation.d.ts +0 -64
  274. package/dist/lib/geolocation.js +0 -235
  275. package/dist/lib/idp-client-config.d.ts +0 -75
  276. package/dist/lib/idp-client-config.js +0 -425
  277. package/dist/lib/idp-fetch.d.ts +0 -14
  278. package/dist/lib/idp-fetch.js +0 -91
  279. package/dist/lib/internal-api.d.ts +0 -87
  280. package/dist/lib/internal-api.js +0 -122
  281. package/dist/lib/jwt-decode-client.d.ts +0 -10
  282. package/dist/lib/jwt-decode-client.js +0 -46
  283. package/dist/lib/jwt-decode.d.ts +0 -48
  284. package/dist/lib/jwt-decode.js +0 -57
  285. package/dist/lib/nextauth-secret.d.ts +0 -10
  286. package/dist/lib/nextauth-secret.js +0 -100
  287. package/dist/lib/rate-limit-service.d.ts +0 -23
  288. package/dist/lib/rate-limit-service.js +0 -6
  289. package/dist/lib/redis.d.ts +0 -5
  290. package/dist/lib/redis.js +0 -28
  291. package/dist/lib/refresh-token-validator.d.ts +0 -13
  292. package/dist/lib/refresh-token-validator.js +0 -117
  293. package/dist/lib/roles.d.ts +0 -145
  294. package/dist/lib/roles.js +0 -168
  295. package/dist/lib/secret-validation.d.ts +0 -4
  296. package/dist/lib/secret-validation.js +0 -14
  297. package/dist/lib/session-store.d.ts +0 -170
  298. package/dist/lib/session-store.js +0 -545
  299. package/dist/lib/session.d.ts +0 -21
  300. package/dist/lib/session.js +0 -26
  301. package/dist/lib/site-logger.d.ts +0 -214
  302. package/dist/lib/site-logger.js +0 -210
  303. package/dist/lib/standardized-client-api.d.ts +0 -161
  304. package/dist/lib/standardized-client-api.js +0 -786
  305. package/dist/lib/startup-init.d.ts +0 -40
  306. package/dist/lib/startup-init.js +0 -261
  307. package/dist/lib/test-aware-get-token.d.ts +0 -2
  308. package/dist/lib/test-aware-get-token.js +0 -81
  309. package/dist/lib/token-expiry.d.ts +0 -14
  310. package/dist/lib/token-expiry.js +0 -39
  311. package/dist/lib/token-lifecycle.d.ts +0 -52
  312. package/dist/lib/token-lifecycle.js +0 -398
  313. package/dist/lib/types/api-responses.d.ts +0 -128
  314. package/dist/lib/types/api-responses.js +0 -171
  315. package/dist/lib/user-agent-parser.d.ts +0 -50
  316. package/dist/lib/user-agent-parser.js +0 -220
  317. package/dist/logging/api/admin-analytics.d.ts +0 -3
  318. package/dist/logging/api/admin-analytics.js +0 -45
  319. package/dist/logging/api/audit-log.d.ts +0 -3
  320. package/dist/logging/api/audit-log.js +0 -52
  321. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  322. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  323. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  324. package/dist/logging/components/AuditLogViewer.js +0 -51
  325. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  326. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  327. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  328. package/dist/logging/components/HealthMetricsCard.js +0 -19
  329. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  330. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  331. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  332. package/dist/logging/hooks/useAuditLog.js +0 -25
  333. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  334. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  335. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  336. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  337. package/dist/logging/index.d.ts +0 -11
  338. package/dist/logging/index.js +0 -40
  339. package/dist/logging/types/analytics.d.ts +0 -68
  340. package/dist/logging/types/analytics.js +0 -3
  341. package/dist/logging/types/audit.d.ts +0 -29
  342. package/dist/logging/types/audit.js +0 -2
  343. package/dist/logging/types/index.d.ts +0 -2
  344. package/dist/logging/types/index.js +0 -19
  345. package/dist/middleware/auth-decision.d.ts +0 -33
  346. package/dist/middleware/auth-decision.js +0 -65
  347. package/dist/middleware/create-middleware.d.ts +0 -102
  348. package/dist/middleware/create-middleware.js +0 -469
  349. package/dist/middleware/rbac-check.d.ts +0 -51
  350. package/dist/middleware/rbac-check.js +0 -219
  351. package/dist/middleware/twofa-presets.d.ts +0 -134
  352. package/dist/middleware/twofa-presets.js +0 -175
  353. package/dist/models/DecodedAccessToken.d.ts +0 -17
  354. package/dist/models/DecodedAccessToken.js +0 -2
  355. package/dist/models/SessionModel.d.ts +0 -122
  356. package/dist/models/SessionModel.js +0 -136
  357. package/dist/pages/admin-login/page.d.ts +0 -31
  358. package/dist/pages/admin-login/page.js +0 -83
  359. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  360. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  361. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  362. package/dist/pages/admin-page-permissions/index.js +0 -13
  363. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  364. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  365. package/dist/pages/admin-roles/index.d.ts +0 -8
  366. package/dist/pages/admin-roles/index.js +0 -15
  367. package/dist/pages/admin-roles/modals.d.ts +0 -72
  368. package/dist/pages/admin-roles/modals.js +0 -154
  369. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  370. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -177
  371. package/dist/pages/client-admin/index.d.ts +0 -32
  372. package/dist/pages/client-admin/index.js +0 -37
  373. package/dist/pages/coming-soon/page.d.ts +0 -8
  374. package/dist/pages/coming-soon/page.js +0 -28
  375. package/dist/pages/login/page.d.ts +0 -22
  376. package/dist/pages/login/page.js +0 -239
  377. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  378. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  379. package/dist/pages/profile/index.d.ts +0 -8
  380. package/dist/pages/profile/index.js +0 -16
  381. package/dist/pages/profile/page.d.ts +0 -19
  382. package/dist/pages/profile/page.js +0 -47
  383. package/dist/pages/profile/profile-patch.d.ts +0 -1
  384. package/dist/pages/profile/profile-patch.js +0 -281
  385. package/dist/pages/recovery/page.d.ts +0 -1
  386. package/dist/pages/recovery/page.js +0 -142
  387. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  388. package/dist/pages/roles/MyRolesPage.js +0 -71
  389. package/dist/pages/roles/components.d.ts +0 -63
  390. package/dist/pages/roles/components.js +0 -108
  391. package/dist/pages/roles/index.d.ts +0 -8
  392. package/dist/pages/roles/index.js +0 -19
  393. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  394. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  395. package/dist/pages/security/index.d.ts +0 -8
  396. package/dist/pages/security/index.js +0 -16
  397. package/dist/pages/security/page.d.ts +0 -21
  398. package/dist/pages/security/page.js +0 -212
  399. package/dist/pages/security/security-patch.d.ts +0 -1
  400. package/dist/pages/security/security-patch.js +0 -302
  401. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  402. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  403. package/dist/pages/settings/index.d.ts +0 -8
  404. package/dist/pages/settings/index.js +0 -16
  405. package/dist/pages/settings/page.d.ts +0 -7
  406. package/dist/pages/settings/page.js +0 -26
  407. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  408. package/dist/pages/showcase/ShowcasePage.js +0 -140
  409. package/dist/pages/showcase/index.d.ts +0 -12
  410. package/dist/pages/showcase/index.js +0 -17
  411. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  412. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -98
  413. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  414. package/dist/pages/test-env/JwtInspectPage.js +0 -114
  415. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  416. package/dist/pages/test-env/RefreshTokenPage.js +0 -91
  417. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  418. package/dist/pages/test-env/TestEnvPage.js +0 -49
  419. package/dist/pages/test-env/index.d.ts +0 -24
  420. package/dist/pages/test-env/index.js +0 -32
  421. package/dist/pages/verify-code/page.d.ts +0 -30
  422. package/dist/pages/verify-code/page.js +0 -408
  423. package/dist/routes/account/index.d.ts +0 -28
  424. package/dist/routes/account/index.js +0 -71
  425. package/dist/routes/account/masked-info.d.ts +0 -33
  426. package/dist/routes/account/masked-info.js +0 -39
  427. package/dist/routes/account/send-code.d.ts +0 -37
  428. package/dist/routes/account/send-code.js +0 -42
  429. package/dist/routes/account/update-phone.d.ts +0 -13
  430. package/dist/routes/account/update-phone.js +0 -17
  431. package/dist/routes/account/verify-email.d.ts +0 -38
  432. package/dist/routes/account/verify-email.js +0 -43
  433. package/dist/routes/account/verify-sms.d.ts +0 -38
  434. package/dist/routes/account/verify-sms.js +0 -43
  435. package/dist/routes/auth/index.d.ts +0 -19
  436. package/dist/routes/auth/index.js +0 -64
  437. package/dist/routes/auth/logout.d.ts +0 -31
  438. package/dist/routes/auth/logout.js +0 -113
  439. package/dist/routes/auth/nextauth.d.ts +0 -19
  440. package/dist/routes/auth/nextauth.js +0 -72
  441. package/dist/routes/auth/refresh.d.ts +0 -30
  442. package/dist/routes/auth/refresh.js +0 -51
  443. package/dist/routes/auth/session.d.ts +0 -43
  444. package/dist/routes/auth/session.js +0 -179
  445. package/dist/routes/auth/settings.d.ts +0 -25
  446. package/dist/routes/auth/settings.js +0 -55
  447. package/dist/routes/auth/viability.d.ts +0 -52
  448. package/dist/routes/auth/viability.js +0 -201
  449. package/dist/routes/index.d.ts +0 -12
  450. package/dist/routes/index.js +0 -54
  451. package/dist/routes/session/index.d.ts +0 -6
  452. package/dist/routes/session/index.js +0 -10
  453. package/dist/routes/session/refresh-viability.d.ts +0 -16
  454. package/dist/routes/session/refresh-viability.js +0 -20
  455. package/dist/server/auth-guard.d.ts +0 -46
  456. package/dist/server/auth-guard.js +0 -128
  457. package/dist/server/decode-session.d.ts +0 -30
  458. package/dist/server/decode-session.js +0 -78
  459. package/dist/server/slim-middleware.d.ts +0 -23
  460. package/dist/server/slim-middleware.js +0 -89
  461. package/dist/server/with-auth.d.ts +0 -33
  462. package/dist/server/with-auth.js +0 -59
  463. package/dist/services/signalrActivityService.d.ts +0 -44
  464. package/dist/services/signalrActivityService.js +0 -257
  465. package/dist/stores/authStore.d.ts +0 -154
  466. package/dist/stores/authStore.js +0 -1531
  467. package/dist/theme/ThemeProvider.d.ts +0 -14
  468. package/dist/theme/ThemeProvider.js +0 -28
  469. package/dist/theme/default.d.ts +0 -8
  470. package/dist/theme/default.js +0 -33
  471. package/dist/theme/index.d.ts +0 -15
  472. package/dist/theme/index.js +0 -25
  473. package/dist/theme/types.d.ts +0 -56
  474. package/dist/theme/types.js +0 -8
  475. package/dist/theme/useTheme.d.ts +0 -60
  476. package/dist/theme/useTheme.js +0 -63
  477. package/dist/theme/utils.d.ts +0 -13
  478. package/dist/theme/utils.js +0 -39
  479. package/dist/types/api.d.ts +0 -134
  480. package/dist/types/api.js +0 -44
  481. package/dist/types/auth.d.ts +0 -19
  482. package/dist/types/auth.js +0 -2
  483. package/dist/types/logging.d.ts +0 -42
  484. package/dist/types/logging.js +0 -2
  485. package/dist/types/recovery.d.ts +0 -48
  486. package/dist/types/recovery.js +0 -2
  487. package/dist/types/security.d.ts +0 -1
  488. package/dist/types/security.js +0 -2
  489. package/dist/utils/api.d.ts +0 -85
  490. package/dist/utils/api.js +0 -287
  491. package/dist/utils/circuitBreaker.d.ts +0 -43
  492. package/dist/utils/circuitBreaker.js +0 -91
  493. package/dist/utils/error-message.d.ts +0 -1
  494. package/dist/utils/error-message.js +0 -103
  495. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  496. package/dist/utils/layout/reservedSpace.js +0 -102
  497. package/dist/utils/logout.d.ts +0 -14
  498. package/dist/utils/logout.js +0 -32
  499. package/dist/vibe/client.d.ts +0 -261
  500. package/dist/vibe/client.js +0 -445
  501. package/dist/vibe/enterprise-auth.d.ts +0 -106
  502. package/dist/vibe/enterprise-auth.js +0 -173
  503. package/dist/vibe/errors.d.ts +0 -83
  504. package/dist/vibe/errors.js +0 -146
  505. package/dist/vibe/generic.d.ts +0 -234
  506. package/dist/vibe/generic.js +0 -369
  507. package/dist/vibe/hooks/index.d.ts +0 -169
  508. package/dist/vibe/hooks/index.js +0 -252
  509. package/dist/vibe/index.d.ts +0 -25
  510. package/dist/vibe/index.js +0 -72
  511. package/dist/vibe/sessions.d.ts +0 -161
  512. package/dist/vibe/sessions.js +0 -391
  513. package/dist/vibe/types.d.ts +0 -353
  514. package/dist/vibe/types.js +0 -315
  515. package/src/auth/auth-options.ts +0 -237
  516. package/src/auth/callbacks/index.ts +0 -7
  517. package/src/auth/callbacks/jwt.ts +0 -382
  518. package/src/auth/callbacks/session.ts +0 -243
  519. package/src/auth/callbacks/signin.ts +0 -56
  520. package/src/auth/events/index.ts +0 -5
  521. package/src/auth/events/signout.ts +0 -33
  522. package/src/auth/providers/credentials.ts +0 -256
  523. package/src/auth/providers/index.ts +0 -6
  524. package/src/auth/providers/oauth.ts +0 -114
  525. package/src/lib/nextauth-secret.ts +0 -121
  526. package/src/types/next-auth.d.ts +0 -15
@@ -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;