@canopy-io/node 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -327,6 +327,26 @@ interface paths {
327
327
  patch: operations["ApiPermissionsController_updatePermission"];
328
328
  trace?: never;
329
329
  };
330
+ "/api/v1/permissions/{id}/usage": {
331
+ parameters: {
332
+ query?: never;
333
+ header?: never;
334
+ path?: never;
335
+ cookie?: never;
336
+ };
337
+ /**
338
+ * Get where a permission is used
339
+ * @description Returns the roles that grant a permission, each with the number of distinct identities holding that role, plus `role_count` and the distinct `identity_count` the permission reaches overall. Because a permission is only ever held through a role, this is the full blast radius of deleting it — the listed roles are exactly the ones a delete would strip it from. Deactivated roles are included; `identity_count` is not the sum of the per-role counts, since one identity may hold several granting roles. Returns `404` when no permission with that id exists in the Environment. Requires the `rbac.view_roles` permission.
340
+ */
341
+ get: operations["ApiPermissionsController_getPermissionUsage"];
342
+ put?: never;
343
+ post?: never;
344
+ delete?: never;
345
+ options?: never;
346
+ head?: never;
347
+ patch?: never;
348
+ trace?: never;
349
+ };
330
350
  "/api/v1/permissions/evaluate": {
331
351
  parameters: {
332
352
  query?: never;
@@ -1598,6 +1618,24 @@ interface components {
1598
1618
  /** @description One or more permissions to register */
1599
1619
  permissions: components["schemas"]["PermissionItemDto"][];
1600
1620
  };
1621
+ PermissionUsageRoleDto: {
1622
+ id: string;
1623
+ name: string;
1624
+ description?: string | null;
1625
+ is_system_role: boolean;
1626
+ /** @description Deactivated roles still carry the grant, so they are listed too — deleting the permission strips it from them as well. */
1627
+ is_active: boolean;
1628
+ /** @description Number of distinct identities assigned this role, across all nodes. */
1629
+ member_count: number;
1630
+ };
1631
+ PermissionUsageDto: {
1632
+ permission_id: string;
1633
+ /** @description Number of roles that grant this permission. */
1634
+ role_count: number;
1635
+ /** @description Distinct identities that hold this permission through any granting role. Lower than the sum of `member_count` when an identity holds more than one granting role. */
1636
+ identity_count: number;
1637
+ roles: components["schemas"]["PermissionUsageRoleDto"][];
1638
+ };
1601
1639
  UpdatePermissionDto: {
1602
1640
  /** @description Updated name */
1603
1641
  name?: string;
@@ -1606,18 +1644,6 @@ interface components {
1606
1644
  /** @description Updated category */
1607
1645
  category?: string;
1608
1646
  };
1609
- EvaluatePermissionDto: {
1610
- /** @description Identity ID (from the `identities` table — the end user being evaluated, not an admin). */
1611
- identity_id: string;
1612
- permission: string;
1613
- /**
1614
- * @description Required. `node` asks 'does this identity have the permission *at* `node_id`?' (lineage walk). `app_wide` asks the coarse-grained 'does this identity have the permission *anywhere* in the org?' question — useful for UI gating, **never** for resource-scoped enforcement. `node` requires `node_id`; `app_wide` forbids it.
1615
- * @enum {string}
1616
- */
1617
- scope: "node" | "app_wide";
1618
- /** @description Required when `scope` is `node`; must be omitted when `scope` is `app_wide`. */
1619
- node_id?: string;
1620
- };
1621
1647
  EvaluateResponseDto: {
1622
1648
  allowed: boolean;
1623
1649
  permission: string;
@@ -1631,6 +1657,18 @@ interface components {
1631
1657
  granting_roles: string[];
1632
1658
  denial_reason?: string | null;
1633
1659
  };
1660
+ EvaluatePermissionDto: {
1661
+ /** @description Identity ID (from the `identities` table — the end user being evaluated, not an admin). */
1662
+ identity_id: string;
1663
+ permission: string;
1664
+ /**
1665
+ * @description Required. `node` asks 'does this identity have the permission *at* `node_id`?' (lineage walk). `app_wide` asks the coarse-grained 'does this identity have the permission *anywhere* in the org?' question — useful for UI gating, **never** for resource-scoped enforcement. `node` requires `node_id`; `app_wide` forbids it.
1666
+ * @enum {string}
1667
+ */
1668
+ scope: "node" | "app_wide";
1669
+ /** @description Required when `scope` is `node`; must be omitted when `scope` is `app_wide`. */
1670
+ node_id?: string;
1671
+ };
1634
1672
  EvaluateCheckDto: {
1635
1673
  /** @description Identity ID (from the `identities` table — the end user being evaluated, not an admin). */
1636
1674
  identity_id: string;
@@ -1646,13 +1684,6 @@ interface components {
1646
1684
  BulkEvaluatePermissionDto: {
1647
1685
  checks: components["schemas"]["EvaluateCheckDto"][];
1648
1686
  };
1649
- ExplainPermissionDto: {
1650
- /** @description Identity ID (from the `identities` table — the end user being explained, not an admin). */
1651
- identity_id: string;
1652
- permission: string;
1653
- /** @description The hierarchy node to explain the decision at. The lineage from the root to this node is walked and returned in the trace. */
1654
- node_id: string;
1655
- };
1656
1687
  PermissionTraceAssignmentDto: {
1657
1688
  assignment_id: string;
1658
1689
  role_id: string;
@@ -1688,6 +1719,13 @@ interface components {
1688
1719
  /** @description Root-first lineage of the target node, each with the identity's assignments observed at that node. */
1689
1720
  lineage: components["schemas"]["PermissionTraceNodeDto"][];
1690
1721
  };
1722
+ ExplainPermissionDto: {
1723
+ /** @description Identity ID (from the `identities` table — the end user being explained, not an admin). */
1724
+ identity_id: string;
1725
+ permission: string;
1726
+ /** @description The hierarchy node to explain the decision at. The lineage from the root to this node is walked and returned in the trace. */
1727
+ node_id: string;
1728
+ };
1691
1729
  PageMetaDto: {
1692
1730
  /** @description Current page number (1-based) */
1693
1731
  page: number;
@@ -1720,6 +1758,10 @@ interface components {
1720
1758
  name: string;
1721
1759
  node_id: string;
1722
1760
  node_name: string;
1761
+ /** @description When this assignment starts; null means it is already active */
1762
+ effective_from: string | null;
1763
+ /** @description When this assignment expires; null means it never does */
1764
+ effective_to: string | null;
1723
1765
  };
1724
1766
  IdentityRowDto: {
1725
1767
  id: string;
@@ -1891,29 +1933,6 @@ interface components {
1891
1933
  expired_count: number;
1892
1934
  revoked_count: number;
1893
1935
  };
1894
- CreateIdentityInviteDto: {
1895
- /** @description OAuth client ID — determines which app the invite links to. If omitted, uses Canopy hosted fallback. */
1896
- client_id?: string;
1897
- /**
1898
- * @description Optional. `activate` (default) creates a net-new identity OR — if an identity with this email already exists in the Account but has no active membership in this App — auto-derives an `add_to_app` invite that adds them to this App without touching their existing password. `password_reset` is the explicit admin-driven credential-rotation flow for an existing identity; it cannot carry a role/node assignment. The legacy `onboard` value is accepted and treated as `activate`.
1899
- * @enum {string}
1900
- */
1901
- intent?: "activate" | "password_reset" | "onboard";
1902
- email: string;
1903
- /** @description Required for `activate`. Ignored for `add_to_app` (the existing identity's name wins) and for `password_reset`. */
1904
- first_name?: string;
1905
- /** @description Required for `activate`. Ignored for `add_to_app` and `password_reset`. */
1906
- last_name?: string;
1907
- /** @description Role ID — required if node_id is provided */
1908
- role_id?: string;
1909
- /** @description Node ID — required if role_id is provided */
1910
- node_id?: string;
1911
- /**
1912
- * @description Whether Canopy should send the invite email. Set false to suppress delivery and handle it yourself — the API response includes accept_url with the tokenized link. Defaults to true.
1913
- * @default true
1914
- */
1915
- send_email: boolean;
1916
- };
1917
1936
  ApiIdentityInviteResponseDto: {
1918
1937
  id: string;
1919
1938
  email: string;
@@ -1942,6 +1961,29 @@ interface components {
1942
1961
  /** @description Tokenized URL the invitee would land on. Returned so callers that pass send_email=false can deliver it themselves. */
1943
1962
  accept_url: string;
1944
1963
  };
1964
+ CreateIdentityInviteDto: {
1965
+ /** @description OAuth client ID — determines which app the invite links to. If omitted, uses Canopy hosted fallback. */
1966
+ client_id?: string;
1967
+ /**
1968
+ * @description Optional. `activate` (default) creates a net-new identity OR — if an identity with this email already exists in the Account but has no active membership in this App — auto-derives an `add_to_app` invite that adds them to this App without touching their existing password. `password_reset` is the explicit admin-driven credential-rotation flow for an existing identity; it cannot carry a role/node assignment. The legacy `onboard` value is accepted and treated as `activate`.
1969
+ * @enum {string}
1970
+ */
1971
+ intent?: "activate" | "password_reset" | "onboard";
1972
+ email: string;
1973
+ /** @description Required for `activate`. Ignored for `add_to_app` (the existing identity's name wins) and for `password_reset`. */
1974
+ first_name?: string;
1975
+ /** @description Required for `activate`. Ignored for `add_to_app` and `password_reset`. */
1976
+ last_name?: string;
1977
+ /** @description Role ID — required if node_id is provided */
1978
+ role_id?: string;
1979
+ /** @description Node ID — required if role_id is provided */
1980
+ node_id?: string;
1981
+ /**
1982
+ * @description Whether Canopy should send the invite email. Set false to suppress delivery and handle it yourself — the API response includes accept_url with the tokenized link. Defaults to true.
1983
+ * @default true
1984
+ */
1985
+ send_email: boolean;
1986
+ };
1945
1987
  BulkCreateIdentityInvitesDto: {
1946
1988
  invites: components["schemas"]["CreateIdentityInviteDto"][];
1947
1989
  };
@@ -1950,20 +1992,6 @@ interface components {
1950
1992
  /** @description Tokenized URL for the regenerated invite. Resend rotates the token, which invalidates any accept_url returned from the original create call. Self-delivery callers must replace the stored URL with this one. */
1951
1993
  accept_url: string;
1952
1994
  };
1953
- CreateNodeDto: {
1954
- /** @description Parent node ID (null for root) */
1955
- parent_node_id?: string;
1956
- /** @description Node type (org-defined, e.g. 'department', 'team') */
1957
- node_type: string;
1958
- /** @description Display name for the node */
1959
- name: string;
1960
- /** @description Optional free-text description shown under the node name */
1961
- description?: string;
1962
- /** @description URL-friendly slug (auto-generated if omitted) */
1963
- slug?: string;
1964
- /** @description Arbitrary metadata */
1965
- metadata?: Record<string, unknown>;
1966
- };
1967
1995
  NodeResponseDto: {
1968
1996
  id: string;
1969
1997
  application_id: string;
@@ -1982,6 +2010,20 @@ interface components {
1982
2010
  /** @description Optimistic-lock version. Send back as the `If-Match` header when updating, moving, or deleting to detect concurrent edits. */
1983
2011
  version: number;
1984
2012
  };
2013
+ CreateNodeDto: {
2014
+ /** @description Parent node ID (null for root) */
2015
+ parent_node_id?: string;
2016
+ /** @description Node type (org-defined, e.g. 'department', 'team') */
2017
+ node_type: string;
2018
+ /** @description Display name for the node */
2019
+ name: string;
2020
+ /** @description Optional free-text description shown under the node name */
2021
+ description?: string;
2022
+ /** @description URL-friendly slug (auto-generated if omitted) */
2023
+ slug?: string;
2024
+ /** @description Arbitrary metadata */
2025
+ metadata?: Record<string, unknown>;
2026
+ };
1985
2027
  HierarchyTreeNodeDto: {
1986
2028
  id: string;
1987
2029
  name: string;
@@ -2221,6 +2263,44 @@ interface components {
2221
2263
  /** @description Whether this row should appear on a future end-user `My security activity` surface. Not consumed by current reads. */
2222
2264
  identity_visible: boolean;
2223
2265
  };
2266
+ ExportJobDto: {
2267
+ /** Format: uuid */
2268
+ id: string;
2269
+ /**
2270
+ * @description `pending` (enqueued), `processing` (worker rendering), `completed` (file ready), or `failed` (see `error`).
2271
+ * @enum {string}
2272
+ */
2273
+ status: "pending" | "processing" | "completed" | "failed";
2274
+ /**
2275
+ * @description The audit surface the export was taken from.
2276
+ * @enum {string}
2277
+ */
2278
+ surface: "admin" | "identities";
2279
+ /**
2280
+ * @description Wire format of the rendered file.
2281
+ * @enum {string}
2282
+ */
2283
+ format: "csv" | "ndjson";
2284
+ /** Format: uuid */
2285
+ application_id?: string | null;
2286
+ /** Format: uuid */
2287
+ environment_id?: string | null;
2288
+ /** @description Rows written, set once the job completes. */
2289
+ row_count?: number | null;
2290
+ /** @description Failure detail, present only when `status` is `failed`. */
2291
+ error?: string | null;
2292
+ /** Format: date-time */
2293
+ created_at: string;
2294
+ /** Format: date-time */
2295
+ completed_at?: string | null;
2296
+ /**
2297
+ * Format: date-time
2298
+ * @description When the stored file + this record become eligible for sweep.
2299
+ */
2300
+ expires_at?: string | null;
2301
+ /** @description Short-lived signed download URL. Present only on the single-job read of a completed job; `null` otherwise. */
2302
+ download_url?: string | null;
2303
+ };
2224
2304
  AuditExportQueryDto: {
2225
2305
  /**
2226
2306
  * Format: date-time
@@ -2269,44 +2349,6 @@ interface components {
2269
2349
  */
2270
2350
  format: "csv" | "ndjson";
2271
2351
  };
2272
- ExportJobDto: {
2273
- /** Format: uuid */
2274
- id: string;
2275
- /**
2276
- * @description `pending` (enqueued), `processing` (worker rendering), `completed` (file ready), or `failed` (see `error`).
2277
- * @enum {string}
2278
- */
2279
- status: "pending" | "processing" | "completed" | "failed";
2280
- /**
2281
- * @description The audit surface the export was taken from.
2282
- * @enum {string}
2283
- */
2284
- surface: "admin" | "identities";
2285
- /**
2286
- * @description Wire format of the rendered file.
2287
- * @enum {string}
2288
- */
2289
- format: "csv" | "ndjson";
2290
- /** Format: uuid */
2291
- application_id?: string | null;
2292
- /** Format: uuid */
2293
- environment_id?: string | null;
2294
- /** @description Rows written, set once the job completes. */
2295
- row_count?: number | null;
2296
- /** @description Failure detail, present only when `status` is `failed`. */
2297
- error?: string | null;
2298
- /** Format: date-time */
2299
- created_at: string;
2300
- /** Format: date-time */
2301
- completed_at?: string | null;
2302
- /**
2303
- * Format: date-time
2304
- * @description When the stored file + this record become eligible for sweep.
2305
- */
2306
- expires_at?: string | null;
2307
- /** @description Short-lived signed download URL. Present only on the single-job read of a completed job; `null` otherwise. */
2308
- download_url?: string | null;
2309
- };
2310
2352
  AuditLogDetailResponseDto: {
2311
2353
  id: string;
2312
2354
  account_id?: string | null;
@@ -2399,11 +2441,6 @@ interface components {
2399
2441
  /** @description Node type used when the root node is auto-created. Must be one of `node_types`. */
2400
2442
  root_node_type: string;
2401
2443
  };
2402
- CreateWebhookDto: {
2403
- url: string;
2404
- event_types: string[];
2405
- description?: string;
2406
- };
2407
2444
  WebhookCreatedResponseDto: {
2408
2445
  id: string;
2409
2446
  /** @enum {string} */
@@ -2417,6 +2454,11 @@ interface components {
2417
2454
  /** @description HMAC secret — only shown once on creation */
2418
2455
  secret: string;
2419
2456
  };
2457
+ CreateWebhookDto: {
2458
+ url: string;
2459
+ event_types: string[];
2460
+ description?: string;
2461
+ };
2420
2462
  WebhookResponseDto: {
2421
2463
  id: string;
2422
2464
  /** @enum {string} */
@@ -2452,21 +2494,6 @@ interface components {
2452
2494
  description?: string | null;
2453
2495
  is_active?: boolean;
2454
2496
  };
2455
- CreateApiKeyDto: {
2456
- /** @description API key name */
2457
- name: string;
2458
- /** @description API key description */
2459
- description?: string;
2460
- /**
2461
- * @description Required. `scoped` enforces the `scopes` array on every authorization check (deny if the requested permission isn't listed). `full_access` bypasses RBAC entirely within the key's Application — every permission is granted. Pick `scoped` whenever possible; `full_access` should be a deliberate choice (use cases: bootstrap automation, trusted backend services that legitimately need App-wide access). `scoped` requires a non-empty `scopes` array; `full_access` forbids `scopes`.
2462
- * @enum {string}
2463
- */
2464
- access_mode: "scoped" | "full_access";
2465
- /** @description Permission scopes this key is authorized for. Required and must be non-empty when `access_mode` is `scoped`. Must be omitted when `access_mode` is `full_access`. */
2466
- scopes?: string[];
2467
- /** @description Expiration date (ISO 8601). Omit for no expiration. */
2468
- expires_at?: string;
2469
- };
2470
2497
  ApiKeyCreatedResponseDto: {
2471
2498
  id: string;
2472
2499
  name: string;
@@ -2485,6 +2512,21 @@ interface components {
2485
2512
  /** Format: date-time */
2486
2513
  created_at: string;
2487
2514
  };
2515
+ CreateApiKeyDto: {
2516
+ /** @description API key name */
2517
+ name: string;
2518
+ /** @description API key description */
2519
+ description?: string;
2520
+ /**
2521
+ * @description Required. `scoped` enforces the `scopes` array on every authorization check (deny if the requested permission isn't listed). `full_access` bypasses RBAC entirely within the key's Application — every permission is granted. Pick `scoped` whenever possible; `full_access` should be a deliberate choice (use cases: bootstrap automation, trusted backend services that legitimately need App-wide access). `scoped` requires a non-empty `scopes` array; `full_access` forbids `scopes`.
2522
+ * @enum {string}
2523
+ */
2524
+ access_mode: "scoped" | "full_access";
2525
+ /** @description Permission scopes this key is authorized for. Required and must be non-empty when `access_mode` is `scoped`. Must be omitted when `access_mode` is `full_access`. */
2526
+ scopes?: string[];
2527
+ /** @description Expiration date (ISO 8601). Omit for no expiration. */
2528
+ expires_at?: string;
2529
+ };
2488
2530
  ApiKeyResponseDto: {
2489
2531
  id: string;
2490
2532
  client_id: string;
@@ -2645,7 +2687,9 @@ interface operations {
2645
2687
  [name: string]: unknown;
2646
2688
  };
2647
2689
  content: {
2648
- "application/json": components["schemas"]["PermissionResponseDto"];
2690
+ "application/json": {
2691
+ data: components["schemas"]["PermissionResponseDto"];
2692
+ };
2649
2693
  };
2650
2694
  };
2651
2695
  /** @description Invalid or expired token */
@@ -2709,7 +2753,9 @@ interface operations {
2709
2753
  [name: string]: unknown;
2710
2754
  };
2711
2755
  content: {
2712
- "application/json": components["schemas"]["PermissionResponseDto"];
2756
+ "application/json": {
2757
+ data: components["schemas"]["PermissionResponseDto"];
2758
+ };
2713
2759
  };
2714
2760
  };
2715
2761
  /** @description Invalid or expired token */
@@ -2868,7 +2914,9 @@ interface operations {
2868
2914
  [name: string]: unknown;
2869
2915
  };
2870
2916
  content: {
2871
- "application/json": components["schemas"]["PermissionResponseDto"];
2917
+ "application/json": {
2918
+ data: components["schemas"]["PermissionResponseDto"];
2919
+ };
2872
2920
  };
2873
2921
  };
2874
2922
  /** @description Invalid or expired token */
@@ -2936,6 +2984,93 @@ interface operations {
2936
2984
  };
2937
2985
  };
2938
2986
  };
2987
+ ApiPermissionsController_getPermissionUsage: {
2988
+ parameters: {
2989
+ query?: never;
2990
+ header?: never;
2991
+ path: {
2992
+ id: string;
2993
+ };
2994
+ cookie?: never;
2995
+ };
2996
+ requestBody?: never;
2997
+ responses: {
2998
+ /** @description Granting roles and identity reach returned */
2999
+ 200: {
3000
+ headers: {
3001
+ [name: string]: unknown;
3002
+ };
3003
+ content: {
3004
+ "application/json": {
3005
+ data: components["schemas"]["PermissionUsageDto"];
3006
+ };
3007
+ };
3008
+ };
3009
+ /** @description Invalid or expired token */
3010
+ 401: {
3011
+ headers: {
3012
+ [name: string]: unknown;
3013
+ };
3014
+ content: {
3015
+ /**
3016
+ * @example {
3017
+ * "error": {
3018
+ * "statusCode": 401,
3019
+ * "code": null,
3020
+ * "message": "Invalid or expired token",
3021
+ * "timestamp": "2026-04-20T12:00:00.000Z",
3022
+ * "path": "/api/v1/permissions",
3023
+ * "method": "GET"
3024
+ * }
3025
+ * }
3026
+ */
3027
+ "application/json": components["schemas"]["ErrorResponseDto"];
3028
+ };
3029
+ };
3030
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
3031
+ 403: {
3032
+ headers: {
3033
+ [name: string]: unknown;
3034
+ };
3035
+ content: {
3036
+ /**
3037
+ * @example {
3038
+ * "error": {
3039
+ * "statusCode": 403,
3040
+ * "code": null,
3041
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
3042
+ * "timestamp": "2026-04-20T12:00:00.000Z",
3043
+ * "path": "/api/v1/permissions",
3044
+ * "method": "GET"
3045
+ * }
3046
+ * }
3047
+ */
3048
+ "application/json": components["schemas"]["ErrorResponseDto"];
3049
+ };
3050
+ };
3051
+ /** @description No permission with that id exists in this Environment */
3052
+ 404: {
3053
+ headers: {
3054
+ [name: string]: unknown;
3055
+ };
3056
+ content: {
3057
+ /**
3058
+ * @example {
3059
+ * "error": {
3060
+ * "statusCode": 404,
3061
+ * "code": null,
3062
+ * "message": "No permission with that id exists in this Environment",
3063
+ * "timestamp": "2026-04-20T12:00:00.000Z",
3064
+ * "path": "/api/v1/permissions/{id}/usage",
3065
+ * "method": "GET"
3066
+ * }
3067
+ * }
3068
+ */
3069
+ "application/json": components["schemas"]["ErrorResponseDto"];
3070
+ };
3071
+ };
3072
+ };
3073
+ };
2939
3074
  ApiPermissionsController_evaluate: {
2940
3075
  parameters: {
2941
3076
  query?: never;
@@ -2955,7 +3090,9 @@ interface operations {
2955
3090
  [name: string]: unknown;
2956
3091
  };
2957
3092
  content: {
2958
- "application/json": components["schemas"]["EvaluateResponseDto"];
3093
+ "application/json": {
3094
+ data: components["schemas"]["EvaluateResponseDto"];
3095
+ };
2959
3096
  };
2960
3097
  };
2961
3098
  /** @description Invalid or expired token */
@@ -3089,7 +3226,9 @@ interface operations {
3089
3226
  [name: string]: unknown;
3090
3227
  };
3091
3228
  content: {
3092
- "application/json": components["schemas"]["PermissionTraceDto"];
3229
+ "application/json": {
3230
+ data: components["schemas"]["PermissionTraceDto"];
3231
+ };
3093
3232
  };
3094
3233
  };
3095
3234
  /** @description Invalid or expired token */
@@ -3252,7 +3391,9 @@ interface operations {
3252
3391
  [name: string]: unknown;
3253
3392
  };
3254
3393
  content: {
3255
- "application/json": components["schemas"]["IdentityResponseDto"];
3394
+ "application/json": {
3395
+ data: components["schemas"]["IdentityResponseDto"];
3396
+ };
3256
3397
  };
3257
3398
  };
3258
3399
  /** @description Password rejected — appeared in a known data breach (HaveIBeenPwned check) */
@@ -3436,7 +3577,9 @@ interface operations {
3436
3577
  [name: string]: unknown;
3437
3578
  };
3438
3579
  content: {
3439
- "application/json": components["schemas"]["IdentitiesSummaryDto"];
3580
+ "application/json": {
3581
+ data: components["schemas"]["IdentitiesSummaryDto"];
3582
+ };
3440
3583
  };
3441
3584
  };
3442
3585
  /** @description Invalid or expired token */
@@ -3624,7 +3767,9 @@ interface operations {
3624
3767
  [name: string]: unknown;
3625
3768
  };
3626
3769
  content: {
3627
- "application/json": components["schemas"]["IdentityResponseDto"];
3770
+ "application/json": {
3771
+ data: components["schemas"]["IdentityResponseDto"];
3772
+ };
3628
3773
  };
3629
3774
  };
3630
3775
  /** @description Invalid or expired token */
@@ -3796,7 +3941,9 @@ interface operations {
3796
3941
  [name: string]: unknown;
3797
3942
  };
3798
3943
  content: {
3799
- "application/json": components["schemas"]["IdentityResponseDto"];
3944
+ "application/json": {
3945
+ data: components["schemas"]["IdentityResponseDto"];
3946
+ };
3800
3947
  };
3801
3948
  };
3802
3949
  /** @description Invalid or expired token */
@@ -3881,7 +4028,9 @@ interface operations {
3881
4028
  [name: string]: unknown;
3882
4029
  };
3883
4030
  content: {
3884
- "application/json": components["schemas"]["IdentityDetailResponseDto"];
4031
+ "application/json": {
4032
+ data: components["schemas"]["IdentityDetailResponseDto"];
4033
+ };
3885
4034
  };
3886
4035
  };
3887
4036
  /** @description Invalid or expired token */
@@ -3966,7 +4115,9 @@ interface operations {
3966
4115
  [name: string]: unknown;
3967
4116
  };
3968
4117
  content: {
3969
- "application/json": components["schemas"]["MessageResponseDto"];
4118
+ "application/json": {
4119
+ data: components["schemas"]["MessageResponseDto"];
4120
+ };
3970
4121
  };
3971
4122
  };
3972
4123
  /** @description Invalid or expired token */
@@ -4051,7 +4202,9 @@ interface operations {
4051
4202
  [name: string]: unknown;
4052
4203
  };
4053
4204
  content: {
4054
- "application/json": components["schemas"]["MessageResponseDto"];
4205
+ "application/json": {
4206
+ data: components["schemas"]["MessageResponseDto"];
4207
+ };
4055
4208
  };
4056
4209
  };
4057
4210
  /** @description Invalid or expired token */
@@ -4410,7 +4563,9 @@ interface operations {
4410
4563
  [name: string]: unknown;
4411
4564
  };
4412
4565
  content: {
4413
- "application/json": components["schemas"]["AccountIdentityMfaResponseDto"];
4566
+ "application/json": {
4567
+ data: components["schemas"]["AccountIdentityMfaResponseDto"];
4568
+ };
4414
4569
  };
4415
4570
  };
4416
4571
  /** @description Invalid or expired token */
@@ -4578,7 +4733,9 @@ interface operations {
4578
4733
  [name: string]: unknown;
4579
4734
  };
4580
4735
  content: {
4581
- "application/json": components["schemas"]["IdentityAuthStateResponseDto"];
4736
+ "application/json": {
4737
+ data: components["schemas"]["IdentityAuthStateResponseDto"];
4738
+ };
4582
4739
  };
4583
4740
  };
4584
4741
  /** @description Invalid or expired token */
@@ -5080,7 +5237,9 @@ interface operations {
5080
5237
  [name: string]: unknown;
5081
5238
  };
5082
5239
  content: {
5083
- "application/json": components["schemas"]["ApiIdentityInviteResponseDto"];
5240
+ "application/json": {
5241
+ data: components["schemas"]["ApiIdentityInviteResponseDto"];
5242
+ };
5084
5243
  };
5085
5244
  };
5086
5245
  /** @description Invalid or expired token */
@@ -5142,7 +5301,9 @@ interface operations {
5142
5301
  [name: string]: unknown;
5143
5302
  };
5144
5303
  content: {
5145
- "application/json": components["schemas"]["IdentityInvitesSummaryDto"];
5304
+ "application/json": {
5305
+ data: components["schemas"]["IdentityInvitesSummaryDto"];
5306
+ };
5146
5307
  };
5147
5308
  };
5148
5309
  /** @description Invalid or expired token */
@@ -5330,7 +5491,9 @@ interface operations {
5330
5491
  [name: string]: unknown;
5331
5492
  };
5332
5493
  content: {
5333
- "application/json": components["schemas"]["ApiIdentityInviteResendResponseDto"];
5494
+ "application/json": {
5495
+ data: components["schemas"]["ApiIdentityInviteResendResponseDto"];
5496
+ };
5334
5497
  };
5335
5498
  };
5336
5499
  /** @description Invite is no longer pending */
@@ -5541,7 +5704,9 @@ interface operations {
5541
5704
  [name: string]: unknown;
5542
5705
  };
5543
5706
  content: {
5544
- "application/json": components["schemas"]["ScopedHierarchyTreeResponseDto"];
5707
+ "application/json": {
5708
+ data: components["schemas"]["ScopedHierarchyTreeResponseDto"];
5709
+ };
5545
5710
  };
5546
5711
  };
5547
5712
  /** @description The hierarchy is unchanged since the supplied `ETag`. No body; keep using the cached tree. */
@@ -5614,7 +5779,9 @@ interface operations {
5614
5779
  [name: string]: unknown;
5615
5780
  };
5616
5781
  content: {
5617
- "application/json": components["schemas"]["NodeResponseDto"];
5782
+ "application/json": {
5783
+ data: components["schemas"]["NodeResponseDto"];
5784
+ };
5618
5785
  };
5619
5786
  };
5620
5787
  /** @description Invalid parent-child relationship */
@@ -5794,7 +5961,9 @@ interface operations {
5794
5961
  [name: string]: unknown;
5795
5962
  };
5796
5963
  content: {
5797
- "application/json": components["schemas"]["NodeAccessResponseDto"];
5964
+ "application/json": {
5965
+ data: components["schemas"]["NodeAccessResponseDto"];
5966
+ };
5798
5967
  };
5799
5968
  };
5800
5969
  /** @description Invalid or expired token */
@@ -5995,7 +6164,9 @@ interface operations {
5995
6164
  [name: string]: unknown;
5996
6165
  };
5997
6166
  content: {
5998
- "application/json": components["schemas"]["NodeResponseDto"];
6167
+ "application/json": {
6168
+ data: components["schemas"]["NodeResponseDto"];
6169
+ };
5999
6170
  };
6000
6171
  };
6001
6172
  /** @description Invalid parent-child relationship */
@@ -6122,7 +6293,9 @@ interface operations {
6122
6293
  [name: string]: unknown;
6123
6294
  };
6124
6295
  content: {
6125
- "application/json": components["schemas"]["HierarchyTreeNodeDto"];
6296
+ "application/json": {
6297
+ data: components["schemas"]["HierarchyTreeNodeDto"];
6298
+ };
6126
6299
  };
6127
6300
  };
6128
6301
  /** @description Invalid or expired token */
@@ -6326,7 +6499,9 @@ interface operations {
6326
6499
  [name: string]: unknown;
6327
6500
  };
6328
6501
  content: {
6329
- "application/json": components["schemas"]["NodeResponseDto"];
6502
+ "application/json": {
6503
+ data: components["schemas"]["NodeResponseDto"];
6504
+ };
6330
6505
  };
6331
6506
  };
6332
6507
  /** @description Invalid or expired token */
@@ -6539,7 +6714,9 @@ interface operations {
6539
6714
  [name: string]: unknown;
6540
6715
  };
6541
6716
  content: {
6542
- "application/json": components["schemas"]["NodeIdentitiesSummaryDto"];
6717
+ "application/json": {
6718
+ data: components["schemas"]["NodeIdentitiesSummaryDto"];
6719
+ };
6543
6720
  };
6544
6721
  };
6545
6722
  /** @description Invalid or expired token */
@@ -6693,7 +6870,9 @@ interface operations {
6693
6870
  [name: string]: unknown;
6694
6871
  };
6695
6872
  content: {
6696
- "application/json": components["schemas"]["RoleResponseDto"];
6873
+ "application/json": {
6874
+ data: components["schemas"]["RoleResponseDto"];
6875
+ };
6697
6876
  };
6698
6877
  };
6699
6878
  /** @description Invalid or expired token */
@@ -6778,7 +6957,9 @@ interface operations {
6778
6957
  [name: string]: unknown;
6779
6958
  };
6780
6959
  content: {
6781
- "application/json": components["schemas"]["RoleResponseDto"];
6960
+ "application/json": {
6961
+ data: components["schemas"]["RoleResponseDto"];
6962
+ };
6782
6963
  };
6783
6964
  };
6784
6965
  /** @description Invalid or expired token */
@@ -6979,7 +7160,9 @@ interface operations {
6979
7160
  [name: string]: unknown;
6980
7161
  };
6981
7162
  content: {
6982
- "application/json": components["schemas"]["RoleResponseDto"];
7163
+ "application/json": {
7164
+ data: components["schemas"]["RoleResponseDto"];
7165
+ };
6983
7166
  };
6984
7167
  };
6985
7168
  /** @description Invalid or expired token */
@@ -7176,7 +7359,9 @@ interface operations {
7176
7359
  [name: string]: unknown;
7177
7360
  };
7178
7361
  content: {
7179
- "application/json": components["schemas"]["MessageResponseDto"];
7362
+ "application/json": {
7363
+ data: components["schemas"]["MessageResponseDto"];
7364
+ };
7180
7365
  };
7181
7366
  };
7182
7367
  /** @description Invalid or expired token */
@@ -7341,7 +7526,9 @@ interface operations {
7341
7526
  [name: string]: unknown;
7342
7527
  };
7343
7528
  content: {
7344
- "application/json": components["schemas"]["AssignmentsSummaryDto"];
7529
+ "application/json": {
7530
+ data: components["schemas"]["AssignmentsSummaryDto"];
7531
+ };
7345
7532
  };
7346
7533
  };
7347
7534
  /** @description Invalid or expired token */
@@ -7407,7 +7594,9 @@ interface operations {
7407
7594
  [name: string]: unknown;
7408
7595
  };
7409
7596
  content: {
7410
- "application/json": components["schemas"]["AssignmentResponseDto"];
7597
+ "application/json": {
7598
+ data: components["schemas"]["AssignmentResponseDto"];
7599
+ };
7411
7600
  };
7412
7601
  };
7413
7602
  /** @description System roles cannot be assigned to identities — they are reserved for platform administration */
@@ -7600,7 +7789,9 @@ interface operations {
7600
7789
  [name: string]: unknown;
7601
7790
  };
7602
7791
  content: {
7603
- "application/json": components["schemas"]["AssignmentResponseDto"];
7792
+ "application/json": {
7793
+ data: components["schemas"]["AssignmentResponseDto"];
7794
+ };
7604
7795
  };
7605
7796
  };
7606
7797
  /** @description System roles cannot be assigned to identities — they are reserved for platform administration */
@@ -7772,7 +7963,9 @@ interface operations {
7772
7963
  [name: string]: unknown;
7773
7964
  };
7774
7965
  content: {
7775
- "application/json": components["schemas"]["MessageResponseDto"];
7966
+ "application/json": {
7967
+ data: components["schemas"]["MessageResponseDto"];
7968
+ };
7776
7969
  };
7777
7970
  };
7778
7971
  /** @description System roles cannot be assigned to identities — they are reserved for platform administration */
@@ -8160,7 +8353,9 @@ interface operations {
8160
8353
  [name: string]: unknown;
8161
8354
  };
8162
8355
  content: {
8163
- "application/json": components["schemas"]["ExportJobDto"];
8356
+ "application/json": {
8357
+ data: components["schemas"]["ExportJobDto"];
8358
+ };
8164
8359
  };
8165
8360
  };
8166
8361
  /** @description Invalid or expired token */
@@ -8224,7 +8419,9 @@ interface operations {
8224
8419
  [name: string]: unknown;
8225
8420
  };
8226
8421
  content: {
8227
- "application/json": components["schemas"]["ExportJobDto"];
8422
+ "application/json": {
8423
+ data: components["schemas"]["ExportJobDto"];
8424
+ };
8228
8425
  };
8229
8426
  };
8230
8427
  /** @description Invalid or expired token */
@@ -8392,7 +8589,9 @@ interface operations {
8392
8589
  [name: string]: unknown;
8393
8590
  };
8394
8591
  content: {
8395
- "application/json": components["schemas"]["AuditLogDetailResponseDto"];
8592
+ "application/json": {
8593
+ data: components["schemas"]["AuditLogDetailResponseDto"];
8594
+ };
8396
8595
  };
8397
8596
  };
8398
8597
  /** @description Invalid or expired token */
@@ -8569,7 +8768,9 @@ interface operations {
8569
8768
  [name: string]: unknown;
8570
8769
  };
8571
8770
  content: {
8572
- "application/json": components["schemas"]["HierarchySchemaResponseDto"];
8771
+ "application/json": {
8772
+ data: components["schemas"]["HierarchySchemaResponseDto"];
8773
+ };
8573
8774
  };
8574
8775
  };
8575
8776
  /** @description Invalid or expired token */
@@ -8639,7 +8840,9 @@ interface operations {
8639
8840
  [name: string]: unknown;
8640
8841
  };
8641
8842
  content: {
8642
- "application/json": components["schemas"]["HierarchySchemaResponseDto"];
8843
+ "application/json": {
8844
+ data: components["schemas"]["HierarchySchemaResponseDto"];
8845
+ };
8643
8846
  };
8644
8847
  };
8645
8848
  /** @description Invalid or expired token */
@@ -8802,7 +9005,9 @@ interface operations {
8802
9005
  [name: string]: unknown;
8803
9006
  };
8804
9007
  content: {
8805
- "application/json": components["schemas"]["WebhookCreatedResponseDto"];
9008
+ "application/json": {
9009
+ data: components["schemas"]["WebhookCreatedResponseDto"];
9010
+ };
8806
9011
  };
8807
9012
  };
8808
9013
  /** @description One or more event types are not supported */
@@ -9050,7 +9255,9 @@ interface operations {
9050
9255
  [name: string]: unknown;
9051
9256
  };
9052
9257
  content: {
9053
- "application/json": components["schemas"]["WebhookResponseDto"];
9258
+ "application/json": {
9259
+ data: components["schemas"]["WebhookResponseDto"];
9260
+ };
9054
9261
  };
9055
9262
  };
9056
9263
  /** @description Invalid or expired token */
@@ -9222,7 +9429,9 @@ interface operations {
9222
9429
  [name: string]: unknown;
9223
9430
  };
9224
9431
  content: {
9225
- "application/json": components["schemas"]["WebhookResponseDto"];
9432
+ "application/json": {
9433
+ data: components["schemas"]["WebhookResponseDto"];
9434
+ };
9226
9435
  };
9227
9436
  };
9228
9437
  /** @description One or more event types are not supported */
@@ -9406,7 +9615,9 @@ interface operations {
9406
9615
  [name: string]: unknown;
9407
9616
  };
9408
9617
  content: {
9409
- "application/json": components["schemas"]["ApiKeyCreatedResponseDto"];
9618
+ "application/json": {
9619
+ data: components["schemas"]["ApiKeyCreatedResponseDto"];
9620
+ };
9410
9621
  };
9411
9622
  };
9412
9623
  /** @description Invalid or expired token */
@@ -9557,7 +9768,9 @@ interface operations {
9557
9768
  [name: string]: unknown;
9558
9769
  };
9559
9770
  content: {
9560
- "application/json": components["schemas"]["ApiKeyResponseDto"];
9771
+ "application/json": {
9772
+ data: components["schemas"]["ApiKeyResponseDto"];
9773
+ };
9561
9774
  };
9562
9775
  };
9563
9776
  /** @description Invalid or expired token */
@@ -9642,7 +9855,9 @@ interface operations {
9642
9855
  [name: string]: unknown;
9643
9856
  };
9644
9857
  content: {
9645
- "application/json": components["schemas"]["ApiKeyCreatedResponseDto"];
9858
+ "application/json": {
9859
+ data: components["schemas"]["ApiKeyCreatedResponseDto"];
9860
+ };
9646
9861
  };
9647
9862
  };
9648
9863
  /** @description Invalid or expired token */
@@ -10075,10 +10290,26 @@ declare class LocalAuthorizer {
10075
10290
  /** Counters for observability — how much traffic the cache is actually saving. */
10076
10291
  snapshot(): LocalAuthorizerStats;
10077
10292
  /**
10078
- * Drop everything held. Not needed in normal operation, where entries expire
10079
- * on their own; useful in tests and after a known change.
10293
+ * Drop what is held so the next evaluate refetches.
10294
+ *
10295
+ * With an `identityId`, only that identity's grants are dropped — the
10296
+ * cached hierarchy and every other identity's entries stay warm. This is
10297
+ * the shape an assignment webhook wants: the event names the identity
10298
+ * whose authority moved, and nothing else needs to pay a refetch for it.
10299
+ *
10300
+ * With no argument, everything goes: grants and the hierarchy tree. Not
10301
+ * needed in normal operation, where entries expire on their own; useful in
10302
+ * tests and after a change whose reach you cannot name (a role's
10303
+ * permissions edited, a node moved).
10304
+ *
10305
+ * Multi-instance honesty: an invalidation reaches THIS process only. A
10306
+ * webhook lands on one instance behind a load balancer; the others serve
10307
+ * their cached grants until their own TTL expires. Unless the app fans the
10308
+ * event out over its own pub/sub, the fleet-wide revocation guarantee is
10309
+ * the TTL, and webhook-driven invalidation is a latency optimization on
10310
+ * top of it — size the TTL to the revocation latency you can promise.
10080
10311
  */
10081
- invalidate(): void;
10312
+ invalidate(identityId?: string): void;
10082
10313
  /** Climb from `nodeId` and look for a grant root among its ancestors. */
10083
10314
  private holdsAtNode;
10084
10315
  private grantRootsFor;