@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 @@
1
+ :root{--bg0:#07070d;--bg1:#0c0c16;--bg2:#12121f;--bg3:#181828;--line:#9797c41a;--line-strong:#9797c42e;--text:#e9e9f4;--muted:#9292ac;--faint:#5b5b74;--accent:#625fff;--accent-soft:#625fff24;--accent-hover:#625fff38;--green:#3ecf8e;--green-soft:#3ecf8e1f;--red:#ff5470;--red-soft:#ff54701f;--amber:#ffb454;--amber-soft:#ffb4541f;--blue:#4cc2ff;--blue-soft:#4cc2ff1f;--sans:"Sora", system-ui, -apple-system, sans-serif;--mono:"JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;--sidebar-w:240px;--radius:10px;--topbar-h:54px}html.light{--bg0:#f7f7fb;--bg1:#fff;--bg2:#f0f0f6;--bg3:#e7e7f0;--line:#2828461a;--line-strong:#2828462e;--text:#1c1c28;--muted:#55556c;--faint:#8a8aa0;--accent-soft:#625fff1f;--accent-hover:#625fff2e;--amber-soft:#c4821e24;--green-soft:#1ea06424;--red-soft:#dc32501f;--blue-soft:#2896d21f}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{font-family:var(--sans);background:var(--bg0);color:var(--text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:13px;overflow:hidden}body:before{content:"";pointer-events:none;z-index:0;background:radial-gradient(1100px 500px at 15% -10%,#625fff1a,#0000 60%),radial-gradient(900px 420px at 90% 0,#3ecf8e0a,#0000 55%);position:fixed;inset:0}html.light body:before{display:none}::selection{background:#625fff4d}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{border:2px solid var(--bg0);background:#26263a;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#33334d}::-webkit-scrollbar-track{background:0 0}html.light ::-webkit-scrollbar-thumb{background:#cfcfe0}html.light ::-webkit-scrollbar-thumb:hover{background:#b8b8cc}#root{z-index:1;position:relative}.app-shell{height:100vh;display:flex;overflow:hidden}.sidebar{width:var(--sidebar-w);border-right:1px solid var(--line);-webkit-backdrop-filter:blur(10px);background:#0a0a12bf;flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}html.light .sidebar{background:#ffffffd9}.main{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.topbar{height:var(--topbar-h);border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(8px);background:#09091099;flex-shrink:0;align-items:center;gap:12px;padding:0 20px;display:flex}html.light .topbar{background:#ffffffb3}.content{flex:1;padding:24px 24px 60px;overflow-y:auto}.brand{border-bottom:1px solid var(--line);flex-shrink:0;align-items:center;gap:10px;padding:18px 18px 14px;display:flex}.brand-logo{background:var(--accent-soft);border:1px solid #625fff4d;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:30px;height:30px;display:flex;position:relative}.brand-logo svg{width:16px;height:16px;color:var(--accent)}.brand-logo .ring{border:1px solid #625fff59;border-radius:12px;animation:3s ease-out infinite ring-pulse;position:absolute;inset:-3px}@keyframes ring-pulse{0%{opacity:.9;transform:scale(.85)}70%{opacity:0;transform:scale(1.15)}to{opacity:0;transform:scale(1.15)}}.brand-text{overflow:hidden}.brand-name{letter-spacing:.03em;font-size:14px;font-weight:700}.brand-name span{color:var(--accent)}.brand-sub{color:var(--faint);letter-spacing:.08em;text-transform:uppercase;margin-top:1px;font-size:10px;font-weight:500}.nav{flex:1;padding:10px 10px 8px;overflow-y:auto}.nav-section{letter-spacing:.14em;text-transform:uppercase;color:var(--faint);padding:12px 8px 5px;font-size:9.5px;font-weight:600}.nav-item{color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:8px;align-items:center;gap:9px;padding:7px 9px;font-size:12.5px;font-weight:500;text-decoration:none;transition:background .12s,color .12s;display:flex}.nav-item:hover{color:var(--text);background:#9797c40f}.nav-item.active{background:var(--accent-soft);color:var(--text);border-color:#625fff38}.nav-item.active .nav-ico{color:var(--accent)}.nav-ico{width:15px;height:15px;color:var(--faint);flex-shrink:0;transition:color .12s}.nav-item:hover .nav-ico{color:var(--muted)}.sidebar-foot{border-top:1px solid var(--line);flex-direction:column;flex-shrink:0;gap:10px;padding:12px 14px;display:flex}.user-row{cursor:default;border-radius:8px;align-items:center;gap:9px;padding:6px 8px;display:flex}.avatar{background:var(--accent-soft);width:28px;height:28px;color:var(--accent);border:1px solid #625fff4d;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:10.5px;font-weight:600;display:flex}.user-info{flex:1;min-width:0}.user-email{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;overflow:hidden}.user-role{color:var(--faint);font-size:9.5px;font-family:var(--mono)}.foot-actions{gap:6px;display:flex}.topbar-title{color:var(--text);font-size:14px;font-weight:600}.topbar-spacer{flex:1}.theme-btn{border:1px solid var(--line);background:var(--bg2);width:32px;height:32px;color:var(--muted);cursor:pointer;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;transition:all .13s;display:flex}.theme-btn:hover{background:var(--bg3);color:var(--text);border-color:var(--line-strong)}.theme-btn svg{width:14px;height:14px}.btn{background:var(--bg2);border:1px solid var(--line);height:32px;color:var(--muted);font-family:var(--sans);cursor:pointer;white-space:nowrap;border-radius:8px;align-items:center;gap:7px;padding:0 13px;font-size:12px;font-weight:500;text-decoration:none;transition:all .13s;display:inline-flex}.btn:hover{color:var(--text);border-color:var(--line-strong);background:var(--bg3)}.btn svg{flex-shrink:0;width:13px;height:13px}.btn.btn-primary{background:var(--accent);color:#fff;border-color:#0000}.btn.btn-primary:hover{background:#7472ff}.btn.btn-danger:hover{color:var(--red);background:var(--red-soft);border-color:#ff547066}.btn.btn-sm{border-radius:6px;height:26px;padding:0 10px;font-size:11px}.btn.btn-ghost{background:0 0;border-color:#0000}.btn.btn-ghost:hover{background:#9797c40f}.btn:disabled,.btn[disabled]{opacity:.45;pointer-events:none}.cards{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin-bottom:20px;display:grid}.card{border:1px solid var(--line);border-radius:var(--radius);background:linear-gradient(#9797c40a,#9797c403);padding:16px 18px 14px;animation:.45s cubic-bezier(.2,.7,.3,1) both rise}.card:nth-child(2){animation-delay:40ms}.card:nth-child(3){animation-delay:80ms}.card:nth-child(4){animation-delay:.12s}.card:nth-child(5){animation-delay:.16s}@keyframes rise{0%{opacity:0;transform:translateY(8px)}}.card-label{letter-spacing:.12em;text-transform:uppercase;color:var(--faint);margin-bottom:10px;font-size:10px;font-weight:600}.card-value{font-family:var(--mono);letter-spacing:-.02em;color:var(--text);font-size:26px;font-weight:600;line-height:1}.card-hint{color:var(--faint);font-size:10.5px;font-family:var(--mono);margin-top:8px}.card-hint b{color:var(--muted);font-weight:500}.card.c-accent .card-value{color:var(--accent)}.card.c-green .card-value{color:var(--green)}.card.c-amber .card-value{color:var(--amber)}.card.c-red .card-value{color:var(--red)}.card.c-blue .card-value{color:var(--blue)}.panel{border:1px solid var(--line);border-radius:var(--radius);background:linear-gradient(#9797c409,#9797c403);margin-bottom:16px;animation:.5s cubic-bezier(.2,.7,.3,1) both rise;overflow:hidden}.panel-head{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:10px;padding:12px 16px;display:flex}.panel-head h3{letter-spacing:.02em;font-size:12.5px;font-weight:600}.panel-head .meta{font-family:var(--mono);color:var(--faint);font-size:10.5px}.panel-body{padding:12px 16px 16px}.grid-2{grid-template-columns:1fr 1fr;gap:16px;display:grid}@media (width<=1100px){.grid-2{grid-template-columns:1fr}}.page-header{margin-bottom:20px}.page-title{letter-spacing:.01em;margin-bottom:4px;font-size:18px;font-weight:700}.page-sub{color:var(--faint);font-size:12px}.page-actions{align-items:center;gap:8px;display:flex}.page-header-row{justify-content:space-between;align-items:center;gap:16px;margin-bottom:16px;display:flex}.tbl-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:12.5px}thead th{text-align:left;letter-spacing:.12em;text-transform:uppercase;color:var(--faint);border-bottom:1px solid var(--line);white-space:nowrap;padding:8px 12px;font-size:10px;font-weight:600}tbody tr{border-bottom:1px solid var(--line);cursor:pointer;transition:background .1s}tbody tr:last-child{border-bottom:0}tbody tr:hover{background:#9797c40a}tbody td{color:var(--muted);vertical-align:middle;padding:10px 12px}tbody td b{color:var(--text);font-weight:500}tbody td.no-click{cursor:default}.badge{height:18px;font-family:var(--mono);white-space:nowrap;border-radius:99px;align-items:center;padding:0 8px;font-size:10px;font-weight:500;display:inline-flex}.badge-accent{background:var(--accent-soft);color:var(--accent);border:1px solid #625fff38}.badge-green{background:var(--green-soft);color:var(--green);border:1px solid #3ecf8e38}.badge-red{background:var(--red-soft);color:var(--red);border:1px solid #ff547038}.badge-amber{background:var(--amber-soft);color:var(--amber);border:1px solid #ffb45438}.badge-muted{color:var(--muted);border:1px solid var(--line);background:#9797c412}.badge-blue{background:var(--blue-soft);color:var(--blue);border:1px solid #4cc2ff38}.input{background:var(--bg2);border:1px solid var(--line);width:100%;height:34px;color:var(--text);font-family:var(--sans);border-radius:8px;outline:none;padding:0 12px;font-size:13px;transition:border-color .15s,box-shadow .15s}.input:focus{border-color:#625fff80;box-shadow:0 0 0 3px #625fff1c}.input::placeholder{color:var(--faint)}.input-mono{font-family:var(--mono);font-size:12px}textarea.input{resize:vertical;height:auto;padding:10px 12px}.search-input{position:relative}.search-input input{padding-left:32px}.search-ico{width:14px;height:14px;color:var(--faint);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.field{margin-bottom:14px}.field label{color:var(--muted);letter-spacing:.02em;margin-bottom:5px;font-size:11px;font-weight:500;display:block}.field .hint{color:var(--faint);margin-top:4px;font-size:10.5px}.checkbox-row{cursor:pointer;align-items:center;gap:9px;padding:7px 0;display:flex}.checkbox-row input[type=checkbox]{width:14px;height:14px;accent-color:var(--accent);cursor:pointer}.checkbox-row .chk-label{color:var(--muted);font-size:12.5px}.checkbox-row:hover .chk-label{color:var(--text)}.toggle-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:10px 0;display:flex}.toggle-row:last-child{border-bottom:0}.toggle-info{flex:1;min-width:0}.toggle-label{color:var(--text);font-size:12.5px;font-weight:500}.toggle-desc{color:var(--faint);margin-top:2px;font-size:11px}.toggle{flex-shrink:0;width:38px;height:20px;position:relative}.toggle input{opacity:0;width:0;height:0;position:absolute}.toggle-track{background:var(--bg3);border:1px solid var(--line-strong);cursor:pointer;border-radius:99px;transition:background .2s;position:absolute;inset:0}.toggle input:checked+.toggle-track{background:var(--accent);border-color:var(--accent)}.toggle-thumb{background:var(--faint);pointer-events:none;border-radius:50%;width:14px;height:14px;transition:transform .2s,background .2s;position:absolute;top:2px;left:2px}.toggle input:checked~.toggle-thumb{background:#fff;transform:translate(18px)}.modal-overlay{z-index:100;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#0009;justify-content:center;align-items:center;padding:20px;animation:.15s fade-in;display:flex;position:fixed;inset:0}@keyframes fade-in{0%{opacity:0}}.modal{background:var(--bg1);border:1px solid var(--line-strong);border-radius:14px;flex-direction:column;width:100%;max-width:520px;max-height:90vh;animation:.2s cubic-bezier(.2,.8,.3,1) modal-in;display:flex;overflow:hidden}@keyframes modal-in{0%{opacity:0;transform:scale(.96)translateY(8px)}}.modal.modal-lg{max-width:760px}.modal-head{border-bottom:1px solid var(--line);flex-shrink:0;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.modal-head h2{font-size:14px;font-weight:600}.modal-close{width:28px;height:28px;color:var(--faint);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;transition:all .12s;display:flex}.modal-close:hover{color:var(--text);background:#9797c414}.modal-close svg{width:14px;height:14px}.modal-body{flex:1;padding:20px;overflow-y:auto}.modal-foot{border-top:1px solid var(--line);flex-shrink:0;justify-content:flex-end;gap:8px;padding:14px 20px;display:flex}.drawer-overlay{z-index:100;background:#00000080;animation:.15s fade-in;position:fixed;inset:0}.drawer{z-index:101;background:var(--bg1);border-left:1px solid var(--line-strong);flex-direction:column;width:480px;max-width:95vw;animation:.22s cubic-bezier(.2,.8,.3,1) drawer-in;display:flex;position:fixed;top:0;bottom:0;right:0;overflow:hidden}@keyframes drawer-in{0%{transform:translate(100%)}}.drawer-head{border-bottom:1px solid var(--line);flex-shrink:0;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.drawer-head h2{font-size:14px;font-weight:600}.drawer-body{flex:1;padding:20px;overflow-y:auto}.pagination{justify-content:flex-end;align-items:center;gap:6px;padding-top:16px;display:flex}.pag-info{font-family:var(--mono);color:var(--faint);margin-right:4px;font-size:11px}.empty-state{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:10px;padding:48px 24px;display:flex}.empty-state svg{width:36px;height:36px;color:var(--faint);margin-bottom:4px}.empty-state h4{color:var(--muted);font-size:14px;font-weight:600}.empty-state p{color:var(--faint);max-width:300px;font-size:12px}.spinner{border:2px solid var(--bg3);border-top-color:var(--accent);border-radius:50%;flex-shrink:0;width:20px;height:20px;animation:.7s linear infinite spin}.spinner.sm{width:14px;height:14px}.spinner.lg{border-width:3px;width:28px;height:28px}@keyframes spin{to{transform:rotate(360deg)}}.loading-row{color:var(--faint);justify-content:center;align-items:center;gap:12px;padding:40px;font-size:12px;display:flex}.error-box{background:var(--red-soft);border-radius:var(--radius);color:var(--red);border:1px solid #ff547040;padding:12px 16px;font-size:12px}.settings-section{margin-bottom:24px}.settings-section-head{border-bottom:1px solid var(--line);align-items:center;gap:10px;margin-bottom:4px;padding-bottom:10px;display:flex}.settings-section-head h3{font-size:13px;font-weight:600}.settings-section-head p{color:var(--faint);margin-top:1px;font-size:11px}.settings-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:flex-start;gap:20px;padding:12px 0;display:flex}.settings-row:last-child{border-bottom:0}.settings-info{flex:1;min-width:0}.settings-key{font-family:var(--mono);color:var(--text);font-size:12px;font-weight:500}.settings-desc{color:var(--faint);margin-top:2px;font-size:11px}.settings-badge{font-family:var(--mono);color:var(--faint);border:1px solid var(--line);background:#9797c412;border-radius:4px;margin-left:6px;padding:1px 6px;font-size:9.5px}.settings-control{flex-shrink:0;align-items:center;gap:8px;display:flex}.code{font-family:var(--mono);background:var(--bg2);border:1px solid var(--line);color:var(--muted);word-break:break-all;border-radius:6px;padding:2px 8px;font-size:11.5px}.sep{background:var(--line);height:1px;margin:16px 0}.flex{display:flex}.flex-center{align-items:center;display:flex}.gap-2{gap:8px}.gap-3{gap:12px}.ml-auto{margin-left:auto}.text-accent{color:var(--accent)}.text-muted{color:var(--muted)}.text-faint{color:var(--faint)}.text-green{color:var(--green)}.text-red{color:var(--red)}.text-amber{color:var(--amber)}.mono{font-family:var(--mono)}.text-sm{font-size:11px}.text-xs{font-size:10px}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.secret-box{background:var(--bg2);font-family:var(--mono);color:var(--accent);word-break:break-all;border:1px solid #625fff40;border-radius:8px;margin:8px 0;padding:12px 16px;font-size:12px}.secret-box small{color:var(--faint);font-size:10.5px;font-family:var(--sans);letter-spacing:.06em;text-transform:uppercase;margin-bottom:6px;display:block}.chart-svg{width:100%;height:90px;display:block;overflow:visible}.toast-container{z-index:200;flex-direction:column-reverse;gap:8px;display:flex;position:fixed;bottom:20px;right:20px}.toast{background:var(--bg2);border:1px solid var(--line-strong);color:var(--text);border-radius:10px;align-items:center;gap:10px;min-width:260px;max-width:380px;padding:10px 14px;font-size:12.5px;animation:.22s cubic-bezier(.2,.8,.3,1) toast-in;display:flex;box-shadow:0 4px 24px #0006}.toast svg{flex-shrink:0;width:15px;height:15px}.toast.toast-success svg{color:var(--green)}.toast.toast-error svg{color:var(--red)}.toast.toast-info svg{color:var(--accent)}@keyframes toast-in{0%{opacity:0;transform:translate(16px)}}.chart-tip{background:var(--panel,var(--bg));border:1px solid var(--line);color:var(--text);border-radius:8px;padding:7px 10px;font-size:11.5px;box-shadow:0 6px 24px #00000040}.chart-tip-label{color:var(--faint);margin-bottom:4px;font-size:10px}.chart-tip-row{align-items:center;gap:6px;display:flex}.chart-tip-row b{font-weight:600}.chart-tip-dot{border-radius:2px;flex:none;width:7px;height:7px}
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>AuthKit Admin</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='13' fill='none' stroke='%23625fff' stroke-width='2.5'/><path d='M11 16l4 4 7-8' fill='none' stroke='%23625fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>">
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Sora:wght@400;500;600;700&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet">
11
+ <script type="module" crossorigin src="/__AUTHKIT_BASE__/assets/index-CRWcmsex.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/__AUTHKIT_BASE__/assets/index-DTSmD4RU.css">
13
+ </head>
14
+ <body>
15
+ <div id="root"></div>
16
+ </body>
17
+ </html>
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Parser MÍNIMO de user-agent embutido (SEM dependência externa). Reconhece as
3
+ * famílias de browser e SO mais comuns por regexes simples; tudo o mais cai em
4
+ * `'Unknown'`. NÃO é um device-detector completo — o objetivo é só dar contexto
5
+ * legível às sessões no console (account + admin), não fingerprinting.
6
+ */
7
+ export interface ParsedUserAgent {
8
+ /** Família do browser (Chrome/Firefox/Safari/Edge/Opera) ou 'Unknown'. */
9
+ browser: string;
10
+ /** Sistema operacional (Windows/macOS/Linux/Android/iOS) ou 'Unknown'. */
11
+ os: string;
12
+ }
13
+ /**
14
+ * Extrai browser + SO de uma string de user-agent. Ordem importa: Edge/Opera
15
+ * contêm "Chrome" no UA, então são checados ANTES; iOS contém "like Mac OS X",
16
+ * então é checado ANTES do macOS. `null`/vazio → ambos 'Unknown'.
17
+ */
18
+ export declare function parseUserAgent(ua: string | null | undefined): ParsedUserAgent;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Parser MÍNIMO de user-agent embutido (SEM dependência externa). Reconhece as
3
+ * famílias de browser e SO mais comuns por regexes simples; tudo o mais cai em
4
+ * `'Unknown'`. NÃO é um device-detector completo — o objetivo é só dar contexto
5
+ * legível às sessões no console (account + admin), não fingerprinting.
6
+ */
7
+ /**
8
+ * Extrai browser + SO de uma string de user-agent. Ordem importa: Edge/Opera
9
+ * contêm "Chrome" no UA, então são checados ANTES; iOS contém "like Mac OS X",
10
+ * então é checado ANTES do macOS. `null`/vazio → ambos 'Unknown'.
11
+ */
12
+ export function parseUserAgent(ua) {
13
+ if (!ua || typeof ua !== 'string') {
14
+ return { browser: 'Unknown', os: 'Unknown' };
15
+ }
16
+ return { browser: detectBrowser(ua), os: detectOs(ua) };
17
+ }
18
+ function detectBrowser(ua) {
19
+ // Edge (Chromium): "Edg/" — checar ANTES de Chrome (o UA contém "Chrome").
20
+ if (/\bEdg(?:e|A|iOS)?\//i.test(ua))
21
+ return 'Edge';
22
+ // Opera: "OPR/" (Chromium) ou "Opera" (legado) — também antes de Chrome.
23
+ if (/\bOPR\//i.test(ua) || /\bOpera\b/i.test(ua))
24
+ return 'Opera';
25
+ // Firefox.
26
+ if (/\bFirefox\//i.test(ua))
27
+ return 'Firefox';
28
+ // Chrome / Chromium (cobre "Chrome" e "CriOS" no iOS).
29
+ if (/\b(?:Chrome|CriOS|Chromium)\//i.test(ua))
30
+ return 'Chrome';
31
+ // Safari por último: o UA do Safari tem "Safari/" SEM "Chrome".
32
+ if (/\bSafari\//i.test(ua))
33
+ return 'Safari';
34
+ return 'Unknown';
35
+ }
36
+ function detectOs(ua) {
37
+ // iOS antes de macOS: o UA do iOS contém "like Mac OS X".
38
+ if (/\b(?:iPhone|iPad|iPod)\b/i.test(ua))
39
+ return 'iOS';
40
+ // Android antes de Linux: o UA do Android contém "Linux".
41
+ if (/\bAndroid\b/i.test(ua))
42
+ return 'Android';
43
+ if (/\bWindows\b/i.test(ua))
44
+ return 'Windows';
45
+ if (/\bMac OS X\b/i.test(ua) || /\bMacintosh\b/i.test(ua))
46
+ return 'macOS';
47
+ if (/\bLinux\b/i.test(ua) || /\bX11\b/i.test(ua))
48
+ return 'Linux';
49
+ return 'Unknown';
50
+ }
@@ -0,0 +1,127 @@
1
+ export declare const signupValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
2
+ email: import("@vinejs/vine").VineString;
3
+ fullName: import("@vinejs/vine").VineString;
4
+ password: import("@vinejs/vine").VineString;
5
+ }, {
6
+ email: string;
7
+ password: string;
8
+ fullName: string;
9
+ }, {
10
+ email: string;
11
+ password: string;
12
+ fullName: string;
13
+ }, {
14
+ email: string;
15
+ password: string;
16
+ fullName: string;
17
+ }>, Record<string, any> | undefined>;
18
+ export declare const forgotPasswordValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
19
+ email: import("@vinejs/vine").VineString;
20
+ }, {
21
+ email: string;
22
+ }, {
23
+ email: string;
24
+ }, {
25
+ email: string;
26
+ }>, Record<string, any> | undefined>;
27
+ export declare const resetPasswordValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
28
+ token: import("@vinejs/vine").VineString;
29
+ password: import("@vinejs/vine").VineString;
30
+ }, {
31
+ password: string;
32
+ token: string;
33
+ }, {
34
+ password: string;
35
+ token: string;
36
+ }, {
37
+ password: string;
38
+ token: string;
39
+ }>, Record<string, any> | undefined>;
40
+ /**
41
+ * Troca de senha no console de conta. A regra da nova senha espelha o
42
+ * signupValidator (min 8, max 255); a senha atual é confirmada à parte via
43
+ * verifyCredentials.
44
+ */
45
+ export declare const changePasswordValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
46
+ currentPassword: import("@vinejs/vine").VineString;
47
+ newPassword: import("@vinejs/vine").VineString;
48
+ }, {
49
+ newPassword: string;
50
+ currentPassword: string;
51
+ }, {
52
+ newPassword: string;
53
+ currentPassword: string;
54
+ }, {
55
+ newPassword: string;
56
+ currentPassword: string;
57
+ }>, Record<string, any> | undefined>;
58
+ /**
59
+ * Troca de e-mail no console de conta: senha atual (opcional — pode ser
60
+ * dispensada pela setting `email_change.requirePassword: false`) + o novo e-mail.
61
+ */
62
+ export declare const changeEmailValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
63
+ currentPassword: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
64
+ newEmail: import("@vinejs/vine").VineString;
65
+ }, {
66
+ currentPassword?: string | null | undefined;
67
+ newEmail: string;
68
+ }, {
69
+ currentPassword?: string | undefined;
70
+ newEmail: string;
71
+ }, {
72
+ currentPassword?: string | undefined;
73
+ newEmail: string;
74
+ }>, Record<string, any> | undefined>;
75
+ /**
76
+ * Edição de perfil no console de conta: nome e avatarUrl, ambos opcionais.
77
+ * Campos vazios são normalizados para string vazia (limpa o valor).
78
+ */
79
+ export declare const updateProfileValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
80
+ name: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
81
+ avatarUrl: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
82
+ }, {
83
+ name?: string | null | undefined;
84
+ avatarUrl?: string | null | undefined;
85
+ }, {
86
+ name?: string | undefined;
87
+ avatarUrl?: string | undefined;
88
+ }, {
89
+ name?: string | undefined;
90
+ avatarUrl?: string | undefined;
91
+ }>, Record<string, any> | undefined>;
92
+ /**
93
+ * Deleção self-service de conta (LGPD). Aceita confirmação por senha atual
94
+ * (`currentPassword`) OU pelo e-mail digitado (`confirmEmail`, p/ contas
95
+ * passwordless). Ambos opcionais aqui; o controller exige que UM deles confirme.
96
+ */
97
+ export declare const deleteAccountValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
98
+ currentPassword: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
99
+ confirmEmail: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
100
+ }, {
101
+ currentPassword?: string | null | undefined;
102
+ confirmEmail?: string | null | undefined;
103
+ }, {
104
+ currentPassword?: string | undefined;
105
+ confirmEmail?: string | undefined;
106
+ }, {
107
+ currentPassword?: string | undefined;
108
+ confirmEmail?: string | undefined;
109
+ }>, Record<string, any> | undefined>;
110
+ /** Criação de usuário no console admin (email obrigatório; nome/senha opcionais). */
111
+ export declare const adminCreateUserValidator: import("@vinejs/vine").VineValidator<import("@vinejs/vine").VineObject<{
112
+ email: import("@vinejs/vine").VineString;
113
+ name: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
114
+ password: import("@vinejs/vine/schema/base/literal").OptionalModifier<import("@vinejs/vine").VineString>;
115
+ }, {
116
+ name?: string | null | undefined;
117
+ password?: string | null | undefined;
118
+ email: string;
119
+ }, {
120
+ name?: string | undefined;
121
+ password?: string | undefined;
122
+ email: string;
123
+ }, {
124
+ name?: string | undefined;
125
+ password?: string | undefined;
126
+ email: string;
127
+ }>, Record<string, any> | undefined>;
@@ -0,0 +1,53 @@
1
+ import vine from '@vinejs/vine';
2
+ export const signupValidator = vine.compile(vine.object({
3
+ email: vine.string().trim().email().normalizeEmail(),
4
+ fullName: vine.string().trim().minLength(2).maxLength(255),
5
+ password: vine.string().minLength(8).maxLength(255),
6
+ }));
7
+ export const forgotPasswordValidator = vine.compile(vine.object({
8
+ email: vine.string().trim().email().normalizeEmail(),
9
+ }));
10
+ export const resetPasswordValidator = vine.compile(vine.object({
11
+ token: vine.string().trim().minLength(1),
12
+ password: vine.string().minLength(8).maxLength(255),
13
+ }));
14
+ /**
15
+ * Troca de senha no console de conta. A regra da nova senha espelha o
16
+ * signupValidator (min 8, max 255); a senha atual é confirmada à parte via
17
+ * verifyCredentials.
18
+ */
19
+ export const changePasswordValidator = vine.compile(vine.object({
20
+ currentPassword: vine.string().minLength(1),
21
+ newPassword: vine.string().minLength(8).maxLength(255),
22
+ }));
23
+ /**
24
+ * Troca de e-mail no console de conta: senha atual (opcional — pode ser
25
+ * dispensada pela setting `email_change.requirePassword: false`) + o novo e-mail.
26
+ */
27
+ export const changeEmailValidator = vine.compile(vine.object({
28
+ currentPassword: vine.string().minLength(1).optional(),
29
+ newEmail: vine.string().trim().email().normalizeEmail(),
30
+ }));
31
+ /**
32
+ * Edição de perfil no console de conta: nome e avatarUrl, ambos opcionais.
33
+ * Campos vazios são normalizados para string vazia (limpa o valor).
34
+ */
35
+ export const updateProfileValidator = vine.compile(vine.object({
36
+ name: vine.string().trim().maxLength(255).optional(),
37
+ avatarUrl: vine.string().trim().url().maxLength(2048).optional(),
38
+ }));
39
+ /**
40
+ * Deleção self-service de conta (LGPD). Aceita confirmação por senha atual
41
+ * (`currentPassword`) OU pelo e-mail digitado (`confirmEmail`, p/ contas
42
+ * passwordless). Ambos opcionais aqui; o controller exige que UM deles confirme.
43
+ */
44
+ export const deleteAccountValidator = vine.compile(vine.object({
45
+ currentPassword: vine.string().optional(),
46
+ confirmEmail: vine.string().trim().optional(),
47
+ }));
48
+ /** Criação de usuário no console admin (email obrigatório; nome/senha opcionais). */
49
+ export const adminCreateUserValidator = vine.compile(vine.object({
50
+ email: vine.string().trim().email().normalizeEmail(),
51
+ name: vine.string().trim().maxLength(255).optional(),
52
+ password: vine.string().minLength(8).maxLength(255).optional(),
53
+ }));
@@ -0,0 +1,6 @@
1
+ export type SigningAlg = 'RS256' | 'ES256' | 'PS256' | 'EdDSA';
2
+ export interface ManagedJwks {
3
+ keys: Record<string, any>[];
4
+ }
5
+ /** Gera um JWKS privado (1 chave) pronto para `oidc-provider`. */
6
+ export declare function generateJwks(alg: SigningAlg): Promise<ManagedJwks>;
@@ -0,0 +1,11 @@
1
+ import { generateKeyPair, exportJWK } from 'jose';
2
+ import { randomUUID } from 'node:crypto';
3
+ /** Gera um JWKS privado (1 chave) pronto para `oidc-provider`. */
4
+ export async function generateJwks(alg) {
5
+ const { privateKey } = await generateKeyPair(alg, { extractable: true });
6
+ const jwk = (await exportJWK(privateKey));
7
+ jwk.use = 'sig';
8
+ jwk.alg = alg;
9
+ jwk.kid = randomUUID();
10
+ return { keys: [jwk] };
11
+ }
@@ -0,0 +1,52 @@
1
+ import type { SigningAlg } from './jwks_manager.js';
2
+ /**
3
+ * Helpers PUROS do keystore managed (sem I/O). A persistência/rotação com I/O vive
4
+ * no {@link KeystoreManager} (compõe um cofre + codec); estas funções geram a chave,
5
+ * computam idade, planejam rotação (dry-run) e derivam o JWKS público.
6
+ *
7
+ * O modo `managed` "puro" gera UMA chave efêmera por boot (em {@link generateJwks})
8
+ * — não persiste, então rotacionar não faz sentido. Para rotação de verdade, o
9
+ * keystore persiste o JWKS PRIVADO (via cofre): a rotação gera um novo par (novo
10
+ * kid) e mantém as N chaves mais recentes; o JWKS público servido inclui todas (as
11
+ * antigas continuam validando), e a PRIMEIRA chave é a de assinatura corrente.
12
+ */
13
+ /** Estrutura persistida: JWKS privado (chaves com `d`). */
14
+ export interface PersistedKeystore {
15
+ keys: Record<string, any>[];
16
+ }
17
+ /** Gera uma chave de assinatura privada como JWK (com use/alg/kid + carimbo de criação). */
18
+ export declare function generateSigningJwk(alg: SigningAlg): Promise<Record<string, any>>;
19
+ /** Idade (em dias) da chave de assinatura corrente (primeira do keystore), ou null. */
20
+ export declare function signingKeyAgeDays(store: PersistedKeystore | null): number | null;
21
+ /** Info pública de uma chave managed para o painel admin (sem material privado). */
22
+ export interface ManagedKeyInfo {
23
+ kid: string;
24
+ alg: string;
25
+ ageDays: number;
26
+ /** true para a chave de assinatura corrente (a primeira do keystore). */
27
+ active: boolean;
28
+ }
29
+ /** Mapeia o keystore privado para infos públicas (kid/alg/idade/ativa). Vazio se null. */
30
+ export declare function listKeyInfos(store: PersistedKeystore | null): ManagedKeyInfo[];
31
+ /** Plano de uma rotação — o que SERIA feito (dry-run) sem tocar disco. */
32
+ export interface RotationPlan {
33
+ /** kid da chave de assinatura corrente (será deslocada para verificação), ou null. */
34
+ currentKid: string | null;
35
+ /** kids que permanecem no JWKS público após a rotação (a nova vem primeiro). */
36
+ keptKids: string[];
37
+ /** kids removidos do JWKS (tokens assinados por eles deixam de validar). */
38
+ retiredKids: string[];
39
+ /** Quantas chaves o keystore mantém após a rotação. */
40
+ keep: number;
41
+ }
42
+ /**
43
+ * Calcula o plano de rotação (PURO, sem I/O nem geração de chave). `newKidPlaceholder`
44
+ * representa a chave nova que entraria na frente. Período de graça = manter as
45
+ * `keep` chaves mais recentes; `retire: true` força `keep = 1` (remove TODAS as
46
+ * antigas imediatamente — só a nova valida).
47
+ */
48
+ export declare function planRotation(store: PersistedKeystore | null, keep: number, retire: boolean): RotationPlan;
49
+ /** Deriva o JWKS PÚBLICO (sem `d` e demais campos privados) a partir do privado. */
50
+ export declare function toPublicJwks(store: PersistedKeystore): {
51
+ keys: Record<string, any>[];
52
+ };
@@ -0,0 +1,68 @@
1
+ import { generateKeyPair, exportJWK } from 'jose';
2
+ import { randomUUID } from 'node:crypto';
3
+ /** Gera uma chave de assinatura privada como JWK (com use/alg/kid + carimbo de criação). */
4
+ export async function generateSigningJwk(alg) {
5
+ const { privateKey } = await generateKeyPair(alg, { extractable: true });
6
+ const jwk = (await exportJWK(privateKey));
7
+ jwk.use = 'sig';
8
+ jwk.alg = alg;
9
+ jwk.kid = randomUUID();
10
+ // Metadado NÃO-padrão usado só para reportar idade da chave (doctor / rotação).
11
+ // O oidc-provider e o JWKS público ignoram campos desconhecidos; `toPublicJwks`
12
+ // remove apenas a parte privada — `iat` continua interno, não vaza nada sensível.
13
+ jwk.iat = Math.floor(Date.now() / 1000);
14
+ return jwk;
15
+ }
16
+ /** Idade (em dias) da chave de assinatura corrente (primeira do keystore), ou null. */
17
+ export function signingKeyAgeDays(store) {
18
+ const iat = store?.keys?.[0]?.iat;
19
+ if (typeof iat !== 'number')
20
+ return null;
21
+ return Math.max(0, Math.floor((Date.now() / 1000 - iat) / 86400));
22
+ }
23
+ /** Mapeia o keystore privado para infos públicas (kid/alg/idade/ativa). Vazio se null. */
24
+ export function listKeyInfos(store) {
25
+ const keys = store?.keys ?? [];
26
+ const now = Date.now() / 1000;
27
+ return keys.map((k, i) => ({
28
+ kid: k.kid,
29
+ alg: k.alg ?? 'RS256',
30
+ ageDays: typeof k.iat === 'number' ? Math.max(0, Math.floor((now - k.iat) / 86400)) : 0,
31
+ active: i === 0,
32
+ }));
33
+ }
34
+ /**
35
+ * Calcula o plano de rotação (PURO, sem I/O nem geração de chave). `newKidPlaceholder`
36
+ * representa a chave nova que entraria na frente. Período de graça = manter as
37
+ * `keep` chaves mais recentes; `retire: true` força `keep = 1` (remove TODAS as
38
+ * antigas imediatamente — só a nova valida).
39
+ */
40
+ export function planRotation(store, keep, retire) {
41
+ const current = store?.keys ?? [];
42
+ const effectiveKeep = retire ? 1 : Math.max(1, keep);
43
+ const projected = ['<new>', ...current.map((k) => k.kid)];
44
+ const keptKids = projected.slice(0, effectiveKeep);
45
+ const retiredKids = projected.slice(effectiveKeep);
46
+ return {
47
+ currentKid: current[0]?.kid ?? null,
48
+ keptKids,
49
+ retiredKids,
50
+ keep: effectiveKeep,
51
+ };
52
+ }
53
+ /** Deriva o JWKS PÚBLICO (sem `d` e demais campos privados) a partir do privado. */
54
+ export function toPublicJwks(store) {
55
+ // `iat` é um metadado interno do keystore (idade da chave), não um membro JWK —
56
+ // removido do JWKS público junto com os campos da chave privada.
57
+ const PRIVATE_FIELDS = ['d', 'p', 'q', 'dp', 'dq', 'qi', 'iat'];
58
+ return {
59
+ keys: store.keys.map((jwk) => {
60
+ const pub = {};
61
+ for (const [k, v] of Object.entries(jwk)) {
62
+ if (!PRIVATE_FIELDS.includes(k))
63
+ pub[k] = v;
64
+ }
65
+ return pub;
66
+ }),
67
+ };
68
+ }
@@ -0,0 +1,20 @@
1
+ import type { PersistedKeystore } from './keystore.js';
2
+ /** Subconjunto do serviço de encryption do AdonisJS (APP_KEY). */
3
+ export interface EncryptionLike {
4
+ encrypt(value: string): string;
5
+ decrypt<T = string>(value: string): T | null;
6
+ }
7
+ /**
8
+ * Serializa/desserializa o keystore com envelope versionado. `encrypt: true`
9
+ * exige um `enc` (EncryptionLike). `decode` aceita: `enc:'none'` e `enc:'aes'`.
10
+ * Decrypt falho → THROW (decisão: nunca regenerar).
11
+ */
12
+ export declare class KeystoreCodec {
13
+ private opts;
14
+ constructor(opts: {
15
+ encrypt: boolean;
16
+ enc?: EncryptionLike;
17
+ });
18
+ encode(store: PersistedKeystore): Promise<string>;
19
+ decode(blob: string): Promise<PersistedKeystore>;
20
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Serializa/desserializa o keystore com envelope versionado. `encrypt: true`
3
+ * exige um `enc` (EncryptionLike). `decode` aceita: `enc:'none'` e `enc:'aes'`.
4
+ * Decrypt falho → THROW (decisão: nunca regenerar).
5
+ */
6
+ export class KeystoreCodec {
7
+ opts;
8
+ constructor(opts) {
9
+ this.opts = opts;
10
+ }
11
+ async encode(store) {
12
+ const json = JSON.stringify(store);
13
+ if (this.opts.encrypt) {
14
+ if (!this.opts.enc) {
15
+ throw new Error('AuthKit keystore: encryption pedida mas serviço de encryption indisponível.');
16
+ }
17
+ const env = { v: 2, enc: 'aes', data: this.opts.enc.encrypt(json) };
18
+ return JSON.stringify(env);
19
+ }
20
+ const env = { v: 2, enc: 'none', data: json };
21
+ return JSON.stringify(env);
22
+ }
23
+ async decode(blob) {
24
+ const parsed = JSON.parse(blob);
25
+ if (parsed?.v === 2 && typeof parsed.data === 'string') {
26
+ if (parsed.enc === 'none')
27
+ return JSON.parse(parsed.data);
28
+ if (parsed.enc === 'aes') {
29
+ if (!this.opts.enc) {
30
+ throw new Error('AuthKit keystore: blob encriptado mas serviço de encryption indisponível.');
31
+ }
32
+ const json = this.opts.enc.decrypt(parsed.data);
33
+ if (json == null) {
34
+ throw new Error('AuthKit keystore: decrypt falhou — APP_KEY mudou? Restaure a APP_KEY anterior ' +
35
+ 'ou regenere com `authkit:keys:rotate --force-new`.');
36
+ }
37
+ return JSON.parse(json);
38
+ }
39
+ }
40
+ throw new Error('AuthKit keystore: formato de blob irreconhecível.');
41
+ }
42
+ }
@@ -0,0 +1,9 @@
1
+ import type { EncryptionLike } from './keystore_codec.js';
2
+ export declare function __setEncryptionServiceForTests(svc: EncryptionLike | undefined): void;
3
+ /** Retorna o serviço injetado (testes) ou undefined. */
4
+ export declare function getInjectedEncryptionService(): EncryptionLike | undefined;
5
+ /**
6
+ * Resolve o serviço de encryption: injeção (testes) tem prioridade; senão importa
7
+ * `@adonisjs/core/services/encryption`. Lança se nenhum estiver disponível.
8
+ */
9
+ export declare function loadEncryptionService(): Promise<EncryptionLike>;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Carrega o serviço de encryption do app (APP_KEY) de forma LAZY. Diferente do
3
+ * encrypter do TOTP (que degrada p/ plaintext), aqui o caller decide o que fazer
4
+ * com a ausência — o keystore exige determinismo. Em testes, injete via
5
+ * {@link __setEncryptionServiceForTests}.
6
+ */
7
+ let injected;
8
+ export function __setEncryptionServiceForTests(svc) {
9
+ injected = svc;
10
+ }
11
+ /** Retorna o serviço injetado (testes) ou undefined. */
12
+ export function getInjectedEncryptionService() {
13
+ return injected;
14
+ }
15
+ /**
16
+ * Resolve o serviço de encryption: injeção (testes) tem prioridade; senão importa
17
+ * `@adonisjs/core/services/encryption`. Lança se nenhum estiver disponível.
18
+ */
19
+ export async function loadEncryptionService() {
20
+ if (injected)
21
+ return injected;
22
+ const mod = await import('@adonisjs/core/services/encryption');
23
+ const svc = mod.default;
24
+ if (!svc)
25
+ throw new Error('AuthKit keystore: serviço de encryption (APP_KEY) indisponível.');
26
+ return svc;
27
+ }
@@ -0,0 +1,43 @@
1
+ import { type PersistedKeystore, type RotationPlan } from './keystore.js';
2
+ import type { KeystoreCodec } from './keystore_codec.js';
3
+ import { type KeystoreVault } from './keystore_vault.js';
4
+ import type { SigningAlg } from './jwks_manager.js';
5
+ import type { KeystoreStoreConfig } from '@adonis-agora/authkit-core';
6
+ /**
7
+ * Único caminho de I/O do keystore managed: compõe um {@link KeystoreVault} (onde
8
+ * o blob mora) com um {@link KeystoreCodec} (serialização + encryption). As helpers
9
+ * puras (gerar chave, planejar rotação) continuam em `keystore.ts`.
10
+ */
11
+ export declare class KeystoreManager {
12
+ private vault;
13
+ private codec;
14
+ private alg;
15
+ constructor(vault: KeystoreVault, codec: KeystoreCodec, alg: SigningAlg);
16
+ /** Lê o keystore (privado) ou null se ausente. */
17
+ read(): Promise<PersistedKeystore | null>;
18
+ /** Garante que exista: gera+persiste se ausente; senão decodifica e retorna. */
19
+ ensure(): Promise<PersistedKeystore>;
20
+ /** Rotaciona: chave nova na frente, mantém as `keep` mais recentes. Persiste. */
21
+ rotate(keep?: number, retire?: boolean): Promise<{
22
+ store: PersistedKeystore;
23
+ newKid: string;
24
+ retiredKids: string[];
25
+ }>;
26
+ /** Plano de rotação (puro, sem I/O de escrita). */
27
+ plan(keep: number, retire: boolean): Promise<RotationPlan>;
28
+ /** Token barato de mudança (delegado ao vault; fallback p/ read completo). */
29
+ head(): Promise<string | null>;
30
+ }
31
+ /** Acesso mínimo ao app que o resolver precisa (paths + container p/ lucid/redis). */
32
+ export interface KeystoreVaultContext {
33
+ makePath: (p: string) => string;
34
+ container: {
35
+ make: (token: string) => Promise<any>;
36
+ };
37
+ }
38
+ /**
39
+ * Resolve a config `store` num {@link KeystoreVault}. `ctx.makePath` = `app.makePath`
40
+ * (resolve paths relativos à raiz do app). Instância custom (com `read`/`write`)
41
+ * passa direto. Drivers de cloud lançam nesta fatia (chegam nos packages-irmãos).
42
+ */
43
+ export declare function resolveKeystoreVault(store: KeystoreStoreConfig | KeystoreVault, ctx: KeystoreVaultContext): KeystoreVault;