@agentguard-run/spend 0.15.5 → 0.15.6

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/README.md CHANGED
@@ -86,7 +86,18 @@ const response = await guardedClient.chat.completions.create({
86
86
 
87
87
  Then run your agent. AgentGuard decides locally before any provider call starts, signs the receipt, and applies allow, downgrade, shadow, or block.
88
88
 
89
+ By default the wizard wires a file-backed `NdjsonDecisionLogStore` and a locally generated Ed25519 signing key, so every decision is signed and appended to `~/.agentguard/my-tenant/decisions.ndjson` with no extra setup.
89
90
 
91
+ ### See it: run `agentguard serve`
92
+
93
+ After your agent runs (or after `agentguard demo`), open the local dashboard to SEE governed spend, the dollars saved by policy, per-agent and per-provider breakdowns, and a tamper-evidence badge with click-to-verify receipts:
94
+
95
+ ```bash
96
+ agentguard serve
97
+ # → dashboard at http://localhost:8787
98
+ ```
99
+
100
+ The dashboard reads only your local `~/.agentguard/*/decisions.ndjson`. No outbound network calls.
90
101
 
91
102
  ## Workflow-level caps
92
103
 
@@ -0,0 +1,45 @@
1
+ /**
2
+ * File-backed DecisionLogStore.
3
+ *
4
+ * Appends one signed decision entry per line (NDJSON) to
5
+ * ~/.agentguard/<tenant>/decisions.ndjson
6
+ *
7
+ * This is the default persistence used by the CLI/wizard path so that a signed
8
+ * ledger survives across process runs and can be read by `agentguard serve`
9
+ * and `aggregateLedger` without the user having to wire up Postgres or Redis.
10
+ *
11
+ * Same interface as PostgresDecisionLogStore / InMemoryDecisionLogStore. The
12
+ * append is line-atomic (fs.appendFileSync of a single "\n"-terminated line),
13
+ * so concurrent writers do not interleave partial lines. Ordering/chain
14
+ * integrity remains the SpendGuard decision lock's responsibility.
15
+ *
16
+ * When `publicKeyHex` is supplied, it is embedded on each written line so that
17
+ * `agentguard serve`'s click-to-verify and `aggregateLedger` integrity checks
18
+ * can recover the verifying key from the ledger itself. The extra field is
19
+ * ignored by the DecisionLogStore read path (only SignedDecisionLogEntry fields
20
+ * are consumed by the SDK).
21
+ *
22
+ * Patent notice: Protected by U.S. patent-pending technology
23
+ * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
24
+ * 64/071,781; 64/071,789).
25
+ */
26
+ import type { SignedDecisionLogEntry, DecisionLogStore } from '../types';
27
+ export interface NdjsonStoreOptions {
28
+ /** Base directory. Defaults to AGENTGUARD_HOME or ~/.agentguard. */
29
+ home?: string;
30
+ /** Optional hex public key embedded per line so the ledger is self-verifying. */
31
+ publicKeyHex?: string;
32
+ }
33
+ export declare class NdjsonDecisionLogStore implements DecisionLogStore {
34
+ readonly filePath: string;
35
+ private readonly publicKeyHex?;
36
+ constructor(tenant: string, options?: NdjsonStoreOptions);
37
+ append(entry: SignedDecisionLogEntry): Promise<void>;
38
+ getLatest(signerFingerprint?: string): Promise<SignedDecisionLogEntry | null>;
39
+ read(fromSequence: number, limit: number, signerFingerprint?: string): Promise<SignedDecisionLogEntry[]>;
40
+ /** Remove the underlying file (used by deterministic flows like `agentguard demo`). */
41
+ reset(): void;
42
+ /** Parsed entries in sequence order, optionally filtered by signer. */
43
+ private readAll;
44
+ }
45
+ //# sourceMappingURL=ndjson-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-store.d.ts","sourceRoot":"","sources":["../../src/adapters/ndjson-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAOtD,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,SAAS,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAK7E,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAO9G,uFAAuF;IACvF,KAAK,IAAI,IAAI;IAQb,uEAAuE;IACvE,OAAO,CAAC,OAAO;CAqBhB"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * File-backed DecisionLogStore.
4
+ *
5
+ * Appends one signed decision entry per line (NDJSON) to
6
+ * ~/.agentguard/<tenant>/decisions.ndjson
7
+ *
8
+ * This is the default persistence used by the CLI/wizard path so that a signed
9
+ * ledger survives across process runs and can be read by `agentguard serve`
10
+ * and `aggregateLedger` without the user having to wire up Postgres or Redis.
11
+ *
12
+ * Same interface as PostgresDecisionLogStore / InMemoryDecisionLogStore. The
13
+ * append is line-atomic (fs.appendFileSync of a single "\n"-terminated line),
14
+ * so concurrent writers do not interleave partial lines. Ordering/chain
15
+ * integrity remains the SpendGuard decision lock's responsibility.
16
+ *
17
+ * When `publicKeyHex` is supplied, it is embedded on each written line so that
18
+ * `agentguard serve`'s click-to-verify and `aggregateLedger` integrity checks
19
+ * can recover the verifying key from the ledger itself. The extra field is
20
+ * ignored by the DecisionLogStore read path (only SignedDecisionLogEntry fields
21
+ * are consumed by the SDK).
22
+ *
23
+ * Patent notice: Protected by U.S. patent-pending technology
24
+ * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
25
+ * 64/071,781; 64/071,789).
26
+ */
27
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ var desc = Object.getOwnPropertyDescriptor(m, k);
30
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
31
+ desc = { enumerable: true, get: function() { return m[k]; } };
32
+ }
33
+ Object.defineProperty(o, k2, desc);
34
+ }) : (function(o, m, k, k2) {
35
+ if (k2 === undefined) k2 = k;
36
+ o[k2] = m[k];
37
+ }));
38
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
39
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
40
+ }) : function(o, v) {
41
+ o["default"] = v;
42
+ });
43
+ var __importStar = (this && this.__importStar) || (function () {
44
+ var ownKeys = function(o) {
45
+ ownKeys = Object.getOwnPropertyNames || function (o) {
46
+ var ar = [];
47
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
48
+ return ar;
49
+ };
50
+ return ownKeys(o);
51
+ };
52
+ return function (mod) {
53
+ if (mod && mod.__esModule) return mod;
54
+ var result = {};
55
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
56
+ __setModuleDefault(result, mod);
57
+ return result;
58
+ };
59
+ })();
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.NdjsonDecisionLogStore = void 0;
62
+ const fs = __importStar(require("fs"));
63
+ const os = __importStar(require("os"));
64
+ const path = __importStar(require("path"));
65
+ function defaultHome() {
66
+ return process.env.AGENTGUARD_HOME || path.join(os.homedir(), '.agentguard');
67
+ }
68
+ class NdjsonDecisionLogStore {
69
+ filePath;
70
+ publicKeyHex;
71
+ constructor(tenant, options = {}) {
72
+ const cleanTenant = String(tenant || 'default').replace(/[^A-Za-z0-9._-]/g, '_') || 'default';
73
+ const home = options.home ?? defaultHome();
74
+ this.filePath = path.join(home, cleanTenant, 'decisions.ndjson');
75
+ this.publicKeyHex = options.publicKeyHex;
76
+ }
77
+ async append(entry) {
78
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
79
+ const record = { ...entry };
80
+ if (this.publicKeyHex)
81
+ record.publicKeyHex = this.publicKeyHex;
82
+ fs.appendFileSync(this.filePath, JSON.stringify(record) + '\n');
83
+ }
84
+ async getLatest(signerFingerprint) {
85
+ const entries = this.readAll(signerFingerprint);
86
+ return entries.length ? entries[entries.length - 1] : null;
87
+ }
88
+ async read(fromSequence, limit, signerFingerprint) {
89
+ const entries = this.readAll(signerFingerprint);
90
+ const start = entries.findIndex((e) => e.sequence >= fromSequence);
91
+ if (start === -1)
92
+ return [];
93
+ return entries.slice(start, start + limit);
94
+ }
95
+ /** Remove the underlying file (used by deterministic flows like `agentguard demo`). */
96
+ reset() {
97
+ try {
98
+ fs.rmSync(this.filePath, { force: true });
99
+ }
100
+ catch {
101
+ // best-effort
102
+ }
103
+ }
104
+ /** Parsed entries in sequence order, optionally filtered by signer. */
105
+ readAll(signerFingerprint) {
106
+ let content;
107
+ try {
108
+ content = fs.readFileSync(this.filePath, 'utf-8');
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ const out = [];
114
+ for (const line of content.split('\n')) {
115
+ if (!line.trim())
116
+ continue;
117
+ try {
118
+ const parsed = JSON.parse(line);
119
+ if (signerFingerprint && parsed.signerFingerprint !== signerFingerprint)
120
+ continue;
121
+ out.push(parsed);
122
+ }
123
+ catch {
124
+ // skip malformed line
125
+ }
126
+ }
127
+ out.sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0));
128
+ return out;
129
+ }
130
+ }
131
+ exports.NdjsonDecisionLogStore = NdjsonDecisionLogStore;
132
+ //# sourceMappingURL=ndjson-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson-store.js","sourceRoot":"","sources":["../../src/adapters/ndjson-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuBH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuJ7D"}
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkO7D"}
package/dist/cli/demo.js CHANGED
@@ -50,6 +50,7 @@ const os = __importStar(require("os"));
50
50
  const path = __importStar(require("path"));
51
51
  const ed = __importStar(require("@noble/ed25519"));
52
52
  const decision_log_1 = require("../decision-log");
53
+ const ndjson_store_1 = require("../adapters/ndjson-store");
53
54
  const i18n_1 = require("../i18n");
54
55
  const index_1 = require("../index");
55
56
  const colors_1 = require("./colors");
@@ -171,6 +172,78 @@ async function runDemo(argv) {
171
172
  catch {
172
173
  // best-effort persist; demo still prints if disk write fails
173
174
  }
175
+ // Persist a signed, hash-chained ledger to ~/.agentguard/demo/decisions.ndjson
176
+ // so `agentguard serve` shows a populated dashboard (spend + $ saved by policy +
177
+ // verifiable trail). Deterministic: the file is reset on each run.
178
+ try {
179
+ const publicKeyHex = Buffer.from(publicKey).toString('hex');
180
+ const store = new ndjson_store_1.NdjsonDecisionLogStore('demo', { publicKeyHex });
181
+ store.reset();
182
+ // seq 0: the BLOCKED marketing decision (already signed above) — the $ saved line.
183
+ await store.append(signedEntry);
184
+ // seq 1: an ALLOWED governed call so "Spent" and "Allowed" are non-zero.
185
+ const allowedDecision = {
186
+ decisionId: 'agentguard-demo-decision-allow-v1',
187
+ timestamp: '2026-05-24T18:05:00.000Z',
188
+ policyId: decision.policyId,
189
+ policyVersion: 1,
190
+ enforcementMode: 'enforce',
191
+ action: 'allow',
192
+ reasons: ['Within all caps'],
193
+ provider: 'anthropic',
194
+ modelRequested: 'claude-sonnet-4-5',
195
+ modelResolved: 'claude-sonnet-4-5',
196
+ projectedCents: 4231, // $42.31
197
+ windowSpendBefore: 0,
198
+ windowSpendAfter: 4231,
199
+ triggeredCap: null,
200
+ triggeredScopeKey: `tenantId=demo|agentId=${agentId}`,
201
+ };
202
+ const signedAllowed = await (0, decision_log_1.signDecision)({
203
+ sequence: 1,
204
+ decision: allowedDecision,
205
+ previousHash: signedEntry.entryHash,
206
+ privateKey: privateSeed,
207
+ publicKey,
208
+ });
209
+ await store.append(signedAllowed);
210
+ // seq 2: a DOWNGRADED call routed to a cheaper model — the "Downgraded" line +
211
+ // additional savings (requested vs resolved).
212
+ const downgradeDecision = {
213
+ decisionId: 'agentguard-demo-decision-downgrade-v1',
214
+ timestamp: '2026-05-24T18:10:00.000Z',
215
+ policyId: decision.policyId,
216
+ policyVersion: 1,
217
+ enforcementMode: 'enforce',
218
+ action: 'downgrade',
219
+ reasons: ['Per-call cap reached, routed to fallback model'],
220
+ provider: 'anthropic',
221
+ modelRequested: 'claude-opus-4-7',
222
+ modelResolved: 'claude-haiku-4-5',
223
+ projectedCents: 8000, // $80.00 projected for the requested (expensive) model
224
+ windowSpendBefore: 4231,
225
+ windowSpendAfter: 5211,
226
+ triggeredCap: {
227
+ amountCents: 5000,
228
+ window: 'per_call',
229
+ action: 'downgrade',
230
+ reason: 'Per-call budget reached, routing to fallback model',
231
+ },
232
+ triggeredScopeKey: `tenantId=demo|agentId=${agentId}`,
233
+ actualCents: 980,
234
+ };
235
+ const signedDowngrade = await (0, decision_log_1.signDecision)({
236
+ sequence: 2,
237
+ decision: downgradeDecision,
238
+ previousHash: signedAllowed.entryHash,
239
+ privateKey: privateSeed,
240
+ publicKey,
241
+ });
242
+ await store.append(signedDowngrade);
243
+ }
244
+ catch {
245
+ // best-effort; demo still prints and the single-entry receipt persists above
246
+ }
174
247
  const receiptId = entryHash.slice(0, 16);
175
248
  console.log((0, colors_1.dim)(' ───────────────────────────────────────────'));
176
249
  console.log(` ${(0, colors_1.dim)('receipt ')} ${receiptId}${(0, colors_1.dim)('...')}`);
@@ -1 +1 @@
1
- {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/cli/demo.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,6 @@
6
6
  *
7
7
  * No outbound network calls. Pure Node stdlib HTTP server.
8
8
  */
9
- export declare const DASHBOARD_HTML = "<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\" />\n<title>AgentGuard Spend \u00B7 Local Dashboard</title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<style>\n: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; }\n* { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, 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; }\na { color: var(--teal); text-decoration: none; } a:hover { text-decoration: underline; }\ncode, .mono { font-family: 'JetBrains Mono', monospace; font-size: 13px; }\n.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; }\n.brand { display: inline-flex; align-items: center; gap: 12px; }\n.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; }\n.brand .name { font-family: 'Cormorant Garamond', Georgia, serif; font-size: 22px; color: var(--text); }\n.brand .name .accent { color: var(--teal); }\n.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; }\n.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; }\n.refresh-btn:hover { background: var(--teal-glow); }\n.shell { padding: 32px; max-width: 1280px; margin: 0 auto; }\n.stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 28px; }\n@media (max-width: 800px) { .stats-row { grid-template-columns: repeat(2, 1fr); } }\n.stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.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; }\n.stat-card .value { font-size: 28px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }\n.stat-card.green .value { color: var(--green); }\n.stat-card.red .value { color: var(--red); }\n.stat-card.amber .value { color: var(--amber); }\n.stat-card .sub { color: var(--muted); font-size: 12px; margin-top: 4px; }\n.section { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 24px 26px; margin-bottom: 24px; }\n.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; }\n.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n@media (max-width: 800px) { .two-col { grid-template-columns: 1fr; } }\n.bar-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border-dim); font-size: 13.5px; }\n.bar-row:last-child { border-bottom: none; }\n.bar-row .name { width: 35%; color: var(--text); }\n.bar-row .bar { flex: 1; height: 10px; background: var(--surface-2); border-radius: 2px; overflow: hidden; }\n.bar-row .bar-fill { height: 100%; background: var(--teal); transition: width 0.4s; }\n.bar-row .amount { width: 80px; text-align: right; color: var(--green); font-weight: 700; font-family: 'JetBrains Mono', monospace; font-size: 13px; }\ntable { width: 100%; border-collapse: collapse; font-size: 13px; }\nth { 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); }\ntd { padding: 12px; border-bottom: 1px solid var(--border-dim); vertical-align: top; }\ntd.action-block { color: var(--red); font-weight: 700; }\ntd.action-downgrade { color: var(--amber); font-weight: 700; }\ntd.action-allow { color: var(--green); }\ntd.action-shadow { color: var(--muted); }\ntd .mono { color: var(--code); }\n.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); }\n.empty { text-align: center; padding: 56px 20px; color: var(--muted); font-size: 14px; }\n.empty code { display: block; margin-top: 8px; font-size: 14px; color: var(--teal); }\n.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; }\n@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); } }\n</style></head><body>\n<div class=\"topbar\">\n <div class=\"brand\"><span class=\"hex\">\u2B21</span><span class=\"name\">Agent<span class=\"accent\">Guard</span></span><span class=\"tag\">Spend \u00B7 Local Dashboard</span></div>\n <div><span class=\"mono\" style=\"color: var(--muted); margin-right: 16px;\"><span class=\"live-indicator\"></span>v__VERSION__ \u00B7 localhost:__PORT__</span><button class=\"refresh-btn\" onclick=\"loadStats()\">Refresh</button></div>\n</div>\n<div class=\"shell\">\n <div class=\"stats-row\">\n <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>\n <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>\n <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>\n <div class=\"stat-card\"><div class=\"label\">Allowed</div><div class=\"value\" id=\"allowed\">0</div><div class=\"sub\">policy-checked & passed</div></div>\n </div>\n <div class=\"two-col\">\n <div class=\"section\"><h2>Spend by Agent</h2><div id=\"by-agent\"></div></div>\n <div class=\"section\"><h2>Spend by Provider</h2><div id=\"by-provider\"></div></div>\n </div>\n <div class=\"section\">\n <h2>Recent Decisions</h2>\n <table><thead><tr><th style=\"width:80px\">Action</th><th>Agent</th><th>Provider \u00B7 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>\n </div>\n <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> \u00B7 <a href=\"https://www.npmjs.com/package/@agentguard-run/spend\">npm</a> \u00B7 <a href=\"https://pypi.org/project/agentguard-spend/\">pypi</a></div>\n</div>\n<script>\nfunction 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'); }\nfunction escapeHtml(value) { return String(value == null ? '' : value).replace(/[&<>\"']/g, function(ch) { return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[ch]; }); }\nfunction safeClassToken(value) { const clean = String(value || 'allow').toLowerCase().replace(/[^a-z0-9_-]/g, '').slice(0, 24); return clean || 'allow'; }\nfunction safeHash(value) { return String(value || '').toLowerCase().replace(/[^0-9a-f]/g, '').slice(0, 128); }\nfunction 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 => Number(i.spent_cents) || 0)) || 1; el.innerHTML = items.slice(0, 8).map(i => '<div class=\"bar-row\"><span class=\"name\">' + escapeHtml(i[key]) + '</span><span class=\"bar\"><span class=\"bar-fill\" style=\"width:' + ((Number(i.spent_cents) || 0)/max*100).toFixed(1) + '%\"></span></span><span class=\"amount\">' + escapeHtml(formatCents(i.spent_cents)) + '</span></div>').join(''); }\nfunction 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 = String(dec.triggeredScopeKey || ''); const agentMatch = scope.match(/agentId=([^|]+)/); const agent = agentMatch ? escapeHtml(agentMatch[1]) : '<span style=\"color:var(--muted)\">-</span>'; const action = safeClassToken(dec.action || 'allow'); const entryHash = safeHash(d.entryHash); const shortHash = entryHash ? escapeHtml(entryHash.slice(0, 12)) + '...' : 'missing'; return '<tr><td class=\"action-' + action + '\">' + escapeHtml(action.toUpperCase()) + '</td><td class=\"mono\">' + agent + '</td><td><span class=\"pill\">' + escapeHtml(dec.provider || '?') + '</span> ' + escapeHtml(dec.modelRequested || '') + '</td><td style=\"text-align:right\" class=\"mono\">' + escapeHtml(formatCents(dec.projectedCents || 0)) + '</td><td class=\"mono\"><a href=\"#\" data-entry-hash=\"' + entryHash + '\">' + shortHash + '</a></td></tr>'; }).join(''); tbody.querySelectorAll('a[data-entry-hash]').forEach(function(a) { a.addEventListener('click', function(event) { event.preventDefault(); verifyReceipt(a.getAttribute('data-entry-hash') || ''); }); }); }\nasync function verifyReceipt(hash) { try { const r = await fetch('/api/verify/' + hash); const d = await r.json(); alert(d.ok ? '\u2713 verified: full chain valid' : '\u2717 verification failed: ' + (d.reason || 'unknown')); } catch (e) { alert('verify error: ' + e); } return false; }\nasync 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); } }\nloadStats();\nsetInterval(loadStats, 5000);\n</script></body></html>\n";
9
+ export declare const DASHBOARD_HTML = "<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\" />\n<title>AgentGuard Spend \u00B7 Local Dashboard</title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n<style>\n: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; }\n* { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, 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; }\na { color: var(--teal); text-decoration: none; } a:hover { text-decoration: underline; }\ncode, .mono { font-family: 'JetBrains Mono', monospace; font-size: 13px; }\n.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; }\n.brand { display: inline-flex; align-items: center; gap: 12px; }\n.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; }\n.brand .name { font-family: 'Cormorant Garamond', Georgia, serif; font-size: 22px; color: var(--text); }\n.brand .name .accent { color: var(--teal); }\n.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; }\n.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; }\n.refresh-btn:hover { background: var(--teal-glow); }\n.shell { padding: 32px; max-width: 1280px; margin: 0 auto; }\n.stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 28px; }\n@media (max-width: 800px) { .stats-row { grid-template-columns: repeat(2, 1fr); } }\n.stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 18px 20px; }\n.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; }\n.stat-card .value { font-size: 28px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }\n.stat-card.green .value { color: var(--green); }\n.stat-card.red .value { color: var(--red); }\n.stat-card.amber .value { color: var(--amber); }\n.stat-card .sub { color: var(--muted); font-size: 12px; margin-top: 4px; }\n.section { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 24px 26px; margin-bottom: 24px; }\n.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; }\n.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }\n@media (max-width: 800px) { .two-col { grid-template-columns: 1fr; } }\n.bar-row { display: flex; align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border-dim); font-size: 13.5px; }\n.bar-row:last-child { border-bottom: none; }\n.bar-row .name { width: 35%; color: var(--text); }\n.bar-row .bar { flex: 1; height: 10px; background: var(--surface-2); border-radius: 2px; overflow: hidden; }\n.bar-row .bar-fill { height: 100%; background: var(--teal); transition: width 0.4s; }\n.bar-row .amount { width: 80px; text-align: right; color: var(--green); font-weight: 700; font-family: 'JetBrains Mono', monospace; font-size: 13px; }\ntable { width: 100%; border-collapse: collapse; font-size: 13px; }\nth { 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); }\ntd { padding: 12px; border-bottom: 1px solid var(--border-dim); vertical-align: top; }\ntd.action-block { color: var(--red); font-weight: 700; }\ntd.action-downgrade { color: var(--amber); font-weight: 700; }\ntd.action-allow { color: var(--green); }\ntd.action-shadow { color: var(--muted); }\ntd .mono { color: var(--code); }\n.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); }\n.empty { text-align: center; padding: 56px 20px; color: var(--muted); font-size: 14px; }\n.empty code { display: block; margin-top: 8px; font-size: 14px; color: var(--teal); }\n.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; }\n@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); } }\n</style></head><body>\n<div class=\"topbar\">\n <div class=\"brand\"><span class=\"hex\">\u2B21</span><span class=\"name\">Agent<span class=\"accent\">Guard</span></span><span class=\"tag\">Spend \u00B7 Local Dashboard</span></div>\n <div><span class=\"mono\" id=\"tamper-badge\" title=\"hash-chain + Ed25519 signature verification of the local ledger\" style=\"margin-right:16px;padding:4px 10px;border-radius:3px;border:1px solid var(--border-dim);color:var(--muted);\">tamper-evidence: \u2026</span><span class=\"mono\" style=\"color: var(--muted); margin-right: 16px;\"><span class=\"live-indicator\"></span>v__VERSION__ \u00B7 localhost:__PORT__</span><button class=\"refresh-btn\" onclick=\"loadStats()\">Refresh</button></div>\n</div>\n<div class=\"shell\">\n <div class=\"stats-row\">\n <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>\n <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>\n <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>\n <div class=\"stat-card\"><div class=\"label\">Allowed</div><div class=\"value\" id=\"allowed\">0</div><div class=\"sub\">policy-checked & passed</div></div>\n </div>\n <div class=\"two-col\">\n <div class=\"section\"><h2>Spend by Agent</h2><div id=\"by-agent\"></div></div>\n <div class=\"section\"><h2>Spend by Provider</h2><div id=\"by-provider\"></div></div>\n </div>\n <div class=\"section\">\n <h2>Recent Decisions</h2>\n <table><thead><tr><th style=\"width:80px\">Action</th><th>Agent</th><th>Provider \u00B7 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>\n </div>\n <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> \u00B7 <a href=\"https://www.npmjs.com/package/@agentguard-run/spend\">npm</a> \u00B7 <a href=\"https://pypi.org/project/agentguard-spend/\">pypi</a></div>\n</div>\n<script>\nfunction 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'); }\nfunction escapeHtml(value) { return String(value == null ? '' : value).replace(/[&<>\"']/g, function(ch) { return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' })[ch]; }); }\nfunction safeClassToken(value) { const clean = String(value || 'allow').toLowerCase().replace(/[^a-z0-9_-]/g, '').slice(0, 24); return clean || 'allow'; }\nfunction safeHash(value) { return String(value || '').toLowerCase().replace(/[^0-9a-f]/g, '').slice(0, 128); }\nfunction 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 => Number(i.spent_cents) || 0)) || 1; el.innerHTML = items.slice(0, 8).map(i => '<div class=\"bar-row\"><span class=\"name\">' + escapeHtml(i[key]) + '</span><span class=\"bar\"><span class=\"bar-fill\" style=\"width:' + ((Number(i.spent_cents) || 0)/max*100).toFixed(1) + '%\"></span></span><span class=\"amount\">' + escapeHtml(formatCents(i.spent_cents)) + '</span></div>').join(''); }\nfunction 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 = String(dec.triggeredScopeKey || ''); const agentMatch = scope.match(/agentId=([^|]+)/); const agent = agentMatch ? escapeHtml(agentMatch[1]) : '<span style=\"color:var(--muted)\">-</span>'; const action = safeClassToken(dec.action || 'allow'); const entryHash = safeHash(d.entryHash); const shortHash = entryHash ? escapeHtml(entryHash.slice(0, 12)) + '...' : 'missing'; return '<tr><td class=\"action-' + action + '\">' + escapeHtml(action.toUpperCase()) + '</td><td class=\"mono\">' + agent + '</td><td><span class=\"pill\">' + escapeHtml(dec.provider || '?') + '</span> ' + escapeHtml(dec.modelRequested || '') + '</td><td style=\"text-align:right\" class=\"mono\">' + escapeHtml(formatCents(dec.projectedCents || 0)) + '</td><td class=\"mono\"><a href=\"#\" data-entry-hash=\"' + entryHash + '\">' + shortHash + '</a></td></tr>'; }).join(''); tbody.querySelectorAll('a[data-entry-hash]').forEach(function(a) { a.addEventListener('click', function(event) { event.preventDefault(); verifyReceipt(a.getAttribute('data-entry-hash') || ''); }); }); }\nasync function verifyReceipt(hash) { try { const r = await fetch('/api/verify/' + hash); const d = await r.json(); alert(d.ok ? '\u2713 verified: full chain valid' : '\u2717 verification failed: ' + (d.reason || 'unknown')); } catch (e) { alert('verify error: ' + e); } return false; }\nfunction renderTamper(integrity) { const el = document.getElementById('tamper-badge'); if (!el) return; const i = integrity || {}; if (i.verified) { el.textContent = '\u2713 tamper-evidence: ' + (i.entries || 0) + ' entries verified'; el.style.color = 'var(--green)'; el.style.borderColor = 'var(--green)'; } else { el.textContent = '\u2717 tamper-evidence: ' + (i.reason || 'unverified'); el.style.color = 'var(--red)'; el.style.borderColor = 'var(--red)'; } }\nasync function loadStats() { try { const r = await fetch('/api/stats'); const s = await r.json(); renderTamper(s.integrity); 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); } }\nloadStats();\nsetInterval(loadStats, 5000);\n</script></body></html>\n";
10
10
  export declare function runServe(argv: string[]): Promise<number>;
11
11
  //# sourceMappingURL=serve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6FH,eAAO,MAAM,cAAc,i1WAqF1B,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmH9D"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiJH,eAAO,MAAM,cAAc,kkYAsF1B,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmH9D"}
package/dist/cli/serve.js CHANGED
@@ -49,6 +49,7 @@ const os = __importStar(require("os"));
49
49
  const path = __importStar(require("path"));
50
50
  const index_1 = require("../index");
51
51
  const decision_log_1 = require("../decision-log");
52
+ const aggregate_1 = require("../dashboard/aggregate");
52
53
  const colors_1 = require("./colors");
53
54
  const AGENTGUARD_HOME = path.join(os.homedir(), '.agentguard');
54
55
  function scanLogFiles() {
@@ -89,45 +90,95 @@ function loadAllDecisions() {
89
90
  }
90
91
  return out;
91
92
  }
92
- function computeStats(decisions) {
93
- const totalCalls = decisions.length;
94
- const blockedCount = decisions.filter((d) => d.decision?.action === 'block').length;
95
- const downgradeCount = decisions.filter((d) => d.decision?.action === 'downgrade').length;
96
- const allowCount = totalCalls - blockedCount - downgradeCount;
97
- const spentCents = decisions
98
- .filter((d) => ['allow', 'downgrade'].includes(d.decision?.action))
99
- .reduce((sum, d) => sum + (d.decision.projectedCents || 0), 0);
100
- const savedCents = decisions
101
- .filter((d) => d.decision?.action === 'block')
102
- .reduce((sum, d) => sum + (d.decision.projectedCents || 0), 0);
103
- const byAgent = {};
104
- const byProvider = {};
93
+ /** Extract agentId from a triggeredScopeKey like `tenantId=demo|agentId=bot`. */
94
+ function agentFromScopeKey(scopeKey) {
95
+ for (const part of String(scopeKey || '').split('|')) {
96
+ if (part.startsWith('agentId='))
97
+ return part.slice(8) || 'unknown';
98
+ }
99
+ return 'unknown';
100
+ }
101
+ /**
102
+ * Verify the tamper-evidence of the loaded ledger. Groups entries by signer,
103
+ * recovers each signer's public key from the embedded `publicKeyHex`, and runs
104
+ * the real hash-chain verifier. `verified` is true only if every signer's chain
105
+ * checks out; unverifiable groups (no embedded key) are surfaced as a reason.
106
+ */
107
+ async function computeIntegrity(decisions) {
108
+ const bySigner = new Map();
105
109
  for (const d of decisions) {
106
- if (!['allow', 'downgrade'].includes(d.decision?.action))
110
+ const signer = d.signerFingerprint;
111
+ if (!signer)
107
112
  continue;
108
- const scopeKey = d.decision?.triggeredScopeKey || '';
109
- let agentId = 'unknown';
110
- for (const part of scopeKey.split('|')) {
111
- if (part.startsWith('agentId=')) {
112
- agentId = part.slice(8);
113
- break;
114
- }
113
+ if (!bySigner.has(signer))
114
+ bySigner.set(signer, []);
115
+ bySigner.get(signer).push(d);
116
+ }
117
+ if (bySigner.size === 0) {
118
+ return { verified: false, entries: decisions.length, reason: 'NO_SIGNED_ENTRIES' };
119
+ }
120
+ for (const [, group] of bySigner) {
121
+ const withKey = group.find((d) => d.publicKeyHex);
122
+ if (!withKey)
123
+ return { verified: false, entries: decisions.length, reason: 'NO_PUBLIC_KEY_IN_LEDGER' };
124
+ const publicKey = Uint8Array.from(Buffer.from(withKey.publicKeyHex, 'hex'));
125
+ const chain = group
126
+ .slice()
127
+ .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))
128
+ .map((d) => ({
129
+ sequence: d.sequence,
130
+ entryHash: d.entryHash,
131
+ previousHash: d.previousHash,
132
+ signature: d.signature,
133
+ signerFingerprint: d.signerFingerprint,
134
+ decision: d.decision,
135
+ ...(d.builderCode ? { builderCode: d.builderCode } : {}),
136
+ }));
137
+ const result = await (0, decision_log_1.verifyChain)(chain, publicKey);
138
+ if (!result.ok) {
139
+ return { verified: false, entries: decisions.length, reason: `seq ${result.sequence}: ${result.reason}` };
115
140
  }
116
- byAgent[agentId] = (byAgent[agentId] || 0) + (d.decision.projectedCents || 0);
117
- const prov = d.decision.provider || 'unknown';
118
- byProvider[prov] = (byProvider[prov] || 0) + (d.decision.projectedCents || 0);
141
+ }
142
+ return { verified: true, entries: decisions.length };
143
+ }
144
+ async function computeStats(decisions) {
145
+ const entries = decisions.map((d) => ({
146
+ sequence: d.sequence,
147
+ entryHash: d.entryHash,
148
+ previousHash: d.previousHash,
149
+ signature: d.signature,
150
+ signerFingerprint: d.signerFingerprint,
151
+ decision: d.decision,
152
+ ...(d.builderCode ? { builderCode: d.builderCode } : {}),
153
+ }));
154
+ const integrity = await computeIntegrity(decisions);
155
+ const dash = (0, aggregate_1.aggregateLedger)(entries, integrity);
156
+ // Per-agent breakdown from triggeredScopeKey (the ledger's best-effort attribution).
157
+ const byAgent = {};
158
+ for (const e of entries) {
159
+ const d = e.decision;
160
+ if (d.action !== 'allow' && d.action !== 'downgrade')
161
+ continue;
162
+ const agentId = agentFromScopeKey(d.triggeredScopeKey || '');
163
+ const cents = typeof d.actualCents === 'number' ? d.actualCents : (d.projectedCents || 0);
164
+ byAgent[agentId] = (byAgent[agentId] || 0) + cents;
119
165
  }
120
166
  return {
121
167
  totals: {
122
- spent_cents: spentCents,
123
- saved_cents: savedCents,
124
- calls: totalCalls,
125
- blocked: blockedCount,
126
- downgraded: downgradeCount,
127
- allowed: allowCount,
168
+ spent_cents: dash.totals.spentCents,
169
+ saved_cents: dash.enforcement.estimatedSavedCents,
170
+ calls: dash.totals.calls,
171
+ blocked: dash.enforcement.blocked,
172
+ downgraded: dash.enforcement.downgraded,
173
+ allowed: dash.enforcement.allowed,
174
+ },
175
+ integrity: {
176
+ verified: dash.integrity.verified,
177
+ entries: dash.integrity.entries,
178
+ reason: dash.integrity.reason,
128
179
  },
129
180
  by_agent: Object.entries(byAgent).map(([k, v]) => ({ agent: k, spent_cents: v })).sort((a, b) => b.spent_cents - a.spent_cents),
130
- by_provider: Object.entries(byProvider).map(([k, v]) => ({ provider: k, spent_cents: v })).sort((a, b) => b.spent_cents - a.spent_cents),
181
+ by_provider: dash.byProvider.map((b) => ({ provider: b.key, spent_cents: b.cents })),
131
182
  recent: decisions.slice(-50).reverse(),
132
183
  version: index_1.AGENTGUARD_SPEND_VERSION,
133
184
  };
@@ -188,7 +239,7 @@ td .mono { color: var(--code); }
188
239
  </style></head><body>
189
240
  <div class="topbar">
190
241
  <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>
191
- <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>
242
+ <div><span class="mono" id="tamper-badge" title="hash-chain + Ed25519 signature verification of the local ledger" style="margin-right:16px;padding:4px 10px;border-radius:3px;border:1px solid var(--border-dim);color:var(--muted);">tamper-evidence: …</span><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>
192
243
  </div>
193
244
  <div class="shell">
194
245
  <div class="stats-row">
@@ -215,7 +266,8 @@ function safeHash(value) { return String(value || '').toLowerCase().replace(/[^0
215
266
  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 => Number(i.spent_cents) || 0)) || 1; el.innerHTML = items.slice(0, 8).map(i => '<div class="bar-row"><span class="name">' + escapeHtml(i[key]) + '</span><span class="bar"><span class="bar-fill" style="width:' + ((Number(i.spent_cents) || 0)/max*100).toFixed(1) + '%"></span></span><span class="amount">' + escapeHtml(formatCents(i.spent_cents)) + '</span></div>').join(''); }
216
267
  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 = String(dec.triggeredScopeKey || ''); const agentMatch = scope.match(/agentId=([^|]+)/); const agent = agentMatch ? escapeHtml(agentMatch[1]) : '<span style="color:var(--muted)">-</span>'; const action = safeClassToken(dec.action || 'allow'); const entryHash = safeHash(d.entryHash); const shortHash = entryHash ? escapeHtml(entryHash.slice(0, 12)) + '...' : 'missing'; return '<tr><td class="action-' + action + '">' + escapeHtml(action.toUpperCase()) + '</td><td class="mono">' + agent + '</td><td><span class="pill">' + escapeHtml(dec.provider || '?') + '</span> ' + escapeHtml(dec.modelRequested || '') + '</td><td style="text-align:right" class="mono">' + escapeHtml(formatCents(dec.projectedCents || 0)) + '</td><td class="mono"><a href="#" data-entry-hash="' + entryHash + '">' + shortHash + '</a></td></tr>'; }).join(''); tbody.querySelectorAll('a[data-entry-hash]').forEach(function(a) { a.addEventListener('click', function(event) { event.preventDefault(); verifyReceipt(a.getAttribute('data-entry-hash') || ''); }); }); }
217
268
  async function verifyReceipt(hash) { try { const r = await fetch('/api/verify/' + hash); const d = await r.json(); alert(d.ok ? '✓ verified: full chain valid' : '✗ verification failed: ' + (d.reason || 'unknown')); } catch (e) { alert('verify error: ' + e); } return false; }
218
- 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); } }
269
+ function renderTamper(integrity) { const el = document.getElementById('tamper-badge'); if (!el) return; const i = integrity || {}; if (i.verified) { el.textContent = '✓ tamper-evidence: ' + (i.entries || 0) + ' entries verified'; el.style.color = 'var(--green)'; el.style.borderColor = 'var(--green)'; } else { el.textContent = '✗ tamper-evidence: ' + (i.reason || 'unverified'); el.style.color = 'var(--red)'; el.style.borderColor = 'var(--red)'; } }
270
+ async function loadStats() { try { const r = await fetch('/api/stats'); const s = await r.json(); renderTamper(s.integrity); 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); } }
219
271
  loadStats();
220
272
  setInterval(loadStats, 5000);
221
273
  </script></body></html>
@@ -268,7 +320,7 @@ async function runServe(argv) {
268
320
  return;
269
321
  }
270
322
  if (url === '/api/stats') {
271
- sendJSON(200, computeStats(loadAllDecisions()));
323
+ sendJSON(200, await computeStats(loadAllDecisions()));
272
324
  return;
273
325
  }
274
326
  if (url.startsWith('/api/verify/')) {
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Read the existing local signing keypair or generate one. The private seed is
3
+ * stored mode 0600 under ~/.agentguard/ and never leaves the machine. Returns
4
+ * both keys as lowercase hex.
5
+ */
6
+ export declare function ensureSigningKeys(home?: string): Promise<{
7
+ privateKeyHex: string;
8
+ publicKeyHex: string;
9
+ }>;
1
10
  export interface WizardAnswers {
2
11
  building: string;
3
12
  template: string;
@@ -18,7 +27,9 @@ export declare class WizardStateMachine {
18
27
  }
19
28
  export declare function runWizard(argv: string[]): Promise<number>;
20
29
  export declare function defaultAnswers(templateSlug?: string): WizardAnswers;
21
- export declare function writeWizardOutputs(answers: WizardAnswers, home?: string): {
30
+ export declare function writeWizardOutputs(answers: WizardAnswers, home?: string, signingKeys?: {
31
+ publicKeyHex: string;
32
+ }): {
22
33
  policyPath: string;
23
34
  quickstartTsPath: string;
24
35
  quickstartPyPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/cli/wizard.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAC7B,IAAI,SAAK;IACT,QAAQ,CAAC,UAAU,KAAK;IAExB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAM7B,IAAI,IAAI,IAAI;IAIZ,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;CAShD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB/D;AAED,wBAAgB,cAAc,CAAC,YAAY,SAAgB,GAAG,aAAa,CAe1E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,SAAmB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAY/K"}
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/cli/wizard.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,SAAmB,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBzH;AAUD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAC7B,IAAI,SAAK;IACT,QAAQ,CAAC,UAAU,KAAK;IAExB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAM7B,IAAI,IAAI,IAAI;IAIZ,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;CAShD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB/D;AAED,wBAAgB,cAAc,CAAC,YAAY,SAAgB,GAAG,aAAa,CAe1E;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,IAAI,SAAmB,EACvB,WAAW,CAAC,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAY7F"}
@@ -34,15 +34,43 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.WizardStateMachine = void 0;
37
+ exports.ensureSigningKeys = ensureSigningKeys;
37
38
  exports.runWizard = runWizard;
38
39
  exports.defaultAnswers = defaultAnswers;
39
40
  exports.writeWizardOutputs = writeWizardOutputs;
40
41
  const fs = __importStar(require("fs"));
41
42
  const path = __importStar(require("path"));
42
43
  const readline = __importStar(require("readline"));
44
+ const crypto_1 = require("crypto");
45
+ const ed = __importStar(require("@noble/ed25519"));
43
46
  const index_1 = require("../index");
44
47
  const templates_1 = require("../templates");
45
48
  const colors_1 = require("./colors");
49
+ const SIGNING_PRIVATE_KEY_FILE = 'signing-private.key';
50
+ const SIGNING_PUBLIC_KEY_FILE = 'signing-public.key';
51
+ /**
52
+ * Read the existing local signing keypair or generate one. The private seed is
53
+ * stored mode 0600 under ~/.agentguard/ and never leaves the machine. Returns
54
+ * both keys as lowercase hex.
55
+ */
56
+ async function ensureSigningKeys(home = (0, colors_1.agentguardHome)()) {
57
+ fs.mkdirSync(home, { recursive: true });
58
+ const privatePath = path.join(home, SIGNING_PRIVATE_KEY_FILE);
59
+ const publicPath = path.join(home, SIGNING_PUBLIC_KEY_FILE);
60
+ if (fs.existsSync(privatePath) && fs.existsSync(publicPath)) {
61
+ return {
62
+ privateKeyHex: fs.readFileSync(privatePath, 'utf-8').trim(),
63
+ publicKeyHex: fs.readFileSync(publicPath, 'utf-8').trim(),
64
+ };
65
+ }
66
+ const privateSeed = new Uint8Array((0, crypto_1.randomBytes)(32));
67
+ const publicKey = await ed.getPublicKeyAsync(privateSeed);
68
+ const privateKeyHex = Buffer.from(privateSeed).toString('hex');
69
+ const publicKeyHex = Buffer.from(publicKey).toString('hex');
70
+ fs.writeFileSync(privatePath, privateKeyHex, { mode: 0o600 });
71
+ fs.writeFileSync(publicPath, publicKeyHex);
72
+ return { privateKeyHex, publicKeyHex };
73
+ }
46
74
  const BUILD_TYPES = ['chatbot', 'agent', 'batch job', 'API endpoint'];
47
75
  const CAPABILITY_TIERS = [
48
76
  ['read_only', 'Read records and produce findings'],
@@ -87,7 +115,8 @@ async function runWizard(argv) {
87
115
  const templateSlug = valueAfter(argv, '--template') ?? 'risk-review';
88
116
  const useDefaults = argv.includes('--defaults') || !process.stdin.isTTY;
89
117
  const answers = useDefaults ? defaultAnswers(templateSlug) : await promptAnswers(templateSlug);
90
- const outputs = writeWizardOutputs(answers);
118
+ const signingKeys = await ensureSigningKeys();
119
+ const outputs = writeWizardOutputs(answers, (0, colors_1.agentguardHome)(), signingKeys);
91
120
  console.log('');
92
121
  console.log(' ' + (0, colors_1.banner)(index_1.AGENTGUARD_SPEND_VERSION));
93
122
  console.log('');
@@ -119,13 +148,13 @@ function defaultAnswers(templateSlug = 'risk-review') {
119
148
  systemInstructions: template.systemInstructions,
120
149
  };
121
150
  }
122
- function writeWizardOutputs(answers, home = (0, colors_1.agentguardHome)()) {
151
+ function writeWizardOutputs(answers, home = (0, colors_1.agentguardHome)(), signingKeys) {
123
152
  fs.mkdirSync(home, { recursive: true });
124
153
  const policyPath = path.join(home, 'policy.yaml');
125
154
  const quickstartTsPath = path.join(home, 'quickstart.ts');
126
155
  const quickstartPyPath = path.join(home, 'quickstart.py');
127
156
  const policy = policyYaml(answers);
128
- const ts = quickstartTs(answers);
157
+ const ts = quickstartTs(answers, signingKeys?.publicKeyHex);
129
158
  const py = quickstartPy(answers);
130
159
  fs.writeFileSync(policyPath, policy);
131
160
  fs.writeFileSync(quickstartTsPath, ts);
@@ -162,8 +191,9 @@ function policyYaml(answers) {
162
191
  const allowed = answers.allowedModels.map((model) => ` - ${model}`).join('\n');
163
192
  return `# AgentGuard Spend policy generated by agentguard wizard\nid: ${id}\nname: ${answers.template} policy\nversion: 1\neffectiveFrom: "${new Date().toISOString()}"\nmode: enforce\nrequiredCapability: ${answers.capability}\nscope:\n tenantId: my-tenant\nmodels:\n allowed:\n${allowed}\n fallback: ${answers.fallbackModel}\ncaps:\n # WHY: Per-call cap bounds one agent action.\n - amountCents: ${answers.perCallCents}\n window: per_call\n action: downgrade\n downgradeTo: ${answers.fallbackModel}\n reason: "Per-call budget reached, routing to fallback model"\n # WHY: Daily cap catches runaway loops and unexpected volume.\n - amountCents: ${answers.perDayCents}\n window: per_day\n action: block\n reason: "Daily budget reached"\n # WHY: Monthly cap keeps the finance view predictable.\n - amountCents: ${answers.perMonthCents}\n window: per_month\n action: block\n reason: "Monthly budget reached"\nsystemInstructions: |\n${indent(answers.systemInstructions, 2)}\n`;
164
193
  }
165
- function quickstartTs(answers) {
166
- return `import OpenAI from 'openai';\nimport { withSpendGuard, type SpendPolicy } from '@agentguard-run/spend';\n\nconst policy: SpendPolicy = {\n id: 'agentguard-${answers.template}-v1',\n name: '${answers.template} policy',\n scope: { tenantId: 'my-tenant' },\n caps: [\n { amountCents: ${answers.perCallCents}, window: 'per_call', action: 'downgrade', downgradeTo: '${answers.fallbackModel}' },\n { amountCents: ${answers.perDayCents}, window: 'per_day', action: 'block' },\n { amountCents: ${answers.perMonthCents}, window: 'per_month', action: 'block' },\n ],\n mode: 'enforce',\n requiredCapability: '${answers.capability}',\n version: 1,\n effectiveFrom: new Date().toISOString(),\n};\n\nconst openrouter = new OpenAI({\n baseURL: 'https://openrouter.ai/api/v1',\n apiKey: process.env.OPENROUTER_API_KEY,\n});\n\nexport const guardedClient = withSpendGuard(openrouter, {\n policy,\n scope: { tenantId: 'my-tenant', agentId: '${answers.template}' },\n capabilityClaim: '${answers.capability}',\n});\n`;
194
+ function quickstartTs(answers, publicKeyHex) {
195
+ const pubHex = publicKeyHex ?? '';
196
+ return `import OpenAI from 'openai';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { withSpendGuard, NdjsonDecisionLogStore, type SpendPolicy } from '@agentguard-run/spend';\n\nconst policy: SpendPolicy = {\n id: 'agentguard-${answers.template}-v1',\n name: '${answers.template} policy',\n scope: { tenantId: 'my-tenant' },\n caps: [\n { amountCents: ${answers.perCallCents}, window: 'per_call', action: 'downgrade', downgradeTo: '${answers.fallbackModel}' },\n { amountCents: ${answers.perDayCents}, window: 'per_day', action: 'block' },\n { amountCents: ${answers.perMonthCents}, window: 'per_month', action: 'block' },\n ],\n mode: 'enforce',\n requiredCapability: '${answers.capability}',\n version: 1,\n effectiveFrom: new Date().toISOString(),\n};\n\nconst openrouter = new OpenAI({\n baseURL: 'https://openrouter.ai/api/v1',\n apiKey: process.env.OPENROUTER_API_KEY,\n});\n\n// Local Ed25519 signing key generated by \`agentguard wizard\` (never leaves this machine).\nconst home = path.join(os.homedir(), '.agentguard');\nconst signingKeys = {\n privateKey: Uint8Array.from(Buffer.from(fs.readFileSync(path.join(home, 'signing-private.key'), 'utf-8').trim(), 'hex')),\n publicKey: Uint8Array.from(Buffer.from(fs.readFileSync(path.join(home, 'signing-public.key'), 'utf-8').trim(), 'hex')),\n};\nconst publicKeyHex = '${pubHex}' || Buffer.from(signingKeys.publicKey).toString('hex');\n\nexport const guardedClient = withSpendGuard(openrouter, {\n policy,\n scope: { tenantId: 'my-tenant', agentId: '${answers.template}' },\n capabilityClaim: '${answers.capability}',\n config: {\n // Persists signed receipts to ~/.agentguard/my-tenant/decisions.ndjson so\n // \`agentguard serve\` shows governed spend, $ saved, and a verifiable trail.\n logStore: new NdjsonDecisionLogStore('my-tenant', { publicKeyHex }),\n signingKeys,\n },\n});\n`;
167
197
  }
168
198
  function quickstartPy(answers) {
169
199
  return `from openai import OpenAI\nfrom agentguard_spend import with_spend_guard\nfrom agentguard_spend.types import SpendPolicy, SpendCap\n\npolicy = SpendPolicy(\n id='agentguard-${answers.template}-v1', name='${answers.template} policy',\n scope={'tenantId': 'my-tenant'},\n caps=[\n SpendCap(amountCents=${answers.perCallCents}, window='per_call', action='downgrade', downgradeTo='${answers.fallbackModel}'),\n SpendCap(amountCents=${answers.perDayCents}, window='per_day', action='block'),\n SpendCap(amountCents=${answers.perMonthCents}, window='per_month', action='block'),\n ],\n mode='enforce', requiredCapability='${answers.capability}',\n version=1, effectiveFrom='2026-05-27T00:00:00Z',\n)\n\nopenrouter = OpenAI(base_url='https://openrouter.ai/api/v1')\nguarded_client = with_spend_guard(openrouter, policy=policy, scope={'tenantId': 'my-tenant', 'agentId': '${answers.template}'}, capability_claim='${answers.capability}')\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/cli/wizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/cli/wizard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,8CAiBC;AA+CD,8BAwBC;AAED,wCAeC;AAED,gDAgBC;AA5ID,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,mCAAqC;AACrC,mDAAqC;AACrC,oCAAoD;AACpD,4CAAqG;AACrG,qCAA8E;AAE9E,MAAM,wBAAwB,GAAG,qBAAqB,CAAC;AACvD,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAErD;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CAAC,IAAI,GAAG,IAAA,uBAAc,GAAE;IAC7D,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO;YACL,aAAa,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE;YAC3D,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE;SAC1D,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,gBAAgB,GAAG;IACvB,CAAC,WAAW,EAAE,mCAAmC,CAAC;IAClD,CAAC,YAAY,EAAE,0CAA0C,CAAC;IAC1D,CAAC,kBAAkB,EAAE,qCAAqC,CAAC;IAC3D,CAAC,iBAAiB,EAAE,uDAAuD,CAAC;CACpE,CAAC;AAcX,MAAa,kBAAkB;IAC7B,IAAI,GAAG,CAAC,CAAC;IACA,UAAU,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,MAAc;QACnC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,0BAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAC1E,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/F,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAChI,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvBD,gDAuBC;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,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,aAAa,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAA,uBAAc,GAAE,EAAE,WAAW,CAAC,CAAC;IAC3E,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,KAAK,IAAA,cAAK,EAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,cAAK,EAAC,SAAS,CAAC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,cAAK,EAAC,SAAS,CAAC,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,iBAAQ,EAAC,oBAAoB,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAA,kBAAS,GAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,cAAc,CAAC,YAAY,GAAG,aAAa;IACzD,MAAM,QAAQ,GAAG,IAAA,2BAAe,EAAC,YAAY,CAAC,IAAI,IAAA,2BAAe,EAAC,aAAa,CAAiB,CAAC;IACjG,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,WAAW,IAAI,GAAG,CAAC;IAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC;IAC1F,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,UAAU,EAAE,QAAQ,CAAC,kBAAkB;QACvC,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC1C,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,MAAM;QACnB,aAAa,EAAE,MAAM,GAAG,EAAE;QAC1B,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;KAChD,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAChC,OAAsB,EACtB,IAAI,GAAG,IAAA,uBAAc,GAAE,EACvB,WAAsC;IAEtC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACjC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrC,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,YAAoB;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAE,QAAgB,EAAE,EAAE,CAAC,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QAClF,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,KAAK,QAAQ,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAA,eAAM,EAAC,gCAAwB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,0BAA0B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,yBAAyB,IAAA,6BAAiB,GAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9H,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,oBAAoB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnJ,MAAM,WAAW,GAAG,IAAA,2BAAe,EAAC,QAAQ,CAAC,IAAI,IAAA,2BAAe,EAAC,IAAI,CAAC,QAAQ,CAAiB,CAAC;QAChG,MAAM,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC,iCAAiC,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChK,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,uBAAuB,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,6CAA6C,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACxI,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtG,MAAM,kBAAkB,GAAG,MAAM,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC5F,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACxI,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAsB;IACxC,MAAM,EAAE,GAAG,cAAc,OAAO,CAAC,QAAQ,KAAK,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,OAAO,iEAAiE,EAAE,WAAW,OAAO,CAAC,QAAQ,wCAAwC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,yCAAyC,OAAO,CAAC,UAAU,yDAAyD,OAAO,iBAAiB,OAAO,CAAC,aAAa,6EAA6E,OAAO,CAAC,YAAY,mEAAmE,OAAO,CAAC,aAAa,yJAAyJ,OAAO,CAAC,WAAW,4JAA4J,OAAO,CAAC,aAAa,4GAA4G,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC;AACp/B,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB,EAAE,YAAqB;IACjE,MAAM,MAAM,GAAG,YAAY,IAAI,EAAE,CAAC;IAClC,OAAO,4QAA4Q,OAAO,CAAC,QAAQ,mBAAmB,OAAO,CAAC,QAAQ,iFAAiF,OAAO,CAAC,YAAY,4DAA4D,OAAO,CAAC,aAAa,4BAA4B,OAAO,CAAC,WAAW,+DAA+D,OAAO,CAAC,aAAa,+FAA+F,OAAO,CAAC,UAAU,ooBAAooB,MAAM,iLAAiL,OAAO,CAAC,QAAQ,6BAA6B,OAAO,CAAC,UAAU,8RAA8R,CAAC;AAC34D,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB;IAC1C,OAAO,mLAAmL,OAAO,CAAC,QAAQ,eAAe,OAAO,CAAC,QAAQ,6FAA6F,OAAO,CAAC,YAAY,yDAAyD,OAAO,CAAC,aAAa,qCAAqC,OAAO,CAAC,WAAW,sEAAsE,OAAO,CAAC,aAAa,2FAA2F,OAAO,CAAC,UAAU,yOAAyO,OAAO,CAAC,QAAQ,yBAAyB,OAAO,CAAC,UAAU,MAAM,CAAC;AACr9B,CAAC;AAED,SAAS,SAAS,CAAC,OAAsB;IACvC,OAAO,6EAA6E,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,oBAAoB,6EAA6E,CAAC;AACpN,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,MAAc;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,UAAU,CAAC,IAAc,EAAE,IAAY;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export { getModelCost, setCostOverride, clearCostOverrides, computeCallCents, in
11
11
  export { evaluatePolicy, buildScopeKey, adjustPolicyWindowSpend, enforcePolicyLicenseGates, findCustomKeywordWatchlists, BUILT_IN_KEYWORD_WATCHLISTS } from './policy';
12
12
  export { canonicalJson, sha256Hex, computeEntryHash, computeSignerFingerprint, signDecision, verifyEntry, verifyChain, GENESIS_PREVIOUS_HASH, InMemoryDecisionLogStore, } from './decision-log';
13
13
  export { InMemorySpendStore } from './store-memory';
14
+ export { NdjsonDecisionLogStore, type NdjsonStoreOptions } from './adapters/ndjson-store';
14
15
  export { AgentGuardLicenseRequiredError, validateLicenseKey, validateAndRegisterLicense, readConfiguredLicenseKey, writeConfiguredLicenseKey, clearConfiguredLicenseKey, licenseKeyFingerprint, type AgentGuardLicenseStatus, type AgentGuardLicenseFeatures, type AgentGuardTier, } from './license';
15
16
  export { telemetryStatus, enableTelemetry, disableTelemetry, resetTelemetryInstallId, recordTelemetryEvent, type TelemetryStatus, } from './telemetry';
16
17
  export { fetchCatalog, getCachedCatalog, syncPricingIntoCostTable, persistOverrides, modelCostFromOpenRouter, type OpenRouterCatalog, type OpenRouterModel, type SyncPricingResult, } from './openrouter-catalog';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -21,9 +21,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
21
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
22
  };
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.computeDagEntryHash = exports.compressReceiptDag = exports.receiptSchemaVersion = exports.isReceiptV3 = exports.assertReceiptV3 = exports.isOpenRouterHost = exports.clearManagedOpenRouterKeyCache = exports.fetchManagedOpenRouterKey = exports.modelCostFromOpenRouter = exports.persistOverrides = exports.syncPricingIntoCostTable = exports.getCachedCatalog = exports.fetchCatalog = exports.recordTelemetryEvent = exports.resetTelemetryInstallId = exports.disableTelemetry = exports.enableTelemetry = exports.telemetryStatus = exports.licenseKeyFingerprint = exports.clearConfiguredLicenseKey = exports.writeConfiguredLicenseKey = exports.readConfiguredLicenseKey = exports.validateAndRegisterLicense = exports.validateLicenseKey = exports.AgentGuardLicenseRequiredError = exports.InMemorySpendStore = exports.InMemoryDecisionLogStore = exports.GENESIS_PREVIOUS_HASH = exports.verifyChain = exports.verifyEntry = exports.signDecision = exports.computeSignerFingerprint = exports.computeEntryHash = exports.sha256Hex = exports.canonicalJson = exports.BUILT_IN_KEYWORD_WATCHLISTS = exports.findCustomKeywordWatchlists = exports.enforcePolicyLicenseGates = exports.adjustPolicyWindowSpend = exports.buildScopeKey = exports.evaluatePolicy = exports.knownModelCosts = exports.persistCostOverrides = exports.loadPersistedCostOverrides = exports.listCostOverrides = exports.inferProvider = exports.computeCallCents = exports.clearCostOverrides = exports.setCostOverride = exports.getModelCost = void 0;
25
- exports.formatBlockedTrace = exports.t = exports.resolveLocale = exports.TRANSLATIONS = exports.SUPPORTED_LOCALES = exports.DEFAULT_LOCALE = exports.defaultKey = exports.recommend = exports.withSpendGuardBedrock = exports.withSpendGuardAnthropic = exports.AgentGuardBlockedError = exports.withSpendGuard = exports.SpendGuard = exports.writeAdvisorOutputs = exports.createAdvisorSessionLogger = exports.resolveAdvisorApiKey = exports.createAdvisorClient = exports.projectedSavings = exports.buildPolicyFromProfile = exports.buildBusinessProfile = exports.AdvisorConversation = exports.AgentGuardWorkflowStateError = exports.AgentGuardDurationCapError = exports.AgentGuardChainCorruptError = exports.AgentGuardBudgetCapError = exports.validateReceiptChain = exports.computeChainHash = exports.WorkflowContext = exports.workflow = exports.verifyConsentReceipt = exports.enforceCompliance = exports.AgentGuardConsentRequiredError = exports.AgentGuardComplianceError = exports.isForeignOriginModel = exports.inferCompliance = exports.inferHosting = exports.inferModelIdentity = exports.inferProviderRoute = exports.PROVIDER_REGISTRY = exports.captureProvenance = exports.verifyReceiptDag = exports.verifyInclusion = exports.signDagNode = exports.msgHashForDecision = exports.merkleRoot = exports.merkleInclusionProof = exports.gateCapability = exports.deriveTrustScore = exports.deriveCapability = exports.dagEnvelopeFromEntries = void 0;
26
- exports.formatLineage = exports.workloadProvenance = exports.centsToUsd = exports.decisionCents = exports.classifyOrigin = exports.aggregateLedger = exports.PATENT_NOTICE = exports.agentguard = exports.AGENTGUARD_SPEND_VERSION = void 0;
24
+ exports.compressReceiptDag = exports.receiptSchemaVersion = exports.isReceiptV3 = exports.assertReceiptV3 = exports.isOpenRouterHost = exports.clearManagedOpenRouterKeyCache = exports.fetchManagedOpenRouterKey = exports.modelCostFromOpenRouter = exports.persistOverrides = exports.syncPricingIntoCostTable = exports.getCachedCatalog = exports.fetchCatalog = exports.recordTelemetryEvent = exports.resetTelemetryInstallId = exports.disableTelemetry = exports.enableTelemetry = exports.telemetryStatus = exports.licenseKeyFingerprint = exports.clearConfiguredLicenseKey = exports.writeConfiguredLicenseKey = exports.readConfiguredLicenseKey = exports.validateAndRegisterLicense = exports.validateLicenseKey = exports.AgentGuardLicenseRequiredError = exports.NdjsonDecisionLogStore = exports.InMemorySpendStore = exports.InMemoryDecisionLogStore = exports.GENESIS_PREVIOUS_HASH = exports.verifyChain = exports.verifyEntry = exports.signDecision = exports.computeSignerFingerprint = exports.computeEntryHash = exports.sha256Hex = exports.canonicalJson = exports.BUILT_IN_KEYWORD_WATCHLISTS = exports.findCustomKeywordWatchlists = exports.enforcePolicyLicenseGates = exports.adjustPolicyWindowSpend = exports.buildScopeKey = exports.evaluatePolicy = exports.knownModelCosts = exports.persistCostOverrides = exports.loadPersistedCostOverrides = exports.listCostOverrides = exports.inferProvider = exports.computeCallCents = exports.clearCostOverrides = exports.setCostOverride = exports.getModelCost = void 0;
25
+ exports.t = exports.resolveLocale = exports.TRANSLATIONS = exports.SUPPORTED_LOCALES = exports.DEFAULT_LOCALE = exports.defaultKey = exports.recommend = exports.withSpendGuardBedrock = exports.withSpendGuardAnthropic = exports.AgentGuardBlockedError = exports.withSpendGuard = exports.SpendGuard = exports.writeAdvisorOutputs = exports.createAdvisorSessionLogger = exports.resolveAdvisorApiKey = exports.createAdvisorClient = exports.projectedSavings = exports.buildPolicyFromProfile = exports.buildBusinessProfile = exports.AdvisorConversation = exports.AgentGuardWorkflowStateError = exports.AgentGuardDurationCapError = exports.AgentGuardChainCorruptError = exports.AgentGuardBudgetCapError = exports.validateReceiptChain = exports.computeChainHash = exports.WorkflowContext = exports.workflow = exports.verifyConsentReceipt = exports.enforceCompliance = exports.AgentGuardConsentRequiredError = exports.AgentGuardComplianceError = exports.isForeignOriginModel = exports.inferCompliance = exports.inferHosting = exports.inferModelIdentity = exports.inferProviderRoute = exports.PROVIDER_REGISTRY = exports.captureProvenance = exports.verifyReceiptDag = exports.verifyInclusion = exports.signDagNode = exports.msgHashForDecision = exports.merkleRoot = exports.merkleInclusionProof = exports.gateCapability = exports.deriveTrustScore = exports.deriveCapability = exports.dagEnvelopeFromEntries = exports.computeDagEntryHash = void 0;
26
+ exports.formatLineage = exports.workloadProvenance = exports.centsToUsd = exports.decisionCents = exports.classifyOrigin = exports.aggregateLedger = exports.PATENT_NOTICE = exports.agentguard = exports.AGENTGUARD_SPEND_VERSION = exports.formatBlockedTrace = void 0;
27
27
  const context_1 = require("./workflow/context");
28
28
  // Cost table
29
29
  var cost_table_1 = require("./cost-table");
@@ -58,6 +58,9 @@ Object.defineProperty(exports, "InMemoryDecisionLogStore", { enumerable: true, g
58
58
  // In-memory spend store
59
59
  var store_memory_1 = require("./store-memory");
60
60
  Object.defineProperty(exports, "InMemorySpendStore", { enumerable: true, get: function () { return store_memory_1.InMemorySpendStore; } });
61
+ // File-backed decision log store (default persistence for the CLI/wizard path)
62
+ var ndjson_store_1 = require("./adapters/ndjson-store");
63
+ Object.defineProperty(exports, "NdjsonDecisionLogStore", { enumerable: true, get: function () { return ndjson_store_1.NdjsonDecisionLogStore; } });
61
64
  // License controls
62
65
  var license_1 = require("./license");
63
66
  Object.defineProperty(exports, "AgentGuardLicenseRequiredError", { enumerable: true, get: function () { return license_1.AgentGuardLicenseRequiredError; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentguard-run/spend",
3
- "version": "0.15.5",
3
+ "version": "0.15.6",
4
4
  "description": "All terminology and labels used in AgentGuard materials are descriptive of software functionality only, not legal definitions or guarantees of compliance. Terms like receipt, audit log, evidence, audit trail, and attestation refer solely to cryptographically-signed records produced by the software. Full functional-use disclaimer in README.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/cli/wizard.ts CHANGED
@@ -1,10 +1,39 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import * as readline from 'readline';
4
+ import { randomBytes } from 'crypto';
5
+ import * as ed from '@noble/ed25519';
4
6
  import { AGENTGUARD_SPEND_VERSION } from '../index';
5
7
  import { TASK_TEMPLATES, getTaskTemplate, listTaskTemplates, type TaskTemplate } from '../templates';
6
8
  import { agentguardHome, banner, cyanBold, green, statusBar } from './colors';
7
9
 
10
+ const SIGNING_PRIVATE_KEY_FILE = 'signing-private.key';
11
+ const SIGNING_PUBLIC_KEY_FILE = 'signing-public.key';
12
+
13
+ /**
14
+ * Read the existing local signing keypair or generate one. The private seed is
15
+ * stored mode 0600 under ~/.agentguard/ and never leaves the machine. Returns
16
+ * both keys as lowercase hex.
17
+ */
18
+ export async function ensureSigningKeys(home = agentguardHome()): Promise<{ privateKeyHex: string; publicKeyHex: string }> {
19
+ fs.mkdirSync(home, { recursive: true });
20
+ const privatePath = path.join(home, SIGNING_PRIVATE_KEY_FILE);
21
+ const publicPath = path.join(home, SIGNING_PUBLIC_KEY_FILE);
22
+ if (fs.existsSync(privatePath) && fs.existsSync(publicPath)) {
23
+ return {
24
+ privateKeyHex: fs.readFileSync(privatePath, 'utf-8').trim(),
25
+ publicKeyHex: fs.readFileSync(publicPath, 'utf-8').trim(),
26
+ };
27
+ }
28
+ const privateSeed = new Uint8Array(randomBytes(32));
29
+ const publicKey = await ed.getPublicKeyAsync(privateSeed);
30
+ const privateKeyHex = Buffer.from(privateSeed).toString('hex');
31
+ const publicKeyHex = Buffer.from(publicKey).toString('hex');
32
+ fs.writeFileSync(privatePath, privateKeyHex, { mode: 0o600 });
33
+ fs.writeFileSync(publicPath, publicKeyHex);
34
+ return { privateKeyHex, publicKeyHex };
35
+ }
36
+
8
37
  const BUILD_TYPES = ['chatbot', 'agent', 'batch job', 'API endpoint'];
9
38
  const CAPABILITY_TIERS = [
10
39
  ['read_only', 'Read records and produce findings'],
@@ -58,7 +87,8 @@ export async function runWizard(argv: string[]): Promise<number> {
58
87
  const templateSlug = valueAfter(argv, '--template') ?? 'risk-review';
59
88
  const useDefaults = argv.includes('--defaults') || !process.stdin.isTTY;
60
89
  const answers = useDefaults ? defaultAnswers(templateSlug) : await promptAnswers(templateSlug);
61
- const outputs = writeWizardOutputs(answers);
90
+ const signingKeys = await ensureSigningKeys();
91
+ const outputs = writeWizardOutputs(answers, agentguardHome(), signingKeys);
62
92
  console.log('');
63
93
  console.log(' ' + banner(AGENTGUARD_SPEND_VERSION));
64
94
  console.log('');
@@ -92,13 +122,17 @@ export function defaultAnswers(templateSlug = 'risk-review'): WizardAnswers {
92
122
  };
93
123
  }
94
124
 
95
- export function writeWizardOutputs(answers: WizardAnswers, home = agentguardHome()): { policyPath: string; quickstartTsPath: string; quickstartPyPath: string; snippet: string } {
125
+ export function writeWizardOutputs(
126
+ answers: WizardAnswers,
127
+ home = agentguardHome(),
128
+ signingKeys?: { publicKeyHex: string },
129
+ ): { policyPath: string; quickstartTsPath: string; quickstartPyPath: string; snippet: string } {
96
130
  fs.mkdirSync(home, { recursive: true });
97
131
  const policyPath = path.join(home, 'policy.yaml');
98
132
  const quickstartTsPath = path.join(home, 'quickstart.ts');
99
133
  const quickstartPyPath = path.join(home, 'quickstart.py');
100
134
  const policy = policyYaml(answers);
101
- const ts = quickstartTs(answers);
135
+ const ts = quickstartTs(answers, signingKeys?.publicKeyHex);
102
136
  const py = quickstartPy(answers);
103
137
  fs.writeFileSync(policyPath, policy);
104
138
  fs.writeFileSync(quickstartTsPath, ts);
@@ -137,8 +171,9 @@ function policyYaml(answers: WizardAnswers): string {
137
171
  return `# AgentGuard Spend policy generated by agentguard wizard\nid: ${id}\nname: ${answers.template} policy\nversion: 1\neffectiveFrom: "${new Date().toISOString()}"\nmode: enforce\nrequiredCapability: ${answers.capability}\nscope:\n tenantId: my-tenant\nmodels:\n allowed:\n${allowed}\n fallback: ${answers.fallbackModel}\ncaps:\n # WHY: Per-call cap bounds one agent action.\n - amountCents: ${answers.perCallCents}\n window: per_call\n action: downgrade\n downgradeTo: ${answers.fallbackModel}\n reason: "Per-call budget reached, routing to fallback model"\n # WHY: Daily cap catches runaway loops and unexpected volume.\n - amountCents: ${answers.perDayCents}\n window: per_day\n action: block\n reason: "Daily budget reached"\n # WHY: Monthly cap keeps the finance view predictable.\n - amountCents: ${answers.perMonthCents}\n window: per_month\n action: block\n reason: "Monthly budget reached"\nsystemInstructions: |\n${indent(answers.systemInstructions, 2)}\n`;
138
172
  }
139
173
 
140
- function quickstartTs(answers: WizardAnswers): string {
141
- return `import OpenAI from 'openai';\nimport { withSpendGuard, type SpendPolicy } from '@agentguard-run/spend';\n\nconst policy: SpendPolicy = {\n id: 'agentguard-${answers.template}-v1',\n name: '${answers.template} policy',\n scope: { tenantId: 'my-tenant' },\n caps: [\n { amountCents: ${answers.perCallCents}, window: 'per_call', action: 'downgrade', downgradeTo: '${answers.fallbackModel}' },\n { amountCents: ${answers.perDayCents}, window: 'per_day', action: 'block' },\n { amountCents: ${answers.perMonthCents}, window: 'per_month', action: 'block' },\n ],\n mode: 'enforce',\n requiredCapability: '${answers.capability}',\n version: 1,\n effectiveFrom: new Date().toISOString(),\n};\n\nconst openrouter = new OpenAI({\n baseURL: 'https://openrouter.ai/api/v1',\n apiKey: process.env.OPENROUTER_API_KEY,\n});\n\nexport const guardedClient = withSpendGuard(openrouter, {\n policy,\n scope: { tenantId: 'my-tenant', agentId: '${answers.template}' },\n capabilityClaim: '${answers.capability}',\n});\n`;
174
+ function quickstartTs(answers: WizardAnswers, publicKeyHex?: string): string {
175
+ const pubHex = publicKeyHex ?? '';
176
+ return `import OpenAI from 'openai';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { withSpendGuard, NdjsonDecisionLogStore, type SpendPolicy } from '@agentguard-run/spend';\n\nconst policy: SpendPolicy = {\n id: 'agentguard-${answers.template}-v1',\n name: '${answers.template} policy',\n scope: { tenantId: 'my-tenant' },\n caps: [\n { amountCents: ${answers.perCallCents}, window: 'per_call', action: 'downgrade', downgradeTo: '${answers.fallbackModel}' },\n { amountCents: ${answers.perDayCents}, window: 'per_day', action: 'block' },\n { amountCents: ${answers.perMonthCents}, window: 'per_month', action: 'block' },\n ],\n mode: 'enforce',\n requiredCapability: '${answers.capability}',\n version: 1,\n effectiveFrom: new Date().toISOString(),\n};\n\nconst openrouter = new OpenAI({\n baseURL: 'https://openrouter.ai/api/v1',\n apiKey: process.env.OPENROUTER_API_KEY,\n});\n\n// Local Ed25519 signing key generated by \`agentguard wizard\` (never leaves this machine).\nconst home = path.join(os.homedir(), '.agentguard');\nconst signingKeys = {\n privateKey: Uint8Array.from(Buffer.from(fs.readFileSync(path.join(home, 'signing-private.key'), 'utf-8').trim(), 'hex')),\n publicKey: Uint8Array.from(Buffer.from(fs.readFileSync(path.join(home, 'signing-public.key'), 'utf-8').trim(), 'hex')),\n};\nconst publicKeyHex = '${pubHex}' || Buffer.from(signingKeys.publicKey).toString('hex');\n\nexport const guardedClient = withSpendGuard(openrouter, {\n policy,\n scope: { tenantId: 'my-tenant', agentId: '${answers.template}' },\n capabilityClaim: '${answers.capability}',\n config: {\n // Persists signed receipts to ~/.agentguard/my-tenant/decisions.ndjson so\n // \`agentguard serve\` shows governed spend, $ saved, and a verifiable trail.\n logStore: new NdjsonDecisionLogStore('my-tenant', { publicKeyHex }),\n signingKeys,\n },\n});\n`;
142
177
  }
143
178
 
144
179
  function quickstartPy(answers: WizardAnswers): string {