@agentguard-run/spend 0.1.9 → 0.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/PATENTS.md +37 -0
- package/dist/adapters/postgres-store.d.ts +8 -2
- package/dist/adapters/postgres-store.d.ts.map +1 -1
- package/dist/adapters/postgres-store.js +58 -6
- package/dist/adapters/postgres-store.js.map +1 -1
- package/dist/adapters/redis-store.d.ts +10 -2
- package/dist/adapters/redis-store.d.ts.map +1 -1
- package/dist/adapters/redis-store.js +90 -24
- package/dist/adapters/redis-store.js.map +1 -1
- package/dist/cli/demo.d.ts +2 -2
- package/dist/cli/demo.js +4 -4
- package/dist/cli/demo.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -1
- package/dist/cli/doctor.js +2 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +1 -1
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +7 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +19 -14
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/telemetry.d.ts +2 -0
- package/dist/cli/telemetry.d.ts.map +1 -0
- package/dist/cli/telemetry.js +37 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/verify.d.ts +2 -2
- package/dist/cli/verify.d.ts.map +1 -1
- package/dist/cli/verify.js +53 -36
- package/dist/cli/verify.js.map +1 -1
- package/dist/cost-table.d.ts +2 -2
- package/dist/cost-table.d.ts.map +1 -1
- package/dist/cost-table.js +23 -3
- package/dist/cost-table.js.map +1 -1
- package/dist/decision-log.d.ts +5 -4
- package/dist/decision-log.d.ts.map +1 -1
- package/dist/decision-log.js +40 -15
- package/dist/decision-log.js.map +1 -1
- package/dist/i18n.js +3 -3
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -6
- package/dist/index.js.map +1 -1
- package/dist/policy.d.ts +8 -21
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +226 -109
- package/dist/policy.js.map +1 -1
- package/dist/spend-guard.d.ts +6 -2
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +95 -26
- package/dist/spend-guard.js.map +1 -1
- package/dist/store-memory.d.ts +8 -2
- package/dist/store-memory.d.ts.map +1 -1
- package/dist/store-memory.js +34 -2
- package/dist/store-memory.js.map +1 -1
- package/dist/telemetry.d.ts +11 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +149 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +23 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/package.json +22 -8
package/dist/policy.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* AgentGuard(TM) Spend
|
|
3
|
+
* AgentGuard(TM) Spend: Policy evaluation engine
|
|
4
4
|
*
|
|
5
5
|
* Evaluates a SpendPolicy against a CallContext and returns a SpendDecision.
|
|
6
6
|
* Pure function over inputs and the spend store; no network calls, no provider
|
|
@@ -8,36 +8,47 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Patent notice: Protected by U.S. patent-pending technology
|
|
10
10
|
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
11
|
-
*
|
|
11
|
+
* 64/071,781; 64/071,789).
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports._testing = void 0;
|
|
15
15
|
exports.buildScopeKey = buildScopeKey;
|
|
16
16
|
exports.evaluatePolicy = evaluatePolicy;
|
|
17
|
+
exports.adjustPolicyWindowSpend = adjustPolicyWindowSpend;
|
|
17
18
|
const crypto_1 = require("crypto");
|
|
18
19
|
const cost_table_1 = require("./cost-table");
|
|
20
|
+
const decision_log_1 = require("./decision-log");
|
|
19
21
|
/**
|
|
20
|
-
* Build a
|
|
21
|
-
*
|
|
22
|
-
*
|
|
22
|
+
* Build a collision-resistant storage key from a SpendScope. The hash is over
|
|
23
|
+
* canonical JSON, so attacker-controlled separators in tenant/user IDs cannot
|
|
24
|
+
* collide with another scope shape.
|
|
23
25
|
*/
|
|
24
26
|
function buildScopeKey(scope) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
return `scope:v1:${(0, decision_log_1.sha256Hex)((0, decision_log_1.canonicalJson)(normalizeScope(scope)))}`;
|
|
28
|
+
}
|
|
29
|
+
function normalizeScope(scope) {
|
|
30
|
+
const out = { tenantId: scope.tenantId };
|
|
31
|
+
if (scope.userId)
|
|
32
|
+
out.userId = scope.userId;
|
|
33
|
+
if (scope.teamId)
|
|
34
|
+
out.teamId = scope.teamId;
|
|
35
|
+
if (scope.agentId)
|
|
36
|
+
out.agentId = scope.agentId;
|
|
37
|
+
if (scope.taskId)
|
|
38
|
+
out.taskId = scope.taskId;
|
|
39
|
+
if (scope.provider)
|
|
40
|
+
out.provider = scope.provider;
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
function callScopeWithProvider(call) {
|
|
44
|
+
return {
|
|
45
|
+
...call.scope,
|
|
46
|
+
provider: call.scope.provider ?? call.provider,
|
|
47
|
+
};
|
|
34
48
|
}
|
|
35
49
|
/**
|
|
36
|
-
* Returns true if the
|
|
37
|
-
*
|
|
38
|
-
* A cap matches if every non-empty field in the cap's policy scope is present
|
|
39
|
-
* AND equal in the call's scope. Empty fields in the policy scope are
|
|
40
|
-
* wildcards (match anything).
|
|
50
|
+
* Returns true if the policy scope shape is satisfied by the call scope.
|
|
51
|
+
* Empty fields in the policy scope are wildcards.
|
|
41
52
|
*/
|
|
42
53
|
function policyMatchesCall(policyScope, callScope) {
|
|
43
54
|
if (policyScope.tenantId !== callScope.tenantId)
|
|
@@ -54,10 +65,6 @@ function policyMatchesCall(policyScope, callScope) {
|
|
|
54
65
|
return false;
|
|
55
66
|
return true;
|
|
56
67
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Restrictiveness order: block > downgrade > shadow > allow. Used to combine
|
|
59
|
-
* actions when multiple caps trigger simultaneously.
|
|
60
|
-
*/
|
|
61
68
|
const ACTION_RANK = {
|
|
62
69
|
block: 3,
|
|
63
70
|
downgrade: 2,
|
|
@@ -67,25 +74,15 @@ const ACTION_RANK = {
|
|
|
67
74
|
function mostRestrictive(a, b) {
|
|
68
75
|
return ACTION_RANK[a] >= ACTION_RANK[b] ? a : b;
|
|
69
76
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Evaluate the policy against the call. Returns a SpendDecision describing the
|
|
72
|
-
* action to take, the cap that triggered it (if any), and the projected vs
|
|
73
|
-
* actual spend in the relevant window.
|
|
74
|
-
*
|
|
75
|
-
* Side effect: on 'allow' and 'downgrade', this function INCREMENTS the window
|
|
76
|
-
* spend. On 'block' and 'shadow' the increment is NOT applied (a blocked call
|
|
77
|
-
* does not cost anything; a shadow call is observed but not yet wired through).
|
|
78
|
-
* Callers that need to count shadow calls toward spend should increment
|
|
79
|
-
* explicitly after the provider call returns.
|
|
80
|
-
*/
|
|
81
77
|
async function evaluatePolicy(policy, call, store) {
|
|
78
|
+
validatePolicy(policy);
|
|
79
|
+
validateCall(call);
|
|
82
80
|
const decisionId = (0, crypto_1.randomUUID)();
|
|
83
81
|
const timestamp = new Date().toISOString();
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
if (!policyMatchesCall(policy.scope,
|
|
87
|
-
|
|
88
|
-
return {
|
|
82
|
+
const provider = call.provider ?? (0, cost_table_1.inferProvider)(call.model);
|
|
83
|
+
const callScope = callScopeWithProvider(call);
|
|
84
|
+
if (!policyMatchesCall(policy.scope, callScope)) {
|
|
85
|
+
return buildDecision({
|
|
89
86
|
decisionId,
|
|
90
87
|
timestamp,
|
|
91
88
|
action: 'allow',
|
|
@@ -94,22 +91,17 @@ async function evaluatePolicy(policy, call, store) {
|
|
|
94
91
|
projectedCents: 0,
|
|
95
92
|
windowSpendBefore: 0,
|
|
96
93
|
windowSpendAfter: 0,
|
|
97
|
-
provider
|
|
94
|
+
provider,
|
|
98
95
|
modelRequested: call.model,
|
|
99
96
|
modelResolved: call.model,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
reasons,
|
|
104
|
-
};
|
|
97
|
+
policy,
|
|
98
|
+
reasons: [`Policy ${policy.id} scope does not match call scope`],
|
|
99
|
+
});
|
|
105
100
|
}
|
|
106
|
-
// 2. Capability gate (Patent D §7.3 reduction). If the policy requires a
|
|
107
|
-
// capability tier and the caller's claim is below it, block immediately.
|
|
108
101
|
if (policy.requiredCapability) {
|
|
109
102
|
const claimed = call.capabilityClaim;
|
|
110
103
|
if (!claimed || !capabilityMeetsRequirement(claimed, policy.requiredCapability)) {
|
|
111
|
-
|
|
112
|
-
return {
|
|
104
|
+
return buildDecision({
|
|
113
105
|
decisionId,
|
|
114
106
|
timestamp,
|
|
115
107
|
action: 'block',
|
|
@@ -118,49 +110,96 @@ async function evaluatePolicy(policy, call, store) {
|
|
|
118
110
|
projectedCents: 0,
|
|
119
111
|
windowSpendBefore: 0,
|
|
120
112
|
windowSpendAfter: 0,
|
|
121
|
-
provider
|
|
113
|
+
provider,
|
|
122
114
|
modelRequested: call.model,
|
|
123
115
|
modelResolved: call.model,
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
reasons,
|
|
128
|
-
};
|
|
116
|
+
policy,
|
|
117
|
+
reasons: [`Capability '${claimed ?? 'none'}' below required '${policy.requiredCapability}'`],
|
|
118
|
+
});
|
|
129
119
|
}
|
|
130
120
|
}
|
|
131
|
-
// 3. Compute projected cost.
|
|
132
121
|
const projectedCents = (0, cost_table_1.computeCallCents)(call.model, call.inputTokens, call.outputTokens);
|
|
133
122
|
if (projectedCents === null) {
|
|
134
|
-
|
|
135
|
-
return {
|
|
123
|
+
const action = policy.mode === 'enforce' ? 'block' : 'allow';
|
|
124
|
+
return buildDecision({
|
|
136
125
|
decisionId,
|
|
137
126
|
timestamp,
|
|
138
|
-
action
|
|
127
|
+
action,
|
|
139
128
|
triggeredCap: null,
|
|
140
129
|
triggeredScopeKey: null,
|
|
141
130
|
projectedCents: 0,
|
|
142
131
|
windowSpendBefore: 0,
|
|
143
132
|
windowSpendAfter: 0,
|
|
144
|
-
provider
|
|
133
|
+
provider,
|
|
145
134
|
modelRequested: call.model,
|
|
146
135
|
modelResolved: call.model,
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
reasons,
|
|
151
|
-
};
|
|
136
|
+
policy,
|
|
137
|
+
reasons: [`Unknown model '${call.model}', no cost data; ${action === 'block' ? 'blocking' : 'allowing'} call`],
|
|
138
|
+
});
|
|
152
139
|
}
|
|
153
|
-
|
|
154
|
-
|
|
140
|
+
const scopeKey = buildScopeKey(policy.scope);
|
|
141
|
+
let concurrentReason = null;
|
|
142
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
143
|
+
const evaluation = await evaluateCaps(policy, call, store, scopeKey, projectedCents);
|
|
144
|
+
if (concurrentReason)
|
|
145
|
+
evaluation.reasons.push(concurrentReason);
|
|
146
|
+
const effectiveAction = policy.mode === 'shadow' && (evaluation.chosenAction === 'block' || evaluation.chosenAction === 'downgrade')
|
|
147
|
+
? 'shadow'
|
|
148
|
+
: evaluation.chosenAction;
|
|
149
|
+
const chargedCents = computeChargedCents(effectiveAction, evaluation.modelResolved, call, projectedCents);
|
|
150
|
+
if (effectiveAction === 'allow' || effectiveAction === 'downgrade' || effectiveAction === 'shadow') {
|
|
151
|
+
const reservation = await reserveSpendForAction(policy, store, scopeKey, effectiveAction, chargedCents, policy.mode !== 'shadow');
|
|
152
|
+
if (!reservation.ok) {
|
|
153
|
+
concurrentReason = `Concurrent spend update crossed ${reservation.window} cap; re-evaluating`;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (evaluation.chosenAction === 'allow' && reservation.first) {
|
|
157
|
+
evaluation.windowSpendBefore = reservation.first.before;
|
|
158
|
+
evaluation.windowSpendAfter = reservation.first.after;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return buildDecision({
|
|
162
|
+
decisionId,
|
|
163
|
+
timestamp,
|
|
164
|
+
action: effectiveAction,
|
|
165
|
+
triggeredCap: evaluation.triggeredCap,
|
|
166
|
+
triggeredScopeKey: evaluation.triggeredScopeKey,
|
|
167
|
+
projectedCents,
|
|
168
|
+
windowSpendBefore: evaluation.windowSpendBefore,
|
|
169
|
+
windowSpendAfter: evaluation.windowSpendAfter,
|
|
170
|
+
provider,
|
|
171
|
+
modelRequested: call.model,
|
|
172
|
+
modelResolved: evaluation.modelResolved,
|
|
173
|
+
policy,
|
|
174
|
+
reasons: evaluation.reasons,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return buildDecision({
|
|
178
|
+
decisionId,
|
|
179
|
+
timestamp,
|
|
180
|
+
action: 'block',
|
|
181
|
+
triggeredCap: null,
|
|
182
|
+
triggeredScopeKey: scopeKey,
|
|
183
|
+
projectedCents,
|
|
184
|
+
windowSpendBefore: 0,
|
|
185
|
+
windowSpendAfter: projectedCents,
|
|
186
|
+
provider,
|
|
187
|
+
modelRequested: call.model,
|
|
188
|
+
modelResolved: call.model,
|
|
189
|
+
policy,
|
|
190
|
+
reasons: [concurrentReason ?? 'Concurrent spend update prevented a safe reservation'],
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async function evaluateCaps(policy, call, store, scopeKey, projectedCents) {
|
|
194
|
+
const reasons = [];
|
|
155
195
|
let chosenAction = 'allow';
|
|
156
196
|
let triggeredCap = null;
|
|
157
197
|
let triggeredScopeKey = null;
|
|
158
198
|
let windowSpendBefore = 0;
|
|
159
199
|
let windowSpendAfter = 0;
|
|
160
200
|
let modelResolved = call.model;
|
|
161
|
-
const scopeKey = buildScopeKey(call.scope);
|
|
162
201
|
for (const cap of policy.caps) {
|
|
163
|
-
const currentSpend = await store.getWindowSpend(scopeKey, cap.window);
|
|
202
|
+
const currentSpend = cap.window === 'per_call' ? 0 : await store.getWindowSpend(scopeKey, cap.window);
|
|
164
203
|
const projectedTotal = currentSpend + projectedCents;
|
|
165
204
|
if (projectedTotal > cap.amountCents) {
|
|
166
205
|
const candidateAction = cap.action;
|
|
@@ -170,12 +209,11 @@ async function evaluatePolicy(policy, call, store) {
|
|
|
170
209
|
triggeredScopeKey = scopeKey;
|
|
171
210
|
windowSpendBefore = currentSpend;
|
|
172
211
|
windowSpendAfter = projectedTotal;
|
|
173
|
-
if (candidateAction === 'downgrade' && cap.downgradeTo)
|
|
212
|
+
if (candidateAction === 'downgrade' && cap.downgradeTo)
|
|
174
213
|
modelResolved = cap.downgradeTo;
|
|
175
|
-
}
|
|
176
214
|
reasons.push(`Cap '${cap.window}=${cap.amountCents}c' exceeded ` +
|
|
177
215
|
`(spent=${currentSpend}c, +call=${projectedCents}c, total=${projectedTotal}c) ` +
|
|
178
|
-
|
|
216
|
+
`to ${candidateAction}` +
|
|
179
217
|
(cap.reason ? ` (${cap.reason})` : ''));
|
|
180
218
|
}
|
|
181
219
|
}
|
|
@@ -185,48 +223,100 @@ async function evaluatePolicy(policy, call, store) {
|
|
|
185
223
|
windowSpendBefore = 0;
|
|
186
224
|
windowSpendAfter = projectedCents;
|
|
187
225
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const effectiveAction = policy.mode === 'shadow' && (chosenAction === 'block' || chosenAction === 'downgrade')
|
|
193
|
-
? 'shadow'
|
|
194
|
-
: chosenAction;
|
|
195
|
-
// 6. If action is allow or downgrade, increment the window spend for caps
|
|
196
|
-
// that did NOT trigger (so future calls see the running total).
|
|
197
|
-
// On block/shadow we do not increment because the call did not (or will
|
|
198
|
-
// not) actually execute against the provider.
|
|
199
|
-
// On downgrade, the customer pays for the RESOLVED model, not the original.
|
|
200
|
-
// Recompute the actual cost so the budget is charged correctly.
|
|
201
|
-
let chargedCents = projectedCents;
|
|
202
|
-
if (effectiveAction === 'downgrade' && modelResolved !== call.model) {
|
|
226
|
+
return { chosenAction, triggeredCap, triggeredScopeKey, windowSpendBefore, windowSpendAfter, modelResolved, reasons };
|
|
227
|
+
}
|
|
228
|
+
function computeChargedCents(action, modelResolved, call, projectedCents) {
|
|
229
|
+
if (action === 'downgrade' && modelResolved !== call.model) {
|
|
203
230
|
const downgradedCost = (0, cost_table_1.computeCallCents)(modelResolved, call.inputTokens, call.outputTokens);
|
|
204
231
|
if (downgradedCost !== null)
|
|
205
|
-
|
|
232
|
+
return downgradedCost;
|
|
206
233
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
234
|
+
return projectedCents;
|
|
235
|
+
}
|
|
236
|
+
async function reserveSpendForAction(policy, store, scopeKey, action, cents, enforceLimits) {
|
|
237
|
+
validateCents('cents', cents);
|
|
238
|
+
const windows = [...new Set(policy.caps.map((c) => c.window))].filter((w) => w !== 'per_call');
|
|
239
|
+
const reservations = [];
|
|
240
|
+
for (const window of windows) {
|
|
241
|
+
const limit = enforceLimits ? capLimitForAction(policy, window, action) : null;
|
|
242
|
+
const reservation = limit === null
|
|
243
|
+
? await reserveWithoutLimit(store, scopeKey, window, cents)
|
|
244
|
+
: await reserveWithLimit(store, scopeKey, window, cents, limit);
|
|
245
|
+
if (!reservation.allowed) {
|
|
246
|
+
await rollbackReservations(store, scopeKey, reservations);
|
|
247
|
+
return { ok: false, window, before: reservation.before, after: reservation.after };
|
|
212
248
|
}
|
|
249
|
+
reservations.push({ window, cents, before: reservation.before, after: reservation.after });
|
|
250
|
+
}
|
|
251
|
+
return { ok: true, first: reservations[0] ? { before: reservations[0].before, after: reservations[0].after } : undefined };
|
|
252
|
+
}
|
|
253
|
+
function capLimitForAction(policy, window, action) {
|
|
254
|
+
const stricter = policy.caps
|
|
255
|
+
.filter((cap) => cap.action !== 'shadow' && cap.window === window && ACTION_RANK[cap.action] > ACTION_RANK[action])
|
|
256
|
+
.map((cap) => cap.amountCents);
|
|
257
|
+
return stricter.length > 0 ? Math.min(...stricter) : null;
|
|
258
|
+
}
|
|
259
|
+
async function reserveWithLimit(store, scopeKey, window, cents, limitCents) {
|
|
260
|
+
validateCents('limitCents', limitCents);
|
|
261
|
+
if (store.reserveWindowSpend)
|
|
262
|
+
return store.reserveWindowSpend(scopeKey, window, cents, limitCents);
|
|
263
|
+
const before = await store.getWindowSpend(scopeKey, window);
|
|
264
|
+
const projected = before + cents;
|
|
265
|
+
if (projected > limitCents)
|
|
266
|
+
return { allowed: false, before, after: projected };
|
|
267
|
+
const after = await store.incrementWindowSpend(scopeKey, window, cents);
|
|
268
|
+
if (after > limitCents) {
|
|
269
|
+
await settleWindow(store, scopeKey, window, -cents);
|
|
270
|
+
return { allowed: false, before, after };
|
|
271
|
+
}
|
|
272
|
+
return { allowed: true, before, after };
|
|
273
|
+
}
|
|
274
|
+
async function reserveWithoutLimit(store, scopeKey, window, cents) {
|
|
275
|
+
const before = await store.getWindowSpend(scopeKey, window);
|
|
276
|
+
const after = await store.incrementWindowSpend(scopeKey, window, cents);
|
|
277
|
+
return { allowed: true, before, after };
|
|
278
|
+
}
|
|
279
|
+
async function rollbackReservations(store, scopeKey, reservations) {
|
|
280
|
+
for (const reservation of reservations.reverse()) {
|
|
281
|
+
await settleWindow(store, scopeKey, reservation.window, -reservation.cents);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async function settleWindow(store, scopeKey, window, deltaCents) {
|
|
285
|
+
validateDelta(deltaCents);
|
|
286
|
+
if (store.settleWindowSpend)
|
|
287
|
+
return store.settleWindowSpend(scopeKey, window, deltaCents);
|
|
288
|
+
if (deltaCents > 0)
|
|
289
|
+
return store.incrementWindowSpend(scopeKey, window, deltaCents);
|
|
290
|
+
return store.getWindowSpend(scopeKey, window);
|
|
291
|
+
}
|
|
292
|
+
async function adjustPolicyWindowSpend(policy, store, deltaCents) {
|
|
293
|
+
validatePolicy(policy);
|
|
294
|
+
validateDelta(deltaCents);
|
|
295
|
+
if (deltaCents === 0)
|
|
296
|
+
return;
|
|
297
|
+
const scopeKey = buildScopeKey(policy.scope);
|
|
298
|
+
const windows = [...new Set(policy.caps.map((c) => c.window))].filter((w) => w !== 'per_call');
|
|
299
|
+
for (const window of windows) {
|
|
300
|
+
await settleWindow(store, scopeKey, window, deltaCents);
|
|
213
301
|
}
|
|
302
|
+
}
|
|
303
|
+
function buildDecision(args) {
|
|
214
304
|
return {
|
|
215
|
-
decisionId,
|
|
216
|
-
timestamp,
|
|
217
|
-
action:
|
|
218
|
-
triggeredCap,
|
|
219
|
-
triggeredScopeKey,
|
|
220
|
-
projectedCents,
|
|
221
|
-
windowSpendBefore,
|
|
222
|
-
windowSpendAfter,
|
|
223
|
-
provider:
|
|
224
|
-
modelRequested:
|
|
225
|
-
modelResolved,
|
|
226
|
-
policyId: policy.id,
|
|
227
|
-
policyVersion: policy.version,
|
|
228
|
-
enforcementMode: policy.mode,
|
|
229
|
-
reasons,
|
|
305
|
+
decisionId: args.decisionId,
|
|
306
|
+
timestamp: args.timestamp,
|
|
307
|
+
action: args.action,
|
|
308
|
+
triggeredCap: args.triggeredCap,
|
|
309
|
+
triggeredScopeKey: args.triggeredScopeKey,
|
|
310
|
+
projectedCents: args.projectedCents,
|
|
311
|
+
windowSpendBefore: args.windowSpendBefore,
|
|
312
|
+
windowSpendAfter: args.windowSpendAfter,
|
|
313
|
+
provider: args.provider,
|
|
314
|
+
modelRequested: args.modelRequested,
|
|
315
|
+
modelResolved: args.modelResolved,
|
|
316
|
+
policyId: args.policy.id,
|
|
317
|
+
policyVersion: args.policy.version,
|
|
318
|
+
enforcementMode: args.policy.mode,
|
|
319
|
+
reasons: args.reasons,
|
|
230
320
|
};
|
|
231
321
|
}
|
|
232
322
|
const CAPABILITY_ORDER = {
|
|
@@ -238,6 +328,33 @@ const CAPABILITY_ORDER = {
|
|
|
238
328
|
function capabilityMeetsRequirement(claimed, required) {
|
|
239
329
|
return CAPABILITY_ORDER[claimed] >= CAPABILITY_ORDER[required];
|
|
240
330
|
}
|
|
241
|
-
|
|
331
|
+
function validatePolicy(policy) {
|
|
332
|
+
if (!policy.id || !policy.scope?.tenantId)
|
|
333
|
+
throw new Error('SpendPolicy must include id and scope.tenantId');
|
|
334
|
+
if (!Number.isSafeInteger(policy.version) || policy.version < 0)
|
|
335
|
+
throw new Error('SpendPolicy.version must be a non-negative safe integer');
|
|
336
|
+
for (const cap of policy.caps)
|
|
337
|
+
validateCap(cap);
|
|
338
|
+
}
|
|
339
|
+
function validateCap(cap) {
|
|
340
|
+
validateCents('cap.amountCents', cap.amountCents);
|
|
341
|
+
if (!ACTION_RANK.hasOwnProperty(cap.action))
|
|
342
|
+
throw new Error(`Unknown cap action '${cap.action}'`);
|
|
343
|
+
}
|
|
344
|
+
function validateCall(call) {
|
|
345
|
+
if (!call.scope?.tenantId)
|
|
346
|
+
throw new Error('CallContext.scope.tenantId is required');
|
|
347
|
+
validateCents('inputTokens', call.inputTokens);
|
|
348
|
+
validateCents('outputTokens', call.outputTokens);
|
|
349
|
+
}
|
|
350
|
+
function validateCents(name, value) {
|
|
351
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
352
|
+
throw new Error(`${name} must be a non-negative safe integer`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function validateDelta(deltaCents) {
|
|
356
|
+
if (!Number.isSafeInteger(deltaCents))
|
|
357
|
+
throw new Error('deltaCents must be a safe integer');
|
|
358
|
+
}
|
|
242
359
|
exports._testing = { mostRestrictive, policyMatchesCall, capabilityMeetsRequirement };
|
|
243
360
|
//# sourceMappingURL=policy.js.map
|
package/dist/policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAoBH,sCAUC;AA6CD,wCAmLC;AA5PD,mCAAoC;AAWpC,6CAA+D;AAE/D;;;;GAIG;AACH,SAAgB,aAAa,CAAC,KAAiB;IAC7C,MAAM,KAAK,GAAG;QACZ,UAAU,KAAK,CAAC,QAAQ,EAAE;QAC1B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;KAC/C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,WAAuB,EAAE,SAAqB;IACvE,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,WAAW,GAAgC;IAC/C,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,eAAe,CAAC,CAAc,EAAE,CAAc;IACrD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,IAAiB,EACjB,KAAiB;IAEjB,MAAM,UAAU,GAAG,IAAA,mBAAU,GAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,0CAA0C;IAC1C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,EAAE,kCAAkC,CAAC,CAAC;QACpE,OAAO;YACL,UAAU;YACV,SAAS;YACT,MAAM,EAAE,OAAO;YACf,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,gBAAgB,EAAE,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAA,0BAAa,EAAC,IAAI,CAAC,KAAK,CAAC;YACpD,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,eAAe,EAAE,MAAM,CAAC,IAAI;YAC5B,OAAO;SACR,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,CACV,eAAe,OAAO,IAAI,MAAM,qBAAqB,MAAM,CAAC,kBAAkB,GAAG,CAClF,CAAC;YACF,OAAO;gBACL,UAAU;gBACV,SAAS;gBACT,MAAM,EAAE,OAAO;gBACf,YAAY,EAAE,IAAI;gBAClB,iBAAiB,EAAE,IAAI;gBACvB,cAAc,EAAE,CAAC;gBACjB,iBAAiB,EAAE,CAAC;gBACpB,gBAAgB,EAAE,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAA,0BAAa,EAAC,IAAI,CAAC,KAAK,CAAC;gBACpD,cAAc,EAAE,IAAI,CAAC,KAAK;gBAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,eAAe,EAAE,MAAM,CAAC,IAAI;gBAC5B,OAAO;aACR,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,cAAc,GAAG,IAAA,6BAAgB,EACrC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAClB,CAAC;IACF,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,KAAK,uCAAuC,CAAC,CAAC;QAClF,OAAO;YACL,UAAU;YACV,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YACrD,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,gBAAgB,EAAE,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAA,0BAAa,EAAC,IAAI,CAAC,KAAK,CAAC;YACpD,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,eAAe,EAAE,MAAM,CAAC,IAAI;YAC5B,OAAO;SACR,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,iEAAiE;IACjE,IAAI,YAAY,GAAgB,OAAO,CAAC;IACxC,IAAI,YAAY,GAAoB,IAAI,CAAC;IACzC,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAC5C,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;IAE/B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,YAAY,GAAG,cAAc,CAAC;QACrD,IAAI,cAAc,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC;YACnC,IAAI,WAAW,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7D,YAAY,GAAG,eAAe,CAAC;gBAC/B,YAAY,GAAG,GAAG,CAAC;gBACnB,iBAAiB,GAAG,QAAQ,CAAC;gBAC7B,iBAAiB,GAAG,YAAY,CAAC;gBACjC,gBAAgB,GAAG,cAAc,CAAC;gBAClC,IAAI,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;oBACvD,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;gBAClC,CAAC;gBACD,OAAO,CAAC,IAAI,CACV,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,cAAc;oBACjD,UAAU,YAAY,YAAY,cAAc,YAAY,cAAc,KAAK;oBAC/E,KAAK,eAAe,EAAE;oBACtB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACzC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CACV,gCAAgC,cAAc,YAAY,IAAI,CAAC,KAAK,WAAW,QAAQ,GAAG,CAC3F,CAAC;QACF,iBAAiB,GAAG,CAAC,CAAC;QACtB,gBAAgB,GAAG,cAAc,CAAC;IACpC,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,gEAAgE;IAChE,MAAM,eAAe,GACnB,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,YAAY,KAAK,OAAO,IAAI,YAAY,KAAK,WAAW,CAAC;QACpF,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,YAAY,CAAC;IAEnB,0EAA0E;IAC1E,mEAAmE;IACnE,2EAA2E;IAC3E,iDAAiD;IACjD,4EAA4E;IAC5E,gEAAgE;IAChE,IAAI,YAAY,GAAG,cAAc,CAAC;IAClC,IAAI,eAAe,KAAK,WAAW,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpE,MAAM,cAAc,GAAG,IAAA,6BAAgB,EACrC,aAAa,EACb,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAClB,CAAC;QACF,IAAI,cAAc,KAAK,IAAI;YAAE,YAAY,GAAG,cAAc,CAAC;IAC7D,CAAC;IAED,IAAI,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,WAAW,EAAE,CAAC;QACnE,+DAA+D;QAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAc,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9E,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,SAAS;QACT,MAAM,EAAE,eAAe;QACvB,YAAY;QACZ,iBAAiB;QACjB,cAAc;QACd,iBAAiB;QACjB,gBAAgB;QAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAA,0BAAa,EAAC,IAAI,CAAC,KAAK,CAAC;QACpD,cAAc,EAAE,IAAI,CAAC,KAAK;QAC1B,aAAa;QACb,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,eAAe,EAAE,MAAM,CAAC,IAAI;QAC5B,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB,GAAmE;IACvF,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;CACnB,CAAC;AAEF,SAAS,0BAA0B,CACjC,OAAuD,EACvD,QAAwD;IAExD,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,6DAA6D;AAChD,QAAA,QAAQ,GAAG,EAAE,eAAe,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAgDH,sCAEC;AA4CD,wCAkIC;AAsJD,0DAaC;AAjYD,mCAAoC;AAWpC,6CAA+D;AAC/D,iDAA0D;AA6B1D;;;;GAIG;AACH,SAAgB,aAAa,CAAC,KAAiB;IAC7C,OAAO,YAAY,IAAA,wBAAS,EAAC,IAAA,4BAAa,EAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,KAAiB;IACvC,MAAM,GAAG,GAAoB,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5C,IAAI,KAAK,CAAC,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAiB;IAC9C,OAAO;QACL,GAAG,IAAI,CAAC,KAAK;QACb,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;KAC/C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,WAAuB,EAAE,SAAqB;IACvE,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,WAAW,GAAgC;IAC/C,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,eAAe,CAAC,CAAc,EAAE,CAAc;IACrD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,IAAiB,EACjB,KAAiB;IAEjB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnB,MAAM,UAAU,GAAG,IAAA,mBAAU,GAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAA,0BAAa,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QAChD,OAAO,aAAa,CAAC;YACnB,UAAU;YACV,SAAS;YACT,MAAM,EAAE,OAAO;YACf,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,gBAAgB,EAAE,CAAC;YACnB,QAAQ;YACR,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,MAAM;YACN,OAAO,EAAE,CAAC,UAAU,MAAM,CAAC,EAAE,kCAAkC,CAAC;SACjE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAChF,OAAO,aAAa,CAAC;gBACnB,UAAU;gBACV,SAAS;gBACT,MAAM,EAAE,OAAO;gBACf,YAAY,EAAE,IAAI;gBAClB,iBAAiB,EAAE,IAAI;gBACvB,cAAc,EAAE,CAAC;gBACjB,iBAAiB,EAAE,CAAC;gBACpB,gBAAgB,EAAE,CAAC;gBACnB,QAAQ;gBACR,cAAc,EAAE,IAAI,CAAC,KAAK;gBAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,MAAM;gBACN,OAAO,EAAE,CAAC,eAAe,OAAO,IAAI,MAAM,qBAAqB,MAAM,CAAC,kBAAkB,GAAG,CAAC;aAC7F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,6BAAgB,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACzF,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,OAAO,aAAa,CAAC;YACnB,UAAU;YACV,SAAS;YACT,MAAM;YACN,YAAY,EAAE,IAAI;YAClB,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,CAAC;YACpB,gBAAgB,EAAE,CAAC;YACnB,QAAQ;YACR,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;YACzB,MAAM;YACN,OAAO,EAAE,CAAC,kBAAkB,IAAI,CAAC,KAAK,oBAAoB,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC;SAC/G,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QACrF,IAAI,gBAAgB;YAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEhE,MAAM,eAAe,GACnB,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,YAAY,KAAK,OAAO,IAAI,UAAU,CAAC,YAAY,KAAK,WAAW,CAAC;YAC1G,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;QAE9B,MAAM,YAAY,GAAG,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAE1G,IAAI,eAAe,KAAK,OAAO,IAAI,eAAe,KAAK,WAAW,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;YACnG,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAClI,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACpB,gBAAgB,GAAG,mCAAmC,WAAW,CAAC,MAAM,qBAAqB,CAAC;gBAC9F,SAAS;YACX,CAAC;YACD,IAAI,UAAU,CAAC,YAAY,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBAC7D,UAAU,CAAC,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxD,UAAU,CAAC,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;YACxD,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;YACnB,UAAU;YACV,SAAS;YACT,MAAM,EAAE,eAAe;YACvB,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;YAC/C,cAAc;YACd,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;YAC/C,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;YAC7C,QAAQ;YACR,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,MAAM;YACN,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAC;QACnB,UAAU;QACV,SAAS;QACT,MAAM,EAAE,OAAO;QACf,YAAY,EAAE,IAAI;QAClB,iBAAiB,EAAE,QAAQ;QAC3B,cAAc;QACd,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,cAAc;QAChC,QAAQ;QACR,cAAc,EAAE,IAAI,CAAC,KAAK;QAC1B,aAAa,EAAE,IAAI,CAAC,KAAK;QACzB,MAAM;QACN,OAAO,EAAE,CAAC,gBAAgB,IAAI,sDAAsD,CAAC;KACtF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAmB,EACnB,IAAiB,EACjB,KAAiB,EACjB,QAAgB,EAChB,cAAsB;IAEtB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,YAAY,GAAgB,OAAO,CAAC;IACxC,IAAI,YAAY,GAAoB,IAAI,CAAC;IACzC,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAC5C,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtG,MAAM,cAAc,GAAG,YAAY,GAAG,cAAc,CAAC;QACrD,IAAI,cAAc,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC;YACnC,IAAI,WAAW,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7D,YAAY,GAAG,eAAe,CAAC;gBAC/B,YAAY,GAAG,GAAG,CAAC;gBACnB,iBAAiB,GAAG,QAAQ,CAAC;gBAC7B,iBAAiB,GAAG,YAAY,CAAC;gBACjC,gBAAgB,GAAG,cAAc,CAAC;gBAClC,IAAI,eAAe,KAAK,WAAW,IAAI,GAAG,CAAC,WAAW;oBAAE,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC;gBACxF,OAAO,CAAC,IAAI,CACV,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,cAAc;oBACjD,UAAU,YAAY,YAAY,cAAc,YAAY,cAAc,KAAK;oBAC/E,MAAM,eAAe,EAAE;oBACvB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACzC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,gCAAgC,cAAc,YAAY,IAAI,CAAC,KAAK,WAAW,QAAQ,GAAG,CAAC,CAAC;QACzG,iBAAiB,GAAG,CAAC,CAAC;QACtB,gBAAgB,GAAG,cAAc,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACxH,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAmB,EACnB,aAAqB,EACrB,IAAiB,EACjB,cAAsB;IAEtB,IAAI,MAAM,KAAK,WAAW,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAA,6BAAgB,EAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5F,IAAI,cAAc,KAAK,IAAI;YAAE,OAAO,cAAc,CAAC;IACrD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAAmB,EACnB,KAAiB,EACjB,QAAgB,EAChB,MAAmB,EACnB,KAAa,EACb,aAAsB;IAEtB,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;IAC/F,MAAM,YAAY,GAAiF,EAAE,CAAC;IAEtG,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,WAAW,GAAG,KAAK,KAAK,IAAI;YAChC,CAAC,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC;YAC3D,CAAC,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAElE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;QACrF,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC7H,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB,EAAE,MAAmB,EAAE,MAAmB;IACtF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI;SACzB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;SAClH,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,KAAiB,EACjB,QAAgB,EAChB,MAAmB,EACnB,KAAa,EACb,UAAkB;IAElB,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,kBAAkB;QAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEnG,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC,IAAI,SAAS,GAAG,UAAU;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAChF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACxE,IAAI,KAAK,GAAG,UAAU,EAAE,CAAC;QACvB,MAAM,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAiB,EACjB,QAAgB,EAChB,MAAmB,EACnB,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAiB,EACjB,QAAgB,EAChB,YAA2D;IAE3D,KAAK,MAAM,WAAW,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAiB,EACjB,QAAgB,EAChB,MAAmB,EACnB,UAAkB;IAElB,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1F,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAC3C,MAAmB,EACnB,KAAiB,EACjB,UAAkB;IAElB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO;IAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;IAC/F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IActB;IACC,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;QACxB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAClC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB,GAAmE;IACvF,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;CACnB,CAAC;AAEF,SAAS,0BAA0B,CACjC,OAAuD,EACvD,QAAwD;IAExD,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IACzC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC7G,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC5I,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI;QAAE,WAAW,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,GAAa;IAChC,aAAa,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,YAAY,CAAC,IAAiB;IACrC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACrF,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,sCAAsC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AAC9F,CAAC;AAEY,QAAA,QAAQ,GAAG,EAAE,eAAe,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,CAAC"}
|
package/dist/spend-guard.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AgentGuard(TM) Spend
|
|
2
|
+
* AgentGuard(TM) Spend: Core SDK entry point
|
|
3
3
|
*
|
|
4
4
|
* `withSpendGuard()` wraps a provider SDK client (OpenAI, Anthropic, Bedrock)
|
|
5
5
|
* and enforces a SpendPolicy locally before each call is sent to the provider.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Patent notice: Protected by U.S. patent-pending technology
|
|
14
14
|
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
15
|
-
*
|
|
15
|
+
* 64/071,781; 64/071,789).
|
|
16
16
|
*/
|
|
17
17
|
import type { SpendPolicy, CallContext, SpendDecision, SpendStore, DecisionLogStore, SignedDecisionLogEntry, CapabilityTier, SpendScope } from './types';
|
|
18
18
|
/**
|
|
@@ -47,6 +47,7 @@ export declare class SpendGuard {
|
|
|
47
47
|
private logStore;
|
|
48
48
|
private nextSequence;
|
|
49
49
|
private previousHash;
|
|
50
|
+
private decisionLock;
|
|
50
51
|
constructor(config: SpendGuardConfig);
|
|
51
52
|
/**
|
|
52
53
|
* Hydrate the chain pointer from the log store. Call this once at startup
|
|
@@ -62,6 +63,9 @@ export declare class SpendGuard {
|
|
|
62
63
|
decision: SpendDecision;
|
|
63
64
|
signed: SignedDecisionLogEntry | null;
|
|
64
65
|
}>;
|
|
66
|
+
private getSignerFingerprint;
|
|
67
|
+
private refreshChainHead;
|
|
68
|
+
private withDecisionLock;
|
|
65
69
|
/** Default token estimator: approx 1 token per 4 characters of English. */
|
|
66
70
|
private defaultTokenEstimator;
|
|
67
71
|
/** Estimate tokens for a string using the configured estimator. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-guard.d.ts","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EAEtB,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"spend-guard.d.ts","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EAEtB,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAC;AAajB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,+EAA+E;IAC/E,WAAW,CAAC,EAAE;QACZ,kCAAkC;QAClC,UAAU,EAAE,UAAU,CAAC;QACvB,iCAAiC;QACjC,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC;IACF,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,yEAAyE;IACzE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;2DAEuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,YAAY,CAAoC;gBAE5C,MAAM,EAAE,gBAAgB;IAOpC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;QACvC,QAAQ,EAAE,aAAa,CAAC;QACxB,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;KACvC,CAAC;IA6BF,OAAO,CAAC,oBAAoB;YAMd,gBAAgB;YAQhB,gBAAgB;IAc9B,2EAA2E;IAC3E,OAAO,CAAC,qBAAqB;IAI7B,mEAAmE;IACnE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKpC,uDAAuD;IACvD,aAAa,IAAI,UAAU;IAI3B,qDAAqD;IACrD,WAAW,IAAI,gBAAgB;CAGhC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;CAC3C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;gBACJ,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM;CAwBzE;AAED;;;;GAIG;AAEH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,oBAAoB,GAEzB,GAAG,CAqDL"}
|