@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,198 @@
1
+ import { Schema } from "effect";
2
+ export declare const LOCAL_PREVIEW_ARTIFACT_PREFIX = "/v1/artifacts/";
3
+ /** Builds the one content-addressed path owned by the preview protocol. */
4
+ export declare function localPreviewArtifactPath(artifactHash: string): string;
5
+ /** One signed artifact reference and its exact current renderer projection. */
6
+ export declare const PreviewArtifactSchema: Schema.Struct<{
7
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
8
+ readonly artifactPath: Schema.Trimmed;
9
+ readonly projection: Schema.Union<readonly [Schema.Struct<{
10
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
11
+ readonly articleRouteSlug: Schema.brand<Schema.String, "@NakafaAI/AksaraArticleRouteSlug">;
12
+ readonly articleSlug: Schema.brand<Schema.String, "@NakafaAI/AksaraArticleSlug">;
13
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
14
+ readonly category: Schema.brand<Schema.String, "@NakafaAI/AksaraArticleCategory">;
15
+ readonly categoryRouteSlug: Schema.brand<Schema.String, "@NakafaAI/AksaraArticleRouteSlug">;
16
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
17
+ readonly graph: Schema.Struct<{
18
+ readonly alignmentId: Schema.String;
19
+ readonly assetId: Schema.String;
20
+ readonly conceptId: Schema.String;
21
+ readonly learningObjectId: Schema.String;
22
+ readonly lensId: Schema.String;
23
+ }>;
24
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
25
+ readonly categoryTitle: Schema.Trimmed;
26
+ readonly kind: Schema.Literal<"article">;
27
+ readonly metadata: Schema.Struct<{
28
+ readonly dateModified: Schema.optionalKey<Schema.String>;
29
+ readonly datePublished: Schema.String;
30
+ readonly authors: Schema.$Array<Schema.Struct<{
31
+ readonly name: Schema.String;
32
+ }>>;
33
+ readonly description: Schema.optional<Schema.String>;
34
+ readonly title: Schema.String;
35
+ }>;
36
+ readonly official: Schema.Boolean;
37
+ readonly parentPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
38
+ readonly references: Schema.$Array<Schema.Struct<{
39
+ readonly authors: Schema.String;
40
+ readonly citation: Schema.optional<Schema.String>;
41
+ readonly details: Schema.optional<Schema.String>;
42
+ readonly publication: Schema.optional<Schema.String>;
43
+ readonly title: Schema.String;
44
+ readonly url: Schema.optional<Schema.String>;
45
+ readonly year: Schema.Finite;
46
+ }>>;
47
+ readonly sitemap: Schema.Literal<true>;
48
+ }>, Schema.Struct<{
49
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
50
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
51
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
52
+ readonly graph: Schema.Struct<{
53
+ readonly alignmentId: Schema.String;
54
+ readonly assetId: Schema.String;
55
+ readonly conceptId: Schema.String;
56
+ readonly learningObjectId: Schema.String;
57
+ readonly lensId: Schema.String;
58
+ }>;
59
+ readonly materialKey: Schema.brand<Schema.String, "@NakafaAI/AksaraMaterialKey">;
60
+ readonly order: Schema.Finite;
61
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
62
+ readonly sectionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraMaterialSection">;
63
+ readonly kind: Schema.Literal<"subject-lesson">;
64
+ readonly metadata: Schema.Struct<{
65
+ readonly dateModified: Schema.optionalKey<Schema.String>;
66
+ readonly datePublished: Schema.String;
67
+ readonly authors: Schema.$Array<Schema.Struct<{
68
+ readonly name: Schema.String;
69
+ }>>;
70
+ readonly description: Schema.optional<Schema.String>;
71
+ readonly subject: Schema.optional<Schema.String>;
72
+ readonly title: Schema.String;
73
+ }>;
74
+ readonly parentPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
75
+ readonly sitemap: Schema.Literal<true>;
76
+ readonly topicTitle: Schema.String;
77
+ }>, Schema.Struct<{
78
+ readonly appLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">;
79
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
80
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
81
+ readonly pageKey: Schema.brand<Schema.String, "@NakafaAI/AksaraPageKey">;
82
+ readonly publicPath: Schema.brand<Schema.String, "@NakafaAI/AksaraPublicPath">;
83
+ readonly kind: Schema.Literal<"public-page">;
84
+ readonly metadata: Schema.Struct<{
85
+ readonly dateModified: Schema.optionalKey<Schema.String>;
86
+ readonly datePublished: Schema.String;
87
+ readonly description: Schema.Trimmed;
88
+ readonly title: Schema.Trimmed;
89
+ }>;
90
+ readonly sitemap: Schema.Literal<true>;
91
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
92
+ }>, Schema.Union<readonly [Schema.Struct<{
93
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
94
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
95
+ readonly peerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
96
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
97
+ readonly questionNumber: Schema.Finite;
98
+ readonly setKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
99
+ readonly bodyKind: Schema.Literal<"question">;
100
+ readonly blueprint: Schema.optionalKey<Schema.Struct<{
101
+ readonly cognitiveLevel: Schema.String;
102
+ readonly contentDomain: Schema.String;
103
+ readonly topic: Schema.String;
104
+ }>>;
105
+ readonly kind: Schema.Literal<"question-body">;
106
+ readonly metadata: Schema.Struct<{
107
+ readonly dateModified: Schema.optionalKey<Schema.String>;
108
+ readonly datePublished: Schema.String;
109
+ readonly authors: Schema.$Array<Schema.Struct<{
110
+ readonly name: Schema.String;
111
+ }>>;
112
+ readonly title: Schema.String;
113
+ }>;
114
+ readonly stimulusKey: Schema.optionalKey<Schema.String>;
115
+ readonly response: Schema.Union<readonly [Schema.Struct<{
116
+ readonly categories: Schema.$Array<Schema.Struct<{
117
+ readonly categoryKey: Schema.String;
118
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
119
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
120
+ readonly kind: Schema.Literal<"math">;
121
+ readonly math: Schema.String;
122
+ }>, Schema.Struct<{
123
+ readonly kind: Schema.Literal<"text">;
124
+ readonly text: Schema.String;
125
+ }>]>>;
126
+ readonly order: Schema.Int;
127
+ }>>;
128
+ readonly kind: Schema.Literal<"category">;
129
+ readonly statements: Schema.$Array<Schema.Struct<{
130
+ readonly correctCategoryKey: Schema.String;
131
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
132
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
133
+ readonly kind: Schema.Literal<"math">;
134
+ readonly math: Schema.String;
135
+ }>, Schema.Struct<{
136
+ readonly kind: Schema.Literal<"text">;
137
+ readonly text: Schema.String;
138
+ }>]>>;
139
+ readonly order: Schema.Int;
140
+ readonly statementKey: Schema.String;
141
+ }>>;
142
+ }>, Schema.Struct<{
143
+ readonly kind: Schema.Literal<"multiple-choice">;
144
+ readonly options: Schema.$Array<Schema.Struct<{
145
+ readonly isCorrect: Schema.Boolean;
146
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
147
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
148
+ readonly kind: Schema.Literal<"math">;
149
+ readonly math: Schema.String;
150
+ }>, Schema.Struct<{
151
+ readonly kind: Schema.Literal<"text">;
152
+ readonly text: Schema.String;
153
+ }>]>>;
154
+ readonly optionKey: Schema.String;
155
+ readonly order: Schema.Int;
156
+ }>>;
157
+ }>, Schema.Struct<{
158
+ readonly kind: Schema.Literal<"single-choice">;
159
+ readonly options: Schema.$Array<Schema.Struct<{
160
+ readonly isCorrect: Schema.Boolean;
161
+ readonly label: Schema.NonEmptyArray<Schema.Union<readonly [Schema.Struct<{
162
+ readonly display: Schema.Literals<readonly ["block", "inline"]>;
163
+ readonly kind: Schema.Literal<"math">;
164
+ readonly math: Schema.String;
165
+ }>, Schema.Struct<{
166
+ readonly kind: Schema.Literal<"text">;
167
+ readonly text: Schema.String;
168
+ }>]>>;
169
+ readonly optionKey: Schema.String;
170
+ readonly order: Schema.Int;
171
+ }>>;
172
+ }>]>;
173
+ }>, Schema.Struct<{
174
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
175
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
176
+ readonly peerContentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
177
+ readonly questionKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionKey">;
178
+ readonly questionNumber: Schema.Finite;
179
+ readonly setKey: Schema.brand<Schema.String, "@NakafaAI/AksaraQuestionSetKey">;
180
+ readonly bodyKind: Schema.Literal<"answer">;
181
+ readonly blueprint: Schema.optionalKey<Schema.Struct<{
182
+ readonly cognitiveLevel: Schema.String;
183
+ readonly contentDomain: Schema.String;
184
+ readonly topic: Schema.String;
185
+ }>>;
186
+ readonly kind: Schema.Literal<"question-body">;
187
+ readonly metadata: Schema.Struct<{
188
+ readonly dateModified: Schema.optionalKey<Schema.String>;
189
+ readonly datePublished: Schema.String;
190
+ readonly authors: Schema.$Array<Schema.Struct<{
191
+ readonly name: Schema.String;
192
+ }>>;
193
+ readonly title: Schema.String;
194
+ }>;
195
+ readonly stimulusKey: Schema.optionalKey<Schema.String>;
196
+ }>]>]>;
197
+ }>;
198
+ export type PreviewArtifact = typeof PreviewArtifactSchema.Type;
@@ -0,0 +1,20 @@
1
+ import { Schema } from "effect";
2
+ import { Sha256HashSchema } from "#contracts/ids";
3
+ import { CurrentContentProjectionSchema } from "#contracts/projection/spec";
4
+ export const LOCAL_PREVIEW_ARTIFACT_PREFIX = "/v1/artifacts/";
5
+ /** Builds the one content-addressed path owned by the preview protocol. */
6
+ export function localPreviewArtifactPath(artifactHash) {
7
+ return `${LOCAL_PREVIEW_ARTIFACT_PREFIX}${encodeURIComponent(artifactHash)}`;
8
+ }
9
+ /** Ensures one artifact endpoint is addressed only by its signed hash. */
10
+ function hasCoherentArtifactPath(input) {
11
+ return input.artifactPath === localPreviewArtifactPath(input.artifactHash);
12
+ }
13
+ /** One signed artifact reference and its exact current renderer projection. */
14
+ export const PreviewArtifactSchema = Schema.Struct({
15
+ artifactHash: Sha256HashSchema,
16
+ artifactPath: Schema.Trimmed.check(Schema.isNonEmpty()),
17
+ projection: CurrentContentProjectionSchema,
18
+ }).pipe(Schema.check(Schema.makeFilter(hasCoherentArtifactPath, {
19
+ message: "Expected the artifact path to match its signed hash.",
20
+ })));
@@ -0,0 +1,71 @@
1
+ import { Effect, Schema } from "effect";
2
+ import type { Sha256HashSchema } from "#contracts/ids";
3
+ /** Stable wire format for one authenticated local renderer response. */
4
+ export declare const PREVIEW_RENDERER_AUTH_FORMAT = "aksara-renderer-auth-v1";
5
+ /** Fresh parent-generated challenge bound to one renderer request. */
6
+ export declare const PreviewRendererNonceSchema: Schema.String;
7
+ export type PreviewRendererNonce = typeof PreviewRendererNonceSchema.Type;
8
+ /** Process-local HMAC key available only to the spawned Nakafa child. */
9
+ export declare const PreviewRendererSecretSchema: Schema.String;
10
+ export type PreviewRendererSecret = typeof PreviewRendererSecretSchema.Type;
11
+ /** HMAC-SHA256 proof returned by the exact spawned Nakafa child. */
12
+ export declare const PreviewRendererProofSchema: Schema.String;
13
+ export type PreviewRendererProof = typeof PreviewRendererProofSchema.Type;
14
+ /** Authenticated response returned only by the local renderer endpoint. */
15
+ export declare const PreviewRendererResponseSchema: Schema.Struct<{
16
+ readonly format: Schema.Literal<"aksara-renderer-auth-v1">;
17
+ readonly manifest: Schema.Struct<{
18
+ readonly base: Schema.Struct<{
19
+ authoringComponents: Schema.$Array<Schema.Struct<{
20
+ readonly name: Schema.String;
21
+ readonly version: Schema.Finite;
22
+ }>>;
23
+ supportedComponents: Schema.$Array<Schema.Struct<{
24
+ readonly name: Schema.String;
25
+ readonly version: Schema.Finite;
26
+ }>>;
27
+ }>;
28
+ readonly domains: Schema.$Array<Schema.Struct<{
29
+ readonly authoringComponents: Schema.$Array<Schema.Struct<{
30
+ readonly name: Schema.String;
31
+ readonly version: Schema.Finite;
32
+ }>>;
33
+ readonly name: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
34
+ readonly supportedComponents: Schema.$Array<Schema.Struct<{
35
+ readonly name: Schema.String;
36
+ readonly version: Schema.Finite;
37
+ }>>;
38
+ }>>;
39
+ readonly format: Schema.Literal<"nakafa-mdx-renderer-v1">;
40
+ readonly hash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
41
+ readonly publishedDomains: Schema.$Array<Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>>;
42
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
43
+ }>;
44
+ readonly proof: Schema.String;
45
+ }>;
46
+ export type PreviewRendererResponse = typeof PreviewRendererResponseSchema.Type;
47
+ declare const PreviewRendererAuthError_base: Schema.Class<PreviewRendererAuthError, Schema.TaggedStruct<"PreviewRendererAuthError", {
48
+ readonly reason: Schema.Literals<readonly ["compute", "invalid"]>;
49
+ }>, import("effect/Cause").YieldableError>;
50
+ /** Renderer authentication could not be computed or did not match. */
51
+ export declare class PreviewRendererAuthError extends PreviewRendererAuthError_base {
52
+ }
53
+ /** Canonicalizes one challenge and exact validated renderer identity. */
54
+ export declare function canonicalizePreviewRendererAuth(input: {
55
+ readonly manifestHash: typeof Sha256HashSchema.Type;
56
+ readonly nonce: PreviewRendererNonce;
57
+ }): string;
58
+ /** Computes one renderer response proof from a process-local secret. */
59
+ export declare const computePreviewRendererProof: (input: {
60
+ readonly manifestHash: typeof Sha256HashSchema.Type;
61
+ readonly nonce: PreviewRendererNonce;
62
+ readonly secret: PreviewRendererSecret;
63
+ }) => Effect.Effect<string, PreviewRendererAuthError, never>;
64
+ /** Verifies one proof without exposing timing-sensitive string comparison. */
65
+ export declare const verifyPreviewRendererProof: (input: {
66
+ readonly manifestHash: typeof Sha256HashSchema.Type;
67
+ readonly nonce: PreviewRendererNonce;
68
+ readonly proof: PreviewRendererProof;
69
+ readonly secret: PreviewRendererSecret;
70
+ }) => Effect.Effect<undefined, PreviewRendererAuthError, never>;
71
+ export {};
@@ -0,0 +1,49 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { createHmac, timingSafeEqual } from "node:crypto";
3
+ import { Effect, Schema } from "effect";
4
+ import { RendererManifestEnvelopeSchema } from "#contracts/renderer/contract";
5
+ const BASE64URL_SHA256_PATTERN = /^[A-Za-z0-9_-]{43}$/u;
6
+ /** Stable wire format for one authenticated local renderer response. */
7
+ export const PREVIEW_RENDERER_AUTH_FORMAT = "aksara-renderer-auth-v1";
8
+ /** Fresh parent-generated challenge bound to one renderer request. */
9
+ export const PreviewRendererNonceSchema = Schema.String.pipe(Schema.check(Schema.isPattern(BASE64URL_SHA256_PATTERN)));
10
+ /** Process-local HMAC key available only to the spawned Nakafa child. */
11
+ export const PreviewRendererSecretSchema = Schema.String.pipe(Schema.check(Schema.isPattern(BASE64URL_SHA256_PATTERN)));
12
+ /** HMAC-SHA256 proof returned by the exact spawned Nakafa child. */
13
+ export const PreviewRendererProofSchema = Schema.String.pipe(Schema.check(Schema.isPattern(BASE64URL_SHA256_PATTERN)));
14
+ /** Authenticated response returned only by the local renderer endpoint. */
15
+ export const PreviewRendererResponseSchema = Schema.Struct({
16
+ format: Schema.Literal(PREVIEW_RENDERER_AUTH_FORMAT),
17
+ manifest: RendererManifestEnvelopeSchema,
18
+ proof: PreviewRendererProofSchema,
19
+ });
20
+ /** Renderer authentication could not be computed or did not match. */
21
+ export class PreviewRendererAuthError extends Schema.TaggedError()("PreviewRendererAuthError", { reason: Schema.Literals(["compute", "invalid"]) }) {
22
+ }
23
+ /** Canonicalizes one challenge and exact validated renderer identity. */
24
+ export function canonicalizePreviewRendererAuth(input) {
25
+ return JSON.stringify([
26
+ PREVIEW_RENDERER_AUTH_FORMAT,
27
+ input.nonce,
28
+ input.manifestHash,
29
+ ]);
30
+ }
31
+ /** Computes one renderer response proof from a process-local secret. */
32
+ export const computePreviewRendererProof = Effect.fn("AksaraContracts.computePreviewRendererProof")(function* (input) {
33
+ return yield* Effect.try({
34
+ catch: () => new PreviewRendererAuthError({ reason: "compute" }),
35
+ try: () => PreviewRendererProofSchema.make(createHmac("sha256", Buffer.from(input.secret, "base64url"))
36
+ .update(canonicalizePreviewRendererAuth(input))
37
+ .digest("base64url")),
38
+ });
39
+ });
40
+ /** Verifies one proof without exposing timing-sensitive string comparison. */
41
+ export const verifyPreviewRendererProof = Effect.fn("AksaraContracts.verifyPreviewRendererProof")(function* (input) {
42
+ const expected = yield* computePreviewRendererProof(input);
43
+ const actualBytes = Buffer.from(input.proof, "base64url");
44
+ const expectedBytes = Buffer.from(expected, "base64url");
45
+ if (timingSafeEqual(actualBytes, expectedBytes)) {
46
+ return;
47
+ }
48
+ return yield* new PreviewRendererAuthError({ reason: "invalid" });
49
+ });