@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.
Files changed (57) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +17 -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 +328 -0
  25. package/dist/outcomes/runtime.js.map +1 -0
  26. package/dist/outcomes/types.d.ts +156 -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/router.d.ts +8 -1
  31. package/dist/router.d.ts.map +1 -1
  32. package/dist/router.js +932 -229
  33. package/dist/router.js.map +1 -1
  34. package/dist/spend-guard.d.ts +4 -0
  35. package/dist/spend-guard.d.ts.map +1 -1
  36. package/dist/spend-guard.js +53 -0
  37. package/dist/spend-guard.js.map +1 -1
  38. package/dist/types.d.ts +3 -1
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/verticals/catalogs.d.ts +62 -0
  41. package/dist/verticals/catalogs.d.ts.map +1 -0
  42. package/dist/verticals/catalogs.js +3936 -0
  43. package/dist/verticals/catalogs.js.map +1 -0
  44. package/dist/verticals/index.d.ts +2 -0
  45. package/dist/verticals/index.d.ts.map +1 -0
  46. package/dist/verticals/index.js +18 -0
  47. package/dist/verticals/index.js.map +1 -0
  48. package/package.json +14 -2
  49. package/src/outcomes/index.ts +5 -0
  50. package/src/outcomes/learning.ts +133 -0
  51. package/src/outcomes/ledger.ts +131 -0
  52. package/src/outcomes/quality-gate.ts +116 -0
  53. package/src/outcomes/runtime.ts +396 -0
  54. package/src/outcomes/types.ts +176 -0
  55. package/src/router.ts +938 -227
  56. package/src/verticals/catalogs.ts +3967 -0
  57. 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.7.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
@@ -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.7.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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;AAEH,2CAA8E;AAC9E,gDAA6D;AAmB7D,aAAa;AACb,2CAWsB;AAVpB,0GAAA,YAAY,OAAA;AACZ,6GAAA,eAAe,OAAA;AACf,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AACb,+GAAA,iBAAiB,OAAA;AACjB,wHAAA,0BAA0B,OAAA;AAC1B,kHAAA,oBAAoB,OAAA;AACpB,6GAAA,eAAe,OAAA;AAIjB,gBAAgB;AAChB,mCAAuK;AAA9J,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,iHAAA,uBAAuB,OAAA;AAAE,mHAAA,yBAAyB,OAAA;AAAE,qHAAA,2BAA2B,OAAA;AAAE,qHAAA,2BAA2B,OAAA;AAEpJ,eAAe;AACf,+CAUwB;AATtB,6GAAA,aAAa,OAAA;AACb,yGAAA,SAAS,OAAA;AACT,gHAAA,gBAAgB,OAAA;AAChB,wHAAA,wBAAwB,OAAA;AACxB,4GAAA,YAAY,OAAA;AACZ,2GAAA,WAAW,OAAA;AACX,2GAAA,WAAW,OAAA;AACX,qHAAA,qBAAqB,OAAA;AACrB,wHAAA,wBAAwB,OAAA;AAG1B,wBAAwB;AACxB,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAE3B,mBAAmB;AACnB,qCAWmB;AAVjB,yHAAA,8BAA8B,OAAA;AAC9B,6GAAA,kBAAkB,OAAA;AAClB,qHAAA,0BAA0B,OAAA;AAC1B,mHAAA,wBAAwB,OAAA;AACxB,oHAAA,yBAAyB,OAAA;AACzB,oHAAA,yBAAyB,OAAA;AACzB,gHAAA,qBAAqB,OAAA;AAMvB,qBAAqB;AACrB,yCAOqB;AANnB,4GAAA,eAAe,OAAA;AACf,4GAAA,eAAe,OAAA;AACf,6GAAA,gBAAgB,OAAA;AAChB,oHAAA,uBAAuB,OAAA;AACvB,iHAAA,oBAAoB,OAAA;AAItB,qBAAqB;AACrB,2DAS8B;AAR5B,kHAAA,YAAY,OAAA;AACZ,sHAAA,gBAAgB,OAAA;AAChB,8HAAA,wBAAwB,OAAA;AACxB,sHAAA,gBAAgB,OAAA;AAChB,6HAAA,uBAAuB,OAAA;AAMzB,oDAMgC;AAL9B,sHAAA,yBAAyB,OAAA;AACzB,2HAAA,8BAA8B,OAAA;AAC9B,6GAAA,gBAAgB,OAAA;AAoBlB,4CAAuF;AAA9E,yGAAA,eAAe,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAC3D,sDAAuG;AAA9F,+GAAA,iBAAiB,OAAA;AAC1B,oEAAgK;AAAvJ,sHAAA,iBAAiB,OAAA;AAAE,uHAAA,kBAAkB,OAAA;AAAE,uHAAA,kBAAkB,OAAA;AAAE,iHAAA,YAAY,OAAA;AAAE,oHAAA,eAAe,OAAA;AAAE,yHAAA,oBAAoB,OAAA;AACvH,6CAA+J;AAAtJ,oHAAA,yBAAyB,OAAA;AAAE,yHAAA,8BAA8B,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAAE,+GAAA,oBAAoB,OAAA;AAE3G,qBAAqB;AACrB,8CAA+D;AAAtD,mGAAA,QAAQ,OAAA;AAAE,0GAAA,eAAe,OAAA;AAClC,8DAAoF;AAA3E,mHAAA,gBAAgB,OAAA;AAAE,uHAAA,oBAAoB,OAAA;AAC/C,4CAK2B;AAJzB,kHAAA,wBAAwB,OAAA;AACxB,qHAAA,2BAA2B,OAAA;AAC3B,oHAAA,0BAA0B,OAAA;AAC1B,sHAAA,4BAA4B,OAAA;AAY9B,sBAAsB;AACtB,uDAOgC;AAN9B,mHAAA,mBAAmB,OAAA;AACnB,oHAAA,oBAAoB,OAAA;AACpB,sHAAA,sBAAsB,OAAA;AACtB,gHAAA,gBAAgB,OAAA;AAIlB,mDAA2H;AAAlH,iHAAA,mBAAmB,OAAA;AAAE,kHAAA,oBAAoB,OAAA;AAClD,2CAAwG;AAA/F,oHAAA,0BAA0B,OAAA;AAAE,6GAAA,mBAAmB,OAAA;AAExD,eAAe;AACf,6CAQuB;AAPrB,yGAAA,UAAU,OAAA;AACV,6GAAA,cAAc,OAAA;AACd,qHAAA,sBAAsB,OAAA;AAOxB,kDAA6F;AAApF,oHAAA,uBAAuB,OAAA;AAChC,8CAAuF;AAA9E,gHAAA,qBAAqB,OAAA;AAC9B,mCAAuG;AAA9F,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAE9B,sCAAsC;AACtC,+BASgB;AARd,sGAAA,cAAc,OAAA;AACd,yGAAA,iBAAiB,OAAA;AACjB,oGAAA,YAAY,OAAA;AAEZ,qGAAA,aAAa,OAAA;AACb,yFAAA,CAAC,OAAA;AACD,0GAAA,kBAAkB,OAAA;AAIP,QAAA,wBAAwB,GAAG,OAAO,CAAC;AAGnC,QAAA,UAAU,GAAG;IACxB,QAAQ,EAAE,kBAAW;CACtB,CAAC;AAEF,2DAA2D;AAC9C,QAAA,aAAa,GACxB,8CAA8C;IAC9C,6DAA6D;IAC7D,sDAAsD,CAAC;AACzD,IAAA,gCAAuB,EAAC,UAAU,CAAC,CAAC;AAEpC,6CAA2B;AAC3B,8CAA4B"}
@@ -0,0 +1,6 @@
1
+ export * from './types';
2
+ export * from './ledger';
3
+ export * from './quality-gate';
4
+ export * from './runtime';
5
+ export * from './learning';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}