@atlasauth/backend 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/dist/client/abac.d.ts +389 -0
  3. package/dist/client/abac.js +98 -0
  4. package/dist/client/abac.js.map +1 -1
  5. package/dist/client/analytics-reports.d.ts +1 -1
  6. package/dist/client/authz-decisions.d.ts +108 -0
  7. package/dist/client/authz-decisions.js +40 -0
  8. package/dist/client/authz-decisions.js.map +1 -0
  9. package/dist/client/connections.d.ts +507 -0
  10. package/dist/client/connections.js +164 -0
  11. package/dist/client/connections.js.map +1 -0
  12. package/dist/client/custom-oauth-providers.d.ts +15 -0
  13. package/dist/client/custom-oauth-providers.js.map +1 -1
  14. package/dist/client/desktop-mfa.d.ts +104 -0
  15. package/dist/client/desktop-mfa.js +44 -0
  16. package/dist/client/desktop-mfa.js.map +1 -0
  17. package/dist/client/email-templates.d.ts +1 -1
  18. package/dist/client/email-templates.js.map +1 -1
  19. package/dist/client/fga.d.ts +125 -4
  20. package/dist/client/fga.js +40 -0
  21. package/dist/client/fga.js.map +1 -1
  22. package/dist/client/iga.d.ts +436 -0
  23. package/dist/client/iga.js +82 -0
  24. package/dist/client/iga.js.map +1 -0
  25. package/dist/client/index.d.ts +490 -2
  26. package/dist/client/index.js +23 -0
  27. package/dist/client/index.js.map +1 -1
  28. package/dist/client/least-privilege.d.ts +95 -0
  29. package/dist/client/least-privilege.js +28 -0
  30. package/dist/client/least-privilege.js.map +1 -0
  31. package/dist/client/managed-grants.d.ts +52 -0
  32. package/dist/client/managed-grants.js +28 -0
  33. package/dist/client/managed-grants.js.map +1 -0
  34. package/dist/client/mcp-gateways.d.ts +72 -0
  35. package/dist/client/mcp-gateways.js +22 -0
  36. package/dist/client/mcp-gateways.js.map +1 -1
  37. package/dist/client/oauth-clients.d.ts +4 -0
  38. package/dist/client/oauth-clients.js.map +1 -1
  39. package/dist/client/openfga.d.ts +90 -3
  40. package/dist/client/openfga.js +27 -1
  41. package/dist/client/openfga.js.map +1 -1
  42. package/dist/client/policy-bundles.d.ts +105 -0
  43. package/dist/client/policy-bundles.js +38 -0
  44. package/dist/client/policy-bundles.js.map +1 -0
  45. package/dist/client/resources.d.ts +1 -0
  46. package/dist/client/resources.js.map +1 -1
  47. package/dist/client/ssf.d.ts +2 -1
  48. package/dist/client/ssf.js.map +1 -1
  49. package/dist/client/vc.d.ts +8 -0
  50. package/dist/client/vc.js.map +1 -1
  51. package/dist/index.d.ts +2 -0
  52. package/dist/index.js +3 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/policy-bundle.d.ts +110 -0
  55. package/dist/policy-bundle.js +289 -0
  56. package/dist/policy-bundle.js.map +1 -0
  57. package/dist/uma.d.ts +77 -0
  58. package/dist/uma.js +95 -0
  59. package/dist/uma.js.map +1 -0
  60. package/package.json +2 -2
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.connectionsResource = connectionsResource;
4
+ const request_1 = require("./request");
5
+ const SKEW_MS = 60_000;
6
+ async function sha256Hex(text) {
7
+ const d = await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));
8
+ return [...new Uint8Array(d)].map((b) => b.toString(16).padStart(2, '0')).join('');
9
+ }
10
+ /** Org- or user-owned provider connections and their stored tokens. */
11
+ function connectionsResource(request) {
12
+ // Tokens read by this client, reused until shortly before the provider's `expires_at`. A token with no expiry is never cached.
13
+ const cache = new Map();
14
+ const live = (t, minTtlSeconds) => !!t && t.expires_at !== null && t.expires_at - Date.now() > Math.max(minTtlSeconds * 1000, SKEW_MS);
15
+ const remember = (t) => {
16
+ if (t.expires_at !== null)
17
+ cache.set(t.connection_id, t);
18
+ else
19
+ cache.delete(t.connection_id);
20
+ return t;
21
+ };
22
+ return {
23
+ create(body, idempotencyKey) {
24
+ return request({ method: 'POST', path: '/v1/connections', body, idempotencyKey });
25
+ },
26
+ list(params = {}) {
27
+ return request({ method: 'GET', path: '/v1/connections', query: { ...params } });
28
+ },
29
+ get(id) {
30
+ return request({ method: 'GET', path: `/v1/connections/${(0, request_1.enc)(id)}` });
31
+ },
32
+ update(id, body) {
33
+ return request({ method: 'PATCH', path: `/v1/connections/${(0, request_1.enc)(id)}`, body });
34
+ },
35
+ /** Delete a connection. Pass `{ revoke: true }` to revoke at the provider first and learn what it said. */
36
+ delete(id, options = {}) {
37
+ cache.delete(id);
38
+ return request({ method: 'DELETE', path: `/v1/connections/${(0, request_1.enc)(id)}`, query: options.revoke ? { revoke: 'true' } : undefined });
39
+ },
40
+ /** Start the provider authorization; send the owner to `authorization_url`. */
41
+ connect(id, body) {
42
+ return request({ method: 'POST', path: `/v1/connections/${(0, request_1.enc)(id)}/connect`, body });
43
+ },
44
+ /** Revoke at the provider and forget the stored token. The answer says what the provider said (`provider_revoked`). */
45
+ revoke(id) {
46
+ cache.delete(id);
47
+ return request({ method: 'POST', path: `/v1/connections/${(0, request_1.enc)(id)}/revoke` });
48
+ },
49
+ /**
50
+ * The live token for your backend (refreshed when needed). Needs the `connections:token` scope.
51
+ * Reads are cached in this client until shortly before `expires_at` (and a cached read is `refreshed: false`),
52
+ * so calling it in a hot loop costs one request per connection per token lifetime.
53
+ */
54
+ async token(id, options = {}) {
55
+ const minTtl = options.minTtlSeconds ?? 0;
56
+ const hit = cache.get(id);
57
+ if (options.subject) {
58
+ return request({ method: 'GET', path: `/v1/connections/${(0, request_1.enc)(id)}/token`, query: { subject: options.subject, ...(options.refresh ? { refresh: 'true' } : {}) } });
59
+ }
60
+ if (!options.refresh && !options.noCache && live(hit, minTtl))
61
+ return { ...hit, refreshed: false };
62
+ const t = await request({
63
+ method: 'GET',
64
+ path: `/v1/connections/${(0, request_1.enc)(id)}/token`,
65
+ query: { ...(options.refresh ? { refresh: 'true' } : {}), ...(minTtl ? { min_ttl_seconds: String(minTtl) } : {}) },
66
+ });
67
+ return remember(t);
68
+ },
69
+ /**
70
+ * Call this when the provider answers 401 to a token you got from here. Pass the access token you were refused with
71
+ * (`staleAccessToken`): if Atlas already holds a newer one, you get it back without another call to the provider.
72
+ */
73
+ async refreshToken(id, options = {}) {
74
+ cache.delete(id);
75
+ const t = await request({
76
+ method: 'POST',
77
+ path: `/v1/connections/${(0, request_1.enc)(id)}/token/refresh`,
78
+ body: { reason: options.reason ?? 'provider_401', ...(options.staleAccessToken ? { stale_token_hash: await sha256Hex(options.staleAccessToken) } : {}) },
79
+ });
80
+ return remember(t);
81
+ },
82
+ /** Read up to 100 connections' tokens in one call. Each id has its own result, so one dead connection does not fail the rest. */
83
+ async tokens(ids, options = {}) {
84
+ const r = await request({
85
+ method: 'POST',
86
+ path: '/v1/connections/tokens/batch',
87
+ body: { ids, ...(options.minTtlSeconds ? { min_ttl_seconds: options.minTtlSeconds } : {}) },
88
+ });
89
+ for (const item of r.data)
90
+ if (item.status === 'ok' && item.token)
91
+ remember(item.token);
92
+ return r;
93
+ },
94
+ /** Bulk-import existing provider refresh tokens (up to 500 per call). Needs the `connections:import` scope. */
95
+ importConnections(body, idempotencyKey) {
96
+ return request({ method: 'POST', path: '/v1/connections/import', body, idempotencyKey });
97
+ },
98
+ /**
99
+ * Export connections. Without `include_secrets` it lists metadata. With it (scope `connections:export_secrets`) the tokens
100
+ * come back as one compact JWE sealed to `recipient_public_key`; open it with the matching private key.
101
+ */
102
+ exportConnections(body = {}) {
103
+ return request({ method: 'POST', path: '/v1/connections/export', body, headers: body.include_secrets ? { 'x-atlas-confirm': 'export-secrets' } : undefined });
104
+ },
105
+ /** Enter the credential of a non-OAuth connection (write-only; sealed in the vault, never returned). */
106
+ setCredentials(id, body) {
107
+ return request({ method: 'PUT', path: `/v1/connections/${(0, request_1.enc)(id)}/credentials`, body });
108
+ },
109
+ /** Rotate the credential; the replaced version stays valid for `overlap_seconds`. */
110
+ rotateCredentials(id, body) {
111
+ return request({ method: 'POST', path: `/v1/connections/${(0, request_1.enc)(id)}/credentials/rotate`, body });
112
+ },
113
+ /** The credential's vault versions (numbers and times, never values). */
114
+ secretVersions(id) {
115
+ return request({ method: 'GET', path: `/v1/connections/${(0, request_1.enc)(id)}/credentials/versions` });
116
+ },
117
+ /**
118
+ * Read an api_key, bearer, basic, custom_header or hmac_secret credential. Needs the `connections:secret_read`
119
+ * scope; every read is audited. `version` is `current` (default), `previous` (inside a rotation's overlap
120
+ * window) or a number. With `organizationId` the connection must belong to that organization (404 otherwise).
121
+ */
122
+ secret(id, options = {}) {
123
+ const path = options.organizationId ? `/v1/organizations/${(0, request_1.enc)(options.organizationId)}/connections/${(0, request_1.enc)(id)}/secret` : `/v1/connections/${(0, request_1.enc)(id)}/secret`;
124
+ return request({ method: 'GET', path, query: options.version === undefined ? undefined : { version: String(options.version) } });
125
+ },
126
+ /** Have Atlas sign a request with an oauth1 connection (needs `connections:sign`). */
127
+ oauth1Sign(id, body) {
128
+ return request({ method: 'POST', path: `/v1/connections/${(0, request_1.enc)(id)}/oauth1/sign`, body });
129
+ },
130
+ webhooks: {
131
+ /** Verify a provider webhook signature (needs `connections:webhook_verify`). */
132
+ verify(id, body) {
133
+ return request({ method: 'POST', path: `/v1/connections/${(0, request_1.enc)(id)}/webhooks/verify`, body });
134
+ },
135
+ createEndpoint(id, body) {
136
+ return request({ method: 'POST', path: `/v1/connections/${(0, request_1.enc)(id)}/webhook_endpoints`, body });
137
+ },
138
+ listEndpoints(id) {
139
+ return request({ method: 'GET', path: `/v1/connections/${(0, request_1.enc)(id)}/webhook_endpoints` });
140
+ },
141
+ updateEndpoint(id, endpointId, body) {
142
+ return request({ method: 'PATCH', path: `/v1/connections/${(0, request_1.enc)(id)}/webhook_endpoints/${(0, request_1.enc)(endpointId)}`, body });
143
+ },
144
+ deleteEndpoint(id, endpointId) {
145
+ return request({ method: 'DELETE', path: `/v1/connections/${(0, request_1.enc)(id)}/webhook_endpoints/${(0, request_1.enc)(endpointId)}` });
146
+ },
147
+ },
148
+ oauthClients: {
149
+ set(body) {
150
+ return request({ method: 'PUT', path: '/v1/connections/oauth_clients', body });
151
+ },
152
+ list(params = {}) {
153
+ return request({ method: 'GET', path: '/v1/connections/oauth_clients', query: { ...params } });
154
+ },
155
+ get(id) {
156
+ return request({ method: 'GET', path: `/v1/connections/oauth_clients/${(0, request_1.enc)(id)}` });
157
+ },
158
+ delete(id) {
159
+ return request({ method: 'DELETE', path: `/v1/connections/oauth_clients/${(0, request_1.enc)(id)}` });
160
+ },
161
+ },
162
+ };
163
+ }
164
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/client/connections.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,11 @@ export interface ProfileMapping {
42
42
  update_on_sign_in?: boolean;
43
43
  }
44
44
  export type TokenEndpointAuthMethod = 'client_secret_basic' | 'client_secret_post' | 'client_secret_jwt' | 'private_key_jwt' | 'none';
45
+ /** One connect-time host value: `{name}` in an endpoint URL is filled from `host_params.name`, which must match `pattern` as a whole. */
46
+ export interface HostParamsSchemaEntry {
47
+ name: string;
48
+ pattern: string;
49
+ }
45
50
  export interface UpstreamLogoutSettings {
46
51
  /** On Atlas sign-out, hand back the provider end-session URL to send the browser to. */
47
52
  rp_initiated?: boolean;
@@ -88,6 +93,11 @@ export interface CustomOAuthProviderSettings {
88
93
  userinfo_endpoint?: string | null;
89
94
  jwks_uri?: string | null;
90
95
  end_session_endpoint?: string | null;
96
+ revocation_endpoint?: string | null;
97
+ /** The connect-time `host_params` the `{name}` templates in the endpoints take (data-only providers, OAuth 2.0). */
98
+ host_params_schema?: HostParamsSchemaEntry[] | null;
99
+ /** Never a sign-in method: only connections use it. Required for endpoints with `{name}` templates. */
100
+ data_only?: boolean;
91
101
  scopes?: string[];
92
102
  scope_separator?: ' ' | ',' | '+';
93
103
  pkce?: boolean;
@@ -125,6 +135,11 @@ export interface CustomOAuthProvider extends UpstreamUrls {
125
135
  userinfo_endpoint: string | null;
126
136
  jwks_uri: string | null;
127
137
  end_session_endpoint: string | null;
138
+ /** RFC 7009 revoke endpoint; may carry `{name}` host templates. */
139
+ revocation_endpoint: string | null;
140
+ host_params_schema: HostParamsSchemaEntry[];
141
+ /** A data-only provider serves connections and is never a sign-in method. */
142
+ data_only: boolean;
128
143
  scopes: string[];
129
144
  scope_separator: ' ' | ',' | '+';
130
145
  pkce: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"custom-oauth-providers.js","sourceRoot":"","sources":["../../src/client/custom-oauth-providers.ts"],"names":[],"mappings":";;AAqOA,kDAcC;AAED,oEAqCC;AA1RD,uCAAgD;AAoOhD,kFAAkF;AAClF,SAAgB,mBAAmB,CAAC,OAAkB,EAAE,IAAY;IAClE,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,sFAAsF;QACtF,MAAM,CAAC,OAA8C,EAAE,EAAE,cAAuB;YAC9E,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,oDAAoD;QACpD,MAAM,CAAC,GAAW;YAChB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,iBAAiB,IAAA,aAAG,EAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAkB;IAC7D,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,8BAA8B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,CAAC;IACrE,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,CAAC,IAAmC,EAAE,cAAuB;YACjE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAiC,EAAE,cAAuB;YAC3E,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,wEAAwE;QACxE,QAAQ,CAAC,IAAgD;YACvD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;QACD;;;WAGG;QACH,qBAAqB,CAAC,IAA+B,EAAE,EAAW;YAChE,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,oDAAoD;gBACvG,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,WAAW,CAAC,EAAU;YACpB,OAAO,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"custom-oauth-providers.js","sourceRoot":"","sources":["../../src/client/custom-oauth-providers.ts"],"names":[],"mappings":";;AAqPA,kDAcC;AAED,oEAqCC;AA1SD,uCAAgD;AAoPhD,kFAAkF;AAClF,SAAgB,mBAAmB,CAAC,OAAkB,EAAE,IAAY;IAClE,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,sFAAsF;QACtF,MAAM,CAAC,OAA8C,EAAE,EAAE,cAAuB;YAC9E,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,oDAAoD;QACpD,MAAM,CAAC,GAAW;YAChB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,iBAAiB,IAAA,aAAG,EAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACtF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAkB;IAC7D,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,8BAA8B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,CAAC;IACrE,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,CAAC,IAAmC,EAAE,cAAuB;YACjE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAiC,EAAE,cAAuB;YAC3E,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,wEAAwE;QACxE,QAAQ,CAAC,IAAgD;YACvD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;QACD;;;WAGG;QACH,qBAAqB,CAAC,IAA+B,EAAE,EAAW;YAChE,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,oDAAoD;gBACvG,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,WAAW,CAAC,EAAU;YACpB,OAAO,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { type RequestFn } from './request';
2
+ export type DesktopMfaFactor = 'push' | 'totp' | 'passkey';
3
+ /** Who must pass a second factor at workstation login, with which factors, and how long offline unlock lasts. */
4
+ export interface DesktopMfaPolicy {
5
+ object: 'desktop_mfa_policy';
6
+ enabled: boolean;
7
+ applies_to: 'all' | 'selected';
8
+ user_ids: string[];
9
+ org_ids: string[];
10
+ allowed_factors: DesktopMfaFactor[];
11
+ offline_enabled: boolean;
12
+ offline_grace_hours: number;
13
+ offline_pin_required: boolean;
14
+ /** `account`: any passkey the user holds answers the passkey factor. `device`: only keys registered through that workstation. */
15
+ passkey_scope: 'account' | 'device';
16
+ /** Relying-party domain the agents use; null uses the application's passkey RP id. */
17
+ passkey_rp_id: string | null;
18
+ passkey_require_uv: boolean;
19
+ }
20
+ /** A passkey registered through a workstation. It answers the desktop passkey factor and never a web sign-in. */
21
+ export interface DesktopPasskey {
22
+ object: 'desktop_passkey';
23
+ id: string;
24
+ device_id: string;
25
+ user_id: string;
26
+ name: string | null;
27
+ aaguid: string | null;
28
+ transports: string[];
29
+ backed_up: boolean;
30
+ last_used_at: number | null;
31
+ created_at: number;
32
+ }
33
+ export type UpdateDesktopMfaPolicyBody = Partial<Omit<DesktopMfaPolicy, 'object'>>;
34
+ /** A workstation running the Atlas Windows or macOS login agent. */
35
+ export interface DesktopDevice {
36
+ object: 'desktop_device';
37
+ id: string;
38
+ user_id: string;
39
+ device_key_id: string;
40
+ hostname: string | null;
41
+ platform: 'windows' | 'macos' | 'linux';
42
+ agent_version: string | null;
43
+ status: 'active' | 'revoked';
44
+ offline_pin_set: boolean;
45
+ /** Raised to void every offline verifier issued so far. */
46
+ bundle_generation: number;
47
+ last_seen_at: number | null;
48
+ revoked_at: number | null;
49
+ created_at: number;
50
+ }
51
+ export interface DesktopDeviceDetail extends DesktopDevice {
52
+ offline_bundles: Array<{
53
+ id: string;
54
+ generation: number;
55
+ issued_at: number;
56
+ expires_at: number;
57
+ revoked_at: number | null;
58
+ }>;
59
+ }
60
+ export interface DesktopEnrolmentCode {
61
+ object: 'desktop_enrolment_code';
62
+ /** Shown once. The user types it into the workstation agent. */
63
+ code: string;
64
+ expires_at: number;
65
+ user_id: string;
66
+ }
67
+ /** Desktop-login MFA: policy, enrolment codes and enrolled workstations. */
68
+ export declare function desktopMfaResource(request: RequestFn): {
69
+ getPolicy(): Promise<DesktopMfaPolicy>;
70
+ /** Send only the fields to change. */
71
+ updatePolicy(body: UpdateDesktopMfaPolicyBody): Promise<DesktopMfaPolicy>;
72
+ /** A single-use code for a user to enrol a workstation (default 60 minutes, at most 7 days). */
73
+ createEnrolmentCode(body: {
74
+ user_id: string;
75
+ expires_in_minutes?: number;
76
+ }): Promise<DesktopEnrolmentCode>;
77
+ listDevices(query?: {
78
+ user_id?: string;
79
+ }): Promise<{
80
+ object: "list";
81
+ data: DesktopDevice[];
82
+ has_more: boolean;
83
+ }>;
84
+ getDevice(id: string): Promise<DesktopDeviceDetail>;
85
+ listDevicePasskeys(id: string): Promise<{
86
+ object: "list";
87
+ data: DesktopPasskey[];
88
+ has_more: boolean;
89
+ }>;
90
+ deleteDevicePasskey(id: string, passkeyId: string): Promise<{
91
+ object: "desktop_passkey";
92
+ id: string;
93
+ deleted: boolean;
94
+ }>;
95
+ /** The workstation's next call is refused and it wipes its offline cache. */
96
+ revokeDevice(id: string): Promise<DesktopDevice>;
97
+ /** Void every offline verifier without revoking the workstation; it gets a fresh one on its next sync. */
98
+ revokeOfflineCache(id: string): Promise<DesktopDevice>;
99
+ deleteDevice(id: string): Promise<{
100
+ object: "desktop_device";
101
+ id: string;
102
+ deleted: boolean;
103
+ }>;
104
+ };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.desktopMfaResource = desktopMfaResource;
4
+ const request_1 = require("./request");
5
+ /** Desktop-login MFA: policy, enrolment codes and enrolled workstations. */
6
+ function desktopMfaResource(request) {
7
+ return {
8
+ getPolicy() {
9
+ return request({ method: 'GET', path: '/v1/desktop_mfa/policy' });
10
+ },
11
+ /** Send only the fields to change. */
12
+ updatePolicy(body) {
13
+ return request({ method: 'PUT', path: '/v1/desktop_mfa/policy', body });
14
+ },
15
+ /** A single-use code for a user to enrol a workstation (default 60 minutes, at most 7 days). */
16
+ createEnrolmentCode(body) {
17
+ return request({ method: 'POST', path: '/v1/desktop_mfa/enrolment_codes', body });
18
+ },
19
+ listDevices(query = {}) {
20
+ return request({ method: 'GET', path: '/v1/desktop_mfa/devices', query });
21
+ },
22
+ getDevice(id) {
23
+ return request({ method: 'GET', path: `/v1/desktop_mfa/devices/${(0, request_1.enc)(id)}` });
24
+ },
25
+ listDevicePasskeys(id) {
26
+ return request({ method: 'GET', path: `/v1/desktop_mfa/devices/${(0, request_1.enc)(id)}/passkeys` });
27
+ },
28
+ deleteDevicePasskey(id, passkeyId) {
29
+ return request({ method: 'DELETE', path: `/v1/desktop_mfa/devices/${(0, request_1.enc)(id)}/passkeys/${(0, request_1.enc)(passkeyId)}` });
30
+ },
31
+ /** The workstation's next call is refused and it wipes its offline cache. */
32
+ revokeDevice(id) {
33
+ return request({ method: 'POST', path: `/v1/desktop_mfa/devices/${(0, request_1.enc)(id)}/revoke` });
34
+ },
35
+ /** Void every offline verifier without revoking the workstation; it gets a fresh one on its next sync. */
36
+ revokeOfflineCache(id) {
37
+ return request({ method: 'POST', path: `/v1/desktop_mfa/devices/${(0, request_1.enc)(id)}/revoke_offline_cache` });
38
+ },
39
+ deleteDevice(id) {
40
+ return request({ method: 'DELETE', path: `/v1/desktop_mfa/devices/${(0, request_1.enc)(id)}` });
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=desktop-mfa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-mfa.js","sourceRoot":"","sources":["../../src/client/desktop-mfa.ts"],"names":[],"mappings":";;AAqEA,gDAqCC;AA1GD,uCAAgD;AAoEhD,4EAA4E;AAC5E,SAAgB,kBAAkB,CAAC,OAAkB;IACnD,OAAO;QACL,SAAS;YACP,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,sCAAsC;QACtC,YAAY,CAAC,IAAgC;YAC3C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,gGAAgG;QAChG,mBAAmB,CAAC,IAAsD;YACxE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,WAAW,CAAC,QAA8B,EAAE;YAC1C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,SAAS,CAAC,EAAU;YAClB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,kBAAkB,CAAC,EAAU;YAC3B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,mBAAmB,CAAC,EAAU,EAAE,SAAiB;YAC/C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,aAAa,IAAA,aAAG,EAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,6EAA6E;QAC7E,YAAY,CAAC,EAAU;YACrB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,0GAA0G;QAC1G,kBAAkB,CAAC,EAAU;YAC3B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,YAAY,CAAC,EAAU;YACrB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { type RequestFn } from './request';
2
2
  import type { ListPage } from './types';
3
3
  /** The transactional email a template drives. */
4
- export type EmailTemplateName = 'verification_code' | 'magic_link' | 'password_reset' | 'password_changed' | 'account_exists_notice' | 'organization_invitation' | 'new_device_sign_in' | 'session_revoked_token_reuse' | 'account_locked' | 'account_secured' | 'team_member_added' | 'team_role_changed' | 'email_changed' | 'email_change_confirm' | 'parental_consent_request' | 'phone_changed' | 'identity_linked' | 'identity_unlinked' | 'passkey_added' | 'passkey_removed' | 'recovery_codes_regenerated' | 'factor_removed' | 'device_key_added' | 'device_key_removed' | 'risk_alert' | 'verification_link' | 'password_reset_link' | 'account_reactivated';
4
+ export type EmailTemplateName = 'verification_code' | 'magic_link' | 'password_reset' | 'password_changed' | 'account_exists_notice' | 'organization_invitation' | 'new_device_sign_in' | 'session_revoked_token_reuse' | 'account_locked' | 'account_secured' | 'team_member_added' | 'team_role_changed' | 'email_changed' | 'email_change_confirm' | 'parental_consent_request' | 'phone_changed' | 'identity_linked' | 'identity_unlinked' | 'passkey_added' | 'passkey_removed' | 'recovery_codes_regenerated' | 'factor_removed' | 'device_key_added' | 'device_key_removed' | 'uma_request_submitted' | 'risk_alert' | 'verification_link' | 'password_reset_link' | 'account_reactivated';
5
5
  /** The customizable body of a template: a subject line and a text body. */
6
6
  export interface EmailTemplateBody {
7
7
  subject?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"email-templates.js","sourceRoot":"","sources":["../../src/client/email-templates.ts"],"names":[],"mappings":";;AAyEA,wDAkBC;AA3FD,uCAAgD;AAyEhD,SAAgB,sBAAsB,CAAC,OAAkB;IACvD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,2EAA2E;QAC3E,OAAO,CAAC,IAAY,EAAE,OAA0B,EAAE;YAChD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,IAAA,aAAG,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,2DAA2D;QAC3D,MAAM,CAAC,IAAY,EAAE,IAAuB;YAC1C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,8BAA8B;QAC9B,MAAM,CAAC,IAAY;YACjB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"email-templates.js","sourceRoot":"","sources":["../../src/client/email-templates.ts"],"names":[],"mappings":";;AA0EA,wDAkBC;AA5FD,uCAAgD;AA0EhD,SAAgB,sBAAsB,CAAC,OAAkB;IACvD,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,2EAA2E;QAC3E,OAAO,CAAC,IAAY,EAAE,OAA0B,EAAE;YAChD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,IAAA,aAAG,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,2DAA2D;QAC3D,MAAM,CAAC,IAAY,EAAE,IAAuB;YAC1C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,8BAA8B;QAC9B,MAAM,CAAC,IAAY;YACjB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -29,13 +29,31 @@ export interface FgaTuple {
29
29
  relation: string;
30
30
  /** The object of the tuple as `type:id`. */
31
31
  target: string;
32
+ condition?: FgaTupleCondition;
32
33
  created_at: number;
33
34
  }
35
+ /** A model condition bound to a tuple, with the parameter values fixed on it. */
36
+ export interface FgaTupleCondition {
37
+ name: string;
38
+ context?: Record<string, unknown>;
39
+ }
34
40
  /** A tuple key. `object` is the target as `type:id`; `target` is accepted too. */
35
41
  export interface FgaTupleKey {
36
42
  user: string;
37
43
  relation: string;
38
44
  object: string;
45
+ /** The tuple grants only while this model condition holds. */
46
+ condition?: FgaTupleCondition;
47
+ }
48
+ /**
49
+ * Freshness of a read. `MINIMIZE_LATENCY` (and the default) may be served from a
50
+ * short-lived cache; `HIGHER_CONSISTENCY` reads the primary.
51
+ */
52
+ export type FgaConsistency = 'UNSPECIFIED' | 'MINIMIZE_LATENCY' | 'HIGHER_CONSISTENCY';
53
+ export interface FgaConsistencyOptions {
54
+ consistency?: FgaConsistency;
55
+ /** A token from a write: the read reflects at least that write. */
56
+ consistency_token?: string;
39
57
  }
40
58
  /** An OpenFGA authorization model to persist. Validated before storage. */
41
59
  export interface FgaAuthorizationModelInput {
@@ -48,20 +66,80 @@ export interface FgaAuthorizationModelInput {
48
66
  export type FgaTupleKeys = FgaTupleKey[] | {
49
67
  tuple_keys: FgaTupleKey[];
50
68
  };
51
- export interface FgaCheckBody {
69
+ export interface FgaCheckBody extends FgaConsistencyOptions {
52
70
  user: string;
53
71
  relation: string;
54
72
  object: string;
55
73
  /** Defaults to the store's latest model. */
56
74
  authorization_model_id?: string;
57
75
  contextual_tuples?: FgaTupleKeys;
76
+ /** Values for tuple-condition parameters (a tuple's own context wins). */
77
+ context?: Record<string, unknown>;
58
78
  }
59
- export interface FgaListObjectsBody {
79
+ export interface FgaListObjectsBody extends FgaConsistencyOptions {
60
80
  user: string;
61
81
  relation: string;
62
82
  type: string;
63
83
  authorization_model_id?: string;
64
84
  contextual_tuples?: FgaTupleKeys;
85
+ /** Page size; without it every object is returned. */
86
+ limit?: number;
87
+ /** The `next_cursor` of the previous page. */
88
+ starting_after?: string;
89
+ context?: Record<string, unknown>;
90
+ }
91
+ export interface FgaListUsersBody extends FgaConsistencyOptions {
92
+ /** `type:id`. */
93
+ object: string;
94
+ relation: string;
95
+ /** Exactly one filter; add `relation` to get usersets such as `group:eng#member`. */
96
+ user_filters: [{
97
+ type: string;
98
+ relation?: string;
99
+ }];
100
+ authorization_model_id?: string;
101
+ contextual_tuples?: FgaTupleKeys;
102
+ context?: Record<string, unknown>;
103
+ /** 1–1000; defaults to 1000. */
104
+ page_size?: number;
105
+ continuation_token?: string;
106
+ }
107
+ export interface FgaListUsersResult {
108
+ object: 'fga.list_users';
109
+ /** `type:id`, `type:id#relation`, or `type:*` for a public wildcard. */
110
+ users: string[];
111
+ /** Ids a wildcard in `users` does not cover. */
112
+ excluded_users: string[];
113
+ /** Pass back for the next page; null on the last. */
114
+ continuation_token: string | null;
115
+ authorization_model_id: string;
116
+ consistency_token: string;
117
+ }
118
+ export interface FgaReadChangesParams {
119
+ /** Only changes to tuples on objects of this type. */
120
+ type?: string;
121
+ /** 1–100; defaults to 50. */
122
+ page_size?: number;
123
+ continuation_token?: string;
124
+ /** RFC 3339: only changes at or after it. */
125
+ start_time?: string;
126
+ }
127
+ export interface FgaTupleChange {
128
+ object: 'fga.tuple_change';
129
+ operation: 'write' | 'delete';
130
+ user: string;
131
+ relation: string;
132
+ target: string;
133
+ condition?: FgaTupleCondition;
134
+ consistency_token: string;
135
+ created_at: number;
136
+ }
137
+ export interface FgaChangesPage {
138
+ object: 'list';
139
+ data: FgaTupleChange[];
140
+ has_more: boolean;
141
+ /** Save it and call again later to receive only newer changes. */
142
+ continuation_token: string;
65
143
  }
66
144
  /** One item in a batch check; `correlation_id` is echoed back to match results. */
67
145
  export interface FgaBatchCheckItem {
@@ -70,16 +148,33 @@ export interface FgaBatchCheckItem {
70
148
  object: string;
71
149
  correlation_id?: string;
72
150
  contextual_tuples?: FgaTupleKeys;
151
+ context?: Record<string, unknown>;
73
152
  }
74
153
  export interface FgaBatchCheckResult {
75
154
  object: 'fga.batch_check';
76
155
  authorization_model_id: string;
156
+ consistency_token: string;
77
157
  result: Array<{
78
158
  correlation_id: string;
79
159
  allowed: boolean;
80
160
  }>;
81
161
  }
162
+ /** How the instance runs FGA reads and keeps its tuple change log. */
163
+ export interface FgaSettings {
164
+ object: 'fga.settings';
165
+ /** Result-cache TTL in ms; null uses the platform default, 0 turns the cache off. */
166
+ cache_ttl_ms: number | null;
167
+ /** Applied to reads that name no `consistency`. */
168
+ default_consistency: FgaConsistency;
169
+ /** Days of tuple change log kept; null keeps all of it. */
170
+ changelog_retention_days: number | null;
171
+ }
172
+ export type UpdateFgaSettingsBody = Partial<Omit<FgaSettings, 'object'>>;
82
173
  export declare function fgaResource(request: RequestFn): {
174
+ settings: {
175
+ get(): Promise<FgaSettings>;
176
+ update(body: UpdateFgaSettingsBody): Promise<FgaSettings>;
177
+ };
83
178
  stores: {
84
179
  list(): Promise<ListPage<FgaStore>>;
85
180
  create(body: {
@@ -105,6 +200,7 @@ export declare function fgaResource(request: RequestFn): {
105
200
  object: "fga.write_result";
106
201
  writes: number;
107
202
  deletes: number;
203
+ consistency_token: string;
108
204
  }>;
109
205
  /** Query stored tuples by any of user / relation / object. */
110
206
  read(storeId: string, body: {
@@ -117,18 +213,35 @@ export declare function fgaResource(request: RequestFn): {
117
213
  object: "fga.check";
118
214
  allowed: boolean;
119
215
  authorization_model_id: string;
216
+ consistency_token: string;
120
217
  }>;
121
218
  /** Resolve MANY access questions in one round trip (list-authorization UIs). */
122
219
  batchCheck(storeId: string, body: {
123
220
  checks: FgaBatchCheckItem[];
124
221
  authorization_model_id?: string;
125
- }): Promise<FgaBatchCheckResult>;
222
+ } & FgaConsistencyOptions): Promise<FgaBatchCheckResult>;
126
223
  /** List the objects of a type a user has a relation to. */
127
224
  listObjects(storeId: string, body: FgaListObjectsBody): Promise<{
128
225
  object: "fga.list_objects";
129
226
  objects: string[];
227
+ has_more: boolean;
228
+ next_cursor: string | null;
130
229
  authorization_model_id: string;
230
+ consistency_token: string;
131
231
  }>;
232
+ /**
233
+ * Who has a relation on an object: concrete users, usersets (give the filter
234
+ * a `relation`) and the `type:*` wildcard with `excluded_users`. One page.
235
+ */
236
+ listUsers(storeId: string, body: FgaListUsersBody): Promise<FgaListUsersResult>;
237
+ /** {@link listUsers} following `continuation_token` until every page is collected. */
238
+ listAllUsers(storeId: string, body: FgaListUsersBody): Promise<FgaListUsersResult>;
239
+ /**
240
+ * The store's tuple change log, in commit order. The returned
241
+ * `continuation_token` works even on the last page: persist it and call again
242
+ * to receive only what changed since.
243
+ */
244
+ readChanges(storeId: string, params?: FgaReadChangesParams): Promise<FgaChangesPage>;
132
245
  /** Expand the full userset tree for an object#relation. */
133
246
  expand(storeId: string, body: {
134
247
  object: string;
@@ -153,6 +266,7 @@ export declare function fgaResource(request: RequestFn): {
153
266
  object: "fga.write_result";
154
267
  writes: number;
155
268
  deletes: number;
269
+ consistency_token: string;
156
270
  }>;
157
271
  read: (body: {
158
272
  user?: string;
@@ -163,16 +277,23 @@ export declare function fgaResource(request: RequestFn): {
163
277
  object: "fga.check";
164
278
  allowed: boolean;
165
279
  authorization_model_id: string;
280
+ consistency_token: string;
166
281
  }>;
167
282
  batchCheck: (body: {
168
283
  checks: FgaBatchCheckItem[];
169
284
  authorization_model_id?: string;
170
- }) => Promise<FgaBatchCheckResult>;
285
+ } & FgaConsistencyOptions) => Promise<FgaBatchCheckResult>;
171
286
  listObjects: (body: FgaListObjectsBody) => Promise<{
172
287
  object: "fga.list_objects";
173
288
  objects: string[];
289
+ has_more: boolean;
290
+ next_cursor: string | null;
174
291
  authorization_model_id: string;
292
+ consistency_token: string;
175
293
  }>;
294
+ listUsers: (body: FgaListUsersBody) => Promise<FgaListUsersResult>;
295
+ listAllUsers: (body: FgaListUsersBody) => Promise<FgaListUsersResult>;
296
+ readChanges: (params?: FgaReadChangesParams) => Promise<FgaChangesPage>;
176
297
  expand: (body: {
177
298
  object: string;
178
299
  relation: string;