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

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
@@ -1724,35 +1767,406 @@ type ModuleReadinessState = {
1724
1767
  active: boolean;
1725
1768
  /** Synchronous readiness of the module right now (mirrors the module's own `isReady()`). */
1726
1769
  ready: boolean;
1727
- /** Human-readable explanation when the module is `active` but not `ready`. */
1728
- reason?: string;
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.groups.create" | "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 = {
2113
+ ready: boolean;
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
+ /** True when the App explicitly accepts IAM-sourced entitlement creation. */
2131
+ inboundEntitlements: boolean;
2132
+ stores: {
2133
+ accessStore: boolean;
2134
+ accessIndex: boolean;
2135
+ catalogStore: boolean;
2136
+ resources: boolean;
2137
+ };
1729
2138
  };
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. */
2139
+ type TmDescription = ModuleDescriptionBase<"tm"> & {
2140
+ enabled: boolean;
2141
+ ionite?: {
2142
+ id: string;
2143
+ name?: string;
2144
+ url: string;
2145
+ issuer: string;
2146
+ jwksUri: string;
2147
+ audience: string;
2148
+ clientId: string;
2149
+ };
2150
+ consentTtlSeconds?: number;
2151
+ maxRedeemAttempts?: number;
2152
+ };
2153
+ type ModuleDescription = SsoDescription | CiamDescription | IamDescription | WorkloadDescription | SecretsDescription | KmsDescription | OtelDescription | AuthzDescription | TmDescription;
2154
+ type IoniteDescription = {
2155
+ id?: string;
2156
+ sdk: {
2157
+ version: string;
2158
+ catalogVersion: number;
2159
+ };
2160
+ basePath: string;
2161
+ urls: CapabilityEndpointUrls;
1738
2162
  ok: boolean;
1739
- /** Whether RemoteConfig has been applied at least once (mirrors `ion.isReady()`). */
1740
2163
  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
2164
  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;
2165
+ modules: Record<ModuleName, ModuleReadinessState & {
2166
+ description?: ModuleDescription;
1754
2167
  }>;
1755
2168
  };
2169
+ import { StandardSchemaV1 as StandardSchemaV14 } from "@standard-schema/spec";
1756
2170
  /**
1757
2171
  * Token caching for workload identity authentication.
1758
2172
  *
@@ -1943,12 +2357,10 @@ type WorkloadConfigBase = {
1943
2357
  */
1944
2358
  audience?: string;
1945
2359
  /**
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.
2360
+ * Per-IdP intent (incoming/server role only): token claims from THIS trust anchor may satisfy
2361
+ * `has*` (audience-bound). ConfigSource-only. There is no global fallback.
1950
2362
  */
1951
- scopesAsEntitlements?: boolean;
2363
+ claimsAsEntitlements?: ClaimsAsEntitlements;
1952
2364
  /**
1953
2365
  * Default OAuth2 scopes (space-delimited)
1954
2366
  */
@@ -2058,21 +2470,10 @@ type ClientCredentialsWorkloadConfig = WorkloadConfigBase & {
2058
2470
  */
2059
2471
  clientId: string;
2060
2472
  /**
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.
2473
+ * OAuth2 client secret
2474
+ * REQUIRED for Client Credentials mode
2074
2475
  */
2075
- authMethod?: "managed_identity";
2476
+ clientSecret: string;
2076
2477
  };
2077
2478
  /**
2078
2479
  * Server-Only Workload Configuration
@@ -2106,7 +2507,7 @@ type ServerOnlyWorkloadConfig = WorkloadConfigBase & {
2106
2507
  * detected based on which fields are present:
2107
2508
  *
2108
2509
  * - **JWT Bearer Grant**: Requires `workload_id` + `private_key`
2109
- * - **Client Credentials**: Requires `client_id` + `client_secret`, a federated token file, or `authMethod: "managed_identity"`
2510
+ * - **Client Credentials**: Requires `client_id` + `client_secret`
2110
2511
  * - **Server-Only**: Only `jwks_uri` (and optionally `issuer`) for token validation
2111
2512
  *
2112
2513
  * The developer uses the same API regardless of mode - the library handles the details.
@@ -2135,8 +2536,8 @@ type TrustedIdp = {
2135
2536
  * one of these values (with `azp` fallback). REQUIRED: prevents cross-app token reuse.
2136
2537
  */
2137
2538
  audience: string | string[];
2138
- /** Per-IdP scopesAsEntitlements intent (see {@link WorkloadConfigBase.scopesAsEntitlements}). */
2139
- scopesAsEntitlements?: boolean;
2539
+ /** Per-IdP claims intent (see {@link WorkloadConfigBase.claimsAsEntitlements}). */
2540
+ claimsAsEntitlements?: ClaimsAsEntitlements;
2140
2541
  };
2141
2542
  /**
2142
2543
  * Workload config with separate incoming (server) and outgoing (client) roles.
@@ -2179,6 +2580,8 @@ interface WorkloadGetToken {
2179
2580
  * Workload Identity Authentication Interface
2180
2581
  */
2181
2582
  type Workload = WorkloadConfig & ModuleReadiness & Required<Pick<ModuleReadiness, "isReady" | "ready">> & {
2583
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
2584
+ describe: () => WorkloadDescription;
2182
2585
  /**
2183
2586
  * Returns a token for this workload configuration.
2184
2587
  * The optional argument overrides the configured default scope.
@@ -2193,7 +2596,9 @@ type Workload = WorkloadConfig & ModuleReadiness & Required<Pick<ModuleReadiness
2193
2596
  /** Framework-agnostic request handler for the Workload module (token, validate, jwks, refresh). */
2194
2597
  handler: (request: Request) => Promise<Response>;
2195
2598
  };
2196
- type WorkloadClient = Pick<Workload, "getToken" | "refreshToken" | "generateJWTAssertion" | "revokeToken" | "beforeChange" | "afterChange" | "isReady" | "ready">;
2599
+ type WorkloadClient = Pick<Workload, "getToken" | "refreshToken" | "generateJWTAssertion" | "revokeToken" | "beforeChange" | "afterChange" | "isReady" | "ready"> & {
2600
+ describe(): WorkloadClientDescription;
2601
+ };
2197
2602
  /**
2198
2603
  * SCIM Error response structure
2199
2604
  */
@@ -2251,7 +2656,8 @@ interface IAMHandlerConfig {
2251
2656
  * IAM configuration
2252
2657
  *
2253
2658
  * - If `url` is provided, groups_outbound is enabled (app calls external IAM)
2254
- * - If a `catalogStore` is provided, groups_inbound is enabled (external IAM calls app)
2659
+ * - If a catalog source is provided, groups_inbound is enabled (external IAM calls app);
2660
+ * `POST /Groups` additionally requires `AuthzConfig.onInboundEntitlement`
2255
2661
  * - If `userStore` is provided, users_inbound is enabled (external IAM calls app)
2256
2662
  */
2257
2663
  type IAMConfig = {
@@ -2367,6 +2773,7 @@ type IAMAccessRequestsConfig = {
2367
2773
  request: AccessRequestResult;
2368
2774
  created: boolean;
2369
2775
  }>;
2776
+ get?: (id: string) => Promise<AccessRequestResult | undefined>;
2370
2777
  };
2371
2778
  type IAMEntitlementRequestUrlContext = {
2372
2779
  request: Request;
@@ -2595,7 +3002,7 @@ type IAMGroupsOutbound = {
2595
3002
  };
2596
3003
  /**
2597
3004
  * Groups Inbound extension - for receiving group provisioning from external IAM providers.
2598
- * Enabled when a `catalogStore` is configured.
3005
+ * Enabled when a catalog source is configured; IAM-sourced create remains AppDev opt-in.
2599
3006
  */
2600
3007
  type IAMGroupsInbound = {
2601
3008
  /**
@@ -2620,10 +3027,12 @@ type IAMUsersInbound = {
2620
3027
  *
2621
3028
  * - Core functions are user-related (outbound to external IAM)
2622
3029
  * - `groups_outbound` is available when `url` is configured
2623
- * - `groups_inbound` is available when a `catalogStore` is configured
3030
+ * - `groups_inbound` is available when a catalog source is configured
2624
3031
  * - `users_inbound` is available when `userStore` is configured
2625
3032
  */
2626
3033
  type IAM = Omit<IAMConfig, "users" | "workloads" | "customers" | "groups"> & {
3034
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
3035
+ describe: () => IamDescription;
2627
3036
  users: IamPrincipalKind;
2628
3037
  workloads: IamPrincipalKind;
2629
3038
  customers: IamPrincipalKind;
@@ -2646,7 +3055,8 @@ type IAM = Omit<IAMConfig, "users" | "workloads" | "customers" | "groups"> & {
2646
3055
  groups_outbound?: IAMGroupsOutbound;
2647
3056
  /**
2648
3057
  * Groups Inbound extension - receive group provisioning from external IAM.
2649
- * Available when a `catalogStore` is configured.
3058
+ * Available when a catalog source is configured. `POST /Groups` returns 501 unless the App
3059
+ * implements `AuthzConfig.onInboundEntitlement` and wires an `AccessCatalogStore`.
2650
3060
  */
2651
3061
  groups_inbound?: IAMGroupsInbound;
2652
3062
  /**
@@ -2808,6 +3218,8 @@ type KmsPoolSlot = {
2808
3218
  ready(timeout?: number): Promise<void>;
2809
3219
  };
2810
3220
  type KmsPool = {
3221
+ /** Secret-free, JSON-serializable pool configuration and readiness summary. */
3222
+ describe(): KmsPoolDescription;
2811
3223
  /**
2812
3224
  * Returns the current granted key for slot 0. Calls wait on one shared local subscription until a
2813
3225
  * grant is available; repeated calls resolve from the local cache and never initiate a vault request.
@@ -2840,6 +3252,8 @@ type KmsPool = {
2840
3252
  * (`ion.kms.<name>`); use `getPool(name)` when the name is dynamic.
2841
3253
  */
2842
3254
  type Kms = ModuleReadiness & {
3255
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
3256
+ describe(): KmsDescription;
2843
3257
  readonly config: Readonly<KmsConfig>;
2844
3258
  listPools(): string[];
2845
3259
  getPool(name: string): KmsPool;
@@ -2850,91 +3264,6 @@ type Kms = ModuleReadiness & {
2850
3264
  declare function parseKmsPoolDocument(value: unknown): KmsPoolDocument;
2851
3265
  /** Parse and fail closed on a vault-stored KMS key-material document. */
2852
3266
  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
3267
  /**
2939
3268
  * Session management for tracking user sessions and enabling backchannel logout.
2940
3269
  *
@@ -3027,6 +3356,12 @@ type Session<TExtended = object> = {
3027
3356
  */
3028
3357
  claims?: Record<string, unknown>;
3029
3358
  /**
3359
+ * Entitlements derived from token claims at login and refresh. Session-scoped: they die with the
3360
+ * record (TTL, rotation, back-channel logout) and are never written to the access stores.
3361
+ * Only meaningful when the store declares {@link SessionStoreCapabilities.derivedEntitlements}.
3362
+ */
3363
+ entitlements?: DerivedEntitlement[];
3364
+ /**
3030
3365
  * Optional access-token claims for modules that keep access/id claims separate.
3031
3366
  */
3032
3367
  accessClaims?: Record<string, unknown>;
@@ -3063,7 +3398,21 @@ type Session<TExtended = object> = {
3063
3398
  * }
3064
3399
  * ```
3065
3400
  */
3401
+ /**
3402
+ * Store-declared capabilities. The SDK does not probe a custom store (a write at init is forbidden);
3403
+ * a store that omits the declaration is treated as incapable.
3404
+ */
3405
+ type SessionStoreCapabilities = {
3406
+ /**
3407
+ * The store persists {@link Session.entitlements} round-trip. JSON-backed stores (the SDK Redis
3408
+ * and in-memory implementations) declare this. A column-mapped SQL store declares it only after
3409
+ * it has a column for the derived set.
3410
+ */
3411
+ derivedEntitlements?: boolean;
3412
+ };
3066
3413
  interface SessionStore<TExtended = object> {
3414
+ /** Declaration of what this store persists beyond the required session fields. */
3415
+ readonly capabilities?: SessionStoreCapabilities;
3067
3416
  /**
3068
3417
  * Create a new session in the store.
3069
3418
  *
@@ -3396,6 +3745,13 @@ type SSOConfig<
3396
3745
  */
3397
3746
  userStore?: UserStore<TUserData>;
3398
3747
  /**
3748
+ * ConfigSource-only. When set, the named token claims are derived into session-scoped
3749
+ * entitlements at login and refresh. Never set from application code.
3750
+ */
3751
+ claimsAsEntitlements?: ClaimsAsEntitlements;
3752
+ /** ConfigSource-only IdP assignment workflow used when IAM assignment is `'idp'`. */
3753
+ accessRequests?: AccessRequestsDestination;
3754
+ /**
3399
3755
  * Enable Just-In-Time (JIT) user provisioning.
3400
3756
  * When enabled, new users are automatically created in the userStore on their first login.
3401
3757
  * When disabled (default), only existing users in the userStore are updated on login.
@@ -3495,6 +3851,8 @@ type SSO<
3495
3851
  TSessionData = Record<string, never>,
3496
3852
  TUserData = Record<string, never>
3497
3853
  > = SSOConfig<TSessionData, TUserData> & {
3854
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
3855
+ describe: () => SsoDescription;
3498
3856
  getUser: (request: Request) => Promise<WorkforceUser | undefined>;
3499
3857
  /**
3500
3858
  * Degraded-aware resolution: distinguishes a signed-out visitor (`unauthenticated`) from a failed
@@ -3842,7 +4200,12 @@ type SecretsValidators = {
3842
4200
  */
3843
4201
  validateSourceConfig?(sourceName: string, config: SecretsSourceConfig): void;
3844
4202
  };
4203
+ type DescribedSecretsSource = SecretsSource & {
4204
+ describe(): SecretsSourceDescription;
4205
+ };
3845
4206
  type Secrets = ModuleReadiness & {
4207
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
4208
+ describe(): SecretsDescription;
3846
4209
  /**
3847
4210
  * Liveness across configured sources. Returns false when any ready source reports a degraded
3848
4211
  * `isAvailable()` (e.g. an HTTP-poll source whose upstream is failing). Surfaced in
@@ -3854,7 +4217,7 @@ type Secrets = ModuleReadiness & {
3854
4217
  /** Returns configured secrets source names/keys. */
3855
4218
  listSecretsSources(): string[];
3856
4219
  /** Gets a named secrets source client. Throws when missing. */
3857
- getSecretsSource(sourceName: string): SecretsSource;
4220
+ getSecretsSource(sourceName: string): DescribedSecretsSource;
3858
4221
  /** Creates a lazy handle for a secret in a named source. */
3859
4222
  get(sourceName: string, path: string, options?: SecretsOperationOptions): SecretHandle;
3860
4223
  /** Reads a secret from a named secrets source client. */
@@ -4304,17 +4667,6 @@ type TrustedProvisioningClient = {
4304
4667
  type AuthzConfig = {
4305
4668
  oaa?: AuthzOaaConfig;
4306
4669
  /**
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
4670
  * Config-declared trusted provisioning clients (read-path overlay; ConfigSource/ECI-owned). Each
4319
4671
  * entry pre-authorizes a workload client to hold specific permissions without a stored grant. See
4320
4672
  * {@link TrustedProvisioningClient}. Honored in the request-level `has*` helpers BEFORE the
@@ -4364,6 +4716,12 @@ type AuthzConfig = {
4364
4716
  * have been updated. Best-effort and isolated — throwing here never affects the SCIM response.
4365
4717
  */
4366
4718
  onAccessMutation?: (summary: ScimMutationSummary) => void;
4719
+ /**
4720
+ * Explicit AppDev opt-in for IAM-sourced entitlement definitions. Inbound SCIM `POST /Groups`
4721
+ * returns 501 when omitted. The callback may reject the proposal or accept it while attaching
4722
+ * App-owned catalog structure; IAM-owned presentation is persisted from the SCIM resource.
4723
+ */
4724
+ onInboundEntitlement?: (input: InboundEntitlementRequest) => InboundEntitlementDecision | Promise<InboundEntitlementDecision>;
4367
4725
  };
4368
4726
  /**
4369
4727
  * Configuration supplied by the framework/application when creating an ionite instance.
@@ -4395,11 +4753,11 @@ type FrameworkConfig = {
4395
4753
  * `afterLogout` callbacks, which are code-only and therefore kept. RemoteConfig-only intent flags (e.g. IAM `users`/`groups`
4396
4754
  * enablement) are also stripped from code.
4397
4755
  */
4398
- type SSOConfigFromCode = Omit<SSOConfig, "loginUrl" | "userUrl" | "logoutUrl" | "logoutBackChannelUrl" | "refreshUrl" | "redirectUri">;
4756
+ type SSOConfigFromCode = Omit<SSOConfig, "loginUrl" | "userUrl" | "logoutUrl" | "logoutBackChannelUrl" | "refreshUrl" | "redirectUri" | "claimsAsEntitlements" | "accessRequests">;
4399
4757
  type IAMConfigFromCode = Omit<IAMConfig, "usersUrl" | "groupsUrl" | "workloadsUrl" | "customersUrl" | "users" | "workloads" | "customers" | "groups" | "discovery" | "deltaAudience"> & {
4400
4758
  discovery?: Omit<IAMDiscoveryConfig, "basePath">;
4401
4759
  };
4402
- type WorkloadServerConfigFromCode = Omit<Partial<WorkloadConfig>, "tokenUrl" | "validateUrl" | "jwksUrl" | "refreshUrl">;
4760
+ type WorkloadServerConfigFromCode = Omit<Partial<WorkloadConfig>, "tokenUrl" | "validateUrl" | "jwksUrl" | "refreshUrl" | "claimsAsEntitlements">;
4403
4761
  type FrameworkWorkloadConfigFromCode = WorkloadServerConfigFromCode | {
4404
4762
  incoming?: WorkloadServerConfigFromCode;
4405
4763
  outgoing?: FrameworkWorkloadIncomingOutgoing["outgoing"];
@@ -4445,7 +4803,7 @@ type RemoteConfig = {
4445
4803
  /** OpenTelemetry collector/exporter config loaded from ConfigSource. */
4446
4804
  otel?: OtelConfig;
4447
4805
  authz?: AuthzConfig;
4448
- /** ConfigSource-owned Tenant Management activation and trusted integrator identity. */
4806
+ /** ConfigSource-owned Tenant Management activation and trusted ionite identity. */
4449
4807
  tm?: RemoteTmConfig;
4450
4808
  /**
4451
4809
  * Built-in readiness endpoint intent (Ops/ECI). The SDK mounts `${basePath}/readyz` by default;
@@ -4818,6 +5176,8 @@ type CIAM<
4818
5176
  TMagicLinkData = Record<string, never>,
4819
5177
  TCustomerData = Record<string, never>
4820
5178
  > = CIAMConfig<TMagicLinkData, TCustomerData> & {
5179
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
5180
+ describe: () => CiamDescription;
4821
5181
  getCustomer: (request: Request) => Promise<Customer | undefined>;
4822
5182
  /**
4823
5183
  * Degraded-aware resolution: distinguishes a signed-out visitor (`unauthenticated`) from a failed
@@ -4961,6 +5321,15 @@ type IoniteBase = {
4961
5321
  * module is ready; `notReady` lists the requested modules that are not ready, with reasons.
4962
5322
  */
4963
5323
  requireReady(names: ModuleName[]): RequireReadyResult;
5324
+ /**
5325
+ * Returns an allow-listed, JSON-serializable snapshot for privileged App-owned diagnostics.
5326
+ * Unlike `config`, this never contains credentials, secret values, stores, or callbacks.
5327
+ *
5328
+ * Diagnostics only: each call rebuilds the readiness report and every module projection. Call it
5329
+ * from an admin loader, never per request; handlers and health probes use `isReady()` /
5330
+ * `requireReady()`.
5331
+ */
5332
+ describe(): IoniteDescription;
4964
5333
  /** Most recent RemoteConfig application outcome (last applied time and last error, if any). */
4965
5334
  configStatus: ConfigApplyStatus;
4966
5335
  /** Release config subscriptions and background resources. */
@@ -4981,8 +5350,8 @@ type ResolvedRoute = {
4981
5350
  /**
4982
5351
  * Authorization required to invoke this route. When set, the router enforces it (deny-by-default)
4983
5352
  * 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.
5353
+ * granted entitlement, or a claim-derived entitlement from the issuing IdP's `claimsAsEntitlements`
5354
+ * block. Login/public/discovery routes omit it.
4986
5355
  *
4987
5356
  * Three states, chosen so a custom `resolve` cannot silently drop authorization by omission:
4988
5357
  * - a permission object → enforce it;
@@ -5046,7 +5415,10 @@ type ConfigChangeOptions = {
5046
5415
  type EnvironmentType = "POC" | "DEV" | "QA" | "PROD";
5047
5416
  type TenantStatus = "pending" | "processing" | "completed" | "failed" | "action_required";
5048
5417
  type CreateTenantRequestBase = {
5418
+ /** App-owned routing key. ionite may suggest it; the App may reject a collision. */
5049
5419
  id: string;
5420
+ /** Stable tenant id in the ionite domain. */
5421
+ ioniteId: string;
5050
5422
  companyId: string;
5051
5423
  companyName: string;
5052
5424
  environmentType: EnvironmentType;
@@ -5058,8 +5430,9 @@ type CreateTenantRequestBase = {
5058
5430
  };
5059
5431
  /**
5060
5432
  * 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).
5433
+ * patched later after the tenant's ConfigSource has been provisioned. Idempotent by
5434
+ * `ioniteId`: re-submitting that id re-applies the existing App tenant even when its
5435
+ * App-owned `id` differs from ionite's original suggestion.
5063
5436
  */
5064
5437
  type CreateTenantRequest<TExtended extends object = object> = CreateTenantRequestBase & TExtended;
5065
5438
  /**
@@ -5133,7 +5506,10 @@ type TenantValidators<
5133
5506
  };
5134
5507
  declare function isConfigLocator(value: unknown): value is ConfigLocator;
5135
5508
  type BaseTenant = {
5509
+ /** App-owned routing key. */
5136
5510
  id: string;
5511
+ /** Stable tenant id in the ionite domain, once this tenant is known to ionite. */
5512
+ ioniteId?: string;
5137
5513
  companyId: string;
5138
5514
  companyName: string;
5139
5515
  environmentType: EnvironmentType;
@@ -5155,7 +5531,7 @@ type BaseTenant = {
5155
5531
  */
5156
5532
  configLocator?: ConfigLocator;
5157
5533
  /**
5158
- * App-internal state for an integrator-requested Tenant Management handover. Protocol-internal
5534
+ * App-internal state for an ionite-requested Tenant Management handover. Protocol-internal
5159
5535
  * fields are never serialized by the TM wire handlers.
5160
5536
  */
5161
5537
  integration?: TenantIntegration;
@@ -5163,9 +5539,8 @@ type BaseTenant = {
5163
5539
  type TenantIntegrationStatus = "consent_requested" | "consented" | "declined";
5164
5540
  type TenantIntegration = {
5165
5541
  version: number;
5166
- integrator: string;
5167
- integratorName?: string;
5168
- integratorTenantId: string;
5542
+ ioniteName?: string;
5543
+ ioniteId: string;
5169
5544
  productId: string;
5170
5545
  applicationId: string;
5171
5546
  handleHash: string;
@@ -5189,26 +5564,36 @@ type SetTenantIntegrationOptions = {
5189
5564
  /** Compare-and-set guard for transitions within the same handle. */
5190
5565
  expectedVersion?: number;
5191
5566
  };
5192
- type TmIntegratorConfig = {
5567
+ /**
5568
+ * ConfigSource-only trust for the ionite control plane that drives Tenant Management. Code never
5569
+ * sets these fields; do not duplicate them in `workload.incoming` or `authz.trustedProvisioningClients`.
5570
+ */
5571
+ type TmIoniteConfig = {
5572
+ /** Stable identifier of the trusted ionite control plane. */
5193
5573
  id: string;
5574
+ /** Optional human-readable name used in consent copy. */
5194
5575
  name?: string;
5576
+ /** Browser-facing ionite URL used to restart an integration. */
5195
5577
  url: string;
5578
+ /** Required `iss` claim on ionite-signed staged-request handles and ionite workload tokens. */
5196
5579
  issuer: string;
5580
+ /** ionite JWKS endpoint used to verify signed staged-request handles. */
5197
5581
  jwksUri: string;
5582
+ /** Required `aud` claim binding an ionite-staged request to this App. */
5198
5583
  audience: string;
5584
+ /** Required `azp`/client identity of the trusted ionite control plane. */
5199
5585
  clientId: string;
5200
5586
  };
5201
5587
  type RemoteTmConfig = {
5202
5588
  enabled: true;
5203
- integrator: TmIntegratorConfig;
5589
+ ionite: TmIoniteConfig;
5204
5590
  consentTtlSeconds?: number;
5205
5591
  maxRedeemAttempts?: number;
5206
5592
  };
5207
5593
  type StagedIntegration = {
5208
5594
  handle: string;
5209
- integrator: string;
5210
- integratorName?: string;
5211
- integratorTenantId: string;
5595
+ ioniteName?: string;
5596
+ ioniteId: string;
5212
5597
  productId: string;
5213
5598
  applicationId: string;
5214
5599
  issuedAt: string;
@@ -5240,9 +5625,15 @@ type FrameworkTmConfig<TTenant extends BaseTenant = BaseTenant> = {
5240
5625
  exportConfig?: (context: {
5241
5626
  tenant: TTenant;
5242
5627
  }) => ConfigExportEnvelope | Promise<ConfigExportEnvelope>;
5628
+ /**
5629
+ * Runs after a consented tenant runtime has successfully applied config through the newly
5630
+ * persisted destination locator. Cleanup must be idempotent because another App replica may
5631
+ * observe the same handover concurrently.
5632
+ */
5243
5633
  onHandoverApplied?: (context: {
5244
5634
  tenant: TTenant;
5245
5635
  previousLocator?: ConfigLocator;
5636
+ destinationLocator: ConfigLocator;
5246
5637
  }) => void | Promise<void>;
5247
5638
  /** 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
5639
  onTenantCreated?: (context: {
@@ -5272,6 +5663,8 @@ type TenantIntegrationView = {
5272
5663
  integration: TenantIntegration;
5273
5664
  };
5274
5665
  type TenantManagement<TTenant extends BaseTenant = BaseTenant> = ModuleReadiness & {
5666
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
5667
+ describe(): TmDescription;
5275
5668
  handler(request: Request): Promise<Response>;
5276
5669
  getTenant(id: string): Promise<TTenant | undefined>;
5277
5670
  recordConsent(input: RecordTenantConsentInput): Promise<TTenant>;
@@ -5327,6 +5720,19 @@ interface TenantDirectory<TTenant extends BaseTenant = BaseTenant> {
5327
5720
  findUserTenants?(identity: TenantDirectoryIdentity, options?: ListOptions): Promise<ListResult<TTenant>>;
5328
5721
  findTenantsByEmailDomain?(domain: string, options?: ListOptions): Promise<ListResult<TTenant>>;
5329
5722
  }
5723
+ /**
5724
+ * App-owned tenant persistence for routing and Tenant Management.
5725
+ *
5726
+ * Tenants carry two ids: `id` is the App-owned routing key and `ioniteId` is ionite's stable id.
5727
+ * Implementations MUST keep `ioniteId` unique across tenants and MUST treat it as immutable once
5728
+ * set: `upsert` and `setIntegration` reject a different `ioniteId` for a bound tenant (the
5729
+ * built-in in-memory and Redis stores throw `ionite id cannot change`) and an `upsert` that omits
5730
+ * `ioniteId` keeps the stored value. The TM handler enforces the same rule at the HTTP layer; the
5731
+ * store rule protects App-owned write paths that bypass `ion.tm`.
5732
+ *
5733
+ * `setIntegration` and `getByIntegrationHandleHash` are required only for ionite consent. They are
5734
+ * metadata-only writes and MUST NOT evict the tenant runtime cache; ordinary `upsert`/`delete` do.
5735
+ */
5330
5736
  interface TenantStore<TTenant extends BaseTenant = BaseTenant> {
5331
5737
  get(id: string): Promise<TTenant | undefined>;
5332
5738
  list(options?: ListOptions): Promise<ListResult<TTenant>>;
@@ -5335,6 +5741,8 @@ interface TenantStore<TTenant extends BaseTenant = BaseTenant> {
5335
5741
  getIon(id: string): Promise<Ionite | undefined>;
5336
5742
  setIntegration?(tenantId: string, integration: TenantIntegration | undefined, options?: SetTenantIntegrationOptions): Promise<TTenant | undefined>;
5337
5743
  getByIntegrationHandleHash?(handleHash: string): Promise<TTenant | undefined>;
5744
+ /** Looks up a tenant by ionite's stable id; TM create is idempotent by this key. */
5745
+ getByIoniteId(ioniteId: string): Promise<TTenant | undefined>;
5338
5746
  }
5339
5747
  type InMemoryTenantStoreOptions = {
5340
5748
  /**
@@ -5559,6 +5967,35 @@ type OaaAccessTargetType = "group" | "role" | "permission";
5559
5967
  type EntitlementType = OaaAccessTargetType;
5560
5968
  /** A catalog Entitlement: a group, role, or permission (see {@link EntitlementType}). */
5561
5969
  type Entitlement<TAttributes extends object = object> = Group<TAttributes> | Role<TAttributes> | Permission<TAttributes>;
5970
+ /** Validated IAM-authored presentation and membership proposed through inbound SCIM `POST /Groups`. */
5971
+ type InboundEntitlementRequest = {
5972
+ type: EntitlementType;
5973
+ displayName: string;
5974
+ description?: string;
5975
+ externalId?: string;
5976
+ riskLevel?: RiskLevel;
5977
+ attributes?: Record<string, unknown>;
5978
+ resources?: string[];
5979
+ members: GroupMember[];
5980
+ request: Request;
5981
+ };
5982
+ /**
5983
+ * AppDev decision for an IAM-sourced entitlement. Accepting may attach only App-owned structure;
5984
+ * IAM-owned presentation remains sourced from the inbound SCIM resource.
5985
+ */
5986
+ type InboundEntitlementDecision = {
5987
+ accept: false;
5988
+ reason?: string;
5989
+ } | {
5990
+ accept: true;
5991
+ id?: string;
5992
+ assignableSubjectTypes?: SubjectType[];
5993
+ recommendedSubjectTypes?: SubjectType[];
5994
+ permissions?: string[];
5995
+ roles?: string[];
5996
+ groups?: string[];
5997
+ resources?: string[];
5998
+ };
5562
5999
  declare const ION_AUTHZ_GROUP_SCHEMA = "urn:ionite:params:scim:schemas:extension:authz:2.0:Group";
5563
6000
  type AuthzScimGroupType = OaaAccessTargetType;
5564
6001
  type AuthzScimGroupExtension = {
@@ -5948,6 +6385,8 @@ interface OaaClient<
5948
6385
  TCustomer = BaseCustomer,
5949
6386
  TWorkload = BaseWorkloadIdentity
5950
6387
  > {
6388
+ /** Secret-free, JSON-serializable OAA configuration and readiness summary. */
6389
+ describe(): OaaDescription;
5951
6390
  pushUser(user: TUser): Promise<void>;
5952
6391
  pushCustomer(customer: TCustomer): Promise<void>;
5953
6392
  pushWorkload(workload: TWorkload): Promise<void>;
@@ -6066,6 +6505,8 @@ type ReconcileReport = {
6066
6505
  * wired they deny by default (`{ allow: false }`, `metadata.reason = 'access_index_not_configured'`).
6067
6506
  */
6068
6507
  type Authz = {
6508
+ /** Secret-free, JSON-serializable configuration and readiness summary. */
6509
+ describe(): AuthzDescription;
6069
6510
  oaa: OaaClient;
6070
6511
  /** Read the effective catalog union (materialized rows plus unmaterialized code templates). */
6071
6512
  entitlements: {
@@ -6117,9 +6558,9 @@ type Authz = {
6117
6558
  */
6118
6559
  grant(change: AccessChange): Promise<AccessChange>;
6119
6560
  /**
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.
6561
+ * Submit one grant or revoke request on a principal's behalf. Under `'iam-request'`, targets the
6562
+ * IAM destination; under `'idp'`, targets the claims-bearing SSO/CIAM provider. One operation
6563
+ * maps to one approval decision, status, and tracking URL.
6123
6564
  */
6124
6565
  requestAccess(change: {
6125
6566
  subject: AccessChange["subject"];
@@ -6128,6 +6569,20 @@ type Authz = {
6128
6569
  target: AccessChange["target"];
6129
6570
  operation: "grant" | "revoke";
6130
6571
  justification?: string;
6572
+ /** CIAM provider key. Required only when multiple providers expose an AccessRequests channel. */
6573
+ provider?: string;
6574
+ }): Promise<{
6575
+ id: string;
6576
+ status: "pending" | "approved" | "denied";
6577
+ operation: "grant" | "revoke";
6578
+ trackingUrl: string;
6579
+ }>;
6580
+ /** Read the destination-owned state of an on-behalf access request. */
6581
+ getAccessRequest(input: {
6582
+ id: string;
6583
+ subjectType: SubjectType;
6584
+ /** CIAM provider key. Required only when multiple providers expose an AccessRequests channel. */
6585
+ provider?: string;
6131
6586
  }): Promise<{
6132
6587
  id: string;
6133
6588
  status: "pending" | "approved" | "denied";
@@ -6147,8 +6602,10 @@ type Authz = {
6147
6602
  * - `'iam'` — never assign in-app; show a request link (or a read-only entitlement table).
6148
6603
  * - `'iam-request'` — never assign in-app; the app submits a request on the principal's behalf via
6149
6604
  * {@link Authz.requestAccess}.
6605
+ * - `'idp'` — the claims-bearing SSO/CIAM provider is assigner of record; requests use that
6606
+ * provider's ConfigSource-owned AccessRequests channel.
6150
6607
  */
6151
- type IamAssignmentPolicy = "app" | "iam" | "iam-request";
6608
+ type IamAssignmentPolicy = "app" | "iam" | "iam-request" | "idp";
6152
6609
  /**
6153
6610
  * Thrown by {@link Authz.grant} when the Ops-owned assignment policy forbids in-app assignment.
6154
6611
  * `requestUrl` is the IAM-written entitlement receipt when one exists, so the app can send the
@@ -6199,64 +6656,6 @@ declare function trustedClientPermissionsForPrincipal(authz: AuthzConfig | null
6199
6656
  * OAA full sync — they are NEVER written to a store or materialized into the AccessIndex.
6200
6657
  */
6201
6658
  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
6659
  /**
6261
6660
  * Fields a {@link ConfigSource} may attach to a thrown error so the SDK can classify load/subscribe
6262
6661
  * failures structurally instead of by fragile message-substring matching (§2.1). All fields are
@@ -6625,4 +7024,4 @@ type LfvErrorResponse = {
6625
7024
  };
6626
7025
  /** Generates a ULID */
6627
7026
  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 };
7027
+ 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, InboundEntitlementDecision, InboundEntitlementRequest, 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, TmIoniteConfig, 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 };