veto-sdk 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/types.d.ts +17 -1
- package/dist/browser/types.d.ts.map +1 -1
- package/dist/browser/veto.d.ts +10 -0
- package/dist/browser/veto.d.ts.map +1 -1
- package/dist/browser/veto.js +68 -4
- package/dist/browser/veto.js.map +1 -1
- package/dist/cli/bin.js +0 -0
- package/dist/cloud/types.d.ts +17 -2
- package/dist/cloud/types.d.ts.map +1 -1
- package/dist/core/events.d.ts +11 -1
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/events.js +4 -0
- package/dist/core/events.js.map +1 -1
- package/dist/core/protect.d.ts +3 -1
- package/dist/core/protect.d.ts.map +1 -1
- package/dist/core/protect.js +14 -4
- package/dist/core/protect.js.map +1 -1
- package/dist/core/veto.d.ts +43 -1
- package/dist/core/veto.d.ts.map +1 -1
- package/dist/core/veto.js +248 -13
- package/dist/core/veto.js.map +1 -1
- package/dist/deterministic/types.d.ts +103 -0
- package/dist/deterministic/types.d.ts.map +1 -1
- package/dist/economic/budget-engine.d.ts +29 -0
- package/dist/economic/budget-engine.d.ts.map +1 -0
- package/dist/economic/budget-engine.js +146 -0
- package/dist/economic/budget-engine.js.map +1 -0
- package/dist/economic/connectors/ap2.d.ts +51 -0
- package/dist/economic/connectors/ap2.d.ts.map +1 -0
- package/dist/economic/connectors/ap2.js +133 -0
- package/dist/economic/connectors/ap2.js.map +1 -0
- package/dist/economic/connectors/index.d.ts +8 -0
- package/dist/economic/connectors/index.d.ts.map +1 -0
- package/dist/economic/connectors/index.js +8 -0
- package/dist/economic/connectors/index.js.map +1 -0
- package/dist/economic/connectors/mpp.d.ts +41 -0
- package/dist/economic/connectors/mpp.d.ts.map +1 -0
- package/dist/economic/connectors/mpp.js +97 -0
- package/dist/economic/connectors/mpp.js.map +1 -0
- package/dist/economic/connectors/x402.d.ts +20 -0
- package/dist/economic/connectors/x402.d.ts.map +1 -0
- package/dist/economic/connectors/x402.js +142 -0
- package/dist/economic/connectors/x402.js.map +1 -0
- package/dist/economic/evaluator.d.ts +77 -0
- package/dist/economic/evaluator.d.ts.map +1 -0
- package/dist/economic/evaluator.js +231 -0
- package/dist/economic/evaluator.js.map +1 -0
- package/dist/economic/index.d.ts +13 -0
- package/dist/economic/index.d.ts.map +1 -0
- package/dist/economic/index.js +15 -0
- package/dist/economic/index.js.map +1 -0
- package/dist/economic/types.d.ts +188 -0
- package/dist/economic/types.d.ts.map +1 -0
- package/dist/economic/types.js +10 -0
- package/dist/economic/types.js.map +1 -0
- package/dist/extractors/content.d.ts +42 -0
- package/dist/extractors/content.d.ts.map +1 -0
- package/dist/extractors/content.js +154 -0
- package/dist/extractors/content.js.map +1 -0
- package/dist/extractors/index.d.ts +7 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +7 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/policy/generator.d.ts +110 -0
- package/dist/policy/generator.d.ts.map +1 -0
- package/dist/policy/generator.js +463 -0
- package/dist/policy/generator.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/providers/adapters.d.ts +27 -0
- package/dist/providers/adapters.d.ts.map +1 -1
- package/dist/providers/adapters.js +58 -0
- package/dist/providers/adapters.js.map +1 -1
- package/dist/rules/index.d.ts +1 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +1 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/local-evaluator.d.ts +69 -0
- package/dist/rules/local-evaluator.d.ts.map +1 -0
- package/dist/rules/local-evaluator.js +217 -0
- package/dist/rules/local-evaluator.js.map +1 -0
- package/dist/rules/policy-ir-schema.d.ts +109 -0
- package/dist/rules/policy-ir-schema.d.ts.map +1 -1
- package/dist/rules/policy-ir-schema.js +90 -0
- package/dist/rules/policy-ir-schema.js.map +1 -1
- package/dist/rules/policy-packs.d.ts.map +1 -1
- package/dist/rules/policy-packs.js +1 -0
- package/dist/rules/policy-packs.js.map +1 -1
- package/dist/types/config.d.ts +2 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/utils/logger.d.ts +38 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +231 -26
- package/dist/utils/logger.js.map +1 -1
- package/package.json +9 -1
- package/packs/economic-agent.yaml +62 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local budget engine — in-memory, session scope only.
|
|
3
|
+
*
|
|
4
|
+
* Implements the BudgetEngine interface for standalone SDK mode.
|
|
5
|
+
* Only materializes 'session' scope; agent/user/global require
|
|
6
|
+
* CloudBudgetEngine (platform).
|
|
7
|
+
*
|
|
8
|
+
* @module economic/budget-engine
|
|
9
|
+
*/
|
|
10
|
+
export class LocalBudgetEngine {
|
|
11
|
+
state = new Map();
|
|
12
|
+
logger;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.logger = options.logger;
|
|
15
|
+
for (const budget of options.budgets) {
|
|
16
|
+
if (budget.scope !== 'session') {
|
|
17
|
+
this.logger.warn('LocalBudgetEngine only supports session scope — ' +
|
|
18
|
+
`ignoring ${budget.scope} budget. ` +
|
|
19
|
+
'Use Veto Cloud for agent/user/global scopes.', { scope: budget.scope, window: budget.window });
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
this.state.set(budget.scope, {
|
|
23
|
+
spent: 0,
|
|
24
|
+
limit: budget.limit,
|
|
25
|
+
currency: budget.currency,
|
|
26
|
+
approval_threshold: budget.approval_threshold,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
check(cost, currency, scope) {
|
|
31
|
+
const safeCost = this.sanitizeCost(cost);
|
|
32
|
+
const budget = this.state.get(scope);
|
|
33
|
+
if (!budget) {
|
|
34
|
+
// No budget configured for this scope — allow by default
|
|
35
|
+
return { allowed: true, decision: 'allow' };
|
|
36
|
+
}
|
|
37
|
+
// Currency mismatch check
|
|
38
|
+
if (currency.toUpperCase() !== budget.currency.toUpperCase()) {
|
|
39
|
+
return {
|
|
40
|
+
allowed: false,
|
|
41
|
+
decision: 'deny',
|
|
42
|
+
denial: this.buildDenial('currency_mismatch', safeCost, currency, budget, scope),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const remaining = budget.limit - budget.spent;
|
|
46
|
+
// Budget exceeded
|
|
47
|
+
if (safeCost > remaining) {
|
|
48
|
+
this.logger.warn('Budget would be exceeded', {
|
|
49
|
+
scope, cost: safeCost, spent: budget.spent, limit: budget.limit,
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
allowed: false,
|
|
53
|
+
decision: 'deny',
|
|
54
|
+
denial: this.buildDenial('budget_exceeded', safeCost, currency, budget, scope),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Approval threshold
|
|
58
|
+
if (budget.approval_threshold !== undefined && safeCost > budget.approval_threshold) {
|
|
59
|
+
this.logger.info('Cost exceeds approval threshold', {
|
|
60
|
+
scope, cost: safeCost, threshold: budget.approval_threshold,
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
allowed: false,
|
|
64
|
+
decision: 'require_approval',
|
|
65
|
+
denial: this.buildDenial('approval_required', safeCost, currency, budget, scope),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return { allowed: true, decision: 'allow' };
|
|
69
|
+
}
|
|
70
|
+
reserve(cost, currency, scope) {
|
|
71
|
+
const result = this.check(cost, currency, scope);
|
|
72
|
+
if (!result.allowed)
|
|
73
|
+
return result;
|
|
74
|
+
const safeCost = this.sanitizeCost(cost);
|
|
75
|
+
const budget = this.state.get(scope);
|
|
76
|
+
if (budget && safeCost > 0) {
|
|
77
|
+
budget.spent += safeCost;
|
|
78
|
+
this.logger.debug('Budget reserved', {
|
|
79
|
+
scope, cost: safeCost, totalSpent: budget.spent,
|
|
80
|
+
remaining: budget.limit - budget.spent,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
record(cost, _currency, scope) {
|
|
86
|
+
const safeCost = this.sanitizeCost(cost);
|
|
87
|
+
const budget = this.state.get(scope);
|
|
88
|
+
if (budget && safeCost > 0) {
|
|
89
|
+
budget.spent += safeCost;
|
|
90
|
+
this.logger.debug('Budget charge recorded', {
|
|
91
|
+
scope, cost: safeCost, totalSpent: budget.spent,
|
|
92
|
+
remaining: budget.limit - budget.spent,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
refund(amount, scope) {
|
|
97
|
+
if (amount <= 0)
|
|
98
|
+
return;
|
|
99
|
+
const budget = this.state.get(scope);
|
|
100
|
+
if (budget) {
|
|
101
|
+
budget.spent = Math.max(0, budget.spent - amount);
|
|
102
|
+
this.logger.debug('Budget refunded', {
|
|
103
|
+
scope, amount, totalSpent: budget.spent,
|
|
104
|
+
remaining: budget.limit - budget.spent,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
getStatus(scope) {
|
|
109
|
+
const budget = this.state.get(scope);
|
|
110
|
+
if (!budget)
|
|
111
|
+
return null;
|
|
112
|
+
return {
|
|
113
|
+
scope,
|
|
114
|
+
spent: budget.spent,
|
|
115
|
+
limit: budget.limit,
|
|
116
|
+
remaining: Math.max(0, budget.limit - budget.spent),
|
|
117
|
+
currency: budget.currency,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
reset(scope) {
|
|
121
|
+
const budget = this.state.get(scope);
|
|
122
|
+
if (budget) {
|
|
123
|
+
const previous = budget.spent;
|
|
124
|
+
budget.spent = 0;
|
|
125
|
+
this.logger.debug('Budget reset', { scope, previousSpent: previous });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
sanitizeCost(cost) {
|
|
129
|
+
if (!Number.isFinite(cost) || cost < 0)
|
|
130
|
+
return 0;
|
|
131
|
+
return cost;
|
|
132
|
+
}
|
|
133
|
+
buildDenial(reason, cost, currency, budget, scope) {
|
|
134
|
+
return {
|
|
135
|
+
reason,
|
|
136
|
+
cost,
|
|
137
|
+
currency,
|
|
138
|
+
budget_scope: scope,
|
|
139
|
+
budget_limit: budget.limit,
|
|
140
|
+
budget_spent: budget.spent,
|
|
141
|
+
budget_remaining: Math.max(0, budget.limit - budget.spent),
|
|
142
|
+
approval_threshold: budget.approval_threshold,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=budget-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-engine.js","sourceRoot":"","sources":["../../src/economic/budget-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google AP2 (Agent Payments Protocol) connector.
|
|
3
|
+
*
|
|
4
|
+
* Reads AP2 mandate constraints (spending caps, categories, expiry)
|
|
5
|
+
* and enforces Veto policies ON TOP of mandate constraints.
|
|
6
|
+
* Veto is always more restrictive, never less (D4).
|
|
7
|
+
*
|
|
8
|
+
* Timing mode: pre-call — mandate metadata available at setup.
|
|
9
|
+
* Note: v1 does NOT verify mandate signatures. AP2 card-based
|
|
10
|
+
* crypto path is still maturing; signature verification is Phase 2.
|
|
11
|
+
*
|
|
12
|
+
* @module economic/connectors/ap2
|
|
13
|
+
*/
|
|
14
|
+
import type { ProtocolConnector, EconomicDenialDetails } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* AP2 mandate data shape (from mandate negotiation response).
|
|
17
|
+
*/
|
|
18
|
+
export interface AP2MandateData {
|
|
19
|
+
/** Mandate identifier */
|
|
20
|
+
mandate_id?: string;
|
|
21
|
+
/** Maximum spending amount for this mandate */
|
|
22
|
+
spending_cap?: number;
|
|
23
|
+
/** Amount already spent under this mandate */
|
|
24
|
+
spent?: number;
|
|
25
|
+
/** Mandate currency (ISO 4217) */
|
|
26
|
+
currency?: string;
|
|
27
|
+
/** Mandate expiry (ISO 8601) */
|
|
28
|
+
expires_at?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Allowed spending categories.
|
|
31
|
+
*
|
|
32
|
+
* Categories are advisory metadata in v1. Use Veto rules to enforce
|
|
33
|
+
* tool-category constraints.
|
|
34
|
+
*/
|
|
35
|
+
categories?: string[];
|
|
36
|
+
/** Mandate signer (payer identity) */
|
|
37
|
+
signer?: string;
|
|
38
|
+
/** Per-action cost */
|
|
39
|
+
cost?: number;
|
|
40
|
+
/** Additional mandate metadata */
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create an AP2 protocol connector.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createAP2Connector(): ProtocolConnector;
|
|
47
|
+
/**
|
|
48
|
+
* Build a connector_error denial for AP2 parse failures.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildAP2ConnectorError(error: string): EconomicDenialDetails;
|
|
51
|
+
//# sourceMappingURL=ap2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ap2.d.ts","sourceRoot":"","sources":["../../../src/economic/connectors/ap2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAiCD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,CAyEtD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAY3E"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google AP2 (Agent Payments Protocol) connector.
|
|
3
|
+
*
|
|
4
|
+
* Reads AP2 mandate constraints (spending caps, categories, expiry)
|
|
5
|
+
* and enforces Veto policies ON TOP of mandate constraints.
|
|
6
|
+
* Veto is always more restrictive, never less (D4).
|
|
7
|
+
*
|
|
8
|
+
* Timing mode: pre-call — mandate metadata available at setup.
|
|
9
|
+
* Note: v1 does NOT verify mandate signatures. AP2 card-based
|
|
10
|
+
* crypto path is still maturing; signature verification is Phase 2.
|
|
11
|
+
*
|
|
12
|
+
* @module economic/connectors/ap2
|
|
13
|
+
*/
|
|
14
|
+
function extractMandateData(obj) {
|
|
15
|
+
const mandate = (obj.ap2_mandate ?? obj.mandate ?? obj);
|
|
16
|
+
const mandateId = mandate.mandate_id;
|
|
17
|
+
if (typeof mandateId !== 'string' || !mandateId)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
mandate_id: mandateId,
|
|
21
|
+
spending_cap: typeof mandate.spending_cap === 'number' ? mandate.spending_cap : undefined,
|
|
22
|
+
spent: typeof mandate.spent === 'number' ? mandate.spent : undefined,
|
|
23
|
+
currency: typeof mandate.currency === 'string' ? mandate.currency : undefined,
|
|
24
|
+
expires_at: typeof mandate.expires_at === 'string' ? mandate.expires_at : undefined,
|
|
25
|
+
categories: Array.isArray(mandate.categories) ? mandate.categories.filter(c => typeof c === 'string') : undefined,
|
|
26
|
+
signer: typeof mandate.signer === 'string' ? mandate.signer : undefined,
|
|
27
|
+
cost: typeof mandate.cost === 'number' ? mandate.cost : undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function isMandateExpired(expiresAt) {
|
|
31
|
+
const expiry = new Date(expiresAt);
|
|
32
|
+
// Fail-closed: treat unparseable dates as expired (payment boundary)
|
|
33
|
+
if (Number.isNaN(expiry.getTime()))
|
|
34
|
+
return true;
|
|
35
|
+
return expiry.getTime() < Date.now();
|
|
36
|
+
}
|
|
37
|
+
function exceedsSpendingCap(cost, spendingCap, spent) {
|
|
38
|
+
if (spendingCap == null)
|
|
39
|
+
return false;
|
|
40
|
+
// If spent is unknown, assume 0 (fail-closed: enforce cap from scratch)
|
|
41
|
+
return cost > (spendingCap - (spent ?? 0));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create an AP2 protocol connector.
|
|
45
|
+
*/
|
|
46
|
+
export function createAP2Connector() {
|
|
47
|
+
return {
|
|
48
|
+
protocol: 'ap2',
|
|
49
|
+
protocolVersion: '2026.03',
|
|
50
|
+
extract(response) {
|
|
51
|
+
// Handle fetch Response objects
|
|
52
|
+
if (response instanceof Response) {
|
|
53
|
+
const mandateId = response.headers.get('x-ap2-mandate-id');
|
|
54
|
+
const ap2Cost = response.headers.get('x-ap2-cost');
|
|
55
|
+
const ap2Currency = response.headers.get('x-ap2-currency');
|
|
56
|
+
const ap2Signer = response.headers.get('x-ap2-signer');
|
|
57
|
+
const ap2SpendingCap = response.headers.get('x-ap2-spending-cap');
|
|
58
|
+
const ap2Spent = response.headers.get('x-ap2-spent');
|
|
59
|
+
const ap2Expires = response.headers.get('x-ap2-expires');
|
|
60
|
+
if (!mandateId)
|
|
61
|
+
return null;
|
|
62
|
+
// Check mandate expiry
|
|
63
|
+
if (ap2Expires && isMandateExpired(ap2Expires))
|
|
64
|
+
return null;
|
|
65
|
+
const cost = ap2Cost ? Number(ap2Cost) : 0;
|
|
66
|
+
if (!Number.isFinite(cost) || cost < 0)
|
|
67
|
+
return null;
|
|
68
|
+
// Enforce spending cap (D4: Veto is always more restrictive)
|
|
69
|
+
const spendingCap = ap2SpendingCap ? Number(ap2SpendingCap) : undefined;
|
|
70
|
+
const spent = ap2Spent ? Number(ap2Spent) : undefined;
|
|
71
|
+
if (exceedsSpendingCap(cost, spendingCap, spent))
|
|
72
|
+
return null;
|
|
73
|
+
return {
|
|
74
|
+
cost,
|
|
75
|
+
currency: (ap2Currency ?? 'USD').toUpperCase(),
|
|
76
|
+
payer: ap2Signer ?? undefined,
|
|
77
|
+
protocol: 'ap2',
|
|
78
|
+
protocol_metadata: {
|
|
79
|
+
mandate_id: mandateId,
|
|
80
|
+
spending_cap: spendingCap,
|
|
81
|
+
mandate_spent: spent,
|
|
82
|
+
expires_at: ap2Expires ?? undefined,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Handle plain objects (manual mode / pre-call)
|
|
87
|
+
const mandate = extractMandateData(response);
|
|
88
|
+
if (!mandate)
|
|
89
|
+
return null;
|
|
90
|
+
// Check mandate expiry
|
|
91
|
+
if (mandate.expires_at && isMandateExpired(mandate.expires_at))
|
|
92
|
+
return null;
|
|
93
|
+
// Enforce spending cap (D4: Veto is always more restrictive)
|
|
94
|
+
const cost = mandate.cost ?? 0;
|
|
95
|
+
if (exceedsSpendingCap(cost, mandate.spending_cap, mandate.spent))
|
|
96
|
+
return null;
|
|
97
|
+
return {
|
|
98
|
+
cost,
|
|
99
|
+
currency: (mandate.currency ?? 'USD').toUpperCase(),
|
|
100
|
+
payer: mandate.signer,
|
|
101
|
+
protocol: 'ap2',
|
|
102
|
+
protocol_metadata: {
|
|
103
|
+
mandate_id: mandate.mandate_id,
|
|
104
|
+
spending_cap: mandate.spending_cap,
|
|
105
|
+
mandate_spent: mandate.spent,
|
|
106
|
+
/**
|
|
107
|
+
* Categories are advisory metadata in v1. Use Veto rules to
|
|
108
|
+
* enforce tool-category constraints.
|
|
109
|
+
*/
|
|
110
|
+
categories: mandate.categories,
|
|
111
|
+
expires_at: mandate.expires_at,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Build a connector_error denial for AP2 parse failures.
|
|
119
|
+
*/
|
|
120
|
+
export function buildAP2ConnectorError(error) {
|
|
121
|
+
return {
|
|
122
|
+
reason: 'connector_error',
|
|
123
|
+
cost: 0,
|
|
124
|
+
currency: 'USD',
|
|
125
|
+
budget_scope: 'session',
|
|
126
|
+
budget_limit: 0,
|
|
127
|
+
budget_spent: 0,
|
|
128
|
+
budget_remaining: 0,
|
|
129
|
+
connector_name: 'ap2',
|
|
130
|
+
raw_error: error,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=ap2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ap2.js","sourceRoot":"","sources":["../../../src/economic/connectors/ap2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol connector exports.
|
|
3
|
+
* @module economic/connectors
|
|
4
|
+
*/
|
|
5
|
+
export { createX402Connector, buildX402ConnectorError } from './x402.js';
|
|
6
|
+
export { createMPPConnector, buildMPPConnectorError, type MPPSessionData } from './mpp.js';
|
|
7
|
+
export { createAP2Connector, buildAP2ConnectorError, type AP2MandateData } from './ap2.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/economic/connectors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol connector exports.
|
|
3
|
+
* @module economic/connectors
|
|
4
|
+
*/
|
|
5
|
+
export { createX402Connector, buildX402ConnectorError } from './x402.js';
|
|
6
|
+
export { createMPPConnector, buildMPPConnectorError } from './mpp.js';
|
|
7
|
+
export { createAP2Connector, buildAP2ConnectorError } from './ap2.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/economic/connectors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAuB,MAAM,UAAU,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAuB,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stripe MPP (Machine Payments Protocol) connector.
|
|
3
|
+
*
|
|
4
|
+
* Reads MPP session spending limits and per-action costs from
|
|
5
|
+
* session metadata. Tracks cumulative session spend against
|
|
6
|
+
* Veto budget policies.
|
|
7
|
+
*
|
|
8
|
+
* Timing mode: pre-call — session metadata available at setup.
|
|
9
|
+
* MPP spec version: March 2026 launch (spec may evolve).
|
|
10
|
+
*
|
|
11
|
+
* @module economic/connectors/mpp
|
|
12
|
+
*/
|
|
13
|
+
import type { ProtocolConnector, EconomicDenialDetails } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* MPP session data shape (from Stripe's session negotiation response).
|
|
16
|
+
*/
|
|
17
|
+
export interface MPPSessionData {
|
|
18
|
+
/** Shared Payment Token identifier */
|
|
19
|
+
session_token?: string;
|
|
20
|
+
/** Per-action cost in the session currency */
|
|
21
|
+
cost?: number;
|
|
22
|
+
/** Session currency (ISO 4217) */
|
|
23
|
+
currency?: string;
|
|
24
|
+
/** Session spending limit */
|
|
25
|
+
spending_limit?: number;
|
|
26
|
+
/** Cumulative session spend so far */
|
|
27
|
+
spent?: number;
|
|
28
|
+
/** Payer identifier (Stripe customer ID or SPT holder) */
|
|
29
|
+
payer?: string;
|
|
30
|
+
/** Additional session metadata */
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create an MPP protocol connector.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createMPPConnector(): ProtocolConnector;
|
|
37
|
+
/**
|
|
38
|
+
* Build a connector_error denial for MPP parse failures.
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildMPPConnectorError(error: string): EconomicDenialDetails;
|
|
41
|
+
//# sourceMappingURL=mpp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpp.d.ts","sourceRoot":"","sources":["../../../src/economic/connectors/mpp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyBD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,CA+CtD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAY3E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stripe MPP (Machine Payments Protocol) connector.
|
|
3
|
+
*
|
|
4
|
+
* Reads MPP session spending limits and per-action costs from
|
|
5
|
+
* session metadata. Tracks cumulative session spend against
|
|
6
|
+
* Veto budget policies.
|
|
7
|
+
*
|
|
8
|
+
* Timing mode: pre-call — session metadata available at setup.
|
|
9
|
+
* MPP spec version: March 2026 launch (spec may evolve).
|
|
10
|
+
*
|
|
11
|
+
* @module economic/connectors/mpp
|
|
12
|
+
*/
|
|
13
|
+
function extractMPPSessionData(obj) {
|
|
14
|
+
// Accept both top-level and nested mpp_session shapes
|
|
15
|
+
const session = (obj.mpp_session ?? obj);
|
|
16
|
+
const sessionToken = session.session_token;
|
|
17
|
+
if (typeof sessionToken !== 'string' || !sessionToken)
|
|
18
|
+
return null;
|
|
19
|
+
const cost = typeof session.cost === 'number' ? session.cost : undefined;
|
|
20
|
+
const currency = typeof session.currency === 'string' ? session.currency : undefined;
|
|
21
|
+
const spendingLimit = typeof session.spending_limit === 'number' ? session.spending_limit : undefined;
|
|
22
|
+
const spent = typeof session.spent === 'number' ? session.spent : undefined;
|
|
23
|
+
const payer = typeof session.payer === 'string' ? session.payer : undefined;
|
|
24
|
+
return {
|
|
25
|
+
session_token: sessionToken,
|
|
26
|
+
cost,
|
|
27
|
+
currency,
|
|
28
|
+
spending_limit: spendingLimit,
|
|
29
|
+
spent,
|
|
30
|
+
payer,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create an MPP protocol connector.
|
|
35
|
+
*/
|
|
36
|
+
export function createMPPConnector() {
|
|
37
|
+
return {
|
|
38
|
+
protocol: 'mpp',
|
|
39
|
+
protocolVersion: '2026.03',
|
|
40
|
+
extract(response) {
|
|
41
|
+
// Handle fetch Response objects — MPP data comes in response headers/body
|
|
42
|
+
if (response instanceof Response) {
|
|
43
|
+
// Check for MPP headers
|
|
44
|
+
const mppSession = response.headers.get('x-mpp-session');
|
|
45
|
+
const mppCost = response.headers.get('x-mpp-cost');
|
|
46
|
+
const mppCurrency = response.headers.get('x-mpp-currency');
|
|
47
|
+
const mppPayer = response.headers.get('x-mpp-payer');
|
|
48
|
+
if (!mppSession)
|
|
49
|
+
return null;
|
|
50
|
+
const cost = mppCost ? Number(mppCost) : undefined;
|
|
51
|
+
if (cost !== undefined && (!Number.isFinite(cost) || cost < 0))
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
cost: cost ?? 0,
|
|
55
|
+
currency: (mppCurrency ?? 'USD').toUpperCase(),
|
|
56
|
+
payer: mppPayer ?? undefined,
|
|
57
|
+
protocol: 'mpp',
|
|
58
|
+
protocol_metadata: {
|
|
59
|
+
session_token: mppSession,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Handle plain objects (manual mode / pre-call)
|
|
64
|
+
const sessionData = extractMPPSessionData(response);
|
|
65
|
+
if (!sessionData)
|
|
66
|
+
return null;
|
|
67
|
+
return {
|
|
68
|
+
cost: sessionData.cost ?? 0,
|
|
69
|
+
currency: (sessionData.currency ?? 'USD').toUpperCase(),
|
|
70
|
+
payer: sessionData.payer,
|
|
71
|
+
protocol: 'mpp',
|
|
72
|
+
protocol_metadata: {
|
|
73
|
+
session_token: sessionData.session_token,
|
|
74
|
+
spending_limit: sessionData.spending_limit,
|
|
75
|
+
session_spent: sessionData.spent,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build a connector_error denial for MPP parse failures.
|
|
83
|
+
*/
|
|
84
|
+
export function buildMPPConnectorError(error) {
|
|
85
|
+
return {
|
|
86
|
+
reason: 'connector_error',
|
|
87
|
+
cost: 0,
|
|
88
|
+
currency: 'USD',
|
|
89
|
+
budget_scope: 'session',
|
|
90
|
+
budget_limit: 0,
|
|
91
|
+
budget_spent: 0,
|
|
92
|
+
budget_remaining: 0,
|
|
93
|
+
connector_name: 'mpp',
|
|
94
|
+
raw_error: error,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=mpp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mpp.js","sourceRoot":"","sources":["../../../src/economic/connectors/mpp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 protocol connector.
|
|
3
|
+
*
|
|
4
|
+
* Detects HTTP 402 Payment Required responses and parses the
|
|
5
|
+
* X-Payment header (Coinbase x402 V2 protocol) into EconomicContext.
|
|
6
|
+
*
|
|
7
|
+
* Timing mode: post-response — cost discovered from 402 response.
|
|
8
|
+
*
|
|
9
|
+
* @module economic/connectors/x402
|
|
10
|
+
*/
|
|
11
|
+
import type { ProtocolConnector, EconomicDenialDetails } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create an x402 protocol connector.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createX402Connector(): ProtocolConnector;
|
|
16
|
+
/**
|
|
17
|
+
* Build a connector_error denial for x402 parse failures.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildX402ConnectorError(error: string): EconomicDenialDetails;
|
|
20
|
+
//# sourceMappingURL=x402.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.d.ts","sourceRoot":"","sources":["../../../src/economic/connectors/x402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAmB,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAuD7F;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,iBAAiB,CA6DvD;AAuBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAY5E"}
|