@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,222 @@
|
|
|
1
|
+
import { canonicalizeJson } from '../utils/canonical-json.js';
|
|
2
|
+
import { assertAuditCapabilities } from './assurance.js';
|
|
3
|
+
import { AuditProtocolError, AUDIT_ERROR_CODES } from './errors.js';
|
|
4
|
+
import { collectAuditEvidenceRefs, digestAuditEvent } from './integrity.js';
|
|
5
|
+
import { parseAuditProducerEvent } from './schemas.js';
|
|
6
|
+
/** Producer-side service: creates frozen events and applies declared delivery semantics. */
|
|
7
|
+
export class AuditTrailService {
|
|
8
|
+
configuration;
|
|
9
|
+
idCounter = 0n;
|
|
10
|
+
sourceState;
|
|
11
|
+
sourceConstructionTail = Promise.resolve();
|
|
12
|
+
get auditProfile() {
|
|
13
|
+
return this.configuration.capabilities?.profile ?? 'AAP-0';
|
|
14
|
+
}
|
|
15
|
+
get capabilities() {
|
|
16
|
+
return this.configuration.capabilities;
|
|
17
|
+
}
|
|
18
|
+
constructor(configuration) {
|
|
19
|
+
if (configuration.delivery === 'buffered' &&
|
|
20
|
+
configuration.outbox?.capabilities.durability !== 'durable') {
|
|
21
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Buffered audit delivery requires a durable outbox provider');
|
|
22
|
+
}
|
|
23
|
+
if (configuration.capabilities !== undefined) {
|
|
24
|
+
if (configuration.capabilities.delivery !== configuration.delivery) {
|
|
25
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Advertised audit delivery does not match the trail delivery mode');
|
|
26
|
+
}
|
|
27
|
+
assertAuditCapabilities(configuration.capabilities);
|
|
28
|
+
if (configuration.capabilities.sourceHighWater &&
|
|
29
|
+
configuration.sourceState.capabilities.durability !== 'durable') {
|
|
30
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Advertised source high-water support requires durable source state');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
this.configuration = Object.freeze({ ...configuration });
|
|
34
|
+
this.sourceState = configuration.sourceState;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A direct-mode retry is idempotent only when it rebuilds the identical frozen
|
|
38
|
+
* event: callers retrying with a stable `eventId` must also pin `occurredAt`,
|
|
39
|
+
* otherwise the recorder correctly rejects the divergent content as an
|
|
40
|
+
* event-identity conflict. Buffered redelivery is always byte-stable.
|
|
41
|
+
*/
|
|
42
|
+
async record(input, options = {}) {
|
|
43
|
+
const eventId = input.eventId ?? this.nextEventId();
|
|
44
|
+
const encryptedEvidence = options.encryptedEvidence ?? [];
|
|
45
|
+
const buffered = this.configuration.delivery === 'buffered';
|
|
46
|
+
const { event, submission } = await this.withSourceConstruction(async () => {
|
|
47
|
+
const builtEvent = await this.buildAndLinkEvent(input, eventId);
|
|
48
|
+
this.assertEvidenceIsReferenced(builtEvent, encryptedEvidence);
|
|
49
|
+
const frozenSubmission = Object.freeze({
|
|
50
|
+
ledgerId: this.configuration.ledgerId,
|
|
51
|
+
// Buffered submissions are never epoch-pinned: a durable outbox item may
|
|
52
|
+
// be redelivered after an epoch rollover, where logical-ledger
|
|
53
|
+
// idempotency (not epoch pinning) carries the retry guarantee.
|
|
54
|
+
...(buffered || this.configuration.expectedLedgerEpochId === undefined
|
|
55
|
+
? {}
|
|
56
|
+
: { expectedLedgerEpochId: this.configuration.expectedLedgerEpochId }),
|
|
57
|
+
producerEvent: builtEvent,
|
|
58
|
+
encryptedEvidence: Object.freeze([...encryptedEvidence]),
|
|
59
|
+
});
|
|
60
|
+
if (buffered) {
|
|
61
|
+
// Enqueued inside the source-construction lock so items commit to the
|
|
62
|
+
// outbox in claimed source-sequence order for FIFO providers.
|
|
63
|
+
await this.configuration.outbox.enqueue(Object.freeze({
|
|
64
|
+
eventId: builtEvent.eventId,
|
|
65
|
+
submission: frozenSubmission,
|
|
66
|
+
enqueuedAt: this.configuration.clock.now(),
|
|
67
|
+
attempts: 0,
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
return { event: builtEvent, submission: frozenSubmission };
|
|
71
|
+
});
|
|
72
|
+
if (buffered)
|
|
73
|
+
return { status: 'pending', event };
|
|
74
|
+
let entry;
|
|
75
|
+
try {
|
|
76
|
+
entry = await this.submitAndValidate(submission);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.configuration.onDeliveryFailure?.(error, event);
|
|
80
|
+
if (this.configuration.delivery === 'required')
|
|
81
|
+
throw error;
|
|
82
|
+
return { status: 'failed', event, error };
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
await this.sourceState.markReceipted(this.configuration.sourceId, event.source.sourceSequence, entry.entryDigest);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// The recorder commit is authoritative and must not be reported as
|
|
89
|
+
// failed: doing so encourages a caller to emit a new event identity.
|
|
90
|
+
this.configuration.onSourceStateFailure?.(error, event);
|
|
91
|
+
}
|
|
92
|
+
return { status: 'recorded', event, entry };
|
|
93
|
+
}
|
|
94
|
+
async flush(limit) {
|
|
95
|
+
if (this.configuration.delivery !== 'buffered')
|
|
96
|
+
return { delivered: 0, failed: 0 };
|
|
97
|
+
let delivered = 0;
|
|
98
|
+
let failed = 0;
|
|
99
|
+
const blockedSources = new Set();
|
|
100
|
+
for await (const item of this.configuration.outbox.pending(limit)) {
|
|
101
|
+
const sourceId = item.submission.producerEvent.source.sourceId;
|
|
102
|
+
if (blockedSources.has(sourceId))
|
|
103
|
+
continue;
|
|
104
|
+
try {
|
|
105
|
+
const entry = await this.submitAndValidate(item.submission);
|
|
106
|
+
try {
|
|
107
|
+
await this.sourceState.markReceipted(sourceId, item.submission.producerEvent.source.sourceSequence, entry.entryDigest);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.configuration.onSourceStateFailure?.(error, item.submission.producerEvent);
|
|
111
|
+
}
|
|
112
|
+
await this.configuration.outbox.markDelivered(item.eventId);
|
|
113
|
+
delivered += 1;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
await this.configuration.outbox.markFailed(item.eventId, error);
|
|
117
|
+
this.configuration.onDeliveryFailure?.(error, item.submission.producerEvent);
|
|
118
|
+
blockedSources.add(sourceId);
|
|
119
|
+
failed += 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { delivered, failed };
|
|
123
|
+
}
|
|
124
|
+
async getSourceState() {
|
|
125
|
+
return this.sourceState.getState(this.configuration.sourceId);
|
|
126
|
+
}
|
|
127
|
+
/** Emits the producer's declared high-water mark as an ordinary chained event. */
|
|
128
|
+
async recordSourceHighWater(input = {}) {
|
|
129
|
+
const state = await this.getSourceState();
|
|
130
|
+
return this.record({
|
|
131
|
+
...(input.eventId === undefined ? {} : { eventId: input.eventId }),
|
|
132
|
+
eventType: 'audit.source_high_water',
|
|
133
|
+
action: { category: 'audit.source_high_water' },
|
|
134
|
+
outcome: 'succeeded',
|
|
135
|
+
evidence: [],
|
|
136
|
+
details: {
|
|
137
|
+
family: 'administration',
|
|
138
|
+
phase: 'source_high_water',
|
|
139
|
+
sourceSequence: state.highestEmitted,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async withSourceConstruction(operation) {
|
|
144
|
+
const previous = this.sourceConstructionTail;
|
|
145
|
+
let release;
|
|
146
|
+
this.sourceConstructionTail = new Promise((resolve) => {
|
|
147
|
+
release = resolve;
|
|
148
|
+
});
|
|
149
|
+
await previous;
|
|
150
|
+
try {
|
|
151
|
+
return await operation();
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
release();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async buildAndLinkEvent(input, eventId) {
|
|
158
|
+
const claim = await this.sourceState.claimEvent(this.configuration.sourceId, eventId);
|
|
159
|
+
const event = this.buildEvent(input, eventId, claim);
|
|
160
|
+
const eventDigest = await digestAuditEvent(this.configuration.hasher, event);
|
|
161
|
+
await this.sourceState.markEmitted(this.configuration.sourceId, eventId, claim.sequence, eventDigest);
|
|
162
|
+
return event;
|
|
163
|
+
}
|
|
164
|
+
buildEvent(input, eventId, sourceClaim) {
|
|
165
|
+
return parseAuditProducerEvent({
|
|
166
|
+
...input,
|
|
167
|
+
schema: 'https://schema.kya-os.org/v1/protocol/audit/event/v1.0.0',
|
|
168
|
+
eventId,
|
|
169
|
+
eventVersion: '1.0.0',
|
|
170
|
+
binding: this.configuration.binding,
|
|
171
|
+
occurredAt: input.occurredAt ?? this.configuration.clock.now(),
|
|
172
|
+
tenantRef: this.configuration.tenantRef,
|
|
173
|
+
source: {
|
|
174
|
+
producer: this.configuration.producer,
|
|
175
|
+
sourceId: this.configuration.sourceId,
|
|
176
|
+
sourceSequence: sourceClaim.sequence,
|
|
177
|
+
...(sourceClaim.previousSourceEventDigest === undefined
|
|
178
|
+
? {}
|
|
179
|
+
: { previousSourceEventDigest: sourceClaim.previousSourceEventDigest }),
|
|
180
|
+
},
|
|
181
|
+
privacy: input.privacy ?? this.configuration.privacy,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
nextEventId() {
|
|
185
|
+
if (this.configuration.eventIdFactory !== undefined) {
|
|
186
|
+
return this.configuration.eventIdFactory();
|
|
187
|
+
}
|
|
188
|
+
this.idCounter += 1n;
|
|
189
|
+
return `audit_${this.configuration.clock.now()}_${this.idCounter}`;
|
|
190
|
+
}
|
|
191
|
+
assertEvidenceIsReferenced(event, encryptedEvidence) {
|
|
192
|
+
const refs = new Map(collectAuditEvidenceRefs(event).map((ref) => [ref.objectId, ref]));
|
|
193
|
+
const submittedIds = new Set();
|
|
194
|
+
for (const item of encryptedEvidence) {
|
|
195
|
+
const referenced = refs.get(item.ref.objectId);
|
|
196
|
+
if (submittedIds.has(item.ref.objectId) || referenced === undefined ||
|
|
197
|
+
canonicalizeJson(referenced) !== canonicalizeJson(item.ref)) {
|
|
198
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.EVIDENCE_FAILURE, 'Encrypted evidence must exactly match one unique reference in the frozen event', { objectId: item.ref.objectId });
|
|
199
|
+
}
|
|
200
|
+
submittedIds.add(item.ref.objectId);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async submitAndValidate(submission) {
|
|
204
|
+
const entry = await this.configuration.recorder.submit(submission);
|
|
205
|
+
const eventDigest = await digestAuditEvent(this.configuration.hasher, submission.producerEvent);
|
|
206
|
+
// The binding is content-scoped: an entry from an earlier retained epoch is a
|
|
207
|
+
// legitimate logical-ledger duplicate. Epoch placement of new appends is the
|
|
208
|
+
// recorder's envelope guarantee, and epoch claims are recorder-signed and
|
|
209
|
+
// independently verifiable against checkpoints and mirrors.
|
|
210
|
+
if (entry.core.ledgerId !== submission.ledgerId ||
|
|
211
|
+
entry.eventDigest !== eventDigest ||
|
|
212
|
+
entry.core.eventDigest !== eventDigest ||
|
|
213
|
+
canonicalizeJson(entry.core.event) !== canonicalizeJson(submission.producerEvent)) {
|
|
214
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Recorder response does not bind the submitted frozen producer event');
|
|
215
|
+
}
|
|
216
|
+
return entry;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export function createAuditTrail(configuration) {
|
|
220
|
+
return new AuditTrailService(configuration);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/audit/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/audit/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/audit/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AuditHasher } from '../crypto.js';
|
|
2
|
+
import type { AuditAnchorProvider } from '../providers/anchor.js';
|
|
3
|
+
import type { AuditEvidenceProvider } from '../providers/evidence.js';
|
|
4
|
+
import type { AuditJournalProvider } from '../providers/journal.js';
|
|
5
|
+
import type { AuditCheckpointObserverProvider } from '../providers/observer.js';
|
|
6
|
+
import type { AuditOutboxProvider } from '../providers/outbox.js';
|
|
7
|
+
import type { SignedAuditCheckpointV1 } from '../types.js';
|
|
8
|
+
export interface AuditProviderContractCheck {
|
|
9
|
+
name: string;
|
|
10
|
+
passed: boolean;
|
|
11
|
+
error?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface AuditProviderContractReport {
|
|
14
|
+
providerKind: 'journal' | 'evidence' | 'observer' | 'anchor' | 'outbox';
|
|
15
|
+
passed: boolean;
|
|
16
|
+
checks: AuditProviderContractCheck[];
|
|
17
|
+
}
|
|
18
|
+
export declare function assertAuditProviderContract(value: AuditProviderContractReport): void;
|
|
19
|
+
/** Framework-neutral executable contract for authoritative journal adapters. */
|
|
20
|
+
export declare function evaluateAuditJournalProviderContract(createProvider: () => AuditJournalProvider | Promise<AuditJournalProvider>): Promise<AuditProviderContractReport>;
|
|
21
|
+
/** Executable contract for encrypted evidence/retention adapters. */
|
|
22
|
+
export declare function evaluateAuditEvidenceProviderContract(input: {
|
|
23
|
+
createProvider(): AuditEvidenceProvider | Promise<AuditEvidenceProvider>;
|
|
24
|
+
hasher: AuditHasher;
|
|
25
|
+
}): Promise<AuditProviderContractReport>;
|
|
26
|
+
export interface AuditCheckpointProviderContractFixtures {
|
|
27
|
+
first: SignedAuditCheckpointV1;
|
|
28
|
+
next: SignedAuditCheckpointV1;
|
|
29
|
+
conflict: SignedAuditCheckpointV1;
|
|
30
|
+
rollback: SignedAuditCheckpointV1;
|
|
31
|
+
/**
|
|
32
|
+
* A larger checkpoint that does NOT directly link `first` but consistently
|
|
33
|
+
* extends its tree; when provided, the observer must accept it as catch-up
|
|
34
|
+
* after a missed publication.
|
|
35
|
+
*/
|
|
36
|
+
gapped?: SignedAuditCheckpointV1;
|
|
37
|
+
}
|
|
38
|
+
/** Executable monotonicity/split-view contract for independent observers. */
|
|
39
|
+
export declare function evaluateAuditObserverProviderContract(input: {
|
|
40
|
+
createProvider(): AuditCheckpointObserverProvider | Promise<AuditCheckpointObserverProvider>;
|
|
41
|
+
fixtures: AuditCheckpointProviderContractFixtures;
|
|
42
|
+
}): Promise<AuditProviderContractReport>;
|
|
43
|
+
/** Executable role-separation and binding contract for supporting anchors. */
|
|
44
|
+
export declare function evaluateAuditAnchorProviderContract(input: {
|
|
45
|
+
createProvider(): AuditAnchorProvider | Promise<AuditAnchorProvider>;
|
|
46
|
+
checkpoint: SignedAuditCheckpointV1;
|
|
47
|
+
otherCheckpoint: SignedAuditCheckpointV1;
|
|
48
|
+
}): Promise<AuditProviderContractReport>;
|
|
49
|
+
/** Executable FIFO, retry-accounting, and acknowledgement contract for outboxes. */
|
|
50
|
+
export declare function evaluateAuditOutboxProviderContract(createProvider: () => AuditOutboxProvider | Promise<AuditOutboxProvider>): Promise<AuditProviderContractReport>;
|
|
51
|
+
//# sourceMappingURL=provider-contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-contracts.d.ts","sourceRoot":"","sources":["../../../src/audit/testing/provider-contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAmB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EAIV,uBAAuB,EAExB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxE,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAkCD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI,CAQpF;AAsED,gFAAgF;AAChF,wBAAsB,oCAAoC,CACxD,cAAc,EAAE,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,GACzE,OAAO,CAAC,2BAA2B,CAAC,CA6HtC;AAmBD,qEAAqE;AACrE,wBAAsB,qCAAqC,CAAC,KAAK,EAAE;IACjE,cAAc,IAAI,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACzE,MAAM,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAmEvC;AAED,MAAM,WAAW,uCAAuC;IACtD,KAAK,EAAE,uBAAuB,CAAC;IAC/B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,uBAAuB,CAAC;IAClC;;;;OAIG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,6EAA6E;AAC7E,wBAAsB,qCAAqC,CAAC,KAAK,EAAE;IACjE,cAAc,IAAI,+BAA+B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC7F,QAAQ,EAAE,uCAAuC,CAAC;CACnD,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAkDvC;AAED,8EAA8E;AAC9E,wBAAsB,mCAAmC,CAAC,KAAK,EAAE;IAC/D,cAAc,IAAI,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrE,UAAU,EAAE,uBAAuB,CAAC;IACpC,eAAe,EAAE,uBAAuB,CAAC;CAC1C,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAevC;AAED,oFAAoF;AACpF,wBAAsB,mCAAmC,CACvD,cAAc,EAAE,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,GACvE,OAAO,CAAC,2BAA2B,CAAC,CA0EtC"}
|