@agentguard-run/spend 0.1.6 → 0.1.8

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.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `agentguard doctor` — check installation health and configuration.
3
+ */
4
+ export declare function runDoctor(argv: string[]): Promise<number>;
5
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+FH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyF/D"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * `agentguard doctor` — check installation health and configuration.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runDoctor = runDoctor;
40
+ const fs = __importStar(require("fs"));
41
+ const os = __importStar(require("os"));
42
+ const path = __importStar(require("path"));
43
+ const index_1 = require("../index");
44
+ const colors_1 = require("./colors");
45
+ function checkRequire(name) {
46
+ try {
47
+ const m = require(name);
48
+ const version = m.VERSION || m.version || '?';
49
+ return { ok: true, note: `v${version}` };
50
+ }
51
+ catch {
52
+ return { ok: false, note: 'not installed (optional)' };
53
+ }
54
+ }
55
+ function checkWritable(p) {
56
+ try {
57
+ fs.mkdirSync(p, { recursive: true });
58
+ const testFile = path.join(p, '.doctor-write-test');
59
+ fs.writeFileSync(testFile, 'ok');
60
+ fs.unlinkSync(testFile);
61
+ return { ok: true, note: p };
62
+ }
63
+ catch (e) {
64
+ return { ok: false, note: String(e) };
65
+ }
66
+ }
67
+ async function checkCrypto() {
68
+ try {
69
+ const ed = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
70
+ const priv = new Uint8Array(32);
71
+ for (let i = 0; i < 32; i++)
72
+ priv[i] = i;
73
+ const pub = await ed.getPublicKeyAsync(priv);
74
+ if (pub.length === 32) {
75
+ return { ok: true, note: 'Ed25519 key derivation OK (32-byte public key)' };
76
+ }
77
+ return { ok: false, note: `unexpected public key size: ${pub.length}` };
78
+ }
79
+ catch (e) {
80
+ return { ok: false, note: `crypto backend failed: ${e}` };
81
+ }
82
+ }
83
+ async function checkDryRunBlock() {
84
+ try {
85
+ const { SpendGuard } = await Promise.resolve().then(() => __importStar(require('../spend-guard')));
86
+ const { InMemorySpendStore } = await Promise.resolve().then(() => __importStar(require('../store-memory')));
87
+ const { InMemoryDecisionLogStore } = await Promise.resolve().then(() => __importStar(require('../decision-log')));
88
+ const ed = await Promise.resolve().then(() => __importStar(require('@noble/ed25519')));
89
+ const privateKey = new Uint8Array(32);
90
+ for (let i = 0; i < 32; i++)
91
+ privateKey[i] = i;
92
+ const publicKey = await ed.getPublicKeyAsync(privateKey);
93
+ const policy = {
94
+ id: 'doctor-v1',
95
+ name: 'Doctor dry-run policy',
96
+ scope: { tenantId: 'doctor' },
97
+ caps: [
98
+ { amountCents: 0, window: 'per_day', action: 'block', reason: 'doctor check' },
99
+ ],
100
+ mode: 'enforce',
101
+ version: 1,
102
+ effectiveFrom: '2026-01-01T00:00:00.000Z',
103
+ };
104
+ const guard = new SpendGuard({
105
+ policy,
106
+ spendStore: new InMemorySpendStore(),
107
+ logStore: new InMemoryDecisionLogStore(),
108
+ signingKeys: { privateKey, publicKey },
109
+ });
110
+ const result = await guard.decide({
111
+ provider: 'openai',
112
+ model: 'gpt-4o',
113
+ inputTokens: 100,
114
+ outputTokens: 50,
115
+ scope: { tenantId: 'doctor', agentId: 'dry-run' },
116
+ });
117
+ if (result.decision?.action === 'block') {
118
+ return { ok: true, note: 'block path fires correctly' };
119
+ }
120
+ return {
121
+ ok: false,
122
+ note: `expected action=block, got action=${result.decision?.action}`,
123
+ };
124
+ }
125
+ catch (e) {
126
+ return { ok: false, note: `dry-run block failed: ${e}` };
127
+ }
128
+ }
129
+ async function runDoctor(argv) {
130
+ if (argv.includes('--help') || argv.includes('-h')) {
131
+ console.log('agentguard doctor');
132
+ return 0;
133
+ }
134
+ console.log('');
135
+ console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
136
+ console.log('');
137
+ console.log(' ' + (0, colors_1.cyanBold)('agentguard doctor') + (0, colors_1.dim)(' · setup health check'));
138
+ console.log('');
139
+ const checks = [];
140
+ // 1. Core package self-check
141
+ checks.push({
142
+ name: '@agentguard-run/spend package',
143
+ ok: true,
144
+ note: `v${index_1.AGENTGUARD_SPEND_VERSION}`,
145
+ });
146
+ // 2. Crypto
147
+ const cryptoCheck = await checkCrypto();
148
+ checks.push({ name: 'Ed25519 crypto backend', ...cryptoCheck });
149
+ // 3. Optional providers
150
+ for (const provider of ['openai', '@anthropic-ai/sdk', '@aws-sdk/client-bedrock-runtime']) {
151
+ const r = checkRequire(provider);
152
+ checks.push({ name: `provider: ${provider}`, ...r, optional: true });
153
+ }
154
+ // 4. ~/.agentguard writable
155
+ checks.push({
156
+ name: '~/.agentguard/ writable',
157
+ ...checkWritable(path.join(os.homedir(), '.agentguard')),
158
+ });
159
+ // 5. Policy file in cwd
160
+ const policyPath = path.join(process.cwd(), 'agentguard.policy.yaml');
161
+ if (fs.existsSync(policyPath)) {
162
+ checks.push({ name: 'policy file (cwd)', ok: true, note: `found: ${path.basename(policyPath)}` });
163
+ }
164
+ else {
165
+ checks.push({
166
+ name: 'policy file (cwd)',
167
+ ok: false,
168
+ note: `not found in ${path.basename(process.cwd())}/ — run 'agentguard init'`,
169
+ });
170
+ }
171
+ // 6. Dry-run block
172
+ const dryRun = await checkDryRunBlock();
173
+ checks.push({ name: 'dry-run block simulation', ...dryRun });
174
+ const labelWidth = Math.max(...checks.map((c) => c.name.length)) + 2;
175
+ let passCount = 0;
176
+ let optionalFailCount = 0;
177
+ let failCount = 0;
178
+ for (const c of checks) {
179
+ let mark;
180
+ if (c.ok) {
181
+ mark = (0, colors_1.green)('✓');
182
+ passCount++;
183
+ }
184
+ else if (c.optional) {
185
+ mark = (0, colors_1.dim)('·');
186
+ optionalFailCount++;
187
+ }
188
+ else {
189
+ mark = (0, colors_1.redBold)('✗');
190
+ failCount++;
191
+ }
192
+ console.log(` ${mark} ${c.name.padEnd(labelWidth)}${(0, colors_1.dim)(c.note)}`);
193
+ }
194
+ console.log('');
195
+ console.log((0, colors_1.dim)(' ───────────────────────────────────────────'));
196
+ if (failCount === 0) {
197
+ console.log(` ${(0, colors_1.greenBold)('healthy')} ` +
198
+ (0, colors_1.dim)(`(${passCount} passing, ${optionalFailCount} optional providers not installed)`));
199
+ console.log('');
200
+ return 0;
201
+ }
202
+ console.log(` ${(0, colors_1.redBold)('issues found')} ` + (0, colors_1.dim)(`(${failCount} failing, ${passCount} passing)`));
203
+ console.log('');
204
+ console.log((0, colors_1.dim)(" fix the ✗ items above, then re-run 'agentguard doctor'."));
205
+ console.log('');
206
+ return 1;
207
+ }
208
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+FH,8BAyFC;AAtLD,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,oCAAoD;AACpD,qCAA4E;AAE5E,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;QAC9C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACpD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,gDAAgD,EAAE,CAAC;QAC9E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,CAAC,EAAE,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;QACtD,MAAM,EAAE,kBAAkB,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;QAC/D,MAAM,EAAE,wBAAwB,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;QACrE,MAAM,EAAE,GAAG,wDAAa,gBAAgB,GAAC,CAAC;QAE1C,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAQ;YAClB,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC7B,IAAI,EAAE;gBACJ,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE;aAC/E;YACD,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,CAAC;YACV,aAAa,EAAE,0BAA0B;SAC1C,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC;YAC3B,MAAM;YACN,UAAU,EAAE,IAAI,kBAAkB,EAAE;YACpC,QAAQ,EAAE,IAAI,wBAAwB,EAAE;YACxC,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;SACvC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAChC,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;SAC3C,CAAC,CAAC;QAEV,IAAK,MAAc,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;YACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,qCAAsC,MAAc,CAAC,QAAQ,EAAE,MAAM,EAAE;SAC9E,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAA,eAAM,EAAC,gCAAwB,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAA,iBAAQ,EAAC,mBAAmB,CAAC,GAAG,IAAA,YAAG,EAAC,yBAAyB,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAGhB,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,6BAA6B;IAC7B,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,+BAA+B;QACrC,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI,gCAAwB,EAAE;KACrC,CAAC,CAAC;IAEH,YAAY;IACZ,MAAM,WAAW,GAAG,MAAM,WAAW,EAAE,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;IAEhE,wBAAwB;IACxB,KAAK,MAAM,QAAQ,IAAI,CAAC,QAAQ,EAAE,mBAAmB,EAAE,iCAAiC,CAAC,EAAE,CAAC;QAC1F,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,4BAA4B;IAC5B,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,yBAAyB;QAC/B,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;KACzD,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,gBAAgB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,2BAA2B;SAC9E,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,IAAI,GAAG,IAAA,cAAK,EAAC,GAAG,CAAC,CAAC;YAClB,SAAS,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,GAAG,IAAA,YAAG,EAAC,GAAG,CAAC,CAAC;YAChB,iBAAiB,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAA,gBAAO,EAAC,GAAG,CAAC,CAAC;YACpB,SAAS,EAAE,CAAC;QACd,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAA,YAAG,EAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,YAAG,EAAC,+CAA+C,CAAC,CAAC,CAAC;IAClE,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CACT,KAAK,IAAA,kBAAS,EAAC,SAAS,CAAC,IAAI;YAC3B,IAAA,YAAG,EAAC,IAAI,SAAS,aAAa,iBAAiB,oCAAoC,CAAC,CACvF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,gBAAO,EAAC,cAAc,CAAC,IAAI,GAAG,IAAA,YAAG,EAAC,IAAI,SAAS,aAAa,SAAS,WAAW,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,YAAG,EAAC,2DAA2D,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `agentguard explain` — decode a signed receipt with cap math + signature breakdown.
3
+ */
4
+ export declare function runExplain(argv: string[]): Promise<number>;
5
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/cli/explain.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6GhE"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /**
3
+ * `agentguard explain` — decode a signed receipt with cap math + signature breakdown.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runExplain = runExplain;
40
+ const fs = __importStar(require("fs"));
41
+ const os = __importStar(require("os"));
42
+ const path = __importStar(require("path"));
43
+ const index_1 = require("../index");
44
+ const colors_1 = require("./colors");
45
+ const DEMO_RECEIPT = path.join(os.homedir(), '.agentguard', 'demo', 'latest-receipt.json');
46
+ const WINDOW_LABELS = {
47
+ per_call: 'per call',
48
+ per_minute: 'per minute',
49
+ per_hour: 'per hour',
50
+ per_day: 'per day',
51
+ per_month: 'per month',
52
+ };
53
+ const WINDOW_RESETS = {
54
+ per_call: 'next call',
55
+ per_minute: 'top of next minute (UTC)',
56
+ per_hour: 'top of next hour (UTC)',
57
+ per_day: 'UTC midnight',
58
+ per_month: '1st of next month (UTC)',
59
+ };
60
+ function formatCents(cents) {
61
+ const sign = cents < 0 ? '-' : '';
62
+ const abs = Math.abs(Math.round(cents));
63
+ const dollars = Math.floor(abs / 100);
64
+ const remainder = abs % 100;
65
+ const dollarsStr = dollars.toLocaleString('en-US');
66
+ const remainderStr = String(remainder).padStart(2, '0');
67
+ return `${sign}$${dollarsStr}.${remainderStr}`;
68
+ }
69
+ async function runExplain(argv) {
70
+ if (argv.includes('--help') || argv.includes('-h')) {
71
+ console.log('agentguard explain [latest|<path>]');
72
+ return 0;
73
+ }
74
+ const receiptArg = argv.find((a) => !a.startsWith('-')) || 'latest';
75
+ console.log('');
76
+ console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
77
+ console.log('');
78
+ console.log(' ' + (0, colors_1.cyanBold)(`agentguard explain ${receiptArg}`));
79
+ console.log('');
80
+ let source;
81
+ if (receiptArg === 'latest') {
82
+ if (!fs.existsSync(DEMO_RECEIPT)) {
83
+ console.log(' ' + (0, colors_1.redBold)('error: ') + 'no demo receipt found.');
84
+ console.log(` run ${(0, colors_1.greenBold)('agentguard demo')} first to produce a receipt.`);
85
+ console.log('');
86
+ return 2;
87
+ }
88
+ source = DEMO_RECEIPT;
89
+ }
90
+ else {
91
+ source = path.resolve(receiptArg.replace(/^~/, os.homedir()));
92
+ if (!fs.existsSync(source)) {
93
+ console.log(' ' + (0, colors_1.redBold)('error: ') + `receipt file not found: ${source}`);
94
+ console.log('');
95
+ return 2;
96
+ }
97
+ }
98
+ const raw = JSON.parse(fs.readFileSync(source, 'utf-8'));
99
+ const decision = raw.decision;
100
+ const cap = decision.triggeredCap;
101
+ const agentId = String(decision.triggeredScopeKey || 'unknown')
102
+ .split('|')
103
+ .pop()
104
+ .replace('agentId=', '');
105
+ // 1. What happened
106
+ console.log((0, colors_1.dim)(' what happened'));
107
+ console.log((0, colors_1.dim)(' ─────────────'));
108
+ const action = decision.action || '?';
109
+ const colorAction = action === 'block'
110
+ ? (0, colors_1.redBold)(action.toUpperCase())
111
+ : action === 'downgrade'
112
+ ? (0, colors_1.yellow)(action.toUpperCase())
113
+ : (0, colors_1.green)(action.toUpperCase());
114
+ console.log(` action ${colorAction}`);
115
+ console.log(` agent ${agentId}`);
116
+ console.log(` provider ${decision.provider || '?'}`);
117
+ console.log(` model ${decision.modelRequested || '?'}`);
118
+ console.log('');
119
+ // 2. Cap math
120
+ console.log((0, colors_1.dim)(' cap math'));
121
+ console.log((0, colors_1.dim)(' ────────'));
122
+ const projected = decision.projectedCents || 0;
123
+ const windowBefore = decision.windowSpendBefore || 0;
124
+ console.log(` this call would have cost ${(0, colors_1.greenBold)(formatCents(projected))}`);
125
+ console.log(` spent in window before ${formatCents(windowBefore)}`);
126
+ if (cap) {
127
+ const capCents = cap.amountCents || 0;
128
+ const window = cap.window || '?';
129
+ const windowLabel = WINDOW_LABELS[window] || window;
130
+ const remaining = Math.max(0, capCents - windowBefore);
131
+ const overBy = Math.max(0, projected - remaining);
132
+ console.log(` cap ${(0, colors_1.redBold)(formatCents(capCents))} ${(0, colors_1.dim)(windowLabel)}`);
133
+ console.log(` remaining in window ${formatCents(remaining)}`);
134
+ if (overBy > 0)
135
+ console.log(` call exceeds remaining by ${(0, colors_1.redBold)(formatCents(overBy))}`);
136
+ const saved = Math.max(0, projected - remaining);
137
+ if (saved > 0)
138
+ console.log(` amount saved by block ${(0, colors_1.greenBold)('+' + formatCents(saved))}`);
139
+ console.log('');
140
+ console.log((0, colors_1.dim)(' what unblocks'));
141
+ console.log((0, colors_1.dim)(' ─────────────'));
142
+ const reset = WINDOW_RESETS[window] || 'next window boundary';
143
+ console.log(` window resets at ${(0, colors_1.greenBold)(reset)}`);
144
+ if (cap.downgradeTo)
145
+ console.log(` downgrade target ${(0, colors_1.greenBold)(cap.downgradeTo)}`);
146
+ console.log('');
147
+ }
148
+ // 3. Cryptographic receipt
149
+ console.log((0, colors_1.dim)(' cryptographic receipt'));
150
+ console.log((0, colors_1.dim)(' ─────────────────────'));
151
+ console.log(` sequence ${raw.sequence ?? '?'}`);
152
+ console.log(` entry hash ${String(raw.entryHash || '?').slice(0, 48)}${(0, colors_1.dim)('...')}`);
153
+ console.log(` prev hash ${String(raw.previousHash || '?').slice(0, 48)}${(0, colors_1.dim)('...')}`);
154
+ console.log(` signer (fp) ${String(raw.signerFingerprint || '?').slice(0, 32)}${(0, colors_1.dim)('...')}`);
155
+ const signature = String(raw.signature || '');
156
+ console.log(` signature ${signature.slice(0, 48)}${signature.length > 48 ? (0, colors_1.dim)('...') : ''}`);
157
+ console.log('');
158
+ console.log(` ${(0, colors_1.dim)('to verify cryptographically:')} ${(0, colors_1.greenBold)('agentguard verify --trace latest')}`);
159
+ console.log('');
160
+ // 4. Policy
161
+ console.log((0, colors_1.dim)(' policy'));
162
+ console.log((0, colors_1.dim)(' ──────'));
163
+ console.log(` id ${decision.policyId || '?'}`);
164
+ console.log(` version ${decision.policyVersion || '?'}`);
165
+ console.log(` mode ${decision.enforcementMode || '?'}`);
166
+ const reasons = decision.reasons || [];
167
+ if (reasons.length > 0)
168
+ console.log(` reasons ${reasons.join('; ')}`);
169
+ console.log('');
170
+ return 0;
171
+ }
172
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/cli/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `agentguard init` — scaffold a project to use AgentGuard Spend.
3
+ */
4
+ export declare function runInit(argv: string[]): Promise<number>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuGH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2E7D"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * `agentguard init` — scaffold a project to use AgentGuard Spend.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runInit = runInit;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const index_1 = require("../index");
43
+ const colors_1 = require("./colors");
44
+ const POLICY_TEMPLATE = (now) => `# AgentGuard Spend policy (generated by \`agentguard init\`)
45
+ # All amounts are integer cents. 500 = $5.00.
46
+ id: my-default-policy-v1
47
+ name: My default AgentGuard policy
48
+ version: 1
49
+ effectiveFrom: "${now}"
50
+ mode: enforce
51
+
52
+ scope:
53
+ tenantId: my-tenant
54
+
55
+ caps:
56
+ # Soft daily cap: when $5/day reached, downgrade to a cheaper model.
57
+ - amountCents: 500
58
+ window: per_day
59
+ action: downgrade
60
+ downgradeTo: gpt-4o-mini
61
+ reason: "Soft daily cap reached, routing to gpt-4o-mini"
62
+
63
+ # Hard daily ceiling: at $20/day, block the call.
64
+ - amountCents: 2000
65
+ window: per_day
66
+ action: block
67
+ reason: "Hard daily ceiling ($20/day)"
68
+
69
+ # Per-minute burst guard: catches runaway loops.
70
+ - amountCents: 200
71
+ window: per_minute
72
+ action: block
73
+ reason: "Per-minute burst guard ($2/min)"
74
+ `;
75
+ const QUICKSTART_TEMPLATE = `/**
76
+ * AgentGuard Spend quickstart (generated by \`agentguard init\`).
77
+ *
78
+ * Run after \`npm install @agentguard-run/spend openai\`:
79
+ * node agentguard_quickstart.js
80
+ */
81
+ import OpenAI from 'openai';
82
+ import {
83
+ withSpendGuard,
84
+ AgentGuardBlockedError,
85
+ type SpendPolicy,
86
+ } from '@agentguard-run/spend';
87
+ import { randomBytes } from 'crypto';
88
+
89
+ const policy: SpendPolicy = {
90
+ id: 'my-default-policy-v1',
91
+ name: 'My default AgentGuard policy',
92
+ scope: { tenantId: 'my-tenant' },
93
+ caps: [
94
+ {
95
+ amountCents: 500,
96
+ window: 'per_day',
97
+ action: 'downgrade',
98
+ downgradeTo: 'gpt-4o-mini',
99
+ reason: 'Soft daily cap reached, routing to gpt-4o-mini',
100
+ },
101
+ {
102
+ amountCents: 2000,
103
+ window: 'per_day',
104
+ action: 'block',
105
+ reason: 'Hard daily ceiling (\$20/day)',
106
+ },
107
+ ],
108
+ mode: 'enforce',
109
+ version: 1,
110
+ effectiveFrom: '${new Date().toISOString()}',
111
+ };
112
+
113
+ const privateKey = new Uint8Array(randomBytes(32));
114
+
115
+ const client = withSpendGuard(new OpenAI(), {
116
+ policy,
117
+ scope: { tenantId: 'my-tenant', agentId: 'my-first-agent' },
118
+ config: {
119
+ policy,
120
+ signingKeys: { privateKey, publicKey: new Uint8Array(32) },
121
+ },
122
+ });
123
+
124
+ try {
125
+ const response = await client.chat.completions.create({
126
+ model: 'gpt-4o',
127
+ messages: [{ role: 'user', content: 'Hello from AgentGuard!' }],
128
+ });
129
+ console.log(response.choices[0].message.content);
130
+ } catch (err) {
131
+ if (err instanceof AgentGuardBlockedError) {
132
+ console.error(err.message);
133
+ } else {
134
+ throw err;
135
+ }
136
+ }
137
+ `;
138
+ async function runInit(argv) {
139
+ const force = argv.includes('--force');
140
+ const policyOnly = argv.includes('--policy-only');
141
+ if (argv.includes('--help') || argv.includes('-h')) {
142
+ console.log('agentguard init [--force] [--policy-only]');
143
+ return 0;
144
+ }
145
+ const cwd = process.cwd();
146
+ const policyPath = path.join(cwd, 'agentguard.policy.yaml');
147
+ const quickstartPath = path.join(cwd, 'agentguard_quickstart.ts');
148
+ const gitignorePath = path.join(cwd, '.gitignore');
149
+ console.log('');
150
+ console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
151
+ console.log('');
152
+ console.log(' ' + (0, colors_1.cyanBold)('agentguard init') + (0, colors_1.dim)(' · scaffold a project'));
153
+ console.log('');
154
+ const created = [];
155
+ const skipped = [];
156
+ if (fs.existsSync(policyPath) && !force) {
157
+ skipped.push([path.basename(policyPath), 'already exists (use --force to overwrite)']);
158
+ }
159
+ else {
160
+ const now = new Date().toISOString();
161
+ fs.writeFileSync(policyPath, POLICY_TEMPLATE(now));
162
+ created.push(path.basename(policyPath));
163
+ }
164
+ if (!policyOnly) {
165
+ if (fs.existsSync(quickstartPath) && !force) {
166
+ skipped.push([path.basename(quickstartPath), 'already exists (use --force to overwrite)']);
167
+ }
168
+ else {
169
+ fs.writeFileSync(quickstartPath, QUICKSTART_TEMPLATE);
170
+ created.push(path.basename(quickstartPath));
171
+ }
172
+ }
173
+ let gitignoreModified = false;
174
+ if (fs.existsSync(gitignorePath)) {
175
+ const existing = fs.readFileSync(gitignorePath, 'utf-8');
176
+ if (!existing.includes('.agentguard')) {
177
+ const prefix = existing.endsWith('\n') ? '' : '\n';
178
+ fs.appendFileSync(gitignorePath, prefix + '.agentguard/\n');
179
+ gitignoreModified = true;
180
+ }
181
+ }
182
+ else {
183
+ fs.writeFileSync(gitignorePath, '.agentguard/\n');
184
+ gitignoreModified = true;
185
+ created.push('.gitignore');
186
+ }
187
+ for (const p of created)
188
+ console.log(` ${(0, colors_1.green)('+ created')} ${p}`);
189
+ if (gitignoreModified && !created.includes('.gitignore')) {
190
+ console.log(` ${(0, colors_1.green)('~ updated')} .gitignore ${(0, colors_1.dim)('(added .agentguard/)')}`);
191
+ }
192
+ for (const [p, reason] of skipped) {
193
+ console.log(` ${(0, colors_1.yellow)('= skipped')} ${p} ${(0, colors_1.dim)('(' + reason + ')')}`);
194
+ }
195
+ if (created.length === 0 && !gitignoreModified) {
196
+ console.log(` ${(0, colors_1.yellow)('nothing to do')} ${(0, colors_1.dim)('all files exist; pass --force to overwrite')}`);
197
+ return 0;
198
+ }
199
+ console.log('');
200
+ console.log((0, colors_1.dim)(' ───────────────────────────────────────────'));
201
+ console.log(` ${(0, colors_1.dim)('next:')}`);
202
+ console.log(` 1. edit ${(0, colors_1.greenBold)('agentguard.policy.yaml')} to set your caps`);
203
+ console.log(` 2. ${(0, colors_1.greenBold)('node agentguard_quickstart.js')} ${(0, colors_1.dim)('to see it in action')}`);
204
+ console.log(` 3. ${(0, colors_1.greenBold)('agentguard doctor')} ${(0, colors_1.dim)('to verify your setup')}`);
205
+ console.log('');
206
+ return 0;
207
+ }
208
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlF"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8BH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClF"}
package/dist/cli/main.js CHANGED
@@ -52,12 +52,19 @@ usage:
52
52
  commands:
53
53
  demo Run a deterministic simulation with a real cryptographic receipt.
54
54
  verify Verify a signed AgentGuard receipt.
55
+ init Scaffold a project (policy.yaml + quickstart + .gitignore).
56
+ doctor Check installation health and configuration.
57
+ explain Decode a signed receipt with cap math + signature breakdown.
58
+ serve Open a local dashboard at http://localhost:8787.
55
59
  --version Show the installed SDK version.
56
60
  --help Show this help.
57
61
 
58
62
  examples:
63
+ agentguard init
64
+ agentguard doctor
59
65
  agentguard demo
60
66
  agentguard verify --trace latest
67
+ agentguard explain latest
61
68
 
62
69
  docs: https://agentguard.run
63
70
  install: pip install agentguard-spend / npm install @agentguard-run/spend
@@ -81,6 +88,22 @@ async function main(argv = process.argv.slice(2)) {
81
88
  const { runVerify } = await Promise.resolve().then(() => __importStar(require('./verify')));
82
89
  return runVerify(rest);
83
90
  }
91
+ if (command === 'init') {
92
+ const { runInit } = await Promise.resolve().then(() => __importStar(require('./init')));
93
+ return runInit(rest);
94
+ }
95
+ if (command === 'doctor') {
96
+ const { runDoctor } = await Promise.resolve().then(() => __importStar(require('./doctor')));
97
+ return runDoctor(rest);
98
+ }
99
+ if (command === 'explain') {
100
+ const { runExplain } = await Promise.resolve().then(() => __importStar(require('./explain')));
101
+ return runExplain(rest);
102
+ }
103
+ if (command === 'serve') {
104
+ const { runServe } = await Promise.resolve().then(() => __importStar(require('./serve')));
105
+ return runServe(rest);
106
+ }
84
107
  process.stderr.write(`agentguard: unknown command '${command}'\n\n`);
85
108
  process.stderr.write(HELP);
86
109
  return 2;
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBH,oBAyBC;AA9CD,oCAAoD;AAEpD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AAEK,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,cAAc,gCAAwB,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,OAAO,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8CAA8C;AAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAG,EAAE,EAAE;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BH,oBAyCC;AArED,oCAAoD;AAEpD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBZ,CAAC;AAEK,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,cAAc,gCAAwB,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,wDAAa,WAAW,GAAC,CAAC;QACjD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,OAAO,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8CAA8C;AAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,CACT,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5B,CAAC,GAAG,EAAE,EAAE;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `agentguard serve` — local dashboard at localhost:8787 (configurable).
3
+ *
4
+ * Aggregates per-tenant decision logs under ~/.agentguard/<tenant>/decisions.ndjson
5
+ * + ~/.agentguard/demo/decisions.ndjson and serves a single-page dashboard.
6
+ *
7
+ * No outbound network calls. Pure Node stdlib HTTP server.
8
+ */
9
+ export declare function runServe(argv: string[]): Promise<number>;
10
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiLH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8G9D"}
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ /**
3
+ * `agentguard serve` — local dashboard at localhost:8787 (configurable).
4
+ *
5
+ * Aggregates per-tenant decision logs under ~/.agentguard/<tenant>/decisions.ndjson
6
+ * + ~/.agentguard/demo/decisions.ndjson and serves a single-page dashboard.
7
+ *
8
+ * No outbound network calls. Pure Node stdlib HTTP server.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.runServe = runServe;
45
+ const fs = __importStar(require("fs"));
46
+ const http = __importStar(require("http"));
47
+ const os = __importStar(require("os"));
48
+ const path = __importStar(require("path"));
49
+ const index_1 = require("../index");
50
+ const decision_log_1 = require("../decision-log");
51
+ const colors_1 = require("./colors");
52
+ const AGENTGUARD_HOME = path.join(os.homedir(), '.agentguard');
53
+ function scanLogFiles() {
54
+ if (!fs.existsSync(AGENTGUARD_HOME))
55
+ return [];
56
+ const out = [];
57
+ for (const entry of fs.readdirSync(AGENTGUARD_HOME, { withFileTypes: true })) {
58
+ if (entry.isDirectory()) {
59
+ const candidate = path.join(AGENTGUARD_HOME, entry.name, 'decisions.ndjson');
60
+ if (fs.existsSync(candidate))
61
+ out.push(candidate);
62
+ }
63
+ }
64
+ return out.sort();
65
+ }
66
+ function loadAllDecisions() {
67
+ const out = [];
68
+ for (const logPath of scanLogFiles()) {
69
+ const tenant = path.basename(path.dirname(logPath));
70
+ try {
71
+ const content = fs.readFileSync(logPath, 'utf-8');
72
+ for (const line of content.split('\n')) {
73
+ if (!line.trim())
74
+ continue;
75
+ try {
76
+ const d = JSON.parse(line);
77
+ d._tenant = tenant;
78
+ out.push(d);
79
+ }
80
+ catch {
81
+ // skip malformed line
82
+ }
83
+ }
84
+ }
85
+ catch {
86
+ // skip unreadable file
87
+ }
88
+ }
89
+ return out;
90
+ }
91
+ function computeStats(decisions) {
92
+ const totalCalls = decisions.length;
93
+ const blockedCount = decisions.filter((d) => d.decision?.action === 'block').length;
94
+ const downgradeCount = decisions.filter((d) => d.decision?.action === 'downgrade').length;
95
+ const allowCount = totalCalls - blockedCount - downgradeCount;
96
+ const spentCents = decisions
97
+ .filter((d) => ['allow', 'downgrade'].includes(d.decision?.action))
98
+ .reduce((sum, d) => sum + (d.decision.projectedCents || 0), 0);
99
+ const savedCents = decisions
100
+ .filter((d) => d.decision?.action === 'block')
101
+ .reduce((sum, d) => sum + (d.decision.projectedCents || 0), 0);
102
+ const byAgent = {};
103
+ const byProvider = {};
104
+ for (const d of decisions) {
105
+ if (!['allow', 'downgrade'].includes(d.decision?.action))
106
+ continue;
107
+ const scopeKey = d.decision?.triggeredScopeKey || '';
108
+ let agentId = 'unknown';
109
+ for (const part of scopeKey.split('|')) {
110
+ if (part.startsWith('agentId=')) {
111
+ agentId = part.slice(8);
112
+ break;
113
+ }
114
+ }
115
+ byAgent[agentId] = (byAgent[agentId] || 0) + (d.decision.projectedCents || 0);
116
+ const prov = d.decision.provider || 'unknown';
117
+ byProvider[prov] = (byProvider[prov] || 0) + (d.decision.projectedCents || 0);
118
+ }
119
+ return {
120
+ totals: {
121
+ spent_cents: spentCents,
122
+ saved_cents: savedCents,
123
+ calls: totalCalls,
124
+ blocked: blockedCount,
125
+ downgraded: downgradeCount,
126
+ allowed: allowCount,
127
+ },
128
+ by_agent: Object.entries(byAgent).map(([k, v]) => ({ agent: k, spent_cents: v })).sort((a, b) => b.spent_cents - a.spent_cents),
129
+ by_provider: Object.entries(byProvider).map(([k, v]) => ({ provider: k, spent_cents: v })).sort((a, b) => b.spent_cents - a.spent_cents),
130
+ recent: decisions.slice(-50).reverse(),
131
+ version: index_1.AGENTGUARD_SPEND_VERSION,
132
+ };
133
+ }
134
+ // Dashboard HTML — IDENTICAL to the Python version so users see the same UI
135
+ // whether they ran `pip install agentguard-spend` or `npm install -g`.
136
+ const DASHBOARD_HTML = `<!doctype html>
137
+ <html lang="en"><head><meta charset="utf-8" />
138
+ <title>AgentGuard Spend · Local Dashboard</title>
139
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
140
+ <style>
141
+ :root { --bg:#07101E; --surface:#0C1828; --surface-2:#0F1F35; --border:rgba(42,188,180,0.18); --border-dim:rgba(255,255,255,0.08); --teal:#2abcb4; --teal-glow:rgba(42,188,180,0.15); --text:#FFF; --text-2:#DCE8F0; --muted:#8AA0B3; --green:#4ade80; --amber:#F1C40F; --red:#FF6B6B; --code:#E6F0F5; }
142
+ * { box-sizing: border-box; margin: 0; padding: 0; }
143
+ html, body { background: var(--bg); color: var(--text-2); font-family: 'DM Sans', -apple-system, system-ui, sans-serif; font-size: 15px; min-height: 100vh; -webkit-font-smoothing: antialiased; }
144
+ a { color: var(--teal); text-decoration: none; } a:hover { text-decoration: underline; }
145
+ code, .mono { font-family: 'JetBrains Mono', monospace; font-size: 13px; }
146
+ .topbar { display: flex; align-items: center; justify-content: space-between; padding: 16px 32px; border-bottom: 1px solid var(--border-dim); background: rgba(7,16,30,0.92); backdrop-filter: blur(10px); position: sticky; top: 0; z-index: 50; }
147
+ .brand { display: inline-flex; align-items: center; gap: 12px; }
148
+ .brand .hex { width: 22px; height: 22px; background: var(--teal); color: var(--bg); display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: 13px; border-radius: 4px; }
149
+ .brand .name { font-family: 'Cormorant Garamond', Georgia, serif; font-size: 22px; color: var(--text); }
150
+ .brand .name .accent { color: var(--teal); }
151
+ .brand .tag { margin-left: 8px; font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); padding: 3px 8px; border: 1px solid var(--border); border-radius: 3px; }
152
+ .refresh-btn { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--teal); background: transparent; border: 1px solid var(--teal); border-radius: 4px; padding: 7px 14px; cursor: pointer; }
153
+ .refresh-btn:hover { background: var(--teal-glow); }
154
+ .shell { padding: 32px; max-width: 1280px; margin: 0 auto; }
155
+ .stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 28px; }
156
+ @media (max-width: 800px) { .stats-row { grid-template-columns: repeat(2, 1fr); } }
157
+ .stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }
158
+ .stat-card .label { font-family: 'JetBrains Mono', monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--muted); margin-bottom: 8px; }
159
+ .stat-card .value { font-size: 28px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }
160
+ .stat-card.green .value { color: var(--green); }
161
+ .stat-card.red .value { color: var(--red); }
162
+ .stat-card.amber .value { color: var(--amber); }
163
+ .stat-card .sub { color: var(--muted); font-size: 12px; margin-top: 4px; }
164
+ .section { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 24px 26px; margin-bottom: 24px; }
165
+ .section h2 { font-family: 'JetBrains Mono', monospace; font-size: 11px; font-weight: 700; letter-spacing: 0.15em; text-transform: uppercase; color: var(--teal); margin-bottom: 16px; }
166
+ .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
167
+ @media (max-width: 800px) { .two-col { grid-template-columns: 1fr; } }
168
+ .bar-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border-dim); font-size: 13.5px; }
169
+ .bar-row:last-child { border-bottom: none; }
170
+ .bar-row .name { width: 35%; color: var(--text); }
171
+ .bar-row .bar { flex: 1; height: 10px; background: var(--surface-2); border-radius: 2px; overflow: hidden; }
172
+ .bar-row .bar-fill { height: 100%; background: var(--teal); transition: width 0.4s; }
173
+ .bar-row .amount { width: 80px; text-align: right; color: var(--green); font-weight: 700; font-family: 'JetBrains Mono', monospace; font-size: 13px; }
174
+ table { width: 100%; border-collapse: collapse; font-size: 13px; }
175
+ th { text-align: left; padding: 10px 12px; font-family: 'JetBrains Mono', monospace; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--border); }
176
+ td { padding: 12px; border-bottom: 1px solid var(--border-dim); vertical-align: top; }
177
+ td.action-block { color: var(--red); font-weight: 700; }
178
+ td.action-downgrade { color: var(--amber); font-weight: 700; }
179
+ td.action-allow { color: var(--green); }
180
+ td.action-shadow { color: var(--muted); }
181
+ td .mono { color: var(--code); }
182
+ .pill { display: inline-block; padding: 2px 8px; border-radius: 3px; font-family: 'JetBrains Mono', monospace; font-size: 11px; background: var(--surface-2); color: var(--text-2); border: 1px solid var(--border-dim); }
183
+ .empty { text-align: center; padding: 56px 20px; color: var(--muted); font-size: 14px; }
184
+ .empty code { display: block; margin-top: 8px; font-size: 14px; color: var(--teal); }
185
+ .live-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--green); margin-right: 6px; animation: pulse 2s ease-in-out infinite; }
186
+ @keyframes pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(74,222,128,0.4); } 50% { opacity: 0.7; box-shadow: 0 0 0 6px rgba(74,222,128,0); } }
187
+ </style></head><body>
188
+ <div class="topbar">
189
+ <div class="brand"><span class="hex">⬡</span><span class="name">Agent<span class="accent">Guard</span></span><span class="tag">Spend · Local Dashboard</span></div>
190
+ <div><span class="mono" style="color: var(--muted); margin-right: 16px;"><span class="live-indicator"></span>v__VERSION__ · localhost:__PORT__</span><button class="refresh-btn" onclick="loadStats()">Refresh</button></div>
191
+ </div>
192
+ <div class="shell">
193
+ <div class="stats-row">
194
+ <div class="stat-card green"><div class="label">Spent (all-time)</div><div class="value" id="spent">$0.00</div><div class="sub" id="spent-sub">across <span id="call-count">0</span> calls</div></div>
195
+ <div class="stat-card red"><div class="label">Saved by blocks</div><div class="value" id="saved">+$0.00</div><div class="sub"><span id="blocked-count">0</span> calls blocked</div></div>
196
+ <div class="stat-card amber"><div class="label">Downgraded</div><div class="value" id="downgraded">0</div><div class="sub">calls routed to cheaper model</div></div>
197
+ <div class="stat-card"><div class="label">Allowed</div><div class="value" id="allowed">0</div><div class="sub">policy-checked & passed</div></div>
198
+ </div>
199
+ <div class="two-col">
200
+ <div class="section"><h2>Spend by Agent</h2><div id="by-agent"></div></div>
201
+ <div class="section"><h2>Spend by Provider</h2><div id="by-provider"></div></div>
202
+ </div>
203
+ <div class="section">
204
+ <h2>Recent Decisions</h2>
205
+ <table><thead><tr><th style="width:80px">Action</th><th>Agent</th><th>Provider · Model</th><th style="width:120px;text-align:right">Amount</th><th style="width:120px">Receipt</th></tr></thead><tbody id="recent-rows"></tbody></table>
206
+ </div>
207
+ <div style="text-align: center; color: var(--muted); font-size: 12px; margin-top: 32px;">Local-only. No outbound network calls. Reads from <code class="mono">~/.agentguard/*/decisions.ndjson</code>.<br/>Source: <a href="https://agentguard.run">agentguard.run</a> · <a href="https://www.npmjs.com/package/@agentguard-run/spend">npm</a> · <a href="https://pypi.org/project/agentguard-spend/">pypi</a></div>
208
+ </div>
209
+ <script>
210
+ function formatCents(cents) { const sign = cents < 0 ? '-' : ''; const abs = Math.abs(Math.round(cents)); const dollars = Math.floor(abs / 100); const remainder = abs % 100; return sign + '$' + dollars.toLocaleString() + '.' + String(remainder).padStart(2, '0'); }
211
+ function renderBars(containerId, items, key) { const el = document.getElementById(containerId); if (!items.length) { el.innerHTML = '<div style="color:var(--muted);font-size:13px;padding:8px 0">no data yet</div>'; return; } const max = Math.max(...items.map(i => i.spent_cents)) || 1; el.innerHTML = items.slice(0, 8).map(i => '<div class="bar-row"><span class="name">' + i[key] + '</span><span class="bar"><span class="bar-fill" style="width:' + (i.spent_cents/max*100).toFixed(1) + '%"></span></span><span class="amount">' + formatCents(i.spent_cents) + '</span></div>').join(''); }
212
+ function renderRecent(items) { const tbody = document.getElementById('recent-rows'); if (!items.length) { tbody.innerHTML = '<tr><td colspan="5"><div class="empty">no decisions yet.<br>run <code>agentguard demo</code> to see a real signed receipt here.</div></td></tr>'; return; } tbody.innerHTML = items.map(d => { const dec = d.decision; const scope = dec.triggeredScopeKey || ''; const agentMatch = scope.match(/agentId=([^|]+)/); const agent = agentMatch ? agentMatch[1] : '<span style="color:var(--muted)">—</span>'; const action = dec.action || 'allow'; return '<tr><td class="action-' + action + '">' + action.toUpperCase() + '</td><td class="mono">' + agent + '</td><td><span class="pill">' + (dec.provider || '?') + '</span> ' + (dec.modelRequested || '') + '</td><td style="text-align:right" class="mono">' + formatCents(dec.projectedCents || 0) + '</td><td class="mono"><a href="#" onclick="return verifyReceipt(\\'' + d.entryHash + '\\')">' + d.entryHash.slice(0, 12) + '...</a></td></tr>'; }).join(''); }
213
+ async function verifyReceipt(hash) { try { const r = await fetch('/api/verify/' + hash); const d = await r.json(); alert(d.ok ? '✓ verified: signature valid, hash matches, chain intact' : '✗ verification failed: ' + (d.reason || 'unknown')); } catch (e) { alert('verify error: ' + e); } return false; }
214
+ async function loadStats() { try { const r = await fetch('/api/stats'); const s = await r.json(); document.getElementById('spent').textContent = formatCents(s.totals.spent_cents); document.getElementById('saved').textContent = '+' + formatCents(s.totals.saved_cents); document.getElementById('downgraded').textContent = s.totals.downgraded; document.getElementById('allowed').textContent = s.totals.allowed; document.getElementById('call-count').textContent = s.totals.calls; document.getElementById('blocked-count').textContent = s.totals.blocked; renderBars('by-agent', s.by_agent, 'agent'); renderBars('by-provider', s.by_provider, 'provider'); renderRecent(s.recent); } catch (e) { console.error('load failed:', e); } }
215
+ loadStats();
216
+ setInterval(loadStats, 5000);
217
+ </script></body></html>
218
+ `;
219
+ async function runServe(argv) {
220
+ let port = 8787;
221
+ let host = '127.0.0.1';
222
+ let noOpen = false;
223
+ for (let i = 0; i < argv.length; i++) {
224
+ const a = argv[i];
225
+ if (a === '--port')
226
+ port = parseInt(argv[++i] ?? '8787', 10);
227
+ else if (a === '--host')
228
+ host = argv[++i] ?? '127.0.0.1';
229
+ else if (a === '--no-open')
230
+ noOpen = true;
231
+ else if (a === '--help' || a === '-h') {
232
+ console.log('agentguard serve [--port 8787] [--host 127.0.0.1] [--no-open]');
233
+ return 0;
234
+ }
235
+ }
236
+ console.log('');
237
+ console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
238
+ console.log('');
239
+ console.log(' ' + (0, colors_1.cyanBold)('agentguard serve') + (0, colors_1.dim)(' · local dashboard'));
240
+ console.log('');
241
+ const logFiles = scanLogFiles();
242
+ if (logFiles.length === 0) {
243
+ console.log(` ${(0, colors_1.dim)('no decision logs found yet at ~/.agentguard/*/decisions.ndjson')}`);
244
+ console.log(` ${(0, colors_1.dim)('run')} ${(0, colors_1.greenBold)('agentguard demo')} ${(0, colors_1.dim)('to produce one, then refresh.')}`);
245
+ console.log('');
246
+ }
247
+ const server = http.createServer(async (req, res) => {
248
+ const url = (req.url || '/').split('?')[0];
249
+ const sendJSON = (status, payload) => {
250
+ const body = JSON.stringify(payload);
251
+ res.writeHead(status, {
252
+ 'Content-Type': 'application/json',
253
+ 'Content-Length': Buffer.byteLength(body).toString(),
254
+ 'Cache-Control': 'no-store',
255
+ });
256
+ res.end(body);
257
+ };
258
+ const sendHTML = (html) => {
259
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });
260
+ res.end(html);
261
+ };
262
+ if (url === '/' || url === '/index.html') {
263
+ sendHTML(DASHBOARD_HTML.replace('__VERSION__', index_1.AGENTGUARD_SPEND_VERSION).replace('__PORT__', String(port)));
264
+ return;
265
+ }
266
+ if (url === '/api/stats') {
267
+ sendJSON(200, computeStats(loadAllDecisions()));
268
+ return;
269
+ }
270
+ if (url.startsWith('/api/verify/')) {
271
+ const entryHash = url.split('/').pop();
272
+ const decisions = loadAllDecisions();
273
+ const match = decisions.find((d) => d.entryHash === entryHash);
274
+ if (!match) {
275
+ sendJSON(404, { ok: false, reason: 'receipt not found' });
276
+ return;
277
+ }
278
+ try {
279
+ const publicKeyHex = match.publicKeyHex;
280
+ if (!publicKeyHex) {
281
+ sendJSON(400, { ok: false, reason: 'no public key in stored receipt' });
282
+ return;
283
+ }
284
+ const publicKey = Uint8Array.from(Buffer.from(publicKeyHex, 'hex'));
285
+ const entry = {
286
+ sequence: match.sequence,
287
+ entryHash: match.entryHash,
288
+ previousHash: match.previousHash,
289
+ signature: match.signature,
290
+ signerFingerprint: match.signerFingerprint,
291
+ decision: match.decision,
292
+ };
293
+ const ok = await (0, decision_log_1.verifyEntry)(entry, publicKey);
294
+ sendJSON(200, { ok: Boolean(ok) });
295
+ }
296
+ catch (e) {
297
+ sendJSON(500, { ok: false, reason: String(e?.message || e) });
298
+ }
299
+ return;
300
+ }
301
+ sendJSON(404, { error: 'not found' });
302
+ });
303
+ const url = `http://${host}:${port}`;
304
+ server.listen(port, host, () => {
305
+ console.log(` ${(0, colors_1.green)('→')} dashboard: ${(0, colors_1.greenBold)(url)}`);
306
+ console.log(` ${(0, colors_1.dim)(' reading: ~/.agentguard/*/decisions.ndjson')}`);
307
+ console.log(` ${(0, colors_1.dim)(' press Ctrl+C to stop')}`);
308
+ console.log('');
309
+ if (!noOpen) {
310
+ setTimeout(() => {
311
+ try {
312
+ const { exec } = require('child_process');
313
+ const cmd = process.platform === 'darwin'
314
+ ? `open "${url}"`
315
+ : process.platform === 'win32'
316
+ ? `start "" "${url}"`
317
+ : `xdg-open "${url}"`;
318
+ exec(cmd);
319
+ }
320
+ catch { /* best-effort */ }
321
+ }, 400);
322
+ }
323
+ });
324
+ process.on('SIGINT', () => {
325
+ console.log('');
326
+ console.log(` ${(0, colors_1.green)('✓')} dashboard stopped`);
327
+ console.log('');
328
+ server.close();
329
+ process.exit(0);
330
+ });
331
+ // Keep alive
332
+ return new Promise(() => { });
333
+ }
334
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@ export { canonicalJson, sha256Hex, computeEntryHash, computeSignerFingerprint, s
12
12
  export { InMemorySpendStore } from './store-memory';
13
13
  export { SpendGuard, withSpendGuard, AgentGuardBlockedError, type SpendGuardConfig, type OpenAIBindingOptions, } from './spend-guard';
14
14
  export { DEFAULT_LOCALE, SUPPORTED_LOCALES, TRANSLATIONS, type SupportedLocale, resolveLocale, t, formatBlockedTrace, type BlockedTraceArgs, } from './i18n';
15
- export declare const AGENTGUARD_SPEND_VERSION = "0.1.6";
15
+ export declare const AGENTGUARD_SPEND_VERSION = "0.1.8";
16
16
  /** Patent marking. 35 U.S.C. § 287 constructive notice. */
17
17
  export declare const PATENT_NOTICE: string;
18
18
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
46
46
  Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
47
47
  Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
48
48
  Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
49
- exports.AGENTGUARD_SPEND_VERSION = '0.1.6';
49
+ exports.AGENTGUARD_SPEND_VERSION = '0.1.8';
50
50
  /** Patent marking. 35 U.S.C. § 287 constructive notice. */
51
51
  exports.PATENT_NOTICE = 'Protected by U.S. patent-pending technology ' +
52
52
  '(App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; ' +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentguard-run/spend",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Local-runtime spend caps and capability-gated model routing for AI agents. Prompts, API keys, and signing keys stay inside the customer runtime. Zero data plane involvement.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",