@agentguard-run/spend 0.2.2 → 0.4.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 +1 -1
- package/README.es-419.md +37 -100
- package/README.md +58 -121
- package/README.pt-BR.md +37 -100
- package/dist/bindings/anthropic.d.ts +11 -0
- package/dist/bindings/anthropic.d.ts.map +1 -0
- package/dist/bindings/anthropic.js +116 -0
- package/dist/bindings/anthropic.js.map +1 -0
- package/dist/bindings/bedrock.d.ts +11 -0
- package/dist/bindings/bedrock.d.ts.map +1 -0
- package/dist/bindings/bedrock.js +177 -0
- package/dist/bindings/bedrock.js.map +1 -0
- package/dist/cli/auth.d.ts +7 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +189 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/coach.d.ts +5 -0
- package/dist/cli/coach.d.ts.map +1 -0
- package/dist/cli/coach.js +257 -0
- package/dist/cli/coach.js.map +1 -0
- package/dist/cli/colors.d.ts +8 -3
- package/dist/cli/colors.d.ts.map +1 -1
- package/dist/cli/colors.js +93 -4
- package/dist/cli/colors.js.map +1 -1
- package/dist/cli/demo.d.ts.map +1 -1
- package/dist/cli/demo.js +23 -2
- package/dist/cli/demo.js.map +1 -1
- package/dist/cli/main.d.ts +0 -6
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +42 -16
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/models.d.ts +18 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +277 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/tips.d.ts +21 -0
- package/dist/cli/tips.d.ts.map +1 -0
- package/dist/cli/tips.js +191 -0
- package/dist/cli/tips.js.map +1 -0
- package/dist/cli/wizard.d.ts +27 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +182 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/coach/anomaly.d.ts +26 -0
- package/dist/coach/anomaly.d.ts.map +1 -0
- package/dist/coach/anomaly.js +119 -0
- package/dist/coach/anomaly.js.map +1 -0
- package/dist/coach/conversation.d.ts +69 -0
- package/dist/coach/conversation.d.ts.map +1 -0
- package/dist/coach/conversation.js +228 -0
- package/dist/coach/conversation.js.map +1 -0
- package/dist/coach/forecast.d.ts +19 -0
- package/dist/coach/forecast.d.ts.map +1 -0
- package/dist/coach/forecast.js +57 -0
- package/dist/coach/forecast.js.map +1 -0
- package/dist/coach/llm-client.d.ts +41 -0
- package/dist/coach/llm-client.d.ts.map +1 -0
- package/dist/coach/llm-client.js +248 -0
- package/dist/coach/llm-client.js.map +1 -0
- package/dist/coach/output.d.ts +41 -0
- package/dist/coach/output.d.ts.map +1 -0
- package/dist/coach/output.js +173 -0
- package/dist/coach/output.js.map +1 -0
- package/dist/coach/system-prompt.d.ts +20 -0
- package/dist/coach/system-prompt.d.ts.map +1 -0
- package/dist/coach/system-prompt.js +177 -0
- package/dist/coach/system-prompt.js.map +1 -0
- package/dist/cost-table.d.ts +11 -36
- package/dist/cost-table.d.ts.map +1 -1
- package/dist/cost-table.js +114 -45
- package/dist/cost-table.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -2
- package/dist/index.js.map +1 -1
- package/dist/openrouter-catalog.d.ts +56 -0
- package/dist/openrouter-catalog.d.ts.map +1 -0
- package/dist/openrouter-catalog.js +183 -0
- package/dist/openrouter-catalog.js.map +1 -0
- package/dist/spend-guard.d.ts +38 -55
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +268 -83
- package/dist/spend-guard.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +52 -21
- package/dist/telemetry.js.map +1 -1
- package/dist/templates/index.d.ts +17 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +100 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types.d.ts +18 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +39 -4
- package/src/bindings/anthropic.ts +142 -0
- package/src/bindings/bedrock.ts +200 -0
- package/src/cli/auth.ts +145 -0
- package/src/cli/coach.ts +249 -0
- package/src/cli/models.ts +236 -0
- package/src/cli/tips.ts +161 -0
- package/src/cli/wizard.ts +160 -0
- package/src/coach/anomaly.ts +98 -0
- package/src/coach/conversation.ts +248 -0
- package/src/coach/forecast.ts +64 -0
- package/src/coach/llm-client.ts +247 -0
- package/src/coach/output.ts +172 -0
- package/src/coach/system-prompt.ts +181 -0
- package/src/openrouter-catalog.ts +180 -0
- package/src/templates/agent-support.yaml +30 -0
- package/src/templates/chargeback-evidence.yaml +30 -0
- package/src/templates/code-scan.yaml +30 -0
- package/src/templates/index.ts +109 -0
- package/src/templates/payment-approval.yaml +30 -0
- package/src/templates/risk-review.yaml +30 -0
- package/tests/fixtures/openrouter-catalog.json +1 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Native Anthropic binding for AgentGuard Spend. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.withSpendGuardAnthropic = withSpendGuardAnthropic;
|
|
5
|
+
const spend_guard_1 = require("../spend-guard");
|
|
6
|
+
function withSpendGuardAnthropic(
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
client, opts) {
|
|
9
|
+
const guard = new spend_guard_1.SpendGuard({ policy: opts.policy, ...(opts.config ?? {}) });
|
|
10
|
+
const originalCreate = client?.messages?.create?.bind(client.messages);
|
|
11
|
+
if (!originalCreate)
|
|
12
|
+
throw new Error('withSpendGuardAnthropic: expected client.messages.create');
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
client.messages.create = async (params) => {
|
|
15
|
+
const call = buildAnthropicCall(params, guard, opts);
|
|
16
|
+
const { decision } = await guard.decide(call);
|
|
17
|
+
if (decision.action === 'block')
|
|
18
|
+
throw new spend_guard_1.AgentGuardBlockedError(decision, opts.scope, opts.config?.locale);
|
|
19
|
+
const nextParams = decision.action === 'downgrade' && decision.modelResolved !== decision.modelRequested
|
|
20
|
+
? { ...params, model: decision.modelResolved }
|
|
21
|
+
: params;
|
|
22
|
+
const response = await originalCreate(nextParams);
|
|
23
|
+
if (nextParams?.stream === true || isAsyncIterable(response)) {
|
|
24
|
+
return wrapAnthropicStream(response, guard, decision.decisionId, call);
|
|
25
|
+
}
|
|
26
|
+
const usage = (0, spend_guard_1.usageCountsFromObject)(response?.usage);
|
|
27
|
+
if (usage)
|
|
28
|
+
await guard.settleStreamUsage(decision.decisionId, usage.inputTokens, usage.outputTokens);
|
|
29
|
+
return response;
|
|
30
|
+
};
|
|
31
|
+
const originalStream = client?.messages?.stream?.bind(client.messages);
|
|
32
|
+
if (originalStream) {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
client.messages.stream = async (params) => {
|
|
35
|
+
const call = buildAnthropicCall({ ...params, stream: true }, guard, opts);
|
|
36
|
+
const { decision } = await guard.decide(call);
|
|
37
|
+
if (decision.action === 'block')
|
|
38
|
+
throw new spend_guard_1.AgentGuardBlockedError(decision, opts.scope, opts.config?.locale);
|
|
39
|
+
const nextParams = decision.action === 'downgrade' && decision.modelResolved !== decision.modelRequested
|
|
40
|
+
? { ...params, model: decision.modelResolved }
|
|
41
|
+
: params;
|
|
42
|
+
const stream = await originalStream(nextParams);
|
|
43
|
+
return wrapAnthropicStream(stream, guard, decision.decisionId, call);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
client.__agentguard = guard;
|
|
47
|
+
return client;
|
|
48
|
+
}
|
|
49
|
+
function buildAnthropicCall(params, guard, opts) {
|
|
50
|
+
const inputText = [(0, spend_guard_1.extractText)(params.system), (0, spend_guard_1.extractText)(params.messages)].filter(Boolean).join('\n');
|
|
51
|
+
return {
|
|
52
|
+
provider: 'anthropic',
|
|
53
|
+
model: String(params.model ?? 'unknown'),
|
|
54
|
+
inputTokens: guard.estimateTokens(inputText),
|
|
55
|
+
outputTokens: (0, spend_guard_1.outputTokensFromParams)(params),
|
|
56
|
+
scope: opts.scope,
|
|
57
|
+
capabilityClaim: opts.capabilityClaim,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function wrapAnthropicStream(stream, guard, decisionId, call) {
|
|
61
|
+
const tracker = new AnthropicStreamUsageTracker(guard, call);
|
|
62
|
+
return (0, spend_guard_1.wrapUsageStream)(stream, {
|
|
63
|
+
onChunk: (chunk) => tracker.observe(chunk),
|
|
64
|
+
settle: (partial, reason) => {
|
|
65
|
+
const usage = tracker.usage();
|
|
66
|
+
return guard.settleStreamUsage(decisionId, usage.inputTokens, usage.outputTokens, { partial, reason });
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
class AnthropicStreamUsageTracker {
|
|
71
|
+
guard;
|
|
72
|
+
call;
|
|
73
|
+
input = null;
|
|
74
|
+
output = null;
|
|
75
|
+
content = '';
|
|
76
|
+
constructor(guard, call) {
|
|
77
|
+
this.guard = guard;
|
|
78
|
+
this.call = call;
|
|
79
|
+
}
|
|
80
|
+
observe(event) {
|
|
81
|
+
const obj = event;
|
|
82
|
+
const startUsage = (obj?.message?.usage ?? obj?.usage);
|
|
83
|
+
const input = tokenField(startUsage, ['input_tokens', 'inputTokens', 'prompt_tokens']);
|
|
84
|
+
const output = tokenField(startUsage, ['output_tokens', 'outputTokens', 'completion_tokens']);
|
|
85
|
+
if (input !== null)
|
|
86
|
+
this.input = input;
|
|
87
|
+
if (output !== null)
|
|
88
|
+
this.output = output;
|
|
89
|
+
const delta = obj?.delta;
|
|
90
|
+
if (typeof delta?.text === 'string')
|
|
91
|
+
this.content += delta.text;
|
|
92
|
+
if (typeof delta?.partial_json === 'string')
|
|
93
|
+
this.content += delta.partial_json;
|
|
94
|
+
}
|
|
95
|
+
usage() {
|
|
96
|
+
return {
|
|
97
|
+
inputTokens: this.input ?? this.call.inputTokens,
|
|
98
|
+
outputTokens: this.output ?? this.guard.estimateTokens(this.content),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function tokenField(value, names) {
|
|
103
|
+
if (!value || typeof value !== 'object')
|
|
104
|
+
return null;
|
|
105
|
+
const obj = value;
|
|
106
|
+
for (const name of names) {
|
|
107
|
+
const token = obj[name];
|
|
108
|
+
if (Number.isSafeInteger(token) && token >= 0)
|
|
109
|
+
return token;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
function isAsyncIterable(value) {
|
|
114
|
+
return Boolean(value && typeof value[Symbol.asyncIterator] === 'function');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/bindings/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Native AWS Bedrock binding for AgentGuard Spend. */
|
|
2
|
+
import type { CapabilityTier, SpendPolicy, SpendScope } from '../types';
|
|
3
|
+
import { type SpendGuardConfig } from '../spend-guard';
|
|
4
|
+
export interface BedrockBindingOptions {
|
|
5
|
+
policy: SpendPolicy;
|
|
6
|
+
scope: SpendScope;
|
|
7
|
+
capabilityClaim?: CapabilityTier;
|
|
8
|
+
config?: Omit<SpendGuardConfig, 'policy'>;
|
|
9
|
+
}
|
|
10
|
+
export declare function withSpendGuardBedrock(client: any, opts: BedrockBindingOptions): any;
|
|
11
|
+
//# sourceMappingURL=bedrock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/bindings/bedrock.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAyB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/F,OAAO,EAGL,KAAK,gBAAgB,EAKtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;CAC3C;AAOD,wBAAgB,qBAAqB,CAEnC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,qBAAqB,GAE1B,GAAG,CAgCL"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Native AWS Bedrock binding for AgentGuard Spend. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.withSpendGuardBedrock = withSpendGuardBedrock;
|
|
5
|
+
const spend_guard_1 = require("../spend-guard");
|
|
6
|
+
function withSpendGuardBedrock(
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
client, opts) {
|
|
9
|
+
const guard = new spend_guard_1.SpendGuard({ policy: opts.policy, ...(opts.config ?? {}) });
|
|
10
|
+
const originalSend = client?.send?.bind(client);
|
|
11
|
+
if (!originalSend)
|
|
12
|
+
throw new Error('withSpendGuardBedrock: expected client.send');
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
client.send = async (command, ...args) => {
|
|
15
|
+
if (!isInvokeModelCommand(command))
|
|
16
|
+
return originalSend(command, ...args);
|
|
17
|
+
const call = buildBedrockCall(command, guard, opts);
|
|
18
|
+
const { decision } = await guard.decide(call);
|
|
19
|
+
if (decision.action === 'block')
|
|
20
|
+
throw new spend_guard_1.AgentGuardBlockedError(decision, opts.scope, opts.config?.locale);
|
|
21
|
+
if (decision.action === 'downgrade' && decision.modelResolved !== decision.modelRequested && command.input) {
|
|
22
|
+
command.input = { ...command.input, modelId: decision.modelResolved };
|
|
23
|
+
}
|
|
24
|
+
const response = await originalSend(command, ...args);
|
|
25
|
+
if (isStreamingCommand(command) && response?.body) {
|
|
26
|
+
return {
|
|
27
|
+
...response,
|
|
28
|
+
body: wrapBedrockStream(response.body, guard, decision.decisionId, call),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const usage = extractBedrockResponseUsage(response, call.model);
|
|
32
|
+
if (usage)
|
|
33
|
+
await guard.settleStreamUsage(decision.decisionId, usage.inputTokens, usage.outputTokens);
|
|
34
|
+
return response;
|
|
35
|
+
};
|
|
36
|
+
client.__agentguard = guard;
|
|
37
|
+
return client;
|
|
38
|
+
}
|
|
39
|
+
function isInvokeModelCommand(command) {
|
|
40
|
+
const name = command?.constructor?.name;
|
|
41
|
+
return name === 'InvokeModelCommand' || name === 'InvokeModelWithResponseStreamCommand';
|
|
42
|
+
}
|
|
43
|
+
function isStreamingCommand(command) {
|
|
44
|
+
return command?.constructor?.name === 'InvokeModelWithResponseStreamCommand';
|
|
45
|
+
}
|
|
46
|
+
function buildBedrockCall(command, guard, opts) {
|
|
47
|
+
const input = command.input ?? {};
|
|
48
|
+
const modelId = String(input.modelId ?? 'unknown');
|
|
49
|
+
const body = parseJsonBody(input.body);
|
|
50
|
+
const inputText = (0, spend_guard_1.extractText)(body);
|
|
51
|
+
return {
|
|
52
|
+
provider: 'bedrock',
|
|
53
|
+
model: modelId,
|
|
54
|
+
inputTokens: guard.estimateTokens(inputText),
|
|
55
|
+
outputTokens: outputTokensFromBody(body),
|
|
56
|
+
scope: opts.scope,
|
|
57
|
+
capabilityClaim: opts.capabilityClaim,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function wrapBedrockStream(stream, guard, decisionId, call) {
|
|
61
|
+
const tracker = new BedrockStreamUsageTracker(guard, call);
|
|
62
|
+
return (0, spend_guard_1.wrapUsageStream)(stream, {
|
|
63
|
+
onChunk: (event) => tracker.observe(event),
|
|
64
|
+
settle: (partial, reason) => {
|
|
65
|
+
const usage = tracker.usage();
|
|
66
|
+
return guard.settleStreamUsage(decisionId, usage.inputTokens, usage.outputTokens, { partial, reason });
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
class BedrockStreamUsageTracker {
|
|
71
|
+
guard;
|
|
72
|
+
call;
|
|
73
|
+
input = null;
|
|
74
|
+
output = null;
|
|
75
|
+
content = '';
|
|
76
|
+
constructor(guard, call) {
|
|
77
|
+
this.guard = guard;
|
|
78
|
+
this.call = call;
|
|
79
|
+
}
|
|
80
|
+
observe(event) {
|
|
81
|
+
const payload = bedrockEventPayload(event);
|
|
82
|
+
if (!payload)
|
|
83
|
+
return;
|
|
84
|
+
const usage = usageFromBedrockPayload(payload);
|
|
85
|
+
if (usage) {
|
|
86
|
+
this.input = usage.inputTokens;
|
|
87
|
+
this.output = usage.outputTokens;
|
|
88
|
+
}
|
|
89
|
+
this.content += textFromBedrockPayload(payload);
|
|
90
|
+
}
|
|
91
|
+
usage() {
|
|
92
|
+
return {
|
|
93
|
+
inputTokens: this.input ?? this.call.inputTokens,
|
|
94
|
+
outputTokens: this.output ?? this.guard.estimateTokens(this.content),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function extractBedrockResponseUsage(response, modelId) {
|
|
99
|
+
const body = response?.body;
|
|
100
|
+
const parsed = parseJsonBody(body);
|
|
101
|
+
const usage = usageFromBedrockPayload(parsed);
|
|
102
|
+
if (usage)
|
|
103
|
+
return usage;
|
|
104
|
+
if (modelId.startsWith('amazon.nova.'))
|
|
105
|
+
return (0, spend_guard_1.usageCountsFromObject)(parsed?.usage);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function usageFromBedrockPayload(payload) {
|
|
109
|
+
if (!payload || typeof payload !== 'object')
|
|
110
|
+
return null;
|
|
111
|
+
const obj = payload;
|
|
112
|
+
const direct = (0, spend_guard_1.usageCountsFromObject)(obj.usage);
|
|
113
|
+
if (direct)
|
|
114
|
+
return direct;
|
|
115
|
+
const bedrockMetrics = obj['amazon-bedrock-invocationMetrics'];
|
|
116
|
+
if (bedrockMetrics && typeof bedrockMetrics === 'object') {
|
|
117
|
+
const metrics = bedrockMetrics;
|
|
118
|
+
const input = metrics.inputTokenCount;
|
|
119
|
+
const output = metrics.outputTokenCount;
|
|
120
|
+
if (Number.isSafeInteger(input) && Number.isSafeInteger(output)) {
|
|
121
|
+
return { inputTokens: input, outputTokens: output };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const nested = (0, spend_guard_1.usageCountsFromObject)(obj.message?.usage);
|
|
125
|
+
if (nested)
|
|
126
|
+
return nested;
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
function textFromBedrockPayload(payload) {
|
|
130
|
+
if (!payload || typeof payload !== 'object')
|
|
131
|
+
return '';
|
|
132
|
+
const obj = payload;
|
|
133
|
+
const delta = obj.delta;
|
|
134
|
+
if (typeof delta?.text === 'string')
|
|
135
|
+
return delta.text;
|
|
136
|
+
const contentBlockDelta = obj.contentBlockDelta;
|
|
137
|
+
const nestedDelta = contentBlockDelta?.delta;
|
|
138
|
+
if (typeof nestedDelta?.text === 'string')
|
|
139
|
+
return nestedDelta.text;
|
|
140
|
+
const output = obj.output;
|
|
141
|
+
if (output)
|
|
142
|
+
return (0, spend_guard_1.extractText)(output);
|
|
143
|
+
return '';
|
|
144
|
+
}
|
|
145
|
+
function outputTokensFromBody(body) {
|
|
146
|
+
if (!body || typeof body !== 'object')
|
|
147
|
+
return 512;
|
|
148
|
+
const obj = body;
|
|
149
|
+
const value = obj.max_tokens ?? obj.maxTokens ?? obj.max_new_tokens ??
|
|
150
|
+
obj.inferenceConfig?.maxTokens;
|
|
151
|
+
return Number.isSafeInteger(value) && value >= 0 ? value : 512;
|
|
152
|
+
}
|
|
153
|
+
function parseJsonBody(body) {
|
|
154
|
+
if (!body)
|
|
155
|
+
return {};
|
|
156
|
+
try {
|
|
157
|
+
if (typeof body === 'string')
|
|
158
|
+
return JSON.parse(body);
|
|
159
|
+
if (body instanceof Uint8Array)
|
|
160
|
+
return JSON.parse(new TextDecoder().decode(body));
|
|
161
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(body))
|
|
162
|
+
return JSON.parse(body.toString('utf8'));
|
|
163
|
+
if (typeof body === 'object')
|
|
164
|
+
return body;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return {};
|
|
168
|
+
}
|
|
169
|
+
return {};
|
|
170
|
+
}
|
|
171
|
+
function bedrockEventPayload(event) {
|
|
172
|
+
const obj = event;
|
|
173
|
+
const chunk = obj?.chunk;
|
|
174
|
+
const bytes = chunk?.bytes ?? chunk?.payload ?? obj?.payload;
|
|
175
|
+
return parseJsonBody(bytes);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/bindings/bedrock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function openRouterKeyPath(): string;
|
|
2
|
+
export declare function keyFingerprint(key: string): string;
|
|
3
|
+
export declare function validateOpenRouterKey(key: string, endpoint?: string): Promise<boolean>;
|
|
4
|
+
export declare function readOpenRouterKey(): string | null;
|
|
5
|
+
export declare function writeOpenRouterKey(key: string): void;
|
|
6
|
+
export declare function runAuth(argv: string[]): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"AAWA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAoE,GAAG,OAAO,CAAC,OAAO,CAAC,CAYvJ;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAQjD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAW7D"}
|
package/dist/cli/auth.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.openRouterKeyPath = openRouterKeyPath;
|
|
37
|
+
exports.keyFingerprint = keyFingerprint;
|
|
38
|
+
exports.validateOpenRouterKey = validateOpenRouterKey;
|
|
39
|
+
exports.readOpenRouterKey = readOpenRouterKey;
|
|
40
|
+
exports.writeOpenRouterKey = writeOpenRouterKey;
|
|
41
|
+
exports.runAuth = runAuth;
|
|
42
|
+
const crypto = __importStar(require("crypto"));
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const http = __importStar(require("http"));
|
|
45
|
+
const https = __importStar(require("https"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const readline = __importStar(require("readline"));
|
|
48
|
+
const index_1 = require("../index");
|
|
49
|
+
const colors_1 = require("./colors");
|
|
50
|
+
const OPENROUTER_AUTH_URL = 'https://openrouter.ai/api/v1/auth/key';
|
|
51
|
+
function openRouterKeyPath() {
|
|
52
|
+
return path.join((0, colors_1.agentguardHome)(), 'openrouter-key');
|
|
53
|
+
}
|
|
54
|
+
function keyFingerprint(key) {
|
|
55
|
+
return crypto.createHash('sha256').update(key).digest('hex').slice(0, 16);
|
|
56
|
+
}
|
|
57
|
+
async function validateOpenRouterKey(key, endpoint = process.env.AGENTGUARD_OPENROUTER_AUTH_URL || OPENROUTER_AUTH_URL) {
|
|
58
|
+
if (!key.trim())
|
|
59
|
+
return false;
|
|
60
|
+
if (endpoint.startsWith('mock://')) {
|
|
61
|
+
const expected = new URL(endpoint).searchParams.get('key');
|
|
62
|
+
return expected === key.trim();
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const status = await requestStatus(endpoint, key.trim());
|
|
66
|
+
return status >= 200 && status < 300;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function readOpenRouterKey() {
|
|
73
|
+
if (process.env.OPENROUTER_API_KEY)
|
|
74
|
+
return process.env.OPENROUTER_API_KEY;
|
|
75
|
+
try {
|
|
76
|
+
const value = fs.readFileSync(openRouterKeyPath(), 'utf8').trim();
|
|
77
|
+
return value.length > 0 ? value : null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function writeOpenRouterKey(key) {
|
|
84
|
+
const filePath = openRouterKeyPath();
|
|
85
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
86
|
+
fs.writeFileSync(filePath, key.trim() + '\n', { mode: 0o600 });
|
|
87
|
+
try {
|
|
88
|
+
fs.chmodSync(filePath, 0o600);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function runAuth(argv) {
|
|
95
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
96
|
+
console.log('agentguard auth openrouter | status | clear openrouter');
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
const sub = argv[0] ?? 'status';
|
|
100
|
+
if (sub === 'status')
|
|
101
|
+
return authStatus();
|
|
102
|
+
if (sub === 'clear' && argv[1] === 'openrouter')
|
|
103
|
+
return clearOpenRouter();
|
|
104
|
+
if (sub === 'openrouter')
|
|
105
|
+
return configureOpenRouter(argv);
|
|
106
|
+
console.error(`agentguard auth: unknown command '${argv.join(' ')}'`);
|
|
107
|
+
return 2;
|
|
108
|
+
}
|
|
109
|
+
async function configureOpenRouter(argv) {
|
|
110
|
+
const flagKey = valueAfter(argv, '--key');
|
|
111
|
+
const key = flagKey ?? await promptForKey();
|
|
112
|
+
if (!key) {
|
|
113
|
+
console.error('No key provided.');
|
|
114
|
+
return 2;
|
|
115
|
+
}
|
|
116
|
+
const ok = await validateOpenRouterKey(key);
|
|
117
|
+
if (!ok) {
|
|
118
|
+
console.error('OpenRouter key validation failed.');
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
writeOpenRouterKey(key);
|
|
122
|
+
console.log('');
|
|
123
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log(` ${(0, colors_1.green)('configured')} openrouter fingerprint ${keyFingerprint(key)}`);
|
|
126
|
+
console.log(` ${(0, colors_1.dim)('saved')} ${openRouterKeyPath()}`);
|
|
127
|
+
console.log('');
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
function authStatus() {
|
|
131
|
+
const key = readOpenRouterKey();
|
|
132
|
+
console.log('');
|
|
133
|
+
console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
|
|
134
|
+
console.log('');
|
|
135
|
+
if (key) {
|
|
136
|
+
console.log(` ${(0, colors_1.green)('openrouter')} configured fingerprint ${keyFingerprint(key)}`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log(` ${(0, colors_1.yellow)('openrouter')} not configured`);
|
|
140
|
+
}
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log(' ' + (0, colors_1.statusBar)());
|
|
143
|
+
console.log('');
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
function clearOpenRouter() {
|
|
147
|
+
try {
|
|
148
|
+
fs.unlinkSync(openRouterKeyPath());
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
console.log('OpenRouter key removed.');
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
async function promptForKey() {
|
|
157
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
158
|
+
return new Promise((resolve) => {
|
|
159
|
+
rl.question('OpenRouter API key: ', (answer) => {
|
|
160
|
+
rl.close();
|
|
161
|
+
resolve(answer.trim());
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function requestStatus(endpoint, key) {
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
const url = new URL(endpoint);
|
|
168
|
+
const client = url.protocol === 'http:' ? http : https;
|
|
169
|
+
const req = client.request({
|
|
170
|
+
method: 'GET',
|
|
171
|
+
hostname: url.hostname,
|
|
172
|
+
port: url.port,
|
|
173
|
+
path: url.pathname + url.search,
|
|
174
|
+
headers: { authorization: `Bearer ${key}`, accept: 'application/json' },
|
|
175
|
+
timeout: 5000,
|
|
176
|
+
}, (res) => {
|
|
177
|
+
res.resume();
|
|
178
|
+
res.on('end', () => resolve(res.statusCode ?? 0));
|
|
179
|
+
});
|
|
180
|
+
req.on('error', reject);
|
|
181
|
+
req.on('timeout', () => req.destroy(new Error('OpenRouter auth validation timed out')));
|
|
182
|
+
req.end();
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function valueAfter(argv, flag) {
|
|
186
|
+
const index = argv.indexOf(flag);
|
|
187
|
+
return index >= 0 ? argv[index + 1] : undefined;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coach.d.ts","sourceRoot":"","sources":["../../src/cli/coach.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgF9D"}
|