@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.
Files changed (269) hide show
  1. package/LICENSE +185 -0
  2. package/README.md +73 -0
  3. package/dist/artifact/integrity.d.ts +29 -0
  4. package/dist/artifact/integrity.js +54 -0
  5. package/dist/artifact/limits.d.ts +26 -0
  6. package/dist/artifact/limits.js +46 -0
  7. package/dist/artifact/source.d.ts +21 -0
  8. package/dist/artifact/source.js +24 -0
  9. package/dist/artifact/spec.d.ts +148 -0
  10. package/dist/artifact/spec.js +92 -0
  11. package/dist/artifact/verify.d.ts +26 -0
  12. package/dist/artifact/verify.js +18 -0
  13. package/dist/cache/content.d.ts +52 -0
  14. package/dist/cache/content.js +80 -0
  15. package/dist/content.d.ts +168 -0
  16. package/dist/content.js +107 -0
  17. package/dist/country.d.ts +4 -0
  18. package/dist/country.js +8 -0
  19. package/dist/date.d.ts +24 -0
  20. package/dist/date.js +44 -0
  21. package/dist/decode.d.ts +4 -0
  22. package/dist/decode.js +8 -0
  23. package/dist/delivery.d.ts +4 -0
  24. package/dist/delivery.js +7 -0
  25. package/dist/errors.d.ts +10 -0
  26. package/dist/errors.js +8 -0
  27. package/dist/graph/family.d.ts +45 -0
  28. package/dist/graph/family.js +85 -0
  29. package/dist/graph/identity.d.ts +19 -0
  30. package/dist/graph/identity.js +39 -0
  31. package/dist/graph/spec.d.ts +20 -0
  32. package/dist/graph/spec.js +26 -0
  33. package/dist/hash/text.d.ts +10 -0
  34. package/dist/hash/text.js +20 -0
  35. package/dist/ids.d.ts +27 -0
  36. package/dist/ids.js +63 -0
  37. package/dist/limits.d.ts +10 -0
  38. package/dist/limits.js +10 -0
  39. package/dist/locale.d.ts +37 -0
  40. package/dist/locale.js +53 -0
  41. package/dist/material/domain.d.ts +4 -0
  42. package/dist/material/domain.js +8 -0
  43. package/dist/preview/artifact.d.ts +198 -0
  44. package/dist/preview/artifact.js +20 -0
  45. package/dist/preview/auth.d.ts +71 -0
  46. package/dist/preview/auth.js +49 -0
  47. package/dist/preview/document.d.ts +692 -0
  48. package/dist/preview/document.js +90 -0
  49. package/dist/preview/spec.d.ts +2517 -0
  50. package/dist/preview/spec.js +142 -0
  51. package/dist/preview/target.d.ts +172 -0
  52. package/dist/preview/target.js +70 -0
  53. package/dist/program/curriculum.d.ts +69 -0
  54. package/dist/program/curriculum.js +181 -0
  55. package/dist/program/snapshot/digest.d.ts +26 -0
  56. package/dist/program/snapshot/digest.js +220 -0
  57. package/dist/program/snapshot/hash.d.ts +31 -0
  58. package/dist/program/snapshot/hash.js +40 -0
  59. package/dist/program/snapshot/row-hash.d.ts +155 -0
  60. package/dist/program/snapshot/row-hash.js +34 -0
  61. package/dist/program/snapshot/row.d.ts +139 -0
  62. package/dist/program/snapshot/row.js +28 -0
  63. package/dist/program/snapshot/spec.d.ts +36 -0
  64. package/dist/program/snapshot/spec.js +39 -0
  65. package/dist/program/spec.d.ts +85 -0
  66. package/dist/program/spec.js +197 -0
  67. package/dist/projection/article.d.ts +145 -0
  68. package/dist/projection/article.js +150 -0
  69. package/dist/projection/digest.d.ts +261 -0
  70. package/dist/projection/digest.js +59 -0
  71. package/dist/projection/hash.d.ts +3 -0
  72. package/dist/projection/hash.js +10 -0
  73. package/dist/projection/material.d.ts +109 -0
  74. package/dist/projection/material.js +160 -0
  75. package/dist/projection/page.d.ts +112 -0
  76. package/dist/projection/page.js +106 -0
  77. package/dist/projection/question.d.ts +520 -0
  78. package/dist/projection/question.js +109 -0
  79. package/dist/projection/spec.d.ts +503 -0
  80. package/dist/projection/spec.js +56 -0
  81. package/dist/projection/verify.d.ts +281 -0
  82. package/dist/projection/verify.js +86 -0
  83. package/dist/question/identity.d.ts +175 -0
  84. package/dist/question/identity.js +205 -0
  85. package/dist/question/item.d.ts +453 -0
  86. package/dist/question/item.js +146 -0
  87. package/dist/question/response.d.ts +175 -0
  88. package/dist/question/response.js +150 -0
  89. package/dist/quran/attribution.d.ts +48 -0
  90. package/dist/quran/attribution.js +44 -0
  91. package/dist/quran/identity.d.ts +105 -0
  92. package/dist/quran/identity.js +100 -0
  93. package/dist/quran/notes.d.ts +56 -0
  94. package/dist/quran/notes.js +142 -0
  95. package/dist/quran/provenance.d.ts +257 -0
  96. package/dist/quran/provenance.js +144 -0
  97. package/dist/quran/snapshot/digest.d.ts +33 -0
  98. package/dist/quran/snapshot/digest.js +232 -0
  99. package/dist/quran/snapshot/hash.d.ts +51 -0
  100. package/dist/quran/snapshot/hash.js +50 -0
  101. package/dist/quran/snapshot/row/hash.d.ts +748 -0
  102. package/dist/quran/snapshot/row/hash.js +115 -0
  103. package/dist/quran/snapshot/row.d.ts +354 -0
  104. package/dist/quran/snapshot/row.js +91 -0
  105. package/dist/quran/snapshot/spec.d.ts +50 -0
  106. package/dist/quran/snapshot/spec.js +66 -0
  107. package/dist/quran/source.d.ts +206 -0
  108. package/dist/quran/source.js +153 -0
  109. package/dist/quran/spec.d.ts +47 -0
  110. package/dist/quran/spec.js +41 -0
  111. package/dist/quran/text.d.ts +7 -0
  112. package/dist/quran/text.js +11 -0
  113. package/dist/release/canonical.d.ts +23 -0
  114. package/dist/release/canonical.js +29 -0
  115. package/dist/release/current/evidence.d.ts +424 -0
  116. package/dist/release/current/evidence.js +41 -0
  117. package/dist/release/current/runtime.d.ts +4 -0
  118. package/dist/release/current/runtime.js +15 -0
  119. package/dist/release/current/state.d.ts +567 -0
  120. package/dist/release/current/state.js +91 -0
  121. package/dist/release/digest.d.ts +54 -0
  122. package/dist/release/digest.js +71 -0
  123. package/dist/release/hash.d.ts +72 -0
  124. package/dist/release/hash.js +14 -0
  125. package/dist/release/head.d.ts +206 -0
  126. package/dist/release/head.js +131 -0
  127. package/dist/release/items.d.ts +98 -0
  128. package/dist/release/items.js +114 -0
  129. package/dist/release/lifecycle.d.ts +297 -0
  130. package/dist/release/lifecycle.js +97 -0
  131. package/dist/release/origin.d.ts +30 -0
  132. package/dist/release/origin.js +24 -0
  133. package/dist/release/policy.d.ts +45 -0
  134. package/dist/release/policy.js +124 -0
  135. package/dist/release/result/digest.d.ts +127 -0
  136. package/dist/release/result/digest.js +140 -0
  137. package/dist/release/result/spec.d.ts +4 -0
  138. package/dist/release/result/spec.js +5 -0
  139. package/dist/release/rollback/digest.d.ts +126 -0
  140. package/dist/release/rollback/digest.js +92 -0
  141. package/dist/release/rollback/spec.d.ts +1729 -0
  142. package/dist/release/rollback/spec.js +156 -0
  143. package/dist/release/route/digest.d.ts +45 -0
  144. package/dist/release/route/digest.js +59 -0
  145. package/dist/release/route/page.d.ts +56 -0
  146. package/dist/release/route/page.js +46 -0
  147. package/dist/release/route/spec.d.ts +49 -0
  148. package/dist/release/route/spec.js +40 -0
  149. package/dist/release/route/verify.d.ts +66 -0
  150. package/dist/release/route/verify.js +67 -0
  151. package/dist/release/signing.d.ts +6 -0
  152. package/dist/release/signing.js +38 -0
  153. package/dist/release/snapshot/data.d.ts +475 -0
  154. package/dist/release/snapshot/data.js +74 -0
  155. package/dist/release/snapshot/evidence-requirement.d.ts +22 -0
  156. package/dist/release/snapshot/evidence-requirement.js +21 -0
  157. package/dist/release/snapshot/evidence.d.ts +58 -0
  158. package/dist/release/snapshot/evidence.js +14 -0
  159. package/dist/release/snapshot/program-evidence.d.ts +17 -0
  160. package/dist/release/snapshot/program-evidence.js +39 -0
  161. package/dist/release/snapshot/quran-evidence.d.ts +27 -0
  162. package/dist/release/snapshot/quran-evidence.js +43 -0
  163. package/dist/release/snapshot/scope.d.ts +60 -0
  164. package/dist/release/snapshot/scope.js +102 -0
  165. package/dist/release/snapshot/spec.d.ts +193 -0
  166. package/dist/release/snapshot/spec.js +139 -0
  167. package/dist/release/snapshot/tryout-evidence.d.ts +22 -0
  168. package/dist/release/snapshot/tryout-evidence.js +86 -0
  169. package/dist/release/snapshot/verify.d.ts +710 -0
  170. package/dist/release/snapshot/verify.js +147 -0
  171. package/dist/release/spec.d.ts +491 -0
  172. package/dist/release/spec.js +200 -0
  173. package/dist/release/verify.d.ts +98 -0
  174. package/dist/release/verify.js +70 -0
  175. package/dist/renderer/compatibility.d.ts +35 -0
  176. package/dist/renderer/compatibility.js +48 -0
  177. package/dist/renderer/component.d.ts +99 -0
  178. package/dist/renderer/component.js +102 -0
  179. package/dist/renderer/contract.d.ts +144 -0
  180. package/dist/renderer/contract.js +122 -0
  181. package/dist/renderer/domain.d.ts +6 -0
  182. package/dist/renderer/domain.js +18 -0
  183. package/dist/renderer/manifest.d.ts +86 -0
  184. package/dist/renderer/manifest.js +49 -0
  185. package/dist/renderer/selection.d.ts +39 -0
  186. package/dist/renderer/selection.js +87 -0
  187. package/dist/runtime/error.d.ts +8 -0
  188. package/dist/runtime/error.js +20 -0
  189. package/dist/runtime/protected/limits.d.ts +10 -0
  190. package/dist/runtime/protected/limits.js +15 -0
  191. package/dist/runtime/protected/spec.d.ts +328 -0
  192. package/dist/runtime/protected/spec.js +79 -0
  193. package/dist/runtime/protected/verify.d.ts +97 -0
  194. package/dist/runtime/protected/verify.js +72 -0
  195. package/dist/runtime/result.d.ts +12 -0
  196. package/dist/runtime/result.js +17 -0
  197. package/dist/runtime/spec.d.ts +705 -0
  198. package/dist/runtime/spec.js +61 -0
  199. package/dist/runtime/verify.d.ts +479 -0
  200. package/dist/runtime/verify.js +123 -0
  201. package/dist/signature/spec.d.ts +53 -0
  202. package/dist/signature/spec.js +29 -0
  203. package/dist/signature/trusted.d.ts +19 -0
  204. package/dist/signature/trusted.js +32 -0
  205. package/dist/signature/verify.d.ts +10 -0
  206. package/dist/signature/verify.js +82 -0
  207. package/dist/text/order.d.ts +2 -0
  208. package/dist/text/order.js +10 -0
  209. package/dist/text/syntax.d.ts +6 -0
  210. package/dist/text/syntax.js +15 -0
  211. package/dist/transport/batch.d.ts +971 -0
  212. package/dist/transport/batch.js +101 -0
  213. package/dist/transport/failure.d.ts +168 -0
  214. package/dist/transport/failure.js +194 -0
  215. package/dist/transport/group.d.ts +2946 -0
  216. package/dist/transport/group.js +47 -0
  217. package/dist/transport/limits.d.ts +30 -0
  218. package/dist/transport/limits.js +30 -0
  219. package/dist/transport/request.d.ts +9333 -0
  220. package/dist/transport/request.js +121 -0
  221. package/dist/transport/response.d.ts +6247 -0
  222. package/dist/transport/response.js +181 -0
  223. package/dist/transport/runtime.d.ts +77 -0
  224. package/dist/transport/runtime.js +33 -0
  225. package/dist/transport/snapshot.d.ts +978 -0
  226. package/dist/transport/snapshot.js +70 -0
  227. package/dist/tryout/canonical.d.ts +2 -0
  228. package/dist/tryout/canonical.js +11 -0
  229. package/dist/tryout/catalog-hash.d.ts +134 -0
  230. package/dist/tryout/catalog-hash.js +203 -0
  231. package/dist/tryout/catalog.d.ts +376 -0
  232. package/dist/tryout/catalog.js +147 -0
  233. package/dist/tryout/content-hash.d.ts +89 -0
  234. package/dist/tryout/content-hash.js +72 -0
  235. package/dist/tryout/identity.d.ts +12 -0
  236. package/dist/tryout/identity.js +46 -0
  237. package/dist/tryout/key.d.ts +4 -0
  238. package/dist/tryout/key.js +8 -0
  239. package/dist/tryout/language.d.ts +24 -0
  240. package/dist/tryout/language.js +32 -0
  241. package/dist/tryout/locale-closure.d.ts +20 -0
  242. package/dist/tryout/locale-closure.js +164 -0
  243. package/dist/tryout/placement-closure.d.ts +5 -0
  244. package/dist/tryout/placement-closure.js +30 -0
  245. package/dist/tryout/placement-hash.d.ts +11 -0
  246. package/dist/tryout/placement-hash.js +55 -0
  247. package/dist/tryout/placement.d.ts +280 -0
  248. package/dist/tryout/placement.js +82 -0
  249. package/dist/tryout/row-hash.d.ts +28 -0
  250. package/dist/tryout/row-hash.js +50 -0
  251. package/dist/tryout/runtime/canonical.d.ts +8 -0
  252. package/dist/tryout/runtime/canonical.js +33 -0
  253. package/dist/tryout/runtime/hash.d.ts +32 -0
  254. package/dist/tryout/runtime/hash.js +11 -0
  255. package/dist/tryout/runtime/source.d.ts +42 -0
  256. package/dist/tryout/runtime/source.js +47 -0
  257. package/dist/tryout/runtime/spec.d.ts +58 -0
  258. package/dist/tryout/runtime/spec.js +21 -0
  259. package/dist/tryout/runtime/verify.d.ts +61 -0
  260. package/dist/tryout/runtime/verify.js +69 -0
  261. package/dist/tryout/snapshot/canonical.d.ts +7 -0
  262. package/dist/tryout/snapshot/canonical.js +17 -0
  263. package/dist/tryout/snapshot/hash.d.ts +8 -0
  264. package/dist/tryout/snapshot/hash.js +19 -0
  265. package/dist/tryout/snapshot/spec.d.ts +46 -0
  266. package/dist/tryout/snapshot/spec.js +30 -0
  267. package/dist/tryout/spec.d.ts +13 -0
  268. package/dist/tryout/spec.js +15 -0
  269. package/package.json +506 -0
@@ -0,0 +1,91 @@
1
+ import { Schema } from "effect";
2
+ import { ActiveContentReleaseSchema, hasSameAppLocales, } from "#contracts/release/current/evidence";
3
+ import { hasCurrentTryoutRuntimeBundle } from "#contracts/release/current/runtime";
4
+ import { ContentReleaseBundleSchema, } from "#contracts/release/lifecycle";
5
+ import { EMPTY_RESULT_CATALOG_DIGEST } from "#contracts/release/result/spec";
6
+ import { hasSameContentSnapshots, invertContentSnapshots, } from "#contracts/release/snapshot/spec";
7
+ import { SignedTryoutRuntimeBundleSchema } from "#contracts/tryout/runtime/spec";
8
+ const TryoutRuntimeBundleSchema = Schema.NullOr(SignedTryoutRuntimeBundleSchema);
9
+ const StagedReleasePhaseSchema = Schema.Literals([
10
+ "staging",
11
+ "verifying",
12
+ "verified",
13
+ "aborting",
14
+ ]);
15
+ /** Exact durable release bundle currently owning one invisible slot. */
16
+ export const StagedContentReleaseSchema = ContentReleaseBundleSchema.mapFields((fields) => ({ ...fields, phase: StagedReleasePhaseSchema }), { unsafePreserveChecks: true });
17
+ /** Candidate recovery slot accepted only when it contains a rollback. */
18
+ export const StagedRollbackContentReleaseSchema = StagedContentReleaseSchema.pipe(Schema.refine((release) => release.release.manifest.origin.kind === "rollback", { message: "Expected a staged rollback release." }));
19
+ /** Checks one candidate against its exact active base or genesis identity. */
20
+ function hasCoherentCandidate(active, candidate) {
21
+ if (candidate === null) {
22
+ return true;
23
+ }
24
+ const { manifest } = candidate.release;
25
+ if (active === null) {
26
+ return (manifest.baseReleaseId === null &&
27
+ manifest.baseManifestHash === null &&
28
+ manifest.baseActiveAppLocales === null &&
29
+ manifest.baseResultCount === 0 &&
30
+ manifest.baseResultDigest === EMPTY_RESULT_CATALOG_DIGEST);
31
+ }
32
+ const activeManifest = active.release.manifest;
33
+ return (activeManifest.releaseId === manifest.baseReleaseId &&
34
+ active.release.manifestHash === manifest.baseManifestHash &&
35
+ activeManifest.resultCount === manifest.baseResultCount &&
36
+ activeManifest.resultDigest === manifest.baseResultDigest &&
37
+ manifest.baseActiveAppLocales !== null &&
38
+ hasSameAppLocales(activeManifest.activeAppLocales, manifest.baseActiveAppLocales));
39
+ }
40
+ /** Checks one retained inverse against the candidate or active target it restores. */
41
+ function hasCoherentRecovery(input) {
42
+ if (input.recovery === null) {
43
+ return true;
44
+ }
45
+ const target = input.candidate ?? input.active;
46
+ if (target === null) {
47
+ return false;
48
+ }
49
+ const pairedCandidate = input.candidate !== null;
50
+ if (pairedCandidate &&
51
+ (input.candidate.phase !== "verified" ||
52
+ input.recovery.phase === "aborting")) {
53
+ return false;
54
+ }
55
+ if (!pairedCandidate &&
56
+ input.recovery.phase !== "verified" &&
57
+ input.recovery.phase !== "aborting") {
58
+ return false;
59
+ }
60
+ const { manifest } = input.recovery.release;
61
+ const targetManifest = target.release.manifest;
62
+ const restoredActiveAppLocales = targetManifest.baseActiveAppLocales ?? targetManifest.activeAppLocales;
63
+ return (manifest.origin.releaseId === targetManifest.releaseId &&
64
+ manifest.baseReleaseId === targetManifest.releaseId &&
65
+ manifest.baseManifestHash === target.release.manifestHash &&
66
+ manifest.baseResultCount === targetManifest.resultCount &&
67
+ manifest.baseResultDigest === targetManifest.resultDigest &&
68
+ manifest.baseActiveAppLocales !== null &&
69
+ hasSameAppLocales(manifest.baseActiveAppLocales, targetManifest.activeAppLocales) &&
70
+ manifest.resultCount === targetManifest.baseResultCount &&
71
+ manifest.resultDigest === targetManifest.baseResultDigest &&
72
+ hasSameAppLocales(manifest.activeAppLocales, restoredActiveAppLocales) &&
73
+ manifest.releaseId !== input.active?.release.manifest.releaseId &&
74
+ hasSameContentSnapshots(manifest.snapshots, invertContentSnapshots(targetManifest.snapshots)) &&
75
+ input.recovery.rendererManifest.hash === target.rendererManifest.hash);
76
+ }
77
+ /** Checks the candidate and retained inverse against their exact bases. */
78
+ function hasCoherentCurrentState(input) {
79
+ return (hasCoherentCandidate(input.active, input.candidate) &&
80
+ hasCoherentRecovery(input) &&
81
+ hasCurrentTryoutRuntimeBundle(input.active, input.tryoutRuntimeBundle));
82
+ }
83
+ /** Authoritative singleton publication state used before release preparation. */
84
+ export const ContentReleaseCurrentSchema = Schema.Struct({
85
+ active: Schema.NullOr(ActiveContentReleaseSchema),
86
+ candidate: Schema.NullOr(StagedContentReleaseSchema),
87
+ recovery: Schema.NullOr(StagedRollbackContentReleaseSchema),
88
+ tryoutRuntimeBundle: TryoutRuntimeBundleSchema,
89
+ }).pipe(Schema.check(Schema.makeFilter(hasCoherentCurrentState, {
90
+ message: "Expected active, candidate, and recovery identities to be coherent.",
91
+ })));
@@ -0,0 +1,54 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { type ReleaseId } from "#contracts/ids";
3
+ import type { ContentReleaseItem } from "#contracts/release/spec";
4
+ declare const ReleaseItemsHashComputationError_base: Schema.Class<ReleaseItemsHashComputationError, Schema.TaggedStruct<"ReleaseItemsHashComputationError", {
5
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
6
+ }>, import("effect/Cause").YieldableError>;
7
+ /** SHA-256 computation failed before item integrity was established. */
8
+ export declare class ReleaseItemsHashComputationError extends ReleaseItemsHashComputationError_base {
9
+ }
10
+ /** Keeps Node hash state private while exposing canonical operation counts. */
11
+ declare class ReleaseItemsDigestState {
12
+ #private;
13
+ count: number;
14
+ deleteCount: number;
15
+ upsertCount: number;
16
+ /** Initializes a domain-separated incremental release-item hash. */
17
+ constructor();
18
+ /** Adds one canonical release item and updates operation counts. */
19
+ update(item: ContentReleaseItem): void;
20
+ /** Consumes the hash and returns its branded immutable identity. */
21
+ digest(): string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
22
+ }
23
+ /** Creates a fresh domain-separated digest state for one release stream. */
24
+ export declare function createReleaseItemsDigest(releaseId: ReleaseId): Effect.Effect<ReleaseItemsDigestState, ReleaseItemsHashComputationError, never>;
25
+ /** Adds one canonical release item to its incremental digest and counts. */
26
+ export declare function updateReleaseItemsDigest(releaseId: ReleaseId, state: ReleaseItemsDigestState, item: ContentReleaseItem): Effect.Effect<ReleaseItemsDigestState, ReleaseItemsHashComputationError, never>;
27
+ /** Finalizes one incremental release-item digest with typed hash failures. */
28
+ export declare function finalizeReleaseItemsDigest(releaseId: ReleaseId, state: ReleaseItemsDigestState): Effect.Effect<string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">, ReleaseItemsHashComputationError, never>;
29
+ /** Digests a release-item stream without retaining its content changes. */
30
+ export declare const digestItems: <E, R>(releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">, items: Stream.Stream<{
31
+ readonly change: {
32
+ readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
33
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
34
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
35
+ readonly delivery: "authenticated" | "entitled" | "public";
36
+ readonly family: "article" | "material" | "page" | "question";
37
+ readonly operation: "upsert";
38
+ readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
39
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
40
+ } | {
41
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
42
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
43
+ readonly family: "article" | "material" | "page" | "question";
44
+ readonly operation: "delete";
45
+ };
46
+ readonly index: number;
47
+ readonly releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
48
+ }, E, R>) => Effect.Effect<{
49
+ count: number;
50
+ deleteCount: number;
51
+ digest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
52
+ upsertCount: number;
53
+ }, E | ReleaseItemsHashComputationError, R>;
54
+ export {};
@@ -0,0 +1,71 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Effect, Schema, Stream } from "effect";
3
+ import { ReleaseIdSchema, Sha256HashSchema, } from "#contracts/ids";
4
+ import { canonicalizeContentReleaseItem } from "#contracts/release/canonical";
5
+ const CONTENT_RELEASE_ITEMS_DIGEST_DOMAIN = "nakafa.aksara.content-release-items";
6
+ /** SHA-256 computation failed before item integrity was established. */
7
+ export class ReleaseItemsHashComputationError extends Schema.TaggedError()("ReleaseItemsHashComputationError", { releaseId: ReleaseIdSchema }) {
8
+ }
9
+ /** Keeps Node hash state private while exposing canonical operation counts. */
10
+ class ReleaseItemsDigestState {
11
+ #hash = createHash("sha256");
12
+ count = 0;
13
+ deleteCount = 0;
14
+ upsertCount = 0;
15
+ /** Initializes a domain-separated incremental release-item hash. */
16
+ constructor() {
17
+ this.#hash.update(CONTENT_RELEASE_ITEMS_DIGEST_DOMAIN);
18
+ this.#hash.update("\n");
19
+ }
20
+ /** Adds one canonical release item and updates operation counts. */
21
+ update(item) {
22
+ this.#hash.update(canonicalizeContentReleaseItem(item));
23
+ this.#hash.update("\n");
24
+ this.count += 1;
25
+ if (item.change.operation === "delete") {
26
+ this.deleteCount += 1;
27
+ return;
28
+ }
29
+ this.upsertCount += 1;
30
+ }
31
+ /** Consumes the hash and returns its branded immutable identity. */
32
+ digest() {
33
+ return Sha256HashSchema.make(`sha256:${this.#hash.digest("hex")}`);
34
+ }
35
+ }
36
+ /** Creates a fresh domain-separated digest state for one release stream. */
37
+ export function createReleaseItemsDigest(releaseId) {
38
+ return Effect.try({
39
+ catch: () => new ReleaseItemsHashComputationError({ releaseId }),
40
+ try: () => new ReleaseItemsDigestState(),
41
+ });
42
+ }
43
+ /** Adds one canonical release item to its incremental digest and counts. */
44
+ export function updateReleaseItemsDigest(releaseId, state, item) {
45
+ return Effect.try({
46
+ catch: () => new ReleaseItemsHashComputationError({ releaseId }),
47
+ try: () => {
48
+ state.update(item);
49
+ return state;
50
+ },
51
+ });
52
+ }
53
+ /** Finalizes one incremental release-item digest with typed hash failures. */
54
+ export function finalizeReleaseItemsDigest(releaseId, state) {
55
+ return Effect.try({
56
+ catch: () => new ReleaseItemsHashComputationError({ releaseId }),
57
+ try: () => state.digest(),
58
+ });
59
+ }
60
+ /** Digests a release-item stream without retaining its content changes. */
61
+ export const digestItems = Effect.fn("AksaraContracts.digestItems")(function* (releaseId, items) {
62
+ const initial = yield* createReleaseItemsDigest(releaseId);
63
+ const state = yield* items.pipe(Stream.runFoldEffect(() => initial, (current, item) => updateReleaseItemsDigest(releaseId, current, item)));
64
+ const digest = yield* finalizeReleaseItemsDigest(releaseId, state);
65
+ return {
66
+ count: state.count,
67
+ deleteCount: state.deleteCount,
68
+ digest,
69
+ upsertCount: state.upsertCount,
70
+ };
71
+ });
@@ -0,0 +1,72 @@
1
+ import { Effect, Schema } from "effect";
2
+ declare const ReleaseHashComputationError_base: Schema.Class<ReleaseHashComputationError, Schema.TaggedStruct<"ReleaseHashComputationError", {
3
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
4
+ }>, import("effect/Cause").YieldableError>;
5
+ /** SHA-256 computation failed before release authenticity was established. */
6
+ export declare class ReleaseHashComputationError extends ReleaseHashComputationError_base {
7
+ }
8
+ /** Computes the immutable identity of one canonical release manifest. */
9
+ export declare const hashContentReleaseManifest: (manifest: {
10
+ readonly baseActiveAppLocales: readonly [("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">, ...(("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">)[]] | null;
11
+ readonly baseManifestHash: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
12
+ readonly baseReleaseId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">) | null;
13
+ readonly baseResultCount: number;
14
+ readonly baseResultDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
15
+ readonly deleteCount: number;
16
+ readonly itemCount: number;
17
+ readonly itemsDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
18
+ readonly origin: {
19
+ readonly kind: "git";
20
+ readonly sha: string & import("effect/Brand").Brand<"@NakafaAI/AksaraGitCommitSha">;
21
+ } | {
22
+ readonly kind: "rollback";
23
+ readonly releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
24
+ };
25
+ readonly projectionCount: number;
26
+ readonly projectionDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
27
+ readonly releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
28
+ readonly rendererContractVersion: "1.0.0";
29
+ readonly rendererManifestHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
30
+ readonly resultCount: number;
31
+ readonly resultDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
32
+ readonly rollbackCount: number;
33
+ readonly rollbackDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
34
+ readonly routeCount: number;
35
+ readonly routeDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
36
+ readonly scope: {
37
+ readonly content?: readonly {
38
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
39
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
40
+ readonly family: "article" | "material" | "page" | "question";
41
+ }[] | undefined;
42
+ readonly families: readonly ("article" | "material" | "page" | "question")[];
43
+ readonly snapshots: readonly ("program" | "quran" | "tryout")[];
44
+ };
45
+ readonly snapshots: {
46
+ readonly program: {
47
+ readonly baseSnapshotId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
48
+ readonly mode: "inherit" | "replace" | "restore";
49
+ readonly resultSnapshotId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
50
+ readonly rowCount: number;
51
+ readonly rowDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
52
+ };
53
+ readonly quran: {
54
+ readonly baseSnapshotId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
55
+ readonly mode: "inherit" | "replace" | "restore";
56
+ readonly resultSnapshotId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
57
+ readonly rowCount: number;
58
+ readonly rowDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
59
+ };
60
+ readonly tryout: {
61
+ readonly baseSnapshotId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
62
+ readonly mode: "inherit" | "replace" | "restore";
63
+ readonly resultSnapshotId: (string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">) | null;
64
+ readonly rowCount: number;
65
+ readonly rowDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
66
+ };
67
+ };
68
+ readonly upsertCount: number;
69
+ readonly activeAppLocales: readonly [("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">, ...(("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">)[]];
70
+ readonly format: "localized-content-release";
71
+ }) => Effect.Effect<string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">, ReleaseHashComputationError, never>;
72
+ export {};
@@ -0,0 +1,14 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Effect, Schema } from "effect";
3
+ import { ReleaseIdSchema, Sha256HashSchema } from "#contracts/ids";
4
+ import { canonicalizeContentReleaseManifest } from "#contracts/release/signing";
5
+ /** SHA-256 computation failed before release authenticity was established. */
6
+ export class ReleaseHashComputationError extends Schema.TaggedError()("ReleaseHashComputationError", { releaseId: ReleaseIdSchema }) {
7
+ }
8
+ /** Computes the immutable identity of one canonical release manifest. */
9
+ export const hashContentReleaseManifest = Effect.fn("AksaraContracts.hashContentReleaseManifest")((manifest) => Effect.try({
10
+ catch: () => new ReleaseHashComputationError({ releaseId: manifest.releaseId }),
11
+ try: () => Sha256HashSchema.make(`sha256:${createHash("sha256")
12
+ .update(canonicalizeContentReleaseManifest(manifest))
13
+ .digest("hex")}`),
14
+ }));
@@ -0,0 +1,206 @@
1
+ import { Schema } from "effect";
2
+ /** Compact authoritative identity used to diff one published article head. */
3
+ export declare const ArticleHeadSchema: Schema.Struct<{
4
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
5
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
6
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
7
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
8
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
9
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
10
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
11
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
12
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
13
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
14
+ readonly family: Schema.Literal<"article">;
15
+ }>;
16
+ export type ArticleHead = typeof ArticleHeadSchema.Type;
17
+ /** Compact authoritative identity used to diff one published material head. */
18
+ export declare const MaterialHeadSchema: Schema.Struct<{
19
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
20
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
21
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
22
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
23
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
24
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
25
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
26
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
27
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
28
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
29
+ readonly family: Schema.Literal<"material">;
30
+ }>;
31
+ export type MaterialHead = typeof MaterialHeadSchema.Type;
32
+ /** Compact authoritative identity used to diff one published page head. */
33
+ export declare const PageHeadSchema: Schema.Struct<{
34
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
35
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
36
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
37
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
38
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
39
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
40
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
41
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
42
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
43
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
44
+ readonly family: Schema.Literal<"page">;
45
+ }>;
46
+ export type PageHead = typeof PageHeadSchema.Type;
47
+ /** Compact authoritative identity used to diff one published question body. */
48
+ export declare const QuestionHeadSchema: Schema.Struct<{
49
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
50
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
51
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
52
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
53
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
54
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
55
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
56
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
57
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
58
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
59
+ readonly family: Schema.Literal<"question">;
60
+ }>;
61
+ export type QuestionHead = typeof QuestionHeadSchema.Type;
62
+ /** Complete compact-head vocabulary backed by implemented content families. */
63
+ export declare const ContentHeadSchema: Schema.Union<readonly [Schema.Struct<{
64
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
65
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
66
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
67
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
68
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
69
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
70
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
71
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
72
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
73
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
74
+ readonly family: Schema.Literal<"article">;
75
+ }>, Schema.Struct<{
76
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
77
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
78
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
79
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
80
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
81
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
82
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
83
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
84
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
85
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
86
+ readonly family: Schema.Literal<"material">;
87
+ }>, Schema.Struct<{
88
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
89
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
90
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
91
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
92
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
93
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
94
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
95
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
96
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
97
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
98
+ readonly family: Schema.Literal<"page">;
99
+ }>, Schema.Struct<{
100
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
101
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
102
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
103
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
104
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
105
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
106
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
107
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
108
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
109
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
110
+ readonly family: Schema.Literal<"question">;
111
+ }>]>;
112
+ export type ContentHead = typeof ContentHeadSchema.Type;
113
+ /** Serializes one compact head in stable catalog field order. */
114
+ export declare function canonicalizeContentHead(head: ContentHead): string;
115
+ /** Requests one bounded family-owned head page from an exact active release. */
116
+ export declare const HeadPageRequestSchema: Schema.Struct<{
117
+ readonly activeManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
118
+ readonly activeReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
119
+ readonly cursor: Schema.NullOr<Schema.Trimmed>;
120
+ readonly family: Schema.Literals<readonly ["article", "material", "page", "question"]>;
121
+ readonly limit: Schema.Finite;
122
+ }>;
123
+ export type HeadPageRequest = typeof HeadPageRequestSchema.Type;
124
+ /** Bounded canonical page proving one exact family-owned head inventory. */
125
+ export declare const HeadPageSchema: Schema.Union<readonly [Schema.Struct<{
126
+ readonly activeManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
127
+ readonly activeReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
128
+ readonly cursor: Schema.NullOr<Schema.Trimmed>;
129
+ readonly done: Schema.Boolean;
130
+ readonly nextCursor: Schema.NullOr<Schema.Trimmed>;
131
+ readonly family: Schema.Literal<"article">;
132
+ readonly heads: Schema.$Array<Schema.Struct<{
133
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
134
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
135
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
136
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
137
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
138
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
139
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
140
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
141
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
142
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
143
+ readonly family: Schema.Literal<"article">;
144
+ }>>;
145
+ }>, Schema.Struct<{
146
+ readonly activeManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
147
+ readonly activeReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
148
+ readonly cursor: Schema.NullOr<Schema.Trimmed>;
149
+ readonly done: Schema.Boolean;
150
+ readonly nextCursor: Schema.NullOr<Schema.Trimmed>;
151
+ readonly family: Schema.Literal<"material">;
152
+ readonly heads: Schema.$Array<Schema.Struct<{
153
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
154
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
155
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
156
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
157
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
158
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
159
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
160
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
161
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
162
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
163
+ readonly family: Schema.Literal<"material">;
164
+ }>>;
165
+ }>, Schema.Struct<{
166
+ readonly activeManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
167
+ readonly activeReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
168
+ readonly cursor: Schema.NullOr<Schema.Trimmed>;
169
+ readonly done: Schema.Boolean;
170
+ readonly nextCursor: Schema.NullOr<Schema.Trimmed>;
171
+ readonly family: Schema.Literal<"page">;
172
+ readonly heads: Schema.$Array<Schema.Struct<{
173
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
174
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
175
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
176
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
177
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
178
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
179
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
180
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
181
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
182
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
183
+ readonly family: Schema.Literal<"page">;
184
+ }>>;
185
+ }>, Schema.Struct<{
186
+ readonly activeManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
187
+ readonly activeReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
188
+ readonly cursor: Schema.NullOr<Schema.Trimmed>;
189
+ readonly done: Schema.Boolean;
190
+ readonly nextCursor: Schema.NullOr<Schema.Trimmed>;
191
+ readonly family: Schema.Literal<"question">;
192
+ readonly heads: Schema.$Array<Schema.Struct<{
193
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
194
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
195
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
196
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
197
+ readonly delivery: Schema.Literals<readonly ["public", "authenticated", "entitled"]>;
198
+ readonly projectionHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
199
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
200
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
201
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
202
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
203
+ readonly family: Schema.Literal<"question">;
204
+ }>>;
205
+ }>]>;
206
+ export type HeadPage = typeof HeadPageSchema.Type;