@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,475 @@
1
+ /** Structured snapshot manifest and row wire contracts. */
2
+ import { Schema } from "effect";
3
+ /** Complete structured snapshot manifest vocabulary staged before its rows. */
4
+ export declare const ContentSnapshotManifestSchema: Schema.Union<readonly [Schema.Struct<{
5
+ readonly family: Schema.Literal<"program">;
6
+ readonly manifest: Schema.Struct<{
7
+ readonly curriculumRowCount: Schema.Int;
8
+ readonly programRowCount: Schema.Int;
9
+ readonly rowCount: Schema.Int;
10
+ readonly sitemapCount: Schema.Int;
11
+ readonly slugCount: Schema.Int;
12
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
13
+ readonly rowDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
14
+ readonly format: Schema.Literal<"localized-program-snapshot">;
15
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
16
+ }>;
17
+ }>, Schema.Struct<{
18
+ readonly family: Schema.Literal<"quran">;
19
+ readonly manifest: Schema.Struct<{
20
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
21
+ readonly attributionCount: Schema.Int;
22
+ readonly chunkCount: Schema.Int;
23
+ readonly projectionCount: Schema.Int;
24
+ readonly projectionDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
25
+ readonly provenanceDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
26
+ readonly provenanceStatus: Schema.Literals<readonly ["approved", "blocked"]>;
27
+ readonly runtimeCount: Schema.Int;
28
+ readonly runtimeDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
29
+ readonly searchCount: Schema.Int;
30
+ readonly searchDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
31
+ readonly sourceBytes: Schema.Int;
32
+ readonly sourceDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
33
+ readonly sourceFileCount: Schema.Int;
34
+ readonly surahCount: Schema.Int;
35
+ readonly tafsirLocales: Schema.$Array<Schema.Literal<"id">>;
36
+ readonly verseCount: Schema.Int;
37
+ readonly format: Schema.Literal<"localized-quran-snapshot">;
38
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
39
+ }>;
40
+ }>, Schema.Struct<{
41
+ readonly family: Schema.Literal<"tryout">;
42
+ readonly manifest: Schema.Struct<{
43
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
44
+ readonly catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
45
+ readonly counts: Schema.Struct<{
46
+ readonly country: Schema.Int;
47
+ readonly exam: Schema.Int;
48
+ readonly section: Schema.Int;
49
+ readonly set: Schema.Int;
50
+ readonly track: Schema.Int;
51
+ }>;
52
+ readonly placementCount: Schema.Int;
53
+ readonly placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
54
+ readonly routeCount: Schema.Int;
55
+ readonly format: Schema.Literal<"localized-tryout-snapshot">;
56
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
57
+ }>;
58
+ }>]>;
59
+ export type ContentSnapshotManifest = typeof ContentSnapshotManifestSchema.Type;
60
+ /** Complete current structured row vocabulary accepted by publication. */
61
+ export declare const ContentSnapshotRowSchema: Schema.Union<readonly [Schema.Struct<{
62
+ readonly family: Schema.Literal<"program">;
63
+ readonly record: Schema.Union<readonly [Schema.Struct<{
64
+ readonly kind: Schema.Literal<"program">;
65
+ readonly row: Schema.Struct<{
66
+ readonly defaultCoverageStatus: Schema.Literals<readonly ["archived", "available", "hidden", "partial", "planned"]>;
67
+ readonly displayOrder: Schema.Int;
68
+ readonly iconKey: Schema.Literals<readonly ["advanced", "assessment", "certificate", "course", "diploma", "early-years", "global-education", "grade-1", "grade-10", "grade-11", "grade-12", "grade-2", "grade-3", "grade-4", "grade-5", "grade-6", "grade-7", "grade-8", "grade-9", "high-school", "mathematics", "middle-school", "primary-school", "science", "school", "standards", "state"]>;
69
+ readonly key: Schema.brand<Schema.String, "@NakafaAI/AksaraLearningProgramKey">;
70
+ readonly kind: Schema.Literals<readonly ["admission-exam", "assessment", "custom-program", "institution-program", "school-curriculum"]>;
71
+ readonly navigation: Schema.Struct<{
72
+ readonly levels: Schema.NonEmptyArray<Schema.Literals<readonly ["class", "course", "domain", "lesson", "phase", "section", "set", "stage", "subject", "topic", "track", "unit"]>>;
73
+ readonly model: Schema.Literals<readonly ["course-unit-lesson", "curriculum-tree", "exam-domain-set", "track-topic"]>;
74
+ }>;
75
+ readonly provider: Schema.Struct<{
76
+ readonly homeCountry: Schema.optional<Schema.String>;
77
+ readonly kind: Schema.Literals<readonly ["institution", "learner", "nakafa", "official"]>;
78
+ readonly name: Schema.Trimmed;
79
+ }>;
80
+ readonly recommendedCountry: Schema.optional<Schema.String>;
81
+ readonly sources: Schema.NonEmptyArray<Schema.Struct<{
82
+ readonly label: Schema.Trimmed;
83
+ readonly retrievedAt: Schema.String;
84
+ readonly reviewAfter: Schema.optional<Schema.String>;
85
+ readonly type: Schema.Literals<readonly ["institution-document", "nakafa-editorial", "official-blueprint", "official-policy", "official-portal"]>;
86
+ readonly url: Schema.String;
87
+ }>>;
88
+ readonly translations: Schema.NonEmptyArray<Schema.Struct<{
89
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
90
+ readonly publicSlug: Schema.String;
91
+ readonly title: Schema.Trimmed;
92
+ }>>;
93
+ readonly version: Schema.Struct<{
94
+ readonly endsAt: Schema.optional<Schema.String>;
95
+ readonly label: Schema.Trimmed;
96
+ readonly startsAt: Schema.optional<Schema.String>;
97
+ }>;
98
+ }>;
99
+ readonly rowHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
100
+ }>, Schema.Struct<{
101
+ readonly kind: Schema.Literal<"curriculum">;
102
+ readonly row: Schema.Struct<{
103
+ appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
104
+ canonicalPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
105
+ displayGroupIconKey: Schema.optional<Schema.Literals<readonly ["advanced", "assessment", "certificate", "course", "diploma", "early-years", "global-education", "grade-1", "grade-10", "grade-11", "grade-12", "grade-2", "grade-3", "grade-4", "grade-5", "grade-6", "grade-7", "grade-8", "grade-9", "high-school", "mathematics", "middle-school", "primary-school", "science", "school", "standards", "state"]>>;
106
+ displayGroupTitle: Schema.optional<Schema.String>;
107
+ iconKey: Schema.Literals<readonly ["advanced", "assessment", "certificate", "course", "diploma", "early-years", "global-education", "grade-1", "grade-10", "grade-11", "grade-12", "grade-2", "grade-3", "grade-4", "grade-5", "grade-6", "grade-7", "grade-8", "grade-9", "high-school", "mathematics", "middle-school", "primary-school", "science", "school", "standards", "state"]>;
108
+ kind: Schema.Literal<"curriculum-context">;
109
+ level: Schema.Literals<readonly ["class", "course", "domain", "lesson", "phase", "section", "set", "stage", "subject", "topic", "track", "unit"]>;
110
+ materialCardDescription: Schema.optional<Schema.String>;
111
+ materialCardTitle: Schema.optional<Schema.String>;
112
+ materialContextNodeKey: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraCurriculumNodeKey">>;
113
+ materialContextParentPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
114
+ materialContextPublicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
115
+ materialDomain: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraMaterialDomain">>;
116
+ materialKey: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraMaterialKey">>;
117
+ nodeKey: Schema.String;
118
+ order: Schema.Int;
119
+ parentPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
120
+ programKey: Schema.brand<Schema.String, "@NakafaAI/AksaraLearningProgramKey">;
121
+ publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
122
+ sitemap: Schema.Boolean;
123
+ sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
124
+ title: Schema.String;
125
+ }>;
126
+ readonly rowHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
127
+ }>]>;
128
+ }>, Schema.Struct<{
129
+ readonly family: Schema.Literal<"quran">;
130
+ readonly record: Schema.Struct<{
131
+ readonly payload: Schema.Union<readonly [Schema.Struct<{
132
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
133
+ readonly kind: Schema.Literal<"quran-attribution">;
134
+ readonly sources: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
135
+ readonly copy: Schema.NonEmptyArray<Schema.Struct<{
136
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
137
+ readonly notice: Schema.Trimmed;
138
+ readonly title: Schema.Trimmed;
139
+ }>>;
140
+ readonly publisher: Schema.Trimmed;
141
+ readonly retrievedAt: Schema.String;
142
+ readonly sourceUrl: Schema.String;
143
+ readonly updateUrl: Schema.String;
144
+ readonly version: Schema.Trimmed;
145
+ readonly artifact: Schema.Struct<{
146
+ readonly byteCount: Schema.Int;
147
+ readonly digest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
148
+ readonly fileCount: Schema.Int;
149
+ }>;
150
+ readonly id: Schema.Literals<readonly ["tanzil-text", "tanzil-metadata", "kemenag-names", "bubenheim-names", "quranenc-english", "quranenc-indonesian", "quranenc-german", "quranenc-tafsir"]>;
151
+ readonly kind: Schema.Literal<"embedded">;
152
+ readonly terms: Schema.Struct<{
153
+ readonly artifact: Schema.Struct<{
154
+ readonly byteCount: Schema.Int;
155
+ readonly digest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
156
+ readonly fileCount: Schema.Int;
157
+ }>;
158
+ readonly url: Schema.String;
159
+ }>;
160
+ }>, Schema.Struct<{
161
+ readonly copy: Schema.NonEmptyArray<Schema.Struct<{
162
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
163
+ readonly notice: Schema.Trimmed;
164
+ readonly title: Schema.Trimmed;
165
+ }>>;
166
+ readonly publisher: Schema.Trimmed;
167
+ readonly retrievedAt: Schema.String;
168
+ readonly sourceUrl: Schema.String;
169
+ readonly updateUrl: Schema.String;
170
+ readonly version: Schema.Trimmed;
171
+ readonly id: Schema.Literals<readonly ["mokhtasar-english", "mokhtasar-german"]>;
172
+ readonly kind: Schema.Literal<"external">;
173
+ readonly terms: Schema.Struct<{
174
+ readonly access: Schema.Literal<"link-only">;
175
+ readonly url: Schema.String;
176
+ }>;
177
+ }>]>>;
178
+ readonly tafsirAccess: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
179
+ readonly appLocale: Schema.brand<Schema.Literal<"en">, "@NakafaAI/AksaraAppLocale">;
180
+ readonly kind: Schema.Literal<"external">;
181
+ readonly notice: Schema.Trimmed;
182
+ readonly sourceId: Schema.Literal<"mokhtasar-english">;
183
+ }>, Schema.Struct<{
184
+ readonly appLocale: Schema.brand<Schema.Literal<"id">, "@NakafaAI/AksaraAppLocale">;
185
+ readonly kind: Schema.Literal<"embedded">;
186
+ readonly notice: Schema.Trimmed;
187
+ readonly sourceId: Schema.Literal<"quranenc-tafsir">;
188
+ }>, Schema.Struct<{
189
+ readonly appLocale: Schema.brand<Schema.Literal<"de">, "@NakafaAI/AksaraAppLocale">;
190
+ readonly kind: Schema.Literal<"external">;
191
+ readonly notice: Schema.Trimmed;
192
+ readonly sourceId: Schema.Literal<"mokhtasar-german">;
193
+ }>]>>;
194
+ }>, Schema.Struct<{
195
+ readonly name: Schema.Struct<{
196
+ readonly arabic: Schema.String;
197
+ readonly meaning: Schema.$Record<Schema.Literals<readonly ["en", "id", "de"]>, Schema.String>;
198
+ readonly transliteration: Schema.String;
199
+ }>;
200
+ readonly number: Schema.Int;
201
+ readonly numberOfVerses: Schema.Int;
202
+ readonly revelation: Schema.Struct<{
203
+ readonly order: Schema.Int;
204
+ readonly place: Schema.Literals<readonly ["Meccan", "Medinan"]>;
205
+ }>;
206
+ readonly kind: Schema.Literal<"quran-surah">;
207
+ }>, Schema.Struct<{
208
+ readonly firstQuranNumber: Schema.Int;
209
+ readonly firstVerse: Schema.Int;
210
+ readonly kind: Schema.Literal<"quran-chunk">;
211
+ readonly lastVerse: Schema.Int;
212
+ readonly surahNumber: Schema.Int;
213
+ readonly verses: Schema.NonEmptyArray<Schema.Struct<{
214
+ readonly meta: Schema.Struct<{
215
+ readonly hizbQuarter: Schema.Int;
216
+ readonly juz: Schema.Int;
217
+ readonly manzil: Schema.Int;
218
+ readonly page: Schema.Int;
219
+ readonly ruku: Schema.Int;
220
+ readonly sajda: Schema.NullOr<Schema.Literals<readonly ["obligatory", "recommended"]>>;
221
+ }>;
222
+ readonly number: Schema.Struct<{
223
+ readonly inQuran: Schema.Int;
224
+ readonly inSurah: Schema.Int;
225
+ }>;
226
+ readonly tafsir: Schema.$Array<Schema.Struct<{
227
+ readonly appLocale: Schema.Literal<"id">;
228
+ readonly footnotes: Schema.NullOr<Schema.String>;
229
+ readonly text: Schema.String;
230
+ }>>;
231
+ readonly text: Schema.Struct<{
232
+ readonly arabic: Schema.String;
233
+ }>;
234
+ readonly translations: Schema.NonEmptyArray<Schema.Struct<{
235
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
236
+ readonly value: Schema.Struct<{
237
+ readonly footnotes: Schema.String;
238
+ readonly text: Schema.String;
239
+ }>;
240
+ }>>;
241
+ }>>;
242
+ }>, Schema.Struct<{
243
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
244
+ readonly graph: Schema.Struct<{
245
+ readonly alignmentId: Schema.String;
246
+ readonly assetId: Schema.String;
247
+ readonly conceptId: Schema.String;
248
+ readonly learningObjectId: Schema.String;
249
+ readonly lensId: Schema.String;
250
+ }>;
251
+ readonly kind: Schema.Literal<"quran-search">;
252
+ readonly route: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
253
+ readonly surahNumber: Schema.Int;
254
+ readonly text: Schema.String;
255
+ readonly title: Schema.String;
256
+ }>]>;
257
+ readonly rowHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
258
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
259
+ }>;
260
+ }>, Schema.Struct<{
261
+ readonly family: Schema.Literal<"tryout">;
262
+ readonly record: Schema.Struct<{
263
+ readonly row: Schema.Union<readonly [Schema.Struct<{
264
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
265
+ readonly description: Schema.optional<Schema.String>;
266
+ readonly graph: Schema.Struct<{
267
+ readonly alignmentId: Schema.String;
268
+ readonly assetId: Schema.String;
269
+ readonly conceptId: Schema.String;
270
+ readonly learningObjectId: Schema.String;
271
+ readonly lensId: Schema.String;
272
+ }>;
273
+ readonly sourceRevision: Schema.Trimmed;
274
+ readonly title: Schema.String;
275
+ readonly countryCode: Schema.String;
276
+ readonly countryKey: Schema.String;
277
+ readonly kind: Schema.Literal<"country">;
278
+ readonly order: Schema.Finite;
279
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
280
+ }>, Schema.Struct<{
281
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
282
+ readonly description: Schema.optional<Schema.String>;
283
+ readonly graph: Schema.Struct<{
284
+ readonly alignmentId: Schema.String;
285
+ readonly assetId: Schema.String;
286
+ readonly conceptId: Schema.String;
287
+ readonly learningObjectId: Schema.String;
288
+ readonly lensId: Schema.String;
289
+ }>;
290
+ readonly sourceRevision: Schema.Trimmed;
291
+ readonly title: Schema.String;
292
+ readonly countryKey: Schema.String;
293
+ readonly examKey: Schema.String;
294
+ readonly kind: Schema.Literal<"exam">;
295
+ readonly order: Schema.Finite;
296
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
297
+ readonly scoringStrategy: Schema.Literals<readonly ["irt", "raw"]>;
298
+ }>, Schema.Struct<{
299
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
300
+ readonly description: Schema.optional<Schema.String>;
301
+ readonly graph: Schema.Struct<{
302
+ readonly alignmentId: Schema.String;
303
+ readonly assetId: Schema.String;
304
+ readonly conceptId: Schema.String;
305
+ readonly learningObjectId: Schema.String;
306
+ readonly lensId: Schema.String;
307
+ }>;
308
+ readonly sourceRevision: Schema.Trimmed;
309
+ readonly title: Schema.String;
310
+ readonly countryKey: Schema.String;
311
+ readonly examKey: Schema.String;
312
+ readonly kind: Schema.Literal<"track">;
313
+ readonly order: Schema.Finite;
314
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
315
+ readonly questionCount: Schema.Finite;
316
+ readonly sectionCount: Schema.Finite;
317
+ readonly setCount: Schema.Finite;
318
+ readonly trackKey: Schema.String;
319
+ readonly trackKind: Schema.Literals<readonly ["subject", "year"]>;
320
+ readonly visibleSectionCount: Schema.Finite;
321
+ }>, Schema.Struct<{
322
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
323
+ readonly description: Schema.optional<Schema.String>;
324
+ readonly graph: Schema.Struct<{
325
+ readonly alignmentId: Schema.String;
326
+ readonly assetId: Schema.String;
327
+ readonly conceptId: Schema.String;
328
+ readonly learningObjectId: Schema.String;
329
+ readonly lensId: Schema.String;
330
+ }>;
331
+ readonly sourceRevision: Schema.Trimmed;
332
+ readonly title: Schema.String;
333
+ readonly countryKey: Schema.String;
334
+ readonly examKey: Schema.String;
335
+ readonly internalEntrySectionKey: Schema.optional<Schema.String>;
336
+ readonly kind: Schema.Literal<"set">;
337
+ readonly order: Schema.Finite;
338
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
339
+ readonly questionCount: Schema.Finite;
340
+ readonly scoringStrategy: Schema.Literals<readonly ["irt", "raw"]>;
341
+ readonly sectionCount: Schema.Finite;
342
+ readonly setKey: Schema.String;
343
+ readonly trackKey: Schema.String;
344
+ readonly visibleSectionCount: Schema.Finite;
345
+ }>, Schema.Struct<{
346
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
347
+ readonly description: Schema.optional<Schema.String>;
348
+ readonly graph: Schema.Struct<{
349
+ readonly alignmentId: Schema.String;
350
+ readonly assetId: Schema.String;
351
+ readonly conceptId: Schema.String;
352
+ readonly learningObjectId: Schema.String;
353
+ readonly lensId: Schema.String;
354
+ }>;
355
+ readonly sourceRevision: Schema.Trimmed;
356
+ readonly title: Schema.String;
357
+ readonly countryKey: Schema.String;
358
+ readonly examKey: Schema.String;
359
+ readonly kind: Schema.Literal<"section">;
360
+ readonly order: Schema.Finite;
361
+ readonly publicPath: Schema.optional<Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">>;
362
+ readonly questionCount: Schema.Finite;
363
+ readonly questionSourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
364
+ readonly sectionKey: Schema.String;
365
+ readonly setKey: Schema.String;
366
+ readonly timeLimitSeconds: Schema.Finite;
367
+ readonly trackKey: Schema.String;
368
+ readonly visibility: Schema.Literals<readonly ["internal-entry", "visible"]>;
369
+ }>]>;
370
+ readonly rowHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
371
+ }>;
372
+ readonly rowKind: Schema.Literal<"catalog">;
373
+ }>, Schema.Struct<{
374
+ readonly family: Schema.Literal<"tryout">;
375
+ readonly record: Schema.Struct<{
376
+ readonly row: Schema.Struct<{
377
+ readonly answerArtifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
378
+ readonly answerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
379
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
380
+ readonly blueprint: Schema.optionalKey<Schema.Struct<{
381
+ readonly cognitiveLevel: Schema.String;
382
+ readonly contentDomain: Schema.String;
383
+ readonly topic: Schema.String;
384
+ }>>;
385
+ readonly countryKey: Schema.String;
386
+ readonly deliveryLanguage: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraDeliveryLanguage">;
387
+ readonly examKey: Schema.String;
388
+ readonly languagePolicy: Schema.Union<readonly [Schema.Struct<{
389
+ readonly kind: Schema.Literal<"app-locale">;
390
+ }>, Schema.Struct<{
391
+ readonly kind: Schema.Literal<"fixed">;
392
+ readonly language: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraDeliveryLanguage">;
393
+ }>]>;
394
+ readonly questionArtifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
395
+ readonly questionContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
396
+ readonly questionOrder: Schema.Finite;
397
+ readonly questionSourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
398
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
399
+ readonly response: Schema.Union<readonly [Schema.Struct<{
400
+ readonly categories: Schema.$Array<Schema.Struct<{
401
+ readonly categoryKey: Schema.String;
402
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
403
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
404
+ readonly kind: Schema.Literal<"math">;
405
+ readonly math: Schema.String;
406
+ }>, Schema.Struct<{
407
+ readonly kind: Schema.Literal<"text">;
408
+ readonly text: Schema.String;
409
+ }>]>>;
410
+ readonly order: Schema.Int;
411
+ }>>;
412
+ readonly kind: Schema.Literal<"category">;
413
+ readonly statements: Schema.$Array<Schema.Struct<{
414
+ readonly correctCategoryKey: Schema.String;
415
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
416
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
417
+ readonly kind: Schema.Literal<"math">;
418
+ readonly math: Schema.String;
419
+ }>, Schema.Struct<{
420
+ readonly kind: Schema.Literal<"text">;
421
+ readonly text: Schema.String;
422
+ }>]>>;
423
+ readonly order: Schema.Int;
424
+ readonly statementKey: Schema.String;
425
+ }>>;
426
+ }>, Schema.Struct<{
427
+ readonly kind: Schema.Literal<"multiple-choice">;
428
+ readonly options: Schema.$Array<Schema.Struct<{
429
+ readonly isCorrect: Schema.Boolean;
430
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
431
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
432
+ readonly kind: Schema.Literal<"math">;
433
+ readonly math: Schema.String;
434
+ }>, Schema.Struct<{
435
+ readonly kind: Schema.Literal<"text">;
436
+ readonly text: Schema.String;
437
+ }>]>>;
438
+ readonly optionKey: Schema.String;
439
+ readonly order: Schema.Int;
440
+ }>>;
441
+ }>, Schema.Struct<{
442
+ readonly kind: Schema.Literal<"single-choice">;
443
+ readonly options: Schema.$Array<Schema.Struct<{
444
+ readonly isCorrect: Schema.Boolean;
445
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
446
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
447
+ readonly kind: Schema.Literal<"math">;
448
+ readonly math: Schema.String;
449
+ }>, Schema.Struct<{
450
+ readonly kind: Schema.Literal<"text">;
451
+ readonly text: Schema.String;
452
+ }>]>>;
453
+ readonly optionKey: Schema.String;
454
+ readonly order: Schema.Int;
455
+ }>>;
456
+ }>]>;
457
+ readonly scope: Schema.Literal<"server">;
458
+ readonly sectionKey: Schema.String;
459
+ readonly setKey: Schema.String;
460
+ readonly sourceRevision: Schema.Trimmed;
461
+ readonly stimulusKey: Schema.optionalKey<Schema.String>;
462
+ readonly trackKey: Schema.String;
463
+ readonly answerArtifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
464
+ readonly contentHash: Schema.brand<Schema.String, "@NakafaAI/AksaraTryoutContentHash">;
465
+ readonly questionArtifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
466
+ }>;
467
+ readonly rowHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
468
+ }>;
469
+ readonly rowKind: Schema.Literal<"placement">;
470
+ }>]>;
471
+ export type ContentSnapshotRow = typeof ContentSnapshotRowSchema.Type;
472
+ /** Returns the immutable content-addressed identity of one family manifest. */
473
+ export declare function contentSnapshotId(snapshot: ContentSnapshotManifest): string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
474
+ /** Serializes one structured row with stable envelope field order. */
475
+ export declare function canonicalizeContentSnapshotRow(row: ContentSnapshotRow): string;
@@ -0,0 +1,74 @@
1
+ /** Structured snapshot manifest and row wire contracts. */
2
+ import { Schema } from "effect";
3
+ import { ProgramSnapshotRowSchema } from "#contracts/program/snapshot/row";
4
+ import { ProgramSnapshotSchema } from "#contracts/program/snapshot/spec";
5
+ import { QuranSnapshotRowSchema } from "#contracts/quran/snapshot/row";
6
+ import { QuranSnapshotSchema } from "#contracts/quran/snapshot/spec";
7
+ import { TryoutCatalogRecordSchema } from "#contracts/tryout/catalog";
8
+ import { TryoutPlacementRecordSchema } from "#contracts/tryout/placement";
9
+ import { TryoutSnapshotSchema } from "#contracts/tryout/snapshot/spec";
10
+ /** Program manifest selected by one globally signed content release. */
11
+ const ProgramManifestSchema = Schema.Struct({
12
+ family: Schema.Literal("program"),
13
+ manifest: ProgramSnapshotSchema,
14
+ });
15
+ /** Quran manifest selected by one globally signed content release. */
16
+ const QuranManifestSchema = Schema.Struct({
17
+ family: Schema.Literal("quran"),
18
+ manifest: QuranSnapshotSchema,
19
+ });
20
+ /** Try-out manifest selected by one globally signed content release. */
21
+ const TryoutManifestSchema = Schema.Struct({
22
+ family: Schema.Literal("tryout"),
23
+ manifest: TryoutSnapshotSchema,
24
+ });
25
+ /** Complete structured snapshot manifest vocabulary staged before its rows. */
26
+ export const ContentSnapshotManifestSchema = Schema.Union([
27
+ ProgramManifestSchema,
28
+ QuranManifestSchema,
29
+ TryoutManifestSchema,
30
+ ]);
31
+ /** One learning-program record staged under its snapshot identity. */
32
+ const ProgramRowSchema = Schema.Struct({
33
+ family: Schema.Literal("program"),
34
+ record: ProgramSnapshotRowSchema,
35
+ });
36
+ /** One Quran record already bound to its snapshot identity. */
37
+ const QuranRowSchema = Schema.Struct({
38
+ family: Schema.Literal("quran"),
39
+ record: QuranSnapshotRowSchema,
40
+ });
41
+ /** One try-out hierarchy record staged before activation. */
42
+ const TryoutCatalogRowSchema = Schema.Struct({
43
+ family: Schema.Literal("tryout"),
44
+ record: TryoutCatalogRecordSchema,
45
+ rowKind: Schema.Literal("catalog"),
46
+ });
47
+ /** One try-out placement record staged before activation. */
48
+ const TryoutPlacementRowSchema = Schema.Struct({
49
+ family: Schema.Literal("tryout"),
50
+ record: TryoutPlacementRecordSchema,
51
+ rowKind: Schema.Literal("placement"),
52
+ });
53
+ /** Complete current structured row vocabulary accepted by publication. */
54
+ export const ContentSnapshotRowSchema = Schema.Union([
55
+ ProgramRowSchema,
56
+ QuranRowSchema,
57
+ TryoutCatalogRowSchema,
58
+ TryoutPlacementRowSchema,
59
+ ]);
60
+ /** Returns the immutable content-addressed identity of one family manifest. */
61
+ export function contentSnapshotId(snapshot) {
62
+ return snapshot.manifest.snapshotId;
63
+ }
64
+ /** Serializes one structured row with stable envelope field order. */
65
+ export function canonicalizeContentSnapshotRow(row) {
66
+ if (row.family === "program" || row.family === "quran") {
67
+ return JSON.stringify({ family: row.family, record: row.record });
68
+ }
69
+ return JSON.stringify({
70
+ family: row.family,
71
+ record: row.record,
72
+ rowKind: row.rowKind,
73
+ });
74
+ }
@@ -0,0 +1,22 @@
1
+ import { Effect, Schema, type Stream } from "effect";
2
+ import type { Sha256Hash } from "#contracts/ids";
3
+ import type { ContentSnapshotRow } from "#contracts/release/snapshot/data";
4
+ declare const SnapshotEvidenceError_base: Schema.Class<SnapshotEvidenceError, Schema.TaggedStruct<"SnapshotEvidenceError", {
5
+ readonly actual: Schema.String;
6
+ readonly expected: Schema.String;
7
+ readonly family: Schema.Literals<readonly ["program", "quran", "tryout"]>;
8
+ readonly field: Schema.String;
9
+ }>, import("effect/Cause").YieldableError>;
10
+ /** Signed snapshot evidence differs from its authenticated row stream. */
11
+ export declare class SnapshotEvidenceError extends SnapshotEvidenceError_base {
12
+ }
13
+ /** Creates a fresh structured-row replay for one verification pass. */
14
+ export type SnapshotRowSource<E, R> = Stream.Stream<ContentSnapshotRow, E, R>;
15
+ /** Fails with one field-level mismatch without exposing row bodies. */
16
+ export declare function requireSnapshotEvidence(input: {
17
+ readonly actual: number | Sha256Hash;
18
+ readonly expected: number | Sha256Hash;
19
+ readonly family: "program" | "quran" | "tryout";
20
+ readonly field: string;
21
+ }): Effect.Effect<void, never, never> | Effect.Effect<never, SnapshotEvidenceError, never>;
22
+ export {};
@@ -0,0 +1,21 @@
1
+ import { Effect, Schema } from "effect";
2
+ /** Signed snapshot evidence differs from its authenticated row stream. */
3
+ export class SnapshotEvidenceError extends Schema.TaggedError()("SnapshotEvidenceError", {
4
+ actual: Schema.String,
5
+ expected: Schema.String,
6
+ family: Schema.Literals(["program", "quran", "tryout"]),
7
+ field: Schema.String,
8
+ }) {
9
+ }
10
+ /** Fails with one field-level mismatch without exposing row bodies. */
11
+ export function requireSnapshotEvidence(input) {
12
+ if (input.actual === input.expected) {
13
+ return Effect.void;
14
+ }
15
+ return Effect.fail(new SnapshotEvidenceError({
16
+ actual: String(input.actual),
17
+ expected: String(input.expected),
18
+ family: input.family,
19
+ field: input.field,
20
+ }));
21
+ }