@agentguard-run/spend 0.15.5 → 0.15.7

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/dist/cli/serve.js CHANGED
@@ -49,6 +49,8 @@ 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");
53
+ const usage_1 = require("../free-tier/usage");
52
54
  const colors_1 = require("./colors");
53
55
  const AGENTGUARD_HOME = path.join(os.homedir(), '.agentguard');
54
56
  function scanLogFiles() {
@@ -89,45 +91,136 @@ function loadAllDecisions() {
89
91
  }
90
92
  return out;
91
93
  }
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 = {};
94
+ /** Extract agentId from a triggeredScopeKey like `tenantId=demo|agentId=bot`. */
95
+ function agentFromScopeKey(scopeKey) {
96
+ for (const part of String(scopeKey || '').split('|')) {
97
+ if (part.startsWith('agentId='))
98
+ return part.slice(8) || 'unknown';
99
+ }
100
+ return 'unknown';
101
+ }
102
+ /**
103
+ * Verify the tamper-evidence of the loaded ledger. Groups entries by signer,
104
+ * recovers each signer's public key from the embedded `publicKeyHex`, and runs
105
+ * the real hash-chain verifier. `verified` is true only if every signer's chain
106
+ * checks out; unverifiable groups (no embedded key) are surfaced as a reason.
107
+ */
108
+ async function computeIntegrity(decisions) {
109
+ const bySigner = new Map();
105
110
  for (const d of decisions) {
106
- if (!['allow', 'downgrade'].includes(d.decision?.action))
111
+ const signer = d.signerFingerprint;
112
+ if (!signer)
107
113
  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
- }
114
+ if (!bySigner.has(signer))
115
+ bySigner.set(signer, []);
116
+ bySigner.get(signer).push(d);
117
+ }
118
+ if (bySigner.size === 0) {
119
+ return { verified: false, entries: decisions.length, reason: 'NO_SIGNED_ENTRIES' };
120
+ }
121
+ for (const [, group] of bySigner) {
122
+ const withKey = group.find((d) => d.publicKeyHex);
123
+ if (!withKey)
124
+ return { verified: false, entries: decisions.length, reason: 'NO_PUBLIC_KEY_IN_LEDGER' };
125
+ const publicKey = Uint8Array.from(Buffer.from(withKey.publicKeyHex, 'hex'));
126
+ const chain = group
127
+ .slice()
128
+ .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))
129
+ .map((d) => ({
130
+ sequence: d.sequence,
131
+ entryHash: d.entryHash,
132
+ previousHash: d.previousHash,
133
+ signature: d.signature,
134
+ signerFingerprint: d.signerFingerprint,
135
+ decision: d.decision,
136
+ ...(d.builderCode ? { builderCode: d.builderCode } : {}),
137
+ }));
138
+ const result = await (0, decision_log_1.verifyChain)(chain, publicKey);
139
+ if (!result.ok) {
140
+ return { verified: false, entries: decisions.length, reason: `seq ${result.sequence}: ${result.reason}` };
115
141
  }
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);
142
+ }
143
+ return { verified: true, entries: decisions.length };
144
+ }
145
+ /**
146
+ * Free-tier CALL QUOTA panel data (local-only). For every tenant with a ledger,
147
+ * meter this month's enforcement calls and (idempotently) fire the one-time
148
+ * first-run generosity bonus. This is AgentGuard's free-tier quota — a separate
149
+ * concept from the customer's spend cap, which is never read or changed here.
150
+ */
151
+ function computeFreeTier() {
152
+ const tenants = [];
153
+ let totalUsed = 0;
154
+ let totalLimit = 0;
155
+ let bonusMessage;
156
+ let resetsAt = null;
157
+ for (const logPath of scanLogFiles()) {
158
+ const tenant = path.basename(path.dirname(logPath));
159
+ // First-run generosity may fire here (idempotent, quota-only, never spend).
160
+ const result = (0, usage_1.maybeGrantFirstTimeBonus)(tenant);
161
+ const usage = result.granted ? result.usage : (0, usage_1.getMonthlyUsage)(tenant);
162
+ if (result.granted && !bonusMessage)
163
+ bonusMessage = result.message;
164
+ resetsAt = usage.resetsAt;
165
+ totalUsed += usage.used;
166
+ totalLimit += usage.limit;
167
+ tenants.push({
168
+ tenant,
169
+ used: usage.used,
170
+ limit: usage.limit,
171
+ pct_used: usage.pctUsed,
172
+ bonus_calls: usage.bonusCalls,
173
+ });
174
+ }
175
+ const pctUsed = totalLimit > 0 ? Math.round((totalUsed / totalLimit) * 1000) / 10 : 0;
176
+ return {
177
+ used: totalUsed,
178
+ limit: totalLimit,
179
+ pct_used: pctUsed,
180
+ resets_at: resetsAt,
181
+ tenants: tenants.sort((a, b) => b.used - a.used),
182
+ bonus_message: bonusMessage,
183
+ };
184
+ }
185
+ async function computeStats(decisions) {
186
+ const entries = decisions.map((d) => ({
187
+ sequence: d.sequence,
188
+ entryHash: d.entryHash,
189
+ previousHash: d.previousHash,
190
+ signature: d.signature,
191
+ signerFingerprint: d.signerFingerprint,
192
+ decision: d.decision,
193
+ ...(d.builderCode ? { builderCode: d.builderCode } : {}),
194
+ }));
195
+ const integrity = await computeIntegrity(decisions);
196
+ const dash = (0, aggregate_1.aggregateLedger)(entries, integrity);
197
+ // Per-agent breakdown from triggeredScopeKey (the ledger's best-effort attribution).
198
+ const byAgent = {};
199
+ for (const e of entries) {
200
+ const d = e.decision;
201
+ if (d.action !== 'allow' && d.action !== 'downgrade')
202
+ continue;
203
+ const agentId = agentFromScopeKey(d.triggeredScopeKey || '');
204
+ const cents = typeof d.actualCents === 'number' ? d.actualCents : (d.projectedCents || 0);
205
+ byAgent[agentId] = (byAgent[agentId] || 0) + cents;
119
206
  }
120
207
  return {
121
208
  totals: {
122
- spent_cents: spentCents,
123
- saved_cents: savedCents,
124
- calls: totalCalls,
125
- blocked: blockedCount,
126
- downgraded: downgradeCount,
127
- allowed: allowCount,
209
+ spent_cents: dash.totals.spentCents,
210
+ saved_cents: dash.enforcement.estimatedSavedCents,
211
+ calls: dash.totals.calls,
212
+ blocked: dash.enforcement.blocked,
213
+ downgraded: dash.enforcement.downgraded,
214
+ allowed: dash.enforcement.allowed,
215
+ },
216
+ integrity: {
217
+ verified: dash.integrity.verified,
218
+ entries: dash.integrity.entries,
219
+ reason: dash.integrity.reason,
128
220
  },
129
221
  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),
222
+ by_provider: dash.byProvider.map((b) => ({ provider: b.key, spent_cents: b.cents })),
223
+ free_tier: computeFreeTier(),
131
224
  recent: decisions.slice(-50).reverse(),
132
225
  version: index_1.AGENTGUARD_SPEND_VERSION,
133
226
  };
@@ -183,12 +276,25 @@ td .mono { color: var(--code); }
183
276
  .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); }
184
277
  .empty { text-align: center; padding: 56px 20px; color: var(--muted); font-size: 14px; }
185
278
  .empty code { display: block; margin-top: 8px; font-size: 14px; color: var(--teal); }
279
+ .usage-panel { display: flex; flex-direction: column; gap: 10px; }
280
+ .usage-head { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
281
+ .usage-head .primary { font-size: 15px; color: var(--text); }
282
+ .usage-head .primary b { color: var(--green); font-variant-numeric: tabular-nums; }
283
+ .usage-head .reset { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--muted); }
284
+ .usage-track { height: 14px; background: var(--surface-2); border-radius: 3px; overflow: hidden; border: 1px solid var(--border-dim); }
285
+ .usage-fill { height: 100%; background: linear-gradient(90deg, var(--teal), var(--green)); transition: width 0.4s; }
286
+ .usage-fill.warn { background: linear-gradient(90deg, var(--amber), var(--red)); }
287
+ .usage-foot { font-size: 12px; color: var(--muted); }
288
+ .usage-foot .quota-note { color: var(--muted); }
289
+ .usage-tenants { display: flex; flex-direction: column; gap: 2px; margin-top: 4px; }
290
+ .usage-bonus { margin-top: 10px; padding: 12px 14px; border-left: 4px solid var(--green); background: rgba(74,222,128,0.08); border-radius: 4px; font-size: 13px; color: var(--text-2); }
291
+ .usage-bonus b { color: var(--green); }
186
292
  .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; }
187
293
  @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); } }
188
294
  </style></head><body>
189
295
  <div class="topbar">
190
296
  <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>
297
+ <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
298
  </div>
193
299
  <div class="shell">
194
300
  <div class="stats-row">
@@ -197,6 +303,19 @@ td .mono { color: var(--code); }
197
303
  <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>
198
304
  <div class="stat-card"><div class="label">Allowed</div><div class="value" id="allowed">0</div><div class="sub">policy-checked & passed</div></div>
199
305
  </div>
306
+ <div class="section" id="free-tier-section">
307
+ <h2>Free Tier · Enforcement Calls This Month</h2>
308
+ <div class="usage-panel">
309
+ <div class="usage-head">
310
+ <div class="primary">Free tier: <b id="ft-used">0</b> / <span id="ft-limit">0</span> enforcement calls this month <span id="ft-pct" style="color:var(--muted)">(0%)</span></div>
311
+ <div class="reset" id="ft-reset">resets —</div>
312
+ </div>
313
+ <div class="usage-track"><div class="usage-fill" id="ft-fill" style="width:0%"></div></div>
314
+ <div class="usage-foot"><span class="quota-note">This is AgentGuard's free-tier <b>call quota</b> (our generosity) — a separate concept from your <b>spend cap</b>, your hard money guardrail, which AgentGuard never auto-changes.</span></div>
315
+ <div class="usage-tenants" id="ft-tenants"></div>
316
+ <div class="usage-bonus" id="ft-bonus" style="display:none"></div>
317
+ </div>
318
+ </div>
200
319
  <div class="two-col">
201
320
  <div class="section"><h2>Spend by Agent</h2><div id="by-agent"></div></div>
202
321
  <div class="section"><h2>Spend by Provider</h2><div id="by-provider"></div></div>
@@ -215,7 +334,9 @@ function safeHash(value) { return String(value || '').toLowerCase().replace(/[^0
215
334
  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
335
  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
336
  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); } }
337
+ 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)'; } }
338
+ function renderFreeTier(ft) { if (!ft) return; const used = Number(ft.used) || 0; const limit = Number(ft.limit) || 0; const pct = Number(ft.pct_used) || 0; document.getElementById('ft-used').textContent = used.toLocaleString(); document.getElementById('ft-limit').textContent = limit.toLocaleString(); document.getElementById('ft-pct').textContent = '(' + pct + '%)'; const fill = document.getElementById('ft-fill'); fill.style.width = Math.max(0, Math.min(100, pct)) + '%'; fill.className = 'usage-fill' + (pct >= 80 ? ' warn' : ''); const reset = document.getElementById('ft-reset'); reset.textContent = ft.resets_at ? 'resets ' + String(ft.resets_at).slice(0, 10) : 'resets —'; const tEl = document.getElementById('ft-tenants'); const tenants = ft.tenants || []; if (tenants.length > 1) { tEl.innerHTML = tenants.map(function(t) { const tp = Number(t.pct_used) || 0; return '<div class="bar-row"><span class="name">' + escapeHtml(t.tenant) + '</span><span class="bar"><span class="bar-fill" style="width:' + Math.max(0, Math.min(100, tp)).toFixed(1) + '%"></span></span><span class="amount">' + (Number(t.used)||0).toLocaleString() + '</span></div>'; }).join(''); } else { tEl.innerHTML = ''; } const bonus = document.getElementById('ft-bonus'); if (ft.bonus_message) { bonus.style.display = 'block'; bonus.innerHTML = '🎁 <b>Bonus month, on us.</b> ' + escapeHtml(ft.bonus_message); } else { bonus.style.display = 'none'; } }
339
+ async function loadStats() { try { const r = await fetch('/api/stats'); const s = await r.json(); renderTamper(s.integrity); renderFreeTier(s.free_tier); 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
340
  loadStats();
220
341
  setInterval(loadStats, 5000);
221
342
  </script></body></html>
@@ -268,7 +389,7 @@ async function runServe(argv) {
268
389
  return;
269
390
  }
270
391
  if (url === '/api/stats') {
271
- sendJSON(200, computeStats(loadAllDecisions()));
392
+ sendJSON(200, await computeStats(loadAllDecisions()));
272
393
  return;
273
394
  }
274
395
  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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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `agentguard usage`: free-tier CALL QUOTA summary, printed in the terminal.
3
+ *
4
+ * Meters "enforcement calls this calendar month" for each tenant from the LOCAL
5
+ * signed decision store only — no network, no data plane. Also the point where
6
+ * the one-time first-run "surprise generosity" bonus can be granted.
7
+ *
8
+ * IMPORTANT: this reports AgentGuard's FREE CALL QUOTA (our generosity), which
9
+ * is a completely separate concept from the customer's SPEND CAP (their hard
10
+ * money guardrail). Nothing here reads or changes enforcement/spend behavior.
11
+ */
12
+ export declare function runUsage(argv: string[]): Promise<number>;
13
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6CH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC9D"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ /**
3
+ * `agentguard usage`: free-tier CALL QUOTA summary, printed in the terminal.
4
+ *
5
+ * Meters "enforcement calls this calendar month" for each tenant from the LOCAL
6
+ * signed decision store only — no network, no data plane. Also the point where
7
+ * the one-time first-run "surprise generosity" bonus can be granted.
8
+ *
9
+ * IMPORTANT: this reports AgentGuard's FREE CALL QUOTA (our generosity), which
10
+ * is a completely separate concept from the customer's SPEND CAP (their hard
11
+ * money guardrail). Nothing here reads or changes enforcement/spend behavior.
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.runUsage = runUsage;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const colors_1 = require("./colors");
51
+ const usage_1 = require("../free-tier/usage");
52
+ const colors_2 = require("./colors");
53
+ const index_1 = require("../index");
54
+ function scanTenants() {
55
+ const home = (0, colors_1.agentguardHome)();
56
+ if (!fs.existsSync(home))
57
+ return [];
58
+ const out = [];
59
+ for (const entry of fs.readdirSync(home, { withFileTypes: true })) {
60
+ if (!entry.isDirectory())
61
+ continue;
62
+ if (fs.existsSync(path.join(home, entry.name, 'decisions.ndjson')))
63
+ out.push(entry.name);
64
+ }
65
+ return out.sort();
66
+ }
67
+ function bar(pct, width = 28) {
68
+ const filled = Math.max(0, Math.min(width, Math.round((pct / 100) * width)));
69
+ return '[' + '█'.repeat(filled) + '·'.repeat(width - filled) + ']';
70
+ }
71
+ function printTenant(u, justGrantedMessage) {
72
+ const resets = u.resetsAt.slice(0, 10);
73
+ console.log(' ' + (0, colors_1.bold)(u.tenant));
74
+ console.log(` Free tier: ${(0, colors_1.greenBold)(u.used.toLocaleString())} / ${u.limit.toLocaleString()} ` +
75
+ `enforcement calls this month ${(0, colors_1.dim)('(' + u.pctUsed + '%)')}`);
76
+ const color = u.pctUsed >= 100 ? colors_1.yellow : u.pctUsed >= 50 ? colors_1.cyanBold : colors_1.green;
77
+ console.log(' ' + color(bar(u.pctUsed)));
78
+ if (u.bonusCalls > 0) {
79
+ console.log((0, colors_1.dim)(` includes a one-time +${u.bonusCalls.toLocaleString()}-call free-quota bonus`));
80
+ }
81
+ console.log((0, colors_1.dim)(` resets ${resets} · free CALL QUOTA — separate from your spend cap`));
82
+ if (justGrantedMessage) {
83
+ console.log('');
84
+ console.log(' 🎁 ' + (0, colors_1.greenBold)(justGrantedMessage));
85
+ }
86
+ console.log('');
87
+ }
88
+ async function runUsage(argv) {
89
+ let tenant;
90
+ for (let i = 0; i < argv.length; i++) {
91
+ const a = argv[i];
92
+ if (a === '--tenant')
93
+ tenant = argv[++i];
94
+ else if (a === '--help' || a === '-h') {
95
+ console.log('agentguard usage [--tenant NAME]');
96
+ console.log('');
97
+ console.log('Show your free-tier CALL QUOTA usage this month (local-only).');
98
+ console.log('This is AgentGuard’s free-tier generosity, NOT your spend cap.');
99
+ return 0;
100
+ }
101
+ }
102
+ console.log('');
103
+ console.log(' ' + (0, colors_2.banner)(index_1.AGENTGUARD_SPEND_VERSION));
104
+ console.log('');
105
+ console.log(' ' + (0, colors_1.cyanBold)('agentguard usage') + (0, colors_1.dim)(' · free-tier call quota (local-only)'));
106
+ console.log('');
107
+ const tenants = tenant ? [tenant] : scanTenants();
108
+ if (tenants.length === 0) {
109
+ console.log((0, colors_1.dim)(' no tenants found yet at ~/.agentguard/*/decisions.ndjson'));
110
+ console.log((0, colors_1.dim)(' run ') + (0, colors_1.greenBold)('agentguard demo') + (0, colors_1.dim)(' to produce a ledger, then re-run.'));
111
+ console.log('');
112
+ return 0;
113
+ }
114
+ for (const t of tenants) {
115
+ // First-run generosity may fire here (idempotent, quota-only).
116
+ const result = (0, usage_1.maybeGrantFirstTimeBonus)(t);
117
+ const usage = result.granted ? result.usage : (0, usage_1.getMonthlyUsage)(t);
118
+ printTenant(usage, result.granted ? result.message : undefined);
119
+ }
120
+ return 0;
121
+ }
122
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/cli/usage.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`;