@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.
- package/dist/audit/durable.d.ts +87 -0
- package/dist/audit/durable.d.ts.map +1 -0
- package/dist/audit/durable.js +285 -0
- package/dist/audit/durable.js.map +1 -0
- package/dist/audit/logger.d.ts +80 -5
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/audit/logger.js +199 -20
- package/dist/audit/logger.js.map +1 -1
- package/dist/audit/paths.d.ts +11 -0
- package/dist/audit/paths.d.ts.map +1 -1
- package/dist/audit/paths.js +19 -0
- package/dist/audit/paths.js.map +1 -1
- package/dist/audit/verifier.d.ts +9 -0
- package/dist/audit/verifier.d.ts.map +1 -1
- package/dist/audit/verifier.js +70 -18
- package/dist/audit/verifier.js.map +1 -1
- package/dist/cli.js +18 -12
- package/dist/cli.js.map +1 -1
- package/dist/commands/authorization.js +6 -0
- package/dist/commands/authorization.js.map +1 -1
- package/dist/commands/log.d.ts +51 -1
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +110 -22
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/receipt.d.ts +71 -1
- package/dist/commands/receipt.d.ts.map +1 -1
- package/dist/commands/receipt.js +354 -72
- package/dist/commands/receipt.js.map +1 -1
- package/dist/enforcement/core.d.ts +10 -4
- package/dist/enforcement/core.d.ts.map +1 -1
- package/dist/enforcement/core.js +40 -4
- package/dist/enforcement/core.js.map +1 -1
- package/dist/evidence/canonical.d.ts +22 -0
- package/dist/evidence/canonical.d.ts.map +1 -0
- package/dist/evidence/canonical.js +45 -0
- package/dist/evidence/canonical.js.map +1 -0
- package/dist/evidence/commitments.d.ts +46 -0
- package/dist/evidence/commitments.d.ts.map +1 -0
- package/dist/evidence/commitments.js +52 -0
- package/dist/evidence/commitments.js.map +1 -0
- package/dist/hook/post.d.ts +6 -0
- package/dist/hook/post.d.ts.map +1 -1
- package/dist/hook/post.js +1 -1
- package/dist/hook/post.js.map +1 -1
- package/dist/hook/pre.d.ts +6 -0
- package/dist/hook/pre.d.ts.map +1 -1
- package/dist/hook/pre.js +4 -1
- package/dist/hook/pre.js.map +1 -1
- package/dist/policy/types.d.ts +25 -2
- package/dist/policy/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/enforcement/core.js
CHANGED
|
@@ -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
|
|
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
|
|
18
|
-
auditEntry
|
|
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;
|
|
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"}
|
package/dist/hook/post.d.ts
CHANGED
|
@@ -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
|
package/dist/hook/post.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/hook/post.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/hook/pre.d.ts
CHANGED
|
@@ -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;
|
package/dist/hook/pre.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
package/dist/hook/pre.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre.js","sourceRoot":"","sources":["../../src/hook/pre.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,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"pre.js","sourceRoot":"","sources":["../../src/hook/pre.ts"],"names":[],"mappings":"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"}
|
package/dist/policy/types.d.ts
CHANGED
|
@@ -16,8 +16,11 @@ export interface CatpPolicy {
|
|
|
16
16
|
authorization?: AuthorizationConfig;
|
|
17
17
|
}
|
|
18
18
|
import type { RuntimePhase } from "../runtime/types.js";
|
|
19
|
-
|
|
20
|
-
|
|
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,
|
|
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
|
+
"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",
|