@emilia-protocol/gate 0.14.0 → 0.15.1

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 (62) hide show
  1. package/CHANGELOG.md +60 -1
  2. package/README.md +32 -1
  3. package/aeb-consumption-store.js +3 -0
  4. package/dist/aeb-consumption-store.d.ts +88 -0
  5. package/dist/aeb-consumption-store.d.ts.map +1 -0
  6. package/dist/aeb-consumption-store.js +471 -0
  7. package/dist/aeb-consumption-store.js.map +1 -0
  8. package/dist/capability-receipt.d.ts +8 -0
  9. package/dist/capability-receipt.d.ts.map +1 -1
  10. package/dist/capability-receipt.js +17 -0
  11. package/dist/capability-receipt.js.map +1 -1
  12. package/dist/index.d.ts +13 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +16 -4
  15. package/dist/index.js.map +1 -1
  16. package/dist/proposal-to-effect-postgres.d.ts +144 -0
  17. package/dist/proposal-to-effect-postgres.d.ts.map +1 -0
  18. package/dist/proposal-to-effect-postgres.js +1578 -0
  19. package/dist/proposal-to-effect-postgres.js.map +1 -0
  20. package/dist/proposal-to-effect-status-head-store.d.ts +72 -0
  21. package/dist/proposal-to-effect-status-head-store.d.ts.map +1 -0
  22. package/dist/proposal-to-effect-status-head-store.js +355 -0
  23. package/dist/proposal-to-effect-status-head-store.js.map +1 -0
  24. package/dist/proposal-to-effect-status.d.ts +55 -0
  25. package/dist/proposal-to-effect-status.d.ts.map +1 -0
  26. package/dist/proposal-to-effect-status.js +294 -0
  27. package/dist/proposal-to-effect-status.js.map +1 -0
  28. package/dist/proposal-to-effect.d.ts +151 -3
  29. package/dist/proposal-to-effect.d.ts.map +1 -1
  30. package/dist/proposal-to-effect.js +589 -46
  31. package/dist/proposal-to-effect.js.map +1 -1
  32. package/dist/remedy-case-set-postgres.d.ts +73 -0
  33. package/dist/remedy-case-set-postgres.d.ts.map +1 -0
  34. package/dist/remedy-case-set-postgres.js +846 -0
  35. package/dist/remedy-case-set-postgres.js.map +1 -0
  36. package/dist/remedy-case-set.d.ts +53 -0
  37. package/dist/remedy-case-set.d.ts.map +1 -0
  38. package/dist/remedy-case-set.js +571 -0
  39. package/dist/remedy-case-set.js.map +1 -0
  40. package/dist/remedy-program-adapters.d.ts +137 -0
  41. package/dist/remedy-program-adapters.d.ts.map +1 -0
  42. package/dist/remedy-program-adapters.js +590 -0
  43. package/dist/remedy-program-adapters.js.map +1 -0
  44. package/dist/trust-program-revocation.js.map +1 -1
  45. package/package.json +283 -63
  46. package/proposal-to-effect-postgres.js +3 -0
  47. package/proposal-to-effect-status-head-store.js +2 -0
  48. package/proposal-to-effect-status.js +2 -0
  49. package/remedy-case-set-postgres.js +3 -0
  50. package/remedy-case-set.js +3 -0
  51. package/remedy-program-adapters.js +3 -0
  52. package/src/aeb-consumption-store.ts +568 -0
  53. package/src/capability-receipt.ts +17 -0
  54. package/src/index.ts +66 -3
  55. package/src/proposal-to-effect-postgres.ts +1833 -0
  56. package/src/proposal-to-effect-status-head-store.ts +449 -0
  57. package/src/proposal-to-effect-status.ts +388 -0
  58. package/src/proposal-to-effect.ts +755 -50
  59. package/src/remedy-case-set-postgres.ts +1008 -0
  60. package/src/remedy-case-set.ts +603 -0
  61. package/src/remedy-program-adapters.ts +657 -0
  62. package/src/trust-program-revocation.ts +1 -1
@@ -0,0 +1,471 @@
1
+ // @ts-nocheck
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * PostgreSQL custody for AEB operation consumption and native replay fences.
5
+ *
6
+ * A reservation installs the operation key and every native replay key in one
7
+ * pinned transaction. Logical conflicts roll the transaction back; database
8
+ * errors propagate so callers fail closed. Commit and release are fenced by an
9
+ * opaque per-reservation token retained only by the store instance that won.
10
+ */
11
+ import crypto from 'node:crypto';
12
+ export const AEB_PG_CONSUMPTION_STORE_VERSION = 'EP-GATE-AEB-PG-CONSUMPTION-v1';
13
+ export const AEB_CONSUMPTION_OPERATION_TABLE = 'ep_aeb_consumption_operations';
14
+ export const AEB_CONSUMPTION_REPLAY_TABLE = 'ep_aeb_consumption_replay_fences';
15
+ export const AEB_CONSUMPTION_EXECUTOR_ROLE = 'ep_aeb_executor';
16
+ export const AEB_CONSUMPTION_RECOVERY_ROLE = 'ep_aeb_recovery';
17
+ export const AEB_CONSUMPTION_OWNER_ROLE = 'ep_aeb_store_owner';
18
+ /** Exact schema required by createPostgresAebDurableConsumptionStore(). */
19
+ export const AEB_CONSUMPTION_DDL = `CREATE TABLE IF NOT EXISTS ${AEB_CONSUMPTION_OPERATION_TABLE} (
20
+ tenant_id TEXT NOT NULL CHECK (octet_length(tenant_id) BETWEEN 1 AND 512),
21
+ relying_party_id TEXT NOT NULL CHECK (octet_length(relying_party_id) BETWEEN 1 AND 512),
22
+ operation_key TEXT NOT NULL CHECK (octet_length(operation_key) BETWEEN 1 AND 4096),
23
+ state TEXT NOT NULL CHECK (state IN ('RESERVED', 'CONSUMED')),
24
+ owner_token TEXT NULL CHECK (owner_token IS NULL OR octet_length(owner_token) BETWEEN 16 AND 512),
25
+ reserved_at TIMESTAMPTZ NOT NULL DEFAULT transaction_timestamp(),
26
+ consumed_at TIMESTAMPTZ NULL,
27
+ PRIMARY KEY (tenant_id, relying_party_id, operation_key),
28
+ CHECK (
29
+ (state = 'RESERVED' AND owner_token IS NOT NULL AND consumed_at IS NULL)
30
+ OR (state = 'CONSUMED' AND owner_token IS NULL AND consumed_at IS NOT NULL)
31
+ )
32
+ );
33
+ CREATE TABLE IF NOT EXISTS ${AEB_CONSUMPTION_REPLAY_TABLE} (
34
+ tenant_id TEXT NOT NULL CHECK (octet_length(tenant_id) BETWEEN 1 AND 512),
35
+ relying_party_id TEXT NOT NULL CHECK (octet_length(relying_party_id) BETWEEN 1 AND 512),
36
+ replay_key TEXT NOT NULL CHECK (octet_length(replay_key) BETWEEN 1 AND 4096),
37
+ operation_key TEXT NOT NULL CHECK (octet_length(operation_key) BETWEEN 1 AND 4096),
38
+ reserved_at TIMESTAMPTZ NOT NULL DEFAULT transaction_timestamp(),
39
+ PRIMARY KEY (tenant_id, relying_party_id, replay_key),
40
+ FOREIGN KEY (tenant_id, relying_party_id, operation_key)
41
+ REFERENCES ${AEB_CONSUMPTION_OPERATION_TABLE} (tenant_id, relying_party_id, operation_key)
42
+ ON DELETE CASCADE
43
+ );
44
+ CREATE INDEX IF NOT EXISTS ${AEB_CONSUMPTION_REPLAY_TABLE}_operation_idx
45
+ ON ${AEB_CONSUMPTION_REPLAY_TABLE} (tenant_id, relying_party_id, operation_key);
46
+ DO $roles$
47
+ BEGIN
48
+ IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = '${AEB_CONSUMPTION_EXECUTOR_ROLE}') THEN
49
+ CREATE ROLE ${AEB_CONSUMPTION_EXECUTOR_ROLE} NOLOGIN
50
+ NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS;
51
+ END IF;
52
+ IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = '${AEB_CONSUMPTION_RECOVERY_ROLE}') THEN
53
+ CREATE ROLE ${AEB_CONSUMPTION_RECOVERY_ROLE} NOLOGIN
54
+ NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS;
55
+ END IF;
56
+ IF NOT EXISTS (SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = '${AEB_CONSUMPTION_OWNER_ROLE}') THEN
57
+ CREATE ROLE ${AEB_CONSUMPTION_OWNER_ROLE} NOLOGIN
58
+ NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION NOBYPASSRLS;
59
+ END IF;
60
+ END
61
+ $roles$;
62
+ GRANT ${AEB_CONSUMPTION_OWNER_ROLE} TO CURRENT_USER;
63
+ CREATE SCHEMA IF NOT EXISTS ep_aeb_private;
64
+ REVOKE ALL ON SCHEMA ep_aeb_private FROM PUBLIC, anon, authenticated, service_role;
65
+ CREATE TABLE IF NOT EXISTS ep_aeb_private.tenant_principals (
66
+ principal_name NAME NOT NULL,
67
+ tenant_id TEXT NOT NULL CHECK (octet_length(tenant_id) BETWEEN 1 AND 512),
68
+ can_execute BOOLEAN NOT NULL DEFAULT FALSE,
69
+ can_recover BOOLEAN NOT NULL DEFAULT FALSE,
70
+ PRIMARY KEY (principal_name, tenant_id),
71
+ CHECK (can_execute OR can_recover)
72
+ );
73
+ ALTER SCHEMA ep_aeb_private OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
74
+ ALTER TABLE ep_aeb_private.tenant_principals OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
75
+ ALTER TABLE ${AEB_CONSUMPTION_OPERATION_TABLE} OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
76
+ ALTER TABLE ${AEB_CONSUMPTION_REPLAY_TABLE} OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
77
+ ALTER TABLE ep_aeb_private.tenant_principals ENABLE ROW LEVEL SECURITY;
78
+ ALTER TABLE ep_aeb_private.tenant_principals FORCE ROW LEVEL SECURITY;
79
+ ALTER TABLE ${AEB_CONSUMPTION_OPERATION_TABLE} ENABLE ROW LEVEL SECURITY;
80
+ ALTER TABLE ${AEB_CONSUMPTION_OPERATION_TABLE} FORCE ROW LEVEL SECURITY;
81
+ ALTER TABLE ${AEB_CONSUMPTION_REPLAY_TABLE} ENABLE ROW LEVEL SECURITY;
82
+ ALTER TABLE ${AEB_CONSUMPTION_REPLAY_TABLE} FORCE ROW LEVEL SECURITY;
83
+ DROP POLICY IF EXISTS ep_aeb_principals_owner_only ON ep_aeb_private.tenant_principals;
84
+ CREATE POLICY ep_aeb_principals_owner_only ON ep_aeb_private.tenant_principals
85
+ TO ${AEB_CONSUMPTION_OWNER_ROLE} USING (TRUE) WITH CHECK (TRUE);
86
+ DROP POLICY IF EXISTS ep_aeb_operations_owner_only ON ${AEB_CONSUMPTION_OPERATION_TABLE};
87
+ CREATE POLICY ep_aeb_operations_owner_only ON ${AEB_CONSUMPTION_OPERATION_TABLE}
88
+ TO ${AEB_CONSUMPTION_OWNER_ROLE} USING (TRUE) WITH CHECK (TRUE);
89
+ DROP POLICY IF EXISTS ep_aeb_replay_owner_only ON ${AEB_CONSUMPTION_REPLAY_TABLE};
90
+ CREATE POLICY ep_aeb_replay_owner_only ON ${AEB_CONSUMPTION_REPLAY_TABLE}
91
+ TO ${AEB_CONSUMPTION_OWNER_ROLE} USING (TRUE) WITH CHECK (TRUE);
92
+ REVOKE ALL ON ep_aeb_private.tenant_principals FROM PUBLIC, anon, authenticated, service_role,
93
+ ${AEB_CONSUMPTION_EXECUTOR_ROLE}, ${AEB_CONSUMPTION_RECOVERY_ROLE};
94
+ REVOKE ALL ON ${AEB_CONSUMPTION_OPERATION_TABLE} FROM PUBLIC, anon, authenticated, service_role,
95
+ ${AEB_CONSUMPTION_EXECUTOR_ROLE}, ${AEB_CONSUMPTION_RECOVERY_ROLE};
96
+ REVOKE ALL ON ${AEB_CONSUMPTION_REPLAY_TABLE} FROM PUBLIC, anon, authenticated, service_role,
97
+ ${AEB_CONSUMPTION_EXECUTOR_ROLE}, ${AEB_CONSUMPTION_RECOVERY_ROLE};
98
+ CREATE OR REPLACE FUNCTION ep_aeb_private.assert_tenant_principal(
99
+ p_tenant_id TEXT, p_recovery BOOLEAN
100
+ ) RETURNS VOID
101
+ LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path = ''
102
+ AS $fn$
103
+ DECLARE v_role_ok BOOLEAN; v_binding_ok BOOLEAN;
104
+ BEGIN
105
+ v_role_ok := CASE WHEN p_recovery
106
+ THEN pg_catalog.pg_has_role(SESSION_USER, '${AEB_CONSUMPTION_RECOVERY_ROLE}', 'MEMBER')
107
+ ELSE pg_catalog.pg_has_role(SESSION_USER, '${AEB_CONSUMPTION_EXECUTOR_ROLE}', 'MEMBER')
108
+ END;
109
+ SELECT EXISTS (
110
+ SELECT 1 FROM ep_aeb_private.tenant_principals AS principals
111
+ WHERE principals.principal_name = SESSION_USER
112
+ AND principals.tenant_id = p_tenant_id
113
+ AND CASE WHEN p_recovery THEN principals.can_recover ELSE principals.can_execute END
114
+ ) INTO v_binding_ok;
115
+ IF v_role_ok IS NOT TRUE OR v_binding_ok IS NOT TRUE THEN
116
+ RAISE EXCEPTION 'AEB_TENANT_PRINCIPAL_REFUSED' USING ERRCODE = '42501';
117
+ END IF;
118
+ END
119
+ $fn$;
120
+ CREATE OR REPLACE FUNCTION ep_aeb_private.reserve_operation(
121
+ p_tenant_id TEXT, p_relying_party_id TEXT, p_operation_key TEXT, p_owner_token TEXT
122
+ ) RETURNS TABLE(operation_key TEXT)
123
+ LANGUAGE plpgsql SECURITY DEFINER SET search_path = ''
124
+ AS $fn$
125
+ BEGIN
126
+ PERFORM ep_aeb_private.assert_tenant_principal(p_tenant_id, FALSE);
127
+ RETURN QUERY INSERT INTO public.${AEB_CONSUMPTION_OPERATION_TABLE}
128
+ (tenant_id, relying_party_id, operation_key, state, owner_token)
129
+ VALUES (p_tenant_id, p_relying_party_id, p_operation_key, 'RESERVED', p_owner_token)
130
+ ON CONFLICT ON CONSTRAINT ep_aeb_consumption_operations_pkey DO NOTHING
131
+ RETURNING ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key;
132
+ END
133
+ $fn$;
134
+ CREATE OR REPLACE FUNCTION ep_aeb_private.has_replay_fence(
135
+ p_tenant_id TEXT, p_relying_party_id TEXT, p_replay_key TEXT
136
+ ) RETURNS TABLE(fenced BOOLEAN)
137
+ LANGUAGE plpgsql VOLATILE SECURITY DEFINER SET search_path = ''
138
+ AS $fn$
139
+ BEGIN
140
+ PERFORM ep_aeb_private.assert_tenant_principal(p_tenant_id, FALSE);
141
+ RETURN QUERY SELECT EXISTS (
142
+ SELECT 1
143
+ FROM public.${AEB_CONSUMPTION_REPLAY_TABLE} AS fences
144
+ WHERE fences.tenant_id = p_tenant_id
145
+ AND fences.relying_party_id = p_relying_party_id
146
+ AND fences.replay_key = p_replay_key
147
+ );
148
+ END
149
+ $fn$;
150
+ CREATE OR REPLACE FUNCTION ep_aeb_private.reserve_replay_keys(
151
+ p_tenant_id TEXT, p_relying_party_id TEXT, p_operation_key TEXT, p_replay_keys TEXT[]
152
+ ) RETURNS TABLE(replay_key TEXT)
153
+ LANGUAGE plpgsql SECURITY DEFINER SET search_path = ''
154
+ AS $fn$
155
+ BEGIN
156
+ PERFORM ep_aeb_private.assert_tenant_principal(p_tenant_id, FALSE);
157
+ RETURN QUERY INSERT INTO public.${AEB_CONSUMPTION_REPLAY_TABLE}
158
+ (tenant_id, relying_party_id, replay_key, operation_key)
159
+ SELECT p_tenant_id, p_relying_party_id, requested.replay_key, p_operation_key
160
+ FROM pg_catalog.unnest(p_replay_keys) AS requested(replay_key)
161
+ ORDER BY requested.replay_key
162
+ ON CONFLICT ON CONSTRAINT ep_aeb_consumption_replay_fences_pkey DO NOTHING
163
+ RETURNING ${AEB_CONSUMPTION_REPLAY_TABLE}.replay_key;
164
+ END
165
+ $fn$;
166
+ CREATE OR REPLACE FUNCTION ep_aeb_private.commit_operation(
167
+ p_tenant_id TEXT, p_relying_party_id TEXT, p_operation_key TEXT, p_owner_token TEXT
168
+ ) RETURNS TABLE(operation_key TEXT)
169
+ LANGUAGE plpgsql SECURITY DEFINER SET search_path = ''
170
+ AS $fn$
171
+ BEGIN
172
+ PERFORM ep_aeb_private.assert_tenant_principal(p_tenant_id, FALSE);
173
+ RETURN QUERY UPDATE public.${AEB_CONSUMPTION_OPERATION_TABLE}
174
+ SET state = 'CONSUMED', owner_token = NULL, consumed_at = pg_catalog.transaction_timestamp()
175
+ WHERE tenant_id = p_tenant_id AND relying_party_id = p_relying_party_id
176
+ AND ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key = p_operation_key
177
+ AND state = 'RESERVED' AND owner_token = p_owner_token
178
+ RETURNING ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key;
179
+ END
180
+ $fn$;
181
+ CREATE OR REPLACE FUNCTION ep_aeb_private.claim_operation(
182
+ p_tenant_id TEXT, p_relying_party_id TEXT, p_operation_key TEXT, p_owner_token TEXT
183
+ ) RETURNS TABLE(operation_key TEXT)
184
+ LANGUAGE plpgsql SECURITY DEFINER SET search_path = ''
185
+ AS $fn$
186
+ BEGIN
187
+ PERFORM ep_aeb_private.assert_tenant_principal(p_tenant_id, TRUE);
188
+ RETURN QUERY UPDATE public.${AEB_CONSUMPTION_OPERATION_TABLE}
189
+ SET owner_token = p_owner_token
190
+ WHERE tenant_id = p_tenant_id AND relying_party_id = p_relying_party_id
191
+ AND ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key = p_operation_key
192
+ AND state = 'RESERVED'
193
+ RETURNING ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key;
194
+ END
195
+ $fn$;
196
+ CREATE OR REPLACE FUNCTION ep_aeb_private.release_operation(
197
+ p_tenant_id TEXT, p_relying_party_id TEXT, p_operation_key TEXT, p_owner_token TEXT
198
+ ) RETURNS TABLE(operation_key TEXT)
199
+ LANGUAGE plpgsql SECURITY DEFINER SET search_path = ''
200
+ AS $fn$
201
+ BEGIN
202
+ PERFORM ep_aeb_private.assert_tenant_principal(p_tenant_id, FALSE);
203
+ RETURN QUERY DELETE FROM public.${AEB_CONSUMPTION_OPERATION_TABLE}
204
+ WHERE tenant_id = p_tenant_id AND relying_party_id = p_relying_party_id
205
+ AND ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key = p_operation_key
206
+ AND state = 'RESERVED' AND owner_token = p_owner_token
207
+ RETURNING ${AEB_CONSUMPTION_OPERATION_TABLE}.operation_key;
208
+ END
209
+ $fn$;
210
+ ALTER FUNCTION ep_aeb_private.assert_tenant_principal(TEXT, BOOLEAN)
211
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
212
+ ALTER FUNCTION ep_aeb_private.reserve_operation(TEXT, TEXT, TEXT, TEXT)
213
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
214
+ ALTER FUNCTION ep_aeb_private.has_replay_fence(TEXT, TEXT, TEXT)
215
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
216
+ ALTER FUNCTION ep_aeb_private.reserve_replay_keys(TEXT, TEXT, TEXT, TEXT[])
217
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
218
+ ALTER FUNCTION ep_aeb_private.commit_operation(TEXT, TEXT, TEXT, TEXT)
219
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
220
+ ALTER FUNCTION ep_aeb_private.claim_operation(TEXT, TEXT, TEXT, TEXT)
221
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
222
+ ALTER FUNCTION ep_aeb_private.release_operation(TEXT, TEXT, TEXT, TEXT)
223
+ OWNER TO ${AEB_CONSUMPTION_OWNER_ROLE};
224
+ REVOKE ALL ON ALL FUNCTIONS IN SCHEMA ep_aeb_private
225
+ FROM PUBLIC, anon, authenticated, service_role;
226
+ GRANT USAGE ON SCHEMA ep_aeb_private TO ${AEB_CONSUMPTION_EXECUTOR_ROLE}, ${AEB_CONSUMPTION_RECOVERY_ROLE};
227
+ GRANT EXECUTE ON FUNCTION ep_aeb_private.has_replay_fence(TEXT, TEXT, TEXT),
228
+ ep_aeb_private.reserve_operation(TEXT, TEXT, TEXT, TEXT),
229
+ ep_aeb_private.reserve_replay_keys(TEXT, TEXT, TEXT, TEXT[]),
230
+ ep_aeb_private.commit_operation(TEXT, TEXT, TEXT, TEXT),
231
+ ep_aeb_private.release_operation(TEXT, TEXT, TEXT, TEXT)
232
+ TO ${AEB_CONSUMPTION_EXECUTOR_ROLE};
233
+ GRANT EXECUTE ON FUNCTION ep_aeb_private.claim_operation(TEXT, TEXT, TEXT, TEXT)
234
+ TO ${AEB_CONSUMPTION_RECOVERY_ROLE};
235
+ REVOKE ${AEB_CONSUMPTION_OWNER_ROLE} FROM CURRENT_USER;`;
236
+ /** Exact statements issued by the store, exported for audit and deterministic fakes. */
237
+ export const AEB_CONSUMPTION_SQL = Object.freeze({
238
+ hasReplayFence: `SELECT fenced FROM ep_aeb_private.has_replay_fence($1::text, $2::text, $3::text)`,
239
+ reserveOperation: `SELECT operation_key FROM ep_aeb_private.reserve_operation($1::text, $2::text, $3::text, $4::text)`,
240
+ reserveReplayKeys: `SELECT replay_key FROM ep_aeb_private.reserve_replay_keys($1::text, $2::text, $3::text, $4::text[])`,
241
+ commitOperation: `SELECT operation_key FROM ep_aeb_private.commit_operation($1::text, $2::text, $3::text, $4::text)`,
242
+ claimOperation: `SELECT operation_key FROM ep_aeb_private.claim_operation($1::text, $2::text, $3::text, $4::text)`,
243
+ releaseOperation: `SELECT operation_key FROM ep_aeb_private.release_operation($1::text, $2::text, $3::text, $4::text)`,
244
+ });
245
+ const BEGIN_WRITE = 'BEGIN ISOLATION LEVEL READ COMMITTED READ WRITE';
246
+ const COMMIT = 'COMMIT';
247
+ const ROLLBACK = 'ROLLBACK';
248
+ class ReservationConflict extends Error {
249
+ result;
250
+ constructor(result) {
251
+ super(result);
252
+ this.result = result;
253
+ }
254
+ }
255
+ function defaultOwnerToken() {
256
+ return crypto.randomBytes(32).toString('base64url');
257
+ }
258
+ function assertText(value, label, maximumBytes) {
259
+ if (typeof value !== 'string'
260
+ || Buffer.byteLength(value, 'utf8') < 1
261
+ || Buffer.byteLength(value, 'utf8') > maximumBytes
262
+ || /[\u0000-\u001f\u007f]/.test(value)) {
263
+ throw new TypeError(`AEB consumption ${label} is invalid`);
264
+ }
265
+ }
266
+ function assertOwnerToken(value) {
267
+ if (typeof value !== 'string'
268
+ || Buffer.byteLength(value, 'utf8') < 16
269
+ || Buffer.byteLength(value, 'utf8') > 512
270
+ || /[\u0000-\u001f\u007f]/.test(value)) {
271
+ throw new TypeError('AEB consumption ownerTokenFactory must return an opaque string of 16 to 512 bytes');
272
+ }
273
+ }
274
+ function exactRowCount(result, operation) {
275
+ if (!result
276
+ || !Number.isSafeInteger(result.rowCount)
277
+ || result.rowCount < 0) {
278
+ throw new Error(`${operation}: malformed PostgreSQL result`);
279
+ }
280
+ return result.rowCount;
281
+ }
282
+ /**
283
+ * Create the durable AEB store consumed by authorizeAebExecutionDurable().
284
+ * The pool must return a pinned node-postgres-style client for each transaction.
285
+ */
286
+ export function createPostgresAebDurableConsumptionStore({ pool, recoveryPool, tenantId, relyingPartyId, ownerTokenFactory = defaultOwnerToken, authorizeRecoveryClaim, } = {}) {
287
+ if (!pool || typeof pool.connect !== 'function') {
288
+ throw new TypeError('createPostgresAebDurableConsumptionStore requires an ep_aeb_executor pg pool');
289
+ }
290
+ if (!recoveryPool || typeof recoveryPool.connect !== 'function' || recoveryPool === pool) {
291
+ throw new TypeError('AEB consumption requires a distinct ep_aeb_recovery pg pool');
292
+ }
293
+ assertText(tenantId, 'tenantId', 512);
294
+ assertText(relyingPartyId, 'relyingPartyId', 512);
295
+ if (typeof ownerTokenFactory !== 'function') {
296
+ throw new TypeError('AEB consumption ownerTokenFactory must be a function');
297
+ }
298
+ if (typeof authorizeRecoveryClaim !== 'function') {
299
+ throw new TypeError('AEB consumption requires an authorizeRecoveryClaim callback');
300
+ }
301
+ async function transaction(activePool, work) {
302
+ const client = await activePool.connect();
303
+ if (!client || typeof client.query !== 'function' || typeof client.release !== 'function') {
304
+ throw new TypeError('AEB consumption pg pool returned an invalid client');
305
+ }
306
+ let began = false;
307
+ try {
308
+ await client.query(BEGIN_WRITE);
309
+ began = true;
310
+ const result = await work(client);
311
+ await client.query(COMMIT);
312
+ began = false;
313
+ return result;
314
+ }
315
+ catch (error) {
316
+ if (began) {
317
+ try {
318
+ await client.query(ROLLBACK);
319
+ }
320
+ catch (rollbackError) {
321
+ throw new AggregateError([error, rollbackError], 'AEB consumption transaction and rollback both failed');
322
+ }
323
+ }
324
+ throw error;
325
+ }
326
+ finally {
327
+ client.release();
328
+ }
329
+ }
330
+ const ownedReservations = new Map();
331
+ const store = {
332
+ durable: true,
333
+ ownershipFenced: true,
334
+ permanentConsumption: true,
335
+ atomicReplayFenced: true,
336
+ recoveryClaimSupported: true,
337
+ async hasReplayFence(replayKey) {
338
+ assertText(replayKey, 'native replay key', 4096);
339
+ const client = await pool.connect();
340
+ if (!client || typeof client.query !== 'function' || typeof client.release !== 'function') {
341
+ throw new TypeError('AEB consumption pg pool returned an invalid client');
342
+ }
343
+ try {
344
+ const result = await client.query(AEB_CONSUMPTION_SQL.hasReplayFence, [
345
+ tenantId, relyingPartyId, replayKey,
346
+ ]);
347
+ const rows = exactRowCount(result, 'lookup replay fence');
348
+ const fenced = result.rows?.[0]?.fenced;
349
+ if (rows !== 1 || result.rows?.length !== 1 || typeof fenced !== 'boolean') {
350
+ throw new Error('lookup replay fence: malformed PostgreSQL result');
351
+ }
352
+ return fenced;
353
+ }
354
+ finally {
355
+ client.release();
356
+ }
357
+ },
358
+ async reserve(key, replayKeys = []) {
359
+ assertText(key, 'operation key', 4096);
360
+ if (!Array.isArray(replayKeys)) {
361
+ throw new TypeError('AEB consumption replay keys must be an array');
362
+ }
363
+ for (const replayKey of replayKeys)
364
+ assertText(replayKey, 'native replay key', 4096);
365
+ // Stable lock acquisition order avoids crossed replay-key insert order
366
+ // becoming a preventable PostgreSQL deadlock under concurrency.
367
+ const uniqueReplayKeys = [...new Set(replayKeys)].sort();
368
+ const ownerToken = ownerTokenFactory();
369
+ assertOwnerToken(ownerToken);
370
+ try {
371
+ await transaction(pool, async (client) => {
372
+ const operationRows = exactRowCount(await client.query(AEB_CONSUMPTION_SQL.reserveOperation, [
373
+ tenantId, relyingPartyId, key, ownerToken,
374
+ ]), 'reserve operation');
375
+ if (operationRows === 0)
376
+ throw new ReservationConflict('CONSUMPTION_CONFLICT');
377
+ if (operationRows !== 1)
378
+ throw new Error('reserve operation: unexpected PostgreSQL row count');
379
+ const replayRows = exactRowCount(await client.query(AEB_CONSUMPTION_SQL.reserveReplayKeys, [
380
+ tenantId, relyingPartyId, key, uniqueReplayKeys,
381
+ ]), 'reserve native replay keys');
382
+ if (replayRows !== uniqueReplayKeys.length) {
383
+ throw new ReservationConflict('NATIVE_REPLAY_CONFLICT');
384
+ }
385
+ });
386
+ }
387
+ catch (error) {
388
+ if (error instanceof ReservationConflict)
389
+ return error.result;
390
+ throw error;
391
+ }
392
+ ownedReservations.set(key, ownerToken);
393
+ return 'RESERVED';
394
+ },
395
+ async claimReservation(key, authorization) {
396
+ assertText(key, 'operation key', 4096);
397
+ // Recovery is a restart boundary, not an in-place owner rotation. The
398
+ // base AEB store API fences ownership by store instance (commit/release
399
+ // take only the operation key), so replacing a token already owned by
400
+ // this instance would let its stale caller inherit the new token.
401
+ if (ownedReservations.has(key))
402
+ return false;
403
+ const claim = Object.freeze({
404
+ authorization,
405
+ tenantId,
406
+ relyingPartyId,
407
+ operationKey: key,
408
+ requiredState: 'RESERVED',
409
+ });
410
+ if (await authorizeRecoveryClaim(claim) !== true)
411
+ return false;
412
+ const ownerToken = ownerTokenFactory();
413
+ assertOwnerToken(ownerToken);
414
+ const changed = await transaction(recoveryPool, async (client) => {
415
+ const rows = exactRowCount(await client.query(AEB_CONSUMPTION_SQL.claimOperation, [
416
+ tenantId, relyingPartyId, key, ownerToken,
417
+ ]), 'claim operation');
418
+ if (rows > 1)
419
+ throw new Error('claim operation: unexpected PostgreSQL row count');
420
+ return rows === 1;
421
+ });
422
+ if (changed)
423
+ ownedReservations.set(key, ownerToken);
424
+ return changed;
425
+ },
426
+ async commit(key) {
427
+ assertText(key, 'operation key', 4096);
428
+ const ownerToken = ownedReservations.get(key);
429
+ if (ownerToken === undefined)
430
+ return false;
431
+ const changed = await transaction(pool, async (client) => {
432
+ const rows = exactRowCount(await client.query(AEB_CONSUMPTION_SQL.commitOperation, [
433
+ tenantId, relyingPartyId, key, ownerToken,
434
+ ]), 'commit operation');
435
+ if (rows > 1)
436
+ throw new Error('commit operation: unexpected PostgreSQL row count');
437
+ return rows === 1;
438
+ });
439
+ ownedReservations.delete(key);
440
+ return changed;
441
+ },
442
+ async release(key) {
443
+ assertText(key, 'operation key', 4096);
444
+ const ownerToken = ownedReservations.get(key);
445
+ if (ownerToken === undefined)
446
+ return false;
447
+ const changed = await transaction(pool, async (client) => {
448
+ const rows = exactRowCount(await client.query(AEB_CONSUMPTION_SQL.releaseOperation, [
449
+ tenantId, relyingPartyId, key, ownerToken,
450
+ ]), 'release operation');
451
+ if (rows > 1)
452
+ throw new Error('release operation: unexpected PostgreSQL row count');
453
+ return rows === 1;
454
+ });
455
+ ownedReservations.delete(key);
456
+ return changed;
457
+ },
458
+ };
459
+ return Object.freeze(store);
460
+ }
461
+ export default {
462
+ AEB_PG_CONSUMPTION_STORE_VERSION,
463
+ AEB_CONSUMPTION_OPERATION_TABLE,
464
+ AEB_CONSUMPTION_REPLAY_TABLE,
465
+ AEB_CONSUMPTION_EXECUTOR_ROLE,
466
+ AEB_CONSUMPTION_RECOVERY_ROLE,
467
+ AEB_CONSUMPTION_DDL,
468
+ AEB_CONSUMPTION_SQL,
469
+ createPostgresAebDurableConsumptionStore,
470
+ };
471
+ //# sourceMappingURL=aeb-consumption-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aeb-consumption-store.js","sourceRoot":"","sources":["../src/aeb-consumption-store.ts"],"names":[],"mappings":"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"}
@@ -212,6 +212,11 @@ export declare function splitCapabilitySecret(secret: any, threshold: any, { ran
212
212
  }): string[];
213
213
  /** Reconstruct a capability secret from at least m unique shares. */
214
214
  export declare function reconstructCapabilitySecret(shares: any, threshold: any): Buffer<ArrayBuffer>;
215
+ /**
216
+ * Production capability-store contract. Methods alone are insufficient: an
217
+ * adapter must explicitly assert durable custody and reconciliation support.
218
+ */
219
+ export declare function isSecureCapabilityStore(store: any): boolean;
215
220
  /**
216
221
  * An in-memory atomic reference store. It is intentionally marked non-durable
217
222
  * and is suitable only for tests; production callers must use an implementation
@@ -219,6 +224,7 @@ export declare function reconstructCapabilitySecret(shares: any, threshold: any)
219
224
  */
220
225
  export declare function createMemoryCapabilityStore(): {
221
226
  durable: boolean;
227
+ reconciliationCapable: boolean;
222
228
  registerCapability(capabilityReceipt: any): boolean;
223
229
  reserveSpend({ capabilityId, capabilityFingerprint, operationId, actionDigest, amount, currency, now }: ReserveSpendOptions): Promise<{
224
230
  ok: boolean;
@@ -286,6 +292,7 @@ export declare function createPostgresCapabilityStore({ transaction }?: {
286
292
  transaction?: (callback: (query: Function) => any) => any;
287
293
  }): {
288
294
  durable: boolean;
295
+ reconciliationCapable: boolean;
289
296
  registerCapability(capabilityReceipt: any): Promise<any>;
290
297
  reserveSpend({ capabilityId, capabilityFingerprint, operationId, actionDigest, amount, currency, now }: ReserveSpendOptions): Promise<any>;
291
298
  commitSpend({ capabilityId, operationId, reservationToken, outcome, now }?: CommitSpendOptions): Promise<any>;
@@ -592,6 +599,7 @@ declare const _default: {
592
599
  reconstructCapabilitySecret: typeof reconstructCapabilitySecret;
593
600
  createMemoryCapabilityStore: typeof createMemoryCapabilityStore;
594
601
  createPostgresCapabilityStore: typeof createPostgresCapabilityStore;
602
+ isSecureCapabilityStore: typeof isSecureCapabilityStore;
595
603
  executeWithCapability: typeof executeWithCapability;
596
604
  executeWithThreshold: typeof executeWithThreshold;
597
605
  reconcileCapabilityOperation: typeof reconcileCapabilityOperation;
@@ -1 +1 @@
1
- {"version":3,"file":"capability-receipt.d.ts","sourceRoot":"","sources":["../src/capability-receipt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capability-receipt.d.ts","sourceRoot":"","sources":["../src/capability-receipt.ts"],"names":[],"mappings":"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"}
@@ -537,6 +537,20 @@ function capabilityStateFromEnvelope(capabilityReceipt) {
537
537
  expires_at: Date.parse(c.expiry),
538
538
  };
539
539
  }
540
+ /**
541
+ * Production capability-store contract. Methods alone are insufficient: an
542
+ * adapter must explicitly assert durable custody and reconciliation support.
543
+ */
544
+ export function isSecureCapabilityStore(store) {
545
+ if (!store || typeof store !== 'object')
546
+ return false;
547
+ return store.durable === true
548
+ && store.reconciliationCapable === true
549
+ && typeof store.registerCapability === 'function'
550
+ && typeof store.reserveSpend === 'function'
551
+ && typeof store.commitSpend === 'function'
552
+ && typeof store.reconcileSpend === 'function';
553
+ }
540
554
  /**
541
555
  * An in-memory atomic reference store. It is intentionally marked non-durable
542
556
  * and is suitable only for tests; production callers must use an implementation
@@ -547,6 +561,7 @@ export function createMemoryCapabilityStore() {
547
561
  const operations = new Map();
548
562
  return {
549
563
  durable: false,
564
+ reconciliationCapable: true,
550
565
  registerCapability(capabilityReceipt) {
551
566
  const verified = verifyCapabilityReceipt(capabilityReceipt, { allowUntrustedIssuer: true });
552
567
  if (!verified.ok)
@@ -693,6 +708,7 @@ export function createPostgresCapabilityStore({ transaction } = {}) {
693
708
  throw new TypeError('createPostgresCapabilityStore requires a transaction(callback) function');
694
709
  return {
695
710
  durable: true,
711
+ reconciliationCapable: true,
696
712
  async registerCapability(capabilityReceipt) {
697
713
  const verified = verifyCapabilityReceipt(capabilityReceipt, { allowUntrustedIssuer: true });
698
714
  if (!verified.ok)
@@ -1169,6 +1185,7 @@ export default {
1169
1185
  reconstructCapabilitySecret,
1170
1186
  createMemoryCapabilityStore,
1171
1187
  createPostgresCapabilityStore,
1188
+ isSecureCapabilityStore,
1172
1189
  executeWithCapability,
1173
1190
  executeWithThreshold,
1174
1191
  reconcileCapabilityOperation,