@agentguard-run/spend 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +1 -1
  3. package/README.es-419.md +28 -102
  4. package/README.md +50 -124
  5. package/README.pt-BR.md +28 -102
  6. package/dist/bindings/anthropic.d.ts +11 -0
  7. package/dist/bindings/anthropic.d.ts.map +1 -0
  8. package/dist/bindings/anthropic.js +116 -0
  9. package/dist/bindings/anthropic.js.map +1 -0
  10. package/dist/bindings/bedrock.d.ts +11 -0
  11. package/dist/bindings/bedrock.d.ts.map +1 -0
  12. package/dist/bindings/bedrock.js +177 -0
  13. package/dist/bindings/bedrock.js.map +1 -0
  14. package/dist/cli/auth.d.ts +7 -0
  15. package/dist/cli/auth.d.ts.map +1 -0
  16. package/dist/cli/auth.js +189 -0
  17. package/dist/cli/auth.js.map +1 -0
  18. package/dist/cli/colors.d.ts +8 -3
  19. package/dist/cli/colors.d.ts.map +1 -1
  20. package/dist/cli/colors.js +93 -4
  21. package/dist/cli/colors.js.map +1 -1
  22. package/dist/cli/demo.d.ts.map +1 -1
  23. package/dist/cli/demo.js +23 -2
  24. package/dist/cli/demo.js.map +1 -1
  25. package/dist/cli/main.d.ts +0 -6
  26. package/dist/cli/main.d.ts.map +1 -1
  27. package/dist/cli/main.js +36 -16
  28. package/dist/cli/main.js.map +1 -1
  29. package/dist/cli/models.d.ts +18 -0
  30. package/dist/cli/models.d.ts.map +1 -0
  31. package/dist/cli/models.js +277 -0
  32. package/dist/cli/models.js.map +1 -0
  33. package/dist/cli/tips.d.ts +21 -0
  34. package/dist/cli/tips.d.ts.map +1 -0
  35. package/dist/cli/tips.js +191 -0
  36. package/dist/cli/tips.js.map +1 -0
  37. package/dist/cli/wizard.d.ts +27 -0
  38. package/dist/cli/wizard.d.ts.map +1 -0
  39. package/dist/cli/wizard.js +182 -0
  40. package/dist/cli/wizard.js.map +1 -0
  41. package/dist/cost-table.d.ts +11 -36
  42. package/dist/cost-table.d.ts.map +1 -1
  43. package/dist/cost-table.js +114 -45
  44. package/dist/cost-table.js.map +1 -1
  45. package/dist/index.d.ts +6 -3
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +25 -8
  48. package/dist/index.js.map +1 -1
  49. package/dist/openrouter-catalog.d.ts +56 -0
  50. package/dist/openrouter-catalog.d.ts.map +1 -0
  51. package/dist/openrouter-catalog.js +183 -0
  52. package/dist/openrouter-catalog.js.map +1 -0
  53. package/dist/spend-guard.d.ts +38 -55
  54. package/dist/spend-guard.d.ts.map +1 -1
  55. package/dist/spend-guard.js +268 -83
  56. package/dist/spend-guard.js.map +1 -1
  57. package/dist/telemetry.d.ts.map +1 -1
  58. package/dist/telemetry.js +52 -21
  59. package/dist/telemetry.js.map +1 -1
  60. package/dist/templates/index.d.ts +17 -0
  61. package/dist/templates/index.d.ts.map +1 -0
  62. package/dist/templates/index.js +100 -0
  63. package/dist/templates/index.js.map +1 -0
  64. package/dist/types.d.ts +18 -3
  65. package/dist/types.d.ts.map +1 -1
  66. package/package.json +32 -4
  67. package/src/bindings/anthropic.ts +142 -0
  68. package/src/bindings/bedrock.ts +200 -0
  69. package/src/cli/auth.ts +145 -0
  70. package/src/cli/models.ts +236 -0
  71. package/src/cli/tips.ts +161 -0
  72. package/src/cli/wizard.ts +160 -0
  73. package/src/openrouter-catalog.ts +180 -0
  74. package/src/templates/agent-support.yaml +30 -0
  75. package/src/templates/chargeback-evidence.yaml +30 -0
  76. package/src/templates/code-scan.yaml +30 -0
  77. package/src/templates/index.ts +109 -0
  78. package/src/templates/payment-approval.yaml +30 -0
  79. package/src/templates/risk-review.yaml +30 -0
  80. 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"}
@@ -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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"}
@@ -2,9 +2,9 @@
2
2
  * ANSI color helpers with TTY detection.
3
3
  *
4
4
  * Honors:
5
- * - NO_COLOR=1 (industry standard; https://no-color.org)
6
- * - AGENTGUARD_COLOR=0 (product-specific opt-out)
7
- * - process.stdout.isTTY (no color when piped to file or non-TTY)
5
+ * - NO_COLOR=1
6
+ * - AGENTGUARD_COLOR=0
7
+ * - process.stdout.isTTY
8
8
  */
9
9
  export declare const red: (text: string) => string;
10
10
  export declare const green: (text: string) => string;
@@ -18,5 +18,10 @@ export declare const dim: (text: string) => string;
18
18
  export declare function cyanBold(text: string): string;
19
19
  export declare function redBold(text: string): string;
20
20
  export declare function greenBold(text: string): string;
21
+ export declare function agentguardHome(): string;
22
+ export declare function currentPolicyPath(): string | null;
23
+ export declare function currentPolicyId(): string;
24
+ export declare function currentScopeLabel(): string;
21
25
  export declare function banner(version: string): string;
26
+ export declare function statusBar(): string;
22
27
  //# sourceMappingURL=colors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,eAAO,MAAM,GAAG,SAJoB,MAAM,KAAK,MAIlB,CAAC;AAC9B,eAAO,MAAM,KAAK,SALkB,MAAM,KAAK,MAKhB,CAAC;AAChC,eAAO,MAAM,MAAM,SANiB,MAAM,KAAK,MAMf,CAAC;AACjC,eAAO,MAAM,IAAI,SAPmB,MAAM,KAAK,MAOjB,CAAC;AAC/B,eAAO,MAAM,SAAS,SARc,MAAM,KAAK,MAQZ,CAAC;AACpC,eAAO,MAAM,WAAW,SATY,MAAM,KAAK,MASV,CAAC;AACtC,eAAO,MAAM,UAAU,SAVa,MAAM,KAAK,MAUX,CAAC;AACrC,eAAO,MAAM,IAAI,SAXmB,MAAM,KAAK,MAWlB,CAAC;AAC9B,eAAO,MAAM,GAAG,SAZoB,MAAM,KAAK,MAYnB,CAAC;AAE7B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,eAAO,MAAM,GAAG,SAJoB,MAAM,KAAK,MAIlB,CAAC;AAC9B,eAAO,MAAM,KAAK,SALkB,MAAM,KAAK,MAKhB,CAAC;AAChC,eAAO,MAAM,MAAM,SANiB,MAAM,KAAK,MAMf,CAAC;AACjC,eAAO,MAAM,IAAI,SAPmB,MAAM,KAAK,MAOjB,CAAC;AAC/B,eAAO,MAAM,SAAS,SARc,MAAM,KAAK,MAQZ,CAAC;AACpC,eAAO,MAAM,WAAW,SATY,MAAM,KAAK,MASV,CAAC;AACtC,eAAO,MAAM,UAAU,SAVa,MAAM,KAAK,MAUX,CAAC;AACrC,eAAO,MAAM,IAAI,SAXmB,MAAM,KAAK,MAWlB,CAAC;AAC9B,eAAO,MAAM,GAAG,SAZoB,MAAM,KAAK,MAYnB,CAAC;AAE7B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAcjD;AAED,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY9C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC"}