@atlasauth/backend 0.7.2 → 0.8.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 (41) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +30 -1
  3. package/dist/client/activity.d.ts +5 -0
  4. package/dist/client/activity.js.map +1 -1
  5. package/dist/client/branding.d.ts +58 -0
  6. package/dist/client/branding.js.map +1 -1
  7. package/dist/client/domains.d.ts +13 -0
  8. package/dist/client/domains.js.map +1 -1
  9. package/dist/client/error.d.ts +4 -0
  10. package/dist/client/error.js +4 -0
  11. package/dist/client/error.js.map +1 -1
  12. package/dist/client/index.d.ts +44 -1
  13. package/dist/client/index.js +4 -0
  14. package/dist/client/index.js.map +1 -1
  15. package/dist/client/instance.d.ts +192 -0
  16. package/dist/client/instance.js +38 -0
  17. package/dist/client/instance.js.map +1 -1
  18. package/dist/client/logout-notify-endpoints.d.ts +71 -0
  19. package/dist/client/logout-notify-endpoints.js +34 -0
  20. package/dist/client/logout-notify-endpoints.js.map +1 -0
  21. package/dist/client/messaging.d.ts +91 -0
  22. package/dist/client/messaging.js +27 -0
  23. package/dist/client/messaging.js.map +1 -1
  24. package/dist/client/oauth-clients.d.ts +61 -0
  25. package/dist/client/oauth-clients.js +12 -0
  26. package/dist/client/oauth-clients.js.map +1 -1
  27. package/dist/client/platform.d.ts +118 -0
  28. package/dist/client/platform.js +80 -0
  29. package/dist/client/platform.js.map +1 -1
  30. package/dist/client/users.d.ts +14 -1
  31. package/dist/client/users.js +10 -2
  32. package/dist/client/users.js.map +1 -1
  33. package/dist/client/webhooks.d.ts +21 -0
  34. package/dist/client/webhooks.js.map +1 -1
  35. package/dist/logout-token.d.ts +8 -0
  36. package/dist/logout-token.js +20 -15
  37. package/dist/logout-token.js.map +1 -1
  38. package/dist/webhooks.d.ts +16 -5
  39. package/dist/webhooks.js +11 -7
  40. package/dist/webhooks.js.map +1 -1
  41. package/package.json +3 -3
@@ -13,6 +13,44 @@ function instanceResource(request) {
13
13
  preflight() {
14
14
  return request({ method: 'GET', path: '/v1/instance/preflight' });
15
15
  },
16
+ /**
17
+ * Move every URL that points at one origin to another (a domain move), across
18
+ * the instance, its OAuth clients, webhooks, redirect URLs and Sign in with
19
+ * Atlas apps. `dry_run: true` writes nothing.
20
+ */
21
+ moveOrigin(body) {
22
+ return request({ method: 'POST', path: '/v1/instance/move_origin', body });
23
+ },
24
+ /** The instance's links to other platforms and their health. Read-only. */
25
+ connections() {
26
+ return request({ method: 'GET', path: '/v1/instance/connections' });
27
+ },
28
+ /** Built-in connections to other platforms. */
29
+ integrations: {
30
+ chatly: {
31
+ get() {
32
+ return request({ method: 'GET', path: '/v1/instance/integrations/chatly' });
33
+ },
34
+ set(body) {
35
+ return request({ method: 'PUT', path: '/v1/instance/integrations/chatly', body });
36
+ },
37
+ delete() {
38
+ return request({ method: 'DELETE', path: '/v1/instance/integrations/chatly' });
39
+ },
40
+ },
41
+ forumulate: {
42
+ get() {
43
+ return request({ method: 'GET', path: '/v1/instance/integrations/forumulate' });
44
+ },
45
+ /** Replaces the whole connection. */
46
+ set(body) {
47
+ return request({ method: 'PUT', path: '/v1/instance/integrations/forumulate', body });
48
+ },
49
+ delete() {
50
+ return request({ method: 'DELETE', path: '/v1/instance/integrations/forumulate' });
51
+ },
52
+ },
53
+ },
16
54
  /** The cookie-consent script on the hosted pages (any provider). */
17
55
  cookieConsent: {
18
56
  get() {
@@ -1 +1 @@
1
- {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/client/instance.ts"],"names":[],"mappings":";;AAgHA,4CA2BC;AA3BD,SAAgB,gBAAgB,CAAC,OAAkB;IACjD,OAAO;QACL,GAAG;YACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,CAAC,IAAwB;YAC7B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,yFAAyF;QACzF,SAAS;YACP,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,oEAAoE;QACpE,aAAa,EAAE;YACb,GAAG;gBACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,kCAAkC;YAClC,GAAG,CAAC,IAA0B;gBAC5B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,+EAA+E;YAC/E,MAAM;gBACJ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAC5E,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/client/instance.ts"],"names":[],"mappings":";;AAyRA,4CAiEC;AAjED,SAAgB,gBAAgB,CAAC,OAAkB;IACjD,OAAO;QACL,GAAG;YACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,CAAC,IAAwB;YAC7B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,yFAAyF;QACzF,SAAS;YACP,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACpE,CAAC;QACD;;;;WAIG;QACH,UAAU,CAAC,IAAuB;YAChC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,2EAA2E;QAC3E,WAAW;YACT,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,+CAA+C;QAC/C,YAAY,EAAE;YACZ,MAAM,EAAE;gBACN,GAAG;oBACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAC;gBAC9E,CAAC;gBACD,GAAG,CAAC,IAA8B;oBAChC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,kCAAkC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpF,CAAC;gBACD,MAAM;oBACJ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAC;gBACjF,CAAC;aACF;YACD,UAAU,EAAE;gBACV,GAAG;oBACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC,CAAC;gBAClF,CAAC;gBACD,qCAAqC;gBACrC,GAAG,CAAC,IAAkC;oBACpC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sCAAsC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxF,CAAC;gBACD,MAAM;oBACJ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC,CAAC;gBACrF,CAAC;aACF;SACF;QACD,oEAAoE;QACpE,aAAa,EAAE;YACb,GAAG;gBACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,kCAAkC;YAClC,GAAG,CAAC,IAA0B;gBAC5B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,+EAA+E;YAC/E,MAAM;gBACJ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAC5E,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { type RequestFn } from './request';
2
+ /**
3
+ * Logout fan-out ("also notify") endpoints: downstream services that receive the
4
+ * same signed `logout_token` as your OIDC apps whenever an Atlas session ends,
5
+ * plus a subject-wide one (sub, no sid) on ban, deletion or deprovisioning.
6
+ */
7
+ export interface LogoutNotifyEndpoint {
8
+ object: 'logout_notify_endpoint';
9
+ id: string;
10
+ url: string;
11
+ /** The client_id this endpoint follows; null = instance-wide. */
12
+ oauth_client_id: string | null;
13
+ /** The `aud` its logout_tokens carry. */
14
+ audience: string;
15
+ description?: string | null;
16
+ created_at: number;
17
+ updated_at: number;
18
+ }
19
+ export interface CreateLogoutNotifyEndpointBody {
20
+ /** Public https endpoint. */
21
+ url: string;
22
+ /** A client_id of this instance to follow; omit for instance-wide. */
23
+ oauth_client_id?: string | null;
24
+ /** The logout_token `aud`. Default: the client_id when following a client, else the instance id. */
25
+ audience?: string | null;
26
+ /** Up to 200 characters. */
27
+ description?: string | null;
28
+ }
29
+ export interface UpdateLogoutNotifyEndpointBody {
30
+ url?: string;
31
+ audience?: string | null;
32
+ description?: string | null;
33
+ }
34
+ /** One logout_token sent to a fan-out endpoint. */
35
+ export interface LogoutNotifyDelivery {
36
+ object: 'logout_notify_delivery';
37
+ id: string;
38
+ sub: string;
39
+ /** null = a subject-wide logout (ban / deletion). */
40
+ sid?: string | null;
41
+ status: 'pending' | 'success' | 'failed';
42
+ attempt_number: number;
43
+ http_status?: number | null;
44
+ response_snippet?: string | null;
45
+ next_retry_at?: number | null;
46
+ delivered_at?: number | null;
47
+ created_at: number;
48
+ }
49
+ export interface LogoutNotifyList<T> {
50
+ object: 'list';
51
+ data: T[];
52
+ has_more?: boolean;
53
+ next_cursor?: string | null;
54
+ }
55
+ export declare function logoutNotifyEndpointsResource(request: RequestFn): {
56
+ list(): Promise<LogoutNotifyList<LogoutNotifyEndpoint>>;
57
+ /** Register an endpoint. The URL must be public https. */
58
+ create(body: CreateLogoutNotifyEndpointBody, idempotencyKey?: string): Promise<LogoutNotifyEndpoint>;
59
+ get(id: string): Promise<LogoutNotifyEndpoint>;
60
+ update(id: string, body: UpdateLogoutNotifyEndpointBody, idempotencyKey?: string): Promise<LogoutNotifyEndpoint>;
61
+ /** Its queued deliveries go with it. */
62
+ delete(id: string, idempotencyKey?: string): Promise<{
63
+ object: "logout_notify_endpoint";
64
+ id: string;
65
+ deleted: true;
66
+ }>;
67
+ /** The endpoint's delivery log, newest first. */
68
+ listDeliveries(id: string, params?: {
69
+ limit?: number;
70
+ }): Promise<LogoutNotifyList<LogoutNotifyDelivery>>;
71
+ };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logoutNotifyEndpointsResource = logoutNotifyEndpointsResource;
4
+ const request_1 = require("./request");
5
+ function logoutNotifyEndpointsResource(request) {
6
+ return {
7
+ list() {
8
+ return request({ method: 'GET', path: '/v1/logout_notify_endpoints' });
9
+ },
10
+ /** Register an endpoint. The URL must be public https. */
11
+ create(body, idempotencyKey) {
12
+ return request({ method: 'POST', path: '/v1/logout_notify_endpoints', body, idempotencyKey });
13
+ },
14
+ get(id) {
15
+ return request({ method: 'GET', path: `/v1/logout_notify_endpoints/${(0, request_1.enc)(id)}` });
16
+ },
17
+ update(id, body, idempotencyKey) {
18
+ return request({ method: 'PATCH', path: `/v1/logout_notify_endpoints/${(0, request_1.enc)(id)}`, body, idempotencyKey });
19
+ },
20
+ /** Its queued deliveries go with it. */
21
+ delete(id, idempotencyKey) {
22
+ return request({ method: 'DELETE', path: `/v1/logout_notify_endpoints/${(0, request_1.enc)(id)}`, idempotencyKey });
23
+ },
24
+ /** The endpoint's delivery log, newest first. */
25
+ listDeliveries(id, params = {}) {
26
+ return request({
27
+ method: 'GET',
28
+ path: `/v1/logout_notify_endpoints/${(0, request_1.enc)(id)}/deliveries`,
29
+ query: { ...params },
30
+ });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=logout-notify-endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout-notify-endpoints.js","sourceRoot":"","sources":["../../src/client/logout-notify-endpoints.ts"],"names":[],"mappings":";;AA4DA,sEA+BC;AA3FD,uCAAgD;AA4DhD,SAAgB,6BAA6B,CAAC,OAAkB;IAC9D,OAAO;QACL,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,0DAA0D;QAC1D,MAAM,CAAC,IAAoC,EAAE,cAAuB;YAClE,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAAoC,EAAE,cAAuB;YAC9E,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,wCAAwC;QACxC,MAAM,CACJ,EAAU,EACV,cAAuB;YAEvB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,iDAAiD;QACjD,cAAc,CAAC,EAAU,EAAE,SAA6B,EAAE;YACxD,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,+BAA+B,IAAA,aAAG,EAAC,EAAE,CAAC,aAAa;gBACzD,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE;aACrB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -272,6 +272,80 @@ export interface MessagingProviders {
272
272
  object: 'messaging_providers';
273
273
  email: EmailProvider | null;
274
274
  sms: SmsProvider | null;
275
+ /** The Atlas-managed sending domain, when one is set up (summary). */
276
+ managed_email?: {
277
+ object: 'managed_email';
278
+ from_address: string;
279
+ domain: string;
280
+ status: string;
281
+ verified: boolean;
282
+ } | null;
283
+ }
284
+ /** A DNS record to publish for the managed sending domain. */
285
+ export interface ManagedEmailRecord {
286
+ purpose: 'dkim' | 'spf' | 'return_path' | 'other';
287
+ type: 'TXT' | 'MX' | 'CNAME';
288
+ /** Fully-qualified record name. */
289
+ name: string;
290
+ value: string;
291
+ priority?: number;
292
+ status?: string;
293
+ }
294
+ /** Atlas-managed email: your own sending domain on Atlas's email account. */
295
+ export interface ManagedEmail {
296
+ object: 'managed_email';
297
+ id: string;
298
+ from_address: string;
299
+ domain: string;
300
+ provider: string;
301
+ region: string | null;
302
+ /** `not_started` | `pending` | `verified` | `failed` | `temporary_failure`. Email sends only when verified. */
303
+ status: string;
304
+ verified: boolean;
305
+ records: ManagedEmailRecord[];
306
+ limits: {
307
+ hourly: number;
308
+ daily: number;
309
+ };
310
+ usage: {
311
+ sent: number;
312
+ bounces: number;
313
+ complaints: number;
314
+ last_bounce_at: number | null;
315
+ last_complaint_at: number | null;
316
+ };
317
+ reputation: 'shared_platform_account';
318
+ /** DNS automation, when set. The token is never returned. */
319
+ dns: {
320
+ provider: string;
321
+ token_set: boolean;
322
+ } | null;
323
+ failure_reason: string | null;
324
+ last_checked_at: number | null;
325
+ verified_at: number | null;
326
+ created_at: number;
327
+ updated_at: number;
328
+ /** Create only, with `dns`: the zone and the records Atlas wrote. */
329
+ dns_result?: Record<string, unknown>;
330
+ next_step?: string;
331
+ }
332
+ export interface CreateManagedEmailBody {
333
+ /** The From address, bare or `"Name <address>"`. Its domain becomes the sending domain. */
334
+ from_address: string;
335
+ region?: 'us-east-1' | 'eu-west-1' | 'sa-east-1' | 'ap-northeast-1';
336
+ /** Let Atlas write the DNS records. The token is write-only. */
337
+ dns?: {
338
+ provider: 'cloudflare';
339
+ /** A DNS API token with Zone Read and DNS Edit on the zone. Write-only. */
340
+ api_token: string;
341
+ /** Replace a conflicting existing record. */
342
+ overwrite?: boolean;
343
+ };
344
+ }
345
+ export interface DeletedManagedEmail {
346
+ object: 'managed_email';
347
+ domain: string;
348
+ deleted: true;
275
349
  }
276
350
  export interface MessagingTestResult {
277
351
  object: 'messaging_test';
@@ -323,6 +397,23 @@ export declare function messagingResource(request: RequestFn): {
323
397
  deleteChannel(channel: "email" | "sms", options?: {
324
398
  force?: boolean;
325
399
  }): Promise<DeletedMessagingProvider>;
400
+ /** Atlas-managed email: send from your own domain without your own email provider. */
401
+ managedEmail: {
402
+ /** 404 when none is configured. */
403
+ get(): Promise<ManagedEmail>;
404
+ /** Register the sending domain; returns the DNS `records` to publish. */
405
+ create(body: CreateManagedEmailBody): Promise<ManagedEmail>;
406
+ /** Re-check the DNS records now; `verified` is true once email can be sent. */
407
+ verify(): Promise<ManagedEmail>;
408
+ /**
409
+ * Stop using managed email (DNS records are left in place). Refused with
410
+ * `409 EMAIL_PROVIDER_IN_USE` while it is the only way to send email; pass
411
+ * `{ force: true }` to remove it anyway.
412
+ */
413
+ delete(options?: {
414
+ force?: boolean;
415
+ }): Promise<DeletedManagedEmail>;
416
+ };
326
417
  /** Send a fixed, clearly-marked test message through the channel's provider. */
327
418
  test(channel: "email" | "sms", body: {
328
419
  to: string;
@@ -40,6 +40,33 @@ function messagingResource(request) {
40
40
  ...(options.force ? { query: { force: 'true' } } : {}),
41
41
  });
42
42
  },
43
+ /** Atlas-managed email: send from your own domain without your own email provider. */
44
+ managedEmail: {
45
+ /** 404 when none is configured. */
46
+ get() {
47
+ return request({ method: 'GET', path: '/v1/messaging_providers/email/managed' });
48
+ },
49
+ /** Register the sending domain; returns the DNS `records` to publish. */
50
+ create(body) {
51
+ return request({ method: 'POST', path: '/v1/messaging_providers/email/managed', body });
52
+ },
53
+ /** Re-check the DNS records now; `verified` is true once email can be sent. */
54
+ verify() {
55
+ return request({ method: 'POST', path: '/v1/messaging_providers/email/managed/verify' });
56
+ },
57
+ /**
58
+ * Stop using managed email (DNS records are left in place). Refused with
59
+ * `409 EMAIL_PROVIDER_IN_USE` while it is the only way to send email; pass
60
+ * `{ force: true }` to remove it anyway.
61
+ */
62
+ delete(options = {}) {
63
+ return request({
64
+ method: 'DELETE',
65
+ path: '/v1/messaging_providers/email/managed',
66
+ ...(options.force ? { query: { force: 'true' } } : {}),
67
+ });
68
+ },
69
+ },
43
70
  /** Send a fixed, clearly-marked test message through the channel's provider. */
44
71
  test(channel, body) {
45
72
  return request({
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/client/messaging.ts"],"names":[],"mappings":";;AAsVA,8CA0DC;AAhZD,uCAAgD;AAsVhD,SAAgB,iBAAiB,CAAC,OAAkB;IAIlD,SAAS,QAAQ,CAAC,IAAa;QAC7B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAKD,SAAS,MAAM,CAAC,IAAa;QAC3B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,0EAA0E;QAC1E,GAAG;YACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACrE,CAAC;QACD;;;;WAIG;QACH,QAAQ;QACR;;;;WAIG;QACH,MAAM;QACN;;;;;;WAMG;QACH,aAAa,CACX,OAAwB,EACxB,UAA+B,EAAE;YAEjC,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE;gBAC/C,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QACD,gFAAgF;QAChF,IAAI,CAAC,OAAwB,EAAE,IAAoB;YACjD,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,OAAO,CAAC,OAAO;gBACpD,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/client/messaging.ts"],"names":[],"mappings":";;AAgaA,8CAqFC;AArfD,uCAAgD;AAgahD,SAAgB,iBAAiB,CAAC,OAAkB;IAIlD,SAAS,QAAQ,CAAC,IAAa;QAC7B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAKD,SAAS,MAAM,CAAC,IAAa;QAC3B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,0EAA0E;QAC1E,GAAG;YACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACrE,CAAC;QACD;;;;WAIG;QACH,QAAQ;QACR;;;;WAIG;QACH,MAAM;QACN;;;;;;WAMG;QACH,aAAa,CACX,OAAwB,EACxB,UAA+B,EAAE;YAEjC,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE;gBAC/C,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QACD,sFAAsF;QACtF,YAAY,EAAE;YACZ,mCAAmC;YACnC,GAAG;gBACD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,yEAAyE;YACzE,MAAM,CAAC,IAA4B;gBACjC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAuC,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,+EAA+E;YAC/E,MAAM;gBACJ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8CAA8C,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD;;;;eAIG;YACH,MAAM,CAAC,UAA+B,EAAE;gBACtC,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,uCAAuC;oBAC7C,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvD,CAAC,CAAC;YACL,CAAC;SACF;QACD,gFAAgF;QAChF,IAAI,CAAC,OAAwB,EAAE,IAAoB;YACjD,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,2BAA2B,IAAA,aAAG,EAAC,OAAO,CAAC,OAAO;gBACpD,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -96,6 +96,63 @@ export interface ImportOAuthClientEntry {
96
96
  export interface ImportedOAuthClient extends OAuthClient {
97
97
  client_secret?: string;
98
98
  }
99
+ /**
100
+ * One back-channel logout attempt to a client's `backchannel_logout_uri`.
101
+ * Atlas never follows redirects: a 3xx fails with
102
+ * `error: 'backchannel_redirect_not_followed'` and the `location` it pointed at.
103
+ */
104
+ export interface BackchannelLogoutDelivery {
105
+ object: 'backchannel_logout_delivery';
106
+ id: string;
107
+ oauth_client_id: string | null;
108
+ /** The ended session (`sid_test_…` for a test); null for "sign out everywhere". */
109
+ sid: string | null;
110
+ /** Sent by `testBackchannelLogout`; never retried. */
111
+ test: boolean;
112
+ status: 'pending' | 'success' | 'failed';
113
+ attempt_number: number;
114
+ max_attempts: number;
115
+ http_status: number | null;
116
+ latency_ms: number | null;
117
+ /**
118
+ * `backchannel_redirect_not_followed`, `backchannel_http_error`,
119
+ * `backchannel_timeout`, `backchannel_network_error` or `backchannel_url_blocked`.
120
+ */
121
+ error: string | null;
122
+ location: string | null;
123
+ response_snippet: string | null;
124
+ next_retry_at: number | null;
125
+ attempted_at: number | null;
126
+ delivered_at: number | null;
127
+ created_at: number;
128
+ }
129
+ /** A page of {@link BackchannelLogoutDelivery}, newest first. */
130
+ export interface BackchannelLogoutDeliveryPage extends ListPage<BackchannelLogoutDelivery> {
131
+ has_more: boolean;
132
+ /** Pass as `starting_after` for the next page. */
133
+ next_cursor: string | null;
134
+ }
135
+ /** Paging for a delivery log. */
136
+ export interface BackchannelDeliveriesQuery {
137
+ limit?: number;
138
+ starting_after?: string;
139
+ }
140
+ /** The result of a test back-channel logout (a signed token for `sid_test_…` with `atlas_test: true`). */
141
+ export interface BackchannelLogoutTest {
142
+ object: 'backchannel_logout_test';
143
+ delivery_id: string;
144
+ /** True when the receiver answered 2xx. */
145
+ ok: boolean;
146
+ sid: string;
147
+ status: number | null;
148
+ latency_ms: number | null;
149
+ error: string | null;
150
+ location: string | null;
151
+ /** Set when nothing was sent because the URI points at a private, loopback or non-https address. */
152
+ blocked_reason: string | null;
153
+ /** First 512 characters of the response body. */
154
+ body_excerpt: string | null;
155
+ }
99
156
  export declare function oauthClientsResource(request: RequestFn): {
100
157
  /** Bulk-import OAuth clients for a migration, optionally with pre-hashed secrets. */
101
158
  import(body: {
@@ -112,6 +169,10 @@ export declare function oauthClientsResource(request: RequestFn): {
112
169
  deleted: true;
113
170
  note: string;
114
171
  }>;
172
+ /** The client's back-channel logout delivery log, newest first. */
173
+ listBackchannelDeliveries(id: string, query?: BackchannelDeliveriesQuery): Promise<BackchannelLogoutDeliveryPage>;
174
+ /** Send a test back-channel logout now and return what the receiver answered. */
175
+ testBackchannelLogout(id: string): Promise<BackchannelLogoutTest>;
115
176
  grants: {
116
177
  list(clientId: string): Promise<ListPage<ClientGrant>>;
117
178
  create(clientId: string, body: {
@@ -26,6 +26,18 @@ function oauthClientsResource(request) {
26
26
  delete(id) {
27
27
  return request({ method: 'DELETE', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}` });
28
28
  },
29
+ /** The client's back-channel logout delivery log, newest first. */
30
+ listBackchannelDeliveries(id, query = {}) {
31
+ return request({
32
+ method: 'GET',
33
+ path: `/v1/oauth_clients/${(0, request_1.enc)(id)}/backchannel_deliveries`,
34
+ query: { ...query },
35
+ });
36
+ },
37
+ /** Send a test back-channel logout now and return what the receiver answered. */
38
+ testBackchannelLogout(id) {
39
+ return request({ method: 'POST', path: `/v1/oauth_clients/${(0, request_1.enc)(id)}/backchannel_logout/test` });
40
+ },
29
41
  grants: {
30
42
  list(clientId) {
31
43
  return request({ method: 'GET', path: `/v1/oauth_clients/${(0, request_1.enc)(clientId)}/grants` });
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-clients.js","sourceRoot":"","sources":["../../src/client/oauth-clients.ts"],"names":[],"mappings":";;AA2GA,oDAqDC;AAhKD,uCAAgD;AA2GhD,SAAgB,oBAAoB,CAAC,OAAkB;IACrD,OAAO;QACL,qFAAqF;QACrF,MAAM,CACJ,IAA2C,EAC3C,cAAuB;YAEvB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,IAA2B,EAAE,cAAuB;YACzD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAA2B;YAC5C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,YAAY,CAAC,EAAU;YACrB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,EAAE;YACN,IAAI,CAAC,QAAgB;gBACnB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,CACJ,QAAgB,EAChB,IAAuD;gBAEvD,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,QAAQ,CAAC,SAAS;oBACjD,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CACJ,QAAgB,EAChB,OAAe;gBAEf,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,QAAQ,CAAC,WAAW,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE;iBAClE,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"oauth-clients.js","sourceRoot":"","sources":["../../src/client/oauth-clients.ts"],"names":[],"mappings":";;AAwKA,oDAoEC;AA5OD,uCAAgD;AAwKhD,SAAgB,oBAAoB,CAAC,OAAkB;IACrD,OAAO;QACL,qFAAqF;QACrF,MAAM,CACJ,IAA2C,EAC3C,cAAuB;YAEvB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI;YACF,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,GAAG,CAAC,EAAU;YACZ,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC,IAA2B,EAAE,cAAuB;YACzD,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,CAAC,EAAU,EAAE,IAA2B;YAC5C,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,YAAY,CAAC,EAAU;YACrB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,CAAC,EAAU;YACf,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,mEAAmE;QACnE,yBAAyB,CACvB,EAAU,EACV,QAAoC,EAAE;YAEtC,OAAO,OAAO,CAAC;gBACb,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,yBAAyB;gBAC3D,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;QACD,iFAAiF;QACjF,qBAAqB,CAAC,EAAU;YAC9B,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC;QACnG,CAAC;QAED,MAAM,EAAE;YACN,IAAI,CAAC,QAAgB;gBACnB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,CACJ,QAAgB,EAChB,IAAuD;gBAEvD,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,QAAQ,CAAC,SAAS;oBACjD,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CACJ,QAAgB,EAChB,OAAe;gBAEf,OAAO,OAAO,CAAC;oBACb,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,qBAAqB,IAAA,aAAG,EAAC,QAAQ,CAAC,WAAW,IAAA,aAAG,EAAC,OAAO,CAAC,EAAE;iBAClE,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1,6 +1,19 @@
1
1
  import { type AtlasRequestSettings, type RequestFn, type UnknownFieldsEvent } from './request';
2
2
  import type { ListPage } from './types';
3
+ import type { BackchannelDeliveriesQuery, BackchannelLogoutDeliveryPage, BackchannelLogoutTest } from './oauth-clients';
4
+ import type { OriginMove, OriginMoveRequest, PreflightFinding } from './instance';
5
+ import type { ConfigChangelogEntry, ListConfigChangelogParams } from './activity';
3
6
  import type { AtlasDesign, AtlasDesignPatch, DeletedDesignAsset, DesignAsset, DesignAssetData, DesignPreview, ResolvedAtlasDesign, UploadDesignAssetOptions } from './design';
7
+ /** `GET /v1/platform/atlas_id_apps/{id}/preflight`. */
8
+ export interface AtlasIdAppPreflight {
9
+ object: 'preflight';
10
+ app_id: string;
11
+ /** True when there are no error-severity findings. */
12
+ ok: boolean;
13
+ checked_at: number;
14
+ user_count: number;
15
+ findings: PreflightFinding[];
16
+ }
4
17
  /**
5
18
  * The platform client: the platform-key (`psk_...`) surface for provisioning and
6
19
  * managing apps you own, and for registering Sign in with Atlas apps.
@@ -201,12 +214,66 @@ export interface AtlasIdApp {
201
214
  updated_at: number;
202
215
  /** On `get` only: people who have approved the app. */
203
216
  user_count?: number;
217
+ /** The per-app webhook URL, or null. */
218
+ webhook_url?: string | null;
219
+ webhook_events?: Array<'user.updated' | 'user.deleted' | 'grant.revoked'>;
220
+ /** false once auto-disabled after repeated failures; null without a webhook. */
221
+ webhook_active?: boolean | null;
204
222
  }
205
223
  /** Create / rotate response: confidential apps carry the client secret exactly once. */
206
224
  export interface AtlasIdAppWithSecret extends AtlasIdApp {
207
225
  client_secret?: string;
226
+ /** The per-app webhook signing secret, returned exactly once (first set, or rotated). */
227
+ webhook_secret?: string;
208
228
  note?: string;
209
229
  }
230
+ /** A person who has approved a Sign in with Atlas app (privacy-request lookup). */
231
+ export interface AtlasIdAppUser {
232
+ object: 'atlas_id_user';
233
+ atlas_id_user: true;
234
+ /** The user id as this app sees it (the id_token `sub`). */
235
+ sub: string;
236
+ grant_id: string;
237
+ scopes: string[];
238
+ granted_at: number;
239
+ }
240
+ /** A revoked grant: the app's refresh tokens for the user stop working. */
241
+ export interface AtlasIdGrantRevocation {
242
+ object: 'atlas_id_grant';
243
+ id: string;
244
+ sub: string;
245
+ revoked: true;
246
+ tokens_revoked?: number;
247
+ backchannel_logouts?: number;
248
+ }
249
+ /** The account's Sign in with Atlas publisher (name + DNS-verified domain). */
250
+ export interface AtlasIdPublisher {
251
+ object: 'atlas_id_publisher';
252
+ name: string;
253
+ domain: string;
254
+ verified: boolean;
255
+ verified_at?: number | null;
256
+ /** Publisher-wide consent for verified apps (openid / email / profile only). */
257
+ skip_consent: boolean;
258
+ /** The TXT record to publish. */
259
+ verification: {
260
+ record_name: string;
261
+ record_type: 'TXT';
262
+ record_value: string;
263
+ };
264
+ last_checked_at?: number | null;
265
+ created_at?: number;
266
+ updated_at?: number;
267
+ /** On `verify` only: whether the TXT record matched. */
268
+ record_found?: boolean;
269
+ }
270
+ export interface SetAtlasIdPublisherBody {
271
+ /** Shown on consent screens once verified (up to 100 characters). */
272
+ name: string;
273
+ /** The host your apps' homepage_url lives on, e.g. `example.com`. */
274
+ domain: string;
275
+ skip_consent?: boolean;
276
+ }
210
277
  export interface AtlasIdAppList {
211
278
  object: 'list';
212
279
  data: AtlasIdApp[];
@@ -241,6 +308,11 @@ export interface CreateAtlasIdAppBody extends AtlasIdAppFields {
241
308
  export interface UpdateAtlasIdAppBody extends AtlasIdAppFields {
242
309
  name?: string;
243
310
  redirect_uris?: string[];
311
+ /**
312
+ * Per-app webhook (public https): user.updated, user.deleted and grant.revoked for
313
+ * this app's users. Setting it the first time returns `webhook_secret` once; null removes it.
314
+ */
315
+ webhook_url?: string | null;
244
316
  }
245
317
  declare function platformNamespaces(request: RequestFn): {
246
318
  apps: {
@@ -307,9 +379,55 @@ declare function platformNamespaces(request: RequestFn): {
307
379
  }>;
308
380
  /** New client secret, returned exactly once. Public apps have none (409). */
309
381
  rotateSecret(id: string): Promise<AtlasIdAppWithSecret>;
382
+ /** The app's back-channel logout delivery log, newest first. */
383
+ listBackchannelDeliveries(id: string, query?: BackchannelDeliveriesQuery): Promise<BackchannelLogoutDeliveryPage>;
384
+ /** Send a test back-channel logout to the app now and return what it answered. */
385
+ testBackchannelLogout(id: string): Promise<BackchannelLogoutTest>;
386
+ /** Check the app's setup (URIs, back-channel delivery, homepage host, legal links, secret age). */
387
+ preflight(id: string): Promise<AtlasIdAppPreflight>;
388
+ /**
389
+ * Privacy requests: is this person one of the app's users? Exact match on a
390
+ * verified email; anyone else gets the same empty list.
391
+ */
392
+ findUsers(id: string, email: string): Promise<{
393
+ object: "list";
394
+ data: AtlasIdAppUser[];
395
+ }>;
396
+ /** Revoke one user's grant (grant_id from `findUsers`); the next sign-in asks for consent again. */
397
+ revokeGrant(id: string, grantId: string): Promise<AtlasIdGrantRevocation>;
398
+ /** Move the app's URLs from one origin to another. `dry_run: true` writes nothing. */
399
+ moveOrigin(id: string, body: OriginMoveRequest): Promise<OriginMove>;
400
+ /** New per-app webhook signing secret (`webhook_secret`), returned once. 409 without a webhook. */
401
+ rotateWebhookSecret(id: string): Promise<AtlasIdAppWithSecret>;
310
402
  /** Preview a design on the Sign in with Atlas page without saving it. */
311
403
  previewDesign(design: AtlasDesign): Promise<DesignPreview>;
312
404
  };
405
+ /** The account's Sign in with Atlas publisher name and verified domain. */
406
+ atlasIdPublisher: {
407
+ /** 404 until claimed. */
408
+ get(): Promise<AtlasIdPublisher>;
409
+ /** Claim a publisher name and domain; returns the TXT record to publish. */
410
+ set(body: SetAtlasIdPublisherBody): Promise<AtlasIdPublisher>;
411
+ /** Turn publisher-wide consent on or off. */
412
+ update(body: {
413
+ skip_consent: boolean;
414
+ }): Promise<AtlasIdPublisher>;
415
+ delete(): Promise<{
416
+ object: "atlas_id_publisher";
417
+ deleted: true;
418
+ }>;
419
+ /** Look up the TXT record now (`record_found`). */
420
+ verify(): Promise<AtlasIdPublisher>;
421
+ };
422
+ /** Config change history for the account's Sign in with Atlas apps. */
423
+ configChangelog: {
424
+ list(params?: ListConfigChangelogParams): Promise<{
425
+ object: "config_changelog";
426
+ data: ConfigChangelogEntry[];
427
+ has_more?: boolean;
428
+ next_cursor?: string | null;
429
+ }>;
430
+ };
313
431
  /** Design images owned by the platform's account, for Sign in with Atlas app designs. */
314
432
  designAssets: {
315
433
  upload(data: DesignAssetData, options?: UploadDesignAssetOptions): Promise<DesignAsset>;