@agentguard-run/spend 0.13.1 → 0.13.2
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 +6 -0
- package/dist/frameworks/claude-code.d.ts +32 -0
- package/dist/frameworks/claude-code.d.ts.map +1 -0
- package/dist/frameworks/claude-code.js +75 -0
- package/dist/frameworks/claude-code.js.map +1 -0
- package/dist/frameworks/common.d.ts +51 -0
- package/dist/frameworks/common.d.ts.map +1 -0
- package/dist/frameworks/common.js +168 -0
- package/dist/frameworks/common.js.map +1 -0
- package/dist/frameworks/hermes.d.ts +34 -0
- package/dist/frameworks/hermes.d.ts.map +1 -0
- package/dist/frameworks/hermes.js +50 -0
- package/dist/frameworks/hermes.js.map +1 -0
- package/dist/frameworks/index.d.ts +6 -0
- package/dist/frameworks/index.d.ts.map +1 -0
- package/dist/frameworks/index.js +22 -0
- package/dist/frameworks/index.js.map +1 -0
- package/dist/frameworks/openrouter.d.ts +19 -0
- package/dist/frameworks/openrouter.d.ts.map +1 -0
- package/dist/frameworks/openrouter.js +85 -0
- package/dist/frameworks/openrouter.js.map +1 -0
- package/dist/frameworks/vercel-ai.d.ts +27 -0
- package/dist/frameworks/vercel-ai.d.ts.map +1 -0
- package/dist/frameworks/vercel-ai.js +96 -0
- package/dist/frameworks/vercel-ai.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +33 -3
- package/src/frameworks/README.md +44 -0
- package/src/frameworks/claude-code.ts +108 -0
- package/src/frameworks/common.ts +208 -0
- package/src/frameworks/hermes.ts +83 -0
- package/src/frameworks/index.ts +5 -0
- package/src/frameworks/openrouter.ts +90 -0
- package/src/frameworks/vercel-ai.ts +118 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## 0.13.2
|
|
2
|
+
|
|
3
|
+
- Added thin framework adapters for Vercel AI SDK middleware, Claude Code hooks, Hermes hooks, and OpenRouter OpenAI-compatible clients.
|
|
4
|
+
- Kept all adapter receipts metadata-only: prompts, completions, provider keys, signing keys, and policy details stay in the customer runtime.
|
|
5
|
+
- Added TS and Python parity tests for pre-dispatch enforcement, post-dispatch signed receipts, and data-plane redaction.
|
|
6
|
+
|
|
1
7
|
## 0.13.1
|
|
2
8
|
|
|
3
9
|
- Hardened `builderCode` receipt verification so legacy-hash fallback is unavailable when attribution metadata is present.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SpendGuard } from '../spend-guard';
|
|
2
|
+
import { type FrameworkAdapterOptions } from './common';
|
|
3
|
+
export interface ClaudeCodeHookInput {
|
|
4
|
+
session_id?: string;
|
|
5
|
+
transcript_path?: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
hook_event_name?: string;
|
|
8
|
+
tool_name?: string;
|
|
9
|
+
tool_input?: Record<string, unknown>;
|
|
10
|
+
tool_response?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface ClaudeCodeHookOutput {
|
|
13
|
+
continue?: boolean;
|
|
14
|
+
suppressOutput?: boolean;
|
|
15
|
+
systemMessage?: string;
|
|
16
|
+
hookSpecificOutput?: {
|
|
17
|
+
hookEventName: 'PreToolUse' | 'PostToolUse';
|
|
18
|
+
permissionDecision?: 'allow' | 'deny' | 'ask';
|
|
19
|
+
permissionDecisionReason?: string;
|
|
20
|
+
additionalContext?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface ClaudeCodeHooks {
|
|
24
|
+
guard: SpendGuard;
|
|
25
|
+
handlePreToolUse(input: ClaudeCodeHookInput): Promise<ClaudeCodeHookOutput>;
|
|
26
|
+
handlePostToolUse(input: ClaudeCodeHookInput): Promise<ClaudeCodeHookOutput>;
|
|
27
|
+
handleHookInput(input: ClaudeCodeHookInput): Promise<ClaudeCodeHookOutput>;
|
|
28
|
+
settingsSnippet(command: string): Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export declare function createClaudeCodeHooks(opts: FrameworkAdapterOptions): ClaudeCodeHooks;
|
|
31
|
+
export declare const createAgentGuardClaudeCodeHooks: typeof createClaudeCodeHooks;
|
|
32
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/frameworks/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAgG,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEtJ,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE;QACnB,aAAa,EAAE,YAAY,GAAG,aAAa,CAAC;QAC5C,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;QAC9C,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5E,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC7E,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,uBAAuB,GAAG,eAAe,CAiBpF;AAED,eAAO,MAAM,+BAA+B,8BAAwB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAgentGuardClaudeCodeHooks = void 0;
|
|
4
|
+
exports.createClaudeCodeHooks = createClaudeCodeHooks;
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
function createClaudeCodeHooks(opts) {
|
|
7
|
+
const guard = (0, common_1.createFrameworkGuard)({ ...opts, framework: 'claude-code' });
|
|
8
|
+
return {
|
|
9
|
+
guard,
|
|
10
|
+
handlePreToolUse: (input) => handlePreToolUse(guard, opts, input),
|
|
11
|
+
handlePostToolUse: (input) => handlePostToolUse(guard, input),
|
|
12
|
+
handleHookInput: async (input) => {
|
|
13
|
+
if (input.hook_event_name === 'PostToolUse')
|
|
14
|
+
return handlePostToolUse(guard, input);
|
|
15
|
+
return handlePreToolUse(guard, opts, input);
|
|
16
|
+
},
|
|
17
|
+
settingsSnippet: (command) => ({
|
|
18
|
+
hooks: {
|
|
19
|
+
PreToolUse: [{ matcher: '*', hooks: [{ type: 'command', command }] }],
|
|
20
|
+
PostToolUse: [{ matcher: '*', hooks: [{ type: 'command', command }] }],
|
|
21
|
+
},
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
exports.createAgentGuardClaudeCodeHooks = createClaudeCodeHooks;
|
|
26
|
+
async function handlePreToolUse(guard, opts, input) {
|
|
27
|
+
const toolName = (0, common_1.stringValue)(input.tool_name) ?? 'unknown_tool';
|
|
28
|
+
const cleanArgs = (0, common_1.redactDataPlane)(input.tool_input ?? {});
|
|
29
|
+
try {
|
|
30
|
+
const gate = await guard.guardToolCall({
|
|
31
|
+
toolName,
|
|
32
|
+
toolArgs: (0, common_1.safeRequestShape)(cleanArgs),
|
|
33
|
+
workflowId: input.session_id,
|
|
34
|
+
scope: opts.scope,
|
|
35
|
+
});
|
|
36
|
+
if (!gate.approved) {
|
|
37
|
+
return deny('AgentGuard blocked tool call: ' + gate.decision.reasons.join('; '));
|
|
38
|
+
}
|
|
39
|
+
if (gate.matchedPattern) {
|
|
40
|
+
return {
|
|
41
|
+
hookSpecificOutput: {
|
|
42
|
+
hookEventName: 'PreToolUse',
|
|
43
|
+
permissionDecision: 'ask',
|
|
44
|
+
permissionDecisionReason: 'AgentGuard matched ' + gate.matchedPattern + '. Confirm before tool execution.',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return { continue: true, suppressOutput: true };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return deny(error instanceof Error ? error.message : 'AgentGuard hook failed closed');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function handlePostToolUse(guard, input) {
|
|
55
|
+
await (0, common_1.recordFrameworkReceipt)(guard, 'claude-code', {
|
|
56
|
+
event: 'PostToolUse',
|
|
57
|
+
sessionId: input.session_id ?? null,
|
|
58
|
+
toolName: input.tool_name ?? 'unknown_tool',
|
|
59
|
+
cwd: input.cwd ?? null,
|
|
60
|
+
toolInput: (0, common_1.redactDataPlane)(input.tool_input ?? {}),
|
|
61
|
+
toolResponse: (0, common_1.redactDataPlane)(input.tool_response ?? {}),
|
|
62
|
+
});
|
|
63
|
+
return { continue: true, suppressOutput: true };
|
|
64
|
+
}
|
|
65
|
+
function deny(reason) {
|
|
66
|
+
return {
|
|
67
|
+
continue: true,
|
|
68
|
+
hookSpecificOutput: {
|
|
69
|
+
hookEventName: 'PreToolUse',
|
|
70
|
+
permissionDecision: 'deny',
|
|
71
|
+
permissionDecisionReason: reason,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/frameworks/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { CapabilityTier, CallContext, Provider, SignedDecisionLogEntry, SpendDecision, SpendPolicy, SpendScope } from '../types';
|
|
2
|
+
import { SpendGuard, type SpendGuardConfig } from '../spend-guard';
|
|
3
|
+
export interface FrameworkAdapterOptions {
|
|
4
|
+
policy: SpendPolicy;
|
|
5
|
+
scope: SpendScope;
|
|
6
|
+
capabilityClaim?: CapabilityTier;
|
|
7
|
+
config?: Omit<SpendGuardConfig, 'policy'>;
|
|
8
|
+
licenseKey?: string;
|
|
9
|
+
defaultModel?: string;
|
|
10
|
+
defaultOutputTokens?: number;
|
|
11
|
+
framework?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FrameworkPreflight {
|
|
14
|
+
guard: SpendGuard;
|
|
15
|
+
call: CallContext;
|
|
16
|
+
decision: SpendDecision;
|
|
17
|
+
signed: SignedDecisionLogEntry | null;
|
|
18
|
+
}
|
|
19
|
+
export interface FrameworkCallInput {
|
|
20
|
+
framework: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
provider?: Provider;
|
|
23
|
+
params?: unknown;
|
|
24
|
+
requestShape?: Record<string, unknown>;
|
|
25
|
+
metadata?: Record<string, unknown>;
|
|
26
|
+
workflowId?: string;
|
|
27
|
+
subagentId?: string;
|
|
28
|
+
toolName?: string;
|
|
29
|
+
outputTokens?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function createFrameworkGuard(opts: FrameworkAdapterOptions): SpendGuard;
|
|
32
|
+
export declare function safeRequestShape(value: unknown): Record<string, unknown>;
|
|
33
|
+
export declare function redactDataPlane(value: unknown): unknown;
|
|
34
|
+
export declare function estimateInputTokens(guard: SpendGuard, value: unknown): number;
|
|
35
|
+
export declare function outputTokensFromParams(params: unknown, fallback?: number): number;
|
|
36
|
+
export declare function modelFromUnknown(model: unknown, fallback?: string): string;
|
|
37
|
+
export declare function providerFromModel(model: string, provider?: Provider): Provider;
|
|
38
|
+
export declare function buildFrameworkCall(guard: SpendGuard, opts: FrameworkAdapterOptions, input: FrameworkCallInput): CallContext;
|
|
39
|
+
export declare function preflightFrameworkCall(guard: SpendGuard, opts: FrameworkAdapterOptions, input: FrameworkCallInput): Promise<FrameworkPreflight>;
|
|
40
|
+
export declare function settleFrameworkCall(preflight: FrameworkPreflight, result: unknown, partial?: boolean): Promise<void>;
|
|
41
|
+
export declare function recordFrameworkReceipt(guard: SpendGuard, framework: string, receipt: Record<string, unknown>): Promise<{
|
|
42
|
+
decision: SpendDecision;
|
|
43
|
+
signed: SignedDecisionLogEntry | null;
|
|
44
|
+
}>;
|
|
45
|
+
export declare function usageFromResult(result: unknown): {
|
|
46
|
+
inputTokens: number;
|
|
47
|
+
outputTokens: number;
|
|
48
|
+
} | null;
|
|
49
|
+
export declare function objectRecord(value: unknown): Record<string, unknown> | null;
|
|
50
|
+
export declare function stringValue(value: unknown): string | undefined;
|
|
51
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/frameworks/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFrameworkGuard = createFrameworkGuard;
|
|
4
|
+
exports.safeRequestShape = safeRequestShape;
|
|
5
|
+
exports.redactDataPlane = redactDataPlane;
|
|
6
|
+
exports.estimateInputTokens = estimateInputTokens;
|
|
7
|
+
exports.outputTokensFromParams = outputTokensFromParams;
|
|
8
|
+
exports.modelFromUnknown = modelFromUnknown;
|
|
9
|
+
exports.providerFromModel = providerFromModel;
|
|
10
|
+
exports.buildFrameworkCall = buildFrameworkCall;
|
|
11
|
+
exports.preflightFrameworkCall = preflightFrameworkCall;
|
|
12
|
+
exports.settleFrameworkCall = settleFrameworkCall;
|
|
13
|
+
exports.recordFrameworkReceipt = recordFrameworkReceipt;
|
|
14
|
+
exports.usageFromResult = usageFromResult;
|
|
15
|
+
exports.objectRecord = objectRecord;
|
|
16
|
+
exports.stringValue = stringValue;
|
|
17
|
+
const cost_table_1 = require("../cost-table");
|
|
18
|
+
const governance_1 = require("../governance");
|
|
19
|
+
const spend_guard_1 = require("../spend-guard");
|
|
20
|
+
const DATA_PLANE_KEYS = /^(prompt|completion|content|messages|input|output|text|raw)$/i;
|
|
21
|
+
function createFrameworkGuard(opts) {
|
|
22
|
+
return new spend_guard_1.SpendGuard({
|
|
23
|
+
policy: opts.policy,
|
|
24
|
+
...(opts.config ?? {}),
|
|
25
|
+
licenseKey: opts.licenseKey ?? opts.config?.licenseKey,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function safeRequestShape(value) {
|
|
29
|
+
const redacted = redactDataPlane(value);
|
|
30
|
+
if (redacted && typeof redacted === 'object' && !Array.isArray(redacted)) {
|
|
31
|
+
return (0, governance_1.sanitizeMetadata)(redacted);
|
|
32
|
+
}
|
|
33
|
+
return { valueType: typeof value };
|
|
34
|
+
}
|
|
35
|
+
function redactDataPlane(value) {
|
|
36
|
+
if (value == null)
|
|
37
|
+
return value;
|
|
38
|
+
if (Array.isArray(value))
|
|
39
|
+
return value.map((child) => redactDataPlane(child));
|
|
40
|
+
if (typeof value !== 'object')
|
|
41
|
+
return value;
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const [key, child] of Object.entries(value)) {
|
|
44
|
+
if (DATA_PLANE_KEYS.test(key)) {
|
|
45
|
+
out[key + '_present'] = child != null;
|
|
46
|
+
out[key + '_type'] = Array.isArray(child) ? 'array' : typeof child;
|
|
47
|
+
if (Array.isArray(child))
|
|
48
|
+
out[key + '_items'] = child.length;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
out[key] = redactDataPlane(child);
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
function estimateInputTokens(guard, value) {
|
|
56
|
+
const serialized = typeof value === 'string' ? value : stableJson(value ?? {});
|
|
57
|
+
return Math.max(1, guard.estimateTokens(serialized));
|
|
58
|
+
}
|
|
59
|
+
function outputTokensFromParams(params, fallback = 512) {
|
|
60
|
+
const record = objectRecord(params);
|
|
61
|
+
const value = record?.max_tokens ??
|
|
62
|
+
record?.maxTokens ??
|
|
63
|
+
record?.maxOutputTokens ??
|
|
64
|
+
record?.max_completion_tokens ??
|
|
65
|
+
record?.maxCompletionTokens;
|
|
66
|
+
return Number.isSafeInteger(value) && value >= 0 ? value : fallback;
|
|
67
|
+
}
|
|
68
|
+
function modelFromUnknown(model, fallback = 'unknown') {
|
|
69
|
+
if (typeof model === 'string' && model.trim())
|
|
70
|
+
return model.trim();
|
|
71
|
+
const record = objectRecord(model);
|
|
72
|
+
for (const key of ['modelId', 'model_id', 'id', 'name']) {
|
|
73
|
+
const value = record?.[key];
|
|
74
|
+
if (typeof value === 'string' && value.trim())
|
|
75
|
+
return value.trim();
|
|
76
|
+
}
|
|
77
|
+
return fallback;
|
|
78
|
+
}
|
|
79
|
+
function providerFromModel(model, provider) {
|
|
80
|
+
return provider ?? (0, cost_table_1.inferProvider)(model);
|
|
81
|
+
}
|
|
82
|
+
function buildFrameworkCall(guard, opts, input) {
|
|
83
|
+
const model = modelFromUnknown(input.model, opts.defaultModel ?? 'unknown');
|
|
84
|
+
const metadata = (0, governance_1.sanitizeMetadata)(redactDataPlane(input.metadata ?? {}));
|
|
85
|
+
const requestShape = (0, governance_1.sanitizeMetadata)({
|
|
86
|
+
framework: input.framework,
|
|
87
|
+
...(input.requestShape ?? safeRequestShape(input.params)),
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
provider: providerFromModel(model, input.provider),
|
|
91
|
+
model,
|
|
92
|
+
inputTokens: estimateInputTokens(guard, input.params),
|
|
93
|
+
outputTokens: input.outputTokens ?? outputTokensFromParams(input.params, opts.defaultOutputTokens ?? 512),
|
|
94
|
+
scope: opts.scope,
|
|
95
|
+
capabilityClaim: opts.capabilityClaim,
|
|
96
|
+
workflowId: input.workflowId ?? stringValue(metadata.workflowId) ?? stringValue(metadata.workflow_id),
|
|
97
|
+
subagentId: input.subagentId ?? stringValue(metadata.subagentId) ?? stringValue(metadata.subagent_id),
|
|
98
|
+
label: stringValue(metadata.label) ?? input.framework,
|
|
99
|
+
toolName: input.toolName,
|
|
100
|
+
requestShape,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async function preflightFrameworkCall(guard, opts, input) {
|
|
104
|
+
const call = buildFrameworkCall(guard, opts, input);
|
|
105
|
+
const { decision, signed } = await guard.decide(call);
|
|
106
|
+
if (decision.action === 'block') {
|
|
107
|
+
throw new spend_guard_1.AgentGuardBlockedError(decision, opts.scope, opts.config?.locale);
|
|
108
|
+
}
|
|
109
|
+
return { guard, call, decision, signed };
|
|
110
|
+
}
|
|
111
|
+
async function settleFrameworkCall(preflight, result, partial = false) {
|
|
112
|
+
const usage = usageFromResult(result);
|
|
113
|
+
if (!usage)
|
|
114
|
+
return;
|
|
115
|
+
await preflight.guard.settleStreamUsage(preflight.decision.decisionId, usage.inputTokens, usage.outputTokens, { partial });
|
|
116
|
+
}
|
|
117
|
+
async function recordFrameworkReceipt(guard, framework, receipt) {
|
|
118
|
+
return guard.recordOutcomeReceipt({
|
|
119
|
+
type: 'framework_adapter',
|
|
120
|
+
framework,
|
|
121
|
+
totalCostCents: safeInteger(receipt.totalCostCents),
|
|
122
|
+
...(0, governance_1.sanitizeMetadata)(redactDataPlane(receipt)),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function usageFromResult(result) {
|
|
126
|
+
const candidates = [
|
|
127
|
+
objectRecord(result)?.usage,
|
|
128
|
+
objectRecord(objectRecord(result)?.response)?.usage,
|
|
129
|
+
objectRecord(objectRecord(result)?.rawResponse)?.usage,
|
|
130
|
+
];
|
|
131
|
+
for (const candidate of candidates) {
|
|
132
|
+
const usage = objectRecord(candidate);
|
|
133
|
+
if (!usage)
|
|
134
|
+
continue;
|
|
135
|
+
const input = firstInteger(usage.inputTokens, usage.promptTokens, usage.prompt_tokens, usage.input_tokens);
|
|
136
|
+
const output = firstInteger(usage.outputTokens, usage.completionTokens, usage.completion_tokens, usage.output_tokens);
|
|
137
|
+
if (input !== null && output !== null)
|
|
138
|
+
return { inputTokens: input, outputTokens: output };
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
function objectRecord(value) {
|
|
143
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
144
|
+
? value
|
|
145
|
+
: null;
|
|
146
|
+
}
|
|
147
|
+
function stringValue(value) {
|
|
148
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
149
|
+
}
|
|
150
|
+
function firstInteger(...values) {
|
|
151
|
+
for (const value of values) {
|
|
152
|
+
if (Number.isSafeInteger(value) && value >= 0)
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
function safeInteger(value) {
|
|
158
|
+
return Number.isSafeInteger(value) && value >= 0 ? value : 0;
|
|
159
|
+
}
|
|
160
|
+
function stableJson(value) {
|
|
161
|
+
try {
|
|
162
|
+
return JSON.stringify(value);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return String(value);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/frameworks/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SpendGuard } from '../spend-guard';
|
|
2
|
+
import { type FrameworkAdapterOptions } from './common';
|
|
3
|
+
export interface HermesToolEvent {
|
|
4
|
+
toolName?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
args?: Record<string, unknown>;
|
|
7
|
+
toolArgs?: Record<string, unknown>;
|
|
8
|
+
workflowId?: string;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
result?: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface HermesHookResult {
|
|
14
|
+
allow: boolean;
|
|
15
|
+
approved?: boolean;
|
|
16
|
+
reason?: string;
|
|
17
|
+
receiptId?: string;
|
|
18
|
+
editedArgs?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface HermesPlugin {
|
|
21
|
+
name: 'agentguard-spend';
|
|
22
|
+
guard: SpendGuard;
|
|
23
|
+
hooks: {
|
|
24
|
+
'pre-tool-call': (event: HermesToolEvent) => Promise<HermesHookResult>;
|
|
25
|
+
approval: (event: HermesToolEvent) => Promise<HermesHookResult>;
|
|
26
|
+
'post-tool-call': (event: HermesToolEvent) => Promise<HermesHookResult>;
|
|
27
|
+
};
|
|
28
|
+
preToolCall(event: HermesToolEvent): Promise<HermesHookResult>;
|
|
29
|
+
approval(event: HermesToolEvent): Promise<HermesHookResult>;
|
|
30
|
+
postToolCall(event: HermesToolEvent): Promise<HermesHookResult>;
|
|
31
|
+
}
|
|
32
|
+
export declare function createHermesPlugin(opts: FrameworkAdapterOptions): HermesPlugin;
|
|
33
|
+
export declare const agentguardHermesPlugin: typeof createHermesPlugin;
|
|
34
|
+
//# sourceMappingURL=hermes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/frameworks/hermes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAgG,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEtJ,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE;QACL,eAAe,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvE,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChE,gBAAgB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;KACzE,CAAC;IACF,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5D,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACjE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,GAAG,YAAY,CAe9E;AAED,eAAO,MAAM,sBAAsB,2BAAqB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.agentguardHermesPlugin = void 0;
|
|
4
|
+
exports.createHermesPlugin = createHermesPlugin;
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
function createHermesPlugin(opts) {
|
|
7
|
+
const guard = (0, common_1.createFrameworkGuard)({ ...opts, framework: 'hermes' });
|
|
8
|
+
const plugin = {
|
|
9
|
+
name: 'agentguard-spend',
|
|
10
|
+
guard,
|
|
11
|
+
hooks: {
|
|
12
|
+
'pre-tool-call': (event) => preToolCall(guard, opts, event),
|
|
13
|
+
approval: (event) => approval(guard, opts, event),
|
|
14
|
+
'post-tool-call': (event) => postToolCall(guard, event),
|
|
15
|
+
},
|
|
16
|
+
preToolCall: (event) => preToolCall(guard, opts, event),
|
|
17
|
+
approval: (event) => approval(guard, opts, event),
|
|
18
|
+
postToolCall: (event) => postToolCall(guard, event),
|
|
19
|
+
};
|
|
20
|
+
return plugin;
|
|
21
|
+
}
|
|
22
|
+
exports.agentguardHermesPlugin = createHermesPlugin;
|
|
23
|
+
async function preToolCall(guard, opts, event) {
|
|
24
|
+
const gate = await guard.guardToolCall({
|
|
25
|
+
toolName: toolName(event),
|
|
26
|
+
toolArgs: (0, common_1.safeRequestShape)((0, common_1.redactDataPlane)(event.toolArgs ?? event.args ?? {})),
|
|
27
|
+
workflowId: event.workflowId ?? event.sessionId,
|
|
28
|
+
scope: opts.scope,
|
|
29
|
+
});
|
|
30
|
+
if (!gate.approved)
|
|
31
|
+
return { allow: false, approved: false, reason: gate.decision.reasons.join('; ') };
|
|
32
|
+
return { allow: true, approved: true, editedArgs: gate.editedArgs };
|
|
33
|
+
}
|
|
34
|
+
async function approval(guard, opts, event) {
|
|
35
|
+
return preToolCall(guard, opts, event);
|
|
36
|
+
}
|
|
37
|
+
async function postToolCall(guard, event) {
|
|
38
|
+
const { decision } = await (0, common_1.recordFrameworkReceipt)(guard, 'hermes', {
|
|
39
|
+
event: 'post-tool-call',
|
|
40
|
+
toolName: toolName(event),
|
|
41
|
+
workflowId: event.workflowId ?? event.sessionId ?? null,
|
|
42
|
+
metadata: (0, common_1.redactDataPlane)(event.metadata ?? {}),
|
|
43
|
+
result: (0, common_1.redactDataPlane)(event.result ?? {}),
|
|
44
|
+
});
|
|
45
|
+
return { allow: true, approved: true, receiptId: decision.decisionId };
|
|
46
|
+
}
|
|
47
|
+
function toolName(event) {
|
|
48
|
+
return (0, common_1.stringValue)(event.toolName) ?? (0, common_1.stringValue)(event.name) ?? 'unknown_tool';
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=hermes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/frameworks/hermes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,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("./common"), exports);
|
|
18
|
+
__exportStar(require("./openrouter"), exports);
|
|
19
|
+
__exportStar(require("./vercel-ai"), exports);
|
|
20
|
+
__exportStar(require("./claude-code"), exports);
|
|
21
|
+
__exportStar(require("./hermes"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,+CAA6B;AAC7B,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAyB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type SpendGuardConfig } from '../spend-guard';
|
|
2
|
+
import type { CapabilityTier, SpendPolicy, SpendScope } from '../types';
|
|
3
|
+
import { type FrameworkAdapterOptions } from './common';
|
|
4
|
+
export interface OpenRouterBindingOptions {
|
|
5
|
+
policy: SpendPolicy;
|
|
6
|
+
scope: SpendScope;
|
|
7
|
+
capabilityClaim?: CapabilityTier;
|
|
8
|
+
config?: Omit<SpendGuardConfig, 'policy'>;
|
|
9
|
+
licenseKey?: string;
|
|
10
|
+
openRouterBaseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function withSpendGuardOpenRouter<TClient>(client: TClient, opts: OpenRouterBindingOptions): TClient;
|
|
13
|
+
export declare function withOpenRouterSpendGuard<TClient>(client: TClient, opts: OpenRouterBindingOptions): TClient;
|
|
14
|
+
export interface OpenRouterFetchOptions extends FrameworkAdapterOptions {
|
|
15
|
+
fetchImpl?: (url: string, init?: Record<string, unknown>) => Promise<unknown>;
|
|
16
|
+
endpoint?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function createOpenRouterFetch(opts: OpenRouterFetchOptions): (url: string, init?: Record<string, unknown>) => Promise<unknown>;
|
|
19
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/frameworks/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,EAAqE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAE3H,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAa1G;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAE1G;AAED,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACrE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CA6BrI"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withSpendGuardOpenRouter = withSpendGuardOpenRouter;
|
|
4
|
+
exports.withOpenRouterSpendGuard = withOpenRouterSpendGuard;
|
|
5
|
+
exports.createOpenRouterFetch = createOpenRouterFetch;
|
|
6
|
+
const spend_guard_1 = require("../spend-guard");
|
|
7
|
+
const common_1 = require("./common");
|
|
8
|
+
function withSpendGuardOpenRouter(client, opts) {
|
|
9
|
+
const config = {
|
|
10
|
+
...(opts.config ?? {}),
|
|
11
|
+
openRouterBaseUrl: opts.openRouterBaseUrl ?? opts.config?.openRouterBaseUrl ?? 'https://openrouter.ai/api/v1',
|
|
12
|
+
providerRoute: opts.config?.providerRoute ?? 'openrouter',
|
|
13
|
+
};
|
|
14
|
+
return (0, spend_guard_1.withSpendGuard)(client, {
|
|
15
|
+
policy: opts.policy,
|
|
16
|
+
scope: opts.scope,
|
|
17
|
+
capabilityClaim: opts.capabilityClaim,
|
|
18
|
+
licenseKey: opts.licenseKey,
|
|
19
|
+
config,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function withOpenRouterSpendGuard(client, opts) {
|
|
23
|
+
return withSpendGuardOpenRouter(client, opts);
|
|
24
|
+
}
|
|
25
|
+
function createOpenRouterFetch(opts) {
|
|
26
|
+
const guard = (0, common_1.createFrameworkGuard)({ ...opts, defaultModel: opts.defaultModel ?? 'openrouter/auto', framework: 'openrouter' });
|
|
27
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
28
|
+
if (!fetchImpl)
|
|
29
|
+
throw new Error('createOpenRouterFetch: fetch is not available');
|
|
30
|
+
const endpoint = opts.endpoint ?? 'https://openrouter.ai/api/v1/chat/completions';
|
|
31
|
+
return async (url, init = {}) => {
|
|
32
|
+
const target = String(url);
|
|
33
|
+
if (!target.startsWith(endpoint))
|
|
34
|
+
return fetchImpl(target, init);
|
|
35
|
+
const body = parseJsonBody(init.body);
|
|
36
|
+
const preflight = await (0, common_1.preflightFrameworkCall)(guard, opts, {
|
|
37
|
+
framework: 'openrouter',
|
|
38
|
+
model: typeof body.model === 'string' ? body.model : opts.defaultModel ?? 'openrouter/auto',
|
|
39
|
+
params: body,
|
|
40
|
+
metadata: metadataRecord(body.metadata),
|
|
41
|
+
requestShape: {
|
|
42
|
+
endpoint: '/api/v1/chat/completions',
|
|
43
|
+
stream: body.stream === true,
|
|
44
|
+
maxTokens: typeof body.max_tokens === 'number' ? body.max_tokens : undefined,
|
|
45
|
+
toolCount: Array.isArray(body.tools) ? body.tools.length : 0,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const nextBody = preflight.decision.action === 'downgrade' && preflight.decision.modelResolved !== preflight.decision.modelRequested
|
|
49
|
+
? { ...body, model: preflight.decision.modelResolved }
|
|
50
|
+
: body;
|
|
51
|
+
const response = await fetchImpl(target, { ...init, body: JSON.stringify(nextBody) });
|
|
52
|
+
await (0, common_1.settleFrameworkCall)(preflight, await responseJson(response));
|
|
53
|
+
return response;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function parseJsonBody(body) {
|
|
57
|
+
if (typeof body === 'string') {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(body);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (body && typeof body === 'object' && !Array.isArray(body))
|
|
66
|
+
return body;
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
function metadataRecord(value) {
|
|
70
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
71
|
+
}
|
|
72
|
+
async function responseJson(response) {
|
|
73
|
+
const maybe = response;
|
|
74
|
+
try {
|
|
75
|
+
if (typeof maybe.clone === 'function')
|
|
76
|
+
return await maybe.clone().json?.();
|
|
77
|
+
if (typeof maybe.json === 'function')
|
|
78
|
+
return await maybe.json();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/frameworks/openrouter.ts"],"names":[],"mappings":"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"}
|