veto-sdk 2.0.0 → 2.2.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.
- 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/protect.d.ts.map +1 -1
- package/dist/browser/protect.js +9 -1
- package/dist/browser/protect.js.map +1 -1
- package/dist/browser/types.d.ts +20 -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 +77 -4
- package/dist/browser/veto.js.map +1 -1
- package/dist/cloud/types.d.ts +17 -2
- package/dist/cloud/types.d.ts.map +1 -1
- package/dist/compiler/evaluator.d.ts.map +1 -1
- package/dist/compiler/evaluator.js +6 -0
- package/dist/compiler/evaluator.js.map +1 -1
- package/dist/core/events.d.ts +13 -1
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/events.js +37 -4
- package/dist/core/events.js.map +1 -1
- package/dist/core/protect.d.ts +7 -1
- package/dist/core/protect.d.ts.map +1 -1
- package/dist/core/protect.js +23 -5
- 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 +256 -13
- package/dist/core/veto.js.map +1 -1
- package/dist/deterministic/regex-safety.d.ts.map +1 -1
- package/dist/deterministic/regex-safety.js +42 -1
- package/dist/deterministic/regex-safety.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 +171 -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 +465 -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/condition-evaluator.d.ts +6 -0
- package/dist/rules/condition-evaluator.d.ts.map +1 -1
- package/dist/rules/condition-evaluator.js +60 -18
- package/dist/rules/condition-evaluator.js.map +1 -1
- package/dist/rules/expression-validator.d.ts.map +1 -1
- package/dist/rules/expression-validator.js +5 -0
- package/dist/rules/expression-validator.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 +65 -0
- package/dist/rules/local-evaluator.d.ts.map +1 -0
- package/dist/rules/local-evaluator.js +250 -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 +27 -12
- package/packs/economic-agent.yaml +62 -0
|
@@ -0,0 +1,142 @@
|
|
|
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
|
+
/**
|
|
12
|
+
* Stablecoin tokens treated as 1:1 USD parity.
|
|
13
|
+
* Non-stable tokens require developer-provided exchange rates (not supported in v1).
|
|
14
|
+
*/
|
|
15
|
+
const STABLECOIN_TOKENS = new Set(['USDC', 'USDT', 'DAI', 'BUSD']);
|
|
16
|
+
function parseXPaymentHeader(header) {
|
|
17
|
+
// X-Payment header format: key=value pairs separated by semicolons
|
|
18
|
+
// e.g., "price=0.01;token=USDC;chain=base;recipient=0xabc..."
|
|
19
|
+
const parts = header.split(';').map(p => p.trim()).filter(Boolean);
|
|
20
|
+
const result = {};
|
|
21
|
+
for (const part of parts) {
|
|
22
|
+
const eqIdx = part.indexOf('=');
|
|
23
|
+
if (eqIdx === -1)
|
|
24
|
+
continue;
|
|
25
|
+
const key = part.slice(0, eqIdx).trim().toLowerCase();
|
|
26
|
+
const value = part.slice(eqIdx + 1).trim();
|
|
27
|
+
if (key && value) {
|
|
28
|
+
result[key] = value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!result.price || !result.token || !result.chain || !result.recipient) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
function tokenToUsd(price, token) {
|
|
37
|
+
const amount = Number(price);
|
|
38
|
+
if (!Number.isFinite(amount) || amount < 0)
|
|
39
|
+
return null;
|
|
40
|
+
const upperToken = token.toUpperCase();
|
|
41
|
+
if (STABLECOIN_TOKENS.has(upperToken)) {
|
|
42
|
+
return amount; // 1:1 parity
|
|
43
|
+
}
|
|
44
|
+
// Non-stable tokens not supported in v1
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create an x402 protocol connector.
|
|
49
|
+
*/
|
|
50
|
+
export function createX402Connector() {
|
|
51
|
+
return {
|
|
52
|
+
protocol: 'x402',
|
|
53
|
+
protocolVersion: '2.0',
|
|
54
|
+
extract(response) {
|
|
55
|
+
// Handle fetch Response objects
|
|
56
|
+
if (response instanceof Response) {
|
|
57
|
+
if (response.status !== 402)
|
|
58
|
+
return null;
|
|
59
|
+
const paymentHeader = response.headers.get('x-payment');
|
|
60
|
+
if (!paymentHeader)
|
|
61
|
+
return null;
|
|
62
|
+
return parseFromHeader(paymentHeader);
|
|
63
|
+
}
|
|
64
|
+
// Handle plain objects (manual mode)
|
|
65
|
+
const status = response.status;
|
|
66
|
+
if (status !== 402)
|
|
67
|
+
return null;
|
|
68
|
+
const headers = response.headers;
|
|
69
|
+
if (!headers || typeof headers !== 'object')
|
|
70
|
+
return null;
|
|
71
|
+
// Support both Map-like and plain object headers
|
|
72
|
+
let paymentHeader;
|
|
73
|
+
if (headers instanceof Headers) {
|
|
74
|
+
paymentHeader = headers.get('x-payment') ?? undefined;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const headerObj = headers;
|
|
78
|
+
paymentHeader = (headerObj['x-payment'] ?? headerObj['X-Payment']);
|
|
79
|
+
}
|
|
80
|
+
if (!paymentHeader)
|
|
81
|
+
return null;
|
|
82
|
+
return parseFromHeader(paymentHeader);
|
|
83
|
+
},
|
|
84
|
+
wrapFetch(fetchFn) {
|
|
85
|
+
return async (input, init) => {
|
|
86
|
+
const response = await fetchFn(input, init);
|
|
87
|
+
// Only intercept 402 responses — pass everything else through
|
|
88
|
+
if (response.status !== 402)
|
|
89
|
+
return response;
|
|
90
|
+
// Clone to avoid consuming the body
|
|
91
|
+
const cloned = response.clone();
|
|
92
|
+
const paymentHeader = cloned.headers.get('x-payment');
|
|
93
|
+
if (!paymentHeader)
|
|
94
|
+
return response;
|
|
95
|
+
const context = parseFromHeader(paymentHeader);
|
|
96
|
+
if (context) {
|
|
97
|
+
// Attach economic context to response for downstream consumption
|
|
98
|
+
response
|
|
99
|
+
.__vetoEconomicContext = context;
|
|
100
|
+
}
|
|
101
|
+
return response;
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function parseFromHeader(header) {
|
|
107
|
+
const instruction = parseXPaymentHeader(header);
|
|
108
|
+
if (!instruction)
|
|
109
|
+
return null;
|
|
110
|
+
const costUsd = tokenToUsd(instruction.price, instruction.token);
|
|
111
|
+
if (costUsd === null)
|
|
112
|
+
return null;
|
|
113
|
+
return {
|
|
114
|
+
cost: costUsd,
|
|
115
|
+
currency: 'USD',
|
|
116
|
+
payer: undefined, // Agent wallet set by caller
|
|
117
|
+
protocol: 'x402',
|
|
118
|
+
protocol_metadata: {
|
|
119
|
+
token: instruction.token,
|
|
120
|
+
chain: instruction.chain,
|
|
121
|
+
recipient: instruction.recipient,
|
|
122
|
+
raw_price: instruction.price,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build a connector_error denial for x402 parse failures.
|
|
128
|
+
*/
|
|
129
|
+
export function buildX402ConnectorError(error) {
|
|
130
|
+
return {
|
|
131
|
+
reason: 'connector_error',
|
|
132
|
+
cost: 0,
|
|
133
|
+
currency: 'USD',
|
|
134
|
+
budget_scope: 'session',
|
|
135
|
+
budget_limit: 0,
|
|
136
|
+
budget_spent: 0,
|
|
137
|
+
budget_remaining: 0,
|
|
138
|
+
connector_name: 'x402',
|
|
139
|
+
raw_error: error,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=x402.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.js","sourceRoot":"","sources":["../../../src/economic/connectors/x402.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Economic policy evaluator.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates economic authorization policies against an EconomicContext.
|
|
5
|
+
* Runs payer checks, currency checks, and budget checks in order.
|
|
6
|
+
* Returns a result that composes with the behavioral guard() flow.
|
|
7
|
+
*
|
|
8
|
+
* EconomicContext (from connector)
|
|
9
|
+
* │
|
|
10
|
+
* ▼
|
|
11
|
+
* ┌─────────────────────────────────────┐
|
|
12
|
+
* │ Economic Evaluator │
|
|
13
|
+
* │ │
|
|
14
|
+
* │ 1. Payer check │
|
|
15
|
+
* │ ├── payer present? ──N──▶ deny │
|
|
16
|
+
* │ └── payer in approved? ──N──▶ deny│
|
|
17
|
+
* │ │
|
|
18
|
+
* │ 2. Currency check │
|
|
19
|
+
* │ └── matches budget? ──N──▶ deny │
|
|
20
|
+
* │ │
|
|
21
|
+
* │ 3. Budget check (BudgetEngine) │
|
|
22
|
+
* │ ├── exceeded ──▶ deny │
|
|
23
|
+
* │ ├── threshold ──▶ require_approval│
|
|
24
|
+
* │ └── within ──▶ allow │
|
|
25
|
+
* └─────────────────────────────────────┘
|
|
26
|
+
*
|
|
27
|
+
* @module economic/evaluator
|
|
28
|
+
*/
|
|
29
|
+
import type { BudgetEngine, EconomicContext, EconomicDenialDetails, EconomicPolicyConfig } from './types.js';
|
|
30
|
+
import type { Logger } from '../utils/logger.js';
|
|
31
|
+
/**
|
|
32
|
+
* Result of economic evaluation.
|
|
33
|
+
*/
|
|
34
|
+
export interface EconomicEvaluationResult {
|
|
35
|
+
decision: 'allow' | 'deny' | 'require_approval';
|
|
36
|
+
denial?: EconomicDenialDetails;
|
|
37
|
+
}
|
|
38
|
+
export interface EconomicEvaluatorOptions {
|
|
39
|
+
policy: EconomicPolicyConfig;
|
|
40
|
+
budgetEngine: BudgetEngine;
|
|
41
|
+
logger: Logger;
|
|
42
|
+
}
|
|
43
|
+
export declare class EconomicEvaluator {
|
|
44
|
+
private readonly policy;
|
|
45
|
+
private readonly budgetEngine;
|
|
46
|
+
private readonly logger;
|
|
47
|
+
constructor(options: EconomicEvaluatorOptions);
|
|
48
|
+
/**
|
|
49
|
+
* Evaluate economic policies against the given context.
|
|
50
|
+
*
|
|
51
|
+
* Checks run in order: cost validation → payer → currency → budget.
|
|
52
|
+
* First failure short-circuits.
|
|
53
|
+
*/
|
|
54
|
+
evaluate(economicContext: EconomicContext): EconomicEvaluationResult;
|
|
55
|
+
/**
|
|
56
|
+
* Resolve cost from tool call arguments using cost_extraction config.
|
|
57
|
+
*
|
|
58
|
+
* Reuses resolveFieldPath from the condition evaluator (DRY).
|
|
59
|
+
*/
|
|
60
|
+
resolveCost(toolName: string, args: Record<string, unknown>): number | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Reserve budget for a cost (atomic check + deduct).
|
|
63
|
+
* Rolls back previously reserved scopes if a later scope fails.
|
|
64
|
+
*/
|
|
65
|
+
reserveBudget(cost: number, currency: string): EconomicEvaluationResult;
|
|
66
|
+
/**
|
|
67
|
+
* Refund budget across all configured scopes.
|
|
68
|
+
*/
|
|
69
|
+
refundBudget(amount: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Render a denial message template with context variables.
|
|
72
|
+
* Templates use {variable} syntax: "Would exceed {scope} budget ({spent}/{limit} {currency})"
|
|
73
|
+
*/
|
|
74
|
+
renderDenialMessage(denial: EconomicDenialDetails): string | undefined;
|
|
75
|
+
private checkPayer;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/economic/evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EACV,YAAY,EAGZ,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC;IAChD,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,wBAAwB;IAM7C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,wBAAwB;IAkEpE;;;;OAIG;IACH,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,SAAS;IAiBrB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,wBAAwB;IAkBvE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOlC;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS;IAkBtE,OAAO,CAAC,UAAU;CA+DnB"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Economic policy evaluator.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates economic authorization policies against an EconomicContext.
|
|
5
|
+
* Runs payer checks, currency checks, and budget checks in order.
|
|
6
|
+
* Returns a result that composes with the behavioral guard() flow.
|
|
7
|
+
*
|
|
8
|
+
* EconomicContext (from connector)
|
|
9
|
+
* │
|
|
10
|
+
* ▼
|
|
11
|
+
* ┌─────────────────────────────────────┐
|
|
12
|
+
* │ Economic Evaluator │
|
|
13
|
+
* │ │
|
|
14
|
+
* │ 1. Payer check │
|
|
15
|
+
* │ ├── payer present? ──N──▶ deny │
|
|
16
|
+
* │ └── payer in approved? ──N──▶ deny│
|
|
17
|
+
* │ │
|
|
18
|
+
* │ 2. Currency check │
|
|
19
|
+
* │ └── matches budget? ──N──▶ deny │
|
|
20
|
+
* │ │
|
|
21
|
+
* │ 3. Budget check (BudgetEngine) │
|
|
22
|
+
* │ ├── exceeded ──▶ deny │
|
|
23
|
+
* │ ├── threshold ──▶ require_approval│
|
|
24
|
+
* │ └── within ──▶ allow │
|
|
25
|
+
* └─────────────────────────────────────┘
|
|
26
|
+
*
|
|
27
|
+
* @module economic/evaluator
|
|
28
|
+
*/
|
|
29
|
+
import { resolveFieldPath } from '../rules/condition-evaluator.js';
|
|
30
|
+
export class EconomicEvaluator {
|
|
31
|
+
policy;
|
|
32
|
+
budgetEngine;
|
|
33
|
+
logger;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.policy = options.policy;
|
|
36
|
+
this.budgetEngine = options.budgetEngine;
|
|
37
|
+
this.logger = options.logger;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Evaluate economic policies against the given context.
|
|
41
|
+
*
|
|
42
|
+
* Checks run in order: cost validation → payer → currency → budget.
|
|
43
|
+
* First failure short-circuits.
|
|
44
|
+
*/
|
|
45
|
+
evaluate(economicContext) {
|
|
46
|
+
// 0. Cost validation — reject non-finite/negative costs hard
|
|
47
|
+
if (!Number.isFinite(economicContext.cost) || economicContext.cost < 0) {
|
|
48
|
+
this.logger.warn('Economic context has invalid cost', {
|
|
49
|
+
cost: economicContext.cost,
|
|
50
|
+
protocol: economicContext.protocol,
|
|
51
|
+
});
|
|
52
|
+
const firstBudget = this.policy.budgets?.[0];
|
|
53
|
+
const status = firstBudget
|
|
54
|
+
? this.budgetEngine.getStatus(firstBudget.scope)
|
|
55
|
+
: null;
|
|
56
|
+
return {
|
|
57
|
+
decision: 'deny',
|
|
58
|
+
denial: {
|
|
59
|
+
reason: 'invalid_cost',
|
|
60
|
+
cost: economicContext.cost,
|
|
61
|
+
currency: economicContext.currency,
|
|
62
|
+
budget_scope: firstBudget?.scope ?? 'session',
|
|
63
|
+
budget_limit: status?.limit ?? 0,
|
|
64
|
+
budget_spent: status?.spent ?? 0,
|
|
65
|
+
budget_remaining: status?.remaining ?? 0,
|
|
66
|
+
protocol: economicContext.protocol,
|
|
67
|
+
message: 'Invalid cost: must be a finite non-negative number',
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// 1. Payer check
|
|
72
|
+
if (this.policy.payer) {
|
|
73
|
+
const payerResult = this.checkPayer(economicContext, this.policy.payer);
|
|
74
|
+
if (payerResult)
|
|
75
|
+
return payerResult;
|
|
76
|
+
}
|
|
77
|
+
// 2. Budget checks (one per configured budget scope)
|
|
78
|
+
const budgets = this.policy.budgets ?? [];
|
|
79
|
+
for (const budgetConfig of budgets) {
|
|
80
|
+
const result = this.budgetEngine.check(economicContext.cost, economicContext.currency, budgetConfig.scope);
|
|
81
|
+
if (!result.allowed) {
|
|
82
|
+
this.logger.warn('Economic budget check failed', {
|
|
83
|
+
scope: budgetConfig.scope,
|
|
84
|
+
decision: result.decision,
|
|
85
|
+
cost: economicContext.cost,
|
|
86
|
+
reason: result.denial?.reason,
|
|
87
|
+
});
|
|
88
|
+
const denial = result.denial;
|
|
89
|
+
if (denial) {
|
|
90
|
+
const message = this.renderDenialMessage(denial);
|
|
91
|
+
if (message)
|
|
92
|
+
denial.message = message;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
decision: result.decision,
|
|
96
|
+
denial,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { decision: 'allow' };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Resolve cost from tool call arguments using cost_extraction config.
|
|
104
|
+
*
|
|
105
|
+
* Reuses resolveFieldPath from the condition evaluator (DRY).
|
|
106
|
+
*/
|
|
107
|
+
resolveCost(toolName, args) {
|
|
108
|
+
const extraction = this.policy.cost_extraction;
|
|
109
|
+
if (!extraction)
|
|
110
|
+
return undefined;
|
|
111
|
+
// Per-tool override or default path
|
|
112
|
+
const path = extraction.overrides?.[toolName] ?? extraction.default;
|
|
113
|
+
if (!path)
|
|
114
|
+
return undefined;
|
|
115
|
+
// Use the condition evaluator's field resolver
|
|
116
|
+
const value = resolveFieldPath(path, { arguments: args });
|
|
117
|
+
if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Reserve budget for a cost (atomic check + deduct).
|
|
124
|
+
* Rolls back previously reserved scopes if a later scope fails.
|
|
125
|
+
*/
|
|
126
|
+
reserveBudget(cost, currency) {
|
|
127
|
+
const budgets = this.policy.budgets ?? [];
|
|
128
|
+
const reservedScopes = [];
|
|
129
|
+
for (const budgetConfig of budgets) {
|
|
130
|
+
const result = this.budgetEngine.reserve(cost, currency, budgetConfig.scope);
|
|
131
|
+
if (!result.allowed) {
|
|
132
|
+
// Rollback all previously reserved scopes
|
|
133
|
+
for (const scope of reservedScopes) {
|
|
134
|
+
this.budgetEngine.refund(cost, scope);
|
|
135
|
+
}
|
|
136
|
+
return { decision: result.decision, denial: result.denial };
|
|
137
|
+
}
|
|
138
|
+
reservedScopes.push(budgetConfig.scope);
|
|
139
|
+
}
|
|
140
|
+
return { decision: 'allow' };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Refund budget across all configured scopes.
|
|
144
|
+
*/
|
|
145
|
+
refundBudget(amount) {
|
|
146
|
+
const budgets = this.policy.budgets ?? [];
|
|
147
|
+
for (const budgetConfig of budgets) {
|
|
148
|
+
this.budgetEngine.refund(amount, budgetConfig.scope);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Render a denial message template with context variables.
|
|
153
|
+
* Templates use {variable} syntax: "Would exceed {scope} budget ({spent}/{limit} {currency})"
|
|
154
|
+
*/
|
|
155
|
+
renderDenialMessage(denial) {
|
|
156
|
+
const templates = this.policy.denial_reasons;
|
|
157
|
+
if (!templates)
|
|
158
|
+
return undefined;
|
|
159
|
+
const template = templates[denial.reason];
|
|
160
|
+
if (!template)
|
|
161
|
+
return undefined;
|
|
162
|
+
return template
|
|
163
|
+
.replace(/\{cost\}/g, String(denial.cost))
|
|
164
|
+
.replace(/\{currency\}/g, denial.currency)
|
|
165
|
+
.replace(/\{scope\}/g, denial.budget_scope)
|
|
166
|
+
.replace(/\{limit\}/g, String(denial.budget_limit))
|
|
167
|
+
.replace(/\{spent\}/g, String(denial.budget_spent))
|
|
168
|
+
.replace(/\{remaining\}/g, String(denial.budget_remaining))
|
|
169
|
+
.replace(/\{payer\}/g, denial.payer ?? 'unknown')
|
|
170
|
+
.replace(/\{threshold\}/g, String(denial.approval_threshold ?? denial.budget_limit));
|
|
171
|
+
}
|
|
172
|
+
checkPayer(context, payerConfig) {
|
|
173
|
+
// Payer required but missing
|
|
174
|
+
if (payerConfig.required && !context.payer) {
|
|
175
|
+
this.logger.warn('Payer required but missing', {
|
|
176
|
+
protocol: context.protocol,
|
|
177
|
+
});
|
|
178
|
+
// Use first budget's state for denial details, or zeros if no budgets
|
|
179
|
+
const firstBudget = this.policy.budgets?.[0];
|
|
180
|
+
const status = firstBudget
|
|
181
|
+
? this.budgetEngine.getStatus(firstBudget.scope)
|
|
182
|
+
: null;
|
|
183
|
+
const payerMissingDenial = {
|
|
184
|
+
reason: 'payer_missing',
|
|
185
|
+
cost: context.cost,
|
|
186
|
+
currency: context.currency,
|
|
187
|
+
budget_scope: firstBudget?.scope ?? 'session',
|
|
188
|
+
budget_limit: status?.limit ?? 0,
|
|
189
|
+
budget_spent: status?.spent ?? 0,
|
|
190
|
+
budget_remaining: status?.remaining ?? 0,
|
|
191
|
+
payer: undefined,
|
|
192
|
+
protocol: context.protocol,
|
|
193
|
+
};
|
|
194
|
+
const payerMissingMsg = this.renderDenialMessage(payerMissingDenial);
|
|
195
|
+
if (payerMissingMsg)
|
|
196
|
+
payerMissingDenial.message = payerMissingMsg;
|
|
197
|
+
return { decision: 'deny', denial: payerMissingDenial };
|
|
198
|
+
}
|
|
199
|
+
// Payer not in approved list
|
|
200
|
+
if (payerConfig.approved
|
|
201
|
+
&& payerConfig.approved.length > 0
|
|
202
|
+
&& context.payer
|
|
203
|
+
&& !payerConfig.approved.includes(context.payer)) {
|
|
204
|
+
this.logger.warn('Payer not in approved list', {
|
|
205
|
+
payer: context.payer,
|
|
206
|
+
protocol: context.protocol,
|
|
207
|
+
});
|
|
208
|
+
const firstBudget = this.policy.budgets?.[0];
|
|
209
|
+
const status = firstBudget
|
|
210
|
+
? this.budgetEngine.getStatus(firstBudget.scope)
|
|
211
|
+
: null;
|
|
212
|
+
const payerUnauthorizedDenial = {
|
|
213
|
+
reason: 'payer_unauthorized',
|
|
214
|
+
cost: context.cost,
|
|
215
|
+
currency: context.currency,
|
|
216
|
+
budget_scope: firstBudget?.scope ?? 'session',
|
|
217
|
+
budget_limit: status?.limit ?? 0,
|
|
218
|
+
budget_spent: status?.spent ?? 0,
|
|
219
|
+
budget_remaining: status?.remaining ?? 0,
|
|
220
|
+
payer: context.payer,
|
|
221
|
+
protocol: context.protocol,
|
|
222
|
+
};
|
|
223
|
+
const payerUnauthorizedMsg = this.renderDenialMessage(payerUnauthorizedDenial);
|
|
224
|
+
if (payerUnauthorizedMsg)
|
|
225
|
+
payerUnauthorizedDenial.message = payerUnauthorizedMsg;
|
|
226
|
+
return { decision: 'deny', denial: payerUnauthorizedDenial };
|
|
227
|
+
}
|
|
228
|
+
return null; // Payer OK
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/economic/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Economic authorization module.
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic economic policy enforcement for agent payments
|
|
5
|
+
* across x402, Stripe MPP, Google AP2, and custom protocols.
|
|
6
|
+
*
|
|
7
|
+
* @module economic
|
|
8
|
+
*/
|
|
9
|
+
export type { EconomicProtocol, EconomicContext, EconomicDenialReason, EconomicDenialDetails, BudgetScope, EconomicBudgetConfig, CostExtractionConfig, PayerConfig, DenialReasonTemplates, EconomicPolicyConfig, BudgetCheckResult, EconomicBudgetStatus, BudgetEngine, ProtocolConnector, EconomicWebhookEventType, } from './types.js';
|
|
10
|
+
export { LocalBudgetEngine, type LocalBudgetEngineOptions, } from './budget-engine.js';
|
|
11
|
+
export { EconomicEvaluator, type EconomicEvaluatorOptions, type EconomicEvaluationResult, } from './evaluator.js';
|
|
12
|
+
export { createX402Connector, createMPPConnector, createAP2Connector, buildX402ConnectorError, buildMPPConnectorError, buildAP2ConnectorError, type MPPSessionData, type AP2MandateData, } from './connectors/index.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/economic/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Economic authorization module.
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic economic policy enforcement for agent payments
|
|
5
|
+
* across x402, Stripe MPP, Google AP2, and custom protocols.
|
|
6
|
+
*
|
|
7
|
+
* @module economic
|
|
8
|
+
*/
|
|
9
|
+
// Budget engine
|
|
10
|
+
export { LocalBudgetEngine, } from './budget-engine.js';
|
|
11
|
+
// Evaluator
|
|
12
|
+
export { EconomicEvaluator, } from './evaluator.js';
|
|
13
|
+
// Connectors
|
|
14
|
+
export { createX402Connector, createMPPConnector, createAP2Connector, buildX402ConnectorError, buildMPPConnectorError, buildAP2ConnectorError, } from './connectors/index.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/economic/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqBH,gBAAgB;AAChB,OAAO,EACL,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAE5B,YAAY;AACZ,OAAO,EACL,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AAExB,aAAa;AACb,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,GAGvB,MAAM,uBAAuB,CAAC"}
|