@payez/next-mvp 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/README.md +782 -0
  2. package/dist/api/auth-handler.d.ts +67 -0
  3. package/dist/api/auth-handler.js +397 -0
  4. package/dist/api/index.d.ts +10 -0
  5. package/dist/api/index.js +19 -0
  6. package/dist/api-handlers/account/change-password.d.ts +9 -0
  7. package/dist/api-handlers/account/change-password.js +112 -0
  8. package/dist/api-handlers/account/masked-info.d.ts +2 -0
  9. package/dist/api-handlers/account/masked-info.js +41 -0
  10. package/dist/api-handlers/account/profile.d.ts +3 -0
  11. package/dist/api-handlers/account/profile.js +63 -0
  12. package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
  13. package/dist/api-handlers/account/recovery/initiate.js +26 -0
  14. package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
  15. package/dist/api-handlers/account/recovery/send-code.js +28 -0
  16. package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
  17. package/dist/api-handlers/account/recovery/verify-code.js +28 -0
  18. package/dist/api-handlers/account/reset-password.d.ts +2 -0
  19. package/dist/api-handlers/account/reset-password.js +26 -0
  20. package/dist/api-handlers/account/send-code.d.ts +24 -0
  21. package/dist/api-handlers/account/send-code.js +60 -0
  22. package/dist/api-handlers/account/update-phone.d.ts +27 -0
  23. package/dist/api-handlers/account/update-phone.js +64 -0
  24. package/dist/api-handlers/account/validate-password.d.ts +17 -0
  25. package/dist/api-handlers/account/validate-password.js +81 -0
  26. package/dist/api-handlers/account/verify-email.d.ts +26 -0
  27. package/dist/api-handlers/account/verify-email.js +106 -0
  28. package/dist/api-handlers/account/verify-sms.d.ts +26 -0
  29. package/dist/api-handlers/account/verify-sms.js +106 -0
  30. package/dist/api-handlers/admin/analytics.d.ts +20 -0
  31. package/dist/api-handlers/admin/analytics.js +379 -0
  32. package/dist/api-handlers/admin/audit.d.ts +20 -0
  33. package/dist/api-handlers/admin/audit.js +214 -0
  34. package/dist/api-handlers/admin/index.d.ts +21 -0
  35. package/dist/api-handlers/admin/index.js +41 -0
  36. package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
  37. package/dist/api-handlers/admin/redis-sessions.js +204 -0
  38. package/dist/api-handlers/admin/sessions.d.ts +21 -0
  39. package/dist/api-handlers/admin/sessions.js +284 -0
  40. package/dist/api-handlers/admin/site-logs.d.ts +46 -0
  41. package/dist/api-handlers/admin/site-logs.js +318 -0
  42. package/dist/api-handlers/admin/users.d.ts +20 -0
  43. package/dist/api-handlers/admin/users.js +222 -0
  44. package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
  45. package/dist/api-handlers/admin/vibe-data.js +268 -0
  46. package/dist/api-handlers/anon/preferences.d.ts +37 -0
  47. package/dist/api-handlers/anon/preferences.js +96 -0
  48. package/dist/api-handlers/auth/jwks.d.ts +2 -0
  49. package/dist/api-handlers/auth/jwks.js +24 -0
  50. package/dist/api-handlers/auth/login.d.ts +42 -0
  51. package/dist/api-handlers/auth/login.js +178 -0
  52. package/dist/api-handlers/auth/refresh.d.ts +74 -0
  53. package/dist/api-handlers/auth/refresh.js +635 -0
  54. package/dist/api-handlers/auth/signout.d.ts +37 -0
  55. package/dist/api-handlers/auth/signout.js +187 -0
  56. package/dist/api-handlers/auth/status.d.ts +8 -0
  57. package/dist/api-handlers/auth/status.js +26 -0
  58. package/dist/api-handlers/auth/update-session.d.ts +37 -0
  59. package/dist/api-handlers/auth/update-session.js +95 -0
  60. package/dist/api-handlers/auth/validate.d.ts +6 -0
  61. package/dist/api-handlers/auth/validate.js +43 -0
  62. package/dist/api-handlers/auth/verify-code.d.ts +43 -0
  63. package/dist/api-handlers/auth/verify-code.js +94 -0
  64. package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
  65. package/dist/api-handlers/session/refresh-viability.js +39 -0
  66. package/dist/api-handlers/session/viability.d.ts +13 -0
  67. package/dist/api-handlers/session/viability.js +146 -0
  68. package/dist/api-handlers/test/force-expire.d.ts +23 -0
  69. package/dist/api-handlers/test/force-expire.js +65 -0
  70. package/dist/auth/auth-decision.d.ts +39 -0
  71. package/dist/auth/auth-decision.js +182 -0
  72. package/dist/auth/auth-options.d.ts +57 -0
  73. package/dist/auth/auth-options.js +213 -0
  74. package/dist/auth/callbacks/index.d.ts +6 -0
  75. package/dist/auth/callbacks/index.js +12 -0
  76. package/dist/auth/callbacks/jwt.d.ts +45 -0
  77. package/dist/auth/callbacks/jwt.js +305 -0
  78. package/dist/auth/callbacks/session.d.ts +60 -0
  79. package/dist/auth/callbacks/session.js +170 -0
  80. package/dist/auth/callbacks/signin.d.ts +23 -0
  81. package/dist/auth/callbacks/signin.js +44 -0
  82. package/dist/auth/events/index.d.ts +4 -0
  83. package/dist/auth/events/index.js +8 -0
  84. package/dist/auth/events/signout.d.ts +17 -0
  85. package/dist/auth/events/signout.js +32 -0
  86. package/dist/auth/providers/credentials.d.ts +32 -0
  87. package/dist/auth/providers/credentials.js +223 -0
  88. package/dist/auth/providers/index.d.ts +5 -0
  89. package/dist/auth/providers/index.js +21 -0
  90. package/dist/auth/providers/oauth.d.ts +26 -0
  91. package/dist/auth/providers/oauth.js +105 -0
  92. package/dist/auth/route-config.d.ts +66 -0
  93. package/dist/auth/route-config.js +190 -0
  94. package/dist/auth/types/auth-types.d.ts +417 -0
  95. package/dist/auth/types/auth-types.js +53 -0
  96. package/dist/auth/types/index.d.ts +6 -0
  97. package/dist/auth/types/index.js +22 -0
  98. package/dist/auth/unauthenticated-routes.d.ts +1 -0
  99. package/dist/auth/unauthenticated-routes.js +19 -0
  100. package/dist/auth/utils/idp-client.d.ts +94 -0
  101. package/dist/auth/utils/idp-client.js +383 -0
  102. package/dist/auth/utils/index.d.ts +5 -0
  103. package/dist/auth/utils/index.js +21 -0
  104. package/dist/auth/utils/token-utils.d.ts +84 -0
  105. package/dist/auth/utils/token-utils.js +219 -0
  106. package/dist/client/AuthContext.d.ts +19 -0
  107. package/dist/client/AuthContext.js +112 -0
  108. package/dist/client/fetch-with-auth.d.ts +11 -0
  109. package/dist/client/fetch-with-auth.js +44 -0
  110. package/dist/client/fetchWithSession.d.ts +3 -0
  111. package/dist/client/fetchWithSession.js +24 -0
  112. package/dist/client/index.d.ts +9 -0
  113. package/dist/client/index.js +20 -0
  114. package/dist/client/useAnonSession.d.ts +36 -0
  115. package/dist/client/useAnonSession.js +99 -0
  116. package/dist/components/SessionSync.d.ts +13 -0
  117. package/dist/components/SessionSync.js +119 -0
  118. package/dist/components/SignalRHealthCheck.d.ts +10 -0
  119. package/dist/components/SignalRHealthCheck.js +97 -0
  120. package/dist/components/account/UserAvatarMenu.d.ts +20 -0
  121. package/dist/components/account/UserAvatarMenu.js +80 -0
  122. package/dist/components/account/index.d.ts +7 -0
  123. package/dist/components/account/index.js +10 -0
  124. package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
  125. package/dist/components/admin/AlertSettingsTab.js +351 -0
  126. package/dist/components/admin/AnalyticsTab.d.ts +22 -0
  127. package/dist/components/admin/AnalyticsTab.js +167 -0
  128. package/dist/components/admin/DataBrowserTab.d.ts +19 -0
  129. package/dist/components/admin/DataBrowserTab.js +252 -0
  130. package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
  131. package/dist/components/admin/LoggingSettingsTab.js +339 -0
  132. package/dist/components/admin/SessionsTab.d.ts +37 -0
  133. package/dist/components/admin/SessionsTab.js +165 -0
  134. package/dist/components/admin/StatsTab.d.ts +53 -0
  135. package/dist/components/admin/StatsTab.js +161 -0
  136. package/dist/components/admin/VibeAdminContext.d.ts +32 -0
  137. package/dist/components/admin/VibeAdminContext.js +38 -0
  138. package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
  139. package/dist/components/admin/VibeAdminLayout.js +69 -0
  140. package/dist/components/admin/index.d.ts +29 -0
  141. package/dist/components/admin/index.js +44 -0
  142. package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
  143. package/dist/components/auth/FederatedAuthSection.js +45 -0
  144. package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
  145. package/dist/components/auth/ModeAwareLoginPage.js +42 -0
  146. package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
  147. package/dist/components/auth/ModeAwareSignupPage.js +78 -0
  148. package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
  149. package/dist/components/auth/TraditionalAuthSection.js +20 -0
  150. package/dist/components/recovery/CompleteStep.d.ts +5 -0
  151. package/dist/components/recovery/CompleteStep.js +8 -0
  152. package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
  153. package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
  154. package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
  155. package/dist/components/recovery/SelectMethodStep.js +8 -0
  156. package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
  157. package/dist/components/recovery/SetPasswordStep.js +20 -0
  158. package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
  159. package/dist/components/recovery/VerifyCodeStep.js +24 -0
  160. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
  161. package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
  162. package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
  163. package/dist/components/reserved/ReservedStatusBox.js +71 -0
  164. package/dist/components/ui/BetaBadge.d.ts +29 -0
  165. package/dist/components/ui/BetaBadge.js +38 -0
  166. package/dist/components/ui/Footer.d.ts +37 -0
  167. package/dist/components/ui/Footer.js +41 -0
  168. package/dist/config/env.d.ts +66 -0
  169. package/dist/config/env.js +57 -0
  170. package/dist/config/logger.d.ts +57 -0
  171. package/dist/config/logger.js +73 -0
  172. package/dist/config/logging-config.d.ts +30 -0
  173. package/dist/config/logging-config.js +122 -0
  174. package/dist/config/unauthenticated-routes.d.ts +17 -0
  175. package/dist/config/unauthenticated-routes.js +24 -0
  176. package/dist/config/vibe-log-transport.d.ts +79 -0
  177. package/dist/config/vibe-log-transport.js +203 -0
  178. package/dist/edge/internal-api-url.d.ts +53 -0
  179. package/dist/edge/internal-api-url.js +63 -0
  180. package/dist/edge/middleware.d.ts +14 -0
  181. package/dist/edge/middleware.js +32 -0
  182. package/dist/hooks/useAuth.d.ts +23 -0
  183. package/dist/hooks/useAuth.js +81 -0
  184. package/dist/hooks/useAuthSettings.d.ts +59 -0
  185. package/dist/hooks/useAuthSettings.js +93 -0
  186. package/dist/hooks/useAvailableProviders.d.ts +45 -0
  187. package/dist/hooks/useAvailableProviders.js +108 -0
  188. package/dist/hooks/usePasswordValidation.d.ts +27 -0
  189. package/dist/hooks/usePasswordValidation.js +102 -0
  190. package/dist/hooks/useProfile.d.ts +15 -0
  191. package/dist/hooks/useProfile.js +59 -0
  192. package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
  193. package/dist/hooks/usePublicAuthSettings.js +131 -0
  194. package/dist/hooks/useSessionExpiration.d.ts +57 -0
  195. package/dist/hooks/useSessionExpiration.js +72 -0
  196. package/dist/hooks/useViabilitySession.d.ts +75 -0
  197. package/dist/hooks/useViabilitySession.js +268 -0
  198. package/dist/index.d.ts +12 -0
  199. package/dist/index.js +54 -0
  200. package/dist/lib/anon-session.d.ts +74 -0
  201. package/dist/lib/anon-session.js +169 -0
  202. package/dist/lib/api-handler.d.ts +123 -0
  203. package/dist/lib/api-handler.js +478 -0
  204. package/dist/lib/app-slug.d.ts +95 -0
  205. package/dist/lib/app-slug.js +172 -0
  206. package/dist/lib/demo-mode.d.ts +6 -0
  207. package/dist/lib/demo-mode.js +16 -0
  208. package/dist/lib/geolocation.d.ts +64 -0
  209. package/dist/lib/geolocation.js +235 -0
  210. package/dist/lib/idp-client-config.d.ts +75 -0
  211. package/dist/lib/idp-client-config.js +351 -0
  212. package/dist/lib/idp-fetch.d.ts +14 -0
  213. package/dist/lib/idp-fetch.js +91 -0
  214. package/dist/lib/internal-api.d.ts +87 -0
  215. package/dist/lib/internal-api.js +122 -0
  216. package/dist/lib/jwt-decode-client.d.ts +10 -0
  217. package/dist/lib/jwt-decode-client.js +46 -0
  218. package/dist/lib/jwt-decode.d.ts +48 -0
  219. package/dist/lib/jwt-decode.js +57 -0
  220. package/dist/lib/nextauth-secret.d.ts +10 -0
  221. package/dist/lib/nextauth-secret.js +104 -0
  222. package/dist/lib/rate-limit-service.d.ts +23 -0
  223. package/dist/lib/rate-limit-service.js +6 -0
  224. package/dist/lib/redis.d.ts +5 -0
  225. package/dist/lib/redis.js +28 -0
  226. package/dist/lib/refresh-token-validator.d.ts +13 -0
  227. package/dist/lib/refresh-token-validator.js +117 -0
  228. package/dist/lib/roles.d.ts +145 -0
  229. package/dist/lib/roles.js +168 -0
  230. package/dist/lib/secret-validation.d.ts +4 -0
  231. package/dist/lib/secret-validation.js +14 -0
  232. package/dist/lib/session-store.d.ts +166 -0
  233. package/dist/lib/session-store.js +537 -0
  234. package/dist/lib/session.d.ts +21 -0
  235. package/dist/lib/session.js +26 -0
  236. package/dist/lib/site-logger.d.ts +214 -0
  237. package/dist/lib/site-logger.js +210 -0
  238. package/dist/lib/standardized-client-api.d.ts +161 -0
  239. package/dist/lib/standardized-client-api.js +786 -0
  240. package/dist/lib/startup-init.d.ts +40 -0
  241. package/dist/lib/startup-init.js +261 -0
  242. package/dist/lib/test-aware-get-token.d.ts +2 -0
  243. package/dist/lib/test-aware-get-token.js +81 -0
  244. package/dist/lib/token-expiry.d.ts +14 -0
  245. package/dist/lib/token-expiry.js +39 -0
  246. package/dist/lib/token-lifecycle.d.ts +52 -0
  247. package/dist/lib/token-lifecycle.js +398 -0
  248. package/dist/lib/types/api-responses.d.ts +128 -0
  249. package/dist/lib/types/api-responses.js +171 -0
  250. package/dist/lib/user-agent-parser.d.ts +50 -0
  251. package/dist/lib/user-agent-parser.js +220 -0
  252. package/dist/logging/api/admin-analytics.d.ts +3 -0
  253. package/dist/logging/api/admin-analytics.js +45 -0
  254. package/dist/logging/api/audit-log.d.ts +3 -0
  255. package/dist/logging/api/audit-log.js +52 -0
  256. package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
  257. package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
  258. package/dist/logging/components/AuditLogViewer.d.ts +7 -0
  259. package/dist/logging/components/AuditLogViewer.js +51 -0
  260. package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
  261. package/dist/logging/components/ErrorMetricsCard.js +16 -0
  262. package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
  263. package/dist/logging/components/HealthMetricsCard.js +19 -0
  264. package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
  265. package/dist/logging/hooks/useAdminAnalytics.js +22 -0
  266. package/dist/logging/hooks/useAuditLog.d.ts +6 -0
  267. package/dist/logging/hooks/useAuditLog.js +25 -0
  268. package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
  269. package/dist/logging/hooks/useErrorMetrics.js +38 -0
  270. package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
  271. package/dist/logging/hooks/useHealthMetrics.js +41 -0
  272. package/dist/logging/index.d.ts +11 -0
  273. package/dist/logging/index.js +40 -0
  274. package/dist/logging/types/analytics.d.ts +68 -0
  275. package/dist/logging/types/analytics.js +3 -0
  276. package/dist/logging/types/audit.d.ts +29 -0
  277. package/dist/logging/types/audit.js +2 -0
  278. package/dist/logging/types/index.d.ts +2 -0
  279. package/dist/logging/types/index.js +19 -0
  280. package/dist/middleware/auth-decision.d.ts +33 -0
  281. package/dist/middleware/auth-decision.js +65 -0
  282. package/dist/middleware/create-middleware.d.ts +100 -0
  283. package/dist/middleware/create-middleware.js +445 -0
  284. package/dist/middleware/rbac-check.d.ts +44 -0
  285. package/dist/middleware/rbac-check.js +191 -0
  286. package/dist/middleware/twofa-presets.d.ts +134 -0
  287. package/dist/middleware/twofa-presets.js +175 -0
  288. package/dist/models/DecodedAccessToken.d.ts +17 -0
  289. package/dist/models/DecodedAccessToken.js +2 -0
  290. package/dist/models/SessionModel.d.ts +122 -0
  291. package/dist/models/SessionModel.js +136 -0
  292. package/dist/pages/admin-login/page.d.ts +31 -0
  293. package/dist/pages/admin-login/page.js +83 -0
  294. package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
  295. package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
  296. package/dist/pages/admin-roles/index.d.ts +8 -0
  297. package/dist/pages/admin-roles/index.js +15 -0
  298. package/dist/pages/admin-roles/modals.d.ts +72 -0
  299. package/dist/pages/admin-roles/modals.js +154 -0
  300. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
  301. package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
  302. package/dist/pages/client-admin/index.d.ts +32 -0
  303. package/dist/pages/client-admin/index.js +37 -0
  304. package/dist/pages/login/page.d.ts +22 -0
  305. package/dist/pages/login/page.js +239 -0
  306. package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
  307. package/dist/pages/profile/EnhancedProfilePage.js +150 -0
  308. package/dist/pages/profile/index.d.ts +8 -0
  309. package/dist/pages/profile/index.js +16 -0
  310. package/dist/pages/profile/page.d.ts +19 -0
  311. package/dist/pages/profile/page.js +47 -0
  312. package/dist/pages/profile/profile-patch.d.ts +1 -0
  313. package/dist/pages/profile/profile-patch.js +281 -0
  314. package/dist/pages/recovery/page.d.ts +1 -0
  315. package/dist/pages/recovery/page.js +142 -0
  316. package/dist/pages/roles/MyRolesPage.d.ts +24 -0
  317. package/dist/pages/roles/MyRolesPage.js +71 -0
  318. package/dist/pages/roles/components.d.ts +63 -0
  319. package/dist/pages/roles/components.js +108 -0
  320. package/dist/pages/roles/index.d.ts +8 -0
  321. package/dist/pages/roles/index.js +19 -0
  322. package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
  323. package/dist/pages/security/EnhancedSecurityPage.js +248 -0
  324. package/dist/pages/security/index.d.ts +8 -0
  325. package/dist/pages/security/index.js +16 -0
  326. package/dist/pages/security/page.d.ts +21 -0
  327. package/dist/pages/security/page.js +212 -0
  328. package/dist/pages/security/security-patch.d.ts +1 -0
  329. package/dist/pages/security/security-patch.js +302 -0
  330. package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
  331. package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
  332. package/dist/pages/settings/index.d.ts +8 -0
  333. package/dist/pages/settings/index.js +16 -0
  334. package/dist/pages/settings/page.d.ts +7 -0
  335. package/dist/pages/settings/page.js +26 -0
  336. package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
  337. package/dist/pages/showcase/ShowcasePage.js +140 -0
  338. package/dist/pages/showcase/index.d.ts +12 -0
  339. package/dist/pages/showcase/index.js +17 -0
  340. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
  341. package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
  342. package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
  343. package/dist/pages/test-env/JwtInspectPage.js +114 -0
  344. package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
  345. package/dist/pages/test-env/RefreshTokenPage.js +91 -0
  346. package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
  347. package/dist/pages/test-env/TestEnvPage.js +49 -0
  348. package/dist/pages/test-env/index.d.ts +24 -0
  349. package/dist/pages/test-env/index.js +32 -0
  350. package/dist/pages/verify-code/page.d.ts +30 -0
  351. package/dist/pages/verify-code/page.js +408 -0
  352. package/dist/routes/account/index.d.ts +28 -0
  353. package/dist/routes/account/index.js +71 -0
  354. package/dist/routes/account/masked-info.d.ts +33 -0
  355. package/dist/routes/account/masked-info.js +39 -0
  356. package/dist/routes/account/send-code.d.ts +37 -0
  357. package/dist/routes/account/send-code.js +42 -0
  358. package/dist/routes/account/update-phone.d.ts +13 -0
  359. package/dist/routes/account/update-phone.js +17 -0
  360. package/dist/routes/account/verify-email.d.ts +38 -0
  361. package/dist/routes/account/verify-email.js +43 -0
  362. package/dist/routes/account/verify-sms.d.ts +38 -0
  363. package/dist/routes/account/verify-sms.js +43 -0
  364. package/dist/routes/auth/index.d.ts +19 -0
  365. package/dist/routes/auth/index.js +64 -0
  366. package/dist/routes/auth/logout.d.ts +31 -0
  367. package/dist/routes/auth/logout.js +113 -0
  368. package/dist/routes/auth/nextauth.d.ts +19 -0
  369. package/dist/routes/auth/nextauth.js +72 -0
  370. package/dist/routes/auth/refresh.d.ts +30 -0
  371. package/dist/routes/auth/refresh.js +51 -0
  372. package/dist/routes/auth/session.d.ts +72 -0
  373. package/dist/routes/auth/session.js +180 -0
  374. package/dist/routes/auth/settings.d.ts +25 -0
  375. package/dist/routes/auth/settings.js +55 -0
  376. package/dist/routes/auth/viability.d.ts +52 -0
  377. package/dist/routes/auth/viability.js +201 -0
  378. package/dist/routes/index.d.ts +12 -0
  379. package/dist/routes/index.js +54 -0
  380. package/dist/routes/session/index.d.ts +6 -0
  381. package/dist/routes/session/index.js +10 -0
  382. package/dist/routes/session/refresh-viability.d.ts +16 -0
  383. package/dist/routes/session/refresh-viability.js +20 -0
  384. package/dist/services/signalrActivityService.d.ts +44 -0
  385. package/dist/services/signalrActivityService.js +257 -0
  386. package/dist/stores/authStore.d.ts +154 -0
  387. package/dist/stores/authStore.js +1531 -0
  388. package/dist/theme/ThemeProvider.d.ts +14 -0
  389. package/dist/theme/ThemeProvider.js +28 -0
  390. package/dist/theme/default.d.ts +8 -0
  391. package/dist/theme/default.js +33 -0
  392. package/dist/theme/index.d.ts +15 -0
  393. package/dist/theme/index.js +25 -0
  394. package/dist/theme/types.d.ts +56 -0
  395. package/dist/theme/types.js +8 -0
  396. package/dist/theme/useTheme.d.ts +60 -0
  397. package/dist/theme/useTheme.js +63 -0
  398. package/dist/theme/utils.d.ts +13 -0
  399. package/dist/theme/utils.js +39 -0
  400. package/dist/types/api.d.ts +134 -0
  401. package/dist/types/api.js +44 -0
  402. package/dist/types/auth.d.ts +19 -0
  403. package/dist/types/auth.js +2 -0
  404. package/dist/types/logging.d.ts +42 -0
  405. package/dist/types/logging.js +2 -0
  406. package/dist/types/recovery.d.ts +48 -0
  407. package/dist/types/recovery.js +2 -0
  408. package/dist/types/security.d.ts +1 -0
  409. package/dist/types/security.js +2 -0
  410. package/dist/utils/api.d.ts +85 -0
  411. package/dist/utils/api.js +287 -0
  412. package/dist/utils/circuitBreaker.d.ts +43 -0
  413. package/dist/utils/circuitBreaker.js +91 -0
  414. package/dist/utils/error-message.d.ts +1 -0
  415. package/dist/utils/error-message.js +103 -0
  416. package/dist/utils/layout/reservedSpace.d.ts +59 -0
  417. package/dist/utils/layout/reservedSpace.js +102 -0
  418. package/dist/utils/logout.d.ts +14 -0
  419. package/dist/utils/logout.js +32 -0
  420. package/dist/vibe/client.d.ts +261 -0
  421. package/dist/vibe/client.js +445 -0
  422. package/dist/vibe/errors.d.ts +83 -0
  423. package/dist/vibe/errors.js +146 -0
  424. package/dist/vibe/generic.d.ts +234 -0
  425. package/dist/vibe/generic.js +369 -0
  426. package/dist/vibe/hooks/index.d.ts +169 -0
  427. package/dist/vibe/hooks/index.js +252 -0
  428. package/dist/vibe/index.d.ts +23 -0
  429. package/dist/vibe/index.js +67 -0
  430. package/dist/vibe/sessions.d.ts +161 -0
  431. package/dist/vibe/sessions.js +391 -0
  432. package/dist/vibe/types.d.ts +353 -0
  433. package/dist/vibe/types.js +315 -0
  434. package/package.json +855 -0
  435. package/scripts/check-internal-url-usage.sh +73 -0
  436. package/scripts/dev-broker.ps1 +35 -0
  437. package/scripts/dev-local.ps1 +45 -0
  438. package/src/api/auth-handler.ts +550 -0
  439. package/src/api/index.ts +18 -0
  440. package/src/api-handlers/account/change-password.ts +145 -0
  441. package/src/api-handlers/account/masked-info.ts +45 -0
  442. package/src/api-handlers/account/profile.ts +80 -0
  443. package/src/api-handlers/account/recovery/initiate.ts +23 -0
  444. package/src/api-handlers/account/recovery/send-code.ts +25 -0
  445. package/src/api-handlers/account/recovery/verify-code.ts +25 -0
  446. package/src/api-handlers/account/reset-password.ts +23 -0
  447. package/src/api-handlers/account/send-code.ts +76 -0
  448. package/src/api-handlers/account/update-phone.ts +79 -0
  449. package/src/api-handlers/account/validate-password.ts +118 -0
  450. package/src/api-handlers/account/verify-email.ts +125 -0
  451. package/src/api-handlers/account/verify-sms.ts +125 -0
  452. package/src/api-handlers/admin/analytics.ts +445 -0
  453. package/src/api-handlers/admin/audit.ts +225 -0
  454. package/src/api-handlers/admin/index.ts +59 -0
  455. package/src/api-handlers/admin/redis-sessions.ts +253 -0
  456. package/src/api-handlers/admin/sessions.ts +320 -0
  457. package/src/api-handlers/admin/site-logs.ts +367 -0
  458. package/src/api-handlers/admin/users.ts +244 -0
  459. package/src/api-handlers/admin/vibe-data.ts +326 -0
  460. package/src/api-handlers/anon/preferences.ts +123 -0
  461. package/src/api-handlers/auth/jwks.ts +20 -0
  462. package/src/api-handlers/auth/login.ts +240 -0
  463. package/src/api-handlers/auth/refresh.ts +687 -0
  464. package/src/api-handlers/auth/signout.ts +212 -0
  465. package/src/api-handlers/auth/status.ts +23 -0
  466. package/src/api-handlers/auth/update-session.ts +125 -0
  467. package/src/api-handlers/auth/validate.ts +44 -0
  468. package/src/api-handlers/auth/verify-code.ts +129 -0
  469. package/src/api-handlers/session/refresh-viability.ts +36 -0
  470. package/src/api-handlers/session/viability.ts +166 -0
  471. package/src/api-handlers/test/force-expire.ts +67 -0
  472. package/src/auth/auth-decision.ts +230 -0
  473. package/src/auth/auth-options.ts +237 -0
  474. package/src/auth/callbacks/index.ts +7 -0
  475. package/src/auth/callbacks/jwt.ts +382 -0
  476. package/src/auth/callbacks/session.ts +243 -0
  477. package/src/auth/callbacks/signin.ts +56 -0
  478. package/src/auth/events/index.ts +5 -0
  479. package/src/auth/events/signout.ts +33 -0
  480. package/src/auth/providers/credentials.ts +256 -0
  481. package/src/auth/providers/index.ts +6 -0
  482. package/src/auth/providers/oauth.ts +114 -0
  483. package/src/auth/route-config.ts +220 -0
  484. package/src/auth/types/auth-types.ts +555 -0
  485. package/src/auth/types/index.ts +7 -0
  486. package/src/auth/unauthenticated-routes.ts +3 -0
  487. package/src/auth/utils/idp-client.ts +444 -0
  488. package/src/auth/utils/index.ts +6 -0
  489. package/src/auth/utils/token-utils.ts +244 -0
  490. package/src/client/AuthContext.tsx +140 -0
  491. package/src/client/fetch-with-auth.ts +48 -0
  492. package/src/client/fetchWithSession.ts +21 -0
  493. package/src/client/index.ts +13 -0
  494. package/src/client/useAnonSession.ts +131 -0
  495. package/src/components/SessionSync.tsx +137 -0
  496. package/src/components/SignalRHealthCheck.tsx +131 -0
  497. package/src/components/account/UserAvatarMenu.tsx +217 -0
  498. package/src/components/account/index.ts +8 -0
  499. package/src/components/admin/AlertSettingsTab.tsx +728 -0
  500. package/src/components/admin/AnalyticsTab.tsx +703 -0
  501. package/src/components/admin/DataBrowserTab.tsx +505 -0
  502. package/src/components/admin/LoggingSettingsTab.tsx +665 -0
  503. package/src/components/admin/SessionsTab.tsx +414 -0
  504. package/src/components/admin/StatsTab.tsx +379 -0
  505. package/src/components/admin/VibeAdminContext.tsx +87 -0
  506. package/src/components/admin/VibeAdminLayout.tsx +185 -0
  507. package/src/components/admin/index.ts +59 -0
  508. package/src/components/auth/FederatedAuthSection.tsx +95 -0
  509. package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
  510. package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
  511. package/src/components/auth/TraditionalAuthSection.tsx +99 -0
  512. package/src/components/recovery/CompleteStep.tsx +36 -0
  513. package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
  514. package/src/components/recovery/SelectMethodStep.tsx +73 -0
  515. package/src/components/recovery/SetPasswordStep.tsx +97 -0
  516. package/src/components/recovery/VerifyCodeStep.tsx +90 -0
  517. package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
  518. package/src/components/reserved/ReservedStatusBox.tsx +118 -0
  519. package/src/components/ui/BetaBadge.tsx +58 -0
  520. package/src/components/ui/Footer.tsx +93 -0
  521. package/src/config/env.ts +57 -0
  522. package/src/config/logger.ts +62 -0
  523. package/src/config/logging-config.ts +82 -0
  524. package/src/config/unauthenticated-routes.ts +19 -0
  525. package/src/config/vibe-log-transport.ts +250 -0
  526. package/src/edge/internal-api-url.ts +65 -0
  527. package/src/edge/middleware.ts +42 -0
  528. package/src/hooks/useAuth.ts +115 -0
  529. package/src/hooks/useAuthSettings.ts +97 -0
  530. package/src/hooks/useAvailableProviders.ts +118 -0
  531. package/src/hooks/usePasswordValidation.ts +127 -0
  532. package/src/hooks/useProfile.ts +75 -0
  533. package/src/hooks/usePublicAuthSettings.ts +149 -0
  534. package/src/hooks/useSessionExpiration.ts +102 -0
  535. package/src/hooks/useViabilitySession.ts +335 -0
  536. package/src/index.ts +63 -0
  537. package/src/lib/anon-session.ts +213 -0
  538. package/src/lib/api-handler.ts +625 -0
  539. package/src/lib/app-slug.ts +178 -0
  540. package/src/lib/demo-mode.ts +13 -0
  541. package/src/lib/geolocation.ts +265 -0
  542. package/src/lib/idp-client-config.ts +442 -0
  543. package/src/lib/idp-fetch.ts +101 -0
  544. package/src/lib/internal-api.ts +171 -0
  545. package/src/lib/jwt-decode-client.ts +45 -0
  546. package/src/lib/jwt-decode.ts +83 -0
  547. package/src/lib/nextauth-secret.ts +126 -0
  548. package/src/lib/rate-limit-service.ts +9 -0
  549. package/src/lib/redis.ts +27 -0
  550. package/src/lib/refresh-token-validator.ts +64 -0
  551. package/src/lib/roles.ts +177 -0
  552. package/src/lib/secret-validation.ts +8 -0
  553. package/src/lib/session-store.ts +637 -0
  554. package/src/lib/session.ts +34 -0
  555. package/src/lib/site-logger.ts +245 -0
  556. package/src/lib/standardized-client-api.ts +896 -0
  557. package/src/lib/startup-init.ts +247 -0
  558. package/src/lib/test-aware-get-token.ts +30 -0
  559. package/src/lib/token-expiry.ts +40 -0
  560. package/src/lib/token-lifecycle.ts +477 -0
  561. package/src/lib/types/api-responses.ts +336 -0
  562. package/src/lib/user-agent-parser.ts +252 -0
  563. package/src/logging/api/admin-analytics.ts +51 -0
  564. package/src/logging/api/audit-log.ts +53 -0
  565. package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
  566. package/src/logging/components/AuditLogViewer.tsx +125 -0
  567. package/src/logging/components/ErrorMetricsCard.tsx +98 -0
  568. package/src/logging/components/HealthMetricsCard.tsx +70 -0
  569. package/src/logging/hooks/useAdminAnalytics.ts +22 -0
  570. package/src/logging/hooks/useAuditLog.ts +24 -0
  571. package/src/logging/hooks/useErrorMetrics.ts +40 -0
  572. package/src/logging/hooks/useHealthMetrics.ts +44 -0
  573. package/src/logging/index.ts +18 -0
  574. package/src/logging/types/analytics.ts +81 -0
  575. package/src/logging/types/audit.ts +31 -0
  576. package/src/logging/types/index.ts +3 -0
  577. package/src/middleware/auth-decision.ts +43 -0
  578. package/src/middleware/create-middleware.ts +626 -0
  579. package/src/middleware/rbac-check.ts +244 -0
  580. package/src/middleware/twofa-presets.ts +224 -0
  581. package/src/models/DecodedAccessToken.ts +17 -0
  582. package/src/models/SessionModel.ts +258 -0
  583. package/src/pages/admin-login/page.tsx +229 -0
  584. package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
  585. package/src/pages/admin-roles/index.ts +9 -0
  586. package/src/pages/admin-roles/modals.tsx +469 -0
  587. package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
  588. package/src/pages/client-admin/index.ts +33 -0
  589. package/src/pages/login/page.tsx +463 -0
  590. package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
  591. package/src/pages/profile/index.ts +9 -0
  592. package/src/pages/profile/page.tsx +166 -0
  593. package/src/pages/recovery/page.tsx +234 -0
  594. package/src/pages/roles/MyRolesPage.tsx +211 -0
  595. package/src/pages/roles/components.tsx +294 -0
  596. package/src/pages/roles/index.ts +17 -0
  597. package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
  598. package/src/pages/security/index.ts +9 -0
  599. package/src/pages/security/page.tsx +507 -0
  600. package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
  601. package/src/pages/settings/index.ts +9 -0
  602. package/src/pages/settings/page.tsx +47 -0
  603. package/src/pages/showcase/ShowcasePage.tsx +530 -0
  604. package/src/pages/showcase/index.ts +13 -0
  605. package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
  606. package/src/pages/test-env/JwtInspectPage.tsx +418 -0
  607. package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
  608. package/src/pages/test-env/TestEnvPage.tsx +116 -0
  609. package/src/pages/test-env/index.ts +25 -0
  610. package/src/pages/verify-code/page.tsx +648 -0
  611. package/src/routes/account/index.ts +32 -0
  612. package/src/routes/account/masked-info.ts +37 -0
  613. package/src/routes/account/send-code.ts +40 -0
  614. package/src/routes/account/update-phone.ts +13 -0
  615. package/src/routes/account/verify-email.ts +41 -0
  616. package/src/routes/account/verify-sms.ts +41 -0
  617. package/src/routes/auth/index.ts +23 -0
  618. package/src/routes/auth/logout.ts +127 -0
  619. package/src/routes/auth/nextauth.ts +71 -0
  620. package/src/routes/auth/refresh.ts +54 -0
  621. package/src/routes/auth/session.ts +193 -0
  622. package/src/routes/auth/settings.ts +75 -0
  623. package/src/routes/auth/viability.ts +220 -0
  624. package/src/routes/index.ts +18 -0
  625. package/src/routes/session/index.ts +7 -0
  626. package/src/routes/session/refresh-viability.ts +17 -0
  627. package/src/services/signalrActivityService.ts +258 -0
  628. package/src/stores/authStore.ts +1904 -0
  629. package/src/templates/instrumentation.ts +41 -0
  630. package/src/theme/ThemeProvider.tsx +39 -0
  631. package/src/theme/default.ts +33 -0
  632. package/src/theme/index.ts +31 -0
  633. package/src/theme/types.ts +69 -0
  634. package/src/theme/useTheme.ts +57 -0
  635. package/src/theme/utils.ts +40 -0
  636. package/src/types/api.ts +13 -0
  637. package/src/types/auth.d.ts +15 -0
  638. package/src/types/auth.ts +22 -0
  639. package/src/types/logging.ts +11 -0
  640. package/src/types/next-auth.d.ts +15 -0
  641. package/src/types/recovery.ts +54 -0
  642. package/src/types/security.ts +1 -0
  643. package/src/utils/api.ts +353 -0
  644. package/src/utils/circuitBreaker.ts +40 -0
  645. package/src/utils/error-message.ts +108 -0
  646. package/src/utils/layout/reservedSpace.ts +124 -0
  647. package/src/utils/logout.ts +30 -0
  648. package/src/vibe/client.ts +590 -0
  649. package/src/vibe/errors.ts +185 -0
  650. package/src/vibe/generic.ts +429 -0
  651. package/src/vibe/hooks/index.ts +367 -0
  652. package/src/vibe/index.ts +121 -0
  653. package/src/vibe/sessions.ts +551 -0
  654. package/src/vibe/types.ts +577 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * Client-safe JWT decode (no Node.js dependencies)
4
+ * This is a lightweight version for browser usage
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.jwtDecode = jwtDecode;
8
+ // Decode base64url
9
+ function base64urlDecode(base64url) {
10
+ try {
11
+ // Convert base64url to base64
12
+ let base64 = base64url.replace(/-/g, '+').replace(/_/g, '/');
13
+ // Add padding if needed
14
+ while (base64.length % 4) {
15
+ base64 += '=';
16
+ }
17
+ return atob(base64);
18
+ }
19
+ catch (e) {
20
+ throw new Error('Invalid base64url encoding');
21
+ }
22
+ }
23
+ /**
24
+ * Simple JWT decode for client-side use (no signature verification)
25
+ * @param token - JWT token string
26
+ * @returns Decoded payload or null if invalid
27
+ */
28
+ function jwtDecode(token) {
29
+ if (!token)
30
+ return null;
31
+ try {
32
+ const parts = token.split('.');
33
+ if (parts.length < 2) {
34
+ console.error('[JWT] Invalid token format');
35
+ return null;
36
+ }
37
+ const payload = parts[1];
38
+ const decoded = base64urlDecode(payload);
39
+ const parsedPayload = JSON.parse(decoded);
40
+ return parsedPayload;
41
+ }
42
+ catch (e) {
43
+ console.error('[JWT] Decode failed:', e instanceof Error ? e.message : 'Unknown error');
44
+ return null;
45
+ }
46
+ }
@@ -0,0 +1,48 @@
1
+ export interface JwtPayload {
2
+ iss?: string;
3
+ sub?: string;
4
+ aud?: string[] | string;
5
+ exp?: number;
6
+ nbf?: number;
7
+ iat?: number;
8
+ jti?: string;
9
+ }
10
+ /**
11
+ * JWT Header structure.
12
+ * Contains metadata about the token including the signing key ID.
13
+ */
14
+ export interface JwtHeader {
15
+ /** Algorithm used to sign the token (e.g., 'RS256', 'HS256') */
16
+ alg: string;
17
+ /** Token type (typically 'JWT') */
18
+ typ?: string;
19
+ /** Key ID - identifies which key was used to sign this token */
20
+ kid?: string;
21
+ /** Content type */
22
+ cty?: string;
23
+ }
24
+ /**
25
+ * Decode JWT payload (standard claims).
26
+ * This is a thin wrapper around jwt-decode library.
27
+ */
28
+ export declare function jwtDecode<T = JwtPayload>(token: string): T;
29
+ /**
30
+ * Decode JWT header to extract kid, alg, and other header claims.
31
+ *
32
+ * The JWT header contains critical information:
33
+ * - kid: Key ID used to sign the token (needed for key governance)
34
+ * - alg: Algorithm used for signing
35
+ * - typ: Token type
36
+ *
37
+ * @param token - The JWT token string
38
+ * @returns Decoded header or null if decoding fails
39
+ */
40
+ export declare function decodeJwtHeader(token: string): JwtHeader | null;
41
+ /**
42
+ * Extract just the kid (Key ID) from a JWT token.
43
+ * Convenience function for when you only need the key ID.
44
+ *
45
+ * @param token - The JWT token string
46
+ * @returns The kid value or undefined if not present/decodable
47
+ */
48
+ export declare function extractKidFromToken(token: string): string | undefined;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jwtDecode = jwtDecode;
4
+ exports.decodeJwtHeader = decodeJwtHeader;
5
+ exports.extractKidFromToken = extractKidFromToken;
6
+ const jwt_decode_1 = require("jwt-decode");
7
+ /**
8
+ * Decode JWT payload (standard claims).
9
+ * This is a thin wrapper around jwt-decode library.
10
+ */
11
+ function jwtDecode(token) {
12
+ return (0, jwt_decode_1.jwtDecode)(token);
13
+ }
14
+ /**
15
+ * Decode JWT header to extract kid, alg, and other header claims.
16
+ *
17
+ * The JWT header contains critical information:
18
+ * - kid: Key ID used to sign the token (needed for key governance)
19
+ * - alg: Algorithm used for signing
20
+ * - typ: Token type
21
+ *
22
+ * @param token - The JWT token string
23
+ * @returns Decoded header or null if decoding fails
24
+ */
25
+ function decodeJwtHeader(token) {
26
+ try {
27
+ if (!token || typeof token !== 'string') {
28
+ return null;
29
+ }
30
+ const parts = token.split('.');
31
+ if (parts.length !== 3) {
32
+ console.warn('[JWT_DECODE] Invalid JWT structure - expected 3 parts, got', parts.length);
33
+ return null;
34
+ }
35
+ // Decode base64url header (part 0)
36
+ const headerB64 = parts[0].replace(/-/g, '+').replace(/_/g, '/');
37
+ const headerJson = typeof atob !== 'undefined'
38
+ ? atob(headerB64)
39
+ : Buffer.from(headerB64, 'base64').toString('utf-8');
40
+ return JSON.parse(headerJson);
41
+ }
42
+ catch (error) {
43
+ console.error('[JWT_DECODE] Failed to decode JWT header:', error);
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * Extract just the kid (Key ID) from a JWT token.
49
+ * Convenience function for when you only need the key ID.
50
+ *
51
+ * @param token - The JWT token string
52
+ * @returns The kid value or undefined if not present/decodable
53
+ */
54
+ function extractKidFromToken(token) {
55
+ const header = decodeJwtHeader(token);
56
+ return header?.kid;
57
+ }
@@ -0,0 +1,10 @@
1
+ import 'server-only';
2
+ /**
3
+ * Resolve the NextAuth secret (server-only).
4
+ *
5
+ * Priority:
6
+ * 1) Use process.env.NEXTAUTH_SECRET if present (allows overrides/production)
7
+ * 2) Fetch from IDP broker endpoint - IDP handles all Key Vault/signing
8
+ * 3) Cache result in-memory and set process.env.NEXTAUTH_SECRET for subsequent calls
9
+ */
10
+ export declare function resolveNextAuthSecret(): Promise<string>;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveNextAuthSecret = resolveNextAuthSecret;
4
+ require("server-only");
5
+ const secret_validation_1 = require("./secret-validation");
6
+ const crypto_1 = require("crypto");
7
+ let cachedSecret = null;
8
+ let lastFetchedAt = 0;
9
+ /**
10
+ * Resolve the NextAuth secret (server-only).
11
+ *
12
+ * Priority:
13
+ * 1) Use process.env.NEXTAUTH_SECRET if present (allows overrides/production)
14
+ * 2) Fetch from IDP broker endpoint - IDP handles all Key Vault/signing
15
+ * 3) Cache result in-memory and set process.env.NEXTAUTH_SECRET for subsequent calls
16
+ */
17
+ async function resolveNextAuthSecret() {
18
+ // Check if already in environment
19
+ if (process.env.NEXTAUTH_SECRET && process.env.NEXTAUTH_SECRET.trim() !== '') {
20
+ // Silent - already configured
21
+ return process.env.NEXTAUTH_SECRET;
22
+ }
23
+ // Check if cached and fresh (within 5 minutes)
24
+ if (cachedSecret && Date.now() - lastFetchedAt < 5 * 60 * 1000) {
25
+ return cachedSecret;
26
+ }
27
+ // Broker mode: fetch from IDP (IDP handles all Key Vault/signing)
28
+ const base = process.env.IDP_URL;
29
+ if (!base)
30
+ throw new Error('IDP_URL environment variable is required');
31
+ const clientIdStr = process.env.CLIENT_ID;
32
+ if (!clientIdStr || clientIdStr.trim() === '')
33
+ throw new Error('CLIENT_ID is required (e.g., "ideal_resume_website")');
34
+ // Determine if clientId is numeric or string
35
+ const isNumeric = /^[0-9]+$/.test(clientIdStr);
36
+ const clientId = isNumeric ? parseInt(clientIdStr, 10) : clientIdStr;
37
+ // Step 1: Request IDP to sign a client assertion (IDP has the keys, not us)
38
+ const signingUrl = new URL(`${base.replace(/\/$/, '')}/api/ExternalAuth/sign-client-assertion`);
39
+ // Client ID passed via X-Client-Id header, not query string
40
+ const signingPayload = {
41
+ issuer: clientIdStr,
42
+ subject: clientIdStr,
43
+ audience: 'urn:payez:externalauth:nextauthsecret',
44
+ expires_in: 60
45
+ };
46
+ const signingResp = await fetch(signingUrl.toString(), {
47
+ method: 'POST',
48
+ headers: {
49
+ 'Accept': 'application/json',
50
+ 'Content-Type': 'application/json',
51
+ 'X-Client-Id': clientIdStr,
52
+ 'X-Correlation-Id': (0, crypto_1.randomUUID)().replace(/-/g, ''),
53
+ },
54
+ body: JSON.stringify(signingPayload),
55
+ cache: 'no-store'
56
+ });
57
+ if (!signingResp.ok) {
58
+ const txt = await signingResp.text().catch(() => 'Unknown error');
59
+ throw new Error(`Failed to sign client assertion: ${signingResp.status} ${signingResp.statusText} - ${txt}`);
60
+ }
61
+ const signingBody = await signingResp.json().catch(() => ({}));
62
+ const client_assertion = (signingBody?.data?.client_assertion ??
63
+ signingBody?.data?.clientAssertion ??
64
+ signingBody?.client_assertion ??
65
+ signingBody?.clientAssertion ??
66
+ signingBody?.data?.ClientAssertion ??
67
+ signingBody?.ClientAssertion);
68
+ if (!client_assertion || typeof client_assertion !== 'string') {
69
+ throw new Error('IDP did not return a valid signed client assertion');
70
+ }
71
+ // Step 2: Use the signed assertion to fetch the NextAuth secret
72
+ const proxyUrl = new URL(`${base.replace(/\/$/, '')}/api/ExternalAuth/next-auth/secret`);
73
+ const proxyResp = await fetch(proxyUrl.toString(), {
74
+ method: 'POST',
75
+ headers: {
76
+ 'Accept': 'application/json',
77
+ 'Content-Type': 'application/json',
78
+ 'X-Client-Id': clientIdStr,
79
+ 'X-Correlation-Id': (0, crypto_1.randomUUID)().replace(/-/g, ''),
80
+ },
81
+ body: JSON.stringify({ client_assertion }),
82
+ cache: 'no-store'
83
+ });
84
+ if (!proxyResp.ok) {
85
+ const txt = await proxyResp.text().catch(() => 'Unknown error');
86
+ throw new Error(`Proxy error: ${proxyResp.status} ${proxyResp.statusText} - ${txt}`);
87
+ }
88
+ const proxyBody = await proxyResp.json().catch(() => ({}));
89
+ const secret = (proxyBody?.data?.secret ?? proxyBody?.secret);
90
+ const configuration = (proxyBody?.data?.configuration ?? proxyBody?.configuration);
91
+ // Configuration is available but we don't log it verbosely
92
+ if (!secret || typeof secret !== 'string') {
93
+ throw new Error('Proxy did not return a valid NextAuth secret');
94
+ }
95
+ const validation = (0, secret_validation_1.validateNextAuthSecret)(secret);
96
+ if (!validation.valid) {
97
+ throw new Error(`Fetched NextAuth secret failed validation: ${validation.reason}`);
98
+ }
99
+ cachedSecret = secret;
100
+ lastFetchedAt = Date.now();
101
+ process.env.NEXTAUTH_SECRET = secret;
102
+ console.log('[NEXTAUTH-SECRET] Resolved from IDP (length:', secret.length + ')');
103
+ return secret;
104
+ }
@@ -0,0 +1,23 @@
1
+ export interface RateLimitRule {
2
+ endpoint: string;
3
+ period: string;
4
+ limit: number;
5
+ }
6
+ export interface RateLimitResult {
7
+ isAllowed: boolean;
8
+ requestCount: number;
9
+ limit: number;
10
+ retryAfterSeconds?: number;
11
+ failedAttempts?: number;
12
+ }
13
+ export declare function createPayEzRateLimitResponse(retryAfterSeconds: number, remainingAttempts?: number): {
14
+ success: boolean;
15
+ message: string;
16
+ user_info: null;
17
+ errors: {
18
+ code: string;
19
+ message: string;
20
+ resolution: string;
21
+ remainingAttempts: number;
22
+ }[];
23
+ };
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPayEzRateLimitResponse = createPayEzRateLimitResponse;
4
+ function createPayEzRateLimitResponse(retryAfterSeconds, remainingAttempts = 0) {
5
+ return { success: false, message: 'Too many failed attempts', user_info: null, errors: [{ code: 'RateLimitExceeded', message: 'Too many failed authentication attempts', resolution: `Please try again in ${retryAfterSeconds} seconds`, remainingAttempts }] };
6
+ }
@@ -0,0 +1,5 @@
1
+ import Redis from 'ioredis';
2
+ export declare function getRedis(): Redis;
3
+ declare const redis: Redis;
4
+ export { redis };
5
+ export default redis;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.redis = void 0;
7
+ exports.getRedis = getRedis;
8
+ // E:\Repos\PayEz-Next-MVP\packages\next-mvp\src\lib\redis.ts
9
+ const ioredis_1 = __importDefault(require("ioredis"));
10
+ let client = null;
11
+ function createClient() {
12
+ const url = process.env.REDIS_URL;
13
+ if (url && url.trim() !== '') {
14
+ // Use a standard configuration for better Docker compatibility
15
+ return new ioredis_1.default(url);
16
+ }
17
+ // No REDIS_URL set, create a client that will fail fast.
18
+ return new ioredis_1.default({ lazyConnect: true });
19
+ }
20
+ function getRedis() {
21
+ if (!client) {
22
+ client = createClient();
23
+ }
24
+ return client;
25
+ }
26
+ const redis = getRedis();
27
+ exports.redis = redis;
28
+ exports.default = redis;
@@ -0,0 +1,13 @@
1
+ export declare function isRefreshTokenValid(token: string): boolean;
2
+ export declare function isRefreshTokenExpiring(token: string, bufferMinutes?: number): boolean;
3
+ export declare function getRefreshTokenExpiration(token: string): number | null;
4
+ export declare function getRefreshTokenTimeRemaining(token: string): number | null;
5
+ export interface RefreshViabilityCheck {
6
+ canRefresh: boolean;
7
+ reason: 'valid_refresh_token' | 'no_refresh_token' | 'refresh_token_expired' | 'session_missing';
8
+ timeRemaining?: number;
9
+ expiresAt?: string;
10
+ accessTokenExpired?: boolean;
11
+ accessTokenTimeRemaining?: number;
12
+ }
13
+ export declare function checkRefreshViability(sessionData: any): RefreshViabilityCheck;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isRefreshTokenValid = isRefreshTokenValid;
4
+ exports.isRefreshTokenExpiring = isRefreshTokenExpiring;
5
+ exports.getRefreshTokenExpiration = getRefreshTokenExpiration;
6
+ exports.getRefreshTokenTimeRemaining = getRefreshTokenTimeRemaining;
7
+ exports.checkRefreshViability = checkRefreshViability;
8
+ const jwt_decode_1 = require("./jwt-decode");
9
+ const logger_1 = require("../config/logger");
10
+ function isRefreshTokenValid(token) {
11
+ if (!token)
12
+ return false;
13
+ try {
14
+ const decoded = (0, jwt_decode_1.jwtDecode)(token);
15
+ if (!decoded)
16
+ return false;
17
+ const now = Math.floor(Date.now() / 1000);
18
+ if (decoded.exp < now)
19
+ return false;
20
+ if (decoded.token_type !== 'refresh_token')
21
+ return false;
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ function isRefreshTokenExpiring(token, bufferMinutes = 60) {
29
+ if (!token)
30
+ return true;
31
+ try {
32
+ const decoded = (0, jwt_decode_1.jwtDecode)(token);
33
+ if (!decoded?.exp)
34
+ return true;
35
+ const now = Math.floor(Date.now() / 1000);
36
+ const buffer = bufferMinutes * 60;
37
+ return decoded.exp <= (now + buffer);
38
+ }
39
+ catch {
40
+ return true;
41
+ }
42
+ }
43
+ function getRefreshTokenExpiration(token) {
44
+ if (!token)
45
+ return null;
46
+ try {
47
+ const decoded = (0, jwt_decode_1.jwtDecode)(token);
48
+ if (!decoded?.exp)
49
+ return null;
50
+ return decoded.exp * 1000;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ function getRefreshTokenTimeRemaining(token) {
57
+ if (!token)
58
+ return null;
59
+ try {
60
+ const decoded = (0, jwt_decode_1.jwtDecode)(token);
61
+ if (!decoded?.exp)
62
+ return null;
63
+ const now = Math.floor(Date.now() / 1000);
64
+ const timeRemaining = decoded.exp - now;
65
+ return timeRemaining > 0 ? timeRemaining : null;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ function checkRefreshViability(sessionData) {
72
+ if (!sessionData)
73
+ return { canRefresh: false, reason: 'session_missing' };
74
+ let accessTokenExpired = false;
75
+ let accessTokenTimeRemaining;
76
+ if (sessionData.idpAccessTokenExpires) {
77
+ const now = Date.now();
78
+ let expiresAtMs = sessionData.idpAccessTokenExpires;
79
+ if (typeof expiresAtMs === 'string')
80
+ expiresAtMs = parseInt(expiresAtMs, 10);
81
+ if (expiresAtMs < 1000000000000)
82
+ expiresAtMs = expiresAtMs * 1000;
83
+ accessTokenTimeRemaining = Math.floor((expiresAtMs - now) / 1000);
84
+ const bufferSec = 5 * 60; // 5 minutes pre-expiry buffer
85
+ accessTokenExpired = accessTokenTimeRemaining <= bufferSec;
86
+ logger_1.tokenRefreshLogger.debug('[REFRESH_VIABILITY] Access token expiration check', { now, expiresAtMs, accessTokenTimeRemaining, bufferSec, accessTokenExpired });
87
+ }
88
+ if (!sessionData.idpRefreshToken)
89
+ return { canRefresh: false, reason: 'no_refresh_token', accessTokenExpired, accessTokenTimeRemaining };
90
+ if (sessionData.idpRefreshTokenExpires) {
91
+ let refreshExpMs = sessionData.idpRefreshTokenExpires;
92
+ if (typeof refreshExpMs === 'string')
93
+ refreshExpMs = parseInt(refreshExpMs, 10);
94
+ if (refreshExpMs < 1000000000000)
95
+ refreshExpMs = refreshExpMs * 1000;
96
+ const nowMs = Date.now();
97
+ const timeRemainingSec = Math.floor((refreshExpMs - nowMs) / 1000);
98
+ if (timeRemainingSec <= 0)
99
+ return { canRefresh: false, reason: 'refresh_token_expired', accessTokenExpired, accessTokenTimeRemaining };
100
+ return { canRefresh: true, reason: 'valid_refresh_token', timeRemaining: timeRemainingSec, expiresAt: new Date(refreshExpMs).toISOString(), accessTokenExpired, accessTokenTimeRemaining };
101
+ }
102
+ try {
103
+ const decoded = (0, jwt_decode_1.jwtDecode)(sessionData.idpRefreshToken);
104
+ const nowSec = Math.floor(Date.now() / 1000);
105
+ if (!decoded?.exp || decoded.token_type !== 'refresh_token')
106
+ return { canRefresh: false, reason: 'refresh_token_expired', accessTokenExpired, accessTokenTimeRemaining };
107
+ const timeRemaining = decoded.exp - nowSec;
108
+ if (timeRemaining <= 0)
109
+ return { canRefresh: false, reason: 'refresh_token_expired', accessTokenExpired, accessTokenTimeRemaining };
110
+ const expiresAtIso = new Date(decoded.exp * 1000).toISOString();
111
+ return { canRefresh: true, reason: 'valid_refresh_token', timeRemaining, expiresAt: expiresAtIso, accessTokenExpired, accessTokenTimeRemaining };
112
+ }
113
+ catch (error) {
114
+ logger_1.tokenRefreshLogger.debug('[REFRESH_VIABILITY] Failed to decode refresh token for viability', { error: error instanceof Error ? error.message : String(error) });
115
+ return { canRefresh: false, reason: 'refresh_token_expired', accessTokenExpired, accessTokenTimeRemaining };
116
+ }
117
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Vibe Role Constants and Utilities
3
+ *
4
+ * Centralized role definitions for consistent authorization across the stack.
5
+ *
6
+ * @version 1.0
7
+ */
8
+ /**
9
+ * Global platform roles (IDP-level)
10
+ * These roles are managed at the IDP and grant cross-client access.
11
+ */
12
+ export declare const GlobalRoles: {
13
+ /** Platform super admin - full access to everything */
14
+ readonly PAYEZ_ADMIN: "payez_admin";
15
+ /** IDP client admin - manages IDP client configuration */
16
+ readonly IDP_CLIENT_ADMIN: "idp_client_admin";
17
+ /** Vibe platform admin - manages Vibe infrastructure globally */
18
+ readonly VIBE_APP_ADMIN: "vibe_app_admin";
19
+ /** Vibe client admin - manages Vibe for a specific tenant */
20
+ readonly VIBE_CLIENT_ADMIN: "vibe_client_admin";
21
+ /** Vibe agents user - AI agents operating via CLI/automation */
22
+ readonly VIBE_AGENTS_USER: "vibe_agents_user";
23
+ };
24
+ /**
25
+ * Application-level roles (per-client)
26
+ * These roles are scoped to a specific client/tenant.
27
+ */
28
+ export declare const AppRoles: {
29
+ /** Standard authenticated user */
30
+ readonly VIBE_APP_USER: "vibe_app_user";
31
+ };
32
+ /**
33
+ * All Vibe roles combined
34
+ */
35
+ export declare const VibeRoles: {
36
+ /** Standard authenticated user */
37
+ readonly VIBE_APP_USER: "vibe_app_user";
38
+ /** Platform super admin - full access to everything */
39
+ readonly PAYEZ_ADMIN: "payez_admin";
40
+ /** IDP client admin - manages IDP client configuration */
41
+ readonly IDP_CLIENT_ADMIN: "idp_client_admin";
42
+ /** Vibe platform admin - manages Vibe infrastructure globally */
43
+ readonly VIBE_APP_ADMIN: "vibe_app_admin";
44
+ /** Vibe client admin - manages Vibe for a specific tenant */
45
+ readonly VIBE_CLIENT_ADMIN: "vibe_client_admin";
46
+ /** Vibe agents user - AI agents operating via CLI/automation */
47
+ readonly VIBE_AGENTS_USER: "vibe_agents_user";
48
+ };
49
+ /**
50
+ * Roles that grant admin access to the /admin section.
51
+ * Any of these roles allows access to admin pages.
52
+ */
53
+ export declare const ADMIN_ROLES: readonly string[];
54
+ /**
55
+ * Roles that grant platform-wide admin access (not client-scoped).
56
+ * These can access/modify any client's data.
57
+ */
58
+ export declare const PLATFORM_ADMIN_ROLES: readonly string[];
59
+ /**
60
+ * Roles that grant client-scoped admin access.
61
+ * These can only access their own client's data.
62
+ */
63
+ export declare const CLIENT_ADMIN_ROLES: readonly string[];
64
+ /**
65
+ * Check if user has a specific role
66
+ */
67
+ export declare function hasRole(userRoles: string[] | undefined, role: string): boolean;
68
+ /**
69
+ * Check if user has any of the specified roles
70
+ */
71
+ export declare function hasAnyRole(userRoles: string[] | undefined, roles: readonly string[]): boolean;
72
+ /**
73
+ * Check if user has all of the specified roles
74
+ */
75
+ export declare function hasAllRoles(userRoles: string[] | undefined, roles: readonly string[]): boolean;
76
+ /**
77
+ * Check if user has admin access (any admin role)
78
+ */
79
+ export declare function isAdmin(userRoles: string[] | undefined): boolean;
80
+ /**
81
+ * Check if user has platform-wide admin access
82
+ */
83
+ export declare function isPlatformAdmin(userRoles: string[] | undefined): boolean;
84
+ /**
85
+ * Check if user is a client-scoped admin (not platform admin)
86
+ */
87
+ export declare function isClientAdmin(userRoles: string[] | undefined): boolean;
88
+ /**
89
+ * Role hierarchy (higher index = more access)
90
+ *
91
+ * payez_admin (4) - IDP super admin, can do anything
92
+ * vibe_app_admin (3) - Platform admin, manages Vibe globally
93
+ * vibe_client_admin (2) - Client admin, manages their own tenant
94
+ * idp_client_admin (2) - IDP client admin, manages IDP config
95
+ * vibe_app_user (1) - Regular authenticated user
96
+ * (anonymous) (0) - No authentication
97
+ */
98
+ export declare const ROLE_HIERARCHY: Record<string, number>;
99
+ /**
100
+ * Get the highest role level for a user
101
+ */
102
+ export declare function getHighestRoleLevel(userRoles: string[] | undefined): number;
103
+ declare const _default: {
104
+ VibeRoles: {
105
+ /** Standard authenticated user */
106
+ readonly VIBE_APP_USER: "vibe_app_user";
107
+ /** Platform super admin - full access to everything */
108
+ readonly PAYEZ_ADMIN: "payez_admin";
109
+ /** IDP client admin - manages IDP client configuration */
110
+ readonly IDP_CLIENT_ADMIN: "idp_client_admin";
111
+ /** Vibe platform admin - manages Vibe infrastructure globally */
112
+ readonly VIBE_APP_ADMIN: "vibe_app_admin";
113
+ /** Vibe client admin - manages Vibe for a specific tenant */
114
+ readonly VIBE_CLIENT_ADMIN: "vibe_client_admin";
115
+ /** Vibe agents user - AI agents operating via CLI/automation */
116
+ readonly VIBE_AGENTS_USER: "vibe_agents_user";
117
+ };
118
+ GlobalRoles: {
119
+ /** Platform super admin - full access to everything */
120
+ readonly PAYEZ_ADMIN: "payez_admin";
121
+ /** IDP client admin - manages IDP client configuration */
122
+ readonly IDP_CLIENT_ADMIN: "idp_client_admin";
123
+ /** Vibe platform admin - manages Vibe infrastructure globally */
124
+ readonly VIBE_APP_ADMIN: "vibe_app_admin";
125
+ /** Vibe client admin - manages Vibe for a specific tenant */
126
+ readonly VIBE_CLIENT_ADMIN: "vibe_client_admin";
127
+ /** Vibe agents user - AI agents operating via CLI/automation */
128
+ readonly VIBE_AGENTS_USER: "vibe_agents_user";
129
+ };
130
+ AppRoles: {
131
+ /** Standard authenticated user */
132
+ readonly VIBE_APP_USER: "vibe_app_user";
133
+ };
134
+ ADMIN_ROLES: readonly string[];
135
+ PLATFORM_ADMIN_ROLES: readonly string[];
136
+ CLIENT_ADMIN_ROLES: readonly string[];
137
+ hasRole: typeof hasRole;
138
+ hasAnyRole: typeof hasAnyRole;
139
+ hasAllRoles: typeof hasAllRoles;
140
+ isAdmin: typeof isAdmin;
141
+ isPlatformAdmin: typeof isPlatformAdmin;
142
+ isClientAdmin: typeof isClientAdmin;
143
+ getHighestRoleLevel: typeof getHighestRoleLevel;
144
+ };
145
+ export default _default;