@catp-protocol/cli 0.7.3 → 0.7.5

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 (51) hide show
  1. package/dist/audit/durable.d.ts +87 -0
  2. package/dist/audit/durable.d.ts.map +1 -0
  3. package/dist/audit/durable.js +285 -0
  4. package/dist/audit/durable.js.map +1 -0
  5. package/dist/audit/logger.d.ts +80 -5
  6. package/dist/audit/logger.d.ts.map +1 -1
  7. package/dist/audit/logger.js +199 -20
  8. package/dist/audit/logger.js.map +1 -1
  9. package/dist/audit/paths.d.ts +11 -0
  10. package/dist/audit/paths.d.ts.map +1 -1
  11. package/dist/audit/paths.js +19 -0
  12. package/dist/audit/paths.js.map +1 -1
  13. package/dist/audit/verifier.d.ts +9 -0
  14. package/dist/audit/verifier.d.ts.map +1 -1
  15. package/dist/audit/verifier.js +70 -18
  16. package/dist/audit/verifier.js.map +1 -1
  17. package/dist/cli.js +18 -12
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/authorization.js +6 -0
  20. package/dist/commands/authorization.js.map +1 -1
  21. package/dist/commands/log.d.ts +51 -1
  22. package/dist/commands/log.d.ts.map +1 -1
  23. package/dist/commands/log.js +110 -22
  24. package/dist/commands/log.js.map +1 -1
  25. package/dist/commands/receipt.d.ts +71 -1
  26. package/dist/commands/receipt.d.ts.map +1 -1
  27. package/dist/commands/receipt.js +354 -72
  28. package/dist/commands/receipt.js.map +1 -1
  29. package/dist/enforcement/core.d.ts +10 -4
  30. package/dist/enforcement/core.d.ts.map +1 -1
  31. package/dist/enforcement/core.js +40 -4
  32. package/dist/enforcement/core.js.map +1 -1
  33. package/dist/evidence/canonical.d.ts +22 -0
  34. package/dist/evidence/canonical.d.ts.map +1 -0
  35. package/dist/evidence/canonical.js +45 -0
  36. package/dist/evidence/canonical.js.map +1 -0
  37. package/dist/evidence/commitments.d.ts +46 -0
  38. package/dist/evidence/commitments.d.ts.map +1 -0
  39. package/dist/evidence/commitments.js +52 -0
  40. package/dist/evidence/commitments.js.map +1 -0
  41. package/dist/hook/post.d.ts +6 -0
  42. package/dist/hook/post.d.ts.map +1 -1
  43. package/dist/hook/post.js +1 -1
  44. package/dist/hook/post.js.map +1 -1
  45. package/dist/hook/pre.d.ts +6 -0
  46. package/dist/hook/pre.d.ts.map +1 -1
  47. package/dist/hook/pre.js +4 -1
  48. package/dist/hook/pre.js.map +1 -1
  49. package/dist/policy/types.d.ts +25 -2
  50. package/dist/policy/types.d.ts.map +1 -1
  51. package/package.json +1 -1
@@ -1,21 +1,57 @@
1
1
  import { buildEntry } from "../audit/logger.js";
2
2
  import { evaluate } from "../policy/engine.js";
3
+ import { canonicalizeToolAction, computeActionCommitment, computePolicyCommitment, } from "../evidence/commitments.js";
4
+ /**
5
+ * Fail closed if the canonical action evidence does not hash to the commitment
6
+ * recorded in the audit entry. This prevents pairing an entry with a different
7
+ * sidecar and is re-checked at the storage boundary before persistence.
8
+ */
9
+ function assertActionBinding(action, auditEntry) {
10
+ if (computeActionCommitment(action) !== auditEntry.action_commitment) {
11
+ throw new Error("internal error: action evidence does not match audit entry binding");
12
+ }
13
+ }
3
14
  export function evaluatePreAction(policy, action, prevCommitment = "0") {
4
15
  const decision = evaluate(policy, action);
5
16
  const ruleName = decision.rule
6
17
  ? `${decision.rule.tool}:${decision.rule.allow ? "allow" : "deny"}`
7
18
  : null;
19
+ // Bind the decision to the exact policy and complete action used at
20
+ // enforcement time. Both commitments are computed here, from the normalized
21
+ // policy passed to the engine and the canonicalized action, never recomputed
22
+ // later from mutable files.
23
+ const preAction = { ...action, phase: "pre" };
24
+ const canonical = canonicalizeToolAction(preAction);
25
+ const bindings = {
26
+ reason: decision.reason,
27
+ policyCommitment: computePolicyCommitment(policy),
28
+ actionCommitment: computeActionCommitment(canonical),
29
+ };
30
+ const auditEntry = buildEntry(preAction, decision.allow ? "allow" : "deny", ruleName, prevCommitment, bindings);
31
+ assertActionBinding(canonical, auditEntry);
8
32
  return {
9
33
  allow: decision.allow,
10
34
  reason: decision.reason,
11
- auditEntry: buildEntry({ ...action, phase: "pre" }, decision.allow ? "allow" : "deny", ruleName, prevCommitment),
35
+ auditEntry,
36
+ action: canonical,
12
37
  };
13
38
  }
14
- export function recordPostAction(action, prevCommitment = "0") {
39
+ export function recordPostAction(policy, action, prevCommitment = "0") {
40
+ const reason = "post-action audit record";
41
+ const postAction = { ...action, phase: "post" };
42
+ const canonical = canonicalizeToolAction(postAction);
43
+ const bindings = {
44
+ reason,
45
+ policyCommitment: computePolicyCommitment(policy),
46
+ actionCommitment: computeActionCommitment(canonical),
47
+ };
48
+ const auditEntry = buildEntry(postAction, "allow", null, prevCommitment, bindings);
49
+ assertActionBinding(canonical, auditEntry);
15
50
  return {
16
51
  allow: true,
17
- reason: "post-action audit record",
18
- auditEntry: buildEntry({ ...action, phase: "post" }, "allow", null, prevCommitment),
52
+ reason,
53
+ auditEntry,
54
+ action: canonical,
19
55
  };
20
56
  }
21
57
  //# sourceMappingURL=core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/enforcement/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAW/C,MAAM,UAAU,iBAAiB,CAC/B,MAAkB,EAClB,MAAkB,EAClB,iBAAyB,GAAG;IAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI;QAC5B,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE;QACnE,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,UAAU,CACpB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAC3B,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EACjC,QAAQ,EACR,cAAc,CACf;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAkB,EAClB,iBAAyB,GAAG;IAE5B,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,0BAA0B;QAClC,UAAU,EAAE,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC;KACpF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/enforcement/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,GAExB,MAAM,4BAA4B,CAAC;AAgBpC;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAA6B,EAAE,UAAwB;IAClF,IAAI,uBAAuB,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAkB,EAClB,MAAkB,EAClB,iBAAyB,GAAG;IAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI;QAC5B,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE;QACnE,CAAC,CAAC,IAAI,CAAC;IAET,oEAAoE;IACpE,4EAA4E;IAC5E,6EAA6E;IAC7E,4BAA4B;IAC5B,MAAM,SAAS,GAAe,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,gBAAgB,EAAE,uBAAuB,CAAC,MAAM,CAAC;QACjD,gBAAgB,EAAE,uBAAuB,CAAC,SAAS,CAAC;KACrD,CAAC;IACF,MAAM,UAAU,GAAG,UAAU,CAC3B,SAAS,EACT,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EACjC,QAAQ,EACR,cAAc,EACd,QAAQ,CACT,CAAC;IACF,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU;QACV,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAkB,EAClB,MAAkB,EAClB,iBAAyB,GAAG;IAE5B,MAAM,MAAM,GAAG,0BAA0B,CAAC;IAC1C,MAAM,UAAU,GAAe,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG;QACf,MAAM;QACN,gBAAgB,EAAE,uBAAuB,CAAC,MAAM,CAAC;QACjD,gBAAgB,EAAE,uBAAuB,CAAC,SAAS,CAAC;KACrD,CAAC;IACF,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IACnF,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE3C,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM;QACN,UAAU;QACV,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Deterministic ("stable") JSON serialization shared by every CATP security
3
+ * commitment and by audit export hashing.
4
+ *
5
+ * Behavior:
6
+ * - Object keys are sorted recursively using the default `Array.prototype.sort`
7
+ * order (UTF-16 code units), matching the historical audit-export serializer.
8
+ * - Array element order is preserved.
9
+ * - Output is UTF-8 with no insignificant whitespace unless `spaces` > 0.
10
+ * - Non-JSON numeric values (NaN, +Infinity, -Infinity) are REJECTED rather than
11
+ * silently coerced to `null` by `JSON.stringify`. A commitment must never
12
+ * quietly hash different evidence than the value the caller intended.
13
+ *
14
+ * Byte-compatibility: for every valid JSON input the output is identical to the
15
+ * historical `stableStringify` previously defined in `commands/log.ts`, so
16
+ * existing `catp_audit_export_v1` bundles and `catp_authorization_receipt_v1`
17
+ * signatures continue to verify unchanged.
18
+ */
19
+ export declare function stableStringify(value: unknown, spaces?: number): string;
20
+ /** SHA-256 hex digest over the UTF-8 bytes of `input`. */
21
+ export declare function sha256Hex(input: string): string;
22
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/evidence/canonical.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,GAAG,MAAM,CAElE;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,45 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * Deterministic ("stable") JSON serialization shared by every CATP security
4
+ * commitment and by audit export hashing.
5
+ *
6
+ * Behavior:
7
+ * - Object keys are sorted recursively using the default `Array.prototype.sort`
8
+ * order (UTF-16 code units), matching the historical audit-export serializer.
9
+ * - Array element order is preserved.
10
+ * - Output is UTF-8 with no insignificant whitespace unless `spaces` > 0.
11
+ * - Non-JSON numeric values (NaN, +Infinity, -Infinity) are REJECTED rather than
12
+ * silently coerced to `null` by `JSON.stringify`. A commitment must never
13
+ * quietly hash different evidence than the value the caller intended.
14
+ *
15
+ * Byte-compatibility: for every valid JSON input the output is identical to the
16
+ * historical `stableStringify` previously defined in `commands/log.ts`, so
17
+ * existing `catp_audit_export_v1` bundles and `catp_authorization_receipt_v1`
18
+ * signatures continue to verify unchanged.
19
+ */
20
+ export function stableStringify(value, spaces = 0) {
21
+ return JSON.stringify(sortAndValidate(value), null, spaces);
22
+ }
23
+ /** SHA-256 hex digest over the UTF-8 bytes of `input`. */
24
+ export function sha256Hex(input) {
25
+ return createHash("sha256").update(input, "utf8").digest("hex");
26
+ }
27
+ function sortAndValidate(value) {
28
+ if (Array.isArray(value)) {
29
+ return value.map(sortAndValidate);
30
+ }
31
+ if (typeof value === "number") {
32
+ if (!Number.isFinite(value)) {
33
+ throw new Error(`cannot canonicalize non-JSON numeric value: ${String(value)}`);
34
+ }
35
+ return value;
36
+ }
37
+ if (value && typeof value === "object") {
38
+ const record = value;
39
+ return Object.fromEntries(Object.keys(record)
40
+ .sort()
41
+ .map((key) => [key, sortAndValidate(record[key])]));
42
+ }
43
+ return value;
44
+ }
45
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/evidence/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,MAAM,GAAG,CAAC;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAChB,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACrD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { ToolAction } from "../runtime/types.js";
2
+ import type { CatpPolicy } from "../policy/types.js";
3
+ /**
4
+ * The exact, normalized action evidence CATP binds a decision to.
5
+ *
6
+ * This is the adapter-normalized `ToolAction` projected onto security-relevant
7
+ * fields. The runtime-specific `raw` payload is deliberately excluded: it may
8
+ * carry noise and secrets and is never part of a commitment.
9
+ */
10
+ export interface CanonicalToolActionV1 {
11
+ schema: "catp_tool_action_v1";
12
+ runtime: ToolAction["runtime"];
13
+ phase: ToolAction["phase"];
14
+ /** Present only when the runtime supplied a session id; absent otherwise. */
15
+ session_id?: string;
16
+ tool_name: string;
17
+ tool_input: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Project a runtime `ToolAction` onto its canonical evidence form.
21
+ *
22
+ * The optional `session_id` is omitted entirely when absent so it does not
23
+ * participate in the commitment as an explicit `undefined`/`null`.
24
+ */
25
+ export declare function canonicalizeToolAction(action: ToolAction): CanonicalToolActionV1;
26
+ /**
27
+ * action_commitment = SHA256("catp:action:v1\n" || stable_json(canonical_action))
28
+ *
29
+ * Accepts the canonical evidence form (the object persisted as the action
30
+ * sidecar) so enforcement, export, and receipt verification all hash the exact
31
+ * same bytes.
32
+ */
33
+ export declare function computeActionCommitment(canonical: CanonicalToolActionV1): string;
34
+ /**
35
+ * policy_commitment = SHA256("catp:policy:v1\n" || stable_json(normalized_policy))
36
+ *
37
+ * The normalized policy is the `CatpPolicy` returned by the loader at the same
38
+ * enforcement invocation that produced the decision.
39
+ *
40
+ * Determinism caveat: `stableStringify` sorts object keys but PRESERVES array
41
+ * order. The caller MUST pass a policy whose array fields (notably `rules`) are
42
+ * in a deterministic order, otherwise the same TOML can yield different
43
+ * commitments across invocations.
44
+ */
45
+ export declare function computePolicyCommitment(policy: CatpPolicy): string;
46
+ //# sourceMappingURL=commitments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitments.d.ts","sourceRoot":"","sources":["../../src/evidence/commitments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAUD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,qBAAqB,CAYhF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,qBAAqB,GAAG,MAAM,CAEhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAElE"}
@@ -0,0 +1,52 @@
1
+ import { stableStringify, sha256Hex } from "./canonical.js";
2
+ /**
3
+ * Domain separators. Every commitment is SHA-256 over a fixed ASCII domain
4
+ * string followed by the canonical JSON bytes, so identical content under
5
+ * different roles can never collide across domains.
6
+ */
7
+ const ACTION_DOMAIN = "catp:action:v1\n";
8
+ const POLICY_DOMAIN = "catp:policy:v1\n";
9
+ /**
10
+ * Project a runtime `ToolAction` onto its canonical evidence form.
11
+ *
12
+ * The optional `session_id` is omitted entirely when absent so it does not
13
+ * participate in the commitment as an explicit `undefined`/`null`.
14
+ */
15
+ export function canonicalizeToolAction(action) {
16
+ const canonical = {
17
+ schema: "catp_tool_action_v1",
18
+ runtime: action.runtime,
19
+ phase: action.phase,
20
+ tool_name: action.toolName,
21
+ tool_input: action.toolInput,
22
+ };
23
+ if (typeof action.sessionId === "string") {
24
+ canonical.session_id = action.sessionId;
25
+ }
26
+ return canonical;
27
+ }
28
+ /**
29
+ * action_commitment = SHA256("catp:action:v1\n" || stable_json(canonical_action))
30
+ *
31
+ * Accepts the canonical evidence form (the object persisted as the action
32
+ * sidecar) so enforcement, export, and receipt verification all hash the exact
33
+ * same bytes.
34
+ */
35
+ export function computeActionCommitment(canonical) {
36
+ return sha256Hex(ACTION_DOMAIN + stableStringify(canonical));
37
+ }
38
+ /**
39
+ * policy_commitment = SHA256("catp:policy:v1\n" || stable_json(normalized_policy))
40
+ *
41
+ * The normalized policy is the `CatpPolicy` returned by the loader at the same
42
+ * enforcement invocation that produced the decision.
43
+ *
44
+ * Determinism caveat: `stableStringify` sorts object keys but PRESERVES array
45
+ * order. The caller MUST pass a policy whose array fields (notably `rules`) are
46
+ * in a deterministic order, otherwise the same TOML can yield different
47
+ * commitments across invocations.
48
+ */
49
+ export function computePolicyCommitment(policy) {
50
+ return sha256Hex(POLICY_DOMAIN + stableStringify(policy));
51
+ }
52
+ //# sourceMappingURL=commitments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitments.js","sourceRoot":"","sources":["../../src/evidence/commitments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAmB5D;;;;GAIG;AACH,MAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAkB;IACvD,MAAM,SAAS,GAA0B;QACvC,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,UAAU,EAAE,MAAM,CAAC,SAAS;KAC7B,CAAC;IACF,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACzC,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAgC;IACtE,OAAO,SAAS,CAAC,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAkB;IACxD,OAAO,SAAS,CAAC,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -1,6 +1,12 @@
1
+ import type { AuditStorage } from "../audit/durable.js";
1
2
  import type { RuntimeAdapter } from "../runtime/types.js";
2
3
  export interface HookOptions {
3
4
  adapter?: RuntimeAdapter;
5
+ /**
6
+ * Test seam for injecting audit-storage failures. CLI execution leaves this
7
+ * undefined so the logger always uses the fsync-backed nodeAuditStorage.
8
+ */
9
+ storage?: AuditStorage;
4
10
  }
5
11
  export declare function runPostHook(opts?: HookOptions): Promise<void>;
6
12
  //# sourceMappingURL=post.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/hook/post.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAsB,WAAW,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BvE"}
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/hook/post.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,wBAAsB,WAAW,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BvE"}
package/dist/hook/post.js CHANGED
@@ -22,7 +22,7 @@ export async function runPostHook(opts = {}) {
22
22
  }
23
23
  // PostToolUse always records allow — the action already executed
24
24
  try {
25
- appendChainedAuditEntry(policy.agent.id, (prev) => recordPostAction(action, prev));
25
+ appendChainedAuditEntry(policy.agent.id, (prev) => recordPostAction(policy, action, prev), opts.storage);
26
26
  }
27
27
  catch {
28
28
  // Audit log failure must not block the agent
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/hook/post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB,EAAE;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC;QACH,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/hook/post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAW1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB,EAAE;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC;QACH,uBAAuB,CACrB,MAAM,CAAC,KAAK,CAAC,EAAE,EACf,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAChD,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -1,7 +1,13 @@
1
+ import type { AuditStorage } from "../audit/durable.js";
1
2
  import type { RuntimeAdapter } from "../runtime/types.js";
2
3
  export interface HookOptions {
3
4
  adapter?: RuntimeAdapter;
4
5
  startDir?: string;
6
+ /**
7
+ * Test seam for injecting audit-storage failures. CLI execution leaves this
8
+ * undefined so the logger always uses the fsync-backed nodeAuditStorage.
9
+ */
10
+ storage?: AuditStorage;
5
11
  }
6
12
  export interface PreHookOutcome {
7
13
  exitCode: 0 | 2;
@@ -1 +1 @@
1
- {"version":3,"file":"pre.d.ts","sourceRoot":"","sources":["../../src/hook/pre.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,cAAc,CAqDxF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQrF;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtE"}
1
+ {"version":3,"file":"pre.d.ts","sourceRoot":"","sources":["../../src/hook/pre.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,cAAc,CA0DxF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQrF;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtE"}
package/dist/hook/pre.js CHANGED
@@ -36,7 +36,7 @@ export function evaluatePreHookInput(raw, opts = {}) {
36
36
  };
37
37
  }
38
38
  try {
39
- const result = appendChainedAuditEntry(policy.agent.id, (prev) => evaluatePreAction(policy, action, prev));
39
+ const result = appendChainedAuditEntry(policy.agent.id, (prev) => evaluatePreAction(policy, action, prev), opts.storage);
40
40
  return {
41
41
  exitCode: result.allow ? 0 : 2,
42
42
  policyFound: true,
@@ -45,6 +45,9 @@ export function evaluatePreHookInput(raw, opts = {}) {
45
45
  };
46
46
  }
47
47
  catch (err) {
48
+ // Fail closed: if the action sidecar, audit append, or any fsync failed, the
49
+ // decision was not durably recorded, so it must not be returned as a
50
+ // successful allow/deny. Surface a concise internal error and exit 2.
48
51
  return {
49
52
  exitCode: 2,
50
53
  policyFound: true,
@@ -1 +1 @@
1
- {"version":3,"file":"pre.js","sourceRoot":"","sources":["../../src/hook/pre.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pre.js","sourceRoot":"","sources":["../../src/hook/pre.ts"],"names":[],"mappings":"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"}
@@ -16,8 +16,11 @@ export interface CatpPolicy {
16
16
  authorization?: AuthorizationConfig;
17
17
  }
18
18
  import type { RuntimePhase } from "../runtime/types.js";
19
- export interface AuditEntry {
20
- commitment_version?: 1 | 2 | 3;
19
+ /**
20
+ * Fields common to every audit entry version. These are the only fields that
21
+ * may be accessed without first narrowing the entry to a specific version.
22
+ */
23
+ export interface AuditEntryBase {
21
24
  phase?: RuntimePhase;
22
25
  ts: string;
23
26
  tool: string;
@@ -27,6 +30,26 @@ export interface AuditEntry {
27
30
  input_summary: string;
28
31
  authorization?: AuthorizationAction;
29
32
  }
33
+ /**
34
+ * Legacy audit entries (commitment versions 1--3). They remain verifiable for
35
+ * compatibility with existing logs, but they carry NO enforcement-time
36
+ * policy/action binding and can never be upgraded into one.
37
+ */
38
+ export interface AuditEntryLegacy extends AuditEntryBase {
39
+ commitment_version?: 1 | 2 | 3;
40
+ }
41
+ /**
42
+ * Version-4 audit entry: binds the decision to the exact policy and complete
43
+ * normalized action used at enforcement time. Every binding field is required;
44
+ * `input_summary` remains for display only and is never the action binding.
45
+ */
46
+ export interface AuditEntryV4 extends AuditEntryBase {
47
+ commitment_version: 4;
48
+ reason: string;
49
+ policy_commitment: string;
50
+ action_commitment: string;
51
+ }
52
+ export type AuditEntry = AuditEntryLegacy | AuditEntryV4;
30
53
  export interface AuthorizationConfig {
31
54
  allowed_action: string;
32
55
  allowed_protocol: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/policy/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,kBAAkB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/policy/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,kBAAkB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,kBAAkB,EAAE,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@catp-protocol/cli",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "description": "Cryptographic Agent Trust Protocol — local enforcement plugin for Claude Code and OpenAI Codex CLI with TOML policy and tamper-evident audit log",
5
5
  "keywords": [
6
6
  "claude-code",