@catp-protocol/cli 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/adapters/claude-code.d.ts +3 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/adapters/claude-code.js +36 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/index.d.ts +5 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +15 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/registry.d.ts +5 -0
  10. package/dist/adapters/registry.d.ts.map +1 -0
  11. package/dist/adapters/registry.js +18 -0
  12. package/dist/adapters/registry.js.map +1 -0
  13. package/dist/audit/logger.d.ts +5 -4
  14. package/dist/audit/logger.d.ts.map +1 -1
  15. package/dist/audit/logger.js +6 -6
  16. package/dist/audit/logger.js.map +1 -1
  17. package/dist/cli.js +67 -3
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/anchor.js +8 -8
  20. package/dist/commands/authorization.d.ts +5 -0
  21. package/dist/commands/authorization.d.ts.map +1 -1
  22. package/dist/commands/authorization.js +167 -10
  23. package/dist/commands/authorization.js.map +1 -1
  24. package/dist/commands/event.d.ts +18 -0
  25. package/dist/commands/event.d.ts.map +1 -0
  26. package/dist/commands/event.js +78 -0
  27. package/dist/commands/event.js.map +1 -0
  28. package/dist/commands/init.d.ts +6 -1
  29. package/dist/commands/init.d.ts.map +1 -1
  30. package/dist/commands/init.js +20 -3
  31. package/dist/commands/init.js.map +1 -1
  32. package/dist/commands/log.d.ts +23 -0
  33. package/dist/commands/log.d.ts.map +1 -1
  34. package/dist/commands/log.js +83 -8
  35. package/dist/commands/log.js.map +1 -1
  36. package/dist/commands/receipt.d.ts +52 -0
  37. package/dist/commands/receipt.d.ts.map +1 -0
  38. package/dist/commands/receipt.js +255 -0
  39. package/dist/commands/receipt.js.map +1 -0
  40. package/dist/commands/validate.d.ts +2 -0
  41. package/dist/commands/validate.d.ts.map +1 -1
  42. package/dist/commands/validate.js +12 -1
  43. package/dist/commands/validate.js.map +1 -1
  44. package/dist/commands/witness.d.ts +8 -0
  45. package/dist/commands/witness.d.ts.map +1 -1
  46. package/dist/commands/witness.js +49 -0
  47. package/dist/commands/witness.js.map +1 -1
  48. package/dist/enforcement/core.d.ts +11 -0
  49. package/dist/enforcement/core.d.ts.map +1 -0
  50. package/dist/enforcement/core.js +21 -0
  51. package/dist/enforcement/core.js.map +1 -0
  52. package/dist/hook/post.d.ts +5 -1
  53. package/dist/hook/post.d.ts.map +1 -1
  54. package/dist/hook/post.js +10 -18
  55. package/dist/hook/post.js.map +1 -1
  56. package/dist/hook/pre.d.ts +5 -1
  57. package/dist/hook/pre.d.ts.map +1 -1
  58. package/dist/hook/pre.js +12 -25
  59. package/dist/hook/pre.js.map +1 -1
  60. package/dist/hook/runtime.d.ts +4 -0
  61. package/dist/hook/runtime.d.ts.map +1 -0
  62. package/dist/hook/runtime.js +22 -0
  63. package/dist/hook/runtime.js.map +1 -0
  64. package/dist/policy/engine.d.ts +3 -2
  65. package/dist/policy/engine.d.ts.map +1 -1
  66. package/dist/policy/engine.js +3 -3
  67. package/dist/policy/engine.js.map +1 -1
  68. package/dist/policy/types.d.ts +0 -5
  69. package/dist/policy/types.d.ts.map +1 -1
  70. package/dist/runtime/types.d.ts +35 -0
  71. package/dist/runtime/types.d.ts.map +1 -0
  72. package/dist/runtime/types.js +2 -0
  73. package/dist/runtime/types.js.map +1 -0
  74. package/dist/runtime/validate.d.ts +8 -0
  75. package/dist/runtime/validate.d.ts.map +1 -0
  76. package/dist/runtime/validate.js +43 -0
  77. package/dist/runtime/validate.js.map +1 -0
  78. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
- import { readFileSync, readdirSync, existsSync } from "node:fs";
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, readdirSync, existsSync, writeFileSync } from "node:fs";
2
3
  import { join } from "node:path";
3
4
  import { auditRoot } from "../audit/paths.js";
4
5
  import { findPolicyFile, loadPolicy } from "../policy/loader.js";
@@ -22,14 +23,14 @@ function latestLogFile(agentId) {
22
23
  return null;
23
24
  return join(base, dates[0], "actions.jsonl");
24
25
  }
25
- function allLogFiles(agentId) {
26
+ export function auditLogFiles(agentId) {
26
27
  const base = auditRoot(agentId);
27
28
  if (!existsSync(base))
28
29
  return [];
29
30
  return readdirSync(base)
30
31
  .sort()
31
- .map((date) => join(base, date, "actions.jsonl"))
32
- .filter((file) => existsSync(file));
32
+ .map((date) => ({ date, file: join(base, date, "actions.jsonl") }))
33
+ .filter(({ file }) => existsSync(file));
33
34
  }
34
35
  export function cmdLogShow(opts) {
35
36
  const agentId = resolveAgentId(opts);
@@ -47,6 +48,9 @@ export function cmdLogShow(opts) {
47
48
  const icon = e.decision === "allow" ? "✓" : "✗";
48
49
  const rule = e.rule_matched ? ` [${e.rule_matched}]` : "";
49
50
  process.stdout.write(`${icon} ${e.ts} ${e.tool}${rule}\n ${e.input_summary}\n`);
51
+ if (opts.commitments) {
52
+ process.stdout.write(` commitment=${e.commitment}\n`);
53
+ }
50
54
  }
51
55
  catch {
52
56
  process.stdout.write(`? ${line}\n`);
@@ -56,20 +60,91 @@ export function cmdLogShow(opts) {
56
60
  }
57
61
  export async function cmdLogVerify(opts) {
58
62
  const agentId = resolveAgentId(opts);
59
- const logFiles = allLogFiles(agentId);
63
+ const logFiles = auditLogFiles(agentId);
60
64
  if (logFiles.length === 0) {
61
65
  process.stdout.write(`No audit log found for agent "${agentId}"\n`);
62
66
  return;
63
67
  }
64
68
  let checked = 0;
65
- for (const logFile of logFiles) {
66
- const result = await verifyChain(logFile);
69
+ for (const { file } of logFiles) {
70
+ const result = await verifyChain(file);
67
71
  checked += result.checked;
68
72
  if (!result.ok) {
69
- process.stderr.write(`✗ Chain broken in ${logFile} at entry ${result.broken_at}: ${result.message}\n`);
73
+ process.stderr.write(`✗ Chain broken in ${file} at entry ${result.broken_at}: ${result.message}\n`);
70
74
  process.exit(1);
71
75
  }
72
76
  }
73
77
  process.stdout.write(`✓ Chain intact — ${checked} entries verified across ${logFiles.length} log file(s)\n`);
74
78
  }
79
+ export function cmdLogExport(opts) {
80
+ if (!opts.commitment) {
81
+ throw new Error("missing --commitment <hex>");
82
+ }
83
+ assertCommitment(opts.commitment);
84
+ const agentId = resolveAgentId(opts);
85
+ const auditExport = buildAuditExport(agentId, opts.commitment);
86
+ const json = stableStringify(auditExport, 2) + "\n";
87
+ if (opts.out) {
88
+ writeFileSync(opts.out, json, "utf8");
89
+ process.stdout.write(`Wrote audit export to ${opts.out}\n`);
90
+ process.stdout.write(`commitment=${auditExport.commitment}\n`);
91
+ process.stdout.write(`entrySha256=${auditExport.entrySha256}\n`);
92
+ return;
93
+ }
94
+ process.stdout.write(json);
95
+ }
96
+ export function buildAuditExport(agentId, commitment) {
97
+ assertCommitment(commitment);
98
+ const found = findAuditEntry(agentId, commitment);
99
+ if (!found) {
100
+ throw new Error(`No audit entry found for commitment ${commitment}`);
101
+ }
102
+ return {
103
+ exportVersion: "catp_audit_export_v1",
104
+ agentId,
105
+ logDate: found.date,
106
+ entryIndex: found.index,
107
+ commitment: found.entry.commitment,
108
+ entrySha256: sha256Hex(stableStringify(found.entry)),
109
+ entry: found.entry,
110
+ };
111
+ }
112
+ function findAuditEntry(agentId, commitment) {
113
+ for (const { date, file } of auditLogFiles(agentId)) {
114
+ const lines = readFileSync(file, "utf8").split("\n").filter(Boolean);
115
+ for (const [index, line] of lines.entries()) {
116
+ try {
117
+ const entry = JSON.parse(line);
118
+ if (entry.commitment.toLowerCase() === commitment.toLowerCase()) {
119
+ return { date, index, entry };
120
+ }
121
+ }
122
+ catch {
123
+ // skip malformed audit lines; chain verification reports them separately
124
+ }
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ function assertCommitment(commitment) {
130
+ if (!/^[0-9a-fA-F]{64}$/.test(commitment)) {
131
+ throw new Error("--commitment must be a 64-character hex commitment");
132
+ }
133
+ }
134
+ function sha256Hex(input) {
135
+ return createHash("sha256").update(input).digest("hex");
136
+ }
137
+ export function stableStringify(value, spaces = 0) {
138
+ return JSON.stringify(sortForJson(value), null, spaces);
139
+ }
140
+ function sortForJson(value) {
141
+ if (Array.isArray(value)) {
142
+ return value.map(sortForJson);
143
+ }
144
+ if (value && typeof value === "object") {
145
+ const record = value;
146
+ return Object.fromEntries(Object.keys(record).sort().map((key) => [key, sortForJson(record[key])]));
147
+ }
148
+ return value;
149
+ }
75
150
  //# sourceMappingURL=log.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type AuditExport } from "./log.js";
2
+ import type { CatpPolicy } from "../policy/types.js";
3
+ export interface AuthorizationReceiptPayload {
4
+ receiptVersion: "catp_authorization_receipt_v1";
5
+ auditExportHash: string;
6
+ auditCommitment: string;
7
+ entrySha256: string;
8
+ agentId: string;
9
+ tool: string;
10
+ decision: "allow" | "deny";
11
+ timestamp: string;
12
+ policyCommitment: string | null;
13
+ signedAt: string;
14
+ signatureAlgorithm: "Ed25519";
15
+ publicKeyPem: string;
16
+ }
17
+ export interface AuthorizationReceipt extends AuthorizationReceiptPayload {
18
+ signature: string;
19
+ }
20
+ export declare function cmdReceiptKeygen(opts: {
21
+ privateKey?: string;
22
+ publicKey?: string;
23
+ }): void;
24
+ export declare function cmdReceiptSign(opts: {
25
+ auditExport?: string;
26
+ privateKey?: string;
27
+ out?: string;
28
+ file?: string;
29
+ }): void;
30
+ export declare function cmdReceiptIssue(opts: {
31
+ commitment?: string;
32
+ agent?: string;
33
+ privateKey?: string;
34
+ out?: string;
35
+ file?: string;
36
+ auditExportOut?: string;
37
+ }): Promise<void>;
38
+ export declare function cmdReceiptVerify(opts: {
39
+ receipt?: string;
40
+ publicKey?: string;
41
+ auditExport?: string;
42
+ file?: string;
43
+ }): void;
44
+ export declare function signAuthorizationReceipt(auditExport: AuditExport, privateKeyPem: string, publicKeyPem: string, opts?: {
45
+ signedAt?: string;
46
+ policyCommitment?: string | null;
47
+ }): AuthorizationReceipt;
48
+ export declare function verifyAuthorizationReceipt(receipt: AuthorizationReceipt, publicKeyPem?: string): void;
49
+ export declare function verifyReceiptAuditExport(receipt: AuthorizationReceipt, auditExport: AuditExport): void;
50
+ export declare function verifyReceiptPolicy(receipt: AuthorizationReceipt, policy: CatpPolicy): void;
51
+ export declare function computePolicyCommitment(policy: CatpPolicy): string;
52
+ //# sourceMappingURL=receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/commands/receipt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoD,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAG9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,+BAA+B,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAqB,SAAQ,2BAA2B;IACvE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYxF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyBrH;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAoDD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwB1H;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GACjE,oBAAoB,CAqBtB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,EAAE,YAAY,GAAE,MAA6B,GAAG,IAAI,CAO3H;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAyBtG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAS3F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAElE"}
@@ -0,0 +1,255 @@
1
+ import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, sign, verify } from "node:crypto";
2
+ import { readFileSync, writeFileSync } from "node:fs";
3
+ import { auditLogFiles, buildAuditExport, stableStringify } from "./log.js";
4
+ import { verifyChain } from "../audit/verifier.js";
5
+ import { findPolicyFile, loadPolicy } from "../policy/loader.js";
6
+ export function cmdReceiptKeygen(opts) {
7
+ const privateKeyPath = opts.privateKey ?? "catp-receipt-private.pem";
8
+ const publicKeyPath = opts.publicKey ?? "catp-receipt-public.pem";
9
+ const { privateKey, publicKey } = generateKeyPairSync("ed25519", {
10
+ privateKeyEncoding: { type: "pkcs8", format: "pem" },
11
+ publicKeyEncoding: { type: "spki", format: "pem" },
12
+ });
13
+ writeFileSync(privateKeyPath, privateKey, { encoding: "utf8", mode: 0o600 });
14
+ writeFileSync(publicKeyPath, publicKey, "utf8");
15
+ process.stdout.write(`Wrote private key to ${privateKeyPath}\n`);
16
+ process.stdout.write(`Wrote public key to ${publicKeyPath}\n`);
17
+ }
18
+ export function cmdReceiptSign(opts) {
19
+ if (!opts.auditExport) {
20
+ throw new Error("missing --audit-export <path>");
21
+ }
22
+ if (!opts.privateKey) {
23
+ throw new Error("missing --private-key <path>");
24
+ }
25
+ const auditExport = readAuditExport(opts.auditExport);
26
+ const privateKeyPem = readFileSync(opts.privateKey, "utf8");
27
+ const publicKeyPem = derivePublicKeyPem(privateKeyPem);
28
+ const policyCommitment = opts.file ? computePolicyCommitment(loadPolicy(opts.file)) : resolvePolicyCommitmentIfPresent();
29
+ const receipt = signAuthorizationReceipt(auditExport, privateKeyPem, publicKeyPem, { policyCommitment });
30
+ const json = stableStringify(receipt, 2) + "\n";
31
+ if (opts.out) {
32
+ writeFileSync(opts.out, json, "utf8");
33
+ process.stdout.write(`Wrote authorization receipt to ${opts.out}\n`);
34
+ process.stdout.write(`auditCommitment=${receipt.auditCommitment}\n`);
35
+ process.stdout.write(`auditExportHash=${receipt.auditExportHash}\n`);
36
+ process.stdout.write(`policyCommitment=${receipt.policyCommitment ?? "none"}\n`);
37
+ return;
38
+ }
39
+ process.stdout.write(json);
40
+ }
41
+ export function cmdReceiptIssue(opts) {
42
+ return issueReceipt(opts);
43
+ }
44
+ async function issueReceipt(opts) {
45
+ if (!opts.commitment) {
46
+ throw new Error("missing --commitment <hex>");
47
+ }
48
+ if (!opts.privateKey) {
49
+ throw new Error("missing --private-key <path>");
50
+ }
51
+ const policyPath = opts.file ?? findPolicyFile();
52
+ const policy = policyPath ? loadPolicy(policyPath) : null;
53
+ const agentId = opts.agent ?? policy?.agent.id;
54
+ if (!agentId) {
55
+ throw new Error("missing --agent <id>; no catp-policy.toml found");
56
+ }
57
+ await verifyAuditLogIntegrity(agentId);
58
+ const auditExport = buildAuditExport(agentId, opts.commitment);
59
+ const privateKeyPem = readFileSync(opts.privateKey, "utf8");
60
+ const publicKeyPem = derivePublicKeyPem(privateKeyPem);
61
+ const receipt = signAuthorizationReceipt(auditExport, privateKeyPem, publicKeyPem, {
62
+ policyCommitment: policy ? computePolicyCommitment(policy) : null,
63
+ });
64
+ if (opts.auditExportOut) {
65
+ writeFileSync(opts.auditExportOut, stableStringify(auditExport, 2) + "\n", "utf8");
66
+ }
67
+ const json = stableStringify(receipt, 2) + "\n";
68
+ if (opts.out) {
69
+ writeFileSync(opts.out, json, "utf8");
70
+ process.stdout.write(`Wrote authorization receipt to ${opts.out}\n`);
71
+ if (opts.auditExportOut) {
72
+ process.stdout.write(`Wrote audit export to ${opts.auditExportOut}\n`);
73
+ }
74
+ process.stdout.write(`auditCommitment=${receipt.auditCommitment}\n`);
75
+ process.stdout.write(`auditExportHash=${receipt.auditExportHash}\n`);
76
+ process.stdout.write(`policyCommitment=${receipt.policyCommitment ?? "none"}\n`);
77
+ return;
78
+ }
79
+ process.stdout.write(json);
80
+ }
81
+ export function cmdReceiptVerify(opts) {
82
+ if (!opts.receipt) {
83
+ throw new Error("missing --receipt <path>");
84
+ }
85
+ const receipt = readAuthorizationReceipt(opts.receipt);
86
+ const publicKeyPem = opts.publicKey ? readFileSync(opts.publicKey, "utf8") : receipt.publicKeyPem;
87
+ verifyAuthorizationReceipt(receipt, publicKeyPem);
88
+ if (opts.auditExport) {
89
+ const auditExport = readAuditExport(opts.auditExport);
90
+ verifyReceiptAuditExport(receipt, auditExport);
91
+ }
92
+ if (opts.file) {
93
+ verifyReceiptPolicy(receipt, loadPolicy(opts.file));
94
+ }
95
+ process.stdout.write("authorizationReceipt=valid\n");
96
+ if (opts.auditExport) {
97
+ process.stdout.write("auditExport=matched\n");
98
+ }
99
+ if (opts.file) {
100
+ process.stdout.write("policy=matched\n");
101
+ }
102
+ process.stdout.write(`auditCommitment=${receipt.auditCommitment}\n`);
103
+ process.stdout.write(`auditExportHash=${receipt.auditExportHash}\n`);
104
+ process.stdout.write(`policyCommitment=${receipt.policyCommitment ?? "none"}\n`);
105
+ }
106
+ export function signAuthorizationReceipt(auditExport, privateKeyPem, publicKeyPem, opts = {}) {
107
+ validateAuditExport(auditExport);
108
+ if (opts.policyCommitment !== undefined && opts.policyCommitment !== null) {
109
+ assertHex(opts.policyCommitment, "policyCommitment");
110
+ }
111
+ const payload = {
112
+ receiptVersion: "catp_authorization_receipt_v1",
113
+ auditExportHash: sha256Hex(stableStringify(auditExport)),
114
+ auditCommitment: auditExport.commitment,
115
+ entrySha256: auditExport.entrySha256,
116
+ agentId: auditExport.agentId,
117
+ tool: auditExport.entry.tool,
118
+ decision: auditExport.entry.decision,
119
+ timestamp: auditExport.entry.ts,
120
+ policyCommitment: opts.policyCommitment ?? null,
121
+ signedAt: opts.signedAt ?? new Date().toISOString(),
122
+ signatureAlgorithm: "Ed25519",
123
+ publicKeyPem,
124
+ };
125
+ const signature = sign(null, Buffer.from(stableStringify(payload)), privateKeyPem).toString("base64");
126
+ return { ...payload, signature };
127
+ }
128
+ export function verifyAuthorizationReceipt(receipt, publicKeyPem = receipt.publicKeyPem) {
129
+ validateReceipt(receipt);
130
+ const { signature, ...payload } = receipt;
131
+ const ok = verify(null, Buffer.from(stableStringify(payload)), publicKeyPem, Buffer.from(signature, "base64"));
132
+ if (!ok) {
133
+ throw new Error("authorization receipt signature is invalid");
134
+ }
135
+ }
136
+ export function verifyReceiptAuditExport(receipt, auditExport) {
137
+ validateReceipt(receipt);
138
+ validateAuditExport(auditExport);
139
+ const auditExportHash = sha256Hex(stableStringify(auditExport));
140
+ if (receipt.auditExportHash !== auditExportHash) {
141
+ throw new Error("receipt auditExportHash does not match audit export");
142
+ }
143
+ if (receipt.auditCommitment !== auditExport.commitment) {
144
+ throw new Error("receipt auditCommitment does not match audit export");
145
+ }
146
+ if (receipt.entrySha256 !== auditExport.entrySha256) {
147
+ throw new Error("receipt entrySha256 does not match audit export");
148
+ }
149
+ if (receipt.agentId !== auditExport.agentId) {
150
+ throw new Error("receipt agentId does not match audit export");
151
+ }
152
+ if (receipt.tool !== auditExport.entry.tool) {
153
+ throw new Error("receipt tool does not match audit export");
154
+ }
155
+ if (receipt.decision !== auditExport.entry.decision) {
156
+ throw new Error("receipt decision does not match audit export");
157
+ }
158
+ if (receipt.timestamp !== auditExport.entry.ts) {
159
+ throw new Error("receipt timestamp does not match audit export");
160
+ }
161
+ }
162
+ export function verifyReceiptPolicy(receipt, policy) {
163
+ validateReceipt(receipt);
164
+ const policyCommitment = computePolicyCommitment(policy);
165
+ if (receipt.policyCommitment === null) {
166
+ throw new Error("receipt has no policyCommitment");
167
+ }
168
+ if (receipt.policyCommitment !== policyCommitment) {
169
+ throw new Error("receipt policyCommitment does not match policy");
170
+ }
171
+ }
172
+ export function computePolicyCommitment(policy) {
173
+ return sha256Hex(stableStringify(policy));
174
+ }
175
+ function readAuditExport(path) {
176
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
177
+ validateAuditExport(parsed);
178
+ return parsed;
179
+ }
180
+ function readAuthorizationReceipt(path) {
181
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
182
+ validateReceipt(parsed);
183
+ return parsed;
184
+ }
185
+ function validateAuditExport(value) {
186
+ if (!value || typeof value !== "object") {
187
+ throw new Error("audit export must be an object");
188
+ }
189
+ const auditExport = value;
190
+ if (auditExport.exportVersion !== "catp_audit_export_v1") {
191
+ throw new Error("audit export version must be catp_audit_export_v1");
192
+ }
193
+ if (!auditExport.entry || typeof auditExport.entry !== "object") {
194
+ throw new Error("audit export entry must be an object");
195
+ }
196
+ assertHex(auditExport.commitment, "audit export commitment");
197
+ assertHex(auditExport.entrySha256, "audit export entrySha256");
198
+ if (auditExport.entry.commitment !== auditExport.commitment) {
199
+ throw new Error("audit export commitment must match entry commitment");
200
+ }
201
+ const expectedEntryHash = sha256Hex(stableStringify(auditExport.entry));
202
+ if (auditExport.entrySha256 !== expectedEntryHash) {
203
+ throw new Error("audit export entrySha256 does not match entry");
204
+ }
205
+ }
206
+ function validateReceipt(value) {
207
+ if (!value || typeof value !== "object") {
208
+ throw new Error("authorization receipt must be an object");
209
+ }
210
+ const receipt = value;
211
+ if (receipt.receiptVersion !== "catp_authorization_receipt_v1") {
212
+ throw new Error("receiptVersion must be catp_authorization_receipt_v1");
213
+ }
214
+ if (receipt.signatureAlgorithm !== "Ed25519") {
215
+ throw new Error("signatureAlgorithm must be Ed25519");
216
+ }
217
+ assertHex(receipt.auditExportHash, "auditExportHash");
218
+ assertHex(receipt.auditCommitment, "auditCommitment");
219
+ assertHex(receipt.entrySha256, "entrySha256");
220
+ if (receipt.decision !== "allow" && receipt.decision !== "deny") {
221
+ throw new Error("decision must be allow or deny");
222
+ }
223
+ for (const field of ["agentId", "tool", "timestamp", "signedAt", "publicKeyPem", "signature"]) {
224
+ if (typeof receipt[field] !== "string" || receipt[field] === "") {
225
+ throw new Error(`${field} must be a non-empty string`);
226
+ }
227
+ }
228
+ if (receipt.policyCommitment !== null) {
229
+ assertHex(receipt.policyCommitment, "policyCommitment");
230
+ }
231
+ }
232
+ function derivePublicKeyPem(privateKeyPem) {
233
+ return createPublicKey(createPrivateKey(privateKeyPem)).export({ type: "spki", format: "pem" }).toString();
234
+ }
235
+ function resolvePolicyCommitmentIfPresent() {
236
+ const policyPath = findPolicyFile();
237
+ return policyPath ? computePolicyCommitment(loadPolicy(policyPath)) : null;
238
+ }
239
+ async function verifyAuditLogIntegrity(agentId) {
240
+ for (const { file } of auditLogFiles(agentId)) {
241
+ const result = await verifyChain(file);
242
+ if (!result.ok) {
243
+ throw new Error(`audit log chain is broken in ${file} at entry ${result.broken_at}: ${result.message}`);
244
+ }
245
+ }
246
+ }
247
+ function assertHex(value, field) {
248
+ if (typeof value !== "string" || !/^[0-9a-fA-F]{64}$/.test(value)) {
249
+ throw new Error(`${field} must be a 64-character hex string`);
250
+ }
251
+ }
252
+ function sha256Hex(input) {
253
+ return createHash("sha256").update(input).digest("hex");
254
+ }
255
+ //# sourceMappingURL=receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/commands/receipt.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ import type { CatpPolicy } from "../policy/types.js";
1
2
  export declare function cmdValidate(opts: {
2
3
  file?: string;
3
4
  }): void;
5
+ export declare function formatValidationSummary(policyPath: string, policy: CatpPolicy): string;
4
6
  //# sourceMappingURL=validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBzD"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAczD;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAkBtF"}
@@ -7,11 +7,22 @@ export function cmdValidate(opts) {
7
7
  }
8
8
  try {
9
9
  const policy = loadPolicy(policyPath);
10
- process.stdout.write(`✓ ${policyPath}\n agent: ${policy.agent.id} v${policy.agent.version}\n rules: ${policy.rules.length}\n`);
10
+ process.stdout.write(formatValidationSummary(policyPath, policy));
11
11
  }
12
12
  catch (err) {
13
13
  process.stderr.write(`✗ ${policyPath}\n ${err.message}\n`);
14
14
  process.exit(1);
15
15
  }
16
16
  }
17
+ export function formatValidationSummary(policyPath, policy) {
18
+ const lines = [
19
+ `✓ ${policyPath}`,
20
+ ` agent: ${policy.agent.id} v${policy.agent.version}`,
21
+ ` rules: ${policy.rules.length}`,
22
+ ];
23
+ if (policy.authorization) {
24
+ lines.push(" authorization: authorization_groth16_v1-ready", ` allowedAction: ${policy.authorization.allowed_action}`, ` maxValuePerTx: ${policy.authorization.max_value_per_tx}`, ` maxValueTotal: ${policy.authorization.max_value_total}`, ` validFrom: ${policy.authorization.valid_from}`, ` validUntil: ${policy.authorization.valid_until}`, " next: catp witness --action <action.json> --out <witness.json>");
25
+ }
26
+ return `${lines.join("\n")}\n`;
27
+ }
17
28
  //# sourceMappingURL=validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,UAAU,cAAc,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,cAAc,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAC3G,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,OAAQ,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,OAAQ,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB,EAAE,MAAkB;IAC5E,MAAM,KAAK,GAAG;QACZ,KAAK,UAAU,EAAE;QACjB,YAAY,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;QACtD,YAAY,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;KAClC,CAAC;IACF,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CACR,iDAAiD,EACjD,sBAAsB,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,EAC3D,sBAAsB,MAAM,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAC7D,sBAAsB,MAAM,CAAC,aAAa,CAAC,eAAe,EAAE,EAC5D,kBAAkB,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EACnD,mBAAmB,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,EACrD,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -28,6 +28,14 @@ export declare function cmdWitness(opts: {
28
28
  currentTimestamp?: string;
29
29
  cumulativeSpend?: string;
30
30
  }): void;
31
+ export declare function formatGroth16WitnessSummary(witness: Groth16Witness, opts?: {
32
+ action?: string;
33
+ auditCommitment?: string;
34
+ agent?: string;
35
+ file?: string;
36
+ currentTimestamp?: string;
37
+ cumulativeSpend?: string;
38
+ }): string;
31
39
  export declare function buildGroth16WitnessFromSources(opts: {
32
40
  action?: string;
33
41
  auditCommitment?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../src/commands/witness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,mBAAmB,EAAuB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAW3G,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,kBAAkB,EAC1B,IAAI,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAO,GACnF,cAAc,CAyChB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,IAAI,CAUP;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,cAAc,CAsBjB"}
1
+ {"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../src/commands/witness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,mBAAmB,EAAuB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAW3G,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,kBAAkB,EAC1B,IAAI,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAO,GACnF,cAAc,CAyChB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,IAAI,CAkBP;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,MAAM,CAkBR;AA8BD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,cAAc,CAsBjB"}
@@ -51,11 +51,57 @@ export function cmdWitness(opts) {
51
51
  if (opts.out) {
52
52
  writeFileSync(opts.out, encoded, "utf8");
53
53
  process.stdout.write(`Wrote Groth16 witness to ${opts.out}\n`);
54
+ process.stdout.write(formatGroth16WitnessSummary(witness, {
55
+ action: opts.action,
56
+ auditCommitment: opts.auditCommitment,
57
+ agent: opts.agent,
58
+ file: opts.file,
59
+ currentTimestamp: opts.currentTimestamp,
60
+ cumulativeSpend: opts.cumulativeSpend,
61
+ }));
54
62
  }
55
63
  else {
56
64
  process.stdout.write(encoded);
57
65
  }
58
66
  }
67
+ export function formatGroth16WitnessSummary(witness, opts = {}) {
68
+ const lines = [
69
+ "proofVersion=authorization_groth16_v1",
70
+ `actionType=${witness.actionType}`,
71
+ `value=${witness.value}`,
72
+ `currentTimestamp=${witness.currentTimestamp}`,
73
+ `cumulativeSpend=${witness.cumulativeSpend}`,
74
+ `maxValuePerTx=${witness.maxValuePerTx}`,
75
+ `maxValueTotal=${witness.maxValueTotal}`,
76
+ `validFrom=${witness.validFrom}`,
77
+ `validUntil=${witness.validUntil}`,
78
+ "next=Run catp prove authorization with the same policy/action inputs to generate a proof manifest.",
79
+ ];
80
+ const proveCommand = formatProveCommand(opts);
81
+ if (proveCommand) {
82
+ lines.push(`proveCommand=${proveCommand}`);
83
+ }
84
+ return `${lines.join("\n")}\n`;
85
+ }
86
+ function formatProveCommand(opts) {
87
+ if (!opts.action && !opts.auditCommitment)
88
+ return null;
89
+ const args = ["catp", "prove", "authorization"];
90
+ if (opts.file)
91
+ args.push("--file", opts.file);
92
+ if (opts.action)
93
+ args.push("--action", opts.action);
94
+ if (opts.auditCommitment)
95
+ args.push("--audit-commitment", opts.auditCommitment);
96
+ if (opts.agent)
97
+ args.push("--agent", opts.agent);
98
+ if (opts.currentTimestamp)
99
+ args.push("--current-timestamp", opts.currentTimestamp);
100
+ if (opts.cumulativeSpend)
101
+ args.push("--cumulative-spend", opts.cumulativeSpend);
102
+ args.push("--artifact-out", "authorization_groth16_v1.json", "--deployment", "catp-contracts/deployments/sepolia-groth16.json", "--out", "catp-proof-manifest.json");
103
+ return args.map(shellQuote).join(" ");
104
+ }
59
105
  export function buildGroth16WitnessFromSources(opts) {
60
106
  if (!opts.action && !opts.auditCommitment) {
61
107
  throw new Error("missing --action <path> or --audit-commitment <hex>");
@@ -142,6 +188,9 @@ function normalizeBytes32(value, field) {
142
188
  }
143
189
  return value;
144
190
  }
191
+ function shellQuote(value) {
192
+ return /^[A-Za-z0-9_./:@%+=,-]+$/.test(value) ? value : `'${value.replace(/'/g, "'\\''")}'`;
193
+ }
145
194
  function normalizeU64(value, field) {
146
195
  let parsed;
147
196
  if (typeof value === "number") {