@adonis-agora/authkit-server 0.46.0 → 0.48.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 (195) hide show
  1. package/build/commands/clients_create.js +4 -4
  2. package/build/commands/configure.js +3 -2
  3. package/build/commands/doctor.js +8 -5
  4. package/build/commands/eject.js +1 -1
  5. package/build/commands/expire_scan.js +7 -5
  6. package/build/commands/import_users.js +1 -1
  7. package/build/commands/keys_rotate.js +7 -4
  8. package/build/host/views/account/apps.edge +5 -5
  9. package/build/host/views/account/login.edge +1 -1
  10. package/build/host/views/account/mfa.edge +7 -7
  11. package/build/host/views/account/orgs.edge +5 -5
  12. package/build/host/views/account/security.edge +10 -10
  13. package/build/host/views/account/tokens.edge +5 -5
  14. package/build/host/views/otp-unlock.edge +2 -2
  15. package/build/index.d.ts +7 -7
  16. package/build/index.js +5 -5
  17. package/build/providers/authkit_server_provider.d.ts +2 -2
  18. package/build/providers/authkit_server_provider.js +26 -10
  19. package/build/services/booted_app.d.ts +8 -0
  20. package/build/services/booted_app.js +27 -0
  21. package/build/services/main.d.ts +8 -1
  22. package/build/services/main.js +10 -2
  23. package/build/src/accounts/lucid_account_store.d.ts +3 -3
  24. package/build/src/accounts/lucid_account_store.js +6 -8
  25. package/build/src/accounts/lucid_store/core.js +1 -1
  26. package/build/src/accounts/lucid_store/mfa.js +1 -1
  27. package/build/src/accounts/lucid_store/organizations.js +2 -4
  28. package/build/src/accounts/lucid_store/password_hygiene.js +1 -4
  29. package/build/src/accounts/lucid_store/shared.d.ts +1 -1
  30. package/build/src/accounts/lucid_stores.d.ts +3 -3
  31. package/build/src/accounts/lucid_stores.js +2 -2
  32. package/build/src/adapters/database_adapter.js +3 -1
  33. package/build/src/adapters/factory.js +1 -1
  34. package/build/src/adapters/redis_adapter.js +2 -1
  35. package/build/src/commands/expire_scan_command.js +19 -5
  36. package/build/src/commands/settings_commands.js +22 -5
  37. package/build/src/define_config.d.ts +20 -20
  38. package/build/src/define_config.js +62 -67
  39. package/build/src/doctor/checks.js +45 -20
  40. package/build/src/events/dispatcher.d.ts +1 -1
  41. package/build/src/events/dispatcher.js +10 -10
  42. package/build/src/host/account_api/account_api_controller.js +95 -39
  43. package/build/src/host/account_deletion_ops.d.ts +4 -4
  44. package/build/src/host/account_deletion_ops.js +5 -5
  45. package/build/src/host/account_deletion_service.d.ts +2 -2
  46. package/build/src/host/account_deletion_service.js +2 -2
  47. package/build/src/host/account_export_service.d.ts +1 -1
  48. package/build/src/host/account_export_service.js +4 -6
  49. package/build/src/host/account_home.d.ts +0 -8
  50. package/build/src/host/account_home.js +6 -4
  51. package/build/src/host/account_login_url.d.ts +44 -0
  52. package/build/src/host/account_login_url.js +58 -0
  53. package/build/src/host/account_paths.d.ts +120 -0
  54. package/build/src/host/account_paths.js +161 -0
  55. package/build/src/host/admin_api/admin_orgs_service.d.ts +2 -2
  56. package/build/src/host/admin_api/admin_orgs_service.js +3 -2
  57. package/build/src/host/admin_api/admin_users_service.d.ts +12 -12
  58. package/build/src/host/admin_api/admin_users_service.js +20 -20
  59. package/build/src/host/admin_api/api_clients_controller.js +2 -2
  60. package/build/src/host/admin_api/api_misc_controller.js +2 -2
  61. package/build/src/host/admin_api/api_orgs_controller.js +3 -3
  62. package/build/src/host/admin_api/api_settings_controller.js +11 -5
  63. package/build/src/host/admin_api/api_users_controller.d.ts +2 -2
  64. package/build/src/host/admin_api/api_users_controller.js +37 -38
  65. package/build/src/host/admin_api/dto.d.ts +4 -4
  66. package/build/src/host/admin_clients_service.js +5 -4
  67. package/build/src/host/admin_console/admin_shell_controller.js +4 -2
  68. package/build/src/host/admin_console/console_audit_controller.js +1 -1
  69. package/build/src/host/admin_console/console_clients_controller.js +5 -3
  70. package/build/src/host/admin_console/console_impersonation_controller.js +1 -1
  71. package/build/src/host/admin_console/console_keys_controller.js +2 -4
  72. package/build/src/host/admin_console/console_orgs_controller.js +3 -3
  73. package/build/src/host/admin_console/console_roles_controller.js +30 -12
  74. package/build/src/host/admin_console/console_sessions_controller.js +3 -3
  75. package/build/src/host/admin_console/console_settings_controller.js +11 -5
  76. package/build/src/host/admin_console/console_users_controller.d.ts +2 -2
  77. package/build/src/host/admin_console/console_users_controller.js +46 -47
  78. package/build/src/host/admin_prefix.js +2 -2
  79. package/build/src/host/admin_sessions_service.d.ts +3 -1
  80. package/build/src/host/admin_sessions_service.js +36 -6
  81. package/build/src/host/adonis_auth_sync.d.ts +1 -1
  82. package/build/src/host/adonis_auth_user_provider.d.ts +1 -1
  83. package/build/src/host/app_key.js +1 -1
  84. package/build/src/host/avatar_storage.js +1 -3
  85. package/build/src/host/config_locks.js +1 -3
  86. package/build/src/host/console_session.d.ts +4 -0
  87. package/build/src/host/console_session.js +9 -2
  88. package/build/src/host/controllers/account_apps_controller.js +3 -2
  89. package/build/src/host/controllers/account_confirm_controller.js +2 -6
  90. package/build/src/host/controllers/account_mfa_controller.js +63 -12
  91. package/build/src/host/controllers/account_orgs_controller.js +53 -30
  92. package/build/src/host/controllers/account_security_controller.d.ts +2 -2
  93. package/build/src/host/controllers/account_security_controller.js +116 -116
  94. package/build/src/host/controllers/account_session_controller.js +7 -5
  95. package/build/src/host/controllers/account_tokens_controller.js +14 -2
  96. package/build/src/host/controllers/interaction_controller.js +59 -22
  97. package/build/src/host/controllers/pat_introspection_controller.js +10 -0
  98. package/build/src/host/controllers/registration_controller.js +28 -13
  99. package/build/src/host/default_mailer.js +11 -7
  100. package/build/src/host/durable/account_deletion_workflow.d.ts +2 -2
  101. package/build/src/host/durable/account_deletion_workflow.js +14 -14
  102. package/build/src/host/durable/account_export_workflow.d.ts +2 -2
  103. package/build/src/host/durable/account_export_workflow.js +12 -12
  104. package/build/src/host/durable/index.d.ts +5 -5
  105. package/build/src/host/durable/index.js +6 -6
  106. package/build/src/host/i18n.d.ts +1376 -1376
  107. package/build/src/host/i18n.js +1380 -1380
  108. package/build/src/host/impersonation.js +1 -7
  109. package/build/src/host/key_rotation_actions.d.ts +1 -1
  110. package/build/src/host/login_attempt.js +35 -6
  111. package/build/src/host/login_notify.js +1 -1
  112. package/build/src/host/middleware/account_auth.js +3 -1
  113. package/build/src/host/otp_lockout.js +1 -3
  114. package/build/src/host/rate_limit.js +1 -1
  115. package/build/src/host/register_auth_host.d.ts +96 -2
  116. package/build/src/host/register_auth_host.js +196 -91
  117. package/build/src/host/renderers/edge_renderer.js +19 -1
  118. package/build/src/host/renderers/inertia_renderer.d.ts +63 -0
  119. package/build/src/host/renderers/inertia_renderer.js +63 -0
  120. package/build/src/host/runtime_settings.js +1 -1
  121. package/build/src/host/runtime_toggles.d.ts +3 -3
  122. package/build/src/host/runtime_toggles.js +69 -24
  123. package/build/src/host/security_notice_service.d.ts +1 -1
  124. package/build/src/host/security_notice_service.js +1 -1
  125. package/build/src/host/session_context.js +1 -1
  126. package/build/src/host/sudo/index.d.ts +3 -3
  127. package/build/src/host/sudo/index.js +3 -3
  128. package/build/src/host/sudo/methods/magic_link.js +6 -5
  129. package/build/src/host/sudo/methods/passkey.js +7 -4
  130. package/build/src/host/sudo/methods/password.js +8 -3
  131. package/build/src/host/sudo/runtime.js +6 -13
  132. package/build/src/host/sudo_mode.js +3 -2
  133. package/build/src/host/ui-dist/assets/index-BQoTDiLV.js +137 -0
  134. package/build/src/host/ui-dist/index.html +1 -1
  135. package/build/src/keys/jwks_manager.js +1 -1
  136. package/build/src/keys/keystore.js +1 -1
  137. package/build/src/keys/keystore_manager.d.ts +2 -2
  138. package/build/src/keys/keystore_manager.js +2 -2
  139. package/build/src/keys/keystore_vault.js +8 -4
  140. package/build/src/mixins/with_audit_log.d.ts +1 -1
  141. package/build/src/mixins/with_auth_user.d.ts +1 -1
  142. package/build/src/mixins/with_auth_user.js +1 -1
  143. package/build/src/mixins/with_credentials.d.ts +1 -1
  144. package/build/src/mixins/with_mfa.d.ts +1 -1
  145. package/build/src/mixins/with_personal_access_token.d.ts +1 -1
  146. package/build/src/mixins/with_provider_identity.d.ts +1 -1
  147. package/build/src/mixins/with_webauthn_credential.d.ts +1 -1
  148. package/build/src/observability/diagnostics_bridge.js +2 -2
  149. package/build/src/observability/metrics_service.js +1 -1
  150. package/build/src/observability/telescope/data_providers.d.ts +1 -1
  151. package/build/src/observability/telescope/data_providers.js +29 -43
  152. package/build/src/observability/telescope/extension.d.ts +1 -1
  153. package/build/src/observability/telescope/extension.js +58 -58
  154. package/build/src/observability/telescope/index.d.ts +2 -2
  155. package/build/src/observability/telescope/index.js +2 -2
  156. package/build/src/observability/wire_provider_events.d.ts +1 -1
  157. package/build/src/observability/wire_provider_events.js +11 -11
  158. package/build/src/password/common_passwords.js +1 -1
  159. package/build/src/password/password_manager.d.ts +1 -1
  160. package/build/src/password/password_manager.js +4 -4
  161. package/build/src/pat/lucid_pat_store.js +2 -6
  162. package/build/src/pat/pat_tokens.js +1 -1
  163. package/build/src/provider/interaction_actions.js +1 -1
  164. package/build/src/provider/key_rotation_scheduler.js +3 -1
  165. package/build/src/provider/logout_sources.js +2 -8
  166. package/build/src/provider/oidc_service.d.ts +2 -2
  167. package/build/src/provider/oidc_service.js +22 -14
  168. package/build/src/provider/single_flight_lock.js +1 -3
  169. package/build/src/provider/token_exchange.d.ts +1 -1
  170. package/build/src/schema/ensure.js +3 -1
  171. package/build/stubs/ui/react/components/auth_shell.tsx +19 -19
  172. package/build/stubs/ui/react/pages/account/login.tsx +6 -7
  173. package/build/stubs/ui/react/pages/account/mfa.tsx +16 -15
  174. package/build/stubs/ui/react/pages/account/tokens.tsx +27 -17
  175. package/build/stubs/ui/react/pages/consent.tsx +12 -12
  176. package/build/stubs/ui/react/pages/forgot.tsx +7 -7
  177. package/build/stubs/ui/react/pages/login.tsx +22 -24
  178. package/build/stubs/ui/react/pages/mfa-challenge.tsx +9 -10
  179. package/build/stubs/ui/react/pages/reset.tsx +10 -10
  180. package/build/stubs/ui/react/pages/signup.tsx +30 -16
  181. package/build/stubs/ui/react/pages/verify-email.tsx +6 -6
  182. package/package.json +1 -1
  183. package/stubs/main.ts +2 -2
  184. package/stubs/ui/react/components/auth_shell.tsx +19 -19
  185. package/stubs/ui/react/pages/account/login.tsx +6 -7
  186. package/stubs/ui/react/pages/account/mfa.tsx +16 -15
  187. package/stubs/ui/react/pages/account/tokens.tsx +27 -17
  188. package/stubs/ui/react/pages/consent.tsx +12 -12
  189. package/stubs/ui/react/pages/forgot.tsx +7 -7
  190. package/stubs/ui/react/pages/login.tsx +22 -24
  191. package/stubs/ui/react/pages/mfa-challenge.tsx +9 -10
  192. package/stubs/ui/react/pages/reset.tsx +10 -10
  193. package/stubs/ui/react/pages/signup.tsx +30 -16
  194. package/stubs/ui/react/pages/verify-email.tsx +6 -6
  195. package/build/src/host/ui-dist/assets/index-BmI_J87g.js +0 -137
@@ -13,13 +13,7 @@ export function buildImpersonationPanel(cfg, targetId) {
13
13
  const auth = client.clientSecret
14
14
  ? ` -u '${client.clientId}:${client.clientSecret}' \\\n`
15
15
  : ` -d 'client_id=${client.clientId}' \\\n`;
16
- const curl = `curl -X POST '${tokenEndpoint}' \\\n` +
17
- auth +
18
- ` -d 'grant_type=${TOKEN_EXCHANGE}' \\\n` +
19
- ` -d 'subject_token=<ADMIN_ACCESS_TOKEN>' \\\n` +
20
- ` -d 'subject_token_type=${ACCESS_TOKEN_TYPE}' \\\n` +
21
- ` -d 'requested_subject=${targetId}' \\\n` +
22
- ` -d 'scope=openid profile email'`;
16
+ const curl = `curl -X POST '${tokenEndpoint}' \\\n${auth} -d 'grant_type=${TOKEN_EXCHANGE}' \\\n -d 'subject_token=<ADMIN_ACCESS_TOKEN>' \\\n -d 'subject_token_type=${ACCESS_TOKEN_TYPE}' \\\n -d 'requested_subject=${targetId}' \\\n -d 'scope=openid profile email'`;
23
17
  return {
24
18
  tokenEndpoint,
25
19
  grantType: TOKEN_EXCHANGE,
@@ -1,6 +1,6 @@
1
+ import type { ManagedKeyInfo } from '../keys/keystore.js';
1
2
  import { type ResolvedKeyRotationSetting } from './key_rotation.js';
2
3
  import type { SettingsCapability } from './runtime_settings.js';
3
- import type { ManagedKeyInfo } from '../keys/keystore.js';
4
4
  /**
5
5
  * Ações compartilhadas de rotação de chave. Funções puras-ish que tanto a Admin
6
6
  * REST API (Bearer) quanto o console (sessão) chamam, evitando duplicar a lógica
@@ -1,6 +1,6 @@
1
1
  import { supportsAccountStatus, supportsEmailVerificationStatus, supportsPasswordExpiration, } from '../accounts/account_store.js';
2
2
  import { createAccountLockout } from './account_lockout.js';
3
- import { resolveEffectiveRequireVerifiedEmail, resolveEffectiveRequireVerifiedEmailFull, resolveEffectivePasswordExpiration, resolveEffectiveAccountExpiration, resolveEffectiveLockout, } from './runtime_toggles.js';
3
+ import { resolveEffectiveAccountExpiration, resolveEffectiveLockout, resolveEffectivePasswordExpiration, resolveEffectiveRequireVerifiedEmail, resolveEffectiveRequireVerifiedEmailFull, } from './runtime_toggles.js';
4
4
  /**
5
5
  * `requireVerifiedEmail` efetivo (config ou runtime setting) E o store sabe dizer
6
6
  * se o e-mail está verificado E a conta NÃO está verificada → bloqueia.
@@ -97,7 +97,12 @@ export async function isAccountExpired(audit, accountId, settings, logger) {
97
97
  return false;
98
98
  try {
99
99
  // Busca o último login.success da conta (ordem desc, limit 1).
100
- const result = await audit.list({ type: 'login.success', subject: accountId, page: 1, limit: 1 });
100
+ const result = await audit.list({
101
+ type: 'login.success',
102
+ subject: accountId,
103
+ page: 1,
104
+ limit: 1,
105
+ });
101
106
  if (result.data.length === 0) {
102
107
  // Nunca logou → considera ativa (conta nova, não inativa).
103
108
  return false;
@@ -163,7 +168,13 @@ export async function attemptPasswordLogin(cfg, input) {
163
168
  // de adivinhar senha).
164
169
  if (supportsAccountStatus(cfg.accountStore) && (await cfg.accountStore.isDisabled(account.id))) {
165
170
  await cfg.audit?.record(input.clientId !== undefined
166
- ? { type: 'login.failure', email, ip, clientId: input.clientId, metadata: { reason: 'disabled' } }
171
+ ? {
172
+ type: 'login.failure',
173
+ email,
174
+ ip,
175
+ clientId: input.clientId,
176
+ metadata: { reason: 'disabled' },
177
+ }
167
178
  : { type: 'login.failure', email, ip, metadata: { reason: 'disabled' } });
168
179
  return { ok: false, locked: false, disabled: true };
169
180
  }
@@ -173,7 +184,13 @@ export async function attemptPasswordLogin(cfg, input) {
173
184
  if (await isEmailUnverifiedBlock(cfg, account.id, input.settings)) {
174
185
  await lockout.clearFailures(email);
175
186
  await cfg.audit?.record(input.clientId !== undefined
176
- ? { type: 'login.failure', email, ip, clientId: input.clientId, metadata: { reason: 'unverified' } }
187
+ ? {
188
+ type: 'login.failure',
189
+ email,
190
+ ip,
191
+ clientId: input.clientId,
192
+ metadata: { reason: 'unverified' },
193
+ }
177
194
  : { type: 'login.failure', email, ip, metadata: { reason: 'unverified' } });
178
195
  return { ok: false, locked: false, unverified: true };
179
196
  }
@@ -186,7 +203,13 @@ export async function attemptPasswordLogin(cfg, input) {
186
203
  // Não é uma falha de credenciais — limpa o contador.
187
204
  await lockout.clearFailures(email);
188
205
  await cfg.audit?.record(input.clientId !== undefined
189
- ? { type: 'password.expired_change_forced', accountId: account.id, email, ip, clientId: input.clientId }
206
+ ? {
207
+ type: 'password.expired_change_forced',
208
+ accountId: account.id,
209
+ email,
210
+ ip,
211
+ clientId: input.clientId,
212
+ }
190
213
  : { type: 'password.expired_change_forced', accountId: account.id, email, ip });
191
214
  return { ok: false, locked: false, passwordExpired: true, account: account };
192
215
  }
@@ -200,7 +223,13 @@ export async function attemptPasswordLogin(cfg, input) {
200
223
  if (expired) {
201
224
  await lockout.clearFailures(email);
202
225
  await cfg.audit?.record(input.clientId !== undefined
203
- ? { type: 'account.expired_login_blocked', accountId: account.id, email, ip, clientId: input.clientId }
226
+ ? {
227
+ type: 'account.expired_login_blocked',
228
+ accountId: account.id,
229
+ email,
230
+ ip,
231
+ clientId: input.clientId,
232
+ }
204
233
  : { type: 'account.expired_login_blocked', accountId: account.id, email, ip });
205
234
  return { ok: false, locked: false, accountExpired: true };
206
235
  }
@@ -1,4 +1,4 @@
1
- import { sendNewLoginEmail, sendNewDeviceLoginEmail } from './default_mailer.js';
1
+ import { sendNewDeviceLoginEmail, sendNewLoginEmail } from './default_mailer.js';
2
2
  import { TRUSTED_DEVICE_COOKIE, isTrustedDeviceValid } from './trusted_device.js';
3
3
  /**
4
4
  * Centraliza o pós-login bem-sucedido: registra o evento `login.success` e dispara
@@ -1,10 +1,12 @@
1
1
  import '../augmentations.js';
2
+ import { getAccountLoginUrl } from '../account_login_url.js';
2
3
  export const ACCOUNT_SESSION_KEY = 'account_user_id';
3
4
  export default class AccountAuthMiddleware {
4
5
  async handle(ctx, next) {
5
6
  const userId = ctx.session.get(ACCOUNT_SESSION_KEY);
6
7
  if (!userId) {
7
- return ctx.response.redirect('/account/login');
8
+ // Destino configurável (`accountLoginUrl`): default `/account/login`.
9
+ return ctx.response.redirect(getAccountLoginUrl());
8
10
  }
9
11
  return next();
10
12
  }
@@ -83,9 +83,7 @@ let limiterPromise;
83
83
  async function loadLimiter() {
84
84
  if (!limiterPromise) {
85
85
  const spec = '@adonisjs/limiter/services/main';
86
- limiterPromise = import(__rewriteRelativeImportExtension(spec))
87
- .then((m) => m.default ?? null)
88
- .catch(() => null);
86
+ limiterPromise = import(__rewriteRelativeImportExtension(spec)).then((m) => m.default ?? null).catch(() => null);
89
87
  }
90
88
  return limiterPromise;
91
89
  }
@@ -78,7 +78,7 @@ export function createAuthThrottles(config) {
78
78
  // Introspecção de PAT: keyed pelo bearer secret quando presente, senão por IP.
79
79
  introspection: buildThrottle('authkit_pat_introspection', config.introspection, config.store, (ctx) => {
80
80
  const auth = ctx.request.header('authorization');
81
- if (auth && auth.toLowerCase().startsWith('bearer ')) {
81
+ if (auth?.toLowerCase().startsWith('bearer ')) {
82
82
  return `bearer:${auth.slice(7).trim()}`;
83
83
  }
84
84
  return undefined;
@@ -1,5 +1,6 @@
1
1
  import type { Router } from '@adonisjs/core/http';
2
2
  import type { AuthSocialConfig, RateLimitConfigInput } from '../define_config.js';
3
+ import { type AccountPathsOptions } from './account_paths.js';
3
4
  import type { SudoMethod } from './sudo/types.js';
4
5
  /** Chave da sessão Adonis que registra o timestamp da última atividade (idle timeout). */
5
6
  export declare const ACCOUNT_LAST_SEEN_KEY = "authkit_last_seen";
@@ -7,9 +8,11 @@ export declare const ACCOUNT_LAST_SEEN_KEY = "authkit_last_seen";
7
8
  * Guard do console admin (B6). Como o `accountGuard`, é uma closure inline (forma
8
9
  * confiável do `.use()` num grupo). Exige:
9
10
  * 0. `config.admin.enabled` ligado (senão → 404; ver nota de flag-drift abaixo);
10
- * 1. sessão de conta ativa (senão → /account/login);
11
+ * 1. sessão de conta ativa (senão → `accountLoginUrl`, default /account/login);
11
12
  * 2. a conta logada com pelo menos UMA das `config.admin.roles` nas roles globais
12
- * (senão → /account/tokens, evitando vazar a existência do /admin).
13
+ * (senão → `accountHome(cfg)`, default /account/security NÃO revela a
14
+ * existência do /admin, e cai numa tela que o host controla via `accountHome`;
15
+ * se a tela default estiver desmontada, aponte `config.accountHome` para uma montada).
13
16
  * As roles permitidas são resolvidas em runtime do `authkit.server` (config lazy).
14
17
  */
15
18
  export declare const adminGuard: (ctx: any, next: () => Promise<void>) => Promise<any>;
@@ -108,6 +111,97 @@ export interface AuthHostOptions {
108
111
  * Ausente → `[password(), passkey()]`.
109
112
  */
110
113
  sudoMethods?: SudoMethod[];
114
+ /**
115
+ * Montagem por tela do console de conta (`/account/*`). Espelha o padrão
116
+ * `admin`/`adminApi`: a decisão de MONTAR cada grupo de rotas é tomada em
117
+ * tempo de registro, antes de o config (lazy) resolver.
118
+ *
119
+ * - Ausente → tudo montado (back-compat total).
120
+ * - `false` → NENHUMA tela do console de conta é montada (as rotas sudo
121
+ * `/account/confirm` e a JSON API `/account/api/*` continuam — são
122
+ * infraestrutura, não telas navegáveis).
123
+ * - objeto → montagem seletiva; cada flag ausente default `true`.
124
+ * - `login` → `/account/login`, `/account/logout` (a porta por senha do console).
125
+ * - `tokens` → `/account/tokens*` (Personal Access Tokens).
126
+ * - `orgs` → `/account/orgs*` (multi-tenancy, incl. o accept de convite público).
127
+ * - `security` → `/account/security*` + `/account/email/confirm` (perfil, senha, troca de e-mail, export/LGPD, deleção).
128
+ * - `mfa` → `/account/mfa*` (TOTP + passkeys).
129
+ * - `apps` → `/account/apps*` (grants de consentimento OIDC).
130
+ *
131
+ * NOTA (flag-drift): como `admin`/`adminApi`, estas flags controlam apenas se
132
+ * as ROTAS existem; o comportamento em runtime continua vindo do config
133
+ * resolvido. Mantenha em sincronia — os guards são a rede de segurança.
134
+ *
135
+ * ⚠️ Ao desmontar `login`, os redirects internos de "faça login"
136
+ * (`accountGuard`, `adminGuard`, `AccountAuthMiddleware`, `consoleLoginUrl()`,
137
+ * a view `otp-unlock`) apontariam para uma rota inexistente — passe
138
+ * `accountLoginUrl` com a rota de login do host (ex.: `'/login'`).
139
+ *
140
+ * @example
141
+ * // Console passwordless: só segurança + MFA, login delegado ao OIDC do host.
142
+ * registerAuthHost(router, {
143
+ * account: { login: false, tokens: false, orgs: false },
144
+ * accountLoginUrl: '/login',
145
+ * })
146
+ */
147
+ account?: false | AccountScreensOptions;
148
+ /**
149
+ * Destino do redirect de "não-autenticado → faça login" do console de conta.
150
+ * Default `/account/login`. Aponte para a rota de login do host quando a tela
151
+ * `account/login` da lib estiver desmontada (`account: { login: false }`).
152
+ *
153
+ * Usado por TODOS os pontos de redirect/link de login: `accountGuard`,
154
+ * `adminGuard`, `AccountAuthMiddleware`, `consoleLoginUrl()`, os fallbacks dos
155
+ * controllers de conta e a view `otp-unlock`. Ver `account_login_url.ts`.
156
+ */
157
+ accountLoginUrl?: string;
158
+ /**
159
+ * Prefixo e segmentos de tela CONFIGURÁVEIS/LOCALIZÁVEIS do console de conta
160
+ * (`/account/*`). Top-level (e não dentro de `account`) DE PROPÓSITO: mesmo
161
+ * com `account: false`, a lib continua montando as rotas de sudo
162
+ * (`/account/confirm*`) e a JSON API (`/account/api/*`) — o prefixo precisa
163
+ * valer para essa infraestrutura também, então ele não pode viver debaixo da
164
+ * flag que desmonta as telas navegáveis.
165
+ *
166
+ * - `prefix` troca o `/account` base (ex.: `'/conta'`).
167
+ * - `paths` traduz cada TELA navegável (ex.: `{ security: 'seguranca',
168
+ * confirm: 'confirmar' }`).
169
+ *
170
+ * Só o prefixo e o segmento de tela são renomeáveis — os action-subpaths dos
171
+ * POSTs internos (`/password`, `/enroll`, `/passkeys/verify`, ...) e o
172
+ * segmento `api` da JSON API são FIXOS (endpoints de máquina, invisíveis ao
173
+ * usuário). Ver `account_paths.ts`.
174
+ *
175
+ * Ausente → tudo idêntico a hoje (`/account/...` — back-compat total).
176
+ *
177
+ * @example
178
+ * // Console em português: /conta/seguranca, /conta/confirmar, ...
179
+ * registerAuthHost(router, {
180
+ * accountRoutes: {
181
+ * prefix: '/conta',
182
+ * paths: { security: 'seguranca', confirm: 'confirmar', mfa: 'mfa' },
183
+ * },
184
+ * })
185
+ */
186
+ accountRoutes?: AccountPathsOptions;
187
+ }
188
+ /**
189
+ * Flags de montagem por tela do console de conta. Cada campo ausente é `true`
190
+ * (montado). Ver {@link AuthHostOptions.account}.
191
+ */
192
+ export interface AccountScreensOptions {
193
+ /** Tela de login por senha do console (`/account/login`, `/account/logout`). */
194
+ login?: boolean;
195
+ /** Personal Access Tokens (`/account/tokens*`). */
196
+ tokens?: boolean;
197
+ /** Organizations / multi-tenancy (`/account/orgs*`). */
198
+ orgs?: boolean;
199
+ /** Perfil, senha, troca de e-mail, export/LGPD e deleção (`/account/security*`). */
200
+ security?: boolean;
201
+ /** MFA — TOTP + passkeys (`/account/mfa*`). */
202
+ mfa?: boolean;
203
+ /** Apps com acesso / grants de consentimento OIDC (`/account/apps*`). */
204
+ apps?: boolean;
111
205
  }
112
206
  /**
113
207
  * Monta todas as rotas do host-kit do Authorization Server numa chamada.