@noeos/verification-engine 0.0.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.
Files changed (184) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +11 -0
  4. package/README.md +7 -0
  5. package/dist/cjs/api/engine.js +271 -0
  6. package/dist/cjs/api/types.js +10 -0
  7. package/dist/cjs/chains/chain-builder.js +541 -0
  8. package/dist/cjs/chains/duplicate-detector.js +208 -0
  9. package/dist/cjs/chains/verify-chain.js +656 -0
  10. package/dist/cjs/contracts/generated.js +512 -0
  11. package/dist/cjs/contracts/schema-assets.js +6 -0
  12. package/dist/cjs/contracts/vector-assets.js +6 -0
  13. package/dist/cjs/domain/algorithm-id.js +5 -0
  14. package/dist/cjs/domain/byte-view.js +7 -0
  15. package/dist/cjs/domain/chain.js +3 -0
  16. package/dist/cjs/domain/diagnostic.js +6 -0
  17. package/dist/cjs/domain/digest.js +37 -0
  18. package/dist/cjs/domain/duplicate-policy.js +3 -0
  19. package/dist/cjs/domain/evidence.js +10 -0
  20. package/dist/cjs/domain/identifiers.js +52 -0
  21. package/dist/cjs/domain/json-value.js +3 -0
  22. package/dist/cjs/domain/limits.js +24 -0
  23. package/dist/cjs/domain/operation-result.js +19 -0
  24. package/dist/cjs/domain/position.js +16 -0
  25. package/dist/cjs/domain/protocol-version.js +5 -0
  26. package/dist/cjs/domain/rule.js +3 -0
  27. package/dist/cjs/domain/stream.js +3 -0
  28. package/dist/cjs/domain/version.js +16 -0
  29. package/dist/cjs/evidence/digest-evidence.js +22 -0
  30. package/dist/cjs/evidence/evidence-parser.js +288 -0
  31. package/dist/cjs/framing/frame-builders.js +124 -0
  32. package/dist/cjs/framing/frame-encoder.js +238 -0
  33. package/dist/cjs/framing/frame-parser.js +173 -0
  34. package/dist/cjs/framing/frame-types.js +3 -0
  35. package/dist/cjs/hashing/hash-adapter.js +90 -0
  36. package/dist/cjs/hashing/hash-frame.js +16 -0
  37. package/dist/cjs/index.js +16 -0
  38. package/dist/cjs/normalization/byte-sink.js +70 -0
  39. package/dist/cjs/normalization/jcs-profile.js +154 -0
  40. package/dist/cjs/normalization/normalize.js +56 -0
  41. package/dist/cjs/normalization/profile-registry.js +66 -0
  42. package/dist/cjs/normalization/profile.js +3 -0
  43. package/dist/cjs/normalization/raw-bytes-profile.js +27 -0
  44. package/dist/cjs/package.json +3 -0
  45. package/dist/cjs/profiles.js +9 -0
  46. package/dist/cjs/records/record-service.js +278 -0
  47. package/dist/cjs/rules/rule-set.js +211 -0
  48. package/dist/cjs/schemas.js +6 -0
  49. package/dist/cjs/validation/algorithm-validation.js +12 -0
  50. package/dist/cjs/validation/diagnostic-collector.js +159 -0
  51. package/dist/cjs/validation/digest-validation.js +48 -0
  52. package/dist/cjs/validation/identifier-validation.js +33 -0
  53. package/dist/cjs/validation/json-text-parser.js +297 -0
  54. package/dist/cjs/validation/json-value-validation.js +155 -0
  55. package/dist/cjs/validation/limit-validation.js +75 -0
  56. package/dist/cjs/validation/object-inspection.js +60 -0
  57. package/dist/cjs/validation/position-validation.js +13 -0
  58. package/dist/cjs/validation/result-helpers.js +9 -0
  59. package/dist/cjs/validation/utf8-validation.js +69 -0
  60. package/dist/cjs/validation/version-validation.js +31 -0
  61. package/dist/cjs/vectors.js +6 -0
  62. package/dist/esm/api/engine.js +266 -0
  63. package/dist/esm/api/types.js +4 -0
  64. package/dist/esm/chains/chain-builder.js +536 -0
  65. package/dist/esm/chains/duplicate-detector.js +204 -0
  66. package/dist/esm/chains/verify-chain.js +652 -0
  67. package/dist/esm/contracts/generated.js +509 -0
  68. package/dist/esm/contracts/schema-assets.js +2 -0
  69. package/dist/esm/contracts/vector-assets.js +2 -0
  70. package/dist/esm/domain/algorithm-id.js +2 -0
  71. package/dist/esm/domain/byte-view.js +4 -0
  72. package/dist/esm/domain/chain.js +2 -0
  73. package/dist/esm/domain/diagnostic.js +3 -0
  74. package/dist/esm/domain/digest.js +32 -0
  75. package/dist/esm/domain/duplicate-policy.js +2 -0
  76. package/dist/esm/domain/evidence.js +7 -0
  77. package/dist/esm/domain/identifiers.js +45 -0
  78. package/dist/esm/domain/json-value.js +2 -0
  79. package/dist/esm/domain/limits.js +21 -0
  80. package/dist/esm/domain/operation-result.js +15 -0
  81. package/dist/esm/domain/position.js +12 -0
  82. package/dist/esm/domain/protocol-version.js +2 -0
  83. package/dist/esm/domain/rule.js +2 -0
  84. package/dist/esm/domain/stream.js +2 -0
  85. package/dist/esm/domain/version.js +12 -0
  86. package/dist/esm/evidence/digest-evidence.js +19 -0
  87. package/dist/esm/evidence/evidence-parser.js +281 -0
  88. package/dist/esm/framing/frame-builders.js +114 -0
  89. package/dist/esm/framing/frame-encoder.js +234 -0
  90. package/dist/esm/framing/frame-parser.js +170 -0
  91. package/dist/esm/framing/frame-types.js +2 -0
  92. package/dist/esm/hashing/hash-adapter.js +84 -0
  93. package/dist/esm/hashing/hash-frame.js +12 -0
  94. package/dist/esm/index.js +5 -0
  95. package/dist/esm/normalization/byte-sink.js +66 -0
  96. package/dist/esm/normalization/jcs-profile.js +151 -0
  97. package/dist/esm/normalization/normalize.js +52 -0
  98. package/dist/esm/normalization/profile-registry.js +62 -0
  99. package/dist/esm/normalization/profile.js +2 -0
  100. package/dist/esm/normalization/raw-bytes-profile.js +24 -0
  101. package/dist/esm/profiles.js +6 -0
  102. package/dist/esm/records/record-service.js +270 -0
  103. package/dist/esm/rules/rule-set.js +206 -0
  104. package/dist/esm/schemas.js +2 -0
  105. package/dist/esm/validation/algorithm-validation.js +9 -0
  106. package/dist/esm/validation/diagnostic-collector.js +154 -0
  107. package/dist/esm/validation/digest-validation.js +43 -0
  108. package/dist/esm/validation/identifier-validation.js +27 -0
  109. package/dist/esm/validation/json-text-parser.js +294 -0
  110. package/dist/esm/validation/json-value-validation.js +152 -0
  111. package/dist/esm/validation/limit-validation.js +71 -0
  112. package/dist/esm/validation/object-inspection.js +54 -0
  113. package/dist/esm/validation/position-validation.js +10 -0
  114. package/dist/esm/validation/result-helpers.js +6 -0
  115. package/dist/esm/validation/utf8-validation.js +63 -0
  116. package/dist/esm/validation/version-validation.js +26 -0
  117. package/dist/esm/vectors.js +2 -0
  118. package/dist/types/api/engine.d.ts +8 -0
  119. package/dist/types/api/types.d.ts +124 -0
  120. package/dist/types/chains/chain-builder.d.ts +42 -0
  121. package/dist/types/chains/duplicate-detector.d.ts +18 -0
  122. package/dist/types/chains/verify-chain.d.ts +9 -0
  123. package/dist/types/contracts/generated.d.ts +442 -0
  124. package/dist/types/contracts/schema-assets.d.ts +2 -0
  125. package/dist/types/contracts/vector-assets.d.ts +2 -0
  126. package/dist/types/domain/algorithm-id.d.ts +4 -0
  127. package/dist/types/domain/byte-view.d.ts +1 -0
  128. package/dist/types/domain/chain.d.ts +43 -0
  129. package/dist/types/domain/diagnostic.d.ts +23 -0
  130. package/dist/types/domain/digest.d.ts +12 -0
  131. package/dist/types/domain/duplicate-policy.d.ts +26 -0
  132. package/dist/types/domain/evidence.d.ts +100 -0
  133. package/dist/types/domain/identifiers.d.ts +29 -0
  134. package/dist/types/domain/json-value.d.ts +6 -0
  135. package/dist/types/domain/limits.d.ts +13 -0
  136. package/dist/types/domain/operation-result.d.ts +12 -0
  137. package/dist/types/domain/position.d.ts +8 -0
  138. package/dist/types/domain/protocol-version.d.ts +2 -0
  139. package/dist/types/domain/rule.d.ts +34 -0
  140. package/dist/types/domain/stream.d.ts +5 -0
  141. package/dist/types/domain/version.d.ts +8 -0
  142. package/dist/types/evidence/digest-evidence.d.ts +4 -0
  143. package/dist/types/evidence/evidence-parser.d.ts +8 -0
  144. package/dist/types/framing/frame-builders.d.ts +40 -0
  145. package/dist/types/framing/frame-encoder.d.ts +6 -0
  146. package/dist/types/framing/frame-parser.d.ts +4 -0
  147. package/dist/types/framing/frame-types.d.ts +27 -0
  148. package/dist/types/hashing/hash-adapter.d.ts +12 -0
  149. package/dist/types/hashing/hash-frame.d.ts +6 -0
  150. package/dist/types/index.d.ts +8 -0
  151. package/dist/types/normalization/byte-sink.d.ts +19 -0
  152. package/dist/types/normalization/jcs-profile.d.ts +3 -0
  153. package/dist/types/normalization/normalize.d.ts +11 -0
  154. package/dist/types/normalization/profile-registry.d.ts +26 -0
  155. package/dist/types/normalization/profile.d.ts +22 -0
  156. package/dist/types/normalization/raw-bytes-profile.d.ts +2 -0
  157. package/dist/types/profiles.d.ts +8 -0
  158. package/dist/types/records/record-service.d.ts +38 -0
  159. package/dist/types/rules/rule-set.d.ts +13 -0
  160. package/dist/types/schemas.d.ts +2 -0
  161. package/dist/types/validation/algorithm-validation.d.ts +3 -0
  162. package/dist/types/validation/diagnostic-collector.d.ts +24 -0
  163. package/dist/types/validation/digest-validation.d.ts +6 -0
  164. package/dist/types/validation/identifier-validation.d.ts +6 -0
  165. package/dist/types/validation/json-text-parser.d.ts +4 -0
  166. package/dist/types/validation/json-value-validation.d.ts +4 -0
  167. package/dist/types/validation/limit-validation.d.ts +4 -0
  168. package/dist/types/validation/object-inspection.d.ts +11 -0
  169. package/dist/types/validation/position-validation.d.ts +3 -0
  170. package/dist/types/validation/result-helpers.d.ts +3 -0
  171. package/dist/types/validation/utf8-validation.d.ts +5 -0
  172. package/dist/types/validation/version-validation.d.ts +9 -0
  173. package/dist/types/vectors.d.ts +2 -0
  174. package/package.json +61 -0
  175. package/schemas/chain-summary.v1.schema.json +156 -0
  176. package/schemas/diagnostic.v1.schema.json +107 -0
  177. package/schemas/link-evidence.v1.schema.json +165 -0
  178. package/schemas/record-evidence.v1.schema.json +91 -0
  179. package/schemas/vector-set.v1.schema.json +52 -0
  180. package/vectors/evidence.json +26 -0
  181. package/vectors/framing.json +136 -0
  182. package/vectors/hashing.json +58 -0
  183. package/vectors/invalid.json +56 -0
  184. package/vectors/manifest.json +46 -0
@@ -0,0 +1,4 @@
1
+ /** Algorithms available to protocol 1 creation and verification. */
2
+ /** @public */
3
+ export type AlgorithmId = "sha-256" | "sha-384" | "sha-512";
4
+ export declare const ALGORITHM_IDS: readonly AlgorithmId[];
@@ -0,0 +1 @@
1
+ export declare function copyBytes(value: Uint8Array): Uint8Array;
@@ -0,0 +1,43 @@
1
+ import type { AlgorithmId } from "./algorithm-id.js";
2
+ import type { DuplicatePolicy } from "./duplicate-policy.js";
3
+ import type { PreviousLink } from "./evidence.js";
4
+ import type { Rule } from "./rule.js";
5
+ /** @public */
6
+ export interface ProfileReference {
7
+ readonly id: string;
8
+ readonly version: string;
9
+ }
10
+ /** @public */
11
+ export interface RecordInput {
12
+ readonly contextId: string;
13
+ readonly recordId: string;
14
+ readonly payload: unknown;
15
+ readonly profile: ProfileReference;
16
+ readonly algorithm: AlgorithmId;
17
+ }
18
+ export interface ChainConfig {
19
+ readonly contextId: string;
20
+ readonly sequenceId: string;
21
+ readonly profile: ProfileReference;
22
+ readonly algorithm: AlgorithmId;
23
+ readonly duplicatePolicy?: DuplicatePolicy;
24
+ readonly rules?: readonly Rule[];
25
+ readonly allowEmpty?: boolean;
26
+ }
27
+ /** @public */
28
+ export interface ChainRecordInput {
29
+ readonly recordId: string;
30
+ readonly payload: unknown;
31
+ readonly position: number;
32
+ readonly previous: PreviousLink;
33
+ }
34
+ /** @public */
35
+ export interface ChainSnapshot {
36
+ readonly contextId: string;
37
+ readonly sequenceId: string;
38
+ readonly profile: ProfileReference;
39
+ readonly algorithm: AlgorithmId;
40
+ readonly nextPosition: number;
41
+ readonly previous: PreviousLink;
42
+ readonly count: number;
43
+ }
@@ -0,0 +1,23 @@
1
+ import type { DiagnosticCode, DiagnosticSeverity } from "../contracts/generated.js";
2
+ export type { DiagnosticCode, DiagnosticSeverity } from "../contracts/generated.js";
3
+ /** @public */
4
+ export type DiagnosticPhase = "input" | "normalization" | "record" | "link" | "chain" | "output";
5
+ /** @public */
6
+ export type DiagnosticDetail = string | number | boolean | null;
7
+ /** @public */
8
+ export type DiagnosticDetails = Readonly<Record<string, DiagnosticDetail>>;
9
+ /** @public */
10
+ export declare const DIAGNOSTIC_SCHEMA: "urn:noeos:verification-engine:diagnostic:1";
11
+ /** @public */
12
+ export interface Diagnostic {
13
+ readonly $schema: typeof DIAGNOSTIC_SCHEMA;
14
+ readonly code: DiagnosticCode;
15
+ readonly severity: DiagnosticSeverity;
16
+ readonly phase: DiagnosticPhase;
17
+ readonly messageKey: string;
18
+ readonly path?: string;
19
+ readonly recordId?: string;
20
+ readonly position?: number;
21
+ readonly details?: DiagnosticDetails;
22
+ readonly causeCode?: string;
23
+ }
@@ -0,0 +1,12 @@
1
+ import type { AlgorithmId } from "./algorithm-id.js";
2
+ /** @public */
3
+ export declare class Digest {
4
+ readonly algorithm: AlgorithmId;
5
+ private readonly bytes;
6
+ private constructor();
7
+ static fromValidated(algorithm: AlgorithmId, bytes: Uint8Array): Digest;
8
+ toBytes(): Uint8Array;
9
+ toHex(): string;
10
+ }
11
+ /** Internal framing access; the returned view never escapes the trusted frame writer. */
12
+ export declare function digestBytesForTrustedFrame(value: Digest): Uint8Array;
@@ -0,0 +1,26 @@
1
+ /** @public */
2
+ export type DuplicateKind = "record-id" | "content-digest" | "link-digest" | "fork";
3
+ /** @public */
4
+ export interface DuplicateObservation {
5
+ readonly kind: DuplicateKind;
6
+ readonly key: string;
7
+ readonly value?: string;
8
+ }
9
+ /** @public */
10
+ export interface ExternalDuplicateIndex {
11
+ /** Must inspect and commit the batch atomically, with no partial write on a fatal duplicate. */
12
+ observe(batch: readonly DuplicateObservation[]): unknown;
13
+ }
14
+ /** @public */
15
+ export type DuplicatePolicy = {
16
+ readonly kind: "none";
17
+ } | {
18
+ readonly kind: "window";
19
+ readonly size: number;
20
+ } | {
21
+ readonly kind: "full";
22
+ readonly maxRecords: number;
23
+ } | {
24
+ readonly kind: "external";
25
+ readonly index: ExternalDuplicateIndex;
26
+ };
@@ -0,0 +1,100 @@
1
+ import type { AlgorithmId } from "./algorithm-id.js";
2
+ import type { Diagnostic } from "./diagnostic.js";
3
+ /** @public */
4
+ export declare const RECORD_EVIDENCE_SCHEMA: "urn:noeos:verification-engine:record-evidence:1";
5
+ /** @public */
6
+ export declare const LINK_EVIDENCE_SCHEMA: "urn:noeos:verification-engine:link-evidence:1";
7
+ /** @public */
8
+ export declare const CHAIN_SUMMARY_EVIDENCE_SCHEMA: "urn:noeos:verification-engine:chain-summary:1";
9
+ /** @public */
10
+ export interface EvidenceProfile {
11
+ readonly id: string;
12
+ readonly version: string;
13
+ }
14
+ /** @public */
15
+ export interface RecordEvidenceFields {
16
+ readonly protocolVersion: 1;
17
+ readonly contextId: string;
18
+ readonly recordId: string;
19
+ readonly profile: EvidenceProfile;
20
+ readonly algorithm: AlgorithmId;
21
+ readonly normalizedByteLength: number;
22
+ readonly contentDigest: string;
23
+ readonly recordDigest: string;
24
+ }
25
+ /** @public */
26
+ export interface RecordEvidence extends RecordEvidenceFields {
27
+ readonly $schema: typeof RECORD_EVIDENCE_SCHEMA;
28
+ }
29
+ /** @public */
30
+ export type PreviousLink = {
31
+ readonly kind: "none";
32
+ } | {
33
+ readonly kind: "digest";
34
+ readonly value: string;
35
+ };
36
+ /** @public */
37
+ export interface LinkEvidence extends RecordEvidenceFields {
38
+ readonly $schema: typeof LINK_EVIDENCE_SCHEMA;
39
+ readonly sequenceId: string;
40
+ readonly position: number;
41
+ readonly previous: PreviousLink;
42
+ readonly linkDigest: string;
43
+ }
44
+ /** @public */
45
+ export type BoundaryState = "verified" | "unverified" | "not-applicable";
46
+ /** @public */
47
+ export type VerificationStatus = "valid" | "invalid" | "indeterminate" | "aborted";
48
+ /** @public */
49
+ export interface DiagnosticSummary {
50
+ readonly errors: number;
51
+ readonly warnings: number;
52
+ readonly info: number;
53
+ readonly truncated: boolean;
54
+ }
55
+ /** @public */
56
+ export interface ChainSummaryEvidence {
57
+ readonly $schema: typeof CHAIN_SUMMARY_EVIDENCE_SCHEMA;
58
+ readonly protocolVersion: 1;
59
+ readonly contextId: string;
60
+ readonly sequenceId: string;
61
+ readonly profile: EvidenceProfile;
62
+ readonly algorithm: AlgorithmId;
63
+ readonly count: number;
64
+ readonly firstPosition?: number;
65
+ readonly lastPosition?: number;
66
+ readonly firstLinkDigest?: string;
67
+ readonly finalLinkDigest?: string;
68
+ readonly boundaries: Readonly<{
69
+ readonly start: BoundaryState;
70
+ readonly end: BoundaryState;
71
+ }>;
72
+ readonly status: VerificationStatus;
73
+ readonly diagnostics: DiagnosticSummary;
74
+ }
75
+ /** @public */
76
+ export type Evidence = RecordEvidence | LinkEvidence | ChainSummaryEvidence;
77
+ /** @public */
78
+ export interface VerificationStats {
79
+ readonly recordsSeen: number;
80
+ readonly recordsVerified: number;
81
+ readonly linksVerified: number;
82
+ readonly bytesNormalized: number;
83
+ readonly errors: number;
84
+ readonly warnings: number;
85
+ readonly info: number;
86
+ }
87
+ /** @public */
88
+ export type VerificationMode = "complete" | "fragment" | "internal";
89
+ /** @public */
90
+ export interface VerificationResult<T> {
91
+ readonly status: VerificationStatus;
92
+ readonly diagnostics: readonly Diagnostic[];
93
+ readonly evidence: T | undefined;
94
+ readonly stats: VerificationStats;
95
+ readonly boundaries: Readonly<{
96
+ readonly start: BoundaryState;
97
+ readonly end: BoundaryState;
98
+ }>;
99
+ readonly verificationMode: VerificationMode;
100
+ }
@@ -0,0 +1,29 @@
1
+ declare const recordIdBrand: unique symbol;
2
+ declare const sequenceIdBrand: unique symbol;
3
+ declare const contextIdBrand: unique symbol;
4
+ declare const profileIdBrand: unique symbol;
5
+ export declare class RecordId {
6
+ readonly value: string;
7
+ readonly [recordIdBrand] = true;
8
+ private constructor();
9
+ static fromValidated(value: string): RecordId;
10
+ }
11
+ export declare class SequenceId {
12
+ readonly value: string;
13
+ readonly [sequenceIdBrand] = true;
14
+ private constructor();
15
+ static fromValidated(value: string): SequenceId;
16
+ }
17
+ export declare class ContextId {
18
+ readonly value: string;
19
+ readonly [contextIdBrand] = true;
20
+ private constructor();
21
+ static fromValidated(value: string): ContextId;
22
+ }
23
+ export declare class ProfileId {
24
+ readonly value: string;
25
+ readonly [profileIdBrand] = true;
26
+ private constructor();
27
+ static fromValidated(value: string): ProfileId;
28
+ }
29
+ export {};
@@ -0,0 +1,6 @@
1
+ export type JsonPrimitive = null | boolean | number | string;
2
+ export type JsonArray = readonly JsonValue[];
3
+ export interface JsonObject {
4
+ readonly [key: string]: JsonValue;
5
+ }
6
+ export type JsonValue = JsonPrimitive | JsonArray | JsonObject;
@@ -0,0 +1,13 @@
1
+ /** @public */
2
+ export interface Limits {
3
+ readonly maxPayloadBytes: number;
4
+ readonly maxJsonDepth: number;
5
+ readonly maxObjectProperties: number;
6
+ readonly maxArrayElements: number;
7
+ readonly maxStringBytes: number;
8
+ readonly maxNdjsonLineBytes: number;
9
+ readonly maxDiagnostics: number;
10
+ readonly maxFullRecords: number;
11
+ }
12
+ export declare const DEFAULT_LIMITS: Limits;
13
+ export declare const HARD_LIMITS: Limits;
@@ -0,0 +1,12 @@
1
+ import type { Diagnostic } from "./diagnostic.js";
2
+ /** @public */
3
+ export type OperationResult<T> = {
4
+ readonly ok: true;
5
+ readonly value: T;
6
+ readonly diagnostics: readonly Diagnostic[];
7
+ } | {
8
+ readonly ok: false;
9
+ readonly diagnostics: readonly Diagnostic[];
10
+ };
11
+ export declare function success<T>(value: T, diagnostics?: readonly Diagnostic[]): OperationResult<T>;
12
+ export declare function failure<T>(diagnostics: readonly Diagnostic[]): OperationResult<T>;
@@ -0,0 +1,8 @@
1
+ declare const positionBrand: unique symbol;
2
+ export declare class Position {
3
+ readonly value: number;
4
+ readonly [positionBrand] = true;
5
+ private constructor();
6
+ static fromValidated(value: number): Position;
7
+ }
8
+ export {};
@@ -0,0 +1,2 @@
1
+ export type ProtocolVersion = 1;
2
+ export declare const CURRENT_PROTOCOL_VERSION: ProtocolVersion;
@@ -0,0 +1,34 @@
1
+ import type { DiagnosticDetails, DiagnosticPhase, DiagnosticSeverity } from "./diagnostic.js";
2
+ /** @public */
3
+ export type RulePhase = Exclude<DiagnosticPhase, "output">;
4
+ /** @public */
5
+ export interface ReadonlyByteView {
6
+ readonly byteLength: number;
7
+ copySlice(start?: number, end?: number): Uint8Array;
8
+ }
9
+ /** @public */
10
+ export interface RuleFinding {
11
+ readonly messageKey: string;
12
+ readonly path?: string;
13
+ readonly details?: DiagnosticDetails;
14
+ readonly severity?: DiagnosticSeverity;
15
+ }
16
+ /** @public */
17
+ export interface RuleContext {
18
+ readonly phase: RulePhase;
19
+ readonly input?: Readonly<Record<string, unknown>>;
20
+ readonly normalized?: ReadonlyByteView;
21
+ readonly record?: object;
22
+ readonly link?: object;
23
+ readonly chain?: object;
24
+ readonly recordId?: string;
25
+ readonly position?: number;
26
+ }
27
+ /** @public */
28
+ export interface Rule {
29
+ readonly id: string;
30
+ readonly version: string;
31
+ readonly phases: readonly RulePhase[];
32
+ readonly defaultSeverity: DiagnosticSeverity;
33
+ evaluate(context: RuleContext): unknown;
34
+ }
@@ -0,0 +1,5 @@
1
+ import type { LinkEvidence } from "./evidence.js";
2
+ export interface StreamOptions {
3
+ readonly signal?: AbortSignal;
4
+ readonly onEvidence?: (evidence: LinkEvidence) => void | Promise<void>;
5
+ }
@@ -0,0 +1,8 @@
1
+ declare const profileVersionBrand: unique symbol;
2
+ export declare class ProfileVersion {
3
+ readonly value: string;
4
+ readonly [profileVersionBrand] = true;
5
+ private constructor();
6
+ static fromValidated(value: string): ProfileVersion;
7
+ }
8
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { Digest } from "../domain/digest.js";
2
+ import type { Limits } from "../domain/limits.js";
3
+ import type { OperationResult } from "../domain/operation-result.js";
4
+ export declare function digestEvidence(value: unknown, limits: Limits): OperationResult<Digest>;
@@ -0,0 +1,8 @@
1
+ import type { ChainSummaryEvidence, Evidence, LinkEvidence, RecordEvidence } from "../domain/evidence.js";
2
+ import type { Limits } from "../domain/limits.js";
3
+ import type { OperationResult } from "../domain/operation-result.js";
4
+ export declare function parseEvidence(value: unknown, limits: Limits): OperationResult<Evidence>;
5
+ export declare function parseEvidenceText(value: unknown, limits: Limits): OperationResult<Evidence>;
6
+ export declare function parseRecordEvidence(value: unknown, limits: Limits): OperationResult<RecordEvidence>;
7
+ export declare function parseLinkEvidence(value: unknown, limits: Limits): OperationResult<LinkEvidence>;
8
+ export declare function parseChainSummaryEvidence(value: unknown, limits: Limits): OperationResult<ChainSummaryEvidence>;
@@ -0,0 +1,40 @@
1
+ import type { Digest } from "../domain/digest.js";
2
+ import type { Limits } from "../domain/limits.js";
3
+ import type { OperationResult } from "../domain/operation-result.js";
4
+ export interface ContentFrameInput {
5
+ readonly algorithm: string;
6
+ readonly profileId: string;
7
+ readonly profileVersion: string;
8
+ readonly normalizedBytes: Uint8Array;
9
+ }
10
+ export interface RecordFrameInput {
11
+ readonly algorithm: string;
12
+ readonly contextId: string;
13
+ readonly recordId: string;
14
+ readonly profileId: string;
15
+ readonly profileVersion: string;
16
+ readonly normalizedByteLength: number;
17
+ readonly contentDigest: Digest;
18
+ }
19
+ export interface LinkFrameInput {
20
+ readonly algorithm: string;
21
+ readonly contextId: string;
22
+ readonly sequenceId: string;
23
+ readonly position: number;
24
+ readonly recordId: string;
25
+ readonly recordDigest: Digest;
26
+ readonly previousLinkDigest?: Digest;
27
+ }
28
+ export interface EvidenceFrameInput {
29
+ readonly algorithm: string;
30
+ readonly schemaUrn: string;
31
+ readonly evidenceJcsBytes: Uint8Array;
32
+ }
33
+ export declare function buildContentFrame(input: ContentFrameInput, limits: Limits): OperationResult<Uint8Array>;
34
+ export declare function buildRecordFrame(input: RecordFrameInput, limits: Limits): OperationResult<Uint8Array>;
35
+ export declare function buildLinkFrame(input: LinkFrameInput, limits: Limits): OperationResult<Uint8Array>;
36
+ export declare function buildEvidenceFrame(input: EvidenceFrameInput, limits: Limits): OperationResult<Uint8Array>;
37
+ export declare function buildTrustedContentFrame(input: ContentFrameInput, limits: Limits): OperationResult<Uint8Array>;
38
+ export declare function buildTrustedRecordFrame(input: RecordFrameInput, limits: Limits): OperationResult<Uint8Array>;
39
+ export declare function buildTrustedLinkFrame(input: LinkFrameInput, limits: Limits): OperationResult<Uint8Array>;
40
+ export declare function buildTrustedEvidenceFrame(input: EvidenceFrameInput, limits: Limits): OperationResult<Uint8Array>;
@@ -0,0 +1,6 @@
1
+ import type { Limits } from "../domain/limits.js";
2
+ import type { OperationResult } from "../domain/operation-result.js";
3
+ import type { FrameInput } from "./frame-types.js";
4
+ export declare function encodeFrame(input: unknown, limits: Limits): OperationResult<Uint8Array>;
5
+ /** Internal fast path. Callers must have completed positive validation. */
6
+ export declare function encodeTrustedFrame(input: FrameInput, limits: Limits): OperationResult<Uint8Array>;
@@ -0,0 +1,4 @@
1
+ import type { Limits } from "../domain/limits.js";
2
+ import type { OperationResult } from "../domain/operation-result.js";
3
+ import type { ParsedFrame } from "./frame-types.js";
4
+ export declare function parseFrame(input: unknown, limits: Limits): OperationResult<ParsedFrame>;
@@ -0,0 +1,27 @@
1
+ export type FrameKind = "content" | "record" | "link" | "evidence";
2
+ export type FrameFieldType = "bytes" | "utf8" | "uint64" | "none";
3
+ export type FrameField = {
4
+ readonly tag: number;
5
+ readonly type: "bytes";
6
+ readonly value: Uint8Array;
7
+ } | {
8
+ readonly tag: number;
9
+ readonly type: "utf8";
10
+ readonly value: string;
11
+ } | {
12
+ readonly tag: number;
13
+ readonly type: "uint64";
14
+ readonly value: number;
15
+ } | {
16
+ readonly tag: number;
17
+ readonly type: "none";
18
+ };
19
+ export interface FrameInput {
20
+ readonly kind: FrameKind;
21
+ readonly fields: readonly FrameField[];
22
+ }
23
+ export interface ParsedFrame {
24
+ readonly kind: FrameKind;
25
+ readonly protocolVersion: 1;
26
+ readonly fields: readonly FrameField[];
27
+ }
@@ -0,0 +1,12 @@
1
+ import type { AlgorithmId } from "../domain/algorithm-id.js";
2
+ import type { Digest } from "../domain/digest.js";
3
+ import type { Limits } from "../domain/limits.js";
4
+ import type { OperationResult } from "../domain/operation-result.js";
5
+ export interface HashSink {
6
+ update(value: Uint8Array): void;
7
+ digest(): Digest;
8
+ }
9
+ export declare function createHashSink(algorithm: unknown, limits: Limits): OperationResult<HashSink>;
10
+ export declare function hashBytes(algorithm: unknown, input: unknown, limits: Limits): OperationResult<Digest>;
11
+ export declare function hashValidatedBytes(algorithm: AlgorithmId, input: Uint8Array): OperationResult<Digest>;
12
+ export declare function hashChunks(algorithm: unknown, chunks: Iterable<Uint8Array>, limits: Limits): OperationResult<Digest>;
@@ -0,0 +1,6 @@
1
+ import type { Limits } from "../domain/limits.js";
2
+ import type { OperationResult } from "../domain/operation-result.js";
3
+ import type { Digest } from "../domain/digest.js";
4
+ import { hashValidatedBytes } from "./hash-adapter.js";
5
+ export declare function hashFrame(algorithm: unknown, frame: OperationResult<Uint8Array>, limits: Limits): OperationResult<Digest>;
6
+ export declare function hashTrustedFrame(algorithm: Parameters<typeof hashValidatedBytes>[0], frame: OperationResult<Uint8Array>): OperationResult<Digest>;
@@ -0,0 +1,8 @@
1
+ export { DIAGNOSTIC_CODES } from "./contracts/generated.js";
2
+ export type { DiagnosticCode, DiagnosticFamily, DiagnosticSeverity, } from "./contracts/generated.js";
3
+ export { createEngine, EngineConfigurationError } from "./api/engine.js";
4
+ export { BUILTIN_PROFILES } from "./profiles.js";
5
+ export type { BuiltinProfile } from "./profiles.js";
6
+ export type { ByteSink, ChainBuilder, ChainConfig, ChainVerificationConfig, Engine, EngineEvent, EngineEventName, EngineOptions, NormalizationProfile, ProfileManifest, StreamOptions, VerifyChainInput, VerifyChainRecord, VerifyRecordInput, VerifyStreamInput, } from "./api/types.js";
7
+ export type { AlgorithmId, BoundaryState, ChainRecordInput, ChainSummaryEvidence, ChainSnapshot, Diagnostic, DiagnosticDetail, DiagnosticDetails, DiagnosticSummary, DiagnosticPhase, DuplicateKind, DuplicateObservation, DuplicatePolicy, ExternalDuplicateIndex, Digest, Evidence, EvidenceProfile, LinkEvidence, Limits, OperationResult, ProfileReference, PreviousLink, RecordEvidence, RecordEvidenceFields, RecordInput, Rule, RuleContext, RuleFinding, RulePhase, ReadonlyByteView, VerificationResult, VerificationMode, VerificationStats, VerificationStatus, NormalizationInputKind, NormalizationStats, } from "./api/types.js";
8
+ export { CHAIN_SUMMARY_EVIDENCE_SCHEMA, DIAGNOSTIC_SCHEMA, LINK_EVIDENCE_SCHEMA, RECORD_EVIDENCE_SCHEMA, } from "./api/types.js";
@@ -0,0 +1,19 @@
1
+ export interface ByteSink {
2
+ readonly byteLength: number;
3
+ write(value: Uint8Array): void;
4
+ }
5
+ export declare class ByteArraySink implements ByteSink {
6
+ private readonly maximum;
7
+ private buffer;
8
+ private written;
9
+ constructor(maximum: number, initialCapacity?: number);
10
+ get byteLength(): number;
11
+ write(value: Uint8Array): void;
12
+ writeByte(value: number): void;
13
+ writeAscii(value: string): void;
14
+ writeText(value: string): void;
15
+ toBytes(): Uint8Array;
16
+ /** Internal ownership transfer; the returned view is never exposed to callers. */
17
+ takeBytes(): Uint8Array;
18
+ private ensureCapacity;
19
+ }
@@ -0,0 +1,3 @@
1
+ import type { JsonValue } from "../domain/json-value.js";
2
+ import type { NormalizationProfile } from "./profile.js";
3
+ export declare const jcsProfile: NormalizationProfile<JsonValue>;
@@ -0,0 +1,11 @@
1
+ import type { Limits } from "../domain/limits.js";
2
+ import type { OperationResult } from "../domain/operation-result.js";
3
+ import { ByteArraySink } from "./byte-sink.js";
4
+ import type { NormalizationProfile, NormalizationStats, NormalizedBytes } from "./profile.js";
5
+ interface RegisteredNormalizationProfile {
6
+ normalize(input: unknown, sink: ByteArraySink, limits: Limits): OperationResult<NormalizationStats>;
7
+ normalizeValidated?(input: unknown, sink: ByteArraySink, limits: Limits): OperationResult<NormalizationStats>;
8
+ }
9
+ export declare function normalizeToBytes<I>(profile: NormalizationProfile<I>, input: unknown, limits: Limits): OperationResult<NormalizedBytes>;
10
+ export declare function normalizeRegisteredToBytes(profile: RegisteredNormalizationProfile, input: unknown, limits: Limits): OperationResult<NormalizedBytes>;
11
+ export {};
@@ -0,0 +1,26 @@
1
+ import type { OperationResult } from "../domain/operation-result.js";
2
+ import type { ProfileId } from "../domain/identifiers.js";
3
+ import type { Limits } from "../domain/limits.js";
4
+ import type { ProfileVersion } from "../domain/version.js";
5
+ import type { ByteSink } from "./byte-sink.js";
6
+ import type { NormalizationProfile, NormalizationStats } from "./profile.js";
7
+ interface RegisteredProfile {
8
+ readonly id: ProfileId;
9
+ readonly version: ProfileVersion;
10
+ readonly inputKind: NormalizationProfile["inputKind"];
11
+ validate(input: unknown, limits: Limits): OperationResult<unknown>;
12
+ normalize(input: unknown, sink: ByteSink, limits: Limits): OperationResult<NormalizationStats>;
13
+ normalizeValidated(input: unknown, sink: ByteSink, limits: Limits): OperationResult<NormalizationStats>;
14
+ }
15
+ export declare class ProfileRegistry {
16
+ private readonly profiles;
17
+ constructor(additional?: readonly NormalizationProfile[]);
18
+ register<I>(profile: NormalizationProfile<I>): OperationResult<void>;
19
+ resolve(id: ProfileId, version: ProfileVersion): OperationResult<RegisteredProfile>;
20
+ resolveValidated(reference: Readonly<{
21
+ readonly id: string;
22
+ readonly version: string;
23
+ }>): OperationResult<RegisteredProfile>;
24
+ private registerBuiltin;
25
+ }
26
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { ProfileId } from "../domain/identifiers.js";
2
+ import type { Limits } from "../domain/limits.js";
3
+ import type { OperationResult } from "../domain/operation-result.js";
4
+ import type { ProfileVersion } from "../domain/version.js";
5
+ import type { ByteSink } from "./byte-sink.js";
6
+ /** @public */
7
+ export type NormalizationInputKind = "json" | "bytes";
8
+ /** @public */
9
+ export interface NormalizationStats {
10
+ readonly byteLength: number;
11
+ }
12
+ export interface NormalizationProfile<I = unknown> {
13
+ readonly id: ProfileId;
14
+ readonly version: ProfileVersion;
15
+ readonly inputKind: NormalizationInputKind;
16
+ validate(input: unknown, limits: Limits): OperationResult<I>;
17
+ normalize(input: I, sink: ByteSink, limits: Limits): OperationResult<NormalizationStats>;
18
+ }
19
+ export interface NormalizedBytes {
20
+ readonly bytes: Uint8Array;
21
+ readonly stats: NormalizationStats;
22
+ }
@@ -0,0 +1,2 @@
1
+ import type { NormalizationProfile } from "./profile.js";
2
+ export declare const rawBytesProfile: NormalizationProfile<Uint8Array>;
@@ -0,0 +1,8 @@
1
+ /** @public */
2
+ export interface BuiltinProfile {
3
+ readonly id: string;
4
+ readonly version: string;
5
+ readonly inputKind: "json" | "bytes";
6
+ }
7
+ /** @public */
8
+ export declare const BUILTIN_PROFILES: readonly BuiltinProfile[];
@@ -0,0 +1,38 @@
1
+ import type { RecordEvidence } from "../domain/evidence.js";
2
+ import type { Limits } from "../domain/limits.js";
3
+ import type { OperationResult } from "../domain/operation-result.js";
4
+ import type { AlgorithmId } from "../domain/algorithm-id.js";
5
+ import type { Digest } from "../domain/digest.js";
6
+ import type { ProfileRegistry } from "../normalization/profile-registry.js";
7
+ import type { RuleSet } from "../rules/rule-set.js";
8
+ export interface RecordServiceOptions {
9
+ readonly limits: Limits;
10
+ readonly profiles: ProfileRegistry;
11
+ readonly rules?: RuleSet;
12
+ }
13
+ export interface ComputedRecord {
14
+ readonly evidence: RecordEvidence;
15
+ /** Internal trusted values reused by chain construction before public encoding. */
16
+ readonly contentDigest: Digest;
17
+ readonly recordDigest: Digest;
18
+ }
19
+ interface ValidatedRecordInput {
20
+ readonly contextId: string;
21
+ readonly recordId: string;
22
+ readonly payload: unknown;
23
+ readonly profile: Readonly<{
24
+ readonly id: string;
25
+ readonly version: string;
26
+ }>;
27
+ readonly algorithm: AlgorithmId;
28
+ }
29
+ export declare function hashRecord(input: unknown, options: RecordServiceOptions): OperationResult<RecordEvidence>;
30
+ export declare function computeRecord(input: unknown, options: RecordServiceOptions): OperationResult<ComputedRecord>;
31
+ export declare function verifyComputedRecord(expected: RecordEvidence, payload: unknown, options: RecordServiceOptions): OperationResult<RecordEvidence>;
32
+ export declare function validateRecordInput(value: unknown, limits: Limits): OperationResult<ValidatedRecordInput>;
33
+ export declare function validateProfile(value: unknown, limits: Limits): OperationResult<Readonly<{
34
+ readonly id: string;
35
+ readonly version: string;
36
+ }>>;
37
+ export declare function freezeRecordEvidence(value: RecordEvidence): RecordEvidence;
38
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { Diagnostic } from "../domain/diagnostic.js";
2
+ import type { Limits } from "../domain/limits.js";
3
+ import type { OperationResult } from "../domain/operation-result.js";
4
+ import type { ReadonlyByteView, Rule, RuleContext } from "../domain/rule.js";
5
+ export declare class RuleSet {
6
+ private readonly rules;
7
+ private constructor();
8
+ static create(value: unknown, limits: Limits): OperationResult<RuleSet>;
9
+ evaluate(context: RuleContext, limits: Limits): readonly Diagnostic[];
10
+ hasRules(): boolean;
11
+ toArray(): readonly Rule[];
12
+ }
13
+ export declare function createReadonlyByteView(bytes: Uint8Array): ReadonlyByteView;
@@ -0,0 +1,2 @@
1
+ export { SCHEMA_ASSETS } from "./contracts/schema-assets.js";
2
+ export type { SchemaId, SchemaName } from "./contracts/schema-assets.js";
@@ -0,0 +1,3 @@
1
+ import type { AlgorithmId } from "../domain/algorithm-id.js";
2
+ import type { OperationResult } from "../domain/operation-result.js";
3
+ export declare function validateAlgorithmId(value: unknown): OperationResult<AlgorithmId>;