@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,131 @@
1
+ import { Schema } from "effect";
2
+ import { ContentFamilySchema, compareContentHeads } from "#contracts/content";
3
+ import { ContentDeliveryClassSchema } from "#contracts/delivery";
4
+ import { ContentKeySchema, CorpusSourcePathSchema, PublicPathSchema, ReleaseIdSchema, Sha256HashSchema, } from "#contracts/ids";
5
+ import { ArtifactLocaleSchema } from "#contracts/locale";
6
+ import { RendererDomainSchema } from "#contracts/renderer/domain";
7
+ import { MAX_HEAD_PAGE_COUNT } from "#contracts/transport/limits";
8
+ const HeadCursorSchema = Schema.NullOr(Schema.Trimmed.check(Schema.isNonEmpty()).pipe(Schema.check(Schema.isMaxLength(4096))));
9
+ const ContentHeadFields = {
10
+ artifactHash: Sha256HashSchema,
11
+ artifactLocale: ArtifactLocaleSchema,
12
+ compilerConfigHash: Sha256HashSchema,
13
+ contentKey: ContentKeySchema,
14
+ delivery: ContentDeliveryClassSchema,
15
+ projectionHash: Sha256HashSchema,
16
+ publicPath: Schema.optional(PublicPathSchema),
17
+ rendererDomain: RendererDomainSchema,
18
+ sourceHash: Sha256HashSchema,
19
+ sourcePath: CorpusSourcePathSchema,
20
+ };
21
+ /** Compact authoritative identity used to diff one published article head. */
22
+ export const ArticleHeadSchema = Schema.Struct({
23
+ ...ContentHeadFields,
24
+ family: Schema.Literal("article"),
25
+ });
26
+ /** Compact authoritative identity used to diff one published material head. */
27
+ export const MaterialHeadSchema = Schema.Struct({
28
+ ...ContentHeadFields,
29
+ family: Schema.Literal("material"),
30
+ });
31
+ /** Compact authoritative identity used to diff one published page head. */
32
+ export const PageHeadSchema = Schema.Struct({
33
+ ...ContentHeadFields,
34
+ family: Schema.Literal("page"),
35
+ }).pipe(Schema.check(Schema.makeFilter(({ publicPath }) => publicPath !== undefined, {
36
+ message: "Expected page heads to retain their public path.",
37
+ })));
38
+ /** Compact authoritative identity used to diff one published question body. */
39
+ export const QuestionHeadSchema = Schema.Struct({
40
+ ...ContentHeadFields,
41
+ family: Schema.Literal("question"),
42
+ }).pipe(Schema.check(Schema.makeFilter(({ publicPath }) => publicPath === undefined, {
43
+ message: "Expected question heads to remain route-free.",
44
+ })));
45
+ /** Complete compact-head vocabulary backed by implemented content families. */
46
+ export const ContentHeadSchema = Schema.Union([
47
+ ArticleHeadSchema,
48
+ MaterialHeadSchema,
49
+ PageHeadSchema,
50
+ QuestionHeadSchema,
51
+ ]);
52
+ /** Serializes one compact head in stable catalog field order. */
53
+ export function canonicalizeContentHead(head) {
54
+ return JSON.stringify({
55
+ artifactHash: head.artifactHash,
56
+ artifactLocale: head.artifactLocale,
57
+ compilerConfigHash: head.compilerConfigHash,
58
+ contentKey: head.contentKey,
59
+ delivery: head.delivery,
60
+ family: head.family,
61
+ projectionHash: head.projectionHash,
62
+ ...(head.publicPath === undefined ? {} : { publicPath: head.publicPath }),
63
+ rendererDomain: head.rendererDomain,
64
+ sourceHash: head.sourceHash,
65
+ sourcePath: head.sourcePath,
66
+ });
67
+ }
68
+ /** Requests one bounded family-owned head page from an exact active release. */
69
+ export const HeadPageRequestSchema = Schema.Struct({
70
+ activeManifestHash: Sha256HashSchema,
71
+ activeReleaseId: ReleaseIdSchema,
72
+ cursor: HeadCursorSchema,
73
+ family: ContentFamilySchema,
74
+ limit: Schema.Finite.pipe(Schema.check(Schema.isInt()), Schema.check(Schema.isBetween({ maximum: MAX_HEAD_PAGE_COUNT, minimum: 1 }))),
75
+ });
76
+ /** Checks deterministic head order and opaque cursor progress. */
77
+ function hasCanonicalHeadPage(page) {
78
+ const hasCanonicalOrder = page.heads.every((head, index) => {
79
+ const previous = page.heads[index - 1];
80
+ return previous === undefined || compareContentHeads(previous, head) < 0;
81
+ });
82
+ if (!hasCanonicalOrder) {
83
+ return false;
84
+ }
85
+ if (page.done) {
86
+ return page.nextCursor === null;
87
+ }
88
+ return page.nextCursor !== null && page.nextCursor !== page.cursor;
89
+ }
90
+ const HeadPageFields = {
91
+ activeManifestHash: Sha256HashSchema,
92
+ activeReleaseId: ReleaseIdSchema,
93
+ cursor: HeadCursorSchema,
94
+ done: Schema.Boolean,
95
+ nextCursor: HeadCursorSchema,
96
+ };
97
+ const ArticleHeadPageSchema = Schema.Struct({
98
+ ...HeadPageFields,
99
+ family: Schema.Literal("article"),
100
+ heads: Schema.Array(ArticleHeadSchema).pipe(Schema.check(Schema.isMaxLength(MAX_HEAD_PAGE_COUNT))),
101
+ }).pipe(Schema.check(Schema.makeFilter(hasCanonicalHeadPage, {
102
+ message: "Expected canonical article heads with coherent cursor progress.",
103
+ })));
104
+ const MaterialHeadPageSchema = Schema.Struct({
105
+ ...HeadPageFields,
106
+ family: Schema.Literal("material"),
107
+ heads: Schema.Array(MaterialHeadSchema).pipe(Schema.check(Schema.isMaxLength(MAX_HEAD_PAGE_COUNT))),
108
+ }).pipe(Schema.check(Schema.makeFilter(hasCanonicalHeadPage, {
109
+ message: "Expected canonical material heads with coherent cursor progress.",
110
+ })));
111
+ const PageHeadPageSchema = Schema.Struct({
112
+ ...HeadPageFields,
113
+ family: Schema.Literal("page"),
114
+ heads: Schema.Array(PageHeadSchema).pipe(Schema.check(Schema.isMaxLength(MAX_HEAD_PAGE_COUNT))),
115
+ }).pipe(Schema.check(Schema.makeFilter(hasCanonicalHeadPage, {
116
+ message: "Expected canonical page heads with coherent cursor progress.",
117
+ })));
118
+ const QuestionHeadPageSchema = Schema.Struct({
119
+ ...HeadPageFields,
120
+ family: Schema.Literal("question"),
121
+ heads: Schema.Array(QuestionHeadSchema).pipe(Schema.check(Schema.isMaxLength(MAX_HEAD_PAGE_COUNT))),
122
+ }).pipe(Schema.check(Schema.makeFilter(hasCanonicalHeadPage, {
123
+ message: "Expected canonical question heads with coherent cursor progress.",
124
+ })));
125
+ /** Bounded canonical page proving one exact family-owned head inventory. */
126
+ export const HeadPageSchema = Schema.Union([
127
+ ArticleHeadPageSchema,
128
+ MaterialHeadPageSchema,
129
+ PageHeadPageSchema,
130
+ QuestionHeadPageSchema,
131
+ ]);
@@ -0,0 +1,98 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { type ContentReleaseManifest } from "#contracts/release/spec";
3
+ declare const ReleaseItemDecodeError_base: Schema.Class<ReleaseItemDecodeError, Schema.TaggedStruct<"ReleaseItemDecodeError", {
4
+ readonly itemOffset: Schema.Finite;
5
+ }>, import("effect/Cause").YieldableError>;
6
+ /** One release item failed strict wire decoding. */
7
+ export declare class ReleaseItemDecodeError extends ReleaseItemDecodeError_base {
8
+ }
9
+ declare const ReleaseItemCountMismatchError_base: Schema.Class<ReleaseItemCountMismatchError, Schema.TaggedStruct<"ReleaseItemCountMismatchError", {
10
+ readonly actualCount: Schema.Finite;
11
+ readonly expectedCount: Schema.Finite;
12
+ }>, import("effect/Cause").YieldableError>;
13
+ /** The separate item stream does not have the signed manifest length. */
14
+ export declare class ReleaseItemCountMismatchError extends ReleaseItemCountMismatchError_base {
15
+ }
16
+ declare const ReleaseItemOperationCountMismatchError_base: Schema.Class<ReleaseItemOperationCountMismatchError, Schema.TaggedStruct<"ReleaseItemOperationCountMismatchError", {
17
+ readonly actualDeletes: Schema.Finite;
18
+ readonly actualUpserts: Schema.Finite;
19
+ readonly expectedDeletes: Schema.Finite;
20
+ readonly expectedUpserts: Schema.Finite;
21
+ }>, import("effect/Cause").YieldableError>;
22
+ /** Upsert and delete totals do not match the counts signed by the manifest. */
23
+ export declare class ReleaseItemOperationCountMismatchError extends ReleaseItemOperationCountMismatchError_base {
24
+ }
25
+ declare const ReleaseItemReleaseMismatchError_base: Schema.Class<ReleaseItemReleaseMismatchError, Schema.TaggedStruct<"ReleaseItemReleaseMismatchError", {
26
+ readonly itemOffset: Schema.Finite;
27
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
28
+ }>, import("effect/Cause").YieldableError>;
29
+ /** An item belongs to another release envelope. */
30
+ export declare class ReleaseItemReleaseMismatchError extends ReleaseItemReleaseMismatchError_base {
31
+ }
32
+ declare const ReleaseItemIndexMismatchError_base: Schema.Class<ReleaseItemIndexMismatchError, Schema.TaggedStruct<"ReleaseItemIndexMismatchError", {
33
+ readonly actualIndex: Schema.Finite;
34
+ readonly expectedIndex: Schema.Finite;
35
+ }>, import("effect/Cause").YieldableError>;
36
+ /** An item is missing, duplicated, or out of its signed sequence. */
37
+ export declare class ReleaseItemIndexMismatchError extends ReleaseItemIndexMismatchError_base {
38
+ }
39
+ declare const ReleaseItemOrderError_base: Schema.Class<ReleaseItemOrderError, Schema.TaggedStruct<"ReleaseItemOrderError", {
40
+ readonly itemOffset: Schema.Finite;
41
+ }>, import("effect/Cause").YieldableError>;
42
+ /** Item heads are duplicated or not in canonical content-head order. */
43
+ export declare class ReleaseItemOrderError extends ReleaseItemOrderError_base {
44
+ }
45
+ declare const ReleaseItemScopeError_base: Schema.Class<ReleaseItemScopeError, Schema.TaggedStruct<"ReleaseItemScopeError", {
46
+ readonly itemOffset: Schema.Finite;
47
+ }>, import("effect/Cause").YieldableError>;
48
+ /** One signed item falls outside the release's exact publication scope. */
49
+ export declare class ReleaseItemScopeError extends ReleaseItemScopeError_base {
50
+ }
51
+ declare const ReleaseItemsDigestMismatchError_base: Schema.Class<ReleaseItemsDigestMismatchError, Schema.TaggedStruct<"ReleaseItemsDigestMismatchError", {
52
+ readonly actualDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
53
+ readonly expectedDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
54
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
55
+ }>, import("effect/Cause").YieldableError>;
56
+ /** The separate ordered items do not match the signed digest. */
57
+ export declare class ReleaseItemsDigestMismatchError extends ReleaseItemsDigestMismatchError_base {
58
+ }
59
+ /** Counts derived without retaining a complete release-item collection. */
60
+ export interface VerifiedContentReleaseItems {
61
+ readonly deleteCount: number;
62
+ readonly upsertCount: number;
63
+ }
64
+ /**
65
+ * Strictly decodes a replayable item stream without retaining its bodies.
66
+ * Every evaluation owns fresh ordering and route-collision state.
67
+ */
68
+ export declare function decodeContentReleaseItems<E, R>(input: {
69
+ readonly items: Stream.Stream<unknown, E, R>;
70
+ readonly manifest: ContentReleaseManifest;
71
+ }): Stream.Stream<{
72
+ readonly change: {
73
+ readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
74
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
75
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
76
+ readonly delivery: "authenticated" | "entitled" | "public";
77
+ readonly family: "article" | "material" | "page" | "question";
78
+ readonly operation: "upsert";
79
+ readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
80
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
81
+ } | {
82
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
83
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
84
+ readonly family: "article" | "material" | "page" | "question";
85
+ readonly operation: "delete";
86
+ };
87
+ readonly index: number;
88
+ readonly releaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
89
+ }, E | ReleaseItemDecodeError | ReleaseItemIndexMismatchError | ReleaseItemOrderError | ReleaseItemReleaseMismatchError | ReleaseItemScopeError, R>;
90
+ /** Authenticates a replayable ordered stream against its signed manifest. */
91
+ export declare const verifyContentReleaseItems: <E, R>(input: {
92
+ readonly items: Stream.Stream<unknown, E, R>;
93
+ readonly manifest: ContentReleaseManifest;
94
+ }) => Effect.Effect<{
95
+ deleteCount: number;
96
+ upsertCount: number;
97
+ }, E | ReleaseItemCountMismatchError | ReleaseItemDecodeError | ReleaseItemIndexMismatchError | ReleaseItemOperationCountMismatchError | ReleaseItemOrderError | ReleaseItemReleaseMismatchError | ReleaseItemScopeError | ReleaseItemsDigestMismatchError | import("#contracts/release/digest").ReleaseItemsHashComputationError, R>;
98
+ export {};
@@ -0,0 +1,114 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { compareContentHeads } from "#contracts/content";
3
+ import { ReleaseIdSchema, Sha256HashSchema } from "#contracts/ids";
4
+ import { digestItems } from "#contracts/release/digest";
5
+ import { publicationScopeSelectsContent } from "#contracts/release/snapshot/scope";
6
+ import { ContentReleaseItemSchema, } from "#contracts/release/spec";
7
+ const ItemCountSchema = Schema.Finite.pipe(Schema.check(Schema.isInt()), Schema.check(Schema.isGreaterThanOrEqualTo(0)));
8
+ /** One release item failed strict wire decoding. */
9
+ export class ReleaseItemDecodeError extends Schema.TaggedError()("ReleaseItemDecodeError", { itemOffset: ItemCountSchema }) {
10
+ }
11
+ /** The separate item stream does not have the signed manifest length. */
12
+ export class ReleaseItemCountMismatchError extends Schema.TaggedError()("ReleaseItemCountMismatchError", { actualCount: ItemCountSchema, expectedCount: ItemCountSchema }) {
13
+ }
14
+ /** Upsert and delete totals do not match the counts signed by the manifest. */
15
+ export class ReleaseItemOperationCountMismatchError extends Schema.TaggedError()("ReleaseItemOperationCountMismatchError", {
16
+ actualDeletes: ItemCountSchema,
17
+ actualUpserts: ItemCountSchema,
18
+ expectedDeletes: ItemCountSchema,
19
+ expectedUpserts: ItemCountSchema,
20
+ }) {
21
+ }
22
+ /** An item belongs to another release envelope. */
23
+ export class ReleaseItemReleaseMismatchError extends Schema.TaggedError()("ReleaseItemReleaseMismatchError", { itemOffset: ItemCountSchema, releaseId: ReleaseIdSchema }) {
24
+ }
25
+ /** An item is missing, duplicated, or out of its signed sequence. */
26
+ export class ReleaseItemIndexMismatchError extends Schema.TaggedError()("ReleaseItemIndexMismatchError", { actualIndex: ItemCountSchema, expectedIndex: ItemCountSchema }) {
27
+ }
28
+ /** Item heads are duplicated or not in canonical content-head order. */
29
+ export class ReleaseItemOrderError extends Schema.TaggedError()("ReleaseItemOrderError", { itemOffset: ItemCountSchema }) {
30
+ }
31
+ /** One signed item falls outside the release's exact publication scope. */
32
+ export class ReleaseItemScopeError extends Schema.TaggedError()("ReleaseItemScopeError", { itemOffset: ItemCountSchema }) {
33
+ }
34
+ /** The separate ordered items do not match the signed digest. */
35
+ export class ReleaseItemsDigestMismatchError extends Schema.TaggedError()("ReleaseItemsDigestMismatchError", {
36
+ actualDigest: Sha256HashSchema,
37
+ expectedDigest: Sha256HashSchema,
38
+ releaseId: ReleaseIdSchema,
39
+ }) {
40
+ }
41
+ /** Verifies one item's signed release identity and sequence position. */
42
+ function validateItemIdentity(manifest, item, expectedIndex) {
43
+ if (item.releaseId !== manifest.releaseId) {
44
+ return Effect.fail(new ReleaseItemReleaseMismatchError({
45
+ itemOffset: expectedIndex,
46
+ releaseId: manifest.releaseId,
47
+ }));
48
+ }
49
+ if (item.index !== expectedIndex) {
50
+ return Effect.fail(new ReleaseItemIndexMismatchError({
51
+ actualIndex: item.index,
52
+ expectedIndex,
53
+ }));
54
+ }
55
+ if (!publicationScopeSelectsContent(manifest.scope, item.change)) {
56
+ return Effect.fail(new ReleaseItemScopeError({ itemOffset: expectedIndex }));
57
+ }
58
+ return Effect.void;
59
+ }
60
+ /** Rejects a head that is duplicated or outside canonical head order. */
61
+ function validateItemOrder(state, item) {
62
+ if (state.previous &&
63
+ compareContentHeads(state.previous.change, item.change) >= 0) {
64
+ return Effect.fail(new ReleaseItemOrderError({ itemOffset: item.index }));
65
+ }
66
+ state.previous = item;
67
+ return Effect.void;
68
+ }
69
+ /** Decodes one item and applies stateful canonical stream invariants. */
70
+ const decodeItem = Effect.fn("AksaraContracts.decodeReleaseItem")(function* (manifest, state, source, itemOffset) {
71
+ const item = yield* Schema.decodeUnknownEffect(ContentReleaseItemSchema)(source, { onExcessProperty: "error" }).pipe(Effect.mapError(() => new ReleaseItemDecodeError({ itemOffset })));
72
+ yield* validateItemIdentity(manifest, item, itemOffset);
73
+ yield* validateItemOrder(state, item);
74
+ return item;
75
+ });
76
+ /**
77
+ * Strictly decodes a replayable item stream without retaining its bodies.
78
+ * Every evaluation owns fresh ordering and route-collision state.
79
+ */
80
+ export function decodeContentReleaseItems(input) {
81
+ return Stream.unwrap(Effect.sync(() => {
82
+ const state = { previous: undefined };
83
+ return input.items.pipe(Stream.zipWithIndex, Stream.mapEffect(([source, itemOffset]) => decodeItem(input.manifest, state, source, itemOffset)));
84
+ }));
85
+ }
86
+ /** Authenticates a replayable ordered stream against its signed manifest. */
87
+ export const verifyContentReleaseItems = Effect.fn("AksaraContracts.verifyContentReleaseItems")(function* (input) {
88
+ const summary = yield* digestItems(input.manifest.releaseId, decodeContentReleaseItems(input));
89
+ if (summary.count !== input.manifest.itemCount) {
90
+ return yield* new ReleaseItemCountMismatchError({
91
+ actualCount: summary.count,
92
+ expectedCount: input.manifest.itemCount,
93
+ });
94
+ }
95
+ if (summary.deleteCount !== input.manifest.deleteCount) {
96
+ return yield* new ReleaseItemOperationCountMismatchError({
97
+ actualDeletes: summary.deleteCount,
98
+ actualUpserts: summary.upsertCount,
99
+ expectedDeletes: input.manifest.deleteCount,
100
+ expectedUpserts: input.manifest.upsertCount,
101
+ });
102
+ }
103
+ if (summary.digest !== input.manifest.itemsDigest) {
104
+ return yield* new ReleaseItemsDigestMismatchError({
105
+ actualDigest: summary.digest,
106
+ expectedDigest: input.manifest.itemsDigest,
107
+ releaseId: input.manifest.releaseId,
108
+ });
109
+ }
110
+ return {
111
+ deleteCount: summary.deleteCount,
112
+ upsertCount: summary.upsertCount,
113
+ };
114
+ });
@@ -0,0 +1,297 @@
1
+ import { Schema } from "effect";
2
+ import { type RollbackSignedContentRelease } from "#contracts/release/spec";
3
+ /** Maximum rows the backend may delete in one cleanup transaction. */
4
+ export declare const MAX_CLEANUP_PAGE_COUNT = 100;
5
+ /** Exact immutable release identity requested from durable target state. */
6
+ export declare const ContentReleaseStatusRequestSchema: Schema.Struct<{
7
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
8
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
9
+ }>;
10
+ export type ContentReleaseStatusRequest = typeof ContentReleaseStatusRequestSchema.Type;
11
+ /** Frozen renderer and signed release required for exact crash recovery. */
12
+ export declare const ContentReleaseBundleSchema: Schema.Struct<{
13
+ readonly release: Schema.Struct<{
14
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
15
+ readonly manifest: Schema.Struct<{
16
+ readonly baseActiveAppLocales: Schema.NullOr<Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>>;
17
+ readonly baseManifestHash: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
18
+ readonly baseReleaseId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">>;
19
+ readonly baseResultCount: Schema.Finite;
20
+ readonly baseResultDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
21
+ readonly deleteCount: Schema.Finite;
22
+ readonly itemCount: Schema.Finite;
23
+ readonly itemsDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
24
+ readonly origin: Schema.Union<readonly [Schema.Struct<{
25
+ readonly kind: Schema.Literal<"git">;
26
+ readonly sha: Schema.brand<Schema.String, "@NakafaAI/AksaraGitCommitSha">;
27
+ }>, Schema.Struct<{
28
+ readonly kind: Schema.Literal<"rollback">;
29
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
30
+ }>]>;
31
+ readonly projectionCount: Schema.Finite;
32
+ readonly projectionDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
33
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
34
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
35
+ readonly rendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
36
+ readonly resultCount: Schema.Finite;
37
+ readonly resultDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
38
+ readonly rollbackCount: Schema.Finite;
39
+ readonly rollbackDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
40
+ readonly routeCount: Schema.Finite;
41
+ readonly routeDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
42
+ readonly scope: Schema.Struct<{
43
+ content: Schema.optional<Schema.$Array<Schema.Struct<{
44
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
45
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
46
+ readonly family: Schema.Literals<readonly ["article", "material", "page", "question"]>;
47
+ }>>>;
48
+ families: Schema.$Array<Schema.Literals<readonly ["article", "material", "page", "question"]>>;
49
+ snapshots: Schema.$Array<Schema.Literals<readonly ["program", "quran", "tryout"]>>;
50
+ }>;
51
+ readonly snapshots: Schema.Struct<{
52
+ readonly program: Schema.Struct<{
53
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
54
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
55
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
56
+ readonly rowCount: Schema.Int;
57
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
58
+ }>;
59
+ readonly quran: Schema.Struct<{
60
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
61
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
62
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
63
+ readonly rowCount: Schema.Int;
64
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
65
+ }>;
66
+ readonly tryout: Schema.Struct<{
67
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
68
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
69
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
70
+ readonly rowCount: Schema.Int;
71
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
72
+ }>;
73
+ }>;
74
+ readonly upsertCount: Schema.Finite;
75
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
76
+ readonly format: Schema.Literal<"localized-content-release">;
77
+ }>;
78
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
79
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
80
+ }>;
81
+ readonly rendererManifest: Schema.Struct<{
82
+ readonly base: Schema.Struct<{
83
+ authoringComponents: Schema.$Array<Schema.Struct<{
84
+ readonly name: Schema.String;
85
+ readonly version: Schema.Finite;
86
+ }>>;
87
+ supportedComponents: Schema.$Array<Schema.Struct<{
88
+ readonly name: Schema.String;
89
+ readonly version: Schema.Finite;
90
+ }>>;
91
+ }>;
92
+ readonly domains: Schema.$Array<Schema.Struct<{
93
+ readonly authoringComponents: Schema.$Array<Schema.Struct<{
94
+ readonly name: Schema.String;
95
+ readonly version: Schema.Finite;
96
+ }>>;
97
+ readonly name: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
98
+ readonly supportedComponents: Schema.$Array<Schema.Struct<{
99
+ readonly name: Schema.String;
100
+ readonly version: Schema.Finite;
101
+ }>>;
102
+ }>>;
103
+ readonly format: Schema.Literal<"nakafa-mdx-renderer-v1">;
104
+ readonly hash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
105
+ readonly publishedDomains: Schema.$Array<Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>>;
106
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
107
+ }>;
108
+ }>;
109
+ export type ContentReleaseBundle = typeof ContentReleaseBundleSchema.Type;
110
+ /** Frozen renderer plus one signed rollback release at recovery boundaries. */
111
+ export type RollbackContentReleaseBundle = ContentReleaseBundle & {
112
+ readonly release: RollbackSignedContentRelease;
113
+ };
114
+ /** Exact renderer-bound bundle accepted only for recovery publication. */
115
+ export declare const RollbackContentReleaseBundleSchema: Schema.refine<RollbackContentReleaseBundle, Schema.Struct<{
116
+ readonly release: Schema.Struct<{
117
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
118
+ readonly manifest: Schema.Struct<{
119
+ readonly baseActiveAppLocales: Schema.NullOr<Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>>;
120
+ readonly baseManifestHash: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
121
+ readonly baseReleaseId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">>;
122
+ readonly baseResultCount: Schema.Finite;
123
+ readonly baseResultDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
124
+ readonly deleteCount: Schema.Finite;
125
+ readonly itemCount: Schema.Finite;
126
+ readonly itemsDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
127
+ readonly origin: Schema.Union<readonly [Schema.Struct<{
128
+ readonly kind: Schema.Literal<"git">;
129
+ readonly sha: Schema.brand<Schema.String, "@NakafaAI/AksaraGitCommitSha">;
130
+ }>, Schema.Struct<{
131
+ readonly kind: Schema.Literal<"rollback">;
132
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
133
+ }>]>;
134
+ readonly projectionCount: Schema.Finite;
135
+ readonly projectionDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
136
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
137
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
138
+ readonly rendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
139
+ readonly resultCount: Schema.Finite;
140
+ readonly resultDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
141
+ readonly rollbackCount: Schema.Finite;
142
+ readonly rollbackDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
143
+ readonly routeCount: Schema.Finite;
144
+ readonly routeDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
145
+ readonly scope: Schema.Struct<{
146
+ content: Schema.optional<Schema.$Array<Schema.Struct<{
147
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
148
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
149
+ readonly family: Schema.Literals<readonly ["article", "material", "page", "question"]>;
150
+ }>>>;
151
+ families: Schema.$Array<Schema.Literals<readonly ["article", "material", "page", "question"]>>;
152
+ snapshots: Schema.$Array<Schema.Literals<readonly ["program", "quran", "tryout"]>>;
153
+ }>;
154
+ readonly snapshots: Schema.Struct<{
155
+ readonly program: Schema.Struct<{
156
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
157
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
158
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
159
+ readonly rowCount: Schema.Int;
160
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
161
+ }>;
162
+ readonly quran: Schema.Struct<{
163
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
164
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
165
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
166
+ readonly rowCount: Schema.Int;
167
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
168
+ }>;
169
+ readonly tryout: Schema.Struct<{
170
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
171
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
172
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
173
+ readonly rowCount: Schema.Int;
174
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
175
+ }>;
176
+ }>;
177
+ readonly upsertCount: Schema.Finite;
178
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
179
+ readonly format: Schema.Literal<"localized-content-release">;
180
+ }>;
181
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
182
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
183
+ }>;
184
+ readonly rendererManifest: Schema.Struct<{
185
+ readonly base: Schema.Struct<{
186
+ authoringComponents: Schema.$Array<Schema.Struct<{
187
+ readonly name: Schema.String;
188
+ readonly version: Schema.Finite;
189
+ }>>;
190
+ supportedComponents: Schema.$Array<Schema.Struct<{
191
+ readonly name: Schema.String;
192
+ readonly version: Schema.Finite;
193
+ }>>;
194
+ }>;
195
+ readonly domains: Schema.$Array<Schema.Struct<{
196
+ readonly authoringComponents: Schema.$Array<Schema.Struct<{
197
+ readonly name: Schema.String;
198
+ readonly version: Schema.Finite;
199
+ }>>;
200
+ readonly name: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
201
+ readonly supportedComponents: Schema.$Array<Schema.Struct<{
202
+ readonly name: Schema.String;
203
+ readonly version: Schema.Finite;
204
+ }>>;
205
+ }>>;
206
+ readonly format: Schema.Literal<"nakafa-mdx-renderer-v1">;
207
+ readonly hash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
208
+ readonly publishedDomains: Schema.$Array<Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>>;
209
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
210
+ }>;
211
+ }>>;
212
+ /** Persisted release phase bound to one exact signed manifest identity. */
213
+ export declare const ContentReleaseStatusSchema: Schema.Union<readonly [Schema.Struct<{
214
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
215
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
216
+ readonly phase: Schema.Literal<"missing">;
217
+ }>, Schema.Struct<{
218
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
219
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
220
+ readonly phase: Schema.Literals<readonly ["staging", "verifying", "verified", "aborting", "aborted"]>;
221
+ }>, Schema.Struct<{
222
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
223
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
224
+ readonly phase: Schema.Literal<"completed">;
225
+ readonly receipt: Schema.Struct<{
226
+ readonly activatedHeads: Schema.Finite;
227
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
228
+ readonly deletedHeads: Schema.Finite;
229
+ readonly manifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
230
+ readonly projectionDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
231
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
232
+ readonly resultCount: Schema.Finite;
233
+ readonly resultDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
234
+ readonly routeDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
235
+ readonly snapshots: Schema.Struct<{
236
+ readonly program: Schema.Struct<{
237
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
238
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
239
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
240
+ readonly rowCount: Schema.Int;
241
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
242
+ }>;
243
+ readonly quran: Schema.Struct<{
244
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
245
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
246
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
247
+ readonly rowCount: Schema.Int;
248
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
249
+ }>;
250
+ readonly tryout: Schema.Struct<{
251
+ readonly baseSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
252
+ readonly mode: Schema.Literals<readonly ["inherit", "replace", "restore"]>;
253
+ readonly resultSnapshotId: Schema.NullOr<Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">>;
254
+ readonly rowCount: Schema.Int;
255
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
256
+ }>;
257
+ }>;
258
+ readonly stagedArtifacts: Schema.Finite;
259
+ readonly stagedItems: Schema.Finite;
260
+ readonly stagedProjections: Schema.Finite;
261
+ readonly stagedRoutes: Schema.Finite;
262
+ readonly stagedSnapshotRows: Schema.Finite;
263
+ }>;
264
+ }>]>;
265
+ export type ContentReleaseStatus = typeof ContentReleaseStatusSchema.Type;
266
+ /** One invisible staged release whose rows should be abandoned. */
267
+ export declare const ReleaseAbortRequestSchema: Schema.Struct<{
268
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
269
+ }>;
270
+ export type ReleaseAbortRequest = typeof ReleaseAbortRequestSchema.Type;
271
+ /** Identifies the active release and retained inverse accepted by an operator. */
272
+ export declare const ReleaseAcceptRequestSchema: Schema.Struct<{
273
+ readonly recoveryId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
274
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
275
+ }>;
276
+ export type ReleaseAcceptRequest = typeof ReleaseAcceptRequestSchema.Type;
277
+ /** Durable cumulative evidence from one server-owned abort page. */
278
+ export declare const ReleaseAbortReceiptSchema: Schema.Struct<{
279
+ readonly complete: Schema.Boolean;
280
+ readonly processedItems: Schema.Finite;
281
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
282
+ readonly totalItems: Schema.Finite;
283
+ }>;
284
+ export type ReleaseAbortReceipt = typeof ReleaseAbortReceiptSchema.Type;
285
+ /** One release whose unreachable rows should advance through server-owned state. */
286
+ export declare const ReleaseCleanupRequestSchema: Schema.Struct<{
287
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
288
+ }>;
289
+ export type ReleaseCleanupRequest = typeof ReleaseCleanupRequestSchema.Type;
290
+ /** Durable cumulative evidence returned after server-owned cleanup progress. */
291
+ export declare const ReleaseCleanupReceiptSchema: Schema.Struct<{
292
+ readonly complete: Schema.Boolean;
293
+ readonly deletedArtifacts: Schema.Finite;
294
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
295
+ readonly retryAt: Schema.optional<Schema.Finite>;
296
+ }>;
297
+ export type ReleaseCleanupReceipt = typeof ReleaseCleanupReceiptSchema.Type;