@catp-protocol/cli 0.1.0 → 0.2.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.
- package/dist/audit/logger.d.ts +3 -2
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/audit/logger.js +37 -10
- package/dist/audit/logger.js.map +1 -1
- package/dist/audit/paths.d.ts +4 -0
- package/dist/audit/paths.d.ts.map +1 -0
- package/dist/audit/paths.js +12 -0
- package/dist/audit/paths.js.map +1 -0
- package/dist/audit/verifier.d.ts.map +1 -1
- package/dist/audit/verifier.js +1 -1
- package/dist/audit/verifier.js.map +1 -1
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/anchor.d.ts +7 -0
- package/dist/commands/anchor.d.ts.map +1 -0
- package/dist/commands/anchor.js +122 -0
- package/dist/commands/anchor.js.map +1 -0
- package/dist/commands/authorization.d.ts +68 -0
- package/dist/commands/authorization.d.ts.map +1 -0
- package/dist/commands/authorization.js +342 -0
- package/dist/commands/authorization.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +22 -11
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/witness.d.ts +39 -0
- package/dist/commands/witness.d.ts.map +1 -0
- package/dist/commands/witness.js +164 -0
- package/dist/commands/witness.js.map +1 -0
- package/dist/policy/loader.d.ts.map +1 -1
- package/dist/policy/loader.js +36 -1
- package/dist/policy/loader.js.map +1 -1
- package/dist/policy/types.d.ts +19 -0
- package/dist/policy/types.d.ts.map +1 -1
- package/package.json +20 -9
package/dist/audit/logger.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { AuditEntry, HookInput } from "../policy/types.js";
|
|
2
|
-
export declare function computeCommitment(tool: string, decision: "allow" | "deny", ts: string, prev?: string): string;
|
|
1
|
+
import type { AuditEntry, AuthorizationAction, HookInput } from "../policy/types.js";
|
|
2
|
+
export declare function computeCommitment(tool: string, decision: "allow" | "deny", ts: string, prev?: string, ruleMatched?: string | null, inputSummary?: string): string;
|
|
3
3
|
export declare function summarizeInput(input: HookInput): string;
|
|
4
4
|
export declare function auditDir(agentId: string): string;
|
|
5
5
|
export declare function getLastCommitment(agentId: string): string;
|
|
6
6
|
export declare function appendAuditEntry(agentId: string, entry: AuditEntry): void;
|
|
7
7
|
export declare function buildEntry(input: HookInput, decision: "allow" | "deny", ruleMatched: string | null, prevCommitment?: string): AuditEntry;
|
|
8
|
+
export declare function extractAuthorizationAction(input: HookInput): AuthorizationAction | undefined;
|
|
8
9
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAMrF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,GAAG,MAAM,EAC1B,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAY,EAClB,WAAW,GAAE,MAAM,GAAG,IAAW,EACjC,YAAY,GAAE,MAAW,GACxB,MAAM,CAIR;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAGvD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAIzE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,EAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,cAAc,GAAE,MAAY,GAC3B,UAAU,CAgBZ;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,mBAAmB,GAAG,SAAS,CAsB5F"}
|
package/dist/audit/logger.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import { auditDirForDate } from "./paths.js";
|
|
5
5
|
// Phase 0: SHA-256 commitment placeholder.
|
|
6
6
|
// Chains on fields stored in the log (tool, decision, ts, prev) so the chain
|
|
7
7
|
// is verifiable from the JSONL file alone without replaying tool_input.
|
|
8
8
|
// Phase 1 replaces this with a Poseidon hash over the full action witness via WASM.
|
|
9
|
-
export function computeCommitment(tool, decision, ts, prev = "0") {
|
|
9
|
+
export function computeCommitment(tool, decision, ts, prev = "0", ruleMatched = null, inputSummary = "") {
|
|
10
10
|
return createHash("sha256")
|
|
11
|
-
.update(tool)
|
|
12
|
-
.update(decision)
|
|
13
|
-
.update(ts)
|
|
14
|
-
.update(prev)
|
|
11
|
+
.update(JSON.stringify({ tool, decision, ts, ruleMatched, inputSummary, prev }))
|
|
15
12
|
.digest("hex");
|
|
16
13
|
}
|
|
17
14
|
export function summarizeInput(input) {
|
|
@@ -20,7 +17,7 @@ export function summarizeInput(input) {
|
|
|
20
17
|
}
|
|
21
18
|
export function auditDir(agentId) {
|
|
22
19
|
const date = new Date().toISOString().slice(0, 10);
|
|
23
|
-
return
|
|
20
|
+
return auditDirForDate(agentId, date);
|
|
24
21
|
}
|
|
25
22
|
export function getLastCommitment(agentId) {
|
|
26
23
|
const dir = auditDir(agentId);
|
|
@@ -44,13 +41,43 @@ export function appendAuditEntry(agentId, entry) {
|
|
|
44
41
|
}
|
|
45
42
|
export function buildEntry(input, decision, ruleMatched, prevCommitment = "0") {
|
|
46
43
|
const ts = new Date().toISOString();
|
|
47
|
-
|
|
44
|
+
const inputSummary = summarizeInput(input);
|
|
45
|
+
const entry = {
|
|
48
46
|
ts,
|
|
49
47
|
tool: input.tool_name,
|
|
50
48
|
decision,
|
|
51
49
|
rule_matched: ruleMatched,
|
|
52
|
-
commitment: computeCommitment(input.tool_name, decision, ts, prevCommitment),
|
|
53
|
-
input_summary:
|
|
50
|
+
commitment: computeCommitment(input.tool_name, decision, ts, prevCommitment, ruleMatched, inputSummary),
|
|
51
|
+
input_summary: inputSummary,
|
|
52
|
+
};
|
|
53
|
+
const authorization = extractAuthorizationAction(input);
|
|
54
|
+
if (authorization) {
|
|
55
|
+
entry.authorization = authorization;
|
|
56
|
+
}
|
|
57
|
+
return entry;
|
|
58
|
+
}
|
|
59
|
+
export function extractAuthorizationAction(input) {
|
|
60
|
+
const candidate = input.tool_input.catp_authorization ?? input.tool_input.authorization;
|
|
61
|
+
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const value = candidate;
|
|
65
|
+
if (!isStringOrNumber(value.actionType) ||
|
|
66
|
+
typeof value.protocol !== "string" ||
|
|
67
|
+
typeof value.token !== "string" ||
|
|
68
|
+
!isStringOrNumber(value.value)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
actionType: value.actionType,
|
|
73
|
+
protocol: value.protocol,
|
|
74
|
+
token: value.token,
|
|
75
|
+
value: value.value,
|
|
76
|
+
...(isStringOrNumber(value.currentTimestamp) ? { currentTimestamp: value.currentTimestamp } : {}),
|
|
77
|
+
...(isStringOrNumber(value.cumulativeSpend) ? { cumulativeSpend: value.cumulativeSpend } : {}),
|
|
54
78
|
};
|
|
55
79
|
}
|
|
80
|
+
function isStringOrNumber(value) {
|
|
81
|
+
return typeof value === "string" || typeof value === "number";
|
|
82
|
+
}
|
|
56
83
|
//# sourceMappingURL=logger.js.map
|
package/dist/audit/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/audit/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export function catpHome() {
|
|
4
|
+
return process.env.CATP_HOME ?? join(homedir(), ".catp");
|
|
5
|
+
}
|
|
6
|
+
export function auditRoot(agentId) {
|
|
7
|
+
return join(catpHome(), "audit", agentId);
|
|
8
|
+
}
|
|
9
|
+
export function auditDirForDate(agentId, date) {
|
|
10
|
+
return join(auditRoot(agentId), date);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/audit/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,QAAQ;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAY;IAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/audit/verifier.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/audit/verifier.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoCxE"}
|
package/dist/audit/verifier.js
CHANGED
|
@@ -16,7 +16,7 @@ export async function verifyChain(logFile) {
|
|
|
16
16
|
return { ok: false, checked: i, broken_at: i, message: `line ${i + 1}: invalid JSON` };
|
|
17
17
|
}
|
|
18
18
|
const decision = entry.decision;
|
|
19
|
-
const expected = computeCommitment(entry.tool, decision, entry.ts, prev);
|
|
19
|
+
const expected = computeCommitment(entry.tool, decision, entry.ts, prev, entry.rule_matched, entry.input_summary);
|
|
20
20
|
if (entry.commitment !== expected) {
|
|
21
21
|
return {
|
|
22
22
|
ok: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/audit/verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAe,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzF,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAA4B,CAAC;QACpD,MAAM,QAAQ,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/audit/verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAe,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzF,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAA4B,CAAC;QACpD,MAAM,QAAQ,GAAG,iBAAiB,CAChC,KAAK,CAAC,IAAI,EACV,QAAQ,EACR,KAAK,CAAC,EAAE,EACR,IAAI,EACJ,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,CACpB,CAAC;QACF,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,kDAAkD;aACzE,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;AACvF,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,9 @@ import { runPostHook } from "./hook/post.js";
|
|
|
5
5
|
import { cmdInit } from "./commands/init.js";
|
|
6
6
|
import { cmdValidate } from "./commands/validate.js";
|
|
7
7
|
import { cmdLogShow, cmdLogVerify } from "./commands/log.js";
|
|
8
|
+
import { cmdAnchor } from "./commands/anchor.js";
|
|
9
|
+
import { cmdWitness } from "./commands/witness.js";
|
|
10
|
+
import { cmdProveAuthorization, cmdVerifyAuthorization } from "./commands/authorization.js";
|
|
8
11
|
const program = new Command();
|
|
9
12
|
program
|
|
10
13
|
.name("catp")
|
|
@@ -40,6 +43,52 @@ log
|
|
|
40
43
|
.description("Verify commitment chain integrity")
|
|
41
44
|
.option("--agent <id>", "agent id (default: from policy file)")
|
|
42
45
|
.action(cmdLogVerify);
|
|
46
|
+
program
|
|
47
|
+
.command("anchor")
|
|
48
|
+
.description("Batch audit commitments into a Merkle root and submit on-chain")
|
|
49
|
+
.option("--agent <id>", "agent id (default: from policy file)")
|
|
50
|
+
.option("--dry-run", "compute and print the Merkle root without submitting")
|
|
51
|
+
.action(cmdAnchor);
|
|
52
|
+
program
|
|
53
|
+
.command("witness")
|
|
54
|
+
.description("Build an authorization_groth16_v1 witness from policy and action JSON")
|
|
55
|
+
.option("--action <path>", "path to structured action JSON")
|
|
56
|
+
.option("--audit-commitment <hex>", "build from a logged audit entry commitment")
|
|
57
|
+
.option("--agent <id>", "agent id for --audit-commitment (default: from policy file)")
|
|
58
|
+
.option("-f, --file <path>", "path to catp-policy.toml (default: auto-discover)")
|
|
59
|
+
.option("--out <path>", "write witness JSON to file instead of stdout")
|
|
60
|
+
.option("--current-timestamp <u64>", "override action currentTimestamp")
|
|
61
|
+
.option("--cumulative-spend <u64>", "override action cumulativeSpend")
|
|
62
|
+
.action(cmdWitness);
|
|
63
|
+
const prove = program.command("prove").description("Build shareable CATP proof manifests");
|
|
64
|
+
prove
|
|
65
|
+
.command("authorization")
|
|
66
|
+
.description("Build an authorization proof manifest from an artifact, action, or audit commitment")
|
|
67
|
+
.option("--artifact <path>", "existing authorization_groth16_v1 proof artifact JSON")
|
|
68
|
+
.option("--action <path>", "structured action JSON to prove")
|
|
69
|
+
.option("--audit-commitment <hex>", "audit log commitment linked to this proof")
|
|
70
|
+
.option("--agent <id>", "agent id for --audit-commitment (default: from policy file)")
|
|
71
|
+
.option("-f, --file <path>", "path to catp-policy.toml (default: auto-discover)")
|
|
72
|
+
.option("--current-timestamp <u64>", "override action currentTimestamp")
|
|
73
|
+
.option("--cumulative-spend <u64>", "override action cumulativeSpend")
|
|
74
|
+
.option("--artifact-out <path>", "keep generated proof artifact at this path")
|
|
75
|
+
.option("--witness-out <path>", "keep generated witness JSON at this path")
|
|
76
|
+
.option("--prover-script <path>", "Groth16 proof generation script")
|
|
77
|
+
.option("--deployment <path>", "deployment metadata JSON for verifier, authorizer, and chain id")
|
|
78
|
+
.option("--verifier <address>", "Groth16 authorization verifier wrapper address")
|
|
79
|
+
.option("--agent-authorizer <address>", "AgentAuthorizer address")
|
|
80
|
+
.option("--chain-id <id>", "chain id for the verifier/deployment")
|
|
81
|
+
.option("--proof-url <url>", "external URL where proof bytes or artifact are stored")
|
|
82
|
+
.option("--out <path>", "write proof manifest JSON to file instead of stdout")
|
|
83
|
+
.action(cmdProveAuthorization);
|
|
84
|
+
const verify = program.command("verify").description("Verify CATP proof manifests");
|
|
85
|
+
verify
|
|
86
|
+
.command("authorization")
|
|
87
|
+
.description("Validate an authorization proof manifest")
|
|
88
|
+
.requiredOption("--manifest <path>", "authorization proof manifest JSON")
|
|
89
|
+
.option("--check-audit", "check that auditCommitment exists in the local audit log")
|
|
90
|
+
.option("--audit-agent <id>", "agent id to use for --check-audit")
|
|
91
|
+
.action(cmdVerifyAuthorization);
|
|
43
92
|
program.parseAsync(process.argv).catch((err) => {
|
|
44
93
|
process.stderr.write(`catp: ${err.message}\n`);
|
|
45
94
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function readCommitments(agentId: string): string[];
|
|
2
|
+
export declare function merkleRoot(commitments: string[]): `0x${string}`;
|
|
3
|
+
export declare function cmdAnchor(opts: {
|
|
4
|
+
agent?: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=anchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../src/commands/anchor.ts"],"names":[],"mappings":"AAgCA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBzD;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,CAwB/D;AAmCD,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { auditRoot } from "../audit/paths.js";
|
|
5
|
+
import { findPolicyFile, loadPolicy } from "../policy/loader.js";
|
|
6
|
+
const REGISTER_POLICY_ABI = [
|
|
7
|
+
{
|
|
8
|
+
name: "registerPolicy",
|
|
9
|
+
type: "function",
|
|
10
|
+
inputs: [{ name: "policyCommitment", type: "bytes32" }],
|
|
11
|
+
outputs: [],
|
|
12
|
+
stateMutability: "nonpayable",
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
function resolveAgentId(opts) {
|
|
16
|
+
if (opts.agent)
|
|
17
|
+
return opts.agent;
|
|
18
|
+
const policyPath = findPolicyFile();
|
|
19
|
+
if (policyPath) {
|
|
20
|
+
try {
|
|
21
|
+
return loadPolicy(policyPath).agent.id;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// fall through
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new Error("Could not determine agent ID. Specify --agent <id> or run from a directory with catp-policy.toml.");
|
|
28
|
+
}
|
|
29
|
+
export function readCommitments(agentId) {
|
|
30
|
+
const baseDir = auditRoot(agentId);
|
|
31
|
+
if (!existsSync(baseDir))
|
|
32
|
+
return [];
|
|
33
|
+
const commitments = [];
|
|
34
|
+
const dates = readdirSync(baseDir).sort();
|
|
35
|
+
for (const date of dates) {
|
|
36
|
+
const file = join(baseDir, date, "actions.jsonl");
|
|
37
|
+
if (!existsSync(file))
|
|
38
|
+
continue;
|
|
39
|
+
const lines = readFileSync(file, "utf8").trimEnd().split("\n").filter(Boolean);
|
|
40
|
+
for (const line of lines) {
|
|
41
|
+
try {
|
|
42
|
+
const entry = JSON.parse(line);
|
|
43
|
+
if (entry.commitment)
|
|
44
|
+
commitments.push(entry.commitment);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// skip malformed lines
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return commitments;
|
|
52
|
+
}
|
|
53
|
+
export function merkleRoot(commitments) {
|
|
54
|
+
if (commitments.length === 0) {
|
|
55
|
+
return `0x${"00".repeat(32)}`;
|
|
56
|
+
}
|
|
57
|
+
let layer = commitments.map((c) => {
|
|
58
|
+
const b = Buffer.from(c, "hex");
|
|
59
|
+
return b.length === 32 ? b : createHash("sha256").update(c).digest();
|
|
60
|
+
});
|
|
61
|
+
while (layer.length > 1) {
|
|
62
|
+
if (layer.length % 2 !== 0) {
|
|
63
|
+
layer.push(layer[layer.length - 1]);
|
|
64
|
+
}
|
|
65
|
+
const next = [];
|
|
66
|
+
for (let i = 0; i < layer.length; i += 2) {
|
|
67
|
+
next.push(createHash("sha256").update(layer[i]).update(layer[i + 1]).digest());
|
|
68
|
+
}
|
|
69
|
+
layer = next;
|
|
70
|
+
}
|
|
71
|
+
return `0x${layer[0].toString("hex")}`;
|
|
72
|
+
}
|
|
73
|
+
async function submitOnChain(root, rpcUrl, privateKey, contractAddress) {
|
|
74
|
+
const { createPublicClient, createWalletClient, http, defineChain } = await import("viem");
|
|
75
|
+
const { privateKeyToAccount } = await import("viem/accounts");
|
|
76
|
+
const publicClient = createPublicClient({ transport: http(rpcUrl) });
|
|
77
|
+
const chainId = await publicClient.getChainId();
|
|
78
|
+
const chain = defineChain({
|
|
79
|
+
id: chainId,
|
|
80
|
+
name: "catp-network",
|
|
81
|
+
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
|
|
82
|
+
rpcUrls: { default: { http: [rpcUrl] } },
|
|
83
|
+
});
|
|
84
|
+
const account = privateKeyToAccount(privateKey);
|
|
85
|
+
const walletClient = createWalletClient({ account, chain, transport: http(rpcUrl) });
|
|
86
|
+
const hash = await walletClient.writeContract({
|
|
87
|
+
address: contractAddress,
|
|
88
|
+
abi: REGISTER_POLICY_ABI,
|
|
89
|
+
functionName: "registerPolicy",
|
|
90
|
+
args: [root],
|
|
91
|
+
});
|
|
92
|
+
await publicClient.waitForTransactionReceipt({ hash });
|
|
93
|
+
return hash;
|
|
94
|
+
}
|
|
95
|
+
export async function cmdAnchor(opts) {
|
|
96
|
+
const agentId = resolveAgentId(opts);
|
|
97
|
+
const commitments = readCommitments(agentId);
|
|
98
|
+
const root = merkleRoot(commitments);
|
|
99
|
+
process.stdout.write(`Agent: ${agentId}\n`);
|
|
100
|
+
process.stdout.write(`Commitments: ${commitments.length}\n`);
|
|
101
|
+
process.stdout.write(`Merkle root: ${root}\n`);
|
|
102
|
+
if (commitments.length === 0) {
|
|
103
|
+
process.stdout.write("No audit entries found — nothing to anchor.\n");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const rpcUrl = process.env.CATP_RPC_URL;
|
|
107
|
+
const privateKey = process.env.CATP_PRIVATE_KEY;
|
|
108
|
+
const contractAddress = process.env.CATP_CONTRACT_ADDRESS;
|
|
109
|
+
if (opts.dryRun || !rpcUrl || !privateKey || !contractAddress) {
|
|
110
|
+
if (!opts.dryRun) {
|
|
111
|
+
process.stdout.write("\nSet CATP_RPC_URL, CATP_PRIVATE_KEY, and CATP_CONTRACT_ADDRESS to submit on-chain.\n");
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
process.stdout.write("\nDry run — skipping on-chain submission.\n");
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
process.stdout.write("Submitting to chain...\n");
|
|
119
|
+
const txHash = await submitOnChain(root, rpcUrl, privateKey, contractAddress);
|
|
120
|
+
process.stdout.write(`Transaction: ${txHash}\n`);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=anchor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../src/commands/anchor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface AuthorizationProofArtifact {
|
|
2
|
+
proofVersion: string;
|
|
3
|
+
policyCommitment: string;
|
|
4
|
+
publicInputs: string[];
|
|
5
|
+
actionData: string;
|
|
6
|
+
currentTimestamp: string | number;
|
|
7
|
+
cumulativeSpend: string | number;
|
|
8
|
+
value: string | number;
|
|
9
|
+
proof: string;
|
|
10
|
+
constraintCount?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface AuthorizationProofManifest {
|
|
13
|
+
manifestVersion: "catp_authorization_proof_manifest_v1";
|
|
14
|
+
proofVersion: "authorization_groth16_v1";
|
|
15
|
+
auditCommitment: string | null;
|
|
16
|
+
auditAgent: string | null;
|
|
17
|
+
policyCommitment: string;
|
|
18
|
+
publicInputs: string[];
|
|
19
|
+
actionData: string;
|
|
20
|
+
currentTimestamp: string;
|
|
21
|
+
cumulativeSpend: string;
|
|
22
|
+
value: string;
|
|
23
|
+
proof: string;
|
|
24
|
+
verifier: string | null;
|
|
25
|
+
agentAuthorizer: string | null;
|
|
26
|
+
chainId: string | null;
|
|
27
|
+
proofUrl: string | null;
|
|
28
|
+
sourceArtifact: string | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function buildAuthorizationProofManifest(artifact: AuthorizationProofArtifact, opts?: {
|
|
31
|
+
auditCommitment?: string;
|
|
32
|
+
auditAgent?: string;
|
|
33
|
+
verifier?: string;
|
|
34
|
+
agentAuthorizer?: string;
|
|
35
|
+
chainId?: string;
|
|
36
|
+
proofUrl?: string;
|
|
37
|
+
sourceArtifact?: string;
|
|
38
|
+
}): AuthorizationProofManifest;
|
|
39
|
+
export declare function validateAuthorizationProofManifest(manifest: AuthorizationProofManifest): void;
|
|
40
|
+
export declare function cmdProveAuthorization(opts: {
|
|
41
|
+
artifact?: string;
|
|
42
|
+
action?: string;
|
|
43
|
+
auditCommitment?: string;
|
|
44
|
+
agent?: string;
|
|
45
|
+
file?: string;
|
|
46
|
+
currentTimestamp?: string;
|
|
47
|
+
cumulativeSpend?: string;
|
|
48
|
+
artifactOut?: string;
|
|
49
|
+
witnessOut?: string;
|
|
50
|
+
proverScript?: string;
|
|
51
|
+
deployment?: string;
|
|
52
|
+
verifier?: string;
|
|
53
|
+
agentAuthorizer?: string;
|
|
54
|
+
chainId?: string;
|
|
55
|
+
proofUrl?: string;
|
|
56
|
+
out?: string;
|
|
57
|
+
}): void;
|
|
58
|
+
export declare function readDeploymentMetadata(path: string): {
|
|
59
|
+
verifier?: string;
|
|
60
|
+
agentAuthorizer?: string;
|
|
61
|
+
chainId?: string;
|
|
62
|
+
};
|
|
63
|
+
export declare function cmdVerifyAuthorization(opts: {
|
|
64
|
+
manifest?: string;
|
|
65
|
+
checkAudit?: boolean;
|
|
66
|
+
auditAgent?: string;
|
|
67
|
+
}): void;
|
|
68
|
+
//# sourceMappingURL=authorization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/commands/authorization.ts"],"names":[],"mappings":"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"}
|