@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,281 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import type { ContentReleaseManifest } from "#contracts/release/spec";
3
+ declare const ProjectionDecodeError_base: Schema.Class<ProjectionDecodeError, Schema.TaggedStruct<"ProjectionDecodeError", {
4
+ readonly projectionIndex: Schema.Finite;
5
+ }>, import("effect/Cause").YieldableError>;
6
+ /** One streamed projection failed strict schema decoding. */
7
+ export declare class ProjectionDecodeError extends ProjectionDecodeError_base {
8
+ }
9
+ declare const ProjectionOrderError_base: Schema.Class<ProjectionOrderError, Schema.TaggedStruct<"ProjectionOrderError", {
10
+ readonly projectionIndex: Schema.Finite;
11
+ }>, import("effect/Cause").YieldableError>;
12
+ /** Projections are duplicated or not in canonical content-head order. */
13
+ export declare class ProjectionOrderError extends ProjectionOrderError_base {
14
+ }
15
+ declare const ProjectionRouteError_base: Schema.Class<ProjectionRouteError, Schema.TaggedStruct<"ProjectionRouteError", {
16
+ readonly duplicateIndex: Schema.Finite;
17
+ readonly firstIndex: Schema.Finite;
18
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
19
+ }>, import("effect/Cause").YieldableError>;
20
+ /** Two content projections claim the same locale-specific public route. */
21
+ export declare class ProjectionRouteError extends ProjectionRouteError_base {
22
+ }
23
+ declare const ProjectionCountError_base: Schema.Class<ProjectionCountError, Schema.TaggedStruct<"ProjectionCountError", {
24
+ readonly actualCount: Schema.Finite;
25
+ readonly expectedCount: Schema.Finite;
26
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
27
+ }>, import("effect/Cause").YieldableError>;
28
+ /** The streamed projection count differs from the signed manifest. */
29
+ export declare class ProjectionCountError extends ProjectionCountError_base {
30
+ }
31
+ declare const ProjectionDigestError_base: Schema.Class<ProjectionDigestError, Schema.TaggedStruct<"ProjectionDigestError", {
32
+ readonly actualDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
33
+ readonly expectedDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
34
+ readonly releaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
35
+ }>, import("effect/Cause").YieldableError>;
36
+ /** The streamed projection digest differs from the signed manifest. */
37
+ export declare class ProjectionDigestError extends ProjectionDigestError_base {
38
+ }
39
+ /** Count authenticated without retaining complete projection bodies. */
40
+ export interface VerifiedContentProjections {
41
+ readonly count: number;
42
+ }
43
+ /** Strictly decodes a replayable canonical content projection stream. */
44
+ export declare function decodeContentProjections<E, R>(projections: Stream.Stream<unknown, E, R>): Stream.Stream<{
45
+ readonly appLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">;
46
+ readonly articleRouteSlug: string & import("effect/Brand").Brand<"@NakafaAI/AksaraArticleRouteSlug">;
47
+ readonly articleSlug: string & import("effect/Brand").Brand<"@NakafaAI/AksaraArticleSlug">;
48
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
49
+ readonly category: string & import("effect/Brand").Brand<"@NakafaAI/AksaraArticleCategory">;
50
+ readonly categoryRouteSlug: string & import("effect/Brand").Brand<"@NakafaAI/AksaraArticleRouteSlug">;
51
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
52
+ readonly graph: {
53
+ readonly alignmentId: string;
54
+ readonly assetId: string;
55
+ readonly conceptId: string;
56
+ readonly learningObjectId: string;
57
+ readonly lensId: string;
58
+ };
59
+ readonly publicPath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">;
60
+ readonly categoryTitle: string;
61
+ readonly kind: "article";
62
+ readonly metadata: {
63
+ readonly dateModified?: string;
64
+ readonly datePublished: string;
65
+ readonly authors: readonly {
66
+ readonly name: string;
67
+ }[];
68
+ readonly description?: string | undefined;
69
+ readonly title: string;
70
+ };
71
+ readonly official: boolean;
72
+ readonly parentPath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">;
73
+ readonly references: readonly {
74
+ readonly authors: string;
75
+ readonly citation?: string | undefined;
76
+ readonly details?: string | undefined;
77
+ readonly publication?: string | undefined;
78
+ readonly title: string;
79
+ readonly url?: string | undefined;
80
+ readonly year: number;
81
+ }[];
82
+ readonly sitemap: true;
83
+ } | {
84
+ readonly appLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">;
85
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
86
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
87
+ readonly graph: {
88
+ readonly alignmentId: string;
89
+ readonly assetId: string;
90
+ readonly conceptId: string;
91
+ readonly learningObjectId: string;
92
+ readonly lensId: string;
93
+ };
94
+ readonly materialKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraMaterialKey">;
95
+ readonly order: number;
96
+ readonly publicPath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">;
97
+ readonly sectionKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraMaterialSection">;
98
+ readonly kind: "subject-lesson";
99
+ readonly metadata: {
100
+ readonly dateModified?: string;
101
+ readonly datePublished: string;
102
+ readonly authors: readonly {
103
+ readonly name: string;
104
+ }[];
105
+ readonly description?: string | undefined;
106
+ readonly subject?: string | undefined;
107
+ readonly title: string;
108
+ };
109
+ readonly parentPath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">;
110
+ readonly sitemap: true;
111
+ readonly topicTitle: string;
112
+ } | {
113
+ readonly appLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">;
114
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
115
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
116
+ readonly pageKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPageKey">;
117
+ readonly publicPath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">;
118
+ readonly kind: "public-page";
119
+ readonly metadata: {
120
+ readonly dateModified?: string;
121
+ readonly datePublished: string;
122
+ readonly description: string;
123
+ readonly title: string;
124
+ };
125
+ readonly sitemap: true;
126
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
127
+ } | {
128
+ readonly appLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">;
129
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
130
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
131
+ readonly pageKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPageKey">;
132
+ readonly publicPath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraPublicPath">;
133
+ readonly kind: "public-page";
134
+ readonly metadata: {
135
+ readonly description: string;
136
+ readonly lastModified: string;
137
+ readonly title: string;
138
+ };
139
+ readonly sitemap: true;
140
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
141
+ } | {
142
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
143
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
144
+ readonly peerContentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
145
+ readonly questionKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionKey">;
146
+ readonly questionNumber: number;
147
+ readonly setKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionSetKey">;
148
+ readonly bodyKind: "question";
149
+ readonly blueprint?: {
150
+ readonly cognitiveLevel: string;
151
+ readonly contentDomain: string;
152
+ readonly topic: string;
153
+ };
154
+ readonly kind: "question-body";
155
+ readonly metadata: {
156
+ readonly dateModified?: string;
157
+ readonly datePublished: string;
158
+ readonly authors: readonly {
159
+ readonly name: string;
160
+ }[];
161
+ readonly title: string;
162
+ };
163
+ readonly stimulusKey?: string;
164
+ readonly response: {
165
+ readonly categories: readonly {
166
+ readonly categoryKey: string;
167
+ readonly label: readonly [{
168
+ readonly display: "block" | "inline";
169
+ readonly kind: "math";
170
+ readonly math: string;
171
+ } | {
172
+ readonly kind: "text";
173
+ readonly text: string;
174
+ }, ...({
175
+ readonly display: "block" | "inline";
176
+ readonly kind: "math";
177
+ readonly math: string;
178
+ } | {
179
+ readonly kind: "text";
180
+ readonly text: string;
181
+ })[]];
182
+ readonly order: number;
183
+ }[];
184
+ readonly kind: "category";
185
+ readonly statements: readonly {
186
+ readonly correctCategoryKey: string;
187
+ readonly label: readonly [{
188
+ readonly display: "block" | "inline";
189
+ readonly kind: "math";
190
+ readonly math: string;
191
+ } | {
192
+ readonly kind: "text";
193
+ readonly text: string;
194
+ }, ...({
195
+ readonly display: "block" | "inline";
196
+ readonly kind: "math";
197
+ readonly math: string;
198
+ } | {
199
+ readonly kind: "text";
200
+ readonly text: string;
201
+ })[]];
202
+ readonly order: number;
203
+ readonly statementKey: string;
204
+ }[];
205
+ } | {
206
+ readonly kind: "multiple-choice";
207
+ readonly options: readonly {
208
+ readonly isCorrect: boolean;
209
+ readonly label: readonly [{
210
+ readonly display: "block" | "inline";
211
+ readonly kind: "math";
212
+ readonly math: string;
213
+ } | {
214
+ readonly kind: "text";
215
+ readonly text: string;
216
+ }, ...({
217
+ readonly display: "block" | "inline";
218
+ readonly kind: "math";
219
+ readonly math: string;
220
+ } | {
221
+ readonly kind: "text";
222
+ readonly text: string;
223
+ })[]];
224
+ readonly optionKey: string;
225
+ readonly order: number;
226
+ }[];
227
+ } | {
228
+ readonly kind: "single-choice";
229
+ readonly options: readonly {
230
+ readonly isCorrect: boolean;
231
+ readonly label: readonly [{
232
+ readonly display: "block" | "inline";
233
+ readonly kind: "math";
234
+ readonly math: string;
235
+ } | {
236
+ readonly kind: "text";
237
+ readonly text: string;
238
+ }, ...({
239
+ readonly display: "block" | "inline";
240
+ readonly kind: "math";
241
+ readonly math: string;
242
+ } | {
243
+ readonly kind: "text";
244
+ readonly text: string;
245
+ })[]];
246
+ readonly optionKey: string;
247
+ readonly order: number;
248
+ }[];
249
+ };
250
+ } | {
251
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
252
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
253
+ readonly peerContentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
254
+ readonly questionKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionKey">;
255
+ readonly questionNumber: number;
256
+ readonly setKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionSetKey">;
257
+ readonly bodyKind: "answer";
258
+ readonly blueprint?: {
259
+ readonly cognitiveLevel: string;
260
+ readonly contentDomain: string;
261
+ readonly topic: string;
262
+ };
263
+ readonly kind: "question-body";
264
+ readonly metadata: {
265
+ readonly dateModified?: string;
266
+ readonly datePublished: string;
267
+ readonly authors: readonly {
268
+ readonly name: string;
269
+ }[];
270
+ readonly title: string;
271
+ };
272
+ readonly stimulusKey?: string;
273
+ }, E | ProjectionDecodeError | ProjectionOrderError | ProjectionRouteError, R>;
274
+ /** Authenticates a replayable projection stream against its signed manifest. */
275
+ export declare const verifyContentProjections: <E, R>(input: {
276
+ readonly manifest: ContentReleaseManifest;
277
+ readonly projections: Stream.Stream<unknown, E, R>;
278
+ }) => Effect.Effect<{
279
+ count: number;
280
+ }, E | ProjectionCountError | ProjectionDecodeError | ProjectionDigestError | import("#contracts/projection/digest").ProjectionHashError | ProjectionOrderError | ProjectionRouteError, R>;
281
+ export {};
@@ -0,0 +1,86 @@
1
+ import { Effect, Schema, Stream } from "effect";
2
+ import { compareContentHeads, routeIdentity } from "#contracts/content";
3
+ import { PublicPathSchema, ReleaseIdSchema, Sha256HashSchema, } from "#contracts/ids";
4
+ import { digestProjections } from "#contracts/projection/digest";
5
+ import { ContentProjectionSchema, } from "#contracts/projection/spec";
6
+ const ProjectionIndexSchema = Schema.Finite.pipe(Schema.check(Schema.isInt()), Schema.check(Schema.isGreaterThanOrEqualTo(0)));
7
+ /** One streamed projection failed strict schema decoding. */
8
+ export class ProjectionDecodeError extends Schema.TaggedError()("ProjectionDecodeError", { projectionIndex: ProjectionIndexSchema }) {
9
+ }
10
+ /** Projections are duplicated or not in canonical content-head order. */
11
+ export class ProjectionOrderError extends Schema.TaggedError()("ProjectionOrderError", { projectionIndex: ProjectionIndexSchema }) {
12
+ }
13
+ /** Two content projections claim the same locale-specific public route. */
14
+ export class ProjectionRouteError extends Schema.TaggedError()("ProjectionRouteError", {
15
+ duplicateIndex: ProjectionIndexSchema,
16
+ firstIndex: ProjectionIndexSchema,
17
+ publicPath: PublicPathSchema,
18
+ }) {
19
+ }
20
+ /** The streamed projection count differs from the signed manifest. */
21
+ export class ProjectionCountError extends Schema.TaggedError()("ProjectionCountError", {
22
+ actualCount: ProjectionIndexSchema,
23
+ expectedCount: ProjectionIndexSchema,
24
+ releaseId: ReleaseIdSchema,
25
+ }) {
26
+ }
27
+ /** The streamed projection digest differs from the signed manifest. */
28
+ export class ProjectionDigestError extends Schema.TaggedError()("ProjectionDigestError", {
29
+ actualDigest: Sha256HashSchema,
30
+ expectedDigest: Sha256HashSchema,
31
+ releaseId: ReleaseIdSchema,
32
+ }) {
33
+ }
34
+ /** Decodes one row and applies canonical order and route uniqueness rules. */
35
+ const decodeProjection = Effect.fn("AksaraContracts.decodeProjection")(function* (state, source, projectionIndex) {
36
+ const projection = yield* Schema.decodeUnknownEffect(ContentProjectionSchema)(source, { onExcessProperty: "error" }).pipe(Effect.mapError(() => new ProjectionDecodeError({ projectionIndex })));
37
+ if (state.previous &&
38
+ compareContentHeads(state.previous, projection) >= 0) {
39
+ return yield* new ProjectionOrderError({ projectionIndex });
40
+ }
41
+ state.previous = projection;
42
+ if (projection.kind === "question-body") {
43
+ return projection;
44
+ }
45
+ const { appLocale, publicPath } = projection;
46
+ const identity = routeIdentity({ appLocale, publicPath });
47
+ const firstIndex = state.firstIndexByRoute.get(identity);
48
+ if (firstIndex !== undefined) {
49
+ return yield* new ProjectionRouteError({
50
+ duplicateIndex: projectionIndex,
51
+ firstIndex,
52
+ publicPath,
53
+ });
54
+ }
55
+ state.firstIndexByRoute.set(identity, projectionIndex);
56
+ return projection;
57
+ });
58
+ /** Strictly decodes a replayable canonical content projection stream. */
59
+ export function decodeContentProjections(projections) {
60
+ return Stream.unwrap(Effect.sync(() => {
61
+ const state = {
62
+ firstIndexByRoute: new Map(),
63
+ previous: undefined,
64
+ };
65
+ return projections.pipe(Stream.zipWithIndex, Stream.mapEffect(([source, projectionIndex]) => decodeProjection(state, source, projectionIndex)));
66
+ }));
67
+ }
68
+ /** Authenticates a replayable projection stream against its signed manifest. */
69
+ export const verifyContentProjections = Effect.fn("AksaraContracts.verifyContentProjections")(function* (input) {
70
+ const summary = yield* digestProjections(input.manifest.releaseId, decodeContentProjections(input.projections));
71
+ if (summary.count !== input.manifest.projectionCount) {
72
+ return yield* new ProjectionCountError({
73
+ actualCount: summary.count,
74
+ expectedCount: input.manifest.projectionCount,
75
+ releaseId: input.manifest.releaseId,
76
+ });
77
+ }
78
+ if (summary.digest !== input.manifest.projectionDigest) {
79
+ return yield* new ProjectionDigestError({
80
+ actualDigest: summary.digest,
81
+ expectedDigest: input.manifest.projectionDigest,
82
+ releaseId: input.manifest.releaseId,
83
+ });
84
+ }
85
+ return { count: summary.count };
86
+ });
@@ -0,0 +1,175 @@
1
+ import { Schema } from "effect";
2
+ /** Stable namespace shared by every try-out question-bank identity. */
3
+ export declare const QUESTION_BANK_KEY_ROOT = "question-bank/tryout";
4
+ /** Canonical terminal directory identity for one numbered question. */
5
+ export declare const QuestionSegmentSchema: Schema.String;
6
+ /** Authored MDX body roles carried by each localized question. */
7
+ export declare const QuestionBodyKindSchema: Schema.Literals<readonly ["question", "answer"]>;
8
+ export type QuestionBodyKind = typeof QuestionBodyKindSchema.Type;
9
+ /** Generic hierarchy derived from one canonical try-out question set. */
10
+ export declare const QuestionSetPartsSchema: Schema.Struct<{
11
+ readonly countryKey: Schema.String;
12
+ readonly examKey: Schema.String;
13
+ readonly intermediateBankKeys: Schema.$Array<Schema.String>;
14
+ readonly sectionKey: Schema.String;
15
+ readonly setKey: Schema.String;
16
+ }>;
17
+ export type QuestionSetParts = typeof QuestionSetPartsSchema.Type;
18
+ /** Generic hierarchy and authored order derived from one question key. */
19
+ export declare const QuestionKeyPartsSchema: Schema.Struct<{
20
+ readonly countryKey: Schema.String;
21
+ readonly examKey: Schema.String;
22
+ readonly intermediateBankKeys: Schema.$Array<Schema.String>;
23
+ readonly sectionKey: Schema.String;
24
+ readonly setKey: Schema.String;
25
+ readonly questionNumber: Schema.Finite;
26
+ }>;
27
+ export type QuestionKeyParts = typeof QuestionKeyPartsSchema.Type;
28
+ /** Stable logical identity shared by every locale and body of one question. */
29
+ export declare const QuestionKeySchema: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
30
+ export type QuestionKey = typeof QuestionKeySchema.Type;
31
+ /** Stable logical identity shared by every question within one authored set. */
32
+ export declare const QuestionSetKeySchema: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
33
+ export type QuestionSetKey = typeof QuestionSetKeySchema.Type;
34
+ /** Derives the renderer-owned bank identity above one authored set. */
35
+ export declare function questionBankKey(questionSetKey: QuestionSetKey): string;
36
+ /** Derives generic country, exam, bank, section, and set identities. */
37
+ export declare function questionSetKeyParts(questionSetKey: QuestionSetKey): {
38
+ readonly countryKey: string;
39
+ readonly examKey: string;
40
+ readonly intermediateBankKeys: readonly string[];
41
+ readonly sectionKey: string;
42
+ readonly setKey: string;
43
+ };
44
+ /** Derives the parent hierarchy and safe authored order from one question. */
45
+ export declare function questionKeyParts(questionKey: QuestionKey): {
46
+ countryKey: string;
47
+ examKey: string;
48
+ intermediateBankKeys: readonly string[];
49
+ sectionKey: string;
50
+ setKey: string;
51
+ questionNumber: number;
52
+ questionSetKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionSetKey">;
53
+ };
54
+ /** Complete physical MDX source identity derived from one question body. */
55
+ export declare const QuestionBodySourcePartsSchema: Schema.Struct<{
56
+ readonly countryKey: Schema.String;
57
+ readonly examKey: Schema.String;
58
+ readonly intermediateBankKeys: Schema.$Array<Schema.String>;
59
+ readonly sectionKey: Schema.String;
60
+ readonly setKey: Schema.String;
61
+ readonly questionNumber: Schema.Finite;
62
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
63
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
64
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
65
+ readonly bodyKind: Schema.Literals<readonly ["question", "answer"]>;
66
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
67
+ readonly kind: Schema.Literal<"body">;
68
+ }>;
69
+ /** Complete physical TypeScript source identity for one assessment item. */
70
+ export declare const QuestionItemSourcePartsSchema: Schema.Struct<{
71
+ readonly countryKey: Schema.String;
72
+ readonly examKey: Schema.String;
73
+ readonly intermediateBankKeys: Schema.$Array<Schema.String>;
74
+ readonly sectionKey: Schema.String;
75
+ readonly setKey: Schema.String;
76
+ readonly questionNumber: Schema.Finite;
77
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
78
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
79
+ readonly kind: Schema.Literal<"item">;
80
+ }>;
81
+ /** Every direct authored source accepted inside one question directory. */
82
+ export declare const QuestionSourcePartsSchema: Schema.Union<readonly [Schema.Struct<{
83
+ readonly countryKey: Schema.String;
84
+ readonly examKey: Schema.String;
85
+ readonly intermediateBankKeys: Schema.$Array<Schema.String>;
86
+ readonly sectionKey: Schema.String;
87
+ readonly setKey: Schema.String;
88
+ readonly questionNumber: Schema.Finite;
89
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
90
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
91
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
92
+ readonly bodyKind: Schema.Literals<readonly ["question", "answer"]>;
93
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
94
+ readonly kind: Schema.Literal<"body">;
95
+ }>, Schema.Struct<{
96
+ readonly countryKey: Schema.String;
97
+ readonly examKey: Schema.String;
98
+ readonly intermediateBankKeys: Schema.$Array<Schema.String>;
99
+ readonly sectionKey: Schema.String;
100
+ readonly setKey: Schema.String;
101
+ readonly questionNumber: Schema.Finite;
102
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
103
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
104
+ readonly kind: Schema.Literal<"item">;
105
+ }>]>;
106
+ export type QuestionSourceParts = typeof QuestionSourcePartsSchema.Type;
107
+ /** Exact direct authored source path below one Aksara question directory. */
108
+ export declare const QuestionSourcePathSchema: Schema.brand<Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">, "@NakafaAI/AksaraQuestionSourcePath">;
109
+ export type QuestionSourcePath = typeof QuestionSourcePathSchema.Type;
110
+ /** Derives every logical identity from one validated physical source path. */
111
+ export declare function questionSourcePathParts(sourcePath: QuestionSourcePath): {
112
+ readonly countryKey: string;
113
+ readonly examKey: string;
114
+ readonly intermediateBankKeys: readonly string[];
115
+ readonly sectionKey: string;
116
+ readonly setKey: string;
117
+ readonly questionNumber: number;
118
+ readonly questionKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionKey">;
119
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
120
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
121
+ readonly bodyKind: "answer" | "question";
122
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
123
+ readonly kind: "body";
124
+ } | {
125
+ readonly countryKey: string;
126
+ readonly examKey: string;
127
+ readonly intermediateBankKeys: readonly string[];
128
+ readonly sectionKey: string;
129
+ readonly setKey: string;
130
+ readonly questionNumber: number;
131
+ readonly questionKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraQuestionKey">;
132
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
133
+ readonly kind: "item";
134
+ };
135
+ /** Exact stable identity carried by one localized question prompt. */
136
+ export declare const QuestionPromptIdentitySchema: Schema.Struct<{
137
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
138
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
139
+ readonly peerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
140
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
141
+ readonly questionNumber: Schema.Finite;
142
+ readonly setKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
143
+ readonly bodyKind: Schema.Literal<"question">;
144
+ }>;
145
+ export type QuestionPromptIdentity = typeof QuestionPromptIdentitySchema.Type;
146
+ /** Exact stable identity carried by one localized entitled answer. */
147
+ export declare const QuestionAnswerIdentitySchema: Schema.Struct<{
148
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
149
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
150
+ readonly peerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
151
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
152
+ readonly questionNumber: Schema.Finite;
153
+ readonly setKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
154
+ readonly bodyKind: Schema.Literal<"answer">;
155
+ }>;
156
+ export type QuestionAnswerIdentity = typeof QuestionAnswerIdentitySchema.Type;
157
+ /** Complete prompt and answer identity vocabulary for question bodies. */
158
+ export declare const QuestionBodyIdentitySchema: Schema.Union<readonly [Schema.Struct<{
159
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
160
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
161
+ readonly peerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
162
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
163
+ readonly questionNumber: Schema.Finite;
164
+ readonly setKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
165
+ readonly bodyKind: Schema.Literal<"question">;
166
+ }>, Schema.Struct<{
167
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
168
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
169
+ readonly peerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
170
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
171
+ readonly questionNumber: Schema.Finite;
172
+ readonly setKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
173
+ readonly bodyKind: Schema.Literal<"answer">;
174
+ }>]>;
175
+ export type QuestionBodyIdentity = typeof QuestionBodyIdentitySchema.Type;