@kya-os/mcp 1.10.1 → 1.11.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 +88 -0
- package/CONFORMANCE.md +598 -0
- package/README.md +67 -4
- package/SPEC.md +1827 -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 +27 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +27 -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/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/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 +1144 -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/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/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-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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/kya-os-transport.d.ts.map +1 -1
- package/dist/middleware/kya-os-transport.js +10 -3
- 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.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.map +1 -1
- package/dist/proof/generator.js +6 -5
- package/dist/proof/generator.js.map +1 -1
- package/dist/proof/verifier.d.ts +12 -0
- package/dist/proof/verifier.d.ts.map +1 -1
- package/dist/proof/verifier.js +35 -4
- 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/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 +27 -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/well-known-mcpi.json +17 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type AuditHasher, type AuditSigner } from './crypto.js';
|
|
2
|
+
import type { AuditEvidenceProvider } from './providers/evidence.js';
|
|
3
|
+
import type { AuditJournalProvider } from './providers/journal.js';
|
|
4
|
+
import type { AuditRecorderSubmission } from './providers/recorder-client.js';
|
|
5
|
+
import type { Digest, PartyRef, ProtocolBindingId, SignedAuditEntryV1 } from './types.js';
|
|
6
|
+
export interface AuditClock {
|
|
7
|
+
now(): number;
|
|
8
|
+
}
|
|
9
|
+
export interface AuthenticatedAuditSubmissionContext {
|
|
10
|
+
producerAuthority: string;
|
|
11
|
+
tenantAuthority: string;
|
|
12
|
+
/** Exact authenticated producer binding for non-public or non-DID identifiers. */
|
|
13
|
+
producerRef?: PartyRef;
|
|
14
|
+
/** Exact authenticated tenant binding for opaque or commitment-based tenant identifiers. */
|
|
15
|
+
tenantRef?: PartyRef;
|
|
16
|
+
}
|
|
17
|
+
export interface AuditSubmissionAuthorizer {
|
|
18
|
+
authorize(input: {
|
|
19
|
+
submission: AuditRecorderSubmission;
|
|
20
|
+
context: AuthenticatedAuditSubmissionContext;
|
|
21
|
+
}): Promise<boolean> | boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Authoritative epoch-transition port. A successful result means the predecessor terminal
|
|
25
|
+
* checkpoint was verified and the predecessor epoch was atomically sealed against new appends.
|
|
26
|
+
* Implementations must be idempotent for identical transition inputs.
|
|
27
|
+
*/
|
|
28
|
+
export interface AuditEpochTransitionGuard {
|
|
29
|
+
verifyAndSeal(input: {
|
|
30
|
+
ledgerId: string;
|
|
31
|
+
previousEpochId: string;
|
|
32
|
+
nextEpochId: string;
|
|
33
|
+
previousTerminalCheckpointDigest: Digest;
|
|
34
|
+
}): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
export interface AuditRecorderServiceConfig {
|
|
37
|
+
ledgerId: string;
|
|
38
|
+
ledgerEpochId: string;
|
|
39
|
+
tenantRef: PartyRef;
|
|
40
|
+
binding: ProtocolBindingId;
|
|
41
|
+
sourceId: string;
|
|
42
|
+
journal: AuditJournalProvider;
|
|
43
|
+
signer: AuditSigner;
|
|
44
|
+
hasher: AuditHasher;
|
|
45
|
+
clock: AuditClock;
|
|
46
|
+
evidence?: AuditEvidenceProvider;
|
|
47
|
+
authorizer?: AuditSubmissionAuthorizer;
|
|
48
|
+
previousEpochId?: string;
|
|
49
|
+
previousTerminalCheckpointDigest?: Digest;
|
|
50
|
+
epochTransitionGuard?: AuditEpochTransitionGuard;
|
|
51
|
+
maxAppendConflicts?: number;
|
|
52
|
+
}
|
|
53
|
+
export declare class AuditRecorderService {
|
|
54
|
+
private readonly config;
|
|
55
|
+
private readonly maxAppendConflicts;
|
|
56
|
+
private initialization?;
|
|
57
|
+
constructor(config: AuditRecorderServiceConfig);
|
|
58
|
+
submitAuthenticated(submission: AuditRecorderSubmission, context: AuthenticatedAuditSubmissionContext): Promise<SignedAuditEntryV1>;
|
|
59
|
+
/**
|
|
60
|
+
* Best-effort compensation for write-ahead evidence whose append failed: the
|
|
61
|
+
* ciphertext is disposed only after re-confirming that no committed entry
|
|
62
|
+
* claims this event identity, so a raced idempotent commit is never stripped
|
|
63
|
+
* of its evidence. Failures here leave orphans for operator retention tooling.
|
|
64
|
+
*/
|
|
65
|
+
private disposeUncommittedEvidence;
|
|
66
|
+
private validateSubmissionEnvelope;
|
|
67
|
+
private validateEventAuthority;
|
|
68
|
+
private persistSubmittedEvidence;
|
|
69
|
+
private ensureInitialized;
|
|
70
|
+
private validateExistingGenesis;
|
|
71
|
+
private genesisEvent;
|
|
72
|
+
private appendEvent;
|
|
73
|
+
private identifyEvent;
|
|
74
|
+
private resolveDuplicate;
|
|
75
|
+
private buildCandidate;
|
|
76
|
+
private ledgerRef;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=recorder-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder-service.d.ts","sourceRoot":"","sources":["../../src/audit/recorder-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AASjF,OAAO,KAAK,EAAE,qBAAqB,EAA0B,MAAM,yBAAyB,CAAC;AAC7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAS9E,OAAO,KAAK,EAIV,MAAM,EACN,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mCAAmC;IAClD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,QAAQ,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,KAAK,EAAE;QACf,UAAU,EAAE,uBAAuB,CAAC;QACpC,OAAO,EAAE,mCAAmC,CAAC;KAC9C,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,KAAK,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,gCAAgC,EAAE,MAAM,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,oBAAoB,CAAC,EAAE,yBAAyB,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AA+BD,qBAAa,oBAAoB;IAInB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,cAAc,CAAC,CAA8B;gBAExB,MAAM,EAAE,0BAA0B;IAiBzD,mBAAmB,CACvB,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,mCAAmC,GAC3C,OAAO,CAAC,kBAAkB,CAAC;IAqC9B;;;;;OAKG;YACW,0BAA0B;IAwBxC,OAAO,CAAC,0BAA0B;IAelC,OAAO,CAAC,sBAAsB;YAuBhB,wBAAwB;YAuCxB,iBAAiB;IAuC/B,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,YAAY;YAiCN,WAAW;YAwEX,aAAa;IAkB3B,OAAO,CAAC,gBAAgB;YAWV,cAAc;IAuC5B,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { canonicalizeJson, canonicalizeJsonBytes } from '../utils/canonical-json.js';
|
|
2
|
+
import { AUDIT_ERROR_CODES, AuditProtocolError } from './errors.js';
|
|
3
|
+
import { hashAuditValue } from './crypto.js';
|
|
4
|
+
import { AUDIT_DIGEST_DOMAINS, buildAuditRecorderReceiptCore, collectAuditEvidenceRefs, digestAuditEntry, digestAuditEvidenceManifest, digestAuditEvent, } from './integrity.js';
|
|
5
|
+
import { AUDIT_ENTRY_SCHEMA_ID, AUDIT_EVENT_SCHEMA_ID, AUDIT_INTEGRITY_SUITE, parseAuditEntryCore, parseAuditProducerEvent, parseSignedAuditEntry, } from './schemas.js';
|
|
6
|
+
function deepFreeze(value) {
|
|
7
|
+
if (typeof value !== 'object' || value === null || Object.isFrozen(value))
|
|
8
|
+
return value;
|
|
9
|
+
for (const child of Object.values(value))
|
|
10
|
+
deepFreeze(child);
|
|
11
|
+
return Object.freeze(value);
|
|
12
|
+
}
|
|
13
|
+
function sameHead(left, right) {
|
|
14
|
+
if (left === null || right === null)
|
|
15
|
+
return left === right;
|
|
16
|
+
return left.entryDigest === right.entryDigest && left.sequence === right.sequence;
|
|
17
|
+
}
|
|
18
|
+
function sameSigner(left, right) {
|
|
19
|
+
return left.did === right.did && left.kid === right.kid && left.alg === right.alg;
|
|
20
|
+
}
|
|
21
|
+
function sameParty(left, right) {
|
|
22
|
+
return canonicalizeJson(left) === canonicalizeJson(right);
|
|
23
|
+
}
|
|
24
|
+
function authorityMatchesParty(authority, boundRef, claimedRef) {
|
|
25
|
+
if (boundRef !== undefined)
|
|
26
|
+
return sameParty(boundRef, claimedRef);
|
|
27
|
+
return (claimedRef.kind === 'public_did' || claimedRef.kind === 'pairwise_did') &&
|
|
28
|
+
claimedRef.did === authority;
|
|
29
|
+
}
|
|
30
|
+
export class AuditRecorderService {
|
|
31
|
+
config;
|
|
32
|
+
maxAppendConflicts;
|
|
33
|
+
initialization;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.config = config;
|
|
36
|
+
if ((config.previousEpochId === undefined) !==
|
|
37
|
+
(config.previousTerminalCheckpointDigest === undefined)) {
|
|
38
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Previous epoch ID and terminal checkpoint digest must be supplied together');
|
|
39
|
+
}
|
|
40
|
+
if (config.previousEpochId !== undefined && config.epochTransitionGuard === undefined) {
|
|
41
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Epoch transitions require an authoritative verify-and-seal guard');
|
|
42
|
+
}
|
|
43
|
+
this.maxAppendConflicts = config.maxAppendConflicts ?? 256;
|
|
44
|
+
}
|
|
45
|
+
async submitAuthenticated(submission, context) {
|
|
46
|
+
this.validateSubmissionEnvelope(submission, context);
|
|
47
|
+
const producerEvent = parseAuditProducerEvent(submission.producerEvent);
|
|
48
|
+
this.validateEventAuthority(producerEvent, context);
|
|
49
|
+
if (this.config.authorizer !== undefined &&
|
|
50
|
+
!(await this.config.authorizer.authorize({ submission, context }))) {
|
|
51
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.UNAUTHORIZED_SUBMISSION, 'Audit producer is not authorized for this ledger');
|
|
52
|
+
}
|
|
53
|
+
const identity = await this.identifyEvent(producerEvent, context);
|
|
54
|
+
const duplicate = await this.config.journal.getByIdempotencyKey(this.config.ledgerId, identity.idempotencyKey);
|
|
55
|
+
if (duplicate !== null)
|
|
56
|
+
return this.resolveDuplicate(duplicate, identity.eventDigest);
|
|
57
|
+
// Only a new append must target the active epoch. Logical-ledger idempotency
|
|
58
|
+
// is resolved first so a redelivered submission pinned to a retained earlier
|
|
59
|
+
// epoch returns its original entry instead of wedging on EPOCH_MISMATCH.
|
|
60
|
+
if (submission.expectedLedgerEpochId !== undefined &&
|
|
61
|
+
submission.expectedLedgerEpochId !== this.config.ledgerEpochId) {
|
|
62
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.EPOCH_MISMATCH, 'Wrong audit ledger epoch');
|
|
63
|
+
}
|
|
64
|
+
await this.ensureInitialized();
|
|
65
|
+
await this.persistSubmittedEvidence(submission.encryptedEvidence, producerEvent);
|
|
66
|
+
try {
|
|
67
|
+
return await this.appendEvent(producerEvent, context, false, identity);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
await this.disposeUncommittedEvidence(submission.encryptedEvidence, identity);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Best-effort compensation for write-ahead evidence whose append failed: the
|
|
76
|
+
* ciphertext is disposed only after re-confirming that no committed entry
|
|
77
|
+
* claims this event identity, so a raced idempotent commit is never stripped
|
|
78
|
+
* of its evidence. Failures here leave orphans for operator retention tooling.
|
|
79
|
+
*/
|
|
80
|
+
async disposeUncommittedEvidence(evidence, identity) {
|
|
81
|
+
if (evidence.length === 0 || this.config.evidence === undefined)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
const committed = await this.config.journal.getByIdempotencyKey(this.config.ledgerId, identity.idempotencyKey);
|
|
85
|
+
if (committed !== null)
|
|
86
|
+
return;
|
|
87
|
+
for (const item of evidence) {
|
|
88
|
+
await this.config.evidence.applyRetention({
|
|
89
|
+
kind: 'dispose',
|
|
90
|
+
ref: item.ref,
|
|
91
|
+
authorizedBy: 'audit-recorder',
|
|
92
|
+
reason: 'append_failed_uncommitted',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Retaining an orphan is preferable to disposing racing committed evidence.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
validateSubmissionEnvelope(submission, context) {
|
|
101
|
+
if (!context.producerAuthority || !context.tenantAuthority) {
|
|
102
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.UNAUTHORIZED_SUBMISSION, 'Authenticated producer and tenant authority are required');
|
|
103
|
+
}
|
|
104
|
+
if (submission.ledgerId !== this.config.ledgerId) {
|
|
105
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.LEDGER_MISMATCH, 'Wrong audit ledger');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
validateEventAuthority(event, context) {
|
|
109
|
+
if (!authorityMatchesParty(context.producerAuthority, context.producerRef, event.source.producer)) {
|
|
110
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.UNAUTHORIZED_SUBMISSION, 'Event producer does not match the authenticated producer authority');
|
|
111
|
+
}
|
|
112
|
+
if (!sameParty(event.tenantRef, this.config.tenantRef) ||
|
|
113
|
+
!authorityMatchesParty(context.tenantAuthority, context.tenantRef, event.tenantRef)) {
|
|
114
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.UNAUTHORIZED_SUBMISSION, 'Event tenant does not match the authenticated tenant authority');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async persistSubmittedEvidence(evidence, event) {
|
|
118
|
+
if (evidence.length === 0)
|
|
119
|
+
return;
|
|
120
|
+
if (this.config.evidence === undefined) {
|
|
121
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.EVIDENCE_FAILURE, 'Encrypted evidence was submitted but no evidence provider is configured');
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const refs = new Map(collectAuditEvidenceRefs(event).map((ref) => [ref.objectId, ref]));
|
|
125
|
+
const submitted = new Set();
|
|
126
|
+
for (const item of evidence) {
|
|
127
|
+
const referenced = refs.get(item.ref.objectId);
|
|
128
|
+
if (submitted.has(item.ref.objectId) || referenced === undefined ||
|
|
129
|
+
canonicalizeJson(referenced) !== canonicalizeJson(item.ref)) {
|
|
130
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.EVIDENCE_FAILURE, 'Submitted evidence does not exactly match a unique frozen event reference', { objectId: item.ref.objectId });
|
|
131
|
+
}
|
|
132
|
+
submitted.add(item.ref.objectId);
|
|
133
|
+
await this.config.evidence.putIfAbsent(item);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error instanceof AuditProtocolError &&
|
|
138
|
+
error.code === AUDIT_ERROR_CODES.EVIDENCE_FAILURE)
|
|
139
|
+
throw error;
|
|
140
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.EVIDENCE_FAILURE, 'Required evidence could not be persisted', undefined, { cause: error });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async ensureInitialized() {
|
|
144
|
+
const ledger = this.ledgerRef();
|
|
145
|
+
const existingHead = await this.config.journal.getHead(ledger);
|
|
146
|
+
if (existingHead !== null) {
|
|
147
|
+
const first = this.config.journal.readRange({ ...ledger, limit: 1 });
|
|
148
|
+
for await (const entry of first)
|
|
149
|
+
return this.validateExistingGenesis(entry);
|
|
150
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Ledger head exists without genesis');
|
|
151
|
+
}
|
|
152
|
+
if (this.config.previousEpochId !== undefined) {
|
|
153
|
+
const verifiedAndSealed = await this.config.epochTransitionGuard.verifyAndSeal({
|
|
154
|
+
ledgerId: this.config.ledgerId,
|
|
155
|
+
previousEpochId: this.config.previousEpochId,
|
|
156
|
+
nextEpochId: this.config.ledgerEpochId,
|
|
157
|
+
previousTerminalCheckpointDigest: this.config.previousTerminalCheckpointDigest,
|
|
158
|
+
});
|
|
159
|
+
if (!verifiedAndSealed) {
|
|
160
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.INVALID_CONFIGURATION, 'Predecessor checkpoint could not be verified and sealed');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
this.initialization ??= this.appendEvent(this.genesisEvent(), {
|
|
164
|
+
producerAuthority: this.config.signer.ref.did,
|
|
165
|
+
tenantAuthority: 'audit-recorder',
|
|
166
|
+
producerRef: { kind: 'public_did', did: this.config.signer.ref.did },
|
|
167
|
+
tenantRef: this.config.tenantRef,
|
|
168
|
+
}, true).finally(() => {
|
|
169
|
+
this.initialization = undefined;
|
|
170
|
+
});
|
|
171
|
+
return this.initialization;
|
|
172
|
+
}
|
|
173
|
+
validateExistingGenesis(candidate) {
|
|
174
|
+
try {
|
|
175
|
+
const entry = parseSignedAuditEntry(candidate);
|
|
176
|
+
const details = entry.core.event.details;
|
|
177
|
+
const valid = entry.core.sequence === '0' &&
|
|
178
|
+
entry.core.previousEntryDigest === null &&
|
|
179
|
+
entry.core.ledgerId === this.config.ledgerId &&
|
|
180
|
+
entry.core.ledgerEpochId === this.config.ledgerEpochId &&
|
|
181
|
+
sameSigner(entry.core.recorder, this.config.signer.ref) &&
|
|
182
|
+
entry.core.event.eventType === 'ledger.epoch.started' &&
|
|
183
|
+
entry.core.event.binding === this.config.binding &&
|
|
184
|
+
entry.core.event.source.sourceId === this.config.sourceId &&
|
|
185
|
+
entry.core.event.source.producer.kind === 'public_did' &&
|
|
186
|
+
entry.core.event.source.producer.did === this.config.signer.ref.did &&
|
|
187
|
+
sameParty(entry.core.event.tenantRef, this.config.tenantRef) &&
|
|
188
|
+
details.family === 'ledger' &&
|
|
189
|
+
details.phase === 'epoch_started' &&
|
|
190
|
+
details.previousEpochId === this.config.previousEpochId &&
|
|
191
|
+
details.previousTerminalCheckpointDigest ===
|
|
192
|
+
this.config.previousTerminalCheckpointDigest;
|
|
193
|
+
if (!valid)
|
|
194
|
+
throw new Error('Genesis does not match recorder epoch configuration');
|
|
195
|
+
return entry;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Existing ledger genesis does not match the authoritative recorder configuration', undefined, { cause: error });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
genesisEvent() {
|
|
202
|
+
return parseAuditProducerEvent({
|
|
203
|
+
schema: AUDIT_EVENT_SCHEMA_ID,
|
|
204
|
+
eventId: `genesis:${this.config.ledgerId}:${this.config.ledgerEpochId}`,
|
|
205
|
+
eventType: 'ledger.epoch.started',
|
|
206
|
+
eventVersion: '1.0.0',
|
|
207
|
+
binding: this.config.binding,
|
|
208
|
+
occurredAt: this.config.clock.now(),
|
|
209
|
+
tenantRef: this.config.tenantRef,
|
|
210
|
+
source: {
|
|
211
|
+
producer: { kind: 'public_did', did: this.config.signer.ref.did },
|
|
212
|
+
sourceId: this.config.sourceId,
|
|
213
|
+
sourceSequence: '0',
|
|
214
|
+
},
|
|
215
|
+
resource: { kind: 'public_did', did: this.config.signer.ref.did },
|
|
216
|
+
action: { category: 'ledger.epoch' },
|
|
217
|
+
outcome: 'succeeded',
|
|
218
|
+
evidence: [],
|
|
219
|
+
details: {
|
|
220
|
+
family: 'ledger',
|
|
221
|
+
phase: 'epoch_started',
|
|
222
|
+
...(this.config.previousEpochId
|
|
223
|
+
? {
|
|
224
|
+
previousEpochId: this.config.previousEpochId,
|
|
225
|
+
previousTerminalCheckpointDigest: this.config.previousTerminalCheckpointDigest,
|
|
226
|
+
}
|
|
227
|
+
: {}),
|
|
228
|
+
},
|
|
229
|
+
privacy: { classification: 'internal', retentionClass: 'integrity-ledger' },
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
async appendEvent(event, context, genesis = false, knownIdentity) {
|
|
233
|
+
const { eventDigest, idempotencyKey } = knownIdentity ??
|
|
234
|
+
await this.identifyEvent(event, context);
|
|
235
|
+
const duplicate = await this.config.journal.getByIdempotencyKey(this.config.ledgerId, idempotencyKey);
|
|
236
|
+
if (duplicate !== null) {
|
|
237
|
+
// A raced replica genesis differs only in recorder-authored timing, so it
|
|
238
|
+
// resolves through epoch-configuration validation, not content identity.
|
|
239
|
+
return genesis
|
|
240
|
+
? this.validateExistingGenesis(duplicate)
|
|
241
|
+
: this.resolveDuplicate(duplicate, eventDigest);
|
|
242
|
+
}
|
|
243
|
+
const ledger = this.ledgerRef();
|
|
244
|
+
for (let attempt = 0; attempt <= this.maxAppendConflicts; attempt += 1) {
|
|
245
|
+
const head = await this.config.journal.getHead(ledger);
|
|
246
|
+
if (genesis && head !== null) {
|
|
247
|
+
const raced = await this.config.journal.getByIdempotencyKey(this.config.ledgerId, idempotencyKey);
|
|
248
|
+
if (raced !== null)
|
|
249
|
+
return this.validateExistingGenesis(raced);
|
|
250
|
+
}
|
|
251
|
+
const candidate = await this.buildCandidate(event, eventDigest, head, genesis);
|
|
252
|
+
let result;
|
|
253
|
+
try {
|
|
254
|
+
result = await this.config.journal.compareAndAppend({
|
|
255
|
+
ledger,
|
|
256
|
+
expectedHead: head,
|
|
257
|
+
entry: candidate,
|
|
258
|
+
idempotencyKey,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Audit journal append failed', undefined, { cause: error });
|
|
263
|
+
}
|
|
264
|
+
if (result.kind === 'appended' || result.kind === 'duplicate') {
|
|
265
|
+
return result.kind === 'duplicate'
|
|
266
|
+
? this.resolveDuplicate(result.entry, eventDigest)
|
|
267
|
+
: result.entry;
|
|
268
|
+
}
|
|
269
|
+
if (result.kind === 'idempotency_conflict') {
|
|
270
|
+
return this.resolveDuplicate(result.existing, eventDigest);
|
|
271
|
+
}
|
|
272
|
+
if (sameHead(head, result.actualHead)) {
|
|
273
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, 'Audit journal reported a head conflict without advancing its head');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.APPEND_CONFLICT_EXHAUSTED, 'Audit append conflict retry budget exhausted');
|
|
277
|
+
}
|
|
278
|
+
async identifyEvent(event, context) {
|
|
279
|
+
const eventDigest = await digestAuditEvent(this.config.hasher, event);
|
|
280
|
+
const idempotencyKey = await hashAuditValue(this.config.hasher, AUDIT_DIGEST_DOMAINS.idempotency, {
|
|
281
|
+
ledgerId: this.config.ledgerId,
|
|
282
|
+
producerAuthority: context.producerAuthority,
|
|
283
|
+
sourceId: event.source.sourceId,
|
|
284
|
+
eventId: event.eventId,
|
|
285
|
+
});
|
|
286
|
+
return { eventDigest, idempotencyKey };
|
|
287
|
+
}
|
|
288
|
+
resolveDuplicate(existing, digest) {
|
|
289
|
+
if (existing.eventDigest !== digest) {
|
|
290
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.EVENT_ID_CONFLICT, 'Authenticated producer event identity was reused with different content', { eventId: existing.core.event.eventId });
|
|
291
|
+
}
|
|
292
|
+
return existing;
|
|
293
|
+
}
|
|
294
|
+
async buildCandidate(event, eventDigest, head, genesis) {
|
|
295
|
+
const sequence = head === null ? '0' : (BigInt(head.sequence) + 1n).toString();
|
|
296
|
+
if (genesis !== (sequence === '0')) {
|
|
297
|
+
throw new AuditProtocolError(AUDIT_ERROR_CODES.JOURNAL_FAILURE, genesis ? 'Genesis must be the first epoch entry' : 'Producer event cannot replace genesis');
|
|
298
|
+
}
|
|
299
|
+
const recordedAt = this.config.clock.now();
|
|
300
|
+
const evidenceManifestDigest = await digestAuditEvidenceManifest(this.config.hasher, event);
|
|
301
|
+
const core = parseAuditEntryCore({
|
|
302
|
+
schema: AUDIT_ENTRY_SCHEMA_ID,
|
|
303
|
+
ledgerId: this.config.ledgerId,
|
|
304
|
+
ledgerEpochId: this.config.ledgerEpochId,
|
|
305
|
+
sequence,
|
|
306
|
+
previousEntryDigest: head?.entryDigest ?? null,
|
|
307
|
+
recordedAt,
|
|
308
|
+
recorder: this.config.signer.ref,
|
|
309
|
+
eventDigest,
|
|
310
|
+
event,
|
|
311
|
+
evidenceManifestDigest,
|
|
312
|
+
integritySuite: AUDIT_INTEGRITY_SUITE,
|
|
313
|
+
});
|
|
314
|
+
const entryDigest = await digestAuditEntry(this.config.hasher, core);
|
|
315
|
+
const receiptCore = buildAuditRecorderReceiptCore(core, entryDigest);
|
|
316
|
+
const jws = await this.config.signer.sign(canonicalizeJsonBytes(receiptCore));
|
|
317
|
+
return deepFreeze({
|
|
318
|
+
core,
|
|
319
|
+
eventDigest,
|
|
320
|
+
entryDigest,
|
|
321
|
+
recorderReceipt: { core: receiptCore, jws },
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
ledgerRef() {
|
|
325
|
+
return {
|
|
326
|
+
ledgerId: this.config.ledgerId,
|
|
327
|
+
ledgerEpochId: this.config.ledgerEpochId,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=recorder-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder-service.js","sourceRoot":"","sources":["../../src/audit/recorder-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AuditHasher, AuditSignatureVerifier, AuditSigner } from './crypto.js';
|
|
2
|
+
import type { AuditBundleDisposition, AuditBundleSelectionV1, AuditAnchorReceipt, AuditReplayBundleV1, AuditVerificationPolicyV1, AuditVerificationReportV1, SignedAuditCheckpointV1 } from './types.js';
|
|
3
|
+
import { AuditArtifactVerifier } from './verifier.js';
|
|
4
|
+
export declare const AUDIT_BUNDLE_MEDIA_TYPES: Readonly<{
|
|
5
|
+
entries: "application/vnd.kya-os.audit.entries.v1+json";
|
|
6
|
+
checkpoints: "application/vnd.kya-os.audit.checkpoints.v1+json";
|
|
7
|
+
inclusionProofs: "application/vnd.kya-os.audit.inclusion-proofs.v1+json";
|
|
8
|
+
consistencyProofs: "application/vnd.kya-os.audit.consistency-proofs.v1+json";
|
|
9
|
+
observations: "application/vnd.kya-os.audit.observations.v1+json";
|
|
10
|
+
anchors: "application/vnd.kya-os.audit.anchors.v1+json";
|
|
11
|
+
verificationReport: "application/vnd.kya-os.audit.verification-report.v1+json";
|
|
12
|
+
}>;
|
|
13
|
+
export type AuditBundleComponentInput = {
|
|
14
|
+
path: string;
|
|
15
|
+
mediaType: string;
|
|
16
|
+
disposition: 'included';
|
|
17
|
+
content: unknown;
|
|
18
|
+
} | {
|
|
19
|
+
path: string;
|
|
20
|
+
mediaType: string;
|
|
21
|
+
disposition: Exclude<AuditBundleDisposition, 'included'>;
|
|
22
|
+
reasonCode: string;
|
|
23
|
+
};
|
|
24
|
+
export interface AuditReplayBundleExportInput {
|
|
25
|
+
bundleId: string;
|
|
26
|
+
purpose: string;
|
|
27
|
+
verificationPolicyDigest: `sha256:${string}`;
|
|
28
|
+
selections: readonly AuditBundleSelectionV1[];
|
|
29
|
+
components: readonly AuditBundleComponentInput[];
|
|
30
|
+
}
|
|
31
|
+
export interface AuditReplayBundleExporterOptions {
|
|
32
|
+
hasher: AuditHasher;
|
|
33
|
+
signer: AuditSigner;
|
|
34
|
+
clock: {
|
|
35
|
+
now(): number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Produces deterministic, signed-inventory evidence bundles. */
|
|
39
|
+
export declare class AuditReplayBundleExporter {
|
|
40
|
+
private readonly options;
|
|
41
|
+
constructor(options: AuditReplayBundleExporterOptions);
|
|
42
|
+
export(input: AuditReplayBundleExportInput): Promise<AuditReplayBundleV1>;
|
|
43
|
+
}
|
|
44
|
+
export interface VerifyAuditBundleDependencies {
|
|
45
|
+
hasher: AuditHasher;
|
|
46
|
+
signatures: AuditSignatureVerifier;
|
|
47
|
+
artifacts?: AuditArtifactVerifier;
|
|
48
|
+
verifySupportingAnchor?: (checkpoint: SignedAuditCheckpointV1, receipt: AuditAnchorReceipt) => Promise<boolean>;
|
|
49
|
+
}
|
|
50
|
+
/** Offline bundle verification. Trust is supplied only through the policy argument. */
|
|
51
|
+
export declare function verifyAuditBundle(bundle: AuditReplayBundleV1 | unknown, policy: AuditVerificationPolicyV1, dependencies: VerifyAuditBundleDependencies): Promise<AuditVerificationReportV1>;
|
|
52
|
+
//# sourceMappingURL=replay-bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-bundle.d.ts","sourceRoot":"","sources":["../../src/audit/replay-bundle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAepF,OAAO,KAAK,EAGV,sBAAsB,EAItB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EAEnB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EAGxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,qBAAqB,EAEtB,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,wBAAwB;;;;;;;;EAQnC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEN,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,EAAE,UAAU,MAAM,EAAE,CAAC;IAC7C,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE;QAAE,GAAG,IAAI,MAAM,CAAA;KAAE,CAAC;CAC1B;AAqDD,iEAAiE;AACjE,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,gCAAgC;IAEhE,MAAM,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA6DhF;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,sBAAsB,CAAC;IACnC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,sBAAsB,CAAC,EAAE,CACvB,UAAU,EAAE,uBAAuB,EACnC,OAAO,EAAE,kBAAkB,KACxB,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAwVD,uFAAuF;AACvF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,mBAAmB,GAAG,OAAO,EACrC,MAAM,EAAE,yBAAyB,EACjC,YAAY,EAAE,6BAA6B,GAC1C,OAAO,CAAC,yBAAyB,CAAC,CAiMpC"}
|