@agentguard-run/spend 0.4.3 → 0.5.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 -1
- package/LICENSE +53 -0
- package/README.md +76 -0
- package/dist/advisor/conversation.d.ts +5 -0
- package/dist/advisor/conversation.d.ts.map +1 -1
- package/dist/advisor/conversation.js +34 -2
- package/dist/advisor/conversation.js.map +1 -1
- package/dist/advisor/output.d.ts.map +1 -1
- package/dist/advisor/output.js +9 -2
- package/dist/advisor/output.js.map +1 -1
- package/dist/advisor/system-prompt.d.ts.map +1 -1
- package/dist/advisor/system-prompt.js +6 -3
- package/dist/advisor/system-prompt.js.map +1 -1
- package/dist/cli/advisor.d.ts.map +1 -1
- package/dist/cli/advisor.js +11 -2
- package/dist/cli/advisor.js.map +1 -1
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +20 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +19 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/license.d.ts +2 -0
- package/dist/cli/license.d.ts.map +1 -0
- package/dist/cli/license.js +39 -0
- package/dist/cli/license.js.map +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +37 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/skill.d.ts +2 -0
- package/dist/cli/skill.d.ts.map +1 -0
- package/dist/cli/skill.js +33 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/cli/soft-cap.d.ts +25 -0
- package/dist/cli/soft-cap.d.ts.map +1 -0
- package/dist/cli/soft-cap.js +204 -0
- package/dist/cli/soft-cap.js.map +1 -0
- package/dist/cost-table.d.ts.map +1 -1
- package/dist/cost-table.js +2 -0
- package/dist/cost-table.js.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -3
- package/dist/index.js.map +1 -1
- package/dist/license.d.ts +44 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +278 -0
- package/dist/license.js.map +1 -0
- package/dist/policy.d.ts +15 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +95 -1
- package/dist/policy.js.map +1 -1
- package/dist/spend-guard.d.ts +10 -0
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +14 -1
- package/dist/spend-guard.js.map +1 -1
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow/chain-validator.d.ts +4 -0
- package/dist/workflow/chain-validator.d.ts.map +1 -0
- package/dist/workflow/chain-validator.js +37 -0
- package/dist/workflow/chain-validator.js.map +1 -0
- package/dist/workflow/context.d.ts +46 -0
- package/dist/workflow/context.d.ts.map +1 -0
- package/dist/workflow/context.js +360 -0
- package/dist/workflow/context.js.map +1 -0
- package/dist/workflow/errors.d.ts +43 -0
- package/dist/workflow/errors.d.ts.map +1 -0
- package/dist/workflow/errors.js +40 -0
- package/dist/workflow/errors.js.map +1 -0
- package/dist/workflow/index.d.ts +6 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +20 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/receipt.d.ts +23 -0
- package/dist/workflow/receipt.d.ts.map +1 -0
- package/dist/workflow/receipt.js +60 -0
- package/dist/workflow/receipt.js.map +1 -0
- package/dist/workflow/types.d.ts +74 -0
- package/dist/workflow/types.d.ts.map +1 -0
- package/dist/workflow/types.js +3 -0
- package/dist/workflow/types.js.map +1 -0
- package/package.json +11 -4
- package/src/advisor/conversation.ts +41 -2
- package/src/advisor/output.ts +9 -2
- package/src/advisor/system-prompt.ts +6 -3
- package/src/cli/advisor.ts +9 -2
- package/src/cli/auth.ts +19 -1
- package/src/workflow/chain-validator.ts +35 -0
- package/src/workflow/context.ts +418 -0
- package/src/workflow/errors.ts +27 -0
- package/src/workflow/index.ts +18 -0
- package/src/workflow/receipt.ts +73 -0
- package/src/workflow/types.ts +88 -0
package/dist/index.js
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
* 64/071,781; 64/071,789).
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
11
|
-
exports.PATENT_NOTICE = exports.AGENTGUARD_SPEND_VERSION = exports.formatBlockedTrace = void 0;
|
|
10
|
+
exports.AgentGuardWorkflowStateError = exports.AgentGuardDurationCapError = exports.AgentGuardChainCorruptError = exports.AgentGuardBudgetCapError = exports.validateReceiptChain = exports.computeChainHash = exports.WorkflowContext = exports.workflow = 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
|
+
exports.PATENT_NOTICE = exports.agentguard = exports.AGENTGUARD_SPEND_VERSION = exports.formatBlockedTrace = exports.t = exports.resolveLocale = exports.TRANSLATIONS = exports.SUPPORTED_LOCALES = exports.DEFAULT_LOCALE = 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 = void 0;
|
|
12
12
|
const telemetry_1 = require("./telemetry");
|
|
13
|
+
const context_1 = require("./workflow/context");
|
|
13
14
|
// Cost table
|
|
14
15
|
var cost_table_1 = require("./cost-table");
|
|
15
16
|
Object.defineProperty(exports, "getModelCost", { enumerable: true, get: function () { return cost_table_1.getModelCost; } });
|
|
@@ -26,6 +27,9 @@ var policy_1 = require("./policy");
|
|
|
26
27
|
Object.defineProperty(exports, "evaluatePolicy", { enumerable: true, get: function () { return policy_1.evaluatePolicy; } });
|
|
27
28
|
Object.defineProperty(exports, "buildScopeKey", { enumerable: true, get: function () { return policy_1.buildScopeKey; } });
|
|
28
29
|
Object.defineProperty(exports, "adjustPolicyWindowSpend", { enumerable: true, get: function () { return policy_1.adjustPolicyWindowSpend; } });
|
|
30
|
+
Object.defineProperty(exports, "enforcePolicyLicenseGates", { enumerable: true, get: function () { return policy_1.enforcePolicyLicenseGates; } });
|
|
31
|
+
Object.defineProperty(exports, "findCustomKeywordWatchlists", { enumerable: true, get: function () { return policy_1.findCustomKeywordWatchlists; } });
|
|
32
|
+
Object.defineProperty(exports, "BUILT_IN_KEYWORD_WATCHLISTS", { enumerable: true, get: function () { return policy_1.BUILT_IN_KEYWORD_WATCHLISTS; } });
|
|
29
33
|
// Decision log
|
|
30
34
|
var decision_log_1 = require("./decision-log");
|
|
31
35
|
Object.defineProperty(exports, "canonicalJson", { enumerable: true, get: function () { return decision_log_1.canonicalJson; } });
|
|
@@ -40,6 +44,15 @@ Object.defineProperty(exports, "InMemoryDecisionLogStore", { enumerable: true, g
|
|
|
40
44
|
// In-memory spend store
|
|
41
45
|
var store_memory_1 = require("./store-memory");
|
|
42
46
|
Object.defineProperty(exports, "InMemorySpendStore", { enumerable: true, get: function () { return store_memory_1.InMemorySpendStore; } });
|
|
47
|
+
// License controls
|
|
48
|
+
var license_1 = require("./license");
|
|
49
|
+
Object.defineProperty(exports, "AgentGuardLicenseRequiredError", { enumerable: true, get: function () { return license_1.AgentGuardLicenseRequiredError; } });
|
|
50
|
+
Object.defineProperty(exports, "validateLicenseKey", { enumerable: true, get: function () { return license_1.validateLicenseKey; } });
|
|
51
|
+
Object.defineProperty(exports, "validateAndRegisterLicense", { enumerable: true, get: function () { return license_1.validateAndRegisterLicense; } });
|
|
52
|
+
Object.defineProperty(exports, "readConfiguredLicenseKey", { enumerable: true, get: function () { return license_1.readConfiguredLicenseKey; } });
|
|
53
|
+
Object.defineProperty(exports, "writeConfiguredLicenseKey", { enumerable: true, get: function () { return license_1.writeConfiguredLicenseKey; } });
|
|
54
|
+
Object.defineProperty(exports, "clearConfiguredLicenseKey", { enumerable: true, get: function () { return license_1.clearConfiguredLicenseKey; } });
|
|
55
|
+
Object.defineProperty(exports, "licenseKeyFingerprint", { enumerable: true, get: function () { return license_1.licenseKeyFingerprint; } });
|
|
43
56
|
// Telemetry controls
|
|
44
57
|
var telemetry_2 = require("./telemetry");
|
|
45
58
|
Object.defineProperty(exports, "telemetryStatus", { enumerable: true, get: function () { return telemetry_2.telemetryStatus; } });
|
|
@@ -54,6 +67,18 @@ Object.defineProperty(exports, "getCachedCatalog", { enumerable: true, get: func
|
|
|
54
67
|
Object.defineProperty(exports, "syncPricingIntoCostTable", { enumerable: true, get: function () { return openrouter_catalog_1.syncPricingIntoCostTable; } });
|
|
55
68
|
Object.defineProperty(exports, "persistOverrides", { enumerable: true, get: function () { return openrouter_catalog_1.persistOverrides; } });
|
|
56
69
|
Object.defineProperty(exports, "modelCostFromOpenRouter", { enumerable: true, get: function () { return openrouter_catalog_1.modelCostFromOpenRouter; } });
|
|
70
|
+
// Workflow primitive
|
|
71
|
+
var context_2 = require("./workflow/context");
|
|
72
|
+
Object.defineProperty(exports, "workflow", { enumerable: true, get: function () { return context_2.workflow; } });
|
|
73
|
+
Object.defineProperty(exports, "WorkflowContext", { enumerable: true, get: function () { return context_2.WorkflowContext; } });
|
|
74
|
+
var chain_validator_1 = require("./workflow/chain-validator");
|
|
75
|
+
Object.defineProperty(exports, "computeChainHash", { enumerable: true, get: function () { return chain_validator_1.computeChainHash; } });
|
|
76
|
+
Object.defineProperty(exports, "validateReceiptChain", { enumerable: true, get: function () { return chain_validator_1.validateReceiptChain; } });
|
|
77
|
+
var errors_1 = require("./workflow/errors");
|
|
78
|
+
Object.defineProperty(exports, "AgentGuardBudgetCapError", { enumerable: true, get: function () { return errors_1.AgentGuardBudgetCapError; } });
|
|
79
|
+
Object.defineProperty(exports, "AgentGuardChainCorruptError", { enumerable: true, get: function () { return errors_1.AgentGuardChainCorruptError; } });
|
|
80
|
+
Object.defineProperty(exports, "AgentGuardDurationCapError", { enumerable: true, get: function () { return errors_1.AgentGuardDurationCapError; } });
|
|
81
|
+
Object.defineProperty(exports, "AgentGuardWorkflowStateError", { enumerable: true, get: function () { return errors_1.AgentGuardWorkflowStateError; } });
|
|
57
82
|
// Advisor local setup
|
|
58
83
|
var conversation_1 = require("./advisor/conversation");
|
|
59
84
|
Object.defineProperty(exports, "AdvisorConversation", { enumerable: true, get: function () { return conversation_1.AdvisorConversation; } });
|
|
@@ -83,7 +108,10 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
|
|
|
83
108
|
Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
|
|
84
109
|
Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
|
|
85
110
|
Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
|
|
86
|
-
exports.AGENTGUARD_SPEND_VERSION = '0.
|
|
111
|
+
exports.AGENTGUARD_SPEND_VERSION = '0.5.0';
|
|
112
|
+
exports.agentguard = {
|
|
113
|
+
workflow: context_1.workflow,
|
|
114
|
+
};
|
|
87
115
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
88
116
|
exports.PATENT_NOTICE = 'Protected by U.S. patent-pending technology ' +
|
|
89
117
|
'(App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; ' +
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;AAEH,2CAA8E;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentGuard(TM) Spend: local license validation helpers.
|
|
3
|
+
*
|
|
4
|
+
* License checks send only license key fingerprints, anonymous machine ids,
|
|
5
|
+
* and SDK metadata to AgentGuard endpoints. Prompts, completions, provider
|
|
6
|
+
* keys, signing keys, and policy bodies are never sent.
|
|
7
|
+
*/
|
|
8
|
+
export type AgentGuardTier = 'free' | 'solo' | 'startup' | 'growth';
|
|
9
|
+
export interface AgentGuardLicenseFeatures {
|
|
10
|
+
postureSwitching: boolean;
|
|
11
|
+
customWatchlists: boolean;
|
|
12
|
+
outcomeBuilder: boolean;
|
|
13
|
+
reviewerCascade: boolean;
|
|
14
|
+
verticalSkillPackImport: boolean;
|
|
15
|
+
auditRetentionDays: number;
|
|
16
|
+
maxActiveSeats: number;
|
|
17
|
+
}
|
|
18
|
+
export interface AgentGuardLicenseStatus {
|
|
19
|
+
valid: boolean;
|
|
20
|
+
tier: AgentGuardTier;
|
|
21
|
+
seats: number;
|
|
22
|
+
expiresAt: string | null;
|
|
23
|
+
features: AgentGuardLicenseFeatures;
|
|
24
|
+
}
|
|
25
|
+
export interface LicenseClientOptions {
|
|
26
|
+
endpointBaseUrl?: string;
|
|
27
|
+
nowMs?: number;
|
|
28
|
+
force?: boolean;
|
|
29
|
+
home?: string;
|
|
30
|
+
postJson?: (url: string, payload: Record<string, unknown>) => Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
export declare class AgentGuardLicenseRequiredError extends Error {
|
|
33
|
+
code: string;
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
36
|
+
export declare function agentguardHome(home?: string): string;
|
|
37
|
+
export declare function configPath(home?: string): string;
|
|
38
|
+
export declare function readConfiguredLicenseKey(home?: string): string | null;
|
|
39
|
+
export declare function writeConfiguredLicenseKey(licenseKey: string, home?: string): void;
|
|
40
|
+
export declare function clearConfiguredLicenseKey(home?: string): void;
|
|
41
|
+
export declare function licenseKeyFingerprint(licenseKey: string): string;
|
|
42
|
+
export declare function validateLicenseKey(licenseKey?: string | null, opts?: LicenseClientOptions): Promise<AgentGuardLicenseStatus>;
|
|
43
|
+
export declare function validateAndRegisterLicense(licenseKey?: string | null, opts?: LicenseClientOptions): Promise<AgentGuardLicenseStatus>;
|
|
44
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,yBAAyB,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChF;AAoBD,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,IAAI,SAAiC;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASrE;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAQjF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAO7D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CActI;AAED,wBAAsB,0BAA0B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmB9I"}
|
package/dist/license.js
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AgentGuard(TM) Spend: local license validation helpers.
|
|
4
|
+
*
|
|
5
|
+
* License checks send only license key fingerprints, anonymous machine ids,
|
|
6
|
+
* and SDK metadata to AgentGuard endpoints. Prompts, completions, provider
|
|
7
|
+
* keys, signing keys, and policy bodies are never sent.
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.AgentGuardLicenseRequiredError = void 0;
|
|
44
|
+
exports.agentguardHome = agentguardHome;
|
|
45
|
+
exports.configPath = configPath;
|
|
46
|
+
exports.readConfiguredLicenseKey = readConfiguredLicenseKey;
|
|
47
|
+
exports.writeConfiguredLicenseKey = writeConfiguredLicenseKey;
|
|
48
|
+
exports.clearConfiguredLicenseKey = clearConfiguredLicenseKey;
|
|
49
|
+
exports.licenseKeyFingerprint = licenseKeyFingerprint;
|
|
50
|
+
exports.validateLicenseKey = validateLicenseKey;
|
|
51
|
+
exports.validateAndRegisterLicense = validateAndRegisterLicense;
|
|
52
|
+
const crypto = __importStar(require("crypto"));
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const http = __importStar(require("http"));
|
|
55
|
+
const https = __importStar(require("https"));
|
|
56
|
+
const os = __importStar(require("os"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const DEFAULT_ENDPOINT = 'https://agentguard.run';
|
|
59
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
60
|
+
const FREE_STATUS = {
|
|
61
|
+
valid: true,
|
|
62
|
+
tier: 'free',
|
|
63
|
+
seats: 1,
|
|
64
|
+
expiresAt: null,
|
|
65
|
+
features: {
|
|
66
|
+
postureSwitching: false,
|
|
67
|
+
customWatchlists: false,
|
|
68
|
+
outcomeBuilder: false,
|
|
69
|
+
reviewerCascade: false,
|
|
70
|
+
verticalSkillPackImport: false,
|
|
71
|
+
auditRetentionDays: 7,
|
|
72
|
+
maxActiveSeats: 1,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
class AgentGuardLicenseRequiredError extends Error {
|
|
76
|
+
code = 'AGENTGUARD_LICENSE_REQUIRED';
|
|
77
|
+
constructor(message) {
|
|
78
|
+
super(message);
|
|
79
|
+
this.name = 'AgentGuardLicenseRequiredError';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.AgentGuardLicenseRequiredError = AgentGuardLicenseRequiredError;
|
|
83
|
+
function agentguardHome(home) {
|
|
84
|
+
return home || process.env.AGENTGUARD_HOME || path.join(os.homedir(), '.agentguard');
|
|
85
|
+
}
|
|
86
|
+
function configPath(home) {
|
|
87
|
+
return path.join(agentguardHome(home), 'config.json');
|
|
88
|
+
}
|
|
89
|
+
function readConfiguredLicenseKey(home) {
|
|
90
|
+
if (process.env.AGENTGUARD_LICENSE_KEY)
|
|
91
|
+
return process.env.AGENTGUARD_LICENSE_KEY.trim();
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(fs.readFileSync(configPath(home), 'utf8'));
|
|
94
|
+
const key = parsed.licenseKey || parsed.license_key;
|
|
95
|
+
return key ? String(key).trim() : null;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function writeConfiguredLicenseKey(licenseKey, home) {
|
|
102
|
+
const file = configPath(home);
|
|
103
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
104
|
+
let parsed = {};
|
|
105
|
+
try {
|
|
106
|
+
parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
107
|
+
}
|
|
108
|
+
catch { }
|
|
109
|
+
parsed.licenseKey = licenseKey.trim();
|
|
110
|
+
fs.writeFileSync(file, JSON.stringify(parsed, null, 2) + '\n', { mode: 0o600 });
|
|
111
|
+
try {
|
|
112
|
+
fs.chmodSync(file, 0o600);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function clearConfiguredLicenseKey(home) {
|
|
119
|
+
const file = configPath(home);
|
|
120
|
+
let parsed = {};
|
|
121
|
+
try {
|
|
122
|
+
parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
delete parsed.licenseKey;
|
|
128
|
+
delete parsed.license_key;
|
|
129
|
+
fs.writeFileSync(file, JSON.stringify(parsed, null, 2) + '\n', { mode: 0o600 });
|
|
130
|
+
}
|
|
131
|
+
function licenseKeyFingerprint(licenseKey) {
|
|
132
|
+
return crypto.createHash('sha256').update(licenseKey).digest('hex').slice(0, 16);
|
|
133
|
+
}
|
|
134
|
+
async function validateLicenseKey(licenseKey, opts = {}) {
|
|
135
|
+
const key = licenseKey?.trim() || null;
|
|
136
|
+
if (!key)
|
|
137
|
+
return { ...FREE_STATUS, features: { ...FREE_STATUS.features } };
|
|
138
|
+
const now = opts.nowMs ?? Date.now();
|
|
139
|
+
const cache = licenseCachePath(key, opts.home);
|
|
140
|
+
if (!opts.force) {
|
|
141
|
+
const cached = readCachedStatus(cache, now);
|
|
142
|
+
if (cached)
|
|
143
|
+
return cached;
|
|
144
|
+
}
|
|
145
|
+
const base = (opts.endpointBaseUrl || process.env.AGENTGUARD_LICENSE_ENDPOINT || DEFAULT_ENDPOINT).replace(/\/$/, '');
|
|
146
|
+
const raw = await (opts.postJson ?? postJson)(`${base}/api/license/validate`, { license_key: key });
|
|
147
|
+
const status = normalizeStatus(raw);
|
|
148
|
+
writeCachedStatus(cache, status, now);
|
|
149
|
+
return status;
|
|
150
|
+
}
|
|
151
|
+
async function validateAndRegisterLicense(licenseKey, opts = {}) {
|
|
152
|
+
const key = licenseKey?.trim() || readConfiguredLicenseKey(opts.home);
|
|
153
|
+
const status = await validateLicenseKey(key, opts);
|
|
154
|
+
const processId = processUuid(opts.home);
|
|
155
|
+
const machineFingerprint = anonymousMachineFingerprint(opts.home);
|
|
156
|
+
const base = (opts.endpointBaseUrl || process.env.AGENTGUARD_LICENSE_ENDPOINT || DEFAULT_ENDPOINT).replace(/\/$/, '');
|
|
157
|
+
try {
|
|
158
|
+
const seat = await (opts.postJson ?? postJson)(`${base}/api/license/seats`, {
|
|
159
|
+
license_key: key || undefined,
|
|
160
|
+
machine_fingerprint: machineFingerprint,
|
|
161
|
+
process_id: processId,
|
|
162
|
+
});
|
|
163
|
+
if (seat && seat.ok === false) {
|
|
164
|
+
throw new AgentGuardLicenseRequiredError(`Active SDK process limit exceeded for this license. Active seats: ${seat.activeSeats ?? 'unknown'}. Limit: ${seat.maxActiveSeats ?? status.features.maxActiveSeats}. Upgrade at https://agentguard.run/pricing or activate a team license with: agentguard auth license-key <KEY>`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (err instanceof AgentGuardLicenseRequiredError)
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
return status;
|
|
172
|
+
}
|
|
173
|
+
function licenseCachePath(licenseKey, home) {
|
|
174
|
+
return path.join(agentguardHome(home), `license-${crypto.createHash('sha256').update(licenseKey).digest('hex')}.json`);
|
|
175
|
+
}
|
|
176
|
+
function readCachedStatus(file, now) {
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
179
|
+
if (!parsed.fetchedAt || now - parsed.fetchedAt > DAY_MS)
|
|
180
|
+
return null;
|
|
181
|
+
return normalizeStatus(parsed.status);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function writeCachedStatus(file, status, now) {
|
|
188
|
+
try {
|
|
189
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
190
|
+
fs.writeFileSync(file, JSON.stringify({ fetchedAt: now, status }, null, 2) + '\n', { mode: 0o600 });
|
|
191
|
+
fs.chmodSync(file, 0o600);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function processUuid(home) {
|
|
198
|
+
const file = path.join(agentguardHome(home), 'process-id');
|
|
199
|
+
try {
|
|
200
|
+
const existing = fs.readFileSync(file, 'utf8').trim();
|
|
201
|
+
if (existing)
|
|
202
|
+
return existing;
|
|
203
|
+
}
|
|
204
|
+
catch { }
|
|
205
|
+
const id = crypto.randomUUID();
|
|
206
|
+
try {
|
|
207
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
208
|
+
fs.writeFileSync(file, id + '\n', { mode: 0o600 });
|
|
209
|
+
fs.chmodSync(file, 0o600);
|
|
210
|
+
}
|
|
211
|
+
catch { }
|
|
212
|
+
return id;
|
|
213
|
+
}
|
|
214
|
+
function anonymousMachineFingerprint(home) {
|
|
215
|
+
const file = path.join(agentguardHome(home), 'install.json');
|
|
216
|
+
try {
|
|
217
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
218
|
+
if (parsed.anonymous_install_id)
|
|
219
|
+
return crypto.createHash('sha256').update(parsed.anonymous_install_id).digest('hex');
|
|
220
|
+
}
|
|
221
|
+
catch { }
|
|
222
|
+
const seed = `${os.platform()}:${os.arch()}:${os.homedir()}:${os.hostname()}`;
|
|
223
|
+
return crypto.createHash('sha256').update(seed).digest('hex');
|
|
224
|
+
}
|
|
225
|
+
function normalizeStatus(raw) {
|
|
226
|
+
const obj = raw && typeof raw === 'object' ? raw : {};
|
|
227
|
+
const features = obj.features && typeof obj.features === 'object' ? obj.features : {};
|
|
228
|
+
return {
|
|
229
|
+
valid: obj.valid === true,
|
|
230
|
+
tier: normalizeTier(obj.tier),
|
|
231
|
+
seats: numberOr(obj.seats, normalizeTier(obj.tier) === 'growth' ? 50 : normalizeTier(obj.tier) === 'startup' ? 5 : 1),
|
|
232
|
+
expiresAt: typeof obj.expiresAt === 'string' ? obj.expiresAt : null,
|
|
233
|
+
features: {
|
|
234
|
+
postureSwitching: features.postureSwitching === true,
|
|
235
|
+
customWatchlists: features.customWatchlists === true,
|
|
236
|
+
outcomeBuilder: features.outcomeBuilder === true,
|
|
237
|
+
reviewerCascade: features.reviewerCascade === true,
|
|
238
|
+
verticalSkillPackImport: features.verticalSkillPackImport === true,
|
|
239
|
+
auditRetentionDays: numberOr(features.auditRetentionDays, 7),
|
|
240
|
+
maxActiveSeats: numberOr(features.maxActiveSeats, 1),
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function normalizeTier(value) {
|
|
245
|
+
return value === 'solo' || value === 'startup' || value === 'growth' ? value : 'free';
|
|
246
|
+
}
|
|
247
|
+
function numberOr(value, fallback) {
|
|
248
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : fallback;
|
|
249
|
+
}
|
|
250
|
+
function postJson(url, payload) {
|
|
251
|
+
void payload;
|
|
252
|
+
if (url.startsWith('mock://'))
|
|
253
|
+
return Promise.resolve({ ...FREE_STATUS, features: { ...FREE_STATUS.features } });
|
|
254
|
+
return new Promise((resolve, reject) => {
|
|
255
|
+
const parsed = new URL(url);
|
|
256
|
+
const client = parsed.protocol === 'http:' ? http : https;
|
|
257
|
+
const body = JSON.stringify(payload);
|
|
258
|
+
const req = client.request({ method: 'POST', hostname: parsed.hostname, port: parsed.port, path: parsed.pathname + parsed.search, headers: { 'content-type': 'application/json', 'content-length': Buffer.byteLength(body) }, timeout: 5000 }, (res) => {
|
|
259
|
+
const chunks = [];
|
|
260
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
261
|
+
res.on('end', () => {
|
|
262
|
+
const text = Buffer.concat(chunks).toString('utf8');
|
|
263
|
+
if ((res.statusCode ?? 0) >= 400)
|
|
264
|
+
return reject(new Error(`license endpoint failed: ${res.statusCode} ${text.slice(0, 160)}`));
|
|
265
|
+
try {
|
|
266
|
+
resolve(text ? JSON.parse(text) : {});
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
resolve({});
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
req.on('error', reject);
|
|
274
|
+
req.on('timeout', () => req.destroy(new Error('license endpoint timed out')));
|
|
275
|
+
req.end(body);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
package/dist/policy.d.ts
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
10
10
|
* 64/071,781; 64/071,789).
|
|
11
11
|
*/
|
|
12
|
-
import type { SpendPolicy, CallContext, SpendDecision, SpendStore, SpendScope, SpendAction } from './types';
|
|
12
|
+
import type { SpendPolicy, CallContext, SpendDecision, SpendStore, SpendScope, SpendAction, ReviewerCascadeOutcome, ReviewerCascadeReceipt } from './types';
|
|
13
|
+
import { type AgentGuardLicenseStatus } from './license';
|
|
13
14
|
/**
|
|
14
15
|
* Build a collision-resistant storage key from a SpendScope. The hash is over
|
|
15
16
|
* canonical JSON, so attacker-controlled separators in tenant/user IDs cannot
|
|
@@ -21,6 +22,19 @@ export declare function buildScopeKey(scope: SpendScope): string;
|
|
|
21
22
|
* Empty fields in the policy scope are wildcards.
|
|
22
23
|
*/
|
|
23
24
|
declare function policyMatchesCall(policyScope: SpendScope, callScope: SpendScope): boolean;
|
|
25
|
+
export interface ReviewerCascadeInput {
|
|
26
|
+
drafterConfidence?: number;
|
|
27
|
+
outputText?: string;
|
|
28
|
+
highRiskClassifierScore?: number;
|
|
29
|
+
keywordWatchlist?: string[];
|
|
30
|
+
reviewerVerdict?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function getReviewerCascadeOutcome(policy: SpendPolicy, outcomeName: string): ReviewerCascadeOutcome | null;
|
|
33
|
+
export declare function evaluateReviewerCascadeOutcome(outcomeName: string, outcome: ReviewerCascadeOutcome, input?: ReviewerCascadeInput): ReviewerCascadeReceipt;
|
|
34
|
+
export declare function evaluateReviewerTriggers(triggers: unknown[], input?: ReviewerCascadeInput): string[];
|
|
35
|
+
export declare const BUILT_IN_KEYWORD_WATCHLISTS: Set<string>;
|
|
36
|
+
export declare function enforcePolicyLicenseGates(policy: SpendPolicy, license: AgentGuardLicenseStatus): void;
|
|
37
|
+
export declare function findCustomKeywordWatchlists(policy: SpendPolicy): string[];
|
|
24
38
|
declare function mostRestrictive(a: SpendAction, b: SpendAction): SpendAction;
|
|
25
39
|
export declare function evaluatePolicy(policy: SpendPolicy, call: CallContext, store: SpendStore): Promise<SpendDecision>;
|
|
26
40
|
export declare function adjustPolicyWindowSpend(policy: SpendPolicy, store: SpendStore, deltaCents: number): Promise<void>;
|
package/dist/policy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EAEV,UAAU,EAEV,WAAW,
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EAEV,UAAU,EAEV,WAAW,EACX,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAkC,KAAK,uBAAuB,EAAE,MAAM,WAAW,CAAC;AA6BzF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEvD;AAmBD;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAQlF;AAID,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAGjH;AAED,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,sBAAsB,EAC/B,KAAK,GAAE,oBAAyB,GAC/B,sBAAsB,CAUxB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,GAAE,oBAAyB,GAAG,MAAM,EAAE,CAoBxG;AAED,eAAO,MAAM,2BAA2B,aAMtC,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAWrG;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAIzE;AAkCD,iBAAS,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CAEpE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,aAAa,CAAC,CA8HxB;AAsJD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AA2CD,iBAAS,0BAA0B,CACjC,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,EACvD,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,GACvD,OAAO,CAET;AA6BD,eAAO,MAAM,QAAQ;;;;CAAqE,CAAC"}
|
package/dist/policy.js
CHANGED
|
@@ -11,13 +11,19 @@
|
|
|
11
11
|
* 64/071,781; 64/071,789).
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports._testing = void 0;
|
|
14
|
+
exports._testing = exports.BUILT_IN_KEYWORD_WATCHLISTS = void 0;
|
|
15
15
|
exports.buildScopeKey = buildScopeKey;
|
|
16
|
+
exports.getReviewerCascadeOutcome = getReviewerCascadeOutcome;
|
|
17
|
+
exports.evaluateReviewerCascadeOutcome = evaluateReviewerCascadeOutcome;
|
|
18
|
+
exports.evaluateReviewerTriggers = evaluateReviewerTriggers;
|
|
19
|
+
exports.enforcePolicyLicenseGates = enforcePolicyLicenseGates;
|
|
20
|
+
exports.findCustomKeywordWatchlists = findCustomKeywordWatchlists;
|
|
16
21
|
exports.evaluatePolicy = evaluatePolicy;
|
|
17
22
|
exports.adjustPolicyWindowSpend = adjustPolicyWindowSpend;
|
|
18
23
|
const crypto_1 = require("crypto");
|
|
19
24
|
const cost_table_1 = require("./cost-table");
|
|
20
25
|
const decision_log_1 = require("./decision-log");
|
|
26
|
+
const license_1 = require("./license");
|
|
21
27
|
/**
|
|
22
28
|
* Build a collision-resistant storage key from a SpendScope. The hash is over
|
|
23
29
|
* canonical JSON, so attacker-controlled separators in tenant/user IDs cannot
|
|
@@ -65,6 +71,94 @@ function policyMatchesCall(policyScope, callScope) {
|
|
|
65
71
|
return false;
|
|
66
72
|
return true;
|
|
67
73
|
}
|
|
74
|
+
function getReviewerCascadeOutcome(policy, outcomeName) {
|
|
75
|
+
const outcomes = policy.outcomes;
|
|
76
|
+
return outcomes?.[outcomeName] ?? null;
|
|
77
|
+
}
|
|
78
|
+
function evaluateReviewerCascadeOutcome(outcomeName, outcome, input = {}) {
|
|
79
|
+
const triggerFired = evaluateReviewerTriggers(outcome.reviewer?.trigger ?? [], input);
|
|
80
|
+
const reviewerRuns = Boolean(outcome.reviewer && triggerFired.length > 0);
|
|
81
|
+
return {
|
|
82
|
+
outcome: outcomeName,
|
|
83
|
+
drafter: outcome.drafter,
|
|
84
|
+
reviewer: reviewerRuns && outcome.reviewer ? { model: outcome.reviewer.model, maxCostCents: outcome.reviewer.maxCostCents } : null,
|
|
85
|
+
triggerFired,
|
|
86
|
+
reviewerVerdict: reviewerRuns ? input.reviewerVerdict ?? 'review_required' : 'drafter_only',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function evaluateReviewerTriggers(triggers, input = {}) {
|
|
90
|
+
const fired = [];
|
|
91
|
+
const output = (input.outputText ?? '').toLowerCase();
|
|
92
|
+
for (const trigger of triggers) {
|
|
93
|
+
if (!trigger || typeof trigger !== 'object')
|
|
94
|
+
continue;
|
|
95
|
+
const t = trigger;
|
|
96
|
+
if (typeof t.drafter_confidence_below === 'number' && typeof input.drafterConfidence === 'number' && input.drafterConfidence < t.drafter_confidence_below) {
|
|
97
|
+
fired.push(`drafter_confidence_below:${t.drafter_confidence_below}`);
|
|
98
|
+
}
|
|
99
|
+
if (Array.isArray(t.output_contains_any) && t.output_contains_any.some((term) => typeof term === 'string' && output.includes(term.toLowerCase()))) {
|
|
100
|
+
fired.push('output_contains_any');
|
|
101
|
+
}
|
|
102
|
+
if (typeof t.high_risk_classifier_score_above === 'number' && typeof input.highRiskClassifierScore === 'number' && input.highRiskClassifierScore > t.high_risk_classifier_score_above) {
|
|
103
|
+
fired.push(`high_risk_classifier_score_above:${t.high_risk_classifier_score_above}`);
|
|
104
|
+
}
|
|
105
|
+
if (typeof t.keyword_watchlist === 'string' && (input.keywordWatchlist ?? []).some((term) => output.includes(term.toLowerCase()))) {
|
|
106
|
+
fired.push(`keyword_watchlist:${t.keyword_watchlist}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return [...new Set(fired)];
|
|
110
|
+
}
|
|
111
|
+
exports.BUILT_IN_KEYWORD_WATCHLISTS = new Set([
|
|
112
|
+
'law-firm-defaults',
|
|
113
|
+
'cpa-defaults',
|
|
114
|
+
'ecommerce-defaults',
|
|
115
|
+
'real-estate-defaults',
|
|
116
|
+
'insurance-defaults',
|
|
117
|
+
]);
|
|
118
|
+
function enforcePolicyLicenseGates(policy, license) {
|
|
119
|
+
const posture = policyPosture(policy);
|
|
120
|
+
if (posture && posture !== 'standard' && !license.features.postureSwitching) {
|
|
121
|
+
throw new license_1.AgentGuardLicenseRequiredError(`Posture switching requires a Solo license. Get one at https://agentguard.run/pricing or via Visa CLI:
|
|
122
|
+
visa-cli buy https://agentguard.run/api/x402/license?tier=solo
|
|
123
|
+
Then activate with: agentguard auth license-key <KEY>`);
|
|
124
|
+
}
|
|
125
|
+
const custom = findCustomKeywordWatchlists(policy);
|
|
126
|
+
if (custom.length > 0 && !license.features.customWatchlists) {
|
|
127
|
+
throw new license_1.AgentGuardLicenseRequiredError(`Custom keyword watchlists require a Solo license. Built-in watchlists remain available on the free tier. Activate with: agentguard auth license-key <KEY>`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function findCustomKeywordWatchlists(policy) {
|
|
131
|
+
const found = new Set();
|
|
132
|
+
scanForKeywordWatchlists(policy, found);
|
|
133
|
+
return [...found].filter((name) => !exports.BUILT_IN_KEYWORD_WATCHLISTS.has(name));
|
|
134
|
+
}
|
|
135
|
+
function policyPosture(policy) {
|
|
136
|
+
const anyPolicy = policy;
|
|
137
|
+
const posture = anyPolicy.governancePosture?.posture || anyPolicy.posture;
|
|
138
|
+
return typeof posture === 'string' ? posture.toLowerCase() : null;
|
|
139
|
+
}
|
|
140
|
+
function scanForKeywordWatchlists(value, found) {
|
|
141
|
+
if (!value)
|
|
142
|
+
return;
|
|
143
|
+
if (typeof value === 'string') {
|
|
144
|
+
const match = value.match(/keyword_watchlist\s*:\s*([A-Za-z0-9_-]+)/);
|
|
145
|
+
if (match?.[1])
|
|
146
|
+
found.add(match[1]);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (Array.isArray(value)) {
|
|
150
|
+
for (const item of value)
|
|
151
|
+
scanForKeywordWatchlists(item, found);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (typeof value === 'object') {
|
|
155
|
+
for (const [key, child] of Object.entries(value)) {
|
|
156
|
+
if (key === 'keyword_watchlist' && typeof child === 'string')
|
|
157
|
+
found.add(child);
|
|
158
|
+
scanForKeywordWatchlists(child, found);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
68
162
|
const ACTION_RANK = {
|
|
69
163
|
block: 3,
|
|
70
164
|
downgrade: 2,
|