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.
Files changed (106) hide show
  1. package/dist/browser/index.d.ts +1 -1
  2. package/dist/browser/index.d.ts.map +1 -1
  3. package/dist/browser/index.js.map +1 -1
  4. package/dist/browser/types.d.ts +17 -1
  5. package/dist/browser/types.d.ts.map +1 -1
  6. package/dist/browser/veto.d.ts +10 -0
  7. package/dist/browser/veto.d.ts.map +1 -1
  8. package/dist/browser/veto.js +68 -4
  9. package/dist/browser/veto.js.map +1 -1
  10. package/dist/cli/bin.js +0 -0
  11. package/dist/cloud/types.d.ts +17 -2
  12. package/dist/cloud/types.d.ts.map +1 -1
  13. package/dist/core/events.d.ts +11 -1
  14. package/dist/core/events.d.ts.map +1 -1
  15. package/dist/core/events.js +4 -0
  16. package/dist/core/events.js.map +1 -1
  17. package/dist/core/protect.d.ts +3 -1
  18. package/dist/core/protect.d.ts.map +1 -1
  19. package/dist/core/protect.js +14 -4
  20. package/dist/core/protect.js.map +1 -1
  21. package/dist/core/veto.d.ts +43 -1
  22. package/dist/core/veto.d.ts.map +1 -1
  23. package/dist/core/veto.js +248 -13
  24. package/dist/core/veto.js.map +1 -1
  25. package/dist/deterministic/types.d.ts +103 -0
  26. package/dist/deterministic/types.d.ts.map +1 -1
  27. package/dist/economic/budget-engine.d.ts +29 -0
  28. package/dist/economic/budget-engine.d.ts.map +1 -0
  29. package/dist/economic/budget-engine.js +146 -0
  30. package/dist/economic/budget-engine.js.map +1 -0
  31. package/dist/economic/connectors/ap2.d.ts +51 -0
  32. package/dist/economic/connectors/ap2.d.ts.map +1 -0
  33. package/dist/economic/connectors/ap2.js +133 -0
  34. package/dist/economic/connectors/ap2.js.map +1 -0
  35. package/dist/economic/connectors/index.d.ts +8 -0
  36. package/dist/economic/connectors/index.d.ts.map +1 -0
  37. package/dist/economic/connectors/index.js +8 -0
  38. package/dist/economic/connectors/index.js.map +1 -0
  39. package/dist/economic/connectors/mpp.d.ts +41 -0
  40. package/dist/economic/connectors/mpp.d.ts.map +1 -0
  41. package/dist/economic/connectors/mpp.js +97 -0
  42. package/dist/economic/connectors/mpp.js.map +1 -0
  43. package/dist/economic/connectors/x402.d.ts +20 -0
  44. package/dist/economic/connectors/x402.d.ts.map +1 -0
  45. package/dist/economic/connectors/x402.js +142 -0
  46. package/dist/economic/connectors/x402.js.map +1 -0
  47. package/dist/economic/evaluator.d.ts +77 -0
  48. package/dist/economic/evaluator.d.ts.map +1 -0
  49. package/dist/economic/evaluator.js +231 -0
  50. package/dist/economic/evaluator.js.map +1 -0
  51. package/dist/economic/index.d.ts +13 -0
  52. package/dist/economic/index.d.ts.map +1 -0
  53. package/dist/economic/index.js +15 -0
  54. package/dist/economic/index.js.map +1 -0
  55. package/dist/economic/types.d.ts +188 -0
  56. package/dist/economic/types.d.ts.map +1 -0
  57. package/dist/economic/types.js +10 -0
  58. package/dist/economic/types.js.map +1 -0
  59. package/dist/extractors/content.d.ts +42 -0
  60. package/dist/extractors/content.d.ts.map +1 -0
  61. package/dist/extractors/content.js +154 -0
  62. package/dist/extractors/content.js.map +1 -0
  63. package/dist/extractors/index.d.ts +7 -0
  64. package/dist/extractors/index.d.ts.map +1 -0
  65. package/dist/extractors/index.js +7 -0
  66. package/dist/extractors/index.js.map +1 -0
  67. package/dist/index.d.ts +9 -3
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +10 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/policy/generator.d.ts +110 -0
  72. package/dist/policy/generator.d.ts.map +1 -0
  73. package/dist/policy/generator.js +463 -0
  74. package/dist/policy/generator.js.map +1 -0
  75. package/dist/policy/index.d.ts +7 -0
  76. package/dist/policy/index.d.ts.map +1 -0
  77. package/dist/policy/index.js +7 -0
  78. package/dist/policy/index.js.map +1 -0
  79. package/dist/providers/adapters.d.ts +27 -0
  80. package/dist/providers/adapters.d.ts.map +1 -1
  81. package/dist/providers/adapters.js +58 -0
  82. package/dist/providers/adapters.js.map +1 -1
  83. package/dist/rules/index.d.ts +1 -0
  84. package/dist/rules/index.d.ts.map +1 -1
  85. package/dist/rules/index.js +1 -0
  86. package/dist/rules/index.js.map +1 -1
  87. package/dist/rules/local-evaluator.d.ts +69 -0
  88. package/dist/rules/local-evaluator.d.ts.map +1 -0
  89. package/dist/rules/local-evaluator.js +217 -0
  90. package/dist/rules/local-evaluator.js.map +1 -0
  91. package/dist/rules/policy-ir-schema.d.ts +109 -0
  92. package/dist/rules/policy-ir-schema.d.ts.map +1 -1
  93. package/dist/rules/policy-ir-schema.js +90 -0
  94. package/dist/rules/policy-ir-schema.js.map +1 -1
  95. package/dist/rules/policy-packs.d.ts.map +1 -1
  96. package/dist/rules/policy-packs.js +1 -0
  97. package/dist/rules/policy-packs.js.map +1 -1
  98. package/dist/types/config.d.ts +2 -1
  99. package/dist/types/config.d.ts.map +1 -1
  100. package/dist/types/config.js.map +1 -1
  101. package/dist/utils/logger.d.ts +38 -2
  102. package/dist/utils/logger.d.ts.map +1 -1
  103. package/dist/utils/logger.js +231 -26
  104. package/dist/utils/logger.js.map +1 -1
  105. package/package.json +9 -1
  106. 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"}