@nakafa/aksara-contracts 0.27.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/LICENSE +185 -0
- package/README.md +73 -0
- package/dist/artifact/integrity.d.ts +29 -0
- package/dist/artifact/integrity.js +54 -0
- package/dist/artifact/limits.d.ts +26 -0
- package/dist/artifact/limits.js +46 -0
- package/dist/artifact/source.d.ts +21 -0
- package/dist/artifact/source.js +24 -0
- package/dist/artifact/spec.d.ts +148 -0
- package/dist/artifact/spec.js +92 -0
- package/dist/artifact/verify.d.ts +26 -0
- package/dist/artifact/verify.js +18 -0
- package/dist/cache/content.d.ts +52 -0
- package/dist/cache/content.js +80 -0
- package/dist/content.d.ts +168 -0
- package/dist/content.js +107 -0
- package/dist/country.d.ts +4 -0
- package/dist/country.js +8 -0
- package/dist/date.d.ts +24 -0
- package/dist/date.js +44 -0
- package/dist/decode.d.ts +4 -0
- package/dist/decode.js +8 -0
- package/dist/delivery.d.ts +4 -0
- package/dist/delivery.js +7 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +8 -0
- package/dist/graph/family.d.ts +45 -0
- package/dist/graph/family.js +85 -0
- package/dist/graph/identity.d.ts +19 -0
- package/dist/graph/identity.js +39 -0
- package/dist/graph/spec.d.ts +20 -0
- package/dist/graph/spec.js +26 -0
- package/dist/hash/text.d.ts +10 -0
- package/dist/hash/text.js +20 -0
- package/dist/ids.d.ts +27 -0
- package/dist/ids.js +63 -0
- package/dist/limits.d.ts +10 -0
- package/dist/limits.js +10 -0
- package/dist/locale.d.ts +37 -0
- package/dist/locale.js +53 -0
- package/dist/material/domain.d.ts +4 -0
- package/dist/material/domain.js +8 -0
- package/dist/preview/artifact.d.ts +198 -0
- package/dist/preview/artifact.js +20 -0
- package/dist/preview/auth.d.ts +71 -0
- package/dist/preview/auth.js +49 -0
- package/dist/preview/document.d.ts +692 -0
- package/dist/preview/document.js +90 -0
- package/dist/preview/spec.d.ts +2517 -0
- package/dist/preview/spec.js +142 -0
- package/dist/preview/target.d.ts +172 -0
- package/dist/preview/target.js +70 -0
- package/dist/program/curriculum.d.ts +69 -0
- package/dist/program/curriculum.js +181 -0
- package/dist/program/snapshot/digest.d.ts +26 -0
- package/dist/program/snapshot/digest.js +220 -0
- package/dist/program/snapshot/hash.d.ts +31 -0
- package/dist/program/snapshot/hash.js +40 -0
- package/dist/program/snapshot/row-hash.d.ts +155 -0
- package/dist/program/snapshot/row-hash.js +34 -0
- package/dist/program/snapshot/row.d.ts +139 -0
- package/dist/program/snapshot/row.js +28 -0
- package/dist/program/snapshot/spec.d.ts +36 -0
- package/dist/program/snapshot/spec.js +39 -0
- package/dist/program/spec.d.ts +85 -0
- package/dist/program/spec.js +197 -0
- package/dist/projection/article.d.ts +145 -0
- package/dist/projection/article.js +150 -0
- package/dist/projection/digest.d.ts +261 -0
- package/dist/projection/digest.js +59 -0
- package/dist/projection/hash.d.ts +3 -0
- package/dist/projection/hash.js +10 -0
- package/dist/projection/material.d.ts +109 -0
- package/dist/projection/material.js +160 -0
- package/dist/projection/page.d.ts +112 -0
- package/dist/projection/page.js +106 -0
- package/dist/projection/question.d.ts +520 -0
- package/dist/projection/question.js +109 -0
- package/dist/projection/spec.d.ts +503 -0
- package/dist/projection/spec.js +56 -0
- package/dist/projection/verify.d.ts +281 -0
- package/dist/projection/verify.js +86 -0
- package/dist/question/identity.d.ts +175 -0
- package/dist/question/identity.js +205 -0
- package/dist/question/item.d.ts +453 -0
- package/dist/question/item.js +146 -0
- package/dist/question/response.d.ts +175 -0
- package/dist/question/response.js +150 -0
- package/dist/quran/attribution.d.ts +48 -0
- package/dist/quran/attribution.js +44 -0
- package/dist/quran/identity.d.ts +105 -0
- package/dist/quran/identity.js +100 -0
- package/dist/quran/notes.d.ts +56 -0
- package/dist/quran/notes.js +142 -0
- package/dist/quran/provenance.d.ts +257 -0
- package/dist/quran/provenance.js +144 -0
- package/dist/quran/snapshot/digest.d.ts +33 -0
- package/dist/quran/snapshot/digest.js +232 -0
- package/dist/quran/snapshot/hash.d.ts +51 -0
- package/dist/quran/snapshot/hash.js +50 -0
- package/dist/quran/snapshot/row/hash.d.ts +748 -0
- package/dist/quran/snapshot/row/hash.js +115 -0
- package/dist/quran/snapshot/row.d.ts +354 -0
- package/dist/quran/snapshot/row.js +91 -0
- package/dist/quran/snapshot/spec.d.ts +50 -0
- package/dist/quran/snapshot/spec.js +66 -0
- package/dist/quran/source.d.ts +206 -0
- package/dist/quran/source.js +153 -0
- package/dist/quran/spec.d.ts +47 -0
- package/dist/quran/spec.js +41 -0
- package/dist/quran/text.d.ts +7 -0
- package/dist/quran/text.js +11 -0
- package/dist/release/canonical.d.ts +23 -0
- package/dist/release/canonical.js +29 -0
- package/dist/release/current/evidence.d.ts +424 -0
- package/dist/release/current/evidence.js +41 -0
- package/dist/release/current/runtime.d.ts +4 -0
- package/dist/release/current/runtime.js +15 -0
- package/dist/release/current/state.d.ts +567 -0
- package/dist/release/current/state.js +91 -0
- package/dist/release/digest.d.ts +54 -0
- package/dist/release/digest.js +71 -0
- package/dist/release/hash.d.ts +72 -0
- package/dist/release/hash.js +14 -0
- package/dist/release/head.d.ts +206 -0
- package/dist/release/head.js +131 -0
- package/dist/release/items.d.ts +98 -0
- package/dist/release/items.js +114 -0
- package/dist/release/lifecycle.d.ts +297 -0
- package/dist/release/lifecycle.js +97 -0
- package/dist/release/origin.d.ts +30 -0
- package/dist/release/origin.js +24 -0
- package/dist/release/policy.d.ts +45 -0
- package/dist/release/policy.js +124 -0
- package/dist/release/result/digest.d.ts +127 -0
- package/dist/release/result/digest.js +140 -0
- package/dist/release/result/spec.d.ts +4 -0
- package/dist/release/result/spec.js +5 -0
- package/dist/release/rollback/digest.d.ts +126 -0
- package/dist/release/rollback/digest.js +92 -0
- package/dist/release/rollback/spec.d.ts +1729 -0
- package/dist/release/rollback/spec.js +156 -0
- package/dist/release/route/digest.d.ts +45 -0
- package/dist/release/route/digest.js +59 -0
- package/dist/release/route/page.d.ts +56 -0
- package/dist/release/route/page.js +46 -0
- package/dist/release/route/spec.d.ts +49 -0
- package/dist/release/route/spec.js +40 -0
- package/dist/release/route/verify.d.ts +66 -0
- package/dist/release/route/verify.js +67 -0
- package/dist/release/signing.d.ts +6 -0
- package/dist/release/signing.js +38 -0
- package/dist/release/snapshot/data.d.ts +475 -0
- package/dist/release/snapshot/data.js +74 -0
- package/dist/release/snapshot/evidence-requirement.d.ts +22 -0
- package/dist/release/snapshot/evidence-requirement.js +21 -0
- package/dist/release/snapshot/evidence.d.ts +58 -0
- package/dist/release/snapshot/evidence.js +14 -0
- package/dist/release/snapshot/program-evidence.d.ts +17 -0
- package/dist/release/snapshot/program-evidence.js +39 -0
- package/dist/release/snapshot/quran-evidence.d.ts +27 -0
- package/dist/release/snapshot/quran-evidence.js +43 -0
- package/dist/release/snapshot/scope.d.ts +60 -0
- package/dist/release/snapshot/scope.js +102 -0
- package/dist/release/snapshot/spec.d.ts +193 -0
- package/dist/release/snapshot/spec.js +139 -0
- package/dist/release/snapshot/tryout-evidence.d.ts +22 -0
- package/dist/release/snapshot/tryout-evidence.js +86 -0
- package/dist/release/snapshot/verify.d.ts +710 -0
- package/dist/release/snapshot/verify.js +147 -0
- package/dist/release/spec.d.ts +491 -0
- package/dist/release/spec.js +200 -0
- package/dist/release/verify.d.ts +98 -0
- package/dist/release/verify.js +70 -0
- package/dist/renderer/compatibility.d.ts +35 -0
- package/dist/renderer/compatibility.js +48 -0
- package/dist/renderer/component.d.ts +99 -0
- package/dist/renderer/component.js +102 -0
- package/dist/renderer/contract.d.ts +144 -0
- package/dist/renderer/contract.js +122 -0
- package/dist/renderer/domain.d.ts +6 -0
- package/dist/renderer/domain.js +18 -0
- package/dist/renderer/manifest.d.ts +86 -0
- package/dist/renderer/manifest.js +49 -0
- package/dist/renderer/selection.d.ts +39 -0
- package/dist/renderer/selection.js +87 -0
- package/dist/runtime/error.d.ts +8 -0
- package/dist/runtime/error.js +20 -0
- package/dist/runtime/protected/limits.d.ts +10 -0
- package/dist/runtime/protected/limits.js +15 -0
- package/dist/runtime/protected/spec.d.ts +328 -0
- package/dist/runtime/protected/spec.js +79 -0
- package/dist/runtime/protected/verify.d.ts +97 -0
- package/dist/runtime/protected/verify.js +72 -0
- package/dist/runtime/result.d.ts +12 -0
- package/dist/runtime/result.js +17 -0
- package/dist/runtime/spec.d.ts +705 -0
- package/dist/runtime/spec.js +61 -0
- package/dist/runtime/verify.d.ts +479 -0
- package/dist/runtime/verify.js +123 -0
- package/dist/signature/spec.d.ts +53 -0
- package/dist/signature/spec.js +29 -0
- package/dist/signature/trusted.d.ts +19 -0
- package/dist/signature/trusted.js +32 -0
- package/dist/signature/verify.d.ts +10 -0
- package/dist/signature/verify.js +82 -0
- package/dist/text/order.d.ts +2 -0
- package/dist/text/order.js +10 -0
- package/dist/text/syntax.d.ts +6 -0
- package/dist/text/syntax.js +15 -0
- package/dist/transport/batch.d.ts +971 -0
- package/dist/transport/batch.js +101 -0
- package/dist/transport/failure.d.ts +168 -0
- package/dist/transport/failure.js +194 -0
- package/dist/transport/group.d.ts +2946 -0
- package/dist/transport/group.js +47 -0
- package/dist/transport/limits.d.ts +30 -0
- package/dist/transport/limits.js +30 -0
- package/dist/transport/request.d.ts +9333 -0
- package/dist/transport/request.js +121 -0
- package/dist/transport/response.d.ts +6247 -0
- package/dist/transport/response.js +181 -0
- package/dist/transport/runtime.d.ts +77 -0
- package/dist/transport/runtime.js +33 -0
- package/dist/transport/snapshot.d.ts +978 -0
- package/dist/transport/snapshot.js +70 -0
- package/dist/tryout/canonical.d.ts +2 -0
- package/dist/tryout/canonical.js +11 -0
- package/dist/tryout/catalog-hash.d.ts +134 -0
- package/dist/tryout/catalog-hash.js +203 -0
- package/dist/tryout/catalog.d.ts +376 -0
- package/dist/tryout/catalog.js +147 -0
- package/dist/tryout/content-hash.d.ts +89 -0
- package/dist/tryout/content-hash.js +72 -0
- package/dist/tryout/identity.d.ts +12 -0
- package/dist/tryout/identity.js +46 -0
- package/dist/tryout/key.d.ts +4 -0
- package/dist/tryout/key.js +8 -0
- package/dist/tryout/language.d.ts +24 -0
- package/dist/tryout/language.js +32 -0
- package/dist/tryout/locale-closure.d.ts +20 -0
- package/dist/tryout/locale-closure.js +164 -0
- package/dist/tryout/placement-closure.d.ts +5 -0
- package/dist/tryout/placement-closure.js +30 -0
- package/dist/tryout/placement-hash.d.ts +11 -0
- package/dist/tryout/placement-hash.js +55 -0
- package/dist/tryout/placement.d.ts +280 -0
- package/dist/tryout/placement.js +82 -0
- package/dist/tryout/row-hash.d.ts +28 -0
- package/dist/tryout/row-hash.js +50 -0
- package/dist/tryout/runtime/canonical.d.ts +8 -0
- package/dist/tryout/runtime/canonical.js +33 -0
- package/dist/tryout/runtime/hash.d.ts +32 -0
- package/dist/tryout/runtime/hash.js +11 -0
- package/dist/tryout/runtime/source.d.ts +42 -0
- package/dist/tryout/runtime/source.js +47 -0
- package/dist/tryout/runtime/spec.d.ts +58 -0
- package/dist/tryout/runtime/spec.js +21 -0
- package/dist/tryout/runtime/verify.d.ts +61 -0
- package/dist/tryout/runtime/verify.js +69 -0
- package/dist/tryout/snapshot/canonical.d.ts +7 -0
- package/dist/tryout/snapshot/canonical.js +17 -0
- package/dist/tryout/snapshot/hash.d.ts +8 -0
- package/dist/tryout/snapshot/hash.js +19 -0
- package/dist/tryout/snapshot/spec.d.ts +46 -0
- package/dist/tryout/snapshot/spec.js +30 -0
- package/dist/tryout/spec.d.ts +13 -0
- package/dist/tryout/spec.js +15 -0
- package/package.json +506 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Effect, Schema, Stream } from "effect";
|
|
2
|
+
import { type ReleaseId } from "#contracts/ids";
|
|
3
|
+
import { type RollbackSnapshotEntry } from "#contracts/release/rollback/spec";
|
|
4
|
+
import type { ContentReleaseManifest } from "#contracts/release/spec";
|
|
5
|
+
declare const RollbackSnapshotHashError_base: Schema.Class<RollbackSnapshotHashError, Schema.TaggedStruct<"RollbackSnapshotHashError", {
|
|
6
|
+
readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
|
|
7
|
+
}>, import("effect/Cause").YieldableError>;
|
|
8
|
+
/** SHA-256 computation failed before rollback-state integrity was established. */
|
|
9
|
+
export declare class RollbackSnapshotHashError extends RollbackSnapshotHashError_base {
|
|
10
|
+
}
|
|
11
|
+
declare const RollbackSnapshotCountMismatchError_base: Schema.Class<RollbackSnapshotCountMismatchError, Schema.TaggedStruct<"RollbackSnapshotCountMismatchError", {
|
|
12
|
+
readonly actualCount: Schema.Finite;
|
|
13
|
+
readonly expectedCount: Schema.Finite;
|
|
14
|
+
readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
|
|
15
|
+
}>, import("effect/Cause").YieldableError>;
|
|
16
|
+
/** A replayed rollback snapshot has a different signed entry count. */
|
|
17
|
+
export declare class RollbackSnapshotCountMismatchError extends RollbackSnapshotCountMismatchError_base {
|
|
18
|
+
}
|
|
19
|
+
declare const RollbackSnapshotDigestMismatchError_base: Schema.Class<RollbackSnapshotDigestMismatchError, Schema.TaggedStruct<"RollbackSnapshotDigestMismatchError", {
|
|
20
|
+
readonly actualDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
|
|
21
|
+
readonly expectedDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
|
|
22
|
+
readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
|
|
23
|
+
}>, import("effect/Cause").YieldableError>;
|
|
24
|
+
/** A replayed rollback snapshot does not match its signed digest. */
|
|
25
|
+
export declare class RollbackSnapshotDigestMismatchError extends RollbackSnapshotDigestMismatchError_base {
|
|
26
|
+
}
|
|
27
|
+
/** Keeps mutable Node hash state private behind the incremental digest seam. */
|
|
28
|
+
declare class RollbackSnapshotDigestState {
|
|
29
|
+
#private;
|
|
30
|
+
count: number;
|
|
31
|
+
/** Initializes one domain-separated rollback snapshot hash. */
|
|
32
|
+
constructor();
|
|
33
|
+
/** Adds one canonical prior state to the snapshot digest. */
|
|
34
|
+
update(entry: RollbackSnapshotEntry): void;
|
|
35
|
+
/** Consumes the hash and returns its branded immutable identity. */
|
|
36
|
+
digest(): string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
37
|
+
}
|
|
38
|
+
/** Creates a fresh domain-separated digest state for one rollback snapshot. */
|
|
39
|
+
export declare function createRollbackSnapshotDigest(releaseId: ReleaseId): Effect.Effect<RollbackSnapshotDigestState, RollbackSnapshotHashError, never>;
|
|
40
|
+
/** Adds one canonical prior state to an incremental rollback digest. */
|
|
41
|
+
export declare function updateRollbackSnapshotDigest(releaseId: ReleaseId, state: RollbackSnapshotDigestState, entry: RollbackSnapshotEntry): Effect.Effect<RollbackSnapshotDigestState, RollbackSnapshotHashError, never>;
|
|
42
|
+
/** Finalizes one rollback snapshot digest with a typed hash failure. */
|
|
43
|
+
export declare function finalizeRollbackSnapshotDigest(releaseId: ReleaseId, state: RollbackSnapshotDigestState): Effect.Effect<string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">, RollbackSnapshotHashError, never>;
|
|
44
|
+
/** Digests one rollback snapshot stream without retaining prior state bodies. */
|
|
45
|
+
export declare const digestRollbackSnapshot: <E, R>(releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">, entries: Stream.Stream<{
|
|
46
|
+
readonly index: number;
|
|
47
|
+
readonly releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
|
|
48
|
+
readonly snapshot: {
|
|
49
|
+
readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
|
|
50
|
+
readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
|
|
51
|
+
readonly family: "article" | "material" | "page" | "question";
|
|
52
|
+
readonly state: "absent";
|
|
53
|
+
} | {
|
|
54
|
+
readonly head: {
|
|
55
|
+
readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
56
|
+
readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
|
|
57
|
+
readonly compilerConfigHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
58
|
+
readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
|
|
59
|
+
readonly delivery: "authenticated" | "entitled" | "public";
|
|
60
|
+
readonly projectionHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
61
|
+
readonly publicPath?: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">) | undefined;
|
|
62
|
+
readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
|
|
63
|
+
readonly sourceHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
64
|
+
readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
|
|
65
|
+
readonly family: "article";
|
|
66
|
+
};
|
|
67
|
+
readonly state: "article";
|
|
68
|
+
} | {
|
|
69
|
+
readonly head: {
|
|
70
|
+
readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
71
|
+
readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
|
|
72
|
+
readonly compilerConfigHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
73
|
+
readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
|
|
74
|
+
readonly delivery: "authenticated" | "entitled" | "public";
|
|
75
|
+
readonly projectionHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
76
|
+
readonly publicPath?: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">) | undefined;
|
|
77
|
+
readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
|
|
78
|
+
readonly sourceHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
79
|
+
readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
|
|
80
|
+
readonly family: "material";
|
|
81
|
+
};
|
|
82
|
+
readonly state: "material";
|
|
83
|
+
} | {
|
|
84
|
+
readonly head: {
|
|
85
|
+
readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
86
|
+
readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
|
|
87
|
+
readonly compilerConfigHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
88
|
+
readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
|
|
89
|
+
readonly delivery: "authenticated" | "entitled" | "public";
|
|
90
|
+
readonly projectionHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
91
|
+
readonly publicPath?: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">) | undefined;
|
|
92
|
+
readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
|
|
93
|
+
readonly sourceHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
94
|
+
readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
|
|
95
|
+
readonly family: "page";
|
|
96
|
+
};
|
|
97
|
+
readonly state: "page";
|
|
98
|
+
} | {
|
|
99
|
+
readonly head: {
|
|
100
|
+
readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
101
|
+
readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
|
|
102
|
+
readonly compilerConfigHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
103
|
+
readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
|
|
104
|
+
readonly delivery: "authenticated" | "entitled" | "public";
|
|
105
|
+
readonly projectionHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
106
|
+
readonly publicPath?: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">) | undefined;
|
|
107
|
+
readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
|
|
108
|
+
readonly sourceHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
109
|
+
readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
|
|
110
|
+
readonly family: "question";
|
|
111
|
+
};
|
|
112
|
+
readonly state: "question";
|
|
113
|
+
};
|
|
114
|
+
}, E, R>) => Effect.Effect<{
|
|
115
|
+
count: number;
|
|
116
|
+
digest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
117
|
+
}, E | RollbackSnapshotHashError, R>;
|
|
118
|
+
/** Authenticates a replayed prior-state stream against its signed release. */
|
|
119
|
+
export declare const verifyRollbackSnapshot: <E, R>(input: {
|
|
120
|
+
readonly entries: Stream.Stream<RollbackSnapshotEntry, E, R>;
|
|
121
|
+
readonly manifest: ContentReleaseManifest;
|
|
122
|
+
}) => Effect.Effect<{
|
|
123
|
+
count: number;
|
|
124
|
+
digest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
|
|
125
|
+
}, E | RollbackSnapshotCountMismatchError | RollbackSnapshotDigestMismatchError | RollbackSnapshotHashError, R>;
|
|
126
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { Effect, Schema, Stream } from "effect";
|
|
3
|
+
import { ReleaseIdSchema, Sha256HashSchema, } from "#contracts/ids";
|
|
4
|
+
import { canonicalizeRollbackSnapshotEntry, } from "#contracts/release/rollback/spec";
|
|
5
|
+
const ROLLBACK_SNAPSHOT_DIGEST_DOMAIN = "nakafa.aksara.rollback-snapshot";
|
|
6
|
+
/** SHA-256 computation failed before rollback-state integrity was established. */
|
|
7
|
+
export class RollbackSnapshotHashError extends Schema.TaggedError()("RollbackSnapshotHashError", { releaseId: ReleaseIdSchema }) {
|
|
8
|
+
}
|
|
9
|
+
/** A replayed rollback snapshot has a different signed entry count. */
|
|
10
|
+
export class RollbackSnapshotCountMismatchError extends Schema.TaggedError()("RollbackSnapshotCountMismatchError", {
|
|
11
|
+
actualCount: Schema.Finite.pipe(Schema.check(Schema.isInt()), Schema.check(Schema.isGreaterThanOrEqualTo(0))),
|
|
12
|
+
expectedCount: Schema.Finite.pipe(Schema.check(Schema.isInt()), Schema.check(Schema.isGreaterThanOrEqualTo(0))),
|
|
13
|
+
releaseId: ReleaseIdSchema,
|
|
14
|
+
}) {
|
|
15
|
+
}
|
|
16
|
+
/** A replayed rollback snapshot does not match its signed digest. */
|
|
17
|
+
export class RollbackSnapshotDigestMismatchError extends Schema.TaggedError()("RollbackSnapshotDigestMismatchError", {
|
|
18
|
+
actualDigest: Sha256HashSchema,
|
|
19
|
+
expectedDigest: Sha256HashSchema,
|
|
20
|
+
releaseId: ReleaseIdSchema,
|
|
21
|
+
}) {
|
|
22
|
+
}
|
|
23
|
+
/** Keeps mutable Node hash state private behind the incremental digest seam. */
|
|
24
|
+
class RollbackSnapshotDigestState {
|
|
25
|
+
#hash = createHash("sha256");
|
|
26
|
+
count = 0;
|
|
27
|
+
/** Initializes one domain-separated rollback snapshot hash. */
|
|
28
|
+
constructor() {
|
|
29
|
+
this.#hash.update(ROLLBACK_SNAPSHOT_DIGEST_DOMAIN);
|
|
30
|
+
this.#hash.update("\n");
|
|
31
|
+
}
|
|
32
|
+
/** Adds one canonical prior state to the snapshot digest. */
|
|
33
|
+
update(entry) {
|
|
34
|
+
this.#hash.update(canonicalizeRollbackSnapshotEntry(entry));
|
|
35
|
+
this.#hash.update("\n");
|
|
36
|
+
this.count += 1;
|
|
37
|
+
}
|
|
38
|
+
/** Consumes the hash and returns its branded immutable identity. */
|
|
39
|
+
digest() {
|
|
40
|
+
return Sha256HashSchema.make(`sha256:${this.#hash.digest("hex")}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Creates a fresh domain-separated digest state for one rollback snapshot. */
|
|
44
|
+
export function createRollbackSnapshotDigest(releaseId) {
|
|
45
|
+
return Effect.try({
|
|
46
|
+
catch: () => new RollbackSnapshotHashError({ releaseId }),
|
|
47
|
+
try: () => new RollbackSnapshotDigestState(),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Adds one canonical prior state to an incremental rollback digest. */
|
|
51
|
+
export function updateRollbackSnapshotDigest(releaseId, state, entry) {
|
|
52
|
+
return Effect.try({
|
|
53
|
+
catch: () => new RollbackSnapshotHashError({ releaseId }),
|
|
54
|
+
try: () => {
|
|
55
|
+
state.update(entry);
|
|
56
|
+
return state;
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** Finalizes one rollback snapshot digest with a typed hash failure. */
|
|
61
|
+
export function finalizeRollbackSnapshotDigest(releaseId, state) {
|
|
62
|
+
return Effect.try({
|
|
63
|
+
catch: () => new RollbackSnapshotHashError({ releaseId }),
|
|
64
|
+
try: () => state.digest(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/** Digests one rollback snapshot stream without retaining prior state bodies. */
|
|
68
|
+
export const digestRollbackSnapshot = Effect.fn("AksaraContracts.digestRollbackSnapshot")(function* (releaseId, entries) {
|
|
69
|
+
const initial = yield* createRollbackSnapshotDigest(releaseId);
|
|
70
|
+
const state = yield* entries.pipe(Stream.runFoldEffect(() => initial, (current, entry) => updateRollbackSnapshotDigest(releaseId, current, entry)));
|
|
71
|
+
const digest = yield* finalizeRollbackSnapshotDigest(releaseId, state);
|
|
72
|
+
return { count: state.count, digest };
|
|
73
|
+
});
|
|
74
|
+
/** Authenticates a replayed prior-state stream against its signed release. */
|
|
75
|
+
export const verifyRollbackSnapshot = Effect.fn("AksaraContracts.verifyRollbackSnapshot")(function* (input) {
|
|
76
|
+
const summary = yield* digestRollbackSnapshot(input.manifest.releaseId, input.entries);
|
|
77
|
+
if (summary.count !== input.manifest.rollbackCount) {
|
|
78
|
+
return yield* new RollbackSnapshotCountMismatchError({
|
|
79
|
+
actualCount: summary.count,
|
|
80
|
+
expectedCount: input.manifest.rollbackCount,
|
|
81
|
+
releaseId: input.manifest.releaseId,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (summary.digest !== input.manifest.rollbackDigest) {
|
|
85
|
+
return yield* new RollbackSnapshotDigestMismatchError({
|
|
86
|
+
actualDigest: summary.digest,
|
|
87
|
+
expectedDigest: input.manifest.rollbackDigest,
|
|
88
|
+
releaseId: input.manifest.releaseId,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return summary;
|
|
92
|
+
});
|