open-agentpay 0.1.0 → 0.2.5
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/LICENSE +201 -0
- package/README.md +125 -4
- package/dist/client/client.d.ts +37 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +90 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/errors.d.ts +23 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +38 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/interfaces.d.ts +34 -0
- package/dist/client/interfaces.d.ts.map +1 -0
- package/dist/client/interfaces.js +5 -0
- package/dist/client/interfaces.js.map +1 -0
- package/dist/client/signer.d.ts +136 -0
- package/dist/client/signer.d.ts.map +1 -0
- package/dist/client/signer.js +300 -0
- package/dist/client/signer.js.map +1 -0
- package/dist/client/transport.d.ts +44 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +389 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/core/codecs.d.ts +35 -0
- package/dist/core/codecs.d.ts.map +1 -0
- package/dist/core/codecs.js +177 -0
- package/dist/core/codecs.js.map +1 -0
- package/dist/core/errors.d.ts +33 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +48 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/interop.d.ts +10 -0
- package/dist/core/interop.d.ts.map +1 -0
- package/dist/core/interop.js +28 -0
- package/dist/core/interop.js.map +1 -0
- package/dist/core/models.d.ts +155 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +463 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/state.d.ts +82 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +87 -0
- package/dist/core/state.js.map +1 -0
- package/dist/evm/constants.d.ts +52 -0
- package/dist/evm/constants.d.ts.map +1 -0
- package/dist/evm/constants.js +72 -0
- package/dist/evm/constants.js.map +1 -0
- package/dist/evm/eip3009.d.ts +43 -0
- package/dist/evm/eip3009.d.ts.map +1 -0
- package/dist/evm/eip3009.js +145 -0
- package/dist/evm/eip3009.js.map +1 -0
- package/dist/evm/index.d.ts +3 -0
- package/dist/evm/index.d.ts.map +1 -0
- package/dist/evm/index.js +3 -0
- package/dist/evm/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/langchain.d.ts +40 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +68 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/mcp.d.ts +29 -0
- package/dist/integrations/mcp.d.ts.map +1 -0
- package/dist/integrations/mcp.js +73 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/vercel-ai.d.ts +31 -0
- package/dist/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/integrations/vercel-ai.js +50 -0
- package/dist/integrations/vercel-ai.js.map +1 -0
- package/dist/policy/db.d.ts +14 -0
- package/dist/policy/db.d.ts.map +1 -0
- package/dist/policy/db.js +86 -0
- package/dist/policy/db.js.map +1 -0
- package/dist/policy/errors.d.ts +31 -0
- package/dist/policy/errors.d.ts.map +1 -0
- package/dist/policy/errors.js +48 -0
- package/dist/policy/errors.js.map +1 -0
- package/dist/policy/evaluator.d.ts +22 -0
- package/dist/policy/evaluator.d.ts.map +1 -0
- package/dist/policy/evaluator.js +152 -0
- package/dist/policy/evaluator.js.map +1 -0
- package/dist/policy/index.d.ts +7 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +7 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/interfaces.d.ts +59 -0
- package/dist/policy/interfaces.d.ts.map +1 -0
- package/dist/policy/interfaces.js +7 -0
- package/dist/policy/interfaces.js.map +1 -0
- package/dist/policy/models.d.ts +161 -0
- package/dist/policy/models.d.ts.map +1 -0
- package/dist/policy/models.js +449 -0
- package/dist/policy/models.js.map +1 -0
- package/dist/policy/sqlite-engine.d.ts +28 -0
- package/dist/policy/sqlite-engine.d.ts.map +1 -0
- package/dist/policy/sqlite-engine.js +501 -0
- package/dist/policy/sqlite-engine.js.map +1 -0
- package/dist/state/buyer-coordinator.d.ts +33 -0
- package/dist/state/buyer-coordinator.d.ts.map +1 -0
- package/dist/state/buyer-coordinator.js +363 -0
- package/dist/state/buyer-coordinator.js.map +1 -0
- package/dist/state/errors.d.ts +45 -0
- package/dist/state/errors.d.ts.map +1 -0
- package/dist/state/errors.js +88 -0
- package/dist/state/errors.js.map +1 -0
- package/dist/state/guards.d.ts +24 -0
- package/dist/state/guards.d.ts.map +1 -0
- package/dist/state/guards.js +211 -0
- package/dist/state/guards.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +5 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/reconciliation.d.ts +105 -0
- package/dist/state/reconciliation.d.ts.map +1 -0
- package/dist/state/reconciliation.js +297 -0
- package/dist/state/reconciliation.js.map +1 -0
- package/package.json +98 -12
- package/index.d.ts +0 -2
- package/index.js +0 -8
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed Policy Engine implementation.
|
|
3
|
+
*
|
|
4
|
+
* Enforces 24-hour true rolling budget, atomic slot reservation, lifetime limits,
|
|
5
|
+
* circuit breaker (RPM rate limiting, consecutive failures, half-open test probes),
|
|
6
|
+
* and strict two-phase commit/release protocol within BEGIN IMMEDIATE transactions.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { createBuyerConnection, initBuyerDatabase } from './db.js';
|
|
10
|
+
import { PolicyErrorCode, PolicyViolationError } from './errors.js';
|
|
11
|
+
import { evaluateMeteredRules, evaluateStaticRules } from './evaluator.js';
|
|
12
|
+
import { BreakerState, PaymentRequest, ReservationToken, validatePositiveBigInt, } from './models.js';
|
|
13
|
+
export class SQLitePolicyEngine {
|
|
14
|
+
#db;
|
|
15
|
+
#config;
|
|
16
|
+
#clock;
|
|
17
|
+
#consecutiveFailures = 0;
|
|
18
|
+
constructor(db, config, clock) {
|
|
19
|
+
this.#db = db;
|
|
20
|
+
this.#config = config;
|
|
21
|
+
this.#clock = clock ?? (() => Math.floor(Date.now() / 1000));
|
|
22
|
+
this.#syncPolicyRecord();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create an in-memory SQLitePolicyEngine with the buyer schema initialized.
|
|
26
|
+
*/
|
|
27
|
+
static createInMemory(config, clock) {
|
|
28
|
+
const db = createBuyerConnection(':memory:');
|
|
29
|
+
initBuyerDatabase(db);
|
|
30
|
+
return new SQLitePolicyEngine(db, config, clock);
|
|
31
|
+
}
|
|
32
|
+
#syncPolicyRecord() {
|
|
33
|
+
const now = this.#clock();
|
|
34
|
+
const cfg = this.#config;
|
|
35
|
+
const insertStmt = this.#db.prepare(`
|
|
36
|
+
INSERT INTO ap_policy (
|
|
37
|
+
id, name, wallet_address, max_per_tx_base_units,
|
|
38
|
+
rolling_budget_24h_base_units, lifetime_budget_base_units,
|
|
39
|
+
whitelist_mode,
|
|
40
|
+
whitelist_payees_json, whitelist_assets_json,
|
|
41
|
+
whitelist_networks_json, whitelist_domains_json,
|
|
42
|
+
circuit_max_rpm, circuit_consecutive_failures,
|
|
43
|
+
circuit_cooldown_seconds, consecutive_failures, breaker_state, tripped_at,
|
|
44
|
+
is_frozen, created_at, updated_at
|
|
45
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?)
|
|
46
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
47
|
+
name = excluded.name,
|
|
48
|
+
wallet_address = excluded.wallet_address,
|
|
49
|
+
max_per_tx_base_units = excluded.max_per_tx_base_units,
|
|
50
|
+
rolling_budget_24h_base_units = excluded.rolling_budget_24h_base_units,
|
|
51
|
+
lifetime_budget_base_units = excluded.lifetime_budget_base_units,
|
|
52
|
+
whitelist_mode = excluded.whitelist_mode,
|
|
53
|
+
whitelist_payees_json = excluded.whitelist_payees_json,
|
|
54
|
+
whitelist_assets_json = excluded.whitelist_assets_json,
|
|
55
|
+
whitelist_networks_json = excluded.whitelist_networks_json,
|
|
56
|
+
whitelist_domains_json = excluded.whitelist_domains_json,
|
|
57
|
+
circuit_max_rpm = excluded.circuit_max_rpm,
|
|
58
|
+
circuit_consecutive_failures = excluded.circuit_consecutive_failures,
|
|
59
|
+
circuit_cooldown_seconds = excluded.circuit_cooldown_seconds,
|
|
60
|
+
is_frozen = MAX(ap_policy.is_frozen, excluded.is_frozen),
|
|
61
|
+
updated_at = excluded.updated_at;
|
|
62
|
+
`);
|
|
63
|
+
insertStmt.run(cfg.id, cfg.name, cfg.walletAddress, cfg.maxPerTxBaseUnits, cfg.rollingBudget24hBaseUnits, cfg.lifetimeBudgetBaseUnits, cfg.whitelistMode, JSON.stringify(Array.from(cfg.whitelistPayees).sort()), JSON.stringify(Array.from(cfg.whitelistAssets).sort()), JSON.stringify(Array.from(cfg.whitelistNetworks).sort()), JSON.stringify(Array.from(cfg.whitelistDomains).sort()), cfg.circuitMaxRpm, cfg.circuitConsecutiveFailures, cfg.circuitCooldownSeconds, cfg.breakerState, cfg.trippedAt, cfg.isFrozen ? 1 : 0, cfg.createdAt || now, now);
|
|
64
|
+
const row = this.#db.prepare('SELECT consecutive_failures FROM ap_policy WHERE id = ?').get(cfg.id);
|
|
65
|
+
if (row?.consecutive_failures !== undefined) {
|
|
66
|
+
this.#consecutiveFailures = Number(row.consecutive_failures);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
#rollbackQuietly() {
|
|
70
|
+
try {
|
|
71
|
+
if (this.#db.inTransaction) {
|
|
72
|
+
this.#db.exec('ROLLBACK;');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Ignore rollback errors
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
#queryLifetimeSpent(nowSeconds) {
|
|
80
|
+
const row = this.#db
|
|
81
|
+
.prepare(`
|
|
82
|
+
SELECT COALESCE(SUM(amount_base_units), 0) AS val
|
|
83
|
+
FROM ap_budget_ledger
|
|
84
|
+
WHERE policy_id = ?
|
|
85
|
+
AND (
|
|
86
|
+
state = 'COMMITTED'
|
|
87
|
+
OR
|
|
88
|
+
(state = 'RESERVED' AND expires_at >= ?)
|
|
89
|
+
);
|
|
90
|
+
`)
|
|
91
|
+
.get(this.#config.id, nowSeconds);
|
|
92
|
+
return row?.val !== undefined ? BigInt(row.val) : 0n;
|
|
93
|
+
}
|
|
94
|
+
#queryRollingUsage(nowSeconds) {
|
|
95
|
+
const row = this.#db
|
|
96
|
+
.prepare(`
|
|
97
|
+
SELECT COALESCE(SUM(amount_base_units), 0) AS val
|
|
98
|
+
FROM ap_budget_ledger
|
|
99
|
+
WHERE policy_id = ?
|
|
100
|
+
AND (
|
|
101
|
+
(state = 'COMMITTED' AND created_at >= ? - 86400)
|
|
102
|
+
OR
|
|
103
|
+
(state = 'RESERVED' AND expires_at >= ?)
|
|
104
|
+
);
|
|
105
|
+
`)
|
|
106
|
+
.get(this.#config.id, nowSeconds, nowSeconds);
|
|
107
|
+
return row?.val !== undefined ? BigInt(row.val) : 0n;
|
|
108
|
+
}
|
|
109
|
+
#queryRequestsInLast60s(nowSeconds) {
|
|
110
|
+
const row = this.#db
|
|
111
|
+
.prepare(`
|
|
112
|
+
SELECT COUNT(*) AS count
|
|
113
|
+
FROM ap_budget_ledger
|
|
114
|
+
WHERE policy_id = ? AND created_at >= ? - 60;
|
|
115
|
+
`)
|
|
116
|
+
.get(this.#config.id, nowSeconds);
|
|
117
|
+
return row?.count !== undefined ? Number(row.count) : 0;
|
|
118
|
+
}
|
|
119
|
+
#queryActiveProbeCount(nowSeconds) {
|
|
120
|
+
const row = this.#db
|
|
121
|
+
.prepare(`
|
|
122
|
+
SELECT COUNT(*) AS count
|
|
123
|
+
FROM ap_budget_ledger
|
|
124
|
+
WHERE policy_id = ? AND state = 'RESERVED' AND expires_at >= ?;
|
|
125
|
+
`)
|
|
126
|
+
.get(this.#config.id, nowSeconds);
|
|
127
|
+
return row?.count !== undefined ? Number(row.count) : 0;
|
|
128
|
+
}
|
|
129
|
+
#gate(now) {
|
|
130
|
+
const row = this.#db
|
|
131
|
+
.prepare('SELECT is_frozen, breaker_state, tripped_at FROM ap_policy WHERE id = ?;')
|
|
132
|
+
.get(this.#config.id);
|
|
133
|
+
const isFrozen = row ? Number(row.is_frozen) === 1 : this.#config.isFrozen;
|
|
134
|
+
if (isFrozen) {
|
|
135
|
+
return PolicyErrorCode.POLICY_FROZEN;
|
|
136
|
+
}
|
|
137
|
+
let state = row?.breaker_state || BreakerState.CLOSED;
|
|
138
|
+
const trippedAt = row?.tripped_at != null ? Number(row.tripped_at) : null;
|
|
139
|
+
if (state === BreakerState.OPEN &&
|
|
140
|
+
trippedAt !== null &&
|
|
141
|
+
now >= trippedAt + this.#config.circuitCooldownSeconds) {
|
|
142
|
+
state = BreakerState.HALF_OPEN;
|
|
143
|
+
this.#db
|
|
144
|
+
.prepare("UPDATE ap_policy SET breaker_state = 'HALF_OPEN', updated_at = ? WHERE id = ?;")
|
|
145
|
+
.run(now, this.#config.id);
|
|
146
|
+
}
|
|
147
|
+
if (state === BreakerState.OPEN) {
|
|
148
|
+
return PolicyErrorCode.CIRCUIT_BREAKER_OPEN;
|
|
149
|
+
}
|
|
150
|
+
if (state === BreakerState.HALF_OPEN && this.#queryActiveProbeCount(now) >= 1) {
|
|
151
|
+
return PolicyErrorCode.CIRCUIT_BREAKER_OPEN;
|
|
152
|
+
}
|
|
153
|
+
if (this.#queryRequestsInLast60s(now) >= this.#config.circuitMaxRpm) {
|
|
154
|
+
this.#db
|
|
155
|
+
.prepare("UPDATE ap_policy SET breaker_state = 'OPEN', tripped_at = ?, updated_at = ? WHERE id = ?;")
|
|
156
|
+
.run(now, now, this.#config.id);
|
|
157
|
+
return PolicyErrorCode.CIRCUIT_BREAKER_OPEN;
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
getAvailableRollingBudget() {
|
|
162
|
+
const now = this.#clock();
|
|
163
|
+
const usage = this.#queryRollingUsage(now);
|
|
164
|
+
const diff = this.#config.rollingBudget24hBaseUnits - usage;
|
|
165
|
+
return diff > 0n ? diff : 0n;
|
|
166
|
+
}
|
|
167
|
+
getBreakerState() {
|
|
168
|
+
const now = this.#clock();
|
|
169
|
+
const row = this.#db
|
|
170
|
+
.prepare('SELECT breaker_state, tripped_at FROM ap_policy WHERE id = ?;')
|
|
171
|
+
.get(this.#config.id);
|
|
172
|
+
if (!row) {
|
|
173
|
+
return BreakerState.CLOSED;
|
|
174
|
+
}
|
|
175
|
+
const current = row.breaker_state || BreakerState.CLOSED;
|
|
176
|
+
const trippedAt = row.tripped_at != null ? Number(row.tripped_at) : null;
|
|
177
|
+
if (current === BreakerState.OPEN &&
|
|
178
|
+
trippedAt !== null &&
|
|
179
|
+
now >= trippedAt + this.#config.circuitCooldownSeconds) {
|
|
180
|
+
this.#db
|
|
181
|
+
.prepare("UPDATE ap_policy SET breaker_state = 'HALF_OPEN', updated_at = ? WHERE id = ?;")
|
|
182
|
+
.run(now, this.#config.id);
|
|
183
|
+
return BreakerState.HALF_OPEN;
|
|
184
|
+
}
|
|
185
|
+
return current;
|
|
186
|
+
}
|
|
187
|
+
recordFailure(reason = '') {
|
|
188
|
+
const now = this.#clock();
|
|
189
|
+
const current = this.getBreakerState();
|
|
190
|
+
const row = this.#db
|
|
191
|
+
.prepare('SELECT consecutive_failures, circuit_consecutive_failures FROM ap_policy WHERE id = ?;')
|
|
192
|
+
.get(this.#config.id);
|
|
193
|
+
const currFails = row?.consecutive_failures != null ? Number(row.consecutive_failures) : this.#consecutiveFailures;
|
|
194
|
+
const threshold = row?.circuit_consecutive_failures != null
|
|
195
|
+
? Number(row.circuit_consecutive_failures)
|
|
196
|
+
: this.#config.circuitConsecutiveFailures;
|
|
197
|
+
const newFails = currFails + 1;
|
|
198
|
+
this.#consecutiveFailures = newFails;
|
|
199
|
+
const shouldTrip = current === BreakerState.HALF_OPEN || newFails >= threshold;
|
|
200
|
+
if (shouldTrip) {
|
|
201
|
+
this.#db
|
|
202
|
+
.prepare("UPDATE ap_policy SET consecutive_failures = ?, breaker_state = 'OPEN', tripped_at = ?, updated_at = ? WHERE id = ?;")
|
|
203
|
+
.run(newFails, now, now, this.#config.id);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
this.#db
|
|
207
|
+
.prepare('UPDATE ap_policy SET consecutive_failures = ?, updated_at = ? WHERE id = ?;')
|
|
208
|
+
.run(newFails, now, this.#config.id);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
resetBreaker() {
|
|
212
|
+
const now = this.#clock();
|
|
213
|
+
this.#consecutiveFailures = 0;
|
|
214
|
+
this.#db
|
|
215
|
+
.prepare("UPDATE ap_policy SET breaker_state = 'CLOSED', consecutive_failures = 0, tripped_at = NULL, updated_at = ? WHERE id = ?;")
|
|
216
|
+
.run(now, this.#config.id);
|
|
217
|
+
}
|
|
218
|
+
reserve(params) {
|
|
219
|
+
const now = this.#clock();
|
|
220
|
+
try {
|
|
221
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
222
|
+
// 1. Gate check (POLICY_FROZEN -> CIRCUIT_BREAKER_OPEN)
|
|
223
|
+
const gateErr = this.#gate(now);
|
|
224
|
+
if (gateErr) {
|
|
225
|
+
this.#db.exec('COMMIT;');
|
|
226
|
+
return { approved: false, errorCode: gateErr };
|
|
227
|
+
}
|
|
228
|
+
// 2. Amount format validation
|
|
229
|
+
let amountBig;
|
|
230
|
+
try {
|
|
231
|
+
amountBig = validatePositiveBigInt(params.amount, 'amount');
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
this.#db.exec('COMMIT;');
|
|
235
|
+
return { approved: false, errorCode: PolicyErrorCode.INVALID_AMOUNT_FORMAT };
|
|
236
|
+
}
|
|
237
|
+
// 3. Request parameters validation
|
|
238
|
+
let req;
|
|
239
|
+
try {
|
|
240
|
+
req = new PaymentRequest({
|
|
241
|
+
intentId: params.intentId,
|
|
242
|
+
amount: amountBig,
|
|
243
|
+
payee: params.payee,
|
|
244
|
+
asset: params.asset,
|
|
245
|
+
network: params.network,
|
|
246
|
+
domain: params.domain,
|
|
247
|
+
ttlSeconds: params.ttlSeconds,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
this.#db.exec('COMMIT;');
|
|
252
|
+
return { approved: false, errorCode: PolicyErrorCode.INVALID_REQUEST };
|
|
253
|
+
}
|
|
254
|
+
// 4-6. Static rules (Whitelist -> Single Cap -> Lifetime)
|
|
255
|
+
const lifetimeSpent = this.#queryLifetimeSpent(now);
|
|
256
|
+
const staticRes = evaluateStaticRules(this.#config, req, lifetimeSpent);
|
|
257
|
+
if (!staticRes.passed) {
|
|
258
|
+
this.#db.exec('COMMIT;');
|
|
259
|
+
return { approved: false, errorCode: staticRes.errorCode };
|
|
260
|
+
}
|
|
261
|
+
// 7. 24h Rolling Budget
|
|
262
|
+
const rollingUsage = this.#queryRollingUsage(now);
|
|
263
|
+
const available = this.#config.rollingBudget24hBaseUnits - rollingUsage;
|
|
264
|
+
if (available < req.amount) {
|
|
265
|
+
this.#db.exec('COMMIT;');
|
|
266
|
+
return { approved: false, errorCode: PolicyErrorCode.DAILY_BUDGET_EXCEEDED };
|
|
267
|
+
}
|
|
268
|
+
// 8. Insert reservation slot
|
|
269
|
+
const reservationId = `res_${randomUUID().replace(/-/g, '')}`;
|
|
270
|
+
const expiresAt = now + req.ttlSeconds;
|
|
271
|
+
this.#db
|
|
272
|
+
.prepare(`
|
|
273
|
+
INSERT INTO ap_budget_ledger (
|
|
274
|
+
id, policy_id, wallet_address, intent_id,
|
|
275
|
+
amount_base_units, state, created_at, expires_at, updated_at
|
|
276
|
+
) VALUES (?, ?, ?, ?, ?, 'RESERVED', ?, ?, ?);
|
|
277
|
+
`)
|
|
278
|
+
.run(reservationId, this.#config.id, this.#config.walletAddress, req.intentId, req.amount, now, expiresAt, now);
|
|
279
|
+
this.#db.exec('COMMIT;');
|
|
280
|
+
const token = new ReservationToken({
|
|
281
|
+
reservationId,
|
|
282
|
+
intentId: req.intentId,
|
|
283
|
+
policyId: this.#config.id,
|
|
284
|
+
amount: req.amount,
|
|
285
|
+
expiresAt,
|
|
286
|
+
createdAt: now,
|
|
287
|
+
});
|
|
288
|
+
return {
|
|
289
|
+
approved: true,
|
|
290
|
+
reservation: token,
|
|
291
|
+
availableAfter: available - req.amount,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
catch (exc) {
|
|
295
|
+
this.#rollbackQuietly();
|
|
296
|
+
if (exc?.code === 'SQLITE_CONSTRAINT' || String(exc?.message).includes('UNIQUE')) {
|
|
297
|
+
return { approved: false, errorCode: PolicyErrorCode.DUPLICATE_INTENT };
|
|
298
|
+
}
|
|
299
|
+
return { approved: false, errorCode: PolicyErrorCode.POLICY_SYSTEM_ERROR };
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
commit(intentId) {
|
|
303
|
+
const now = this.#clock();
|
|
304
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
305
|
+
try {
|
|
306
|
+
const row = this.#db
|
|
307
|
+
.prepare('SELECT state, expires_at FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
308
|
+
.get(intentId);
|
|
309
|
+
if (!row) {
|
|
310
|
+
this.#db.exec('ROLLBACK;');
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const state = row.state;
|
|
314
|
+
const expiresAt = row.expires_at != null ? Number(row.expires_at) : 0;
|
|
315
|
+
if (state === 'COMMITTED') {
|
|
316
|
+
this.#db.exec('ROLLBACK;');
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (now > expiresAt) {
|
|
320
|
+
this.#db.exec('ROLLBACK;');
|
|
321
|
+
throw new PolicyViolationError(PolicyErrorCode.RESERVATION_EXPIRED, `Reservation for intent ${intentId} expired at ${expiresAt} (current: ${now})`);
|
|
322
|
+
}
|
|
323
|
+
this.#db
|
|
324
|
+
.prepare(`
|
|
325
|
+
UPDATE ap_budget_ledger
|
|
326
|
+
SET state = 'COMMITTED', updated_at = ?
|
|
327
|
+
WHERE intent_id = ? AND state = 'RESERVED';
|
|
328
|
+
`)
|
|
329
|
+
.run(now, intentId);
|
|
330
|
+
this.#consecutiveFailures = 0;
|
|
331
|
+
this.#db
|
|
332
|
+
.prepare(`
|
|
333
|
+
UPDATE ap_policy
|
|
334
|
+
SET consecutive_failures = 0,
|
|
335
|
+
breaker_state = CASE WHEN breaker_state = 'HALF_OPEN' THEN 'CLOSED' ELSE breaker_state END,
|
|
336
|
+
tripped_at = CASE WHEN breaker_state = 'HALF_OPEN' THEN NULL ELSE tripped_at END,
|
|
337
|
+
updated_at = ?
|
|
338
|
+
WHERE id = ?;
|
|
339
|
+
`)
|
|
340
|
+
.run(now, this.#config.id);
|
|
341
|
+
this.#db.exec('COMMIT;');
|
|
342
|
+
}
|
|
343
|
+
catch (exc) {
|
|
344
|
+
this.#rollbackQuietly();
|
|
345
|
+
throw exc;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
release(intentId, reason) {
|
|
349
|
+
const now = this.#clock();
|
|
350
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
351
|
+
try {
|
|
352
|
+
const row = this.#db
|
|
353
|
+
.prepare('SELECT state FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
354
|
+
.get(intentId);
|
|
355
|
+
if (!row) {
|
|
356
|
+
this.#db.exec('ROLLBACK;');
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (row.state === 'COMMITTED') {
|
|
360
|
+
this.#db.exec('ROLLBACK;');
|
|
361
|
+
throw new PolicyViolationError(PolicyErrorCode.RESERVATION_ALREADY_FINALIZED, `Cannot release intent ${intentId}: already COMMITTED`);
|
|
362
|
+
}
|
|
363
|
+
if (row.state === 'RELEASED') {
|
|
364
|
+
this.#db.exec('ROLLBACK;');
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
this.#db
|
|
368
|
+
.prepare(`
|
|
369
|
+
UPDATE ap_budget_ledger
|
|
370
|
+
SET state = 'RELEASED', updated_at = ?
|
|
371
|
+
WHERE intent_id = ? AND state = 'RESERVED';
|
|
372
|
+
`)
|
|
373
|
+
.run(now, intentId);
|
|
374
|
+
this.#db.exec('COMMIT;');
|
|
375
|
+
}
|
|
376
|
+
catch (exc) {
|
|
377
|
+
this.#rollbackQuietly();
|
|
378
|
+
throw exc;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
reserveMetered(intentId, estimatedAmount, domain, ttlSeconds = 60) {
|
|
382
|
+
const now = this.#clock();
|
|
383
|
+
try {
|
|
384
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
385
|
+
let err = this.#gate(now);
|
|
386
|
+
let amountBig = 0n;
|
|
387
|
+
if (!err) {
|
|
388
|
+
try {
|
|
389
|
+
amountBig = validatePositiveBigInt(estimatedAmount, 'estimatedAmount');
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
err = PolicyErrorCode.INVALID_AMOUNT_FORMAT;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
if (!err) {
|
|
396
|
+
if (!intentId ||
|
|
397
|
+
typeof intentId !== 'string' ||
|
|
398
|
+
!intentId.trim() ||
|
|
399
|
+
typeof ttlSeconds !== 'number' ||
|
|
400
|
+
!Number.isInteger(ttlSeconds) ||
|
|
401
|
+
ttlSeconds <= 0 ||
|
|
402
|
+
ttlSeconds > 86400 ||
|
|
403
|
+
(domain !== undefined && domain !== null && typeof domain !== 'string')) {
|
|
404
|
+
err = PolicyErrorCode.INVALID_REQUEST;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (!err) {
|
|
408
|
+
const lifetimeSpent = this.#queryLifetimeSpent(now);
|
|
409
|
+
const res = evaluateMeteredRules(this.#config, amountBig, domain, lifetimeSpent);
|
|
410
|
+
if (!res.passed) {
|
|
411
|
+
err = res.errorCode ?? PolicyErrorCode.POLICY_SYSTEM_ERROR;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
let available = 0n;
|
|
415
|
+
if (!err) {
|
|
416
|
+
const rollingUsage = this.#queryRollingUsage(now);
|
|
417
|
+
available = this.#config.rollingBudget24hBaseUnits - rollingUsage;
|
|
418
|
+
if (available < amountBig) {
|
|
419
|
+
err = PolicyErrorCode.DAILY_BUDGET_EXCEEDED;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (err) {
|
|
423
|
+
this.#db.exec('COMMIT;');
|
|
424
|
+
return { approved: false, errorCode: err };
|
|
425
|
+
}
|
|
426
|
+
const reservationId = `res_${randomUUID().replace(/-/g, '')}`;
|
|
427
|
+
const expiresAt = now + ttlSeconds;
|
|
428
|
+
this.#db
|
|
429
|
+
.prepare(`
|
|
430
|
+
INSERT INTO ap_budget_ledger (
|
|
431
|
+
id, policy_id, wallet_address, intent_id,
|
|
432
|
+
amount_base_units, state, created_at, expires_at, updated_at
|
|
433
|
+
) VALUES (?, ?, ?, ?, ?, 'RESERVED', ?, ?, ?);
|
|
434
|
+
`)
|
|
435
|
+
.run(reservationId, this.#config.id, this.#config.walletAddress, intentId, amountBig, now, expiresAt, now);
|
|
436
|
+
this.#db.exec('COMMIT;');
|
|
437
|
+
return {
|
|
438
|
+
approved: true,
|
|
439
|
+
reservation: new ReservationToken({
|
|
440
|
+
reservationId,
|
|
441
|
+
intentId,
|
|
442
|
+
policyId: this.#config.id,
|
|
443
|
+
amount: amountBig,
|
|
444
|
+
expiresAt,
|
|
445
|
+
createdAt: now,
|
|
446
|
+
}),
|
|
447
|
+
availableAfter: available - amountBig,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
catch (exc) {
|
|
451
|
+
this.#rollbackQuietly();
|
|
452
|
+
if (exc?.code === 'SQLITE_CONSTRAINT' || String(exc?.message).includes('UNIQUE')) {
|
|
453
|
+
return { approved: false, errorCode: PolicyErrorCode.DUPLICATE_INTENT };
|
|
454
|
+
}
|
|
455
|
+
return { approved: false, errorCode: PolicyErrorCode.POLICY_SYSTEM_ERROR };
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
settleMetered(intentId, actualAmount) {
|
|
459
|
+
let normActual = null;
|
|
460
|
+
if (actualAmount !== undefined && actualAmount !== null) {
|
|
461
|
+
try {
|
|
462
|
+
normActual = validatePositiveBigInt(actualAmount, 'actualAmount');
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
normActual = null;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
const now = this.#clock();
|
|
469
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
470
|
+
try {
|
|
471
|
+
const info = this.#db
|
|
472
|
+
.prepare(`
|
|
473
|
+
UPDATE ap_budget_ledger
|
|
474
|
+
SET state = 'COMMITTED',
|
|
475
|
+
amount_base_units = COALESCE(?, amount_base_units),
|
|
476
|
+
updated_at = ?
|
|
477
|
+
WHERE intent_id = ? AND state = 'RESERVED';
|
|
478
|
+
`)
|
|
479
|
+
.run(normActual, now, intentId);
|
|
480
|
+
if (info.changes > 0) {
|
|
481
|
+
this.#consecutiveFailures = 0;
|
|
482
|
+
this.#db
|
|
483
|
+
.prepare(`
|
|
484
|
+
UPDATE ap_policy
|
|
485
|
+
SET consecutive_failures = 0,
|
|
486
|
+
breaker_state = CASE WHEN breaker_state = 'HALF_OPEN' THEN 'CLOSED' ELSE breaker_state END,
|
|
487
|
+
tripped_at = CASE WHEN breaker_state = 'HALF_OPEN' THEN NULL ELSE tripped_at END,
|
|
488
|
+
updated_at = ?
|
|
489
|
+
WHERE id = ?;
|
|
490
|
+
`)
|
|
491
|
+
.run(now, this.#config.id);
|
|
492
|
+
}
|
|
493
|
+
this.#db.exec('COMMIT;');
|
|
494
|
+
}
|
|
495
|
+
catch (exc) {
|
|
496
|
+
this.#rollbackQuietly();
|
|
497
|
+
throw exc;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=sqlite-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-engine.js","sourceRoot":"","sources":["../../src/policy/sqlite-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buyer State Coordinator for AgentPay.
|
|
3
|
+
*
|
|
4
|
+
* Coordinates SQLite atomic transactions between:
|
|
5
|
+
* - Buyer Payment Intent (ap_buyer_intent)
|
|
6
|
+
* - Budget Reservation Ledger (ap_budget_ledger)
|
|
7
|
+
*
|
|
8
|
+
* Enforces:
|
|
9
|
+
* - Atomic two-phase reservation & commitment
|
|
10
|
+
* - CLAUDE.md Invariant: No release once signature is dispatched
|
|
11
|
+
* - Deterministic time injection via clock parameter
|
|
12
|
+
*/
|
|
13
|
+
import type { Database as DatabaseInstance } from 'better-sqlite3';
|
|
14
|
+
import { BudgetLedgerState, BuyerIntentRecord, PaymentIntentState } from '../core/state.js';
|
|
15
|
+
import type { Clock } from '../policy/interfaces.js';
|
|
16
|
+
export declare class BuyerStateCoordinator {
|
|
17
|
+
#private;
|
|
18
|
+
constructor(db: DatabaseInstance, options?: {
|
|
19
|
+
clock?: Clock;
|
|
20
|
+
});
|
|
21
|
+
getTime(): number;
|
|
22
|
+
createIntent(record: BuyerIntentRecord): void;
|
|
23
|
+
reserveIntent(intentId: string, policyId: string, walletAddress: string, amountBaseUnits: bigint | number, ttlSeconds?: number): string;
|
|
24
|
+
recordDispatch(intentId: string, rawSignature?: string, nonce?: string | null): void;
|
|
25
|
+
completeIntent(intentId: string): void;
|
|
26
|
+
holdIntent(intentId: string, errorMessage?: string | null): void;
|
|
27
|
+
cancelIntent(intentId: string, reason?: string): void;
|
|
28
|
+
reconcileRelease(intentId: string, reason?: string): void;
|
|
29
|
+
getIntent(intentId: string): BuyerIntentRecord | null;
|
|
30
|
+
getLedgerState(intentId: string): BudgetLedgerState | null;
|
|
31
|
+
listIntents(states?: PaymentIntentState[]): BuyerIntentRecord[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=buyer-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buyer-coordinator.d.ts","sourceRoot":"","sources":["../../src/state/buyer-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAUrD,qBAAa,qBAAqB;;gBAIpB,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;IAK7D,OAAO,IAAI,MAAM;IAcjB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IA6B7C,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,UAAU,SAAM,GACf,MAAM;IAoDT,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAkB,EAC9B,KAAK,GAAE,MAAM,GAAG,IAAW,GAC1B,IAAI;IAgDP,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmDtC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IA6ChE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,IAAI;IAyDjD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,IAAI;IAuCrD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAkDrD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAQ1D,WAAW,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE;CA+ChE"}
|