@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,58 @@
1
+ import { Schema } from "effect";
2
+ /** Stable wire format for one permanent signed try-out runtime bundle. */
3
+ export declare const TRYOUT_RUNTIME_BUNDLE_FORMAT = "signed-tryout-runtime-bundle";
4
+ /** Source and runtime facts authenticated independently from a global release. */
5
+ export declare const TryoutRuntimeBundlePayloadSchema: Schema.Struct<{
6
+ readonly format: Schema.Literal<"signed-tryout-runtime-bundle">;
7
+ readonly rendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
8
+ readonly snapshot: Schema.Struct<{
9
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
10
+ readonly catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
11
+ readonly counts: Schema.Struct<{
12
+ readonly country: Schema.Int;
13
+ readonly exam: Schema.Int;
14
+ readonly section: Schema.Int;
15
+ readonly set: Schema.Int;
16
+ readonly track: Schema.Int;
17
+ }>;
18
+ readonly placementCount: Schema.Int;
19
+ readonly placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
20
+ readonly routeCount: Schema.Int;
21
+ readonly format: Schema.Literal<"localized-tryout-snapshot">;
22
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
23
+ }>;
24
+ readonly sourceGitSha: Schema.brand<Schema.String, "@NakafaAI/AksaraGitCommitSha">;
25
+ readonly sourceManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
26
+ readonly sourceReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
27
+ }>;
28
+ export type TryoutRuntimeBundlePayload = typeof TryoutRuntimeBundlePayloadSchema.Type;
29
+ /** Immutable bundle identity plus its Ed25519 authenticity proof. */
30
+ export declare const SignedTryoutRuntimeBundleSchema: Schema.Struct<{
31
+ readonly bundleHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
32
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
33
+ readonly payload: Schema.Struct<{
34
+ readonly format: Schema.Literal<"signed-tryout-runtime-bundle">;
35
+ readonly rendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
36
+ readonly snapshot: Schema.Struct<{
37
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
38
+ readonly catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
39
+ readonly counts: Schema.Struct<{
40
+ readonly country: Schema.Int;
41
+ readonly exam: Schema.Int;
42
+ readonly section: Schema.Int;
43
+ readonly set: Schema.Int;
44
+ readonly track: Schema.Int;
45
+ }>;
46
+ readonly placementCount: Schema.Int;
47
+ readonly placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
48
+ readonly routeCount: Schema.Int;
49
+ readonly format: Schema.Literal<"localized-tryout-snapshot">;
50
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
51
+ }>;
52
+ readonly sourceGitSha: Schema.brand<Schema.String, "@NakafaAI/AksaraGitCommitSha">;
53
+ readonly sourceManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
54
+ readonly sourceReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
55
+ }>;
56
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
57
+ }>;
58
+ export type SignedTryoutRuntimeBundle = typeof SignedTryoutRuntimeBundleSchema.Type;
@@ -0,0 +1,21 @@
1
+ import { Schema } from "effect";
2
+ import { Ed25519SignatureSchema, GitCommitShaSchema, ReleaseIdSchema, Sha256HashSchema, SigningKeyIdSchema, } from "#contracts/ids";
3
+ import { TryoutSnapshotSchema } from "#contracts/tryout/snapshot/spec";
4
+ /** Stable wire format for one permanent signed try-out runtime bundle. */
5
+ export const TRYOUT_RUNTIME_BUNDLE_FORMAT = "signed-tryout-runtime-bundle";
6
+ /** Source and runtime facts authenticated independently from a global release. */
7
+ export const TryoutRuntimeBundlePayloadSchema = Schema.Struct({
8
+ format: Schema.Literal(TRYOUT_RUNTIME_BUNDLE_FORMAT),
9
+ rendererManifestHash: Sha256HashSchema,
10
+ snapshot: TryoutSnapshotSchema,
11
+ sourceGitSha: GitCommitShaSchema,
12
+ sourceManifestHash: Sha256HashSchema,
13
+ sourceReleaseId: ReleaseIdSchema,
14
+ });
15
+ /** Immutable bundle identity plus its Ed25519 authenticity proof. */
16
+ export const SignedTryoutRuntimeBundleSchema = Schema.Struct({
17
+ bundleHash: Sha256HashSchema,
18
+ keyId: SigningKeyIdSchema,
19
+ payload: TryoutRuntimeBundlePayloadSchema,
20
+ signature: Ed25519SignatureSchema,
21
+ });
@@ -0,0 +1,61 @@
1
+ import { Effect, Schema } from "effect";
2
+ declare const TryoutRuntimeBundleVerificationDecodeError_base: Schema.Class<TryoutRuntimeBundleVerificationDecodeError, Schema.TaggedStruct<"TryoutRuntimeBundleVerificationDecodeError", {
3
+ readonly message: Schema.Literal<"Try-out runtime bundle verification input does not satisfy its exact wire contract.">;
4
+ }>, import("effect/Cause").YieldableError>;
5
+ /** Unknown input did not exactly satisfy the signed runtime-bundle contract. */
6
+ export declare class TryoutRuntimeBundleVerificationDecodeError extends TryoutRuntimeBundleVerificationDecodeError_base {
7
+ }
8
+ declare const TryoutRuntimeBundleHashMismatchError_base: Schema.Class<TryoutRuntimeBundleHashMismatchError, Schema.TaggedStruct<"TryoutRuntimeBundleHashMismatchError", {
9
+ readonly actualHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
10
+ readonly expectedHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
11
+ }>, import("effect/Cause").YieldableError>;
12
+ /** The envelope hash does not identify its complete canonical payload. */
13
+ export declare class TryoutRuntimeBundleHashMismatchError extends TryoutRuntimeBundleHashMismatchError_base {
14
+ }
15
+ declare const TryoutRuntimeBundleSnapshotMismatchError_base: Schema.Class<TryoutRuntimeBundleSnapshotMismatchError, Schema.TaggedStruct<"TryoutRuntimeBundleSnapshotMismatchError", {
16
+ readonly actualSnapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
17
+ readonly expectedSnapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
18
+ }>, import("effect/Cause").YieldableError>;
19
+ /** The embedded snapshot identity does not match its semantic facts. */
20
+ export declare class TryoutRuntimeBundleSnapshotMismatchError extends TryoutRuntimeBundleSnapshotMismatchError_base {
21
+ }
22
+ declare const TryoutRuntimeBundleRendererMismatchError_base: Schema.Class<TryoutRuntimeBundleRendererMismatchError, Schema.TaggedStruct<"TryoutRuntimeBundleRendererMismatchError", {
23
+ readonly actualRendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
24
+ readonly expectedRendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
25
+ }>, import("effect/Cause").YieldableError>;
26
+ /** The supplied renderer is not the renderer authenticated by the bundle. */
27
+ export declare class TryoutRuntimeBundleRendererMismatchError extends TryoutRuntimeBundleRendererMismatchError_base {
28
+ }
29
+ /** Strictly decodes and authenticates a renderer-bound runtime bundle. */
30
+ export declare const verifySignedTryoutRuntimeBundle: (input: {
31
+ readonly bundle: unknown;
32
+ readonly rendererManifest: unknown;
33
+ }) => Effect.Effect<{
34
+ readonly bundleHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
35
+ readonly keyId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSigningKeyId">;
36
+ readonly payload: {
37
+ readonly format: "signed-tryout-runtime-bundle";
38
+ readonly rendererManifestHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
39
+ readonly snapshot: {
40
+ readonly activeAppLocales: readonly [("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">, ...(("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">)[]];
41
+ readonly catalogDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
42
+ readonly counts: {
43
+ readonly country: number;
44
+ readonly exam: number;
45
+ readonly section: number;
46
+ readonly set: number;
47
+ readonly track: number;
48
+ };
49
+ readonly placementCount: number;
50
+ readonly placementDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
51
+ readonly routeCount: number;
52
+ readonly format: "localized-tryout-snapshot";
53
+ readonly snapshotId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
54
+ };
55
+ readonly sourceGitSha: string & import("effect/Brand").Brand<"@NakafaAI/AksaraGitCommitSha">;
56
+ readonly sourceManifestHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
57
+ readonly sourceReleaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
58
+ };
59
+ readonly signature: string & import("effect/Brand").Brand<"@NakafaAI/AksaraEd25519Signature">;
60
+ }, import("../../errors.js").ContractDecodeError | import("../../signature/spec.js").PublicKeyParseError | import("../../signature/spec.js").PublicKeyTypeError | import("../../renderer/component.js").RendererAuthoringComponentDuplicateError | import("../../renderer/component.js").RendererAuthoringComponentExtraError | import("../../renderer/component.js").RendererAuthoringComponentMissingError | import("../../renderer/component.js").RendererAuthoringComponentUnsupportedError | import("../../renderer/component.js").RendererAuthoringSelectionNonCanonicalError | import("../../renderer/contract.js").RendererManifestHashComputeError | import("../../renderer/contract.js").RendererManifestHashMismatchError | import("../../signature/spec.js").SignatureCheckError | import("../../signature/spec.js").SignatureInvalidError | import("../../signature/spec.js").SigningKeyNotFoundError | import("../../signature/spec.js").SigningKeyResolutionError | import("#contracts/tryout/runtime/hash").TryoutRuntimeBundleHashComputationError | TryoutRuntimeBundleHashMismatchError | TryoutRuntimeBundleRendererMismatchError | TryoutRuntimeBundleSnapshotMismatchError | TryoutRuntimeBundleVerificationDecodeError, import("../../signature/spec.js").ContentVerificationKeyResolver>;
61
+ export {};
@@ -0,0 +1,69 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { Sha256HashSchema } from "#contracts/ids";
3
+ import { validateRendererManifestHash } from "#contracts/renderer/manifest";
4
+ import { verifyEd25519Signature } from "#contracts/signature/verify";
5
+ import { canonicalizeTryoutRuntimeBundleSigningInput } from "#contracts/tryout/runtime/canonical";
6
+ import { hashTryoutRuntimeBundlePayload } from "#contracts/tryout/runtime/hash";
7
+ import { SignedTryoutRuntimeBundleSchema, } from "#contracts/tryout/runtime/spec";
8
+ import { makeTryoutSnapshot } from "#contracts/tryout/snapshot/hash";
9
+ /** Unknown input did not exactly satisfy the signed runtime-bundle contract. */
10
+ export class TryoutRuntimeBundleVerificationDecodeError extends Schema.TaggedError()("TryoutRuntimeBundleVerificationDecodeError", {
11
+ message: Schema.Literal("Try-out runtime bundle verification input does not satisfy its exact wire contract."),
12
+ }) {
13
+ }
14
+ /** The envelope hash does not identify its complete canonical payload. */
15
+ export class TryoutRuntimeBundleHashMismatchError extends Schema.TaggedError()("TryoutRuntimeBundleHashMismatchError", {
16
+ actualHash: Sha256HashSchema,
17
+ expectedHash: Sha256HashSchema,
18
+ }) {
19
+ }
20
+ /** The embedded snapshot identity does not match its semantic facts. */
21
+ export class TryoutRuntimeBundleSnapshotMismatchError extends Schema.TaggedError()("TryoutRuntimeBundleSnapshotMismatchError", {
22
+ actualSnapshotId: Sha256HashSchema,
23
+ expectedSnapshotId: Sha256HashSchema,
24
+ }) {
25
+ }
26
+ /** The supplied renderer is not the renderer authenticated by the bundle. */
27
+ export class TryoutRuntimeBundleRendererMismatchError extends Schema.TaggedError()("TryoutRuntimeBundleRendererMismatchError", {
28
+ actualRendererManifestHash: Sha256HashSchema,
29
+ expectedRendererManifestHash: Sha256HashSchema,
30
+ }) {
31
+ }
32
+ /** Authenticates one already decoded permanent try-out runtime bundle. */
33
+ const authenticateTryoutRuntimeBundle = Effect.fn("AksaraContracts.authenticateTryoutRuntimeBundle")(function* (bundle, rendererManifest) {
34
+ const renderer = yield* validateRendererManifestHash(rendererManifest);
35
+ const actualHash = yield* hashTryoutRuntimeBundlePayload(bundle.payload);
36
+ if (actualHash !== bundle.bundleHash) {
37
+ return yield* new TryoutRuntimeBundleHashMismatchError({
38
+ actualHash,
39
+ expectedHash: bundle.bundleHash,
40
+ });
41
+ }
42
+ const expectedSnapshotId = makeTryoutSnapshot(bundle.payload.snapshot).snapshotId;
43
+ if (expectedSnapshotId !== bundle.payload.snapshot.snapshotId) {
44
+ return yield* new TryoutRuntimeBundleSnapshotMismatchError({
45
+ actualSnapshotId: bundle.payload.snapshot.snapshotId,
46
+ expectedSnapshotId,
47
+ });
48
+ }
49
+ if (renderer.hash !== bundle.payload.rendererManifestHash) {
50
+ return yield* new TryoutRuntimeBundleRendererMismatchError({
51
+ actualRendererManifestHash: renderer.hash,
52
+ expectedRendererManifestHash: bundle.payload.rendererManifestHash,
53
+ });
54
+ }
55
+ yield* verifyEd25519Signature({
56
+ keyId: bundle.keyId,
57
+ message: canonicalizeTryoutRuntimeBundleSigningInput(bundle.bundleHash, bundle.payload),
58
+ signature: bundle.signature,
59
+ subject: "tryout-runtime-bundle",
60
+ });
61
+ return bundle;
62
+ });
63
+ /** Strictly decodes and authenticates a renderer-bound runtime bundle. */
64
+ export const verifySignedTryoutRuntimeBundle = Effect.fn("AksaraContracts.verifySignedTryoutRuntimeBundle")(function* (input) {
65
+ const bundle = yield* Schema.decodeUnknownEffect(SignedTryoutRuntimeBundleSchema)(input.bundle, { onExcessProperty: "error" }).pipe(Effect.mapError(() => new TryoutRuntimeBundleVerificationDecodeError({
66
+ message: "Try-out runtime bundle verification input does not satisfy its exact wire contract.",
67
+ })));
68
+ return yield* authenticateTryoutRuntimeBundle(bundle, input.rendererManifest);
69
+ });
@@ -0,0 +1,7 @@
1
+ import type { TryoutSnapshotFacts } from "#contracts/tryout/snapshot/spec";
2
+ /** Domain separating snapshot identities from every other try-out digest. */
3
+ export declare const TRYOUT_SNAPSHOT_DOMAIN = "nakafa.aksara.localized-tryout-snapshot";
4
+ /** Domain separating joined row evidence from individual row digests. */
5
+ export declare const TRYOUT_SNAPSHOT_ROWS_DOMAIN = "nakafa.aksara.tryout-rows";
6
+ /** Serializes snapshot facts without content-addressed identity. */
7
+ export declare function canonicalizeTryoutSnapshot(input: TryoutSnapshotFacts): string;
@@ -0,0 +1,17 @@
1
+ import { TRYOUT_SNAPSHOT_FORMAT } from "#contracts/tryout/snapshot/spec";
2
+ /** Domain separating snapshot identities from every other try-out digest. */
3
+ export const TRYOUT_SNAPSHOT_DOMAIN = "nakafa.aksara.localized-tryout-snapshot";
4
+ /** Domain separating joined row evidence from individual row digests. */
5
+ export const TRYOUT_SNAPSHOT_ROWS_DOMAIN = "nakafa.aksara.tryout-rows";
6
+ /** Serializes snapshot facts without content-addressed identity. */
7
+ export function canonicalizeTryoutSnapshot(input) {
8
+ return JSON.stringify({
9
+ activeAppLocales: input.activeAppLocales,
10
+ catalogDigest: input.catalogDigest,
11
+ counts: input.counts,
12
+ format: TRYOUT_SNAPSHOT_FORMAT,
13
+ placementCount: input.placementCount,
14
+ placementDigest: input.placementDigest,
15
+ routeCount: input.routeCount,
16
+ });
17
+ }
@@ -0,0 +1,8 @@
1
+ import { type TryoutSnapshot, type TryoutSnapshotFacts } from "#contracts/tryout/snapshot/spec";
2
+ /** Creates one complete content-addressed try-out snapshot. */
3
+ export declare function makeTryoutSnapshot(input: TryoutSnapshotFacts): TryoutSnapshot;
4
+ /** Returns exact structured row evidence authenticated by a snapshot. */
5
+ export declare function tryoutSnapshotRowEvidence(input: TryoutSnapshotFacts): {
6
+ rowCount: number;
7
+ rowDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
8
+ };
@@ -0,0 +1,19 @@
1
+ import { hashTryoutCanonical } from "#contracts/tryout/canonical";
2
+ import { canonicalizeTryoutSnapshot, TRYOUT_SNAPSHOT_DOMAIN, TRYOUT_SNAPSHOT_ROWS_DOMAIN, } from "#contracts/tryout/snapshot/canonical";
3
+ import { TRYOUT_SNAPSHOT_FORMAT, TryoutSnapshotSchema, } from "#contracts/tryout/snapshot/spec";
4
+ /** Creates one complete content-addressed try-out snapshot. */
5
+ export function makeTryoutSnapshot(input) {
6
+ return TryoutSnapshotSchema.make({
7
+ ...input,
8
+ format: TRYOUT_SNAPSHOT_FORMAT,
9
+ snapshotId: hashTryoutCanonical(TRYOUT_SNAPSHOT_DOMAIN, canonicalizeTryoutSnapshot(input)),
10
+ });
11
+ }
12
+ /** Returns exact structured row evidence authenticated by a snapshot. */
13
+ export function tryoutSnapshotRowEvidence(input) {
14
+ return {
15
+ rowCount: Object.values(input.counts).reduce((total, count) => total + count, 0) +
16
+ input.placementCount,
17
+ rowDigest: hashTryoutCanonical(TRYOUT_SNAPSHOT_ROWS_DOMAIN, `${input.catalogDigest}\n${input.placementDigest}`),
18
+ };
19
+ }
@@ -0,0 +1,46 @@
1
+ import { Schema } from "effect";
2
+ /** Semantic wire identity of the current localized try-out snapshot. */
3
+ export declare const TRYOUT_SNAPSHOT_FORMAT = "localized-tryout-snapshot";
4
+ /** Signed per-kind hierarchy counts for one immutable try-out snapshot. */
5
+ export declare const TryoutCatalogCountsSchema: Schema.Struct<{
6
+ readonly country: Schema.Int;
7
+ readonly exam: Schema.Int;
8
+ readonly section: Schema.Int;
9
+ readonly set: Schema.Int;
10
+ readonly track: Schema.Int;
11
+ }>;
12
+ export type TryoutCatalogCounts = typeof TryoutCatalogCountsSchema.Type;
13
+ /** Canonical snapshot facts authenticated by the global content release. */
14
+ export declare const TryoutSnapshotFactsSchema: Schema.Struct<{
15
+ activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
16
+ catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
17
+ counts: Schema.Struct<{
18
+ readonly country: Schema.Int;
19
+ readonly exam: Schema.Int;
20
+ readonly section: Schema.Int;
21
+ readonly set: Schema.Int;
22
+ readonly track: Schema.Int;
23
+ }>;
24
+ placementCount: Schema.Int;
25
+ placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
26
+ routeCount: Schema.Int;
27
+ }>;
28
+ export type TryoutSnapshotFacts = typeof TryoutSnapshotFactsSchema.Type;
29
+ /** Content-addressed try-out snapshot selected by one global release. */
30
+ export declare const TryoutSnapshotSchema: Schema.Struct<{
31
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
32
+ readonly catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
33
+ readonly counts: Schema.Struct<{
34
+ readonly country: Schema.Int;
35
+ readonly exam: Schema.Int;
36
+ readonly section: Schema.Int;
37
+ readonly set: Schema.Int;
38
+ readonly track: Schema.Int;
39
+ }>;
40
+ readonly placementCount: Schema.Int;
41
+ readonly placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
42
+ readonly routeCount: Schema.Int;
43
+ readonly format: Schema.Literal<"localized-tryout-snapshot">;
44
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
45
+ }>;
46
+ export type TryoutSnapshot = typeof TryoutSnapshotSchema.Type;
@@ -0,0 +1,30 @@
1
+ import { Schema } from "effect";
2
+ import { Sha256HashSchema } from "#contracts/ids";
3
+ import { ActiveAppLocaleListSchema } from "#contracts/locale";
4
+ /** Semantic wire identity of the current localized try-out snapshot. */
5
+ export const TRYOUT_SNAPSHOT_FORMAT = "localized-tryout-snapshot";
6
+ const NonNegativeCountSchema = Schema.Int.pipe(Schema.check(Schema.isGreaterThanOrEqualTo(0)));
7
+ /** Signed per-kind hierarchy counts for one immutable try-out snapshot. */
8
+ export const TryoutCatalogCountsSchema = Schema.Struct({
9
+ country: NonNegativeCountSchema,
10
+ exam: NonNegativeCountSchema,
11
+ section: NonNegativeCountSchema,
12
+ set: NonNegativeCountSchema,
13
+ track: NonNegativeCountSchema,
14
+ });
15
+ const TryoutSnapshotFactFields = {
16
+ activeAppLocales: ActiveAppLocaleListSchema,
17
+ catalogDigest: Sha256HashSchema,
18
+ counts: TryoutCatalogCountsSchema,
19
+ placementCount: NonNegativeCountSchema,
20
+ placementDigest: Sha256HashSchema,
21
+ routeCount: NonNegativeCountSchema,
22
+ };
23
+ /** Canonical snapshot facts authenticated by the global content release. */
24
+ export const TryoutSnapshotFactsSchema = Schema.Struct(TryoutSnapshotFactFields);
25
+ /** Content-addressed try-out snapshot selected by one global release. */
26
+ export const TryoutSnapshotSchema = Schema.Struct({
27
+ ...TryoutSnapshotFactFields,
28
+ format: Schema.Literal(TRYOUT_SNAPSHOT_FORMAT),
29
+ snapshotId: Sha256HashSchema,
30
+ });
@@ -0,0 +1,13 @@
1
+ import { Schema } from "effect";
2
+ /** Scoring model selected by one authored exam. */
3
+ export declare const TryoutScoringSchema: Schema.Literals<readonly ["irt", "raw"]>;
4
+ export type TryoutScoring = typeof TryoutScoringSchema.Type;
5
+ /** Navigation role of one authored track. */
6
+ export declare const TryoutTrackKindSchema: Schema.Literals<readonly ["subject", "year"]>;
7
+ /** Public route behavior of one authored section. */
8
+ export declare const TryoutVisibilitySchema: Schema.Literals<readonly ["internal-entry", "visible"]>;
9
+ /** Bounded authored revision shared by one try-out source hierarchy. */
10
+ export declare const TryoutSourceRevisionSchema: Schema.Trimmed;
11
+ /** Durable complete-question identity retained by every frozen placement. */
12
+ export declare const TryoutContentHashSchema: Schema.brand<Schema.String, "@NakafaAI/AksaraTryoutContentHash">;
13
+ export type TryoutContentHash = typeof TryoutContentHashSchema.Type;
@@ -0,0 +1,15 @@
1
+ import { Schema } from "effect";
2
+ const TRYOUT_CONTENT_HASH_PATTERN = /^[a-f\d]{64}$/u;
3
+ /** Scoring model selected by one authored exam. */
4
+ export const TryoutScoringSchema = Schema.Literals(["irt", "raw"]);
5
+ /** Navigation role of one authored track. */
6
+ export const TryoutTrackKindSchema = Schema.Literals(["subject", "year"]);
7
+ /** Public route behavior of one authored section. */
8
+ export const TryoutVisibilitySchema = Schema.Literals([
9
+ "internal-entry",
10
+ "visible",
11
+ ]);
12
+ /** Bounded authored revision shared by one try-out source hierarchy. */
13
+ export const TryoutSourceRevisionSchema = Schema.Trimmed.check(Schema.isNonEmpty()).pipe(Schema.check(Schema.isMaxLength(128)));
14
+ /** Durable complete-question identity retained by every frozen placement. */
15
+ export const TryoutContentHashSchema = Schema.String.pipe(Schema.check(Schema.isPattern(TRYOUT_CONTENT_HASH_PATTERN)), Schema.brand("@NakafaAI/AksaraTryoutContentHash"));