@agentguard-run/spend 0.7.0 → 0.9.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/CHANGELOG.md +14 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/outcomes/index.d.ts +6 -0
- package/dist/outcomes/index.d.ts.map +1 -0
- package/dist/outcomes/index.js +22 -0
- package/dist/outcomes/index.js.map +1 -0
- package/dist/outcomes/learning.d.ts +19 -0
- package/dist/outcomes/learning.d.ts.map +1 -0
- package/dist/outcomes/learning.js +104 -0
- package/dist/outcomes/learning.js.map +1 -0
- package/dist/outcomes/ledger.d.ts +42 -0
- package/dist/outcomes/ledger.d.ts.map +1 -0
- package/dist/outcomes/ledger.js +110 -0
- package/dist/outcomes/ledger.js.map +1 -0
- package/dist/outcomes/quality-gate.d.ts +12 -0
- package/dist/outcomes/quality-gate.d.ts.map +1 -0
- package/dist/outcomes/quality-gate.js +104 -0
- package/dist/outcomes/quality-gate.js.map +1 -0
- package/dist/outcomes/runtime.d.ts +21 -0
- package/dist/outcomes/runtime.d.ts.map +1 -0
- package/dist/outcomes/runtime.js +328 -0
- package/dist/outcomes/runtime.js.map +1 -0
- package/dist/outcomes/types.d.ts +156 -0
- package/dist/outcomes/types.d.ts.map +1 -0
- package/dist/outcomes/types.js +14 -0
- package/dist/outcomes/types.js.map +1 -0
- package/dist/router.d.ts +8 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +932 -229
- package/dist/router.js.map +1 -1
- package/dist/spend-guard.d.ts +4 -0
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +53 -0
- package/dist/spend-guard.js.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/verticals/catalogs.d.ts +62 -0
- package/dist/verticals/catalogs.d.ts.map +1 -0
- package/dist/verticals/catalogs.js +3936 -0
- package/dist/verticals/catalogs.js.map +1 -0
- package/dist/verticals/index.d.ts +2 -0
- package/dist/verticals/index.d.ts.map +1 -0
- package/dist/verticals/index.js +18 -0
- package/dist/verticals/index.js.map +1 -0
- package/package.json +14 -2
- package/src/outcomes/index.ts +5 -0
- package/src/outcomes/learning.ts +133 -0
- package/src/outcomes/ledger.ts +131 -0
- package/src/outcomes/quality-gate.ts +116 -0
- package/src/outcomes/runtime.ts +396 -0
- package/src/outcomes/types.ts +176 -0
- package/src/router.ts +938 -227
- package/src/verticals/catalogs.ts +3967 -0
- package/src/verticals/index.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
- Replaced placeholder vertical outcome catalogs with the validated five-vertical library for law, accounting, insurance, real estate, and e-commerce.
|
|
6
|
+
- Added effort-aware routing so recommendations carry model effort plus separate drafter and reviewer effort for Reviewer Cascade.
|
|
7
|
+
- Exposed the full vertical outcome library from the SDK through `./verticals` and package-level exports for terminal and app usage.
|
|
8
|
+
- Added outcome guardrail tiers, blocked origin policy, and cite-or-refuse boundaries for regulated vertical workflows.
|
|
9
|
+
- Added tests for active outcome coverage, spec fixes, fair-housing flag-only behavior, COI source-policy refusal, no auto-refund behavior, and CN-origin blocking.
|
|
10
|
+
|
|
11
|
+
## 0.8.0
|
|
12
|
+
|
|
13
|
+
- Added the metadata-only outcome runtime: atomic holds, execute, quality gate, opt-in Reviewer Cascade, fallback on error, refund on failure, and signed outcome receipts.
|
|
14
|
+
- Added five vertical outcome catalog hooks and local learning proposals that use receipt metadata only and require manual promotion.
|
|
15
|
+
- Preserved BYO behavior. Reviewer Cascade remains opt-in.
|
|
16
|
+
|
|
3
17
|
## 0.7.0
|
|
4
18
|
|
|
5
19
|
- Added per-vertical cost-optimal router recommendations backed by OpenRouter catalog pricing.
|
package/dist/index.d.ts
CHANGED
|
@@ -32,10 +32,12 @@ export { withSpendGuardAnthropic, type AnthropicBindingOptions } from './binding
|
|
|
32
32
|
export { withSpendGuardBedrock, type BedrockBindingOptions } from './bindings/bedrock';
|
|
33
33
|
export { recommend, defaultKey, type ModelRouteRecommendation, type RecommendOptions } from './router';
|
|
34
34
|
export { DEFAULT_LOCALE, SUPPORTED_LOCALES, TRANSLATIONS, type SupportedLocale, resolveLocale, t, formatBlockedTrace, type BlockedTraceArgs, } from './i18n';
|
|
35
|
-
export declare const AGENTGUARD_SPEND_VERSION = "0.
|
|
35
|
+
export declare const AGENTGUARD_SPEND_VERSION = "0.9.0";
|
|
36
36
|
export declare const agentguard: {
|
|
37
37
|
workflow: typeof runWorkflow;
|
|
38
38
|
};
|
|
39
39
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
40
40
|
export declare const PATENT_NOTICE: string;
|
|
41
|
+
export * from './outcomes';
|
|
42
|
+
export * from './verticals';
|
|
41
43
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,20 @@
|
|
|
6
6
|
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
7
7
|
* 64/071,781; 64/071,789).
|
|
8
8
|
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
9
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
24
|
exports.PROVIDER_REGISTRY = exports.captureProvenance = exports.receiptSchemaVersion = exports.isReceiptV3 = exports.assertReceiptV3 = exports.isOpenRouterHost = exports.clearManagedOpenRouterKeyCache = exports.fetchManagedOpenRouterKey = exports.modelCostFromOpenRouter = exports.persistOverrides = exports.syncPricingIntoCostTable = exports.getCachedCatalog = exports.fetchCatalog = exports.recordTelemetryEvent = exports.resetTelemetryInstallId = exports.disableTelemetry = exports.enableTelemetry = exports.telemetryStatus = exports.licenseKeyFingerprint = exports.clearConfiguredLicenseKey = exports.writeConfiguredLicenseKey = exports.readConfiguredLicenseKey = exports.validateAndRegisterLicense = exports.validateLicenseKey = exports.AgentGuardLicenseRequiredError = exports.InMemorySpendStore = exports.InMemoryDecisionLogStore = exports.GENESIS_PREVIOUS_HASH = exports.verifyChain = exports.verifyEntry = exports.signDecision = exports.computeSignerFingerprint = exports.computeEntryHash = exports.sha256Hex = exports.canonicalJson = exports.BUILT_IN_KEYWORD_WATCHLISTS = exports.findCustomKeywordWatchlists = exports.enforcePolicyLicenseGates = exports.adjustPolicyWindowSpend = exports.buildScopeKey = exports.evaluatePolicy = exports.knownModelCosts = exports.persistCostOverrides = exports.loadPersistedCostOverrides = exports.listCostOverrides = exports.inferProvider = exports.computeCallCents = exports.clearCostOverrides = exports.setCostOverride = exports.getModelCost = void 0;
|
|
11
25
|
exports.PATENT_NOTICE = exports.agentguard = exports.AGENTGUARD_SPEND_VERSION = exports.formatBlockedTrace = exports.t = exports.resolveLocale = exports.TRANSLATIONS = exports.SUPPORTED_LOCALES = exports.DEFAULT_LOCALE = exports.defaultKey = exports.recommend = exports.withSpendGuardBedrock = exports.withSpendGuardAnthropic = exports.AgentGuardBlockedError = exports.withSpendGuard = exports.SpendGuard = exports.writeAdvisorOutputs = exports.createAdvisorSessionLogger = exports.resolveAdvisorApiKey = exports.createAdvisorClient = exports.projectedSavings = exports.buildPolicyFromProfile = exports.buildBusinessProfile = exports.AdvisorConversation = exports.AgentGuardWorkflowStateError = exports.AgentGuardDurationCapError = exports.AgentGuardChainCorruptError = exports.AgentGuardBudgetCapError = exports.validateReceiptChain = exports.computeChainHash = exports.WorkflowContext = exports.workflow = exports.verifyConsentReceipt = exports.enforceCompliance = exports.AgentGuardConsentRequiredError = exports.AgentGuardComplianceError = exports.isForeignOriginModel = exports.inferCompliance = exports.inferHosting = exports.inferModelIdentity = exports.inferProviderRoute = void 0;
|
|
@@ -133,7 +147,7 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
|
|
|
133
147
|
Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
|
|
134
148
|
Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
|
|
135
149
|
Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
|
|
136
|
-
exports.AGENTGUARD_SPEND_VERSION = '0.
|
|
150
|
+
exports.AGENTGUARD_SPEND_VERSION = '0.9.0';
|
|
137
151
|
exports.agentguard = {
|
|
138
152
|
workflow: context_1.workflow,
|
|
139
153
|
};
|
|
@@ -142,4 +156,6 @@ exports.PATENT_NOTICE = 'Protected by U.S. patent-pending technology ' +
|
|
|
142
156
|
'(App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; ' +
|
|
143
157
|
'64/071,781; 64/071,789). Additional patents pending.';
|
|
144
158
|
(0, telemetry_1.recordTelemetryEvent)('sdk_init');
|
|
159
|
+
__exportStar(require("./outcomes"), exports);
|
|
160
|
+
__exportStar(require("./verticals"), exports);
|
|
145
161
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outcomes/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./ledger"), exports);
|
|
19
|
+
__exportStar(require("./quality-gate"), exports);
|
|
20
|
+
__exportStar(require("./runtime"), exports);
|
|
21
|
+
__exportStar(require("./learning"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outcomes/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,2CAAyB;AACzB,iDAA+B;AAC/B,4CAA0B;AAC1B,6CAA2B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { OutcomeRuntimeReceipt } from './types';
|
|
2
|
+
export interface OutcomeLearningProposal {
|
|
3
|
+
vertical: string;
|
|
4
|
+
outcome: string;
|
|
5
|
+
currentPromptVersion: string;
|
|
6
|
+
proposedPromptVersion: string;
|
|
7
|
+
recommendedModel: string;
|
|
8
|
+
sampleSize: number;
|
|
9
|
+
metricDeltas: {
|
|
10
|
+
passRateDelta: number;
|
|
11
|
+
qualityScoreDelta: number;
|
|
12
|
+
costCentsDelta: number;
|
|
13
|
+
escalationRateDelta: number;
|
|
14
|
+
};
|
|
15
|
+
apply: 'manual_only';
|
|
16
|
+
}
|
|
17
|
+
export declare function proposeOutcomeImprovements(receipts: OutcomeRuntimeReceipt[]): OutcomeLearningProposal[];
|
|
18
|
+
export declare function persistLearningProposals(receipts: OutcomeRuntimeReceipt[], path?: string): OutcomeLearningProposal[];
|
|
19
|
+
//# sourceMappingURL=learning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../src/outcomes/learning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,KAAK,EAAE,aAAa,CAAC;CACtB;AAgBD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,uBAAuB,EAAE,CAkCvG;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,IAAI,SAA4D,GAC/D,uBAAuB,EAAE,CAK3B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.proposeOutcomeImprovements = proposeOutcomeImprovements;
|
|
4
|
+
exports.persistLearningProposals = persistLearningProposals;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const DATA_PLANE_KEYS = /^(prompt|completion|content|messages|input|inputs|output|outputs|text|raw|transcript)$/i;
|
|
9
|
+
function proposeOutcomeImprovements(receipts) {
|
|
10
|
+
for (const receipt of receipts)
|
|
11
|
+
assertMetadataOnly(receipt);
|
|
12
|
+
const aggregates = aggregate(receipts);
|
|
13
|
+
const groups = new Map();
|
|
14
|
+
for (const row of aggregates) {
|
|
15
|
+
const key = row.vertical + ':' + row.outcome;
|
|
16
|
+
const existing = groups.get(key) ?? [];
|
|
17
|
+
existing.push(row);
|
|
18
|
+
groups.set(key, existing);
|
|
19
|
+
}
|
|
20
|
+
const proposals = [];
|
|
21
|
+
for (const rows of groups.values()) {
|
|
22
|
+
if (rows.length < 2)
|
|
23
|
+
continue;
|
|
24
|
+
const current = rows.slice().sort((a, b) => b.count - a.count)[0];
|
|
25
|
+
const best = rows.slice().sort((a, b) => scoreAggregate(b) - scoreAggregate(a))[0];
|
|
26
|
+
if (best === current || best.count < 3)
|
|
27
|
+
continue;
|
|
28
|
+
proposals.push({
|
|
29
|
+
vertical: current.vertical,
|
|
30
|
+
outcome: current.outcome,
|
|
31
|
+
currentPromptVersion: current.promptVersion,
|
|
32
|
+
proposedPromptVersion: best.promptVersion,
|
|
33
|
+
recommendedModel: best.model,
|
|
34
|
+
sampleSize: best.count,
|
|
35
|
+
metricDeltas: {
|
|
36
|
+
passRateDelta: rate(best.pass, best.count) - rate(current.pass, current.count),
|
|
37
|
+
qualityScoreDelta: avg(best.quality, best.count) - avg(current.quality, current.count),
|
|
38
|
+
costCentsDelta: avg(best.cost, best.count) - avg(current.cost, current.count),
|
|
39
|
+
escalationRateDelta: rate(best.escalations, best.count) - rate(current.escalations, current.count),
|
|
40
|
+
},
|
|
41
|
+
apply: 'manual_only',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return proposals;
|
|
45
|
+
}
|
|
46
|
+
function persistLearningProposals(receipts, path = (0, path_1.join)((0, os_1.homedir)(), '.agentguard', 'learning-proposals.json')) {
|
|
47
|
+
const proposals = proposeOutcomeImprovements(receipts);
|
|
48
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
|
|
49
|
+
(0, fs_1.writeFileSync)(path, JSON.stringify({ generatedAt: new Date().toISOString(), proposals }, null, 2));
|
|
50
|
+
return proposals;
|
|
51
|
+
}
|
|
52
|
+
function aggregate(receipts) {
|
|
53
|
+
const map = new Map();
|
|
54
|
+
for (const receipt of receipts) {
|
|
55
|
+
const model = receipt.reviewer?.model ?? receipt.drafter.model;
|
|
56
|
+
const key = [receipt.vertical, receipt.outcome, receipt.promptVersion, model].join(':');
|
|
57
|
+
const row = map.get(key) ?? {
|
|
58
|
+
vertical: receipt.vertical,
|
|
59
|
+
outcome: receipt.outcome,
|
|
60
|
+
promptVersion: receipt.promptVersion,
|
|
61
|
+
model,
|
|
62
|
+
count: 0,
|
|
63
|
+
pass: 0,
|
|
64
|
+
quality: 0,
|
|
65
|
+
cost: 0,
|
|
66
|
+
escalations: 0,
|
|
67
|
+
};
|
|
68
|
+
row.count += 1;
|
|
69
|
+
if (receipt.pass)
|
|
70
|
+
row.pass += 1;
|
|
71
|
+
row.quality += receipt.qualityScore;
|
|
72
|
+
row.cost += receipt.totalCostCents;
|
|
73
|
+
if (receipt.triggerFired.length > 0)
|
|
74
|
+
row.escalations += 1;
|
|
75
|
+
map.set(key, row);
|
|
76
|
+
}
|
|
77
|
+
return [...map.values()];
|
|
78
|
+
}
|
|
79
|
+
function scoreAggregate(row) {
|
|
80
|
+
return rate(row.pass, row.count) * 0.5 + avg(row.quality, row.count) * 0.35 - Math.min(0.15, avg(row.cost, row.count) / 1000) - rate(row.escalations, row.count) * 0.1;
|
|
81
|
+
}
|
|
82
|
+
function rate(value, count) {
|
|
83
|
+
return count === 0 ? 0 : value / count;
|
|
84
|
+
}
|
|
85
|
+
function avg(value, count) {
|
|
86
|
+
return count === 0 ? 0 : value / count;
|
|
87
|
+
}
|
|
88
|
+
function assertMetadataOnly(value, path = 'receipt') {
|
|
89
|
+
if (value == null)
|
|
90
|
+
return;
|
|
91
|
+
if (Array.isArray(value)) {
|
|
92
|
+
value.forEach((child, index) => assertMetadataOnly(child, path + '[' + index + ']'));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (typeof value !== 'object')
|
|
96
|
+
return;
|
|
97
|
+
for (const [key, child] of Object.entries(value)) {
|
|
98
|
+
if (DATA_PLANE_KEYS.test(key)) {
|
|
99
|
+
throw new Error('Learning loop received data-plane field: ' + path + '.' + key);
|
|
100
|
+
}
|
|
101
|
+
assertMetadataOnly(child, path + '.' + key);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=learning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/outcomes/learning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SpendScope, SpendStore, SpendWindow } from '../types';
|
|
2
|
+
export interface OutcomeSpendHold {
|
|
3
|
+
holdId: string;
|
|
4
|
+
scopeKey: string;
|
|
5
|
+
window: SpendWindow;
|
|
6
|
+
heldCents: number;
|
|
7
|
+
limitCents: number;
|
|
8
|
+
before: number;
|
|
9
|
+
after: number;
|
|
10
|
+
released: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface OutcomeSpendLedgerOptions {
|
|
13
|
+
keyPrefix?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class OutcomeSpendLimitError extends Error {
|
|
16
|
+
constructor(message: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class OutcomeAtomicLedgerError extends Error {
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class OutcomeSpendLedger {
|
|
22
|
+
private readonly store;
|
|
23
|
+
private readonly keyPrefix;
|
|
24
|
+
constructor(store: SpendStore, options?: OutcomeSpendLedgerOptions);
|
|
25
|
+
authorize(args: {
|
|
26
|
+
scope: SpendScope;
|
|
27
|
+
window: SpendWindow;
|
|
28
|
+
amountCents: number;
|
|
29
|
+
limitCents: number;
|
|
30
|
+
}): Promise<boolean>;
|
|
31
|
+
hold(args: {
|
|
32
|
+
scope: SpendScope;
|
|
33
|
+
window: SpendWindow;
|
|
34
|
+
amountCents: number;
|
|
35
|
+
limitCents: number;
|
|
36
|
+
}): Promise<OutcomeSpendHold>;
|
|
37
|
+
settle(hold: OutcomeSpendHold, actualCents: number): Promise<number>;
|
|
38
|
+
refund(hold: OutcomeSpendHold): Promise<number>;
|
|
39
|
+
dynamicLowBalanceThreshold(limitCents: number): number;
|
|
40
|
+
scopeKey(scope: SpendScope): string;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/outcomes/ledger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,yBAA8B;IAIjF,SAAS,CAAC,IAAI,EAAE;QACpB,KAAK,EAAE,UAAU,CAAC;QAClB,MAAM,EAAE,WAAW,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQd,IAAI,CAAC,IAAI,EAAE;QACf,KAAK,EAAE,UAAU,CAAC;QAClB,MAAM,EAAE,WAAW,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuCvB,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWpE,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAKtD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;CAGpC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OutcomeSpendLedger = exports.OutcomeAtomicLedgerError = exports.OutcomeSpendLimitError = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const policy_1 = require("../policy");
|
|
6
|
+
class OutcomeSpendLimitError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'OutcomeSpendLimitError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.OutcomeSpendLimitError = OutcomeSpendLimitError;
|
|
13
|
+
class OutcomeAtomicLedgerError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'OutcomeAtomicLedgerError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.OutcomeAtomicLedgerError = OutcomeAtomicLedgerError;
|
|
20
|
+
class OutcomeSpendLedger {
|
|
21
|
+
store;
|
|
22
|
+
keyPrefix;
|
|
23
|
+
constructor(store, options = {}) {
|
|
24
|
+
this.store = store;
|
|
25
|
+
this.keyPrefix = options.keyPrefix ?? 'outcome:v1';
|
|
26
|
+
}
|
|
27
|
+
async authorize(args) {
|
|
28
|
+
validateCents('amountCents', args.amountCents);
|
|
29
|
+
validateCents('limitCents', args.limitCents);
|
|
30
|
+
if (args.window === 'per_call')
|
|
31
|
+
return args.amountCents <= args.limitCents;
|
|
32
|
+
const current = await this.store.getWindowSpend(this.scopeKey(args.scope), args.window);
|
|
33
|
+
return current + args.amountCents <= args.limitCents;
|
|
34
|
+
}
|
|
35
|
+
async hold(args) {
|
|
36
|
+
validateCents('amountCents', args.amountCents);
|
|
37
|
+
validateCents('limitCents', args.limitCents);
|
|
38
|
+
const scopeKey = this.scopeKey(args.scope);
|
|
39
|
+
if (args.window === 'per_call') {
|
|
40
|
+
if (args.amountCents > args.limitCents) {
|
|
41
|
+
throw new OutcomeSpendLimitError('Outcome per-call cap would be exceeded before provider dispatch');
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
holdId: (0, crypto_1.randomUUID)(),
|
|
45
|
+
scopeKey,
|
|
46
|
+
window: args.window,
|
|
47
|
+
heldCents: args.amountCents,
|
|
48
|
+
limitCents: args.limitCents,
|
|
49
|
+
before: 0,
|
|
50
|
+
after: args.amountCents,
|
|
51
|
+
released: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (!this.store.reserveWindowSpend) {
|
|
55
|
+
throw new OutcomeAtomicLedgerError('Outcome runtime requires SpendStore.reserveWindowSpend for atomic cap holds');
|
|
56
|
+
}
|
|
57
|
+
const reservation = await this.store.reserveWindowSpend(scopeKey, args.window, args.amountCents, args.limitCents);
|
|
58
|
+
if (!reservation.allowed) {
|
|
59
|
+
throw new OutcomeSpendLimitError('Outcome period cap would be exceeded before provider dispatch');
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
holdId: (0, crypto_1.randomUUID)(),
|
|
63
|
+
scopeKey,
|
|
64
|
+
window: args.window,
|
|
65
|
+
heldCents: args.amountCents,
|
|
66
|
+
limitCents: args.limitCents,
|
|
67
|
+
before: reservation.before,
|
|
68
|
+
after: reservation.after,
|
|
69
|
+
released: false,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async settle(hold, actualCents) {
|
|
73
|
+
validateCents('actualCents', actualCents);
|
|
74
|
+
if (hold.released)
|
|
75
|
+
return hold.after;
|
|
76
|
+
hold.released = true;
|
|
77
|
+
const refundCents = Math.max(0, hold.heldCents - actualCents);
|
|
78
|
+
if (hold.window === 'per_call')
|
|
79
|
+
return Math.max(0, hold.heldCents - refundCents);
|
|
80
|
+
if (!this.store.settleWindowSpend)
|
|
81
|
+
return hold.after;
|
|
82
|
+
if (refundCents === 0)
|
|
83
|
+
return hold.after;
|
|
84
|
+
return this.store.settleWindowSpend(hold.scopeKey, hold.window, -refundCents);
|
|
85
|
+
}
|
|
86
|
+
async refund(hold) {
|
|
87
|
+
if (hold.released)
|
|
88
|
+
return hold.after;
|
|
89
|
+
hold.released = true;
|
|
90
|
+
if (hold.window === 'per_call')
|
|
91
|
+
return 0;
|
|
92
|
+
if (!this.store.settleWindowSpend)
|
|
93
|
+
return hold.after;
|
|
94
|
+
return this.store.settleWindowSpend(hold.scopeKey, hold.window, -hold.heldCents);
|
|
95
|
+
}
|
|
96
|
+
dynamicLowBalanceThreshold(limitCents) {
|
|
97
|
+
validateCents('limitCents', limitCents);
|
|
98
|
+
return Math.max(1, Math.min(50, Math.ceil(limitCents * 0.1)));
|
|
99
|
+
}
|
|
100
|
+
scopeKey(scope) {
|
|
101
|
+
return this.keyPrefix + ':' + (0, policy_1.buildScopeKey)(scope);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.OutcomeSpendLedger = OutcomeSpendLedger;
|
|
105
|
+
function validateCents(name, value) {
|
|
106
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
107
|
+
throw new Error(name + ' must be a non-negative safe integer');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/outcomes/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { OutcomeQualityGateConfig, OutcomeTemplate } from './types';
|
|
2
|
+
export interface OutcomeQualityGateResult {
|
|
3
|
+
score: number;
|
|
4
|
+
riskScore: number;
|
|
5
|
+
passed: boolean;
|
|
6
|
+
issues: string[];
|
|
7
|
+
triggerFired: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function scoreOutcomeOutput(outputText: string, template: OutcomeTemplate, providerScore?: number): OutcomeQualityGateResult;
|
|
10
|
+
export declare function shouldRunReviewer(result: OutcomeQualityGateResult): boolean;
|
|
11
|
+
export declare function triageRisk(outputText: string, config?: OutcomeQualityGateConfig, vertical?: string): number;
|
|
12
|
+
//# sourceMappingURL=quality-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-gate.d.ts","sourceRoot":"","sources":["../../src/outcomes/quality-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEzE,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAgBD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,eAAe,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,wBAAwB,CA0B1B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAE3E;AAED,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,wBAA6B,EACrC,QAAQ,SAAY,GACnB,MAAM,CAOR"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scoreOutcomeOutput = scoreOutcomeOutput;
|
|
4
|
+
exports.shouldRunReviewer = shouldRunReviewer;
|
|
5
|
+
exports.triageRisk = triageRisk;
|
|
6
|
+
const DEFAULT_PASS_THRESHOLD = 0.7;
|
|
7
|
+
const DEFAULT_REVIEWER_TRIGGER = 0.55;
|
|
8
|
+
const GENERIC_RISK_TERMS = [
|
|
9
|
+
'unlimited liability',
|
|
10
|
+
'indemnification',
|
|
11
|
+
'non-compete',
|
|
12
|
+
'material weakness',
|
|
13
|
+
'coverage denied',
|
|
14
|
+
'claim denied',
|
|
15
|
+
'wire instructions',
|
|
16
|
+
'refund denied',
|
|
17
|
+
'regulatory filing',
|
|
18
|
+
];
|
|
19
|
+
function scoreOutcomeOutput(outputText, template, providerScore) {
|
|
20
|
+
const config = template.qualityGate ?? {};
|
|
21
|
+
const issues = [];
|
|
22
|
+
const text = outputText.trim();
|
|
23
|
+
let score = bounded(providerScore ?? heuristicQualityScore(text, template, issues));
|
|
24
|
+
if (text.length === 0) {
|
|
25
|
+
score = 0;
|
|
26
|
+
issues.push('empty_output');
|
|
27
|
+
}
|
|
28
|
+
const riskScore = triageRisk(text, config, template.vertical);
|
|
29
|
+
const threshold = config.passThreshold ?? DEFAULT_PASS_THRESHOLD;
|
|
30
|
+
const reviewerThreshold = config.reviewerTriggerScore ?? DEFAULT_REVIEWER_TRIGGER;
|
|
31
|
+
const triggerFired = [];
|
|
32
|
+
if (riskScore >= reviewerThreshold)
|
|
33
|
+
triggerFired.push('high_risk_classifier_score_above:' + reviewerThreshold);
|
|
34
|
+
const keywordTriggers = keywordHits(text, [...GENERIC_RISK_TERMS, ...(config.riskKeywords ?? [])]);
|
|
35
|
+
if (keywordTriggers.length)
|
|
36
|
+
triggerFired.push('keyword_watchlist:' + keywordTriggers.join(','));
|
|
37
|
+
if (score < threshold)
|
|
38
|
+
triggerFired.push('quality_score_below:' + threshold);
|
|
39
|
+
return {
|
|
40
|
+
score,
|
|
41
|
+
riskScore,
|
|
42
|
+
passed: score >= threshold,
|
|
43
|
+
issues: [...new Set(issues)],
|
|
44
|
+
triggerFired: [...new Set(triggerFired)],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function shouldRunReviewer(result) {
|
|
48
|
+
return result.triggerFired.length > 0;
|
|
49
|
+
}
|
|
50
|
+
function triageRisk(outputText, config = {}, vertical = 'general') {
|
|
51
|
+
const lower = outputText.toLowerCase();
|
|
52
|
+
const terms = [...GENERIC_RISK_TERMS, ...(config.riskKeywords ?? []), ...verticalRiskTerms(vertical)];
|
|
53
|
+
const hits = keywordHits(lower, terms).length;
|
|
54
|
+
const lengthPenalty = outputText.length > 6000 ? 0.08 : 0;
|
|
55
|
+
const disclaimerPenalty = /(legal|tax|insurance) advice/i.test(outputText) ? -0.05 : 0;
|
|
56
|
+
return bounded((hits * 0.18) + lengthPenalty + disclaimerPenalty);
|
|
57
|
+
}
|
|
58
|
+
function heuristicQualityScore(text, template, issues) {
|
|
59
|
+
let score = 0.74;
|
|
60
|
+
if (template.disclaimer && !text.toLowerCase().includes(shortDisclaimerAnchor(template.disclaimer))) {
|
|
61
|
+
issues.push('missing_disclaimer');
|
|
62
|
+
score -= 0.12;
|
|
63
|
+
}
|
|
64
|
+
if (/cite|citation|source|provenance/i.test(template.systemPrompt) && !/(source|citation|provenance|cited)/i.test(text)) {
|
|
65
|
+
issues.push('missing_source_reference');
|
|
66
|
+
score -= 0.12;
|
|
67
|
+
}
|
|
68
|
+
if (template.outputFormat.toLowerCase().includes('json')) {
|
|
69
|
+
try {
|
|
70
|
+
JSON.parse(text);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
issues.push('invalid_json_output');
|
|
74
|
+
score -= 0.2;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return bounded(score);
|
|
78
|
+
}
|
|
79
|
+
function shortDisclaimerAnchor(disclaimer) {
|
|
80
|
+
return disclaimer.toLowerCase().split('.').at(0)?.slice(0, 24) ?? '';
|
|
81
|
+
}
|
|
82
|
+
function keywordHits(text, terms) {
|
|
83
|
+
const lower = text.toLowerCase();
|
|
84
|
+
return terms.filter((term) => term && lower.includes(term.toLowerCase()));
|
|
85
|
+
}
|
|
86
|
+
function verticalRiskTerms(vertical) {
|
|
87
|
+
if (vertical === 'law')
|
|
88
|
+
return ['conflict of interest', 'privilege waived', 'statute of limitations'];
|
|
89
|
+
if (vertical === 'accounting')
|
|
90
|
+
return ['material misstatement', 'gaap departure', 'tax penalty'];
|
|
91
|
+
if (vertical === 'insurance')
|
|
92
|
+
return ['exclusion', 'endorsement', 'coverage gap'];
|
|
93
|
+
if (vertical === 'realestate' || vertical === 'real-estate')
|
|
94
|
+
return ['fair housing', 'respa', 'disclosure defect'];
|
|
95
|
+
if (vertical === 'ecommerce')
|
|
96
|
+
return ['chargeback', 'ftc', 'platform violation'];
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
function bounded(value) {
|
|
100
|
+
if (!Number.isFinite(value))
|
|
101
|
+
return 0;
|
|
102
|
+
return Math.max(0, Math.min(1, value));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=quality-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-gate.js","sourceRoot":"","sources":["../../src/outcomes/quality-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SignedDecisionLogEntry } from '../types';
|
|
2
|
+
import type { SpendGuard } from '../spend-guard';
|
|
3
|
+
import { OutcomeSpendLedger } from './ledger';
|
|
4
|
+
import { type OutcomeExecutionContext, type OutcomeModelRunner, type OutcomeReceiptStore, type OutcomeRuntimeReceipt, type OutcomeTemplate } from './types';
|
|
5
|
+
export interface ExecuteOutcomeTaskOptions {
|
|
6
|
+
guard: SpendGuard;
|
|
7
|
+
template: OutcomeTemplate;
|
|
8
|
+
inputs: Record<string, unknown>;
|
|
9
|
+
runner: OutcomeModelRunner;
|
|
10
|
+
context: OutcomeExecutionContext;
|
|
11
|
+
ledger?: OutcomeSpendLedger;
|
|
12
|
+
receiptStore?: OutcomeReceiptStore;
|
|
13
|
+
}
|
|
14
|
+
export interface ExecuteOutcomeTaskResult {
|
|
15
|
+
receipt: OutcomeRuntimeReceipt;
|
|
16
|
+
signed: SignedDecisionLogEntry | null;
|
|
17
|
+
outputText: string;
|
|
18
|
+
reviewerOutputText?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function executeOutcomeTask(options: ExecuteOutcomeTaskOptions): Promise<ExecuteOutcomeTaskResult>;
|
|
21
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/outcomes/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAiB,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAyB,MAAM,UAAU,CAAC;AAErE,OAAO,EAGL,KAAK,uBAAuB,EAG5B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACrB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAYD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA0H9G"}
|