@ionite/core 0.0.24-beta.20261003.17 → 0.0.24-beta.20261005.20

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.
package/dist/index.d.ts CHANGED
@@ -16,212 +16,6 @@ declare const KNOWN_WORKLOAD_KEYS: readonly ["id", "clientId", "displayName", "d
16
16
  declare function customAttributes(value: object, knownKeys: readonly PropertyKey[]): Record<string, unknown> | undefined;
17
17
  import { StandardSchemaV1 as StandardSchemaV19 } from "@standard-schema/spec";
18
18
  import { StandardSchemaV1 as StandardSchemaV18 } from "@standard-schema/spec";
19
- /**
20
- * Third-party CIAM provider presets and claim mapping.
21
- *
22
- * Defines the built-in provider adapters used by the CIAM module for customer
23
- * login. Each preset supplies default OIDC/OAuth2 endpoints, scope, branding,
24
- * and a claim mapper that normalizes provider claims into a candidate customer.
25
- * The application's `CustomerStore` remains the system of record: the SDK only
26
- * extracts standard claims and hands a candidate to `lookup`/`upsert`.
27
- */
28
- /** Built-in provider types. `oidc` is a generic OIDC provider; `magic-link` is the passwordless flow. */
29
- type CIAMProviderType = "oidc" | "google" | "github" | "microsoft" | "apple" | "magic-link";
30
- /** Branding colors for rendering a provider button in light and dark themes. */
31
- type CIAMProviderColors = {
32
- /** Background/brand color for light theme (hex or CSS color). */
33
- light: string;
34
- /** Background/brand color for dark theme (hex or CSS color). */
35
- dark: string;
36
- /** Optional secondary/accent color. */
37
- secondary?: string;
38
- };
39
- /** Operator-supplied branding so the UI can render a provider list without hardcoding. */
40
- type CIAMProviderBranding = {
41
- /** Human-readable name shown on the login button (e.g. "Google"). */
42
- displayName: string;
43
- /** External icon URL (typically an SVG/PNG hosted on a CDN). */
44
- iconUrl?: string;
45
- /** Light/dark brand colors. */
46
- colors?: CIAMProviderColors;
47
- /** Optional provider info/marketing URL. */
48
- url?: string;
49
- };
50
- /**
51
- * A single CIAM provider declaration. OIDC/OAuth2 endpoint and credential
52
- * fields come from the ConfigSource (never application code).
53
- */
54
- type CIAMProviderConfig = {
55
- /** Provider adapter type. Selects defaults and claim mapping. */
56
- type: CIAMProviderType;
57
- /** Whether this provider is enabled. Defaults to true when omitted. */
58
- enabled?: boolean;
59
- /** Recommended display order (ascending). Ties broken by declaration order. */
60
- order?: number;
61
- /** UI branding metadata. */
62
- branding?: CIAMProviderBranding;
63
- /** OIDC issuer/authority (used for discovery when explicit endpoints are omitted). */
64
- authority?: string;
65
- /** Authorization endpoint (overrides preset). */
66
- authorizationUrl?: string;
67
- /** Token endpoint (overrides preset). */
68
- tokenUrl?: string;
69
- /** JWKS endpoint for ID token verification (overrides preset). */
70
- jwksUri?: string;
71
- /** OAuth2 UserInfo endpoint for providers without an ID token (e.g. GitHub). */
72
- userInfoUrl?: string;
73
- /** OAuth2 client id (ConfigSource-only). */
74
- clientId?: string;
75
- /** OAuth2 client secret (ConfigSource-only). */
76
- clientSecret?: string;
77
- /** Requested scope (overrides preset). */
78
- scope?: string;
79
- /** Apple: team id for client-secret generation. */
80
- teamId?: string;
81
- /** Apple: key id for client-secret generation. */
82
- keyId?: string;
83
- /** Apple: PKCS#8 PEM private key for client-secret generation. */
84
- privateKey?: string;
85
- };
86
- /** Sanitized provider entry returned by the discovery endpoint for the UI. */
87
- type CIAMProviderDescriptor = {
88
- /** Provider key (matches the RemoteConfig map key); used as `?provider=`. */
89
- name: string;
90
- type: CIAMProviderType;
91
- displayName: string;
92
- /** SDK-derived login URL to navigate to (begins the flow). */
93
- loginUrl: string;
94
- iconUrl?: string;
95
- colors?: CIAMProviderColors;
96
- url?: string;
97
- };
98
- /**
99
- * Light display cookies (`${cookiesPrefix}.profile`).
100
- *
101
- * The envelope is SDK-owned. App code supplies only `user`. The cookie is not an
102
- * authentication input: the server never reads it to resolve a session, and the browser
103
- * may forge it. `expiresAt` is display metadata so a client can order entries without a
104
- * round trip; authoritative expiry is the peer `${cookiesPrefix}.session` record.
105
- */
106
- declare const DISPLAY_COOKIE_SUFFIX = ".profile";
107
- declare const DISPLAY_COOKIE_VERSION = 1;
108
- declare const DEFAULT_DISPLAY_COOKIE_MAX = 10;
109
- declare const DEFAULT_DISCOVERED_COOKIE_MAX = 10;
110
- declare const DEFAULT_DISCOVERED_COOKIE_TTL_SECONDS: number;
111
- declare const DISCOVERED_COOKIE_PREFIX = "ion.discovered";
112
- type DisplayCookieConfig = {
113
- /**
114
- * When true, the SDK writes a non-HttpOnly display cookie beside the opaque session cookie.
115
- * ConfigSource-only. Default false.
116
- */
117
- enabled?: boolean;
118
- /**
119
- * How many display cookies a single response may leave on the browser, newest session window
120
- * first. ConfigSource-only. Values below 1 fall back to {@link DEFAULT_DISPLAY_COOKIE_MAX}.
121
- * @default 10
122
- */
123
- max?: number;
124
- /**
125
- * Session-less tenant hints written by an App after an explicit directory lookup.
126
- * ConfigSource-only and off unless `enabled` is true.
127
- */
128
- discovered?: DiscoveredDisplayCookieConfig;
129
- };
130
- type DiscoveredDisplayCookieConfig = {
131
- enabled?: boolean;
132
- /** Browser hint lifetime. This is not a session expiry. @default 14400 */
133
- ttlSeconds?: number;
134
- /** Independent cap; discovered hints never displace live-session entries. @default 10 */
135
- max?: number;
136
- };
137
- /** What `${basePath}/auth/user` and `${basePath}/auth/customer` return. ConfigSource-only. */
138
- type UserEndpointPolicy = "full" | "display" | "off";
139
- type DisplayUser = Record<string, string | number | boolean | null>;
140
- type DisplayAuthType = "sso" | "ciam";
141
- type DisplayCookieEnvelope = {
142
- v: typeof DISPLAY_COOKIE_VERSION;
143
- /**
144
- * Session envelopes omit this field (absent means `'session'`) so the wire format stays identical
145
- * to cookies written before discovered hints existed; only discovered hints set it explicitly.
146
- * Readers must treat `undefined` as `'session'`.
147
- */
148
- kind?: "session" | "discovered";
149
- tenantId?: string;
150
- authType: DisplayAuthType;
151
- /** ISO timestamp copied from the session window at write time. Display only. */
152
- expiresAt: string;
153
- user: DisplayUser;
154
- tenantName?: string;
155
- };
156
- type DisplayIdentity = {
157
- name?: string;
158
- email?: string;
159
- avatar?: string;
160
- };
161
- declare function resolveDisplayCookieMax(max: number | undefined): number;
162
- declare function resolveDiscoveredCookieMax(max: number | undefined): number;
163
- declare function resolveDiscoveredCookieTtlSeconds(ttlSeconds: number | undefined): number;
164
- declare function defaultDisplayUser(identity: DisplayIdentity): DisplayUser;
165
- /** Drop non-primitives and auth-bearing keys. Display cookies carry UI fields only. */
166
- declare function sanitizeDisplayUser(value: unknown): DisplayUser;
167
- /**
168
- * AppDev projection runs on the full user (including custom attributes). When omitted, or when it
169
- * throws, the cookie carries name, email, and avatar only. Forbidden and non-primitive fields are
170
- * dropped either way — a projector cannot put a session id or token into the cookie.
171
- */
172
- declare function projectDisplayUser<TUser extends object>(user: TUser, projector?: (user: TUser) => unknown): DisplayUser;
173
- declare function encodeDisplayCookie(envelope: DisplayCookieEnvelope): string;
174
- declare function decodeDisplayCookie(raw: string): DisplayCookieEnvelope | undefined;
175
- type ParsedDisplayCookie = {
176
- name: string;
177
- prefix: string;
178
- envelope: DisplayCookieEnvelope;
179
- };
180
- declare function readDisplayCookies(cookieHeader: string | null | undefined): ParsedDisplayCookie[];
181
- /** Client ordering: newest session window first. Invalid timestamps sort last. */
182
- declare function compareDisplayExpiryDesc(a: string | undefined, b: string | undefined): number;
183
- declare function profileCookieName(cookiesPrefix: string): string;
184
- declare function discoveredProfileCookieName(tenantId: string): string;
185
- /**
186
- * Minimal logger interface compatible with common structured logging patterns.
187
- */
188
- interface Logger {
189
- trace(message?: unknown, ...optionalParams: unknown[]): void;
190
- debug(message?: unknown, ...optionalParams: unknown[]): void;
191
- info(message?: unknown, ...optionalParams: unknown[]): void;
192
- warn(message?: unknown, ...optionalParams: unknown[]): void;
193
- error(message?: unknown, ...optionalParams: unknown[]): void;
194
- }
195
- /**
196
- * Renders a structured logger call as one greppable line while leaving the source fields separate
197
- * for telemetry exporters.
198
- */
199
- declare function formatLogLine(level: keyof Logger, message: unknown, optionalParams?: unknown[], timestamp?: Date): string;
200
- /**
201
- * No-op implementation — does nothing for any log level
202
- */
203
- declare const silentLogger: Logger;
204
- /**
205
- * Default logger used until an ionite instance is configured with
206
- * an OpenTelemetry-backed logger or an application-provided logger.
207
- */
208
- declare const defaultLogger: Logger;
209
- /**
210
- * Logger that logs messages debug, info, warn, and error to the console.
211
- */
212
- declare const debugLogger: Logger;
213
- /**
214
- * Logger that logs messages info, warn, and error to the console.
215
- */
216
- declare const infoLogger: Logger;
217
- /**
218
- * Logger that logs messages warn and error to the console.
219
- */
220
- declare const warnLogger: Logger;
221
- /**
222
- * Human-readable single-line console logger for local application output.
223
- */
224
- declare const prettyLogger: Logger;
225
19
  /** Synchronous, in-memory read surface for one code catalog entity kind. */
226
20
  type CodeCatalogNamespace<TEntity> = {
227
21
  get(id: string): TEntity | undefined;
@@ -300,7 +94,6 @@ declare function deprecateRetiredCodeCatalogRows(code: CodeCatalog | undefined,
300
94
  * visible. Returns undefined when neither source is wired.
301
95
  */
302
96
  declare function unionCatalogRead(code: CodeCatalog | undefined, store: AccessCatalogStore | undefined): AccessCatalogStore | undefined;
303
- import { StandardSchemaV1 as StandardSchemaV15 } from "@standard-schema/spec";
304
97
  /**
305
98
  * Resolve an access subject/target/resource reference (a string id or an object carrying one) to its
306
99
  * canonical, trimmed string id. This is the single id-resolution rule shared across the authz stack
@@ -316,6 +109,54 @@ declare function accessRefId(value: unknown): string;
316
109
  */
317
110
  declare function accessRootId(change: AccessChange): string;
318
111
  /**
112
+ * ConfigSource-only block that lets an issuing IdP's token claims satisfy `has*` checks.
113
+ * Placed independently on `sso`, each CIAM provider, and each incoming workload IdP.
114
+ * Absent means that issuer's claims never satisfy entitlements.
115
+ *
116
+ * Derived rows are session-scoped for users and customers (expanded onto the session at login
117
+ * and refresh) and per-request for workloads. They are never written to the access stores.
118
+ */
119
+ type ClaimsAsEntitlements = {
120
+ /**
121
+ * Claim names to read. A dotted path addresses a nested claim (`realm_access.roles`).
122
+ * `scope` is space-delimited; every other string claim is one value; arrays contribute each string.
123
+ * Required and non-empty.
124
+ */
125
+ claims: string[];
126
+ /**
127
+ * Expand a matched catalog role or group into the permissions it confers.
128
+ * Default false: a claim value matches only the catalog id it names.
129
+ */
130
+ expand?: boolean;
131
+ /**
132
+ * Let catalog-bound resources on expanded rows satisfy resource-scoped checks.
133
+ * Default false. Ignored unless `expand` is true: a claim string cannot name a resource.
134
+ */
135
+ resources?: boolean;
136
+ };
137
+ /** One effective entitlement derived from a token claim. Not a stored grant. */
138
+ type DerivedEntitlement = {
139
+ targetType: OaaAccessTargetType;
140
+ target: string;
141
+ /** Set only when the plane opted into `resources` and the catalog row binds this resource. */
142
+ resource?: string;
143
+ /** Claim name the value was read from. */
144
+ claim: string;
145
+ /** Expansion root id when the row came from catalog expansion. Absent for a direct id match. */
146
+ root?: string;
147
+ };
148
+ /** Secret-free projection of a configured claims block, including whether the App can persist it. */
149
+ type ClaimsAsEntitlementsDescription = {
150
+ claims: string[];
151
+ expand: boolean;
152
+ resources: boolean;
153
+ /**
154
+ * User and customer planes: the session store declares it persists `Session.entitlements`.
155
+ * Workload plane: always true (nothing is stored).
156
+ */
157
+ capable: boolean;
158
+ };
159
+ /**
319
160
  * Shared minimal identity fields used to build both the workforce user
320
161
  * record (`BaseUser`) and the CIAM customer record (`BaseCustomer`), as well
321
162
  * as the authenticated session types (`WorkforceUser`, `Customer`).
@@ -1130,11 +971,10 @@ type WorkloadIdentity = {
1130
971
  /** Granted OAuth scopes (space-delimited). */
1131
972
  scope?: string;
1132
973
  /**
1133
- * Whether the trusted IdP that validated this token opts into honoring its OAuth `scope` claim as
1134
- * entitlements (per-IdP intent, resolved at validation time). Consumed by the request-level `has*`
1135
- * helpers; `undefined` falls back to the global `RemoteConfig.authz.scopesAsEntitlements`.
974
+ * Claim-derived entitlements for this request. Present only when the matched incoming IdP
975
+ * configured `claimsAsEntitlements`. Never persisted.
1136
976
  */
1137
- scopesAsEntitlements?: boolean;
977
+ derivedEntitlements?: DerivedEntitlement[];
1138
978
  /**
1139
979
  * Enterprise Controlled ID for this workload (`ecid:<realm>:<opaque>`), when carried on the token
1140
980
  * `ecid` claim or enriched from a wired `WorkloadIdentityStore`. A workload is its own governance
@@ -1580,6 +1420,12 @@ interface WorkloadIdentityStore<TExtended = object> {
1580
1420
  * policy (flag, auto-revoke + notify, or simply audit).
1581
1421
  */
1582
1422
  type IamDeltaMode = "patch";
1423
+ /** ConfigSource-owned authenticated destination for the AccessRequests protocol. */
1424
+ type AccessRequestsDestination = {
1425
+ url: string;
1426
+ /** Named outgoing workload client. Omit to use the default workload server identity. */
1427
+ audience?: string;
1428
+ };
1583
1429
  type AccessRequestCreate = {
1584
1430
  subject: string;
1585
1431
  subjectType: SubjectType;
@@ -1660,13 +1506,6 @@ interface IamDeltaEmitter {
1660
1506
  /** Re-push the complete IAM-visible snapshot to the destination (app-driven full reconcile). */
1661
1507
  reconcile(input: IamDeltaReconcileInput): Promise<IamDeltaReconcileResult>;
1662
1508
  /**
1663
- * Submit an on-behalf access request at `${iam.url}/AccessRequests`. Requires only the
1664
- * destination channel (`url` plus the `deltaAudience` workload client) — not `isReady()`, which
1665
- * additionally demands delta egress (a per-kind `'patch'` mode and its receipt stores). A tenant
1666
- * whose IAM aggregates by pull alone may still submit requests.
1667
- */
1668
- requestAccess(input: AccessRequestCreate): Promise<AccessRequestResult>;
1669
- /**
1670
1509
  * Read a previously captured destination reference without making a network request. Returns
1671
1510
  * undefined until the resource has been resolved or pushed to the configured IAM destination.
1672
1511
  * `correlationId` is a User's `externalId` or an entitlement's App-owned catalog `id`.
@@ -1675,18 +1514,222 @@ interface IamDeltaEmitter {
1675
1514
  isReady(): boolean;
1676
1515
  ready(timeout?: number): Promise<void>;
1677
1516
  }
1678
- import { StandardSchemaV1 as StandardSchemaV14 } from "@standard-schema/spec";
1679
- type ChangeListener = () => void;
1680
- /**
1681
- * Reactive source/adapter contract. Implemented by config-source-backed adapters
1682
- * (for example `SecretsSource`) to advertise change subscription and source liveness.
1683
- * `isAvailable()` here is an adapter liveness hook and is intentionally distinct from
1684
- * module readiness (`ModuleReadiness.isReady()` / `ready()`).
1685
- */
1686
- type ReactiveHandle = {
1687
- beforeChange?(listener: ChangeListener): () => void;
1688
- afterChange?(listener: ChangeListener): () => void;
1689
- isAvailable?(): boolean;
1517
+ /** Built-in provider types. `oidc` is a generic OIDC provider; `magic-link` is the passwordless flow. */
1518
+ type CIAMProviderType = "oidc" | "google" | "github" | "microsoft" | "apple" | "magic-link";
1519
+ /** Branding colors for rendering a provider button in light and dark themes. */
1520
+ type CIAMProviderColors = {
1521
+ /** Background/brand color for light theme (hex or CSS color). */
1522
+ light: string;
1523
+ /** Background/brand color for dark theme (hex or CSS color). */
1524
+ dark: string;
1525
+ /** Optional secondary/accent color. */
1526
+ secondary?: string;
1527
+ };
1528
+ /** Operator-supplied branding so the UI can render a provider list without hardcoding. */
1529
+ type CIAMProviderBranding = {
1530
+ /** Human-readable name shown on the login button (e.g. "Google"). */
1531
+ displayName: string;
1532
+ /** External icon URL (typically an SVG/PNG hosted on a CDN). */
1533
+ iconUrl?: string;
1534
+ /** Light/dark brand colors. */
1535
+ colors?: CIAMProviderColors;
1536
+ /** Optional provider info/marketing URL. */
1537
+ url?: string;
1538
+ };
1539
+ /**
1540
+ * A single CIAM provider declaration. OIDC/OAuth2 endpoint and credential
1541
+ * fields come from the ConfigSource (never application code).
1542
+ */
1543
+ type CIAMProviderConfig = {
1544
+ /** Provider adapter type. Selects defaults and claim mapping. */
1545
+ type: CIAMProviderType;
1546
+ /** Whether this provider is enabled. Defaults to true when omitted. */
1547
+ enabled?: boolean;
1548
+ /** Recommended display order (ascending). Ties broken by declaration order. */
1549
+ order?: number;
1550
+ /** UI branding metadata. */
1551
+ branding?: CIAMProviderBranding;
1552
+ /** OIDC issuer/authority (used for discovery when explicit endpoints are omitted). */
1553
+ authority?: string;
1554
+ /** Authorization endpoint (overrides preset). */
1555
+ authorizationUrl?: string;
1556
+ /** Token endpoint (overrides preset). */
1557
+ tokenUrl?: string;
1558
+ /** JWKS endpoint for ID token verification (overrides preset). */
1559
+ jwksUri?: string;
1560
+ /** OAuth2 UserInfo endpoint for providers without an ID token (e.g. GitHub). */
1561
+ userInfoUrl?: string;
1562
+ /** OAuth2 client id (ConfigSource-only). */
1563
+ clientId?: string;
1564
+ /** OAuth2 client secret (ConfigSource-only). */
1565
+ clientSecret?: string;
1566
+ /** Requested scope (overrides preset). */
1567
+ scope?: string;
1568
+ /** Apple: team id for client-secret generation. */
1569
+ teamId?: string;
1570
+ /** Apple: key id for client-secret generation. */
1571
+ keyId?: string;
1572
+ /** Apple: PKCS#8 PEM private key for client-secret generation. */
1573
+ privateKey?: string;
1574
+ /**
1575
+ * ConfigSource-only. When set, this provider's token claims are derived into session-scoped
1576
+ * customer entitlements at login. Magic link has no issuer and ignores this block.
1577
+ */
1578
+ claimsAsEntitlements?: ClaimsAsEntitlements;
1579
+ /** ConfigSource-only IdP assignment workflow used when IAM assignment is `'idp'`. */
1580
+ accessRequests?: AccessRequestsDestination;
1581
+ };
1582
+ /** Sanitized provider entry returned by the discovery endpoint for the UI. */
1583
+ type CIAMProviderDescriptor = {
1584
+ /** Provider key (matches the RemoteConfig map key); used as `?provider=`. */
1585
+ name: string;
1586
+ type: CIAMProviderType;
1587
+ displayName: string;
1588
+ /** SDK-derived login URL to navigate to (begins the flow). */
1589
+ loginUrl: string;
1590
+ iconUrl?: string;
1591
+ colors?: CIAMProviderColors;
1592
+ url?: string;
1593
+ };
1594
+ /**
1595
+ * Light display cookies (`${cookiesPrefix}.profile`).
1596
+ *
1597
+ * The envelope is SDK-owned. App code supplies only `user`. The cookie is not an
1598
+ * authentication input: the server never reads it to resolve a session, and the browser
1599
+ * may forge it. `expiresAt` is display metadata so a client can order entries without a
1600
+ * round trip; authoritative expiry is the peer `${cookiesPrefix}.session` record.
1601
+ */
1602
+ declare const DISPLAY_COOKIE_SUFFIX = ".profile";
1603
+ declare const DISPLAY_COOKIE_VERSION = 1;
1604
+ declare const DEFAULT_DISPLAY_COOKIE_MAX = 10;
1605
+ declare const DEFAULT_DISCOVERED_COOKIE_MAX = 10;
1606
+ declare const DEFAULT_DISCOVERED_COOKIE_TTL_SECONDS: number;
1607
+ declare const DISCOVERED_COOKIE_PREFIX = "ion.discovered";
1608
+ type DisplayCookieConfig = {
1609
+ /**
1610
+ * When true, the SDK writes a non-HttpOnly display cookie beside the opaque session cookie.
1611
+ * ConfigSource-only. Default false.
1612
+ */
1613
+ enabled?: boolean;
1614
+ /**
1615
+ * How many display cookies a single response may leave on the browser, newest session window
1616
+ * first. ConfigSource-only. Values below 1 fall back to {@link DEFAULT_DISPLAY_COOKIE_MAX}.
1617
+ * @default 10
1618
+ */
1619
+ max?: number;
1620
+ /**
1621
+ * Session-less tenant hints written by an App after an explicit directory lookup.
1622
+ * ConfigSource-only and off unless `enabled` is true.
1623
+ */
1624
+ discovered?: DiscoveredDisplayCookieConfig;
1625
+ };
1626
+ type DiscoveredDisplayCookieConfig = {
1627
+ enabled?: boolean;
1628
+ /** Browser hint lifetime. This is not a session expiry. @default 14400 */
1629
+ ttlSeconds?: number;
1630
+ /** Independent cap; discovered hints never displace live-session entries. @default 10 */
1631
+ max?: number;
1632
+ };
1633
+ /** What `${basePath}/auth/user` and `${basePath}/auth/customer` return. ConfigSource-only. */
1634
+ type UserEndpointPolicy = "full" | "display" | "off";
1635
+ type DisplayUser = Record<string, string | number | boolean | null>;
1636
+ type DisplayAuthType = "sso" | "ciam";
1637
+ type DisplayCookieEnvelope = {
1638
+ v: typeof DISPLAY_COOKIE_VERSION;
1639
+ /**
1640
+ * Session envelopes omit this field (absent means `'session'`) so the wire format stays identical
1641
+ * to cookies written before discovered hints existed; only discovered hints set it explicitly.
1642
+ * Readers must treat `undefined` as `'session'`.
1643
+ */
1644
+ kind?: "session" | "discovered";
1645
+ tenantId?: string;
1646
+ authType: DisplayAuthType;
1647
+ /** ISO timestamp copied from the session window at write time. Display only. */
1648
+ expiresAt: string;
1649
+ user: DisplayUser;
1650
+ tenantName?: string;
1651
+ };
1652
+ type DisplayIdentity = {
1653
+ name?: string;
1654
+ email?: string;
1655
+ avatar?: string;
1656
+ };
1657
+ declare function resolveDisplayCookieMax(max: number | undefined): number;
1658
+ declare function resolveDiscoveredCookieMax(max: number | undefined): number;
1659
+ declare function resolveDiscoveredCookieTtlSeconds(ttlSeconds: number | undefined): number;
1660
+ declare function defaultDisplayUser(identity: DisplayIdentity): DisplayUser;
1661
+ /** Drop non-primitives and auth-bearing keys. Display cookies carry UI fields only. */
1662
+ declare function sanitizeDisplayUser(value: unknown): DisplayUser;
1663
+ /**
1664
+ * AppDev projection runs on the full user (including custom attributes). When omitted, or when it
1665
+ * throws, the cookie carries name, email, and avatar only. Forbidden and non-primitive fields are
1666
+ * dropped either way — a projector cannot put a session id or token into the cookie.
1667
+ */
1668
+ declare function projectDisplayUser<TUser extends object>(user: TUser, projector?: (user: TUser) => unknown): DisplayUser;
1669
+ declare function encodeDisplayCookie(envelope: DisplayCookieEnvelope): string;
1670
+ declare function decodeDisplayCookie(raw: string): DisplayCookieEnvelope | undefined;
1671
+ type ParsedDisplayCookie = {
1672
+ name: string;
1673
+ prefix: string;
1674
+ envelope: DisplayCookieEnvelope;
1675
+ };
1676
+ declare function readDisplayCookies(cookieHeader: string | null | undefined): ParsedDisplayCookie[];
1677
+ /** Client ordering: newest session window first. Invalid timestamps sort last. */
1678
+ declare function compareDisplayExpiryDesc(a: string | undefined, b: string | undefined): number;
1679
+ declare function profileCookieName(cookiesPrefix: string): string;
1680
+ declare function discoveredProfileCookieName(tenantId: string): string;
1681
+ /**
1682
+ * Minimal logger interface compatible with common structured logging patterns.
1683
+ */
1684
+ interface Logger {
1685
+ trace(message?: unknown, ...optionalParams: unknown[]): void;
1686
+ debug(message?: unknown, ...optionalParams: unknown[]): void;
1687
+ info(message?: unknown, ...optionalParams: unknown[]): void;
1688
+ warn(message?: unknown, ...optionalParams: unknown[]): void;
1689
+ error(message?: unknown, ...optionalParams: unknown[]): void;
1690
+ }
1691
+ /**
1692
+ * Renders a structured logger call as one greppable line while leaving the source fields separate
1693
+ * for telemetry exporters.
1694
+ */
1695
+ declare function formatLogLine(level: keyof Logger, message: unknown, optionalParams?: unknown[], timestamp?: Date): string;
1696
+ /**
1697
+ * No-op implementation — does nothing for any log level
1698
+ */
1699
+ declare const silentLogger: Logger;
1700
+ /**
1701
+ * Default logger used until an ionite instance is configured with
1702
+ * an OpenTelemetry-backed logger or an application-provided logger.
1703
+ */
1704
+ declare const defaultLogger: Logger;
1705
+ /**
1706
+ * Logger that logs messages debug, info, warn, and error to the console.
1707
+ */
1708
+ declare const debugLogger: Logger;
1709
+ /**
1710
+ * Logger that logs messages info, warn, and error to the console.
1711
+ */
1712
+ declare const infoLogger: Logger;
1713
+ /**
1714
+ * Logger that logs messages warn and error to the console.
1715
+ */
1716
+ declare const warnLogger: Logger;
1717
+ /**
1718
+ * Human-readable single-line console logger for local application output.
1719
+ */
1720
+ declare const prettyLogger: Logger;
1721
+ import { StandardSchemaV1 as StandardSchemaV15 } from "@standard-schema/spec";
1722
+ type ChangeListener = () => void;
1723
+ /**
1724
+ * Reactive source/adapter contract. Implemented by config-source-backed adapters
1725
+ * (for example `SecretsSource`) to advertise change subscription and source liveness.
1726
+ * `isAvailable()` here is an adapter liveness hook and is intentionally distinct from
1727
+ * module readiness (`ModuleReadiness.isReady()` / `ready()`).
1728
+ */
1729
+ type ReactiveHandle = {
1730
+ beforeChange?(listener: ChangeListener): () => void;
1731
+ afterChange?(listener: ChangeListener): () => void;
1732
+ isAvailable?(): boolean;
1690
1733
  };
1691
1734
  /**
1692
1735
  * Readiness contract for reactive module/service handles whose usability depends on
@@ -1705,54 +1748,423 @@ type ModuleReadiness = {
1705
1748
  isReady?(): boolean;
1706
1749
  ready?(timeout?: number): Promise<void>;
1707
1750
  };
1708
- /**
1709
- * Canonical ionite module names used by the holistic readiness report and the
1710
- * `requireReady([...])` helper. These are the config-driven module handles whose readiness can be
1711
- * composed; `ion.isReady()` itself stays the narrow "config applied" signal and is NOT one of these.
1712
- *
1713
- * IAM-delta egress is intentionally NOT a member. Delta patch-back is best-effort and non-fatal (a
1714
- * failed push only logs `degraded` and is reconciled by a later full sync — the Batch 7 drift-signal
1715
- * contract), so folding it into `iam` readiness would let a delta-target outage make
1716
- * `requireReady(['iam'])` false and take the app out of rotation for a signal that is designed not to
1717
- * block. Apps that DO treat delta as a hard dependency can gate on `ion.iam.delta.isReady()` /
1718
- * `ion.iam.delta.ready()` explicitly instead.
1719
- */
1720
- type ModuleName = "sso" | "ciam" | "iam" | "workload" | "otel" | "secrets" | "kms" | "authz" | "tm";
1721
- /** Per-module readiness snapshot in {@link ReadinessReport}. */
1722
- type ModuleReadinessState = {
1723
- /** Whether the module is active (present/requested) in the effective config. Inactive modules never block readiness. */
1724
- active: boolean;
1725
- /** Synchronous readiness of the module right now (mirrors the module's own `isReady()`). */
1751
+ /**
1752
+ * Canonical ionite module names used by the holistic readiness report and the
1753
+ * `requireReady([...])` helper. These are the config-driven module handles whose readiness can be
1754
+ * composed; `ion.isReady()` itself stays the narrow "config applied" signal and is NOT one of these.
1755
+ *
1756
+ * IAM-delta egress is intentionally NOT a member. Delta patch-back is best-effort and non-fatal (a
1757
+ * failed push only logs `degraded` and is reconciled by a later full sync — the Batch 7 drift-signal
1758
+ * contract), so folding it into `iam` readiness would let a delta-target outage make
1759
+ * `requireReady(['iam'])` false and take the app out of rotation for a signal that is designed not to
1760
+ * block. Apps that DO treat delta as a hard dependency can gate on `ion.iam.delta.isReady()` /
1761
+ * `ion.iam.delta.ready()` explicitly instead.
1762
+ */
1763
+ type ModuleName = "sso" | "ciam" | "iam" | "workload" | "otel" | "secrets" | "kms" | "authz" | "tm";
1764
+ /** Per-module readiness snapshot in {@link ReadinessReport}. */
1765
+ type ModuleReadinessState = {
1766
+ /** Whether the module is active (present/requested) in the effective config. Inactive modules never block readiness. */
1767
+ active: boolean;
1768
+ /** Synchronous readiness of the module right now (mirrors the module's own `isReady()`). */
1769
+ ready: boolean;
1770
+ /** Human-readable explanation when the module is `active` but not `ready`. */
1771
+ reason?: string;
1772
+ };
1773
+ /**
1774
+ * Holistic, read-only readiness snapshot for an ionite instance. Returned by
1775
+ * `ion.readiness()` and used by the built-in `${basePath}/readyz` endpoint. This is composition
1776
+ * DATA, not a request gate: applications combine it (via `ion.requireReady([...])`) with their own
1777
+ * non-ionite dependency checks to build their health endpoints.
1778
+ */
1779
+ type ReadinessReport = {
1780
+ /** True when config has been applied (`applied`) and every ACTIVE module is ready. */
1781
+ ok: boolean;
1782
+ /** Whether RemoteConfig has been applied at least once (mirrors `ion.isReady()`). */
1783
+ applied: boolean;
1784
+ /** Per-module readiness keyed by {@link ModuleName}. */
1785
+ modules: Record<ModuleName, ModuleReadinessState>;
1786
+ /** Most recent config-application outcome (last applied time and last error, if any). */
1787
+ config: ConfigApplyStatus;
1788
+ };
1789
+ /** Result of `ion.requireReady(names)`: a synchronous, declarative readiness gate over selected modules. */
1790
+ type RequireReadyResult = {
1791
+ /** True when config is applied and every requested module is ready. */
1792
+ ok: boolean;
1793
+ /** The requested modules that are not ready, with reasons when available. */
1794
+ notReady: Array<{
1795
+ name: ModuleName;
1796
+ reason?: string;
1797
+ }>;
1798
+ };
1799
+ type CapabilityKey = "sso.login" | "sso.jit" | "sso.logout" | "sso.back_channel_logout" | "sso.claims_authz" | "ciam.magic_link" | "ciam.oidc_login" | "ciam.customer" | "ciam.logout" | "ciam.claims_authz" | "iam.users" | "iam.groups" | "iam.workloads" | "iam.customers" | "workload.incoming" | "workload.outgoing" | "workload.claims_authz" | "authz.oaa" | "authz.access_requests" | "tm.integration";
1800
+ type CapabilityEndpointUrls = {
1801
+ readyzUrl: string;
1802
+ capabilitiezUrl: string;
1803
+ sso: {
1804
+ loginUrl: string;
1805
+ userUrl: string;
1806
+ logoutUrl: string;
1807
+ logoutBackChannelUrl: string;
1808
+ refreshUrl: string;
1809
+ callbackUrl: string;
1810
+ };
1811
+ workload: {
1812
+ validateUrl: string;
1813
+ jwksUrl: string;
1814
+ };
1815
+ iam: {
1816
+ basePath: string;
1817
+ usersUrl: string;
1818
+ groupsUrl: string;
1819
+ workloadsUrl: string;
1820
+ customersUrl: string;
1821
+ };
1822
+ ciam: {
1823
+ magicLinkUrl: string;
1824
+ magicLinkLoginUrl: string;
1825
+ customerUrl: string;
1826
+ customerLoginUrl: string;
1827
+ customerCallbackUrl: string;
1828
+ customerProvidersUrl: string;
1829
+ logoutUrl: string;
1830
+ };
1831
+ };
1832
+ type CapabilityState = {
1833
+ module: ModuleName;
1834
+ active: boolean;
1835
+ ready: boolean;
1836
+ testable: boolean;
1837
+ urls?: string[];
1838
+ reason?: string;
1839
+ };
1840
+ type CapabilitiezManifest = {
1841
+ sdk: {
1842
+ /** Runtime @ionite/server version serving this manifest. */
1843
+ version: string;
1844
+ /** Version of the stable capability/test-unit vocabulary. */
1845
+ catalogVersion: number;
1846
+ };
1847
+ basePath: string;
1848
+ urls: CapabilityEndpointUrls;
1849
+ modules: Record<ModuleName, ModuleReadinessState>;
1850
+ capabilities: Record<CapabilityKey, CapabilityState>;
1851
+ /**
1852
+ * True when FrameworkConfig wired a live LFV callback transport. Boolean only — the transport
1853
+ * object, Redis URL, and credentials are never exposed.
1854
+ */
1855
+ lfvCallbackTransport: boolean;
1856
+ };
1857
+ type OtelSignalName = "traces" | "metrics" | "logs";
1858
+ type OtelProtocol = "http/protobuf" | "http/json";
1859
+ type OtelProviderType = "otlp" | "grafana-lgtm" | "datadog" | "splunk" | "elastic";
1860
+ type OtelLogLevel = "trace" | "debug" | "info" | "warn" | "error";
1861
+ type OtelLevels = Partial<Record<OtelLogLevel, boolean>>;
1862
+ /** Local console mirror policy: disable it or set its minimum emitted severity. */
1863
+ type OtelConsoleMode = "off" | OtelLogLevel;
1864
+ type OtelAttributeValue = string | number | boolean | string[] | number[] | boolean[];
1865
+ type OtelAttributes = Record<string, OtelAttributeValue>;
1866
+ type OtelSignalConfig = {
1867
+ /** Per-signal OTLP endpoint. When omitted, the module appends /v1/{signal} to `endpoint`. */
1868
+ endpoint?: string;
1869
+ headers?: Record<string, string>;
1870
+ timeoutMillis?: number;
1871
+ concurrencyLimit?: number;
1872
+ };
1873
+ type OtelMetricsSignalConfig = OtelSignalConfig & {
1874
+ exportIntervalMillis?: number;
1875
+ exportTimeoutMillis?: number;
1876
+ };
1877
+ type OtelOAuthClientCredentialsConfig = {
1878
+ tokenUrl: string;
1879
+ clientId: string;
1880
+ clientSecret: string;
1881
+ scope?: string;
1882
+ audience?: string;
1883
+ headers?: Record<string, string>;
1884
+ };
1885
+ type OtelLogRecord = {
1886
+ severityNumber?: number;
1887
+ severityText?: string;
1888
+ body?: unknown;
1889
+ attributes?: Record<string, unknown>;
1890
+ };
1891
+ /**
1892
+ * OpenTelemetry config supplied by ConfigSource/RemoteConfig.
1893
+ * Keep environment-specific URLs and credentials here, not in FrameworkConfig.
1894
+ */
1895
+ type OtelConfig = {
1896
+ type?: OtelProviderType;
1897
+ name: string;
1898
+ endpoint?: string;
1899
+ protocol?: OtelProtocol;
1900
+ headers?: Record<string, string>;
1901
+ apiKey?: string;
1902
+ /** Name of a `RemoteConfig.kms` key pool used for exporter authentication. */
1903
+ apiKeyPool?: string;
1904
+ apiKeyHeader?: string;
1905
+ oauth?: OtelOAuthClientCredentialsConfig;
1906
+ version?: string;
1907
+ deploymentEnvironment?: string;
1908
+ resourceAttributes?: OtelAttributes;
1909
+ levels?: OtelLevels;
1910
+ /** `'off'` exports only to OTel; a level dual-emits at or above that severity. Defaults to `'info'`. */
1911
+ console?: OtelConsoleMode;
1912
+ traces?: boolean | OtelSignalConfig;
1913
+ metrics?: boolean | OtelMetricsSignalConfig;
1914
+ logs?: boolean | OtelSignalConfig;
1915
+ };
1916
+ /**
1917
+ * OpenTelemetry app/runtime wiring supplied by code.
1918
+ * Instrumentation instances and callbacks live here because they are framework-specific code.
1919
+ */
1920
+ type FrameworkOtelConfig = {
1921
+ levels?: OtelLevels;
1922
+ instrument?: unknown[];
1923
+ /** Optional app-owned destination/renderer for records admitted by `RemoteConfig.otel.console`. */
1924
+ console?: (record: OtelLogRecord) => void;
1925
+ spanProcessors?: unknown[];
1926
+ metricReaders?: unknown[];
1927
+ logRecordProcessors?: unknown[];
1928
+ sampler?: unknown;
1929
+ textMapPropagator?: unknown;
1930
+ contextManager?: unknown;
1931
+ configure?: (options: Record<string, unknown>) => Record<string, unknown> | void;
1932
+ };
1933
+ type Otel = {
1934
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
1935
+ describe(): OtelDescription;
1936
+ beforeChange(listener: ChangeListener): () => void;
1937
+ afterChange(listener: ChangeListener): () => void;
1938
+ isReady(): boolean;
1939
+ ready(timeout?: number): Promise<void>;
1940
+ logger: Logger;
1941
+ forceFlush(): Promise<void>;
1942
+ shutdown(): Promise<void>;
1943
+ };
1944
+ type ModuleDescriptionBase<TModule extends ModuleName> = {
1945
+ module: TModule;
1946
+ active: boolean;
1947
+ ready: boolean;
1948
+ };
1949
+ type CookieDescription = {
1950
+ prefix?: string;
1951
+ path?: string;
1952
+ secure?: boolean;
1953
+ sameSite?: "Strict" | "Lax";
1954
+ domain?: string;
1955
+ };
1956
+ type SsoDescription = ModuleDescriptionBase<"sso"> & {
1957
+ authority?: string;
1958
+ tokenUrl?: string;
1959
+ authorizationUrl?: string;
1960
+ clientId?: string;
1961
+ redirectUri?: string;
1962
+ responseType?: "code";
1963
+ scope?: string;
1964
+ silentRedirectUri?: string;
1965
+ jwksUri?: string;
1966
+ endSessionEndpoint?: string;
1967
+ revocationEndpoint?: string;
1968
+ cookies: CookieDescription;
1969
+ loginStateTtl?: number;
1970
+ rotationGraceSeconds?: number;
1971
+ sessionWindowSeconds?: number;
1972
+ displayCookie?: DisplayCookieConfig;
1973
+ jit: {
1974
+ enabled: boolean;
1975
+ userStore: boolean;
1976
+ };
1977
+ sessionStore: boolean;
1978
+ /** Present when RemoteConfig configured claim-derived entitlements for this workforce issuer. */
1979
+ claimsAsEntitlements?: ClaimsAsEntitlementsDescription;
1980
+ urls: Partial<CapabilityEndpointUrls["sso"]>;
1981
+ };
1982
+ type CiamProviderDescription = {
1983
+ name: string;
1984
+ type: CIAMProviderType;
1985
+ enabled: boolean;
1986
+ order?: number;
1987
+ branding?: CIAMProviderBranding;
1988
+ authority?: string;
1989
+ authorizationUrl?: string;
1990
+ tokenUrl?: string;
1991
+ jwksUri?: string;
1992
+ userInfoUrl?: string;
1993
+ clientId?: string;
1994
+ scope?: string;
1995
+ claimsAsEntitlements?: ClaimsAsEntitlementsDescription;
1996
+ loginUrl: string;
1997
+ };
1998
+ type CiamDescription = ModuleDescriptionBase<"ciam"> & {
1999
+ magicLinkTtl?: number;
2000
+ loginStateTtl?: number;
2001
+ sessionTtl?: number;
2002
+ cookies: CookieDescription;
2003
+ displayCookie?: DisplayCookieConfig;
2004
+ jit: {
2005
+ enabled: boolean;
2006
+ customerStore: boolean;
2007
+ };
2008
+ sessionStore: boolean;
2009
+ magicLinkStore: boolean;
2010
+ providers: CiamProviderDescription[];
2011
+ urls: Partial<CapabilityEndpointUrls["ciam"]>;
2012
+ };
2013
+ type IamPrincipalDescription = {
2014
+ enabled: boolean;
2015
+ assignment: IamAssignmentPolicy;
2016
+ delta?: "patch";
2017
+ storeWired: boolean;
2018
+ };
2019
+ type AccessRequestsChannelsDescription = {
2020
+ iam?: string;
2021
+ sso?: string;
2022
+ ciam: Record<string, string>;
2023
+ };
2024
+ type IamDescription = ModuleDescriptionBase<"iam"> & {
2025
+ url?: string;
2026
+ deltaAudience?: string;
2027
+ accessRequests: AccessRequestsChannelsDescription;
2028
+ users: IamPrincipalDescription;
2029
+ workloads: IamPrincipalDescription;
2030
+ customers: IamPrincipalDescription;
2031
+ groups: {
2032
+ enabled: boolean;
2033
+ catalogWired: boolean;
2034
+ };
2035
+ urls: Partial<CapabilityEndpointUrls["iam"]>;
2036
+ };
2037
+ type WorkloadTrustedIdpDescription = {
2038
+ issuer: string;
2039
+ jwksUri: string;
2040
+ audience: string | string[];
2041
+ claimsAsEntitlements?: ClaimsAsEntitlementsDescription;
2042
+ };
2043
+ type WorkloadClientDescription = {
2044
+ name: string;
2045
+ ready: boolean;
2046
+ clientId?: string;
2047
+ workloadId?: string;
2048
+ idpTokenUrl?: string;
2049
+ scope?: string;
2050
+ audience?: string;
2051
+ authMethod: "client_secret" | "private_key_jwt" | "server_only";
2052
+ };
2053
+ type WorkloadDescription = ModuleDescriptionBase<"workload"> & {
2054
+ incoming: {
2055
+ trustedIdps: WorkloadTrustedIdpDescription[];
2056
+ };
2057
+ outgoing: WorkloadClientDescription[];
2058
+ urls: Partial<CapabilityEndpointUrls["workload"]>;
2059
+ };
2060
+ type SecretsSourceDescription = {
2061
+ name: string;
2062
+ type: "dev" | "gcp" | "vault" | "aws" | "azure";
2063
+ ready: boolean;
2064
+ url?: string;
2065
+ clientId?: string;
2066
+ authMethod?: string;
2067
+ };
2068
+ type SecretsDescription = ModuleDescriptionBase<"secrets"> & {
2069
+ sources: SecretsSourceDescription[];
2070
+ };
2071
+ type KmsPoolDescription = {
2072
+ name: string;
2073
+ source?: string;
2074
+ path: string;
2075
+ ready: boolean;
2076
+ };
2077
+ type KmsDescription = ModuleDescriptionBase<"kms"> & {
2078
+ pools: KmsPoolDescription[];
2079
+ };
2080
+ type OtelSignalDescription = {
2081
+ enabled: boolean;
2082
+ endpoint?: string;
2083
+ timeoutMillis?: number;
2084
+ concurrencyLimit?: number;
2085
+ exportIntervalMillis?: number;
2086
+ exportTimeoutMillis?: number;
2087
+ };
2088
+ type OtelDescription = ModuleDescriptionBase<"otel"> & {
2089
+ type?: OtelProviderType;
2090
+ name?: string;
2091
+ endpoint?: string;
2092
+ protocol?: OtelProtocol;
2093
+ apiKeyPool?: string;
2094
+ apiKeyHeader?: string;
2095
+ oauth?: {
2096
+ tokenUrl: string;
2097
+ clientId: string;
2098
+ scope?: string;
2099
+ audience?: string;
2100
+ };
2101
+ version?: string;
2102
+ deploymentEnvironment?: string;
2103
+ resourceAttributes?: OtelAttributes;
2104
+ levels?: OtelLevels;
2105
+ console?: OtelConsoleMode;
2106
+ signals: {
2107
+ traces: OtelSignalDescription;
2108
+ metrics: OtelSignalDescription;
2109
+ logs: OtelSignalDescription;
2110
+ };
2111
+ };
2112
+ type OaaDescription = {
1726
2113
  ready: boolean;
1727
- /** Human-readable explanation when the module is `active` but not `ready`. */
1728
- reason?: string;
2114
+ url?: string;
2115
+ providerId?: string;
2116
+ datasourceId?: string;
2117
+ applicationName?: string;
2118
+ applicationType?: string;
2119
+ population?: Record<string, string>;
2120
+ fullSync: boolean;
2121
+ };
2122
+ type AuthzDescription = ModuleDescriptionBase<"authz"> & {
2123
+ trustedProvisioningClients: Array<{
2124
+ issuer: string;
2125
+ audience: string | string[];
2126
+ clientId: string;
2127
+ permissions: string[];
2128
+ }>;
2129
+ oaa?: OaaDescription;
2130
+ stores: {
2131
+ accessStore: boolean;
2132
+ accessIndex: boolean;
2133
+ catalogStore: boolean;
2134
+ resources: boolean;
2135
+ };
1729
2136
  };
1730
- /**
1731
- * Holistic, read-only readiness snapshot for an ionite instance. Returned by
1732
- * `ion.readiness()` and used by the built-in `${basePath}/readyz` endpoint. This is composition
1733
- * DATA, not a request gate: applications combine it (via `ion.requireReady([...])`) with their own
1734
- * non-ionite dependency checks to build their health endpoints.
1735
- */
1736
- type ReadinessReport = {
1737
- /** True when config has been applied (`applied`) and every ACTIVE module is ready. */
2137
+ type TmDescription = ModuleDescriptionBase<"tm"> & {
2138
+ enabled: boolean;
2139
+ integrator?: {
2140
+ id: string;
2141
+ name?: string;
2142
+ url: string;
2143
+ issuer: string;
2144
+ jwksUri: string;
2145
+ audience: string;
2146
+ clientId: string;
2147
+ };
2148
+ consentTtlSeconds?: number;
2149
+ maxRedeemAttempts?: number;
2150
+ };
2151
+ type ModuleDescription = SsoDescription | CiamDescription | IamDescription | WorkloadDescription | SecretsDescription | KmsDescription | OtelDescription | AuthzDescription | TmDescription;
2152
+ type IoniteDescription = {
2153
+ id?: string;
2154
+ sdk: {
2155
+ version: string;
2156
+ catalogVersion: number;
2157
+ };
2158
+ basePath: string;
2159
+ urls: CapabilityEndpointUrls;
1738
2160
  ok: boolean;
1739
- /** Whether RemoteConfig has been applied at least once (mirrors `ion.isReady()`). */
1740
2161
  applied: boolean;
1741
- /** Per-module readiness keyed by {@link ModuleName}. */
1742
- modules: Record<ModuleName, ModuleReadinessState>;
1743
- /** Most recent config-application outcome (last applied time and last error, if any). */
1744
2162
  config: ConfigApplyStatus;
1745
- };
1746
- /** Result of `ion.requireReady(names)`: a synchronous, declarative readiness gate over selected modules. */
1747
- type RequireReadyResult = {
1748
- /** True when config is applied and every requested module is ready. */
1749
- ok: boolean;
1750
- /** The requested modules that are not ready, with reasons when available. */
1751
- notReady: Array<{
1752
- name: ModuleName;
1753
- reason?: string;
2163
+ modules: Record<ModuleName, ModuleReadinessState & {
2164
+ description?: ModuleDescription;
1754
2165
  }>;
1755
2166
  };
2167
+ import { StandardSchemaV1 as StandardSchemaV14 } from "@standard-schema/spec";
1756
2168
  /**
1757
2169
  * Token caching for workload identity authentication.
1758
2170
  *
@@ -1943,12 +2355,10 @@ type WorkloadConfigBase = {
1943
2355
  */
1944
2356
  audience?: string;
1945
2357
  /**
1946
- * Per-IdP intent (incoming/server role only): when `true`, tokens validated against THIS trust
1947
- * anchor have their OAuth `scope` claim auto-honored as entitlements by the request-level `has*`
1948
- * helpers (audience-bound). Mirrors `RemoteConfig.authz.scopesAsEntitlements` but scoped to a single
1949
- * trusted IdP so first-party scopes can be honored while federated/third-party ones are not.
2358
+ * Per-IdP intent (incoming/server role only): token claims from THIS trust anchor may satisfy
2359
+ * `has*` (audience-bound). ConfigSource-only. There is no global fallback.
1950
2360
  */
1951
- scopesAsEntitlements?: boolean;
2361
+ claimsAsEntitlements?: ClaimsAsEntitlements;
1952
2362
  /**
1953
2363
  * Default OAuth2 scopes (space-delimited)
1954
2364
  */
@@ -2058,21 +2468,10 @@ type ClientCredentialsWorkloadConfig = WorkloadConfigBase & {
2058
2468
  */
2059
2469
  clientId: string;
2060
2470
  /**
2061
- * OAuth2 client secret. Omit it to authenticate with a federated token instead
2062
- * (see `federatedTokenFile`). A client secret wins when both are present.
2063
- */
2064
- clientSecret?: string;
2065
- /**
2066
- * Path to a projected federated token (e.g. AKS Workload Identity), sent as a jwt-bearer
2067
- * `client_assertion` in place of `client_secret`. Defaults to `AZURE_FEDERATED_TOKEN_FILE`.
2068
- * Read on every acquisition because the platform rotates it.
2069
- */
2070
- federatedTokenFile?: string;
2071
- /**
2072
- * `managed_identity`: get the token from the platform's managed identity endpoint instead of an
2073
- * IdP token URL. `clientId` is the managed identity's client ID; `scope` names the audience.
2471
+ * OAuth2 client secret
2472
+ * REQUIRED for Client Credentials mode
2074
2473
  */
2075
- authMethod?: "managed_identity";
2474
+ clientSecret: string;
2076
2475
  };
2077
2476
  /**
2078
2477
  * Server-Only Workload Configuration
@@ -2106,7 +2505,7 @@ type ServerOnlyWorkloadConfig = WorkloadConfigBase & {
2106
2505
  * detected based on which fields are present:
2107
2506
  *
2108
2507
  * - **JWT Bearer Grant**: Requires `workload_id` + `private_key`
2109
- * - **Client Credentials**: Requires `client_id` + `client_secret`, a federated token file, or `authMethod: "managed_identity"`
2508
+ * - **Client Credentials**: Requires `client_id` + `client_secret`
2110
2509
  * - **Server-Only**: Only `jwks_uri` (and optionally `issuer`) for token validation
2111
2510
  *
2112
2511
  * The developer uses the same API regardless of mode - the library handles the details.
@@ -2135,8 +2534,8 @@ type TrustedIdp = {
2135
2534
  * one of these values (with `azp` fallback). REQUIRED: prevents cross-app token reuse.
2136
2535
  */
2137
2536
  audience: string | string[];
2138
- /** Per-IdP scopesAsEntitlements intent (see {@link WorkloadConfigBase.scopesAsEntitlements}). */
2139
- scopesAsEntitlements?: boolean;
2537
+ /** Per-IdP claims intent (see {@link WorkloadConfigBase.claimsAsEntitlements}). */
2538
+ claimsAsEntitlements?: ClaimsAsEntitlements;
2140
2539
  };
2141
2540
  /**
2142
2541
  * Workload config with separate incoming (server) and outgoing (client) roles.
@@ -2179,6 +2578,8 @@ interface WorkloadGetToken {
2179
2578
  * Workload Identity Authentication Interface
2180
2579
  */
2181
2580
  type Workload = WorkloadConfig & ModuleReadiness & Required<Pick<ModuleReadiness, "isReady" | "ready">> & {
2581
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
2582
+ describe: () => WorkloadDescription;
2182
2583
  /**
2183
2584
  * Returns a token for this workload configuration.
2184
2585
  * The optional argument overrides the configured default scope.
@@ -2193,7 +2594,9 @@ type Workload = WorkloadConfig & ModuleReadiness & Required<Pick<ModuleReadiness
2193
2594
  /** Framework-agnostic request handler for the Workload module (token, validate, jwks, refresh). */
2194
2595
  handler: (request: Request) => Promise<Response>;
2195
2596
  };
2196
- type WorkloadClient = Pick<Workload, "getToken" | "refreshToken" | "generateJWTAssertion" | "revokeToken" | "beforeChange" | "afterChange" | "isReady" | "ready">;
2597
+ type WorkloadClient = Pick<Workload, "getToken" | "refreshToken" | "generateJWTAssertion" | "revokeToken" | "beforeChange" | "afterChange" | "isReady" | "ready"> & {
2598
+ describe(): WorkloadClientDescription;
2599
+ };
2197
2600
  /**
2198
2601
  * SCIM Error response structure
2199
2602
  */
@@ -2367,6 +2770,7 @@ type IAMAccessRequestsConfig = {
2367
2770
  request: AccessRequestResult;
2368
2771
  created: boolean;
2369
2772
  }>;
2773
+ get?: (id: string) => Promise<AccessRequestResult | undefined>;
2370
2774
  };
2371
2775
  type IAMEntitlementRequestUrlContext = {
2372
2776
  request: Request;
@@ -2624,6 +3028,8 @@ type IAMUsersInbound = {
2624
3028
  * - `users_inbound` is available when `userStore` is configured
2625
3029
  */
2626
3030
  type IAM = Omit<IAMConfig, "users" | "workloads" | "customers" | "groups"> & {
3031
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
3032
+ describe: () => IamDescription;
2627
3033
  users: IamPrincipalKind;
2628
3034
  workloads: IamPrincipalKind;
2629
3035
  customers: IamPrincipalKind;
@@ -2808,6 +3214,8 @@ type KmsPoolSlot = {
2808
3214
  ready(timeout?: number): Promise<void>;
2809
3215
  };
2810
3216
  type KmsPool = {
3217
+ /** Secret-free, JSON-serializable pool configuration and readiness summary. */
3218
+ describe(): KmsPoolDescription;
2811
3219
  /**
2812
3220
  * Returns the current granted key for slot 0. Calls wait on one shared local subscription until a
2813
3221
  * grant is available; repeated calls resolve from the local cache and never initiate a vault request.
@@ -2840,6 +3248,8 @@ type KmsPool = {
2840
3248
  * (`ion.kms.<name>`); use `getPool(name)` when the name is dynamic.
2841
3249
  */
2842
3250
  type Kms = ModuleReadiness & {
3251
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
3252
+ describe(): KmsDescription;
2843
3253
  readonly config: Readonly<KmsConfig>;
2844
3254
  listPools(): string[];
2845
3255
  getPool(name: string): KmsPool;
@@ -2850,91 +3260,6 @@ type Kms = ModuleReadiness & {
2850
3260
  declare function parseKmsPoolDocument(value: unknown): KmsPoolDocument;
2851
3261
  /** Parse and fail closed on a vault-stored KMS key-material document. */
2852
3262
  declare function parseKmsPoolControlDocument(value: unknown): KmsPoolControlDocument;
2853
- type OtelSignalName = "traces" | "metrics" | "logs";
2854
- type OtelProtocol = "http/protobuf" | "http/json";
2855
- type OtelProviderType = "otlp" | "grafana-lgtm" | "datadog" | "splunk" | "elastic";
2856
- type OtelLogLevel = "trace" | "debug" | "info" | "warn" | "error";
2857
- type OtelLevels = Partial<Record<OtelLogLevel, boolean>>;
2858
- /** Local console mirror policy: disable it or set its minimum emitted severity. */
2859
- type OtelConsoleMode = "off" | OtelLogLevel;
2860
- type OtelAttributeValue = string | number | boolean | string[] | number[] | boolean[];
2861
- type OtelAttributes = Record<string, OtelAttributeValue>;
2862
- type OtelSignalConfig = {
2863
- /** Per-signal OTLP endpoint. When omitted, the module appends /v1/{signal} to `endpoint`. */
2864
- endpoint?: string;
2865
- headers?: Record<string, string>;
2866
- timeoutMillis?: number;
2867
- concurrencyLimit?: number;
2868
- };
2869
- type OtelMetricsSignalConfig = OtelSignalConfig & {
2870
- exportIntervalMillis?: number;
2871
- exportTimeoutMillis?: number;
2872
- };
2873
- type OtelOAuthClientCredentialsConfig = {
2874
- tokenUrl: string;
2875
- clientId: string;
2876
- clientSecret: string;
2877
- scope?: string;
2878
- audience?: string;
2879
- headers?: Record<string, string>;
2880
- };
2881
- type OtelLogRecord = {
2882
- severityNumber?: number;
2883
- severityText?: string;
2884
- body?: unknown;
2885
- attributes?: Record<string, unknown>;
2886
- };
2887
- /**
2888
- * OpenTelemetry config supplied by ConfigSource/RemoteConfig.
2889
- * Keep environment-specific URLs and credentials here, not in FrameworkConfig.
2890
- */
2891
- type OtelConfig = {
2892
- type?: OtelProviderType;
2893
- name: string;
2894
- endpoint?: string;
2895
- protocol?: OtelProtocol;
2896
- headers?: Record<string, string>;
2897
- apiKey?: string;
2898
- /** Name of a `RemoteConfig.kms` key pool used for exporter authentication. */
2899
- apiKeyPool?: string;
2900
- apiKeyHeader?: string;
2901
- oauth?: OtelOAuthClientCredentialsConfig;
2902
- version?: string;
2903
- deploymentEnvironment?: string;
2904
- resourceAttributes?: OtelAttributes;
2905
- levels?: OtelLevels;
2906
- /** `'off'` exports only to OTel; a level dual-emits at or above that severity. Defaults to `'info'`. */
2907
- console?: OtelConsoleMode;
2908
- traces?: boolean | OtelSignalConfig;
2909
- metrics?: boolean | OtelMetricsSignalConfig;
2910
- logs?: boolean | OtelSignalConfig;
2911
- };
2912
- /**
2913
- * OpenTelemetry app/runtime wiring supplied by code.
2914
- * Instrumentation instances and callbacks live here because they are framework-specific code.
2915
- */
2916
- type FrameworkOtelConfig = {
2917
- levels?: OtelLevels;
2918
- instrument?: unknown[];
2919
- /** Optional app-owned destination/renderer for records admitted by `RemoteConfig.otel.console`. */
2920
- console?: (record: OtelLogRecord) => void;
2921
- spanProcessors?: unknown[];
2922
- metricReaders?: unknown[];
2923
- logRecordProcessors?: unknown[];
2924
- sampler?: unknown;
2925
- textMapPropagator?: unknown;
2926
- contextManager?: unknown;
2927
- configure?: (options: Record<string, unknown>) => Record<string, unknown> | void;
2928
- };
2929
- type Otel = {
2930
- beforeChange(listener: ChangeListener): () => void;
2931
- afterChange(listener: ChangeListener): () => void;
2932
- isReady(): boolean;
2933
- ready(timeout?: number): Promise<void>;
2934
- logger: Logger;
2935
- forceFlush(): Promise<void>;
2936
- shutdown(): Promise<void>;
2937
- };
2938
3263
  /**
2939
3264
  * Session management for tracking user sessions and enabling backchannel logout.
2940
3265
  *
@@ -3027,6 +3352,12 @@ type Session<TExtended = object> = {
3027
3352
  */
3028
3353
  claims?: Record<string, unknown>;
3029
3354
  /**
3355
+ * Entitlements derived from token claims at login and refresh. Session-scoped: they die with the
3356
+ * record (TTL, rotation, back-channel logout) and are never written to the access stores.
3357
+ * Only meaningful when the store declares {@link SessionStoreCapabilities.derivedEntitlements}.
3358
+ */
3359
+ entitlements?: DerivedEntitlement[];
3360
+ /**
3030
3361
  * Optional access-token claims for modules that keep access/id claims separate.
3031
3362
  */
3032
3363
  accessClaims?: Record<string, unknown>;
@@ -3063,7 +3394,21 @@ type Session<TExtended = object> = {
3063
3394
  * }
3064
3395
  * ```
3065
3396
  */
3397
+ /**
3398
+ * Store-declared capabilities. The SDK does not probe a custom store (a write at init is forbidden);
3399
+ * a store that omits the declaration is treated as incapable.
3400
+ */
3401
+ type SessionStoreCapabilities = {
3402
+ /**
3403
+ * The store persists {@link Session.entitlements} round-trip. JSON-backed stores (the SDK Redis
3404
+ * and in-memory implementations) declare this. A column-mapped SQL store declares it only after
3405
+ * it has a column for the derived set.
3406
+ */
3407
+ derivedEntitlements?: boolean;
3408
+ };
3066
3409
  interface SessionStore<TExtended = object> {
3410
+ /** Declaration of what this store persists beyond the required session fields. */
3411
+ readonly capabilities?: SessionStoreCapabilities;
3067
3412
  /**
3068
3413
  * Create a new session in the store.
3069
3414
  *
@@ -3396,6 +3741,13 @@ type SSOConfig<
3396
3741
  */
3397
3742
  userStore?: UserStore<TUserData>;
3398
3743
  /**
3744
+ * ConfigSource-only. When set, the named token claims are derived into session-scoped
3745
+ * entitlements at login and refresh. Never set from application code.
3746
+ */
3747
+ claimsAsEntitlements?: ClaimsAsEntitlements;
3748
+ /** ConfigSource-only IdP assignment workflow used when IAM assignment is `'idp'`. */
3749
+ accessRequests?: AccessRequestsDestination;
3750
+ /**
3399
3751
  * Enable Just-In-Time (JIT) user provisioning.
3400
3752
  * When enabled, new users are automatically created in the userStore on their first login.
3401
3753
  * When disabled (default), only existing users in the userStore are updated on login.
@@ -3495,6 +3847,8 @@ type SSO<
3495
3847
  TSessionData = Record<string, never>,
3496
3848
  TUserData = Record<string, never>
3497
3849
  > = SSOConfig<TSessionData, TUserData> & {
3850
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
3851
+ describe: () => SsoDescription;
3498
3852
  getUser: (request: Request) => Promise<WorkforceUser | undefined>;
3499
3853
  /**
3500
3854
  * Degraded-aware resolution: distinguishes a signed-out visitor (`unauthenticated`) from a failed
@@ -3842,7 +4196,12 @@ type SecretsValidators = {
3842
4196
  */
3843
4197
  validateSourceConfig?(sourceName: string, config: SecretsSourceConfig): void;
3844
4198
  };
4199
+ type DescribedSecretsSource = SecretsSource & {
4200
+ describe(): SecretsSourceDescription;
4201
+ };
3845
4202
  type Secrets = ModuleReadiness & {
4203
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
4204
+ describe(): SecretsDescription;
3846
4205
  /**
3847
4206
  * Liveness across configured sources. Returns false when any ready source reports a degraded
3848
4207
  * `isAvailable()` (e.g. an HTTP-poll source whose upstream is failing). Surfaced in
@@ -3854,7 +4213,7 @@ type Secrets = ModuleReadiness & {
3854
4213
  /** Returns configured secrets source names/keys. */
3855
4214
  listSecretsSources(): string[];
3856
4215
  /** Gets a named secrets source client. Throws when missing. */
3857
- getSecretsSource(sourceName: string): SecretsSource;
4216
+ getSecretsSource(sourceName: string): DescribedSecretsSource;
3858
4217
  /** Creates a lazy handle for a secret in a named source. */
3859
4218
  get(sourceName: string, path: string, options?: SecretsOperationOptions): SecretHandle;
3860
4219
  /** Reads a secret from a named secrets source client. */
@@ -4304,17 +4663,6 @@ type TrustedProvisioningClient = {
4304
4663
  type AuthzConfig = {
4305
4664
  oaa?: AuthzOaaConfig;
4306
4665
  /**
4307
- * RemoteConfig/Ops-governed intent. When `true`, the request-level `has*` helpers auto-honor a
4308
- * principal's OAuth token `scope` claims as entitlements: an app-wide check (no `resource` arg)
4309
- * also allows when the target id matches a granted scope. Default `false` (secure): scopes never
4310
- * satisfy `has*` and authorization comes solely from the `AccessAssignmentStore`/`AccessIndex` (IAM/SCIM).
4311
- * Read at check time so it can be flipped live. This NEVER affects token validation, and the
4312
- * explicit `hasScope*` helpers are always available regardless of this flag. Resource-scoped
4313
- * checks (a `resource` arg supplied) are never satisfied by scopes. For workload principals this is
4314
- * a fallback only: a matched trusted IdP's per-entry `scopesAsEntitlements` takes precedence.
4315
- */
4316
- scopesAsEntitlements?: boolean;
4317
- /**
4318
4666
  * Config-declared trusted provisioning clients (read-path overlay; ConfigSource/ECI-owned). Each
4319
4667
  * entry pre-authorizes a workload client to hold specific permissions without a stored grant. See
4320
4668
  * {@link TrustedProvisioningClient}. Honored in the request-level `has*` helpers BEFORE the
@@ -4395,11 +4743,11 @@ type FrameworkConfig = {
4395
4743
  * `afterLogout` callbacks, which are code-only and therefore kept. RemoteConfig-only intent flags (e.g. IAM `users`/`groups`
4396
4744
  * enablement) are also stripped from code.
4397
4745
  */
4398
- type SSOConfigFromCode = Omit<SSOConfig, "loginUrl" | "userUrl" | "logoutUrl" | "logoutBackChannelUrl" | "refreshUrl" | "redirectUri">;
4746
+ type SSOConfigFromCode = Omit<SSOConfig, "loginUrl" | "userUrl" | "logoutUrl" | "logoutBackChannelUrl" | "refreshUrl" | "redirectUri" | "claimsAsEntitlements" | "accessRequests">;
4399
4747
  type IAMConfigFromCode = Omit<IAMConfig, "usersUrl" | "groupsUrl" | "workloadsUrl" | "customersUrl" | "users" | "workloads" | "customers" | "groups" | "discovery" | "deltaAudience"> & {
4400
4748
  discovery?: Omit<IAMDiscoveryConfig, "basePath">;
4401
4749
  };
4402
- type WorkloadServerConfigFromCode = Omit<Partial<WorkloadConfig>, "tokenUrl" | "validateUrl" | "jwksUrl" | "refreshUrl">;
4750
+ type WorkloadServerConfigFromCode = Omit<Partial<WorkloadConfig>, "tokenUrl" | "validateUrl" | "jwksUrl" | "refreshUrl" | "claimsAsEntitlements">;
4403
4751
  type FrameworkWorkloadConfigFromCode = WorkloadServerConfigFromCode | {
4404
4752
  incoming?: WorkloadServerConfigFromCode;
4405
4753
  outgoing?: FrameworkWorkloadIncomingOutgoing["outgoing"];
@@ -4818,6 +5166,8 @@ type CIAM<
4818
5166
  TMagicLinkData = Record<string, never>,
4819
5167
  TCustomerData = Record<string, never>
4820
5168
  > = CIAMConfig<TMagicLinkData, TCustomerData> & {
5169
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
5170
+ describe: () => CiamDescription;
4821
5171
  getCustomer: (request: Request) => Promise<Customer | undefined>;
4822
5172
  /**
4823
5173
  * Degraded-aware resolution: distinguishes a signed-out visitor (`unauthenticated`) from a failed
@@ -4961,6 +5311,15 @@ type IoniteBase = {
4961
5311
  * module is ready; `notReady` lists the requested modules that are not ready, with reasons.
4962
5312
  */
4963
5313
  requireReady(names: ModuleName[]): RequireReadyResult;
5314
+ /**
5315
+ * Returns an allow-listed, JSON-serializable snapshot for privileged App-owned diagnostics.
5316
+ * Unlike `config`, this never contains credentials, secret values, stores, or callbacks.
5317
+ *
5318
+ * Diagnostics only: each call rebuilds the readiness report and every module projection. Call it
5319
+ * from an admin loader, never per request; handlers and health probes use `isReady()` /
5320
+ * `requireReady()`.
5321
+ */
5322
+ describe(): IoniteDescription;
4964
5323
  /** Most recent RemoteConfig application outcome (last applied time and last error, if any). */
4965
5324
  configStatus: ConfigApplyStatus;
4966
5325
  /** Release config subscriptions and background resources. */
@@ -4981,8 +5340,8 @@ type ResolvedRoute = {
4981
5340
  /**
4982
5341
  * Authorization required to invoke this route. When set, the router enforces it (deny-by-default)
4983
5342
  * before the handler runs: the caller must hold the {@link EndpointPermission.permission} as a
4984
- * granted entitlement, or—when `RemoteConfig.authz.scopesAsEntitlements` is enabled—carry the
4985
- * matching OAuth scope. Login/public/discovery routes omit it.
5343
+ * granted entitlement, or a claim-derived entitlement from the issuing IdP's `claimsAsEntitlements`
5344
+ * block. Login/public/discovery routes omit it.
4986
5345
  *
4987
5346
  * Three states, chosen so a custom `resolve` cannot silently drop authorization by omission:
4988
5347
  * - a permission object → enforce it;
@@ -5046,7 +5405,10 @@ type ConfigChangeOptions = {
5046
5405
  type EnvironmentType = "POC" | "DEV" | "QA" | "PROD";
5047
5406
  type TenantStatus = "pending" | "processing" | "completed" | "failed" | "action_required";
5048
5407
  type CreateTenantRequestBase = {
5408
+ /** App-owned routing key. The integrator may suggest it; the App may reject a collision. */
5049
5409
  id: string;
5410
+ /** Stable tenant id in the integrator/ionite domain. */
5411
+ integratorTenantId: string;
5050
5412
  companyId: string;
5051
5413
  companyName: string;
5052
5414
  environmentType: EnvironmentType;
@@ -5058,8 +5420,9 @@ type CreateTenantRequestBase = {
5058
5420
  };
5059
5421
  /**
5060
5422
  * Body for creating a tenant (`POST ${basePath}`). `configLocator` may be supplied immediately or
5061
- * patched later after the tenant's ConfigSource has been provisioned. Idempotent by `id`:
5062
- * re-submitting the same `id` re-applies the record (safe for provisioning retries).
5423
+ * patched later after the tenant's ConfigSource has been provisioned. Idempotent by
5424
+ * `integratorTenantId`: re-submitting that id re-applies the existing App tenant even when its
5425
+ * App-owned `id` differs from the integrator's original suggestion.
5063
5426
  */
5064
5427
  type CreateTenantRequest<TExtended extends object = object> = CreateTenantRequestBase & TExtended;
5065
5428
  /**
@@ -5133,7 +5496,10 @@ type TenantValidators<
5133
5496
  };
5134
5497
  declare function isConfigLocator(value: unknown): value is ConfigLocator;
5135
5498
  type BaseTenant = {
5499
+ /** App-owned routing key. */
5136
5500
  id: string;
5501
+ /** Stable tenant id in the integrator/ionite domain, once this tenant is known to ionite. */
5502
+ integratorTenantId?: string;
5137
5503
  companyId: string;
5138
5504
  companyName: string;
5139
5505
  environmentType: EnvironmentType;
@@ -5240,9 +5606,15 @@ type FrameworkTmConfig<TTenant extends BaseTenant = BaseTenant> = {
5240
5606
  exportConfig?: (context: {
5241
5607
  tenant: TTenant;
5242
5608
  }) => ConfigExportEnvelope | Promise<ConfigExportEnvelope>;
5609
+ /**
5610
+ * Runs after a consented tenant runtime has successfully applied config through the newly
5611
+ * persisted destination locator. Cleanup must be idempotent because another App replica may
5612
+ * observe the same handover concurrently.
5613
+ */
5243
5614
  onHandoverApplied?: (context: {
5244
5615
  tenant: TTenant;
5245
5616
  previousLocator?: ConfigLocator;
5617
+ destinationLocator: ConfigLocator;
5246
5618
  }) => void | Promise<void>;
5247
5619
  /** Runs after a tenant POST has durably upserted its row. Awaited; the return value is ignored and failures are logged without rolling back the tenant. */
5248
5620
  onTenantCreated?: (context: {
@@ -5272,6 +5644,8 @@ type TenantIntegrationView = {
5272
5644
  integration: TenantIntegration;
5273
5645
  };
5274
5646
  type TenantManagement<TTenant extends BaseTenant = BaseTenant> = ModuleReadiness & {
5647
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
5648
+ describe(): TmDescription;
5275
5649
  handler(request: Request): Promise<Response>;
5276
5650
  getTenant(id: string): Promise<TTenant | undefined>;
5277
5651
  recordConsent(input: RecordTenantConsentInput): Promise<TTenant>;
@@ -5335,6 +5709,7 @@ interface TenantStore<TTenant extends BaseTenant = BaseTenant> {
5335
5709
  getIon(id: string): Promise<Ionite | undefined>;
5336
5710
  setIntegration?(tenantId: string, integration: TenantIntegration | undefined, options?: SetTenantIntegrationOptions): Promise<TTenant | undefined>;
5337
5711
  getByIntegrationHandleHash?(handleHash: string): Promise<TTenant | undefined>;
5712
+ getByIntegratorTenantId(integratorTenantId: string): Promise<TTenant | undefined>;
5338
5713
  }
5339
5714
  type InMemoryTenantStoreOptions = {
5340
5715
  /**
@@ -5948,6 +6323,8 @@ interface OaaClient<
5948
6323
  TCustomer = BaseCustomer,
5949
6324
  TWorkload = BaseWorkloadIdentity
5950
6325
  > {
6326
+ /** Secret-free, JSON-serializable OAA configuration and readiness summary. */
6327
+ describe(): OaaDescription;
5951
6328
  pushUser(user: TUser): Promise<void>;
5952
6329
  pushCustomer(customer: TCustomer): Promise<void>;
5953
6330
  pushWorkload(workload: TWorkload): Promise<void>;
@@ -6066,6 +6443,8 @@ type ReconcileReport = {
6066
6443
  * wired they deny by default (`{ allow: false }`, `metadata.reason = 'access_index_not_configured'`).
6067
6444
  */
6068
6445
  type Authz = {
6446
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
6447
+ describe(): AuthzDescription;
6069
6448
  oaa: OaaClient;
6070
6449
  /** Read the effective catalog union (materialized rows plus unmaterialized code templates). */
6071
6450
  entitlements: {
@@ -6117,9 +6496,9 @@ type Authz = {
6117
6496
  */
6118
6497
  grant(change: AccessChange): Promise<AccessChange>;
6119
6498
  /**
6120
- * Submit one grant or revoke request on a principal's behalf. Allowed only when that kind's
6121
- * assignment policy is `'iam-request'`. One operation maps to one approval decision, status,
6122
- * and tracking URL. Authenticated with the module-wide `deltaAudience` workload client.
6499
+ * Submit one grant or revoke request on a principal's behalf. Under `'iam-request'`, targets the
6500
+ * IAM destination; under `'idp'`, targets the claims-bearing SSO/CIAM provider. One operation
6501
+ * maps to one approval decision, status, and tracking URL.
6123
6502
  */
6124
6503
  requestAccess(change: {
6125
6504
  subject: AccessChange["subject"];
@@ -6128,6 +6507,20 @@ type Authz = {
6128
6507
  target: AccessChange["target"];
6129
6508
  operation: "grant" | "revoke";
6130
6509
  justification?: string;
6510
+ /** CIAM provider key. Required only when multiple providers expose an AccessRequests channel. */
6511
+ provider?: string;
6512
+ }): Promise<{
6513
+ id: string;
6514
+ status: "pending" | "approved" | "denied";
6515
+ operation: "grant" | "revoke";
6516
+ trackingUrl: string;
6517
+ }>;
6518
+ /** Read the destination-owned state of an on-behalf access request. */
6519
+ getAccessRequest(input: {
6520
+ id: string;
6521
+ subjectType: SubjectType;
6522
+ /** CIAM provider key. Required only when multiple providers expose an AccessRequests channel. */
6523
+ provider?: string;
6131
6524
  }): Promise<{
6132
6525
  id: string;
6133
6526
  status: "pending" | "approved" | "denied";
@@ -6147,8 +6540,10 @@ type Authz = {
6147
6540
  * - `'iam'` — never assign in-app; show a request link (or a read-only entitlement table).
6148
6541
  * - `'iam-request'` — never assign in-app; the app submits a request on the principal's behalf via
6149
6542
  * {@link Authz.requestAccess}.
6543
+ * - `'idp'` — the claims-bearing SSO/CIAM provider is assigner of record; requests use that
6544
+ * provider's ConfigSource-owned AccessRequests channel.
6150
6545
  */
6151
- type IamAssignmentPolicy = "app" | "iam" | "iam-request";
6546
+ type IamAssignmentPolicy = "app" | "iam" | "iam-request" | "idp";
6152
6547
  /**
6153
6548
  * Thrown by {@link Authz.grant} when the Ops-owned assignment policy forbids in-app assignment.
6154
6549
  * `requestUrl` is the IAM-written entitlement receipt when one exists, so the app can send the
@@ -6199,64 +6594,6 @@ declare function trustedClientPermissionsForPrincipal(authz: AuthzConfig | null
6199
6594
  * OAA full sync — they are NEVER written to a store or materialized into the AccessIndex.
6200
6595
  */
6201
6596
  declare function configTrustedClientGrants(authz: AuthzConfig | null | undefined): AccessChange[];
6202
- type CapabilityKey = "sso.login" | "sso.jit" | "sso.logout" | "sso.back_channel_logout" | "ciam.magic_link" | "ciam.oidc_login" | "ciam.customer" | "ciam.logout" | "iam.users" | "iam.groups" | "iam.workloads" | "iam.customers" | "workload.incoming" | "workload.outgoing" | "authz.oaa" | "tm.integration";
6203
- type CapabilityEndpointUrls = {
6204
- readyzUrl: string;
6205
- capabilitiezUrl: string;
6206
- sso: {
6207
- loginUrl: string;
6208
- userUrl: string;
6209
- logoutUrl: string;
6210
- logoutBackChannelUrl: string;
6211
- refreshUrl: string;
6212
- callbackUrl: string;
6213
- };
6214
- workload: {
6215
- validateUrl: string;
6216
- jwksUrl: string;
6217
- };
6218
- iam: {
6219
- basePath: string;
6220
- usersUrl: string;
6221
- groupsUrl: string;
6222
- workloadsUrl: string;
6223
- customersUrl: string;
6224
- };
6225
- ciam: {
6226
- magicLinkUrl: string;
6227
- magicLinkLoginUrl: string;
6228
- customerUrl: string;
6229
- customerLoginUrl: string;
6230
- customerCallbackUrl: string;
6231
- customerProvidersUrl: string;
6232
- logoutUrl: string;
6233
- };
6234
- };
6235
- type CapabilityState = {
6236
- module: ModuleName;
6237
- active: boolean;
6238
- ready: boolean;
6239
- testable: boolean;
6240
- urls?: string[];
6241
- reason?: string;
6242
- };
6243
- type CapabilitiezManifest = {
6244
- sdk: {
6245
- /** Runtime @ionite/server version serving this manifest. */
6246
- version: string;
6247
- /** Version of the stable capability/test-unit vocabulary. */
6248
- catalogVersion: number;
6249
- };
6250
- basePath: string;
6251
- urls: CapabilityEndpointUrls;
6252
- modules: Record<ModuleName, ModuleReadinessState>;
6253
- capabilities: Record<CapabilityKey, CapabilityState>;
6254
- /**
6255
- * True when FrameworkConfig wired a live LFV callback transport. Boolean only — the transport
6256
- * object, Redis URL, and credentials are never exposed.
6257
- */
6258
- lfvCallbackTransport: boolean;
6259
- };
6260
6597
  /**
6261
6598
  * Fields a {@link ConfigSource} may attach to a thrown error so the SDK can classify load/subscribe
6262
6599
  * failures structurally instead of by fragile message-substring matching (§2.1). All fields are
@@ -6625,4 +6962,4 @@ type LfvErrorResponse = {
6625
6962
  };
6626
6963
  /** Generates a ULID */
6627
6964
  declare function generateULID(prefix?: string): string;
6628
- export { ACCEPT_JSON, ACCEPT_OCTET_STREAM, ACCEPT_SCIM, ACCEPT_XML, AccessAssignmentStore, AccessCatalogStore, AccessChange, AccessCheckReason, AccessCheckResult, AccessCheckTarget, AccessIndex, AccessMutationResult, AccessMutationStatus, AccessProvenance, AccessRef, AccessRequestCreate, AccessRequestResult, AccessStatus, Address, ApplicationValidators, AssignmentPolicyError, AuthenticatedPrincipal, AuthenticatedUser, Authz, AuthzConfig, AuthzDecision, AuthzEntityBase, AuthzOaaConfig, AuthzOaaPrincipalConfig, AuthzScimGroupExtension, AuthzScimGroupType, AwsConfigLocator, AwsSecretsConfig, AzureAuthMethod, AzureConfigLocator, AzureSecretsConfig, BaseCustomer, BaseTenant, BaseUser, BaseWorkloadIdentity, CANONICAL_RISK_LEVELS, CIAM, CIAMConfig, CIAMConfigFromCode, CIAMConfigFromCodeInput, CIAMProviderBranding, CIAMProviderColors, CIAMProviderConfig, CIAMProviderDescriptor, CIAMProviderType, CIAMValidators, CONTENT_TYPE_FORM, CONTENT_TYPE_JSON, CONTENT_TYPE_OCTET_STREAM, CONTENT_TYPE_SCIM, CONTENT_TYPE_XML, CacheConfig, CachedWorkloadToken, CapabilitiezManifest, CapabilityEndpointUrls, CapabilityKey, CapabilityState, CatalogChange, CatalogChangeKind, CatalogChangeListener, CatalogEntityKind, ChangeListener, ClientCredentialsWorkloadConfig, CodeCatalog, CodeCatalogInput, CodeCatalogNamespace, ConfigApplyStatus, ConfigChangeCallback, ConfigChangeOptions, ConfigChangeResult, ConfigErrorKind, ConfigExportEnvelope, ConfigLocator, ConfigSource, ConfigSourceEnv, ConfigSourceError, ConfigSourceErrorInit, ConfigSourceResolver, ConfigSourceType, ConfigSubscriptionOptions, ConnectRequestContext, CreateGroupOptions, CreateTenantRequest, CreateUserOptions, Customer, CustomerStore, CustomerStoreOptions, DEFAULT_DISCOVERED_COOKIE_MAX, DEFAULT_DISCOVERED_COOKIE_TTL_SECONDS, DEFAULT_DISPLAY_COOKIE_MAX, DEFAULT_RISK_LEVEL, DEFAULT_SECRET_MIME_TYPES, DEFAULT_TENANT_API_NAMESPACE, DEFAULT_TENANT_UI_NAMESPACE, DISCOVERED_COOKIE_PREFIX, DISPLAY_COOKIE_SUFFIX, DISPLAY_COOKIE_VERSION, DestinationReference, DevSecretsConfig, DiscoveredDisplayCookieConfig, DisplayAuthType, DisplayCookieConfig, DisplayCookieEnvelope, DisplayIdentity, DisplayUser, ECID_SCHEME, EcidFormatError, EffectiveEdge, EgressChannelOutcome, EgressOutcome, Email, EndpointOperation, EndpointPermission, EnterpriseExtension, Entitlement, EntitlementType, EntityStore, EnvironmentType, FORM_MEDIA_TYPE, FrameworkConfig, FrameworkConfigInput, FrameworkLfvConfig, FrameworkOtelConfig, FrameworkSecretsModuleConfig, FrameworkSecretsSourceConfig, FrameworkStores, FrameworkTmConfig, FrameworkWorkloadConfig, FrameworkWorkloadConfigFromCode, FrameworkWorkloadIncomingOutgoing, GcpConfigLocator, GcpSecretsConfig, Group, GroupMember, GroupResource, GroupsInboundHandlerConfig, IAM, IAMAccessRequestsConfig, IAMAppRegistry, IAMAppValidators, IAMConfig, IAMConfigFromCode, IAMDiscoveryConfig, IAMDiscoveryContext, IAMDiscoveryHandlerConfig, IAMEndpointFlag, IAMGroupsInbound, IAMGroupsOutbound, IAMHandlerConfig, IAMInboundCustomersConfig, IAMInboundPrincipalContext, IAMInboundUserContext, IAMInboundUsersConfig, IAMInboundWorkloadsConfig, IAMPrincipalsInbound, IAMUsersInbound, IAMValidators, ION_AUTHZ_GROUP_SCHEMA, ION_AUTHZ_OAA_SYNC, ION_CAPABILITIEZ_READ, ION_CIAM_MAGIC_LINK_CREATE, ION_ENDPOINT_PERMISSIONS, ION_IAM_ACCESS_REQUESTS_WRITE, ION_IAM_CUSTOMERS_WRITE, ION_IAM_GROUPS_WRITE, ION_IAM_READ, ION_IAM_USERS_WRITE, ION_IAM_WORKLOADS_WRITE, ION_SCIM_CUSTOMER_SCHEMA, ION_SCIM_USER_EXTENSION_URN, ION_SCIM_WORKLOAD_SCHEMA, ION_SDK_PERMISSIONS, ION_TENANT_MANAGE, IamAssignmentPolicy, IamDeltaEmitter, IamDeltaMode, IamDeltaReconcileInput, IamDeltaReconcileResult, IamDeltaResourceType, IamPrincipalKind, IamPrincipalKindFlag, IdTokenClaims, IdentityResolution, InMemoryTenantStoreOptions, InferSecretType, Ionite, IoniteBase, IoniteError, IoniteErrorOptions, IoniteUserExtension, IoniteValidators, JSON_MEDIA_TYPE, JWTAssertionClaims, JwtBearerWorkloadConfig, KNOWN_BASE_CUSTOMER_KEYS, KNOWN_BASE_USER_KEYS, KNOWN_ENTITLEMENT_KEYS, KNOWN_WORKLOAD_KEYS, Kms, KmsAddKeysRequest, KmsAddKeysResult, KmsAllocationPolicy, KmsAllocationStrategy, KmsConfig, KmsIssuedKey, KmsIssuerEvent, KmsIssuerEventListener, KmsIssuerEventName, KmsKey, KmsKeyState, KmsParkDisposition, KmsParkReport, KmsParkRequest, KmsParkResult, KmsPool, KmsPoolConfig, KmsPoolControlDocument, KmsPoolDocument, KmsPoolIssuer, KmsPoolListener, KmsPoolSlot, KmsRevokeKeyRequest, KmsRevokeKeyResult, LfvActionAcceptedResponse, LfvActionName, LfvActionRequestBase, LfvCallbackEnvelope, LfvCallbackHeaders, LfvCallbackKind, LfvCallbackTransport, LfvEd25519PrivateJwk, LfvEd25519PublicJwk, LfvErrorCode, LfvErrorResponse, LfvJwks, LfvOtpRequest, LfvOtpResponse, ListFilter, ListOptions, ListResult, Logger, MagicLink, MagicLinkStore, MetaData, MirrorConfigLocator, ModifiableFrameworkConfig, ModuleName, ModuleReadiness, ModuleReadinessState, Name, NoReserved, OCTET_STREAM_MEDIA_TYPE, OaaAccessChangeBatchItem, OaaAccessTargetType, OaaClient, OaaPrincipalPopulation, OaaSyncInput, OaaSyncOptions, OaaSyncResult, OidcCallbackParams, Otel, OtelAttributeValue, OtelAttributes, OtelConfig, OtelConsoleMode, OtelLevels, OtelLogLevel, OtelLogRecord, OtelMetricsSignalConfig, OtelOAuthClientCredentialsConfig, OtelProtocol, OtelProviderType, OtelSignalConfig, OtelSignalName, PLATFORM_ASSIGNABLE_SUBJECT_TYPES, ParsedEcid, Permission, PhoneNumber, Photo, PrincipalInboundHandlerConfig, ReactiveHandle, ReadJsonResponseOptions, ReadinessReport, ReadyAccessCatalogEntry, ReadyzEndpointConfig, ReconcileReport, RecordTenantConsentInput, RegisterIAMAppError, RegisterIAMAppPayload, RegisterIAMAppResult, RegisterSSOAppError, RegisterSSOAppPayload, RegisterSSOAppResult, RemoteConfig, RemoteConfigLoadErrorKind, RemoteConfigRetryContext, RemoteConfigRetryHook, RemoteConfigRetryOptions, RemoteTmConfig, RequireReadyResult, ResolvedRoute, ResolvedVaultLfvSecretsConfig, Resource, ResourceChange, ResourceChangeListener, ResourceProvider, RiskLevel, Role, RouteFilterResult, RouteModule, RoutingOptions, SCIM_MEDIA_TYPE, SSO, SSOAppRegistry, SSOAppValidators, SSOConfig, SSOConfigFromCode, SSOHandlerConfig, SSOValidators, ScimAuthenticationScheme, ScimCustomer, ScimError, Group2 as ScimGroup, ScimListResponse, ScimMutationSummary, ScimResourceType, ScimResourceTypeSchemaExtension, ScimResult, Role2 as ScimRole, ScimSchemaAttributeDefinition, ScimSchemaDefinition, ScimServiceProviderConfig, User as ScimUser, ScimWorkload, Secret, SecretContentType, SecretContentTypeMismatchError, SecretEvent, SecretEventListener, SecretEventName, SecretFormat, SecretHandle, SecretLifecycleRequest, SecretRequestSeverity, SecretTypeDescriptor, SecretTypeInput, SecretTypeRegistryEntry, Secrets, SecretsModuleConfig, SecretsOperationOptions, SecretsSource, SecretsSourceConfig, SecretsSourceMap, SecretsSourceType, SecretsSubscriptionOptions, SecretsValidators, SecretsWriteOptions, ServerOnlyWorkloadConfig, Session, SessionStore, SetTenantIntegrationOptions, StagedIntegration, StandardSchemaWithValidate, StateCookie, StoreConflictError, StoreConflictKind, SubjectRef, SubjectScope, SubjectType, SubjectTypeScoping, SubscriptionMode, TenantDirectory, TenantDirectoryIdentity, TenantHostMatch, TenantHostRoutingStrategy, TenantIntegration, TenantIntegrationStatus, TenantIntegrationView, TenantIonCache, TenantManagement, TenantPathMatch, TenantPathNamespace, TenantPathRoutingStrategy, TenantResponse, TenantRoutingStrategy, TenantSelectorRoutingStrategy, TenantStatus, TenantStore, TenantValidators, TenantWebhookPayload, TmIntegratorConfig, TokenResponse, TokenValidationResult, TrustedIdp, TrustedProvisioningClient, UnexpectedBodySummary, UpdateTenantRequest, UserEndpointPolicy, UserStore, UserStoreOptions, UsersInboundHandlerConfig, ValidateResult, VaultConfigLocator, VaultLfvSecretsConfig, VaultSecretsConfig, VaultWebSocketAuthHeader, VaultWebSocketSecretsConfig, VaultWorkloadAuthConfig, WorkforceUser, Workload, WorkloadClient, WorkloadConfig, WorkloadConfigMap, WorkloadGetToken, WorkloadIdentity, WorkloadIdentityStore, WorkloadIncomingOutgoing, WorkloadPrincipal, WorkloadTokenResponse, WorkloadTokenStore, WorkloadValidators, X509Certificate, XML_MEDIA_TYPE, accessRefId, accessRootId, assertEcid, assertRequiredSubjectType, assertValidSubjectTypeScoping, buildTenantPath, buildTenantUrl, catalogEntityStore, claimsToUser, compareDisplayExpiryDesc, configTrustedClientGrants, customAttributes, customerResourceSchema, debugLogger, decodeDisplayCookie, decodeUser, deepEqualPlain, defaultDisplayUser, defaultLogger, defaultSecretContentType, defineCatalog, defineSecretType, deprecateRetiredCodeCatalogRows, discoveredProfileCookieName, encodeDisplayCookie, formatEcid, formatLogLine, generateULID, getCodeCatalogEntity, groupResourceSchema, idTokenClaimsSchema, infoLogger, isCodeCatalog, isConfigLocator, isConfigSourceError, isEcid, isJsonResponse, isStoreConflictError, jwtAssertionClaimsSchema, list, listGenerator, matchTenantHost, matchTenantPath, matchesListFilter, materializeCodeCatalogEntity, mergeCodeCatalogEntity, mergeConfig, must, normalizeTenantBaseDomain, normalizeTenantPathNamespace, normalizeTenantRoutingStrategy, oidcCallbackSchema, parseEcid, parseJsonc, parseKmsPoolControlDocument, parseKmsPoolDocument, prettyLogger, profileCookieName, projectDisplayUser, readDisplayCookies, readJsonResponse, readyCatalogEntry, remoteConfigSecretType, resolveDiscoveredCookieMax, resolveDiscoveredCookieTtlSeconds, resolveDisplayCookieMax, sanitizeDisplayUser, serializeConfig, silentLogger, stableConfigHash, stripJsonComments, tmIntegrationState, toCodeCatalog, tokenResponseSchema, trimTrailingSlash, trustedClientPermissionsForPrincipal, unexpectedBodySummary, unionCatalogRead, userSchema, validationFailureResponse, version, waitOn, warnLogger, withValidate, workloadResourceSchema, workloadTokenResponseSchema };
6965
+ export { ACCEPT_JSON, ACCEPT_OCTET_STREAM, ACCEPT_SCIM, ACCEPT_XML, AccessAssignmentStore, AccessCatalogStore, AccessChange, AccessCheckReason, AccessCheckResult, AccessCheckTarget, AccessIndex, AccessMutationResult, AccessMutationStatus, AccessProvenance, AccessRef, AccessRequestCreate, AccessRequestResult, AccessRequestsDestination, AccessStatus, Address, ApplicationValidators, AssignmentPolicyError, AuthenticatedPrincipal, AuthenticatedUser, Authz, AuthzConfig, AuthzDecision, AuthzDescription, AuthzEntityBase, AuthzOaaConfig, AuthzOaaPrincipalConfig, AuthzScimGroupExtension, AuthzScimGroupType, AwsConfigLocator, AwsSecretsConfig, AzureAuthMethod, AzureConfigLocator, AzureSecretsConfig, BaseCustomer, BaseTenant, BaseUser, BaseWorkloadIdentity, CANONICAL_RISK_LEVELS, CIAM, CIAMConfig, CIAMConfigFromCode, CIAMConfigFromCodeInput, CIAMProviderBranding, CIAMProviderColors, CIAMProviderConfig, CIAMProviderDescriptor, CIAMProviderType, CIAMValidators, CONTENT_TYPE_FORM, CONTENT_TYPE_JSON, CONTENT_TYPE_OCTET_STREAM, CONTENT_TYPE_SCIM, CONTENT_TYPE_XML, CacheConfig, CachedWorkloadToken, CapabilitiezManifest, CapabilityEndpointUrls, CapabilityKey, CapabilityState, CatalogChange, CatalogChangeKind, CatalogChangeListener, CatalogEntityKind, ChangeListener, CiamDescription, CiamProviderDescription, ClaimsAsEntitlements, ClaimsAsEntitlementsDescription, ClientCredentialsWorkloadConfig, CodeCatalog, CodeCatalogInput, CodeCatalogNamespace, ConfigApplyStatus, ConfigChangeCallback, ConfigChangeOptions, ConfigChangeResult, ConfigErrorKind, ConfigExportEnvelope, ConfigLocator, ConfigSource, ConfigSourceEnv, ConfigSourceError, ConfigSourceErrorInit, ConfigSourceResolver, ConfigSourceType, ConfigSubscriptionOptions, ConnectRequestContext, CookieDescription, CreateGroupOptions, CreateTenantRequest, CreateUserOptions, Customer, CustomerStore, CustomerStoreOptions, DEFAULT_DISCOVERED_COOKIE_MAX, DEFAULT_DISCOVERED_COOKIE_TTL_SECONDS, DEFAULT_DISPLAY_COOKIE_MAX, DEFAULT_RISK_LEVEL, DEFAULT_SECRET_MIME_TYPES, DEFAULT_TENANT_API_NAMESPACE, DEFAULT_TENANT_UI_NAMESPACE, DISCOVERED_COOKIE_PREFIX, DISPLAY_COOKIE_SUFFIX, DISPLAY_COOKIE_VERSION, DerivedEntitlement, DescribedSecretsSource, DestinationReference, DevSecretsConfig, DiscoveredDisplayCookieConfig, DisplayAuthType, DisplayCookieConfig, DisplayCookieEnvelope, DisplayIdentity, DisplayUser, ECID_SCHEME, EcidFormatError, EffectiveEdge, EgressChannelOutcome, EgressOutcome, Email, EndpointOperation, EndpointPermission, EnterpriseExtension, Entitlement, EntitlementType, EntityStore, EnvironmentType, FORM_MEDIA_TYPE, FrameworkConfig, FrameworkConfigInput, FrameworkLfvConfig, FrameworkOtelConfig, FrameworkSecretsModuleConfig, FrameworkSecretsSourceConfig, FrameworkStores, FrameworkTmConfig, FrameworkWorkloadConfig, FrameworkWorkloadConfigFromCode, FrameworkWorkloadIncomingOutgoing, GcpConfigLocator, GcpSecretsConfig, Group, GroupMember, GroupResource, GroupsInboundHandlerConfig, IAM, IAMAccessRequestsConfig, IAMAppRegistry, IAMAppValidators, IAMConfig, IAMConfigFromCode, IAMDiscoveryConfig, IAMDiscoveryContext, IAMDiscoveryHandlerConfig, IAMEndpointFlag, IAMGroupsInbound, IAMGroupsOutbound, IAMHandlerConfig, IAMInboundCustomersConfig, IAMInboundPrincipalContext, IAMInboundUserContext, IAMInboundUsersConfig, IAMInboundWorkloadsConfig, IAMPrincipalsInbound, IAMUsersInbound, IAMValidators, ION_AUTHZ_GROUP_SCHEMA, ION_AUTHZ_OAA_SYNC, ION_CAPABILITIEZ_READ, ION_CIAM_MAGIC_LINK_CREATE, ION_ENDPOINT_PERMISSIONS, ION_IAM_ACCESS_REQUESTS_WRITE, ION_IAM_CUSTOMERS_WRITE, ION_IAM_GROUPS_WRITE, ION_IAM_READ, ION_IAM_USERS_WRITE, ION_IAM_WORKLOADS_WRITE, ION_SCIM_CUSTOMER_SCHEMA, ION_SCIM_USER_EXTENSION_URN, ION_SCIM_WORKLOAD_SCHEMA, ION_SDK_PERMISSIONS, ION_TENANT_MANAGE, IamAssignmentPolicy, IamDeltaEmitter, IamDeltaMode, IamDeltaReconcileInput, IamDeltaReconcileResult, IamDeltaResourceType, IamDescription, IamPrincipalDescription, IamPrincipalKind, IamPrincipalKindFlag, IdTokenClaims, IdentityResolution, InMemoryTenantStoreOptions, InferSecretType, Ionite, IoniteBase, IoniteDescription, IoniteError, IoniteErrorOptions, IoniteUserExtension, IoniteValidators, JSON_MEDIA_TYPE, JWTAssertionClaims, JwtBearerWorkloadConfig, KNOWN_BASE_CUSTOMER_KEYS, KNOWN_BASE_USER_KEYS, KNOWN_ENTITLEMENT_KEYS, KNOWN_WORKLOAD_KEYS, Kms, KmsAddKeysRequest, KmsAddKeysResult, KmsAllocationPolicy, KmsAllocationStrategy, KmsConfig, KmsDescription, KmsIssuedKey, KmsIssuerEvent, KmsIssuerEventListener, KmsIssuerEventName, KmsKey, KmsKeyState, KmsParkDisposition, KmsParkReport, KmsParkRequest, KmsParkResult, KmsPool, KmsPoolConfig, KmsPoolControlDocument, KmsPoolDescription, KmsPoolDocument, KmsPoolIssuer, KmsPoolListener, KmsPoolSlot, KmsRevokeKeyRequest, KmsRevokeKeyResult, LfvActionAcceptedResponse, LfvActionName, LfvActionRequestBase, LfvCallbackEnvelope, LfvCallbackHeaders, LfvCallbackKind, LfvCallbackTransport, LfvEd25519PrivateJwk, LfvEd25519PublicJwk, LfvErrorCode, LfvErrorResponse, LfvJwks, LfvOtpRequest, LfvOtpResponse, ListFilter, ListOptions, ListResult, Logger, MagicLink, MagicLinkStore, MetaData, MirrorConfigLocator, ModifiableFrameworkConfig, ModuleDescription, ModuleDescriptionBase, ModuleName, ModuleReadiness, ModuleReadinessState, Name, NoReserved, OCTET_STREAM_MEDIA_TYPE, OaaAccessChangeBatchItem, OaaAccessTargetType, OaaClient, OaaDescription, OaaPrincipalPopulation, OaaSyncInput, OaaSyncOptions, OaaSyncResult, OidcCallbackParams, Otel, OtelAttributeValue, OtelAttributes, OtelConfig, OtelConsoleMode, OtelDescription, OtelLevels, OtelLogLevel, OtelLogRecord, OtelMetricsSignalConfig, OtelOAuthClientCredentialsConfig, OtelProtocol, OtelProviderType, OtelSignalConfig, OtelSignalDescription, OtelSignalName, PLATFORM_ASSIGNABLE_SUBJECT_TYPES, ParsedEcid, Permission, PhoneNumber, Photo, PrincipalInboundHandlerConfig, ReactiveHandle, ReadJsonResponseOptions, ReadinessReport, ReadyAccessCatalogEntry, ReadyzEndpointConfig, ReconcileReport, RecordTenantConsentInput, RegisterIAMAppError, RegisterIAMAppPayload, RegisterIAMAppResult, RegisterSSOAppError, RegisterSSOAppPayload, RegisterSSOAppResult, RemoteConfig, RemoteConfigLoadErrorKind, RemoteConfigRetryContext, RemoteConfigRetryHook, RemoteConfigRetryOptions, RemoteTmConfig, RequireReadyResult, ResolvedRoute, ResolvedVaultLfvSecretsConfig, Resource, ResourceChange, ResourceChangeListener, ResourceProvider, RiskLevel, Role, RouteFilterResult, RouteModule, RoutingOptions, SCIM_MEDIA_TYPE, SSO, SSOAppRegistry, SSOAppValidators, SSOConfig, SSOConfigFromCode, SSOHandlerConfig, SSOValidators, ScimAuthenticationScheme, ScimCustomer, ScimError, Group2 as ScimGroup, ScimListResponse, ScimMutationSummary, ScimResourceType, ScimResourceTypeSchemaExtension, ScimResult, Role2 as ScimRole, ScimSchemaAttributeDefinition, ScimSchemaDefinition, ScimServiceProviderConfig, User as ScimUser, ScimWorkload, Secret, SecretContentType, SecretContentTypeMismatchError, SecretEvent, SecretEventListener, SecretEventName, SecretFormat, SecretHandle, SecretLifecycleRequest, SecretRequestSeverity, SecretTypeDescriptor, SecretTypeInput, SecretTypeRegistryEntry, Secrets, SecretsDescription, SecretsModuleConfig, SecretsOperationOptions, SecretsSource, SecretsSourceConfig, SecretsSourceDescription, SecretsSourceMap, SecretsSourceType, SecretsSubscriptionOptions, SecretsValidators, SecretsWriteOptions, ServerOnlyWorkloadConfig, Session, SessionStore, SetTenantIntegrationOptions, SsoDescription, StagedIntegration, StandardSchemaWithValidate, StateCookie, StoreConflictError, StoreConflictKind, SubjectRef, SubjectScope, SubjectType, SubjectTypeScoping, SubscriptionMode, TenantDirectory, TenantDirectoryIdentity, TenantHostMatch, TenantHostRoutingStrategy, TenantIntegration, TenantIntegrationStatus, TenantIntegrationView, TenantIonCache, TenantManagement, TenantPathMatch, TenantPathNamespace, TenantPathRoutingStrategy, TenantResponse, TenantRoutingStrategy, TenantSelectorRoutingStrategy, TenantStatus, TenantStore, TenantValidators, TenantWebhookPayload, TmDescription, TmIntegratorConfig, TokenResponse, TokenValidationResult, TrustedIdp, TrustedProvisioningClient, UnexpectedBodySummary, UpdateTenantRequest, UserEndpointPolicy, UserStore, UserStoreOptions, UsersInboundHandlerConfig, ValidateResult, VaultConfigLocator, VaultLfvSecretsConfig, VaultSecretsConfig, VaultWebSocketAuthHeader, VaultWebSocketSecretsConfig, VaultWorkloadAuthConfig, WorkforceUser, Workload, WorkloadClient, WorkloadClientDescription, WorkloadConfig, WorkloadConfigMap, WorkloadDescription, WorkloadGetToken, WorkloadIdentity, WorkloadIdentityStore, WorkloadIncomingOutgoing, WorkloadPrincipal, WorkloadTokenResponse, WorkloadTokenStore, WorkloadTrustedIdpDescription, WorkloadValidators, X509Certificate, XML_MEDIA_TYPE, accessRefId, accessRootId, assertEcid, assertRequiredSubjectType, assertValidSubjectTypeScoping, buildTenantPath, buildTenantUrl, catalogEntityStore, claimsToUser, compareDisplayExpiryDesc, configTrustedClientGrants, customAttributes, customerResourceSchema, debugLogger, decodeDisplayCookie, decodeUser, deepEqualPlain, defaultDisplayUser, defaultLogger, defaultSecretContentType, defineCatalog, defineSecretType, deprecateRetiredCodeCatalogRows, discoveredProfileCookieName, encodeDisplayCookie, formatEcid, formatLogLine, generateULID, getCodeCatalogEntity, groupResourceSchema, idTokenClaimsSchema, infoLogger, isCodeCatalog, isConfigLocator, isConfigSourceError, isEcid, isJsonResponse, isStoreConflictError, jwtAssertionClaimsSchema, list, listGenerator, matchTenantHost, matchTenantPath, matchesListFilter, materializeCodeCatalogEntity, mergeCodeCatalogEntity, mergeConfig, must, normalizeTenantBaseDomain, normalizeTenantPathNamespace, normalizeTenantRoutingStrategy, oidcCallbackSchema, parseEcid, parseJsonc, parseKmsPoolControlDocument, parseKmsPoolDocument, prettyLogger, profileCookieName, projectDisplayUser, readDisplayCookies, readJsonResponse, readyCatalogEntry, remoteConfigSecretType, resolveDiscoveredCookieMax, resolveDiscoveredCookieTtlSeconds, resolveDisplayCookieMax, sanitizeDisplayUser, serializeConfig, silentLogger, stableConfigHash, stripJsonComments, tmIntegrationState, toCodeCatalog, tokenResponseSchema, trimTrailingSlash, trustedClientPermissionsForPrincipal, unexpectedBodySummary, unionCatalogRead, userSchema, validationFailureResponse, version, waitOn, warnLogger, withValidate, workloadResourceSchema, workloadTokenResponseSchema };