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,363 @@
|
|
|
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 { randomUUID } from 'node:crypto';
|
|
14
|
+
import { BudgetLedgerState, BuyerIntentRecord, PaymentIntentState, } from '../core/state.js';
|
|
15
|
+
import { IllegalStateTransitionError, SignatureSentReleaseForbiddenError, } from './errors.js';
|
|
16
|
+
import { validateIntentTransition, validateLedgerTransition, } from './guards.js';
|
|
17
|
+
export class BuyerStateCoordinator {
|
|
18
|
+
#db;
|
|
19
|
+
#clock;
|
|
20
|
+
constructor(db, options) {
|
|
21
|
+
this.#db = db;
|
|
22
|
+
this.#clock = options?.clock ?? (() => Math.floor(Date.now() / 1000));
|
|
23
|
+
}
|
|
24
|
+
getTime() {
|
|
25
|
+
return this.#clock();
|
|
26
|
+
}
|
|
27
|
+
#rollbackQuietly() {
|
|
28
|
+
try {
|
|
29
|
+
if (this.#db.inTransaction) {
|
|
30
|
+
this.#db.exec('ROLLBACK;');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Ignore rollback errors
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
createIntent(record) {
|
|
38
|
+
const now = this.getTime();
|
|
39
|
+
this.#db
|
|
40
|
+
.prepare(`
|
|
41
|
+
INSERT INTO ap_buyer_intent (
|
|
42
|
+
intent_id, policy_id, idempotency_key, payer_address, payee_address,
|
|
43
|
+
asset_address, network_id, amount_base_units, status, nonce,
|
|
44
|
+
valid_after, valid_before, raw_signature, created_at, updated_at
|
|
45
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
|
|
46
|
+
`)
|
|
47
|
+
.run(record.intentId, record.policyId, record.idempotencyKey, record.payerAddress.toLowerCase(), record.payeeAddress.toLowerCase(), record.assetAddress.toLowerCase(), record.networkId, record.amountBaseUnits, record.status, record.nonce, record.validAfter, record.validBefore, record.rawSignature, record.createdAt || now, record.updatedAt || now);
|
|
48
|
+
}
|
|
49
|
+
reserveIntent(intentId, policyId, walletAddress, amountBaseUnits, ttlSeconds = 360) {
|
|
50
|
+
const now = this.getTime();
|
|
51
|
+
const expiresAt = now + ttlSeconds;
|
|
52
|
+
const reservationId = `res_${randomUUID().replace(/-/g, '')}`;
|
|
53
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
54
|
+
try {
|
|
55
|
+
const row = this.#db
|
|
56
|
+
.prepare('SELECT status FROM ap_buyer_intent WHERE intent_id = ?;')
|
|
57
|
+
.get(intentId);
|
|
58
|
+
if (!row || !row.status) {
|
|
59
|
+
this.#db.exec('ROLLBACK;');
|
|
60
|
+
throw new Error(`Buyer intent '${intentId}' not found.`);
|
|
61
|
+
}
|
|
62
|
+
const currentStatus = row.status;
|
|
63
|
+
validateIntentTransition(currentStatus, PaymentIntentState.PROCESSING, { intentId });
|
|
64
|
+
this.#db
|
|
65
|
+
.prepare(`
|
|
66
|
+
INSERT INTO ap_budget_ledger (
|
|
67
|
+
id, policy_id, wallet_address, intent_id, amount_base_units, state, created_at, expires_at, updated_at
|
|
68
|
+
) VALUES (?, ?, ?, ?, ?, 'RESERVED', ?, ?, ?);
|
|
69
|
+
`)
|
|
70
|
+
.run(reservationId, policyId, walletAddress.toLowerCase(), intentId, typeof amountBaseUnits === 'bigint' ? amountBaseUnits : BigInt(amountBaseUnits), now, expiresAt, now);
|
|
71
|
+
this.#db
|
|
72
|
+
.prepare(`
|
|
73
|
+
UPDATE ap_buyer_intent
|
|
74
|
+
SET status = 'PROCESSING', updated_at = ?
|
|
75
|
+
WHERE intent_id = ?;
|
|
76
|
+
`)
|
|
77
|
+
.run(now, intentId);
|
|
78
|
+
this.#db.exec('COMMIT;');
|
|
79
|
+
return reservationId;
|
|
80
|
+
}
|
|
81
|
+
catch (exc) {
|
|
82
|
+
this.#rollbackQuietly();
|
|
83
|
+
throw exc;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
recordDispatch(intentId, rawSignature = '0xdefault_sig', nonce = null) {
|
|
87
|
+
const now = this.getTime();
|
|
88
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
89
|
+
try {
|
|
90
|
+
const row = this.#db
|
|
91
|
+
.prepare('SELECT status FROM ap_buyer_intent WHERE intent_id = ?;')
|
|
92
|
+
.get(intentId);
|
|
93
|
+
if (!row || !row.status) {
|
|
94
|
+
this.#db.exec('ROLLBACK;');
|
|
95
|
+
throw new Error(`Buyer intent '${intentId}' not found.`);
|
|
96
|
+
}
|
|
97
|
+
const currentStatus = row.status;
|
|
98
|
+
validateIntentTransition(currentStatus, PaymentIntentState.SIGNATURE_SENT, { intentId });
|
|
99
|
+
const ledgerRow = this.#db
|
|
100
|
+
.prepare('SELECT state FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
101
|
+
.get(intentId);
|
|
102
|
+
if (!ledgerRow || ledgerRow.state !== BudgetLedgerState.RESERVED) {
|
|
103
|
+
this.#db.exec('ROLLBACK;');
|
|
104
|
+
throw new IllegalStateTransitionError('BudgetLedger', ledgerRow?.state ?? 'NONE', BudgetLedgerState.RESERVED, 'Cannot dispatch request without an active RESERVED quota.');
|
|
105
|
+
}
|
|
106
|
+
this.#db
|
|
107
|
+
.prepare(`
|
|
108
|
+
UPDATE ap_buyer_intent
|
|
109
|
+
SET status = 'SIGNATURE_SENT',
|
|
110
|
+
raw_signature = COALESCE(?, raw_signature),
|
|
111
|
+
nonce = COALESCE(?, nonce),
|
|
112
|
+
updated_at = ?
|
|
113
|
+
WHERE intent_id = ?;
|
|
114
|
+
`)
|
|
115
|
+
.run(rawSignature, nonce, now, intentId);
|
|
116
|
+
this.#db.exec('COMMIT;');
|
|
117
|
+
}
|
|
118
|
+
catch (exc) {
|
|
119
|
+
this.#rollbackQuietly();
|
|
120
|
+
throw exc;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
completeIntent(intentId) {
|
|
124
|
+
const now = this.getTime();
|
|
125
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
126
|
+
try {
|
|
127
|
+
const row = this.#db
|
|
128
|
+
.prepare('SELECT status FROM ap_buyer_intent WHERE intent_id = ?;')
|
|
129
|
+
.get(intentId);
|
|
130
|
+
if (!row || !row.status) {
|
|
131
|
+
this.#db.exec('ROLLBACK;');
|
|
132
|
+
throw new Error(`Buyer intent '${intentId}' not found.`);
|
|
133
|
+
}
|
|
134
|
+
const currentStatus = row.status;
|
|
135
|
+
validateIntentTransition(currentStatus, PaymentIntentState.SUCCEEDED, { intentId });
|
|
136
|
+
const ledgerRow = this.#db
|
|
137
|
+
.prepare('SELECT state FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
138
|
+
.get(intentId);
|
|
139
|
+
if (!ledgerRow || !ledgerRow.state) {
|
|
140
|
+
this.#db.exec('ROLLBACK;');
|
|
141
|
+
throw new Error(`Ledger entry for intent '${intentId}' not found.`);
|
|
142
|
+
}
|
|
143
|
+
const currentLedger = ledgerRow.state;
|
|
144
|
+
validateLedgerTransition(currentLedger, BudgetLedgerState.COMMITTED);
|
|
145
|
+
this.#db
|
|
146
|
+
.prepare(`
|
|
147
|
+
UPDATE ap_budget_ledger
|
|
148
|
+
SET state = 'COMMITTED', updated_at = ?
|
|
149
|
+
WHERE intent_id = ?;
|
|
150
|
+
`)
|
|
151
|
+
.run(now, intentId);
|
|
152
|
+
this.#db
|
|
153
|
+
.prepare(`
|
|
154
|
+
UPDATE ap_buyer_intent
|
|
155
|
+
SET status = 'SUCCEEDED', updated_at = ?
|
|
156
|
+
WHERE intent_id = ?;
|
|
157
|
+
`)
|
|
158
|
+
.run(now, intentId);
|
|
159
|
+
this.#db.exec('COMMIT;');
|
|
160
|
+
}
|
|
161
|
+
catch (exc) {
|
|
162
|
+
this.#rollbackQuietly();
|
|
163
|
+
throw exc;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
holdIntent(intentId, errorMessage) {
|
|
167
|
+
const now = this.getTime();
|
|
168
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
169
|
+
try {
|
|
170
|
+
const row = this.#db
|
|
171
|
+
.prepare('SELECT status FROM ap_buyer_intent WHERE intent_id = ?;')
|
|
172
|
+
.get(intentId);
|
|
173
|
+
if (!row || !row.status) {
|
|
174
|
+
this.#db.exec('ROLLBACK;');
|
|
175
|
+
throw new Error(`Buyer intent '${intentId}' not found.`);
|
|
176
|
+
}
|
|
177
|
+
const currentStatus = row.status;
|
|
178
|
+
validateIntentTransition(currentStatus, PaymentIntentState.RECOVERY_HOLD, { intentId });
|
|
179
|
+
const ledgerRow = this.#db
|
|
180
|
+
.prepare('SELECT state FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
181
|
+
.get(intentId);
|
|
182
|
+
if (ledgerRow && ledgerRow.state !== BudgetLedgerState.RESERVED) {
|
|
183
|
+
this.#db.exec('ROLLBACK;');
|
|
184
|
+
throw new IllegalStateTransitionError('BudgetLedger', ledgerRow.state ?? 'NONE', BudgetLedgerState.RESERVED, 'Ledger must remain RESERVED when intent enters RECOVERY_HOLD.');
|
|
185
|
+
}
|
|
186
|
+
this.#db
|
|
187
|
+
.prepare(`
|
|
188
|
+
UPDATE ap_buyer_intent
|
|
189
|
+
SET status = 'RECOVERY_HOLD', updated_at = ?
|
|
190
|
+
WHERE intent_id = ?;
|
|
191
|
+
`)
|
|
192
|
+
.run(now, intentId);
|
|
193
|
+
this.#db.exec('COMMIT;');
|
|
194
|
+
}
|
|
195
|
+
catch (exc) {
|
|
196
|
+
this.#rollbackQuietly();
|
|
197
|
+
throw exc;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
cancelIntent(intentId, reason = '') {
|
|
201
|
+
const now = this.getTime();
|
|
202
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
203
|
+
try {
|
|
204
|
+
const row = this.#db
|
|
205
|
+
.prepare('SELECT status FROM ap_buyer_intent WHERE intent_id = ?;')
|
|
206
|
+
.get(intentId);
|
|
207
|
+
if (!row || !row.status) {
|
|
208
|
+
this.#db.exec('ROLLBACK;');
|
|
209
|
+
throw new Error(`Buyer intent '${intentId}' not found.`);
|
|
210
|
+
}
|
|
211
|
+
const currentStatus = row.status;
|
|
212
|
+
// Safety Guard: Once SIGNATURE_SENT or RECOVERY_HOLD, cannot cancel!
|
|
213
|
+
if (currentStatus === PaymentIntentState.SIGNATURE_SENT ||
|
|
214
|
+
currentStatus === PaymentIntentState.RECOVERY_HOLD) {
|
|
215
|
+
this.#db.exec('ROLLBACK;');
|
|
216
|
+
throw new SignatureSentReleaseForbiddenError(intentId, currentStatus);
|
|
217
|
+
}
|
|
218
|
+
validateIntentTransition(currentStatus, PaymentIntentState.CANCELLED, { intentId });
|
|
219
|
+
const ledgerRow = this.#db
|
|
220
|
+
.prepare('SELECT state FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
221
|
+
.get(intentId);
|
|
222
|
+
if (ledgerRow?.state) {
|
|
223
|
+
const currentLedger = ledgerRow.state;
|
|
224
|
+
validateLedgerTransition(currentLedger, BudgetLedgerState.RELEASED);
|
|
225
|
+
this.#db
|
|
226
|
+
.prepare(`
|
|
227
|
+
UPDATE ap_budget_ledger
|
|
228
|
+
SET state = 'RELEASED', updated_at = ?
|
|
229
|
+
WHERE intent_id = ?;
|
|
230
|
+
`)
|
|
231
|
+
.run(now, intentId);
|
|
232
|
+
}
|
|
233
|
+
this.#db
|
|
234
|
+
.prepare(`
|
|
235
|
+
UPDATE ap_buyer_intent
|
|
236
|
+
SET status = 'CANCELLED', updated_at = ?
|
|
237
|
+
WHERE intent_id = ?;
|
|
238
|
+
`)
|
|
239
|
+
.run(now, intentId);
|
|
240
|
+
this.#db.exec('COMMIT;');
|
|
241
|
+
}
|
|
242
|
+
catch (exc) {
|
|
243
|
+
this.#rollbackQuietly();
|
|
244
|
+
throw exc;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
reconcileRelease(intentId, reason = '') {
|
|
248
|
+
const now = this.getTime();
|
|
249
|
+
this.#db.exec('BEGIN IMMEDIATE;');
|
|
250
|
+
try {
|
|
251
|
+
const row = this.#db
|
|
252
|
+
.prepare('SELECT status FROM ap_buyer_intent WHERE intent_id = ?;')
|
|
253
|
+
.get(intentId);
|
|
254
|
+
if (!row || !row.status) {
|
|
255
|
+
this.#db.exec('ROLLBACK;');
|
|
256
|
+
throw new Error(`Buyer intent '${intentId}' not found.`);
|
|
257
|
+
}
|
|
258
|
+
const currentStatus = row.status;
|
|
259
|
+
validateIntentTransition(currentStatus, PaymentIntentState.REJECTED, { intentId });
|
|
260
|
+
this.#db
|
|
261
|
+
.prepare(`
|
|
262
|
+
UPDATE ap_budget_ledger
|
|
263
|
+
SET state = 'RELEASED', updated_at = ?
|
|
264
|
+
WHERE intent_id = ? AND state = 'RESERVED';
|
|
265
|
+
`)
|
|
266
|
+
.run(now, intentId);
|
|
267
|
+
this.#db
|
|
268
|
+
.prepare(`
|
|
269
|
+
UPDATE ap_buyer_intent
|
|
270
|
+
SET status = 'REJECTED', updated_at = ?
|
|
271
|
+
WHERE intent_id = ?;
|
|
272
|
+
`)
|
|
273
|
+
.run(now, intentId);
|
|
274
|
+
this.#db.exec('COMMIT;');
|
|
275
|
+
}
|
|
276
|
+
catch (exc) {
|
|
277
|
+
this.#rollbackQuietly();
|
|
278
|
+
throw exc;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
getIntent(intentId) {
|
|
282
|
+
const row = this.#db
|
|
283
|
+
.prepare(`
|
|
284
|
+
SELECT intent_id, policy_id, idempotency_key, payer_address, payee_address,
|
|
285
|
+
asset_address, network_id, amount_base_units, status, nonce,
|
|
286
|
+
valid_after, valid_before, raw_signature, created_at, updated_at
|
|
287
|
+
FROM ap_buyer_intent
|
|
288
|
+
WHERE intent_id = ?;
|
|
289
|
+
`)
|
|
290
|
+
.get(intentId);
|
|
291
|
+
if (!row) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
return new BuyerIntentRecord({
|
|
295
|
+
intentId: row.intent_id,
|
|
296
|
+
policyId: row.policy_id,
|
|
297
|
+
idempotencyKey: row.idempotency_key,
|
|
298
|
+
payerAddress: row.payer_address,
|
|
299
|
+
payeeAddress: row.payee_address,
|
|
300
|
+
assetAddress: row.asset_address,
|
|
301
|
+
networkId: row.network_id,
|
|
302
|
+
amountBaseUnits: row.amount_base_units,
|
|
303
|
+
status: row.status,
|
|
304
|
+
nonce: row.nonce,
|
|
305
|
+
validAfter: row.valid_after != null ? Number(row.valid_after) : null,
|
|
306
|
+
validBefore: row.valid_before != null ? Number(row.valid_before) : null,
|
|
307
|
+
rawSignature: row.raw_signature,
|
|
308
|
+
createdAt: Number(row.created_at),
|
|
309
|
+
updatedAt: Number(row.updated_at),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
getLedgerState(intentId) {
|
|
313
|
+
const row = this.#db
|
|
314
|
+
.prepare('SELECT state FROM ap_budget_ledger WHERE intent_id = ?;')
|
|
315
|
+
.get(intentId);
|
|
316
|
+
return row?.state ? row.state : null;
|
|
317
|
+
}
|
|
318
|
+
listIntents(states) {
|
|
319
|
+
let rows;
|
|
320
|
+
if (states && states.length > 0) {
|
|
321
|
+
const placeholders = states.map(() => '?').join(',');
|
|
322
|
+
rows = this.#db
|
|
323
|
+
.prepare(`
|
|
324
|
+
SELECT intent_id, policy_id, idempotency_key, payer_address, payee_address,
|
|
325
|
+
asset_address, network_id, amount_base_units, status, nonce,
|
|
326
|
+
valid_after, valid_before, raw_signature, created_at, updated_at
|
|
327
|
+
FROM ap_buyer_intent
|
|
328
|
+
WHERE status IN (${placeholders})
|
|
329
|
+
ORDER BY created_at ASC;
|
|
330
|
+
`)
|
|
331
|
+
.all(...states);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
rows = this.#db
|
|
335
|
+
.prepare(`
|
|
336
|
+
SELECT intent_id, policy_id, idempotency_key, payer_address, payee_address,
|
|
337
|
+
asset_address, network_id, amount_base_units, status, nonce,
|
|
338
|
+
valid_after, valid_before, raw_signature, created_at, updated_at
|
|
339
|
+
FROM ap_buyer_intent
|
|
340
|
+
ORDER BY created_at ASC;
|
|
341
|
+
`)
|
|
342
|
+
.all();
|
|
343
|
+
}
|
|
344
|
+
return rows.map((row) => new BuyerIntentRecord({
|
|
345
|
+
intentId: row.intent_id,
|
|
346
|
+
policyId: row.policy_id,
|
|
347
|
+
idempotencyKey: row.idempotency_key,
|
|
348
|
+
payerAddress: row.payer_address,
|
|
349
|
+
payeeAddress: row.payee_address,
|
|
350
|
+
assetAddress: row.asset_address,
|
|
351
|
+
networkId: row.network_id,
|
|
352
|
+
amountBaseUnits: row.amount_base_units,
|
|
353
|
+
status: row.status,
|
|
354
|
+
nonce: row.nonce,
|
|
355
|
+
validAfter: row.valid_after != null ? Number(row.valid_after) : null,
|
|
356
|
+
validBefore: row.valid_before != null ? Number(row.valid_before) : null,
|
|
357
|
+
rawSignature: row.raw_signature,
|
|
358
|
+
createdAt: Number(row.created_at),
|
|
359
|
+
updatedAt: Number(row.updated_at),
|
|
360
|
+
}));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=buyer-coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buyer-coordinator.js","sourceRoot":"","sources":["../../src/state/buyer-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State transition and coordination exceptions for AgentPay.
|
|
3
|
+
*
|
|
4
|
+
* Standardized error types for illegal lifecycle mutations and safety violations:
|
|
5
|
+
* - IllegalStateTransitionError
|
|
6
|
+
* - SignatureSentReleaseForbiddenError
|
|
7
|
+
* - OrphanedSettlementRollbackForbiddenError
|
|
8
|
+
* - InvalidCompositeStateError
|
|
9
|
+
* - IdempotencyLockConflictError
|
|
10
|
+
*/
|
|
11
|
+
export declare class StateCoordinationError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class IllegalStateTransitionError extends StateCoordinationError {
|
|
15
|
+
readonly entityType: string;
|
|
16
|
+
readonly fromState: string;
|
|
17
|
+
readonly toState: string;
|
|
18
|
+
readonly detail: string;
|
|
19
|
+
constructor(entityType: string, fromState: string, toState: string, detail?: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class SignatureSentReleaseForbiddenError extends StateCoordinationError {
|
|
22
|
+
readonly intentId: string;
|
|
23
|
+
readonly currentState: string;
|
|
24
|
+
constructor(intentId: string, currentState: string);
|
|
25
|
+
}
|
|
26
|
+
export declare class OrphanedSettlementRollbackForbiddenError extends StateCoordinationError {
|
|
27
|
+
readonly settlementId: string;
|
|
28
|
+
readonly settlementState: string;
|
|
29
|
+
constructor(settlementId: string, settlementState: string);
|
|
30
|
+
}
|
|
31
|
+
export declare class InvalidCompositeStateError extends StateCoordinationError {
|
|
32
|
+
readonly intentState: string;
|
|
33
|
+
readonly settlementState: string;
|
|
34
|
+
readonly fulfillmentState: string;
|
|
35
|
+
readonly ledgerState: string | null;
|
|
36
|
+
readonly reason: string;
|
|
37
|
+
constructor(intentState: string, settlementState: string, fulfillmentState: string, ledgerState: string | null, reason: string);
|
|
38
|
+
}
|
|
39
|
+
export declare class IdempotencyLockConflictError extends StateCoordinationError {
|
|
40
|
+
readonly payerAddress: string;
|
|
41
|
+
readonly idempotencyKey: string;
|
|
42
|
+
readonly lockedUntil: number;
|
|
43
|
+
constructor(payerAddress: string, idempotencyKey: string, lockedUntil: number);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/state/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,2BAA4B,SAAQ,sBAAsB;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAK;CAWhF;AAED,qBAAa,kCAAmC,SAAQ,sBAAsB;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAElB,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAUnD;AAED,qBAAa,wCAAyC,SAAQ,sBAAsB;IAClF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;gBAErB,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAU1D;AAED,qBAAa,0BAA2B,SAAQ,sBAAsB;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGtB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,MAAM,EAAE,MAAM;CAajB;AAED,qBAAa,4BAA6B,SAAQ,sBAAsB;IACtE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAU9E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State transition and coordination exceptions for AgentPay.
|
|
3
|
+
*
|
|
4
|
+
* Standardized error types for illegal lifecycle mutations and safety violations:
|
|
5
|
+
* - IllegalStateTransitionError
|
|
6
|
+
* - SignatureSentReleaseForbiddenError
|
|
7
|
+
* - OrphanedSettlementRollbackForbiddenError
|
|
8
|
+
* - InvalidCompositeStateError
|
|
9
|
+
* - IdempotencyLockConflictError
|
|
10
|
+
*/
|
|
11
|
+
export class StateCoordinationError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'StateCoordinationError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class IllegalStateTransitionError extends StateCoordinationError {
|
|
18
|
+
entityType;
|
|
19
|
+
fromState;
|
|
20
|
+
toState;
|
|
21
|
+
detail;
|
|
22
|
+
constructor(entityType, fromState, toState, detail = '') {
|
|
23
|
+
const msg = detail
|
|
24
|
+
? `Illegal ${entityType} state transition from '${fromState}' to '${toState}': ${detail}`
|
|
25
|
+
: `Illegal ${entityType} state transition from '${fromState}' to '${toState}'`;
|
|
26
|
+
super(msg);
|
|
27
|
+
this.name = 'IllegalStateTransitionError';
|
|
28
|
+
this.entityType = entityType;
|
|
29
|
+
this.fromState = fromState;
|
|
30
|
+
this.toState = toState;
|
|
31
|
+
this.detail = detail;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class SignatureSentReleaseForbiddenError extends StateCoordinationError {
|
|
35
|
+
intentId;
|
|
36
|
+
currentState;
|
|
37
|
+
constructor(intentId, currentState) {
|
|
38
|
+
super(`Cannot release or cancel intent '${intentId}' in state '${currentState}': ` +
|
|
39
|
+
'Cryptographic signature has already been transmitted on the wire. ' +
|
|
40
|
+
'Quota must remain RESERVED until reconciliation or successful retry.');
|
|
41
|
+
this.name = 'SignatureSentReleaseForbiddenError';
|
|
42
|
+
this.intentId = intentId;
|
|
43
|
+
this.currentState = currentState;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class OrphanedSettlementRollbackForbiddenError extends StateCoordinationError {
|
|
47
|
+
settlementId;
|
|
48
|
+
settlementState;
|
|
49
|
+
constructor(settlementId, settlementState) {
|
|
50
|
+
super(`Cannot void settlement '${settlementId}' in state '${settlementState}': ` +
|
|
51
|
+
'Payment verification succeeded and funds transfer is active. ' +
|
|
52
|
+
'Upstream fulfillment failures must not rollback settlement.');
|
|
53
|
+
this.name = 'OrphanedSettlementRollbackForbiddenError';
|
|
54
|
+
this.settlementId = settlementId;
|
|
55
|
+
this.settlementState = settlementState;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class InvalidCompositeStateError extends StateCoordinationError {
|
|
59
|
+
intentState;
|
|
60
|
+
settlementState;
|
|
61
|
+
fulfillmentState;
|
|
62
|
+
ledgerState;
|
|
63
|
+
reason;
|
|
64
|
+
constructor(intentState, settlementState, fulfillmentState, ledgerState, reason) {
|
|
65
|
+
super(`Invalid composite state (Intent=${intentState}, Settlement=${settlementState}, ` +
|
|
66
|
+
`Fulfillment=${fulfillmentState}, Ledger=${ledgerState ?? 'null'}): ${reason}`);
|
|
67
|
+
this.name = 'InvalidCompositeStateError';
|
|
68
|
+
this.intentState = intentState;
|
|
69
|
+
this.settlementState = settlementState;
|
|
70
|
+
this.fulfillmentState = fulfillmentState;
|
|
71
|
+
this.ledgerState = ledgerState;
|
|
72
|
+
this.reason = reason;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class IdempotencyLockConflictError extends StateCoordinationError {
|
|
76
|
+
payerAddress;
|
|
77
|
+
idempotencyKey;
|
|
78
|
+
lockedUntil;
|
|
79
|
+
constructor(payerAddress, idempotencyKey, lockedUntil) {
|
|
80
|
+
super(`Concurrent request in-flight for (${payerAddress}, ${idempotencyKey}). ` +
|
|
81
|
+
`Lease locked until Unix timestamp ${lockedUntil}.`);
|
|
82
|
+
this.name = 'IdempotencyLockConflictError';
|
|
83
|
+
this.payerAddress = payerAddress;
|
|
84
|
+
this.idempotencyKey = idempotencyKey;
|
|
85
|
+
this.lockedUntil = lockedUntil;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/state/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Transition Guards and Multi-Entity Validation Rules for AgentPay.
|
|
3
|
+
*
|
|
4
|
+
* Enforces:
|
|
5
|
+
* - Transition guard matrices for Intent, Settlement, Fulfillment, and Ledger
|
|
6
|
+
* - Strict Anti-Overspend invariant: SIGNATURE_SENT/RECOVERY_HOLD cannot release
|
|
7
|
+
* - Strict Anti-Rollback invariant: Upstream 5xx cannot void Settlement
|
|
8
|
+
* - Legal composite state whitelist
|
|
9
|
+
*/
|
|
10
|
+
import { BudgetLedgerState, FulfillmentState, PaymentIntentState, SettlementState } from '../core/state.js';
|
|
11
|
+
export declare const LEGAL_INTENT_TRANSITIONS: Readonly<Record<PaymentIntentState, ReadonlySet<PaymentIntentState>>>;
|
|
12
|
+
export declare const LEGAL_SETTLEMENT_TRANSITIONS: Readonly<Record<SettlementState, ReadonlySet<SettlementState>>>;
|
|
13
|
+
export declare const LEGAL_FULFILLMENT_TRANSITIONS: Readonly<Record<FulfillmentState, ReadonlySet<FulfillmentState>>>;
|
|
14
|
+
export declare const LEGAL_LEDGER_TRANSITIONS: Readonly<Record<BudgetLedgerState, ReadonlySet<BudgetLedgerState>>>;
|
|
15
|
+
export declare function validateIntentTransition(fromState: PaymentIntentState, toState: PaymentIntentState, options?: {
|
|
16
|
+
intentId?: string;
|
|
17
|
+
}): void;
|
|
18
|
+
export declare function validateSettlementTransition(fromState: SettlementState, toState: SettlementState, options?: {
|
|
19
|
+
settlementId?: string;
|
|
20
|
+
}): void;
|
|
21
|
+
export declare function validateFulfillmentTransition(fromState: FulfillmentState, toState: FulfillmentState): void;
|
|
22
|
+
export declare function validateLedgerTransition(fromState: BudgetLedgerState, toState: BudgetLedgerState): void;
|
|
23
|
+
export declare function validateCompositeState(intentState: PaymentIntentState, settlementState: SettlementState, fulfillmentState: FulfillmentState, ledgerState?: BudgetLedgerState | null): void;
|
|
24
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/state/guards.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAY1B,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAoCzG,CAAC;AAEH,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC,CAuCvG,CAAC;AAEH,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC,CA8B1G,CAAC;AAEH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAQvG,CAAC;AAMH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,kBAAkB,EAC7B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,IAAI,CAsBN;AAED,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,IAAI,CAyBN;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAcN;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,iBAAiB,GACzB,IAAI,CAcN;AAMD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,kBAAkB,EAC/B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACrC,IAAI,CAqDN"}
|