@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,87 @@
1
+ import { Effect } from "effect";
2
+ import { decodeContract } from "#contracts/decode";
3
+ import { RendererAuthoringComponentDuplicateError, RendererAuthoringComponentExtraError, RendererAuthoringComponentMissingError, RendererAuthoringComponentsSchema, RendererAuthoringComponentUnsupportedError, RendererAuthoringSelectionNonCanonicalError, RendererCapabilitySchema, RendererManifestAuthoringComponentsSchema, RendererManifestSupportedComponentsSchema, RendererSupportedComponentsSchema, sortRendererComponentRequirements, } from "#contracts/renderer/component";
4
+ import { RendererDomainCapabilitySchema, RendererManifestDomainsSchema, sortRendererDomains, } from "#contracts/renderer/contract";
5
+ /** Rejects duplicate component names in one authoring selection. */
6
+ const validateUniqueAuthoringNames = Effect.fn("AksaraContracts.validateUniqueAuthoringNames")(function* (authoringComponents) {
7
+ const selectedNames = new Set();
8
+ for (const selection of authoringComponents) {
9
+ if (selectedNames.has(selection.name)) {
10
+ return yield* new RendererAuthoringComponentDuplicateError({
11
+ componentName: selection.name,
12
+ });
13
+ }
14
+ selectedNames.add(selection.name);
15
+ }
16
+ return selectedNames;
17
+ });
18
+ /** Rejects authoring selections that are not canonically ordered. */
19
+ const validateCanonicalAuthoringOrder = Effect.fn("AksaraContracts.validateCanonicalAuthoringOrder")(function* (authoringComponents) {
20
+ const sorted = sortRendererComponentRequirements(authoringComponents);
21
+ for (const [index, selection] of authoringComponents.entries()) {
22
+ const canonical = sorted[index];
23
+ if (canonical?.name !== selection.name ||
24
+ canonical.version !== selection.version) {
25
+ return yield* new RendererAuthoringSelectionNonCanonicalError({
26
+ componentName: selection.name,
27
+ index,
28
+ });
29
+ }
30
+ }
31
+ });
32
+ /** Rejects authoring pins that the selected registry cannot render. */
33
+ const validateSupportedAuthoringSelections = Effect.fn("AksaraContracts.validateSupportedAuthoringSelections")(function* (supportedComponents, authoringComponents) {
34
+ for (const selection of authoringComponents) {
35
+ const supportedVersions = supportedComponents.filter(({ name }) => name === selection.name);
36
+ if (supportedVersions.length === 0) {
37
+ return yield* new RendererAuthoringComponentExtraError({
38
+ componentName: selection.name,
39
+ });
40
+ }
41
+ if (!supportedVersions.some(({ version }) => version === selection.version)) {
42
+ return yield* new RendererAuthoringComponentUnsupportedError({
43
+ componentName: selection.name,
44
+ version: selection.version,
45
+ });
46
+ }
47
+ }
48
+ });
49
+ /** Requires one authoring version for every supported component name. */
50
+ const validateCompleteAuthoringNames = Effect.fn("AksaraContracts.validateCompleteAuthoringNames")(function* (supportedComponents, selectedNames) {
51
+ for (const supported of supportedComponents) {
52
+ if (!selectedNames.has(supported.name)) {
53
+ return yield* new RendererAuthoringComponentMissingError({
54
+ componentName: supported.name,
55
+ });
56
+ }
57
+ }
58
+ });
59
+ /** Normalizes one complete physical registry component contract. */
60
+ const normalizeRendererCapability = Effect.fn("AksaraContracts.normalizeRendererCapability")(function* (input, allowEmpty) {
61
+ const supportedSchema = allowEmpty
62
+ ? RendererSupportedComponentsSchema
63
+ : RendererManifestSupportedComponentsSchema;
64
+ const authoringSchema = allowEmpty
65
+ ? RendererAuthoringComponentsSchema
66
+ : RendererManifestAuthoringComponentsSchema;
67
+ const supportedComponents = yield* decodeContract(supportedSchema, "RendererManifestSupportedComponents", sortRendererComponentRequirements(input.supportedComponents));
68
+ const selectedNames = yield* validateUniqueAuthoringNames(input.authoringComponents);
69
+ yield* validateCanonicalAuthoringOrder(input.authoringComponents);
70
+ yield* validateSupportedAuthoringSelections(supportedComponents, input.authoringComponents);
71
+ yield* validateCompleteAuthoringNames(supportedComponents, selectedNames);
72
+ const authoringComponents = yield* decodeContract(authoringSchema, "RendererManifestAuthoringComponents", input.authoringComponents);
73
+ if (allowEmpty) {
74
+ return { authoringComponents, supportedComponents };
75
+ }
76
+ return yield* decodeContract(RendererCapabilitySchema, "RendererCapability", {
77
+ authoringComponents,
78
+ supportedComponents,
79
+ });
80
+ });
81
+ /** Normalizes the exact base plus every canonical route-domain registry. */
82
+ export const normalizeRendererSelection = Effect.fn("AksaraContracts.normalizeRendererSelection")(function* (input) {
83
+ const base = yield* normalizeRendererCapability(input.base, false);
84
+ const domains = yield* Effect.forEach(input.domains, (domain) => normalizeRendererCapability(domain, true).pipe(Effect.flatMap((capability) => decodeContract(RendererDomainCapabilitySchema, "RendererDomainCapability", { name: domain.name, ...capability }))));
85
+ const canonicalDomains = yield* decodeContract(RendererManifestDomainsSchema, "RendererManifestDomains", sortRendererDomains(domains));
86
+ return { base, domains: canonicalDomains };
87
+ });
@@ -0,0 +1,8 @@
1
+ import { Schema } from "effect";
2
+ declare const ContentRuntimeMismatchError_base: Schema.Class<ContentRuntimeMismatchError, Schema.TaggedStruct<"ContentRuntimeMismatchError", {
3
+ readonly reason: Schema.Literals<readonly ["activeManifestHash", "activeReleaseId", "artifactHash", "bundleHash", "contentKey", "delivery", "locale", "projectionHash", "publicPath", "rendererManifest", "selectorCount", "snapshotId", "sourcePath"]>;
4
+ }>, import("effect/Cause").YieldableError>;
5
+ /** A decoded runtime response does not belong to its initiating request. */
6
+ export declare class ContentRuntimeMismatchError extends ContentRuntimeMismatchError_base {
7
+ }
8
+ export {};
@@ -0,0 +1,20 @@
1
+ import { Schema } from "effect";
2
+ /** A decoded runtime response does not belong to its initiating request. */
3
+ export class ContentRuntimeMismatchError extends Schema.TaggedError()("ContentRuntimeMismatchError", {
4
+ reason: Schema.Literals([
5
+ "activeManifestHash",
6
+ "activeReleaseId",
7
+ "artifactHash",
8
+ "bundleHash",
9
+ "contentKey",
10
+ "delivery",
11
+ "locale",
12
+ "projectionHash",
13
+ "publicPath",
14
+ "rendererManifest",
15
+ "selectorCount",
16
+ "snapshotId",
17
+ "sourcePath",
18
+ ]),
19
+ }) {
20
+ }
@@ -0,0 +1,10 @@
1
+ /** Maximum protected selectors accepted in one retained-snapshot read. */
2
+ export declare const MAX_PROTECTED_RUNTIME_SELECTORS = 64;
3
+ /** Maximum UTF-8 bytes accepted by the protected batch endpoint. */
4
+ export declare const MAX_PROTECTED_RUNTIME_REQUEST_BYTES: number;
5
+ /** Maximum UTF-8 bytes returned by the protected batch endpoint. */
6
+ export declare const MAX_PROTECTED_RUNTIME_RESPONSE_BYTES: number;
7
+ /** Measures the exact JSON bytes written by the protected HTTP response. */
8
+ export declare function protectedRuntimeResponseBytes(response: object): number;
9
+ /** Keeps every found result inside the protected response wire ceiling. */
10
+ export declare function hasBoundedProtectedRuntimeResponse(response: object): boolean;
@@ -0,0 +1,15 @@
1
+ /** Maximum protected selectors accepted in one retained-snapshot read. */
2
+ export const MAX_PROTECTED_RUNTIME_SELECTORS = 64;
3
+ /** Maximum UTF-8 bytes accepted by the protected batch endpoint. */
4
+ export const MAX_PROTECTED_RUNTIME_REQUEST_BYTES = 64 * 1024;
5
+ /** Maximum UTF-8 bytes returned by the protected batch endpoint. */
6
+ export const MAX_PROTECTED_RUNTIME_RESPONSE_BYTES = 4 * 1024 * 1024;
7
+ /** Measures the exact JSON bytes written by the protected HTTP response. */
8
+ export function protectedRuntimeResponseBytes(response) {
9
+ return new TextEncoder().encode(JSON.stringify(response)).byteLength;
10
+ }
11
+ /** Keeps every found result inside the protected response wire ceiling. */
12
+ export function hasBoundedProtectedRuntimeResponse(response) {
13
+ return (protectedRuntimeResponseBytes(response) <=
14
+ MAX_PROTECTED_RUNTIME_RESPONSE_BYTES);
15
+ }
@@ -0,0 +1,328 @@
1
+ import { Effect, Schema } from "effect";
2
+ /** One exact frozen try-out body selected after product authorization. */
3
+ export declare const ProtectedContentRuntimeSelectorSchema: Schema.Struct<{
4
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
5
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
6
+ readonly delivery: Schema.Literals<readonly ["authenticated", "entitled"]>;
7
+ }>;
8
+ export type ProtectedContentRuntimeSelector = typeof ProtectedContentRuntimeSelectorSchema.Type;
9
+ /** One bounded protected read bound to a permanent signed runtime bundle. */
10
+ export declare const ProtectedContentRuntimeRequestSchema: Schema.Struct<{
11
+ readonly bundleHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
12
+ readonly selectors: Schema.$Array<Schema.Struct<{
13
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
14
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
15
+ readonly delivery: Schema.Literals<readonly ["authenticated", "entitled"]>;
16
+ }>>;
17
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
18
+ }>;
19
+ export type ProtectedContentRuntimeRequest = typeof ProtectedContentRuntimeRequestSchema.Type;
20
+ /** One selected artifact inside a protected batch response. */
21
+ export declare const ProtectedContentRuntimeItemSchema: Schema.Struct<{
22
+ readonly artifact: Schema.Struct<{
23
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
24
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
25
+ readonly payload: Schema.Struct<{
26
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
27
+ readonly byteLength: Schema.Finite;
28
+ readonly compiledCode: Schema.String;
29
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
30
+ readonly compilerVersion: Schema.Literal<"0.1.0">;
31
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
32
+ readonly format: Schema.Literal<"mdx-function-body">;
33
+ readonly mdxCompilerVersion: Schema.Literal<"3.1.1">;
34
+ readonly plainText: Schema.String;
35
+ readonly rawMdx: Schema.String;
36
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
37
+ readonly requiredComponents: Schema.$Array<Schema.Struct<{
38
+ readonly name: Schema.String;
39
+ readonly version: Schema.Finite;
40
+ }>>;
41
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
42
+ }>;
43
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
44
+ }>;
45
+ readonly delivery: Schema.Literals<readonly ["authenticated", "entitled"]>;
46
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
47
+ }>;
48
+ export type ProtectedContentRuntimeItem = typeof ProtectedContentRuntimeItemSchema.Type;
49
+ /** Protected frozen bodies selected from one retained try-out snapshot. */
50
+ export declare const ProtectedContentRuntimeFoundSchema: Schema.Struct<{
51
+ readonly bundle: Schema.Struct<{
52
+ readonly bundleHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
53
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
54
+ readonly payload: Schema.Struct<{
55
+ readonly format: Schema.Literal<"signed-tryout-runtime-bundle">;
56
+ readonly rendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
57
+ readonly snapshot: Schema.Struct<{
58
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
59
+ readonly catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
60
+ readonly counts: Schema.Struct<{
61
+ readonly country: Schema.Int;
62
+ readonly exam: Schema.Int;
63
+ readonly section: Schema.Int;
64
+ readonly set: Schema.Int;
65
+ readonly track: Schema.Int;
66
+ }>;
67
+ readonly placementCount: Schema.Int;
68
+ readonly placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
69
+ readonly routeCount: Schema.Int;
70
+ readonly format: Schema.Literal<"localized-tryout-snapshot">;
71
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
72
+ }>;
73
+ readonly sourceGitSha: Schema.brand<Schema.String, "@NakafaAI/AksaraGitCommitSha">;
74
+ readonly sourceManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
75
+ readonly sourceReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
76
+ }>;
77
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
78
+ }>;
79
+ readonly items: Schema.$Array<Schema.Struct<{
80
+ readonly artifact: Schema.Struct<{
81
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
82
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
83
+ readonly payload: Schema.Struct<{
84
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
85
+ readonly byteLength: Schema.Finite;
86
+ readonly compiledCode: Schema.String;
87
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
88
+ readonly compilerVersion: Schema.Literal<"0.1.0">;
89
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
90
+ readonly format: Schema.Literal<"mdx-function-body">;
91
+ readonly mdxCompilerVersion: Schema.Literal<"3.1.1">;
92
+ readonly plainText: Schema.String;
93
+ readonly rawMdx: Schema.String;
94
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
95
+ readonly requiredComponents: Schema.$Array<Schema.Struct<{
96
+ readonly name: Schema.String;
97
+ readonly version: Schema.Finite;
98
+ }>>;
99
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
100
+ }>;
101
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
102
+ }>;
103
+ readonly delivery: Schema.Literals<readonly ["authenticated", "entitled"]>;
104
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
105
+ }>>;
106
+ readonly kind: Schema.Literal<"found">;
107
+ readonly rendererManifest: Schema.Struct<{
108
+ readonly base: Schema.Struct<{
109
+ authoringComponents: Schema.$Array<Schema.Struct<{
110
+ readonly name: Schema.String;
111
+ readonly version: Schema.Finite;
112
+ }>>;
113
+ supportedComponents: Schema.$Array<Schema.Struct<{
114
+ readonly name: Schema.String;
115
+ readonly version: Schema.Finite;
116
+ }>>;
117
+ }>;
118
+ readonly domains: Schema.$Array<Schema.Struct<{
119
+ readonly authoringComponents: Schema.$Array<Schema.Struct<{
120
+ readonly name: Schema.String;
121
+ readonly version: Schema.Finite;
122
+ }>>;
123
+ readonly name: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
124
+ readonly supportedComponents: Schema.$Array<Schema.Struct<{
125
+ readonly name: Schema.String;
126
+ readonly version: Schema.Finite;
127
+ }>>;
128
+ }>>;
129
+ readonly format: Schema.Literal<"nakafa-mdx-renderer-v1">;
130
+ readonly hash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
131
+ 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"]>>;
132
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
133
+ }>;
134
+ }>;
135
+ export type ProtectedContentRuntimeFound = typeof ProtectedContentRuntimeFoundSchema.Type;
136
+ /** Complete response vocabulary for the protected batch runtime seam. */
137
+ export declare const ProtectedContentRuntimeResponseSchema: Schema.Union<readonly [Schema.Struct<{
138
+ readonly bundle: Schema.Struct<{
139
+ readonly bundleHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
140
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
141
+ readonly payload: Schema.Struct<{
142
+ readonly format: Schema.Literal<"signed-tryout-runtime-bundle">;
143
+ readonly rendererManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
144
+ readonly snapshot: Schema.Struct<{
145
+ readonly activeAppLocales: Schema.NonEmptyArray<Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraAppLocale">>;
146
+ readonly catalogDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
147
+ readonly counts: Schema.Struct<{
148
+ readonly country: Schema.Int;
149
+ readonly exam: Schema.Int;
150
+ readonly section: Schema.Int;
151
+ readonly set: Schema.Int;
152
+ readonly track: Schema.Int;
153
+ }>;
154
+ readonly placementCount: Schema.Int;
155
+ readonly placementDigest: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
156
+ readonly routeCount: Schema.Int;
157
+ readonly format: Schema.Literal<"localized-tryout-snapshot">;
158
+ readonly snapshotId: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
159
+ }>;
160
+ readonly sourceGitSha: Schema.brand<Schema.String, "@NakafaAI/AksaraGitCommitSha">;
161
+ readonly sourceManifestHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
162
+ readonly sourceReleaseId: Schema.brand<Schema.String, "@NakafaAI/AksaraReleaseId">;
163
+ }>;
164
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
165
+ }>;
166
+ readonly items: Schema.$Array<Schema.Struct<{
167
+ readonly artifact: Schema.Struct<{
168
+ readonly artifactHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
169
+ readonly keyId: Schema.brand<Schema.String, "@NakafaAI/AksaraSigningKeyId">;
170
+ readonly payload: Schema.Struct<{
171
+ readonly artifactLocale: Schema.brand<Schema.Literals<readonly ["en", "id", "de"]>, "@NakafaAI/AksaraArtifactLocale">;
172
+ readonly byteLength: Schema.Finite;
173
+ readonly compiledCode: Schema.String;
174
+ readonly compilerConfigHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
175
+ readonly compilerVersion: Schema.Literal<"0.1.0">;
176
+ readonly contentKey: Schema.brand<Schema.String, "@NakafaAI/AksaraContentKey">;
177
+ readonly format: Schema.Literal<"mdx-function-body">;
178
+ readonly mdxCompilerVersion: Schema.Literal<"3.1.1">;
179
+ readonly plainText: Schema.String;
180
+ readonly rawMdx: Schema.String;
181
+ readonly rendererDomain: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
182
+ readonly requiredComponents: Schema.$Array<Schema.Struct<{
183
+ readonly name: Schema.String;
184
+ readonly version: Schema.Finite;
185
+ }>>;
186
+ readonly sourceHash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
187
+ }>;
188
+ readonly signature: Schema.brand<Schema.String, "@NakafaAI/AksaraEd25519Signature">;
189
+ }>;
190
+ readonly delivery: Schema.Literals<readonly ["authenticated", "entitled"]>;
191
+ readonly sourcePath: Schema.brand<Schema.String, "@NakafaAI/AksaraCorpusSourcePath">;
192
+ }>>;
193
+ readonly kind: Schema.Literal<"found">;
194
+ readonly rendererManifest: Schema.Struct<{
195
+ readonly base: Schema.Struct<{
196
+ authoringComponents: Schema.$Array<Schema.Struct<{
197
+ readonly name: Schema.String;
198
+ readonly version: Schema.Finite;
199
+ }>>;
200
+ supportedComponents: Schema.$Array<Schema.Struct<{
201
+ readonly name: Schema.String;
202
+ readonly version: Schema.Finite;
203
+ }>>;
204
+ }>;
205
+ readonly domains: Schema.$Array<Schema.Struct<{
206
+ readonly authoringComponents: Schema.$Array<Schema.Struct<{
207
+ readonly name: Schema.String;
208
+ readonly version: Schema.Finite;
209
+ }>>;
210
+ readonly name: Schema.Literals<readonly ["ai-ds", "biology", "chemistry", "mathematics", "physics", "politics", "site", "snbt-general", "snbt-math", "snbt-plain", "snbt-quant", "tka-math"]>;
211
+ readonly supportedComponents: Schema.$Array<Schema.Struct<{
212
+ readonly name: Schema.String;
213
+ readonly version: Schema.Finite;
214
+ }>>;
215
+ }>>;
216
+ readonly format: Schema.Literal<"nakafa-mdx-renderer-v1">;
217
+ readonly hash: Schema.brand<Schema.String, "@NakafaAI/AksaraSha256Hash">;
218
+ 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"]>>;
219
+ readonly rendererContractVersion: Schema.Literal<"1.0.0">;
220
+ }>;
221
+ }>, Schema.Struct<{
222
+ readonly kind: Schema.Literal<"missing">;
223
+ }>, Schema.Struct<{
224
+ readonly code: Schema.Literals<readonly ["CONTENT_RUNTIME_INTERNAL", "CONTENT_RUNTIME_INVALID", "CONTENT_RUNTIME_RESPONSE_TOO_LARGE", "CONTENT_RUNTIME_UNAUTHORIZED"]>;
225
+ readonly kind: Schema.Literal<"failure">;
226
+ }>]>;
227
+ export type ProtectedContentRuntimeResponse = typeof ProtectedContentRuntimeResponseSchema.Type;
228
+ /** Strictly decodes one unknown protected batch request. */
229
+ export declare const decodeProtectedContentRuntimeRequest: (input: unknown) => Effect.Effect<{
230
+ readonly bundleHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
231
+ readonly selectors: readonly {
232
+ readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
233
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
234
+ readonly delivery: "authenticated" | "entitled";
235
+ }[];
236
+ readonly snapshotId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
237
+ }, import("../../errors.js").ContractDecodeError, never>;
238
+ /** Strictly decodes one unknown protected batch response. */
239
+ export declare const decodeProtectedContentRuntimeResponse: (input: unknown) => Effect.Effect<{
240
+ readonly bundle: {
241
+ readonly bundleHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
242
+ readonly keyId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSigningKeyId">;
243
+ readonly payload: {
244
+ readonly format: "signed-tryout-runtime-bundle";
245
+ readonly rendererManifestHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
246
+ readonly snapshot: {
247
+ readonly activeAppLocales: readonly [("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">, ...(("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraAppLocale">)[]];
248
+ readonly catalogDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
249
+ readonly counts: {
250
+ readonly country: number;
251
+ readonly exam: number;
252
+ readonly section: number;
253
+ readonly set: number;
254
+ readonly track: number;
255
+ };
256
+ readonly placementCount: number;
257
+ readonly placementDigest: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
258
+ readonly routeCount: number;
259
+ readonly format: "localized-tryout-snapshot";
260
+ readonly snapshotId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
261
+ };
262
+ readonly sourceGitSha: string & import("effect/Brand").Brand<"@NakafaAI/AksaraGitCommitSha">;
263
+ readonly sourceManifestHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
264
+ readonly sourceReleaseId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraReleaseId">;
265
+ };
266
+ readonly signature: string & import("effect/Brand").Brand<"@NakafaAI/AksaraEd25519Signature">;
267
+ };
268
+ readonly items: readonly {
269
+ readonly artifact: {
270
+ readonly artifactHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
271
+ readonly keyId: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSigningKeyId">;
272
+ readonly payload: {
273
+ readonly artifactLocale: ("de" | "en" | "id") & import("effect/Brand").Brand<"@NakafaAI/AksaraArtifactLocale">;
274
+ readonly byteLength: number;
275
+ readonly compiledCode: string;
276
+ readonly compilerConfigHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
277
+ readonly compilerVersion: "0.1.0";
278
+ readonly contentKey: string & import("effect/Brand").Brand<"@NakafaAI/AksaraContentKey">;
279
+ readonly format: "mdx-function-body";
280
+ readonly mdxCompilerVersion: "3.1.1";
281
+ readonly plainText: string;
282
+ readonly rawMdx: string;
283
+ readonly rendererDomain: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
284
+ readonly requiredComponents: readonly {
285
+ readonly name: string;
286
+ readonly version: number;
287
+ }[];
288
+ readonly sourceHash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
289
+ };
290
+ readonly signature: string & import("effect/Brand").Brand<"@NakafaAI/AksaraEd25519Signature">;
291
+ };
292
+ readonly delivery: "authenticated" | "entitled";
293
+ readonly sourcePath: string & import("effect/Brand").Brand<"@NakafaAI/AksaraCorpusSourcePath">;
294
+ }[];
295
+ readonly kind: "found";
296
+ readonly rendererManifest: {
297
+ readonly base: {
298
+ readonly authoringComponents: readonly {
299
+ readonly name: string;
300
+ readonly version: number;
301
+ }[];
302
+ readonly supportedComponents: readonly {
303
+ readonly name: string;
304
+ readonly version: number;
305
+ }[];
306
+ };
307
+ readonly domains: readonly {
308
+ readonly authoringComponents: readonly {
309
+ readonly name: string;
310
+ readonly version: number;
311
+ }[];
312
+ readonly name: "ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math";
313
+ readonly supportedComponents: readonly {
314
+ readonly name: string;
315
+ readonly version: number;
316
+ }[];
317
+ }[];
318
+ readonly format: "nakafa-mdx-renderer-v1";
319
+ readonly hash: string & import("effect/Brand").Brand<"@NakafaAI/AksaraSha256Hash">;
320
+ readonly publishedDomains: readonly ("ai-ds" | "biology" | "chemistry" | "mathematics" | "physics" | "politics" | "site" | "snbt-general" | "snbt-math" | "snbt-plain" | "snbt-quant" | "tka-math")[];
321
+ readonly rendererContractVersion: "1.0.0";
322
+ };
323
+ } | {
324
+ readonly kind: "missing";
325
+ } | {
326
+ readonly code: "CONTENT_RUNTIME_INTERNAL" | "CONTENT_RUNTIME_INVALID" | "CONTENT_RUNTIME_RESPONSE_TOO_LARGE" | "CONTENT_RUNTIME_UNAUTHORIZED";
327
+ readonly kind: "failure";
328
+ }, import("../../errors.js").ContractDecodeError, never>;
@@ -0,0 +1,79 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SignedContentArtifactSchema, } from "#contracts/content";
3
+ import { decodeContract } from "#contracts/decode";
4
+ import { ContentKeySchema, CorpusSourcePathSchema, Sha256HashSchema, } from "#contracts/ids";
5
+ import { QuestionKeySchema } from "#contracts/question/identity";
6
+ import { RendererManifestEnvelopeSchema } from "#contracts/renderer/contract";
7
+ import { hasBoundedProtectedRuntimeResponse, MAX_PROTECTED_RUNTIME_SELECTORS, } from "#contracts/runtime/protected/limits";
8
+ import { ContentRuntimeFailureSchema, ContentRuntimeMissingSchema, } from "#contracts/runtime/result";
9
+ import { SignedTryoutRuntimeBundleSchema } from "#contracts/tryout/runtime/spec";
10
+ /** Checks one protected body selector uses its required delivery class. */
11
+ function hasProtectedBodyKind(input) {
12
+ const separator = input.contentKey.lastIndexOf("/");
13
+ if (separator < 1) {
14
+ return false;
15
+ }
16
+ const questionKey = input.contentKey.slice(0, separator);
17
+ if (!Schema.is(QuestionKeySchema)(questionKey)) {
18
+ return false;
19
+ }
20
+ if (input.delivery === "authenticated") {
21
+ return input.contentKey.endsWith("/question");
22
+ }
23
+ return input.contentKey.endsWith("/answer");
24
+ }
25
+ /** One exact frozen try-out body selected after product authorization. */
26
+ export const ProtectedContentRuntimeSelectorSchema = Schema.Struct({
27
+ artifactHash: Sha256HashSchema,
28
+ contentKey: ContentKeySchema,
29
+ delivery: Schema.Literals(["authenticated", "entitled"]),
30
+ }).pipe(Schema.check(Schema.makeFilter(hasProtectedBodyKind, {
31
+ message: "Expected authenticated prompts and entitled answer bodies.",
32
+ })));
33
+ /** Checks a batch never requests the same immutable artifact twice. */
34
+ function hasUniqueSelectors(selectors) {
35
+ const hashes = selectors.map(({ artifactHash }) => artifactHash);
36
+ return new Set(hashes).size === hashes.length;
37
+ }
38
+ const ProtectedContentRuntimeSelectorsSchema = Schema.Array(ProtectedContentRuntimeSelectorSchema).pipe(Schema.check(Schema.isMinLength(1)), Schema.check(Schema.isMaxLength(MAX_PROTECTED_RUNTIME_SELECTORS)), Schema.check(Schema.makeFilter(hasUniqueSelectors, {
39
+ message: "Expected unique protected runtime artifact selectors.",
40
+ })));
41
+ /** One bounded protected read bound to a permanent signed runtime bundle. */
42
+ export const ProtectedContentRuntimeRequestSchema = Schema.Struct({
43
+ bundleHash: Sha256HashSchema,
44
+ selectors: ProtectedContentRuntimeSelectorsSchema,
45
+ snapshotId: Sha256HashSchema,
46
+ });
47
+ /** One selected artifact inside a protected batch response. */
48
+ export const ProtectedContentRuntimeItemSchema = Schema.Struct({
49
+ artifact: SignedContentArtifactSchema,
50
+ delivery: Schema.Literals(["authenticated", "entitled"]),
51
+ sourcePath: CorpusSourcePathSchema,
52
+ });
53
+ /** Checks one protected response never repeats an immutable artifact. */
54
+ function hasUniqueArtifacts(items) {
55
+ const hashes = items.map(({ artifact }) => artifact.artifactHash);
56
+ return new Set(hashes).size === hashes.length;
57
+ }
58
+ const ProtectedContentRuntimeItemsSchema = Schema.Array(ProtectedContentRuntimeItemSchema).pipe(Schema.check(Schema.isMinLength(1)), Schema.check(Schema.isMaxLength(MAX_PROTECTED_RUNTIME_SELECTORS)), Schema.check(Schema.makeFilter(hasUniqueArtifacts, {
59
+ message: "Expected unique protected runtime artifacts.",
60
+ })));
61
+ /** Protected frozen bodies selected from one retained try-out snapshot. */
62
+ export const ProtectedContentRuntimeFoundSchema = Schema.Struct({
63
+ bundle: SignedTryoutRuntimeBundleSchema,
64
+ items: ProtectedContentRuntimeItemsSchema,
65
+ kind: Schema.Literal("found"),
66
+ rendererManifest: RendererManifestEnvelopeSchema,
67
+ }).pipe(Schema.check(Schema.makeFilter(hasBoundedProtectedRuntimeResponse, {
68
+ message: "Expected the protected runtime response to fit its wire ceiling.",
69
+ })));
70
+ /** Complete response vocabulary for the protected batch runtime seam. */
71
+ export const ProtectedContentRuntimeResponseSchema = Schema.Union([
72
+ ProtectedContentRuntimeFoundSchema,
73
+ ContentRuntimeMissingSchema,
74
+ ContentRuntimeFailureSchema,
75
+ ]);
76
+ /** Strictly decodes one unknown protected batch request. */
77
+ export const decodeProtectedContentRuntimeRequest = Effect.fn("AksaraContracts.decodeProtectedContentRuntimeRequest")((input) => decodeContract(ProtectedContentRuntimeRequestSchema, "ProtectedContentRuntimeRequest", input));
78
+ /** Strictly decodes one unknown protected batch response. */
79
+ export const decodeProtectedContentRuntimeResponse = Effect.fn("AksaraContracts.decodeProtectedContentRuntimeResponse")((input) => decodeContract(ProtectedContentRuntimeResponseSchema, "ProtectedContentRuntimeResponse", input));