@atlasauth/backend 0.17.0 → 0.18.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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlasauth/backend changelog
2
2
 
3
+ ## 0.18.0 — 2026-10-24
4
+
5
+ ### Added
6
+
7
+ - Policy acceptance: `policies` (`list`, `create`, `get`, `update`, `delete`, `versions.list/create/get/update/delete/publish/retire`, `listAcceptances`, `exportAcceptancesCsv`, `forUser`, `settings.get/update` for the `pol` session claim) and `policySource` (`get`, `update`, `delete`, `test`, `sync`, `listDeliveries`) for the external policy source.
8
+ - Policy source protocol v1 helpers for the system that serves policies: `verifyPolicyFeedRequest()` (Atlas's signed `GET {endpoint}/policies`) and `signPolicySourceEvent()` (`policy.published` / `policy.retired`), with the `PolicyFeed` types.
9
+ - `RecordUserConsentBody` / `UserConsent`: `policy_version_id`, `content_sha256`, `display`, `scrolled_to_end`, `view_ms`, `locale`.
10
+
3
11
  ## 0.17.0 — 2026-10-24
4
12
 
5
13
  ### Added
@@ -1159,6 +1159,75 @@ declare function buildNamespaces(request: RequestFn): {
1159
1159
  getBackfill(id: string): Promise<import("./referrals").ReferralBackfillJob>;
1160
1160
  getForUser(userId: string): Promise<import("./users").UserReferralResult>;
1161
1161
  };
1162
+ policies: {
1163
+ list(params?: {
1164
+ include_retired?: boolean;
1165
+ }): Promise<{
1166
+ object: "list";
1167
+ data: import("./policies").Policy[];
1168
+ }>;
1169
+ create(body: import("./policies").CreatePolicyBody): Promise<import("./policies").Policy>;
1170
+ get(idOrKey: string): Promise<import("./policies").Policy>;
1171
+ update(idOrKey: string, body: import("./policies").UpdatePolicyBody): Promise<import("./policies").Policy>;
1172
+ delete(idOrKey: string): Promise<{
1173
+ object: "policy";
1174
+ id: string;
1175
+ key: string;
1176
+ deleted: boolean;
1177
+ retired: boolean;
1178
+ policy?: import("./policies").Policy;
1179
+ }>;
1180
+ versions: {
1181
+ list(idOrKey: string): Promise<{
1182
+ object: "list";
1183
+ data: import("./policies").PolicyVersion[];
1184
+ }>;
1185
+ create(idOrKey: string, body: import("./policies").CreatePolicyVersionBody): Promise<import("./policies").PolicyVersion>;
1186
+ get(idOrKey: string, versionIdOrLabel: string): Promise<import("./policies").PolicyVersion>;
1187
+ update(idOrKey: string, versionIdOrLabel: string, body: import("./policies").UpdatePolicyVersionBody): Promise<import("./policies").PolicyVersion>;
1188
+ delete(idOrKey: string, versionIdOrLabel: string): Promise<{
1189
+ object: "policy_version";
1190
+ id: string;
1191
+ deleted: true;
1192
+ }>;
1193
+ publish(idOrKey: string, versionIdOrLabel: string, body?: {
1194
+ effective_at?: number | string;
1195
+ }): Promise<import("./policies").PolicyVersion>;
1196
+ retire(idOrKey: string, versionIdOrLabel: string): Promise<import("./policies").PolicyVersion>;
1197
+ };
1198
+ listAcceptances(idOrKey: string, params?: import("./policies").ListPolicyAcceptancesParams): Promise<import("./policies").PolicyAcceptancePage>;
1199
+ exportAcceptancesCsv(idOrKey: string, params?: Omit<import("./policies").ListPolicyAcceptancesParams, "limit" | "starting_after">): Promise<string>;
1200
+ forUser(userId: string): Promise<{
1201
+ object: "list";
1202
+ user_id: string;
1203
+ data: import("./policies").PolicyStanding[];
1204
+ needs_acceptance: boolean;
1205
+ }>;
1206
+ settings: {
1207
+ get(): Promise<import("./policies").PolicySettings>;
1208
+ update(body: {
1209
+ session_claim?: boolean;
1210
+ }): Promise<import("./policies").PolicySettings>;
1211
+ };
1212
+ };
1213
+ policySource: {
1214
+ get(): Promise<import("./policies").PolicySource>;
1215
+ update(body: import("./policies").UpdatePolicySourceBody): Promise<import("./policies").PolicySource>;
1216
+ delete(): Promise<import("./policies").PolicySource>;
1217
+ test(): Promise<import("./policies").PolicySourceTest>;
1218
+ sync(): Promise<import("./policies").PolicySourceSync>;
1219
+ listDeliveries(params?: {
1220
+ limit?: number;
1221
+ starting_after?: string;
1222
+ kind?: string;
1223
+ status?: string;
1224
+ }): Promise<{
1225
+ object: "list";
1226
+ data: import("./policies").PolicySourceDelivery[];
1227
+ has_more: boolean;
1228
+ next_cursor: string | null;
1229
+ }>;
1230
+ };
1162
1231
  userHooks: {
1163
1232
  getBeforeUserCreate(): Promise<import("./user-hooks").BeforeUserCreateHook>;
1164
1233
  updateBeforeUserCreate(body: import("./user-hooks").UpdateBeforeUserCreateHookBody): Promise<import("./user-hooks").BeforeUserCreateHook>;
@@ -1546,6 +1615,7 @@ export * from './lti-platforms';
1546
1615
  export * from './instance';
1547
1616
  export * from './instance-security';
1548
1617
  export * from './referrals';
1618
+ export * from './policies';
1549
1619
  export * from './user-hooks';
1550
1620
  export * from './tokens';
1551
1621
  export * from './captcha';
@@ -64,6 +64,7 @@ const lti_platforms_1 = require("./lti-platforms");
64
64
  const instance_1 = require("./instance");
65
65
  const instance_security_1 = require("./instance-security");
66
66
  const referrals_1 = require("./referrals");
67
+ const policies_1 = require("./policies");
67
68
  const user_hooks_1 = require("./user-hooks");
68
69
  const tokens_1 = require("./tokens");
69
70
  const captcha_1 = require("./captcha");
@@ -161,6 +162,9 @@ function buildNamespaces(request) {
161
162
  instanceSecurity: (0, instance_security_1.instanceSecurityResource)(request),
162
163
  // Referral attribution: the instance's referral platform connection and call log.
163
164
  referrals: (0, referrals_1.referralsResource)(request),
165
+ // Policy acceptance: policies, versions, acceptances, settings, and the external policy source.
166
+ policies: (0, policies_1.policiesResource)(request),
167
+ policySource: (0, policies_1.policySourceResource)(request),
164
168
  // The before_user_create hook (sets external_id before the user exists).
165
169
  userHooks: (0, user_hooks_1.userHooksResource)(request),
166
170
  tokens: (0, tokens_1.tokensResource)(request),
@@ -257,6 +261,7 @@ __exportStar(require("./lti-platforms"), exports);
257
261
  __exportStar(require("./instance"), exports);
258
262
  __exportStar(require("./instance-security"), exports);
259
263
  __exportStar(require("./referrals"), exports);
264
+ __exportStar(require("./policies"), exports);
260
265
  __exportStar(require("./user-hooks"), exports);
261
266
  __exportStar(require("./tokens"), exports);
262
267
  __exportStar(require("./captcha"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,316 @@
1
+ import { type RequestFn } from './request';
2
+ /**
3
+ * Policy acceptance: the policies (Terms of Service, privacy policy, any key)
4
+ * your users accept at sign-up — and, per policy, again at sign-in when a new
5
+ * version takes effect. A policy's versions go draft → published (with an
6
+ * `effective_at`) → retired; a published version is immutable, and its
7
+ * `content_sha256` is the SHA-256 of the sanitised HTML users are shown.
8
+ * Acceptances are consent records carrying that hash and the reading evidence.
9
+ *
10
+ * Content can also come from any external system through the Atlas policy
11
+ * source protocol (`policySource`): Atlas fetches `GET {endpoint_url}/policies`
12
+ * signed like an Atlas webhook, and your system tells Atlas about a new
13
+ * version with a signed `policy.published` event.
14
+ */
15
+ export type PolicyDisplay = 'checkbox' | 'scroll' | 'link';
16
+ export type PolicyAppliesTo = 'sign_up' | 'sign_in_and_sign_up';
17
+ export type PolicyReaccept = 'none' | 'next_sign_in' | 'grace';
18
+ export interface PolicyVersionRef {
19
+ id: string;
20
+ version: string;
21
+ status: 'draft' | 'published' | 'retired' | (string & {});
22
+ content_sha256: string;
23
+ published_at: number | null;
24
+ effective_at: number | null;
25
+ }
26
+ export interface Policy {
27
+ object: 'policy';
28
+ id: string;
29
+ key: string;
30
+ title: string;
31
+ display: PolicyDisplay;
32
+ required: boolean;
33
+ applies_to: PolicyAppliesTo;
34
+ reaccept: PolicyReaccept;
35
+ grace_days: number | null;
36
+ source: 'atlas' | 'external';
37
+ position: number;
38
+ status: 'active' | 'retired';
39
+ /** External policies: fields changed in Atlas that a sync keeps. */
40
+ overrides: string[];
41
+ /** The version in effect now. */
42
+ current_version: PolicyVersionRef | null;
43
+ /** A newer published version that is not in effect yet. */
44
+ upcoming_version: PolicyVersionRef | null;
45
+ /** The newest version of any status (drafts included). */
46
+ latest_version: PolicyVersionRef | null;
47
+ retired_at: number | null;
48
+ created_at: number;
49
+ updated_at: number;
50
+ }
51
+ export interface PolicyVersion {
52
+ object: 'policy_version';
53
+ id: string;
54
+ policy_id: string;
55
+ policy: string;
56
+ version: string;
57
+ status: 'draft' | 'published' | 'retired';
58
+ content_markdown: string | null;
59
+ /** The sanitised HTML clients render. */
60
+ content_html: string;
61
+ content_url: string | null;
62
+ /** Hex SHA-256 of `content_html`. */
63
+ content_sha256: string;
64
+ summary_of_changes: string | null;
65
+ locale: string | null;
66
+ published_at: number | null;
67
+ effective_at: number | null;
68
+ retired_at: number | null;
69
+ created_at: number;
70
+ updated_at: number;
71
+ /** On list: how many users accepted this version. */
72
+ acceptance_count?: number;
73
+ }
74
+ export interface PolicyAcceptance {
75
+ object: 'policy_acceptance';
76
+ id: string;
77
+ user_id: string;
78
+ policy: string;
79
+ version: string;
80
+ policy_version_id: string | null;
81
+ status: 'accepted' | 'withdrawn';
82
+ source: 'signup' | 'signin' | 'reaccept' | 'api' | 'import' | (string & {}) | null;
83
+ content_sha256: string | null;
84
+ display: PolicyDisplay | null;
85
+ scrolled_to_end: boolean | null;
86
+ view_ms: number | null;
87
+ locale: string | null;
88
+ ip: string | null;
89
+ user_agent: string | null;
90
+ accepted_at: number;
91
+ }
92
+ export interface PolicyStanding {
93
+ object: 'policy_standing';
94
+ policy: string;
95
+ policy_id: string;
96
+ title: string;
97
+ display: PolicyDisplay;
98
+ required: boolean;
99
+ applies_to: PolicyAppliesTo;
100
+ reaccept: PolicyReaccept;
101
+ current_version_id: string | null;
102
+ current_version: string | null;
103
+ content_sha256: string | null;
104
+ summary_of_changes: string | null;
105
+ accepted_version_id: string | null;
106
+ accepted_version: string | null;
107
+ accepted_at: number | null;
108
+ needs_reaccept: boolean;
109
+ /** Accepting is required before the user's next sign-in completes. */
110
+ blocking: boolean;
111
+ grace_ends_at: number | null;
112
+ }
113
+ export interface CreatePolicyBody {
114
+ /** Slug, unique per instance (e.g. `tos`, `privacy`). Becomes the consent record's `policy`. */
115
+ key: string;
116
+ title: string;
117
+ display?: PolicyDisplay;
118
+ required?: boolean;
119
+ applies_to?: PolicyAppliesTo;
120
+ reaccept?: PolicyReaccept;
121
+ /** Required with `reaccept: 'grace'` (1–365). */
122
+ grace_days?: number | null;
123
+ position?: number;
124
+ }
125
+ export type UpdatePolicyBody = Partial<Omit<CreatePolicyBody, 'key'>> & {
126
+ status?: 'active' | 'retired';
127
+ };
128
+ export interface CreatePolicyVersionBody {
129
+ /** A label such as `2026-10-24` or `1.2.0`, unique per policy. */
130
+ version: string;
131
+ /** Markdown (rendered and sanitised by Atlas) — or `content_html`. */
132
+ content_markdown?: string;
133
+ content_html?: string;
134
+ content_url?: string | null;
135
+ summary_of_changes?: string | null;
136
+ locale?: string | null;
137
+ /** Publish immediately instead of saving a draft. */
138
+ publish?: boolean;
139
+ /** With `publish`: when the gate starts asking for it (epoch ms or ISO; default now). */
140
+ effective_at?: number | string;
141
+ }
142
+ export type UpdatePolicyVersionBody = Partial<Omit<CreatePolicyVersionBody, 'publish' | 'effective_at'>>;
143
+ export interface ListPolicyAcceptancesParams {
144
+ /** A version id or label. */
145
+ version?: string;
146
+ /** `accepted` (default), `withdrawn` or `all`. */
147
+ status?: 'accepted' | 'withdrawn' | 'all';
148
+ limit?: number;
149
+ starting_after?: string;
150
+ }
151
+ export interface PolicyAcceptancePage {
152
+ object: 'list';
153
+ data: PolicyAcceptance[];
154
+ has_more: boolean;
155
+ next_cursor: string | null;
156
+ }
157
+ export interface PolicySettings {
158
+ object: 'policy_settings';
159
+ /** Put `pol` (accepted versions of required policies) on session tokens. */
160
+ session_claim: boolean;
161
+ }
162
+ export interface PolicySource {
163
+ object: 'policy_source';
164
+ enabled: boolean;
165
+ endpoint_url: string | null;
166
+ signing_secret_set: boolean;
167
+ sync: 'webhook' | 'poll';
168
+ poll_interval_minutes: number;
169
+ /** Where your source sends `policy.published` / `policy.retired` events. */
170
+ webhook_url: string | null;
171
+ protocol_version: string;
172
+ last_synced_at: number | null;
173
+ last_sync_ok: boolean | null;
174
+ last_sync_error: string | null;
175
+ next_poll_at: number | null;
176
+ }
177
+ export interface UpdatePolicySourceBody {
178
+ enabled?: boolean;
179
+ /** Base URL; Atlas calls `GET {endpoint_url}/policies`. */
180
+ endpoint_url?: string | null;
181
+ /** Write-only (a `whsec_` secret works). */
182
+ signing_secret?: string | null;
183
+ sync?: 'webhook' | 'poll';
184
+ /** Poll mode: 5–1440. */
185
+ poll_interval_minutes?: number;
186
+ }
187
+ export interface PolicySourceDelivery {
188
+ object: 'policy_source_delivery';
189
+ id: string;
190
+ direction: 'outbound' | 'inbound';
191
+ kind: 'fetch' | 'test' | 'poll' | 'webhook';
192
+ status: 'ok' | 'failed' | 'rejected';
193
+ http_status: number | null;
194
+ error: string | null;
195
+ event_type: string | null;
196
+ policy: string | null;
197
+ version: string | null;
198
+ url: string | null;
199
+ changes: Record<string, unknown> | null;
200
+ latency_ms: number | null;
201
+ created_at: number;
202
+ }
203
+ export interface PolicySourceTest {
204
+ object: 'policy_source_test';
205
+ ok: boolean;
206
+ http_status: number | null;
207
+ latency_ms: number | null;
208
+ error: string | null;
209
+ warnings: string[];
210
+ policies: Array<{
211
+ key: string;
212
+ title: string;
213
+ versions: string[];
214
+ }>;
215
+ delivery: PolicySourceDelivery;
216
+ }
217
+ export interface PolicySourceSync {
218
+ object: 'policy_source_sync';
219
+ ok: boolean;
220
+ error: string | null;
221
+ warnings: string[];
222
+ changes: {
223
+ created: string[];
224
+ updated: string[];
225
+ published: string[];
226
+ unchanged: string[];
227
+ rejected: string[];
228
+ retired: string[];
229
+ } | null;
230
+ delivery: PolicySourceDelivery;
231
+ }
232
+ export declare function policiesResource(request: RequestFn): {
233
+ /** `GET /v1/policies` — active policies (`include_retired` for all). */
234
+ list(params?: {
235
+ include_retired?: boolean;
236
+ }): Promise<{
237
+ object: "list";
238
+ data: Policy[];
239
+ }>;
240
+ /** `POST /v1/policies`. */
241
+ create(body: CreatePolicyBody): Promise<Policy>;
242
+ /** `GET /v1/policies/:id` — by id or key. */
243
+ get(idOrKey: string): Promise<Policy>;
244
+ /** `PATCH /v1/policies/:id`. */
245
+ update(idOrKey: string, body: UpdatePolicyBody): Promise<Policy>;
246
+ /** `DELETE /v1/policies/:id` — deletes a never-published policy, retires one with history. */
247
+ delete(idOrKey: string): Promise<{
248
+ object: "policy";
249
+ id: string;
250
+ key: string;
251
+ deleted: boolean;
252
+ retired: boolean;
253
+ policy?: Policy;
254
+ }>;
255
+ versions: {
256
+ list(idOrKey: string): Promise<{
257
+ object: "list";
258
+ data: PolicyVersion[];
259
+ }>;
260
+ /** `POST /v1/policies/:id/versions` — a draft (or published at once with `publish: true`). */
261
+ create(idOrKey: string, body: CreatePolicyVersionBody): Promise<PolicyVersion>;
262
+ get(idOrKey: string, versionIdOrLabel: string): Promise<PolicyVersion>;
263
+ /** Drafts only. */
264
+ update(idOrKey: string, versionIdOrLabel: string, body: UpdatePolicyVersionBody): Promise<PolicyVersion>;
265
+ /** Drafts only. */
266
+ delete(idOrKey: string, versionIdOrLabel: string): Promise<{
267
+ object: "policy_version";
268
+ id: string;
269
+ deleted: true;
270
+ }>;
271
+ /** `POST …/publish` — `effective_at` (epoch ms or ISO; default now) is when the gate starts asking for it. */
272
+ publish(idOrKey: string, versionIdOrLabel: string, body?: {
273
+ effective_at?: number | string;
274
+ }): Promise<PolicyVersion>;
275
+ retire(idOrKey: string, versionIdOrLabel: string): Promise<PolicyVersion>;
276
+ };
277
+ /** `GET /v1/policies/:id/acceptances` — who accepted, newest first. */
278
+ listAcceptances(idOrKey: string, params?: ListPolicyAcceptancesParams): Promise<PolicyAcceptancePage>;
279
+ /** The same as CSV (`format=csv`, up to 100,000 rows). */
280
+ exportAcceptancesCsv(idOrKey: string, params?: Omit<ListPolicyAcceptancesParams, "limit" | "starting_after">): Promise<string>;
281
+ /** `GET /v1/users/:id/policies` — a user's standing on every policy. */
282
+ forUser(userId: string): Promise<{
283
+ object: "list";
284
+ user_id: string;
285
+ data: PolicyStanding[];
286
+ needs_acceptance: boolean;
287
+ }>;
288
+ settings: {
289
+ get(): Promise<PolicySettings>;
290
+ update(body: {
291
+ session_claim?: boolean;
292
+ }): Promise<PolicySettings>;
293
+ };
294
+ };
295
+ export declare function policySourceResource(request: RequestFn): {
296
+ get(): Promise<PolicySource>;
297
+ /** `PUT /v1/instance/policy_source` — partial; `signing_secret` is write-only. */
298
+ update(body: UpdatePolicySourceBody): Promise<PolicySource>;
299
+ /** Disconnect the source (its policies and history stay). */
300
+ delete(): Promise<PolicySource>;
301
+ /** A signed fetch of the feed, validated but not stored. */
302
+ test(): Promise<PolicySourceTest>;
303
+ /** Fetch and store now. */
304
+ sync(): Promise<PolicySourceSync>;
305
+ listDeliveries(params?: {
306
+ limit?: number;
307
+ starting_after?: string;
308
+ kind?: string;
309
+ status?: string;
310
+ }): Promise<{
311
+ object: "list";
312
+ data: PolicySourceDelivery[];
313
+ has_more: boolean;
314
+ next_cursor: string | null;
315
+ }>;
316
+ };
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.policiesResource = policiesResource;
4
+ exports.policySourceResource = policySourceResource;
5
+ const request_1 = require("./request");
6
+ function policiesResource(request) {
7
+ return {
8
+ /** `GET /v1/policies` — active policies (`include_retired` for all). */
9
+ list(params = {}) {
10
+ return request({ method: 'GET', path: '/v1/policies', query: { ...params } });
11
+ },
12
+ /** `POST /v1/policies`. */
13
+ create(body) {
14
+ return request({ method: 'POST', path: '/v1/policies', body });
15
+ },
16
+ /** `GET /v1/policies/:id` — by id or key. */
17
+ get(idOrKey) {
18
+ return request({ method: 'GET', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}` });
19
+ },
20
+ /** `PATCH /v1/policies/:id`. */
21
+ update(idOrKey, body) {
22
+ return request({ method: 'PATCH', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}`, body });
23
+ },
24
+ /** `DELETE /v1/policies/:id` — deletes a never-published policy, retires one with history. */
25
+ delete(idOrKey) {
26
+ return request({ method: 'DELETE', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}` });
27
+ },
28
+ versions: {
29
+ list(idOrKey) {
30
+ return request({ method: 'GET', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions` });
31
+ },
32
+ /** `POST /v1/policies/:id/versions` — a draft (or published at once with `publish: true`). */
33
+ create(idOrKey, body) {
34
+ return request({ method: 'POST', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions`, body });
35
+ },
36
+ get(idOrKey, versionIdOrLabel) {
37
+ return request({ method: 'GET', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions/${(0, request_1.enc)(versionIdOrLabel)}` });
38
+ },
39
+ /** Drafts only. */
40
+ update(idOrKey, versionIdOrLabel, body) {
41
+ return request({ method: 'PATCH', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions/${(0, request_1.enc)(versionIdOrLabel)}`, body });
42
+ },
43
+ /** Drafts only. */
44
+ delete(idOrKey, versionIdOrLabel) {
45
+ return request({ method: 'DELETE', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions/${(0, request_1.enc)(versionIdOrLabel)}` });
46
+ },
47
+ /** `POST …/publish` — `effective_at` (epoch ms or ISO; default now) is when the gate starts asking for it. */
48
+ publish(idOrKey, versionIdOrLabel, body = {}) {
49
+ return request({ method: 'POST', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions/${(0, request_1.enc)(versionIdOrLabel)}/publish`, body });
50
+ },
51
+ retire(idOrKey, versionIdOrLabel) {
52
+ return request({ method: 'POST', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/versions/${(0, request_1.enc)(versionIdOrLabel)}/retire` });
53
+ },
54
+ },
55
+ /** `GET /v1/policies/:id/acceptances` — who accepted, newest first. */
56
+ listAcceptances(idOrKey, params = {}) {
57
+ return request({ method: 'GET', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/acceptances`, query: { ...params } });
58
+ },
59
+ /** The same as CSV (`format=csv`, up to 100,000 rows). */
60
+ exportAcceptancesCsv(idOrKey, params = {}) {
61
+ return request({ method: 'GET', path: `/v1/policies/${(0, request_1.enc)(idOrKey)}/acceptances`, query: { ...params, format: 'csv' }, raw: true });
62
+ },
63
+ /** `GET /v1/users/:id/policies` — a user's standing on every policy. */
64
+ forUser(userId) {
65
+ return request({ method: 'GET', path: `/v1/users/${(0, request_1.enc)(userId)}/policies` });
66
+ },
67
+ settings: {
68
+ get() {
69
+ return request({ method: 'GET', path: '/v1/instance/policy_settings' });
70
+ },
71
+ update(body) {
72
+ return request({ method: 'PATCH', path: '/v1/instance/policy_settings', body });
73
+ },
74
+ },
75
+ };
76
+ }
77
+ function policySourceResource(request) {
78
+ return {
79
+ get() {
80
+ return request({ method: 'GET', path: '/v1/instance/policy_source' });
81
+ },
82
+ /** `PUT /v1/instance/policy_source` — partial; `signing_secret` is write-only. */
83
+ update(body) {
84
+ return request({ method: 'PUT', path: '/v1/instance/policy_source', body });
85
+ },
86
+ /** Disconnect the source (its policies and history stay). */
87
+ delete() {
88
+ return request({ method: 'DELETE', path: '/v1/instance/policy_source' });
89
+ },
90
+ /** A signed fetch of the feed, validated but not stored. */
91
+ test() {
92
+ return request({ method: 'POST', path: '/v1/instance/policy_source/test' });
93
+ },
94
+ /** Fetch and store now. */
95
+ sync() {
96
+ return request({ method: 'POST', path: '/v1/instance/policy_source/sync' });
97
+ },
98
+ listDeliveries(params = {}) {
99
+ return request({ method: 'GET', path: '/v1/instance/policy_source/deliveries', query: { ...params } });
100
+ },
101
+ };
102
+ }
103
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/client/policies.ts"],"names":[],"mappings":"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"}
@@ -664,6 +664,14 @@ export interface RecordUserConsentBody {
664
664
  status?: 'accepted' | 'withdrawn';
665
665
  source?: string;
666
666
  metadata?: Record<string, unknown>;
667
+ /** Policy acceptance evidence: the exact version (must be that version of that policy). */
668
+ policy_version_id?: string;
669
+ /** Must equal the version's `content_sha256` when given. */
670
+ content_sha256?: string;
671
+ display?: 'checkbox' | 'scroll' | 'link';
672
+ scrolled_to_end?: boolean;
673
+ view_ms?: number;
674
+ locale?: string;
667
675
  }
668
676
  export interface UserConsent {
669
677
  object: 'consent';
@@ -673,6 +681,13 @@ export interface UserConsent {
673
681
  status: 'accepted' | 'withdrawn' | (string & {});
674
682
  source: string | null;
675
683
  metadata?: unknown;
684
+ /** Policy acceptance evidence (null on records made outside a policy flow). */
685
+ policy_version_id?: string | null;
686
+ content_sha256?: string | null;
687
+ display?: 'checkbox' | 'scroll' | 'link' | null;
688
+ scrolled_to_end?: boolean | null;
689
+ view_ms?: number | null;
690
+ locale?: string | null;
676
691
  created_at: number;
677
692
  }
678
693
  export interface CreateUserApprovalRequestBody {
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { AtlasOidcError, OIDC_FLOW_COOKIE, OIDC_FLOW_MAX_AGE_SECONDS, oidc, oidc
12
12
  export type { AtlasOidc, AtlasOidcErrorCode, OidcCallbackOptions, OidcClientAuth, OidcIdentity, OidcLogoutUrlOptions, OidcStartOptions, OidcStartResult, VerifyIdTokenOptions, } from './oidc';
13
13
  export * from './webhooks';
14
14
  export * from './referrals';
15
+ export * from './policy-source';
15
16
  export * from './botid';
16
17
  export { createAtlasClient } from './client';
17
18
  export type { AtlasClient } from './client';
package/dist/index.js CHANGED
@@ -56,6 +56,7 @@ Object.defineProperty(exports, "resetOidcCaches", { enumerable: true, get: funct
56
56
  __exportStar(require("./webhooks"), exports);
57
57
  // The Atlas referral protocol, for a referral platform receiving Atlas's signed calls.
58
58
  __exportStar(require("./referrals"), exports);
59
+ __exportStar(require("./policy-source"), exports);
59
60
  // Vercel BotID: sign checkBotId() verdicts on your Vercel route for Atlas's captcha gate.
60
61
  __exportStar(require("./botid"), exports);
61
62
  // The typed management client for the secret-key Backend API.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,+CAA6B;AAC7B,mEAAmE;AACnE,yCAA2G;AAAlG,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,yHAAA,4BAA4B,OAAA;AACrF,2CAAyB;AACzB,mDAAiC;AACjC,8CAA4B;AAC5B,2FAA2F;AAC3F,gDAA8B;AAC9B,mDAAoE;AAA3D,sHAAA,oBAAoB,OAAA;AAAE,4GAAA,UAAU,OAAA;AAGzC,6EAA6E;AAC7E,+CAOwB;AANtB,wHAAA,wBAAwB,OAAA;AACxB,+HAAA,+BAA+B,OAAA;AAC/B,4HAAA,4BAA4B,OAAA;AAC5B,mHAAA,mBAAmB,OAAA;AACnB,uHAAA,uBAAuB,OAAA;AACvB,iHAAA,iBAAiB,OAAA;AAUnB,sEAAsE;AACtE,iFAAiF;AACjF,+BAWgB;AAVd,sGAAA,cAAc,OAAA;AACd,wGAAA,gBAAgB,OAAA;AAChB,iHAAA,yBAAyB,OAAA;AACzB,4FAAA,IAAI,OAAA;AACJ,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,qGAAA,aAAa,OAAA;AACb,iGAAA,SAAS,OAAA;AACT,yGAAA,iBAAiB,OAAA;AACjB,uGAAA,eAAe,OAAA;AAcjB,oDAAoD;AACpD,6CAA2B;AAE3B,uFAAuF;AACvF,8CAA4B;AAE5B,0FAA0F;AAC1F,0CAAwB;AAExB,8DAA8D;AAC9D,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAE1B,2CAAyB;AAEzB,yEAAyE;AACzE,2EAA2E;AAC3E,iEAAiE;AACjE,qCAAiE;AAAxD,2GAAA,gBAAgB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAS7C,6DAO+B;AAN7B,4HAAA,qBAAqB,OAAA;AACrB,wHAAA,iBAAiB,OAAA;AACjB,+HAAA,wBAAwB,OAAA;AACxB,yHAAA,kBAAkB,OAAA;AAClB,wHAAA,iBAAiB,OAAA;AACjB,4HAAA,qBAAqB,OAAA;AAWvB,wFAAwF;AACxF,2CAA2C;AAC3C,uCAA4C;AAAnC,sGAAA,YAAY,OAAA;AAErB,iDAA+E;AAAtE,yGAAA,UAAU,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAGnD,8EAA8E;AAC9E,gFAAgF;AAChF,mDAY0B;AAXxB,iIAAA,+BAA+B,OAAA;AAC/B,4HAAA,0BAA0B,OAAA;AAC1B,sHAAA,oBAAoB,OAAA;AACpB,2HAAA,yBAAyB,OAAA;AACzB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA;AACnB,uHAAA,qBAAqB,OAAA;AACrB,uHAAA,qBAAqB,OAAA;AACrB,2HAAA,yBAAyB,OAAA;AACzB,+HAAA,6BAA6B,OAAA;AAC7B,mHAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,+CAA6B;AAC7B,mEAAmE;AACnE,yCAA2G;AAAlG,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,yHAAA,4BAA4B,OAAA;AACrF,2CAAyB;AACzB,mDAAiC;AACjC,8CAA4B;AAC5B,2FAA2F;AAC3F,gDAA8B;AAC9B,mDAAoE;AAA3D,sHAAA,oBAAoB,OAAA;AAAE,4GAAA,UAAU,OAAA;AAGzC,6EAA6E;AAC7E,+CAOwB;AANtB,wHAAA,wBAAwB,OAAA;AACxB,+HAAA,+BAA+B,OAAA;AAC/B,4HAAA,4BAA4B,OAAA;AAC5B,mHAAA,mBAAmB,OAAA;AACnB,uHAAA,uBAAuB,OAAA;AACvB,iHAAA,iBAAiB,OAAA;AAUnB,sEAAsE;AACtE,iFAAiF;AACjF,+BAWgB;AAVd,sGAAA,cAAc,OAAA;AACd,wGAAA,gBAAgB,OAAA;AAChB,iHAAA,yBAAyB,OAAA;AACzB,4FAAA,IAAI,OAAA;AACJ,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,qGAAA,aAAa,OAAA;AACb,iGAAA,SAAS,OAAA;AACT,yGAAA,iBAAiB,OAAA;AACjB,uGAAA,eAAe,OAAA;AAcjB,oDAAoD;AACpD,6CAA2B;AAE3B,uFAAuF;AACvF,8CAA4B;AAC5B,kDAAgC;AAEhC,0FAA0F;AAC1F,0CAAwB;AAExB,8DAA8D;AAC9D,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAE1B,2CAAyB;AAEzB,yEAAyE;AACzE,2EAA2E;AAC3E,iEAAiE;AACjE,qCAAiE;AAAxD,2GAAA,gBAAgB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAS7C,6DAO+B;AAN7B,4HAAA,qBAAqB,OAAA;AACrB,wHAAA,iBAAiB,OAAA;AACjB,+HAAA,wBAAwB,OAAA;AACxB,yHAAA,kBAAkB,OAAA;AAClB,wHAAA,iBAAiB,OAAA;AACjB,4HAAA,qBAAqB,OAAA;AAWvB,wFAAwF;AACxF,2CAA2C;AAC3C,uCAA4C;AAAnC,sGAAA,YAAY,OAAA;AAErB,iDAA+E;AAAtE,yGAAA,UAAU,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAGnD,8EAA8E;AAC9E,gFAAgF;AAChF,mDAY0B;AAXxB,iIAAA,+BAA+B,OAAA;AAC/B,4HAAA,0BAA0B,OAAA;AAC1B,sHAAA,oBAAoB,OAAA;AACpB,2HAAA,yBAAyB,OAAA;AACzB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA;AACnB,uHAAA,qBAAqB,OAAA;AACrB,uHAAA,qBAAqB,OAAA;AACrB,2HAAA,yBAAyB,OAAA;AACzB,+HAAA,6BAA6B,OAAA;AAC7B,mHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Atlas policy source protocol v1 — helpers for the system that SERVES an
3
+ * Atlas instance's policy documents (a CMS, a docs platform, your own service).
4
+ *
5
+ * Atlas → you: GET {endpoint_url}/policies (full feed)
6
+ * GET {endpoint_url}/policies?key=<key> (one policy, after your event)
7
+ * signed with the source's signing secret: `atlas-id`, `atlas-timestamp`
8
+ * (epoch ms) and `atlas-signature: v1,<base64 HMAC-SHA256>` over
9
+ * `{atlas-id}.{atlas-timestamp}.GET\n{path+query}`. Verify it with
10
+ * {@link verifyPolicyFeedRequest}, then answer a {@link PolicyFeed}.
11
+ * You → Atlas: POST {webhook_url} (from GET /v1/instance/policy_source), a
12
+ * {@link PolicySourceEvent} signed with the same secret —
13
+ * {@link signPolicySourceEvent} (Atlas-style) or any Standard Webhooks library.
14
+ * Atlas then re-fetches that policy; it never stores content from the event.
15
+ */
16
+ export declare const POLICY_SOURCE_PROTOCOL_VERSION = "2026-10-24";
17
+ export declare const POLICY_SOURCE_VERSION_HEADER = "atlas-policies-version";
18
+ export interface PolicyFeedVersion {
19
+ version: string;
20
+ /** Epoch ms or ISO 8601. */
21
+ published_at?: number | string;
22
+ /** When Atlas starts asking users for it (defaults to published_at). */
23
+ effective_at?: number | string;
24
+ /** One of content_html / content_markdown, or content_url for Atlas to snapshot. At most 512 KB. */
25
+ content_html?: string;
26
+ content_markdown?: string;
27
+ content_url?: string;
28
+ summary_of_changes?: string;
29
+ locale?: string;
30
+ }
31
+ export interface PolicyFeedPolicy {
32
+ /** Slug: lowercase letters, digits, `_` and `-`. */
33
+ key: string;
34
+ title: string;
35
+ display?: 'checkbox' | 'scroll' | 'link';
36
+ required?: boolean;
37
+ applies_to?: 'sign_up' | 'sign_in_and_sign_up';
38
+ versions: PolicyFeedVersion[];
39
+ }
40
+ /** The answer to `GET {endpoint_url}/policies`. */
41
+ export interface PolicyFeed {
42
+ object: 'policy_list';
43
+ policies: PolicyFeedPolicy[];
44
+ }
45
+ export type PolicySourceEvent = {
46
+ type: 'policy.published';
47
+ key: string;
48
+ version: string;
49
+ occurred_at?: string | number;
50
+ } | {
51
+ type: 'policy.retired';
52
+ key: string;
53
+ occurred_at?: string | number;
54
+ };
55
+ type HeadersLike = Headers | Record<string, string | string[] | undefined>;
56
+ export type PolicyFeedVerifyResult = {
57
+ verified: true;
58
+ deliveryId: string;
59
+ timestamp: number;
60
+ key: string | null;
61
+ protocolVersion: string | undefined;
62
+ } | {
63
+ verified: false;
64
+ reason: 'missing_headers' | 'malformed_signature' | 'stale_timestamp' | 'signature_mismatch' | 'wrong_method';
65
+ };
66
+ /**
67
+ * Verify Atlas's signed GET of your feed. Pass the request's path AND query
68
+ * exactly as received (e.g. `req.originalUrl`), and the method.
69
+ *
70
+ * ```ts
71
+ * app.get('/atlas/policies', (req, res) => {
72
+ * const v = verifyPolicyFeedRequest({ method: req.method, pathAndQuery: req.originalUrl, headers: req.headers, secret });
73
+ * if (!v.verified) return res.sendStatus(401);
74
+ * res.json(buildFeed(v.key)); // PolicyFeed, one policy when v.key is set
75
+ * });
76
+ * ```
77
+ */
78
+ export declare function verifyPolicyFeedRequest(input: {
79
+ method?: string;
80
+ pathAndQuery: string;
81
+ headers: HeadersLike;
82
+ secret: string;
83
+ now?: Date;
84
+ toleranceMs?: number;
85
+ }): PolicyFeedVerifyResult;
86
+ /**
87
+ * Sign an event for `POST {webhook_url}` (Atlas-style headers). Send `body`
88
+ * byte-for-byte as returned.
89
+ *
90
+ * ```ts
91
+ * const { body, headers } = signPolicySourceEvent({ event: { type: 'policy.published', key: 'tos', version: '2026-10-24' }, secret });
92
+ * await fetch(webhookUrl, { method: 'POST', headers: { 'content-type': 'application/json', ...headers }, body });
93
+ * ```
94
+ */
95
+ export declare function signPolicySourceEvent(input: {
96
+ event: PolicySourceEvent;
97
+ secret: string;
98
+ id?: string;
99
+ timestampMs?: number;
100
+ }): {
101
+ body: string;
102
+ headers: Record<string, string>;
103
+ };
104
+ export {};
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POLICY_SOURCE_VERSION_HEADER = exports.POLICY_SOURCE_PROTOCOL_VERSION = void 0;
4
+ exports.verifyPolicyFeedRequest = verifyPolicyFeedRequest;
5
+ exports.signPolicySourceEvent = signPolicySourceEvent;
6
+ const node_crypto_1 = require("node:crypto");
7
+ /**
8
+ * Atlas policy source protocol v1 — helpers for the system that SERVES an
9
+ * Atlas instance's policy documents (a CMS, a docs platform, your own service).
10
+ *
11
+ * Atlas → you: GET {endpoint_url}/policies (full feed)
12
+ * GET {endpoint_url}/policies?key=<key> (one policy, after your event)
13
+ * signed with the source's signing secret: `atlas-id`, `atlas-timestamp`
14
+ * (epoch ms) and `atlas-signature: v1,<base64 HMAC-SHA256>` over
15
+ * `{atlas-id}.{atlas-timestamp}.GET\n{path+query}`. Verify it with
16
+ * {@link verifyPolicyFeedRequest}, then answer a {@link PolicyFeed}.
17
+ * You → Atlas: POST {webhook_url} (from GET /v1/instance/policy_source), a
18
+ * {@link PolicySourceEvent} signed with the same secret —
19
+ * {@link signPolicySourceEvent} (Atlas-style) or any Standard Webhooks library.
20
+ * Atlas then re-fetches that policy; it never stores content from the event.
21
+ */
22
+ exports.POLICY_SOURCE_PROTOCOL_VERSION = '2026-10-24';
23
+ exports.POLICY_SOURCE_VERSION_HEADER = 'atlas-policies-version';
24
+ const TOLERANCE_MS = 5 * 60_000;
25
+ function header(headers, name) {
26
+ if (typeof headers.get === 'function')
27
+ return headers.get(name) ?? undefined;
28
+ const bag = headers;
29
+ const direct = bag[name] ?? bag[Object.keys(bag).find((k) => k.toLowerCase() === name) ?? ''];
30
+ return Array.isArray(direct) ? direct[0] : direct;
31
+ }
32
+ function mac(secret, id, timestamp, payload) {
33
+ return (0, node_crypto_1.createHmac)('sha256', secret).update(`${id}.${timestamp}.${payload}`).digest();
34
+ }
35
+ /**
36
+ * Verify Atlas's signed GET of your feed. Pass the request's path AND query
37
+ * exactly as received (e.g. `req.originalUrl`), and the method.
38
+ *
39
+ * ```ts
40
+ * app.get('/atlas/policies', (req, res) => {
41
+ * const v = verifyPolicyFeedRequest({ method: req.method, pathAndQuery: req.originalUrl, headers: req.headers, secret });
42
+ * if (!v.verified) return res.sendStatus(401);
43
+ * res.json(buildFeed(v.key)); // PolicyFeed, one policy when v.key is set
44
+ * });
45
+ * ```
46
+ */
47
+ function verifyPolicyFeedRequest(input) {
48
+ if (input.method && input.method.toUpperCase() !== 'GET')
49
+ return { verified: false, reason: 'wrong_method' };
50
+ const id = header(input.headers, 'atlas-id');
51
+ const ts = header(input.headers, 'atlas-timestamp');
52
+ const sig = header(input.headers, 'atlas-signature');
53
+ if (!id || !ts || !sig)
54
+ return { verified: false, reason: 'missing_headers' };
55
+ const provided = sig
56
+ .trim()
57
+ .split(/\s+/)
58
+ .filter((e) => e.startsWith('v1,'))
59
+ .map((e) => Buffer.from(e.slice(3), 'base64'));
60
+ if (provided.length === 0)
61
+ return { verified: false, reason: 'malformed_signature' };
62
+ const timestamp = Number(ts);
63
+ const now = (input.now ?? new Date()).getTime();
64
+ if (!Number.isFinite(timestamp) || Math.abs(now - timestamp) > (input.toleranceMs ?? TOLERANCE_MS)) {
65
+ return { verified: false, reason: 'stale_timestamp' };
66
+ }
67
+ const expected = mac(input.secret, id, ts, `GET\n${input.pathAndQuery}`);
68
+ const ok = provided.some((p) => p.length === expected.length && (0, node_crypto_1.timingSafeEqual)(p, expected));
69
+ if (!ok)
70
+ return { verified: false, reason: 'signature_mismatch' };
71
+ let key = null;
72
+ const q = input.pathAndQuery.indexOf('?');
73
+ if (q !== -1)
74
+ key = new URLSearchParams(input.pathAndQuery.slice(q + 1)).get('key');
75
+ return { verified: true, deliveryId: id, timestamp, key, protocolVersion: header(input.headers, exports.POLICY_SOURCE_VERSION_HEADER) };
76
+ }
77
+ /**
78
+ * Sign an event for `POST {webhook_url}` (Atlas-style headers). Send `body`
79
+ * byte-for-byte as returned.
80
+ *
81
+ * ```ts
82
+ * const { body, headers } = signPolicySourceEvent({ event: { type: 'policy.published', key: 'tos', version: '2026-10-24' }, secret });
83
+ * await fetch(webhookUrl, { method: 'POST', headers: { 'content-type': 'application/json', ...headers }, body });
84
+ * ```
85
+ */
86
+ function signPolicySourceEvent(input) {
87
+ const body = JSON.stringify({ occurred_at: new Date().toISOString(), ...input.event });
88
+ const id = input.id ?? `evt_${(0, node_crypto_1.randomUUID)()}`;
89
+ const ts = String(input.timestampMs ?? Date.now());
90
+ return {
91
+ body,
92
+ headers: {
93
+ 'atlas-id': id,
94
+ 'atlas-timestamp': ts,
95
+ 'atlas-signature': `v1,${mac(input.secret, id, ts, body).toString('base64')}`,
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=policy-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-source.js","sourceRoot":"","sources":["../src/policy-source.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlasauth/backend",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "dependencies": {