@agentguard-run/spend 0.7.0 → 0.8.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 (42) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +16 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/outcomes/index.d.ts +6 -0
  7. package/dist/outcomes/index.d.ts.map +1 -0
  8. package/dist/outcomes/index.js +22 -0
  9. package/dist/outcomes/index.js.map +1 -0
  10. package/dist/outcomes/learning.d.ts +19 -0
  11. package/dist/outcomes/learning.d.ts.map +1 -0
  12. package/dist/outcomes/learning.js +104 -0
  13. package/dist/outcomes/learning.js.map +1 -0
  14. package/dist/outcomes/ledger.d.ts +42 -0
  15. package/dist/outcomes/ledger.d.ts.map +1 -0
  16. package/dist/outcomes/ledger.js +110 -0
  17. package/dist/outcomes/ledger.js.map +1 -0
  18. package/dist/outcomes/quality-gate.d.ts +12 -0
  19. package/dist/outcomes/quality-gate.d.ts.map +1 -0
  20. package/dist/outcomes/quality-gate.js +104 -0
  21. package/dist/outcomes/quality-gate.js.map +1 -0
  22. package/dist/outcomes/runtime.d.ts +21 -0
  23. package/dist/outcomes/runtime.d.ts.map +1 -0
  24. package/dist/outcomes/runtime.js +321 -0
  25. package/dist/outcomes/runtime.js.map +1 -0
  26. package/dist/outcomes/types.d.ts +147 -0
  27. package/dist/outcomes/types.d.ts.map +1 -0
  28. package/dist/outcomes/types.js +14 -0
  29. package/dist/outcomes/types.js.map +1 -0
  30. package/dist/spend-guard.d.ts +4 -0
  31. package/dist/spend-guard.d.ts.map +1 -1
  32. package/dist/spend-guard.js +53 -0
  33. package/dist/spend-guard.js.map +1 -1
  34. package/dist/types.d.ts +3 -1
  35. package/dist/types.d.ts.map +1 -1
  36. package/package.json +8 -2
  37. package/src/outcomes/index.ts +5 -0
  38. package/src/outcomes/learning.ts +133 -0
  39. package/src/outcomes/ledger.ts +131 -0
  40. package/src/outcomes/quality-gate.ts +116 -0
  41. package/src/outcomes/runtime.ts +388 -0
  42. package/src/outcomes/types.ts +167 -0
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeOutcomeTask = executeOutcomeTask;
4
+ const crypto_1 = require("crypto");
5
+ const policy_1 = require("../policy");
6
+ const cost_table_1 = require("../cost-table");
7
+ const router_1 = require("../router");
8
+ const ledger_1 = require("./ledger");
9
+ const quality_gate_1 = require("./quality-gate");
10
+ const types_1 = require("./types");
11
+ async function executeOutcomeTask(options) {
12
+ validateTemplate(options.template);
13
+ validateInputs(options.template, options.inputs);
14
+ const started = Date.now();
15
+ const receiptStore = options.receiptStore ?? new types_1.InMemoryOutcomeReceiptStore();
16
+ const ledger = options.ledger ?? new ledger_1.OutcomeSpendLedger(options.guard.getSpendStore());
17
+ const posture = options.context.posture ?? 'standard';
18
+ const budgetTier = options.context.budgetTier ?? 'solo';
19
+ const route = (0, router_1.recommend)({
20
+ vertical: options.template.vertical,
21
+ outcome: options.template.slug,
22
+ posture,
23
+ budgetTier,
24
+ imageCapable: options.context.imageCapable,
25
+ });
26
+ const blockedOrigins = [...new Set([...(options.template.blockedOrigins ?? []), ...route.blockedOrigins])];
27
+ const hold = await ledger.hold({
28
+ scope: options.context.scope,
29
+ window: options.template.spendCaps.window ?? 'per_call',
30
+ amountCents: options.template.spendCaps.maxCostCents,
31
+ limitCents: options.template.spendCaps.periodCapCents ?? options.template.spendCaps.maxCostCents,
32
+ });
33
+ const links = [];
34
+ let status = 'failed';
35
+ let drafter = null;
36
+ let reviewer = null;
37
+ let fallback = null;
38
+ let outputText = '';
39
+ let reviewerOutputText;
40
+ let gate = { score: 0, riskScore: 0, passed: false, issues: ['not_run'], triggerFired: [] };
41
+ try {
42
+ drafter = await runGuardedModel({
43
+ guard: options.guard,
44
+ template: options.template,
45
+ context: options.context,
46
+ route,
47
+ role: 'drafter',
48
+ model: route.drafter,
49
+ inputs: options.inputs,
50
+ runner: options.runner,
51
+ });
52
+ links.push(linkFor('drafter', drafter));
53
+ outputText = drafter.response.text;
54
+ gate = (0, quality_gate_1.scoreOutcomeOutput)(outputText, options.template, drafter.response.qualityScore);
55
+ if ((0, quality_gate_1.shouldRunReviewer)(gate) && options.context.reviewerCascadeAuto === true) {
56
+ const reviewerModel = antiCorrelatedReviewer(route, drafter.decision.modelResolved);
57
+ reviewer = await runGuardedModel({
58
+ guard: options.guard,
59
+ template: options.template,
60
+ context: options.context,
61
+ route,
62
+ role: 'reviewer',
63
+ model: reviewerModel,
64
+ inputs: { outcome_metadata_only: true, trigger_fired: gate.triggerFired.join(',') },
65
+ runner: options.runner,
66
+ priorOutputText: outputText,
67
+ });
68
+ links.push(linkFor('reviewer', reviewer));
69
+ reviewerOutputText = reviewer.response.text;
70
+ status = 'completed';
71
+ }
72
+ else {
73
+ status = gate.passed ? 'completed' : 'quality_failed';
74
+ }
75
+ }
76
+ catch (err) {
77
+ if (!drafter) {
78
+ const fallbackModel = antiCorrelatedFallback(route, route.drafter);
79
+ if (fallbackModel) {
80
+ fallback = { model: fallbackModel, reason: errorReason(err) };
81
+ try {
82
+ drafter = await runGuardedModel({
83
+ guard: options.guard,
84
+ template: options.template,
85
+ context: options.context,
86
+ route,
87
+ role: 'fallback',
88
+ model: fallbackModel,
89
+ inputs: options.inputs,
90
+ runner: options.runner,
91
+ });
92
+ fallback.decisionId = drafter.decision.decisionId;
93
+ links.push(linkFor('fallback', drafter));
94
+ outputText = drafter.response.text;
95
+ gate = (0, quality_gate_1.scoreOutcomeOutput)(outputText, options.template, drafter.response.qualityScore);
96
+ status = gate.passed ? 'completed' : 'quality_failed';
97
+ }
98
+ catch {
99
+ status = 'failed';
100
+ }
101
+ }
102
+ else {
103
+ status = 'failed';
104
+ }
105
+ }
106
+ else {
107
+ status = 'failed';
108
+ }
109
+ }
110
+ const totalCostCents = links.reduce((sum, item) => sum + item.actualCents, 0);
111
+ if (status === 'completed')
112
+ await ledger.settle(hold, totalCostCents);
113
+ else
114
+ await ledger.refund(hold);
115
+ const receipt = buildReceipt({
116
+ template: options.template,
117
+ context: options.context,
118
+ hold,
119
+ route,
120
+ blockedOrigins,
121
+ status,
122
+ drafter,
123
+ reviewer,
124
+ fallback,
125
+ links,
126
+ gate,
127
+ totalCostCents,
128
+ durationMs: Date.now() - started,
129
+ posture,
130
+ budgetTier,
131
+ });
132
+ await receiptStore.append(receipt);
133
+ const signedReceipt = await options.guard.recordOutcomeReceipt(receiptToMetadata(receipt));
134
+ return { receipt, signed: signedReceipt.signed, outputText, reviewerOutputText };
135
+ }
136
+ async function runGuardedModel(args) {
137
+ const request = buildModelRequest(args);
138
+ const inputTokens = args.guard.estimateTokens(request.systemPrompt + '\n' + request.userPrompt);
139
+ const outputTokens = estimatedOutputTokens(args.template);
140
+ const { decision, signed } = await args.guard.decide({
141
+ provider: (0, cost_table_1.inferProvider)(args.model),
142
+ model: args.model,
143
+ inputTokens,
144
+ outputTokens,
145
+ scope: args.context.scope,
146
+ capabilityClaim: args.template.capability,
147
+ label: args.template.slug + ':' + args.role,
148
+ });
149
+ if (decision.action === 'block')
150
+ throw new Error('Outcome model call blocked by policy');
151
+ const started = Date.now();
152
+ let response;
153
+ try {
154
+ response = await args.runner.run({ ...request, model: decision.modelResolved });
155
+ }
156
+ catch (err) {
157
+ await args.guard.settleStreamUsage(decision.decisionId, 0, 0, { partial: true, reason: errorReason(err) });
158
+ throw err;
159
+ }
160
+ const actualInputTokens = validToken(response.inputTokens) ? response.inputTokens : inputTokens;
161
+ const actualOutputTokens = validToken(response.outputTokens) ? response.outputTokens : args.guard.estimateTokens(response.text);
162
+ const computed = (0, cost_table_1.computeCallCents)(decision.modelResolved, actualInputTokens, actualOutputTokens);
163
+ const actualCents = validCents(response.costCents) ? response.costCents : computed ?? decision.projectedCents;
164
+ await args.guard.settleStreamUsage(decision.decisionId, actualInputTokens, actualOutputTokens, { partial: false });
165
+ return { response, decision, signed, actualInputTokens, actualOutputTokens, actualCents, durationMs: Date.now() - started };
166
+ }
167
+ function buildModelRequest(args) {
168
+ const contextLines = (args.template.contextInjection ?? []).map((item) => {
169
+ const value = args.context.context?.[item.field] ?? item.example ?? '';
170
+ return item.label + ': ' + value;
171
+ });
172
+ const inputLines = Object.entries(args.inputs).map(([key, value]) => key + ': ' + JSON.stringify(value));
173
+ const userPrompt = [
174
+ 'Outcome: ' + args.template.slug,
175
+ 'Role: ' + args.role,
176
+ ...contextLines,
177
+ ...inputLines,
178
+ args.priorOutputText ? 'Prior drafter output:\n' + args.priorOutputText : '',
179
+ 'Return format: ' + args.template.outputFormat,
180
+ ].filter(Boolean).join('\n');
181
+ return {
182
+ role: args.role,
183
+ model: args.model,
184
+ vertical: String(args.template.vertical),
185
+ outcome: args.template.slug,
186
+ promptVersion: args.template.promptVersion,
187
+ systemPrompt: args.template.systemPrompt + (args.template.disclaimer ? '\n' + args.template.disclaimer : ''),
188
+ userPrompt,
189
+ outputFormat: args.template.outputFormat,
190
+ metadata: {
191
+ vertical: String(args.template.vertical),
192
+ outcome: args.template.slug,
193
+ promptVersion: args.template.promptVersion,
194
+ need: args.route.need,
195
+ role: args.role,
196
+ },
197
+ };
198
+ }
199
+ function buildReceipt(args) {
200
+ return {
201
+ receiptId: 'ag_outcome_' + (0, crypto_1.randomUUID)(),
202
+ timestamp: new Date().toISOString(),
203
+ vertical: String(args.template.vertical),
204
+ outcome: args.template.slug,
205
+ promptVersion: args.template.promptVersion,
206
+ customerId: args.context.customerId,
207
+ scopeKey: (0, policy_1.buildScopeKey)(args.context.scope),
208
+ status: args.status,
209
+ drafter: modelSummary(args.drafter),
210
+ reviewer: args.reviewer ? { ...modelSummary(args.reviewer), verdict: args.reviewer.response.verdict ?? 'reviewed' } : null,
211
+ fallback: args.fallback,
212
+ triggerFired: args.gate.triggerFired,
213
+ qualityScore: args.gate.score,
214
+ pass: args.status === 'completed',
215
+ totalCostCents: args.totalCostCents,
216
+ durationMs: args.durationMs,
217
+ decisionLinks: args.links,
218
+ metadata: {
219
+ need: args.route.need,
220
+ capability: args.template.capability,
221
+ posture: args.posture,
222
+ budgetTier: args.budgetTier,
223
+ blockedOrigins: args.blockedOrigins,
224
+ provenance: provenanceSummary(args.drafter, args.reviewer),
225
+ },
226
+ };
227
+ }
228
+ function modelSummary(run) {
229
+ if (!run)
230
+ return { model: 'none', costCents: 0, inputTokens: 0, outputTokens: 0 };
231
+ return {
232
+ model: run.decision.modelResolved,
233
+ decisionId: run.decision.decisionId,
234
+ costCents: run.actualCents,
235
+ inputTokens: run.actualInputTokens,
236
+ outputTokens: run.actualOutputTokens,
237
+ };
238
+ }
239
+ function provenanceSummary(drafter, reviewer) {
240
+ const out = {};
241
+ if (drafter?.response.durationMs)
242
+ out.drafterDurationMs = drafter.response.durationMs;
243
+ if (reviewer?.response.durationMs)
244
+ out.reviewerDurationMs = reviewer.response.durationMs;
245
+ return out;
246
+ }
247
+ function receiptToMetadata(receipt) {
248
+ return JSON.parse(JSON.stringify(receipt));
249
+ }
250
+ function linkFor(role, run) {
251
+ return {
252
+ role,
253
+ decisionId: run.decision.decisionId,
254
+ entryHash: run.signed?.entryHash,
255
+ modelRequested: run.decision.modelRequested,
256
+ modelResolved: run.decision.modelResolved,
257
+ projectedCents: run.decision.projectedCents,
258
+ actualCents: run.actualCents,
259
+ inputTokens: run.actualInputTokens,
260
+ outputTokens: run.actualOutputTokens,
261
+ };
262
+ }
263
+ function antiCorrelatedReviewer(route, drafterModel) {
264
+ if (familyOf(route.reviewer) !== familyOf(drafterModel))
265
+ return route.reviewer;
266
+ return antiCorrelatedFallback(route, drafterModel) ?? route.reviewer;
267
+ }
268
+ function antiCorrelatedFallback(route, failedModel) {
269
+ const failedFamily = familyOf(failedModel);
270
+ return route.allowedModels.find((model) => model !== failedModel && familyOf(model) !== failedFamily && (0, cost_table_1.computeCallCents)(model, 1, 1) !== null) ?? null;
271
+ }
272
+ function familyOf(model) {
273
+ const id = model.toLowerCase();
274
+ if (id.includes('opus'))
275
+ return 'opus';
276
+ if (id.includes('sonnet'))
277
+ return 'sonnet';
278
+ if (id.includes('haiku'))
279
+ return 'haiku';
280
+ if (id.includes('gpt-oss'))
281
+ return 'gpt-oss';
282
+ if (id.includes('gpt-5'))
283
+ return 'gpt-5';
284
+ if (id.includes('gpt-4'))
285
+ return 'gpt-4';
286
+ if (id.includes('llama'))
287
+ return 'llama';
288
+ if (id.includes('mistral'))
289
+ return 'mistral';
290
+ if (id.includes('nova'))
291
+ return 'nova';
292
+ return id.split('/')[0] || id.split('.')[0] || 'unknown';
293
+ }
294
+ function estimatedOutputTokens(template) {
295
+ return Math.max(128, Math.min(4096, Math.ceil(template.spendCaps.maxCostCents * 64)));
296
+ }
297
+ function validateTemplate(template) {
298
+ if (!template.slug || !template.vertical)
299
+ throw new Error('Outcome template must include slug and vertical');
300
+ if (!Number.isSafeInteger(template.spendCaps.maxCostCents) || template.spendCaps.maxCostCents < 0) {
301
+ throw new Error('Outcome spend cap must be a non-negative safe integer');
302
+ }
303
+ }
304
+ function validateInputs(template, inputs) {
305
+ for (const input of template.inputs) {
306
+ if (input.required && !(input.name in inputs))
307
+ throw new Error('Missing required outcome input: ' + input.name);
308
+ }
309
+ }
310
+ function validToken(value) {
311
+ return Number.isSafeInteger(value) && value >= 0;
312
+ }
313
+ function validCents(value) {
314
+ return Number.isSafeInteger(value) && value >= 0;
315
+ }
316
+ function errorReason(err) {
317
+ if (err instanceof Error && err.message)
318
+ return err.message.slice(0, 120);
319
+ return 'model_error';
320
+ }
321
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/outcomes/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import type { CapabilityTier, SpendScope, SpendWindow } from '../types';
2
+ export type OutcomeVertical = 'law' | 'accounting' | 'insurance' | 'realestate' | 'ecommerce' | string;
3
+ export type OutcomeRole = 'drafter' | 'reviewer' | 'fallback';
4
+ export type OutcomeStatus = 'completed' | 'blocked' | 'failed' | 'quality_failed';
5
+ export interface OutcomeInputDefinition {
6
+ name: string;
7
+ type: 'string' | 'number' | 'boolean' | 'json' | 'date';
8
+ required?: boolean;
9
+ description?: string;
10
+ }
11
+ export interface OutcomeSpendCaps {
12
+ maxCostCents: number;
13
+ window?: SpendWindow;
14
+ periodCapCents?: number;
15
+ }
16
+ export interface OutcomeQualityGateRubric {
17
+ name: string;
18
+ weight?: number;
19
+ passThreshold?: number;
20
+ }
21
+ export interface OutcomeQualityGateConfig {
22
+ passThreshold?: number;
23
+ reviewerTriggerScore?: number;
24
+ riskKeywords?: string[];
25
+ rubrics?: OutcomeQualityGateRubric[];
26
+ }
27
+ export interface OutcomeContextInjection {
28
+ field: string;
29
+ label: string;
30
+ required?: boolean;
31
+ example?: string;
32
+ }
33
+ export interface OutcomeTemplate {
34
+ slug: string;
35
+ vertical: OutcomeVertical;
36
+ systemPrompt: string;
37
+ inputs: OutcomeInputDefinition[];
38
+ outputFormat: string;
39
+ need: string;
40
+ capability: CapabilityTier;
41
+ spendCaps: OutcomeSpendCaps;
42
+ promptVersion: string;
43
+ contextInjection?: OutcomeContextInjection[];
44
+ blockedOrigins?: string[];
45
+ premiumAgent?: string;
46
+ disclaimer?: string;
47
+ qualityGate?: OutcomeQualityGateConfig;
48
+ }
49
+ export interface OutcomeExecutionContext {
50
+ scope: SpendScope;
51
+ customerId?: string;
52
+ posture?: string;
53
+ budgetTier?: string;
54
+ imageCapable?: boolean;
55
+ context?: Record<string, string>;
56
+ reviewerCascadeAuto?: boolean;
57
+ }
58
+ export interface OutcomeModelRequest {
59
+ role: OutcomeRole;
60
+ model: string;
61
+ vertical: string;
62
+ outcome: string;
63
+ promptVersion: string;
64
+ systemPrompt: string;
65
+ userPrompt: string;
66
+ outputFormat: string;
67
+ metadata: Record<string, string | number | boolean>;
68
+ }
69
+ export interface OutcomeModelResponse {
70
+ text: string;
71
+ inputTokens?: number;
72
+ outputTokens?: number;
73
+ costCents?: number;
74
+ qualityScore?: number;
75
+ confidence?: number;
76
+ verdict?: string;
77
+ durationMs?: number;
78
+ provenance?: Record<string, string | number | boolean>;
79
+ }
80
+ export interface OutcomeModelRunner {
81
+ run(request: OutcomeModelRequest): Promise<OutcomeModelResponse>;
82
+ }
83
+ export interface OutcomeDecisionLink {
84
+ role: OutcomeRole;
85
+ decisionId: string;
86
+ entryHash?: string;
87
+ modelRequested: string;
88
+ modelResolved: string;
89
+ projectedCents: number;
90
+ actualCents: number;
91
+ inputTokens: number;
92
+ outputTokens: number;
93
+ }
94
+ export interface OutcomeRuntimeReceipt {
95
+ receiptId: string;
96
+ timestamp: string;
97
+ vertical: string;
98
+ outcome: string;
99
+ promptVersion: string;
100
+ customerId?: string;
101
+ scopeKey: string;
102
+ status: OutcomeStatus;
103
+ drafter: {
104
+ model: string;
105
+ decisionId?: string;
106
+ costCents: number;
107
+ inputTokens: number;
108
+ outputTokens: number;
109
+ };
110
+ reviewer: {
111
+ model: string;
112
+ decisionId?: string;
113
+ costCents: number;
114
+ inputTokens: number;
115
+ outputTokens: number;
116
+ verdict: string;
117
+ } | null;
118
+ fallback: {
119
+ model: string;
120
+ decisionId?: string;
121
+ reason: string;
122
+ } | null;
123
+ triggerFired: string[];
124
+ qualityScore: number;
125
+ pass: boolean;
126
+ totalCostCents: number;
127
+ durationMs: number;
128
+ decisionLinks: OutcomeDecisionLink[];
129
+ metadata: {
130
+ need: string;
131
+ capability: CapabilityTier;
132
+ posture: string;
133
+ budgetTier: string;
134
+ blockedOrigins: string[];
135
+ provenance: Record<string, string | number | boolean>;
136
+ };
137
+ }
138
+ export interface OutcomeReceiptStore {
139
+ append(receipt: OutcomeRuntimeReceipt): Promise<void>;
140
+ readAll(): Promise<OutcomeRuntimeReceipt[]>;
141
+ }
142
+ export declare class InMemoryOutcomeReceiptStore implements OutcomeReceiptStore {
143
+ private readonly receipts;
144
+ append(receipt: OutcomeRuntimeReceipt): Promise<void>;
145
+ readAll(): Promise<OutcomeRuntimeReceipt[]>;
146
+ }
147
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/outcomes/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryOutcomeReceiptStore = void 0;
4
+ class InMemoryOutcomeReceiptStore {
5
+ receipts = [];
6
+ async append(receipt) {
7
+ this.receipts.push(receipt);
8
+ }
9
+ async readAll() {
10
+ return [...this.receipts];
11
+ }
12
+ }
13
+ exports.InMemoryOutcomeReceiptStore = InMemoryOutcomeReceiptStore;
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/outcomes/types.ts"],"names":[],"mappings":";;;AA4JA,MAAa,2BAA2B;IACrB,QAAQ,GAA4B,EAAE,CAAC;IAExD,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;CACF;AAVD,kEAUC"}
@@ -129,6 +129,10 @@ export declare class SpendGuard {
129
129
  private signAndAppendDecision;
130
130
  private rememberReservation;
131
131
  private buildSettlementDecision;
132
+ recordOutcomeReceipt(outcomeReceipt: Record<string, unknown>): Promise<{
133
+ decision: SpendDecision;
134
+ signed: SignedDecisionLogEntry | null;
135
+ }>;
132
136
  private getSignerFingerprint;
133
137
  private refreshChainHead;
134
138
  private withDecisionLock;
@@ -1 +1 @@
1
- {"version":3,"file":"spend-guard.d.ts","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spend-guard.d.ts","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"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"}
@@ -203,6 +203,36 @@ class SpendGuard {
203
203
  partial: args.partial,
204
204
  };
205
205
  }
206
+ async recordOutcomeReceipt(outcomeReceipt) {
207
+ const projectedCents = safeReceiptNumber(outcomeReceipt.totalCostCents);
208
+ const decision = {
209
+ decisionId: (0, crypto_1.randomUUID)(),
210
+ timestamp: new Date().toISOString(),
211
+ action: 'allow',
212
+ triggeredCap: null,
213
+ triggeredScopeKey: null,
214
+ projectedCents,
215
+ windowSpendBefore: 0,
216
+ windowSpendAfter: projectedCents,
217
+ provider: 'unknown',
218
+ modelRequested: 'outcome-runtime',
219
+ modelResolved: 'outcome-runtime',
220
+ policyId: this.config.policy.id,
221
+ policyVersion: this.config.policy.version,
222
+ enforcementMode: this.config.policy.mode,
223
+ reasons: ['Outcome runtime metadata receipt recorded locally'],
224
+ entryType: 'outcome',
225
+ outcomeReceipt: sanitizeOutcomeReceipt(outcomeReceipt),
226
+ };
227
+ const result = await this.withDecisionLock(async () => {
228
+ const signed = await this.signAndAppendDecision(decision);
229
+ return { decision, signed };
230
+ });
231
+ if (this.config.onDecision) {
232
+ await this.config.onDecision(result.decision, result.signed);
233
+ }
234
+ return result;
235
+ }
206
236
  getSignerFingerprint() {
207
237
  return this.config.signingKeys
208
238
  ? (0, decision_log_1.computeSignerFingerprint)(this.config.signingKeys.publicKey)
@@ -439,6 +469,29 @@ async function withManagedOpenRouterAuth(params, guard, client) {
439
469
  },
440
470
  };
441
471
  }
472
+ function safeReceiptNumber(value) {
473
+ return Number.isSafeInteger(value) && value >= 0 ? value : 0;
474
+ }
475
+ function sanitizeOutcomeReceipt(value) {
476
+ assertNoOutcomeContent(value);
477
+ return JSON.parse(JSON.stringify(value));
478
+ }
479
+ function assertNoOutcomeContent(value, path = 'outcomeReceipt') {
480
+ if (value == null)
481
+ return;
482
+ if (Array.isArray(value)) {
483
+ value.forEach((child, index) => assertNoOutcomeContent(child, path + '[' + index + ']'));
484
+ return;
485
+ }
486
+ if (typeof value !== 'object')
487
+ return;
488
+ for (const [key, child] of Object.entries(value)) {
489
+ if (/^(prompt|completion|content|messages|input|output|text|raw)$/i.test(key)) {
490
+ throw new Error('Outcome receipt metadata cannot include data-plane field: ' + path + '.' + key);
491
+ }
492
+ assertNoOutcomeContent(child, path + '.' + key);
493
+ }
494
+ }
442
495
  function resolveClientBaseUrl(client) {
443
496
  const obj = client;
444
497
  const direct = obj?.baseURL ?? obj?.baseUrl;