@iqauth/sdk 2.6.4 → 2.8.1

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 (117) hide show
  1. package/README.md +173 -1
  2. package/dist/browser-session.d.mts +4 -4
  3. package/dist/browser-session.d.ts +4 -4
  4. package/dist/browser-session.js +212 -46
  5. package/dist/browser-session.mjs +3 -3
  6. package/dist/browser.d.mts +5 -5
  7. package/dist/browser.d.ts +5 -5
  8. package/dist/browser.js +293 -34
  9. package/dist/browser.mjs +5 -5
  10. package/dist/{chunk-BVV54LPI.mjs → chunk-25SSYDIP.mjs} +10 -4
  11. package/dist/{chunk-XAWYUPMO.mjs → chunk-4V7FKOTG.mjs} +242 -22
  12. package/dist/{chunk-6I6RM4MN.mjs → chunk-6PJRLRB4.mjs} +33 -3
  13. package/dist/{chunk-SL3KRS4W.mjs → chunk-CIJORODR.mjs} +23 -1
  14. package/dist/{chunk-LIZYFXH7.mjs → chunk-DFWHSDYQ.mjs} +1 -1
  15. package/dist/chunk-GLXSIGVS.mjs +66 -0
  16. package/dist/{chunk-DJIBN2N7.mjs → chunk-GN37E64I.mjs} +29 -7
  17. package/dist/{chunk-WQWBJSSS.mjs → chunk-HVHNYPDC.mjs} +6 -6
  18. package/dist/chunk-JRDVUWAL.mjs +46 -0
  19. package/dist/{chunk-UNYDG2L4.mjs → chunk-NUO2I65G.mjs} +56 -23
  20. package/dist/{chunk-5T7GHBX6.mjs → chunk-TLET552H.mjs} +36 -0
  21. package/dist/chunk-VYQ3ETCK.mjs +244 -0
  22. package/dist/{chunk-3JULWS6F.mjs → chunk-WCELYTJ3.mjs} +3 -3
  23. package/dist/chunk-WHT6WKTY.mjs +3180 -0
  24. package/dist/{chunk-MKKZULZR.mjs → chunk-WIFG74IK.mjs} +1 -1
  25. package/dist/chunk-WSH4SW7F.mjs +490 -0
  26. package/dist/{chunk-W3F4JYGP.mjs → chunk-ZLJPABB7.mjs} +139 -23
  27. package/dist/cli/index.js +2 -2
  28. package/dist/cli/index.mjs +2 -2
  29. package/dist/{client-BNQe3AgF.d.ts → client-D8L-PaWr.d.mts} +59 -6
  30. package/dist/{client-kYlJFgPv.d.mts → client-DkPL0EPZ.d.ts} +59 -6
  31. package/dist/{doctor-YYNHNMLD.mjs → doctor-JAFXWU3X.mjs} +2 -2
  32. package/dist/errors-Jl1Jtm-6.d.mts +107 -0
  33. package/dist/errors-Jl1Jtm-6.d.ts +107 -0
  34. package/dist/{express-CHpfa7D_.d.ts → express-Budysq4h.d.ts} +2 -2
  35. package/dist/{express-B6_1vBYZ.d.mts → express-DDTA3qV1.d.mts} +2 -2
  36. package/dist/express.d.mts +7 -6
  37. package/dist/express.d.ts +7 -6
  38. package/dist/express.js +563 -85
  39. package/dist/express.mjs +73 -34
  40. package/dist/fastify.d.mts +10 -0
  41. package/dist/fastify.d.ts +10 -0
  42. package/dist/fastify.js +589 -65
  43. package/dist/fastify.mjs +101 -11
  44. package/dist/hono.d.mts +10 -0
  45. package/dist/hono.d.ts +10 -0
  46. package/dist/hono.js +566 -65
  47. package/dist/hono.mjs +78 -11
  48. package/dist/index-Cko-d5po.d.mts +1848 -0
  49. package/dist/index-RNqwEcmY.d.ts +1848 -0
  50. package/dist/index.d.mts +56 -8
  51. package/dist/index.d.ts +56 -8
  52. package/dist/index.js +694 -75
  53. package/dist/index.mjs +30 -10
  54. package/dist/{keys-NLWFAOEM.mjs → keys-6Y776TG2.mjs} +2 -2
  55. package/dist/locales.d.mts +1 -1
  56. package/dist/locales.d.ts +1 -1
  57. package/dist/locales.js +36 -0
  58. package/dist/locales.mjs +1 -1
  59. package/dist/mobile.d.mts +77 -7
  60. package/dist/mobile.d.ts +77 -7
  61. package/dist/mobile.js +307 -46
  62. package/dist/mobile.mjs +98 -3
  63. package/dist/next.d.mts +10 -1
  64. package/dist/next.d.ts +10 -1
  65. package/dist/next.js +596 -205
  66. package/dist/next.mjs +83 -10
  67. package/dist/{provisioningBridge-88xjOS2n.d.mts → provisioningBridge-BXPMZCLe.d.ts} +30 -2
  68. package/dist/{provisioningBridge-DnTfzdZK.d.ts → provisioningBridge-IEycmsgb.d.mts} +30 -2
  69. package/dist/{publishableKey-BaR0HoAH.d.ts → publishableKey-f2kq-rKw.d.mts} +1 -1
  70. package/dist/{publishableKey-BaR0HoAH.d.mts → publishableKey-f2kq-rKw.d.ts} +1 -1
  71. package/dist/react-permissions.d.mts +52 -0
  72. package/dist/react-permissions.d.ts +52 -0
  73. package/dist/react-permissions.js +239 -0
  74. package/dist/react-permissions.mjs +98 -0
  75. package/dist/react.d.mts +9 -1624
  76. package/dist/react.d.ts +9 -1624
  77. package/dist/react.js +882 -73
  78. package/dist/react.mjs +71 -2631
  79. package/dist/{reverify-4UEJXUS6.mjs → reverify-C64QXKJO.mjs} +2 -2
  80. package/dist/server/handlers.d.mts +200 -4
  81. package/dist/server/handlers.d.ts +200 -4
  82. package/dist/server/handlers.js +530 -16
  83. package/dist/server/handlers.mjs +14 -3
  84. package/dist/server.d.mts +171 -8
  85. package/dist/server.d.ts +171 -8
  86. package/dist/server.js +579 -61
  87. package/dist/server.mjs +99 -12
  88. package/dist/service.d.mts +4 -4
  89. package/dist/service.d.ts +4 -4
  90. package/dist/service.js +212 -46
  91. package/dist/service.mjs +3 -3
  92. package/dist/{signIn-CiIBTJIh.d.mts → signIn-CReqfXsh.d.mts} +95 -3
  93. package/dist/{signIn-OCr88Zf8.d.ts → signIn-Cfa1GTpO.d.ts} +95 -3
  94. package/dist/{signIn-4OKLDEIH.mjs → signIn-SHBW6Z4T.mjs} +1 -1
  95. package/dist/test.mjs +3 -3
  96. package/dist/{tokens-DCyzzn8L.d.mts → tokens-9F6ETrzk.d.ts} +9 -2
  97. package/dist/{tokens-aHiGFr_E.d.ts → tokens-B06VtvUi.d.mts} +9 -2
  98. package/dist/{types-DZAflmmq.d.mts → types-Bn8O-OEd.d.mts} +164 -11
  99. package/dist/{types-DZAflmmq.d.ts → types-Bn8O-OEd.d.ts} +164 -11
  100. package/dist/{types-6bNdxesb.d.ts → types-DnU2LhXR.d.mts} +7 -1
  101. package/dist/{types-6bNdxesb.d.mts → types-DnU2LhXR.d.ts} +7 -1
  102. package/dist/webhooks.d.mts +113 -17
  103. package/dist/webhooks.d.ts +113 -17
  104. package/dist/webhooks.js +179 -15
  105. package/dist/webhooks.mjs +7 -1
  106. package/dist/ws.d.mts +2 -2
  107. package/dist/ws.d.ts +2 -2
  108. package/dist/ws.js +80 -30
  109. package/dist/ws.mjs +4 -4
  110. package/docs/error-handling.md +101 -0
  111. package/docs/guides/effective-permissions.md +171 -0
  112. package/docs/guides/invitations.md +65 -0
  113. package/package.json +19 -4
  114. package/dist/chunk-6TDJJER7.mjs +0 -217
  115. package/dist/chunk-UKZLOHZG.mjs +0 -83
  116. package/dist/errors-CDdl24MP.d.mts +0 -52
  117. package/dist/errors-CDdl24MP.d.ts +0 -52
@@ -1,5 +1,5 @@
1
- import { c as ParsedPublishableKey } from './publishableKey-BaR0HoAH.mjs';
2
- import { J as JwtClaims, d as SessionUser } from './types-DZAflmmq.mjs';
1
+ import { c as ParsedPublishableKey } from './publishableKey-f2kq-rKw.mjs';
2
+ import { J as JwtClaims, S as SessionUser } from './types-Bn8O-OEd.mjs';
3
3
 
4
4
  /**
5
5
  * SessionManager — core browser-side session state.
@@ -120,11 +120,53 @@ interface SessionManagerOptions {
120
120
  refresh?: string;
121
121
  access?: string;
122
122
  };
123
+ /**
124
+ * Task #126: When `debug` is true, the SessionManager emits
125
+ * `console.debug("[iqauth_session]", evt)` for `bootstrap` and `refresh`
126
+ * phases. When `onTimingEvent` is set, the same event is also forwarded.
127
+ * Use to push browser timings into your APM. Events have shape
128
+ * `{ phase, durationMs, ok, code? }`.
129
+ */
130
+ debug?: boolean;
131
+ onTimingEvent?: (event: {
132
+ phase: "bootstrap" | "refresh" | "signIn";
133
+ durationMs: number;
134
+ ok: boolean;
135
+ code?: string;
136
+ }) => void;
123
137
  }
124
138
  declare class SessionManager {
125
139
  private snapshot;
126
140
  private listeners;
127
141
  private refreshPromise;
142
+ /**
143
+ * Cancellation handle for the in-flight refresh, if any. `signOut()` (or a
144
+ * `session:signout` broadcast from another tab) calls `abort()` so the
145
+ * refresh response is dropped before it can write a fresh access cookie
146
+ * on top of the just-cleared session — the second root cause of "ghost
147
+ * signed-in" sessions after Sign Out.
148
+ */
149
+ private refreshAbort;
150
+ /**
151
+ * Set to `true` by `signOut()` / `signOutLocal()` for the lifetime of the
152
+ * call. Used as a safety belt: even if a refresh response arrives while
153
+ * `refreshAbort` was unable to interrupt the network call (e.g. the body
154
+ * was already streaming back), `runRefresh` checks this flag before
155
+ * mutating session state and bails out.
156
+ */
157
+ private signoutInProgress;
158
+ /**
159
+ * Per-session opaque idempotency token. Sent as `X-IQAuth-Idempotency` on
160
+ * every /refresh and /signout request the SDK makes through a framework
161
+ * adapter (Express/Fastify/Hono/Next), so the adapter's `SignoutRegistry`
162
+ * can collapse a refresh that lands moments after a signout — even when
163
+ * the two requests are routed to different server instances (multi-replica
164
+ * deployments).
165
+ *
166
+ * Generated lazily on first use, rotated on signout so the next session
167
+ * starts with a fresh token. Opaque random — never the raw refresh token.
168
+ */
169
+ private idempotencyToken;
128
170
  private channel;
129
171
  private readonly tabId;
130
172
  private readonly fetchImpl;
@@ -138,26 +180,59 @@ declare class SessionManager {
138
180
  private readonly crossTabLockTimeoutMs;
139
181
  private readonly serverManagedSession;
140
182
  private readonly refreshCookieName;
183
+ private readonly debug;
184
+ private readonly onTimingEvent;
141
185
  private proactiveTimer;
142
186
  private bootstrapped;
143
187
  /** Pending refresh awaited by other tabs after a `refresh:claim` from us. */
144
188
  private remoteRefreshWaiters;
145
189
  /** Active claims by other tabs (keyed by source tabId). */
146
190
  private foreignClaim;
191
+ /** Resolver for an in-flight cross-tab `session:probe`, set during bootstrap. */
192
+ private probeResolver;
147
193
  constructor(options: SessionManagerOptions);
148
194
  get publishableKey(): ParsedPublishableKey;
149
195
  get appKey(): string;
150
196
  get tenantIdFromKey(): string;
151
197
  get issuerUrl(): string;
198
+ /**
199
+ * SDK 2.7.0 (Task #124) — The hosted IQAuth host derived from the
200
+ * publishable key's `iss` claim, normalized to URL form. This is what
201
+ * `<SignIn/>` and `buildSignInUrl` use to talk to the hosted UI; it
202
+ * deliberately ignores the `issuer` constructor override so a misrouted
203
+ * `issuer` (e.g. pointed at the consumer app's own domain) cannot break
204
+ * the hosted flow. Use {@link issuerUrl} for token / discovery endpoints.
205
+ */
206
+ get hostedIssuerUrl(): string;
152
207
  /** Cookie name the SDK uses for the refresh token (overridable via `cookieNames.refresh`). */
153
208
  get refreshCookie(): string;
209
+ /**
210
+ * Returns the current per-session idempotency token, generating one
211
+ * lazily on first use. Sent as the `X-IQAuth-Idempotency` header on
212
+ * /refresh and /signout requests so the framework adapter's
213
+ * `SignoutRegistry` can collapse a refresh-vs-signout race even across
214
+ * server instances.
215
+ */
216
+ getIdempotencyToken(): string;
154
217
  getSnapshot(): SessionSnapshot;
155
218
  subscribe(listener: (s: SessionSnapshot) => void): () => void;
156
219
  /**
157
220
  * One-time bootstrap: warm the session from the refresh cookie if present.
158
221
  * Safe to call multiple times.
159
222
  */
223
+ /**
224
+ * Task #126: Public timing-event emitter. Used by the browser sign-in
225
+ * helpers (redirectToSignIn / handleAuthCallback) to surface signIn-phase
226
+ * timings through the same `debug` + `onTimingEvent` channel as
227
+ * bootstrap/refresh. Safe to call from anywhere — internal callers
228
+ * pre-compute durationMs.
229
+ */
230
+ recordTiming(phase: "bootstrap" | "refresh" | "signIn", durationMs: number, ok: boolean, code?: string): void;
231
+ /** Task #126: emit a session timing event to debug log + onTimingEvent hook. */
232
+ private emitTiming;
160
233
  bootstrap(): Promise<void>;
234
+ private bootstrapInner;
235
+ private probePeers;
161
236
  /**
162
237
  * Single-flight token refresh, coordinated across tabs via BroadcastChannel.
163
238
  *
@@ -178,6 +253,23 @@ declare class SessionManager {
178
253
  * session and notify subscribers and other tabs.
179
254
  */
180
255
  applyAccessToken(accessToken: string, refreshToken?: string): void;
256
+ /**
257
+ * Task #197 — Adopt an access token that the server has already minted
258
+ * for us (e.g. from `POST /api/v1/auth/switch-scope`) without contacting
259
+ * the issuer. Swaps the in-memory token, re-decodes claims, bumps
260
+ * `version`, schedules proactive refresh, and broadcasts a
261
+ * `session:update` to peer tabs.
262
+ *
263
+ * This is the safe path for any server endpoint that returns a fresh
264
+ * access token in its JSON body: we want the new claims (scope, roles,
265
+ * etc.) to take effect immediately, even if the refresh-cookie round-trip
266
+ * would have failed (network blip, rate limit, signout race). When the
267
+ * server also rotated the refresh token, pass it via
268
+ * `opts.refreshToken` so the cookie stays aligned.
269
+ */
270
+ adoptAccessToken(accessToken: string, opts?: {
271
+ refreshToken?: string;
272
+ }): void;
181
273
  /**
182
274
  * Returns a valid access token, refreshing once if it is expired or about
183
275
  * to expire. Resolves to `null` if the session can no longer be revived.
@@ -485,4 +577,4 @@ declare function handleAuthCallback(manager: SessionManager, options?: {
485
577
  */
486
578
  declare function signOut(manager: SessionManager, opts?: SignOutOptions): Promise<void>;
487
579
 
488
- export { AccountRegistry as A, clearCookie as B, type CallbackResult as C, getCookie as D, setCookie as E, type LinkedIdentity as L, type MagicLinkRequestInput as M, type PasswordlessOptions as P, type RefreshTokenStore as R, SessionManager as S, type UnlinkProviderInput as U, type SessionManagerOptions as a, type SessionSnapshot as b, type SessionStatus as c, beginPasskeyAuthentication as d, beginPasskeyRegistration as e, finishPasskeyAuthentication as f, finishPasskeyRegistration as g, enrollPasskey as h, linkProvider as i, type PasskeyAuthInput as j, type LinkProviderInput as k, listLinkedIdentities as l, MultiAccountTokenStore as m, type AccountRecord as n, buildSignInUrl as o, handleAuthCallback as p, redirectToSignIn as q, requestMagicLink as r, signInWithPasskey as s, signIn as t, unlinkProvider as u, verifyMagicLink as v, signOut as w, type SignInOptions as x, type SignOutOptions as y, REFRESH_COOKIE as z };
580
+ export { AccountRegistry as A, clearCookie as B, type CallbackResult as C, getCookie as D, setCookie as E, type LinkedIdentity as L, type MagicLinkRequestInput as M, type PasswordlessOptions as P, type RefreshTokenStore as R, SessionManager as S, type UnlinkProviderInput as U, type SessionSnapshot as a, type SignInOptions as b, type SignOutOptions as c, type LinkProviderInput as d, type SessionManagerOptions as e, type SessionStatus as f, beginPasskeyAuthentication as g, finishPasskeyAuthentication as h, beginPasskeyRegistration as i, finishPasskeyRegistration as j, enrollPasskey as k, listLinkedIdentities as l, linkProvider as m, type PasskeyAuthInput as n, MultiAccountTokenStore as o, type AccountRecord as p, buildSignInUrl as q, requestMagicLink as r, signInWithPasskey as s, handleAuthCallback as t, unlinkProvider as u, verifyMagicLink as v, redirectToSignIn as w, signIn as x, signOut as y, REFRESH_COOKIE as z };
@@ -1,5 +1,5 @@
1
- import { c as ParsedPublishableKey } from './publishableKey-BaR0HoAH.js';
2
- import { J as JwtClaims, d as SessionUser } from './types-DZAflmmq.js';
1
+ import { c as ParsedPublishableKey } from './publishableKey-f2kq-rKw.js';
2
+ import { J as JwtClaims, S as SessionUser } from './types-Bn8O-OEd.js';
3
3
 
4
4
  /**
5
5
  * SessionManager — core browser-side session state.
@@ -120,11 +120,53 @@ interface SessionManagerOptions {
120
120
  refresh?: string;
121
121
  access?: string;
122
122
  };
123
+ /**
124
+ * Task #126: When `debug` is true, the SessionManager emits
125
+ * `console.debug("[iqauth_session]", evt)` for `bootstrap` and `refresh`
126
+ * phases. When `onTimingEvent` is set, the same event is also forwarded.
127
+ * Use to push browser timings into your APM. Events have shape
128
+ * `{ phase, durationMs, ok, code? }`.
129
+ */
130
+ debug?: boolean;
131
+ onTimingEvent?: (event: {
132
+ phase: "bootstrap" | "refresh" | "signIn";
133
+ durationMs: number;
134
+ ok: boolean;
135
+ code?: string;
136
+ }) => void;
123
137
  }
124
138
  declare class SessionManager {
125
139
  private snapshot;
126
140
  private listeners;
127
141
  private refreshPromise;
142
+ /**
143
+ * Cancellation handle for the in-flight refresh, if any. `signOut()` (or a
144
+ * `session:signout` broadcast from another tab) calls `abort()` so the
145
+ * refresh response is dropped before it can write a fresh access cookie
146
+ * on top of the just-cleared session — the second root cause of "ghost
147
+ * signed-in" sessions after Sign Out.
148
+ */
149
+ private refreshAbort;
150
+ /**
151
+ * Set to `true` by `signOut()` / `signOutLocal()` for the lifetime of the
152
+ * call. Used as a safety belt: even if a refresh response arrives while
153
+ * `refreshAbort` was unable to interrupt the network call (e.g. the body
154
+ * was already streaming back), `runRefresh` checks this flag before
155
+ * mutating session state and bails out.
156
+ */
157
+ private signoutInProgress;
158
+ /**
159
+ * Per-session opaque idempotency token. Sent as `X-IQAuth-Idempotency` on
160
+ * every /refresh and /signout request the SDK makes through a framework
161
+ * adapter (Express/Fastify/Hono/Next), so the adapter's `SignoutRegistry`
162
+ * can collapse a refresh that lands moments after a signout — even when
163
+ * the two requests are routed to different server instances (multi-replica
164
+ * deployments).
165
+ *
166
+ * Generated lazily on first use, rotated on signout so the next session
167
+ * starts with a fresh token. Opaque random — never the raw refresh token.
168
+ */
169
+ private idempotencyToken;
128
170
  private channel;
129
171
  private readonly tabId;
130
172
  private readonly fetchImpl;
@@ -138,26 +180,59 @@ declare class SessionManager {
138
180
  private readonly crossTabLockTimeoutMs;
139
181
  private readonly serverManagedSession;
140
182
  private readonly refreshCookieName;
183
+ private readonly debug;
184
+ private readonly onTimingEvent;
141
185
  private proactiveTimer;
142
186
  private bootstrapped;
143
187
  /** Pending refresh awaited by other tabs after a `refresh:claim` from us. */
144
188
  private remoteRefreshWaiters;
145
189
  /** Active claims by other tabs (keyed by source tabId). */
146
190
  private foreignClaim;
191
+ /** Resolver for an in-flight cross-tab `session:probe`, set during bootstrap. */
192
+ private probeResolver;
147
193
  constructor(options: SessionManagerOptions);
148
194
  get publishableKey(): ParsedPublishableKey;
149
195
  get appKey(): string;
150
196
  get tenantIdFromKey(): string;
151
197
  get issuerUrl(): string;
198
+ /**
199
+ * SDK 2.7.0 (Task #124) — The hosted IQAuth host derived from the
200
+ * publishable key's `iss` claim, normalized to URL form. This is what
201
+ * `<SignIn/>` and `buildSignInUrl` use to talk to the hosted UI; it
202
+ * deliberately ignores the `issuer` constructor override so a misrouted
203
+ * `issuer` (e.g. pointed at the consumer app's own domain) cannot break
204
+ * the hosted flow. Use {@link issuerUrl} for token / discovery endpoints.
205
+ */
206
+ get hostedIssuerUrl(): string;
152
207
  /** Cookie name the SDK uses for the refresh token (overridable via `cookieNames.refresh`). */
153
208
  get refreshCookie(): string;
209
+ /**
210
+ * Returns the current per-session idempotency token, generating one
211
+ * lazily on first use. Sent as the `X-IQAuth-Idempotency` header on
212
+ * /refresh and /signout requests so the framework adapter's
213
+ * `SignoutRegistry` can collapse a refresh-vs-signout race even across
214
+ * server instances.
215
+ */
216
+ getIdempotencyToken(): string;
154
217
  getSnapshot(): SessionSnapshot;
155
218
  subscribe(listener: (s: SessionSnapshot) => void): () => void;
156
219
  /**
157
220
  * One-time bootstrap: warm the session from the refresh cookie if present.
158
221
  * Safe to call multiple times.
159
222
  */
223
+ /**
224
+ * Task #126: Public timing-event emitter. Used by the browser sign-in
225
+ * helpers (redirectToSignIn / handleAuthCallback) to surface signIn-phase
226
+ * timings through the same `debug` + `onTimingEvent` channel as
227
+ * bootstrap/refresh. Safe to call from anywhere — internal callers
228
+ * pre-compute durationMs.
229
+ */
230
+ recordTiming(phase: "bootstrap" | "refresh" | "signIn", durationMs: number, ok: boolean, code?: string): void;
231
+ /** Task #126: emit a session timing event to debug log + onTimingEvent hook. */
232
+ private emitTiming;
160
233
  bootstrap(): Promise<void>;
234
+ private bootstrapInner;
235
+ private probePeers;
161
236
  /**
162
237
  * Single-flight token refresh, coordinated across tabs via BroadcastChannel.
163
238
  *
@@ -178,6 +253,23 @@ declare class SessionManager {
178
253
  * session and notify subscribers and other tabs.
179
254
  */
180
255
  applyAccessToken(accessToken: string, refreshToken?: string): void;
256
+ /**
257
+ * Task #197 — Adopt an access token that the server has already minted
258
+ * for us (e.g. from `POST /api/v1/auth/switch-scope`) without contacting
259
+ * the issuer. Swaps the in-memory token, re-decodes claims, bumps
260
+ * `version`, schedules proactive refresh, and broadcasts a
261
+ * `session:update` to peer tabs.
262
+ *
263
+ * This is the safe path for any server endpoint that returns a fresh
264
+ * access token in its JSON body: we want the new claims (scope, roles,
265
+ * etc.) to take effect immediately, even if the refresh-cookie round-trip
266
+ * would have failed (network blip, rate limit, signout race). When the
267
+ * server also rotated the refresh token, pass it via
268
+ * `opts.refreshToken` so the cookie stays aligned.
269
+ */
270
+ adoptAccessToken(accessToken: string, opts?: {
271
+ refreshToken?: string;
272
+ }): void;
181
273
  /**
182
274
  * Returns a valid access token, refreshing once if it is expired or about
183
275
  * to expire. Resolves to `null` if the session can no longer be revived.
@@ -485,4 +577,4 @@ declare function handleAuthCallback(manager: SessionManager, options?: {
485
577
  */
486
578
  declare function signOut(manager: SessionManager, opts?: SignOutOptions): Promise<void>;
487
579
 
488
- export { AccountRegistry as A, clearCookie as B, type CallbackResult as C, getCookie as D, setCookie as E, type LinkedIdentity as L, type MagicLinkRequestInput as M, type PasswordlessOptions as P, type RefreshTokenStore as R, SessionManager as S, type UnlinkProviderInput as U, type SessionManagerOptions as a, type SessionSnapshot as b, type SessionStatus as c, beginPasskeyAuthentication as d, beginPasskeyRegistration as e, finishPasskeyAuthentication as f, finishPasskeyRegistration as g, enrollPasskey as h, linkProvider as i, type PasskeyAuthInput as j, type LinkProviderInput as k, listLinkedIdentities as l, MultiAccountTokenStore as m, type AccountRecord as n, buildSignInUrl as o, handleAuthCallback as p, redirectToSignIn as q, requestMagicLink as r, signInWithPasskey as s, signIn as t, unlinkProvider as u, verifyMagicLink as v, signOut as w, type SignInOptions as x, type SignOutOptions as y, REFRESH_COOKIE as z };
580
+ export { AccountRegistry as A, clearCookie as B, type CallbackResult as C, getCookie as D, setCookie as E, type LinkedIdentity as L, type MagicLinkRequestInput as M, type PasswordlessOptions as P, type RefreshTokenStore as R, SessionManager as S, type UnlinkProviderInput as U, type SessionSnapshot as a, type SignInOptions as b, type SignOutOptions as c, type LinkProviderInput as d, type SessionManagerOptions as e, type SessionStatus as f, beginPasskeyAuthentication as g, finishPasskeyAuthentication as h, beginPasskeyRegistration as i, finishPasskeyRegistration as j, enrollPasskey as k, listLinkedIdentities as l, linkProvider as m, type PasskeyAuthInput as n, MultiAccountTokenStore as o, type AccountRecord as p, buildSignInUrl as q, requestMagicLink as r, signInWithPasskey as s, handleAuthCallback as t, unlinkProvider as u, verifyMagicLink as v, redirectToSignIn as w, signIn as x, signOut as y, REFRESH_COOKIE as z };
@@ -4,7 +4,7 @@ import {
4
4
  redirectToSignIn,
5
5
  signIn,
6
6
  signOut
7
- } from "./chunk-DJIBN2N7.mjs";
7
+ } from "./chunk-GN37E64I.mjs";
8
8
  import "./chunk-C2ZTBOAC.mjs";
9
9
  import "./chunk-Y6FXYEAI.mjs";
10
10
  export {
package/dist/test.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createTestIssuer
3
- } from "./chunk-MKKZULZR.mjs";
4
- import "./chunk-WQWBJSSS.mjs";
5
- import "./chunk-6I6RM4MN.mjs";
3
+ } from "./chunk-WIFG74IK.mjs";
4
+ import "./chunk-HVHNYPDC.mjs";
5
+ import "./chunk-6PJRLRB4.mjs";
6
6
  import "./chunk-Y6FXYEAI.mjs";
7
7
  export {
8
8
  createTestIssuer
@@ -1,4 +1,4 @@
1
- import { J as JwtClaims } from './types-DZAflmmq.mjs';
1
+ import { h as IQAuthClaims, J as JwtClaims } from './types-Bn8O-OEd.js';
2
2
 
3
3
  /**
4
4
  * SOURCE REFS:
@@ -45,7 +45,7 @@ declare class TokensModule {
45
45
  * Node, browser, and edge runtimes alike — no `node:crypto` dependency.
46
46
  * Caches JWKS for 1 hour and refetches once on unknown `kid`.
47
47
  */
48
- verify(token: string, options?: TokenVerifyOptions): Promise<JwtClaims>;
48
+ verify<T extends object = {}>(token: string, options?: TokenVerifyOptions): Promise<IQAuthClaims<T> & JwtClaims>;
49
49
  /**
50
50
  * Decode a JWT without verification. Returns null if malformed.
51
51
  */
@@ -58,6 +58,13 @@ declare class TokensModule {
58
58
  private refreshJwks;
59
59
  /** @internal Exposed for testing — clears JWKS cache */
60
60
  clearCache(): void;
61
+ /**
62
+ * Task #126: Eagerly populate the JWKS cache so the first verify() call
63
+ * doesn't pay a network round-trip. Safe to call repeatedly — single-flight
64
+ * behavior is shared with the lazy refresh path. Errors are swallowed so
65
+ * callers (e.g. `attachHelpers` auto-prewarm) can fire-and-forget.
66
+ */
67
+ prewarm(): Promise<void>;
61
68
  }
62
69
 
63
70
  export { DEFAULT_TOKEN_ISSUER as D, TokensModule as T, DEFAULT_TOKEN_AUDIENCE as a, DEFAULT_CLOCK_TOLERANCE_SECONDS as b, type TokenVerifyOptions as c, type TokensModuleOptions as d };
@@ -1,4 +1,4 @@
1
- import { J as JwtClaims } from './types-DZAflmmq.js';
1
+ import { h as IQAuthClaims, J as JwtClaims } from './types-Bn8O-OEd.mjs';
2
2
 
3
3
  /**
4
4
  * SOURCE REFS:
@@ -45,7 +45,7 @@ declare class TokensModule {
45
45
  * Node, browser, and edge runtimes alike — no `node:crypto` dependency.
46
46
  * Caches JWKS for 1 hour and refetches once on unknown `kid`.
47
47
  */
48
- verify(token: string, options?: TokenVerifyOptions): Promise<JwtClaims>;
48
+ verify<T extends object = {}>(token: string, options?: TokenVerifyOptions): Promise<IQAuthClaims<T> & JwtClaims>;
49
49
  /**
50
50
  * Decode a JWT without verification. Returns null if malformed.
51
51
  */
@@ -58,6 +58,13 @@ declare class TokensModule {
58
58
  private refreshJwks;
59
59
  /** @internal Exposed for testing — clears JWKS cache */
60
60
  clearCache(): void;
61
+ /**
62
+ * Task #126: Eagerly populate the JWKS cache so the first verify() call
63
+ * doesn't pay a network round-trip. Safe to call repeatedly — single-flight
64
+ * behavior is shared with the lazy refresh path. Errors are swallowed so
65
+ * callers (e.g. `attachHelpers` auto-prewarm) can fire-and-forget.
66
+ */
67
+ prewarm(): Promise<void>;
61
68
  }
62
69
 
63
70
  export { DEFAULT_TOKEN_ISSUER as D, TokensModule as T, DEFAULT_TOKEN_AUDIENCE as a, DEFAULT_CLOCK_TOLERANCE_SECONDS as b, type TokenVerifyOptions as c, type TokensModuleOptions as d };
@@ -36,7 +36,17 @@ interface IQAuthTokenClientConfig extends IQAuthClientConfigBase {
36
36
  apiKey?: string;
37
37
  accessToken?: string;
38
38
  refreshToken?: string;
39
- autoRefresh?: boolean;
39
+ /**
40
+ * Token auto-refresh strategy.
41
+ * - `true` (default): proactively refresh when the access token is within 60s of expiry,
42
+ * AND retry once on a TOKEN_EXPIRED 401 response.
43
+ * - `false`: never auto-refresh — caller drives `tokens.refresh()` manually.
44
+ * - `'app-state'` (mobile only): skip the per-request expiring-soon proactive refresh
45
+ * (which fights with React Native's app-suspension lifecycle) and instead refresh on
46
+ * AppState `active` transitions. Reactive 401 retry stays enabled. Recognized only by
47
+ * `createMobileClient`; passing it to other constructors falls back to `true`.
48
+ */
49
+ autoRefresh?: boolean | "app-state";
40
50
  onTokenRefresh?: (tokens: TokenPair) => void;
41
51
  }
42
52
  interface IQAuthBrowserSessionClientConfig extends IQAuthClientConfigBase {
@@ -75,7 +85,66 @@ interface JwtClaims {
75
85
  email?: string;
76
86
  name?: string;
77
87
  };
88
+ picture?: string;
89
+ email_verified?: boolean;
90
+ given_name?: string;
91
+ family_name?: string;
92
+ locale?: string;
78
93
  }
94
+ /**
95
+ * Task #127 — Base claims shape (OIDC standard + IQAuth tenant/role).
96
+ *
97
+ * Required fields mirror what the IQAuth issuer always emits today; if a
98
+ * token is missing one of them it would fail `tokens.verify()` against the
99
+ * expected issuer/audience first, so this type trades runtime checks for
100
+ * compile-time ergonomics.
101
+ */
102
+ interface IQAuthBaseClaims {
103
+ /** Subject — opaque IQAuth user id. */
104
+ sub: string;
105
+ /** OIDC issuer URL (e.g. `https://auth.dispositioniq.com`). */
106
+ iss: string;
107
+ /** Audience(s) the token was minted for. */
108
+ aud: string | string[];
109
+ /** Expiry in seconds since epoch. */
110
+ exp: number;
111
+ /** Issued-at in seconds since epoch. */
112
+ iat: number;
113
+ email?: string;
114
+ email_verified?: boolean;
115
+ name?: string;
116
+ picture?: string;
117
+ locale?: string;
118
+ tenantId?: string;
119
+ tenantName?: string;
120
+ tenantSlug?: string;
121
+ vendorId?: string | null;
122
+ roles?: string[];
123
+ entitlements?: string[];
124
+ sessionId?: string;
125
+ jti?: string;
126
+ scopeContext?: ScopeContext;
127
+ loginMethod?: string;
128
+ /** RFC 8693 §4.1 actor — present on impersonation tokens. */
129
+ purpose?: string;
130
+ act?: {
131
+ sub: string;
132
+ email?: string;
133
+ name?: string;
134
+ };
135
+ }
136
+ /**
137
+ * Generic typed claims envelope. The type parameter `T` is structurally
138
+ * intersected with the base claims so app-specific fields minted via JWT
139
+ * templates surface with full IntelliSense:
140
+ *
141
+ * ```ts
142
+ * type MyClaims = { plan: "free" | "pro"; orgId: string };
143
+ * const claims = await client.tokens.verify<MyClaims>(token);
144
+ * if (claims.plan === "pro" && claims.orgId) { … } // both fields typed
145
+ * ```
146
+ */
147
+ type IQAuthClaims<T extends object = {}> = IQAuthBaseClaims & T;
79
148
  interface UserProfile {
80
149
  id: string;
81
150
  email: string;
@@ -102,6 +171,19 @@ interface SessionUser {
102
171
  vendorId?: string | null;
103
172
  roles: string[];
104
173
  entitlements: string[];
174
+ picture?: string;
175
+ emailVerified?: boolean;
176
+ givenName?: string;
177
+ familyName?: string;
178
+ locale?: string;
179
+ /**
180
+ * Task #171 — When the active session was minted under a source/client
181
+ * scope (either via a scope_hint, single-resolved scope, or post-pick),
182
+ * the access token carries a `scopeContext` claim and we project it here
183
+ * so SDK consumers (`useUser()`, framework adapters) can read the active
184
+ * scope without re-parsing the JWT. Absent for tenant-wide sessions.
185
+ */
186
+ scopeContext?: ScopeContext;
105
187
  }
106
188
  interface Tenant {
107
189
  tenantId: string;
@@ -127,6 +209,24 @@ interface SessionAuthenticatedLoginResult {
127
209
  authMode: "session";
128
210
  user: SessionUser;
129
211
  }
212
+ /**
213
+ * Task #171 — A user can have multiple source/client scoped memberships in
214
+ * the same tenant with no tenant-wide role. When login resolves to that
215
+ * state the backend returns a short-lived `scopeSelectionToken` plus the
216
+ * list of choices; the caller redeems it via `AuthModule.selectScope`.
217
+ */
218
+ interface ScopeChoice {
219
+ membershipId: string;
220
+ scopeType: "vendor" | "source" | "client";
221
+ scopeId: string;
222
+ scopeName: string;
223
+ roleName: string;
224
+ }
225
+ /** Task #171 — Optional hint forwarded with login / select-tenant / OIDC. */
226
+ interface ScopeHint {
227
+ type: "vendor" | "source" | "client";
228
+ id: string;
229
+ }
130
230
  type LoginResult = TokenAuthenticatedLoginResult | SessionAuthenticatedLoginResult | {
131
231
  status: "mfa_required";
132
232
  mfaChallengeToken: string;
@@ -135,6 +235,11 @@ type LoginResult = TokenAuthenticatedLoginResult | SessionAuthenticatedLoginResu
135
235
  status: "tenant_selection";
136
236
  tenantSelectionToken: string;
137
237
  tenants: Tenant[];
238
+ } | {
239
+ status: "scope_selection";
240
+ scopeSelectionToken: string;
241
+ tenantId: string;
242
+ scopes: ScopeChoice[];
138
243
  };
139
244
  interface Session {
140
245
  id: string;
@@ -407,6 +512,13 @@ interface PermissionNodeManifest {
407
512
  metadata?: Record<string, unknown>;
408
513
  children?: PermissionNodeManifest[];
409
514
  }
515
+ /**
516
+ * Task #130 — every manifest write must declare its origin environment so a
517
+ * dev workstation can never silently overwrite a production app's permission
518
+ * tree. The Admin API rejects writes whose `environment` is missing or not
519
+ * one of these three values with `{code: "ENVIRONMENT_REQUIRED"}`.
520
+ */
521
+ type AppManifestEnvironment = "production" | "staging" | "development";
410
522
  interface AppManifest {
411
523
  key: string;
412
524
  name: string;
@@ -415,6 +527,8 @@ interface AppManifest {
415
527
  tenantId?: string | null;
416
528
  metadata?: Record<string, unknown>;
417
529
  permissions: PermissionNodeManifest[];
530
+ /** Required by `POST /api/v1/apps/sync`. See {@link AppManifestEnvironment}. */
531
+ environment: AppManifestEnvironment;
418
532
  }
419
533
  interface AppInfo {
420
534
  id: string;
@@ -545,13 +659,17 @@ interface GroupPermission {
545
659
  nodeKey?: string | null;
546
660
  createdAt?: string;
547
661
  }
662
+ /**
663
+ * Task #130 — `appKey` and `nodeKey` are REQUIRED on this app-scoped admin
664
+ * call. The legacy `product` / `scope` shape is rejected at the SDK boundary
665
+ * to prevent the silent-fallback failure mode where a misconfigured value
666
+ * led to an empty/wrong permission set without any error.
667
+ */
548
668
  interface AddGroupPermissionRequest {
549
- product?: string;
550
- scope?: string;
669
+ appKey: string;
670
+ nodeKey: string;
551
671
  effect: string;
552
672
  weight?: number;
553
- appKey?: string;
554
- nodeKey?: string;
555
673
  }
556
674
  interface InheritanceRelation {
557
675
  id: string;
@@ -569,14 +687,16 @@ interface UserPermissionOverride {
569
687
  expiresAt?: string | null;
570
688
  createdAt?: string;
571
689
  }
690
+ /**
691
+ * Task #130 — `appKey` and `nodeKey` are REQUIRED. See `AddGroupPermissionRequest`
692
+ * for rationale.
693
+ */
572
694
  interface AddUserOverrideRequest {
573
- product?: string;
574
- scope?: string;
695
+ appKey: string;
696
+ nodeKey: string;
575
697
  effect: string;
576
698
  weight?: number;
577
699
  expiresAt?: string;
578
- appKey?: string;
579
- nodeKey?: string;
580
700
  }
581
701
  interface EffectivePermission {
582
702
  scope: string;
@@ -629,13 +749,46 @@ interface Invitation {
629
749
  invitedBy: string;
630
750
  expiresAt?: string;
631
751
  createdAt?: string;
752
+ /** Scope the invite grants into ("tenant" | "vendor" | "source" | "client"). */
753
+ scopeType?: string | null;
754
+ /** Scope target id (paired with `scopeType`). */
755
+ scopeId?: string | null;
756
+ /** OIDC client bound for post-accept auto-redirect (paired with `redirectUri`). */
757
+ clientId?: string | null;
758
+ /** Registered redirect URI the new invitee is sent to after account creation. */
759
+ redirectUri?: string | null;
760
+ /** Display name pre-filled on the hosted accept page. */
761
+ inviteeName?: string | null;
632
762
  }
633
763
  interface CreateInviteRequest {
634
764
  email: string;
635
- tenantId: string;
765
+ /**
766
+ * Target tenant. Optional for service (API-key) callers — the backend
767
+ * derives the tenant from the key and rejects a mismatching value. Platform
768
+ * admins may target any tenant.
769
+ */
770
+ tenantId?: string;
636
771
  vendorId?: string;
637
772
  role: string;
638
773
  products?: string[];
774
+ /** Scope to grant into. Must match the backend's accepted values. */
775
+ scopeType?: "tenant" | "vendor" | "source" | "client";
776
+ /** Scope target id (paired with `scopeType`). */
777
+ scopeId?: string;
778
+ /**
779
+ * Opt-in auto-redirect after the invitee creates their account. `clientId`
780
+ * and `redirectUri` are all-or-nothing — pass both or neither. The backend
781
+ * validates that `clientId` is an active OIDC client in the invite's tenant
782
+ * and that `redirectUri` is in that client's registered allowlist, then mints
783
+ * an OIDC authorization code and 302s the brand-new invitee to
784
+ * `${redirectUri}?code=…&state=…`. Point this at your app's
785
+ * `/api/iqauth/callback` so the framework adapter signs the user in on first
786
+ * paint. Existing-user accepts do NOT auto-redirect (see the integration guide).
787
+ */
788
+ clientId?: string;
789
+ redirectUri?: string;
790
+ /** Optional display name to pre-fill on the hosted accept page. Never used for auth. */
791
+ inviteeName?: string;
639
792
  }
640
793
  interface InviteValidation {
641
794
  valid: boolean;
@@ -903,4 +1056,4 @@ interface BackupCodeCountResult {
903
1056
  remainingBackupCodes: number;
904
1057
  }
905
1058
 
906
- export type { PermissionNodeInfo as $, ApiSuccessResponse as A, BrandingConfig as B, CreateTenantRequest as C, MfaVerifyResult as D, PasswordPolicy as E, MfaPolicy as F, UserPermissions as G, ProvisionUserRequest as H, IQAuthEnvironment as I, JwtClaims as J, ProvisionUserResponse as K, LoginResult as L, MigrateUserRequest as M, ExpressMiddlewareOptions as N, OidcDiscovery as O, PromoteToVendorRequest as P, IQAuthRequestLike as Q, IQAuthResponseLike as R, ScopeContext as S, TokenPair as T, UserProfile as U, IQAuthNextFunction as V, IQAuthRetryConfig as W, IQAuthVerifyConfig as X, PermissionNodeManifest as Y, AppManifest as Z, AppInfo as _, IQAuthClientConfig as a, SignupRequest as a$, AppSyncResult as a0, Role as a1, CreateRoleRequest as a2, UpdateRoleRequest as a3, AssignRoleRequest as a4, UserRoleAssignment as a5, UserGroupAssignment as a6, TenantUser as a7, PermissionGroup as a8, GroupPermission as a9, UpdateSourceRequest as aA, Client as aB, CreateClientRequest as aC, UpdateClientRequest as aD, HierarchyVendor as aE, HierarchySource as aF, HierarchyClient as aG, HierarchyLink as aH, Membership as aI, CreateMembershipRequest as aJ, UpdateMembershipRequest as aK, MembershipWithDetails as aL, AvailableScopesTree as aM, ScopeTreeClient as aN, ScopeTreeSource as aO, ScopeTreeVendor as aP, ScopeSwitchResult as aQ, GdprExportData as aR, PinStatus as aS, PinLoginResult as aT, MfaAvailableMethods as aU, TotpEnrollResult as aV, TotpVerifyResult as aW, SmsEnrollResult as aX, EmailEnrollResult as aY, BackupCodesResult as aZ, BackupCodeCountResult as a_, AddGroupPermissionRequest as aa, InheritanceRelation as ab, UserPermissionOverride as ac, AddUserOverrideRequest as ad, EffectivePermission as ae, PermissionCheckResult as af, ApiKeyInfo as ag, CreateApiKeyRequest as ah, CreateApiKeyResult as ai, ApiKeyIntrospection as aj, Invitation as ak, CreateInviteRequest as al, InviteValidation as am, AcceptInviteRequest as an, WebhookEndpoint as ao, CreateWebhookRequest as ap, CreateWebhookResult as aq, WebhookDelivery as ar, WebhookTestResult as as, Entitlement as at, GrantEntitlementRequest as au, Vendor as av, CreateVendorRequest as aw, UpdateVendorRequest as ax, Source as ay, CreateSourceRequest as az, IQAuthTokenClientConfig as b, HostedClientContext as b0, IQAuthBrowserSessionClientConfig as c, SessionUser as d, Tenant as e, TokenAuthenticatedLoginResult as f, SessionAuthenticatedLoginResult as g, Session as h, TenantInfo as i, UpdateTenantRequest as j, PromoteToVendorResult as k, InviteTenantUserRequest as l, InviteTenantUserResult as m, TenantUserRoleUpdate as n, UpdateBrandingRequest as o, BrandingAsset as p, UploadAssetRequest as q, BrandingDomainMapping as r, JwksKey as s, JwksResponse as t, OidcTokenResponse as u, ApiErrorResponse as v, ApiResponse as w, MfaMethod as x, MfaEnrollment as y, TotpEnrollmentResult as z };
1059
+ export type { AppManifest as $, ApiSuccessResponse as A, BrandingConfig as B, CreateTenantRequest as C, ApiErrorResponse as D, ApiResponse as E, MfaMethod as F, MfaEnrollment as G, TotpEnrollmentResult as H, IQAuthBrowserSessionClientConfig as I, JwtClaims as J, MfaVerifyResult as K, LoginResult as L, MigrateUserRequest as M, PasswordPolicy as N, OidcDiscovery as O, PromoteToVendorRequest as P, MfaPolicy as Q, UserPermissions as R, SessionUser as S, TokenPair as T, UserProfile as U, ProvisionUserRequest as V, ProvisionUserResponse as W, ExpressMiddlewareOptions as X, IQAuthRetryConfig as Y, IQAuthVerifyConfig as Z, PermissionNodeManifest as _, IQAuthRequestLike as a, BackupCodesResult as a$, AppInfo as a0, PermissionNodeInfo as a1, AppSyncResult as a2, Role as a3, CreateRoleRequest as a4, UpdateRoleRequest as a5, AssignRoleRequest as a6, UserRoleAssignment as a7, UserGroupAssignment as a8, TenantUser as a9, Source as aA, CreateSourceRequest as aB, UpdateSourceRequest as aC, Client as aD, CreateClientRequest as aE, UpdateClientRequest as aF, HierarchyVendor as aG, HierarchySource as aH, HierarchyClient as aI, HierarchyLink as aJ, Membership as aK, CreateMembershipRequest as aL, UpdateMembershipRequest as aM, MembershipWithDetails as aN, AvailableScopesTree as aO, ScopeTreeClient as aP, ScopeTreeSource as aQ, ScopeTreeVendor as aR, ScopeSwitchResult as aS, GdprExportData as aT, PinStatus as aU, PinLoginResult as aV, MfaAvailableMethods as aW, TotpEnrollResult as aX, TotpVerifyResult as aY, SmsEnrollResult as aZ, EmailEnrollResult as a_, PermissionGroup as aa, GroupPermission as ab, AddGroupPermissionRequest as ac, InheritanceRelation as ad, UserPermissionOverride as ae, AddUserOverrideRequest as af, EffectivePermission as ag, PermissionCheckResult as ah, ApiKeyInfo as ai, CreateApiKeyRequest as aj, CreateApiKeyResult as ak, ApiKeyIntrospection as al, Invitation as am, CreateInviteRequest as an, InviteValidation as ao, AcceptInviteRequest as ap, WebhookEndpoint as aq, CreateWebhookRequest as ar, CreateWebhookResult as as, WebhookDelivery as at, WebhookTestResult as au, Entitlement as av, GrantEntitlementRequest as aw, Vendor as ax, CreateVendorRequest as ay, UpdateVendorRequest as az, IQAuthResponseLike as b, BackupCodeCountResult as b0, ScopeHint as b1, SignupRequest as b2, HostedClientContext as b3, IQAuthNextFunction as c, IQAuthEnvironment as d, IQAuthClientConfig as e, IQAuthTokenClientConfig as f, ScopeContext as g, IQAuthClaims as h, IQAuthBaseClaims as i, Tenant as j, TokenAuthenticatedLoginResult as k, SessionAuthenticatedLoginResult as l, Session as m, TenantInfo as n, UpdateTenantRequest as o, PromoteToVendorResult as p, InviteTenantUserRequest as q, InviteTenantUserResult as r, TenantUserRoleUpdate as s, UpdateBrandingRequest as t, BrandingAsset as u, UploadAssetRequest as v, BrandingDomainMapping as w, JwksKey as x, JwksResponse as y, OidcTokenResponse as z };