@frontmcp/auth 1.2.1 → 1.4.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 (74) hide show
  1. package/authorities/authorities.profiles.d.ts +14 -1
  2. package/authorities/authorities.profiles.d.ts.map +1 -1
  3. package/authorization/dcr-client.registry.d.ts +83 -0
  4. package/authorization/dcr-client.registry.d.ts.map +1 -0
  5. package/authorization/index.d.ts +2 -0
  6. package/authorization/index.d.ts.map +1 -1
  7. package/cimd/cimd.service.d.ts +2 -9
  8. package/cimd/cimd.service.d.ts.map +1 -1
  9. package/common/session.types.d.ts +4 -4
  10. package/esm/index.mjs +1821 -214
  11. package/esm/package.json +5 -5
  12. package/index.d.ts +5 -5
  13. package/index.d.ts.map +1 -1
  14. package/index.js +2030 -383
  15. package/jwks/jwks.service.d.ts +2 -4
  16. package/jwks/jwks.service.d.ts.map +1 -1
  17. package/options/app-auth.schema.d.ts +226 -0
  18. package/options/app-auth.schema.d.ts.map +1 -1
  19. package/options/index.d.ts +4 -4
  20. package/options/index.d.ts.map +1 -1
  21. package/options/interfaces.d.ts +580 -4
  22. package/options/interfaces.d.ts.map +1 -1
  23. package/options/orchestrated.schema.d.ts +492 -1
  24. package/options/orchestrated.schema.d.ts.map +1 -1
  25. package/options/schema.d.ts +226 -0
  26. package/options/schema.d.ts.map +1 -1
  27. package/options/shared.schemas.d.ts +237 -2
  28. package/options/shared.schemas.d.ts.map +1 -1
  29. package/package.json +5 -5
  30. package/session/authorization.store.d.ts +117 -47
  31. package/session/authorization.store.d.ts.map +1 -1
  32. package/session/consent.store.d.ts +86 -0
  33. package/session/consent.store.d.ts.map +1 -0
  34. package/session/credential-resume-link.d.ts +64 -0
  35. package/session/credential-resume-link.d.ts.map +1 -0
  36. package/session/credentials-accessor.d.ts +102 -0
  37. package/session/credentials-accessor.d.ts.map +1 -0
  38. package/session/credentials-accessor.impl.d.ts +46 -0
  39. package/session/credentials-accessor.impl.d.ts.map +1 -0
  40. package/session/index.d.ts +32 -2
  41. package/session/index.d.ts.map +1 -1
  42. package/session/orchestrated-token.crypto.d.ts +33 -0
  43. package/session/orchestrated-token.crypto.d.ts.map +1 -0
  44. package/session/secure-store-accessor.d.ts +77 -0
  45. package/session/secure-store-accessor.d.ts.map +1 -0
  46. package/session/secure-store-accessor.impl.d.ts +61 -0
  47. package/session/secure-store-accessor.impl.d.ts.map +1 -0
  48. package/session/secure-store-backends.d.ts +75 -0
  49. package/session/secure-store-backends.d.ts.map +1 -0
  50. package/session/secure-store.d.ts +89 -0
  51. package/session/secure-store.d.ts.map +1 -0
  52. package/session/secure-store.factory.d.ts +62 -0
  53. package/session/secure-store.factory.d.ts.map +1 -0
  54. package/session/session-credential-vault.d.ts +153 -0
  55. package/session/session-credential-vault.d.ts.map +1 -0
  56. package/session/session-credential-vault.factory.d.ts +50 -0
  57. package/session/session-credential-vault.factory.d.ts.map +1 -0
  58. package/session/storage-authorization.store.d.ts +51 -0
  59. package/session/storage-authorization.store.d.ts.map +1 -0
  60. package/session/storage-consent.store.d.ts +33 -0
  61. package/session/storage-consent.store.d.ts.map +1 -0
  62. package/session/storage-federated-auth.session.d.ts +36 -0
  63. package/session/storage-federated-auth.session.d.ts.map +1 -0
  64. package/session/storage-orchestrated-token.store.d.ts +72 -0
  65. package/session/storage-orchestrated-token.store.d.ts.map +1 -0
  66. package/session/token-storage.factory.d.ts +46 -0
  67. package/session/token-storage.factory.d.ts.map +1 -0
  68. package/ui/index.d.ts +3 -2
  69. package/ui/index.d.ts.map +1 -1
  70. package/ui/local-login.helper.d.ts +31 -0
  71. package/ui/local-login.helper.d.ts.map +1 -0
  72. package/ui/templates.d.ts +118 -2
  73. package/ui/templates.d.ts.map +1 -1
  74. package/vault/auth-providers.types.d.ts +3 -3
@@ -1,6 +1,7 @@
1
- import { JSONWebKeySet, JWK } from '../common/jwt.types';
2
- import type { RedisConfig } from '../session/transport-session.types';
3
1
  import type { CimdConfigInput } from '../cimd';
2
+ import type { AuthLogger } from '../common';
3
+ import { type JSONWebKeySet, type JWK } from '../common/jwt.types';
4
+ import type { RedisConfig } from '../session/transport-session.types';
4
5
  /**
5
6
  * Public access configuration for tools/prompts
6
7
  */
@@ -116,15 +117,96 @@ export interface RemoteProviderConfig {
116
117
  /** User info endpoint override */
117
118
  userInfoEndpoint?: string;
118
119
  }
120
+ /**
121
+ * SQLite configuration for token storage.
122
+ *
123
+ * `path` is required: the auth layer has no default-path resolver, so SQLite
124
+ * persistence is opt-in and explicit.
125
+ */
126
+ export interface TokenStorageSqliteConfig {
127
+ /** Path to the `.sqlite` database file used for auth persistence. */
128
+ path: string;
129
+ /** Optional at-rest value encryption (AES-256-GCM via HKDF-SHA256). */
130
+ encryption?: {
131
+ secret: string;
132
+ };
133
+ /** Interval in ms for purging expired keys (default 60000). */
134
+ ttlCleanupIntervalMs?: number;
135
+ /** Enable WAL mode for better read concurrency (default true). */
136
+ walMode?: boolean;
137
+ }
119
138
  /**
120
139
  * Token storage configuration (simplified, BC-030)
121
140
  *
122
- * Either the string 'memory' for in-memory storage,
123
- * or an object { redis: RedisConfig } for Redis storage.
141
+ * - `'memory'` — in-memory storage (default; lost on restart).
142
+ * - `{ redis: RedisConfig }` — Redis-backed persistence.
143
+ * - `{ sqlite: TokenStorageSqliteConfig }` — local SQLite-file persistence.
124
144
  */
125
145
  export type TokenStorageConfig = 'memory' | {
126
146
  redis: RedisConfig;
147
+ } | {
148
+ sqlite: TokenStorageSqliteConfig;
127
149
  };
150
+ /**
151
+ * How a secure-store namespace is derived from the request:
152
+ * - `user` (default): keyed by the authenticated subject (`sub`).
153
+ * - `session`: keyed by the transport `sessionId`.
154
+ * - `global`: a single server-wide namespace.
155
+ */
156
+ export type SecureStoreScope = 'user' | 'session' | 'global';
157
+ /**
158
+ * At-rest encryption settings for the built-in secure-store backings. Ignored
159
+ * for a custom `{ backend }` backing.
160
+ */
161
+ export interface SecureStoreEncryptionConfig {
162
+ /** Server pepper mixed into HKDF key derivation. Defaults to `VAULT_SECRET ?? JWT_SECRET`. */
163
+ pepper?: string;
164
+ }
165
+ /**
166
+ * A custom secure-store backing — an object implementing the four-method
167
+ * `SecureStoreBackend` contract (e.g. an OS-keychain backend). Typed loosely
168
+ * here (the strict `SecureStoreBackend` interface lives in `session/`) so the
169
+ * options module stays free of session imports.
170
+ */
171
+ export interface SecureStoreCustomBackend {
172
+ get(namespace: string, key: string): Promise<string | null>;
173
+ set(namespace: string, key: string, value: string, ttlMs?: number): Promise<void>;
174
+ delete(namespace: string, key: string): Promise<boolean>;
175
+ list(namespace: string): Promise<string[]>;
176
+ dispose?(): Promise<void>;
177
+ }
178
+ /** Fields shared by the object-form secure-store configs. */
179
+ interface SecureStoreCommonConfig {
180
+ /** Namespace scope. @default 'user' */
181
+ scope?: SecureStoreScope;
182
+ /** Default TTL (ms) for stored secrets. @default undefined (no expiry) */
183
+ ttlMs?: number;
184
+ /** At-rest encryption settings (built-in backings only). */
185
+ encryption?: SecureStoreEncryptionConfig;
186
+ }
187
+ /**
188
+ * Secure-store configuration (#470) — the general session-scoped secure-secret
189
+ * store backing for `this.secureStore`.
190
+ *
191
+ * - `'memory'` — in-memory, AES-256-GCM-encrypted (default; lost on restart).
192
+ * - `{ sqlite }` — local SQLite-file persistence (survives restart).
193
+ * - `{ redis }` — Redis-backed persistence.
194
+ * - `{ backend }` — a custom backing (e.g. an OS keychain). No native dependency
195
+ * is bundled by the framework.
196
+ *
197
+ * The object forms also accept `scope`, `ttlMs`, and (for built-ins) `encryption`.
198
+ */
199
+ export type SecureStoreConfig = 'memory' | (SecureStoreCommonConfig & {
200
+ sqlite?: never;
201
+ redis?: never;
202
+ backend?: never;
203
+ }) | (SecureStoreCommonConfig & {
204
+ sqlite: TokenStorageSqliteConfig;
205
+ }) | (SecureStoreCommonConfig & {
206
+ redis: RedisConfig;
207
+ }) | (SecureStoreCommonConfig & {
208
+ backend: SecureStoreCustomBackend;
209
+ });
128
210
  /**
129
211
  * Token refresh configuration
130
212
  */
@@ -195,6 +277,118 @@ export interface FederatedAuthConfig {
195
277
  * - 'format': Only validates the state format is correct
196
278
  */
197
279
  stateValidation: 'strict' | 'format';
280
+ /**
281
+ * Minimum number of upstream providers a user must link before a FrontMCP JWT
282
+ * is minted (defaults to 1 at runtime when `providers` are configured).
283
+ */
284
+ minProviders?: number;
285
+ /**
286
+ * Provider ids that MUST be linked before a JWT is minted.
287
+ */
288
+ requiredProviders?: string[];
289
+ }
290
+ /**
291
+ * Declarative upstream OAuth provider for local-mode multi-provider
292
+ * orchestration. See {@link LocalAuthOptionsInterface.providers}.
293
+ */
294
+ export interface UpstreamProviderOptions {
295
+ /** Stable provider id (e.g. `'github'`). */
296
+ id: string;
297
+ /** Human-readable display name. Defaults to `id`. */
298
+ name?: string;
299
+ /** Authorization endpoint (canonical name). */
300
+ authorizationEndpoint?: string;
301
+ /** Authorization endpoint (alias for {@link authorizationEndpoint}). */
302
+ authorizeUrl?: string;
303
+ /** Token endpoint (canonical name). */
304
+ tokenEndpoint?: string;
305
+ /** Token endpoint (alias for {@link tokenEndpoint}). */
306
+ tokenUrl?: string;
307
+ /** OAuth client id issued by the upstream provider. */
308
+ clientId: string;
309
+ /** OAuth client secret (confidential clients). */
310
+ clientSecret?: string;
311
+ /** Scopes to request from the upstream provider. */
312
+ scopes?: string[];
313
+ /** User info endpoint (optional). */
314
+ userInfoEndpoint?: string;
315
+ /** JWKS URI for upstream id_token validation (optional). */
316
+ jwksUri?: string;
317
+ }
318
+ /**
319
+ * A pre-registered (trusted) OAuth client for the LOCAL Authorization Server.
320
+ * Seeded into the client registry at startup so the authorize/token flows
321
+ * accept it without a Dynamic Client Registration round-trip. See
322
+ * {@link LocalDcrConfig.clients}. No PII is stored — only OAuth client metadata.
323
+ */
324
+ export interface LocalDcrClient {
325
+ /** Stable, pre-assigned client identifier. */
326
+ clientId: string;
327
+ /** Confidential-client secret. Omit for public (PKCE) clients. */
328
+ clientSecret?: string;
329
+ /** Exact redirect URIs this client may use (at least one). */
330
+ redirectUris: string[];
331
+ /** Human-readable client name for consent/login screens. */
332
+ clientName?: string;
333
+ /**
334
+ * Token-endpoint auth method.
335
+ * @default 'none'
336
+ */
337
+ tokenEndpointAuthMethod?: 'none' | 'client_secret_basic' | 'client_secret_post';
338
+ /**
339
+ * Allowed grant types.
340
+ * @default ['authorization_code']
341
+ */
342
+ grantTypes?: Array<'authorization_code' | 'refresh_token'>;
343
+ /**
344
+ * Allowed response types.
345
+ * @default ['code']
346
+ */
347
+ responseTypes?: Array<'code'>;
348
+ /** Optional space-delimited default scope string. */
349
+ scope?: string;
350
+ }
351
+ /**
352
+ * Declarative control surface for the LOCAL Authorization Server's Dynamic
353
+ * Client Registration endpoint (`POST /oauth/register`) and client allowlist.
354
+ *
355
+ * IMPORTANT: distinct from the upstream-provider `dcrEnabled`/
356
+ * `registrationEndpoint` fields on {@link ProviderConfig}/
357
+ * {@link RemoteProviderConfig} (those register THIS server against an upstream
358
+ * IdP and are not read by the local AS). Every field is optional; omitting the
359
+ * whole `dcr` block preserves the historical behavior exactly (DCR enabled in
360
+ * dev, disabled in production; no allowlist; no initial access token).
361
+ */
362
+ export interface LocalDcrConfig {
363
+ /**
364
+ * Whether `POST /oauth/register` is active and `registration_endpoint` is
365
+ * advertised. When unset, the historical guard applies (on in dev, off in
366
+ * production).
367
+ */
368
+ enabled?: boolean;
369
+ /**
370
+ * Redirect-URI allowlist (exact match or simple `*` glob). When set, both DCR
371
+ * registrations and `/oauth/authorize` reject a `redirect_uri` not on the
372
+ * list. When unset, no redirect_uri allowlist is enforced.
373
+ */
374
+ allowedRedirectUris?: string[];
375
+ /**
376
+ * Client-id allowlist. When set, only these ids may register or be used at
377
+ * `/oauth/authorize` (CIMD URL client ids are exempt). When unset, any id is
378
+ * accepted subject to the other checks.
379
+ */
380
+ allowedClientIds?: string[];
381
+ /**
382
+ * Initial Access Token (RFC 7591 §3). When set, `POST /oauth/register`
383
+ * requires a matching `Authorization: Bearer <token>` header. When unset,
384
+ * registration is unauthenticated (historical behavior).
385
+ */
386
+ initialAccessToken?: string;
387
+ /**
388
+ * Pre-registered trusted clients seeded at startup. Accepted by the
389
+ * authorize/token flows without a DCR round-trip.
390
+ */
391
+ clients?: LocalDcrClient[];
198
392
  }
199
393
  /**
200
394
  * Progressive/Incremental authorization configuration
@@ -221,6 +415,269 @@ export interface IncrementalAuthConfig {
221
415
  */
222
416
  showAllAppsAtOnce?: boolean;
223
417
  }
418
+ /**
419
+ * A single custom field rendered on the local-mode login page.
420
+ *
421
+ * Fields are declarative: FrontMCP renders them on the default login page and
422
+ * forwards their submitted values to {@link LocalAuthOptionsInterface.authenticate}
423
+ * as `input.fields`. No PII is persisted by FrontMCP — fields are passed
424
+ * through to your verifier and never stored.
425
+ */
426
+ export interface LoginFieldConfig {
427
+ /** HTML input type. `hidden` fields are submitted but not shown. */
428
+ type: 'text' | 'password' | 'email' | 'select' | 'hidden';
429
+ /** Field label shown above the input. Defaults to the field key. */
430
+ label?: string;
431
+ /** Whether the browser should require a value before submit. */
432
+ required?: boolean;
433
+ /** Placeholder text for text/email/password inputs. */
434
+ placeholder?: string;
435
+ /** Options for a `select` field. Ignored for other types. */
436
+ options?: Array<{
437
+ value: string;
438
+ label: string;
439
+ }>;
440
+ }
441
+ /**
442
+ * Subject derivation strategy for local logins.
443
+ *
444
+ * - `per-session` (default): every login yields a fresh subject (stateless).
445
+ * - `per-account`: the value of {@link LoginSubjectConfig.fromField} is hashed
446
+ * into a stable subject so the same account maps to the same `sub`.
447
+ */
448
+ export interface LoginSubjectConfig {
449
+ /** Login field whose submitted value seeds a stable subject. */
450
+ fromField?: string;
451
+ /** How the subject is derived. @default 'per-session' */
452
+ strategy?: 'per-session' | 'per-account';
453
+ }
454
+ /**
455
+ * Declarative customization of the built-in local-mode login page.
456
+ *
457
+ * Set any of these to tailor the default `/oauth/authorize` login page without
458
+ * replacing the OAuth flow. When `render` is provided it fully overrides the
459
+ * built-in page; otherwise `fields` extend the default email/name form.
460
+ */
461
+ export interface LoginConfig {
462
+ /** Page heading. Defaults to "Sign In". */
463
+ title?: string;
464
+ /** Sub-heading shown under the title. */
465
+ subtitle?: string;
466
+ /** Logo image URL shown above the form. */
467
+ logoUri?: string;
468
+ /**
469
+ * Extra fields appended to the login form, keyed by field name. The
470
+ * submitted values are forwarded to {@link LocalAuthOptionsInterface.authenticate}
471
+ * as `input.fields[name]`.
472
+ */
473
+ fields?: Record<string, LoginFieldConfig>;
474
+ /**
475
+ * Full HTML override for the login page. Receives a {@link LoginRenderContext}
476
+ * and must return a complete HTML document string. When set, `title`,
477
+ * `subtitle`, `logoUri`, and `fields` are NOT auto-rendered — you own the markup.
478
+ */
479
+ render?: (ctx: LoginRenderContext) => string;
480
+ /** Controls how the authenticated subject (`sub`) is derived. */
481
+ subject?: LoginSubjectConfig;
482
+ }
483
+ /**
484
+ * Context passed to a custom {@link LoginConfig.render} function. Carries the
485
+ * client identity (CIMD `client_name`/`logo_uri` when available), requested
486
+ * scopes, the pending-authorization id (must be submitted back), the callback
487
+ * path to POST/GET to, the declared {@link LoginConfig.fields}, and a previous
488
+ * error message (set when {@link AuthenticateResult} failed and the page is
489
+ * being re-rendered).
490
+ */
491
+ export interface LoginRenderContext {
492
+ /** OAuth client_id (or CIMD URL) of the requesting client. */
493
+ clientId: string;
494
+ /** Human-readable client name (CIMD `client_name` when available, else clientId). */
495
+ clientName: string;
496
+ /** CIMD `logo_uri` when available. */
497
+ logoUri?: string;
498
+ /** Requested OAuth scopes. */
499
+ scopes: string[];
500
+ /** Pending-authorization id; MUST be submitted back as `pending_auth_id`. */
501
+ pendingAuthId: string;
502
+ /** Path the login form should submit to (the `/oauth/callback` endpoint). */
503
+ callbackPath: string;
504
+ /** The declared custom login fields (may be empty). */
505
+ fields: Record<string, LoginFieldConfig>;
506
+ /** Error message to display when re-rendering after a failed authenticate(). */
507
+ error?: string;
508
+ /**
509
+ * Submitted field values to pre-fill on re-render (set when the page is
510
+ * re-rendered after a failed authenticate()). Keyed by field name.
511
+ */
512
+ values?: Record<string, string>;
513
+ }
514
+ /**
515
+ * Input handed to {@link LocalAuthOptionsInterface.authenticate}: the submitted
516
+ * login-field values keyed by field name. Built-in `email`/`name` fields are
517
+ * included alongside any declared custom {@link LoginConfig.fields}.
518
+ */
519
+ export interface AuthenticateInput {
520
+ /** Submitted login-field values keyed by field name. */
521
+ fields: Record<string, string>;
522
+ /**
523
+ * Present only when `authenticate()` is re-invoked from a mid-session
524
+ * add-credential flow (Checkpoint 3b). Carries the framework-verified subject,
525
+ * the credential key being connected, and the optional opaque context from the
526
+ * original `requireConnect({ key, context })` call. When set, the verifier
527
+ * should return `{ ok: true, credentials: [{ key, secret, … }] }` to ADD the
528
+ * credential to the existing session vault (a new token is NOT minted).
529
+ */
530
+ resume?: {
531
+ /** Framework-verified subject the credential is being connected for. */
532
+ sub: string;
533
+ /** Credential key being connected. */
534
+ key: string;
535
+ /** Optional opaque context forwarded from `requireConnect`. */
536
+ context?: string;
537
+ };
538
+ }
539
+ /**
540
+ * Context handed to {@link LocalAuthOptionsInterface.authenticate}. Provides DI
541
+ * access (`get`), a `fetch` for outbound calls, a scoped `logger`, and the
542
+ * requesting client's identity.
543
+ */
544
+ export interface AuthenticateContext {
545
+ /** Resolve a provider/service from the DI container. */
546
+ get<T>(token: unknown): T;
547
+ /** Outbound fetch (use for verifying credentials against an upstream API). */
548
+ fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
549
+ /** Scoped logger for diagnostics. */
550
+ logger: AuthLogger;
551
+ /** OAuth client_id (or CIMD URL) of the requesting client, when known. */
552
+ clientId?: string;
553
+ /** Human-readable client name (CIMD `client_name`), when known. */
554
+ clientName?: string;
555
+ }
556
+ /**
557
+ * A credential the verifier wants FrontMCP to persist for the session.
558
+ *
559
+ * Persisted (Checkpoint 3b) into the built-in, AES-256-GCM-encrypted, per-session
560
+ * credential vault keyed by the authenticated `sub`, and exposed to tools via
561
+ * `this.credentials.get(key)` / `list()` / `requireConnect({ key })`. The vault
562
+ * is enabled automatically in `local` (and `remote`) modes; a fresh authorize
563
+ * rotates the vault so a reconnect starts empty.
564
+ */
565
+ export interface AuthenticateCredential {
566
+ /** Stable key the credential is stored under (e.g. provider id). */
567
+ key: string;
568
+ /** The secret value (token, api key, …). */
569
+ secret: string;
570
+ /** Optional non-secret metadata stored alongside the credential. */
571
+ metadata?: Record<string, unknown>;
572
+ }
573
+ /**
574
+ * Result of a successful local {@link LocalAuthOptionsInterface.authenticate}.
575
+ */
576
+ export interface AuthenticateSuccess {
577
+ ok: true;
578
+ /** Explicit subject. When omitted, the subject is derived from the login subject strategy / anonymousSubject. */
579
+ sub?: string;
580
+ /** Custom claims to embed in the minted access token (namespaced to avoid clobbering reserved claims). */
581
+ claims?: Record<string, unknown>;
582
+ /** Per-session credentials to persist into the encrypted vault (`this.credentials`) — see {@link AuthenticateCredential}. */
583
+ credentials?: AuthenticateCredential[];
584
+ /** Optional informational message. */
585
+ message?: string;
586
+ }
587
+ /**
588
+ * Result of a failed local {@link LocalAuthOptionsInterface.authenticate}. The
589
+ * login page is re-rendered with `message` shown to the user.
590
+ */
591
+ export interface AuthenticateFailure {
592
+ ok: false;
593
+ /** Error message shown on the re-rendered login page. */
594
+ message: string;
595
+ /** Optional field name to focus/highlight on the re-rendered page. */
596
+ retryField?: string;
597
+ }
598
+ /**
599
+ * Discriminated union returned by {@link LocalAuthOptionsInterface.authenticate}.
600
+ */
601
+ export type AuthenticateResult = AuthenticateSuccess | AuthenticateFailure;
602
+ /**
603
+ * Custom verification step for local-mode logins.
604
+ *
605
+ * Receives the submitted login fields and a {@link AuthenticateContext}; returns
606
+ * `{ ok: true, sub?, claims?, credentials? }` to mint a token, or
607
+ * `{ ok: false, message, retryField? }` to reject the login and re-render the
608
+ * page. When `authenticate` is configured, the built-in email requirement no
609
+ * longer applies (the verifier decides what is required via its `fields`).
610
+ */
611
+ export type AuthenticateFn = (input: AuthenticateInput, ctx: AuthenticateContext) => Promise<AuthenticateResult>;
612
+ /**
613
+ * Which built-in authorization page a custom React component replaces. Mirrors
614
+ * the SDK-side `AuthSlot` and the `@frontmcp/ui/auth` client contract. A slot is
615
+ * a KEY in {@link AuthUiMap}; its value is the relative `.tsx`/`.jsx` path.
616
+ */
617
+ export type AuthSlot = 'login' | 'consent' | 'incremental' | 'federated' | 'error';
618
+ /**
619
+ * Custom authorization-UI map: a slot → relative component file path. Each path
620
+ * is a `.tsx`/`.jsx` source resolved RELATIVE TO THE CONFIG FILE that declared
621
+ * it (the `@FrontMcp` / `@App` source directory, captured automatically — no
622
+ * `fileURLToPath` needed); absolute paths pass through unchanged. The component
623
+ * is transpiled server-side and client-rendered (esm.sh import-map). When a slot
624
+ * is absent the built-in HTML page is served unchanged.
625
+ *
626
+ * @example
627
+ * ```ts
628
+ * ui: { login: './auth/login.tsx', consent: './auth/consent.tsx' }
629
+ * ```
630
+ */
631
+ export type AuthUiMap = Partial<Record<AuthSlot, string>>;
632
+ /**
633
+ * Server-side accumulator-aware context handed to an {@link AuthExtraHandler}.
634
+ * Intentionally minimal and PII-free: the extra name, the pending-auth id (for
635
+ * correlation), and the items already accepted for this extra.
636
+ */
637
+ export interface AuthExtraContext {
638
+ /** The extra name being handled (the `action` posted by the page). */
639
+ name: string;
640
+ /** The pending authorization id this submission belongs to (when known). */
641
+ pendingAuthId?: string;
642
+ /** Items already accepted for this extra (the current accumulator). */
643
+ current: unknown[];
644
+ }
645
+ /**
646
+ * Result an {@link AuthExtraHandler} returns. The handler only hands back the
647
+ * NEW items it accepted; the framework merges them into the per-pending-auth
648
+ * accumulator and echoes the full map back to the page (so `useAddedItems(name)`
649
+ * reflects them on re-render).
650
+ */
651
+ export interface AuthExtraResult {
652
+ /** Whether the field was accepted. */
653
+ ok: boolean;
654
+ /** Human-readable validation error when `ok` is false. */
655
+ error?: string;
656
+ /** Items to APPEND to this extra's accumulator on success. */
657
+ addedItems?: unknown[];
658
+ /** Free-form side-effect data echoed back to the client. */
659
+ sideEffects?: Record<string, unknown>;
660
+ }
661
+ /**
662
+ * A server handler for a custom auth-UI extra (`auth.extras[name]`). Receives the
663
+ * page's validated field submission and the {@link AuthExtraContext}; returns
664
+ * (or resolves to) an {@link AuthExtraResult}. Replaces the old `@AuthExtra`
665
+ * class — a plain function keyed by the extra name.
666
+ *
667
+ * @example
668
+ * ```ts
669
+ * extras: {
670
+ * 'envs:add': async (input, ctx) => {
671
+ * const key = String(input.key ?? '').trim();
672
+ * if (!key) return { ok: false, error: 'key required' };
673
+ * return { ok: true, addedItems: [{ key, value: input.value }] };
674
+ * },
675
+ * }
676
+ * ```
677
+ */
678
+ export type AuthExtraHandler = (input: Record<string, unknown>, ctx: AuthExtraContext) => Promise<AuthExtraResult> | AuthExtraResult;
679
+ /** Custom auth-UI extras map: extra name → server handler function. */
680
+ export type AuthExtrasMap = Record<string, AuthExtraHandler>;
224
681
  export interface PublicAuthOptionsInterface {
225
682
  mode: 'public';
226
683
  issuer?: string;
@@ -247,6 +704,15 @@ export interface LocalAuthOptionsInterface {
247
704
  mode: 'local';
248
705
  local?: LocalSigningConfig;
249
706
  tokenStorage?: TokenStorageConfig;
707
+ /**
708
+ * Backing for the general session-scoped secure-secret store (`this.secureStore`,
709
+ * #470). Selects memory / sqlite / redis / a custom (e.g. OS-keychain) backend,
710
+ * plus the namespace `scope`. Optional — omitting it defaults to an in-memory,
711
+ * AES-256-GCM-encrypted, `user`-scoped store.
712
+ *
713
+ * @see SecureStoreConfig
714
+ */
715
+ secureStore?: SecureStoreConfig;
250
716
  allowDefaultPublic?: boolean;
251
717
  anonymousScopes?: string[];
252
718
  publicAccess?: PublicAccessConfig;
@@ -256,6 +722,99 @@ export interface LocalAuthOptionsInterface {
256
722
  expectedAudience?: string | string[];
257
723
  incrementalAuth?: IncrementalAuthConfig;
258
724
  cimd?: CimdConfigInput;
725
+ /**
726
+ * Require an email at the `/oauth/callback` login step.
727
+ *
728
+ * When `true` (default) the callback rejects a non-incremental login that
729
+ * carries no email — the historical behavior. Set to `false` for
730
+ * single-operator local setups (e.g. Claude Code against `mode: 'local'`)
731
+ * where a login should mint a code without prompting for an email; the
732
+ * callback then derives a stable anonymous `sub` from
733
+ * {@link LocalAuthOptionsInterface.anonymousSubject}.
734
+ *
735
+ * @default true
736
+ */
737
+ requireEmail?: boolean;
738
+ /**
739
+ * Stable subject identifier used to mint the authorization code when
740
+ * {@link LocalAuthOptionsInterface.requireEmail} is `false` and no email is
741
+ * provided. Defaults to `'local-operator'`. The same value always maps to
742
+ * the same `sub`, so the single operator keeps a stable identity.
743
+ *
744
+ * @default 'local-operator'
745
+ */
746
+ anonymousSubject?: string;
747
+ /**
748
+ * Declarative customization of the built-in local login page (title,
749
+ * subtitle, logo, extra fields, full HTML override, and subject strategy).
750
+ * Optional — omitting it preserves the default email/name login form exactly.
751
+ *
752
+ * @see LoginConfig
753
+ */
754
+ login?: LoginConfig;
755
+ /**
756
+ * Custom verification step run at `/oauth/callback` before a token is minted.
757
+ * Receives the submitted login fields and returns `{ ok: true, … }` to mint a
758
+ * token (optionally with an explicit `sub` and custom `claims`) or
759
+ * `{ ok: false, message }` to reject and re-render the login page.
760
+ *
761
+ * When set, the built-in email requirement (`requireEmail`) no longer applies.
762
+ * Omitting it preserves the default email/anonymous login path exactly.
763
+ *
764
+ * @see AuthenticateFn
765
+ */
766
+ authenticate?: AuthenticateFn;
767
+ /**
768
+ * Upstream OAuth providers (GitHub, Slack, Jira, …) to orchestrate in local
769
+ * mode. When declared, FrontMCP federates them at `/oauth/authorize`, refuses
770
+ * to mint a JWT until the {@link FederatedAuthConfig.minProviders} threshold
771
+ * (default 1) is met, stores each provider's tokens encrypted, and exposes
772
+ * them to tools via `this.orchestration.getToken(id)`. Optional — omitting it
773
+ * preserves the default single-operator local login exactly.
774
+ *
775
+ * @see UpstreamProviderOptions
776
+ */
777
+ providers?: UpstreamProviderOptions[];
778
+ /**
779
+ * Local Authorization Server Dynamic Client Registration control surface
780
+ * (#462): gate `POST /oauth/register`, allowlist redirect URIs / client ids,
781
+ * require an initial access token, and seed pre-registered trusted clients.
782
+ * Optional — omitting it preserves today's behavior exactly (DCR on in dev,
783
+ * off in production; no allowlist; no initial access token).
784
+ *
785
+ * @see LocalDcrConfig
786
+ */
787
+ dcr?: LocalDcrConfig;
788
+ /**
789
+ * Custom authorization-UI slots (#469): a slot → relative `.tsx`/`.jsx` path
790
+ * map. Each component replaces the built-in login / consent / incremental /
791
+ * federated / error page. Relative paths resolve against THIS config file's
792
+ * directory (captured automatically — no `fileURLToPath`); absolute paths pass
793
+ * through. Scoped to THIS auth config, so each app under `splitByApp` gets its
794
+ * own custom UI. When a slot is absent, the built-in HTML page is served
795
+ * unchanged (the no-config default).
796
+ *
797
+ * @example
798
+ * ```ts
799
+ * auth: { mode: 'local', ui: { login: './auth/login.tsx' } }
800
+ * ```
801
+ * @see AuthUiMap
802
+ */
803
+ ui?: AuthUiMap;
804
+ /**
805
+ * Server handlers for custom auth-UI extras (#469): an extra name → handler
806
+ * function map. Each handler accepts a validated field submission and returns
807
+ * `{ ok, error?, addedItems?, sideEffects? }`; accepted items accumulate
808
+ * server-side so `useAddedItems(name)` reflects them on re-render. Scoped to
809
+ * THIS auth config (per-app under `splitByApp`).
810
+ *
811
+ * @example
812
+ * ```ts
813
+ * extras: { 'envs:add': async (input, ctx) => ({ ok: true, addedItems: [...] }) }
814
+ * ```
815
+ * @see AuthExtraHandler
816
+ */
817
+ extras?: AuthExtrasMap;
259
818
  }
260
819
  export interface RemoteAuthOptionsInterface {
261
820
  mode: 'remote';
@@ -266,6 +825,12 @@ export interface RemoteAuthOptionsInterface {
266
825
  providerConfig?: ProviderConfig;
267
826
  local?: LocalSigningConfig;
268
827
  tokenStorage?: TokenStorageConfig;
828
+ /**
829
+ * Backing for the general session-scoped secure-secret store (`this.secureStore`,
830
+ * #470). See {@link SecureStoreConfig}. Optional — defaults to an in-memory,
831
+ * AES-256-GCM-encrypted, `user`-scoped store.
832
+ */
833
+ secureStore?: SecureStoreConfig;
269
834
  allowDefaultPublic?: boolean;
270
835
  anonymousScopes?: string[];
271
836
  publicAccess?: PublicAccessConfig;
@@ -275,6 +840,16 @@ export interface RemoteAuthOptionsInterface {
275
840
  expectedAudience?: string | string[];
276
841
  incrementalAuth?: IncrementalAuthConfig;
277
842
  cimd?: CimdConfigInput;
843
+ /**
844
+ * Custom authorization-UI slots (#469), scoped to this auth config.
845
+ * See {@link LocalAuthOptionsInterface.ui}.
846
+ */
847
+ ui?: AuthUiMap;
848
+ /**
849
+ * Server handlers for custom auth-UI extras (#469), scoped to this auth config.
850
+ * See {@link LocalAuthOptionsInterface.extras}.
851
+ */
852
+ extras?: AuthExtrasMap;
278
853
  }
279
854
  export type AuthOptionsInterface = PublicAuthOptionsInterface | TransparentAuthOptionsInterface | LocalAuthOptionsInterface | RemoteAuthOptionsInterface;
280
855
  export type LocalOrRemoteAuthOptionsInterface = LocalAuthOptionsInterface | RemoteAuthOptionsInterface;
@@ -287,4 +862,5 @@ export type OrchestratedRemoteOptionsInterface = RemoteAuthOptionsInterface;
287
862
  export type OrchestratedAuthOptionsInterface = LocalOrRemoteAuthOptionsInterface;
288
863
  /** @deprecated Removed - modes are now 'local' | 'remote' */
289
864
  export type OrchestratedType = 'local' | 'remote';
865
+ export {};
290
866
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/options/interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/options/interfaces.ts"],"names":[],"mappings":"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"}