@adonis-agora/authkit-server 0.34.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 (389) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -0
  3. package/build/assets/grafana/authkit-dashboard.json +118 -0
  4. package/build/commands/clients_create.d.ts +27 -0
  5. package/build/commands/clients_create.js +121 -0
  6. package/build/commands/commands.json +292 -0
  7. package/build/commands/configure.d.ts +2 -0
  8. package/build/commands/configure.js +45 -0
  9. package/build/commands/doctor.d.ts +10 -0
  10. package/build/commands/doctor.js +113 -0
  11. package/build/commands/eject.d.ts +11 -0
  12. package/build/commands/eject.js +96 -0
  13. package/build/commands/expire_scan.d.ts +28 -0
  14. package/build/commands/expire_scan.js +92 -0
  15. package/build/commands/import_users.d.ts +17 -0
  16. package/build/commands/import_users.js +80 -0
  17. package/build/commands/keys_rotate.d.ts +21 -0
  18. package/build/commands/keys_rotate.js +126 -0
  19. package/build/commands/main.d.ts +12 -0
  20. package/build/commands/main.js +38 -0
  21. package/build/commands/settings_get.d.ts +18 -0
  22. package/build/commands/settings_get.js +43 -0
  23. package/build/commands/settings_list.d.ts +17 -0
  24. package/build/commands/settings_list.js +39 -0
  25. package/build/commands/settings_set.d.ts +20 -0
  26. package/build/commands/settings_set.js +55 -0
  27. package/build/commands/settings_unset.d.ts +18 -0
  28. package/build/commands/settings_unset.js +46 -0
  29. package/build/commands/ui_preset.d.ts +4 -0
  30. package/build/commands/ui_preset.js +32 -0
  31. package/build/database/migrations/make_authkit_oidc_table.d.ts +6 -0
  32. package/build/database/migrations/make_authkit_oidc_table.js +19 -0
  33. package/build/host/ui/admin.html +29 -0
  34. package/build/host/views/account/apps.edge +59 -0
  35. package/build/host/views/account/confirm.edge +70 -0
  36. package/build/host/views/account/email-confirmed.edge +16 -0
  37. package/build/host/views/account/login.edge +33 -0
  38. package/build/host/views/account/mfa.edge +152 -0
  39. package/build/host/views/account/orgs.edge +58 -0
  40. package/build/host/views/account/security.edge +215 -0
  41. package/build/host/views/account/tokens.edge +75 -0
  42. package/build/host/views/consent.edge +20 -0
  43. package/build/host/views/forgot.edge +43 -0
  44. package/build/host/views/login.edge +251 -0
  45. package/build/host/views/maintenance.edge +32 -0
  46. package/build/host/views/mfa-challenge.edge +107 -0
  47. package/build/host/views/otp-unlock.edge +40 -0
  48. package/build/host/views/partials/styles.edge +2 -0
  49. package/build/host/views/reset.edge +30 -0
  50. package/build/host/views/signup.edge +62 -0
  51. package/build/host/views/verify-email.edge +17 -0
  52. package/build/index.d.ts +115 -0
  53. package/build/index.js +76 -0
  54. package/build/password/common_passwords.txt +10000 -0
  55. package/build/providers/authkit_server_provider.d.ts +27 -0
  56. package/build/providers/authkit_server_provider.js +242 -0
  57. package/build/src/accounts/account_store.d.ts +578 -0
  58. package/build/src/accounts/account_store.js +60 -0
  59. package/build/src/accounts/lucid_account_store.d.ts +156 -0
  60. package/build/src/accounts/lucid_account_store.js +294 -0
  61. package/build/src/accounts/lucid_store/core.d.ts +9 -0
  62. package/build/src/accounts/lucid_store/core.js +306 -0
  63. package/build/src/accounts/lucid_store/mfa.d.ts +15 -0
  64. package/build/src/accounts/lucid_store/mfa.js +108 -0
  65. package/build/src/accounts/lucid_store/organizations.d.ts +13 -0
  66. package/build/src/accounts/lucid_store/organizations.js +294 -0
  67. package/build/src/accounts/lucid_store/password_hygiene.d.ts +20 -0
  68. package/build/src/accounts/lucid_store/password_hygiene.js +130 -0
  69. package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
  70. package/build/src/accounts/lucid_store/provider_identity.js +59 -0
  71. package/build/src/accounts/lucid_store/shared.d.ts +113 -0
  72. package/build/src/accounts/lucid_store/shared.js +130 -0
  73. package/build/src/accounts/lucid_store/status_profile.d.ts +34 -0
  74. package/build/src/accounts/lucid_store/status_profile.js +100 -0
  75. package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
  76. package/build/src/accounts/lucid_store/webauthn.js +140 -0
  77. package/build/src/accounts/lucid_stores.d.ts +45 -0
  78. package/build/src/accounts/lucid_stores.js +30 -0
  79. package/build/src/adapters/adapter_contract.d.ts +37 -0
  80. package/build/src/adapters/adapter_contract.js +1 -0
  81. package/build/src/adapters/database_adapter.d.ts +21 -0
  82. package/build/src/adapters/database_adapter.js +79 -0
  83. package/build/src/adapters/factory.d.ts +30 -0
  84. package/build/src/adapters/factory.js +43 -0
  85. package/build/src/adapters/redis_adapter.d.ts +24 -0
  86. package/build/src/adapters/redis_adapter.js +122 -0
  87. package/build/src/audit/audit_sink.d.ts +63 -0
  88. package/build/src/audit/audit_sink.js +1 -0
  89. package/build/src/audit/lucid_audit_sink.d.ts +10 -0
  90. package/build/src/audit/lucid_audit_sink.js +99 -0
  91. package/build/src/commands/expire_scan_command.d.ts +60 -0
  92. package/build/src/commands/expire_scan_command.js +229 -0
  93. package/build/src/commands/import_clients.d.ts +40 -0
  94. package/build/src/commands/import_clients.js +79 -0
  95. package/build/src/commands/import_users.d.ts +51 -0
  96. package/build/src/commands/import_users.js +94 -0
  97. package/build/src/commands/resolve_config.d.ts +13 -0
  98. package/build/src/commands/resolve_config.js +18 -0
  99. package/build/src/commands/settings_commands.d.ts +47 -0
  100. package/build/src/commands/settings_commands.js +270 -0
  101. package/build/src/controllers/oidc_callback_controller.d.ts +22 -0
  102. package/build/src/controllers/oidc_callback_controller.js +33 -0
  103. package/build/src/define_config.d.ts +772 -0
  104. package/build/src/define_config.js +351 -0
  105. package/build/src/doctor/checks.d.ts +197 -0
  106. package/build/src/doctor/checks.js +858 -0
  107. package/build/src/events/dispatcher.d.ts +45 -0
  108. package/build/src/events/dispatcher.js +117 -0
  109. package/build/src/host/account_api/account_api_controller.d.ts +245 -0
  110. package/build/src/host/account_api/account_api_controller.js +827 -0
  111. package/build/src/host/account_deletion_ops.d.ts +80 -0
  112. package/build/src/host/account_deletion_ops.js +118 -0
  113. package/build/src/host/account_deletion_service.d.ts +63 -0
  114. package/build/src/host/account_deletion_service.js +133 -0
  115. package/build/src/host/account_export_service.d.ts +76 -0
  116. package/build/src/host/account_export_service.js +140 -0
  117. package/build/src/host/account_home.d.ts +11 -0
  118. package/build/src/host/account_home.js +11 -0
  119. package/build/src/host/account_lockout.d.ts +86 -0
  120. package/build/src/host/account_lockout.js +185 -0
  121. package/build/src/host/active_org_cookie.d.ts +28 -0
  122. package/build/src/host/active_org_cookie.js +47 -0
  123. package/build/src/host/admin_api/admin_api_guard.d.ts +16 -0
  124. package/build/src/host/admin_api/admin_api_guard.js +59 -0
  125. package/build/src/host/admin_api/admin_orgs_service.d.ts +125 -0
  126. package/build/src/host/admin_api/admin_orgs_service.js +324 -0
  127. package/build/src/host/admin_api/admin_users_service.d.ts +163 -0
  128. package/build/src/host/admin_api/admin_users_service.js +308 -0
  129. package/build/src/host/admin_api/api_clients_controller.d.ts +54 -0
  130. package/build/src/host/admin_api/api_clients_controller.js +89 -0
  131. package/build/src/host/admin_api/api_keys_controller.d.ts +19 -0
  132. package/build/src/host/admin_api/api_keys_controller.js +36 -0
  133. package/build/src/host/admin_api/api_misc_controller.d.ts +19 -0
  134. package/build/src/host/admin_api/api_misc_controller.js +44 -0
  135. package/build/src/host/admin_api/api_orgs_controller.d.ts +108 -0
  136. package/build/src/host/admin_api/api_orgs_controller.js +189 -0
  137. package/build/src/host/admin_api/api_settings_controller.d.ts +55 -0
  138. package/build/src/host/admin_api/api_settings_controller.js +134 -0
  139. package/build/src/host/admin_api/api_users_controller.d.ts +108 -0
  140. package/build/src/host/admin_api/api_users_controller.js +187 -0
  141. package/build/src/host/admin_api/dto.d.ts +131 -0
  142. package/build/src/host/admin_api/dto.js +122 -0
  143. package/build/src/host/admin_api/token_verify_service.d.ts +34 -0
  144. package/build/src/host/admin_api/token_verify_service.js +74 -0
  145. package/build/src/host/admin_clients_service.d.ts +88 -0
  146. package/build/src/host/admin_clients_service.js +181 -0
  147. package/build/src/host/admin_console/admin_shell_controller.d.ts +27 -0
  148. package/build/src/host/admin_console/admin_shell_controller.js +167 -0
  149. package/build/src/host/admin_console/console_audit_controller.d.ts +17 -0
  150. package/build/src/host/admin_console/console_audit_controller.js +25 -0
  151. package/build/src/host/admin_console/console_clients_controller.d.ts +53 -0
  152. package/build/src/host/admin_console/console_clients_controller.js +102 -0
  153. package/build/src/host/admin_console/console_impersonation_controller.d.ts +23 -0
  154. package/build/src/host/admin_console/console_impersonation_controller.js +45 -0
  155. package/build/src/host/admin_console/console_keys_controller.d.ts +24 -0
  156. package/build/src/host/admin_console/console_keys_controller.js +41 -0
  157. package/build/src/host/admin_console/console_orgs_controller.d.ts +96 -0
  158. package/build/src/host/admin_console/console_orgs_controller.js +238 -0
  159. package/build/src/host/admin_console/console_overview_controller.d.ts +27 -0
  160. package/build/src/host/admin_console/console_overview_controller.js +44 -0
  161. package/build/src/host/admin_console/console_roles_controller.d.ts +31 -0
  162. package/build/src/host/admin_console/console_roles_controller.js +108 -0
  163. package/build/src/host/admin_console/console_sessions_controller.d.ts +91 -0
  164. package/build/src/host/admin_console/console_sessions_controller.js +125 -0
  165. package/build/src/host/admin_console/console_settings_controller.d.ts +47 -0
  166. package/build/src/host/admin_console/console_settings_controller.js +115 -0
  167. package/build/src/host/admin_console/console_users_controller.d.ts +110 -0
  168. package/build/src/host/admin_console/console_users_controller.js +212 -0
  169. package/build/src/host/admin_prefix.d.ts +50 -0
  170. package/build/src/host/admin_prefix.js +77 -0
  171. package/build/src/host/admin_sessions_service.d.ts +119 -0
  172. package/build/src/host/admin_sessions_service.js +284 -0
  173. package/build/src/host/admin_stats_service.d.ts +44 -0
  174. package/build/src/host/admin_stats_service.js +130 -0
  175. package/build/src/host/admin_validators.d.ts +247 -0
  176. package/build/src/host/admin_validators.js +197 -0
  177. package/build/src/host/augmentations.d.ts +12 -0
  178. package/build/src/host/augmentations.js +1 -0
  179. package/build/src/host/auth_host_config.d.ts +22 -0
  180. package/build/src/host/auth_host_config.js +13 -0
  181. package/build/src/host/avatar_storage.d.ts +68 -0
  182. package/build/src/host/avatar_storage.js +166 -0
  183. package/build/src/host/bot_protection.d.ts +187 -0
  184. package/build/src/host/bot_protection.js +132 -0
  185. package/build/src/host/branding.d.ts +19 -0
  186. package/build/src/host/branding.js +8 -0
  187. package/build/src/host/config_locks.d.ts +38 -0
  188. package/build/src/host/config_locks.js +70 -0
  189. package/build/src/host/console_session.d.ts +27 -0
  190. package/build/src/host/console_session.js +36 -0
  191. package/build/src/host/controllers/account_apps_controller.d.ts +15 -0
  192. package/build/src/host/controllers/account_apps_controller.js +61 -0
  193. package/build/src/host/controllers/account_confirm_controller.d.ts +24 -0
  194. package/build/src/host/controllers/account_confirm_controller.js +144 -0
  195. package/build/src/host/controllers/account_mfa_controller.d.ts +28 -0
  196. package/build/src/host/controllers/account_mfa_controller.js +208 -0
  197. package/build/src/host/controllers/account_orgs_controller.d.ts +80 -0
  198. package/build/src/host/controllers/account_orgs_controller.js +401 -0
  199. package/build/src/host/controllers/account_security_controller.d.ts +43 -0
  200. package/build/src/host/controllers/account_security_controller.js +546 -0
  201. package/build/src/host/controllers/account_session_controller.d.ts +21 -0
  202. package/build/src/host/controllers/account_session_controller.js +113 -0
  203. package/build/src/host/controllers/account_tokens_controller.d.ts +7 -0
  204. package/build/src/host/controllers/account_tokens_controller.js +67 -0
  205. package/build/src/host/controllers/interaction_controller.d.ts +125 -0
  206. package/build/src/host/controllers/interaction_controller.js +981 -0
  207. package/build/src/host/controllers/pat_introspection_controller.d.ts +22 -0
  208. package/build/src/host/controllers/pat_introspection_controller.js +46 -0
  209. package/build/src/host/controllers/registration_controller.d.ts +18 -0
  210. package/build/src/host/controllers/registration_controller.js +382 -0
  211. package/build/src/host/controllers/social_controller.d.ts +8 -0
  212. package/build/src/host/controllers/social_controller.js +89 -0
  213. package/build/src/host/csrf.d.ts +29 -0
  214. package/build/src/host/csrf.js +14 -0
  215. package/build/src/host/default_mailer.d.ts +112 -0
  216. package/build/src/host/default_mailer.js +417 -0
  217. package/build/src/host/durable/account_deletion_workflow.d.ts +48 -0
  218. package/build/src/host/durable/account_deletion_workflow.js +86 -0
  219. package/build/src/host/durable/account_export_workflow.d.ts +68 -0
  220. package/build/src/host/durable/account_export_workflow.js +93 -0
  221. package/build/src/host/durable/index.d.ts +68 -0
  222. package/build/src/host/durable/index.js +77 -0
  223. package/build/src/host/email_templates.d.ts +39 -0
  224. package/build/src/host/email_templates.js +69 -0
  225. package/build/src/host/geo.d.ts +22 -0
  226. package/build/src/host/geo.js +39 -0
  227. package/build/src/host/i18n.d.ts +1416 -0
  228. package/build/src/host/i18n.js +1583 -0
  229. package/build/src/host/impersonation.d.ts +25 -0
  230. package/build/src/host/impersonation.js +31 -0
  231. package/build/src/host/key_rotation.d.ts +14 -0
  232. package/build/src/host/key_rotation.js +27 -0
  233. package/build/src/host/key_rotation_actions.d.ts +42 -0
  234. package/build/src/host/key_rotation_actions.js +27 -0
  235. package/build/src/host/login_attempt.d.ts +98 -0
  236. package/build/src/host/login_attempt.js +211 -0
  237. package/build/src/host/login_notify.d.ts +27 -0
  238. package/build/src/host/login_notify.js +142 -0
  239. package/build/src/host/middleware/account_auth.d.ts +7 -0
  240. package/build/src/host/middleware/account_auth.js +11 -0
  241. package/build/src/host/otp_lockout.d.ts +103 -0
  242. package/build/src/host/otp_lockout.js +221 -0
  243. package/build/src/host/rate_limit.d.ts +39 -0
  244. package/build/src/host/rate_limit.js +94 -0
  245. package/build/src/host/register_auth_host.d.ts +97 -0
  246. package/build/src/host/register_auth_host.js +466 -0
  247. package/build/src/host/renderers/edge_renderer.d.ts +12 -0
  248. package/build/src/host/renderers/edge_renderer.js +38 -0
  249. package/build/src/host/renderers/inertia_renderer.d.ts +70 -0
  250. package/build/src/host/renderers/inertia_renderer.js +54 -0
  251. package/build/src/host/runtime_settings.d.ts +181 -0
  252. package/build/src/host/runtime_settings.js +307 -0
  253. package/build/src/host/runtime_toggles.d.ts +807 -0
  254. package/build/src/host/runtime_toggles.js +784 -0
  255. package/build/src/host/security_notice_service.d.ts +36 -0
  256. package/build/src/host/security_notice_service.js +87 -0
  257. package/build/src/host/session_context.d.ts +23 -0
  258. package/build/src/host/session_context.js +89 -0
  259. package/build/src/host/sudo_mode.d.ts +56 -0
  260. package/build/src/host/sudo_mode.js +99 -0
  261. package/build/src/host/svg_chart.d.ts +15 -0
  262. package/build/src/host/svg_chart.js +45 -0
  263. package/build/src/host/trusted_device.d.ts +61 -0
  264. package/build/src/host/trusted_device.js +65 -0
  265. package/build/src/host/ui-dist/assets/index-CRWcmsex.js +137 -0
  266. package/build/src/host/ui-dist/assets/index-DTSmD4RU.css +1 -0
  267. package/build/src/host/ui-dist/index.html +17 -0
  268. package/build/src/host/user_agent.d.ts +18 -0
  269. package/build/src/host/user_agent.js +50 -0
  270. package/build/src/host/validators.d.ts +127 -0
  271. package/build/src/host/validators.js +53 -0
  272. package/build/src/keys/jwks_manager.d.ts +6 -0
  273. package/build/src/keys/jwks_manager.js +11 -0
  274. package/build/src/keys/keystore.d.ts +52 -0
  275. package/build/src/keys/keystore.js +68 -0
  276. package/build/src/keys/keystore_codec.d.ts +20 -0
  277. package/build/src/keys/keystore_codec.js +42 -0
  278. package/build/src/keys/keystore_crypto.d.ts +9 -0
  279. package/build/src/keys/keystore_crypto.js +27 -0
  280. package/build/src/keys/keystore_manager.d.ts +43 -0
  281. package/build/src/keys/keystore_manager.js +104 -0
  282. package/build/src/keys/keystore_vault.d.ts +113 -0
  283. package/build/src/keys/keystore_vault.js +265 -0
  284. package/build/src/mixins/json_column.d.ts +33 -0
  285. package/build/src/mixins/json_column.js +38 -0
  286. package/build/src/mixins/with_audit_log.d.ts +19 -0
  287. package/build/src/mixins/with_audit_log.js +39 -0
  288. package/build/src/mixins/with_auth_user.d.ts +24 -0
  289. package/build/src/mixins/with_auth_user.js +46 -0
  290. package/build/src/mixins/with_credentials.d.ts +20 -0
  291. package/build/src/mixins/with_credentials.js +29 -0
  292. package/build/src/mixins/with_mfa.d.ts +35 -0
  293. package/build/src/mixins/with_mfa.js +21 -0
  294. package/build/src/mixins/with_personal_access_token.d.ts +19 -0
  295. package/build/src/mixins/with_personal_access_token.js +42 -0
  296. package/build/src/mixins/with_provider_identity.d.ts +20 -0
  297. package/build/src/mixins/with_provider_identity.js +32 -0
  298. package/build/src/mixins/with_webauthn_credential.d.ts +37 -0
  299. package/build/src/mixins/with_webauthn_credential.js +46 -0
  300. package/build/src/observability/diagnostics_bridge.d.ts +6 -0
  301. package/build/src/observability/diagnostics_bridge.js +27 -0
  302. package/build/src/observability/metrics_controller.d.ts +5 -0
  303. package/build/src/observability/metrics_controller.js +24 -0
  304. package/build/src/observability/metrics_service.d.ts +2 -0
  305. package/build/src/observability/metrics_service.js +7 -0
  306. package/build/src/observability/otel_recorder.d.ts +10 -0
  307. package/build/src/observability/otel_recorder.js +59 -0
  308. package/build/src/observability/telescope/data_providers.d.ts +24 -0
  309. package/build/src/observability/telescope/data_providers.js +235 -0
  310. package/build/src/observability/telescope/extension.d.ts +29 -0
  311. package/build/src/observability/telescope/extension.js +167 -0
  312. package/build/src/observability/telescope/index.d.ts +8 -0
  313. package/build/src/observability/telescope/index.js +8 -0
  314. package/build/src/observability/wire_provider_events.d.ts +12 -0
  315. package/build/src/observability/wire_provider_events.js +30 -0
  316. package/build/src/password/common_passwords.d.ts +31 -0
  317. package/build/src/password/common_passwords.js +73 -0
  318. package/build/src/password/password_manager.d.ts +163 -0
  319. package/build/src/password/password_manager.js +191 -0
  320. package/build/src/password/policy.d.ts +71 -0
  321. package/build/src/password/policy.js +55 -0
  322. package/build/src/password/pwned.d.ts +36 -0
  323. package/build/src/password/pwned.js +52 -0
  324. package/build/src/pat/lucid_pat_store.d.ts +6 -0
  325. package/build/src/pat/lucid_pat_store.js +62 -0
  326. package/build/src/pat/pat_store.d.ts +31 -0
  327. package/build/src/pat/pat_store.js +1 -0
  328. package/build/src/pat/pat_tokens.d.ts +4 -0
  329. package/build/src/pat/pat_tokens.js +9 -0
  330. package/build/src/provider/build_provider.d.ts +45 -0
  331. package/build/src/provider/build_provider.js +219 -0
  332. package/build/src/provider/device_sources.d.ts +6 -0
  333. package/build/src/provider/device_sources.js +65 -0
  334. package/build/src/provider/interaction_actions.d.ts +36 -0
  335. package/build/src/provider/interaction_actions.js +55 -0
  336. package/build/src/provider/key_rotation_scheduler.d.ts +28 -0
  337. package/build/src/provider/key_rotation_scheduler.js +40 -0
  338. package/build/src/provider/keystore_reload.d.ts +21 -0
  339. package/build/src/provider/keystore_reload.js +39 -0
  340. package/build/src/provider/logout_sources.d.ts +13 -0
  341. package/build/src/provider/logout_sources.js +64 -0
  342. package/build/src/provider/oidc_service.d.ts +81 -0
  343. package/build/src/provider/oidc_service.js +254 -0
  344. package/build/src/provider/single_flight_lock.d.ts +18 -0
  345. package/build/src/provider/single_flight_lock.js +31 -0
  346. package/build/src/provider/token_exchange.d.ts +21 -0
  347. package/build/src/provider/token_exchange.js +124 -0
  348. package/build/src/register_routes.d.ts +16 -0
  349. package/build/src/register_routes.js +21 -0
  350. package/build/src/schema/ensure.d.ts +41 -0
  351. package/build/src/schema/ensure.js +262 -0
  352. package/build/stubs/config/authkit.stub +20 -0
  353. package/build/stubs/config/authkit_react.stub +52 -0
  354. package/build/stubs/main.d.ts +1 -0
  355. package/build/stubs/main.js +2 -0
  356. package/build/stubs/models/auth_user.stub +22 -0
  357. package/build/stubs/ui/edge/views/consent.edge +13 -0
  358. package/build/stubs/ui/edge/views/login.edge +19 -0
  359. package/build/stubs/ui/react/components/auth_shell.tsx +67 -0
  360. package/build/stubs/ui/react/pages/account/login.tsx +56 -0
  361. package/build/stubs/ui/react/pages/account/mfa.tsx +132 -0
  362. package/build/stubs/ui/react/pages/account/tokens.tsx +88 -0
  363. package/build/stubs/ui/react/pages/consent.tsx +39 -0
  364. package/build/stubs/ui/react/pages/forgot.tsx +44 -0
  365. package/build/stubs/ui/react/pages/login.tsx +171 -0
  366. package/build/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  367. package/build/stubs/ui/react/pages/reset.tsx +58 -0
  368. package/build/stubs/ui/react/pages/signup.tsx +78 -0
  369. package/build/stubs/ui/react/pages/verify-email.tsx +24 -0
  370. package/build/types.d.ts +7 -0
  371. package/build/types.js +1 -0
  372. package/package.json +147 -0
  373. package/stubs/config/authkit.stub +20 -0
  374. package/stubs/config/authkit_react.stub +52 -0
  375. package/stubs/main.ts +2 -0
  376. package/stubs/models/auth_user.stub +22 -0
  377. package/stubs/ui/edge/views/consent.edge +13 -0
  378. package/stubs/ui/edge/views/login.edge +19 -0
  379. package/stubs/ui/react/components/auth_shell.tsx +67 -0
  380. package/stubs/ui/react/pages/account/login.tsx +56 -0
  381. package/stubs/ui/react/pages/account/mfa.tsx +132 -0
  382. package/stubs/ui/react/pages/account/tokens.tsx +88 -0
  383. package/stubs/ui/react/pages/consent.tsx +39 -0
  384. package/stubs/ui/react/pages/forgot.tsx +44 -0
  385. package/stubs/ui/react/pages/login.tsx +171 -0
  386. package/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  387. package/stubs/ui/react/pages/reset.tsx +58 -0
  388. package/stubs/ui/react/pages/signup.tsx +78 -0
  389. package/stubs/ui/react/pages/verify-email.tsx +24 -0
@@ -0,0 +1,578 @@
1
+ /** DTO público da conta — o que o provider e os controllers enxergam. Nunca um model Lucid. */
2
+ export interface AuthAccount {
3
+ id: string;
4
+ email: string;
5
+ globalRoles?: string[];
6
+ name?: string;
7
+ avatarUrl?: string;
8
+ }
9
+ export interface CreateAccountInput {
10
+ email: string;
11
+ password: string;
12
+ fullName?: string | null;
13
+ globalRoles?: string[];
14
+ /** social/Google entra como true (provider já verificou o email). Default: false. */
15
+ emailVerified?: boolean;
16
+ }
17
+ /** Dados para ligar uma identidade de provider a uma conta. */
18
+ export interface LinkProviderIdentityInput {
19
+ accountId: string;
20
+ provider: string;
21
+ providerUserId: string;
22
+ email?: string;
23
+ }
24
+ /** Parâmetros de listagem paginada de contas (console admin). */
25
+ export interface ListAccountsParams {
26
+ /** Filtro por e-mail (substring, case-insensitive). */
27
+ search?: string;
28
+ /** Página (1-based). Default: 1. */
29
+ page?: number;
30
+ /** Itens por página. Default: 20. */
31
+ limit?: number;
32
+ }
33
+ /** Página de resultados + total absoluto (para paginação na UI). */
34
+ export interface Paginated<T> {
35
+ data: T[];
36
+ total: number;
37
+ }
38
+ /**
39
+ * Resumo de uma passkey (credencial WebAuthn) para exibição na UI de gerência.
40
+ * Nunca expõe a chave pública nem o counter.
41
+ */
42
+ export interface PasskeySummary {
43
+ /** Credential id (base64url). */
44
+ id: string;
45
+ /** Rótulo legível opcional (ex.: nome do dispositivo). */
46
+ label?: string;
47
+ /** ISO timestamp de criação. */
48
+ createdAt: string;
49
+ }
50
+ /**
51
+ * Núcleo SEMPRE presente do store de contas: identidade (findById/verifyCredentials),
52
+ * cadastro, reset de senha, verificação de e-mail e administração (listagem/roles).
53
+ *
54
+ * As demais funcionalidades (MFA, passkeys/WebAuthn, account linking por provider)
55
+ * são CAPACIDADES separadas e opcionais — um store pode implementá-las ou não. Veja
56
+ * {@link MfaCapability}, {@link WebauthnCapability}, {@link ProviderIdentityCapability}.
57
+ * O tipo composto usado pela config é {@link AccountStore}.
58
+ */
59
+ export interface CoreAccountStore extends AdminCapability {
60
+ findById(id: string): Promise<AuthAccount | null>;
61
+ verifyCredentials(email: string, password: string): Promise<AuthAccount | null>;
62
+ findByEmail(email: string): Promise<AuthAccount | null>;
63
+ create(input: CreateAccountInput): Promise<AuthAccount>;
64
+ issuePasswordResetToken(email: string): Promise<{
65
+ token: string;
66
+ account: AuthAccount;
67
+ } | null>;
68
+ consumePasswordResetToken(token: string, newPassword: string): Promise<boolean>;
69
+ issueEmailVerificationToken(email: string): Promise<{
70
+ token: string;
71
+ account: AuthAccount;
72
+ } | null>;
73
+ consumeEmailVerificationToken(token: string): Promise<boolean>;
74
+ }
75
+ /**
76
+ * Administração (console admin opt-in — B6). Hoje faz parte do núcleo (os stores
77
+ * default sempre a implementam e os controllers admin a chamam direto), mas é
78
+ * modelada como capacidade própria para clareza e futura granularidade.
79
+ */
80
+ export interface AdminCapability {
81
+ /** Lista contas paginadas, opcionalmente filtrando por e-mail. */
82
+ listAccounts(params: ListAccountsParams): Promise<Paginated<AuthAccount>>;
83
+ /** Substitui as roles globais de uma conta. */
84
+ setGlobalRoles(accountId: string, roles: string[]): Promise<void>;
85
+ /**
86
+ * Capacidade OPCIONAL: conta eficientemente quantas contas possuem a role
87
+ * global `role` (ex.: para a invariante de "último admin", evitando paginar
88
+ * a base inteira em memória). Retorna o número de contas que têm a role.
89
+ *
90
+ * Por que opcional: o formato de `globalRoles` é host-shaped (coluna JSON,
91
+ * tabela de junção, claim externa, etc.), então a lib NÃO consegue emitir uma
92
+ * query de contagem genérica. Hosts que conhecem o próprio shape implementam
93
+ * isto (ex.: `whereJsonSuperset`/`EXISTS` no dialeto deles). Ausente → o
94
+ * caller usa o fallback de scan paginado via {@link listAccounts}.
95
+ *
96
+ * Use {@link supportsCountByGlobalRole} para estreitar em runtime.
97
+ */
98
+ countByGlobalRole?(role: string): Promise<number>;
99
+ }
100
+ /**
101
+ * Self-service de segurança da conta (console de conta): trocar a senha e o
102
+ * e-mail (com confirmação no NOVO endereço). É uma CAPACIDADE opcional — stores
103
+ * sem suporte omitem os métodos e a UI esconde a seção correspondente.
104
+ *
105
+ * A troca de e-mail usa um token de confirmação que viaja para o NOVO endereço
106
+ * ({@link requestEmailChange}) e é consumido por {@link confirmEmailChange}. O
107
+ * store default (Lucid) reaproveita a coluna `emailVerificationToken` codificando
108
+ * um payload `ec:<email>:<token>` — assim NÃO exige migração nova (ver
109
+ * `lucid_store/core.ts`). O tradeoff é que um token de verificação de cadastro e
110
+ * um de troca de e-mail não coexistem (mesma coluna); na prática são fluxos
111
+ * distintos no tempo.
112
+ */
113
+ export interface AccountSecurityCapability {
114
+ /**
115
+ * Define uma nova senha para a conta (após o controller confirmar a senha ATUAL
116
+ * via {@link CoreAccountStore.verifyCredentials}). Retorna false se a conta não
117
+ * existe.
118
+ */
119
+ changePassword(accountId: string, newPassword: string): Promise<boolean>;
120
+ /**
121
+ * Inicia a troca de e-mail: gera um token de confirmação para o `newEmail` e o
122
+ * persiste. Retorna o token + a conta, ou null se a conta não existe OU se o
123
+ * `newEmail` já pertence a outra conta.
124
+ */
125
+ requestEmailChange(accountId: string, newEmail: string): Promise<{
126
+ token: string;
127
+ account: AuthAccount;
128
+ newEmail: string;
129
+ } | null>;
130
+ /**
131
+ * Confirma a troca de e-mail consumindo o token (single-use). Em caso de
132
+ * sucesso aplica o novo e-mail, marca-o como verificado e limpa o token.
133
+ * Retorna `{ ok: true, account, oldEmail, newEmail }` ou `{ ok: false }`.
134
+ * `oldEmail` é o e-mail da conta ANTES da troca (para avisos de segurança ao
135
+ * endereço antigo e auditoria). `account.email` já reflete o novo endereço.
136
+ */
137
+ confirmEmailChange(token: string): Promise<{
138
+ ok: true;
139
+ account: AuthAccount;
140
+ oldEmail: string;
141
+ newEmail: string;
142
+ } | {
143
+ ok: false;
144
+ }>;
145
+ }
146
+ /**
147
+ * Status da conta (habilitar/desabilitar) — usado pelo console admin para
148
+ * suspender uma conta sem apagá-la. É uma CAPACIDADE opcional: stores sem suporte
149
+ * omitem os métodos e a UI esconde os botões de disable/enable. Quando suportada,
150
+ * os fluxos de login (interaction OIDC + console de conta) DEVEM rejeitar contas
151
+ * desabilitadas (ver `attemptPasswordLogin`).
152
+ *
153
+ * O store default (Lucid) implementa via uma coluna `disabled_at` (timestamp
154
+ * nullable) NO model — quando a coluna existe (probe em `$columnsDefinitions`); se
155
+ * o model não a tiver, a capacidade fica genuinamente ausente (nenhum método é
156
+ * montado) e a UI esconde os botões. Hosts adicionam a coluna por migração própria
157
+ * (mesmo padrão documentado das demais colunas opcionais).
158
+ */
159
+ export interface AccountStatusCapability {
160
+ /** Desabilita a conta (impede login). No-op se a conta não existe. */
161
+ disableAccount(accountId: string): Promise<void>;
162
+ /** Reabilita a conta. No-op se a conta não existe. */
163
+ enableAccount(accountId: string): Promise<void>;
164
+ /** Indica se a conta está desabilitada (false se a conta não existe). */
165
+ isDisabled(accountId: string): Promise<boolean>;
166
+ }
167
+ /**
168
+ * Edição do perfil próprio (console de conta): nome e avatar. CAPACIDADE opcional;
169
+ * stores sem suporte omitem o método e a UI esconde a seção. O store default
170
+ * (Lucid) grava nas colunas `full_name`/`avatar_url` do model — apenas as que
171
+ * existirem (probe em `$columnsDefinitions`).
172
+ */
173
+ export interface ProfileCapability {
174
+ /**
175
+ * Atualiza o perfil da conta. Campos `undefined` são deixados como estão;
176
+ * `null` limpa o valor. Retorna a conta atualizada ou null se inexistente.
177
+ */
178
+ updateProfile(accountId: string, patch: {
179
+ name?: string | null;
180
+ avatarUrl?: string | null;
181
+ }): Promise<AuthAccount | null>;
182
+ }
183
+ /**
184
+ * Account linking por identidade de provider (Google, GitHub, …).
185
+ * `(provider, providerUserId)` é a chave estável vinda do provider OAuth — não
186
+ * depende do e-mail (que pode mudar / não estar presente). Uma conta pode ter
187
+ * várias identidades. Stores sem suporte simplesmente NÃO expõem estes métodos
188
+ * (a capacidade fica ausente) — não há fallback que lança.
189
+ */
190
+ export interface ProviderIdentityCapability {
191
+ /** Acha a conta ligada a uma identidade de provider; null se desconhecida. */
192
+ findByProviderIdentity(provider: string, providerUserId: string): Promise<AuthAccount | null>;
193
+ /** Liga (upsert idempotente na chave única) uma identidade de provider a uma conta. */
194
+ linkProviderIdentity(data: LinkProviderIdentityInput): Promise<void>;
195
+ /**
196
+ * Remove TODAS as identidades de provider ligadas a uma conta (usado na deleção
197
+ * de conta — LGPD). Retorna quantas foram removidas. No-op (0) se a conta não tem
198
+ * identidades.
199
+ */
200
+ unlinkAllProviderIdentities(accountId: string): Promise<number>;
201
+ /**
202
+ * Lista as identidades de provider de uma conta (usado no export de dados —
203
+ * LGPD). NUNCA expõe tokens/segredos do provider — só provider + providerUserId +
204
+ * email (quando presente).
205
+ */
206
+ listProviderIdentities(accountId: string): Promise<ProviderIdentitySummary[]>;
207
+ }
208
+ /** Resumo de uma identidade de provider para export/exibição (sem tokens). */
209
+ export interface ProviderIdentitySummary {
210
+ provider: string;
211
+ providerUserId: string;
212
+ email?: string | null;
213
+ }
214
+ /**
215
+ * MFA / TOTP. Stores sem suporte a MFA omitem a capacidade inteira; o interaction
216
+ * flow trata a ausência como "MFA desligado".
217
+ */
218
+ export interface MfaCapability {
219
+ /**
220
+ * Estado do MFA da conta (se o desafio TOTP deve ser exigido no login).
221
+ * `enabledAt` (epoch ms) é o instante em que o MFA foi (re)enrolado, usado pelo
222
+ * mecanismo de "trusted devices": um cookie de confiança emitido ANTES desse
223
+ * instante é considerado inválido (re-enrolar MFA revoga a confiança). Pode ser
224
+ * `null`/ausente quando o MFA não está ativo ou o store não rastreia o instante.
225
+ */
226
+ getMfaState(accountId: string): Promise<{
227
+ enabled: boolean;
228
+ enabledAt?: number | null;
229
+ }>;
230
+ /**
231
+ * Inicia o enrollment TOTP: gera um segredo PENDENTE (mfaEnabledAt continua
232
+ * null) e devolve o segredo + otpauth URI (keyuri). Não ativa o MFA ainda.
233
+ */
234
+ startTotpEnrollment(accountId: string): Promise<{
235
+ secret: string;
236
+ otpauthUri: string;
237
+ } | null>;
238
+ /**
239
+ * Confirma o enrollment: verifica o código contra o segredo pendente; em caso
240
+ * de sucesso ativa o MFA, gera N recovery codes e devolve os códigos em claro
241
+ * (uma única vez).
242
+ */
243
+ confirmTotpEnrollment(accountId: string, code: string): Promise<{
244
+ ok: boolean;
245
+ recoveryCodes?: string[];
246
+ }>;
247
+ /** Verifica um código TOTP contra o segredo ativo. */
248
+ verifyTotp(accountId: string, code: string): Promise<boolean>;
249
+ /** Consome (single-use) um recovery code; true se casou e foi removido. */
250
+ consumeRecoveryCode(accountId: string, code: string): Promise<boolean>;
251
+ /** Desliga o MFA: limpa segredo + mfaEnabledAt + recovery codes. */
252
+ disableMfa(accountId: string): Promise<void>;
253
+ }
254
+ /**
255
+ * MFA / WebAuthn (passkeys) — 2º fator alternativo ao TOTP. Como o TOTP, é uma
256
+ * capacidade INTEIRA opcional: stores sem suporte a passkeys não a expõem e a UI
257
+ * esconde a seção de passkeys. O `expectedChallenge` é gerado no begin
258
+ * (generate*Options) e DEVE ser guardado pelo controller (na sessão) para ser
259
+ * passado de volta no finish (verify*) — o store não mantém estado de desafio
260
+ * entre as chamadas.
261
+ */
262
+ export interface WebauthnCapability {
263
+ /**
264
+ * Inicia o registro de uma passkey: gera as opções de criação
265
+ * (`generateRegistrationOptions`) escopadas à conta (e excluindo credenciais já
266
+ * registradas). Devolve as opções JSON (o controller serializa pro browser) e o
267
+ * `challenge` (base64url) para guardar na sessão. null = conta inexistente.
268
+ */
269
+ generatePasskeyRegistrationOptions(accountId: string): Promise<{
270
+ options: Record<string, unknown>;
271
+ challenge: string;
272
+ } | null>;
273
+ /**
274
+ * Finaliza o registro: verifica a resposta do browser
275
+ * (`verifyRegistrationResponse`) contra o `expectedChallenge` guardado. Em caso
276
+ * de sucesso persiste a credencial (id, publicKey, counter, transports) e
277
+ * habilita o MFA. Retorna true se registrou.
278
+ */
279
+ verifyPasskeyRegistration(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
280
+ /**
281
+ * Inicia a autenticação por passkey no login: gera as opções
282
+ * (`generateAuthenticationOptions`) restritas às credenciais da conta. Devolve
283
+ * as opções JSON + o `challenge` para guardar na sessão. null = conta sem passkeys.
284
+ */
285
+ generatePasskeyAuthenticationOptions(accountId: string): Promise<{
286
+ options: Record<string, unknown>;
287
+ challenge: string;
288
+ } | null>;
289
+ /**
290
+ * Verifica a resposta de autenticação por passkey
291
+ * (`verifyAuthenticationResponse`) contra o `expectedChallenge` guardado. Em
292
+ * caso de sucesso atualiza o signature counter armazenado. Retorna true se válido.
293
+ */
294
+ verifyPasskeyAuthentication(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
295
+ /** Lista as passkeys da conta (sem expor chave pública / counter). */
296
+ listPasskeys(accountId: string): Promise<PasskeySummary[]>;
297
+ /** Remove uma passkey (por credential id) da conta. */
298
+ removePasskey(accountId: string, credentialId: string): Promise<void>;
299
+ }
300
+ /**
301
+ * Verificação de e-mail como ESTADO consultável da conta. CAPACIDADE opcional:
302
+ * stores sem a noção de "e-mail verificado" (ex.: model sem a coluna
303
+ * `email_verified_at`) NÃO expõem o método — e features que dependem dela
304
+ * (`requireVerifiedEmail`) degradam graciosamente (não bloqueiam ninguém) e o
305
+ * doctor avisa. Distinta de {@link CoreAccountStore.consumeEmailVerificationToken},
306
+ * que ESCREVE o estado; aqui só LEMOS.
307
+ */
308
+ export interface EmailVerificationStatusCapability {
309
+ /** True se o e-mail da conta está verificado. False se a conta não existe. */
310
+ isEmailVerified(accountId: string): Promise<boolean>;
311
+ }
312
+ /**
313
+ * Deleção self-service / por admin da conta (LGPD/GDPR — "direito ao
314
+ * esquecimento"). CAPACIDADE opcional: stores sem suporte a delete NÃO expõem o
315
+ * método — a UI esconde a "danger zone" e o admin/REST respondem 409. Apenas
316
+ * apaga a LINHA da conta; o cascade dos demais artefatos (sessões, grants, PATs,
317
+ * passkeys, identidades, MFA, avatar) e a anonimização do audit ficam a cargo do
318
+ * `accountDeletionService` (orquestrador no host).
319
+ */
320
+ export interface AccountDeletionCapability {
321
+ /** Apaga a linha da conta. Retorna false se a conta não existe. */
322
+ deleteAccount(accountId: string): Promise<boolean>;
323
+ }
324
+ /**
325
+ * Histórico de senhas (disallow_password_reuse). CAPACIDADE opcional, presente
326
+ * quando a tabela `auth_password_history` existe (capability-probed). Grava o
327
+ * hash ANTERIOR a cada troca e rejeita reutilização dos últimos N hashes.
328
+ *
329
+ * Tabela mínima: `id UUID/SERIAL PK, account_id TEXT NOT NULL, password_hash TEXT NOT NULL, created_at TIMESTAMP NOT NULL`.
330
+ */
331
+ export interface PasswordHistoryCapability {
332
+ /**
333
+ * Verifica se a senha em claro já foi usada recentemente (últimos `count` hashes).
334
+ * Retorna true se é REUTILIZAÇÃO (deve ser rejeitada).
335
+ *
336
+ * @param nativeVerify - função de verificação do model (opcional: quando omitida
337
+ * ou null, o store usa seu próprio hook interno configurado via `nativeVerifyHash`
338
+ * do contexto Lucid). Mantido para extensibilidade.
339
+ */
340
+ isPasswordReused(accountId: string, plainPassword: string, count: number, nativeVerify?: ((hashed: string, plain: string) => Promise<boolean>) | null): Promise<boolean>;
341
+ /**
342
+ * Grava o hash ATUAL antes de substituí-lo (chamado ANTES de `changePassword`
343
+ * ou equivalente). Best-effort: falha silenciosa não impede a troca.
344
+ */
345
+ recordPasswordHistory(accountId: string, oldHash: string): Promise<void>;
346
+ /**
347
+ * Remove entradas de histórico além dos últimos `count` por conta. Best-effort.
348
+ */
349
+ prunePasswordHistory(accountId: string, count: number): Promise<void>;
350
+ }
351
+ /**
352
+ * Expiração de senha. CAPACIDADE opcional, presente quando a coluna
353
+ * `password_changed_at` existe no model de auth_users (capability-probed).
354
+ * Atualiza o timestamp em toda troca/criação de senha.
355
+ */
356
+ export interface PasswordExpirationCapability {
357
+ /**
358
+ * Retorna o timestamp da última troca de senha, ou null se nunca foi definida
359
+ * (conta legacy sem a coluna / coluna NULL).
360
+ */
361
+ getPasswordChangedAt(accountId: string): Promise<Date | null>;
362
+ /**
363
+ * Atualiza a coluna `password_changed_at` para o momento atual. Chamado após
364
+ * toda troca/criação de senha. Best-effort: falha não impede a operação.
365
+ */
366
+ touchPasswordChangedAt(accountId: string): Promise<void>;
367
+ }
368
+ /** Entrada do import de uma conta (comando `authkit:users:import`). */
369
+ export interface ImportAccountInput {
370
+ email: string;
371
+ /**
372
+ * Hash de senha JÁ pronto, vindo do sistema de origem (qualquer formato:
373
+ * bcrypt `$2y$`, scrypt, pbkdf2, etc.). Inserido COMO ESTÁ — sem re-hash. O
374
+ * lazy rehash no primeiro login transparente cuida da migração. Mutuamente
375
+ * exclusivo com nada: se ausente, a conta nasce sem senha utilizável (até um
376
+ * reset). NÃO passa pela política de senha (dado legado/confiável).
377
+ */
378
+ passwordHash?: string | null;
379
+ fullName?: string | null;
380
+ globalRoles?: string[];
381
+ emailVerified?: boolean;
382
+ }
383
+ /**
384
+ * Import em massa de contas (comando `authkit:users:import`). CAPACIDADE
385
+ * opcional, presente no store Lucid default. Distinta de
386
+ * {@link CoreAccountStore.create}: NÃO re-hasheia o `passwordHash` (insere como
387
+ * está, para migração lazy) e NÃO aplica a política de senha.
388
+ */
389
+ export interface AccountImportCapability {
390
+ /**
391
+ * Insere uma conta com o hash de senha já pronto (sem re-hash, sem política).
392
+ * Retorna a conta criada, ou null se o e-mail já existe (skip).
393
+ */
394
+ importAccount(input: ImportAccountInput): Promise<AuthAccount | null>;
395
+ }
396
+ /**
397
+ * Login sem senha por "magic link" — um token de uso único e curta duração
398
+ * enviado por e-mail. CAPACIDADE opcional: stores sem suporte omitem os métodos e
399
+ * a UI esconde o botão "me envie um link".
400
+ *
401
+ * O store default (Lucid) reaproveita as colunas de reset de senha
402
+ * (`passwordResetToken` / `passwordResetExpiresAt`) codificando o token com o
403
+ * prefixo `ml:` — assim NÃO exige migração nova (mesmo padrão do `ec:` da troca de
404
+ * e-mail). O tradeoff é que um magic link e um reset de senha pendentes não
405
+ * coexistem (mesma coluna); na prática são fluxos distintos no tempo. Consumir um
406
+ * magic link NÃO altera a senha.
407
+ */
408
+ export interface MagicLinkCapability {
409
+ /**
410
+ * Emite um magic link para o e-mail. Retorna o token + a conta, ou null se a
411
+ * conta não existe (o controller SEMPRE renderiza "link enviado" para não vazar
412
+ * a existência de contas).
413
+ */
414
+ issueMagicLinkToken(email: string): Promise<{
415
+ token: string;
416
+ account: AuthAccount;
417
+ } | null>;
418
+ /**
419
+ * Consome (single-use) um magic link. Retorna a conta autenticada ou null se o
420
+ * token é inválido/expirado. NÃO altera a senha.
421
+ */
422
+ consumeMagicLinkToken(token: string): Promise<AuthAccount | null>;
423
+ }
424
+ /** DTO público de uma organização. */
425
+ export interface OrgSummary {
426
+ id: string;
427
+ name: string;
428
+ slug: string;
429
+ logoUrl?: string | null;
430
+ metadata?: Record<string, unknown> | null;
431
+ createdAt: string;
432
+ }
433
+ /** Membro de uma organização. */
434
+ export interface OrgMember {
435
+ accountId: string;
436
+ email?: string | null;
437
+ role: string;
438
+ joinedAt: string;
439
+ }
440
+ /** Convite pendente de uma organização. */
441
+ export interface OrgInvitation {
442
+ id: string;
443
+ organizationId: string;
444
+ email: string;
445
+ role: string;
446
+ invitedBy: string;
447
+ expiresAt: string;
448
+ acceptedAt?: string | null;
449
+ createdAt: string;
450
+ }
451
+ /** Informações da org ativa de uma conta (para emissão de claims). */
452
+ export interface ActiveOrgInfo {
453
+ orgId: string;
454
+ orgSlug: string;
455
+ orgRole: string;
456
+ }
457
+ /**
458
+ * Capacidade de Organizations (multi-tenancy). CAPACIDADE OPCIONAL: quando as três
459
+ * tabelas (`auth_organizations`, `auth_organization_members`, `auth_organization_invitations`)
460
+ * estão presentes, o store expõe estes métodos; caso contrário fica genuinamente ausente.
461
+ */
462
+ export interface OrganizationsCapability {
463
+ createOrg(input: {
464
+ name: string;
465
+ slug: string;
466
+ logoUrl?: string | null;
467
+ metadata?: Record<string, unknown> | null;
468
+ ownerAccountId: string;
469
+ }): Promise<OrgSummary>;
470
+ findOrgById(orgId: string): Promise<OrgSummary | null>;
471
+ findOrgBySlug(slug: string): Promise<OrgSummary | null>;
472
+ listOrgsForAccount(accountId: string): Promise<Array<OrgSummary & {
473
+ role: string;
474
+ }>>;
475
+ updateOrg(orgId: string, patch: {
476
+ name?: string;
477
+ logoUrl?: string | null;
478
+ metadata?: Record<string, unknown> | null;
479
+ }): Promise<OrgSummary | null>;
480
+ deleteOrg(orgId: string): Promise<boolean>;
481
+ listOrgMembers(orgId: string): Promise<OrgMember[]>;
482
+ addOrgMember(orgId: string, accountId: string, role: string): Promise<void>;
483
+ removeOrgMember(orgId: string, accountId: string): Promise<{
484
+ ok: boolean;
485
+ reason?: 'not_found' | 'last_owner';
486
+ }>;
487
+ updateOrgMemberRole(orgId: string, accountId: string, newRole: string): Promise<{
488
+ ok: boolean;
489
+ reason?: 'not_found' | 'last_owner';
490
+ }>;
491
+ getOrgMembership(orgId: string, accountId: string): Promise<{
492
+ role: string;
493
+ } | null>;
494
+ createOrgInvitation(input: {
495
+ organizationId: string;
496
+ email: string;
497
+ role: string;
498
+ invitedBy: string;
499
+ ttlHours: number;
500
+ }): Promise<{
501
+ invitation: OrgInvitation;
502
+ token: string;
503
+ }>;
504
+ findInvitationByTokenHash(tokenHash: string): Promise<OrgInvitation | null>;
505
+ listPendingInvitationsForOrg(orgId: string): Promise<OrgInvitation[]>;
506
+ listPendingInvitationsForEmail(email: string): Promise<OrgInvitation[]>;
507
+ acceptInvitation(invitationId: string, accountId: string): Promise<{
508
+ ok: boolean;
509
+ reason?: 'not_found' | 'expired' | 'email_mismatch' | 'already_member';
510
+ }>;
511
+ /**
512
+ * Revoga (deleta) um convite pendente. ESCOPADO POR ORG: o convite só é
513
+ * deletado se pertencer à `organizationId` informada — previne IDOR cross-org
514
+ * onde um owner/admin de outra org revogaria o convite sabendo apenas o id.
515
+ * Retorna `false` quando o convite não existe OU não pertence à org (not-found).
516
+ */
517
+ revokeInvitation(organizationId: string, invitationId: string): Promise<boolean>;
518
+ /** Remove todas as memberships e convites enviados pela conta. Best-effort. */
519
+ removeAccountFromAllOrgs(accountId: string): Promise<{
520
+ memberships: number;
521
+ invitations: number;
522
+ }>;
523
+ }
524
+ /** Type guard: o store implementa a capacidade de Organizations. */
525
+ export declare function supportsOrganizations(store: AccountStore): store is AccountStore & OrganizationsCapability;
526
+ /**
527
+ * Store de contas usado pela config. É o núcleo SEMPRE presente
528
+ * ({@link CoreAccountStore}) + as capacidades opcionais (MFA, WebAuthn, account
529
+ * linking por provider) marcadas como `Partial` — assim configs/hosts existentes
530
+ * (que referenciam `AccountStore`) compilam sem mudança, e stores que NÃO
531
+ * implementam uma capacidade simplesmente omitem os métodos (em vez de tê-los
532
+ * presentes-mas-lançando). Use os type guards {@link supportsMfa},
533
+ * {@link supportsPasskeys}, {@link supportsProviderIdentity} para estreitar.
534
+ */
535
+ export type AccountStore = CoreAccountStore & {
536
+ /**
537
+ * Nome da conexão Lucid usada por este store (deriva de `Model.connection` no
538
+ * store default — ver `lucid_account_store.ts`). Quando presente, os call-sites
539
+ * de RuntimeSettings o repassam como `{ connection }` para que o probe da tabela
540
+ * `auth_settings` seja searchPath-aware (auth vivendo numa conexão/schema
541
+ * próprios). Undefined → conexão default (back-compat total). É metadado
542
+ * opcional, não um método de capacidade — por isso `readonly` e fora dos
543
+ * blocos `Partial<...>` de capacidades probáveis.
544
+ */
545
+ readonly connectionName?: string;
546
+ } & Partial<MfaCapability & WebauthnCapability & ProviderIdentityCapability & AccountSecurityCapability & AccountStatusCapability & ProfileCapability & MagicLinkCapability & EmailVerificationStatusCapability & AccountDeletionCapability & AccountImportCapability & OrganizationsCapability & PasswordHistoryCapability & PasswordExpirationCapability>;
547
+ /** Type guard: o store implementa a capacidade de MFA / TOTP. */
548
+ export declare function supportsMfa(store: AccountStore): store is AccountStore & MfaCapability;
549
+ /**
550
+ * Type guard: o store implementa a contagem eficiente por role global
551
+ * ({@link AdminCapability.countByGlobalRole}). Quando ausente, callers caem no
552
+ * fallback de scan paginado.
553
+ */
554
+ export declare function supportsCountByGlobalRole(store: AccountStore): store is AccountStore & {
555
+ countByGlobalRole(role: string): Promise<number>;
556
+ };
557
+ /** Type guard: o store implementa a capacidade de passkeys / WebAuthn. */
558
+ export declare function supportsPasskeys(store: AccountStore): store is AccountStore & WebauthnCapability;
559
+ /** Type guard: o store implementa account linking por identidade de provider. */
560
+ export declare function supportsProviderIdentity(store: AccountStore): store is AccountStore & ProviderIdentityCapability;
561
+ /** Type guard: o store implementa o self-service de segurança (senha/e-mail). */
562
+ export declare function supportsAccountSecurity(store: AccountStore): store is AccountStore & AccountSecurityCapability;
563
+ /** Type guard: o store implementa habilitar/desabilitar conta. */
564
+ export declare function supportsAccountStatus(store: AccountStore): store is AccountStore & AccountStatusCapability;
565
+ /** Type guard: o store implementa a edição de perfil (nome/avatar). */
566
+ export declare function supportsProfile(store: AccountStore): store is AccountStore & ProfileCapability;
567
+ /** Type guard: o store implementa login por magic link (passwordless). */
568
+ export declare function supportsMagicLink(store: AccountStore): store is AccountStore & MagicLinkCapability;
569
+ /** Type guard: o store consegue dizer se o e-mail de uma conta está verificado. */
570
+ export declare function supportsEmailVerificationStatus(store: AccountStore): store is AccountStore & EmailVerificationStatusCapability;
571
+ /** Type guard: o store implementa a deleção (hard delete) da conta. */
572
+ export declare function supportsAccountDeletion(store: AccountStore): store is AccountStore & AccountDeletionCapability;
573
+ /** Type guard: o store implementa o import em massa de contas. */
574
+ export declare function supportsAccountImport(store: AccountStore): store is AccountStore & AccountImportCapability;
575
+ /** Type guard: o store implementa histórico de senhas (disallow_password_reuse). */
576
+ export declare function supportsPasswordHistory(store: AccountStore): store is AccountStore & PasswordHistoryCapability;
577
+ /** Type guard: o store implementa expiração de senha (password_changed_at coluna). */
578
+ export declare function supportsPasswordExpiration(store: AccountStore): store is AccountStore & PasswordExpirationCapability;
@@ -0,0 +1,60 @@
1
+ /** Type guard: o store implementa a capacidade de Organizations. */
2
+ export function supportsOrganizations(store) {
3
+ return typeof store.createOrg === 'function';
4
+ }
5
+ /** Type guard: o store implementa a capacidade de MFA / TOTP. */
6
+ export function supportsMfa(store) {
7
+ return typeof store.getMfaState === 'function';
8
+ }
9
+ /**
10
+ * Type guard: o store implementa a contagem eficiente por role global
11
+ * ({@link AdminCapability.countByGlobalRole}). Quando ausente, callers caem no
12
+ * fallback de scan paginado.
13
+ */
14
+ export function supportsCountByGlobalRole(store) {
15
+ return typeof store.countByGlobalRole === 'function';
16
+ }
17
+ /** Type guard: o store implementa a capacidade de passkeys / WebAuthn. */
18
+ export function supportsPasskeys(store) {
19
+ return typeof store.listPasskeys === 'function';
20
+ }
21
+ /** Type guard: o store implementa account linking por identidade de provider. */
22
+ export function supportsProviderIdentity(store) {
23
+ return typeof store.findByProviderIdentity === 'function';
24
+ }
25
+ /** Type guard: o store implementa o self-service de segurança (senha/e-mail). */
26
+ export function supportsAccountSecurity(store) {
27
+ return typeof store.changePassword === 'function';
28
+ }
29
+ /** Type guard: o store implementa habilitar/desabilitar conta. */
30
+ export function supportsAccountStatus(store) {
31
+ return typeof store.disableAccount === 'function';
32
+ }
33
+ /** Type guard: o store implementa a edição de perfil (nome/avatar). */
34
+ export function supportsProfile(store) {
35
+ return typeof store.updateProfile === 'function';
36
+ }
37
+ /** Type guard: o store implementa login por magic link (passwordless). */
38
+ export function supportsMagicLink(store) {
39
+ return typeof store.issueMagicLinkToken === 'function';
40
+ }
41
+ /** Type guard: o store consegue dizer se o e-mail de uma conta está verificado. */
42
+ export function supportsEmailVerificationStatus(store) {
43
+ return typeof store.isEmailVerified === 'function';
44
+ }
45
+ /** Type guard: o store implementa a deleção (hard delete) da conta. */
46
+ export function supportsAccountDeletion(store) {
47
+ return typeof store.deleteAccount === 'function';
48
+ }
49
+ /** Type guard: o store implementa o import em massa de contas. */
50
+ export function supportsAccountImport(store) {
51
+ return typeof store.importAccount === 'function';
52
+ }
53
+ /** Type guard: o store implementa histórico de senhas (disallow_password_reuse). */
54
+ export function supportsPasswordHistory(store) {
55
+ return typeof store.isPasswordReused === 'function';
56
+ }
57
+ /** Type guard: o store implementa expiração de senha (password_changed_at coluna). */
58
+ export function supportsPasswordExpiration(store) {
59
+ return typeof store.getPasswordChangedAt === 'function';
60
+ }