@kya-os/mcp 1.10.1 → 1.12.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/AUDITABILITY.md +441 -0
- package/CHANGELOG.md +108 -0
- package/CONFORMANCE.md +600 -0
- package/README.md +69 -6
- package/SPEC.md +1820 -0
- package/dist/audit/adapters/legacy-audit-log.d.ts +20 -0
- package/dist/audit/adapters/legacy-audit-log.d.ts.map +1 -0
- package/dist/audit/adapters/legacy-audit-log.js +56 -0
- package/dist/audit/adapters/legacy-audit-log.js.map +1 -0
- package/dist/audit/adapters/mcp.d.ts +105 -0
- package/dist/audit/adapters/mcp.d.ts.map +1 -0
- package/dist/audit/adapters/mcp.js +213 -0
- package/dist/audit/adapters/mcp.js.map +1 -0
- package/dist/audit/assurance.d.ts +22 -0
- package/dist/audit/assurance.d.ts.map +1 -0
- package/dist/audit/assurance.js +39 -0
- package/dist/audit/assurance.js.map +1 -0
- package/dist/audit/checkpoint-coordinator.d.ts +51 -0
- package/dist/audit/checkpoint-coordinator.d.ts.map +1 -0
- package/dist/audit/checkpoint-coordinator.js +112 -0
- package/dist/audit/checkpoint-coordinator.js.map +1 -0
- package/dist/audit/checkpoint.d.ts +59 -0
- package/dist/audit/checkpoint.d.ts.map +1 -0
- package/dist/audit/checkpoint.js +219 -0
- package/dist/audit/checkpoint.js.map +1 -0
- package/dist/audit/cli.d.ts +8 -0
- package/dist/audit/cli.d.ts.map +1 -0
- package/dist/audit/cli.js +85 -0
- package/dist/audit/cli.js.map +1 -0
- package/dist/audit/crypto.d.ts +37 -0
- package/dist/audit/crypto.d.ts.map +1 -0
- package/dist/audit/crypto.js +68 -0
- package/dist/audit/crypto.js.map +1 -0
- package/dist/audit/errors.d.ts +29 -0
- package/dist/audit/errors.d.ts.map +1 -0
- package/dist/audit/errors.js +33 -0
- package/dist/audit/errors.js.map +1 -0
- package/dist/audit/evidence.d.ts +45 -0
- package/dist/audit/evidence.d.ts.map +1 -0
- package/dist/audit/evidence.js +151 -0
- package/dist/audit/evidence.js.map +1 -0
- package/dist/audit/index.d.ts +30 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +30 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/integrity.d.ts +19 -0
- package/dist/audit/integrity.d.ts.map +1 -0
- package/dist/audit/integrity.js +64 -0
- package/dist/audit/integrity.js.map +1 -0
- package/dist/audit/merkle.d.ts +31 -0
- package/dist/audit/merkle.d.ts.map +1 -0
- package/dist/audit/merkle.js +195 -0
- package/dist/audit/merkle.js.map +1 -0
- package/dist/audit/mirror-service.d.ts +19 -0
- package/dist/audit/mirror-service.d.ts.map +1 -0
- package/dist/audit/mirror-service.js +54 -0
- package/dist/audit/mirror-service.js.map +1 -0
- package/dist/audit/projection.d.ts +90 -0
- package/dist/audit/projection.d.ts.map +1 -0
- package/dist/audit/projection.js +142 -0
- package/dist/audit/projection.js.map +1 -0
- package/dist/audit/providers/anchor.d.ts +23 -0
- package/dist/audit/providers/anchor.d.ts.map +1 -0
- package/dist/audit/providers/anchor.js +25 -0
- package/dist/audit/providers/anchor.js.map +1 -0
- package/dist/audit/providers/evidence.d.ts +36 -0
- package/dist/audit/providers/evidence.d.ts.map +1 -0
- package/dist/audit/providers/evidence.js +2 -0
- package/dist/audit/providers/evidence.js.map +1 -0
- package/dist/audit/providers/journal.d.ts +35 -0
- package/dist/audit/providers/journal.d.ts.map +1 -0
- package/dist/audit/providers/journal.js +2 -0
- package/dist/audit/providers/journal.js.map +1 -0
- package/dist/audit/providers/memory-journal.d.ts +24 -0
- package/dist/audit/providers/memory-journal.d.ts.map +1 -0
- package/dist/audit/providers/memory-journal.js +73 -0
- package/dist/audit/providers/memory-journal.js.map +1 -0
- package/dist/audit/providers/observer.d.ts +30 -0
- package/dist/audit/providers/observer.d.ts.map +1 -0
- package/dist/audit/providers/observer.js +100 -0
- package/dist/audit/providers/observer.js.map +1 -0
- package/dist/audit/providers/outbox.d.ts +37 -0
- package/dist/audit/providers/outbox.d.ts.map +1 -0
- package/dist/audit/providers/outbox.js +52 -0
- package/dist/audit/providers/outbox.js.map +1 -0
- package/dist/audit/providers/recorder-client.d.ts +22 -0
- package/dist/audit/providers/recorder-client.d.ts.map +1 -0
- package/dist/audit/providers/recorder-client.js +17 -0
- package/dist/audit/providers/recorder-client.js.map +1 -0
- package/dist/audit/providers/source-state.d.ts +37 -0
- package/dist/audit/providers/source-state.d.ts.map +1 -0
- package/dist/audit/providers/source-state.js +94 -0
- package/dist/audit/providers/source-state.js.map +1 -0
- package/dist/audit/read-contract.d.ts +445 -0
- package/dist/audit/read-contract.d.ts.map +1 -0
- package/dist/audit/read-contract.js +126 -0
- package/dist/audit/read-contract.js.map +1 -0
- package/dist/audit/read-service.d.ts +99 -0
- package/dist/audit/read-service.d.ts.map +1 -0
- package/dist/audit/read-service.js +124 -0
- package/dist/audit/read-service.js.map +1 -0
- package/dist/audit/recorder-service.d.ts +78 -0
- package/dist/audit/recorder-service.d.ts.map +1 -0
- package/dist/audit/recorder-service.js +331 -0
- package/dist/audit/recorder-service.js.map +1 -0
- package/dist/audit/reference-recorder.d.ts +43 -0
- package/dist/audit/reference-recorder.d.ts.map +1 -0
- package/dist/audit/reference-recorder.js +131 -0
- package/dist/audit/reference-recorder.js.map +1 -0
- package/dist/audit/replay-bundle.d.ts +52 -0
- package/dist/audit/replay-bundle.d.ts.map +1 -0
- package/dist/audit/replay-bundle.js +551 -0
- package/dist/audit/replay-bundle.js.map +1 -0
- package/dist/audit/schemas.d.ts +1145 -0
- package/dist/audit/schemas.d.ts.map +1 -0
- package/dist/audit/schemas.js +483 -0
- package/dist/audit/schemas.js.map +1 -0
- package/dist/audit/service.d.ts +91 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +222 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/audit/testing/index.d.ts +2 -0
- package/dist/audit/testing/index.d.ts.map +1 -0
- package/dist/audit/testing/index.js +2 -0
- package/dist/audit/testing/index.js.map +1 -0
- package/dist/audit/testing/provider-contracts.d.ts +51 -0
- package/dist/audit/testing/provider-contracts.d.ts.map +1 -0
- package/dist/audit/testing/provider-contracts.js +391 -0
- package/dist/audit/testing/provider-contracts.js.map +1 -0
- package/dist/audit/types.d.ts +356 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +49 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/verifier.d.ts +73 -0
- package/dist/audit/verifier.d.ts.map +1 -0
- package/dist/audit/verifier.js +322 -0
- package/dist/audit/verifier.js.map +1 -0
- package/dist/card/builder.d.ts +1 -1
- package/dist/card/builder.js +1 -1
- package/dist/card/emit.d.ts +3 -3
- package/dist/card/emit.d.ts.map +1 -1
- package/dist/card/emit.js.map +1 -1
- package/dist/card/index.d.ts +1 -1
- package/dist/card/index.js +1 -1
- package/dist/card/middleware.d.ts +6 -4
- package/dist/card/middleware.d.ts.map +1 -1
- package/dist/card/middleware.js +11 -7
- package/dist/card/middleware.js.map +1 -1
- package/dist/card/proof/build.d.ts +3 -3
- package/dist/card/proof/build.js +3 -3
- package/dist/card/proof/canonical.d.ts.map +1 -1
- package/dist/card/proof/canonical.js +19 -1
- package/dist/card/proof/canonical.js.map +1 -1
- package/dist/card/proof/http-sig.d.ts +1 -1
- package/dist/card/proof/http-sig.js +1 -1
- package/dist/card/proof/index.d.ts +2 -2
- package/dist/card/proof/index.js +2 -2
- package/dist/card/proof/nonce-cache.d.ts +1 -1
- package/dist/card/proof/nonce-cache.js +1 -1
- package/dist/card/proof/types.d.ts +16 -7
- package/dist/card/proof/types.d.ts.map +1 -1
- package/dist/card/proof/types.js +16 -7
- package/dist/card/proof/types.js.map +1 -1
- package/dist/card/proof/verify.d.ts +2 -2
- package/dist/card/proof/verify.js +2 -2
- package/dist/card/schema.d.ts +14 -6
- package/dist/card/schema.d.ts.map +1 -1
- package/dist/card/schema.js +14 -3
- package/dist/card/schema.js.map +1 -1
- package/dist/card/verify.d.ts +1 -1
- package/dist/card/verify.d.ts.map +1 -1
- package/dist/delegation/delegation-graph.d.ts +4 -0
- package/dist/delegation/delegation-graph.d.ts.map +1 -1
- package/dist/delegation/delegation-graph.js +28 -2
- package/dist/delegation/delegation-graph.js.map +1 -1
- package/dist/delegation/statuslist-manager.d.ts +5 -0
- package/dist/delegation/statuslist-manager.d.ts.map +1 -1
- package/dist/delegation/statuslist-manager.js.map +1 -1
- package/dist/delegation/storage/memory-graph-storage.d.ts +4 -2
- package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -1
- package/dist/delegation/storage/memory-graph-storage.js +18 -0
- package/dist/delegation/storage/memory-graph-storage.js.map +1 -1
- package/dist/delegation/storage/memory-statuslist-storage.d.ts +5 -2
- package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -1
- package/dist/delegation/storage/memory-statuslist-storage.js +21 -2
- package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -1
- package/dist/delegation/utils.d.ts.map +1 -1
- package/dist/delegation/utils.js +2 -42
- package/dist/delegation/utils.js.map +1 -1
- package/dist/delegation/vc-verification-checks.d.ts.map +1 -1
- package/dist/delegation/vc-verification-checks.js +16 -1
- package/dist/delegation/vc-verification-checks.js.map +1 -1
- package/dist/delegation/vc-verifier.d.ts +4 -0
- package/dist/delegation/vc-verifier.d.ts.map +1 -1
- package/dist/delegation/vc-verifier.js +44 -13
- package/dist/delegation/vc-verifier.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/extension/declaration.d.ts +60 -0
- package/dist/extension/declaration.d.ts.map +1 -0
- package/dist/extension/declaration.js +75 -0
- package/dist/extension/declaration.js.map +1 -0
- package/dist/extension/gate.d.ts +110 -0
- package/dist/extension/gate.d.ts.map +1 -0
- package/dist/extension/gate.js +133 -0
- package/dist/extension/gate.js.map +1 -0
- package/dist/extension/index.d.ts +14 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/index.js +14 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/settings.d.ts +70 -0
- package/dist/extension/settings.d.ts.map +1 -0
- package/dist/extension/settings.js +96 -0
- package/dist/extension/settings.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/kya-os-transport.d.ts +1 -1
- package/dist/middleware/kya-os-transport.d.ts.map +1 -1
- package/dist/middleware/kya-os-transport.js +11 -4
- package/dist/middleware/kya-os-transport.js.map +1 -1
- package/dist/middleware/with-kya-os-server.d.ts +6 -0
- package/dist/middleware/with-kya-os-server.d.ts.map +1 -1
- package/dist/middleware/with-kya-os-server.js +2 -0
- package/dist/middleware/with-kya-os-server.js.map +1 -1
- package/dist/middleware/with-kya-os.config-types.d.ts +15 -0
- package/dist/middleware/with-kya-os.config-types.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.config-types.js.map +1 -1
- package/dist/middleware/with-kya-os.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.delegation-gate.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.delegation-gate.js +96 -3
- package/dist/middleware/with-kya-os.delegation-gate.js.map +1 -1
- package/dist/middleware/with-kya-os.delegation-verify.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.delegation-verify.js +2 -2
- package/dist/middleware/with-kya-os.delegation-verify.js.map +1 -1
- package/dist/middleware/with-kya-os.deps.d.ts +2 -0
- package/dist/middleware/with-kya-os.deps.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.js +23 -0
- package/dist/middleware/with-kya-os.js.map +1 -1
- package/dist/middleware/with-kya-os.policy-gate.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.policy-gate.js +29 -4
- package/dist/middleware/with-kya-os.policy-gate.js.map +1 -1
- package/dist/middleware/with-kya-os.protocol.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.protocol.js +10 -0
- package/dist/middleware/with-kya-os.protocol.js.map +1 -1
- package/dist/middleware/with-kya-os.session.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.session.js +208 -2
- package/dist/middleware/with-kya-os.session.js.map +1 -1
- package/dist/middleware/with-kya-os.types.d.ts +6 -0
- package/dist/middleware/with-kya-os.types.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.types.js.map +1 -1
- package/dist/proof/generator.d.ts +14 -2
- package/dist/proof/generator.d.ts.map +1 -1
- package/dist/proof/generator.js +20 -7
- package/dist/proof/generator.js.map +1 -1
- package/dist/proof/index.d.ts +1 -1
- package/dist/proof/index.d.ts.map +1 -1
- package/dist/proof/index.js +1 -1
- package/dist/proof/index.js.map +1 -1
- package/dist/proof/verifier.d.ts +15 -2
- package/dist/proof/verifier.d.ts.map +1 -1
- package/dist/proof/verifier.js +48 -12
- package/dist/proof/verifier.js.map +1 -1
- package/dist/session/manager.js +1 -1
- package/dist/session/manager.js.map +1 -1
- package/dist/types/protocol.d.ts +22 -0
- package/dist/types/protocol.d.ts.map +1 -1
- package/dist/types/protocol.js +31 -5
- package/dist/types/protocol.js.map +1 -1
- package/dist/utils/canonical-json.d.ts +15 -0
- package/dist/utils/canonical-json.d.ts.map +1 -0
- package/dist/utils/canonical-json.js +109 -0
- package/dist/utils/canonical-json.js.map +1 -0
- package/dist/utils/crypto-service.d.ts.map +1 -1
- package/dist/utils/crypto-service.js +5 -0
- package/dist/utils/crypto-service.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +29 -11
- package/schemas/README.md +28 -1
- package/schemas/audit-anchor-receipt.schema.json +16 -0
- package/schemas/audit-bundle-manifest.schema.json +71 -0
- package/schemas/audit-checkpoint.schema.json +37 -0
- package/schemas/audit-consistency-proof.schema.json +17 -0
- package/schemas/audit-entry.schema.json +33 -0
- package/schemas/audit-event.schema.json +168 -0
- package/schemas/audit-inclusion-proof.schema.json +17 -0
- package/schemas/audit-observation.schema.json +40 -0
- package/schemas/audit-receipt.schema.json +32 -0
- package/schemas/audit-verification-policy.schema.json +71 -0
- package/schemas/audit-verification-report.schema.json +29 -0
- package/schemas/kya-os-card.schema.json +6 -6
- package/schemas/mcp-extension-settings.json +37 -0
- package/schemas/well-known-mcpi.json +17 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
const DIGEST_PATTERN = /^sha256:([a-f0-9]{64})$/;
|
|
2
|
+
function digestBytes(digest) {
|
|
3
|
+
const match = DIGEST_PATTERN.exec(digest);
|
|
4
|
+
if (match === null)
|
|
5
|
+
throw new TypeError('Expected sha256:<lowercase-hex> digest');
|
|
6
|
+
const hex = match[1];
|
|
7
|
+
const bytes = new Uint8Array(32);
|
|
8
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
9
|
+
bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);
|
|
10
|
+
}
|
|
11
|
+
return bytes;
|
|
12
|
+
}
|
|
13
|
+
function concat(...values) {
|
|
14
|
+
const result = new Uint8Array(values.reduce((size, value) => size + value.length, 0));
|
|
15
|
+
let offset = 0;
|
|
16
|
+
for (const value of values) {
|
|
17
|
+
result.set(value, offset);
|
|
18
|
+
offset += value.length;
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
function largestPowerOfTwoLessThan(value) {
|
|
23
|
+
let power = 1;
|
|
24
|
+
while (power * 2 < value)
|
|
25
|
+
power *= 2;
|
|
26
|
+
return power;
|
|
27
|
+
}
|
|
28
|
+
function validateSize(size, label) {
|
|
29
|
+
if (!Number.isSafeInteger(size) || size < 0) {
|
|
30
|
+
throw new RangeError(`${label} must be a non-negative safe integer`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** RFC 9162 section 2 Merkle tree over immutable audit-entry digests. */
|
|
34
|
+
export class Rfc9162MerkleTree {
|
|
35
|
+
hasher;
|
|
36
|
+
constructor(hasher) {
|
|
37
|
+
this.hasher = hasher;
|
|
38
|
+
}
|
|
39
|
+
async leafHash(entryDigest) {
|
|
40
|
+
return this.hasher.sha256(concat(Uint8Array.of(0x00), digestBytes(entryDigest)));
|
|
41
|
+
}
|
|
42
|
+
async nodeHash(left, right) {
|
|
43
|
+
return this.hasher.sha256(concat(Uint8Array.of(0x01), digestBytes(left), digestBytes(right)));
|
|
44
|
+
}
|
|
45
|
+
async root(leaves) {
|
|
46
|
+
if (leaves.length === 0)
|
|
47
|
+
return this.hasher.sha256(new Uint8Array());
|
|
48
|
+
if (leaves.length === 1)
|
|
49
|
+
return this.leafHash(leaves[0]);
|
|
50
|
+
const split = largestPowerOfTwoLessThan(leaves.length);
|
|
51
|
+
const [left, right] = await Promise.all([
|
|
52
|
+
this.root(leaves.slice(0, split)),
|
|
53
|
+
this.root(leaves.slice(split)),
|
|
54
|
+
]);
|
|
55
|
+
return this.nodeHash(left, right);
|
|
56
|
+
}
|
|
57
|
+
async inclusionProof(leaves, leafIndex) {
|
|
58
|
+
validateSize(leafIndex, 'Leaf index');
|
|
59
|
+
if (leaves.length === 0 || leafIndex >= leaves.length) {
|
|
60
|
+
throw new RangeError('Leaf index must identify a leaf in the tree');
|
|
61
|
+
}
|
|
62
|
+
return this.buildInclusionProof(leaves, leafIndex);
|
|
63
|
+
}
|
|
64
|
+
async buildInclusionProof(leaves, leafIndex) {
|
|
65
|
+
if (leaves.length === 1)
|
|
66
|
+
return [];
|
|
67
|
+
const split = largestPowerOfTwoLessThan(leaves.length);
|
|
68
|
+
if (leafIndex < split) {
|
|
69
|
+
const [path, sibling] = await Promise.all([
|
|
70
|
+
this.buildInclusionProof(leaves.slice(0, split), leafIndex),
|
|
71
|
+
this.root(leaves.slice(split)),
|
|
72
|
+
]);
|
|
73
|
+
return [...path, sibling];
|
|
74
|
+
}
|
|
75
|
+
const [path, sibling] = await Promise.all([
|
|
76
|
+
this.buildInclusionProof(leaves.slice(split), leafIndex - split),
|
|
77
|
+
this.root(leaves.slice(0, split)),
|
|
78
|
+
]);
|
|
79
|
+
return [...path, sibling];
|
|
80
|
+
}
|
|
81
|
+
async verifyInclusion(input) {
|
|
82
|
+
try {
|
|
83
|
+
validateSize(input.leafIndex, 'Leaf index');
|
|
84
|
+
validateSize(input.treeSize, 'Tree size');
|
|
85
|
+
if (input.treeSize === 0 || input.leafIndex >= input.treeSize)
|
|
86
|
+
return false;
|
|
87
|
+
let leafPosition = input.leafIndex;
|
|
88
|
+
let lastNodePosition = input.treeSize - 1;
|
|
89
|
+
let calculated = await this.leafHash(input.leaf);
|
|
90
|
+
for (const sibling of input.auditPath) {
|
|
91
|
+
if (lastNodePosition === 0)
|
|
92
|
+
return false;
|
|
93
|
+
if ((leafPosition & 1) === 1 || leafPosition === lastNodePosition) {
|
|
94
|
+
calculated = await this.nodeHash(sibling, calculated);
|
|
95
|
+
while ((leafPosition & 1) === 0 && leafPosition !== 0) {
|
|
96
|
+
leafPosition = Math.floor(leafPosition / 2);
|
|
97
|
+
lastNodePosition = Math.floor(lastNodePosition / 2);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
calculated = await this.nodeHash(calculated, sibling);
|
|
102
|
+
}
|
|
103
|
+
leafPosition = Math.floor(leafPosition / 2);
|
|
104
|
+
lastNodePosition = Math.floor(lastNodePosition / 2);
|
|
105
|
+
}
|
|
106
|
+
return lastNodePosition === 0 && calculated === input.root;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async consistencyProof(leaves, oldSize) {
|
|
113
|
+
validateSize(oldSize, 'Old tree size');
|
|
114
|
+
if (oldSize === 0 || oldSize > leaves.length) {
|
|
115
|
+
throw new RangeError('Old tree size must be between 1 and the new tree size');
|
|
116
|
+
}
|
|
117
|
+
if (oldSize === leaves.length)
|
|
118
|
+
return [];
|
|
119
|
+
return this.buildConsistencyProof(oldSize, leaves, true);
|
|
120
|
+
}
|
|
121
|
+
async buildConsistencyProof(oldSize, leaves, completeSubtree) {
|
|
122
|
+
if (oldSize === leaves.length) {
|
|
123
|
+
return completeSubtree ? [] : [await this.root(leaves)];
|
|
124
|
+
}
|
|
125
|
+
const split = largestPowerOfTwoLessThan(leaves.length);
|
|
126
|
+
if (oldSize <= split) {
|
|
127
|
+
const [path, rightRoot] = await Promise.all([
|
|
128
|
+
this.buildConsistencyProof(oldSize, leaves.slice(0, split), completeSubtree),
|
|
129
|
+
this.root(leaves.slice(split)),
|
|
130
|
+
]);
|
|
131
|
+
return [...path, rightRoot];
|
|
132
|
+
}
|
|
133
|
+
const [path, leftRoot] = await Promise.all([
|
|
134
|
+
this.buildConsistencyProof(oldSize - split, leaves.slice(split), false),
|
|
135
|
+
this.root(leaves.slice(0, split)),
|
|
136
|
+
]);
|
|
137
|
+
return [...path, leftRoot];
|
|
138
|
+
}
|
|
139
|
+
async verifyConsistency(input) {
|
|
140
|
+
try {
|
|
141
|
+
validateSize(input.oldSize, 'Old tree size');
|
|
142
|
+
validateSize(input.newSize, 'New tree size');
|
|
143
|
+
if (input.oldSize === 0 || input.oldSize > input.newSize)
|
|
144
|
+
return false;
|
|
145
|
+
if (input.oldSize === input.newSize) {
|
|
146
|
+
return input.auditPath.length === 0 && input.oldRoot === input.newRoot;
|
|
147
|
+
}
|
|
148
|
+
let oldNode = input.oldSize - 1;
|
|
149
|
+
let newNode = input.newSize - 1;
|
|
150
|
+
while ((oldNode & 1) === 1) {
|
|
151
|
+
oldNode = Math.floor(oldNode / 2);
|
|
152
|
+
newNode = Math.floor(newNode / 2);
|
|
153
|
+
}
|
|
154
|
+
let pathIndex = 0;
|
|
155
|
+
let oldCalculated;
|
|
156
|
+
let newCalculated;
|
|
157
|
+
if (oldNode === 0) {
|
|
158
|
+
oldCalculated = input.oldRoot;
|
|
159
|
+
newCalculated = input.oldRoot;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const first = input.auditPath[pathIndex++];
|
|
163
|
+
if (first === undefined)
|
|
164
|
+
return false;
|
|
165
|
+
oldCalculated = first;
|
|
166
|
+
newCalculated = first;
|
|
167
|
+
}
|
|
168
|
+
for (; pathIndex < input.auditPath.length; pathIndex += 1) {
|
|
169
|
+
if (newNode === 0)
|
|
170
|
+
return false;
|
|
171
|
+
const sibling = input.auditPath[pathIndex];
|
|
172
|
+
if ((oldNode & 1) === 1 || oldNode === newNode) {
|
|
173
|
+
oldCalculated = await this.nodeHash(sibling, oldCalculated);
|
|
174
|
+
newCalculated = await this.nodeHash(sibling, newCalculated);
|
|
175
|
+
while ((oldNode & 1) === 0 && oldNode !== 0) {
|
|
176
|
+
oldNode = Math.floor(oldNode / 2);
|
|
177
|
+
newNode = Math.floor(newNode / 2);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
newCalculated = await this.nodeHash(newCalculated, sibling);
|
|
182
|
+
}
|
|
183
|
+
oldNode = Math.floor(oldNode / 2);
|
|
184
|
+
newNode = Math.floor(newNode / 2);
|
|
185
|
+
}
|
|
186
|
+
return newNode === 0 &&
|
|
187
|
+
oldCalculated === input.oldRoot &&
|
|
188
|
+
newCalculated === input.newRoot;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=merkle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkle.js","sourceRoot":"","sources":["../../src/audit/merkle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AuditHasher } from './crypto.js';
|
|
2
|
+
import type { AuditJournalProvider } from './providers/journal.js';
|
|
3
|
+
import type { AuditLedgerRef, AuditVerificationPolicyV1, SignedAuditEntryV1 } from './types.js';
|
|
4
|
+
import type { AuditArtifactVerifier } from './verifier.js';
|
|
5
|
+
export interface AuditMirrorServiceOptions {
|
|
6
|
+
ledger: AuditLedgerRef;
|
|
7
|
+
journal: AuditJournalProvider;
|
|
8
|
+
verifier: AuditArtifactVerifier;
|
|
9
|
+
verificationPolicy: AuditVerificationPolicyV1;
|
|
10
|
+
hasher: AuditHasher;
|
|
11
|
+
}
|
|
12
|
+
/** Verified mirror ingestion. It persists exact recorder envelopes and never resequences/signs. */
|
|
13
|
+
export declare class AuditMirrorService {
|
|
14
|
+
private readonly options;
|
|
15
|
+
constructor(options: AuditMirrorServiceOptions);
|
|
16
|
+
ingest(entry: SignedAuditEntryV1): Promise<SignedAuditEntryV1>;
|
|
17
|
+
private continuityFailure;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=mirror-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-service.d.ts","sourceRoot":"","sources":["../../src/audit/mirror-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EACV,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,kBAAkB,EAAE,yBAAyB,CAAC;IAC9C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,mGAAmG;AACnG,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,yBAAyB;IAEzD,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiEpE,OAAO,CAAC,iBAAiB;CAM1B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { hashAuditValue } from './crypto.js';
|
|
2
|
+
import { AUDIT_ERROR_CODES, AuditProtocolError } from './errors.js';
|
|
3
|
+
/** Verified mirror ingestion. It persists exact recorder envelopes and never resequences/signs. */
|
|
4
|
+
export class AuditMirrorService {
|
|
5
|
+
options;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
async ingest(entry) {
|
|
10
|
+
if (entry.core.ledgerId !== this.options.ledger.ledgerId ||
|
|
11
|
+
entry.core.ledgerEpochId !== this.options.ledger.ledgerEpochId) {
|
|
12
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.LEDGER_MISMATCH, 'Mirror entry belongs to a different ledger epoch');
|
|
13
|
+
}
|
|
14
|
+
const report = await this.options.verifier.verifyEntries([entry], this.options.verificationPolicy);
|
|
15
|
+
if (report.cryptographicIntegrity.verdict !== 'valid') {
|
|
16
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.MIRROR_VERIFICATION_FAILED, 'Mirror rejected an entry that failed historical artifact verification', { reasonCodes: report.cryptographicIntegrity.reasonCodes });
|
|
17
|
+
}
|
|
18
|
+
const idempotencyKey = await hashAuditValue(this.options.hasher, 'org.kya-os.audit.mirror-idempotency.v1', { ledgerId: entry.core.ledgerId, entryDigest: entry.entryDigest });
|
|
19
|
+
const duplicate = await this.options.journal.getByIdempotencyKey(entry.core.ledgerId, idempotencyKey);
|
|
20
|
+
if (duplicate !== null) {
|
|
21
|
+
if (duplicate.entryDigest !== entry.entryDigest)
|
|
22
|
+
this.continuityFailure();
|
|
23
|
+
return duplicate;
|
|
24
|
+
}
|
|
25
|
+
const head = await this.options.journal.getHead(this.options.ledger);
|
|
26
|
+
const entrySequence = BigInt(entry.core.sequence);
|
|
27
|
+
if ((head === null && entrySequence > 0n) ||
|
|
28
|
+
(head !== null && entrySequence > BigInt(head.sequence) + 1n)) {
|
|
29
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.MIRROR_OUT_OF_ORDER, 'Mirror entry arrived before its predecessor and may be retried', { sequence: entry.core.sequence, observedHeadSequence: head?.sequence ?? null });
|
|
30
|
+
}
|
|
31
|
+
const continuous = head === null
|
|
32
|
+
? entry.core.sequence === '0' && entry.core.previousEntryDigest === null
|
|
33
|
+
: entrySequence === BigInt(head.sequence) + 1n &&
|
|
34
|
+
entry.core.previousEntryDigest === head.entryDigest;
|
|
35
|
+
if (!continuous)
|
|
36
|
+
this.continuityFailure();
|
|
37
|
+
const result = await this.options.journal.compareAndAppend({
|
|
38
|
+
ledger: this.options.ledger,
|
|
39
|
+
expectedHead: head,
|
|
40
|
+
entry,
|
|
41
|
+
idempotencyKey,
|
|
42
|
+
});
|
|
43
|
+
if (result.kind === 'appended' || result.kind === 'duplicate')
|
|
44
|
+
return result.entry;
|
|
45
|
+
const racedDuplicate = await this.options.journal.getByIdempotencyKey(entry.core.ledgerId, idempotencyKey);
|
|
46
|
+
if (racedDuplicate?.entryDigest === entry.entryDigest)
|
|
47
|
+
return racedDuplicate;
|
|
48
|
+
this.continuityFailure();
|
|
49
|
+
}
|
|
50
|
+
continuityFailure() {
|
|
51
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.MIRROR_CONTINUITY_FAILED, 'Mirror entry does not exactly extend the observed recorder chain');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mirror-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-service.js","sourceRoot":"","sources":["../../src/audit/mirror-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { AuditJournalProvider } from './providers/journal.js';
|
|
2
|
+
import type { AuditLedgerRef, AuditProducerEventCoreV1, Digest, SignedAuditEntryV1 } from './types.js';
|
|
3
|
+
export interface AuditProjectionOffset {
|
|
4
|
+
sequence: string;
|
|
5
|
+
entryDigest: Digest;
|
|
6
|
+
}
|
|
7
|
+
export interface AuditTimelineProjectionV1 {
|
|
8
|
+
ledgerId: string;
|
|
9
|
+
ledgerEpochId: string;
|
|
10
|
+
sequence: string;
|
|
11
|
+
entryDigest: Digest;
|
|
12
|
+
eventId: string;
|
|
13
|
+
eventType: AuditProducerEventCoreV1['eventType'];
|
|
14
|
+
occurredAt: number;
|
|
15
|
+
recordedAt: number;
|
|
16
|
+
outcome: AuditProducerEventCoreV1['outcome'];
|
|
17
|
+
correlationId?: string;
|
|
18
|
+
causationId?: string;
|
|
19
|
+
chainStatus: 'chained';
|
|
20
|
+
}
|
|
21
|
+
export type AuditProjectionApplyResult = {
|
|
22
|
+
kind: 'applied';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'duplicate';
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'conflict';
|
|
27
|
+
actualOffset: AuditProjectionOffset | null;
|
|
28
|
+
};
|
|
29
|
+
export interface AuditProjectionProvider {
|
|
30
|
+
readonly capabilities: {
|
|
31
|
+
durability: 'ephemeral' | 'durable';
|
|
32
|
+
atomicOffset: true;
|
|
33
|
+
};
|
|
34
|
+
getOffset(projectionId: string, ledger: AuditLedgerRef): Promise<AuditProjectionOffset | null>;
|
|
35
|
+
compareAndApply(input: {
|
|
36
|
+
projectionId: string;
|
|
37
|
+
ledger: AuditLedgerRef;
|
|
38
|
+
expectedOffset: AuditProjectionOffset | null;
|
|
39
|
+
entry: SignedAuditEntryV1;
|
|
40
|
+
record: AuditTimelineProjectionV1;
|
|
41
|
+
}): Promise<AuditProjectionApplyResult>;
|
|
42
|
+
reset(projectionId: string, ledger: AuditLedgerRef): Promise<void>;
|
|
43
|
+
read(projectionId: string, ledger: AuditLedgerRef): Promise<AuditTimelineProjectionV1[]>;
|
|
44
|
+
}
|
|
45
|
+
/** Ephemeral reference projection. It is disposable and never an integrity authority. */
|
|
46
|
+
export declare class MemoryAuditProjectionProvider implements AuditProjectionProvider {
|
|
47
|
+
readonly capabilities: {
|
|
48
|
+
durability: "ephemeral";
|
|
49
|
+
atomicOffset: true;
|
|
50
|
+
};
|
|
51
|
+
private readonly offsets;
|
|
52
|
+
private readonly records;
|
|
53
|
+
getOffset(projectionId: string, ledger: AuditLedgerRef): Promise<AuditProjectionOffset | null>;
|
|
54
|
+
compareAndApply(input: {
|
|
55
|
+
projectionId: string;
|
|
56
|
+
ledger: AuditLedgerRef;
|
|
57
|
+
expectedOffset: AuditProjectionOffset | null;
|
|
58
|
+
entry: SignedAuditEntryV1;
|
|
59
|
+
record: AuditTimelineProjectionV1;
|
|
60
|
+
}): Promise<AuditProjectionApplyResult>;
|
|
61
|
+
reset(projectionId: string, ledger: AuditLedgerRef): Promise<void>;
|
|
62
|
+
read(projectionId: string, ledger: AuditLedgerRef): Promise<AuditTimelineProjectionV1[]>;
|
|
63
|
+
/** Explicit fault-injection seam for adapter conformance and recovery tests. */
|
|
64
|
+
corruptOffsetForTesting(projectionId: string, ledger: AuditLedgerRef, offset: AuditProjectionOffset): void;
|
|
65
|
+
}
|
|
66
|
+
export interface AuditProjectionWorkerOptions {
|
|
67
|
+
projectionId: string;
|
|
68
|
+
journal: AuditJournalProvider;
|
|
69
|
+
projections: AuditProjectionProvider;
|
|
70
|
+
}
|
|
71
|
+
export interface AuditProjectionReconciliation {
|
|
72
|
+
status: 'empty' | 'pending' | 'verified' | 'gap_detected';
|
|
73
|
+
journalHead: Awaited<ReturnType<AuditJournalProvider['getHead']>>;
|
|
74
|
+
projectionHead: AuditProjectionOffset | null;
|
|
75
|
+
}
|
|
76
|
+
/** Deterministically derives query/UI state from the immutable ledger. */
|
|
77
|
+
export declare class AuditProjectionWorker {
|
|
78
|
+
private readonly options;
|
|
79
|
+
constructor(options: AuditProjectionWorkerOptions);
|
|
80
|
+
synchronize(ledger: AuditLedgerRef): Promise<{
|
|
81
|
+
applied: number;
|
|
82
|
+
duplicates: number;
|
|
83
|
+
}>;
|
|
84
|
+
rebuild(ledger: AuditLedgerRef): Promise<{
|
|
85
|
+
applied: number;
|
|
86
|
+
duplicates: number;
|
|
87
|
+
}>;
|
|
88
|
+
reconcile(ledger: AuditLedgerRef): Promise<AuditProjectionReconciliation>;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/audit/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { AUDIT_ERROR_CODES, AuditProtocolError } from './errors.js';
|
|
2
|
+
function key(projectionId, ledger) {
|
|
3
|
+
return `${projectionId}\0${ledger.ledgerId}\0${ledger.ledgerEpochId}`;
|
|
4
|
+
}
|
|
5
|
+
function offsetsEqual(left, right) {
|
|
6
|
+
if (left === null || right === null)
|
|
7
|
+
return left === right;
|
|
8
|
+
return left.sequence === right.sequence && left.entryDigest === right.entryDigest;
|
|
9
|
+
}
|
|
10
|
+
function project(entry) {
|
|
11
|
+
const event = entry.core.event;
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
ledgerId: entry.core.ledgerId,
|
|
14
|
+
ledgerEpochId: entry.core.ledgerEpochId,
|
|
15
|
+
sequence: entry.core.sequence,
|
|
16
|
+
entryDigest: entry.entryDigest,
|
|
17
|
+
eventId: event.eventId,
|
|
18
|
+
eventType: event.eventType,
|
|
19
|
+
occurredAt: event.occurredAt,
|
|
20
|
+
recordedAt: entry.core.recordedAt,
|
|
21
|
+
outcome: event.outcome,
|
|
22
|
+
...(event.correlationId === undefined ? {} : { correlationId: event.correlationId }),
|
|
23
|
+
...(event.causationId === undefined ? {} : { causationId: event.causationId }),
|
|
24
|
+
chainStatus: 'chained',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Ephemeral reference projection. It is disposable and never an integrity authority. */
|
|
28
|
+
export class MemoryAuditProjectionProvider {
|
|
29
|
+
capabilities = { durability: 'ephemeral', atomicOffset: true };
|
|
30
|
+
offsets = new Map();
|
|
31
|
+
records = new Map();
|
|
32
|
+
async getOffset(projectionId, ledger) {
|
|
33
|
+
const offset = this.offsets.get(key(projectionId, ledger));
|
|
34
|
+
return offset === undefined ? null : { ...offset };
|
|
35
|
+
}
|
|
36
|
+
async compareAndApply(input) {
|
|
37
|
+
const projectionKey = key(input.projectionId, input.ledger);
|
|
38
|
+
const actualOffset = this.offsets.get(projectionKey) ?? null;
|
|
39
|
+
const existing = this.records.get(projectionKey)?.find((record) => record.sequence === input.entry.core.sequence);
|
|
40
|
+
if (existing !== undefined) {
|
|
41
|
+
return existing.entryDigest === input.entry.entryDigest
|
|
42
|
+
? { kind: 'duplicate' }
|
|
43
|
+
: { kind: 'conflict', actualOffset };
|
|
44
|
+
}
|
|
45
|
+
if (!offsetsEqual(actualOffset, input.expectedOffset)) {
|
|
46
|
+
return { kind: 'conflict', actualOffset };
|
|
47
|
+
}
|
|
48
|
+
const expectedSequence = actualOffset === null ? 0n : BigInt(actualOffset.sequence) + 1n;
|
|
49
|
+
if (BigInt(input.entry.core.sequence) !== expectedSequence) {
|
|
50
|
+
return { kind: 'conflict', actualOffset };
|
|
51
|
+
}
|
|
52
|
+
const records = this.records.get(projectionKey) ?? [];
|
|
53
|
+
records.push(Object.freeze({ ...input.record }));
|
|
54
|
+
this.records.set(projectionKey, records);
|
|
55
|
+
this.offsets.set(projectionKey, {
|
|
56
|
+
sequence: input.entry.core.sequence,
|
|
57
|
+
entryDigest: input.entry.entryDigest,
|
|
58
|
+
});
|
|
59
|
+
return { kind: 'applied' };
|
|
60
|
+
}
|
|
61
|
+
async reset(projectionId, ledger) {
|
|
62
|
+
const projectionKey = key(projectionId, ledger);
|
|
63
|
+
this.offsets.delete(projectionKey);
|
|
64
|
+
this.records.delete(projectionKey);
|
|
65
|
+
}
|
|
66
|
+
async read(projectionId, ledger) {
|
|
67
|
+
return (this.records.get(key(projectionId, ledger)) ?? []).map((record) => ({ ...record }));
|
|
68
|
+
}
|
|
69
|
+
/** Explicit fault-injection seam for adapter conformance and recovery tests. */
|
|
70
|
+
corruptOffsetForTesting(projectionId, ledger, offset) {
|
|
71
|
+
this.offsets.set(key(projectionId, ledger), { ...offset });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Deterministically derives query/UI state from the immutable ledger. */
|
|
75
|
+
export class AuditProjectionWorker {
|
|
76
|
+
options;
|
|
77
|
+
constructor(options) {
|
|
78
|
+
this.options = options;
|
|
79
|
+
if (!options.projectionId) {
|
|
80
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Projection ID is required');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async synchronize(ledger) {
|
|
84
|
+
let offset = await this.options.projections.getOffset(this.options.projectionId, ledger);
|
|
85
|
+
let applied = 0;
|
|
86
|
+
let duplicates = 0;
|
|
87
|
+
for await (const entry of this.options.journal.readRange({
|
|
88
|
+
...ledger,
|
|
89
|
+
...(offset === null ? {} : { afterSequence: offset.sequence }),
|
|
90
|
+
})) {
|
|
91
|
+
const result = await this.options.projections.compareAndApply({
|
|
92
|
+
projectionId: this.options.projectionId,
|
|
93
|
+
ledger,
|
|
94
|
+
expectedOffset: offset,
|
|
95
|
+
entry,
|
|
96
|
+
record: project(entry),
|
|
97
|
+
});
|
|
98
|
+
if (result.kind === 'conflict') {
|
|
99
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.PROJECTION_CONFLICT, 'Projection offset conflicted with the ordered ledger', {
|
|
100
|
+
sequence: entry.core.sequence,
|
|
101
|
+
expectedOffset: offset,
|
|
102
|
+
actualOffset: result.actualOffset,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (result.kind === 'applied')
|
|
106
|
+
applied += 1;
|
|
107
|
+
else
|
|
108
|
+
duplicates += 1;
|
|
109
|
+
offset = { sequence: entry.core.sequence, entryDigest: entry.entryDigest };
|
|
110
|
+
}
|
|
111
|
+
return { applied, duplicates };
|
|
112
|
+
}
|
|
113
|
+
async rebuild(ledger) {
|
|
114
|
+
await this.options.projections.reset(this.options.projectionId, ledger);
|
|
115
|
+
return this.synchronize(ledger);
|
|
116
|
+
}
|
|
117
|
+
async reconcile(ledger) {
|
|
118
|
+
const [journalHead, projectionHead] = await Promise.all([
|
|
119
|
+
this.options.journal.getHead(ledger),
|
|
120
|
+
this.options.projections.getOffset(this.options.projectionId, ledger),
|
|
121
|
+
]);
|
|
122
|
+
let status;
|
|
123
|
+
if (journalHead === null && projectionHead === null)
|
|
124
|
+
status = 'empty';
|
|
125
|
+
else if (journalHead !== null && projectionHead === null)
|
|
126
|
+
status = 'pending';
|
|
127
|
+
else if (journalHead === null || projectionHead === null)
|
|
128
|
+
status = 'gap_detected';
|
|
129
|
+
else if (journalHead.sequence === projectionHead.sequence) {
|
|
130
|
+
status = journalHead.entryDigest === projectionHead.entryDigest
|
|
131
|
+
? 'verified'
|
|
132
|
+
: 'gap_detected';
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
status = BigInt(projectionHead.sequence) < BigInt(journalHead.sequence)
|
|
136
|
+
? 'pending'
|
|
137
|
+
: 'gap_detected';
|
|
138
|
+
}
|
|
139
|
+
return { status, journalHead, projectionHead };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/audit/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AuditAnchorReceipt, SignedAuditCheckpointV1 } from '../types.js';
|
|
2
|
+
export interface AuditAnchorProvider {
|
|
3
|
+
readonly capability: 'supporting-anchor';
|
|
4
|
+
readonly kind: AuditAnchorReceipt['kind'];
|
|
5
|
+
publish(checkpoint: SignedAuditCheckpointV1): Promise<AuditAnchorReceipt>;
|
|
6
|
+
verify(checkpoint: SignedAuditCheckpointV1, receipt: AuditAnchorReceipt): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
/** Test/development adapter; production WORM/TSA/SCITT integrations implement the same port. */
|
|
9
|
+
export declare class MemorySupportingAnchorProvider implements AuditAnchorProvider {
|
|
10
|
+
private readonly config;
|
|
11
|
+
readonly capability: "supporting-anchor";
|
|
12
|
+
readonly kind: AuditAnchorReceipt['kind'];
|
|
13
|
+
constructor(config: {
|
|
14
|
+
kind: AuditAnchorReceipt['kind'];
|
|
15
|
+
providerId: string;
|
|
16
|
+
clock: {
|
|
17
|
+
now(): number;
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
publish(checkpoint: SignedAuditCheckpointV1): Promise<AuditAnchorReceipt>;
|
|
21
|
+
verify(checkpoint: SignedAuditCheckpointV1, receipt: AuditAnchorReceipt): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=anchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC1E,MAAM,CACJ,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,gGAAgG;AAChG,qBAAa,8BAA+B,YAAW,mBAAmB;IAI5D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,QAAQ,CAAC,UAAU,EAAG,mBAAmB,CAAU;IACnD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAEb,MAAM,EAAE;QACnC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACjC,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE;YAAE,GAAG,IAAI,MAAM,CAAA;SAAE,CAAC;KAC1B;IAIK,OAAO,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAUzE,MAAM,CACV,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,OAAO,CAAC;CAKpB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Test/development adapter; production WORM/TSA/SCITT integrations implement the same port. */
|
|
2
|
+
export class MemorySupportingAnchorProvider {
|
|
3
|
+
config;
|
|
4
|
+
capability = 'supporting-anchor';
|
|
5
|
+
kind;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.kind = config.kind;
|
|
9
|
+
}
|
|
10
|
+
async publish(checkpoint) {
|
|
11
|
+
return Object.freeze({
|
|
12
|
+
schema: 'https://schema.kya-os.org/v1/protocol/audit/anchor-receipt/v1.0.0',
|
|
13
|
+
kind: this.config.kind,
|
|
14
|
+
providerId: this.config.providerId,
|
|
15
|
+
checkpointDigest: checkpoint.checkpointDigest,
|
|
16
|
+
issuedAt: this.config.clock.now(),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async verify(checkpoint, receipt) {
|
|
20
|
+
return receipt.kind === this.config.kind &&
|
|
21
|
+
receipt.providerId === this.config.providerId &&
|
|
22
|
+
receipt.checkpointDigest === checkpoint.checkpointDigest;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=anchor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor.js","sourceRoot":"","sources":["../../../src/audit/providers/anchor.ts"],"names":[],"mappings":"AAYA,gGAAgG;AAChG,MAAM,OAAO,8BAA8B;IAIZ;IAHpB,UAAU,GAAG,mBAA4B,CAAC;IAC1C,IAAI,CAA6B;IAE1C,YAA6B,MAI5B;QAJ4B,WAAM,GAAN,MAAM,CAIlC;QACC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAmC;QAC/C,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,mEAAmE;YAC3E,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;YAC7C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CACV,UAAmC,EACnC,OAA2B;QAE3B,OAAO,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI;YACtC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU;YAC7C,OAAO,CAAC,gBAAgB,KAAK,UAAU,CAAC,gBAAgB,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { EvidenceRef } from '../types.js';
|
|
2
|
+
export interface EncryptedEvidenceInput {
|
|
3
|
+
ref: EvidenceRef;
|
|
4
|
+
ciphertext: Uint8Array;
|
|
5
|
+
}
|
|
6
|
+
export interface AuditEvidenceProvider {
|
|
7
|
+
putIfAbsent(input: EncryptedEvidenceInput): Promise<EvidenceRef>;
|
|
8
|
+
has(ref: EvidenceRef): Promise<boolean>;
|
|
9
|
+
get(ref: EvidenceRef, context: EvidenceAccessContext): Promise<Uint8Array | null>;
|
|
10
|
+
applyRetention(command: EvidenceRetentionCommand): Promise<EvidenceRetentionResult>;
|
|
11
|
+
}
|
|
12
|
+
export interface EvidenceAccessContext {
|
|
13
|
+
actor: string;
|
|
14
|
+
purpose: string;
|
|
15
|
+
}
|
|
16
|
+
export type EvidenceRetentionCommand = {
|
|
17
|
+
kind: 'dispose';
|
|
18
|
+
ref: EvidenceRef;
|
|
19
|
+
authorizedBy: string;
|
|
20
|
+
reason: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'legal_hold';
|
|
23
|
+
ref: EvidenceRef;
|
|
24
|
+
holdId: string;
|
|
25
|
+
authorizedBy: string;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'release_hold';
|
|
28
|
+
ref: EvidenceRef;
|
|
29
|
+
holdId: string;
|
|
30
|
+
authorizedBy: string;
|
|
31
|
+
};
|
|
32
|
+
export interface EvidenceRetentionResult {
|
|
33
|
+
ref: EvidenceRef;
|
|
34
|
+
state: 'retained' | 'held' | 'disposed' | 'missing';
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,WAAW,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClF,cAAc,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CACrD"}
|