@agent-receipts/cli 0.1.0 → 0.2.1

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/index.js CHANGED
@@ -24,12 +24,16 @@ Commands:
24
24
  verify <id|file> [--key <hex>] Verify a receipt's signature
25
25
  list [options] List receipts
26
26
  chain <chain_id> [--tree] Show all receipts in a chain
27
+ judgments <receipt_id> [--json] Show judgments for a receipt
28
+ cleanup [--dry-run] Delete expired receipts
27
29
  stats Show aggregate receipt statistics
28
30
  export <id> | --all [--pretty] Export receipt(s) as JSON to stdout
29
31
 
30
32
  List options:
31
33
  --agent <id> Filter by agent ID
32
34
  --status <status> Filter by status (pending|completed|failed|timeout)
35
+ --failed Show only receipts with failed constraints
36
+ --passed Show only receipts with passed constraints
33
37
  --limit <n> Limit results (default: 50)
34
38
  --json Output as JSON
35
39
 
@@ -127,6 +131,22 @@ async function cmdInspect(target) {
127
131
  console.log(` Agent: ${receipt.agent_id}`);
128
132
  console.log(` Time: ${receipt.timestamp}`);
129
133
  if (receipt.completed_at) console.log(` Completed: ${receipt.completed_at}`);
134
+ const expiresAt = receipt.metadata?.expires_at;
135
+ if (expiresAt) {
136
+ const expiresDate = new Date(expiresAt);
137
+ const now = /* @__PURE__ */ new Date();
138
+ const diffMs = expiresDate.getTime() - now.getTime();
139
+ if (diffMs <= 0) {
140
+ const agoMs = -diffMs;
141
+ const agoDays = Math.floor(agoMs / (1e3 * 60 * 60 * 24));
142
+ const agoStr = agoDays > 0 ? `${agoDays} day${agoDays !== 1 ? "s" : ""} ago` : "just now";
143
+ console.log(` Expires: ${expiresAt} (EXPIRED \u2014 ${agoStr})`);
144
+ } else {
145
+ const days = Math.floor(diffMs / (1e3 * 60 * 60 * 24));
146
+ const remainStr = days > 0 ? `${days} day${days !== 1 ? "s" : ""} remaining` : "less than a day remaining";
147
+ console.log(` Expires: ${expiresAt} (${remainStr})`);
148
+ }
149
+ }
130
150
  if (receipt.model) console.log(` Model: ${receipt.model}`);
131
151
  if (receipt.latency_ms != null) console.log(` Latency: ${receipt.latency_ms}ms`);
132
152
  if (receipt.cost_usd != null) console.log(` Cost: $${receipt.cost_usd}`);
@@ -134,6 +154,23 @@ async function cmdInspect(target) {
134
154
  if (receipt.output_hash) console.log(` Output: ${receipt.output_hash}`);
135
155
  if (receipt.output_summary) console.log(` Summary: ${receipt.output_summary}`);
136
156
  console.log(` Signature: ${receipt.signature.slice(0, 30)}...`);
157
+ if (receipt.constraint_result && typeof receipt.constraint_result === "object" && "passed" in receipt.constraint_result) {
158
+ const cr = receipt.constraint_result;
159
+ const passedCount = cr.results.filter((r) => r.passed).length;
160
+ const totalCount = cr.results.length;
161
+ console.log(` Constraints: ${passedCount}/${totalCount} ${cr.passed ? "PASSED" : "FAILED"}`);
162
+ for (const r of cr.results) {
163
+ const icon = r.passed ? "\u2713" : "\u2717";
164
+ const expectedStr = formatExpected(r.type, r.expected);
165
+ const status = r.passed ? "" : " FAILED";
166
+ console.log(` ${icon} ${r.type.padEnd(18)} expected: ${expectedStr} actual: ${r.actual}${status}`);
167
+ }
168
+ }
169
+ }
170
+ function formatExpected(type, expected) {
171
+ if (type === "max_latency_ms" || type === "max_cost_usd") return `\u2264${expected}`;
172
+ if (type === "min_confidence") return `\u2265${expected}`;
173
+ return String(expected);
137
174
  }
138
175
  async function cmdVerify(target, args) {
139
176
  let receipt;
@@ -170,6 +207,8 @@ async function cmdList(args) {
170
207
  const { engine } = await getEngine();
171
208
  const filter = {};
172
209
  const isJson = args.includes("--json");
210
+ const filterFailed = args.includes("--failed");
211
+ const filterPassed = args.includes("--passed");
173
212
  let limit = 50;
174
213
  for (let i = 0; i < args.length; i++) {
175
214
  const arg = args[i];
@@ -188,11 +227,23 @@ async function cmdList(args) {
188
227
  }
189
228
  }
190
229
  const result = await engine.list(filter, 1, limit);
230
+ let filtered = result.data;
231
+ if (filterFailed) {
232
+ filtered = filtered.filter((r) => {
233
+ const cr = r.constraint_result;
234
+ return cr && !cr.passed;
235
+ });
236
+ } else if (filterPassed) {
237
+ filtered = filtered.filter((r) => {
238
+ const cr = r.constraint_result;
239
+ return cr && cr.passed;
240
+ });
241
+ }
191
242
  if (isJson) {
192
- console.log(JSON.stringify(result, null, 2));
243
+ console.log(JSON.stringify({ ...result, data: filtered }, null, 2));
193
244
  } else {
194
- console.log(`Receipts (${result.pagination.total} total):`);
195
- for (const r of result.data) {
245
+ console.log(`Receipts (${filtered.length} total):`);
246
+ for (const r of filtered) {
196
247
  const status = r.status.padEnd(9);
197
248
  console.log(` ${r.receipt_id} ${status} ${r.action} ${r.timestamp}`);
198
249
  }
@@ -248,9 +299,18 @@ async function cmdStats() {
248
299
  const receipts = all.data;
249
300
  const byStatus = {};
250
301
  const byAction = {};
302
+ let constraintsPassed = 0;
303
+ let constraintsFailed = 0;
251
304
  for (const r of receipts) {
252
305
  byStatus[r.status] = (byStatus[r.status] ?? 0) + 1;
253
306
  byAction[r.action] = (byAction[r.action] ?? 0) + 1;
307
+ if (r.constraint_result && typeof r.constraint_result === "object" && "passed" in r.constraint_result) {
308
+ if (r.constraint_result.passed) {
309
+ constraintsPassed++;
310
+ } else {
311
+ constraintsFailed++;
312
+ }
313
+ }
254
314
  }
255
315
  console.log(`Total receipts: ${receipts.length}`);
256
316
  console.log(`By status:`);
@@ -261,6 +321,93 @@ async function cmdStats() {
261
321
  for (const [a, c] of Object.entries(byAction)) {
262
322
  console.log(` ${a}: ${c}`);
263
323
  }
324
+ if (constraintsPassed + constraintsFailed > 0) {
325
+ console.log(`Constraints:`);
326
+ console.log(` passed: ${constraintsPassed}`);
327
+ console.log(` failed: ${constraintsFailed}`);
328
+ }
329
+ }
330
+ async function cmdJudgments(receiptId, args) {
331
+ const { engine } = await getEngine();
332
+ const isJson = args.includes("--json");
333
+ const judgments = await engine.getJudgments(receiptId);
334
+ if (isJson) {
335
+ console.log(JSON.stringify({
336
+ receipt_id: receiptId,
337
+ count: judgments.length,
338
+ judgments: judgments.map((j) => ({
339
+ judgment_id: j.receipt_id,
340
+ verdict: j.metadata?.judgment ? j.metadata.judgment.verdict : null,
341
+ score: j.metadata?.judgment ? j.metadata.judgment.score : null,
342
+ status: j.status,
343
+ output_summary: j.output_summary,
344
+ confidence: j.confidence,
345
+ timestamp: j.timestamp
346
+ }))
347
+ }, null, 2));
348
+ return;
349
+ }
350
+ if (judgments.length === 0) {
351
+ console.log(`No judgments found for ${receiptId}`);
352
+ return;
353
+ }
354
+ console.log(`Judgments for ${receiptId} (${judgments.length} found)`);
355
+ for (const j of judgments) {
356
+ const judgment = j.metadata?.judgment;
357
+ const verdict = judgment?.verdict ?? "unknown";
358
+ const score = judgment?.score ?? 0;
359
+ const criteriaResults = judgment?.criteria_results;
360
+ console.log("");
361
+ console.log(` Judgment: ${j.receipt_id}`);
362
+ console.log(` Verdict: ${verdict.toUpperCase()} (${score.toFixed(2)})`);
363
+ console.log(` Judge: ${j.agent_id}`);
364
+ console.log(` Date: ${j.completed_at ?? j.timestamp}`);
365
+ if (criteriaResults && criteriaResults.length > 0) {
366
+ console.log("");
367
+ console.log(" Criteria:");
368
+ for (const cr of criteriaResults) {
369
+ const icon = cr.passed ? "\u2713" : "\u2717";
370
+ console.log(` ${icon} ${cr.criterion.padEnd(15)} ${cr.score.toFixed(2)} ${cr.reasoning}`);
371
+ }
372
+ }
373
+ const overallReasoning = judgment?.overall_reasoning;
374
+ if (overallReasoning) {
375
+ console.log("");
376
+ console.log(` Overall: ${overallReasoning}`);
377
+ }
378
+ }
379
+ }
380
+ async function cmdCleanup(args) {
381
+ const isDryRun = args.includes("--dry-run");
382
+ const { engine } = await getEngine();
383
+ if (isDryRun) {
384
+ const all = await engine.list(void 0, 1, 1e5);
385
+ const now = (/* @__PURE__ */ new Date()).toISOString();
386
+ const expired = all.data.filter((r) => {
387
+ const ea = r.metadata?.expires_at;
388
+ return ea && ea < now;
389
+ });
390
+ console.log("Scanning receipts...");
391
+ if (expired.length === 0) {
392
+ console.log("\nNo expired receipts found.");
393
+ return;
394
+ }
395
+ console.log(`
396
+ Expired: ${expired.length} receipt${expired.length !== 1 ? "s" : ""}`);
397
+ for (const r of expired) {
398
+ const ea = r.metadata?.expires_at;
399
+ console.log(` ${r.receipt_id} ${r.action.padEnd(20)} expired ${ea}`);
400
+ }
401
+ console.log(`
402
+ (dry run \u2014 no receipts deleted)`);
403
+ return;
404
+ }
405
+ const result = await engine.cleanup();
406
+ if (result.deleted === 0) {
407
+ console.log("No expired receipts found.");
408
+ } else {
409
+ console.log(`Deleted ${result.deleted} expired receipt${result.deleted !== 1 ? "s" : ""}. ${result.remaining} remaining.`);
410
+ }
264
411
  }
265
412
  async function cmdExport(target, args) {
266
413
  const { engine } = await getEngine();
@@ -322,6 +469,16 @@ async function main() {
322
469
  }
323
470
  await cmdChain(args[1], args.slice(2));
324
471
  break;
472
+ case "judgments":
473
+ if (!args[1]) {
474
+ console.error("Usage: agent-receipts judgments <receipt_id>");
475
+ process.exit(1);
476
+ }
477
+ await cmdJudgments(args[1], args.slice(2));
478
+ break;
479
+ case "cleanup":
480
+ await cmdCleanup(args.slice(1));
481
+ break;
325
482
  case "stats":
326
483
  await cmdStats();
327
484
  break;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { readFile, writeFile, mkdir, chmod, stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport {\n ReceiptStore,\n KeyManager,\n ConfigManager,\n ReceiptEngine,\n} from '@agent-receipts/mcp-server'\nimport { verifyReceipt, getSignablePayload, getPublicKeyFromPrivate } from '@agent-receipts/crypto'\n\nconst HELP = `\nagent-receipts — CLI for managing Agent Receipts\n\nUsage:\n agent-receipts <command> [options]\n\nCommands:\n init Create data directory and generate signing keys\n keys [--export] [--import <hex>] Display, export, or import signing keys\n inspect <id|file> Pretty-print a receipt\n verify <id|file> [--key <hex>] Verify a receipt's signature\n list [options] List receipts\n chain <chain_id> [--tree] Show all receipts in a chain\n stats Show aggregate receipt statistics\n export <id> | --all [--pretty] Export receipt(s) as JSON to stdout\n\nList options:\n --agent <id> Filter by agent ID\n --status <status> Filter by status (pending|completed|failed|timeout)\n --limit <n> Limit results (default: 50)\n --json Output as JSON\n\nGeneral:\n --help, -h Show this help\n --version, -v Show version\n`.trim()\n\nasync function getEngine(dataDir?: string) {\n const dir = dataDir ?? ConfigManager.getDefaultDataDir()\n const store = new ReceiptStore(dir)\n await store.init()\n const keyManager = new KeyManager(dir)\n await keyManager.init()\n const configManager = new ConfigManager(dir)\n await configManager.init()\n return { engine: new ReceiptEngine(store, keyManager, configManager), keyManager, dataDir: dir }\n}\n\nasync function cmdInit() {\n const { keyManager } = await getEngine()\n console.log('Initialized Agent Receipts data directory')\n console.log(`Public key: ${keyManager.getPublicKey()}`)\n}\n\nasync function cmdKeys(args: string[]) {\n if (args.includes('--import')) {\n const importIdx = args.indexOf('--import')\n const hex = args[importIdx + 1]\n if (!hex) {\n console.error('Usage: agent-receipts keys --import <hex>')\n process.exit(1)\n }\n if (!/^[a-f0-9]{64}$/i.test(hex)) {\n console.error('Invalid key: must be 64 hex characters (32 bytes)')\n process.exit(1)\n }\n\n const dataDir = ConfigManager.getDefaultDataDir()\n const keysDir = join(dataDir, 'keys')\n const privateKeyPath = join(keysDir, 'private.key')\n\n // Check if keys already exist\n let keysExist = false\n try {\n await stat(privateKeyPath)\n keysExist = true\n } catch {\n // Does not exist\n }\n\n if (keysExist) {\n if (process.stdin.isTTY) {\n const answer = await new Promise<string>((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n rl.question('Keys already exist. Overwrite? (y/N) ', (ans) => {\n rl.close()\n resolve(ans)\n })\n })\n if (answer.toLowerCase() !== 'y') {\n console.log('Aborted.')\n return\n }\n } else {\n console.error('Keys already exist. Use interactive terminal to overwrite.')\n process.exit(1)\n }\n }\n\n const publicKey = getPublicKeyFromPrivate(hex)\n await mkdir(keysDir, { recursive: true })\n await writeFile(privateKeyPath, hex, { encoding: 'utf-8', mode: 0o600 })\n await chmod(privateKeyPath, 0o600)\n await writeFile(join(keysDir, 'public.key'), publicKey, 'utf-8')\n\n console.log(`Keys imported successfully. Public key: ${publicKey}`)\n return\n }\n\n const { keyManager } = await getEngine()\n const publicKey = keyManager.getPublicKey()\n if (args.includes('--export')) {\n console.log(JSON.stringify({ algorithm: 'Ed25519', public_key: publicKey, format: 'hex' }, null, 2))\n } else {\n console.log(`Public key: ${publicKey}`)\n }\n}\n\nasync function cmdInspect(target: string) {\n let receipt\n if (target.endsWith('.json') || target.includes('/')) {\n const data = await readFile(target, 'utf-8')\n receipt = JSON.parse(data)\n } else {\n const { engine } = await getEngine()\n receipt = await engine.get(target)\n if (!receipt) {\n console.error(`Receipt not found: ${target}`)\n process.exit(1)\n }\n }\n\n console.log(`Receipt: ${receipt.receipt_id}`)\n console.log(` Chain: ${receipt.chain_id}`)\n console.log(` Action: ${receipt.action}`)\n console.log(` Status: ${receipt.status}`)\n console.log(` Agent: ${receipt.agent_id}`)\n console.log(` Time: ${receipt.timestamp}`)\n if (receipt.completed_at) console.log(` Completed: ${receipt.completed_at}`)\n if (receipt.model) console.log(` Model: ${receipt.model}`)\n if (receipt.latency_ms != null) console.log(` Latency: ${receipt.latency_ms}ms`)\n if (receipt.cost_usd != null) console.log(` Cost: $${receipt.cost_usd}`)\n console.log(` Input: ${receipt.input_hash}`)\n if (receipt.output_hash) console.log(` Output: ${receipt.output_hash}`)\n if (receipt.output_summary) console.log(` Summary: ${receipt.output_summary}`)\n console.log(` Signature: ${receipt.signature.slice(0, 30)}...`)\n}\n\nasync function cmdVerify(target: string, args: string[]) {\n let receipt\n if (target.endsWith('.json') || target.includes('/')) {\n const data = await readFile(target, 'utf-8')\n receipt = JSON.parse(data)\n } else {\n const { engine } = await getEngine()\n receipt = await engine.get(target)\n if (!receipt) {\n console.error(`Receipt not found: ${target}`)\n process.exit(1)\n }\n }\n\n const keyIdx = args.indexOf('--key')\n let publicKey: string\n if (keyIdx !== -1 && args[keyIdx + 1] !== undefined) {\n publicKey = args[keyIdx + 1] as string\n } else {\n const { keyManager } = await getEngine()\n publicKey = keyManager.getPublicKey()\n }\n\n const signable = getSignablePayload(receipt)\n const verified = verifyReceipt(signable, receipt.signature, publicKey)\n\n if (verified) {\n console.log(`Verified: ${receipt.receipt_id}`)\n console.log(`Public key: ${publicKey}`)\n } else {\n console.error(`FAILED: ${receipt.receipt_id} — signature invalid`)\n process.exit(1)\n }\n}\n\nasync function cmdList(args: string[]) {\n const { engine } = await getEngine()\n const filter: Record<string, string> = {}\n const isJson = args.includes('--json')\n let limit = 50\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n const next = args[i + 1]\n if (arg === '--agent' && next) { filter['agent_id'] = next; i++ }\n if (arg === '--status' && next) { filter['status'] = next; i++ }\n if (arg === '--limit' && next) { limit = parseInt(next, 10); i++ }\n }\n\n const result = await engine.list(filter, 1, limit)\n\n if (isJson) {\n console.log(JSON.stringify(result, null, 2))\n } else {\n console.log(`Receipts (${result.pagination.total} total):`)\n for (const r of result.data) {\n const status = r.status.padEnd(9)\n console.log(` ${r.receipt_id} ${status} ${r.action} ${r.timestamp}`)\n }\n }\n}\n\nasync function cmdChain(chainId: string, args: string[]) {\n const { engine } = await getEngine()\n const receipts = await engine.getChain(chainId)\n if (receipts.length === 0) {\n console.log(`No receipts found for chain: ${chainId}`)\n return\n }\n\n if (args.includes('--tree')) {\n console.log(`Chain: ${chainId} (${receipts.length} receipts)`)\n\n // Build parent-child map\n type Receipt = typeof receipts[number]\n const childrenOf = new Map<string, Receipt[]>()\n const roots: Receipt[] = []\n\n for (const r of receipts) {\n const parentId = r.parent_receipt_id\n if (!parentId || !receipts.some((p) => p.receipt_id === parentId)) {\n roots.push(r)\n } else {\n const siblings = childrenOf.get(parentId) ?? []\n siblings.push(r)\n childrenOf.set(parentId, siblings)\n }\n }\n\n function renderTree(node: Receipt, prefix: string, isLast: boolean): void {\n const connector = isLast ? '└─' : '├─'\n const ts = node.timestamp.replace('T', ' ').replace(/\\.\\d+Z$/, '')\n console.log(`${prefix}${connector} ${node.receipt_id} ${node.action} [${node.status}] ${ts}`)\n const children = childrenOf.get(node.receipt_id) ?? []\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!\n const childPrefix = prefix + (isLast ? ' ' : '│ ')\n renderTree(child, childPrefix, i === children.length - 1)\n }\n }\n\n for (let i = 0; i < roots.length; i++) {\n renderTree(roots[i]!, '', i === roots.length - 1)\n }\n return\n }\n\n console.log(`Chain: ${chainId} (${receipts.length} receipts)`)\n for (let i = 0; i < receipts.length; i++) {\n const r = receipts[i]!\n console.log(` ${i + 1}. ${r.receipt_id} ${r.status.padEnd(9)} ${r.action} ${r.timestamp}`)\n }\n}\n\nasync function cmdStats() {\n const { engine } = await getEngine()\n const all = await engine.list(undefined, 1, 10000)\n const receipts = all.data\n\n const byStatus: Record<string, number> = {}\n const byAction: Record<string, number> = {}\n for (const r of receipts) {\n byStatus[r.status] = (byStatus[r.status] ?? 0) + 1\n byAction[r.action] = (byAction[r.action] ?? 0) + 1\n }\n\n console.log(`Total receipts: ${receipts.length}`)\n console.log(`By status:`)\n for (const [s, c] of Object.entries(byStatus)) {\n console.log(` ${s}: ${c}`)\n }\n console.log(`By action:`)\n for (const [a, c] of Object.entries(byAction)) {\n console.log(` ${a}: ${c}`)\n }\n}\n\nasync function cmdExport(target: string, args: string[]) {\n const { engine } = await getEngine()\n const isPretty = args.includes('--pretty')\n if (target === '--all' || args.includes('--all')) {\n const result = await engine.list(undefined, 1, 10000)\n const sorted = result.data.sort((a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n )\n console.log(JSON.stringify(sorted, null, isPretty ? 2 : undefined))\n } else {\n const receipt = await engine.get(target)\n if (!receipt) {\n console.error(`Receipt not found: ${target}`)\n process.exit(1)\n }\n console.log(JSON.stringify(receipt, null, 2))\n }\n}\n\nasync function main() {\n const args = process.argv.slice(2)\n const command = args[0]\n\n if (!command || command === '--help' || command === '-h') {\n console.log(HELP)\n return\n }\n\n if (command === '--version' || command === '-v') {\n console.log('0.1.0')\n return\n }\n\n switch (command) {\n case 'init':\n await cmdInit()\n break\n case 'keys':\n await cmdKeys(args.slice(1))\n break\n case 'inspect':\n if (!args[1]) { console.error('Usage: agent-receipts inspect <id|file>'); process.exit(1) }\n await cmdInspect(args[1])\n break\n case 'verify':\n if (!args[1]) { console.error('Usage: agent-receipts verify <id|file>'); process.exit(1) }\n await cmdVerify(args[1], args.slice(2))\n break\n case 'list':\n await cmdList(args.slice(1))\n break\n case 'chain':\n if (!args[1]) { console.error('Usage: agent-receipts chain <chain_id>'); process.exit(1) }\n await cmdChain(args[1], args.slice(2))\n break\n case 'stats':\n await cmdStats()\n break\n case 'export':\n if (!args[1]) { console.error('Usage: agent-receipts export <id|--all>'); process.exit(1) }\n await cmdExport(args[1], args.slice(2))\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err) => {\n console.error('Error:', err.message)\n process.exit(1)\n})\n"],"mappings":"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","names":["publicKey","renderTree"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { readFile, writeFile, mkdir, chmod, stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport {\n ReceiptStore,\n KeyManager,\n ConfigManager,\n ReceiptEngine,\n} from '@agent-receipts/mcp-server'\nimport { verifyReceipt, getSignablePayload, getPublicKeyFromPrivate } from '@agent-receipts/crypto'\n\nconst HELP = `\nagent-receipts — CLI for managing Agent Receipts\n\nUsage:\n agent-receipts <command> [options]\n\nCommands:\n init Create data directory and generate signing keys\n keys [--export] [--import <hex>] Display, export, or import signing keys\n inspect <id|file> Pretty-print a receipt\n verify <id|file> [--key <hex>] Verify a receipt's signature\n list [options] List receipts\n chain <chain_id> [--tree] Show all receipts in a chain\n judgments <receipt_id> [--json] Show judgments for a receipt\n cleanup [--dry-run] Delete expired receipts\n stats Show aggregate receipt statistics\n export <id> | --all [--pretty] Export receipt(s) as JSON to stdout\n\nList options:\n --agent <id> Filter by agent ID\n --status <status> Filter by status (pending|completed|failed|timeout)\n --failed Show only receipts with failed constraints\n --passed Show only receipts with passed constraints\n --limit <n> Limit results (default: 50)\n --json Output as JSON\n\nGeneral:\n --help, -h Show this help\n --version, -v Show version\n`.trim()\n\nasync function getEngine(dataDir?: string) {\n const dir = dataDir ?? ConfigManager.getDefaultDataDir()\n const store = new ReceiptStore(dir)\n await store.init()\n const keyManager = new KeyManager(dir)\n await keyManager.init()\n const configManager = new ConfigManager(dir)\n await configManager.init()\n return { engine: new ReceiptEngine(store, keyManager, configManager), keyManager, dataDir: dir }\n}\n\nasync function cmdInit() {\n const { keyManager } = await getEngine()\n console.log('Initialized Agent Receipts data directory')\n console.log(`Public key: ${keyManager.getPublicKey()}`)\n}\n\nasync function cmdKeys(args: string[]) {\n if (args.includes('--import')) {\n const importIdx = args.indexOf('--import')\n const hex = args[importIdx + 1]\n if (!hex) {\n console.error('Usage: agent-receipts keys --import <hex>')\n process.exit(1)\n }\n if (!/^[a-f0-9]{64}$/i.test(hex)) {\n console.error('Invalid key: must be 64 hex characters (32 bytes)')\n process.exit(1)\n }\n\n const dataDir = ConfigManager.getDefaultDataDir()\n const keysDir = join(dataDir, 'keys')\n const privateKeyPath = join(keysDir, 'private.key')\n\n // Check if keys already exist\n let keysExist = false\n try {\n await stat(privateKeyPath)\n keysExist = true\n } catch {\n // Does not exist\n }\n\n if (keysExist) {\n if (process.stdin.isTTY) {\n const answer = await new Promise<string>((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n rl.question('Keys already exist. Overwrite? (y/N) ', (ans) => {\n rl.close()\n resolve(ans)\n })\n })\n if (answer.toLowerCase() !== 'y') {\n console.log('Aborted.')\n return\n }\n } else {\n console.error('Keys already exist. Use interactive terminal to overwrite.')\n process.exit(1)\n }\n }\n\n const publicKey = getPublicKeyFromPrivate(hex)\n await mkdir(keysDir, { recursive: true })\n await writeFile(privateKeyPath, hex, { encoding: 'utf-8', mode: 0o600 })\n await chmod(privateKeyPath, 0o600)\n await writeFile(join(keysDir, 'public.key'), publicKey, 'utf-8')\n\n console.log(`Keys imported successfully. Public key: ${publicKey}`)\n return\n }\n\n const { keyManager } = await getEngine()\n const publicKey = keyManager.getPublicKey()\n if (args.includes('--export')) {\n console.log(JSON.stringify({ algorithm: 'Ed25519', public_key: publicKey, format: 'hex' }, null, 2))\n } else {\n console.log(`Public key: ${publicKey}`)\n }\n}\n\nasync function cmdInspect(target: string) {\n let receipt\n if (target.endsWith('.json') || target.includes('/')) {\n const data = await readFile(target, 'utf-8')\n receipt = JSON.parse(data)\n } else {\n const { engine } = await getEngine()\n receipt = await engine.get(target)\n if (!receipt) {\n console.error(`Receipt not found: ${target}`)\n process.exit(1)\n }\n }\n\n console.log(`Receipt: ${receipt.receipt_id}`)\n console.log(` Chain: ${receipt.chain_id}`)\n console.log(` Action: ${receipt.action}`)\n console.log(` Status: ${receipt.status}`)\n console.log(` Agent: ${receipt.agent_id}`)\n console.log(` Time: ${receipt.timestamp}`)\n if (receipt.completed_at) console.log(` Completed: ${receipt.completed_at}`)\n\n // Show expires_at if present\n const expiresAt = (receipt.metadata as Record<string, unknown>)?.expires_at as string | undefined\n if (expiresAt) {\n const expiresDate = new Date(expiresAt)\n const now = new Date()\n const diffMs = expiresDate.getTime() - now.getTime()\n if (diffMs <= 0) {\n const agoMs = -diffMs\n const agoDays = Math.floor(agoMs / (1000 * 60 * 60 * 24))\n const agoStr = agoDays > 0 ? `${agoDays} day${agoDays !== 1 ? 's' : ''} ago` : 'just now'\n console.log(` Expires: ${expiresAt} (EXPIRED — ${agoStr})`)\n } else {\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n const remainStr = days > 0 ? `${days} day${days !== 1 ? 's' : ''} remaining` : 'less than a day remaining'\n console.log(` Expires: ${expiresAt} (${remainStr})`)\n }\n }\n\n if (receipt.model) console.log(` Model: ${receipt.model}`)\n if (receipt.latency_ms != null) console.log(` Latency: ${receipt.latency_ms}ms`)\n if (receipt.cost_usd != null) console.log(` Cost: $${receipt.cost_usd}`)\n console.log(` Input: ${receipt.input_hash}`)\n if (receipt.output_hash) console.log(` Output: ${receipt.output_hash}`)\n if (receipt.output_summary) console.log(` Summary: ${receipt.output_summary}`)\n console.log(` Signature: ${receipt.signature.slice(0, 30)}...`)\n\n // Show constraint results if present\n if (receipt.constraint_result && typeof receipt.constraint_result === 'object' && 'passed' in receipt.constraint_result) {\n const cr = receipt.constraint_result as { passed: boolean; results: Array<{ type: string; passed: boolean; expected: unknown; actual: unknown; message?: string }> }\n const passedCount = cr.results.filter((r) => r.passed).length\n const totalCount = cr.results.length\n console.log(` Constraints: ${passedCount}/${totalCount} ${cr.passed ? 'PASSED' : 'FAILED'}`)\n for (const r of cr.results) {\n const icon = r.passed ? '\\u2713' : '\\u2717'\n const expectedStr = formatExpected(r.type, r.expected)\n const status = r.passed ? '' : ' FAILED'\n console.log(` ${icon} ${r.type.padEnd(18)} expected: ${expectedStr} actual: ${r.actual}${status}`)\n }\n }\n}\n\nfunction formatExpected(type: string, expected: unknown): string {\n if (type === 'max_latency_ms' || type === 'max_cost_usd') return `\\u2264${expected}`\n if (type === 'min_confidence') return `\\u2265${expected}`\n return String(expected)\n}\n\nasync function cmdVerify(target: string, args: string[]) {\n let receipt\n if (target.endsWith('.json') || target.includes('/')) {\n const data = await readFile(target, 'utf-8')\n receipt = JSON.parse(data)\n } else {\n const { engine } = await getEngine()\n receipt = await engine.get(target)\n if (!receipt) {\n console.error(`Receipt not found: ${target}`)\n process.exit(1)\n }\n }\n\n const keyIdx = args.indexOf('--key')\n let publicKey: string\n if (keyIdx !== -1 && args[keyIdx + 1] !== undefined) {\n publicKey = args[keyIdx + 1] as string\n } else {\n const { keyManager } = await getEngine()\n publicKey = keyManager.getPublicKey()\n }\n\n const signable = getSignablePayload(receipt)\n const verified = verifyReceipt(signable, receipt.signature, publicKey)\n\n if (verified) {\n console.log(`Verified: ${receipt.receipt_id}`)\n console.log(`Public key: ${publicKey}`)\n } else {\n console.error(`FAILED: ${receipt.receipt_id} — signature invalid`)\n process.exit(1)\n }\n}\n\nasync function cmdList(args: string[]) {\n const { engine } = await getEngine()\n const filter: Record<string, string> = {}\n const isJson = args.includes('--json')\n const filterFailed = args.includes('--failed')\n const filterPassed = args.includes('--passed')\n let limit = 50\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n const next = args[i + 1]\n if (arg === '--agent' && next) { filter['agent_id'] = next; i++ }\n if (arg === '--status' && next) { filter['status'] = next; i++ }\n if (arg === '--limit' && next) { limit = parseInt(next, 10); i++ }\n }\n\n const result = await engine.list(filter, 1, limit)\n\n // Post-filter by constraint result\n let filtered = result.data\n if (filterFailed) {\n filtered = filtered.filter((r) => {\n const cr = r.constraint_result as { passed: boolean } | null\n return cr && !cr.passed\n })\n } else if (filterPassed) {\n filtered = filtered.filter((r) => {\n const cr = r.constraint_result as { passed: boolean } | null\n return cr && cr.passed\n })\n }\n\n if (isJson) {\n console.log(JSON.stringify({ ...result, data: filtered }, null, 2))\n } else {\n console.log(`Receipts (${filtered.length} total):`)\n for (const r of filtered) {\n const status = r.status.padEnd(9)\n console.log(` ${r.receipt_id} ${status} ${r.action} ${r.timestamp}`)\n }\n }\n}\n\nasync function cmdChain(chainId: string, args: string[]) {\n const { engine } = await getEngine()\n const receipts = await engine.getChain(chainId)\n if (receipts.length === 0) {\n console.log(`No receipts found for chain: ${chainId}`)\n return\n }\n\n if (args.includes('--tree')) {\n console.log(`Chain: ${chainId} (${receipts.length} receipts)`)\n\n // Build parent-child map\n type Receipt = typeof receipts[number]\n const childrenOf = new Map<string, Receipt[]>()\n const roots: Receipt[] = []\n\n for (const r of receipts) {\n const parentId = r.parent_receipt_id\n if (!parentId || !receipts.some((p) => p.receipt_id === parentId)) {\n roots.push(r)\n } else {\n const siblings = childrenOf.get(parentId) ?? []\n siblings.push(r)\n childrenOf.set(parentId, siblings)\n }\n }\n\n function renderTree(node: Receipt, prefix: string, isLast: boolean): void {\n const connector = isLast ? '└─' : '├─'\n const ts = node.timestamp.replace('T', ' ').replace(/\\.\\d+Z$/, '')\n console.log(`${prefix}${connector} ${node.receipt_id} ${node.action} [${node.status}] ${ts}`)\n const children = childrenOf.get(node.receipt_id) ?? []\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!\n const childPrefix = prefix + (isLast ? ' ' : '│ ')\n renderTree(child, childPrefix, i === children.length - 1)\n }\n }\n\n for (let i = 0; i < roots.length; i++) {\n renderTree(roots[i]!, '', i === roots.length - 1)\n }\n return\n }\n\n console.log(`Chain: ${chainId} (${receipts.length} receipts)`)\n for (let i = 0; i < receipts.length; i++) {\n const r = receipts[i]!\n console.log(` ${i + 1}. ${r.receipt_id} ${r.status.padEnd(9)} ${r.action} ${r.timestamp}`)\n }\n}\n\nasync function cmdStats() {\n const { engine } = await getEngine()\n const all = await engine.list(undefined, 1, 10000)\n const receipts = all.data\n\n const byStatus: Record<string, number> = {}\n const byAction: Record<string, number> = {}\n let constraintsPassed = 0\n let constraintsFailed = 0\n for (const r of receipts) {\n byStatus[r.status] = (byStatus[r.status] ?? 0) + 1\n byAction[r.action] = (byAction[r.action] ?? 0) + 1\n if (r.constraint_result && typeof r.constraint_result === 'object' && 'passed' in r.constraint_result) {\n if ((r.constraint_result as { passed: boolean }).passed) {\n constraintsPassed++\n } else {\n constraintsFailed++\n }\n }\n }\n\n console.log(`Total receipts: ${receipts.length}`)\n console.log(`By status:`)\n for (const [s, c] of Object.entries(byStatus)) {\n console.log(` ${s}: ${c}`)\n }\n console.log(`By action:`)\n for (const [a, c] of Object.entries(byAction)) {\n console.log(` ${a}: ${c}`)\n }\n if (constraintsPassed + constraintsFailed > 0) {\n console.log(`Constraints:`)\n console.log(` passed: ${constraintsPassed}`)\n console.log(` failed: ${constraintsFailed}`)\n }\n}\n\nasync function cmdJudgments(receiptId: string, args: string[]) {\n const { engine } = await getEngine()\n const isJson = args.includes('--json')\n const judgments = await engine.getJudgments(receiptId)\n\n if (isJson) {\n console.log(JSON.stringify({\n receipt_id: receiptId,\n count: judgments.length,\n judgments: judgments.map(j => ({\n judgment_id: j.receipt_id,\n verdict: (j.metadata as Record<string, unknown>)?.judgment\n ? ((j.metadata as Record<string, unknown>).judgment as Record<string, unknown>).verdict\n : null,\n score: (j.metadata as Record<string, unknown>)?.judgment\n ? ((j.metadata as Record<string, unknown>).judgment as Record<string, unknown>).score\n : null,\n status: j.status,\n output_summary: j.output_summary,\n confidence: j.confidence,\n timestamp: j.timestamp,\n })),\n }, null, 2))\n return\n }\n\n if (judgments.length === 0) {\n console.log(`No judgments found for ${receiptId}`)\n return\n }\n\n console.log(`Judgments for ${receiptId} (${judgments.length} found)`)\n for (const j of judgments) {\n const judgment = (j.metadata as Record<string, unknown>)?.judgment as Record<string, unknown> | undefined\n const verdict = judgment?.verdict as string ?? 'unknown'\n const score = judgment?.score as number ?? 0\n const criteriaResults = judgment?.criteria_results as Array<{ criterion: string; score: number; passed: boolean; reasoning: string }> | undefined\n\n console.log('')\n console.log(` Judgment: ${j.receipt_id}`)\n console.log(` Verdict: ${verdict.toUpperCase()} (${score.toFixed(2)})`)\n console.log(` Judge: ${j.agent_id}`)\n console.log(` Date: ${j.completed_at ?? j.timestamp}`)\n\n if (criteriaResults && criteriaResults.length > 0) {\n console.log('')\n console.log(' Criteria:')\n for (const cr of criteriaResults) {\n const icon = cr.passed ? '\\u2713' : '\\u2717'\n console.log(` ${icon} ${cr.criterion.padEnd(15)} ${cr.score.toFixed(2)} ${cr.reasoning}`)\n }\n }\n\n const overallReasoning = judgment?.overall_reasoning as string | undefined\n if (overallReasoning) {\n console.log('')\n console.log(` Overall: ${overallReasoning}`)\n }\n }\n}\n\nasync function cmdCleanup(args: string[]) {\n const isDryRun = args.includes('--dry-run')\n const { engine } = await getEngine()\n\n if (isDryRun) {\n const all = await engine.list(undefined, 1, 100000)\n const now = new Date().toISOString()\n const expired = all.data.filter(r => {\n const ea = (r.metadata as Record<string, unknown>)?.expires_at as string | undefined\n return ea && ea < now\n })\n\n console.log('Scanning receipts...')\n if (expired.length === 0) {\n console.log('\\nNo expired receipts found.')\n return\n }\n console.log(`\\nExpired: ${expired.length} receipt${expired.length !== 1 ? 's' : ''}`)\n for (const r of expired) {\n const ea = (r.metadata as Record<string, unknown>)?.expires_at as string\n console.log(` ${r.receipt_id} ${r.action.padEnd(20)} expired ${ea}`)\n }\n console.log(`\\n(dry run — no receipts deleted)`)\n return\n }\n\n const result = await engine.cleanup()\n if (result.deleted === 0) {\n console.log('No expired receipts found.')\n } else {\n console.log(`Deleted ${result.deleted} expired receipt${result.deleted !== 1 ? 's' : ''}. ${result.remaining} remaining.`)\n }\n}\n\nasync function cmdExport(target: string, args: string[]) {\n const { engine } = await getEngine()\n const isPretty = args.includes('--pretty')\n if (target === '--all' || args.includes('--all')) {\n const result = await engine.list(undefined, 1, 10000)\n const sorted = result.data.sort((a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n )\n console.log(JSON.stringify(sorted, null, isPretty ? 2 : undefined))\n } else {\n const receipt = await engine.get(target)\n if (!receipt) {\n console.error(`Receipt not found: ${target}`)\n process.exit(1)\n }\n console.log(JSON.stringify(receipt, null, 2))\n }\n}\n\nasync function main() {\n const args = process.argv.slice(2)\n const command = args[0]\n\n if (!command || command === '--help' || command === '-h') {\n console.log(HELP)\n return\n }\n\n if (command === '--version' || command === '-v') {\n console.log('0.1.0')\n return\n }\n\n switch (command) {\n case 'init':\n await cmdInit()\n break\n case 'keys':\n await cmdKeys(args.slice(1))\n break\n case 'inspect':\n if (!args[1]) { console.error('Usage: agent-receipts inspect <id|file>'); process.exit(1) }\n await cmdInspect(args[1])\n break\n case 'verify':\n if (!args[1]) { console.error('Usage: agent-receipts verify <id|file>'); process.exit(1) }\n await cmdVerify(args[1], args.slice(2))\n break\n case 'list':\n await cmdList(args.slice(1))\n break\n case 'chain':\n if (!args[1]) { console.error('Usage: agent-receipts chain <chain_id>'); process.exit(1) }\n await cmdChain(args[1], args.slice(2))\n break\n case 'judgments':\n if (!args[1]) { console.error('Usage: agent-receipts judgments <receipt_id>'); process.exit(1) }\n await cmdJudgments(args[1], args.slice(2))\n break\n case 'cleanup':\n await cmdCleanup(args.slice(1))\n break\n case 'stats':\n await cmdStats()\n break\n case 'export':\n if (!args[1]) { console.error('Usage: agent-receipts export <id|--all>'); process.exit(1) }\n await cmdExport(args[1], args.slice(2))\n break\n default:\n console.error(`Unknown command: ${command}`)\n console.log(HELP)\n process.exit(1)\n }\n}\n\nmain().catch((err) => {\n console.error('Error:', err.message)\n process.exit(1)\n})\n"],"mappings":"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","names":["publicKey","renderTree"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-receipts/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "CLI for Agent Receipts — inspect, verify, and manage receipts",
6
6
  "license": "MIT",
@@ -32,8 +32,8 @@
32
32
  "dist"
33
33
  ],
34
34
  "dependencies": {
35
- "@agent-receipts/mcp-server": "0.1.0",
36
- "@agent-receipts/crypto": "0.1.0"
35
+ "@agent-receipts/mcp-server": "0.2.1",
36
+ "@agent-receipts/crypto": "0.2.1"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^20.0.0",